diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/AUTHORS ns-3.34/AUTHORS
--- ns-3.33/AUTHORS	2021-01-09 10:19:21.000000000 -0800
+++ ns-3.34/AUTHORS	2021-07-14 10:31:06.000000000 -0700
@@ -3,14 +3,17 @@
 Danilo Abrignani (dabrignani@gmail.com)
 Michele Abruzzese (oniricha04@gmail.com)
 Alexander Afanasyev (alexander.afanasyev@ucla.edu)
+Chetan Agrawal (chetanag35@gmail.com)
 Rohit Agarwal (mindprince@gmail.com)
 Piyush Aggarwal (piyush8311@gmail.com)
+Alessandro Aimi (alleaimi95@gmail.com)
 Zoraze Ali (zoraze.ali@cttc.es)
 Eduardo Almeida (enmsa@outlook.pt)
 Robert Ammon (ammo6818@vandals.uidaho.edu)
 Kirill Andreev (andreev@iitp.ru)
 Dean Armstrong (deanarm@gmail.com)
 Gabriel Arrobo (gab.arrobo@gmail.com)
+Zakaria Helal Arzoo (arzoozakaria@gmail.com)
 Stefano Avallone (stefano.avallone@unina.it)
 Vignesh Babu (ns3-dev@esk.fraunhofer.de)
 Ghada Badawy (gbadawy@gmail.com)
@@ -41,11 +44,14 @@
 Scott Carpenter (scarpen@ncsu.edu)
 Tiago Cerqueira (tiago.miguel43@gmail.com)
 Egemen K. Cetinkaya (ekc@iitc.ku.edu)
+Nitya Chandra (nityachandra6@gmail.com)
 Angelos Chatzipapas (chatzipa@ceid.upatras.gr)
 Aditya Chaudhary (adityach2002@gmail.com)
+Shobhit Chaurasia (000shobhitchaurasia@gmail.com)
 Luciano Jerez Chaves (ljerezchaves@gmail.com)
 Eugene Chemeritskiy (echemeritskiy@arccn.ru)
 Yufei Cheng (yfcheng@ittc.ku.edu)
+Aditya Chirania (adityachirania97@gmail.com)
 Zhao Wen Chow (shu@mos.ics.keio.ac.jp)
 Andrey Churin (aachurin@gmail.com)
 Micolaj Chwalisz (chwalisz@tkn.tu-berlin.de)
@@ -59,6 +65,7 @@
 Ankit Deepak (adadeepak8@gmail.com)
 Christophe Delahaye (christophe.delahaye@orange.com)
 Sébastien Deronne (sebastien.deronne@gmail.com)
+Ameya Deshpande (ameyanrd@outlook.com)
 Christoph Döpmann (doepmanc@informatik.hu-berlin.de)
 Jordan Dorham (dorham1@llnl.gov)
 Craig Dowell (craigdo@ee.washington.edu)
@@ -75,6 +82,7 @@
 Juliana Freitag Borin (juliana.freitag@gmail.com)
 Piotr Gawlowicz (gawlowicz.p@gmail.com)
 Eric Gamess (egamess@gmail.com)
+Shiva Gantha (ganthashiva@gmail.com)
 Yida Gao (yidapb@gmail.com)
 Thomas Geithner (thomas.geithner@dai-labor.de)
 Ashim Ghosh (ashim.atiit@gmail.com)
@@ -140,6 +148,7 @@
 Mathieu Lacage (mathieu.lacage@inria.fr)
 Emmanuelle Laprise (emmmanuelle.laprise@bluekazoo.ca)
 Harsh Lara (harshapplefan@gmail.com)
+Mattia Lecci (mattia.lecci@gmail.com)
 Kristijan Lenković (k.lenkovic@me.com)
 Daniel Lertpratchya (nikkipui@gmail.com)
 Brett Levasseur (brettl20@gmail.com)
@@ -156,6 +165,7 @@
 Rubén Martínez (rmartinez@deic.uab.cat)
 Ryan Mast (mast9@llnl.gov)
 Fabian Mauchle (f1mauchl@hsr.ch)
+Mauriyin (haoyin@uw.edu)
 Andrey Mazo (mazo@iitp.ru)
 Jonathan McCrohan (jmccroha@tcd.ie)
 Andrew McGregor (andrewmcgr@gmail.com)
@@ -172,12 +182,16 @@
 Michele Muccio (michelemuccio@virgilio.it)
 Esteban Municio (esteban.municio@urjc.es)
 Sidharth Nabar (snabar@uw.edu)
+Sharan Naribole (sharan.naribole@gmail.com)
 Hemanth Narra (hemanth@ittc.ku.edu)
 Roman Naumann (naumann@informatik.hu-berlin.de)
+Mohtashim Nawaz (nawazmohtashim@gmail.com)
+Sachin Nayak (sachinn@uw.edu)
 Ben Newton (bn@cs.unc.edu)
 Cecchi Niccolò (insa@igeek.it)
 Andreas Nilsson (andrnils@gmail.com)
 Jaume Nin (jnin@cttc.es)
+Niwedita (niwedita.dakshana2017@gmail.com)
 Michael Nowatkowski (nowatkom@gmail.com)
 Anh Nguyen (annguyen@ittc.ku.edu)
 Duy Nguyen (duy@soe.ucsc.edu)
@@ -232,6 +246,7 @@
 Charitha Sangaraju (charitha29193@gmail.com)
 Siddharth Santurkar (siddharth.santurkar@ieee.org)
 Gaurav Sathe (gaurav.sathe@tcs.com)
+Chappidi Yoga Satwik (satwik.chappidi@iitkgp.ac.in)
 Robert R. Schmidt (rschmi@gmx.net)
 Florian Schmidt (Florian.Schmidt@cs.rwth-aachen.de)
 Surya Seetharaman (suryaseetharaman.9@gmail.com)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/bindings/python/ns3modulescan-modular.py ns-3.34/bindings/python/ns3modulescan-modular.py
--- ns-3.33/bindings/python/ns3modulescan-modular.py	2021-01-09 10:19:21.000000000 -0800
+++ ns-3.34/bindings/python/ns3modulescan-modular.py	2021-07-14 10:31:06.000000000 -0700
@@ -251,7 +251,7 @@
     output_file = open(output_file_name, "wt")
     output_sink = FileCodeSink(output_file)
 
-    # if there exists a scan-header.h file in src/<module>/bindings,
+    # if there exists a scan-header.h file in src/<module>/bindings or contrib/<module>/bindings,
     # scan it, otherwise scan ns3/xxxx-module.h.
     scan_header = os.path.join(os.path.dirname(output_file_name), "scan-header.h")
     if not os.path.exists(scan_header):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/bindings/python/ns3modulescan.py ns-3.34/bindings/python/ns3modulescan.py
--- ns-3.33/bindings/python/ns3modulescan.py	2021-01-09 10:19:21.000000000 -0800
+++ ns-3.34/bindings/python/ns3modulescan.py	2021-07-14 10:31:06.000000000 -0700
@@ -4,7 +4,7 @@
 import os.path
 
 import pybindgen.settings
-from pybindgen.gccxmlparser import ModuleParser, PygenClassifier, PygenSection, WrapperWarning
+from pybindgen.castxmlparser import ModuleParser, PygenClassifier, PygenSection, WrapperWarning
 from pybindgen.typehandlers.codesink import FileCodeSink
 from pygccxml.declarations import templates
 from pygccxml.declarations.class_declaration import class_t
@@ -18,7 +18,7 @@
 import ns3modulegen_core_customizations
 
 
-## silence gccxmlparser errors; we only want error handling in the
+## silence castxmlparser errors; we only want error handling in the
 ## generated python script, not while scanning.
 class ErrorHandler(pybindgen.settings.ErrorHandler):
     def handle_error(self, dummy_wrapper, dummy_exception, dummy_traceback_):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/bindings/python/wscript ns-3.34/bindings/python/wscript
--- ns-3.33/bindings/python/wscript	2021-01-09 10:19:21.000000000 -0800
+++ ns-3.34/bindings/python/wscript	2021-07-14 10:31:06.000000000 -0700
@@ -18,9 +18,9 @@
 # version as, e.g. '0.21.0'
 # If specifying a commit on the development tree, specify it like this based
 # on 'git describe --tags' command.  Example, if the latest release was 0.21.0,
-# and 'git decribe --tags' reports "0.21.0-6-g8e7c0a9", then write the
+# and 'git describe --tags' reports "0.21.0-6-g8e7c0a9", then write the
 # PYBINDGEN version string below as '0.21.0.post6+ng8e7c0a9'
-REQUIRED_PYBINDGEN_VERSION = '0.21.0.post15+nga587377'
+REQUIRED_PYBINDGEN_VERSION = '0.22.0'
 REQUIRED_PYGCCXML_VERSION = (2, 0, 1)
 REQUIRED_CASTXML_VERSION = '0.2'
 
@@ -390,6 +390,8 @@
     def run(self):
         self.inputs = [self.bld.bldnode.find_resource("ns3/{0}-module.h".format(self.module))]
         self.outputs = [self.bld.srcnode.find_resource("src/{}/bindings/modulegen__{}.py".format(self.module, self.target))]
+        if self.outputs[0] is None:
+            self.outputs = [self.bld.srcnode.find_resource("contrib/{}/bindings/modulegen__{}.py".format(self.module, self.target))]
         top_builddir = self.bld.bldnode.abspath()
         module_path = get_module_path(self.bld, self.module)
         headers_map = get_headers_map(self.bld)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/CHANGES.html ns-3.34/CHANGES.html
--- ns-3.33/CHANGES.html	2021-01-09 10:19:21.000000000 -0800
+++ ns-3.34/CHANGES.html	2021-07-14 10:32:18.000000000 -0700
@@ -51,6 +51,46 @@
 us a note on ns-developers mailing list.</p>
 
 <hr>
+<h1>Changes from ns-3.33 to ns-3.34</h1>
+<h2>New features and API:</h2>
+<ul>
+<li>Support for Wi-Fi <b>802.11ax downlink and uplink OFDMA</b>, including multi-user OFDMA and a <b>round-robin multi-user scheduler</b>.</li>
+<li><b>FqCobalt</b> queue disc with L4S features and set associative hash.</li>
+<li><b>FqPIE</b> queue disc with L4S mode</li>
+<li><b>ThompsonSamplingWifiManager</b> Wi-Fi rate control algorithm.</li>
+<li>New <b>PhasedArrayModel</b>, providing a flexible interface for modeling a number of Phase Antenna Array (PAA) models.</li>
+<li>Added the ability to configure the <b>Wi-Fi primary 20 MHz channel</b> for 802.11 devices operating on channels of width greater than 20 MHz.</li>
+<li>A <b>TCP BBRv1</b> congestion control model.</li>
+<li><b>Improved support for bit fields</b> in header serialization/deserialization.</li>
+<li>Support for <b>IPv6 stateless address auto-configuration (SLAAC)</b>.</li>
+</ul>
+<h2>Changes to existing API:</h2>
+<ul>
+<li>The <b>WifiAckPolicySelector</b> class has been replaced by the <b>WifiAckManager</b> class. Correspondingly, the ConstantWifiAckPolicySelector has been replaced by the WifiDefaultAckManager class. A new WifiProtectionManager abstract base class and WifiDefaultProtectionManager concrete class have been added to implement different protection policies.</li>
+<li>The class <b>ThreeGppAntennaArrayModel</b> has been replaced by <b>UniformPlanarArray</b>, extending the PhasedArrayModel interface.</li>
+<li>The <b>Angles struct</b> is now a class, with robust setters and getters (public struct variables phi and theta are now private class variables m_azimuth and m_inclination), overloaded operator&lt;&lt; and operator&gt;&gt; and a number of utilities.</li>
+<li><b>AntennaModel</b> child classes have been extended to produce 3D radiation patterns. Attributes such as Beamwidth have thus been separated into Vertical/HorizontalBeamwidth.</li>
+<li>The attribute <b>UseVhtOnly</b> in <b>MinstrelHtWifiManager</b> has been replaced by a new attribute called <b>UseLatestAmendmentOnly</b>.
+<li> The wifi module has <b>removed HT Greenfield support, Holland (802.11a-like) PHY configuration, and Point Coordination Function (PCF)</b></li>
+<li> The wifi ErrorRateModel API has been extended to support <b>link-to-system models</b>.
+<li> <b>Nix-Vector routing</b> supports multiple interface addresses and can print out routing paths</b>.
+<li>The <b>TxOkHeader and TxErrHeader trace sources</b> of RegularWifiMac have been obsoleted and replaced by trace sources that better capture the result of a transmission: AckedMpdu (fired when an MPDU is successfully acknowledged, via either a Normal Ack or a Block Ack), NAckedMpdu (fired when an MPDU is negatively acknowledged via a Block Ack), DroppedMpdu (fired when an MPDU is dropped), MpduResponseTimeout (fired when a CTS is missing after an RTS or a Normal Ack is missing after an MPDU) and PsduResponseTimeout (fired when a BlockAck is missing after an A-MPDU or a BlockAckReq).</li>
+</ul>
+<h2>Changes to build system:</h2>
+<ul>
+<li> The handling of <b>Boost library/header dependencies</b> has been improved.</li>
+</ul>
+<h2>Changed behavior:</h2>
+<ul>
+<li>The default <b>TCP congestion control</b> has been changed from NewReno to CUBIC.</li>
+<li>The <b>PHY layer of the wifi module</b> has been refactored: the amendment-specific logic has been ported to <b>PhyEntity</b> classes and <b>WifiPpdu</b> classes.</li>
+<li>The <b>MAC layer of the wifi module</b> has been refactored. The MacLow class has been replaced by a hierarchy of FrameExchangeManager classes, each adding support for the frame exchange sequences introduced by a given amendment.</li>
+<li>The <b>wifi BCC AWGN error rate tables</b> have been aligned with the ones provided by MATLAB and users may note a few dB difference when using BCC at high SNR and high MCS.</li>
+<li><b>ThreeGppChannelModel has been fixed</b>: cluster and sub-cluster angles could have been generated with inclination angles outside the inclination range [0, pi], and have now been constrained to the correct range.</li>
+<li>The <b>LTE RLC Acknowledged Mode (AM) transmit buffer</b> is now limited by default to a size of (1024 * 10) bytes.  Configuration of unlimited behavior can still be made by passing the value of zero to the new attribute <b>MaxTxBufferSize</b>.</li>
+</ul>
+
+<hr>
 <h1>Changes from ns-3.32 to ns-3.33</h1>
 <h2>New API:</h2>
 <ul>
@@ -104,9 +144,9 @@
 <li>Added <b>Active/Inactive feature</b> to PIE queue disc</li>
 <li>Added <b>netmap</b> and <b>DPDK</b> emulation device variants</li>
 <li>Added capability to configure <b>STL pair and containers as attributes</b></li>
-<li> Added <b>CartesianToGeographic</b> coordinate conversion capability
-<li> Added <b>LollipopCounter</b>, a sequence number counter type 
-<li> Added <b>6 GHz band</b> support for Wi-Fi 802.11ax
+<li> Added <b>CartesianToGeographic</b> coordinate conversion capability</li>
+<li> Added <b>LollipopCounter</b>, a sequence number counter type</li>
+<li> Added <b>6 GHz band</b> support for Wi-Fi 802.11ax</li>
 </ul>
 <h2>Changes to existing API:</h2>
 <ul>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/contrib/wscript ns-3.34/contrib/wscript
--- ns-3.33/contrib/wscript	2021-01-09 10:19:21.000000000 -0800
+++ ns-3.34/contrib/wscript	2021-07-14 10:31:06.000000000 -0700
@@ -197,7 +197,7 @@
                       Warning, stacklevel=2)
         return
 
-    if ("ns3-%s" % (module,)) not in env.NS3_ENABLED_MODULES:
+    if ("ns3-%s" % (module,)) not in env.NS3_ENABLED_CONTRIBUTED_MODULES:
         #print "bindings for module %s which is not enabled, skip" % module)
         return
 
@@ -260,6 +260,7 @@
     bindgen.before = ['cxxprogram', 'cxxshlib', 'cxxstlib']
     bindgen.after = 'gen_ns3_module_header'
     bindgen.name = "pybindgen(ns3 module %s)" % module
+    bindgen.module = module
     bindgen.install_path = None
 
     # generate the extension module
@@ -267,7 +268,8 @@
     pymod.source = ['bindings/ns3module.cc']
     pymod.target = '%s/%s' % (module_target_dir, extension_name)
     pymod.name = 'ns3module_%s' % module
-    pymod.use = ["%s" % mod for mod in pymod.env['NS3_ENABLED_MODULES']] #  Should be '"ns3-"+module', but see bug 1117
+    pymod.module = module
+    pymod.use = ["%s" % mod for mod in pymod.env['NS3_ENABLED_CONTRIBUTED_MODULES']]
     if pymod.env['ENABLE_STATIC_NS3']:
         if sys.platform == 'darwin':
             pymod.env.append_value('LINKFLAGS', '-Wl,-all_load')
@@ -282,6 +284,10 @@
             pymod.env.append_value('LINKFLAGS', '-Wl,-Bdynamic,--no-whole-archive')
     defines = list(pymod.env['DEFINES'])
     defines.extend(['NS_DEPRECATED=', 'NS3_DEPRECATED_H'])
+    defines.extend(['NS_DEPRECATED_3_34=', 'NS3_DEPRECATED_H'])
+    defines.extend(['NS_DEPRECATED_3_32=', 'NS3_DEPRECATED_H'])
+    defines.extend(['NS_DEPRECATED_3_31=', 'NS3_DEPRECATED_H'])
+    defines.extend(['NS_DEPRECATED_3_30=', 'NS3_DEPRECATED_H'])
     if Utils.unversioned_sys_platform() == 'win32':
         try:
             defines.remove('_DEBUG') # causes undefined symbols on win32
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/doc/doxygen.conf ns-3.34/doc/doxygen.conf
--- ns-3.33/doc/doxygen.conf	2021-01-09 10:19:21.000000000 -0800
+++ ns-3.34/doc/doxygen.conf	2021-07-14 10:31:06.000000000 -0700
@@ -275,6 +275,7 @@
 ##     Func<MyClass> ();
 
 ALIASES                = "bugid{1}=<a href=\"http://www.nsnam.org/bugzilla/show_bug.cgi?id=\1\">Bug \1</a>" \
+                         "issueid{1}=<a href=\"https://gitlab.com/nsnam/ns-3-dev/-/issues/\1\">Issue \1</a>" \
                          "internal=\par \b Internal:" \
                          "pname{1}=<span class=\"params\"><span class=\"paramname\">\1</span></span>" \
                          "RFC{1}=<a href=\"http://datatracker.ietf.org/doc/rfc\1/\">RFC \1</a>" \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/doc/doxygen.warnings.report.sh ns-3.34/doc/doxygen.warnings.report.sh
--- ns-3.33/doc/doxygen.warnings.report.sh	2021-01-09 10:19:21.000000000 -0800
+++ ns-3.34/doc/doxygen.warnings.report.sh	2021-07-14 10:31:06.000000000 -0700
@@ -1,5 +1,5 @@
 #!/bin/bash
-# -*- indent-tabs-mode:nil; -*- 
+# -*- indent-tabs-mode:nil; -*-
 
 
 # Process doxygen log to generate sorted list of top offenders.
@@ -42,12 +42,12 @@
 {
     synopsis_short
     cat <<-EOF
-    
+
     Run doxygen to generate all errors; report error counts
     by module and file.
-    
+
     -i  Skip the build, try print-introspected-doxygen anyway.
-    
+
     -s  Skip doxygen run; use existing <log-file>.
     -w  Skip doxygen run; use existing warnings log doc/$WARNINGSLOGFILE
     -l  Skip doxygen run; use the normal doxygen log doc/$STANDARDLOGFILE
@@ -61,7 +61,7 @@
 
     -v  Show detailed output from each step.
     -h  Print this usage message
-        
+
     The default behavior is to modify doxygen.conf temporarily to
     report all undocumented elements, and to reduce the run time.
     The output of this special run is kept in doc/$WARNINGSLOGFILE.
@@ -73,13 +73,13 @@
     The first two use a specified or the standard log file;
     the -s option uses the warnings log from a prior run.
     Only the first of -f <log-file>, -s, or -l will have effect.
-            
+
     The -e and -t options exclude examples and test directories
     from the counts.  The -m option only includes a specific module.
     The -F option only includes files (or warnings) matching the <regex>.
     The -m and -F options append the relevant warnings after the
     numerical report.  These can be used in any combination.
-    
+
 EOF
     exit 0
 }
@@ -129,7 +129,7 @@
         fi
     fi
 }
-   
+
 
 # Argument processing ------------------
 #
@@ -140,15 +140,17 @@
 # -l
 use_standard=0
 # skip doxygen run; using existing log file
-skip_doxy=0 
-# skip print-introspected-doxygen, avoiding a build 
-skip_intro=0 
+skip_doxy=0
+# skip print-introspected-doxygen, avoiding a build
+skip_intro=0
 
 # Filtering flags
 filter_blacklist=1
 filter_examples=0
 filter_test=0
+explicit_m_option=0
 filter_module=""
+explicit_f_option=0
 filter_in=""
 filter_out=""
 
@@ -156,20 +158,24 @@
 
     case $option in
     (b)  filter_blacklist=0       ;;
-    
+
     (e)  filter_examples=1        ;;
 
-    (f)  filter_in="$OPTARG"      ;;
+    (f)  filter_in="$OPTARG"
+         explicit_f_option=1
+         ;;
 
     (F)  filter_out="$OPTARG"     ;;
 
     (h)  usage                    ;;
-    
+
     (i)  skip_intro=1             ;;
-    
+
     (l)  use_standard=1           ;;
 
-    (m)  filter_module="$OPTARG"  ;;
+    (m)  filter_module="$OPTARG"
+         explicit_m_option=1
+         ;;
 
     (s)  use_filearg=1
          logfile_arg="$OPTARG"
@@ -184,11 +190,11 @@
     (w)  use_filearg=1
          logfile_arg="$DIR/$WARNINGSLOGFILE"
          ;;
-         
+
     (:)  echo "$me: Missing argument to -$OPTARG" ; synopsis ;;
-    
+
     (\?) echo "$me: Invalid option: -$OPTARG"     ; synopsis ;;
-        
+
     esac
 done
 
@@ -202,7 +208,7 @@
         synopsis
     fi
 }
-    
+
 # Log file -----------------------------
 #
 
@@ -225,6 +231,10 @@
     eval "${param}=\"${!param:-}${!param:+\\|}$token\""
 }
 
+# Explicit -f or -m with empty args should filter out all, not pass all
+[[ $explicit_f_option -eq 1 && "${filter_in:-}" == "" ]] && filter_out=".*"
+[[ $explicit_m_option -eq 1 && "${filter_module:-}" == "" ]] && filter_out=".*"
+
 # Filter in regular expression for -m and -f
 filter_inRE=""
 [[ "$filter_module" != "" ]] && REappend filter_inRE src/$filter_module
@@ -244,7 +254,7 @@
 REappend filter_blacklistRE "Schedule\\(Now\\|Destroy\\)(\\(MEM\\|void\\)"
 
 #   ATTRIBUTE_HELPER_CPP( and _HEADER(
-REappend filter_blacklistRE "ATTRIBUTE_HELPER_\\(CPP\\|HEADER\\)("
+REappend filter_blacklistRE "ATTRIBUTE_HELPER_\\(CPP\\|HEADER\\)"
 
 # Filter out regular expression for black list, -e, -t and -F
 filter_outRE=""
@@ -304,7 +314,7 @@
     conf=doc/doxygen.conf
     cp $conf ${conf}.bak
     cat <<-EOF >> $conf
-    
+
     # doxygen.warnings.report.sh:
     EXTRACT_ALL = no
     HAVE_DOT = no
@@ -333,12 +343,13 @@
     fi
 
     # Waf insists on writing cruft to stdout
-    sed -i -E '/^Waf:/d' doc/$intro_h
+    sed -i.bak -E '/^Waf:/d' doc/$intro_h
+    rm doc/$intro_h.bak
 
     verbose -n "Rebuilding doxygen docs with full errors"
     (cd "$ROOT" && ./waf --doxygen-no-build >&6 2>&6 )
     status_report $? "./waf --doxygen-no-build"
-    
+
     # Swap back to original config
     rm -f $conf
     mv -f $conf.bak $conf
@@ -394,7 +405,7 @@
 # Doxygen prints the additional parameters on separate lines,
 # so they don't show up in the totals above.
 # Rather than work too hard to get the exact number for each file,
-# we just list the total here. 
+# we just list the total here.
 addlparam=$(                                  \
     grep "^  parameter '" "$LOG"            | \
     wc -l                                   | \
@@ -464,7 +475,7 @@
 echo
 echo "Warnings by file (alphabetical)"
 echo
-echo "Count File" 
+echo "Count File"
 echo "----- ----------------------------------"
 echo "$undocfiles"
 echo "----------------------------------------"
@@ -473,7 +484,7 @@
 echo
 echo "Warnings by file (numerical)"
 echo
-echo "Count File" 
+echo "Count File"
 echo "----- ----------------------------------"
 echo "$undocsort"
 echo "----------------------------------------"
@@ -486,12 +497,33 @@
 printf "%6d files\n" $filecount
 printf "%6d warnings\n" $warncount
 
+# Return status based on warnings
+exit_status=$((warncount > 0))
+
+# if [ "${filter_inRE:-}" != "" ] ; then
+#     if [ "$filterin" != "" ] ; then
+#         echo
+#         echo
+#         echo "Filtered Warnings"
+#         echo "========================================"
+#         echo "$filterin"
+#         exit_status=1
+#     else
+#         exit_status=0
+#     fi
+# fi
+
 if [ "$filterin" != "" ] ; then
     echo
     echo
     echo "Filtered Warnings"
     echo "========================================"
     echo "$filterin"
+    exit_status=1
+else
+    exit_status=0
 fi
 
 status_report 0 $me
+
+exit $exit_status
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/doc/manual/source/conf.py ns-3.34/doc/manual/source/conf.py
--- ns-3.33/doc/manual/source/conf.py	2021-01-09 17:18:01.000000000 -0800
+++ ns-3.34/doc/manual/source/conf.py	2021-07-14 10:32:18.000000000 -0700
@@ -73,9 +73,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = u'ns-3.33'
+version = u'ns-3.34'
 # The full version, including alpha/beta/rc tags.
-release = u'ns-3.33'
+release = u'ns-3.34'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/doc/manual/source/python.rst ns-3.34/doc/manual/source/python.rst
--- ns-3.33/doc/manual/source/python.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/doc/manual/source/python.rst	2021-07-14 10:31:06.000000000 -0700
@@ -145,7 +145,7 @@
 
 #. some of the APIs involve pointers, which require knowledge of what kind of memory passing semantics (who owns what memory). Such knowledge is not part of the function signatures, and is either documented or sometimes not even documented.  Annotations are needed to bind those functions;
 #. Sometimes a unusual fundamental data type or C++ construct is used which is not yet supported by PyBindGen;
-#. GCC-XML does not report template based classes unless they are instantiated. (Note:  Need to confirm this limitation still exists with CastXML)
+#. CastXML does not report template based classes unless they are instantiated. 
 
 Most of the missing APIs can be wrapped, given enough time, patience, and expertise, and will likely be wrapped if bug reports are submitted.  However, don't file a bug report saying "bindings are incomplete", because we do not have manpower to complete 100% of the bindings.
 
@@ -276,13 +276,13 @@
 
 |ns3| has an automated process to regenerate Python bindings from the C++
 header files.  The process is only supported for Linux at the moment
-(ns-3.29) because we are in the midst of transition to new tools.  The
-current process is outlined below.  In short, the process currently 
-requires the following steps.
+(ns-3.33) because the project has not found a contributor yet to test and
+document the capability on macOS. In short, the process currently 
+requires the following steps on a Linux machine.
 
 1.  Prepare the system for scanning by installing the prerequisites,
     including a development version of ``clang``, the ``CastXML`` package,
-    and ``pygccxml``.
+    ``pygccxml``, and ``pybindgen``.
 2.  Perform a scan of the module of interest or all modules
 
 Installing a clang development environment
@@ -290,20 +290,17 @@
 
 Make sure you have a development version of the clang compiler installed
 on your system.  This can take a long time to build from source.  Linux
-distributions provide binary library packages such as ``clang-dev`` or
-``clang-devel``.  The version should not be too important; version 3.8 is 
-known to work.  Note that there is a problem with the Ubuntu
-package installation of ``clang-dev``; see the Installation wiki page for 
-details on how to fix using some symlinks.
+distributions provide binary library packages such as ``libclang-dev``
+(Ubuntu) or ``clang-devel`` (Fedora).
 
 Installing other prerequisites
 ##############################
 
-``cxxfilt`` is a new requirement, typically installed using ``pip``; e.g.
+``cxxfilt`` is a new requirement, typically installed using ``pip`` or ``pip3``; e.g.
 
 .. sourcecode:: bash
 
-    sudo pip install cxxfilt
+    sudo pip3 install --user cxxfilt
 
 See also the wiki for installation notes for your system.
 
@@ -315,10 +312,9 @@
 .. sourcecode:: bash
 
     $ cd bake
-    $ export BAKE_HOME=`pwd`
-    $ export PATH=$PATH:$BAKE_HOME/build/bin
-    $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$BAKE_HOME/build/lib
-    $ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME/build/lib
+    $ export PATH=`pwd`/build/bin:$PATH
+    $ export LD_LIBRARY_PATH=`pwd`/build/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
+    $ export PYTHONPATH=`pwd`/build/lib${PYTHONPATH:+:$PYTHONPATH}
     $ mkdir -p build/lib
 
 Configure
@@ -328,63 +324,133 @@
 
 .. sourcecode:: bash
 
-    $ ./bake.py configure -e ns-3-dev -e pygccxml-1.9.1
+    $ ./bake.py configure -e ns-3-dev -e pygccxml
 
-The output of ``bake show`` should show something like this: 
+The output of ``./bake.py show`` should show something like this: 
 
 
 .. sourcecode:: bash
 
     $ ./bake.py show
 
-Should say:
+Should say (note:  some are OK to be 'Missing' for Python bindings scanning):
 
 .. sourcecode:: text
 
     -- System Dependencies --
      > clang-dev - OK
+     > cmake - OK
+     > cxxfilt - OK
      > g++ - OK
-     > libxml2-dev - OK
-     > pygoocanvas - OK
-     > pygraphviz - OK
-     > python-dev - OK
-     > qt - OK
+     > gi-cairo - OK or Missing
+     > gir-bindings - OK or Missing
+     > llvm-dev - OK
+     > pygobject - OK or Missing
+     > pygraphviz - OK or Missing
+     > python3-dev - OK
+     > python3-setuptools - OK
+     > qt - OK or Missing
      > setuptools - OK
 
+Note that it is not harmful for Python bindings if some of the items above
+report as Missing.  For Python bindings, the important
+prerequisites are clang-dev, cmake, cxxfilt, llvm-dev, python3-dev,
+and python3-setuptools.  In the following process, the following programs
+and libraries will be locally installed:  castxml, pybindgen, pygccxml,
+and |ns3|. 
+
+Note also that the `ns-3-allinone` target for bake will also include the
+`pygccxml` and `ns-3-dev` targets (among other libraries) and can be
+used instead, e.g.:
+
+.. sourcecode:: bash
+
+    $ ./bake.py configure -e ns-3-allinone
+
 Download
 ########
 
-Try the following command:
+Issue the following download command.  Your output may vary depending on what
+is present or missing on your system.
 
 .. sourcecode:: bash
 
     $ ./bake.py download
-     >> Searching for system dependency python-dev - OK
+     >> Searching for system dependency llvm-dev - OK
      >> Searching for system dependency clang-dev - OK
+     >> Searching for system dependency qt - Problem
+     > Problem: Optional dependency, module "qt" not available
+       This may reduce the  functionality of the final build. 
+       However, bake will continue since "qt" is not an essential dependency.
+       For more information call bake with -v or -vvv, for full verbose mode.
+    
      >> Searching for system dependency g++ - OK
+     >> Searching for system dependency cxxfilt - OK
      >> Searching for system dependency setuptools - OK
-     >> Searching for system dependency pygoocanvas - OK
-     >> Searching for system dependency pygraphviz - OK
-     >> Searching for system dependency qt - OK
+     >> Searching for system dependency python3-setuptools - OK
+     >> Searching for system dependency gi-cairo - Problem
+     > Problem: Optional dependency, module "gi-cairo" not available
+       This may reduce the  functionality of the final build. 
+       However, bake will continue since "gi-cairo" is not an essential dependency.
+       For more information call bake with -v or -vvv, for full verbose mode.
+    
+     >> Searching for system dependency gir-bindings - Problem
+     > Problem: Optional dependency, module "gir-bindings" not available
+       This may reduce the  functionality of the final build. 
+       However, bake will continue since "gir-bindings" is not an essential dependency.
+       For more information call bake with -v or -vvv, for full verbose mode.
+    
+     >> Searching for system dependency pygobject - Problem
+     > Problem: Optional dependency, module "pygobject" not available
+       This may reduce the  functionality of the final build. 
+       However, bake will continue since "pygobject" is not an essential dependency.
+       For more information call bake with -v or -vvv, for full verbose mode.
+    
+     >> Searching for system dependency pygraphviz - Problem
+     > Problem: Optional dependency, module "pygraphviz" not available
+       This may reduce the  functionality of the final build. 
+       However, bake will continue since "pygraphviz" is not an essential dependency.
+       For more information call bake with -v or -vvv, for full verbose mode.
+    
+     >> Searching for system dependency python3-dev - OK
+     >> Searching for system dependency cmake - OK
      >> Downloading castxml - OK
      >> Downloading netanim - OK
-     >> Downloading pygccxml-1.9.1 - OK
-     >> Downloading pygccxml - OK
      >> Downloading pybindgen - OK
+     >> Downloading pygccxml - OK
      >> Downloading ns-3-dev - OK
     
 Build
 #####
 
-Try the following commands:
+Next, try the following command:
 
 .. sourcecode:: bash
 
-    $ mkdir -p build/lib
     $ ./bake.py build
 
-It should fail on the |ns3| bindings complilation.
+A build report should be printed for each package, such as:
+
+::
+
+     >> Building castxml - OK
+     >> Building netanim - OK
+     >> Building pybindgen - OK
+     >> Building pygccxml - OK
+     >> Building ns-3-dev - OK
+
+However, if there is a problem with the bindings compilation (or with the
+C++ code), it will report a failure instead:
+
+::
 
+     >> Building ns-3-dev - Problem
+     > Error:  Critical dependency, module "ns-3-dev" failed 
+       For more information call Bake with --debug and/or -v, -vvv, for full verbose mode (bake --help)
+
+At this point, it is recommended to change into the ns-3-dev directory and
+work further from there, because the API scanning dependencies have been
+built and installed successfully into the `build` directory.
 The output of './waf configure' can be inspected to see if Python API scanning
 support is enabled:
 
@@ -392,15 +458,16 @@
 
   Python API Scanning Support   : enabled
 
-It may say something like this, if the support is not active:
+It may say something like this, if the support is not active or something
+went wrong in the build process:
 
 .. sourcecode:: text
 
   Python API Scanning Support   : not enabled (Missing 'pygccxml' Python module)
 
-In this case, the user must take steps to install castxml and pygccxml;
-castxml binary must be in the shell's path, and pygccxml must be in the
-Python path.
+In this case, the user must take additional steps to resolve.  For the
+API scanning support to be detected, the castxml binary must be in the
+shell's PATH, and pygccxml must be in the PYTHONPATH.
 
 LP64 vs ILP32 bindings
 ######################
@@ -417,7 +484,7 @@
 
 The process (only supported on Linux at present) generates the LP64
 bindings using the toolchain and then copies the LP64 bindings to the
-ILP32 bindings with some type subsitutions automated by Waf scripts.
+ILP32 bindings with some type substitutions automated by Waf scripts.
   
 Rescanning a module
 ###################
@@ -440,7 +507,7 @@
 ############################
 
 In principle, this should work (and should generate the 32-bit bindings).
-However, maintainers have not been able to complete this port as of ns-3.29.
+However, maintainers have not been available to complete this port to date.
 We would welcome suggestions on how to enable scanning for MacOS. 
 
 Organization of the Modular Python Bindings
@@ -456,7 +523,8 @@
 * ``module_helpers.cc``: you may add additional files, such as this, to be linked to python extension module, but they have to be registered in the wscript. Look at src/core/wscript for an example of how to do so;
 * ``<module>.py``: if this file exists, it becomes the "frontend" python module for the ns3 module, and the extension module (.so file) becomes _<module>.so instead of <module>.so.  The <module>.py file has to import all symbols from the module _<module> (this is more tricky than it sounds, see src/core/bindings/core.py for an example), and then can add some additional pure-python definitions.   
 
-More Information for Developers
-*******************************
+Historical Information
+**********************
 
-If you are a developer and need more information on |ns3|'s Python bindings, please see the `Python Bindings wiki page <http://www.nsnam.org/wiki/NS-3_Python_Bindings>`_.
+If you are a developer and need more background information on |ns3|'s Python bindings, please see the `Python Bindings wiki page <http://www.nsnam.org/wiki/NS-3_Python_Bindings>`_.  Please note, however, that some information on that
+page is stale.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/doc/models/Makefile ns-3.34/doc/models/Makefile
--- ns-3.33/doc/models/Makefile	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/doc/models/Makefile	2021-07-14 10:31:06.000000000 -0700
@@ -90,7 +90,9 @@
 	$(SRC)/traffic-control/doc/codel.rst \
 	$(SRC)/traffic-control/doc/cobalt.rst \
 	$(SRC)/traffic-control/doc/fq-codel.rst \
+	$(SRC)/traffic-control/doc/fq-cobalt.rst \
 	$(SRC)/traffic-control/doc/pie.rst \
+	$(SRC)/traffic-control/doc/fq-pie.rst \
 	$(SRC)/traffic-control/doc/mq.rst \
 	$(SRC)/spectrum/doc/spectrum.rst \
 	$(SRC)/netanim/doc/animation.rst \
@@ -134,8 +136,20 @@
 	$(SRC)/internet/doc/figures/dce-linux-reno-vs-ns3-linux-reno.png \
 	$(SRC)/internet/doc/figures/dce-linux-reno-vs-ns3-new-reno.png \
 	$(SRC)/internet/doc/figures/ns3-new-reno-vs-ns3-linux-reno.png \
+	$(SRC)/internet/doc/figures/ns3-bbr-vs-linux-bbr.png \
 	$(SRC)/wifi/doc/source/figures/WifiArchitecture.dia \
+	$(SRC)/wifi/doc/source/figures/PhyEntityHierarchy.dia \
+	$(SRC)/wifi/doc/source/figures/WifiPpduHierarchy.dia \
+	$(SRC)/wifi/doc/source/figures/FemHierarchy.dia \
 	$(SRC)/wifi/doc/source/figures/snir.dia \
+	$(SRC)/wifi/doc/source/figures/ack-su-format.pdf \
+	$(SRC)/wifi/doc/source/figures/ack-su-format.png \
+	$(SRC)/wifi/doc/source/figures/mu-bar.pdf \
+	$(SRC)/wifi/doc/source/figures/mu-bar.png \
+	$(SRC)/wifi/doc/source/figures/aggr-mu-bar.pdf \
+	$(SRC)/wifi/doc/source/figures/aggr-mu-bar.png \
+	$(SRC)/wifi/doc/source/figures/ul-ofdma.pdf \
+	$(SRC)/wifi/doc/source/figures/ul-ofdma.png \
 	$(SRC)/wifi/doc/source/figures/clear-channel.eps \
 	$(SRC)/wifi/doc/source/figures/nist-frame-success-rate.eps \
 	$(SRC)/wifi/doc/source/figures/nist-frame-success-rate-n.eps \
@@ -352,6 +366,9 @@
 	$(FIGURES)/routing.eps \
 	$(FIGURES)/routing-specialization.eps \
 	$(FIGURES)/WifiArchitecture.eps \
+	$(FIGURES)/PhyEntityHierarchy.eps \
+	$(FIGURES)/WifiPpduHierarchy.eps \
+	$(FIGURES)/FemHierarchy.eps \
 	$(FIGURES)/snir.eps \
 	$(FIGURES)/WimaxArchitecture.eps \
 	$(FIGURES)/epc-ctrl-arch.eps \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/doc/models/source/conf.py ns-3.34/doc/models/source/conf.py
--- ns-3.33/doc/models/source/conf.py	2021-01-09 17:18:01.000000000 -0800
+++ ns-3.34/doc/models/source/conf.py	2021-07-14 10:32:18.000000000 -0700
@@ -73,9 +73,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = u'ns-3.33'
+version = u'ns-3.34'
 # The full version, including alpha/beta/rc tags.
-release = u'ns-3.33'
+release = u'ns-3.34'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/doc/models/source/emulation-overview.rst ns-3.34/doc/models/source/emulation-overview.rst
--- ns-3.33/doc/models/source/emulation-overview.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/doc/models/source/emulation-overview.rst	2021-07-14 10:31:06.000000000 -0700
@@ -87,8 +87,9 @@
 
 For more details:
 
-* :doc:`FdNetDevice <fd-net-device>` chapter.
-* :doc:`NetmapNetDevice <netmap-net-device>` chapter.
-* :doc:`DpdkNetDevice <netmap-net-device>` chapter.
-* :doc:`TapBridge <tap>` chapter.
+.. toctree::
 
+   fd-net-device
+   netmap-net-device
+   dpdk-net-device
+   tap
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/doc/models/source/index.rst ns-3.34/doc/models/source/index.rst
--- ns-3.33/doc/models/source/index.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/doc/models/source/index.rst	2021-07-14 10:31:06.000000000 -0700
@@ -30,7 +30,6 @@
    dsr
    emulation-overview
    energy
-   fd-net-device
    flow-monitor
    internet-models
    lr-wpan
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/doc/models/source/traffic-control.rst ns-3.34/doc/models/source/traffic-control.rst
--- ns-3.33/doc/models/source/traffic-control.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/doc/models/source/traffic-control.rst	2021-07-14 10:31:06.000000000 -0700
@@ -13,5 +13,7 @@
    codel
    fq-codel
    cobalt
+   fq-cobalt
    pie
+   fq-pie
    mq
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/doc/ns3_html_theme/static/ns3_links.js ns-3.34/doc/ns3_html_theme/static/ns3_links.js
--- ns-3.33/doc/ns3_html_theme/static/ns3_links.js	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/doc/ns3_html_theme/static/ns3_links.js	2021-07-14 10:31:06.000000000 -0700
@@ -1,8 +1,8 @@
 // nsnam.org links, independent of version
-var ns3_site = "http://www.nsnam.org/";
+var ns3_site = "https://www.nsnam.org/";
 var ns3_home = ns3_site + "";
 var ns3_wiki = ns3_site + "wiki";
-var ns3_bugs = ns3_site + "bugzilla";
+var ns3_bugs = "https://gitlab.com/nsnam/ns-3-dev/-/issues";
 
 // Links that depend on version:
 // Defined in ns3_version.js:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/doc/tutorial/source/building-topologies.rst ns-3.34/doc/tutorial/source/building-topologies.rst
--- ns-3.33/doc/tutorial/source/building-topologies.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/doc/tutorial/source/building-topologies.rst	2021-07-14 10:31:06.000000000 -0700
@@ -167,7 +167,7 @@
 for example, 10Base-T and 100Base-T devices on a given channel.  We first set 
 the data rate to 100 megabits per second, and then set the speed-of-light delay
 of the channel to 6560 nano-seconds (arbitrarily chosen as 1 nanosecond per foot
-over a 100 meter segment).  Notice that you can set an ``Attribute`` using 
+over a 2000 meter segment).  Notice that you can set an ``Attribute`` using 
 its native data type.
 
 ::
@@ -1486,7 +1486,7 @@
 * FifoQueueDisc: The default maximum size is 1000 packets
 * RedQueueDisc: The default maximum size is 25 packets
 * CoDelQueueDisc: The default maximum size is 1500 kilobytes
-* FqCoDelQueueDisc: The default maximum size is 10024 packets
+* FqCoDelQueueDisc: The default maximum size is 10240 packets
 * PieQueueDisc: The default maximum size is 25 packets
 * MqQueueDisc: This queue disc has no limits on its capacity
 * TbfQueueDisc: The default maximum size is 1000 packets
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/doc/tutorial/source/conf.py ns-3.34/doc/tutorial/source/conf.py
--- ns-3.33/doc/tutorial/source/conf.py	2021-01-09 17:18:01.000000000 -0800
+++ ns-3.34/doc/tutorial/source/conf.py	2021-07-14 10:32:18.000000000 -0700
@@ -71,9 +71,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = u'ns-3.33'
+version = u'ns-3.34'
 # The full version, including alpha/beta/rc tags.
-release = u'ns-3.33'
+release = u'ns-3.34'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/doc/tutorial/source/getting-started.rst ns-3.34/doc/tutorial/source/getting-started.rst
--- ns-3.33/doc/tutorial/source/getting-started.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/doc/tutorial/source/getting-started.rst	2021-07-14 10:31:06.000000000 -0700
@@ -68,14 +68,14 @@
 a bit, or the main web site at https://www.nsnam.org, since there is a 
 wealth of information there. 
 
-As of the most recent |ns3| release (ns-3.32), the following tools
+As of the most recent |ns3| release (ns-3.34), the following tools
 are needed to get started with |ns3|:
 
 ============  ===========================================================
 Prerequisite  Package/version
 ============  ===========================================================
-C++ compiler  ``clang++`` or ``g++`` (g++ version 4.9 or greater)
-Python        ``python3`` version >=3.5
+C++ compiler  ``clang++`` or ``g++`` (g++ version 7 or greater)
+Python        ``python3`` version >=3.6
 Git           any recent version (to access |ns3| from `GitLab.com <https://gitlab.com/nsnam/ns-3-dev/>`_)
 tar           any recent version (to unpack an `ns-3 release <https://www.nsnam.org/releases/>`_)
 bunzip2       any recent version (to uncompress an |ns3| release)
@@ -89,6 +89,18 @@
 Linux, macOS, or a Linux emulation environment, and has at least the above
 prerequisites.
 
+**Note:** The |ns3| build system (`Waf`, introduced below) does not
+tolerate spaces in the installation path.  Make sure that you are downloading
+into a directory that does not contain spaces in the full path name.
+
+For example, do not use a directory path such as the below, because one
+of the parent directories contains a space in the directory name:
+
+.. sourcecode:: bash
+
+  $ pwd
+  /home/user/5G simulations/ns-3-allinone/ns-3-dev
+
 Downloading a release of ns-3 as a source archive
 +++++++++++++++++++++++++++++++++++++++++++++++++
 
@@ -112,22 +124,22 @@
   $ cd
   $ mkdir workspace
   $ cd workspace
-  $ wget https://www.nsnam.org/release/ns-allinone-3.32.tar.bz2
-  $ tar xjf ns-allinone-3.32.tar.bz2
+  $ wget https://www.nsnam.org/release/ns-allinone-3.34.tar.bz2
+  $ tar xjf ns-allinone-3.34.tar.bz2
 
 Notice the use above of the ``wget`` utility, which is a command-line
 tool to fetch objects from the web; if you do not have this installed,
 you can use a browser for this step.
  
 Following these steps, if you change into the directory 
-``ns-allinone-3.32``, you should see a number of files and directories
+``ns-allinone-3.34``, you should see a number of files and directories
 
 .. sourcecode:: text
 
-  $ cd ns-allinone-3.32
+  $ cd ns-allinone-3.34
   $ ls
-  bake      constants.py   ns-3.32                            README
-  build.py  netanim-3.108  pybindgen-0.21.0                   util.py
+  bake      constants.py   ns-3.34                            README
+  build.py  netanim-3.108  pybindgen-0.22.0                   util.py
 
 You are now ready to build the base |ns3| distribution and may skip ahead
 to the section on building |ns3|.
@@ -177,7 +189,7 @@
 
 .. sourcecode:: bash
 
-  $ python3 download.py -n ns-3.32
+  $ python3 download.py -n ns-3.34
 
 After this step, the additional repositories of |ns3|, bake, pybindgen,
 and netanim will be downloaded to the ``ns-3-allinone`` directory.
@@ -246,10 +258,10 @@
 
 There are a few configuration targets available:
 
-1.  ``ns-3.32``:  the module corresponding to the release; it will download
+1.  ``ns-3.34``:  the module corresponding to the release; it will download
     components similar to the release tarball.
 2.  ``ns-3-dev``:  a similar module but using the development code tree
-3.  ``ns-allinone-3.32``:  the module that includes other optional features
+3.  ``ns-allinone-3.34``:  the module that includes other optional features
     such as Click routing, Openflow for |ns3|, and the Network Simulation
     Cradle
 4.  ``ns-3-allinone``:  similar to the released version of the allinone
@@ -267,12 +279,12 @@
 `"ns-3 Releases"
 <https://www.nsnam.org/releases>`_
 web page and clicking on the latest release link.  We'll proceed in
-this tutorial example with ``ns-3.32``.
+this tutorial example with ``ns-3.34``.
 
 We are now going to use the bake tool to pull down the various pieces of 
 |ns3| you will be using.  First, we'll say a word about running bake.
 
-bake works by downloading source packages into a source directory,
+Bake works by downloading source packages into a source directory,
 and installing libraries into a build directory.  bake can be run
 by referencing the binary, but if one chooses to run bake from
 outside of the directory it was downloaded into, it is advisable
@@ -295,7 +307,7 @@
 
 .. sourcecode:: bash
 
-  $ ./bake.py configure -e ns-3.32
+  $ ./bake.py configure -e ns-3.34
 
 Next, we'll ask bake to check whether we have enough tools to download
 various components.  Type:
@@ -319,11 +331,11 @@
   > patch tool - OK
   > Path searched for tools: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...
 
-In particular, download tools such as Mercurial, CVS, Git, and Bazaar
+In particular, download tools such as Git and Mercurial
 are our principal concerns at this point, since they allow us to fetch
 the code.  Please install missing tools at this stage, in the usual
 way for your system (if you are able to), or contact your system 
-administrator as needed to install these tools.
+administrator as needed to install these tools.  You can also 
 
 Next, try to download the software:
 
@@ -343,9 +355,15 @@
   >> Searching for system dependency python-dev - OK
   >> Searching for system dependency qt - OK
   >> Searching for system dependency g++ - OK
-  >> Downloading pybindgen-0.21.0 (target directory:pybindgen) - OK
+  >> Searching for system dependency cxxfilt - OK
+  >> Searching for system dependency setuptools - OK
+  >> Searching for system dependency gi-cairo - OK
+  >> Searching for system dependency gir-bindings - OK
+  >> Searching for system dependency pygobject - OK
+  >> Searching for system dependency cmake - OK
   >> Downloading netanim-3.108 - OK
-  >> Downloading ns-3.32 - OK
+  >> Downloading pybindgen-0.22.0 (target directory:pybindgen) - OK
+  >> Downloading ns-3.34 (target directory:ns-3.34) - OK
 
 The above suggests that three sources have been downloaded.  Check the
 ``source`` directory now and type ``ls``; one should see:
@@ -354,7 +372,7 @@
 
   $ cd source
   $ ls
-  netanim-3.108  ns-3.32  pybindgen
+  netanim-3.108  ns-3.34  pybindgen
 
 You are now ready to build the |ns3| distribution.
 
@@ -385,7 +403,7 @@
 
 If you downloaded
 using a tarball you should have a directory called something like 
-``ns-allinone-3.32`` under your ``~/workspace`` directory.  
+``ns-allinone-3.34`` under your ``~/workspace`` directory.  
 Type the following:
 
 .. sourcecode:: bash
@@ -404,7 +422,7 @@
 attempt to build the netanim animator, then the pybindgen bindings generator,
 and finally |ns3|.  Eventually you should see the following::
 
-   Waf: Leaving directory '/path/to/workspace/ns-allinone-3.32/ns-3.32/build'
+   Waf: Leaving directory '/path/to/workspace/ns-allinone-3.34/ns-3.34/build'
    'build' finished successfully (6m25.032s)
   
    Modules built:
@@ -426,7 +444,7 @@
    Modules not built (see ns-3 tutorial for explanation):
    brite                  click                     openflow                  
 
-   Leaving directory ./ns-3.32
+   Leaving directory ./ns-3.34
 
 Regarding the portion about modules not built::
 
@@ -453,11 +471,9 @@
 
 .. sourcecode:: text
 
-  >> Building pybindgen-0.21.0 - OK
+  >> Building pybindgen-0.22.0 - OK
   >> Building netanim-3.108 - OK
-  >> Building ns-3.32 - OK
-
-*Hint:  you can also perform both steps, download and build, by calling ``bake.py deploy``.*
+  >> Building ns-3.34 - OK
 
 There may be failures to build all components, but the build will proceed
 anyway if the component is optional.  For example, a recent portability issue
@@ -657,7 +673,7 @@
 .. sourcecode:: bash
 
   $ ./waf --check-profile
-  Waf: Entering directory \`/path/to/ns-3-allinone/ns-3.32/build\'
+  Waf: Entering directory \`/path/to/ns-3-allinone/ns-3.34/build\'
   Build profile: debug
 
 The build.py script discussed above supports also the ``--enable-examples``
@@ -1191,7 +1207,7 @@
 
 .. sourcecode:: text
 
-  ns-3.31+26@g82e7f5d-debug
+  ns-3.33+249@g80e0dd0-dirty-debug
 
 If ``--check-version`` is run when ``-enable-build-version`` was not configured,
 an error message indicating that the option is disabled will be displayed instead.
@@ -1256,20 +1272,20 @@
 .. sourcecode:: text
 
   build-version-example:
-  Program Version (according to CommandLine): ns-3.31+28@gce1eb40-dirty-debug
-
+  Program Version (according to CommandLine): ns-3.33+249@g80e0dd0-dirty-debug
+  
   Version fields:
-  LongVersion:        ns-3.32+28@gcefeb91-dirty-debug
-  ShortVersion:       ns-3.32+*
-  BuildSummary:       ns-3.32+*
-  VersionTag:         ns-3.32
+  LongVersion:        ns-3.33+249@g80e0dd0-dirty-debug
+  ShortVersion:       ns-3.33+*
+  BuildSummary:       ns-3.33+*
+  VersionTag:         ns-3.33
   Major:              3
-  Minor:              32
+  Minor:              33
   Patch:              0
-  ReleaseCandidate:
-  ClosestAncestorTag: ns-3.32
-  TagDistance:        28
-  CommitHash:         gce1eb40
+  ReleaseCandidate:   
+  ClosestAncestorTag: ns-3.33
+  TagDistance:        249
+  CommitHash:         g80e0dd0
   BuildProfile:       debug
   WorkingTree:        dirty
 
@@ -1280,7 +1296,7 @@
 
   ./waf --run-no-build "command-line-example --version"
   Waf: Entering directory `/g/g14/mdb/gitlab/mdb/ns-3-dev/build/debug'
-  ns-3.31+28@gce1eb40-dirty-debug
+  ns-3.33+249@g80e0dd0-dirty-debug
 
 If the ``--enable-build-version`` option was not configured, ``--version``
 will print out a message similar to ``--check-version`` indicating that the build
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/channel-models/three-gpp-v2v-channel-example.cc ns-3.34/examples/channel-models/three-gpp-v2v-channel-example.cc
--- ns-3.33/examples/channel-models/three-gpp-v2v-channel-example.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/channel-models/three-gpp-v2v-channel-example.cc	2021-07-14 10:31:06.000000000 -0700
@@ -41,7 +41,7 @@
 #include "ns3/core-module.h"
 #include "ns3/network-module.h"
 #include <fstream>
-#include "ns3/three-gpp-antenna-array-model.h"
+#include "ns3/uniform-planar-array.h"
 #include "ns3/three-gpp-spectrum-propagation-loss-model.h"
 #include "ns3/three-gpp-v2v-propagation-loss-model.h"
 #include "ns3/three-gpp-channel-model.h"
@@ -61,9 +61,9 @@
  * \param otherDevice the device towards which point the beam
  */
 static void
-DoBeamforming (Ptr<NetDevice> thisDevice, Ptr<ThreeGppAntennaArrayModel> thisAntenna, Ptr<NetDevice> otherDevice)
+DoBeamforming (Ptr<NetDevice> thisDevice, Ptr<PhasedArrayModel> thisAntenna, Ptr<NetDevice> otherDevice)
 {
-  ThreeGppAntennaArrayModel::ComplexVector antennaWeights;
+  PhasedArrayModel::ComplexVector antennaWeights;
 
   // retrieve the position of the two devices
   Vector aPos = thisDevice->GetNode ()->GetObject<MobilityModel> ()->GetPosition ();
@@ -72,31 +72,8 @@
   // compute the azimuth and the elevation angles
   Angles completeAngle (bPos,aPos);
 
-  double hAngleRadian = fmod (completeAngle.phi, 2.0 * M_PI); // the azimuth angle
-  if (hAngleRadian < 0)
-    {
-      hAngleRadian += 2.0 * M_PI;
-    }
-  double vAngleRadian = completeAngle.theta; // the elevation angle
-
-  // retrieve the number of antenna elements
-  int totNoArrayElements = thisAntenna->GetNumberOfElements ();
-
-  // the total power is divided equally among the antenna elements
-  double power = 1 / sqrt (totNoArrayElements);
-
-  // compute the antenna weights
-  for (int ind = 0; ind < totNoArrayElements; ind++)
-    {
-      Vector loc = thisAntenna->GetElementLocation (ind);
-      double phase = -2 * M_PI * (sin (vAngleRadian) * cos (hAngleRadian) * loc.x
-                                  + sin (vAngleRadian) * sin (hAngleRadian) * loc.y
-                                  + cos (vAngleRadian) * loc.z);
-      antennaWeights.push_back (exp (std::complex<double> (0, phase)) * power);
-    }
-
-  // store the antenna weights
-  thisAntenna->SetBeamformingVector (antennaWeights);
+  PhasedArrayModel::ComplexVector bf = thisAntenna->GetBeamformingVector (completeAngle);
+  thisAntenna->SetBeamformingVector (bf);
 }
 
 /**
@@ -212,8 +189,8 @@
   rxDev->SetNode (nodes.Get (1));
 
   // create the antenna objects and set their dimensions
-  Ptr<ThreeGppAntennaArrayModel> txAntenna = CreateObjectWithAttributes<ThreeGppAntennaArrayModel> ("NumColumns", UintegerValue (2), "NumRows", UintegerValue (2), "BearingAngle", DoubleValue (-M_PI / 2));
-  Ptr<ThreeGppAntennaArrayModel> rxAntenna = CreateObjectWithAttributes<ThreeGppAntennaArrayModel> ("NumColumns", UintegerValue (2), "NumRows", UintegerValue (2), "BearingAngle", DoubleValue (M_PI / 2));
+  Ptr<PhasedArrayModel> txAntenna = CreateObjectWithAttributes<UniformPlanarArray> ("NumColumns", UintegerValue (2), "NumRows", UintegerValue (2), "BearingAngle", DoubleValue (-M_PI / 2));
+  Ptr<PhasedArrayModel> rxAntenna = CreateObjectWithAttributes<UniformPlanarArray> ("NumColumns", UintegerValue (2), "NumRows", UintegerValue (2), "BearingAngle", DoubleValue (M_PI / 2));
 
   Ptr<MobilityModel> txMob;
   Ptr<MobilityModel> rxMob;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/tcp/tcp-bbr-example.cc ns-3.34/examples/tcp/tcp-bbr-example.cc
--- ns-3.33/examples/tcp/tcp-bbr-example.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/examples/tcp/tcp-bbr-example.cc	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,259 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018-20 NITK Surathkal
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Aarti Nandagiri <aarti.nandagiri@gmail.com>
+ *          Vivek Jain <jain.vivek.anand@gmail.com>
+ *          Mohit P. Tahiliani <tahiliani@nitk.edu.in>
+ */
+
+// This program simulates the following topology:
+//
+//           1000 Mbps           10Mbps          1000 Mbps
+//  Sender -------------- R1 -------------- R2 -------------- Receiver
+//              5ms               10ms               5ms
+//
+// The link between R1 and R2 is a bottleneck link with 10 Mbps. All other
+// links are 1000 Mbps.
+//
+// This program runs by default for 100 seconds and creates a new directory
+// called 'bbr-results' in the ns-3 root directory. The program creates one
+// sub-directory called 'pcap' in 'bbr-results' directory (if pcap generation
+// is enabled) and three .dat files.
+//
+// (1) 'pcap' sub-directory contains six PCAP files:
+//     * bbr-0-0.pcap for the interface on Sender
+//     * bbr-1-0.pcap for the interface on Receiver
+//     * bbr-2-0.pcap for the first interface on R1
+//     * bbr-2-1.pcap for the second interface on R1
+//     * bbr-3-0.pcap for the first interface on R2
+//     * bbr-3-1.pcap for the second interface on R2
+// (2) cwnd.dat file contains congestion window trace for the sender node
+// (3) throughput.dat file contains sender side throughput trace
+// (4) queueSize.dat file contains queue length trace from the bottleneck link
+//
+// BBR algorithm enters PROBE_RTT phase in every 10 seconds. The congestion
+// window is fixed to 4 segments in this phase with a goal to achieve a better
+// estimate of minimum RTT (because queue at the bottleneck link tends to drain
+// when the congestion window is reduced to 4 segments).
+//
+// The congestion window and queue occupancy traces output by this program show
+// periodic drops every 10 seconds when BBR algorithm is in PROBE_RTT phase.
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/traffic-control-module.h"
+#include "ns3/flow-monitor-module.h"
+
+using namespace ns3;
+
+std::string dir;
+uint32_t prev = 0;
+Time prevTime = Seconds (0);
+
+// Calculate throughput
+static void
+TraceThroughput (Ptr<FlowMonitor> monitor)
+{
+  FlowMonitor::FlowStatsContainer stats = monitor->GetFlowStats ();
+  auto itr = stats.begin ();
+  Time curTime = Now ();
+  std::ofstream thr (dir + "/throughput.dat", std::ios::out | std::ios::app);
+  thr <<  curTime << " " << 8 * (itr->second.txBytes - prev) / (1000 * 1000 * (curTime.GetSeconds () - prevTime.GetSeconds ())) << std::endl;
+  prevTime = curTime;
+  prev = itr->second.txBytes;
+  Simulator::Schedule (Seconds (0.2), &TraceThroughput, monitor);
+}
+
+// Check the queue size
+void CheckQueueSize (Ptr<QueueDisc> qd)
+{
+  uint32_t qsize = qd->GetCurrentSize ().GetValue ();
+  Simulator::Schedule (Seconds (0.2), &CheckQueueSize, qd);
+  std::ofstream q (dir + "/queueSize.dat", std::ios::out | std::ios::app);
+  q << Simulator::Now ().GetSeconds () << " " << qsize << std::endl;
+  q.close ();
+}
+
+// Trace congestion window
+static void CwndTracer (Ptr<OutputStreamWrapper> stream, uint32_t oldval, uint32_t newval)
+{
+  *stream->GetStream () << Simulator::Now ().GetSeconds () << " " << newval / 1448.0 << std::endl;
+}
+
+void TraceCwnd (uint32_t nodeId, uint32_t socketId)
+{
+  AsciiTraceHelper ascii;
+  Ptr<OutputStreamWrapper> stream = ascii.CreateFileStream (dir + "/cwnd.dat");
+  Config::ConnectWithoutContext ("/NodeList/" + std::to_string (nodeId) + "/$ns3::TcpL4Protocol/SocketList/" + std::to_string (socketId) + "/CongestionWindow", MakeBoundCallback (&CwndTracer, stream));
+}
+
+int main (int argc, char *argv [])
+{
+  // Naming the output directory using local system time
+  time_t rawtime;
+  struct tm * timeinfo;
+  char buffer [80];
+  time (&rawtime);
+  timeinfo = localtime (&rawtime);
+  strftime (buffer, sizeof (buffer), "%d-%m-%Y-%I-%M-%S", timeinfo);
+  std::string currentTime (buffer);
+
+  std::string tcpTypeId = "TcpBbr";
+  std::string queueDisc = "FifoQueueDisc";
+  uint32_t delAckCount = 2;
+  bool bql = true;
+  bool enablePcap = false;
+  Time stopTime = Seconds (100);
+
+  CommandLine cmd (__FILE__);
+  cmd.AddValue ("tcpTypeId", "Transport protocol to use: TcpNewReno, TcpBbr", tcpTypeId);
+  cmd.AddValue ("delAckCount", "Delayed ACK count", delAckCount);
+  cmd.AddValue ("enablePcap", "Enable/Disable pcap file generation", enablePcap);
+  cmd.AddValue ("stopTime", "Stop time for applications / simulation time will be stopTime + 1", stopTime);
+  cmd.Parse (argc, argv);
+
+  queueDisc = std::string ("ns3::") + queueDisc;
+
+  Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue ("ns3::" + tcpTypeId));
+  Config::SetDefault ("ns3::TcpSocket::SndBufSize", UintegerValue (4194304));
+  Config::SetDefault ("ns3::TcpSocket::RcvBufSize", UintegerValue (6291456));
+  Config::SetDefault ("ns3::TcpSocket::InitialCwnd", UintegerValue (10));
+  Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (delAckCount));
+  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1448));
+  Config::SetDefault ("ns3::DropTailQueue<Packet>::MaxSize", QueueSizeValue (QueueSize ("1p")));
+  Config::SetDefault (queueDisc + "::MaxSize", QueueSizeValue (QueueSize ("100p")));
+
+  NodeContainer sender, receiver;
+  NodeContainer routers;
+  sender.Create (1);
+  receiver.Create (1);
+  routers.Create (2);
+
+  // Create the point-to-point link helpers
+  PointToPointHelper bottleneckLink;
+  bottleneckLink.SetDeviceAttribute  ("DataRate", StringValue ("10Mbps"));
+  bottleneckLink.SetChannelAttribute ("Delay", StringValue ("10ms"));
+
+  PointToPointHelper edgeLink;
+  edgeLink.SetDeviceAttribute  ("DataRate", StringValue ("1000Mbps"));
+  edgeLink.SetChannelAttribute ("Delay", StringValue ("5ms"));
+
+  // Create NetDevice containers
+  NetDeviceContainer senderEdge = edgeLink.Install (sender.Get (0), routers.Get (0));
+  NetDeviceContainer r1r2 = bottleneckLink.Install (routers.Get (0), routers.Get (1));
+  NetDeviceContainer receiverEdge = edgeLink.Install (routers.Get (1), receiver.Get (0));
+
+  // Install Stack
+  InternetStackHelper internet;
+  internet.Install (sender);
+  internet.Install (receiver);
+  internet.Install (routers);
+
+  // Configure the root queue discipline
+  TrafficControlHelper tch;
+  tch.SetRootQueueDisc (queueDisc);
+
+  if (bql)
+    {
+      tch.SetQueueLimits ("ns3::DynamicQueueLimits", "HoldTime", StringValue ("1000ms"));
+    }
+
+  tch.Install (senderEdge);
+  tch.Install (receiverEdge);
+
+  // Assign IP addresses
+  Ipv4AddressHelper ipv4;
+  ipv4.SetBase ("10.0.0.0", "255.255.255.0");
+
+  Ipv4InterfaceContainer i1i2 = ipv4.Assign (r1r2);
+
+  ipv4.NewNetwork ();
+  Ipv4InterfaceContainer is1 = ipv4.Assign (senderEdge);
+
+  ipv4.NewNetwork ();
+  Ipv4InterfaceContainer ir1 = ipv4.Assign (receiverEdge);
+
+  // Populate routing tables
+  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
+
+  // Select sender side port
+  uint16_t port = 50001;
+
+  // Install application on the sender
+  BulkSendHelper source ("ns3::TcpSocketFactory", InetSocketAddress (ir1.GetAddress (1), port));
+  source.SetAttribute ("MaxBytes", UintegerValue (0));
+  ApplicationContainer sourceApps = source.Install (sender.Get (0));
+  sourceApps.Start (Seconds (0.0));
+  Simulator::Schedule (Seconds (0.2), &TraceCwnd, 0, 0);
+  sourceApps.Stop (stopTime);
+
+  // Install application on the receiver
+  PacketSinkHelper sink ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), port));
+  ApplicationContainer sinkApps = sink.Install (receiver.Get (0));
+  sinkApps.Start (Seconds (0.0));
+  sinkApps.Stop (stopTime);
+
+  // Create a new directory to store the output of the program
+  dir = "bbr-results/" + currentTime + "/";
+  std::string dirToSave = "mkdir -p " + dir;
+  if (system (dirToSave.c_str ()) == -1)
+    {
+      exit (1);
+    }
+
+  // The plotting scripts are provided in the following repository, if needed:
+  // https://github.com/mohittahiliani/BBR-Validation/
+  //
+  // Download 'PlotScripts' directory (which is inside ns-3 scripts directory)
+  // from the link given above and place it in the ns-3 root directory.
+  // Uncomment the following three lines to generate plots for Congestion
+  // Window, sender side throughput and queue occupancy on the bottleneck link.
+  //
+  // system (("cp -R PlotScripts/gnuplotScriptCwnd " + dir).c_str ());
+  // system (("cp -R PlotScripts/gnuplotScriptThroughput " + dir).c_str ());
+  // system (("cp -R PlotScripts/gnuplotScriptQueueSize " + dir).c_str ());
+
+  // Trace the queue occupancy on the second interface of R1
+  tch.Uninstall (routers.Get (0)->GetDevice (1));
+  QueueDiscContainer qd;
+  qd = tch.Install (routers.Get (0)->GetDevice (1));
+  Simulator::ScheduleNow (&CheckQueueSize, qd.Get (0));
+
+  // Generate PCAP traces if it is enabled
+  if (enablePcap)
+    {
+      if (system ((dirToSave + "/pcap/").c_str ()) == -1)
+        {
+          exit (1);
+        }
+      bottleneckLink.EnablePcapAll (dir + "/pcap/bbr", true);
+    }
+
+  // Check for dropped packets using Flow Monitor
+  FlowMonitorHelper flowmon;
+  Ptr<FlowMonitor> monitor = flowmon.InstallAll ();
+  Simulator::Schedule (Seconds (0 + 0.000001), &TraceThroughput, monitor);
+
+  Simulator::Stop (stopTime + TimeStep (1));
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+  return 0;
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/tcp/tcp-pacing.cc ns-3.34/examples/tcp/tcp-pacing.cc
--- ns-3.33/examples/tcp/tcp-pacing.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/tcp/tcp-pacing.cc	2021-07-14 10:31:06.000000000 -0700
@@ -148,7 +148,7 @@
   bool tracing = false;
 
   uint32_t maxBytes = 0; // value of zero corresponds to unlimited send
-  std::string transportProtocol = "ns3::TcpNewReno";
+  std::string transportProtocol = "ns3::TcpCubic";
 
   Time simulationEndTime = Seconds (5);
   DataRate bottleneckBandwidth ("10Mbps");  // value of x as shown in the above network topology
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/tcp/tcp-variants-comparison.cc ns-3.34/examples/tcp/tcp-variants-comparison.cc
--- ns-3.33/examples/tcp/tcp-variants-comparison.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/tcp/tcp-variants-comparison.cc	2021-07-14 10:31:06.000000000 -0700
@@ -230,7 +230,7 @@
   cmd.AddValue ("transport_prot", "Transport protocol to use: TcpNewReno, TcpLinuxReno, "
                 "TcpHybla, TcpHighSpeed, TcpHtcp, TcpVegas, TcpScalable, TcpVeno, "
                 "TcpBic, TcpYeah, TcpIllinois, TcpWestwood, TcpWestwoodPlus, TcpLedbat, "
-		"TcpLp, TcpDctcp, TcpCubic", transport_prot);
+		"TcpLp, TcpDctcp, TcpCubic, TcpBbr", transport_prot);
   cmd.AddValue ("error_p", "Packet error rate", error_p);
   cmd.AddValue ("bandwidth", "Bottleneck bandwidth", bandwidth);
   cmd.AddValue ("delay", "Bottleneck delay", delay);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/tcp/wscript ns-3.34/examples/tcp/wscript
--- ns-3.33/examples/tcp/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/tcp/wscript	2021-07-14 10:31:06.000000000 -0700
@@ -57,3 +57,8 @@
                                  ['point-to-point', 'internet', 'applications', 'traffic-control', 'network', 'internet-apps'])
 
     obj.source = 'tcp-validation.cc'
+
+    obj = bld.create_ns3_program('tcp-bbr-example',
+                                 ['point-to-point', 'internet', 'applications', 'traffic-control', 'network', 'internet-apps', 'flow-monitor'])
+
+    obj.source = 'tcp-bbr-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/tutorial/third.cc ns-3.34/examples/tutorial/third.cc
--- ns-3.33/examples/tutorial/third.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/tutorial/third.cc	2021-07-14 10:31:06.000000000 -0700
@@ -173,8 +173,9 @@
 
   Simulator::Stop (Seconds (10.0));
 
-  if (tracing == true)
+  if (tracing)
     {
+      phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
       pointToPoint.EnablePcapAll ("third");
       phy.EnablePcap ("third", apDevices.Get (0));
       csma.EnablePcap ("third", csmaDevices.Get (0), true);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/tutorial/third.py ns-3.34/examples/tutorial/third.py
--- ns-3.33/examples/tutorial/third.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/tutorial/third.py	2021-07-14 10:31:06.000000000 -0700
@@ -90,7 +90,7 @@
 wifiApNode = p2pNodes.Get(0)
 
 channel = ns.wifi.YansWifiChannelHelper.Default()
-phy = ns.wifi.YansWifiPhyHelper.Default()
+phy = ns.wifi.YansWifiPhyHelper()
 phy.SetChannel(channel.Create())
 
 wifi = ns.wifi.WifiHelper()
@@ -152,6 +152,7 @@
 ns.core.Simulator.Stop(ns.core.Seconds(10.0))
 
 if tracing == "True":
+	phy.SetPcapDataLinkType(phy.DLT_IEEE802_11_RADIO)
 	pointToPoint.EnablePcapAll ("third")
 	phy.EnablePcap ("third", apDevices.Get (0))
 	csma.EnablePcap ("third", csmaDevices.Get (0), True)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/udp-client-server/udp-client-server.cc ns-3.34/examples/udp-client-server/udp-client-server.cc
--- ns-3.33/examples/udp-client-server/udp-client-server.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/udp-client-server/udp-client-server.cc	2021-07-14 10:31:06.000000000 -0700
@@ -1,5 +1,7 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
+ * Copyright (c) 2009 INRIA
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation;
@@ -12,6 +14,8 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mohamed Amine Ismail <amine.ismail@sophia.inria.fr>
  */
 
 // Network topology
@@ -19,9 +23,12 @@
 //       n0    n1
 //       |     |
 //       =======
-//         LAN
+//         LAN (CSMA)
 //
-// - UDP flows from n0 to n1
+// - UDP flow from n0 to n1 of 1024 byte packets at intervals of 50 ms
+//   - maximum of 320 packets sent (or limited by simulation duration)
+//   - option to use IPv4 or IPv6 addressing
+//   - option to disable logging statements
 
 #include <fstream>
 #include "ns3/core-module.h"
@@ -36,42 +43,36 @@
 int
 main (int argc, char *argv[])
 {
-//
-// Enable logging for UdpClient and
-//
-  LogComponentEnable ("UdpClient", LOG_LEVEL_INFO);
-  LogComponentEnable ("UdpServer", LOG_LEVEL_INFO);
-
+  // Declare variables used in command-line arguments
   bool useV6 = false;
+  bool logging = true;
   Address serverAddress;
 
   CommandLine cmd (__FILE__);
   cmd.AddValue ("useIpv6", "Use Ipv6", useV6);
+  cmd.AddValue ("logging", "Enable logging", logging);
   cmd.Parse (argc, argv);
 
-//
-// Explicitly create the nodes required by the topology (shown above).
-//
-  NS_LOG_INFO ("Create nodes.");
+  if (logging)
+    {
+      LogComponentEnable ("UdpClient", LOG_LEVEL_INFO);
+      LogComponentEnable ("UdpServer", LOG_LEVEL_INFO);
+    }
+
+  NS_LOG_INFO ("Create nodes in above topology.");
   NodeContainer n;
   n.Create (2);
 
   InternetStackHelper internet;
   internet.Install (n);
 
-  NS_LOG_INFO ("Create channels.");
-//
-// Explicitly create the channels required by the topology (shown above).
-//
+  NS_LOG_INFO ("Create channel between the two nodes.");
   CsmaHelper csma;
   csma.SetChannelAttribute ("DataRate", DataRateValue (DataRate (5000000)));
   csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
   csma.SetDeviceAttribute ("Mtu", UintegerValue (1400));
   NetDeviceContainer d = csma.Install (n);
 
-//
-// We've got the "hardware" in place.  Now we need to add IP addresses.
-//
   NS_LOG_INFO ("Assign IP Addresses.");
   if (useV6 == false)
     {
@@ -88,20 +89,14 @@
       serverAddress = Address(i6.GetAddress (1,1));
     }
 
-  NS_LOG_INFO ("Create Applications.");
-//
-// Create one udpServer applications on node one.
-//
+  NS_LOG_INFO ("Create UdpServer application on node 1.");
   uint16_t port = 4000;
   UdpServerHelper server (port);
   ApplicationContainer apps = server.Install (n.Get (1));
   apps.Start (Seconds (1.0));
   apps.Stop (Seconds (10.0));
 
-//
-// Create one UdpClient application to send UDP datagrams from node zero to
-// node one.
-//
+  NS_LOG_INFO ("Create UdpClient application on node 0 to send to node 1.");
   uint32_t MaxPacketSize = 1024;
   Time interPacketInterval = Seconds (0.05);
   uint32_t maxPacketCount = 320;
@@ -113,9 +108,6 @@
   apps.Start (Seconds (2.0));
   apps.Stop (Seconds (10.0));
 
-//
-// Now, do the actual simulation.
-//
   NS_LOG_INFO ("Run Simulation.");
   Simulator::Run ();
   Simulator::Destroy ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/udp-client-server/udp-trace-client-server.cc ns-3.34/examples/udp-client-server/udp-trace-client-server.cc
--- ns-3.33/examples/udp-client-server/udp-trace-client-server.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/udp-client-server/udp-trace-client-server.cc	2021-07-14 10:31:06.000000000 -0700
@@ -1,5 +1,7 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
+ * Copyright (c) 2009 INRIA
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation;
@@ -12,6 +14,8 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mohamed Amine Ismail <amine.ismail@sophia.inria.fr>
  */
 
 // Network topology
@@ -19,9 +23,11 @@
 //       n0    n1
 //       |     |
 //       =======
-//         LAN
+//         LAN (CSMA)
 //
-// - UDP flows from n0 to n1
+// - UDP flow from n0 to n1 of packets drawn from a trace file
+//  -- option to use IPv4 or IPv6 addressing
+//  -- option to disable logging statements
 
 #include <fstream>
 #include "ns3/core-module.h"
@@ -36,42 +42,36 @@
 int
 main (int argc, char *argv[])
 {
-//
-// Enable logging for UdpClient and
-//
-  LogComponentEnable ("UdpTraceClient", LOG_LEVEL_INFO);
-  LogComponentEnable ("UdpServer", LOG_LEVEL_INFO);
-
+  // Declare variables used in command-line arguments
   bool useV6 = false;
+  bool logging = true;
   Address serverAddress;
 
   CommandLine cmd (__FILE__);
   cmd.AddValue ("useIpv6", "Use Ipv6", useV6);
+  cmd.AddValue ("logging", "Enable logging", logging);
   cmd.Parse (argc, argv);
 
-//
-// Explicitly create the nodes required by the topology (shown above).
-//
-  NS_LOG_INFO ("Create nodes.");
+  if (logging)
+    {
+      LogComponentEnable ("UdpClient", LOG_LEVEL_INFO);
+      LogComponentEnable ("UdpServer", LOG_LEVEL_INFO);
+    }
+
+  NS_LOG_INFO ("Create nodes in above topology.");
   NodeContainer n;
   n.Create (2);
 
   InternetStackHelper internet;
   internet.Install (n);
 
-  NS_LOG_INFO ("Create channels.");
-//
-// Explicitly create the channels required by the topology (shown above).
-//
+  NS_LOG_INFO ("Create channel between the two nodes.");
   CsmaHelper csma;
   csma.SetChannelAttribute ("DataRate", DataRateValue (DataRate (5000000)));
   csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
   csma.SetDeviceAttribute ("Mtu", UintegerValue (1500));
   NetDeviceContainer d = csma.Install (n);
 
-//
-// We've got the "hardware" in place.  Now we need to add IP addresses.
-//
   NS_LOG_INFO ("Assign IP Addresses.");
   if (useV6 == false)
     {
@@ -88,20 +88,14 @@
       serverAddress = Address(i6.GetAddress (1,1));
     }
 
-  NS_LOG_INFO ("Create Applications.");
-//
-// Create one udpServer applications on node one.
-//
+  NS_LOG_INFO ("Create UdpServer application on node 1.");
   uint16_t port = 4000;
   UdpServerHelper server (port);
   ApplicationContainer apps = server.Install (n.Get (1));
   apps.Start (Seconds (1.0));
   apps.Stop (Seconds (10.0));
 
-//
-// Create one UdpTraceClient application to send UDP datagrams from node zero to
-// node one.
-//
+  NS_LOG_INFO ("Create UdpClient application on node 0 to send to node 1.");
   uint32_t MaxPacketSize = 1472;  // Back off 20 (IP) + 8 (UDP) bytes from MTU
   UdpTraceClientHelper client (serverAddress, port,"");
   client.SetAttribute ("MaxPacketSize", UintegerValue (MaxPacketSize));
@@ -109,9 +103,6 @@
   apps.Start (Seconds (2.0));
   apps.Stop (Seconds (10.0));
 
-//
-// Now, do the actual simulation.
-//
   NS_LOG_INFO ("Run Simulation.");
   Simulator::Run ();
   Simulator::Destroy ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/examples-to-run.py ns-3.34/examples/wireless/examples-to-run.py
--- ns-3.33/examples/wireless/examples-to-run.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/examples-to-run.py	2021-07-14 10:31:06.000000000 -0700
@@ -50,16 +50,13 @@
     ("wifi-he-network --simulationTime=0.25 --frequency=2.4 --useRts=0 --minExpectedThroughput=6 --maxExpectedThroughput=238", "True", "True"),
     ("wifi-he-network --simulationTime=0.3 --frequency=2.4 --useRts=1 --minExpectedThroughput=6 --maxExpectedThroughput=223", "True", "True"),
     ("wifi-simple-ht-hidden-stations --simulationTime=1 --enableRts=0 --nMpdus=32 --minExpectedThroughput=59 --maxExpectedThroughput=60", "True", "True"),
-    ("wifi-simple-ht-hidden-stations --simulationTime=1 --enableRts=1 --nMpdus=32 --minExpectedThroughput=56 --maxExpectedThroughput=57", "True", "True"),
+    ("wifi-simple-ht-hidden-stations --simulationTime=1 --enableRts=1 --nMpdus=32 --minExpectedThroughput=57 --maxExpectedThroughput=58", "True", "True"),
     ("wifi-mixed-network --simulationTime=1", "True", "True"),
     ("wifi-aggregation --simulationTime=1 --verifyResults=1", "True", "True"),
     ("wifi-txop-aggregation --simulationTime=1 --verifyResults=1", "True", "True"),
     ("wifi-80211e-txop --simulationTime=1 --verifyResults=1", "True", "True"),
     ("wifi-multi-tos --simulationTime=1 --nWifi=16 --useRts=1 --useShortGuardInterval=1", "True", "True"),
     ("wifi-tcp", "True", "True"),
-    ("wifi-pcf --simulationTime=1 --withData=0", "True", "True"),
-    ("wifi-pcf --simulationTime=1 --withData=1 --trafficDirection=upstream", "True", "True"),
-    ("wifi-pcf --simulationTime=1 --withData=1 --trafficDirection=downstream", "True", "True"),
     ("wifi-hidden-terminal --wifiManager=Arf", "True", "True"),
     ("wifi-hidden-terminal --wifiManager=Aarf", "True", "True"),
     ("wifi-hidden-terminal --wifiManager=Aarfcd", "True", "True"),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/mixed-wired-wireless.cc ns-3.34/examples/wireless/mixed-wired-wireless.cc
--- ns-3.33/examples/wireless/mixed-wired-wireless.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/mixed-wired-wireless.cc	2021-07-14 10:31:06.000000000 -0700
@@ -156,6 +156,7 @@
   wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
                                 "DataMode", StringValue ("OfdmRate54Mbps"));
   YansWifiPhyHelper wifiPhy;
+  wifiPhy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
   YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
   wifiPhy.SetChannel (wifiChannel.Create ());
   NetDeviceContainer backboneDevices = wifi.Install (wifiPhy, mac, backbone);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/mixed-wired-wireless.py ns-3.34/examples/wireless/mixed-wired-wireless.py
--- ns-3.33/examples/wireless/mixed-wired-wireless.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/mixed-wired-wireless.py	2021-07-14 10:31:06.000000000 -0700
@@ -136,6 +136,7 @@
     wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
                                   "DataMode", ns.core.StringValue("OfdmRate54Mbps"))
     wifiPhy = ns.wifi.YansWifiPhyHelper()
+    wifiPhy.SetPcapDataLinkType(wifiPhy.DLT_IEEE802_11_RADIO)
     wifiChannel = ns.wifi.YansWifiChannelHelper.Default()
     wifiPhy.SetChannel(wifiChannel.Create())
     backboneDevices = wifi.Install(wifiPhy, mac, backbone)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-80211e-txop.cc ns-3.34/examples/wireless/wifi-80211e-txop.cc
--- ns-3.33/examples/wireless/wifi-80211e-txop.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-80211e-txop.cc	2021-07-14 10:31:06.000000000 -0700
@@ -372,7 +372,7 @@
   throughput = totalPacketsThroughB * payloadSize * 8 / (simulationTime * 1000000.0);
   std::cout << "AC_BE with non-default TXOP limit (3.008ms): " << '\n'
             << "  Throughput = " << throughput << " Mbit/s" << '\n';
-  if (verifyResults && (throughput < 35.5 || throughput > 36.5))
+  if (verifyResults && (throughput < 35 || throughput > 36))
     {
       NS_LOG_ERROR ("Obtained throughput " << throughput << " is not in the expected boundaries!");
       exit (1);
@@ -387,7 +387,7 @@
   throughput = totalPacketsThroughC * payloadSize * 8 / (simulationTime * 1000000.0);
   std::cout << "AC_VI with default TXOP limit (3.008ms): " << '\n'
             << "  Throughput = " << throughput << " Mbit/s" << '\n';
-  if (verifyResults && (throughput < 36 || throughput > 37))
+  if (verifyResults && (throughput < 35 || throughput > 36))
     {
       NS_LOG_ERROR ("Obtained throughput " << throughput << " is not in the expected boundaries!");
       exit (1);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-adhoc.cc ns-3.34/examples/wireless/wifi-adhoc.cc
--- ns-3.33/examples/wireless/wifi-adhoc.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-adhoc.cc	2021-07-14 10:31:06.000000000 -0700
@@ -241,7 +241,6 @@
   gnuplot.GenerateOutput (std::cout);
 
   gnuplot = Gnuplot ("rate-control.png");
-  wifi.SetStandard (WIFI_STANDARD_holland);
 
   NS_LOG_DEBUG ("arf");
   experiment = Experiment ("arf");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-backward-compatibility.cc ns-3.34/examples/wireless/wifi-backward-compatibility.cc
--- ns-3.33/examples/wireless/wifi-backward-compatibility.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-backward-compatibility.cc	2021-07-14 10:31:06.000000000 -0700
@@ -21,6 +21,7 @@
 #include "ns3/command-line.h"
 #include "ns3/config.h"
 #include "ns3/uinteger.h"
+#include "ns3/boolean.h"
 #include "ns3/log.h"
 #include "ns3/yans-wifi-helper.h"
 #include "ns3/ssid.h"
@@ -66,10 +67,6 @@
     {
       standard = WIFI_STANDARD_80211p;
     }
-  else if (version == "holland")
-    {
-      standard = WIFI_STANDARD_holland;
-    }
   else if (version == "80211n_2_4GHZ")
     {
       standard = WIFI_STANDARD_80211n_2_4GHZ;
@@ -106,8 +103,8 @@
 
   CommandLine cmd (__FILE__);
   cmd.AddValue ("simulationTime", "Simulation time in seconds", simulationTime);
-  cmd.AddValue ("apVersion", "The standard version used by the AP: 80211a, 80211b, 80211g, 80211p, holland, 80211n_2_4GHZ, 80211n_5GHZ, 80211ac, 80211ax_2_4GHZ or 80211ax_5GHZ", apVersion);
-  cmd.AddValue ("staVersion", "The standard version used by the station: 80211a, 80211b, 80211g, 80211_10MHZ, 80211_5MHZ, holland, 80211n_2_4GHZ, 80211n_5GHZ, 80211ac, 80211ax_2_4GHZ or 80211ax_5GHZ", staVersion);
+  cmd.AddValue ("apVersion", "The standard version used by the AP: 80211a, 80211b, 80211g, 80211p, 80211n_2_4GHZ, 80211n_5GHZ, 80211ac, 80211ax_2_4GHZ or 80211ax_5GHZ", apVersion);
+  cmd.AddValue ("staVersion", "The standard version used by the station: 80211a, 80211b, 80211g, 80211_10MHZ, 80211_5MHZ, 80211n_2_4GHZ, 80211n_5GHZ, 80211ac, 80211ax_2_4GHZ or 80211ax_5GHZ", staVersion);
   cmd.AddValue ("apRaa", "Rate adaptation algorithm used by the AP", apRaa);
   cmd.AddValue ("staRaa", "Rate adaptation algorithm used by the station", staRaa);
   cmd.AddValue ("apHasTraffic", "Enable/disable traffic on the AP", apHasTraffic);
@@ -131,8 +128,16 @@
   wifi.SetRemoteStationManager ("ns3::" + staRaa + "WifiManager");
 
   mac.SetType ("ns3::StaWifiMac",
+               "QosSupported", BooleanValue (true),
                "Ssid", SsidValue (ssid));
 
+  //Workaround needed as long as we do not fully support channel bonding
+  if (staVersion == "80211ac")
+    {
+      phy.Set ("ChannelWidth", UintegerValue (20));
+      phy.Set ("Frequency", UintegerValue (5180));
+    }
+
   NetDeviceContainer staDevice;
   staDevice = wifi.Install (phy, mac, wifiStaNode);
 
@@ -140,23 +145,19 @@
   wifi.SetRemoteStationManager ("ns3::" + apRaa + "WifiManager");
 
   mac.SetType ("ns3::ApWifiMac",
+               "QosSupported", BooleanValue (true),
                "Ssid", SsidValue (ssid));
 
-  NetDeviceContainer apDevice;
-  apDevice = wifi.Install (phy, mac, wifiApNode);
-
   //Workaround needed as long as we do not fully support channel bonding
-  if (staVersion == "80211ac")
-    {
-      Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (20));
-      Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/Frequency", UintegerValue (5180));
-    }
   if (apVersion == "80211ac")
     {
-      Config::Set ("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (20));
-      Config::Set ("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/Frequency", UintegerValue (5180));
+      phy.Set ("ChannelWidth", UintegerValue (20));
+      phy.Set ("Frequency", UintegerValue (5180));
     }
 
+  NetDeviceContainer apDevice;
+  apDevice = wifi.Install (phy, mac, wifiApNode);
+
   MobilityHelper mobility;
   Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
   positionAlloc->Add (Vector (0.0, 0.0, 0.0));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-blockack.cc ns-3.34/examples/wireless/wifi-blockack.cc
--- ns-3.33/examples/wireless/wifi-blockack.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-blockack.cc	2021-07-14 10:31:06.000000000 -0700
@@ -74,6 +74,7 @@
 
   YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
   YansWifiPhyHelper phy;
+  phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
   phy.SetChannel (channel.Create ());
 
   WifiHelper wifi;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-he-network.cc ns-3.34/examples/wireless/wifi-he-network.cc
--- ns-3.33/examples/wireless/wifi-he-network.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-he-network.cc	2021-07-14 10:31:06.000000000 -0700
@@ -24,8 +24,10 @@
 #include "ns3/boolean.h"
 #include "ns3/double.h"
 #include "ns3/string.h"
+#include "ns3/enum.h"
 #include "ns3/log.h"
 #include "ns3/yans-wifi-helper.h"
+#include "ns3/spectrum-wifi-helper.h"
 #include "ns3/ssid.h"
 #include "ns3/mobility-helper.h"
 #include "ns3/internet-stack-helper.h"
@@ -36,6 +38,9 @@
 #include "ns3/ipv4-global-routing-helper.h"
 #include "ns3/packet-sink.h"
 #include "ns3/yans-wifi-channel.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/wifi-acknowledgment.h"
+#include "ns3/rng-seed-manager.h"
 
 // This is a simple example in order to show how to configure an IEEE 802.11ax Wi-Fi network.
 //
@@ -44,14 +49,16 @@
 // The PHY bitrate is constant over all the simulation run. The user can also specify the distance between
 // the access point and the station: the larger the distance the smaller the goodput.
 //
-// The simulation assumes a single station in an infrastructure network:
+// The simulation assumes a configurable number of stations in an infrastructure network:
 //
 //  STA     AP
 //    *     *
 //    |     |
 //   n1     n2
 //
-//Packets in this simulation belong to BestEffort Access Class (AC_BE).
+// Packets in this simulation belong to BestEffort Access Class (AC_BE).
+// By selecting an acknowledgment sequence for DL MU PPDUs, it is possible to aggregate a
+// Round Robin scheduler to the AP, so that DL MU PPDUs are sent by the AP via DL OFDMA.
 
 using namespace ns3;
 
@@ -59,15 +66,19 @@
 
 int main (int argc, char *argv[])
 {
-  bool udp = true;
-  bool useRts = false;
-  bool useExtendedBlockAck = false;
-  double simulationTime = 10; //seconds
-  double distance = 1.0; //meters
-  double frequency = 5; //whether 2.4, 5 or 6 GHz
-  int mcs = -1; // -1 indicates an unset value
-  double minExpectedThroughput = 0;
-  double maxExpectedThroughput = 0;
+  bool udp {true};
+  bool useRts {false};
+  bool useExtendedBlockAck {false};
+  double simulationTime {10}; //seconds
+  double distance {1.0}; //meters
+  double frequency {5}; //whether 2.4, 5 or 6 GHz
+  std::size_t nStations {1};
+  std::string dlAckSeqType {"NO-OFDMA"};
+  int mcs {-1}; // -1 indicates an unset value
+  uint32_t payloadSize = 700; // must fit in the max TX duration when transmitting at MCS 0 over an RU of 26 tones
+  std::string phyModel {"Yans"};
+  double minExpectedThroughput {0};
+  double maxExpectedThroughput {0};
 
   CommandLine cmd (__FILE__);
   cmd.AddValue ("frequency", "Whether working in the 2.4, 5 or 6 GHz band (other values gets rejected)", frequency);
@@ -76,7 +87,12 @@
   cmd.AddValue ("udp", "UDP if set to 1, TCP otherwise", udp);
   cmd.AddValue ("useRts", "Enable/disable RTS/CTS", useRts);
   cmd.AddValue ("useExtendedBlockAck", "Enable/disable use of extended BACK", useExtendedBlockAck);
+  cmd.AddValue ("nStations", "Number of non-AP HE stations", nStations);
+  cmd.AddValue ("dlAckType", "Ack sequence type for DL OFDMA (NO-OFDMA, ACK-SU-FORMAT, MU-BAR, AGGR-MU-BAR)",
+                dlAckSeqType);
   cmd.AddValue ("mcs", "if set, limit testing to a specific MCS (0-11)", mcs);
+  cmd.AddValue ("payloadSize", "The application payload size in bytes", payloadSize);
+  cmd.AddValue ("phyModel", "PHY model to use when OFDMA is disabled (Yans or Spectrum). If OFDMA is enabled then Spectrum is automatically selected", phyModel);
   cmd.AddValue ("minExpectedThroughput", "if set, simulation fails if the lowest throughput is below this value", minExpectedThroughput);
   cmd.AddValue ("maxExpectedThroughput", "if set, simulation fails if the highest throughput is above this value", maxExpectedThroughput);
   cmd.Parse (argc,argv);
@@ -86,6 +102,36 @@
       Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("0"));
     }
 
+  if (dlAckSeqType == "ACK-SU-FORMAT")
+    {
+      Config::SetDefault ("ns3::WifiDefaultAckManager::DlMuAckSequenceType",
+                          EnumValue (WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE));
+    }
+  else if (dlAckSeqType == "MU-BAR")
+    {
+      Config::SetDefault ("ns3::WifiDefaultAckManager::DlMuAckSequenceType",
+                          EnumValue (WifiAcknowledgment::DL_MU_TF_MU_BAR));
+    }
+  else if (dlAckSeqType == "AGGR-MU-BAR")
+    {
+      Config::SetDefault ("ns3::WifiDefaultAckManager::DlMuAckSequenceType",
+                          EnumValue (WifiAcknowledgment::DL_MU_AGGREGATE_TF));
+    }
+  else if (dlAckSeqType != "NO-OFDMA")
+    {
+      NS_ABORT_MSG ("Invalid DL ack sequence type (must be NO-OFDMA, ACK-SU-FORMAT, MU-BAR or AGGR-MU-BAR)");
+    }
+
+  if (phyModel != "Yans" && phyModel != "Spectrum")
+    {
+      NS_ABORT_MSG ("Invalid PHY model (must be Yans or Spectrum)");
+    }
+  if (dlAckSeqType != "NO-OFDMA")
+    {
+      // SpectrumWifiPhy is required for OFDMA
+      phyModel = "Spectrum";
+    }
+
   double prevThroughput [12];
   for (uint32_t l = 0; l < 12; l++)
     {
@@ -108,28 +154,20 @@
         {
           for (int gi = 3200; gi >= 800; ) //Nanoseconds
             {
-              uint32_t payloadSize; //1500 byte IP packet
-              if (udp)
-                {
-                  payloadSize = 1472; //bytes
-                }
-              else
+              if (!udp)
                 {
-                  payloadSize = 1448; //bytes
                   Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (payloadSize));
                 }
 
-              NodeContainer wifiStaNode;
-              wifiStaNode.Create (1);
+              NodeContainer wifiStaNodes;
+              wifiStaNodes.Create (nStations);
               NodeContainer wifiApNode;
               wifiApNode.Create (1);
 
-              YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
-              YansWifiPhyHelper phy;
-              phy.SetChannel (channel.Create ());
-
+              NetDeviceContainer apDevice, staDevices;
               WifiMacHelper mac;
               WifiHelper wifi;
+
               if (frequency == 6)
                 {
                   wifi.SetStandard (WIFI_STANDARD_80211ax_6GHZ);
@@ -157,21 +195,62 @@
 
               Ssid ssid = Ssid ("ns3-80211ax");
 
-              mac.SetType ("ns3::StaWifiMac",
-                           "Ssid", SsidValue (ssid));
-
-              NetDeviceContainer staDevice;
-              staDevice = wifi.Install (phy, mac, wifiStaNode);
-
-              mac.SetType ("ns3::ApWifiMac",
-                           "EnableBeaconJitter", BooleanValue (false),
-                           "Ssid", SsidValue (ssid));
+              if (phyModel == "Spectrum")
+                {
+                  /*
+                  * SingleModelSpectrumChannel cannot be used with 802.11ax because two
+                  * spectrum models are required: one with 78.125 kHz bands for HE PPDUs
+                  * and one with 312.5 kHz bands for, e.g., non-HT PPDUs (for more details,
+                  * see issue #408 (CLOSED))
+                  */
+                  Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel> ();
+                  SpectrumWifiPhyHelper phy;
+                  phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
+                  phy.SetChannel (spectrumChannel);
+
+                  mac.SetType ("ns3::StaWifiMac",
+                              "Ssid", SsidValue (ssid));
+                  phy.Set ("ChannelWidth", UintegerValue (channelWidth));
+                  staDevices = wifi.Install (phy, mac, wifiStaNodes);
 
-              NetDeviceContainer apDevice;
-              apDevice = wifi.Install (phy, mac, wifiApNode);
+                  if (dlAckSeqType != "NO-OFDMA")
+                    {
+                      mac.SetMultiUserScheduler ("ns3::RrMultiUserScheduler",
+                                                "EnableUlOfdma", BooleanValue (false),
+                                                "EnableBsrp", BooleanValue (false));
+                    }
+                  mac.SetType ("ns3::ApWifiMac",
+                              "EnableBeaconJitter", BooleanValue (false),
+                              "Ssid", SsidValue (ssid));
+                  phy.Set ("ChannelWidth", UintegerValue (channelWidth));
+                  apDevice = wifi.Install (phy, mac, wifiApNode);
+                }
+              else
+                {
+                  YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
+                  YansWifiPhyHelper phy;
+                  phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
+                  phy.SetChannel (channel.Create ());
+
+                  mac.SetType ("ns3::StaWifiMac",
+                              "Ssid", SsidValue (ssid));
+                  phy.Set ("ChannelWidth", UintegerValue (channelWidth));
+                  staDevices = wifi.Install (phy, mac, wifiStaNodes);
+
+                  mac.SetType ("ns3::ApWifiMac",
+                              "EnableBeaconJitter", BooleanValue (false),
+                              "Ssid", SsidValue (ssid));
+                  phy.Set ("ChannelWidth", UintegerValue (channelWidth));
+                  apDevice = wifi.Install (phy, mac, wifiApNode);
+                }
+
+              RngSeedManager::SetSeed (1);
+              RngSeedManager::SetRun (1);
+              int64_t streamNumber = 100;
+              streamNumber += wifi.AssignStreams (apDevice, streamNumber);
+              streamNumber += wifi.AssignStreams (staDevices, streamNumber);
 
-              // Set channel width, guard interval and MPDU buffer size
-              Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (channelWidth));
+              // Set guard interval and MPDU buffer size
               Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HeConfiguration/GuardInterval", TimeValue (NanoSeconds (gi)));
               Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HeConfiguration/MpduBufferSize", UintegerValue (useExtendedBlockAck ? 256 : 64));
 
@@ -186,19 +265,19 @@
               mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
 
               mobility.Install (wifiApNode);
-              mobility.Install (wifiStaNode);
+              mobility.Install (wifiStaNodes);
 
               /* Internet stack*/
               InternetStackHelper stack;
               stack.Install (wifiApNode);
-              stack.Install (wifiStaNode);
+              stack.Install (wifiStaNodes);
 
               Ipv4AddressHelper address;
               address.SetBase ("192.168.1.0", "255.255.255.0");
-              Ipv4InterfaceContainer staNodeInterface;
+              Ipv4InterfaceContainer staNodeInterfaces;
               Ipv4InterfaceContainer apNodeInterface;
 
-              staNodeInterface = address.Assign (staDevice);
+              staNodeInterfaces = address.Assign (staDevices);
               apNodeInterface = address.Assign (apDevice);
 
               /* Setting applications */
@@ -208,17 +287,20 @@
                   //UDP flow
                   uint16_t port = 9;
                   UdpServerHelper server (port);
-                  serverApp = server.Install (wifiStaNode.Get (0));
+                  serverApp = server.Install (wifiStaNodes);
                   serverApp.Start (Seconds (0.0));
                   serverApp.Stop (Seconds (simulationTime + 1));
 
-                  UdpClientHelper client (staNodeInterface.GetAddress (0), port);
-                  client.SetAttribute ("MaxPackets", UintegerValue (4294967295u));
-                  client.SetAttribute ("Interval", TimeValue (Time ("0.00001"))); //packets/s
-                  client.SetAttribute ("PacketSize", UintegerValue (payloadSize));
-                  ApplicationContainer clientApp = client.Install (wifiApNode.Get (0));
-                  clientApp.Start (Seconds (1.0));
-                  clientApp.Stop (Seconds (simulationTime + 1));
+                  for (std::size_t i = 0; i < nStations; i++)
+                    {
+                      UdpClientHelper client (staNodeInterfaces.GetAddress (i), port);
+                      client.SetAttribute ("MaxPackets", UintegerValue (4294967295u));
+                      client.SetAttribute ("Interval", TimeValue (Time ("0.00001"))); //packets/s
+                      client.SetAttribute ("PacketSize", UintegerValue (payloadSize));
+                      ApplicationContainer clientApp = client.Install (wifiApNode.Get (0));
+                      clientApp.Start (Seconds (1.0));
+                      clientApp.Stop (Seconds (simulationTime + 1));
+                    }
                 }
               else
                 {
@@ -226,35 +308,48 @@
                   uint16_t port = 50000;
                   Address localAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
                   PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", localAddress);
-                  serverApp = packetSinkHelper.Install (wifiStaNode.Get (0));
+                  serverApp = packetSinkHelper.Install (wifiStaNodes);
                   serverApp.Start (Seconds (0.0));
                   serverApp.Stop (Seconds (simulationTime + 1));
 
-                  OnOffHelper onoff ("ns3::TcpSocketFactory", Ipv4Address::GetAny ());
-                  onoff.SetAttribute ("OnTime",  StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
-                  onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
-                  onoff.SetAttribute ("PacketSize", UintegerValue (payloadSize));
-                  onoff.SetAttribute ("DataRate", DataRateValue (1000000000)); //bit/s
-                  AddressValue remoteAddress (InetSocketAddress (staNodeInterface.GetAddress (0), port));
-                  onoff.SetAttribute ("Remote", remoteAddress);
-                  ApplicationContainer clientApp = onoff.Install (wifiApNode.Get (0));
-                  clientApp.Start (Seconds (1.0));
-                  clientApp.Stop (Seconds (simulationTime + 1));
+                  for (std::size_t i = 0; i < nStations; i++)
+                    {
+                      OnOffHelper onoff ("ns3::TcpSocketFactory", Ipv4Address::GetAny ());
+                      onoff.SetAttribute ("OnTime",  StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
+                      onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
+                      onoff.SetAttribute ("PacketSize", UintegerValue (payloadSize));
+                      onoff.SetAttribute ("DataRate", DataRateValue (1000000000)); //bit/s
+                      AddressValue remoteAddress (InetSocketAddress (staNodeInterfaces.GetAddress (i), port));
+                      onoff.SetAttribute ("Remote", remoteAddress);
+                      ApplicationContainer clientApp = onoff.Install (wifiApNode.Get (0));
+                      clientApp.Start (Seconds (1.0));
+                      clientApp.Stop (Seconds (simulationTime + 1));
+                    }
                 }
 
-              Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
+              Simulator::Schedule (Seconds (0), &Ipv4GlobalRoutingHelper::PopulateRoutingTables);
 
               Simulator::Stop (Seconds (simulationTime + 1));
               Simulator::Run ();
 
+              // When multiple stations are used, there are chances that association requests collide
+              // and hence the throughput may be lower than expected. Therefore, we relax the check
+              // that the throughput cannot decrease by introducing a scaling factor (or tolerance)
+              double tolerance = 0.10;
               uint64_t rxBytes = 0;
               if (udp)
                 {
-                  rxBytes = payloadSize * DynamicCast<UdpServer> (serverApp.Get (0))->GetReceived ();
+                  for (uint32_t i = 0; i < serverApp.GetN (); i++)
+                    {
+                      rxBytes += payloadSize * DynamicCast<UdpServer> (serverApp.Get (i))->GetReceived ();
+                    }
                 }
               else
                 {
-                  rxBytes = DynamicCast<PacketSink> (serverApp.Get (0))->GetTotalRx ();
+                  for (uint32_t i = 0; i < serverApp.GetN (); i++)
+                    {
+                      rxBytes += DynamicCast<PacketSink> (serverApp.Get (i))->GetTotalRx ();
+                    }
                 }
               double throughput = (rxBytes * 8) / (simulationTime * 1000000.0); //Mbit/s
 
@@ -265,7 +360,7 @@
               //test first element
               if (mcs == 0 && channelWidth == 20 && gi == 3200)
                 {
-                  if (throughput < minExpectedThroughput)
+                  if (throughput * (1 + tolerance) < minExpectedThroughput)
                     {
                       NS_LOG_ERROR ("Obtained throughput " << throughput << " is not expected!");
                       exit (1);
@@ -274,14 +369,14 @@
               //test last element
               if (mcs == 11 && channelWidth == 160 && gi == 800)
                 {
-                  if (maxExpectedThroughput > 0 && throughput > maxExpectedThroughput)
+                  if (maxExpectedThroughput > 0 && throughput > maxExpectedThroughput * (1 + tolerance))
                     {
                       NS_LOG_ERROR ("Obtained throughput " << throughput << " is not expected!");
                       exit (1);
                     }
                 }
               //test previous throughput is smaller (for the same mcs)
-              if (throughput > previous)
+              if (throughput * (1 + tolerance) > previous)
                 {
                   previous = throughput;
                 }
@@ -291,7 +386,7 @@
                   exit (1);
                 }
               //test previous throughput is smaller (for the same channel width and GI)
-              if (throughput > prevThroughput [index])
+              if (throughput * (1 + tolerance) > prevThroughput [index])
                 {
                   prevThroughput [index] = throughput;
                 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-hidden-terminal.cc ns-3.34/examples/wireless/wifi-hidden-terminal.cc
--- ns-3.33/examples/wireless/wifi-hidden-terminal.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-hidden-terminal.cc	2021-07-14 10:31:06.000000000 -0700
@@ -90,6 +90,7 @@
   // athstats.EnableAthstats(enableCtsRts ? "rtscts-athstats-node" : "basic-athstats-node" , nodes);
 
   // uncomment the following to have pcap output
+  // wifiPhy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
   // wifiPhy.EnablePcap (enableCtsRts ? "rtscts-pcap-node" : "basic-pcap-node" , nodes);
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-ht-network.cc ns-3.34/examples/wireless/wifi-ht-network.cc
--- ns-3.33/examples/wireless/wifi-ht-network.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-ht-network.cc	2021-07-14 10:31:06.000000000 -0700
@@ -152,6 +152,7 @@
 
               mac.SetType ("ns3::StaWifiMac",
                            "Ssid", SsidValue (ssid));
+              phy.Set ("ChannelWidth", UintegerValue (channelWidth));
 
               NetDeviceContainer staDevice;
               staDevice = wifi.Install (phy, mac, wifiStaNode);
@@ -159,13 +160,11 @@
               mac.SetType ("ns3::ApWifiMac",
                            "EnableBeaconJitter", BooleanValue (false),
                            "Ssid", SsidValue (ssid));
+              phy.Set ("ChannelWidth", UintegerValue (channelWidth));
 
               NetDeviceContainer apDevice;
               apDevice = wifi.Install (phy, mac, wifiApNode);
 
-              // Set channel width
-              Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (channelWidth));
-              
               // Set guard interval
               Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (sgi));
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-mixed-network.cc ns-3.34/examples/wireless/wifi-mixed-network.cc
--- ns-3.33/examples/wireless/wifi-mixed-network.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-mixed-network.cc	2021-07-14 10:31:06.000000000 -0700
@@ -45,9 +45,7 @@
 // - whether short PPDU format is supported by the 802.11b station;
 // - whether short slot time is supported by both the 802.11g station and the AP.
 //
-// The example then compares HT only and mixed HT/non-HT cases with various configurations depending on the following parameters:
-// - whether HT GF is supported by the AP;
-// - whether HT GF is supported by all HT stations;
+// The example then compares HT only and mixed HT/non-HT cases.
 //
 // The output results show that the presence of an 802.11b station strongly affects 802.11g performance.
 // Protection mechanisms ensure that the NAV value of 802.11b stations is set correctly in case of 802.11g transmissions.
@@ -56,8 +54,6 @@
 // mechanism for access points). Since short slot time is disabled once an 802.11b station enters the network, benefits from
 // short slot time are only observed in a g only configuration.
 //
-// HT and mixed-HT results show that HT GF permits to slightly increase performance when all HT stations support GF mode
-//
 // The user can also select the payload size and can choose either an UDP or a TCP connection.
 // Example: ./waf --run "wifi-mixed-network --isUdp=1"
 
@@ -73,15 +69,12 @@
   bool enableShortSlotTime;
   bool enableShortPhyPreamble;
   WifiStandard apType;
-  bool apSupportsGreenfield;
   uint32_t nWifiB;
   bool bHasTraffic;
   uint32_t nWifiG;
   bool gHasTraffic;
-  uint32_t nWifiNNonGreenfield;
-  bool nNonGreenfieldHasTraffic;
-  uint32_t nWifiNGreenfield;
-  bool nGreenfieldHasTraffic;
+  uint32_t nWifiN;
+  bool nHasTraffic;
   bool isUdp;
   uint32_t payloadSize;
   double simulationTime;
@@ -117,15 +110,12 @@
             << "\n\t enableShortSlotTime=" << params.enableShortSlotTime
             << "\n\t enableShortPhyPreamble=" << params.enableShortPhyPreamble
             << "\n\t apType=" << apTypeString
-            << "\n\t apSupportsGreenfield=" << params.apSupportsGreenfield
             << "\n\t nWifiB=" << params.nWifiB
             << "\n\t bHasTraffic=" << params.bHasTraffic
             << "\n\t nWifiG=" << params.nWifiG
             << "\n\t gHasTraffic=" << params.gHasTraffic
-            << "\n\t nWifiNNonGreenfield=" << params.nWifiNNonGreenfield
-            << "\n\t nNonGreenfieldHasTraffic=" << params.nNonGreenfieldHasTraffic
-            << "\n\t nWifiNGreenfield=" << params.nWifiNGreenfield
-            << "\n\t nGreenfieldHasTraffic=" << params.nGreenfieldHasTraffic
+            << "\n\t nWifiN=" << params.nWifiN
+            << "\n\t nHasTraffic=" << params.nHasTraffic
             << std::endl;
 
   Config::SetDefault ("ns3::WifiRemoteStationManager::ErpProtectionMode", StringValue (params.erpProtectionMode));
@@ -133,8 +123,7 @@
   double throughput = 0;
   uint32_t nWifiB = params.nWifiB;
   uint32_t nWifiG = params.nWifiG;
-  uint32_t nWifiNNGF = params.nWifiNNonGreenfield;
-  uint32_t nWifiNGF = params.nWifiNGreenfield;
+  uint32_t nWifiN = params.nWifiN;
   double simulationTime = params.simulationTime;
   uint32_t payloadSize = params.payloadSize;
 
@@ -142,10 +131,8 @@
   wifiBStaNodes.Create (nWifiB);
   NodeContainer wifiGStaNodes;
   wifiGStaNodes.Create (nWifiG);
-  NodeContainer wifiNNGFStaNodes;
-  wifiNNGFStaNodes.Create (nWifiNNGF);
-  NodeContainer wifiNGFStaNodes;
-  wifiNGFStaNodes.Create (nWifiNGF);
+  NodeContainer wifiNStaNodes;
+  wifiNStaNodes.Create (nWifiN);
   NodeContainer wifiApNode;
   wifiApNode.Create (1);
 
@@ -153,7 +140,6 @@
   channel.AddPropagationLoss ("ns3::RangePropagationLossModel");
 
   YansWifiPhyHelper phy;
-  phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
   phy.SetChannel (channel.Create ());
 
   WifiHelper wifi;
@@ -182,13 +168,12 @@
 
   // 802.11b/g/n STA
   wifi.SetStandard (WIFI_STANDARD_80211n_2_4GHZ);
-  NetDeviceContainer nNGFStaDevice, nGFStaDevice;
+  NetDeviceContainer nStaDevice;
   mac.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid),
                "BE_BlockAckThreshold", UintegerValue (2),
                "ShortSlotTimeSupported", BooleanValue (params.enableShortSlotTime));
-  nNGFStaDevice = wifi.Install (phy, mac, wifiNNGFStaNodes);
-  nGFStaDevice = wifi.Install (phy, mac, wifiNGFStaNodes);
+  nStaDevice = wifi.Install (phy, mac, wifiNStaNodes);
 
   // AP
   NetDeviceContainer apDevice;
@@ -206,31 +191,16 @@
     {
       Ptr<NetDevice> dev = wifiApNode.Get (0)->GetDevice (0);
       Ptr<WifiNetDevice> wifi_dev = DynamicCast<WifiNetDevice> (dev);
-      Ptr<HtConfiguration> htConfiguration = wifi_dev->GetHtConfiguration ();
-      htConfiguration->SetGreenfieldSupported (params.apSupportsGreenfield);
-      Ptr<WifiMac> wifi_mac = wifi_dev->GetMac ();
-      PointerValue ptr;
-      wifi_mac->GetAttribute ("BE_Txop", ptr);
-      Ptr<QosTxop> edca = ptr.Get<QosTxop> ();
-      edca->SetTxopLimit (MicroSeconds (3008));
-    }
-  if (nWifiNNGF > 0)
-    {
-      Ptr<NetDevice> dev = wifiNNGFStaNodes.Get (0)->GetDevice (0);
-      Ptr<WifiNetDevice> wifi_dev = DynamicCast<WifiNetDevice> (dev);
-      Ptr<HtConfiguration> htConfiguration = wifi_dev->GetHtConfiguration ();
       Ptr<WifiMac> wifi_mac = wifi_dev->GetMac ();
       PointerValue ptr;
       wifi_mac->GetAttribute ("BE_Txop", ptr);
       Ptr<QosTxop> edca = ptr.Get<QosTxop> ();
       edca->SetTxopLimit (MicroSeconds (3008));
     }
-  if (nWifiNGF > 0)
+  if (nWifiN > 0)
     {
-      Ptr<NetDevice> dev = wifiNGFStaNodes.Get (0)->GetDevice (0);
+      Ptr<NetDevice> dev = wifiNStaNodes.Get (0)->GetDevice (0);
       Ptr<WifiNetDevice> wifi_dev = DynamicCast<WifiNetDevice> (dev);
-      Ptr<HtConfiguration> htConfiguration = wifi_dev->GetHtConfiguration ();
-      htConfiguration->SetGreenfieldSupported (true);
       Ptr<WifiMac> wifi_mac = wifi_dev->GetMac ();
       PointerValue ptr;
       wifi_mac->GetAttribute ("BE_Txop", ptr);
@@ -253,11 +223,7 @@
     {
       positionAlloc->Add (Vector (0.0, 5.0, 0.0));
     }
-  for (uint32_t i = 0; i < nWifiNNGF; i++)
-    {
-      positionAlloc->Add (Vector (0.0, 0.0, 5.0));
-    }
-  for (uint32_t i = 0; i < nWifiNGF; i++)
+  for (uint32_t i = 0; i < nWifiN; i++)
     {
       positionAlloc->Add (Vector (0.0, 0.0, 5.0));
     }
@@ -267,16 +233,14 @@
   mobility.Install (wifiApNode);
   mobility.Install (wifiBStaNodes);
   mobility.Install (wifiGStaNodes);
-  mobility.Install (wifiNNGFStaNodes);
-  mobility.Install (wifiNGFStaNodes);
+  mobility.Install (wifiNStaNodes);
 
   // Internet stack
   InternetStackHelper stack;
   stack.Install (wifiApNode);
   stack.Install (wifiBStaNodes);
   stack.Install (wifiGStaNodes);
-  stack.Install (wifiNNGFStaNodes);
-  stack.Install (wifiNGFStaNodes);
+  stack.Install (wifiNStaNodes);
 
   Ipv4AddressHelper address;
   address.SetBase ("192.168.1.0", "255.255.255.0");
@@ -284,10 +248,8 @@
   bStaInterface = address.Assign (bStaDevice);
   Ipv4InterfaceContainer gStaInterface;
   gStaInterface = address.Assign (gStaDevice);
-  Ipv4InterfaceContainer nNGFStaInterface;
-  nNGFStaInterface = address.Assign (nNGFStaDevice);
-  Ipv4InterfaceContainer nGFStaInterface;
-  nGFStaInterface = address.Assign (nGFStaDevice);
+  Ipv4InterfaceContainer nStaInterface;
+  nStaInterface = address.Assign (nStaDevice);
   Ipv4InterfaceContainer ApInterface;
   ApInterface = address.Assign (apDevice);
 
@@ -314,13 +276,9 @@
         {
           clientApps.Add (client.Install (wifiGStaNodes));
         }
-      if (params.nNonGreenfieldHasTraffic)
+      if (params.nHasTraffic)
         {
-          clientApps.Add (client.Install (wifiNNGFStaNodes));
-        }
-      if (params.nGreenfieldHasTraffic)
-        {
-          clientApps.Add (client.Install (wifiNGFStaNodes));
+          clientApps.Add (client.Install (wifiNStaNodes));
         }
       clientApps.Start (Seconds (1.0));
       clientApps.Stop (Seconds (simulationTime + 1));
@@ -359,13 +317,9 @@
         {
           clientApps.Add (onoff.Install (wifiGStaNodes));
         }
-      if (params.nNonGreenfieldHasTraffic)
-        {
-          clientApps.Add (onoff.Install (wifiNNGFStaNodes));
-        }
-      if (params.nGreenfieldHasTraffic)
+      if (params.nHasTraffic)
         {
-          clientApps.Add (onoff.Install (wifiNGFStaNodes));
+          clientApps.Add (onoff.Install (wifiNStaNodes));
         }
       clientApps.Start (Seconds (1.0));
       clientApps.Stop (Seconds (simulationTime + 1));
@@ -389,15 +343,12 @@
   params.enableShortSlotTime = false;
   params.enableShortPhyPreamble = false;
   params.apType = WIFI_STANDARD_80211g;
-  params.apSupportsGreenfield = false;
   params.nWifiB = 0;
   params.bHasTraffic = false;
   params.nWifiG = 1;
   params.gHasTraffic = true;
-  params.nWifiNNonGreenfield = 0;
-  params.nNonGreenfieldHasTraffic = false;
-  params.nWifiNGreenfield = 0;
-  params.nGreenfieldHasTraffic = false;
+  params.nWifiN = 0;
+  params.nHasTraffic = false;
   params.isUdp = true;
   params.payloadSize = 1472; //bytes
   params.simulationTime = 10; //seconds
@@ -516,130 +467,17 @@
     }
   std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
 
-  params.testName = "HT GF not supported";
-  params.enableErpProtection = false;
-  params.enableShortSlotTime = false;
-  params.enableShortPhyPreamble = false;
-  params.apType = WIFI_STANDARD_80211n_2_4GHZ;
-  params.apSupportsGreenfield = false;
-  params.nWifiB = 0;
-  params.bHasTraffic = false;
-  params.nWifiG = 0;
-  params.gHasTraffic = false;
-  params.nWifiNNonGreenfield = 1;
-  params.nNonGreenfieldHasTraffic = true;
-  params.nWifiNGreenfield = 0;
-  params.nGreenfieldHasTraffic = false;
-  throughput = experiment.Run (params);
-  if (verifyResults && (throughput < 43 || throughput > 44))
-    {
-      NS_LOG_ERROR ("Obtained throughput " << throughput << " is not in the expected boundaries!");
-      exit (1);
-    }
-  std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
-
-  params.testName = "HT only with GF used";
-  params.enableErpProtection = false;
-  params.enableShortSlotTime = false;
-  params.enableShortPhyPreamble = false;
-  params.apType = WIFI_STANDARD_80211n_2_4GHZ;
-  params.apSupportsGreenfield = true;
-  params.nWifiB = 0;
-  params.bHasTraffic = false;
-  params.nWifiG = 0;
-  params.gHasTraffic = false;
-  params.nWifiNNonGreenfield = 0;
-  params.nNonGreenfieldHasTraffic = false;
-  params.nWifiNGreenfield = 1;
-  params.nGreenfieldHasTraffic = true;
-  throughput = experiment.Run (params);
-  if (verifyResults && (throughput < 44 || throughput > 45))
-    {
-      NS_LOG_ERROR ("Obtained throughput " << throughput << " is not in the expected boundaries!");
-      exit (1);
-    }
-  std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
-
-  params.testName = "HT only with GF allowed but disabled by protection";
-  params.enableErpProtection = false;
-  params.enableShortSlotTime = false;
-  params.enableShortPhyPreamble = false;
-  params.apType = WIFI_STANDARD_80211n_2_4GHZ;
-  params.apSupportsGreenfield = true;
-  params.nWifiB = 0;
-  params.bHasTraffic = false;
-  params.nWifiG = 0;
-  params.gHasTraffic = false;
-  params.nWifiNNonGreenfield = 1;
-  params.nNonGreenfieldHasTraffic = false;
-  params.nWifiNGreenfield = 1;
-  params.nGreenfieldHasTraffic = true;
-  throughput = experiment.Run (params);
-  if (verifyResults && (throughput < 43 || throughput > 44))
-    {
-      NS_LOG_ERROR ("Obtained throughput " << throughput << " is not in the expected boundaries!");
-      exit (1);
-    }
-  std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
-
-  params.testName = "HT only with GF not supported by the receiver";
-  params.enableErpProtection = false;
-  params.enableShortSlotTime = false;
-  params.enableShortPhyPreamble = false;
-  params.apType = WIFI_STANDARD_80211n_2_4GHZ;
-  params.apSupportsGreenfield = false;
-  params.nWifiB = 0;
-  params.bHasTraffic = false;
-  params.nWifiG = 0;
-  params.gHasTraffic = false;
-  params.nWifiNNonGreenfield = 0;
-  params.nNonGreenfieldHasTraffic = false;
-  params.nWifiNGreenfield = 1;
-  params.nGreenfieldHasTraffic = true;
-  throughput = experiment.Run (params);
-  if (verifyResults && (throughput < 43 || throughput > 44))
-    {
-      NS_LOG_ERROR ("Obtained throughput " << throughput << " is not in the expected boundaries!");
-      exit (1);
-    }
-  std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
-
-  params.testName = "Mixed HT/non-HT with GF enabled";
-  params.enableErpProtection = false;
-  params.enableShortSlotTime = false;
-  params.enableShortPhyPreamble = false;
-  params.apType = WIFI_STANDARD_80211n_2_4GHZ;
-  params.apSupportsGreenfield = true;
-  params.nWifiB = 0;
-  params.bHasTraffic = false;
-  params.nWifiG = 1;
-  params.gHasTraffic = false;
-  params.nWifiNNonGreenfield = 0;
-  params.nNonGreenfieldHasTraffic = false;
-  params.nWifiNGreenfield = 1;
-  params.nGreenfieldHasTraffic = true;
-  throughput = experiment.Run (params);
-  if (verifyResults && (throughput < 44 || throughput > 45))
-    {
-      NS_LOG_ERROR ("Obtained throughput " << throughput << " is not in the expected boundaries!");
-      exit (1);
-    }
-  std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
-
   params.testName = "HT only";
   params.enableErpProtection = false;
   params.enableShortSlotTime = false;
   params.enableShortPhyPreamble = false;
   params.apType = WIFI_STANDARD_80211n_2_4GHZ;
-  params.apSupportsGreenfield = false;
   params.nWifiB = 0;
   params.bHasTraffic = false;
   params.nWifiG = 0;
   params.gHasTraffic = false;
-  params.nWifiNNonGreenfield = 1;
-  params.nNonGreenfieldHasTraffic = true;
-  params.nWifiNGreenfield = 0;
-  params.nGreenfieldHasTraffic = false;
+  params.nWifiN = 1;
+  params.nHasTraffic = true;
   throughput = experiment.Run (params);
   if (verifyResults && (throughput < 44 || throughput > 45))
     {
@@ -653,15 +491,12 @@
   params.enableShortSlotTime = false;
   params.enableShortPhyPreamble = false;
   params.apType = WIFI_STANDARD_80211n_2_4GHZ;
-  params.apSupportsGreenfield = false;
   params.nWifiB = 0;
   params.bHasTraffic = false;
   params.nWifiG = 1;
   params.gHasTraffic = false;
-  params.nWifiNNonGreenfield = 1;
-  params.nNonGreenfieldHasTraffic = true;
-  params.nWifiNGreenfield = 0;
-  params.nGreenfieldHasTraffic = false;
+  params.nWifiN = 1;
+  params.nHasTraffic = true;
   throughput = experiment.Run (params);
   if (verifyResults && (throughput < 44 || throughput > 45))
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-multirate.cc ns-3.34/examples/wireless/wifi-multirate.cc
--- ns-3.33/examples/wireless/wifi-multirate.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-multirate.cc	2021-07-14 10:31:06.000000000 -0700
@@ -521,6 +521,7 @@
 
   if (enablePcap)
     {
+      phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
       phy.EnablePcapAll (GetOutputFileName ());
     }
 
@@ -601,7 +602,7 @@
 
   wifiMac.SetType ("ns3::AdhocWifiMac",
                    "Ssid", StringValue ("Testbed"));
-  wifi.SetStandard (WIFI_STANDARD_holland);
+  wifi.SetStandard (WIFI_STANDARD_80211a);
   wifi.SetRemoteStationManager (experiment.GetRateManager ());
 
   NS_LOG_INFO ("Scenario: " << experiment.GetScenario ());
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-pcf.cc ns-3.34/examples/wireless/wifi-pcf.cc
--- ns-3.33/examples/wireless/wifi-pcf.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-pcf.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,286 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2017
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sebastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "ns3/log.h"
-#include "ns3/config.h"
-#include "ns3/command-line.h"
-#include "ns3/uinteger.h"
-#include "ns3/boolean.h"
-#include "ns3/string.h"
-#include "ns3/yans-wifi-helper.h"
-#include "ns3/mobility-helper.h"
-#include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-address-helper.h"
-#include "ns3/packet-sink-helper.h"
-#include "ns3/on-off-helper.h"
-#include "ns3/packet-sink.h"
-#include "ns3/ssid.h"
-#include "ns3/wifi-mac-header.h"
-
-/* This is a simple example in order to show the frames exchanged in 802.11 PCF.
- * The output prints the overal throughput as well as the number of different PCF frames that have been transmitted.
- *
- * It is possible to tune some parameters using the command line:
- *   - number of connected stations
- *   - enable/disable PCF
- *   - enable PCAP output file generation in order to vizualise frame exchange.
- *   - configure UDP data traffic:
- *     -> enable/disable data generation: --withData=<0|1>
- *     -> select traffic direction: --trafficDirection=<upstream|downstream>
- *
- * For example, one can observe the benefit of PCF over DCF when the number of stations increased:
- *   ./waf --run "wifi-pcf enablePcf=0 --nWifi=10" => DCF only
- *   ./waf --run "wifi-pcf enablePcf=1 --nWifi=10" => alternance of PCF and DCF
- *
- * One can also change the value of cfpMaxDuration: a shorter valer means the granted time for PCF is shorter, and so it's benefit is reduced.
- *   ./waf --run "wifi-pcf enablePcf=1 --nWifi=10 --cfpMaxDuration=10240"
- *
- * One can also see the different types of piggybacked frames depending on the traffic direction and whether PCF is enabled or not:
- *   ./waf --run "wifi-pcf enablePcf=0 --nWifi=1" => only CF_POLL and DATA_NULL frames should be seen
- *   ./waf --run "wifi-pcf enablePcf=1 --nWifi=1 --trafficDirection=upstream" => no DATA_NULL frames should be seen
- *   ./waf --run "wifi-pcf enablePcf=1 --nWifi=1 --trafficDirection=downstream" => no CF_END_ACK frames should be seen
- */
-
-using namespace ns3;
-
-NS_LOG_COMPONENT_DEFINE ("WifiPcf");
-
-uint64_t m_countBeacon;
-uint64_t m_countCfPoll;
-uint64_t m_countCfPollAck;
-uint64_t m_countCfPollData;
-uint64_t m_countCfPollDataAck;
-uint64_t m_countCfEnd;
-uint64_t m_countCfEndAck;
-uint64_t m_countDataNull;
-uint64_t m_countData;
-
-void TxCallback (std::string context, Ptr<const Packet> p, double txPowerW)
-{
-  WifiMacHeader hdr;
-  p->PeekHeader (hdr);
-  if (hdr.IsBeacon ())
-    {
-      m_countBeacon++;
-    }
-  else if (hdr.IsCfPoll ())
-    {
-      if (hdr.IsCfAck () && hdr.HasData  ())
-        {
-          m_countCfPollDataAck++;
-        }
-      else if (!hdr.IsCfAck () && hdr.HasData ())
-        {
-          m_countCfPollData++;
-        }
-      else if (hdr.IsCfAck () && !hdr.HasData ())
-        {
-          m_countCfPollAck++;
-        }
-      else
-        {
-          m_countCfPoll++;
-        }
-    }
-  else if (hdr.IsCfEnd ())
-    {
-      if (hdr.IsCfAck ())
-        {
-          m_countCfEndAck++;
-        }
-      else
-        {
-          m_countCfEnd++;
-        }
-    }
-  else if (hdr.IsData ())
-    {
-      if (!hdr.HasData ())
-        {
-          m_countDataNull++;
-        }
-      else
-        {
-          m_countData++;
-        }
-    }
-}
-
-int main (int argc, char *argv[])
-{
-  uint32_t nWifi = 1;
-  bool enablePcap = false;
-  bool enablePcf = true;
-  bool withData = true;
-  std::string trafficDirection = "upstream";
-  uint64_t cfpMaxDurationUs = 65536; //microseconds
-  double simulationTime = 10; //seconds
-
-  CommandLine cmd (__FILE__);
-  cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi);
-  cmd.AddValue ("enablePcf", "Enable/disable PCF mode", enablePcf);
-  cmd.AddValue ("withData", "Enable/disable UDP data packets generation", withData);
-  cmd.AddValue ("trafficDirection", "Data traffic direction (if withData is set to 1): upstream (all STAs -> AP) or downstream (AP -> all STAs)", trafficDirection);
-  cmd.AddValue ("cfpMaxDuration", "CFP max duration in microseconds", cfpMaxDurationUs);
-  cmd.AddValue ("simulationTime", "Simulation time in seconds", simulationTime);
-  cmd.AddValue ("enablePcap", "Enable/disable PCAP output", enablePcap);
-  cmd.Parse (argc, argv);
-
-  m_countBeacon = 0;
-  m_countCfEnd = 0;
-  m_countCfEndAck = 0;
-  m_countCfPoll = 0;
-  m_countCfPollAck = 0;
-  m_countCfPollData = 0;
-  m_countCfPollDataAck = 0;
-  m_countDataNull = 0;
-  m_countData = 0;
-  m_countDataNull = 0;
-  m_countData = 0;
-
-  NodeContainer wifiStaNodes;
-  wifiStaNodes.Create (nWifi);
-
-  NodeContainer wifiApNode;
-  wifiApNode.Create (1);
-
-  YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
-  YansWifiPhyHelper phy;
-  phy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
-  phy.SetChannel (channel.Create ());
-
-  WifiHelper wifi;
-  WifiMacHelper mac;
-
-  Ssid ssid = Ssid ("wifi-pcf");
-  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate54Mbps"), "ControlMode", StringValue ("OfdmRate24Mbps"));
-
-  NetDeviceContainer staDevices;
-  mac.SetType ("ns3::StaWifiMac",
-               "Ssid", SsidValue (ssid),
-               "ActiveProbing", BooleanValue (false),
-               "PcfSupported", BooleanValue (enablePcf));
-  staDevices = wifi.Install (phy, mac, wifiStaNodes);
-
-  mac.SetType ("ns3::ApWifiMac",
-               "Ssid", SsidValue (ssid),
-               "BeaconGeneration", BooleanValue (true),
-               "PcfSupported", BooleanValue (enablePcf),
-               "CfpMaxDuration", TimeValue (MicroSeconds (cfpMaxDurationUs)));
-
-  NetDeviceContainer apDevice;
-  apDevice = wifi.Install (phy, mac, wifiApNode);
-
-  MobilityHelper mobility;
-
-  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
-
-  for (uint32_t i = 0; i < nWifi; i++)
-    {
-      positionAlloc->Add (Vector (1.0, 0.0, 0.0));
-    }
-  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
-  mobility.SetPositionAllocator (positionAlloc);
-
-  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
-
-  mobility.Install (wifiApNode);
-  mobility.Install (wifiStaNodes);
-
-  InternetStackHelper stack;
-  stack.Install (wifiApNode);
-  stack.Install (wifiStaNodes);
-
-  Ipv4AddressHelper address;
-
-  address.SetBase ("10.1.1.0", "255.255.255.0");
-  Ipv4InterfaceContainer StaInterface;
-  StaInterface = address.Assign (staDevices);
-  Ipv4InterfaceContainer ApInterface;
-  ApInterface = address.Assign (apDevice);
-
-  ApplicationContainer sourceApplications, sinkApplications;
-  if (withData)
-    {
-      uint32_t portNumber = 9;
-      for (uint32_t index = 0; index < nWifi; ++index)
-        {
-          auto ipv4 = (trafficDirection == "upstream") ? wifiApNode.Get (0)->GetObject<Ipv4> () : wifiStaNodes.Get (index)->GetObject<Ipv4> ();
-          const auto address = ipv4->GetAddress (1, 0).GetLocal ();
-          InetSocketAddress sinkSocket (address, portNumber++);
-          OnOffHelper onOffHelper ("ns3::UdpSocketFactory", sinkSocket);
-          onOffHelper.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
-          onOffHelper.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
-          onOffHelper.SetAttribute ("DataRate", DataRateValue (50000000 / nWifi));
-          onOffHelper.SetAttribute ("PacketSize", UintegerValue (1472)); //bytes
-          PacketSinkHelper packetSinkHelper ("ns3::UdpSocketFactory", sinkSocket);
-          if (trafficDirection == "upstream")
-            {
-              sourceApplications.Add (onOffHelper.Install (wifiStaNodes.Get (index)));
-              sinkApplications.Add (packetSinkHelper.Install (wifiApNode.Get (0)));
-            }
-          else if (trafficDirection == "downstream")
-            {
-              sinkApplications.Add (packetSinkHelper.Install (wifiStaNodes.Get (index)));
-              sourceApplications.Add (onOffHelper.Install (wifiApNode.Get (0)));
-            }
-          else
-            {
-              NS_ASSERT_MSG (false, "Invalid trafficDirection!");
-            }
-        }
-      sinkApplications.Start (Seconds (0.0));
-      sinkApplications.Stop (Seconds (simulationTime + 1));
-      sourceApplications.Start (Seconds (1.0));
-      sourceApplications.Stop (Seconds (simulationTime + 1));
-    }
-
-  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyTxBegin", MakeCallback (&TxCallback));
-
-  if (enablePcap)
-    {
-      phy.EnablePcap ("wifi_pcf", apDevice.Get (0));
-    }
-
-  Simulator::Stop (Seconds (simulationTime + 1));
-  Simulator::Run ();
-
-  double throughput = 0;
-  for (uint32_t index = 0; index < sinkApplications.GetN (); ++index)
-    {
-      uint64_t totalPacketsThrough = DynamicCast<PacketSink> (sinkApplications.Get (index))->GetTotalRx ();
-      throughput += ((totalPacketsThrough * 8) / (simulationTime * 1000000.0)); //Mbit/s
-    }
-
-  std::cout << "Throughput: " << throughput << " Mbit/s" << std::endl;
-
-  std::cout << "# tx beacons: " << m_countBeacon << std::endl;
-  std::cout << "# tx CF-END: " << m_countCfEnd << std::endl;
-  std::cout << "# tx CF-END-ACK: " << m_countCfEndAck << std::endl;
-  std::cout << "# tx CF-POLL: " << m_countCfPoll << std::endl;
-  std::cout << "# tx CF-POLL-ACK: " << m_countCfPollAck << std::endl;
-  std::cout << "# tx CF-POLL-DATA: " << m_countCfPollData << std::endl;
-  std::cout << "# tx CF-POLL-DATA-ACK: " << m_countCfPollDataAck << std::endl;
-  std::cout << "# tx DATA-NULL: " << m_countDataNull << std::endl;
-  std::cout << "# tx DATA: " << m_countData << std::endl;
-
-  Simulator::Destroy ();
-  return 0;
-}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-power-adaptation-distance.cc ns-3.34/examples/wireless/wifi-power-adaptation-distance.cc
--- ns-3.33/examples/wireless/wifi-power-adaptation-distance.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-power-adaptation-distance.cc	2021-07-14 10:31:06.000000000 -0700
@@ -152,7 +152,7 @@
   Ptr<WifiPhy> phy = wifiDevice->GetPhy ();
   myPhy = phy;
   SetupPhy (phy);
-  DataRate dataRate = DataRate (phy->GetMode (0).GetDataRate (phy->GetChannelWidth ()));
+  DataRate dataRate = DataRate (phy->GetDefaultMode ().GetDataRate (phy->GetChannelWidth ()));
   double power = phy->GetTxPowerEnd ();
   for (uint32_t j = 0; j < stas.GetN (); j++)
     {
@@ -173,17 +173,15 @@
 void
 NodeStatistics::SetupPhy (Ptr<WifiPhy> phy)
 {
-  uint32_t nModes = phy->GetNModes ();
-  for (uint32_t i = 0; i < nModes; i++)
+  for (const auto & mode : phy->GetModeList ())
     {
-      WifiMode mode = phy->GetMode (i);
       WifiTxVector txVector;
       txVector.SetMode (mode);
       txVector.SetPreambleType (WIFI_PREAMBLE_LONG);
       txVector.SetChannelWidth (phy->GetChannelWidth ());
       DataRate dataRate = DataRate (mode.GetDataRate (phy->GetChannelWidth ()));
       Time time = phy->CalculateTxDuration (packetSize, txVector, phy->GetPhyBand ());
-      NS_LOG_DEBUG (i << " " << time.GetSeconds () << " " << dataRate);
+      NS_LOG_DEBUG (mode.GetUniqueName () << " " << time.GetSeconds () << " " << dataRate);
       timeTable.push_back (std::make_pair (time, dataRate));
     }
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-power-adaptation-interference.cc ns-3.34/examples/wireless/wifi-power-adaptation-interference.cc
--- ns-3.33/examples/wireless/wifi-power-adaptation-interference.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-power-adaptation-interference.cc	2021-07-14 10:31:06.000000000 -0700
@@ -140,7 +140,7 @@
   Ptr<WifiPhy> phy = wifiDevice->GetPhy ();
   myPhy = phy;
   SetupPhy (phy);
-  DataRate dataRate = DataRate (phy->GetMode (0).GetDataRate (phy->GetChannelWidth ()));
+  DataRate dataRate = DataRate (phy->GetDefaultMode ().GetDataRate (phy->GetChannelWidth ()));
   double power = phy->GetTxPowerEnd ();
   for (uint32_t j = 0; j < stas.GetN (); j++)
     {
@@ -172,17 +172,15 @@
 void
 NodeStatistics::SetupPhy (Ptr<WifiPhy> phy)
 {
-  uint32_t nModes = phy->GetNModes ();
-  for (uint32_t i = 0; i < nModes; i++)
+  for (const auto & mode : phy->GetModeList ())
     {
-      WifiMode mode = phy->GetMode (i);
       WifiTxVector txVector;
       txVector.SetMode (mode);
       txVector.SetPreambleType (WIFI_PREAMBLE_LONG);
       txVector.SetChannelWidth (phy->GetChannelWidth ());
       DataRate dataRate = DataRate (mode.GetDataRate (phy->GetChannelWidth ()));
       Time time = phy->CalculateTxDuration (packetSize, txVector, phy->GetPhyBand ());
-      NS_LOG_DEBUG (i << " " << time.GetSeconds () << " " << dataRate);
+      NS_LOG_DEBUG (mode.GetUniqueName () << " " << time.GetSeconds () << " " << dataRate);
       timeTable.push_back (std::make_pair (time, dataRate));
     }
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-sleep.cc ns-3.34/examples/wireless/wifi-sleep.cc
--- ns-3.33/examples/wireless/wifi-sleep.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-sleep.cc	2021-07-14 10:31:06.000000000 -0700
@@ -130,9 +130,6 @@
   wifi.SetStandard (WIFI_STANDARD_80211b);
 
   YansWifiPhyHelper wifiPhy;
-  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
-  wifiPhy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
-
   wifiPhy.Set ("TxPowerStart", DoubleValue (txPowerStart));
   wifiPhy.Set ("TxPowerEnd", DoubleValue (txPowerEnd));
   wifiPhy.Set ("TxPowerLevels", UintegerValue (nTxPowerLevels));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-spectrum-per-example.cc ns-3.34/examples/wireless/wifi-spectrum-per-example.cc
--- ns-3.33/examples/wireless/wifi-spectrum-per-example.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-spectrum-per-example.cc	2021-07-14 10:31:06.000000000 -0700
@@ -180,7 +180,6 @@
           phy.SetChannel (channel.Create ());
           phy.Set ("TxPowerStart", DoubleValue (1)); // dBm (1.26 mW)
           phy.Set ("TxPowerEnd", DoubleValue (1));
-          phy.Set ("Frequency", UintegerValue (5180));
         }
       else if (wifiType == "ns3::SpectrumWifiPhy")
         {
@@ -197,7 +196,6 @@
 
           spectrumPhy.SetChannel (spectrumChannel);
           spectrumPhy.SetErrorRateModel (errorModelType);
-          spectrumPhy.Set ("Frequency", UintegerValue (5180));
           spectrumPhy.Set ("TxPowerStart", DoubleValue (1)); // dBm  (1.26 mW)
           spectrumPhy.Set ("TxPowerEnd", DoubleValue (1));
         }
@@ -386,9 +384,11 @@
         {
           mac.SetType ("ns3::StaWifiMac",
                        "Ssid", SsidValue (ssid));
+          phy.Set ("ChannelWidth", UintegerValue (i <= 15 ? 20 : 40));
           staDevice = wifi.Install (phy, mac, wifiStaNode);
           mac.SetType ("ns3::ApWifiMac",
                        "Ssid", SsidValue (ssid));
+          phy.Set ("ChannelWidth", UintegerValue (i <= 15 ? 20 : 40));
           apDevice = wifi.Install (phy, mac, wifiApNode);
 
         }
@@ -396,30 +396,28 @@
         {
           mac.SetType ("ns3::StaWifiMac",
                        "Ssid", SsidValue (ssid));
+          phy.Set ("ChannelWidth", UintegerValue (i <= 15 ? 20 : 40));
           staDevice = wifi.Install (spectrumPhy, mac, wifiStaNode);
           mac.SetType ("ns3::ApWifiMac",
                        "Ssid", SsidValue (ssid));
+          phy.Set ("ChannelWidth", UintegerValue (i <= 15 ? 20 : 40));
           apDevice = wifi.Install (spectrumPhy, mac, wifiApNode);
         }
 
       if (i <= 7)
         {
-          Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (20));
           Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (false));
         }
       else if (i > 7 && i <= 15)
         {
-          Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (20));
           Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (true));
         }
       else if (i > 15 && i <= 23)
         {
-          Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (40));
           Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (false));
         }
       else
         {
-          Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (40));
           Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (true));
         }
 
@@ -494,6 +492,7 @@
 
       if (enablePcap)
         {
+          phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
           std::stringstream ss;
           ss << "wifi-spectrum-per-example-" << i;
           phy.EnablePcap (ss.str (), apDevice);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-spectrum-per-interference.cc ns-3.34/examples/wireless/wifi-spectrum-per-interference.cc
--- ns-3.33/examples/wireless/wifi-spectrum-per-interference.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-spectrum-per-interference.cc	2021-07-14 10:31:06.000000000 -0700
@@ -118,7 +118,7 @@
 
 NS_LOG_COMPONENT_DEFINE ("WifiSpectrumPerInterference");
 
-Ptr<SpectrumModel> SpectrumModelWifi5180MHz;
+Ptr<SpectrumModel> SpectrumModelWifi5180MHz, SpectrumModelWifi5190MHz;
 
 class static_SpectrumModelWifi5180MHz_initializer
 {
@@ -138,6 +138,24 @@
 
 } static_SpectrumModelWifi5180MHz_initializer_instance;
 
+class static_SpectrumModelWifi5190MHz_initializer
+{
+public:
+  static_SpectrumModelWifi5190MHz_initializer ()
+  {
+    BandInfo bandInfo;
+    bandInfo.fc = 5190e6;
+    bandInfo.fl = 5190e6 - 10e6;
+    bandInfo.fh = 5190e6 + 10e6;
+
+    Bands bands;
+    bands.push_back (bandInfo);
+
+    SpectrumModelWifi5190MHz = Create<SpectrumModel> (bands);
+  }
+
+} static_SpectrumModelWifi5190MHz_initializer_instance;
+
 int main (int argc, char *argv[])
 {
   bool udp = true;
@@ -202,14 +220,15 @@
       YansWifiPhyHelper phy;
       SpectrumWifiPhyHelper spectrumPhy;
       Ptr<MultiModelSpectrumChannel> spectrumChannel;
+      uint16_t frequency = (i <= 15 ? 5180 : 5190);
       if (wifiType == "ns3::YansWifiPhy")
         {
           YansWifiChannelHelper channel;
           channel.AddPropagationLoss ("ns3::FriisPropagationLossModel",
-                                      "Frequency", DoubleValue (5.180e9));
+                                      "Frequency", DoubleValue (frequency * 1e6));
           channel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
           phy.SetChannel (channel.Create ());
-          phy.Set ("Frequency", UintegerValue (5180));
+          phy.Set ("Frequency", UintegerValue (frequency));
         }
       else if (wifiType == "ns3::SpectrumWifiPhy")
         {
@@ -217,7 +236,7 @@
             = CreateObject<MultiModelSpectrumChannel> ();
           Ptr<FriisPropagationLossModel> lossModel
             = CreateObject<FriisPropagationLossModel> ();
-          lossModel->SetFrequency (5.180e9);
+          lossModel->SetFrequency (frequency * 1e6);
           spectrumChannel->AddPropagationLossModel (lossModel);
 
           Ptr<ConstantSpeedPropagationDelayModel> delayModel
@@ -226,7 +245,7 @@
 
           spectrumPhy.SetChannel (spectrumChannel);
           spectrumPhy.SetErrorRateModel (errorModelType);
-          spectrumPhy.Set ("Frequency", UintegerValue (5180)); // channel 36 at 20 MHz
+          spectrumPhy.Set ("Frequency", UintegerValue (frequency)); // channel 36 at 20 MHz, 38 at 40 MHz
         }
       else
         {
@@ -430,22 +449,18 @@
 
       if (i <= 7)
         {
-          Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (20));
           Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (false));
         }
       else if (i > 7 && i <= 15)
         {
-          Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (20));
           Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (true));
         }
       else if (i > 15 && i <= 23)
         {
-          Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (40));
           Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (false));
         }
       else
         {
-          Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (40));
           Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (true));
         }
 
@@ -519,7 +534,8 @@
         }
 
       // Configure waveform generator
-      Ptr<SpectrumValue> wgPsd = Create<SpectrumValue> (SpectrumModelWifi5180MHz);
+      Ptr<SpectrumValue> wgPsd = Create<SpectrumValue> (i <= 15 ? SpectrumModelWifi5180MHz
+                                                                : SpectrumModelWifi5190MHz);
       *wgPsd = waveformPower / 20e6;  // PSD spread across 20 MHz
       NS_LOG_INFO ("wgPsd : " << *wgPsd << " integrated power: " << Integral (*(GetPointer (wgPsd))));
 
@@ -541,6 +557,7 @@
 
       if (enablePcap)
         {
+          phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
           std::stringstream ss;
           ss << "wifi-spectrum-per-example-" << i;
           phy.EnablePcap (ss.str (), apDevice);
@@ -552,12 +569,20 @@
       // Make sure we are tuned to 5180 MHz; if not, the example will
       // not work properly
       Ptr<NetDevice> staDevicePtr = staDevice.Get (0);
-      Ptr<WifiNetDevice> wifiStaDevicePtr = staDevicePtr->GetObject <WifiNetDevice> ();
-      UintegerValue val;
-      wifiStaDevicePtr->GetPhy ()->GetAttribute ("Frequency", val);
-      if (val.Get () != 5180)
+      Ptr<WifiPhy> wifiPhyPtr = staDevicePtr->GetObject <WifiNetDevice> ()->GetPhy ();
+      if (i <= 15)
+        {
+          NS_ABORT_MSG_IF (wifiPhyPtr->GetChannelWidth () != 20,
+                           "Error: Channel width must be 20 MHz if MCS index <= 15");
+          NS_ABORT_MSG_IF (wifiPhyPtr->GetFrequency () != 5180,
+                           "Error:  Wi-Fi nodes must be tuned to 5180 MHz to match the waveform generator");
+        }
+      else
         {
-          NS_FATAL_ERROR ("Error:  Wi-Fi nodes must be tuned to 5180 MHz to match the waveform generator");
+          NS_ABORT_MSG_IF (wifiPhyPtr->GetChannelWidth () != 40,
+                           "Error: Channel width must be 40 MHz if MCS index > 15");
+          NS_ABORT_MSG_IF (wifiPhyPtr->GetFrequency () != 5190,
+                           "Error:  Wi-Fi nodes must be tuned to 5190 MHz to match the waveform generator");
         }
 
       Simulator::Stop (Seconds (simulationTime + 1));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-spectrum-saturation-example.cc ns-3.34/examples/wireless/wifi-spectrum-saturation-example.cc
--- ns-3.33/examples/wireless/wifi-spectrum-saturation-example.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-spectrum-saturation-example.cc	2021-07-14 10:31:06.000000000 -0700
@@ -190,7 +190,6 @@
 
           spectrumPhy.SetChannel (spectrumChannel);
           spectrumPhy.SetErrorRateModel (errorModelType);
-          spectrumPhy.Set ("Frequency", UintegerValue (5180)); // channel 36 at 20 MHz
           spectrumPhy.Set ("TxPowerStart", DoubleValue (1));
           spectrumPhy.Set ("TxPowerEnd", DoubleValue (1));
 
@@ -563,13 +562,17 @@
       NetDeviceContainer staDevice;
       NetDeviceContainer apDevice;
 
+      channelWidth = (i <= 15 || (i > 31 && i <= 47) ? 20 : 40);
+
       if (wifiType == "ns3::YansWifiPhy")
         {
           mac.SetType ("ns3::StaWifiMac",
                        "Ssid", SsidValue (ssid));
+          phy.Set ("ChannelWidth", UintegerValue (channelWidth));
           staDevice = wifi.Install (phy, mac, wifiStaNode);
           mac.SetType ("ns3::ApWifiMac",
                        "Ssid", SsidValue (ssid));
+          phy.Set ("ChannelWidth", UintegerValue (channelWidth));
           apDevice = wifi.Install (phy, mac, wifiApNode);
 
         }
@@ -577,30 +580,28 @@
         {
           mac.SetType ("ns3::StaWifiMac",
                        "Ssid", SsidValue (ssid));
+          phy.Set ("ChannelWidth", UintegerValue (channelWidth));
           staDevice = wifi.Install (spectrumPhy, mac, wifiStaNode);
           mac.SetType ("ns3::ApWifiMac",
                        "Ssid", SsidValue (ssid));
+          phy.Set ("ChannelWidth", UintegerValue (channelWidth));
           apDevice = wifi.Install (spectrumPhy, mac, wifiApNode);
         }
 
      if ((i <= 7) || (i > 31 && i <= 39))
         {
-          Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (20));
           Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (false));
         }
       else if ((i > 7 && i <= 15) || (i > 39 && i <= 47))
         {
-          Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (20));
           Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (true));
         }
       else if ((i > 15 && i <= 23) || (i > 47 && i <= 55))
         {
-          Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (40));
           Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (false));
         }
       else
         {
-          Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (40));
           Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (true));
         }
 
@@ -647,6 +648,7 @@
 
       if (enablePcap)
         {
+          phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
           std::stringstream ss;
           ss << "wifi-spectrum-saturation-example-" << i;
           phy.EnablePcap (ss.str (), apDevice);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-txop-aggregation.cc ns-3.34/examples/wireless/wifi-txop-aggregation.cc
--- ns-3.33/examples/wireless/wifi-txop-aggregation.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-txop-aggregation.cc	2021-07-14 10:31:06.000000000 -0700
@@ -412,7 +412,7 @@
   throughput = totalPacketsThroughB * payloadSize * 8 / (simulationTime * 1000000.0);
   std::cout << "Aggregation disabled: " << '\n'
             << "  Throughput = " << throughput << " Mbit/s" << '\n';
-  if (verifyResults && (throughput < 39 || throughput > 40))
+  if (verifyResults && (throughput < 38 || throughput > 39))
     {
       NS_LOG_ERROR ("Obtained throughput " << throughput << " is not in the expected boundaries!");
       exit (1);
@@ -431,7 +431,7 @@
   throughput = totalPacketsThroughC * payloadSize * 8 / (simulationTime * 1000000.0);
   std::cout << "A-MPDU disabled and A-MSDU enabled (8kB): " << '\n'
             << "  Throughput = " << throughput << " Mbit/s" << '\n';
-  if (verifyResults && (throughput < 53 || throughput > 54))
+  if (verifyResults && (throughput < 52 || throughput > 53))
     {
       NS_LOG_ERROR ("Obtained throughput " << throughput << " is not in the expected boundaries!");
       exit (1);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wifi-vht-network.cc ns-3.34/examples/wireless/wifi-vht-network.cc
--- ns-3.33/examples/wireless/wifi-vht-network.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wifi-vht-network.cc	2021-07-14 10:31:06.000000000 -0700
@@ -141,6 +141,7 @@
 
               mac.SetType ("ns3::StaWifiMac",
                            "Ssid", SsidValue (ssid));
+              phy.Set ("ChannelWidth", UintegerValue (channelWidth));
 
               NetDeviceContainer staDevice;
               staDevice = wifi.Install (phy, mac, wifiStaNode);
@@ -148,13 +149,11 @@
               mac.SetType ("ns3::ApWifiMac",
                            "EnableBeaconJitter", BooleanValue (false),
                            "Ssid", SsidValue (ssid));
+              phy.Set ("ChannelWidth", UintegerValue (channelWidth));
 
               NetDeviceContainer apDevice;
               apDevice = wifi.Install (phy, mac, wifiApNode);
 
-              // Set channel width
-              Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (channelWidth));
-
               // Set guard interval
               Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (sgi));
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/examples/wireless/wscript ns-3.34/examples/wireless/wscript
--- ns-3.33/examples/wireless/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/examples/wireless/wscript	2021-07-14 10:31:06.000000000 -0700
@@ -116,9 +116,6 @@
     obj = bld.create_ns3_program('wifi-backward-compatibility', ['wifi', 'applications'])
     obj.source = 'wifi-backward-compatibility.cc'
 
-    obj = bld.create_ns3_program('wifi-pcf', ['wifi', 'applications'])
-    obj.source = 'wifi-pcf.cc'
-
     obj = bld.create_ns3_program('wifi-spatial-reuse', ['wifi', 'applications'])
     obj.source = 'wifi-spatial-reuse.cc'
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/RELEASE_NOTES ns-3.34/RELEASE_NOTES
--- ns-3.33/RELEASE_NOTES	2021-01-09 10:26:04.000000000 -0800
+++ ns-3.34/RELEASE_NOTES	2021-07-14 10:32:18.000000000 -0700
@@ -9,6 +9,86 @@
 Consult the file CHANGES.html for more detailed information about changed
 API and behavior across ns-3 releases.
 
+Release 3.34
+=============
+
+Availability
+------------
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.34.tar.bz2
+
+Supported platforms
+-------------------
+This release is intended to work on systems with the following minimal
+requirements (Note: not all ns-3 features are available on all systems):
+- g++-7 or later, or LLVM/clang++-8 or later
+- Python 3.6 or later
+- (macOS only) Xcode 10.1 or later
+
++This release has been tested on the following systems:
++- Fedora 33 with g++-10.2.1 and clang++-11.0.0; Python 3.9.2
++- Ubuntu 21.04 with g++-11.1.0 and Python 3.9.5
++- Ubuntu 20.04 with g++-9.3.0 and Python 3.8.5
++- Ubuntu 18.04 with g++-7.5.0 and Python 3.6.9
++- macOS 10.15.7 (Catalina) with Xcode 12.4 (Apple clang-1200.0.32.29, Python 3.9.1)
++- macOS 10.13.6 (High Sierra) with Xcode 10.1 (Apple clang-1000.11.45.5, Python 3.7.1)
+
+New user-visible features
+-------------------------
+- (antenna) Added PhasedArrayModel, providing a flexible interface for modeling a number of Phase Antenna Array (PAA) models
+- (antenna) Replaced the ThreeGppAntennaArrayModel with a UniformPlanarArray model, extending the new PhaseAdrrayModel
+- (antenna) Improved the Angles class to be more robust and user-friendly.
+- (antenna) AntennaModel child classes have been extended to produce 3D radiation patterns
+- (internet) Support for IPv6 stateless address auto-configuration (SLAAC).
+- (network) Improved support for bit fields in header serialization/deserialization.
+- (network) Added support for DLT_LORATAP DataLinkType to PCAP files
+- (network) More arithmetic operators are provided for DataRate objects
+- (nix-vector) Nix-Vector routing supports multiple interface addresse and can print out routing paths.
+- (olsr) Add support for printing OLSR headers
+- (sixlowpan) Added support for stateful (i.e., context-based) RFC6282 compression.
+- (tcp) TCP CUBIC is now the default TCP congestion control, replacing NewReno.
+- (tcp) A BBRv1 congestion control model has been added.
+- (traffic-control) Added FqCobalt queue disc with L4S features and set associative hash.
+- (traffic-control) Added FqPIE queue disc with L4S mode.
+- (wifi) Add support for 802.11ax DL and UL OFDMA, and a round-robin multi-user scheduler
+- (wifi) Added 802.11ax support to MinstrelHt rate control algorithm.
+- (wifi) The PHY layer has been refactored: the amendment-specific logic has been ported to PhyEntity classes and WifiPpdu classes
+- (wifi) The MAC layer has been refactored. The MacLow class has been replaced by a hierarchy of FrameExchangeManager classes, each adding support for the frame exchange sequences introduced by a given amendment.
+- (wifi) Add ThompsonSamplingWifiManager rate control algorithm.
+- (wifi) Holland PHY configuration has been removed from the model
+- (wifi) HT Greenfield (HT_GF) preamble support has been removed from the model
+- (wifi) Added the ability to configure the primary 20 MHz channel for 802.11 devices operating on channels of width greater than 20 MHz
+- (wifi) Some wifi/src/model files were moved to the relevant subfolders (non-ht, ht, vht, he, and rate-control)
+- (wifi) Stations perform TXOP recovery if the transmission of a non-initial MPDU in a TXOP fails
+- (wifi) Stations keep track of the TXOP holder and ignore the NAV when they receive an RTS frame from the TXOP holder
+- (wifi) The TxOkHeader and TxErrHeader trace sources of RegularWifiMac have been obsoleted and replaced by trace sources that better capture the result of a transmission (AckedMpdu, NAckedMpdu, DroppedMpdu, MpduResponseTimeout and PsduResponseTimeout)
+- (wifi) Bianchi example program extended to support 802.11n/ac/ax rates
+- (wifi) ErrorRateModel API extended to support link-to-system models
+
+Bugs fixed
+----------
+- (antenna) Fix random angle generation for the 3gpp channel model.
+- (build) #52 - Fix and standardize Boost detection
+- (build) #352 - Handle multiple attempts to configure C++ standard
+- (core) #349 - Warn about Config::SetDefault() of deprecated attribute
+- (internet) #385 - IPv6 NA are now sent directly by the NetDevice
+- (lr-wpan) #382 - Fix Tx power calculation from PIB attribute
+- (lte) #285 - Check the RandomAccess status of an RNTI to whom the preamble was assigned
+- (lte) #322 - Add Channel pointer value type attribute to REM helper
+- (lte) #354 - Use uint16_t for srsIndex instead of uint8_t
+- (lte) #395 - Add transmission buffer size for RLC Acknowledged Mode
+- (lte) !555 - Remove assert upon RAR timeout in RLF example and..
+- (lte) !605 - Make sure RNTI exists before removing UE context
+- (lte) - Set UeRrcSapProvider only if RNTI exists at the eNB
+- (nix-vector) #393 - Avoid changing routing-dependent members
+- (sixlowpan) #358 - Use correct fragment size when using mesh routing.
+- (tcp) #374 - Assume TCP RTT is one microseconds if it measures as zero
+- (uan) #129 - EndTx moved to PhyListener
+- (uan) #293 - Fixed integer truncation in window computation
+- (wave) Fix compilation and runtime issues with vanet-routing-compare.cc
+- (wifi) #418 - Fix HE A-MPDU Max Size Upper Bound
+- (wifi) - Compare received power per MHz to normalized RX sensitivity
+
 Release 3.33
 ============
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/bindings/modulegen__gcc_ILP32.py ns-3.34/src/antenna/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/antenna/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -22,7 +22,7 @@
     
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
-    ## angles.h (module 'antenna'): ns3::Angles [struct]
+    ## angles.h (module 'antenna'): ns3::Angles [class]
     module.add_class('Angles')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
     module.add_class('AttributeConstructionList', import_from_module='ns.core')
@@ -83,6 +83,11 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel [class]
+    module.add_class('PhasedArrayModel', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
@@ -95,13 +100,10 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel [class]
-    module.add_class('ThreeGppAntennaArrayModel', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::ThreeGppAntennaArrayModel::ComplexVector')
-    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::ThreeGppAntennaArrayModel::ComplexVector*')
-    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::ThreeGppAntennaArrayModel::ComplexVector&')
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    ## uniform-planar-array.h (module 'antenna'): ns3::UniformPlanarArray [class]
+    module.add_class('UniformPlanarArray', parent=root_module['ns3::PhasedArrayModel'])
     ## antenna-model.h (module 'antenna'): ns3::AntennaModel [class]
     module.add_class('AntennaModel', parent=root_module['ns3::Object'])
     ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
@@ -128,6 +130,8 @@
     module.add_class('IsotropicAntennaModel', parent=root_module['ns3::AntennaModel'])
     ## parabolic-antenna-model.h (module 'antenna'): ns3::ParabolicAntennaModel [class]
     module.add_class('ParabolicAntennaModel', parent=root_module['ns3::AntennaModel'])
+    ## three-gpp-antenna-model.h (module 'antenna'): ns3::ThreeGppAntennaModel [class]
+    module.add_class('ThreeGppAntennaModel', parent=root_module['ns3::AntennaModel'])
     ## type-id.h (module 'core'): ns3::TypeIdChecker [class]
     module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## type-id.h (module 'core'): ns3::TypeIdValue [class]
@@ -142,8 +146,10 @@
     module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
+    module.add_container('ns3::PhasedArrayModel::ComplexVector', 'std::complex< double >', container_type='vector')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -234,14 +240,15 @@
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
+    register_Ns3PhasedArrayModel_methods(root_module, root_module['ns3::PhasedArrayModel'])
     register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
     register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
     register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
     register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
-    register_Ns3ThreeGppAntennaArrayModel_methods(root_module, root_module['ns3::ThreeGppAntennaArrayModel'])
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
+    register_Ns3UniformPlanarArray_methods(root_module, root_module['ns3::UniformPlanarArray'])
     register_Ns3AntennaModel_methods(root_module, root_module['ns3::AntennaModel'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
     register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
@@ -255,6 +262,7 @@
     register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
     register_Ns3IsotropicAntennaModel_methods(root_module, root_module['ns3::IsotropicAntennaModel'])
     register_Ns3ParabolicAntennaModel_methods(root_module, root_module['ns3::ParabolicAntennaModel'])
+    register_Ns3ThreeGppAntennaModel_methods(root_module, root_module['ns3::ThreeGppAntennaModel'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
     register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
     register_Ns3Vector2DChecker_methods(root_module, root_module['ns3::Vector2DChecker'])
@@ -273,18 +281,32 @@
     cls.add_output_stream_operator()
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Angles const & arg0) [constructor]
     cls.add_constructor([param('ns3::Angles const &', 'arg0')])
-    ## angles.h (module 'antenna'): ns3::Angles::Angles() [constructor]
-    cls.add_constructor([])
-    ## angles.h (module 'antenna'): ns3::Angles::Angles(double phi, double theta) [constructor]
-    cls.add_constructor([param('double', 'phi'), param('double', 'theta')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(double azimuth, double inclination) [constructor]
+    cls.add_constructor([param('double', 'azimuth'), param('double', 'inclination')])
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v) [constructor]
     cls.add_constructor([param('ns3::Vector', 'v')])
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v, ns3::Vector o) [constructor]
     cls.add_constructor([param('ns3::Vector', 'v'), param('ns3::Vector', 'o')])
-    ## angles.h (module 'antenna'): ns3::Angles::phi [variable]
-    cls.add_instance_attribute('phi', 'double', is_const=False)
-    ## angles.h (module 'antenna'): ns3::Angles::theta [variable]
-    cls.add_instance_attribute('theta', 'double', is_const=False)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetAzimuth() const [member function]
+    cls.add_method('GetAzimuth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetInclination() const [member function]
+    cls.add_method('GetInclination', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): void ns3::Angles::SetAzimuth(double azimuth) [member function]
+    cls.add_method('SetAzimuth', 
+                   'void', 
+                   [param('double', 'azimuth')])
+    ## angles.h (module 'antenna'): void ns3::Angles::SetInclination(double inclination) [member function]
+    cls.add_method('SetInclination', 
+                   'void', 
+                   [param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::m_printDeg [variable]
+    cls.add_static_attribute('m_printDeg', 'bool', is_const=False)
     return
 
 def register_Ns3AttributeConstructionList_methods(root_module, cls):
@@ -934,6 +956,66 @@
                    [])
     return
 
+def register_Ns3PhasedArrayModel_methods(root_module, cls):
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel(ns3::PhasedArrayModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArrayModel const &', 'arg0')])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-model.h (module 'antenna'): ns3::Ptr<const ns3::AntennaModel> ns3::PhasedArrayModel::GetAntennaElement() const [member function]
+    cls.add_method('GetAntennaElement', 
+                   'ns3::Ptr< ns3::AntennaModel const >', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector() const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector(ns3::Angles a) const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): std::pair<double, double> ns3::PhasedArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
+    cls.add_method('GetElementFieldPattern', 
+                   'std::pair< double, double >', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::Vector ns3::PhasedArrayModel::GetElementLocation(uint64_t index) const [member function]
+    cls.add_method('GetElementLocation', 
+                   'ns3::Vector', 
+                   [param('uint64_t', 'index')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
+    cls.add_method('GetNumberOfElements', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetSteeringVector(ns3::Angles a) const [member function]
+    cls.add_method('GetSteeringVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): static ns3::TypeId ns3::PhasedArrayModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetAntennaElement(ns3::Ptr<ns3::AntennaModel> antennaElement) [member function]
+    cls.add_method('SetAntennaElement', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::AntennaModel >', 'antennaElement')])
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetBeamformingVector(ns3::PhasedArrayModel::ComplexVector const & beamformingVector) [member function]
+    cls.add_method('SetBeamformingVector', 
+                   'void', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'beamformingVector')])
+    ## phased-array-model.h (module 'antenna'): static double ns3::PhasedArrayModel::ComputeNorm(ns3::PhasedArrayModel::ComplexVector const & vector) [member function]
+    cls.add_method('ComputeNorm', 
+                   'double', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'vector')], 
+                   is_static=True, visibility='protected')
+    return
+
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -976,51 +1058,6 @@
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
-def register_Ns3ThreeGppAntennaArrayModel_methods(root_module, cls):
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel::ThreeGppAntennaArrayModel(ns3::ThreeGppAntennaArrayModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ThreeGppAntennaArrayModel const &', 'arg0')])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel::ThreeGppAntennaArrayModel() [constructor]
-    cls.add_constructor([])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): void ns3::ThreeGppAntennaArrayModel::ChangeToOmniTx() [member function]
-    cls.add_method('ChangeToOmniTx', 
-                   'void', 
-                   [])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel::ComplexVector const & ns3::ThreeGppAntennaArrayModel::GetBeamformingVector() const [member function]
-    cls.add_method('GetBeamformingVector', 
-                   'ns3::ThreeGppAntennaArrayModel::ComplexVector const &', 
-                   [], 
-                   is_const=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): std::pair<double, double> ns3::ThreeGppAntennaArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
-    cls.add_method('GetElementFieldPattern', 
-                   'std::pair< double, double >', 
-                   [param('ns3::Angles', 'a')], 
-                   is_const=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::Vector ns3::ThreeGppAntennaArrayModel::GetElementLocation(uint64_t index) const [member function]
-    cls.add_method('GetElementLocation', 
-                   'ns3::Vector', 
-                   [param('uint64_t', 'index')], 
-                   is_const=True, is_virtual=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): uint64_t ns3::ThreeGppAntennaArrayModel::GetNumberOfElements() const [member function]
-    cls.add_method('GetNumberOfElements', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): static ns3::TypeId ns3::ThreeGppAntennaArrayModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): bool ns3::ThreeGppAntennaArrayModel::IsOmniTx() const [member function]
-    cls.add_method('IsOmniTx', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): void ns3::ThreeGppAntennaArrayModel::SetBeamformingVector(ns3::ThreeGppAntennaArrayModel::ComplexVector const & beamformingVector) [member function]
-    cls.add_method('SetBeamformingVector', 
-                   'void', 
-                   [param('ns3::ThreeGppAntennaArrayModel::ComplexVector const &', 'beamformingVector')])
-    return
-
 def register_Ns3TraceSourceAccessor_methods(root_module, cls):
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor(ns3::TraceSourceAccessor const & arg0) [constructor]
     cls.add_constructor([param('ns3::TraceSourceAccessor const &', 'arg0')])
@@ -1048,6 +1085,33 @@
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3UniformPlanarArray_methods(root_module, cls):
+    ## uniform-planar-array.h (module 'antenna'): ns3::UniformPlanarArray::UniformPlanarArray(ns3::UniformPlanarArray const & arg0) [constructor]
+    cls.add_constructor([param('ns3::UniformPlanarArray const &', 'arg0')])
+    ## uniform-planar-array.h (module 'antenna'): ns3::UniformPlanarArray::UniformPlanarArray() [constructor]
+    cls.add_constructor([])
+    ## uniform-planar-array.h (module 'antenna'): std::pair<double, double> ns3::UniformPlanarArray::GetElementFieldPattern(ns3::Angles a) const [member function]
+    cls.add_method('GetElementFieldPattern', 
+                   'std::pair< double, double >', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True, is_virtual=True)
+    ## uniform-planar-array.h (module 'antenna'): ns3::Vector ns3::UniformPlanarArray::GetElementLocation(uint64_t index) const [member function]
+    cls.add_method('GetElementLocation', 
+                   'ns3::Vector', 
+                   [param('uint64_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## uniform-planar-array.h (module 'antenna'): uint64_t ns3::UniformPlanarArray::GetNumberOfElements() const [member function]
+    cls.add_method('GetNumberOfElements', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## uniform-planar-array.h (module 'antenna'): static ns3::TypeId ns3::UniformPlanarArray::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3AntennaModel_methods(root_module, cls):
     ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel(ns3::AntennaModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::AntennaModel const &', 'arg0')])
@@ -1223,16 +1287,16 @@
     cls.add_constructor([])
     ## cosine-antenna-model.h (module 'antenna'): ns3::CosineAntennaModel::CosineAntennaModel(ns3::CosineAntennaModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::CosineAntennaModel const &', 'arg0')])
-    ## cosine-antenna-model.h (module 'antenna'): double ns3::CosineAntennaModel::GetBeamwidth() const [member function]
-    cls.add_method('GetBeamwidth', 
-                   'double', 
-                   [], 
-                   is_const=True)
     ## cosine-antenna-model.h (module 'antenna'): double ns3::CosineAntennaModel::GetGainDb(ns3::Angles a) [member function]
     cls.add_method('GetGainDb', 
                    'double', 
                    [param('ns3::Angles', 'a')], 
                    is_virtual=True)
+    ## cosine-antenna-model.h (module 'antenna'): double ns3::CosineAntennaModel::GetHorizontalBeamwidth() const [member function]
+    cls.add_method('GetHorizontalBeamwidth', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## cosine-antenna-model.h (module 'antenna'): double ns3::CosineAntennaModel::GetOrientation() const [member function]
     cls.add_method('GetOrientation', 
                    'double', 
@@ -1243,14 +1307,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## cosine-antenna-model.h (module 'antenna'): void ns3::CosineAntennaModel::SetBeamwidth(double beamwidthDegrees) [member function]
-    cls.add_method('SetBeamwidth', 
-                   'void', 
-                   [param('double', 'beamwidthDegrees')])
-    ## cosine-antenna-model.h (module 'antenna'): void ns3::CosineAntennaModel::SetOrientation(double orientationDegrees) [member function]
-    cls.add_method('SetOrientation', 
-                   'void', 
-                   [param('double', 'orientationDegrees')])
+    ## cosine-antenna-model.h (module 'antenna'): double ns3::CosineAntennaModel::GetVerticalBeamwidth() const [member function]
+    cls.add_method('GetVerticalBeamwidth', 
+                   'double', 
+                   [], 
+                   is_const=True)
     return
 
 def register_Ns3EmptyAttributeAccessor_methods(root_module, cls):
@@ -1391,6 +1452,48 @@
                    [param('double', 'orientationDegrees')])
     return
 
+def register_Ns3ThreeGppAntennaModel_methods(root_module, cls):
+    ## three-gpp-antenna-model.h (module 'antenna'): ns3::ThreeGppAntennaModel::ThreeGppAntennaModel(ns3::ThreeGppAntennaModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ThreeGppAntennaModel const &', 'arg0')])
+    ## three-gpp-antenna-model.h (module 'antenna'): ns3::ThreeGppAntennaModel::ThreeGppAntennaModel() [constructor]
+    cls.add_constructor([])
+    ## three-gpp-antenna-model.h (module 'antenna'): double ns3::ThreeGppAntennaModel::GetAntennaElementGain() const [member function]
+    cls.add_method('GetAntennaElementGain', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## three-gpp-antenna-model.h (module 'antenna'): double ns3::ThreeGppAntennaModel::GetGainDb(ns3::Angles a) [member function]
+    cls.add_method('GetGainDb', 
+                   'double', 
+                   [param('ns3::Angles', 'a')], 
+                   is_virtual=True)
+    ## three-gpp-antenna-model.h (module 'antenna'): double ns3::ThreeGppAntennaModel::GetHorizontalBeamwidth() const [member function]
+    cls.add_method('GetHorizontalBeamwidth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## three-gpp-antenna-model.h (module 'antenna'): double ns3::ThreeGppAntennaModel::GetMaxAttenuation() const [member function]
+    cls.add_method('GetMaxAttenuation', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## three-gpp-antenna-model.h (module 'antenna'): double ns3::ThreeGppAntennaModel::GetSlaV() const [member function]
+    cls.add_method('GetSlaV', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## three-gpp-antenna-model.h (module 'antenna'): static ns3::TypeId ns3::ThreeGppAntennaModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## three-gpp-antenna-model.h (module 'antenna'): double ns3::ThreeGppAntennaModel::GetVerticalBeamwidth() const [member function]
+    cls.add_method('GetVerticalBeamwidth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    return
+
 def register_Ns3TypeIdChecker_methods(root_module, cls):
     ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
     cls.add_constructor([])
@@ -1640,14 +1743,38 @@
 
 def register_functions(root_module):
     module = root_module
+    ## angles.h (module 'antenna'): std::vector<double, std::allocator<double> > ns3::DegreesToRadians(std::vector<double, std::allocator<double> > const & degrees) [free function]
+    module.add_function('DegreesToRadians', 
+                        'std::vector< double >', 
+                        [param('std::vector< double > const &', 'degrees')])
     ## angles.h (module 'antenna'): double ns3::DegreesToRadians(double degrees) [free function]
     module.add_function('DegreesToRadians', 
                         'double', 
                         [param('double', 'degrees')])
+    ## angles.h (module 'antenna'): std::vector<double, std::allocator<double> > ns3::RadiansToDegrees(std::vector<double, std::allocator<double> > const & radians) [free function]
+    module.add_function('RadiansToDegrees', 
+                        'std::vector< double >', 
+                        [param('std::vector< double > const &', 'radians')])
     ## angles.h (module 'antenna'): double ns3::RadiansToDegrees(double radians) [free function]
     module.add_function('RadiansToDegrees', 
                         'double', 
                         [param('double', 'radians')])
+    ## angles.h (module 'antenna'): double ns3::WrapTo180(double a) [free function]
+    module.add_function('WrapTo180', 
+                        'double', 
+                        [param('double', 'a')])
+    ## angles.h (module 'antenna'): double ns3::WrapTo2Pi(double a) [free function]
+    module.add_function('WrapTo2Pi', 
+                        'double', 
+                        [param('double', 'a')])
+    ## angles.h (module 'antenna'): double ns3::WrapTo360(double a) [free function]
+    module.add_function('WrapTo360', 
+                        'double', 
+                        [param('double', 'a')])
+    ## angles.h (module 'antenna'): double ns3::WrapToPi(double a) [free function]
+    module.add_function('WrapToPi', 
+                        'double', 
+                        [param('double', 'a')])
     register_functions_ns3_FatalImpl(module.add_cpp_namespace('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.add_cpp_namespace('Hash'), root_module)
     return
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/bindings/modulegen__gcc_LP64.py ns-3.34/src/antenna/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/antenna/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -22,7 +22,7 @@
     
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
-    ## angles.h (module 'antenna'): ns3::Angles [struct]
+    ## angles.h (module 'antenna'): ns3::Angles [class]
     module.add_class('Angles')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
     module.add_class('AttributeConstructionList', import_from_module='ns.core')
@@ -83,6 +83,11 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel [class]
+    module.add_class('PhasedArrayModel', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
@@ -95,13 +100,10 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel [class]
-    module.add_class('ThreeGppAntennaArrayModel', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::ThreeGppAntennaArrayModel::ComplexVector')
-    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::ThreeGppAntennaArrayModel::ComplexVector*')
-    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::ThreeGppAntennaArrayModel::ComplexVector&')
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    ## uniform-planar-array.h (module 'antenna'): ns3::UniformPlanarArray [class]
+    module.add_class('UniformPlanarArray', parent=root_module['ns3::PhasedArrayModel'])
     ## antenna-model.h (module 'antenna'): ns3::AntennaModel [class]
     module.add_class('AntennaModel', parent=root_module['ns3::Object'])
     ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
@@ -128,6 +130,8 @@
     module.add_class('IsotropicAntennaModel', parent=root_module['ns3::AntennaModel'])
     ## parabolic-antenna-model.h (module 'antenna'): ns3::ParabolicAntennaModel [class]
     module.add_class('ParabolicAntennaModel', parent=root_module['ns3::AntennaModel'])
+    ## three-gpp-antenna-model.h (module 'antenna'): ns3::ThreeGppAntennaModel [class]
+    module.add_class('ThreeGppAntennaModel', parent=root_module['ns3::AntennaModel'])
     ## type-id.h (module 'core'): ns3::TypeIdChecker [class]
     module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## type-id.h (module 'core'): ns3::TypeIdValue [class]
@@ -142,8 +146,10 @@
     module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
+    module.add_container('ns3::PhasedArrayModel::ComplexVector', 'std::complex< double >', container_type='vector')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -234,14 +240,15 @@
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
+    register_Ns3PhasedArrayModel_methods(root_module, root_module['ns3::PhasedArrayModel'])
     register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
     register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
     register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
     register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
-    register_Ns3ThreeGppAntennaArrayModel_methods(root_module, root_module['ns3::ThreeGppAntennaArrayModel'])
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
+    register_Ns3UniformPlanarArray_methods(root_module, root_module['ns3::UniformPlanarArray'])
     register_Ns3AntennaModel_methods(root_module, root_module['ns3::AntennaModel'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
     register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
@@ -255,6 +262,7 @@
     register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
     register_Ns3IsotropicAntennaModel_methods(root_module, root_module['ns3::IsotropicAntennaModel'])
     register_Ns3ParabolicAntennaModel_methods(root_module, root_module['ns3::ParabolicAntennaModel'])
+    register_Ns3ThreeGppAntennaModel_methods(root_module, root_module['ns3::ThreeGppAntennaModel'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
     register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
     register_Ns3Vector2DChecker_methods(root_module, root_module['ns3::Vector2DChecker'])
@@ -273,18 +281,32 @@
     cls.add_output_stream_operator()
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Angles const & arg0) [constructor]
     cls.add_constructor([param('ns3::Angles const &', 'arg0')])
-    ## angles.h (module 'antenna'): ns3::Angles::Angles() [constructor]
-    cls.add_constructor([])
-    ## angles.h (module 'antenna'): ns3::Angles::Angles(double phi, double theta) [constructor]
-    cls.add_constructor([param('double', 'phi'), param('double', 'theta')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(double azimuth, double inclination) [constructor]
+    cls.add_constructor([param('double', 'azimuth'), param('double', 'inclination')])
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v) [constructor]
     cls.add_constructor([param('ns3::Vector', 'v')])
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v, ns3::Vector o) [constructor]
     cls.add_constructor([param('ns3::Vector', 'v'), param('ns3::Vector', 'o')])
-    ## angles.h (module 'antenna'): ns3::Angles::phi [variable]
-    cls.add_instance_attribute('phi', 'double', is_const=False)
-    ## angles.h (module 'antenna'): ns3::Angles::theta [variable]
-    cls.add_instance_attribute('theta', 'double', is_const=False)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetAzimuth() const [member function]
+    cls.add_method('GetAzimuth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetInclination() const [member function]
+    cls.add_method('GetInclination', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): void ns3::Angles::SetAzimuth(double azimuth) [member function]
+    cls.add_method('SetAzimuth', 
+                   'void', 
+                   [param('double', 'azimuth')])
+    ## angles.h (module 'antenna'): void ns3::Angles::SetInclination(double inclination) [member function]
+    cls.add_method('SetInclination', 
+                   'void', 
+                   [param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::m_printDeg [variable]
+    cls.add_static_attribute('m_printDeg', 'bool', is_const=False)
     return
 
 def register_Ns3AttributeConstructionList_methods(root_module, cls):
@@ -934,6 +956,66 @@
                    [])
     return
 
+def register_Ns3PhasedArrayModel_methods(root_module, cls):
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel(ns3::PhasedArrayModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArrayModel const &', 'arg0')])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-model.h (module 'antenna'): ns3::Ptr<const ns3::AntennaModel> ns3::PhasedArrayModel::GetAntennaElement() const [member function]
+    cls.add_method('GetAntennaElement', 
+                   'ns3::Ptr< ns3::AntennaModel const >', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector() const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector(ns3::Angles a) const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): std::pair<double, double> ns3::PhasedArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
+    cls.add_method('GetElementFieldPattern', 
+                   'std::pair< double, double >', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::Vector ns3::PhasedArrayModel::GetElementLocation(uint64_t index) const [member function]
+    cls.add_method('GetElementLocation', 
+                   'ns3::Vector', 
+                   [param('uint64_t', 'index')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
+    cls.add_method('GetNumberOfElements', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetSteeringVector(ns3::Angles a) const [member function]
+    cls.add_method('GetSteeringVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): static ns3::TypeId ns3::PhasedArrayModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetAntennaElement(ns3::Ptr<ns3::AntennaModel> antennaElement) [member function]
+    cls.add_method('SetAntennaElement', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::AntennaModel >', 'antennaElement')])
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetBeamformingVector(ns3::PhasedArrayModel::ComplexVector const & beamformingVector) [member function]
+    cls.add_method('SetBeamformingVector', 
+                   'void', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'beamformingVector')])
+    ## phased-array-model.h (module 'antenna'): static double ns3::PhasedArrayModel::ComputeNorm(ns3::PhasedArrayModel::ComplexVector const & vector) [member function]
+    cls.add_method('ComputeNorm', 
+                   'double', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'vector')], 
+                   is_static=True, visibility='protected')
+    return
+
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -976,51 +1058,6 @@
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
     return
 
-def register_Ns3ThreeGppAntennaArrayModel_methods(root_module, cls):
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel::ThreeGppAntennaArrayModel(ns3::ThreeGppAntennaArrayModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ThreeGppAntennaArrayModel const &', 'arg0')])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel::ThreeGppAntennaArrayModel() [constructor]
-    cls.add_constructor([])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): void ns3::ThreeGppAntennaArrayModel::ChangeToOmniTx() [member function]
-    cls.add_method('ChangeToOmniTx', 
-                   'void', 
-                   [])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel::ComplexVector const & ns3::ThreeGppAntennaArrayModel::GetBeamformingVector() const [member function]
-    cls.add_method('GetBeamformingVector', 
-                   'ns3::ThreeGppAntennaArrayModel::ComplexVector const &', 
-                   [], 
-                   is_const=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): std::pair<double, double> ns3::ThreeGppAntennaArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
-    cls.add_method('GetElementFieldPattern', 
-                   'std::pair< double, double >', 
-                   [param('ns3::Angles', 'a')], 
-                   is_const=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::Vector ns3::ThreeGppAntennaArrayModel::GetElementLocation(uint64_t index) const [member function]
-    cls.add_method('GetElementLocation', 
-                   'ns3::Vector', 
-                   [param('uint64_t', 'index')], 
-                   is_const=True, is_virtual=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): uint64_t ns3::ThreeGppAntennaArrayModel::GetNumberOfElements() const [member function]
-    cls.add_method('GetNumberOfElements', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): static ns3::TypeId ns3::ThreeGppAntennaArrayModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): bool ns3::ThreeGppAntennaArrayModel::IsOmniTx() const [member function]
-    cls.add_method('IsOmniTx', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): void ns3::ThreeGppAntennaArrayModel::SetBeamformingVector(ns3::ThreeGppAntennaArrayModel::ComplexVector const & beamformingVector) [member function]
-    cls.add_method('SetBeamformingVector', 
-                   'void', 
-                   [param('ns3::ThreeGppAntennaArrayModel::ComplexVector const &', 'beamformingVector')])
-    return
-
 def register_Ns3TraceSourceAccessor_methods(root_module, cls):
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor(ns3::TraceSourceAccessor const & arg0) [constructor]
     cls.add_constructor([param('ns3::TraceSourceAccessor const &', 'arg0')])
@@ -1048,6 +1085,33 @@
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3UniformPlanarArray_methods(root_module, cls):
+    ## uniform-planar-array.h (module 'antenna'): ns3::UniformPlanarArray::UniformPlanarArray(ns3::UniformPlanarArray const & arg0) [constructor]
+    cls.add_constructor([param('ns3::UniformPlanarArray const &', 'arg0')])
+    ## uniform-planar-array.h (module 'antenna'): ns3::UniformPlanarArray::UniformPlanarArray() [constructor]
+    cls.add_constructor([])
+    ## uniform-planar-array.h (module 'antenna'): std::pair<double, double> ns3::UniformPlanarArray::GetElementFieldPattern(ns3::Angles a) const [member function]
+    cls.add_method('GetElementFieldPattern', 
+                   'std::pair< double, double >', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True, is_virtual=True)
+    ## uniform-planar-array.h (module 'antenna'): ns3::Vector ns3::UniformPlanarArray::GetElementLocation(uint64_t index) const [member function]
+    cls.add_method('GetElementLocation', 
+                   'ns3::Vector', 
+                   [param('uint64_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## uniform-planar-array.h (module 'antenna'): uint64_t ns3::UniformPlanarArray::GetNumberOfElements() const [member function]
+    cls.add_method('GetNumberOfElements', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## uniform-planar-array.h (module 'antenna'): static ns3::TypeId ns3::UniformPlanarArray::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3AntennaModel_methods(root_module, cls):
     ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel(ns3::AntennaModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::AntennaModel const &', 'arg0')])
@@ -1223,16 +1287,16 @@
     cls.add_constructor([])
     ## cosine-antenna-model.h (module 'antenna'): ns3::CosineAntennaModel::CosineAntennaModel(ns3::CosineAntennaModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::CosineAntennaModel const &', 'arg0')])
-    ## cosine-antenna-model.h (module 'antenna'): double ns3::CosineAntennaModel::GetBeamwidth() const [member function]
-    cls.add_method('GetBeamwidth', 
-                   'double', 
-                   [], 
-                   is_const=True)
     ## cosine-antenna-model.h (module 'antenna'): double ns3::CosineAntennaModel::GetGainDb(ns3::Angles a) [member function]
     cls.add_method('GetGainDb', 
                    'double', 
                    [param('ns3::Angles', 'a')], 
                    is_virtual=True)
+    ## cosine-antenna-model.h (module 'antenna'): double ns3::CosineAntennaModel::GetHorizontalBeamwidth() const [member function]
+    cls.add_method('GetHorizontalBeamwidth', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## cosine-antenna-model.h (module 'antenna'): double ns3::CosineAntennaModel::GetOrientation() const [member function]
     cls.add_method('GetOrientation', 
                    'double', 
@@ -1243,14 +1307,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## cosine-antenna-model.h (module 'antenna'): void ns3::CosineAntennaModel::SetBeamwidth(double beamwidthDegrees) [member function]
-    cls.add_method('SetBeamwidth', 
-                   'void', 
-                   [param('double', 'beamwidthDegrees')])
-    ## cosine-antenna-model.h (module 'antenna'): void ns3::CosineAntennaModel::SetOrientation(double orientationDegrees) [member function]
-    cls.add_method('SetOrientation', 
-                   'void', 
-                   [param('double', 'orientationDegrees')])
+    ## cosine-antenna-model.h (module 'antenna'): double ns3::CosineAntennaModel::GetVerticalBeamwidth() const [member function]
+    cls.add_method('GetVerticalBeamwidth', 
+                   'double', 
+                   [], 
+                   is_const=True)
     return
 
 def register_Ns3EmptyAttributeAccessor_methods(root_module, cls):
@@ -1391,6 +1452,48 @@
                    [param('double', 'orientationDegrees')])
     return
 
+def register_Ns3ThreeGppAntennaModel_methods(root_module, cls):
+    ## three-gpp-antenna-model.h (module 'antenna'): ns3::ThreeGppAntennaModel::ThreeGppAntennaModel(ns3::ThreeGppAntennaModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ThreeGppAntennaModel const &', 'arg0')])
+    ## three-gpp-antenna-model.h (module 'antenna'): ns3::ThreeGppAntennaModel::ThreeGppAntennaModel() [constructor]
+    cls.add_constructor([])
+    ## three-gpp-antenna-model.h (module 'antenna'): double ns3::ThreeGppAntennaModel::GetAntennaElementGain() const [member function]
+    cls.add_method('GetAntennaElementGain', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## three-gpp-antenna-model.h (module 'antenna'): double ns3::ThreeGppAntennaModel::GetGainDb(ns3::Angles a) [member function]
+    cls.add_method('GetGainDb', 
+                   'double', 
+                   [param('ns3::Angles', 'a')], 
+                   is_virtual=True)
+    ## three-gpp-antenna-model.h (module 'antenna'): double ns3::ThreeGppAntennaModel::GetHorizontalBeamwidth() const [member function]
+    cls.add_method('GetHorizontalBeamwidth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## three-gpp-antenna-model.h (module 'antenna'): double ns3::ThreeGppAntennaModel::GetMaxAttenuation() const [member function]
+    cls.add_method('GetMaxAttenuation', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## three-gpp-antenna-model.h (module 'antenna'): double ns3::ThreeGppAntennaModel::GetSlaV() const [member function]
+    cls.add_method('GetSlaV', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## three-gpp-antenna-model.h (module 'antenna'): static ns3::TypeId ns3::ThreeGppAntennaModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## three-gpp-antenna-model.h (module 'antenna'): double ns3::ThreeGppAntennaModel::GetVerticalBeamwidth() const [member function]
+    cls.add_method('GetVerticalBeamwidth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    return
+
 def register_Ns3TypeIdChecker_methods(root_module, cls):
     ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
     cls.add_constructor([])
@@ -1640,14 +1743,38 @@
 
 def register_functions(root_module):
     module = root_module
+    ## angles.h (module 'antenna'): std::vector<double, std::allocator<double> > ns3::DegreesToRadians(std::vector<double, std::allocator<double> > const & degrees) [free function]
+    module.add_function('DegreesToRadians', 
+                        'std::vector< double >', 
+                        [param('std::vector< double > const &', 'degrees')])
     ## angles.h (module 'antenna'): double ns3::DegreesToRadians(double degrees) [free function]
     module.add_function('DegreesToRadians', 
                         'double', 
                         [param('double', 'degrees')])
+    ## angles.h (module 'antenna'): std::vector<double, std::allocator<double> > ns3::RadiansToDegrees(std::vector<double, std::allocator<double> > const & radians) [free function]
+    module.add_function('RadiansToDegrees', 
+                        'std::vector< double >', 
+                        [param('std::vector< double > const &', 'radians')])
     ## angles.h (module 'antenna'): double ns3::RadiansToDegrees(double radians) [free function]
     module.add_function('RadiansToDegrees', 
                         'double', 
                         [param('double', 'radians')])
+    ## angles.h (module 'antenna'): double ns3::WrapTo180(double a) [free function]
+    module.add_function('WrapTo180', 
+                        'double', 
+                        [param('double', 'a')])
+    ## angles.h (module 'antenna'): double ns3::WrapTo2Pi(double a) [free function]
+    module.add_function('WrapTo2Pi', 
+                        'double', 
+                        [param('double', 'a')])
+    ## angles.h (module 'antenna'): double ns3::WrapTo360(double a) [free function]
+    module.add_function('WrapTo360', 
+                        'double', 
+                        [param('double', 'a')])
+    ## angles.h (module 'antenna'): double ns3::WrapToPi(double a) [free function]
+    module.add_function('WrapToPi', 
+                        'double', 
+                        [param('double', 'a')])
     register_functions_ns3_FatalImpl(module.add_cpp_namespace('FatalImpl'), root_module)
     register_functions_ns3_Hash(module.add_cpp_namespace('Hash'), root_module)
     return
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/doc/source/antenna-design.rst ns-3.34/src/antenna/doc/source/antenna-design.rst
--- ns-3.33/src/antenna/doc/source/antenna-design.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/doc/source/antenna-design.rst	2021-07-14 10:31:06.000000000 -0700
@@ -1,9 +1,9 @@
 .. include:: replace.txt
 
 
-++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++
 Design documentation
-++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++
 
 --------
 Overview
@@ -11,9 +11,27 @@
 
 The Antenna module provides:
 
- #. a new base class (AntennaModel) that provides an interface for the modeling of the radiation pattern of an antenna;
+ #. a class (Angles) and utility functions to deal with angles
+ #. a base class (AntennaModel) that provides an interface for the modeling of the radiation pattern of an antenna;
  #. a set of classes derived from this base class that each models the radiation pattern of different types of antennas;
- #. the class ThreeGppAntennaArrayModel, which implements the antenna model described in 3GPP TR 38.901
+ #. a base class (PhasedArrayModel) that provides a flexible interface for modeling a number of Phase Antenna Array (PAA) models
+ #. a class (UniformPlanarArray) derived from this base class, implementing a Uniform Planar Array (UPA) supporting both rectangular and linear lattices
+
+
+------
+Angles
+------
+
+The Angles class holds information about an angle in 3D space using spherical coordinates in radian units.
+Specifically, it uses the azimuth-inclination convention, where
+
+* Inclination is the angle between the zenith direction (positive z-axis) and the desired direction. It is included in the range [0, pi] radians.
+* Azimuth is the signed angle measured from the positive x-axis, where a positive direction goes towards the positive y-axis. It is included in the range [-pi, pi) radians.
+
+Multiple constructors are present, supporting the most common ways to encode information on a direction.
+A static boolean variable allows the user to decide whether angles should be printed in radian or degree units.
+
+A number of angle-related utilities are offered, such as radians/degree conversions, for both scalars and vectors, and angle wrapping.
 
 
 ------------
@@ -107,36 +125,55 @@
 antenna. Note that this radiation pattern is independent of the inclination angle
 :math:`\theta`.
 
-.. _sec-3gpp-antenna-model:
--------------------------
-ThreeGppAntennaArrayModel
--------------------------
-
-The class ThreeGppAntennaArrayModel implements the antenna model described in
-3GPP TR 38.901 [38901]_, which is used by the classes ThreeGppSpectrumPropagationLossModel
-and ThreeGppChannelModel.
-Each instance of this class models an isotropic rectangular antenna array composed  
-of a single panel with NxM elements, where N is the number of rows and M is the 
-number of columns, configurable through the attributes "NumRows" and "NumColumns". 
-The radiation pattern of the antenna elements follows the model specified in
-Sec. 7.3 of 3GPP TR 38.901; only vertical polarization is considered (i.e.,
-:math:`{\zeta = 0}`).
-The directional gain of the antenna elements can be configured through the
-attribute "ElementGain" (see formula 2.34 in [Mailloux]_ to choose a proper value).
+
+
+ThreeGppAntennaModel
+++++++++++++++++++++
+
+This model implements the antenna element described in [38901]_.
+Parameters are fixed from the technical report, thus no attributes nor setters are provided.
+The model is largely based on the `ParabolicAntennaModel`_.
+
+------------------
+Phased Array Model
+------------------
+
+The class PhasedArrayModel has been created with flexibility in mind.
+It abstracts the basic idea of a Phased Antenna Array (PAA) by removing any constraint on the
+position of each element, and instead generalizes the concept of steering and beamforming vectors,
+solely based on the generalized location of the antenna elements.
+For details on Phased Array Antennas see for instance [Mailloux]_.
+
+Derived classes must implement the following functions:
+
+* GetNumberOfElements: returns the number of antenna elements
+* GetElementLocation: returns the location of the antenna element with the specified index, normalized with respect to the wavelength
+* GetElementFieldPattern: returns the horizontal and vertical components of the antenna element field pattern at the specified direction. Only vertical polarization is considered.
+
+The class PhasedArrayModel also assumes that all antenna elements are equal, a typical key assumption which allows to model the PAA field pattern as the sum of the array factor, given by the geometry of the location of the antenna elements, and the element field pattern.
+Any class derived from AntennaModel is a valid antenna element for the PhasedArrayModel, allowing for a great flexibility of the framework.
+
+
+UniformPlanarArray
+++++++++++++++++++
+
+The class UniformPlanarArray is a generic implementation of Uniform Planar Arrays (UPAs),
+supporting rectangular and linear regular lattices.
+It loosely follows the implementation described in the 3GPP TR 38.901 [38901]_,
+considering only a single a single panel, i.e., :math:`N_{g} = M_{g} = 1`.
+
 By default, the array is orthogonal to the x-axis, pointing towards the positive
 direction, but the orientation can be changed through the attributes "BearingAngle",
 which adjusts the azimuth angle, and "DowntiltAngle", which adjusts the elevation angle.
-The spacing between the horizontal and vertical elements can be configured through
-the attributes "AntennaHorizontalSpacing" and "AntennaVerticalSpacing". 
+The slant angle is instead fixed and assumed to be 0.
 
-**Note:**
+The number of antenna elements in the vertical and horizontal directions can be configured
+through the attributes "NumRows" and "NumColumns", while the spacing between the horizontal
+and vertical elements can be configured through the attributes "AntennaHorizontalSpacing"
+and "AntennaVerticalSpacing". 
 
-  * Currently, the model does not support multi-panel antennas, i.e., 
-    :math:`N_{g} = M_{g} = 1`.
+Note: vertical polarization is assumed for each antenna element, as described in [38901]_ (i.e., :math:`{\zeta = 0}`).
 
-  * Currently, the model supports only single polarized (i.e., P = 1) antenna 
-    panels with vertical polarization (i.e., :math:`{\zeta = 0}`)
-  
 
 .. [Balanis] C.A. Balanis, "Antenna Theory - Analysis and Design",  Wiley, 2nd Ed.
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/model/angles.cc ns-3.34/src/antenna/model/angles.cc
--- ns-3.33/src/antenna/model/angles.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/model/angles.cc	2021-07-14 10:31:06.000000000 -0700
@@ -28,27 +28,139 @@
 
 NS_LOG_COMPONENT_DEFINE ("Angles");
 
-double DegreesToRadians (double degrees)
+bool Angles::m_printDeg = false;
+
+const double DEG_TO_RAD = M_PI / 180.0;
+const double RAD_TO_DEG = 180.0 / M_PI;
+
+
+double
+DegreesToRadians (double degrees)
+{
+  return degrees * DEG_TO_RAD;
+}
+
+
+double
+RadiansToDegrees (double radians)
+{
+  return radians * RAD_TO_DEG;
+}
+
+
+std::vector<double>
+DegreesToRadians (const std::vector<double> &degrees)
+{
+  std::vector<double> radians;
+  radians.reserve (degrees.size ());
+  for (size_t i = 0; i < degrees.size (); i++)
+    {
+      radians.push_back (DegreesToRadians (degrees[i]));
+    }
+  return radians;
+
+}
+
+
+std::vector<double>
+RadiansToDegrees (const std::vector<double> &radians)
+{
+  std::vector<double> degrees;
+  degrees.reserve (radians.size ());
+  for (size_t i = 0; i < radians.size (); i++)
+    {
+      degrees.push_back (RadiansToDegrees (radians[i]));
+    }
+  return degrees;
+}
+
+
+double
+WrapTo360 (double a)
 {
-  return degrees * M_PI / 180.0;
+  a = fmod (a, 360);
+  if (a < 0)
+    {
+      a += 360;
+    }
+
+  NS_ASSERT_MSG (0 <= a && a < 360, "Invalid wrap, a=" << a);
+  return a;
+}
+
+
+double
+WrapTo180 (double a)
+{
+  a = fmod (a + 180, 360);
+  if (a < 0)
+    {
+      a += 360;
+    }
+  a -= 180;
 
+  NS_ASSERT_MSG (-180 <= a && a < 180, "Invalid wrap, a=" << a);
+  return a;
 }
 
-double RadiansToDegrees (double radians)
+
+double
+WrapTo2Pi (double a)
 {
-  return radians * 180.0 / M_PI;
+  a = fmod (a, 2 * M_PI);
+  if (a < 0)
+    {
+      a += 2 * M_PI;
+    }
+
+  NS_ASSERT_MSG (0 <= a && a < 2 * M_PI, "Invalid wrap, a=" << a);
+  return a;
 }
 
-std::ostream& operator<< (std::ostream& os, const Angles& a)
+
+double
+WrapToPi (double a)
 {
-  os << "(" << a.phi << ", " << a.theta << ")";
+  a = fmod (a + M_PI, 2 * M_PI);
+  if (a < 0)
+    {
+      a += 2 * M_PI;
+    }
+  a -= M_PI;
+
+  NS_ASSERT_MSG (-M_PI <= a && a < M_PI, "Invalid wrap, a=" << a);
+  return a;
+}
+
+
+std::ostream&
+operator<< (std::ostream& os, const Angles& a)
+{
+  double azim, incl;
+  std::string unit;
+
+  if (a.m_printDeg)
+    {
+      azim = RadiansToDegrees (a.m_azimuth);
+      incl = RadiansToDegrees (a.m_inclination);
+      unit = "deg";
+    }
+  else
+    {
+      azim = a.m_azimuth;
+      incl = a.m_inclination;
+      unit = "rad";
+    }
+
+  os << "(" << azim << ", " << incl << ") " << unit;
   return os;
 }
 
-std::istream &operator >> (std::istream &is, Angles &a)
+std::istream&
+operator>> (std::istream& is, Angles& a)
 {
   char c;
-  is >> a.phi >> c >> a.theta;
+  is >> a.m_azimuth >> c >> a.m_inclination;
   if (c != ':')
     {
       is.setstate (std::ios_base::failbit);
@@ -58,31 +170,98 @@
 
 
 Angles::Angles ()
-  : phi (0),
-    theta (0)
-{
-}
+  : Angles (NAN, NAN)
+{}
 
 
-Angles::Angles (double p, double t)
-  : phi (p),
-    theta (t)
+Angles::Angles (double azimuth, double inclination)
+  : m_azimuth (azimuth),
+    m_inclination (inclination)
 {
+  NormalizeAngles ();
 }
 
 
 Angles::Angles (Vector v)
-  : phi (std::atan2 (v.y, v.x)),
-    theta (std::acos (v.z / v.GetLength ()))
+  : m_azimuth (std::atan2 (v.y, v.x)),
+    m_inclination (std::acos (v.z / v.GetLength ()))
 {
+  // azimuth and inclination angles for zero-length vectors are not defined
+  if (v.x == 0.0 && v.y == 0.0 && v.z == 0.0)
+    {
+      m_azimuth = NAN;
+      m_inclination = NAN;
+    }
+
+  NormalizeAngles ();
 }
 
 Angles::Angles (Vector v, Vector o)
-  : phi (std::atan2 (v.y - o.y, v.x - o.x)),
-    theta (std::acos ((v.z - o.z) / CalculateDistance (v, o)))
+  : Angles (v - o)
+{}
+
+
+
+void
+Angles::SetAzimuth (double azimuth)
 {
+  m_azimuth = azimuth;
+  NormalizeAngles ();
 }
 
 
+void
+Angles::SetInclination (double inclination)
+{
+  m_inclination = inclination;
+  NormalizeAngles ();
+}
+
+
+double
+Angles::GetAzimuth (void) const
+{
+  return m_azimuth;
+}
+
+
+double
+Angles::GetInclination (void) const
+{
+  return m_inclination;
+}
+
+
+void
+Angles::NormalizeAngles (void)
+{
+  CheckIfValid ();
+
+  // Normalize azimuth angle
+  if (std::isnan (m_azimuth))
+    {
+      return;
+    }
+
+  m_azimuth = WrapToPi (m_azimuth);
+}
+
+
+void
+Angles::CheckIfValid (void) const
+{
+  if (std::isfinite (m_inclination) || std::isfinite (m_azimuth))
+    {
+      NS_ASSERT_MSG (0.0 <= m_inclination && m_inclination <= M_PI,
+                     "m_inclination=" << m_inclination << " not valid, should be in [0, pi] rad");
+    }
+  else
+    {
+      // infinite or nan inclination or azimuth angle
+      NS_LOG_WARN ("Undefined angle: " << *this);
+    }
+
+}
+
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/model/angles.h ns-3.34/src/antenna/model/angles.h
--- ns-3.33/src/antenna/model/angles.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/model/angles.h	2021-07-14 10:31:06.000000000 -0700
@@ -23,6 +23,7 @@
 
 
 #include <ns3/vector.h>
+#include <vector>
 
 namespace ns3 {
 
@@ -31,63 +32,107 @@
  * \brief converts degrees to radians
  * 
  * \param degrees the angle in degrees
- * 
  * \return the angle in radians
  */
 double DegreesToRadians (double degrees);
 
 /** 
+ * \brief converts degrees to radians
+ * 
+ * \param degrees the angles in degrees
+ * \return the angles in radians
+ */
+std::vector<double> DegreesToRadians (const std::vector<double> &degrees);
+
+/** 
  * \brief converts radians to degrees
  * 
  * \param radians the angle in radians
- * 
  * \return the angle in degrees
  */
 double RadiansToDegrees (double radians);
 
 /** 
+ * \brief converts radians to degrees
+ * 
+ * \param radians the angles in radians
+ * \return the angles in degrees
+ */
+std::vector<double> RadiansToDegrees (const std::vector<double> &radians);
+
+/** 
+ * \brief Wrap angle in [0, 360)
+ * 
+ * \param a the angle in degrees
+ * \return the wrapped angle in degrees
+ */
+double WrapTo360 (double a);
+
+/** 
+ * \brief Wrap angle in [-180, 180)
  * 
- * struct holding the azimuth and inclination angles of spherical
- * coordinates. The notation is the one used in  "Antenna Theory - Analysis
- * and Design", C.A. Balanis, Wiley, 2nd Ed., section 2.2 "Radiation
- * pattern".
- * This notation corresponds to the standard spherical coordinates, with phi
+ * \param a the angle in degrees
+ * \return the wrapped angle in degrees
+ */
+double WrapTo180 (double a);
+
+/** 
+ * \brief Wrap angle in [0, 2*M_PI)
+ * 
+ * \param a the angle in radians
+ * \return the wrapped angle in radians
+ */
+double WrapTo2Pi (double a);
+
+/** 
+ * \brief Wrap angle in [-M_PI, M_PI)
+ * 
+ * \param a the angle in radians
+ * \return the wrapped angle in radians
+ */
+double WrapToPi (double a);
+
+/** 
+ * 
+ * Class holding the azimuth and inclination angles of spherical coordinates.
+ * The notation is the one used in  "Antenna Theory - Analysis
+ * and Design", C.A. Balanis, Wiley, 2nd Ed., section 2.2 "Radiation pattern".
+ * This notation corresponds to the standard spherical coordinates, with azimuth
  * measured counterclockwise in the x-y plane off the x-axis, and
- * theta measured off the z-axis. 
+ * inclination measured off the z-axis.
+ * Azimuth is consistently normalized to be in [-M_PI, M_PI).
  * 
  *          ^
  *        z | 
- *          |_ theta
+ *          |_ inclination
  *          | \
  *          | /|
  *          |/ |   y
  *          +-------->
  *         /  \|
  *        /___/
- *     x /  phi
+ *     x /  azimuth
  *      |/
  *
  */
-struct Angles
+class Angles
 {
+public:
   /** 
-   * default constructor, will initialize phi and theta to zero
+   * This constructor allows to specify azimuth and inclination.
+   * Inclination must be in [0, M_PI], while azimuth is
+   * automatically notmalized in [-M_PI, M_PI)
    * 
+   * \param azimuth the azimuth angle in radians
+   * \param inclination the inclination angle in radians
    */
-  Angles ();
+  Angles (double azimuth, double inclination);
 
   /** 
-   * this constructor allows to specify phi and  theta
-   * 
-   * \param phi the azimuth angle in radians
-   * \param theta the inclination angle in radians
-   * 
-   */
-  Angles (double phi, double theta);
-
-  /** 
-   * this constructor will initialize phi and theta by converting the
+   * This constructor will initialize azimuth and inclination by converting the
    * given 3D vector from cartesian coordinates to spherical coordinates
+   * Note: azimuth and inclination angles for a zero-length vector are not defined
+   * and are thus initialized to NAN
    * 
    * \param v the 3D vector in cartesian coordinates
    * 
@@ -95,7 +140,7 @@
   Angles (Vector v);
 
   /** 
-   * this constructor initializes an Angles instance with the angles
+   * This constructor initializes an Angles instance with the angles
    * of the spherical coordinates of point v respect to point o 
    * 
    * \param v the point (in cartesian coordinates) for which the angles are determined
@@ -105,39 +150,68 @@
   Angles (Vector v, Vector o);
 
   /**
-   * the azimuth angle in radians
-   * 
+   * Setter for azimuth angle
+   *
+   * \param azimuth angle in radians
    */
-  double phi;
+  void SetAzimuth (double azimuth);
 
   /**
-   * the inclination angle in radians
-   * 
+   * Setter for inclination angle
+   *
+   * \param inclination angle in radians. Must be in [0, M_PI]
    */
-  double theta;
-};
+  void SetInclination (double inclination);
 
+  /**
+   * Getter for azimuth angle
+   *
+   * \return azimuth angle in radians
+   */
+  double GetAzimuth (void) const;
 
+  /**
+   * Getter for inclination angle
+   *
+   * \return inclination angle in radians
+   */
+  double GetInclination (void) const;
 
-/** 
- * print a struct Angles to output
- * 
- * \param os the output stream
- * \param a the Angles struct
- * 
- * \return a reference to the output stream
- */
-std::ostream& operator<< ( std::ostream& os, const Angles& a);
+  // friend methods
+  friend std::ostream& operator<< (std::ostream& os, const Angles& a);
+  friend std::istream& operator>> (std::istream& is, Angles& a);
+
+  static bool m_printDeg; //!< flag for printing in radians or degrees units
+
+private:
+  /** 
+   * Default constructor is disabled
+   */
+  Angles ();
+
+  /**
+    * Normalize the angle azimuth angle range between in [-M_PI, M_PI)
+    * while checking if the angle is valid, i.e., finite and within
+    * the bounds.
+    * 
+    * Note: while an arbitrary value for the azimuth angle is valid
+    * and can be wrapped in [-M_PI, M_PI), an inclination angle outside
+    * the [0, M_PI] range can be ambiguos and is thus not valid.
+    */
+  void NormalizeAngles (void);
+
+  /**
+    * Check if Angle is valid or not
+    * Warns the user if the Angle is undefined (non-finite azimuth or inclination),
+    * throws an assert if the inclination angle is invalid (not in [0, M_PI])
+    */
+  void CheckIfValid (void) const;
+
+
+  double m_azimuth; //!< the azimuth angle in radians
+  double m_inclination; //!< the inclination angle in radians
+};
 
-/** 
- * initialize a struct Angles from input
- * 
- * \param is the input stream
- * \param a the Angles struct
- * 
- * \return a reference to the input stream
- */
-std::istream &operator >> (std::istream &is, Angles &a);
 
 } // namespace ns3
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/model/cosine-antenna-model.cc ns-3.34/src/antenna/model/cosine-antenna-model.cc
--- ns-3.33/src/antenna/model/cosine-antenna-model.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/model/cosine-antenna-model.cc	2021-07-14 10:31:06.000000000 -0700
@@ -34,19 +34,25 @@
 NS_OBJECT_ENSURE_REGISTERED (CosineAntennaModel);
 
 
-TypeId 
+TypeId
 CosineAntennaModel::GetTypeId ()
 {
   static TypeId tid = TypeId ("ns3::CosineAntennaModel")
     .SetParent<AntennaModel> ()
-    .SetGroupName("Antenna")
+    .SetGroupName ("Antenna")
     .AddConstructor<CosineAntennaModel> ()
-    .AddAttribute ("Beamwidth",
-                   "The 3dB beamwidth (degrees)",
-                   DoubleValue (60),
-                   MakeDoubleAccessor (&CosineAntennaModel::SetBeamwidth,
-                                       &CosineAntennaModel::GetBeamwidth),
-                   MakeDoubleChecker<double> (0, 180))
+    .AddAttribute ("VerticalBeamwidth",
+                   "The 3 dB vertical beamwidth (degrees). A beamwidth of 360 deg corresponds to constant gain",
+                   DoubleValue (360),
+                   MakeDoubleAccessor (&CosineAntennaModel::SetVerticalBeamwidth,
+                                       &CosineAntennaModel::GetVerticalBeamwidth),
+                   MakeDoubleChecker<double> (0, 360))
+    .AddAttribute ("HorizontalBeamwidth",
+                   "The 3 dB horizontal beamwidth (degrees). A beamwidth of 360 deg corresponds to constant gain",
+                   DoubleValue (120),
+                   MakeDoubleAccessor (&CosineAntennaModel::SetHorizontalBeamwidth,
+                                       &CosineAntennaModel::GetHorizontalBeamwidth),
+                   MakeDoubleChecker<double> (0, 360))
     .AddAttribute ("Orientation",
                    "The angle (degrees) that expresses the orientation of the antenna on the x-y plane relative to the x axis",
                    DoubleValue (0.0),
@@ -62,67 +68,110 @@
   return tid;
 }
 
-void 
-CosineAntennaModel::SetBeamwidth (double beamwidthDegrees)
-{ 
-  NS_LOG_FUNCTION (this << beamwidthDegrees);
-  m_beamwidthRadians = DegreesToRadians (beamwidthDegrees);
-  m_exponent = -3.0 / (20 * std::log10 (std::cos (m_beamwidthRadians / 4.0)));
-  NS_LOG_LOGIC (this << " m_exponent = " << m_exponent);
+
+double
+CosineAntennaModel::GetExponentFromBeamwidth (double beamwidthDegrees)
+{
+  NS_LOG_FUNCTION (beamwidthDegrees);
+
+  // The formula in obtained by inverting the power pattern P(alpha) in a single direction,
+  // while imposing that P(alpha0/2) = 0.5 = -3 dB, with respect to the exponent
+  // See CosineAntennaModel::GetGainDb for more information.
+  //
+  // The undetermined case of alpha0=360 is treated separately.
+  double exponent;
+  if (beamwidthDegrees == 360.0)
+  {
+    exponent = 0.0;
+  }
+  else
+  {
+    exponent = -3.0 / (20 * std::log10 (std::cos (DegreesToRadians (beamwidthDegrees / 4.0))));
+  }
+
+  return exponent;
 }
 
+
 double
-CosineAntennaModel::GetBeamwidth () const
+CosineAntennaModel::GetBeamwidthFromExponent (double exponent)
+{
+  NS_LOG_FUNCTION (exponent);
+
+  // The formula in obtained by inverting the power pattern P(alpha) in a single direction,
+  // while imposing that P(alpha0/2) = 0.5 = -3 dB, with respect to the beamwidth.
+  // See CosineAntennaModel::GetGainDb for more information.
+  double beamwidthRadians = 4 * std::acos (std::pow (0.5, 1 / (2 * exponent)));
+  return RadiansToDegrees (beamwidthRadians);
+}
+
+
+void
+CosineAntennaModel::SetVerticalBeamwidth (double verticalBeamwidthDegrees)
+{
+  NS_LOG_FUNCTION (this << verticalBeamwidthDegrees);
+  m_verticalExponent = GetExponentFromBeamwidth (verticalBeamwidthDegrees);
+}
+
+
+void
+CosineAntennaModel::SetHorizontalBeamwidth (double horizontalBeamwidthDegrees)
 {
-  return RadiansToDegrees (m_beamwidthRadians);
+  NS_LOG_FUNCTION (this << horizontalBeamwidthDegrees);
+  m_horizontalExponent = GetExponentFromBeamwidth (horizontalBeamwidthDegrees);
 }
 
-void 
+
+double
+CosineAntennaModel::GetVerticalBeamwidth () const
+{
+  return GetBeamwidthFromExponent (m_verticalExponent);
+}
+
+
+double
+CosineAntennaModel::GetHorizontalBeamwidth () const
+{
+  return GetBeamwidthFromExponent (m_horizontalExponent);
+}
+
+
+void
 CosineAntennaModel::SetOrientation (double orientationDegrees)
 {
   NS_LOG_FUNCTION (this << orientationDegrees);
   m_orientationRadians = DegreesToRadians (orientationDegrees);
 }
 
+
 double
 CosineAntennaModel::GetOrientation () const
 {
   return RadiansToDegrees (m_orientationRadians);
 }
 
-double 
+
+double
 CosineAntennaModel::GetGainDb (Angles a)
 {
   NS_LOG_FUNCTION (this << a);
-  // azimuth angle w.r.t. the reference system of the antenna
-  double phi = a.phi - m_orientationRadians;
 
   // make sure phi is in (-pi, pi]
-  while (phi <= -M_PI)
-    {
-      phi += M_PI+M_PI;
-    }
-  while (phi > M_PI)
-    {
-      phi -= M_PI+M_PI;
-    }
-
-  NS_LOG_LOGIC ("phi = " << phi );
-
-  // element factor: amplitude gain of a single antenna element in linear units
-  double ef = std::pow (std::cos (phi / 2.0), m_exponent);
-
-  // the array factor is not considered. Note that if we did consider
-  // the array factor, the actual beamwidth would change, and in
-  // particular it would be different from the one specified by the
-  // user. Hence it is not desirable to use the array factor, for the
-  // ease of use of this model.
+  a.SetAzimuth (a.GetAzimuth () - m_orientationRadians);
+
+  NS_LOG_LOGIC (a);
 
-  double gainDb = 20 * std::log10 (ef);
+  // The element power gain is computed as a product of cosine functions on the two axis
+  // The power pattern of the element is equal to:
+  // P(az,el) = cos(az/2)^2m * cos(pi/2 - incl/2)^2n,
+  // where az is the azimuth angle, and incl is the inclination angle.
+  double gain = (std::pow (std::cos (a.GetAzimuth () / 2), 2 * m_horizontalExponent)) *
+                (std::pow (std::cos ((M_PI / 2 - a.GetInclination ()) / 2), 2 * m_verticalExponent));
+  double gainDb = 10 * std::log10 (gain);
+  
   NS_LOG_LOGIC ("gain = " << gainDb << " + " << m_maxGain << " dB");
   return gainDb + m_maxGain;
 }
 
 
 }
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/model/cosine-antenna-model.h ns-3.34/src/antenna/model/cosine-antenna-model.h
--- ns-3.33/src/antenna/model/cosine-antenna-model.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/model/cosine-antenna-model.h	2021-07-14 10:31:06.000000000 -0700
@@ -28,48 +28,89 @@
 namespace ns3 {
 
 /**
- * 
- * \brief Cosine Antenna Model 
  *
- * This class implements the cosine model as described in:
+ * \brief Cosine Antenna Model
  *
- * Li Chunjian, "Efficient Antenna Patterns for Three-Sector WCDMA Systems"
+ * This class implements the cosine model, similarly to what is described in:
+ * Cosine Antenna Element, Mathworks, Phased Array System Toolbox (Sep. 2020)
+ * Available online: https://www.mathworks.com/help/phased/ug/cosine-antenna-element.html
  *
- * Note that only the element factor of the above model is
- * considered. Also, an additional constant gain is added to model the
- * radiation pattern on the vertical plane (to account for the fact
- * that the elevation angle is not included in the model).
+ * The power pattern of the element is equal to:
+  // P(az,el) = cos(az/2)^2m * cos(pi/2 - incl/2)^2n,
+  // where az is the azimuth angle, and incl is the inclination angle.
+ *
+ * Differently from the source, the response is defined for azimuth and elevation angles
+ * between –180 and 180 degrees and is always positive.
+ * There is no response at the backside of a cosine antenna.
+ * The cosine response pattern achieves a maximum value of 1 (0 dB) at 0 degrees azimuth
+ * and 90 degrees inclination.
+ * An extra settable gain is added to the original model, to improve its generality.
  */
 class CosineAntennaModel : public AntennaModel
 {
 public:
-
   // inherited from Object
   static TypeId GetTypeId ();
 
   // inherited from AntennaModel
   virtual double GetGainDb (Angles a);
 
+  /**
+   * Get the vertical 3 dB beamwidth of the cosine antenna model.
+   * \return the vertical beamwidth in degrees
+   */
+  double GetVerticalBeamwidth (void) const;
 
-  // attribute getters/setters
-  void SetBeamwidth (double beamwidthDegrees);
-  double GetBeamwidth () const;
-  void SetOrientation (double orientationDegrees);
-  double GetOrientation () const;
+  /**
+   * Get the horizontal 3 dB beamwidth of the cosine antenna model.
+   * \return the horizontal beamwidth in degrees
+   */
+  double GetHorizontalBeamwidth (void) const;
+
+  /**
+   * Get the horizontal orientation of the antenna element.
+   * \return the horizontal orientation in degrees
+   */
+  double GetOrientation (void) const;
 
 private:
 
   /**
-   * this is the variable "n" in the paper by Chunjian
-   * 
+   * Set the vertical 3 dB beamwidth (bilateral) of the cosine antenna model.
+   * \param verticalBeamwidthDegrees the vertical beamwidth in degrees
    */
-  double m_exponent; 
+  void SetVerticalBeamwidth (double verticalBeamwidthDegrees);
 
-  double m_beamwidthRadians;
+  /**
+   * Set the horizontal 3 dB beamwidth (bilateral) of the cosine antenna model.
+   * \param horizontalBeamwidthDegrees the horizontal beamwidth in degrees
+   */
+  void SetHorizontalBeamwidth (double horizontalBeamwidthDegrees);
+
+  /**
+   * Set the horizontal orientation of the antenna element.
+   * \param orientationDegrees the horizontal orientation in degrees
+   */
+  void SetOrientation (double orientationDegrees);
 
-  double m_orientationRadians;
+  /**
+   * Compute the exponent of the cosine antenna model from the beamwidth
+   * \param beamwidthRadians the beamwidth in degrees
+   * \return the exponent
+   */
+  static double GetExponentFromBeamwidth (double beamwidthDegrees);
+  
+  /**
+   * Compute the beamwidth of the cosine antenna model from the exponent
+   * \param exponent the exponent
+   * \return beamwidth in degrees
+   */
+  static double GetBeamwidthFromExponent (double exponent);
 
-  double m_maxGain;
+  double m_verticalExponent;            //!< exponent of the vertical direction
+  double m_horizontalExponent;          //!< exponent of the horizontal direction
+  double m_orientationRadians;          //!< orientation in radians in the horizontal direction (bearing)
+  double m_maxGain;                     //!< antenna gain in dB towards the main orientation
 };
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/model/parabolic-antenna-model.cc ns-3.34/src/antenna/model/parabolic-antenna-model.cc
--- ns-3.33/src/antenna/model/parabolic-antenna-model.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/model/parabolic-antenna-model.cc	2021-07-14 10:31:06.000000000 -0700
@@ -93,7 +93,7 @@
 {
   NS_LOG_FUNCTION (this << a);
   // azimuth angle w.r.t. the reference system of the antenna
-  double phi = a.phi - m_orientationRadians;
+  double phi = a.GetAzimuth () - m_orientationRadians;
 
   // make sure phi is in (-pi, pi]
   while (phi <= -M_PI)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/model/phased-array-model.cc ns-3.34/src/antenna/model/phased-array-model.cc
--- ns-3.33/src/antenna/model/phased-array-model.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/antenna/model/phased-array-model.cc	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,169 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+*   Copyright (c) 2020 University of Padova, Dep. of Information Engineering, SIGNET lab.
+*
+*   This program is free software; you can redistribute it and/or modify
+*   it under the terms of the GNU General Public License version 2 as
+*   published by the Free Software Foundation;
+*
+*   This program is distributed in the hope that it will be useful,
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*   GNU General Public License for more details.
+*
+*   You should have received a copy of the GNU General Public License
+*   along with this program; if not, write to the Free Software
+*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include "phased-array-model.h"
+#include <ns3/isotropic-antenna-model.h>
+#include <ns3/log.h>
+#include <ns3/double.h>
+#include <ns3/uinteger.h>
+#include <ns3/boolean.h>
+#include <ns3/pointer.h>
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("PhasedArrayModel");
+
+NS_OBJECT_ENSURE_REGISTERED (PhasedArrayModel);
+
+std::ostream&
+operator<< (std::ostream& os, const PhasedArrayModel::ComplexVector& cv)
+{
+  size_t N = cv.size ();
+
+  // empty
+  if (N == 0)
+    {
+      os << "[]";
+      return os;
+    }
+
+  // non-empty
+  os << "[";
+  for (std::size_t i = 0; i < N - 1; ++i)
+    {
+      os << cv[i] << ", ";
+    }
+  os << cv[N - 1] << "]";
+  return os;
+}
+
+PhasedArrayModel::PhasedArrayModel ()
+  : m_isBfVectorValid {false}
+{}
+
+
+PhasedArrayModel::~PhasedArrayModel ()
+{
+  m_beamformingVector.clear ();
+}
+
+
+TypeId
+PhasedArrayModel::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::PhasedArrayModel")
+    .SetParent<Object> ()
+    .SetGroupName ("Antenna")
+    .AddAttribute ("AntennaElement",
+                   "A pointer to the antenna element used by the phased array",
+                   PointerValue (CreateObject<IsotropicAntennaModel> ()),
+                   MakePointerAccessor (&PhasedArrayModel::m_antennaElement),
+                   MakePointerChecker<AntennaModel> ())
+  ;
+  return tid;
+}
+
+
+void
+PhasedArrayModel::SetBeamformingVector (const ComplexVector &beamformingVector)
+{
+  NS_LOG_FUNCTION (this << beamformingVector);
+  NS_ASSERT_MSG (beamformingVector.size () == GetNumberOfElements (),
+                 beamformingVector.size () << " != " << GetNumberOfElements ());
+  m_beamformingVector = beamformingVector;
+  m_isBfVectorValid = true;
+}
+
+
+PhasedArrayModel::ComplexVector
+PhasedArrayModel::GetBeamformingVector () const
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG (m_isBfVectorValid, "The beamforming vector should be Set before it's Get, and should refer to the current array configuration");
+  return m_beamformingVector;
+}
+
+
+double
+PhasedArrayModel::ComputeNorm (const ComplexVector &vector)
+{
+  double norm = 0;
+
+  for (uint64_t i = 0; i < vector.size (); i++)
+    {
+      norm += std::norm (vector[i]);
+    }
+
+  return std::sqrt (norm);
+
+}
+
+
+PhasedArrayModel::ComplexVector
+PhasedArrayModel::GetBeamformingVector (Angles a) const
+{
+  NS_LOG_FUNCTION (this << a);
+
+  ComplexVector beamformingVector = GetSteeringVector (a);
+  double norm = ComputeNorm (beamformingVector);
+
+  for (uint64_t i = 0; i < beamformingVector.size (); i++)
+    {
+      beamformingVector[i] = std::conj (beamformingVector[i]) / norm;
+    }
+
+  return beamformingVector;
+}
+
+
+
+PhasedArrayModel::ComplexVector
+PhasedArrayModel::GetSteeringVector (Angles a) const
+{
+  ComplexVector steeringVector;
+  steeringVector.resize (GetNumberOfElements ());
+  for (uint64_t i = 0; i < GetNumberOfElements (); i++)
+    {
+      Vector loc = GetElementLocation (i);
+      double phase = -2 * M_PI * (sin (a.GetInclination ()) * cos (a.GetAzimuth ()) * loc.x +
+                                  sin (a.GetInclination ()) * sin (a.GetAzimuth ()) * loc.y +
+                                  cos (a.GetInclination ()) * loc.z);
+      steeringVector[i] = std::polar<double> (1.0, phase);
+    }
+  return steeringVector;
+}
+
+
+void
+PhasedArrayModel::SetAntennaElement (Ptr<AntennaModel> antennaElement)
+{
+  NS_LOG_FUNCTION (this);
+  m_antennaElement = antennaElement;
+}
+
+
+Ptr<const AntennaModel>
+PhasedArrayModel::GetAntennaElement () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_antennaElement;
+}
+
+
+} /* namespace ns3 */
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/model/phased-array-model.h ns-3.34/src/antenna/model/phased-array-model.h
--- ns-3.33/src/antenna/model/phased-array-model.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/antenna/model/phased-array-model.h	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,145 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+*   Copyright (c) 2020 University of Padova, Dep. of Information Engineering, SIGNET lab.
+*
+*   This program is free software; you can redistribute it and/or modify
+*   it under the terms of the GNU General Public License version 2 as
+*   published by the Free Software Foundation;
+*
+*   This program is distributed in the hope that it will be useful,
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*   GNU General Public License for more details.
+*
+*   You should have received a copy of the GNU General Public License
+*   along with this program; if not, write to the Free Software
+*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef PHASED_ARRAY_MODEL_H
+#define PHASED_ARRAY_MODEL_H
+
+#include <ns3/object.h>
+#include <ns3/angles.h>
+#include <complex>
+#include <ns3/antenna-model.h>
+
+namespace ns3 {
+
+
+/**
+ * \ingroup antenna
+ *
+ * \brief Class implementing the phased array model virtual base class.
+ */
+class PhasedArrayModel : public Object
+{
+public:
+  /**
+   * Constructor
+   */
+  PhasedArrayModel (void);
+
+
+  /**
+   * Destructor
+   */
+  virtual ~PhasedArrayModel (void);
+
+
+  // inherited from Object
+  static TypeId GetTypeId (void);
+
+
+  typedef std::vector<std::complex<double> > ComplexVector; //!< type definition for complex vectors
+
+  /**
+   * Returns the horizontal and vertical components of the antenna element field
+   * pattern at the specified direction. Only vertical polarization is considered.
+   * \param a the angle indicating the interested direction
+   * \return a pair in which the first element is the horizontal component
+   *         of the field pattern and the second element is the vertical
+   *         component of the field pattern
+   */
+  virtual std::pair<double, double> GetElementFieldPattern (Angles a) const = 0;
+
+
+  /**
+   * Returns the location of the antenna element with the specified
+   * index, normalized with respect to the wavelength.
+   * \param idx index of the antenna element
+   * \return the 3D vector that represents the position of the element
+   */
+  virtual Vector GetElementLocation (uint64_t index) const = 0;
+
+
+  /**
+   * Returns the number of antenna elements
+   * \return the number of antenna elements
+   */
+  virtual uint64_t GetNumberOfElements (void) const = 0;
+
+
+  /**
+   * Sets the beamforming vector to be used
+   * \param beamformingVector the beamforming vector
+   */
+  void SetBeamformingVector (const ComplexVector &beamformingVector);
+
+
+  /**
+   * Returns the beamforming vector that is currently being used
+   * \return the current beamforming vector
+   */
+  ComplexVector GetBeamformingVector (void) const;
+
+
+  /**
+   * Returns the beamforming vector that points towards the specified position
+   * \param a the beamforming angle
+   * \return the beamforming vector
+   */
+  ComplexVector GetBeamformingVector (Angles a) const;
+
+
+  /**
+   * Returns the steering vector that points toward the specified position
+   * \param a the steering angle
+   * \return the steering vector
+   */
+  ComplexVector GetSteeringVector (Angles a) const;
+
+
+  /**
+   * Sets the antenna model to be used
+   * \param antennaElement the antenna model
+   */
+  void SetAntennaElement (Ptr<AntennaModel> antennaElement);
+
+
+  /**
+   * Returns a pointer to the AntennaModel instance used to model the elements of the array
+   * \return pointer to the AntennaModel instance
+   */
+  Ptr<const AntennaModel> GetAntennaElement (void) const;
+
+protected:
+  /**
+   * Utility method to compute the euclidean norm of a ComplexVector
+   * \param vector the ComplexVector
+   * \return the euclidean norm
+   */
+  static double ComputeNorm (const ComplexVector &vector);
+
+  ComplexVector m_beamformingVector; //!< the beamforming vector in use
+  Ptr<AntennaModel> m_antennaElement; //!< the model of the antenna element in use
+  bool m_isBfVectorValid; //!< ensures the validity of the beamforming vector
+
+};
+
+
+std::ostream& operator<< (std::ostream& os, const PhasedArrayModel::ComplexVector& cv);
+
+} /* namespace ns3 */
+
+#endif /* PHASED_ARRAY_MODEL_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/model/three-gpp-antenna-array-model.cc ns-3.34/src/antenna/model/three-gpp-antenna-array-model.cc
--- ns-3.33/src/antenna/model/three-gpp-antenna-array-model.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/model/three-gpp-antenna-array-model.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,221 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
-*   Copyright (c) 2019 SIGNET Lab, Department of Information Engineering,
-*   University of Padova
-*
-*   This program is free software; you can redistribute it and/or modify
-*   it under the terms of the GNU General Public License version 2 as
-*   published by the Free Software Foundation;
-*
-*   This program is distributed in the hope that it will be useful,
-*   but WITHOUT ANY WARRANTY; without even the implied warranty of
-*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*   GNU General Public License for more details.
-*
-*   You should have received a copy of the GNU General Public License
-*   along with this program; if not, write to the Free Software
-*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*
-*/
-
-#include "three-gpp-antenna-array-model.h"
-#include "ns3/log.h"
-#include "ns3/double.h"
-#include "ns3/uinteger.h"
-#include "ns3/boolean.h"
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("ThreeGppAntennaArrayModel");
-
-NS_OBJECT_ENSURE_REGISTERED (ThreeGppAntennaArrayModel);
-
-ThreeGppAntennaArrayModel::ThreeGppAntennaArrayModel (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_isOmniTx = false;
-}
-
-ThreeGppAntennaArrayModel::~ThreeGppAntennaArrayModel (void)
-{
-  NS_LOG_FUNCTION (this);
-}
-
-TypeId
-ThreeGppAntennaArrayModel::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ThreeGppAntennaArrayModel")
-    .SetParent<Object> ()
-    .AddConstructor<ThreeGppAntennaArrayModel> ()
-    .AddAttribute ("AntennaHorizontalSpacing",
-               "Horizontal spacing between antenna elements, in multiples of wave length",
-               DoubleValue (0.5),
-               MakeDoubleAccessor (&ThreeGppAntennaArrayModel::m_disH),
-               MakeDoubleChecker<double> ())
-    .AddAttribute ("AntennaVerticalSpacing",
-               "Vertical spacing between antenna elements, in multiples of wave length",
-               DoubleValue (0.5),
-               MakeDoubleAccessor (&ThreeGppAntennaArrayModel::m_disV),
-               MakeDoubleChecker<double> ())
-    .AddAttribute ("NumColumns",
-               "Horizontal size of the array",
-               UintegerValue (4),
-               MakeUintegerAccessor (&ThreeGppAntennaArrayModel::m_numColumns),
-               MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("NumRows",
-               "Vertical size of the array",
-               UintegerValue (4),
-               MakeUintegerAccessor (&ThreeGppAntennaArrayModel::m_numRows),
-               MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("BearingAngle",
-               "The bearing angle in radians",
-               DoubleValue (0.0),
-               MakeDoubleAccessor (&ThreeGppAntennaArrayModel::m_alpha),
-               MakeDoubleChecker<double> (-M_PI, M_PI))
-    .AddAttribute ("DowntiltAngle",
-               "The downtilt angle in radians",
-               DoubleValue (0.0),
-               MakeDoubleAccessor (&ThreeGppAntennaArrayModel::m_beta),
-               MakeDoubleChecker<double> (0, M_PI))
-    .AddAttribute ("ElementGain",
-               "Directional gain of an antenna element in dBi",
-               DoubleValue (4.97),
-               MakeDoubleAccessor (&ThreeGppAntennaArrayModel::m_gE),
-               MakeDoubleChecker<double> (0, 8))
-    .AddAttribute ("IsotropicElements",
-               "If true, use an isotropic radiation pattern (for testing purposes)",
-               BooleanValue (false),
-               MakeBooleanAccessor (&ThreeGppAntennaArrayModel::m_isIsotropic),
-               MakeBooleanChecker ())
-  ;
-  return tid;
-}
-
-bool
-ThreeGppAntennaArrayModel::IsOmniTx (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_isOmniTx;
-}
-
-void
-ThreeGppAntennaArrayModel::ChangeToOmniTx (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_isOmniTx = true;
-}
-
-void
-ThreeGppAntennaArrayModel::SetBeamformingVector (const ComplexVector &beamformingVector)
-{
-  NS_LOG_FUNCTION (this);
-  m_isOmniTx = false;
-  m_beamformingVector = beamformingVector;
-}
-
-const ThreeGppAntennaArrayModel::ComplexVector &
-ThreeGppAntennaArrayModel::GetBeamformingVector(void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_beamformingVector;
-}
-
-std::pair<double, double>
-ThreeGppAntennaArrayModel::GetElementFieldPattern (Angles a) const
-{
-  NS_LOG_FUNCTION (this);
-
-  // normalize phi (if needed)
-  a.phi = fmod (a.phi + M_PI, 2 * M_PI);
-  if (a.phi < 0)
-      a.phi += M_PI;
-  else 
-      a.phi -= M_PI;
-
-  NS_ASSERT_MSG (a.theta >= 0 && a.theta <= M_PI, "The vertical angle should be between 0 and M_PI");
-  NS_ASSERT_MSG (a.phi >= -M_PI && a.phi <= M_PI, "The horizontal angle should be between -M_PI and M_PI");
-
-  // convert the theta and phi angles from GCS to LCS using eq. 7.1-7 and 7.1-8 in 3GPP TR 38.901
-  // NOTE we assume a fixed slant angle of 0 degrees
-  double thetaPrime = std::acos (cos (m_beta)*cos (a.theta) + sin (m_beta)*cos (a.phi-m_alpha)*sin (a.theta));
-  double phiPrime = std::arg (std::complex<double> (cos (m_beta)*sin (a.theta)*cos (a.phi-m_alpha) - sin (m_beta)*cos (a.theta), sin (a.phi-m_alpha)*sin (a.theta)));
-  NS_LOG_DEBUG (a.theta << " " << thetaPrime << " " << a.phi << " " << phiPrime);
-
-  double aPrimeDb = GetRadiationPattern (thetaPrime, phiPrime);
-  double aPrime = pow (10, aPrimeDb / 10); // convert to linear
-
-  // compute psi using eq. 7.1-15 in 3GPP TR 38.901, assuming that the slant 
-  // angle (gamma) is 0
-  double psi = std::arg (std::complex<double> (cos (m_beta) * sin (a.theta) - sin (m_beta) * cos (a.theta)* cos (a.phi - m_alpha), sin (m_beta)* sin (a.phi-m_alpha)));
-  NS_LOG_DEBUG ("psi " << psi);
-
-  // compute the antenna element field pattern in the vertical polarization using
-  // eq. 7.3-4 in 3GPP TR 38.901
-  // NOTE we assume vertical polarization, hence the field pattern in the
-  // horizontal polarization is 0
-  double fieldThetaPrime = std::sqrt (aPrime);
-
-  // convert the antenna element field pattern to GCS using eq. 7.1-11
-  // in 3GPP TR 38.901
-  double fieldTheta = cos (psi) * fieldThetaPrime;
-  double fieldPhi = sin (psi) * fieldThetaPrime;
-  NS_LOG_DEBUG (a.phi/M_PI*180 << " " << a.theta/M_PI*180 << " " << fieldTheta*fieldTheta + fieldPhi*fieldPhi);
-
-  return std::make_pair (fieldPhi, fieldTheta);
-}
-
-double
-ThreeGppAntennaArrayModel::GetRadiationPattern (double thetaRadian, double phiRadian) const
-{
-  if (m_isIsotropic)
-  {
-    return 0;
-  }
-
-  // convert the angles in degrees
-  double thetaDeg = thetaRadian * 180 / M_PI;
-  double phiDeg = phiRadian * 180 / M_PI;
-  NS_ASSERT_MSG (thetaDeg >= 0 && thetaDeg <= 180, "the vertical angle should be the range of [0,180]");
-  NS_ASSERT_MSG (phiDeg >= -180 && phiDeg <= 180, "the horizontal angle should be the range of [-180,180]");
-
-  // compute the radiation power pattern using equations in table 7.3-1 in
-  // 3GPP TR 38.901
-  double A_M = 30; // front-back ratio expressed in dB
-  double SLA = 30; // side-lobe level limit expressed in dB
-
-  double A_v = -1 * std::min (SLA,12 * pow ((thetaDeg - 90) / 65,2)); // vertical cut of the radiation power pattern (dB)
-  double A_h = -1 * std::min (A_M,12 * pow (phiDeg / 65,2)); // horizontal cut of the radiation power pattern (dB)
-
-  double A = m_gE - 1 * std::min (A_M,- A_v - A_h); // 3D radiation power pattern (dB)
-
-  return A; // 3D radiation power pattern in dB
-}
-
-Vector
-ThreeGppAntennaArrayModel::GetElementLocation (uint64_t index) const
-{
-  NS_LOG_FUNCTION (this);
-
-  // compute the element coordinates in the LCS
-  // assume the left bottom corner is (0,0,0), and the rectangular antenna array is on the y-z plane.
-  double xPrime = 0;
-  double yPrime = m_disH * (index % m_numColumns);
-  double zPrime = m_disV * floor (index / m_numColumns);
-
-  // convert the coordinates to the GCS using the rotation matrix 7.1-4 in 3GPP
-  // TR 38.901
-  Vector loc;
-  loc.x = cos(m_alpha)*cos (m_beta)*xPrime - sin (m_alpha)*yPrime + cos (m_alpha)*sin (m_beta)*zPrime;
-  loc.y = sin (m_alpha)*cos(m_beta)*xPrime + cos (m_alpha)*yPrime + sin (m_alpha)*sin (m_beta)*zPrime;
-  loc.z = -sin (m_beta)*xPrime+cos(m_beta)*zPrime;
-  return loc;
-}
-
-uint64_t
-ThreeGppAntennaArrayModel::GetNumberOfElements (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_numRows * m_numColumns;
-}
-
-} /* namespace ns3 */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/model/three-gpp-antenna-array-model.h ns-3.34/src/antenna/model/three-gpp-antenna-array-model.h
--- ns-3.33/src/antenna/model/three-gpp-antenna-array-model.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/model/three-gpp-antenna-array-model.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,135 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
-*   Copyright (c) 2019 SIGNET Lab, Department of Information Engineering,
-*   University of Padova
-*
-*   This program is free software; you can redistribute it and/or modify
-*   it under the terms of the GNU General Public License version 2 as
-*   published by the Free Software Foundation;
-*
-*   This program is distributed in the hope that it will be useful,
-*   but WITHOUT ANY WARRANTY; without even the implied warranty of
-*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*   GNU General Public License for more details.
-*
-*   You should have received a copy of the GNU General Public License
-*   along with this program; if not, write to the Free Software
-*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*
-*/
-
-#ifndef THREE_GPP_ANTENNA_ARRAY_MODEL_H_
-#define THREE_GPP_ANTENNA_ARRAY_MODEL_H_
-
-#include <ns3/antenna-model.h>
-#include <complex>
-
-namespace ns3 {
-
-/**
- * \ingroup antenna
- *
- * \brief Class implementing the antenna model defined in 3GPP TR 38.901 V15.0.0
- * 
- * \note the current implementation supports the modeling of antenna arrays 
- * composed of a single panel and with single (vertical) polarization.
- */
-class ThreeGppAntennaArrayModel : public Object
-{
-public:
-
-  /**
-   * Constructor
-   */
-  ThreeGppAntennaArrayModel (void);
-
-  /**
-   * Destructor
-   */
-  virtual ~ThreeGppAntennaArrayModel (void);
-
-  // inherited from Object
-  static TypeId GetTypeId (void);
-
-  typedef std::vector<std::complex<double> > ComplexVector; //!< type definition for complex vectors
-
-  /**
-   * Returns the horizontal and vertical components of the antenna element field
-   * pattern at the specified direction. Only vertical polarization is considered.
-   * \param a the angle indicating the interested direction
-   * \return a pair in which the first element is the horizontal component
-   *         of the field pattern and the second element is the vertical
-   *         component of the field pattern
-   */
-  std::pair<double, double> GetElementFieldPattern (Angles a) const;
-
-  /**
-   * Returns the location of the antenna element with the specified
-   * index assuming the left bottom corner is (0,0,0), normalized
-   * with respect to the wavelength.
-   * Antenna elements are scanned row by row, left to right and bottom to top.
-   * For example, an antenna with 2 rows and 3 columns will be ordered as follows:
-   * ^ z
-   * |  3 4 5
-   * |  0 1 2
-   * ----------> y
-   *
-   * \param index index of the antenna element
-   * \return the 3D vector that represents the position of the element
-   */
-  virtual Vector GetElementLocation (uint64_t index) const;
-
-  /**
-   * Returns the number of antenna elements
-   * \return the number of antenna elements
-   */
-  virtual uint64_t GetNumberOfElements (void) const;
-
-  /**
-   * Returns true if the antenna is configured for omnidirectional transmissions
-   * \return whether the transmission is set to omni
-   */
-  bool IsOmniTx (void) const;
-
-  /**
-   * Change the antenna model to omnidirectional (ignoring the beams)
-   */
-  void ChangeToOmniTx (void);
-
-  /**
-   * Sets the beamforming vector to be used
-   * \param beamformingVector the beamforming vector
-   */
-  void SetBeamformingVector (const ComplexVector &beamformingVector);
-
-  /**
-   * Returns the beamforming vector that is currently being used
-   * \return the current beamforming vector
-   */
-  const ComplexVector & GetBeamformingVector (void) const;
-
-private:
-  /**
-   * Returns the radiation power pattern of a single antenna element in dB,
-   * generated according to Table 7.3-1 in 3GPP TR 38.901
-   * \param vAngleRadian the vertical angle in radians
-   * \param hAngleRadian the horizontal angle in radians
-   * \return the radiation power pattern in dB
-   */
-  double GetRadiationPattern (double vAngleRadian, double hAngleRadian) const;
-
-  bool m_isOmniTx; //!< true if the antenna is configured for omni transmissions
-  ComplexVector m_beamformingVector; //!< the beamforming vector in use
-  uint32_t m_numColumns; //!< number of columns
-  uint32_t m_numRows; //!< number of rows
-  double m_disV; //!< antenna spacing in the vertical direction in multiples of wave length
-  double m_disH; //!< antenna spacing in the horizontal direction in multiples of wave length
-  double m_alpha; //!< the bearing angle in radians
-  double m_beta; //!< the downtilt angle in radians
-  double m_gE; //!< directional gain of a single antenna element (dBi)
-  bool m_isIsotropic; //!< if true, antenna elements are isotropic
-};
-
-} /* namespace ns3 */
-
-#endif /* SRC_THREE_GPP_ANTENNA_ARRAY_MODEL_H_ */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/model/three-gpp-antenna-model.cc ns-3.34/src/antenna/model/three-gpp-antenna-model.cc
--- ns-3.33/src/antenna/model/three-gpp-antenna-model.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/antenna/model/three-gpp-antenna-model.cc	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,118 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 University of Padova, Dep. of Information Engineering, SIGNET lab.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#include <ns3/log.h>
+#include <ns3/double.h>
+#include <cmath>
+#include "antenna-model.h"
+#include "three-gpp-antenna-model.h"
+
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("ThreeGppAntennaModel");
+
+NS_OBJECT_ENSURE_REGISTERED (ThreeGppAntennaModel);
+
+
+TypeId
+ThreeGppAntennaModel::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::ThreeGppAntennaModel")
+    .SetParent<AntennaModel> ()
+    .SetGroupName ("Antenna")
+    .AddConstructor<ThreeGppAntennaModel> ()
+  ;
+  return tid;
+}
+
+ThreeGppAntennaModel::ThreeGppAntennaModel (void)
+  : m_verticalBeamwidthDegrees {65},
+    m_horizontalBeamwidthDegrees {65},
+    m_aMax {30},
+    m_slaV {30},
+    m_geMax {8.0}
+{}
+
+
+ThreeGppAntennaModel::~ThreeGppAntennaModel (void)
+{}
+
+
+double
+ThreeGppAntennaModel::GetVerticalBeamwidth () const
+{
+  return m_verticalBeamwidthDegrees;
+}
+
+
+double
+ThreeGppAntennaModel::GetHorizontalBeamwidth () const
+{
+  return m_horizontalBeamwidthDegrees;
+}
+
+
+double
+ThreeGppAntennaModel::GetSlaV () const
+{
+  return m_slaV;
+}
+
+
+double
+ThreeGppAntennaModel::GetMaxAttenuation () const
+{
+  return m_aMax;
+}
+
+
+double
+ThreeGppAntennaModel::GetAntennaElementGain () const
+{
+  return m_geMax;
+}
+
+
+double
+ThreeGppAntennaModel::GetGainDb (Angles a)
+{
+  NS_LOG_FUNCTION (this << a);
+
+  double phiDeg = RadiansToDegrees (a.GetAzimuth ());
+  double thetaDeg = RadiansToDegrees (a.GetInclination ());
+
+  NS_ASSERT_MSG (-180.0 <= phiDeg && phiDeg <= 180.0, "Out of boundaries: phiDeg=" << phiDeg);
+  NS_ASSERT_MSG (0.0 <= thetaDeg && thetaDeg <= 180.0, "Out of boundaries: thetaDeg=" << thetaDeg);
+
+  // compute the radiation power pattern using equations in table 7.3-1 in
+  // 3GPP TR 38.901
+  double vertGain = -std::min (m_slaV, 12 * pow ((thetaDeg - 90) / m_verticalBeamwidthDegrees, 2)); // vertical cut of the radiation power pattern (dB)
+  double horizGain = -std::min (m_aMax, 12 * pow (phiDeg / m_horizontalBeamwidthDegrees, 2)); // horizontal cut of the radiation power pattern (dB)
+
+  double gainDb = m_geMax - std::min (m_aMax, -(vertGain + horizGain));  // 3D radiation power pattern (dB)
+
+  NS_LOG_DEBUG ("gain=" << gainDb << " dB");
+  return gainDb;
+
+}
+
+
+}
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/model/three-gpp-antenna-model.h ns-3.34/src/antenna/model/three-gpp-antenna-model.h
--- ns-3.33/src/antenna/model/three-gpp-antenna-model.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/antenna/model/three-gpp-antenna-model.h	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,90 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 University of Padova, Dep. of Information Engineering, SIGNET lab.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef THREE_GPP_ANTENNA_MODEL_H
+#define THREE_GPP_ANTENNA_MODEL_H
+
+
+#include <ns3/object.h>
+#include <ns3/antenna-model.h>
+
+namespace ns3 {
+
+/**
+ *
+ * \brief  Antenna model based on a parabolic approximation of the main lobe radiation pattern.
+ *
+ * This class implements the parabolic model as described in 3GPP TR 38.901 v15.0.0
+ *
+ */
+class ThreeGppAntennaModel : public AntennaModel
+{
+public:
+  ThreeGppAntennaModel (void);
+  virtual ~ThreeGppAntennaModel (void) override;
+
+  // inherited from Object
+  static TypeId GetTypeId ();
+
+  // inherited from AntennaModel
+  virtual double GetGainDb (Angles a) override;
+
+  /**
+   * Get the vertical beamwidth of the antenna element.
+   * \return the vertical beamwidth in degrees
+   */
+  double GetVerticalBeamwidth () const;
+
+  /**
+   * Get the horizontal beamwidth of the antenna element.
+   * \return the horizontal beamwidth in degrees
+   */
+  double GetHorizontalBeamwidth () const;
+
+  /**
+   * Get the side-lobe attenuation in the vertical direction of the antenna element.
+   * \return side-lobe attenuation in the vertical direction in dB
+   */
+  double GetSlaV () const;
+
+  /**
+   * Get the naximum attenuation of the antenna element.
+   * \return the naximum attenuation in dB
+   */
+  double GetMaxAttenuation () const;
+
+  /**
+   * Get the maximum directional gain of the antenna element.
+   * \return the maximum directional gain in dBi
+   */
+  double GetAntennaElementGain () const;
+
+private:
+  double m_verticalBeamwidthDegrees;    //!< beamwidth in the vertical direction (\theta_{3dB}) [deg]
+  double m_horizontalBeamwidthDegrees;  //!< beamwidth in the horizontal direction (\phi_{3dB}) [deg]
+  double m_aMax;                        //!< maximum attenuation (A_{max}) [dB]
+  double m_slaV;                        //!< side-lobe attenuation in the vertical direction (SLA_V) [dB]
+  double m_geMax;                       //!< maximum directional gain of the antenna element (G_{E,max}) [dBi]
+};
+
+
+
+} // namespace ns3
+
+
+#endif // THREE_GPP_ANTENNA_MODEL_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/model/uniform-planar-array.cc ns-3.34/src/antenna/model/uniform-planar-array.cc
--- ns-3.33/src/antenna/model/uniform-planar-array.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/antenna/model/uniform-planar-array.cc	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,233 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+*   Copyright (c) 2020 University of Padova, Dep. of Information Engineering, SIGNET lab.
+*
+*   This program is free software; you can redistribute it and/or modify
+*   it under the terms of the GNU General Public License version 2 as
+*   published by the Free Software Foundation;
+*
+*   This program is distributed in the hope that it will be useful,
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*   GNU General Public License for more details.
+*
+*   You should have received a copy of the GNU General Public License
+*   along with this program; if not, write to the Free Software
+*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+
+#include "uniform-planar-array.h"
+#include <ns3/log.h>
+#include <ns3/double.h>
+#include <ns3/uinteger.h>
+#include <ns3/boolean.h>
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("UniformPlanarArray");
+
+NS_OBJECT_ENSURE_REGISTERED (UniformPlanarArray);
+
+
+
+UniformPlanarArray::UniformPlanarArray ()
+  : PhasedArrayModel (),
+    m_numColumns {1},
+    m_numRows {1},
+    m_disV {0.5},
+    m_disH {0.5},
+    m_alpha {0},
+    m_beta {0}
+{}
+
+UniformPlanarArray::~UniformPlanarArray ()
+{}
+
+TypeId
+UniformPlanarArray::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::UniformPlanarArray")
+    .SetParent<PhasedArrayModel> ()
+    .AddConstructor<UniformPlanarArray> ()
+    .SetGroupName ("Antenna")
+    .AddAttribute ("AntennaHorizontalSpacing",
+                   "Horizontal spacing between antenna elements, in multiples of wave length",
+                   DoubleValue (0.5),
+                   MakeDoubleAccessor (&UniformPlanarArray::SetAntennaHorizontalSpacing,
+                                       &UniformPlanarArray::GetAntennaHorizontalSpacing),
+                   MakeDoubleChecker<double> (0.0))
+    .AddAttribute ("AntennaVerticalSpacing",
+                   "Vertical spacing between antenna elements, in multiples of wave length",
+                   DoubleValue (0.5),
+                   MakeDoubleAccessor (&UniformPlanarArray::SetAntennaVerticalSpacing,
+                                       &UniformPlanarArray::GetAntennaVerticalSpacing),
+                   MakeDoubleChecker<double> (0.0))
+    .AddAttribute ("NumColumns",
+                   "Horizontal size of the array",
+                   UintegerValue (4),
+                   MakeUintegerAccessor (&UniformPlanarArray::SetNumColumns,
+                                         &UniformPlanarArray::GetNumColumns),
+                   MakeUintegerChecker<uint32_t> (1))
+    .AddAttribute ("NumRows",
+                   "Vertical size of the array",
+                   UintegerValue (4),
+                   MakeUintegerAccessor (&UniformPlanarArray::SetNumRows,
+                                         &UniformPlanarArray::GetNumRows),
+                   MakeUintegerChecker<uint32_t> (1))
+    .AddAttribute ("BearingAngle",
+                   "The bearing angle in radians",
+                   DoubleValue (0.0),
+                   MakeDoubleAccessor (&UniformPlanarArray::m_alpha),
+                   MakeDoubleChecker<double> (-M_PI, M_PI))
+    .AddAttribute ("DowntiltAngle",
+                   "The downtilt angle in radians",
+                   DoubleValue (0.0),
+                   MakeDoubleAccessor (&UniformPlanarArray::m_beta),
+                   MakeDoubleChecker<double> (-M_PI, M_PI))
+  ;
+  return tid;
+}
+
+
+void
+UniformPlanarArray::SetNumColumns (uint32_t n)
+{
+  NS_LOG_FUNCTION (this << n);
+  if (n != m_numColumns)
+    {
+      m_isBfVectorValid = false;
+    }
+  m_numColumns = n;
+}
+
+
+uint32_t
+UniformPlanarArray::GetNumColumns (void) const
+{
+  return m_numColumns;
+}
+
+
+void
+UniformPlanarArray::SetNumRows (uint32_t n)
+{
+  NS_LOG_FUNCTION (this << n);
+  if (n != m_numRows)
+    {
+      m_isBfVectorValid = false;
+    }
+  m_numRows = n;
+}
+
+
+uint32_t
+UniformPlanarArray::GetNumRows (void) const
+{
+  return m_numRows;
+}
+
+
+void
+UniformPlanarArray::SetAntennaHorizontalSpacing (double s)
+{
+  NS_LOG_FUNCTION (this << s);
+  NS_ABORT_MSG_IF (s <= 0, "Trying to set an invalid spacing: " << s);
+
+  if (s != m_disH)
+    {
+      m_isBfVectorValid = false;
+    }
+  m_disH = s;
+}
+
+
+double
+UniformPlanarArray::GetAntennaHorizontalSpacing (void) const
+{
+  return m_disH;
+}
+
+
+void
+UniformPlanarArray::SetAntennaVerticalSpacing (double s)
+{
+  NS_LOG_FUNCTION (this << s);
+  NS_ABORT_MSG_IF (s <= 0, "Trying to set an invalid spacing: " << s);
+
+  if (s != m_disV)
+    {
+      m_isBfVectorValid = false;
+    }
+  m_disV = s;
+}
+
+
+double
+UniformPlanarArray::GetAntennaVerticalSpacing (void) const
+{
+  return m_disV;
+}
+
+
+std::pair<double, double>
+UniformPlanarArray::GetElementFieldPattern (Angles a) const
+{
+  NS_LOG_FUNCTION (this << a);
+
+  // convert the theta and phi angles from GCS to LCS using eq. 7.1-7 and 7.1-8 in 3GPP TR 38.901
+  // NOTE we assume a fixed slant angle of 0 degrees
+  double thetaPrime = std::acos (cos (m_beta) * cos (a.GetInclination ()) + sin (m_beta) * cos (a.GetAzimuth () - m_alpha) * sin (a.GetInclination ()));
+  double phiPrime = std::arg (std::complex<double> (cos (m_beta) * sin (a.GetInclination ()) * cos (a.GetAzimuth () - m_alpha) - sin (m_beta) * cos (a.GetInclination ()), sin (a.GetAzimuth () - m_alpha) * sin (a.GetInclination ())));
+  Angles aPrime (phiPrime, thetaPrime);
+  NS_LOG_DEBUG (a << " -> " << aPrime);
+
+  // compute the antenna element field pattern in the vertical polarization using
+  // eq. 7.3-4 in 3GPP TR 38.901
+  // NOTE we assume vertical polarization, hence the field pattern in the
+  // horizontal polarization is 0
+  double aPrimeDb = m_antennaElement->GetGainDb (aPrime);
+  double fieldThetaPrime = pow (10, aPrimeDb / 20); // convert to linear magnitude
+
+  // compute psi using eq. 7.1-15 in 3GPP TR 38.901, assuming that the slant
+  // angle (gamma) is 0
+  double psi = std::arg (std::complex<double> (cos (m_beta) * sin (a.GetInclination ()) - sin (m_beta) * cos (a.GetInclination ()) * cos (a.GetAzimuth () - m_alpha), sin (m_beta) * sin (a.GetAzimuth () - m_alpha)));
+  NS_LOG_DEBUG ("psi " << psi);
+
+  // convert the antenna element field pattern to GCS using eq. 7.1-11
+  // in 3GPP TR 38.901
+  double fieldTheta = cos (psi) * fieldThetaPrime;
+  double fieldPhi = sin (psi) * fieldThetaPrime;
+  NS_LOG_DEBUG (RadiansToDegrees (a.GetAzimuth ()) << " " << RadiansToDegrees (a.GetInclination ()) << " " << fieldTheta * fieldTheta + fieldPhi * fieldPhi);
+
+  return std::make_pair (fieldPhi, fieldTheta);
+}
+
+
+Vector
+UniformPlanarArray::GetElementLocation (uint64_t index) const
+{
+  NS_LOG_FUNCTION (this << index);
+
+  // compute the element coordinates in the LCS
+  // assume the left bottom corner is (0,0,0), and the rectangular antenna array is on the y-z plane.
+  double xPrime = 0;
+  double yPrime = m_disH * (index % m_numColumns);
+  double zPrime = m_disV * floor (index / m_numColumns);
+
+  // convert the coordinates to the GCS using the rotation matrix 7.1-4 in 3GPP
+  // TR 38.901
+  Vector loc;
+  loc.x = cos (m_alpha) * cos (m_beta) * xPrime - sin (m_alpha) * yPrime + cos (m_alpha) * sin (m_beta) * zPrime;
+  loc.y = sin (m_alpha) * cos (m_beta) * xPrime + cos (m_alpha) * yPrime + sin (m_alpha) * sin (m_beta) * zPrime;
+  loc.z = -sin (m_beta) * xPrime + cos (m_beta) * zPrime;
+  return loc;
+}
+
+uint64_t
+UniformPlanarArray::GetNumberOfElements () const
+{
+  return m_numRows * m_numColumns;
+}
+
+} /* namespace ns3 */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/model/uniform-planar-array.h ns-3.34/src/antenna/model/uniform-planar-array.h
--- ns-3.33/src/antenna/model/uniform-planar-array.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/antenna/model/uniform-planar-array.h	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,166 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+*   Copyright (c) 2020 University of Padova, Dep. of Information Engineering, SIGNET lab.
+*
+*   This program is free software; you can redistribute it and/or modify
+*   it under the terms of the GNU General Public License version 2 as
+*   published by the Free Software Foundation;
+*
+*   This program is distributed in the hope that it will be useful,
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*   GNU General Public License for more details.
+*
+*   You should have received a copy of the GNU General Public License
+*   along with this program; if not, write to the Free Software
+*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef UNIFORM_PLANAR_ARRAY_H
+#define UNIFORM_PLANAR_ARRAY_H
+
+
+#include <ns3/object.h>
+#include <ns3/phased-array-model.h>
+
+
+namespace ns3 {
+
+
+/**
+ * \ingroup antenna
+ *
+ * \brief Class implementing Uniform Planar Array (UPA) model.
+ *
+ * \note the current implementation supports the modeling of antenna arrays
+ * composed of a single panel and with single (vertical) polarization.
+ */
+class UniformPlanarArray : public PhasedArrayModel
+{
+public:
+  /**
+   * Constructor
+   */
+  UniformPlanarArray (void);
+
+
+  /**
+   * Destructor
+   */
+  virtual ~UniformPlanarArray (void);
+
+
+  // inherited from Object
+  static TypeId GetTypeId (void);
+
+
+  /**
+   * Returns the horizontal and vertical components of the antenna element field
+   * pattern at the specified direction. Only vertical polarization is considered.
+   * \param a the angle indicating the interested direction
+   * \return a pair in which the first element is the horizontal component
+   *         of the field pattern and the second element is the vertical
+   *         component of the field pattern
+   */
+  std::pair<double, double> GetElementFieldPattern (Angles a) const override;
+
+
+  /**
+  * Returns the location of the antenna element with the specified
+  * index assuming the left bottom corner is (0,0,0), normalized
+  * with respect to the wavelength.
+  * Antenna elements are scanned row by row, left to right and bottom to top.
+  * For example, an antenna with 2 rows and 3 columns will be ordered as follows:
+  * ^ z
+  * |  3 4 5
+  * |  0 1 2
+  * ----------> y
+  *
+  * \param index index of the antenna element
+  * \return the 3D vector that represents the position of the element
+  */
+  Vector GetElementLocation (uint64_t index) const override;
+
+  /**
+   * Returns the number of antenna elements
+   * \return the number of antenna elements
+   */
+  uint64_t GetNumberOfElements (void) const override;
+
+private:
+  /**
+   * Set the number of columns of the phased array
+   * This method resets the stored beamforming vector to a ComplexVector
+   * of the correct size, but zero-filled
+   * \param n the number of columns
+   */
+  void SetNumColumns (uint32_t n);
+
+
+  /**
+   * Get the number of columns of the phased array
+   * \return the number of columns
+   */
+  uint32_t GetNumColumns (void) const;
+
+
+  /**
+   * Set the number of rows of the phased array
+   * This method resets the stored beamforming vector to a ComplexVector
+   * of the correct size, but zero-filled
+   * \param n the number of rows
+   */
+  void SetNumRows (uint32_t n);
+
+
+  /**
+   * Get the number of rows of the phased array
+   * \return the number of rows
+   */
+  uint32_t GetNumRows (void) const;
+
+
+  /**
+   * Set the horizontal spacing for the antenna elements of the phased array
+   * This method resets the stored beamforming vector to a ComplexVector
+   * of the correct size, but zero-filled
+   * \param s the horizontal spacing in multiples of wavelength
+   */
+  void SetAntennaHorizontalSpacing (double s);
+
+
+  /**
+   * Get the horizontal spacing for the antenna elements of the phased array
+   * \return the horizontal spacing in multiples of wavelength
+   */
+  double GetAntennaHorizontalSpacing (void) const;
+
+
+  /**
+   * Set the vertical spacing for the antenna elements of the phased array
+   * This method resets the stored beamforming vector to a ComplexVector
+   * of the correct size, but zero-filled
+   * \param s the vertical spacing in multiples of wavelength
+   */
+  void SetAntennaVerticalSpacing (double s);
+
+
+  /**
+   * Get the vertical spacing for the antenna elements of the phased array
+   * \return the vertical spacing in multiples of wavelength
+   */
+  double GetAntennaVerticalSpacing (void) const;
+
+
+  uint32_t m_numColumns; //!< number of columns
+  uint32_t m_numRows; //!< number of rows
+  double m_disV; //!< antenna spacing in the vertical direction in multiples of wave length
+  double m_disH; //!< antenna spacing in the horizontal direction in multiples of wave length
+  double m_alpha; //!< the bearing angle in radians
+  double m_beta; //!< the downtilt angle in radians
+
+};
+
+} /* namespace ns3 */
+
+#endif /* UNIFORM_PLANAR_ARRAY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/test/test-angles.cc ns-3.34/src/antenna/test/test-angles.cc
--- ns-3.33/src/antenna/test/test-angles.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/test/test-angles.cc	2021-07-14 10:31:06.000000000 -0700
@@ -44,7 +44,7 @@
 std::string OneVectorConstructorTestCase::BuildNameString (Vector v)
 {
   std::ostringstream oss;
-  oss <<  " v = " << v;
+  oss << " v = " << v;
   return oss.str ();
 }
 
@@ -53,15 +53,14 @@
   : TestCase (BuildNameString (v)),
     m_v (v),
     m_a (a)
-{
-}
+{}
 
 void
 OneVectorConstructorTestCase::DoRun ()
 {
   Angles a (m_v);
-  NS_TEST_EXPECT_MSG_EQ_TOL ( a.phi, m_a.phi, 1e-10, "incorrect phi");
-  NS_TEST_EXPECT_MSG_EQ_TOL ( a.theta, m_a.theta, 1e-10, "incorrect theta");
+  NS_TEST_EXPECT_MSG_EQ_TOL ( a.GetAzimuth (), m_a.GetAzimuth (), 1e-10, "incorrect phi");
+  NS_TEST_EXPECT_MSG_EQ_TOL ( a.GetInclination (), m_a.GetInclination (), 1e-10, "incorrect theta");
 }
 
 
@@ -85,7 +84,7 @@
 std::string TwoVectorsConstructorTestCase::BuildNameString (Vector v, Vector o)
 {
   std::ostringstream oss;
-  oss <<  " v = " << v << ", o = " << o;
+  oss << " v = " << v << ", o = " << o;
   return oss.str ();
 }
 
@@ -95,15 +94,14 @@
     m_v (v),
     m_o (o),
     m_a (a)
-{
-}
+{}
 
 void
 TwoVectorsConstructorTestCase::DoRun ()
 {
   Angles a (m_v, m_o);
-  NS_TEST_EXPECT_MSG_EQ_TOL ( a.phi, m_a.phi, 1e-10, "incorrect phi");
-  NS_TEST_EXPECT_MSG_EQ_TOL ( a.theta, m_a.theta, 1e-10, "incorrect theta");
+  NS_TEST_EXPECT_MSG_EQ_TOL ( a.GetAzimuth (), m_a.GetAzimuth (), 1e-10, "incorrect phi");
+  NS_TEST_EXPECT_MSG_EQ_TOL ( a.GetInclination (), m_a.GetInclination (), 1e-10, "incorrect theta");
 }
 
 
@@ -120,92 +118,92 @@
 AnglesTestSuite::AnglesTestSuite ()
   : TestSuite ("angles", UNIT)
 {
-  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 0, 0),     Angles (0, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 0, 0),    Angles (M_PI, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 1, 0),     Angles (M_PI_2, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (0, -1, 0),    Angles (-M_PI_2, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 0, 1),     Angles (0, 0)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 0, -1),    Angles (0, M_PI)), TestCase::QUICK);
-
-  AddTestCase (new OneVectorConstructorTestCase (Vector (2, 0, 0),     Angles (0, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (-2, 0, 0),    Angles (M_PI, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 2, 0),     Angles (M_PI_2, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (0, -2, 0),    Angles (-M_PI_2, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 0, 2),     Angles (0, 0)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 0, -2),    Angles (0, M_PI)), TestCase::QUICK);
-
-  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 0, 1),     Angles (0, M_PI_4)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 0, -1),    Angles (0, 3*M_PI_4)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 1, 0),     Angles (M_PI_4, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (1, -1, 0),    Angles (-M_PI_4, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 0, 1),    Angles (M_PI, M_PI_4)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 0, -1),   Angles (M_PI, 3*M_PI_4)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 1, 0),    Angles (3*M_PI_4, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, -1, 0),   Angles (-3*M_PI_4, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 1, 1),     Angles (M_PI_2, M_PI_4)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 1, -1),    Angles (M_PI_2, 3*M_PI_4)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (0, -1, 1),    Angles (-M_PI_2, M_PI_4)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (0, -1, -1),   Angles (-M_PI_2, 3*M_PI_4)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 0, 0), Angles (0, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 0, 0), Angles (M_PI, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 1, 0), Angles (M_PI_2, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, -1, 0), Angles (-M_PI_2, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 0, 1), Angles (0, 0)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 0, -1), Angles (0, M_PI)), TestCase::QUICK);
+
+  AddTestCase (new OneVectorConstructorTestCase (Vector (2, 0, 0), Angles (0, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-2, 0, 0), Angles (M_PI, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 2, 0), Angles (M_PI_2, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, -2, 0), Angles (-M_PI_2, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 0, 2), Angles (0, 0)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 0, -2), Angles (0, M_PI)), TestCase::QUICK);
+
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 0, 1), Angles (0, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 0, -1), Angles (0, 3 * M_PI_4)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 1, 0), Angles (M_PI_4, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, -1, 0), Angles (-M_PI_4, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 0, 1), Angles (M_PI, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 0, -1), Angles (M_PI, 3 * M_PI_4)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 1, 0), Angles (3 * M_PI_4, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, -1, 0), Angles (-3 * M_PI_4, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 1, 1), Angles (M_PI_2, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 1, -1), Angles (M_PI_2, 3 * M_PI_4)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, -1, 1), Angles (-M_PI_2, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, -1, -1), Angles (-M_PI_2, 3 * M_PI_4)), TestCase::QUICK);
 
-  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 1, std::sqrt (2)),  Angles (M_PI_4, M_PI_4)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 1, -std::sqrt (2)), Angles (M_PI_4, 3*M_PI_4)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 1, std::sqrt (2)), Angles (M_PI_4, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 1, -std::sqrt (2)), Angles (M_PI_4, 3 * M_PI_4)), TestCase::QUICK);
   AddTestCase (new OneVectorConstructorTestCase (Vector (1, -1, std::sqrt (2)), Angles (-M_PI_4, M_PI_4)), TestCase::QUICK);
-  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 1, std::sqrt (2)), Angles (3*M_PI_4, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 1, std::sqrt (2)), Angles (3 * M_PI_4, M_PI_4)), TestCase::QUICK);
 
 
 
 
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 0, 0),     Vector (0, 0, 0), Angles (0, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 0, 0),    Vector (0, 0, 0), Angles (M_PI, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 1, 0),     Vector (0, 0, 0), Angles (M_PI_2, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -1, 0),    Vector (0, 0, 0), Angles (-M_PI_2, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 0, 1),     Vector (0, 0, 0), Angles (0, 0)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 0, -1),    Vector (0, 0, 0), Angles (0, M_PI)), TestCase::QUICK);
-
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (2, 0, 0),     Vector (0, 0, 0), Angles (0, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-2, 0, 0),    Vector (0, 0, 0), Angles (M_PI, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 2, 0),     Vector (0, 0, 0), Angles (M_PI_2, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -2, 0),    Vector (0, 0, 0), Angles (-M_PI_2, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 0, 2),     Vector (0, 0, 0), Angles (0, 0)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 0, -2),    Vector (0, 0, 0), Angles (0, M_PI)), TestCase::QUICK);
-
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 0, 1),     Vector (0, 0, 0), Angles (0, M_PI_4)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 0, -1),    Vector (0, 0, 0), Angles (0, 3*M_PI_4)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 1, 0),     Vector (0, 0, 0), Angles (M_PI_4, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, -1, 0),    Vector (0, 0, 0), Angles (-M_PI_4, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 0, 1),    Vector (0, 0, 0), Angles (M_PI, M_PI_4)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 0, -1),   Vector (0, 0, 0), Angles (M_PI, 3*M_PI_4)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 1, 0),    Vector (0, 0, 0), Angles (3*M_PI_4, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, -1, 0),   Vector (0, 0, 0), Angles (-3*M_PI_4, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 1, 1),     Vector (0, 0, 0), Angles (M_PI_2, M_PI_4)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 1, -1),    Vector (0, 0, 0), Angles (M_PI_2, 3*M_PI_4)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -1, 1),    Vector (0, 0, 0), Angles (-M_PI_2, M_PI_4)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -1, -1),   Vector (0, 0, 0), Angles (-M_PI_2, 3*M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 0, 0), Vector (0, 0, 0), Angles (0, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 0, 0), Vector (0, 0, 0), Angles (M_PI, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 1, 0), Vector (0, 0, 0), Angles (M_PI_2, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -1, 0), Vector (0, 0, 0), Angles (-M_PI_2, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 0, 1), Vector (0, 0, 0), Angles (0, 0)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 0, -1), Vector (0, 0, 0), Angles (0, M_PI)), TestCase::QUICK);
+
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (2, 0, 0), Vector (0, 0, 0), Angles (0, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-2, 0, 0), Vector (0, 0, 0), Angles (M_PI, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 2, 0), Vector (0, 0, 0), Angles (M_PI_2, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -2, 0), Vector (0, 0, 0), Angles (-M_PI_2, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 0, 2), Vector (0, 0, 0), Angles (0, 0)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 0, -2), Vector (0, 0, 0), Angles (0, M_PI)), TestCase::QUICK);
+
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 0, 1), Vector (0, 0, 0), Angles (0, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 0, -1), Vector (0, 0, 0), Angles (0, 3 * M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 1, 0), Vector (0, 0, 0), Angles (M_PI_4, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, -1, 0), Vector (0, 0, 0), Angles (-M_PI_4, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 0, 1), Vector (0, 0, 0), Angles (M_PI, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 0, -1), Vector (0, 0, 0), Angles (M_PI, 3 * M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 1, 0), Vector (0, 0, 0), Angles (3 * M_PI_4, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, -1, 0), Vector (0, 0, 0), Angles (-3 * M_PI_4, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 1, 1), Vector (0, 0, 0), Angles (M_PI_2, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 1, -1), Vector (0, 0, 0), Angles (M_PI_2, 3 * M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -1, 1), Vector (0, 0, 0), Angles (-M_PI_2, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -1, -1), Vector (0, 0, 0), Angles (-M_PI_2, 3 * M_PI_4)), TestCase::QUICK);
 
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 1, std::sqrt (2)),  Vector (0, 0, 0), Angles (M_PI_4, M_PI_4)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 1, -std::sqrt (2)), Vector (0, 0, 0), Angles (M_PI_4, 3*M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 1, std::sqrt (2)), Vector (0, 0, 0), Angles (M_PI_4, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 1, -std::sqrt (2)), Vector (0, 0, 0), Angles (M_PI_4, 3 * M_PI_4)), TestCase::QUICK);
   AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, -1, std::sqrt (2)), Vector (0, 0, 0), Angles (-M_PI_4, M_PI_4)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 1, std::sqrt (2)), Vector (0, 0, 0), Angles (3*M_PI_4, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 1, std::sqrt (2)), Vector (0, 0, 0), Angles (3 * M_PI_4, M_PI_4)), TestCase::QUICK);
 
 
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (3, 2, 2),     Vector (2, 2, 2), Angles (0, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 2, 2),     Vector (2, 2, 2), Angles (M_PI, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (2, 3, 2),     Vector (2, 2, 2), Angles (M_PI_2, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 2, 2),    Vector (-1, 3, 2), Angles (-M_PI_2, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (4, -2, 7),    Vector (4, -2, 6), Angles (0, 0)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -5, -1),   Vector (0, -5, 0), Angles (0, M_PI)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (3, 2, 2), Vector (2, 2, 2), Angles (0, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 2, 2), Vector (2, 2, 2), Angles (M_PI, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (2, 3, 2), Vector (2, 2, 2), Angles (M_PI_2, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 2, 2), Vector (-1, 3, 2), Angles (-M_PI_2, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (4, -2, 7), Vector (4, -2, 6), Angles (0, 0)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -5, -1), Vector (0, -5, 0), Angles (0, M_PI)), TestCase::QUICK);
 
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-2, 2, -1),     Vector (-4, 2, -1), Angles (0, M_PI_2)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (2, 2, 0),    Vector (4, 2, 0), Angles (M_PI, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-2, 2, -1), Vector (-4, 2, -1), Angles (0, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (2, 2, 0), Vector (4, 2, 0), Angles (M_PI, M_PI_2)), TestCase::QUICK);
 
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 4, 4),     Vector (-2, 4, 3), Angles (0, M_PI_4)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -2, -6),    Vector (-1, -2, -5), Angles (0, 3*M_PI_4)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (77, 3, 43),    Vector (78, 2, 43), Angles (3*M_PI_4, M_PI_2)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 4, 4), Vector (-2, 4, 3), Angles (0, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -2, -6), Vector (-1, -2, -5), Angles (0, 3 * M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (77, 3, 43), Vector (78, 2, 43), Angles (3 * M_PI_4, M_PI_2)), TestCase::QUICK);
 
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (24, -2, -6 -std::sqrt (2)), Vector (23, -3, -6), Angles (M_PI_4, 3*M_PI_4)), TestCase::QUICK);
-  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0.5, 11.45, std::sqrt (2)-1), Vector (-0.5, 12.45, -1), Angles (-M_PI_4, M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (24, -2, -6 - std::sqrt (2)), Vector (23, -3, -6), Angles (M_PI_4, 3 * M_PI_4)), TestCase::QUICK);
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0.5, 11.45, std::sqrt (2) - 1), Vector (-0.5, 12.45, -1), Angles (-M_PI_4, M_PI_4)), TestCase::QUICK);
 
 
-};
+}
 
 static AnglesTestSuite staticAnglesTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/test/test-cosine-antenna.cc ns-3.34/src/antenna/test/test-cosine-antenna.cc
--- ns-3.33/src/antenna/test/test-cosine-antenna.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/test/test-cosine-antenna.cc	2021-07-14 10:31:06.000000000 -0700
@@ -59,7 +59,7 @@
 std::string CosineAntennaModelTestCase::BuildNameString (Angles a, double b, double o, double g)
 {
   std::ostringstream oss;
-  oss <<  "theta=" << a.theta << " , phi=" << a.phi 
+  oss <<  "theta=" << a.GetInclination () << " , phi=" << a.GetAzimuth () 
       << ", beamdwidth=" << b << "deg"
       << ", orientation=" << o 
       << ", maxGain=" << g << " dB";
@@ -84,7 +84,8 @@
   NS_LOG_FUNCTION (this << BuildNameString (m_a, m_b, m_o, m_g));
 
   Ptr<CosineAntennaModel> a = CreateObject<CosineAntennaModel> ();
-  a->SetAttribute ("Beamwidth", DoubleValue (m_b));
+  a->SetAttribute ("HorizontalBeamwidth", DoubleValue (m_b));
+  a->SetAttribute ("VerticalBeamwidth", DoubleValue (m_b));
   a->SetAttribute ("Orientation", DoubleValue (m_o));
   a->SetAttribute ("MaxGain", DoubleValue (m_g));
   double actualGain = a->GetGainDb (m_a);
@@ -117,89 +118,96 @@
   // phideg = (2*acos(10^(targetgaindb/(20*n))))*180/pi
   // e.g., with a 60 deg beamwidth, gain is -20dB at +- 74.945 degrees from boresight
 
-  //                                                                      phi,  theta, beamwidth, orientation,  maxGain,  expectedGain,   condition
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians    (0),    0),        60,           0,        0,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),    0),        60,           0,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),    0),        60,           0,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-90),    0),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (90),    0),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (100),    0),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (150),    0),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (180),    0),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-100),    0),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150),    0),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-180),    0),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  //                                                                      phi,                     theta, beamwidth, orientation,  maxGain,  expectedGain,   condition
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians    (0),   DegreesToRadians (90)),        60,           0,        0,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),   DegreesToRadians (90)),        60,           0,        0,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),   DegreesToRadians (90)),        60,           0,        0,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-90),   DegreesToRadians (90)),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (90),   DegreesToRadians (90)),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (100),   DegreesToRadians (90)),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (150),   DegreesToRadians (90)),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (180),   DegreesToRadians (90)),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-100),   DegreesToRadians (90)),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150),   DegreesToRadians (90)),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-180),   DegreesToRadians (90)),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
 
   // test positive orientation
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (60),    0),        60,          60,        0,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (90),    0),        60,          60,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),    0),        60,          60,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),    0),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (150),    0),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (160),    0),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (210),    0),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (240),    0),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-40),    0),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-90),    0),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-120),    0),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (60),   DegreesToRadians (90)),        60,          60,        0,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (90),   DegreesToRadians (90)),        60,          60,        0,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),   DegreesToRadians (90)),        60,          60,        0,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),   DegreesToRadians (90)),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (150),   DegreesToRadians (90)),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (160),   DegreesToRadians (90)),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (210),   DegreesToRadians (90)),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (240),   DegreesToRadians (90)),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-40),   DegreesToRadians (90)),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-90),   DegreesToRadians (90)),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-120),   DegreesToRadians (90)),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
 
   // test negative orientation and different beamwidths
   // with a 100 deg beamwidth, gain is -20dB at +- 117.47 degrees from boresight
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150),    0),       100,        -150,        0,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-100),    0),       100,        -150,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-200),    0),       100,        -150,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-32.531), 0),       100,        -150,        0,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (92.531),  0),       100,        -150,        0,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),    0),       100,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians    (0),    0),       100,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (60),    0),       100,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (90),    0),       100,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),    0),       100,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150),   DegreesToRadians (90)),       100,        -150,        0,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-100),   DegreesToRadians (90)),       100,        -150,        0,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-200),   DegreesToRadians (90)),       100,        -150,        0,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-32.531),DegreesToRadians (90)),       100,        -150,        0,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (92.531), DegreesToRadians (90)),       100,        -150,        0,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),   DegreesToRadians (90)),       100,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians    (0),   DegreesToRadians (90)),       100,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (60),   DegreesToRadians (90)),       100,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (90),   DegreesToRadians (90)),       100,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),   DegreesToRadians (90)),       100,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
   // with a 150 deg beamwidth, gain is -10dB at +- 124.93 degrees from boresight, and -20dB at +- 155.32 degrees from boresight
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150),    0),       150,        -150,        0,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (135),    0),       150,        -150,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-75),    0),       150,        -150,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (85.070),  0),       150,        -150,        0,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-25.070), 0),       150,        -150,        0,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (5.3230),  0),       150,        -150,        0,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (54.677),  0),       150,        -150,        0,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),    0),       150,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (20),    0),       150,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
-
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150),   DegreesToRadians (90)),       150,        -150,        0,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (135),   DegreesToRadians (90)),       150,        -150,        0,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-75),   DegreesToRadians (90)),       150,        -150,        0,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (85.070), DegreesToRadians (90)),       150,        -150,        0,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-25.070),DegreesToRadians (90)),       150,        -150,        0,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (5.3230), DegreesToRadians (90)),       150,        -150,        0,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (54.677), DegreesToRadians (90)),       150,        -150,        0,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),   DegreesToRadians (90)),       150,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (20),   DegreesToRadians (90)),       150,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  // test flat beam, with beamwidth=360 deg
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians    (0),   DegreesToRadians (90)),       360,           0,        0,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (180),   DegreesToRadians (90)),       360,           0,        0,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-180),   DegreesToRadians (90)),       360,           0,        0,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians    (0),   DegreesToRadians  (0)),       360,           0,        0,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians    (0),   DegreesToRadians(180)),       360,           0,        0,             0,     EQUAL), TestCase::QUICK);
+  
   // test maxGain
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians    (0),    0),        60,           0,       10,            10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),    0),        60,           0,       22,            19,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),    0),        60,           0,       -4,            -7,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-90),    0),        60,           0,       10,           -10,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (90),    0),        60,           0,      -20,           -40,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (100),    0),        60,           0,       40,            20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150),    0),       100,        -150,        2,             2,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-100),    0),       100,        -150,        4,             1,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-200),    0),       100,        -150,       -1,            -4,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians    (0),   DegreesToRadians (90)),        60,           0,       10,            10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),   DegreesToRadians (90)),        60,           0,       22,            19,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),   DegreesToRadians (90)),        60,           0,       -4,            -7,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-90),   DegreesToRadians (90)),        60,           0,       10,           -10,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (90),   DegreesToRadians (90)),        60,           0,      -20,           -40,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (100),   DegreesToRadians (90)),        60,           0,       40,            20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150),   DegreesToRadians (90)),       100,        -150,        2,             2,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-100),   DegreesToRadians (90)),       100,        -150,        4,             1,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-200),   DegreesToRadians (90)),       100,        -150,       -1,            -4,     EQUAL), TestCase::QUICK);
 
 
   // test elevation angle
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians    (0),    2),        60,           0,        0,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),    2),        60,           0,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),    2),        60,           0,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-90),    2),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-180),    2),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (60),   -3),        60,          60,        0,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (90),   -3),        60,          60,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),   -3),        60,          60,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-120),   -3),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150),   -3),       100,        -150,        0,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-100),   -3),       100,        -150,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-200),   -3),       100,        -150,        0,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),   -3),       100,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (90),  9.5),       100,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians    (0),  9.5),        60,           0,       10,            10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),  9.5),        60,           0,       22,            19,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),  9.5),        60,           0,       -4,            -7,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (100),  9.5),        60,           0,       40,            20,  LESSTHAN), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150),  9.5),       100,        -150,        2,             2,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-100),  9.5),       100,        -150,        4,             1,     EQUAL), TestCase::QUICK);
-  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-200),  9.5),       100,        -150,       -1,            -4,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians    (0),   DegreesToRadians (60)),        60,           0,        0,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),   DegreesToRadians (60)),        60,           0,        0,            -6,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),   DegreesToRadians (60)),        60,           0,        0,            -6,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-90),   DegreesToRadians (60)),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-180),   DegreesToRadians (60)),        60,           0,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (60),  DegreesToRadians (120)),        60,          60,        0,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (90),  DegreesToRadians (120)),        60,          60,        0,            -6,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),  DegreesToRadians (120)),        60,          60,        0,            -6,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-120),  DegreesToRadians (120)),        60,          60,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150),  DegreesToRadians (140)),       100,        -150,        0,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-100),  DegreesToRadians (140)),       100,        -150,        0,            -6,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-200),  DegreesToRadians (140)),       100,        -150,        0,            -6,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),  DegreesToRadians (140)),       100,        -150,        0,           -20,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians    (0),   DegreesToRadians (60)),        60,           0,       10,             7,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (30),   DegreesToRadians (60)),        60,           0,       22,            16,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-30),   DegreesToRadians (60)),        60,           0,       -4,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (-90),   DegreesToRadians (60)),        60,           0,       10,           -13,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians   (90),   DegreesToRadians (60)),        60,           0,      -20,           -43,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians  (100),   DegreesToRadians (60)),        60,           0,       40,            17,  LESSTHAN), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-150),   DegreesToRadians (40)),       100,        -150,        2,            -1,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-100),   DegreesToRadians (40)),       100,        -150,        4,            -2,     EQUAL), TestCase::QUICK);
+  AddTestCase (new CosineAntennaModelTestCase (Angles (DegreesToRadians (-200),   DegreesToRadians (40)),       100,        -150,       -1,            -7,     EQUAL), TestCase::QUICK);
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/test/test-isotropic-antenna.cc ns-3.34/src/antenna/test/test-isotropic-antenna.cc
--- ns-3.33/src/antenna/test/test-isotropic-antenna.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/test/test-isotropic-antenna.cc	2021-07-14 10:31:06.000000000 -0700
@@ -45,7 +45,7 @@
 std::string IsotropicAntennaModelTestCase::BuildNameString (Angles a)
 {
   std::ostringstream oss;
-  oss <<  "theta=" << a.theta << " , phi=" << a.phi;
+  oss <<  "theta=" << a.GetInclination () << " , phi=" << a.GetAzimuth ();
   return oss.str ();
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/test/test-parabolic-antenna.cc ns-3.34/src/antenna/test/test-parabolic-antenna.cc
--- ns-3.33/src/antenna/test/test-parabolic-antenna.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/test/test-parabolic-antenna.cc	2021-07-14 10:31:06.000000000 -0700
@@ -59,7 +59,7 @@
 std::string ParabolicAntennaModelTestCase::BuildNameString (Angles a, double b, double o, double g)
 {
   std::ostringstream oss;
-  oss <<  "theta=" << a.theta << " , phi=" << a.phi 
+  oss <<  "theta=" << a.GetInclination () << " , phi=" << a.GetAzimuth () 
       << ", beamdwidth=" << b << "deg"
       << ", orientation=" << o 
       << ", maxAttenuation=" << g << " dB";
@@ -115,70 +115,70 @@
 { 
 
   // with a 60 deg beamwidth, gain is -20dB at +-77.460 degrees from boresight
-  //                                                                         phi,  theta, beamwidth, orientation,  maxAttn,  expectedGain,   condition
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians    (0),    0),        60,           0,       20,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (30),    0),        60,           0,       20,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-30),    0),        60,           0,       20,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-90),    0),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (90),    0),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (100),    0),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (150),    0),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (180),    0),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-100),    0),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-150),    0),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-180),    0),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
+  //                                                                         phi,                     theta, beamwidth, orientation,  maxAttn,  expectedGain,   condition
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians    (0),   DegreesToRadians (90)),        60,           0,       20,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (30),   DegreesToRadians (90)),        60,           0,       20,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-30),   DegreesToRadians (90)),        60,           0,       20,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-90),   DegreesToRadians (90)),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (90),   DegreesToRadians (90)),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (100),   DegreesToRadians (90)),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (150),   DegreesToRadians (90)),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (180),   DegreesToRadians (90)),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-100),   DegreesToRadians (90)),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-150),   DegreesToRadians (90)),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-180),   DegreesToRadians (90)),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
 
   // with a 60 deg beamwidth, gain is -10dB at +-54.772 degrees from boresight
   // test positive orientation
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (60),    0),        60,          60,       10,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (90),    0),        60,          60,       10,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (30),    0),        60,          60,       10,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-30),    0),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (150),    0),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (160),    0),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (210),    0),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (240),    0),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-40),    0),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-90),    0),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-120),    0),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (60),   DegreesToRadians (90)),        60,          60,       10,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (90),   DegreesToRadians (90)),        60,          60,       10,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (30),   DegreesToRadians (90)),        60,          60,       10,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-30),   DegreesToRadians (90)),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (150),   DegreesToRadians (90)),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (160),   DegreesToRadians (90)),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (210),   DegreesToRadians (90)),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (240),   DegreesToRadians (90)),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-40),   DegreesToRadians (90)),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-90),   DegreesToRadians (90)),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-120),   DegreesToRadians (90)),        60,          60,       10,           -10,     EQUAL), TestCase::QUICK);
 
   // test negative orientation and different beamwidths
   // with a 80 deg beamwidth, gain is -20dB at +- 73.030 degrees from boresight
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-150),    0),       80,        -150,       10,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-110),    0),       80,        -150,       10,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-190),    0),       80,        -150,       10,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-70),    0),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (92),    0),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-30),    0),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians    (0),    0),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (60),    0),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (90),    0),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (30),    0),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-150),   DegreesToRadians (90)),       80,        -150,       10,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-110),   DegreesToRadians (90)),       80,        -150,       10,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-190),   DegreesToRadians (90)),       80,        -150,       10,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-70),   DegreesToRadians (90)),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (92),   DegreesToRadians (90)),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-30),   DegreesToRadians (90)),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians    (0),   DegreesToRadians (90)),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (60),   DegreesToRadians (90)),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (90),   DegreesToRadians (90)),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (30),   DegreesToRadians (90)),       80,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
 
 
 
   // test elevation angle
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians    (0),    2),        60,           0,       20,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (30),    2),        60,           0,       20,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-30),    2),        60,           0,       20,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-90),    2),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-180),    2),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (60),   -3),        60,          60,       20,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (90),   -3),        60,          60,       20,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (30),   -3),        60,          60,       20,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-120),   -3),        60,          60,       20,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-150),   -3),       100,        -150,       10,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-100),   -3),       100,        -150,       10,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-200),   -3),       100,        -150,       10,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-30),   -3),       100,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (90),  9.5),       100,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians    (0),  9.5),        60,           0,       20,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (30),  9.5),        60,           0,       20,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-30),  9.5),        60,           0,       20,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (100),  9.5),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-150),  9.5),       100,        -150,       30,             0,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-100),  9.5),       100,        -150,       30,            -3,     EQUAL), TestCase::QUICK);
-  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-200),  9.5),       100,        -150,       30,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians    (0),   DegreesToRadians (88)),        60,           0,       20,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (30),   DegreesToRadians (88)),        60,           0,       20,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-30),   DegreesToRadians (88)),        60,           0,       20,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-90),   DegreesToRadians (88)),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-180),   DegreesToRadians (88)),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (60),   DegreesToRadians (93)),        60,          60,       20,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (90),   DegreesToRadians (93)),        60,          60,       20,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (30),   DegreesToRadians (93)),        60,          60,       20,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-120),   DegreesToRadians (93)),        60,          60,       20,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-150),   DegreesToRadians (93)),       100,        -150,       10,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-100),   DegreesToRadians (93)),       100,        -150,       10,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-200),   DegreesToRadians (93)),       100,        -150,       10,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-30),   DegreesToRadians (93)),       100,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (90), DegreesToRadians (80.5)),       100,        -150,       10,           -10,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians    (0), DegreesToRadians (80.5)),        60,           0,       20,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians   (30), DegreesToRadians (80.5)),        60,           0,       20,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (-30), DegreesToRadians (80.5)),        60,           0,       20,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians  (100), DegreesToRadians (80.5)),        60,           0,       20,           -20,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-150), DegreesToRadians (80.5)),       100,        -150,       30,             0,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-100), DegreesToRadians (80.5)),       100,        -150,       30,            -3,     EQUAL), TestCase::QUICK);
+  AddTestCase (new ParabolicAntennaModelTestCase (Angles (DegreesToRadians (-200), DegreesToRadians (80.5)),       100,        -150,       30,            -3,     EQUAL), TestCase::QUICK);
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/test/test-uniform-planar-array.cc ns-3.34/src/antenna/test/test-uniform-planar-array.cc
--- ns-3.33/src/antenna/test/test-uniform-planar-array.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/antenna/test/test-uniform-planar-array.cc	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,216 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+*   Copyright (c) 2020 University of Padova, Dep. of Information Engineering, SIGNET lab.
+*
+*   This program is free software; you can redistribute it and/or modify
+*   it under the terms of the GNU General Public License version 2 as
+*   published by the Free Software Foundation;
+*
+*   This program is distributed in the hope that it will be useful,
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*   GNU General Public License for more details.
+*
+*   You should have received a copy of the GNU General Public License
+*   along with this program; if not, write to the Free Software
+*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include "ns3/log.h"
+#include "ns3/test.h"
+#include "ns3/double.h"
+#include "ns3/uinteger.h"
+#include "ns3/pointer.h"
+#include "ns3/uniform-planar-array.h"
+#include "ns3/isotropic-antenna-model.h"
+#include "ns3/three-gpp-antenna-model.h"
+#include "ns3/simulator.h"
+#include "cmath"
+#include "string"
+#include "iostream"
+#include "sstream"
+
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("TestUniformPlanarArray");
+
+/**
+ * \ingroup tests
+ *
+ * \brief UniformPlanarArray Test Case
+ */
+class UniformPlanarArrayTestCase : public TestCase
+{
+public:
+  /**
+   * Generate a string containing all relevant parameters
+   * \param element the antenna element
+   * \param rows the number of rows
+   * \param cols the number of columns
+   * \param rowSpace the row spacing
+   * \param colSpace the column spacing
+   * \param alpha the bearing angle
+   * \param beta the tilting angle
+   * \param direction the direction
+   * \return the string containing all relevant parameters
+   */
+  static std::string BuildNameString (Ptr<AntennaModel> element, uint32_t rows, uint32_t cols,double rowSpace, double colSpace,
+                                      double alpha, double beta, Angles direction);
+  /**
+   * The constructor of the test case
+   * \param element the antenna element
+   * \param rows the number of rows
+   * \param cols the number of columns
+   * \param rowSpace the row spacing
+   * \param colSpace the column spacing
+   * \param alpha the bearing angle
+   * \param beta the tilting angle
+   * \param direction the direction
+   * \param expectedGainDb the expected antenna gain [dB]
+   */
+  UniformPlanarArrayTestCase (Ptr<AntennaModel> element, uint32_t rows, uint32_t cols, double rowSpace, double colSpace,
+                              double alpha, double beta, Angles direction, double expectedGainDb);
+
+private:
+  /**
+   * Run the test
+   */
+  virtual void DoRun (void);
+  /**
+   * Compute the gain of the antenna array
+   * \param a the antenna array
+   * \return the gain of the antenna array [dB]
+   */
+  double ComputeGain (Ptr<UniformPlanarArray> a);
+
+  Ptr<AntennaModel> m_element;  //!< the antenna element
+  uint32_t m_rows;              //!< the number of rows
+  uint32_t m_cols;              //!< the number of columns
+  double m_rowSpace;            //!< the row spacing
+  double m_colSpace;            //!< the column spacing
+  double m_alpha;               //!< the bearing angle [rad]
+  double m_beta;                //!< the titling angle [rad]
+  Angles m_direction;           //!< the testing direction
+  double m_expectedGain;        //!< the expected antenna gain [dB]
+};
+
+std::string UniformPlanarArrayTestCase::BuildNameString (Ptr<AntennaModel> element, uint32_t rows, uint32_t cols, double rowSpace, double colSpace,
+                                                         double alpha, double beta, Angles direction)
+{
+  std::ostringstream oss;
+  oss << "UPA=" << rows << "x" << cols
+      << ", row spacing=" << rowSpace << "*lambda"
+      << ", col spacing=" << colSpace << "*lambda"
+      << ", bearing=" << RadiansToDegrees (alpha) << " deg"
+      << ", tilting=" << RadiansToDegrees (beta) << " deg"
+      << ", element=" << element->GetInstanceTypeId ().GetName ()
+      << ", direction=" << direction;
+  return oss.str ();
+}
+
+
+UniformPlanarArrayTestCase::UniformPlanarArrayTestCase (Ptr<AntennaModel> element, uint32_t rows, uint32_t cols, double rowSpace, double colSpace,
+                                                        double alpha, double beta, Angles direction, double expectedGainDb)
+  : TestCase (BuildNameString (element, rows, cols, rowSpace, colSpace, alpha, beta, direction)),
+    m_element (element),
+    m_rows (rows),
+    m_cols (cols),
+    m_rowSpace (rowSpace),
+    m_colSpace (colSpace),
+    m_alpha (alpha),
+    m_beta (beta),
+    m_direction (direction),
+    m_expectedGain (expectedGainDb)
+{}
+
+
+double
+UniformPlanarArrayTestCase::ComputeGain (Ptr<UniformPlanarArray> a)
+{
+  // compute gain
+  PhasedArrayModel::ComplexVector sv = a->GetSteeringVector (m_direction);
+  NS_TEST_EXPECT_MSG_EQ (sv.size (), a->GetNumberOfElements (), "steering vector of wrong size");
+  PhasedArrayModel::ComplexVector bf = a->GetBeamformingVector (m_direction);
+  NS_TEST_EXPECT_MSG_EQ (bf.size (), a->GetNumberOfElements (), "beamforming vector of wrong size");
+  std::pair<double, double> fp = a->GetElementFieldPattern (m_direction);
+
+  // scalar product dot (sv, bf)
+  std::complex<double> prod {0};
+  for (size_t i = 0; i < sv.size (); i++)
+    {
+      prod += sv[i] * bf[i];
+    }
+  double bfGain = std::pow (std::abs (prod), 2);
+  double bfGainDb = 10 * std::log10 (bfGain);
+
+  // power gain from two polarizations
+  double elementPowerGain = std::pow (std::get<0> (fp), 2) + std::pow (std::get<1> (fp), 2);
+  double elementPowerGainDb = 10 * std::log10 (elementPowerGain);
+
+  // sum BF and element gains
+  return bfGainDb + elementPowerGainDb;
+}
+
+
+void
+UniformPlanarArrayTestCase::DoRun ()
+{
+  NS_LOG_FUNCTION (this << BuildNameString (m_element, m_rows, m_cols, m_rowSpace, m_colSpace, m_alpha, m_beta, m_direction));
+
+  Ptr<UniformPlanarArray> a = CreateObject<UniformPlanarArray> ();
+  a->SetAttribute ("AntennaElement", PointerValue (m_element));
+  a->SetAttribute ("NumRows", UintegerValue (m_rows));
+  a->SetAttribute ("NumColumns", UintegerValue (m_cols));
+  a->SetAttribute ("AntennaVerticalSpacing", DoubleValue (m_rowSpace));
+  a->SetAttribute ("AntennaHorizontalSpacing", DoubleValue (m_colSpace));
+  a->SetAttribute ("BearingAngle", DoubleValue (m_alpha));
+  a->SetAttribute ("DowntiltAngle", DoubleValue (m_beta));
+
+  double actualGainDb = ComputeGain (a);
+  NS_TEST_EXPECT_MSG_EQ_TOL (actualGainDb, m_expectedGain, 0.001, "wrong value of the radiation pattern");
+}
+
+
+/**
+ * \ingroup tests
+ *
+ * \brief UniformPlanarArray Test Suite
+ */
+class UniformPlanarArrayTestSuite : public TestSuite
+{
+public:
+  UniformPlanarArrayTestSuite ();
+};
+
+UniformPlanarArrayTestSuite::UniformPlanarArrayTestSuite ()
+  : TestSuite ("uniform-planar-array-test", UNIT)
+{
+  Ptr<AntennaModel> isotropic = CreateObject<IsotropicAntennaModel> ();
+  Ptr<AntennaModel> tgpp = CreateObject<ThreeGppAntennaModel> ();
+
+  //                                             element, rows, cols, rowSpace, colSpace,                bearing,                 tilting,               direction (azimuth,             inclination), expectedGainDb
+  // Single element arrays: check if bearing/tilting works on antenna element
+  AddTestCase (new UniformPlanarArrayTestCase (isotropic,    1,    1,      0.5,      0.5, DegreesToRadians    (0), DegreesToRadians   (0),  Angles (DegreesToRadians    (0), DegreesToRadians   (90)),            0.0), TestCase::QUICK);
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,    1,    1,      0.5,      0.5, DegreesToRadians    (0), DegreesToRadians   (0),  Angles (DegreesToRadians    (0), DegreesToRadians   (90)),            8.0), TestCase::QUICK);
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,    1,    1,      0.5,      0.5, DegreesToRadians   (90), DegreesToRadians   (0),  Angles (DegreesToRadians   (90), DegreesToRadians   (90)),            8.0), TestCase::QUICK);
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,    1,    1,      0.5,      0.5, DegreesToRadians  (-90), DegreesToRadians   (0),  Angles (DegreesToRadians  (-90), DegreesToRadians   (90)),            8.0), TestCase::QUICK);
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,    1,    1,      0.5,      0.5, DegreesToRadians  (180), DegreesToRadians   (0),  Angles (DegreesToRadians  (180), DegreesToRadians   (90)),            8.0), TestCase::QUICK);
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,    1,    1,      0.5,      0.5, DegreesToRadians (-180), DegreesToRadians   (0),  Angles (DegreesToRadians (-180), DegreesToRadians   (90)),            8.0), TestCase::QUICK);
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,    1,    1,      0.5,      0.5, DegreesToRadians    (0), DegreesToRadians  (45),  Angles (DegreesToRadians    (0), DegreesToRadians  (135)),            8.0), TestCase::QUICK);
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,    1,    1,      0.5,      0.5, DegreesToRadians    (0), DegreesToRadians (-45),  Angles (DegreesToRadians    (0), DegreesToRadians   (45)),            8.0), TestCase::QUICK);
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,    1,    1,      0.5,      0.5, DegreesToRadians    (0), DegreesToRadians  (90),  Angles (DegreesToRadians    (0), DegreesToRadians  (180)),            8.0), TestCase::QUICK);
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,    1,    1,      0.5,      0.5, DegreesToRadians    (0), DegreesToRadians (-90),  Angles (DegreesToRadians    (0), DegreesToRadians    (0)),            8.0), TestCase::QUICK);
+
+  // linear array
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,   10,    1,      0.5,      0.5, DegreesToRadians    (0), DegreesToRadians   (0),  Angles (DegreesToRadians    (0), DegreesToRadians   (90)),           18.0), TestCase::QUICK);
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,   10,    1,      0.5,      0.5, DegreesToRadians   (90), DegreesToRadians   (0),  Angles (DegreesToRadians   (90), DegreesToRadians   (90)),           18.0), TestCase::QUICK);
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,   10,    1,      0.5,      0.5, DegreesToRadians    (0), DegreesToRadians  (45),  Angles (DegreesToRadians    (0), DegreesToRadians  (135)),           18.0), TestCase::QUICK);
+
+  // planar array
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,   10,   10,      0.5,      0.5, DegreesToRadians    (0), DegreesToRadians   (0),  Angles (DegreesToRadians    (0), DegreesToRadians   (90)),           28.0), TestCase::QUICK);
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,   10,   10,      0.5,      0.5, DegreesToRadians   (90), DegreesToRadians   (0),  Angles (DegreesToRadians   (90), DegreesToRadians   (90)),           28.0), TestCase::QUICK);
+  AddTestCase (new UniformPlanarArrayTestCase (     tgpp,   10,   10,      0.5,      0.5, DegreesToRadians    (0), DegreesToRadians  (45),  Angles (DegreesToRadians    (0), DegreesToRadians  (135)),           28.0), TestCase::QUICK);
+}
+
+static UniformPlanarArrayTestSuite staticUniformPlanarArrayTestSuiteInstance;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/antenna/wscript ns-3.34/src/antenna/wscript
--- ns-3.33/src/antenna/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/antenna/wscript	2021-07-14 10:31:06.000000000 -0700
@@ -10,7 +10,9 @@
         'model/isotropic-antenna-model.cc',
         'model/cosine-antenna-model.cc',
         'model/parabolic-antenna-model.cc',
-        'model/three-gpp-antenna-array-model.cc',
+        'model/three-gpp-antenna-model.cc',
+        'model/phased-array-model.cc',
+        'model/uniform-planar-array.cc',
         ]
 
     module_test = bld.create_ns3_module_test_library('antenna')
@@ -20,6 +22,7 @@
         'test/test-isotropic-antenna.cc',
         'test/test-cosine-antenna.cc',
         'test/test-parabolic-antenna.cc',
+        'test/test-uniform-planar-array.cc',
         ]
 
     # Tests encapsulating example programs should be listed here
@@ -36,7 +39,9 @@
         'model/isotropic-antenna-model.h',
         'model/cosine-antenna-model.h',
         'model/parabolic-antenna-model.h',
-        'model/three-gpp-antenna-array-model.h',
+        'model/three-gpp-antenna-model.h',
+        'model/phased-array-model.h',
+        'model/uniform-planar-array.h',
         ]
 
     bld.ns3_python_bindings()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/aodv/bindings/modulegen__gcc_ILP32.py ns-3.34/src/aodv/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/aodv/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/aodv/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -20,6 +20,8 @@
 def register_types(module):
     root_module = module.get_root()
     
+    ## aodv-routing-protocol.h (module 'aodv'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', [])
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
@@ -113,6 +115,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -125,6 +129,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -648,10 +654,12 @@
     register_Ns3IntToType__5_methods(root_module, root_module['ns3::IntToType< 5 >'])
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv4RoutingHelper_methods(root_module, root_module['ns3::Ipv4RoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1758,6 +1766,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2089,6 +2109,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2164,6 +2189,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2184,6 +2221,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4355,10 +4397,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/aodv/bindings/modulegen__gcc_LP64.py ns-3.34/src/aodv/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/aodv/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/aodv/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -20,6 +20,8 @@
 def register_types(module):
     root_module = module.get_root()
     
+    ## aodv-routing-protocol.h (module 'aodv'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', [])
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
@@ -113,6 +115,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -125,6 +129,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -648,10 +654,12 @@
     register_Ns3IntToType__5_methods(root_module, root_module['ns3::IntToType< 5 >'])
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv4RoutingHelper_methods(root_module, root_module['ns3::Ipv4RoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1758,6 +1766,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2089,6 +2109,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2164,6 +2189,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2184,6 +2221,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4355,10 +4397,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/aodv/model/aodv-neighbor.h ns-3.34/src/aodv/model/aodv-neighbor.h
--- ns-3.33/src/aodv/model/aodv-neighbor.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/aodv/model/aodv-neighbor.h	2021-07-14 10:31:06.000000000 -0700
@@ -166,8 +166,11 @@
    * \returns the MAC address for the IP address
    */
   Mac48Address LookupMacAddress (Ipv4Address addr);
-  /// Process layer 2 TX error notification
-  void ProcessTxError (WifiMacHeader const &);
+  /**
+   * Process layer 2 TX error notification
+   * \param hdr header of the packet
+   */
+  void ProcessTxError (WifiMacHeader const &hdr);
 };
 
 }  // namespace aodv
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/aodv/model/aodv-routing-protocol.cc ns-3.34/src/aodv/model/aodv-routing-protocol.cc
--- ns-3.33/src/aodv/model/aodv-routing-protocol.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/aodv/model/aodv-routing-protocol.cc	2021-07-14 10:31:06.000000000 -0700
@@ -39,6 +39,7 @@
 #include "ns3/udp-header.h"
 #include "ns3/wifi-net-device.h"
 #include "ns3/adhoc-wifi-mac.h"
+#include "ns3/wifi-mac-queue-item.h"
 #include "ns3/string.h"
 #include "ns3/pointer.h"
 #include <algorithm>
@@ -340,7 +341,7 @@
 {
   *stream->GetStream () << "Node: " << m_ipv4->GetObject<Node> ()->GetId ()
                         << "; Time: " << Now ().As (unit)
-                        << ", Local time: " << GetObject<Node> ()->GetLocalTime ().As (unit)
+                        << ", Local time: " << m_ipv4->GetObject<Node> ()->GetLocalTime ().As (unit)
                         << ", AODV Routing table" << std::endl;
 
   m_routingTable.Print (stream, unit);
@@ -725,7 +726,13 @@
       return;
     }
 
-  mac->TraceConnectWithoutContext ("TxErrHeader", m_nb.GetTxErrorCallback ());
+  mac->TraceConnectWithoutContext ("DroppedMpdu", MakeCallback (&RoutingProtocol::NotifyTxError, this));
+}
+
+void
+RoutingProtocol::NotifyTxError (WifiMacDropReason reason, Ptr<const WifiMacQueueItem> mpdu)
+{
+  m_nb.GetTxErrorCallback ()(mpdu->GetHeader ());
 }
 
 void
@@ -742,8 +749,8 @@
       Ptr<WifiMac> mac = wifi->GetMac ()->GetObject<AdhocWifiMac> ();
       if (mac != 0)
         {
-          mac->TraceDisconnectWithoutContext ("TxErrHeader",
-                                              m_nb.GetTxErrorCallback ());
+          mac->TraceDisconnectWithoutContext ("DroppedMpdu",
+                                              MakeCallback (&RoutingProtocol::NotifyTxError, this));
           m_nb.DelArpCache (l3->GetInterface (i)->GetArpCache ());
         }
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/aodv/model/aodv-routing-protocol.h ns-3.34/src/aodv/model/aodv-routing-protocol.h
--- ns-3.33/src/aodv/model/aodv-routing-protocol.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/aodv/model/aodv-routing-protocol.h	2021-07-14 10:31:06.000000000 -0700
@@ -42,6 +42,10 @@
 #include <map>
 
 namespace ns3 {
+
+class WifiMacQueueItem;
+enum WifiMacDropReason : uint8_t;  // opaque enum declaration
+
 namespace aodv {
 /**
  * \ingroup aodv
@@ -180,6 +184,14 @@
 protected:
   virtual void DoInitialize (void);
 private:
+  /**
+   * Notify that an MPDU was dropped.
+   *
+   * \param reason the reason why the MPDU was dropped
+   * \param mpdu the dropped MPDU
+   */
+  void NotifyTxError (WifiMacDropReason reason, Ptr<const WifiMacQueueItem> mpdu);
+
   // Protocol parameters.
   uint32_t m_rreqRetries;             ///< Maximum number of retransmissions of RREQ with TTL = NetDiameter to discover a route
   uint16_t m_ttlStart;                ///< Initial TTL value for RREQ.
@@ -326,27 +338,56 @@
 
   ///\name Receive control packets
   //\{
-  /// Receive and process control packet
+  /**
+   * Receive and process control packet
+   * \param socket input socket
+   */
   void RecvAodv (Ptr<Socket> socket);
-  /// Receive RREQ
+  /**
+   * Receive RREQ
+   * \param p packet
+   * \param receiver receiver address
+   * \param src sender address
+   */
   void RecvRequest (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address src);
-  /// Receive RREP
-  void RecvReply (Ptr<Packet> p, Ipv4Address my,Ipv4Address src);
-  /// Receive RREP_ACK
+  /**
+   * Receive RREP
+   * \param p packet
+   * \param my destination address
+   * \param src sender address
+   */
+  void RecvReply (Ptr<Packet> p, Ipv4Address my, Ipv4Address src);
+  /**
+   * Receive RREP_ACK
+   * \param neighbor neighbor address
+   */
   void RecvReplyAck (Ipv4Address neighbor);
-  /// Receive RERR from node with address src
+  /**
+   * Receive RERR
+   * \param p packet
+   * \param src sender address
+   */
+  /// Receive  from node with address src
   void RecvError (Ptr<Packet> p, Ipv4Address src);
   //\}
 
   ///\name Send
   //\{
-  /// Forward packet from route request queue
+  /** Forward packet from route request queue
+   * \param dst destination address
+   * \param route route to use
+   */
   void SendPacketFromQueue (Ipv4Address dst, Ptr<Ipv4Route> route);
   /// Send hello
   void SendHello ();
-  /// Send RREQ
+  /** Send RREQ
+   * \param dst destination address
+   */
   void SendRequest (Ipv4Address dst);
-  /// Send RREP
+  /** Send RREP
+   * \param rreqHeader route request header
+   * \param toOrigin routing table entry to originator
+   */
   void SendReply (RreqHeader const & rreqHeader, RoutingTableEntry const & toOrigin);
   /** Send RREP by intermediate node
    * \param toDst routing table entry to destination
@@ -354,11 +395,18 @@
    * \param gratRep indicates whether a gratuitous RREP should be unicast to destination
    */
   void SendReplyByIntermediateNode (RoutingTableEntry & toDst, RoutingTableEntry & toOrigin, bool gratRep);
-  /// Send RREP_ACK
+  /** Send RREP_ACK
+   * \param neighbor neighbor address
+   */
   void SendReplyAck (Ipv4Address neighbor);
-  /// Initiate RERR
+  /** Initiate RERR
+   * \param nextHop next hop address
+   */
   void SendRerrWhenBreaksLinkToNextHop (Ipv4Address nextHop);
-  /// Forward RERR
+  /** Forward RERR
+   * \param packet packet
+   * \param precursors list of addresses of the visited nodes
+   */
   void SendRerrMessage (Ptr<Packet> packet,  std::vector<Ipv4Address> precursors);
   /**
    * Send RERR message when no route to forward input packet. Unicast if there is reverse route to originating node, broadcast otherwise.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/aodv/model/aodv-rtable.cc ns-3.34/src/aodv/model/aodv-rtable.cc
--- ns-3.33/src/aodv/model/aodv-rtable.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/aodv/model/aodv-rtable.cc	2021-07-14 10:31:06.000000000 -0700
@@ -174,8 +174,21 @@
 RoutingTableEntry::Print (Ptr<OutputStreamWrapper> stream, Time::Unit unit /* = Time::S */) const
 {
   std::ostream* os = stream->GetStream ();
-  *os << m_ipv4Route->GetDestination () << "\t" << m_ipv4Route->GetGateway ()
-      << "\t" << m_iface.GetLocal () << "\t";
+  // Copy the current ostream state
+  std::ios oldState (nullptr);
+  oldState.copyfmt (*os);
+
+  *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
+
+  std::ostringstream dest, gw, iface, expire;
+  dest << m_ipv4Route->GetDestination ();
+  gw << m_ipv4Route->GetGateway ();
+  iface << m_iface.GetLocal ();
+  expire << std::setprecision (2) << (m_lifeTime - Simulator::Now ()).As (unit);
+  *os << std::setw (16) << dest.str();
+  *os << std::setw (16) << gw.str();
+  *os << std::setw (16) << iface.str();
+  *os << std::setw (16);
   switch (m_flag)
     {
     case VALID:
@@ -194,11 +207,11 @@
         break;
       }
     }
-  *os << "\t";
-  *os << std::setiosflags (std::ios::fixed) <<
-  std::setiosflags (std::ios::left) << std::setprecision (2) <<
-  std::setw (14) << (m_lifeTime - Simulator::Now ()).As (unit);
-  *os << "\t" << m_hops << "\n";
+
+  *os << std::setw (16) << expire.str();
+  *os << m_hops << std::endl;
+  // Restore the previous ostream state
+  (*os).copyfmt (oldState);
 }
 
 /*
@@ -468,8 +481,19 @@
 {
   std::map<Ipv4Address, RoutingTableEntry> table = m_ipv4AddressEntry;
   Purge (table);
-  *stream->GetStream () << "\nAODV Routing table\n"
-                        << "Destination\tGateway\t\tInterface\tFlag\tExpire\t\tHops\n";
+  std::ostream* os = stream->GetStream ();
+  // Copy the current ostream state
+  std::ios oldState (nullptr);
+  oldState.copyfmt (*os);
+
+  *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
+  *os << "\nAODV Routing table\n";
+  *os << std::setw (16) << "Destination";
+  *os << std::setw (16) << "Gateway";
+  *os << std::setw (16) << "Interface";
+  *os << std::setw (16) << "Flag";
+  *os << std::setw (16) << "Expire";
+  *os << "Hops" << std::endl;
   for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i =
          table.begin (); i != table.end (); ++i)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/aodv/model/aodv-rtable.h ns-3.34/src/aodv/model/aodv-rtable.h
--- ns-3.33/src/aodv/model/aodv-rtable.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/aodv/model/aodv-rtable.h	2021-07-14 10:31:06.000000000 -0700
@@ -340,6 +340,7 @@
   /**
    * Print packet to trace file
    * \param stream The output stream
+   * \param unit The time unit to use (default Time::S)
    */
   void Print (Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S) const;
 
@@ -395,10 +396,20 @@
   RoutingTable (Time t);
   ///\name Handle lifetime of invalid route
   //\{
+  /**
+   * Get the lifetime of a bad link
+   *
+   * \return the lifetime of a bad link
+   */
   Time GetBadLinkLifetime () const
   {
     return m_badLinkLifetime;
   }
+  /**
+   * Set the lifetime of a bad link
+   *
+   * \param t the lifetime of a bad link
+   */
   void SetBadLinkLifetime (Time t)
   {
     m_badLinkLifetime = t;
@@ -480,6 +491,7 @@
   /**
    * Print routing table
    * \param stream the output stream
+   * \param unit The time unit to use (default Time::S)
    */
   void Print (Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/applications/bindings/modulegen__gcc_ILP32.py ns-3.34/src/applications/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/applications/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/applications/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -48,6 +48,10 @@
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator', 'ns3::AttributeConstructionList::CIterator')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator*', 'ns3::AttributeConstructionList::CIterator*')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator&', 'ns3::AttributeConstructionList::CIterator&')
+    ## bit-deserializer.h (module 'network'): ns3::BitDeserializer [class]
+    module.add_class('BitDeserializer', import_from_module='ns.network')
+    ## bit-serializer.h (module 'network'): ns3::BitSerializer [class]
+    module.add_class('BitSerializer', import_from_module='ns.network')
     ## buffer.h (module 'network'): ns3::Buffer [class]
     module.add_class('Buffer', import_from_module='ns.network')
     ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
@@ -123,12 +127,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -229,7 +237,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## queue-size.h (module 'network'): ns3::QueueSize [class]
@@ -826,6 +834,7 @@
     module.add_class('PbbAddressTlv', import_from_module='ns.network', parent=root_module['ns3::PbbTlv'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
+    module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type='list')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
@@ -1003,6 +1012,8 @@
     register_Ns3AsciiTraceHelperForDevice_methods(root_module, root_module['ns3::AsciiTraceHelperForDevice'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
+    register_Ns3BitDeserializer_methods(root_module, root_module['ns3::BitDeserializer'])
+    register_Ns3BitSerializer_methods(root_module, root_module['ns3::BitSerializer'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
     register_Ns3BulkSendHelper_methods(root_module, root_module['ns3::BulkSendHelper'])
@@ -1036,8 +1047,10 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac16Address_methods(root_module, root_module['ns3::Mac16Address'])
@@ -1568,6 +1581,52 @@
     cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
     return
 
+def register_Ns3BitDeserializer_methods(root_module, cls):
+    ## bit-deserializer.h (module 'network'): ns3::BitDeserializer::BitDeserializer(ns3::BitDeserializer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BitDeserializer const &', 'arg0')])
+    ## bit-deserializer.h (module 'network'): ns3::BitDeserializer::BitDeserializer() [constructor]
+    cls.add_constructor([])
+    ## bit-deserializer.h (module 'network'): uint64_t ns3::BitDeserializer::GetBits(uint8_t size) [member function]
+    cls.add_method('GetBits', 
+                   'uint64_t', 
+                   [param('uint8_t', 'size')])
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushByte(uint8_t byte) [member function]
+    cls.add_method('PushByte', 
+                   'void', 
+                   [param('uint8_t', 'byte')])
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(std::vector<unsigned char, std::allocator<unsigned char> > bytes) [member function]
+    cls.add_method('PushBytes', 
+                   'void', 
+                   [param('std::vector< unsigned char >', 'bytes')])
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(uint8_t * bytes, uint32_t size) [member function]
+    cls.add_method('PushBytes', 
+                   'void', 
+                   [param('uint8_t *', 'bytes'), param('uint32_t', 'size')])
+    return
+
+def register_Ns3BitSerializer_methods(root_module, cls):
+    ## bit-serializer.h (module 'network'): ns3::BitSerializer::BitSerializer(ns3::BitSerializer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BitSerializer const &', 'arg0')])
+    ## bit-serializer.h (module 'network'): ns3::BitSerializer::BitSerializer() [constructor]
+    cls.add_constructor([])
+    ## bit-serializer.h (module 'network'): std::vector<unsigned char, std::allocator<unsigned char> > ns3::BitSerializer::GetBytes() [member function]
+    cls.add_method('GetBytes', 
+                   'std::vector< unsigned char >', 
+                   [])
+    ## bit-serializer.h (module 'network'): uint8_t ns3::BitSerializer::GetBytes(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('GetBytes', 
+                   'uint8_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## bit-serializer.h (module 'network'): void ns3::BitSerializer::InsertPaddingAtEnd(bool padAtEnd) [member function]
+    cls.add_method('InsertPaddingAtEnd', 
+                   'void', 
+                   [param('bool', 'padAtEnd')])
+    ## bit-serializer.h (module 'network'): void ns3::BitSerializer::PushBits(uint64_t value, uint8_t significantBits) [member function]
+    cls.add_method('PushBits', 
+                   'void', 
+                   [param('uint64_t', 'value'), param('uint8_t', 'significantBits')])
+    return
+
 def register_Ns3Buffer_methods(root_module, cls):
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
@@ -2046,6 +2105,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2579,6 +2646,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2792,6 +2871,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2867,6 +2951,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2887,6 +2983,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5919,10 +6020,10 @@
     cls.add_method('SetHeMuFields', 
                    'void', 
                    [param('uint16_t', 'flags1'), param('uint16_t', 'flags2'), param('std::array< unsigned char, 4 > const &', 'ruChannel1'), param('std::array< unsigned char, 4 > const &', 'ruChannel2')])
-    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetHeMuPerUserFields(uint16_t per_user_1, uint16_t per_user_2, uint8_t perUserPosition, uint8_t perUserKnown) [member function]
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetHeMuPerUserFields(uint16_t perUser1, uint16_t perUser2, uint8_t perUserPosition, uint8_t perUserKnown) [member function]
     cls.add_method('SetHeMuPerUserFields', 
                    'void', 
-                   [param('uint16_t', 'per_user_1'), param('uint16_t', 'per_user_2'), param('uint8_t', 'perUserPosition'), param('uint8_t', 'perUserKnown')])
+                   [param('uint16_t', 'perUser1'), param('uint16_t', 'perUser2'), param('uint8_t', 'perUserPosition'), param('uint8_t', 'perUserKnown')])
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetMcsFields(uint8_t known, uint8_t flags, uint8_t mcs) [member function]
     cls.add_method('SetMcsFields', 
                    'void', 
@@ -6623,10 +6724,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -11285,6 +11386,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -11310,6 +11416,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -11371,6 +11482,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -11396,6 +11512,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/applications/bindings/modulegen__gcc_LP64.py ns-3.34/src/applications/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/applications/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/applications/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -48,6 +48,10 @@
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator', 'ns3::AttributeConstructionList::CIterator')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator*', 'ns3::AttributeConstructionList::CIterator*')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator&', 'ns3::AttributeConstructionList::CIterator&')
+    ## bit-deserializer.h (module 'network'): ns3::BitDeserializer [class]
+    module.add_class('BitDeserializer', import_from_module='ns.network')
+    ## bit-serializer.h (module 'network'): ns3::BitSerializer [class]
+    module.add_class('BitSerializer', import_from_module='ns.network')
     ## buffer.h (module 'network'): ns3::Buffer [class]
     module.add_class('Buffer', import_from_module='ns.network')
     ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
@@ -123,12 +127,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -229,7 +237,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## queue-size.h (module 'network'): ns3::QueueSize [class]
@@ -826,6 +834,7 @@
     module.add_class('PbbAddressTlv', import_from_module='ns.network', parent=root_module['ns3::PbbTlv'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
+    module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type='list')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
@@ -1003,6 +1012,8 @@
     register_Ns3AsciiTraceHelperForDevice_methods(root_module, root_module['ns3::AsciiTraceHelperForDevice'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
+    register_Ns3BitDeserializer_methods(root_module, root_module['ns3::BitDeserializer'])
+    register_Ns3BitSerializer_methods(root_module, root_module['ns3::BitSerializer'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
     register_Ns3BulkSendHelper_methods(root_module, root_module['ns3::BulkSendHelper'])
@@ -1036,8 +1047,10 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac16Address_methods(root_module, root_module['ns3::Mac16Address'])
@@ -1568,6 +1581,52 @@
     cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
     return
 
+def register_Ns3BitDeserializer_methods(root_module, cls):
+    ## bit-deserializer.h (module 'network'): ns3::BitDeserializer::BitDeserializer(ns3::BitDeserializer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BitDeserializer const &', 'arg0')])
+    ## bit-deserializer.h (module 'network'): ns3::BitDeserializer::BitDeserializer() [constructor]
+    cls.add_constructor([])
+    ## bit-deserializer.h (module 'network'): uint64_t ns3::BitDeserializer::GetBits(uint8_t size) [member function]
+    cls.add_method('GetBits', 
+                   'uint64_t', 
+                   [param('uint8_t', 'size')])
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushByte(uint8_t byte) [member function]
+    cls.add_method('PushByte', 
+                   'void', 
+                   [param('uint8_t', 'byte')])
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(std::vector<unsigned char, std::allocator<unsigned char> > bytes) [member function]
+    cls.add_method('PushBytes', 
+                   'void', 
+                   [param('std::vector< unsigned char >', 'bytes')])
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(uint8_t * bytes, uint32_t size) [member function]
+    cls.add_method('PushBytes', 
+                   'void', 
+                   [param('uint8_t *', 'bytes'), param('uint32_t', 'size')])
+    return
+
+def register_Ns3BitSerializer_methods(root_module, cls):
+    ## bit-serializer.h (module 'network'): ns3::BitSerializer::BitSerializer(ns3::BitSerializer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BitSerializer const &', 'arg0')])
+    ## bit-serializer.h (module 'network'): ns3::BitSerializer::BitSerializer() [constructor]
+    cls.add_constructor([])
+    ## bit-serializer.h (module 'network'): std::vector<unsigned char, std::allocator<unsigned char> > ns3::BitSerializer::GetBytes() [member function]
+    cls.add_method('GetBytes', 
+                   'std::vector< unsigned char >', 
+                   [])
+    ## bit-serializer.h (module 'network'): uint8_t ns3::BitSerializer::GetBytes(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('GetBytes', 
+                   'uint8_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## bit-serializer.h (module 'network'): void ns3::BitSerializer::InsertPaddingAtEnd(bool padAtEnd) [member function]
+    cls.add_method('InsertPaddingAtEnd', 
+                   'void', 
+                   [param('bool', 'padAtEnd')])
+    ## bit-serializer.h (module 'network'): void ns3::BitSerializer::PushBits(uint64_t value, uint8_t significantBits) [member function]
+    cls.add_method('PushBits', 
+                   'void', 
+                   [param('uint64_t', 'value'), param('uint8_t', 'significantBits')])
+    return
+
 def register_Ns3Buffer_methods(root_module, cls):
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
@@ -2046,6 +2105,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2579,6 +2646,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2792,6 +2871,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2867,6 +2951,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2887,6 +2983,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5919,10 +6020,10 @@
     cls.add_method('SetHeMuFields', 
                    'void', 
                    [param('uint16_t', 'flags1'), param('uint16_t', 'flags2'), param('std::array< unsigned char, 4 > const &', 'ruChannel1'), param('std::array< unsigned char, 4 > const &', 'ruChannel2')])
-    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetHeMuPerUserFields(uint16_t per_user_1, uint16_t per_user_2, uint8_t perUserPosition, uint8_t perUserKnown) [member function]
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetHeMuPerUserFields(uint16_t perUser1, uint16_t perUser2, uint8_t perUserPosition, uint8_t perUserKnown) [member function]
     cls.add_method('SetHeMuPerUserFields', 
                    'void', 
-                   [param('uint16_t', 'per_user_1'), param('uint16_t', 'per_user_2'), param('uint8_t', 'perUserPosition'), param('uint8_t', 'perUserKnown')])
+                   [param('uint16_t', 'perUser1'), param('uint16_t', 'perUser2'), param('uint8_t', 'perUserPosition'), param('uint8_t', 'perUserKnown')])
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetMcsFields(uint8_t known, uint8_t flags, uint8_t mcs) [member function]
     cls.add_method('SetMcsFields', 
                    'void', 
@@ -6623,10 +6724,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -11285,6 +11386,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -11310,6 +11416,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -11371,6 +11482,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -11396,6 +11512,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/applications/model/bulk-send-application.h ns-3.34/src/applications/model/bulk-send-application.h
--- ns-3.33/src/applications/model/bulk-send-application.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/applications/model/bulk-send-application.h	2021-07-14 10:31:06.000000000 -0700
@@ -151,8 +151,13 @@
   void ConnectionFailed (Ptr<Socket> socket);
   /**
    * \brief Send more data as soon as some has been transmitted.
+   *
+   * Used in socket's SetSendCallback - params are forced by it.
+   *
+   * \param socket socket to use
+   * \param unused actually unused
    */
-  void DataSend (Ptr<Socket>, uint32_t); // for socket's SetSendCallback
+  void DataSend (Ptr<Socket> socket, uint32_t unused);
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/applications/model/udp-server.cc ns-3.34/src/applications/model/udp-server.cc
--- ns-3.33/src/applications/model/udp-server.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/applications/model/udp-server.cc	2021-07-14 10:31:06.000000000 -0700
@@ -176,12 +176,13 @@
       m_rxTraceWithAddresses (packet, from, localAddress);
       if (packet->GetSize () > 0)
         {
+          uint32_t receivedSize = packet->GetSize ();
           SeqTsHeader seqTs;
           packet->RemoveHeader (seqTs);
           uint32_t currentSequenceNumber = seqTs.GetSeq ();
           if (InetSocketAddress::IsMatchingType (from))
             {
-              NS_LOG_INFO ("TraceDelay: RX " << packet->GetSize () <<
+              NS_LOG_INFO ("TraceDelay: RX " << receivedSize <<
                            " bytes from "<< InetSocketAddress::ConvertFrom (from).GetIpv4 () <<
                            " Sequence Number: " << currentSequenceNumber <<
                            " Uid: " << packet->GetUid () <<
@@ -191,7 +192,7 @@
             }
           else if (Inet6SocketAddress::IsMatchingType (from))
             {
-              NS_LOG_INFO ("TraceDelay: RX " << packet->GetSize () <<
+              NS_LOG_INFO ("TraceDelay: RX " << receivedSize <<
                            " bytes from "<< Inet6SocketAddress::ConvertFrom (from).GetIpv6 () <<
                            " Sequence Number: " << currentSequenceNumber <<
                            " Uid: " << packet->GetUid () <<
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/applications/test/bulk-send-application-test-suite.cc ns-3.34/src/applications/test/bulk-send-application-test-suite.cc
--- ns-3.33/src/applications/test/bulk-send-application-test-suite.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/applications/test/bulk-send-application-test-suite.cc	2021-07-14 10:31:06.000000000 -0700
@@ -39,6 +39,12 @@
 
 using namespace ns3;
 
+/**
+ * \ingroup applications-test
+ * \ingroup tests
+ *
+ * Basic test, checks that the right quantity of packets are sent and received.
+ */
 class BulkSendBasicTestCase : public TestCase
 {
 public:
@@ -47,10 +53,19 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Record a packet successfully sent
+   * \param p the packet
+   */
   void SendTx (Ptr<const Packet> p);
+  /**
+   * Record a packet successfully received
+   * \param p the packet
+   * \param addr the sender's address
+   */
   void ReceiveRx (Ptr<const Packet> p, const Address& addr); 
-  uint64_t m_sent {0};
-  uint64_t m_received {0};
+  uint64_t m_sent {0};      //!< number of bytes sent
+  uint64_t m_received {0};  //!< number of bytes received
 };
 
 BulkSendBasicTestCase::BulkSendBasicTestCase ()
@@ -118,9 +133,14 @@
   NS_TEST_ASSERT_MSG_EQ (m_received, 300000, "Received the full 300000 bytes");
 }
 
-// This test checks that the sequence number is sent and received in sequence
-// despite the sending application having to pause and restart its sending
-// due to a temporarily full transmit buffer.
+/**
+ * \ingroup applications-test
+ * \ingroup tests
+ *
+ * This test checks that the sequence number is sent and received in sequence
+ * despite the sending application having to pause and restart its sending
+ * due to a temporarily full transmit buffer.
+ */
 class BulkSendSeqTsSizeTestCase : public TestCase
 {
 public:
@@ -129,14 +149,28 @@
 
 private:
   virtual void DoRun (void);
+  /**
+   * Record a packet successfully sent
+   * \param p the packet
+   * \param from source address
+   * \param to destination address
+   * \param header the SeqTsSizeHeader
+   */
   void SendTx (Ptr<const Packet> p, const Address &from, const Address & to, const SeqTsSizeHeader &header);
+  /**
+   * Record a packet successfully received
+   * \param p the packet
+   * \param from source address
+   * \param to destination address
+   * \param header the SeqTsSizeHeader
+   */
   void ReceiveRx (Ptr<const Packet> p, const Address &from, const Address & to, const SeqTsSizeHeader &header);
-  uint64_t m_sent {0};
-  uint64_t m_received {0};
-  uint64_t m_seqTxCounter {0};
-  uint64_t m_seqRxCounter {0};
-  Time m_lastTxTs {Seconds (0)};
-  Time m_lastRxTs {Seconds (0)};
+  uint64_t m_sent {0};            //!< number of bytes sent
+  uint64_t m_received {0};        //!< number of bytes received
+  uint64_t m_seqTxCounter {0};    //!< Counter for Sequences on Tx
+  uint64_t m_seqRxCounter {0};    //!< Counter for Sequences on Rx
+  Time m_lastTxTs {Seconds (0)};  //!< Last recored timestamp on Tx
+  Time m_lastRxTs {Seconds (0)};  //!< Last recored timestamp on Rx
 };
 
 BulkSendSeqTsSizeTestCase::BulkSendSeqTsSizeTestCase ()
@@ -216,6 +250,12 @@
   NS_TEST_ASSERT_MSG_EQ (m_received, 300000, "Received the full 300000 bytes");
 }
 
+/**
+ * \ingroup applications-test
+ * \ingroup tests
+ *
+ * \brief BulkSend TestSuite
+ */
 class BulkSendTestSuite : public TestSuite
 {
 public:
@@ -229,5 +269,5 @@
   AddTestCase (new BulkSendSeqTsSizeTestCase, TestCase::QUICK);
 }
 
-static BulkSendTestSuite g_bulkSendTestSuite;
+static BulkSendTestSuite g_bulkSendTestSuite; //!< Static variable for test initialization
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/applications/test/three-gpp-http-client-server-test.cc ns-3.34/src/applications/test/three-gpp-http-client-server-test.cc
--- ns-3.33/src/applications/test/three-gpp-http-client-server-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/applications/test/three-gpp-http-client-server-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -57,6 +57,8 @@
 
 /**
  * \ingroup http
+ * \ingroup applications-test
+ * \ingroup tests
  * A test class which verifies that each HTTP object sent is also received the
  * same size.
  *
@@ -785,6 +787,8 @@
 
 /**
  * \ingroup http
+ * \ingroup applications-test
+ * \ingroup tests
  * A test class for running several system tests which validate the web
  * browsing traffic model.
  *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/applications/wscript ns-3.34/src/applications/wscript
--- ns-3.33/src/applications/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/applications/wscript	2021-07-14 10:31:06.000000000 -0700
@@ -1,7 +1,7 @@
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 
 def build(bld):
-    module = bld.create_ns3_module('applications', ['internet', 'config-store','stats'])
+    module = bld.create_ns3_module('applications', ['internet', 'stats'])
     module.source = [
         'model/bulk-send-application.cc',
         'model/onoff-application.cc',
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/bridge/bindings/modulegen__gcc_ILP32.py ns-3.34/src/bridge/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/bridge/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/bridge/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -75,12 +75,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -380,8 +384,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1270,6 +1276,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1483,6 +1501,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1558,6 +1581,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1578,6 +1613,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/bridge/bindings/modulegen__gcc_LP64.py ns-3.34/src/bridge/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/bridge/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/bridge/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -75,12 +75,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -380,8 +384,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1270,6 +1276,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1483,6 +1501,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1558,6 +1581,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1578,6 +1613,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/bridge/helper/bridge-helper.cc ns-3.34/src/bridge/helper/bridge-helper.cc
--- ns-3.33/src/bridge/helper/bridge-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/bridge/helper/bridge-helper.cc	2021-07-14 10:31:06.000000000 -0700
@@ -23,7 +23,7 @@
 #include "ns3/names.h"
 
 /**
- * \filez
+ * \file
  * \ingroup bridge
  * ns3::BridgeHelper implementation.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/brite/wscript ns-3.34/src/brite/wscript
--- ns-3.33/src/brite/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/brite/wscript	2021-07-14 10:31:06.000000000 -0700
@@ -59,7 +59,7 @@
 }
 '''
 
-    conf.env['DL'] = conf.check(mandatory=True, lib='dl', define_name='DL', uselib_store='DL')
+    conf.env['HAVE_DL'] = conf.check(mandatory=True, lib='dl', define_name='HAVE_DL', uselib_store='DL')
 
     conf.env['LIBPATH_BRITE'] = [os.path.abspath(os.path.join(conf.env['WITH_BRITE'], '.'))]
 
@@ -98,7 +98,7 @@
         #   'test/brite-examples-test-suite.cc',
             ])
     
-    if bld.env['BRITE'] and bld.env['DL']:
+    if bld.env['BRITE'] and bld.env['HAVE_DL']:
         module.use.extend(['BRITE', 'DL'])
         module_test.use.extend(['BRITE', 'DL'])
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/buildings/bindings/modulegen__gcc_ILP32.py ns-3.34/src/buildings/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/buildings/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/buildings/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -97,12 +97,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -588,8 +592,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1235,16 +1241,6 @@
                    'void', 
                    [param('ns3::NodeContainer', 'c')], 
                    is_static=True)
-    ## buildings-helper.h (module 'buildings'): static void ns3::BuildingsHelper::MakeConsistent(ns3::Ptr<ns3::MobilityModel> mm) [member function]
-    cls.add_method('MakeConsistent', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'mm')], 
-                   deprecated=True, is_static=True)
-    ## buildings-helper.h (module 'buildings'): static void ns3::BuildingsHelper::MakeMobilityModelConsistent() [member function]
-    cls.add_method('MakeMobilityModelConsistent', 
-                   'void', 
-                   [], 
-                   deprecated=True, is_static=True)
     return
 
 def register_Ns3ByteTagIterator_methods(root_module, cls):
@@ -1749,6 +1745,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1962,6 +1970,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2037,6 +2050,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2057,6 +2082,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5703,11 +5733,6 @@
     cls.add_method('IsIndoor', 
                    'bool', 
                    [])
-    ## mobility-building-info.h (module 'buildings'): bool ns3::MobilityBuildingInfo::IsOutdoor() [member function]
-    cls.add_method('IsOutdoor', 
-                   'bool', 
-                   [], 
-                   deprecated=True)
     ## mobility-building-info.h (module 'buildings'): void ns3::MobilityBuildingInfo::MakeConsistent(ns3::Ptr<ns3::MobilityModel> mm) [member function]
     cls.add_method('MakeConsistent', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/buildings/bindings/modulegen__gcc_LP64.py ns-3.34/src/buildings/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/buildings/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/buildings/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -97,12 +97,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -588,8 +592,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1235,16 +1241,6 @@
                    'void', 
                    [param('ns3::NodeContainer', 'c')], 
                    is_static=True)
-    ## buildings-helper.h (module 'buildings'): static void ns3::BuildingsHelper::MakeConsistent(ns3::Ptr<ns3::MobilityModel> mm) [member function]
-    cls.add_method('MakeConsistent', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'mm')], 
-                   deprecated=True, is_static=True)
-    ## buildings-helper.h (module 'buildings'): static void ns3::BuildingsHelper::MakeMobilityModelConsistent() [member function]
-    cls.add_method('MakeMobilityModelConsistent', 
-                   'void', 
-                   [], 
-                   deprecated=True, is_static=True)
     return
 
 def register_Ns3ByteTagIterator_methods(root_module, cls):
@@ -1749,6 +1745,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1962,6 +1970,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2037,6 +2050,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2057,6 +2082,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5703,11 +5733,6 @@
     cls.add_method('IsIndoor', 
                    'bool', 
                    [])
-    ## mobility-building-info.h (module 'buildings'): bool ns3::MobilityBuildingInfo::IsOutdoor() [member function]
-    cls.add_method('IsOutdoor', 
-                   'bool', 
-                   [], 
-                   deprecated=True)
     ## mobility-building-info.h (module 'buildings'): void ns3::MobilityBuildingInfo::MakeConsistent(ns3::Ptr<ns3::MobilityModel> mm) [member function]
     cls.add_method('MakeConsistent', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/buildings/helper/buildings-helper.cc ns-3.34/src/buildings/helper/buildings-helper.cc
--- ns-3.33/src/buildings/helper/buildings-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/buildings/helper/buildings-helper.cc	2021-07-14 10:31:06.000000000 -0700
@@ -58,50 +58,4 @@
   model->AggregateObject (buildingInfo);
 }
 
-
-void
-BuildingsHelper::MakeMobilityModelConsistent ()
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  for (NodeList::Iterator nit = NodeList::Begin (); nit != NodeList::End (); ++nit)
-    {
-      Ptr<MobilityModel> mm = (*nit)->GetObject<MobilityModel> ();
-      if (mm != 0)
-        {
-          Ptr<MobilityBuildingInfo> bmm = mm->GetObject<MobilityBuildingInfo> ();
-          NS_ABORT_MSG_UNLESS (0 != bmm, "node " << (*nit)->GetId () << " has a MobilityModel that does not have a MobilityBuildingInfo");
-          bmm->MakeConsistent (mm);
-        }
-    }
-}
-
-
-void
-BuildingsHelper::MakeConsistent (Ptr<MobilityModel> mm)
-{
-  Ptr<MobilityBuildingInfo> bmm = mm->GetObject<MobilityBuildingInfo> ();
-  bool found = false;
-  for (BuildingList::Iterator bit = BuildingList::Begin (); bit != BuildingList::End (); ++bit)
-    {
-      NS_LOG_LOGIC ("checking building " << (*bit)->GetId () << " with boundaries " << (*bit)->GetBoundaries ());
-      Vector pos = mm->GetPosition ();
-      if ((*bit)->IsInside (pos))
-        {
-          NS_LOG_LOGIC ("MobilityBuildingInfo " << bmm << " pos " << mm->GetPosition () << " falls inside building " << (*bit)->GetId ());
-          NS_ABORT_MSG_UNLESS (found == false, " MobilityBuildingInfo already inside another building!");
-          found = true;
-          uint16_t floor = (*bit)->GetFloor (pos);
-          uint16_t roomX = (*bit)->GetRoomX (pos);
-          uint16_t roomY = (*bit)->GetRoomY (pos);
-          bmm->SetIndoor (*bit, floor, roomX, roomY);
-        }
-    }
-  if (!found)
-    {
-      NS_LOG_LOGIC ("MobilityBuildingInfo " << bmm << " pos " << mm->GetPosition ()  << " is outdoor");
-      bmm->SetOutdoor ();
-    }
-
-}
-
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/buildings/helper/buildings-helper.h ns-3.34/src/buildings/helper/buildings-helper.h
--- ns-3.33/src/buildings/helper/buildings-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/buildings/helper/buildings-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -48,34 +48,8 @@
   * \param c the NodeContainer including the nodes to be updated
   */
   static void Install (NodeContainer c);     // for any nodes
-  /**
-  * \brief This method goes through the whole NodeList and, for each node in
-  * the list, calls BuildingsHelper::MakeConsistent() passing to it
-  * the MobilityModel of that node.
-  *
-  * \deprecated This method will go away in future release of ns-3.
-  * A node position will be make consistent by the method \c IsInside () of
-  * \c MobilityBuildingInfo class.
-  *
-  */
-  NS_DEPRECATED_3_31
-  static void MakeMobilityModelConsistent ();
-  /**
-   * \brief Make the given mobility model consistent, by determining whether
-   * its position falls inside any of the building in BuildingList, and
-   * updating accordingly the BuildingInfo aggregated with the MobilityModel.
-   *
-   * \param mm the mobility model to be made consistent
-   *
-   * \deprecated This method will go away in future release of ns-3.
-   * See instead \c MakeConsistent method of \c MobilityBuildingInfo class.
-   */
-  NS_DEPRECATED
-  static void MakeConsistent (Ptr<MobilityModel> mm);
-  
 };
 
-
 }
 
 #endif /* BUILDINGS_HELPER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/buildings/model/mobility-building-info.cc ns-3.34/src/buildings/model/mobility-building-info.cc
--- ns-3.33/src/buildings/model/mobility-building-info.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/buildings/model/mobility-building-info.cc	2021-07-14 10:31:06.000000000 -0700
@@ -89,14 +89,6 @@
   return m_indoor;
 }
 
-bool
-MobilityBuildingInfo::IsOutdoor (void)
-{
-  NS_LOG_FUNCTION (this);
-  bool isIndoor = IsIndoor ();
-  return (!isIndoor);
-}
-
 void
 MobilityBuildingInfo::SetIndoor (Ptr<Building> building, uint8_t nfloor, uint8_t nroomx, uint8_t nroomy)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/buildings/model/mobility-building-info.h ns-3.34/src/buildings/model/mobility-building-info.h
--- ns-3.33/src/buildings/model/mobility-building-info.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/buildings/model/mobility-building-info.h	2021-07-14 10:31:06.000000000 -0700
@@ -71,20 +71,6 @@
   bool IsIndoor (void);
 
   /** 
-   * 
-   * \brief Is outdoor function
-   *
-   * \return true if the MobilityBuildingInfo instance is outdoor, false otherwise
-   *
-   * \deprecated This method will go away in a future release of ns-3.
-   *  Calling \c IsIndoor () method of \c MobilityBuildingInfo class
-   *  will satisfy the need to determine if a node is inside or outside
-   *  a building.
-   */
-  NS_DEPRECATED_3_31
-  bool IsOutdoor (void);
-
-  /** 
    * \brief Mark this MobilityBuildingInfo instance as indoor
    * 
    * \param building the building into which the MobilityBuildingInfo instance is located
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/click/bindings/modulegen__gcc_ILP32.py ns-3.34/src/click/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/click/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/click/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -81,6 +81,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -91,6 +93,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -460,9 +464,11 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1445,6 +1451,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1719,6 +1737,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1794,6 +1817,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1814,6 +1849,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -3632,10 +3672,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/click/bindings/modulegen__gcc_LP64.py ns-3.34/src/click/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/click/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/click/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -81,6 +81,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -91,6 +93,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -460,9 +464,11 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1445,6 +1451,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1719,6 +1737,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1794,6 +1817,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1814,6 +1849,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -3632,10 +3672,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/click/model/ipv4-click-routing.cc ns-3.34/src/click/model/ipv4-click-routing.cc
--- ns-3.33/src/click/model/ipv4-click-routing.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/click/model/ipv4-click-routing.cc	2021-07-14 10:31:06.000000000 -0700
@@ -559,6 +559,7 @@
 void
 Ipv4ClickRouting::PrintRoutingTable (Ptr<OutputStreamWrapper> stream, Time::Unit unit) const
 {
+  *stream->GetStream () << "\nCLICK Routing table printing is not yet implemented, skipping.\n";
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/click/wscript ns-3.34/src/click/wscript
--- ns-3.33/src/click/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/click/wscript	2021-07-14 10:31:06.000000000 -0700
@@ -76,7 +76,7 @@
   return 0;
 }
 '''
-    conf.env['DL'] = conf.check(mandatory=True, lib='dl', define_name='DL', uselib_store='DL')
+    conf.env['HAVE_DL'] = conf.check(mandatory=True, lib='dl', define_name='HAVE_DL', uselib_store='DL')
 
     for tmp in ['lib', 'ns']:
         libdir = os.path.abspath(os.path.join(conf.env['WITH_NSCLICK'],tmp))
@@ -119,7 +119,7 @@
         #   'test/click-examples-test-suite.cc',
             ])
     
-    if bld.env['NSCLICK'] and bld.env['DL']:
+    if bld.env['NSCLICK'] and bld.env['HAVE_DL']:
         module.use.extend(['NSCLICK', 'DL'])
         module_test.use.extend(['NSCLICK', 'DL'])
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/config-store/bindings/modulegen__gcc_ILP32.py ns-3.34/src/config-store/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/config-store/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/config-store/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -38,6 +38,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## file-config.h (module 'config-store'): ns3::FileConfig [class]
     module.add_class('FileConfig', allow_subclassing=True)
+    ## gtk-config-store.h (module 'config-store'): ns3::GtkConfigStore [class]
+    module.add_class('GtkConfigStore')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -173,6 +175,7 @@
     register_Ns3DefaultDeleter__Ns3HashImplementation_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Hash::Implementation >'])
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3FileConfig_methods(root_module, root_module['ns3::FileConfig'])
+    register_Ns3GtkConfigStore_methods(root_module, root_module['ns3::GtkConfigStore'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3NoneFileConfig_methods(root_module, root_module['ns3::NoneFileConfig'])
@@ -323,6 +326,21 @@
                    is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3GtkConfigStore_methods(root_module, cls):
+    ## gtk-config-store.h (module 'config-store'): ns3::GtkConfigStore::GtkConfigStore(ns3::GtkConfigStore const & arg0) [constructor]
+    cls.add_constructor([param('ns3::GtkConfigStore const &', 'arg0')])
+    ## gtk-config-store.h (module 'config-store'): ns3::GtkConfigStore::GtkConfigStore() [constructor]
+    cls.add_constructor([])
+    ## gtk-config-store.h (module 'config-store'): void ns3::GtkConfigStore::ConfigureAttributes() [member function]
+    cls.add_method('ConfigureAttributes', 
+                   'void', 
+                   [])
+    ## gtk-config-store.h (module 'config-store'): void ns3::GtkConfigStore::ConfigureDefaults() [member function]
+    cls.add_method('ConfigureDefaults', 
+                   'void', 
+                   [])
+    return
+
 def register_Ns3Hasher_methods(root_module, cls):
     ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Hasher const & arg0) [constructor]
     cls.add_constructor([param('ns3::Hasher const &', 'arg0')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/config-store/bindings/modulegen__gcc_LP64.py ns-3.34/src/config-store/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/config-store/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/config-store/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -38,6 +38,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor'])
     ## file-config.h (module 'config-store'): ns3::FileConfig [class]
     module.add_class('FileConfig', allow_subclassing=True)
+    ## gtk-config-store.h (module 'config-store'): ns3::GtkConfigStore [class]
+    module.add_class('GtkConfigStore')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -173,6 +175,7 @@
     register_Ns3DefaultDeleter__Ns3HashImplementation_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Hash::Implementation >'])
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3FileConfig_methods(root_module, root_module['ns3::FileConfig'])
+    register_Ns3GtkConfigStore_methods(root_module, root_module['ns3::GtkConfigStore'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3NoneFileConfig_methods(root_module, root_module['ns3::NoneFileConfig'])
@@ -323,6 +326,21 @@
                    is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3GtkConfigStore_methods(root_module, cls):
+    ## gtk-config-store.h (module 'config-store'): ns3::GtkConfigStore::GtkConfigStore(ns3::GtkConfigStore const & arg0) [constructor]
+    cls.add_constructor([param('ns3::GtkConfigStore const &', 'arg0')])
+    ## gtk-config-store.h (module 'config-store'): ns3::GtkConfigStore::GtkConfigStore() [constructor]
+    cls.add_constructor([])
+    ## gtk-config-store.h (module 'config-store'): void ns3::GtkConfigStore::ConfigureAttributes() [member function]
+    cls.add_method('ConfigureAttributes', 
+                   'void', 
+                   [])
+    ## gtk-config-store.h (module 'config-store'): void ns3::GtkConfigStore::ConfigureDefaults() [member function]
+    cls.add_method('ConfigureDefaults', 
+                   'void', 
+                   [])
+    return
+
 def register_Ns3Hasher_methods(root_module, cls):
     ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Hasher const & arg0) [constructor]
     cls.add_constructor([param('ns3::Hasher const &', 'arg0')])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/config-store/model/attribute-default-iterator.h ns-3.34/src/config-store/model/attribute-default-iterator.h
--- ns-3.33/src/config-store/model/attribute-default-iterator.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/config-store/model/attribute-default-iterator.h	2021-07-14 10:31:06.000000000 -0700
@@ -43,19 +43,26 @@
   void Iterate (void);
 private:
   /**
-   * \brief Just an interface that needs to be implemented
+   * \brief Begin the analysis of a TypeId
+   * \param name TypeId name
    */
   virtual void StartVisitTypeId (std::string name);
   /**
-   * \brief Just an interface that needs to be implemented
+   * \brief End the analysis of a TypeId
    */
   virtual void EndVisitTypeId (void);
   /**
-   * \brief This method can be implemented, otherwise, it will call DoVisitAttribute
+   * \brief Visit an Attribute
+   * \param tid the TypeId the attribute belongs to
+   * \param name the Attribute name
+   * \param defaultValue the attribute default value
+   * \param index the index of the Attribute
    */
   virtual void VisitAttribute (TypeId tid, std::string name, std::string defaultValue, uint32_t index);
   /**
-   * \brief This method is just an interface and needs to be implemented
+   * \brief Visit an Attribute
+   * \param name the Attribute name
+   * \param defaultValue the attribute default value
    */
   virtual void DoVisitAttribute (std::string name, std::string defaultValue);
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/config-store/model/attribute-iterator.h ns-3.34/src/config-store/model/attribute-iterator.h
--- ns-3.33/src/config-store/model/attribute-iterator.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/config-store/model/attribute-iterator.h	2021-07-14 10:31:06.000000000 -0700
@@ -87,8 +87,7 @@
    *
    * \note type name ObjectVectorValue is an alias for ObjectPtrContainerValue
    *
-   * \param object the object on which the attribute of type ObjectVectorValue
-resides
+   * \param object the object on which the attribute of type ObjectVectorValue resides
    * \param name the attribute name provided
    * \param [in] vector the ObjectPtrContainerValue corresponding to the named attribute 
    */
@@ -161,8 +160,7 @@
    *
    * \note type name ObjectVectorValue is an alias for ObjectPtrContainerValue
    *
-   * \param object the object on which the attribute of type ObjectVectorValue
-resides
+   * \param object the object on which the attribute of type ObjectVectorValue resides
    * \param name the attribute name provided
    * \param [in] vector the ObjectPtrContainerValue corresponding to the named attribute 
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/config-store/model/config-store.h ns-3.34/src/config-store/model/config-store.h
--- ns-3.33/src/config-store/model/config-store.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/config-store/model/config-store.h	2021-07-14 10:31:06.000000000 -0700
@@ -121,12 +121,21 @@
 };
 
 /**
- * @{
- * \ingroup configstore
+ * \brief Stream insertion operator.
+ *
+ * \param [in] os The reference to the output stream.
+ * \param [in] mode The configStore mode.
+ * \returns The reference to the output stream.
  */
 std::ostream & operator << (std::ostream & os, ConfigStore::Mode & mode);
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param [in] os The reference to the output stream.
+ * \param [in] format The configStore file format.
+ * \returns The reference to the output stream.
+ */
 std::ostream & operator << (std::ostream & os, ConfigStore::FileFormat & format);
-/**@}*/
 
 }  // namespace ns3
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/config-store/model/display-functions.cc ns-3.34/src/config-store/model/display-functions.cc
--- ns-3.33/src/config-store/model/display-functions.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/config-store/model/display-functions.cc	2021-07-14 10:31:06.000000000 -0700
@@ -24,7 +24,7 @@
 #include "ns3/pointer.h"
 
 namespace ns3 {
-/**
+/*
  * This function includes the name of the attribute or the editable value
  * in the second column
  */
@@ -51,7 +51,7 @@
       g_object_set (renderer, "editable", FALSE, (char*) 0);
     }
 }
-/**
+/*
  * This function includes the name of the object, pointer, vector or vector item
  * in the first column
  */
@@ -91,7 +91,7 @@
   }
 }
 
-/**
+/*
  * This is the callback called when the value of an attribute is changed
  */
 void
@@ -111,7 +111,7 @@
   node->object->SetAttribute (node->name, StringValue (new_text));
 }
 
-/**
+/*
  * This function gets the column number 0 or 1 from the mouse
  * click
  */
@@ -128,7 +128,7 @@
   return num;
 }
 
-/**
+/*
  * This function displays the tooltip for an object, pointer, vector
  * item or an attribute
  */
@@ -230,7 +230,7 @@
   return FALSE;
 }
 
-/**
+/*
  * This is the main view opening the widget, getting tooltips and drawing the
  * tree of attributes...
  */
@@ -271,7 +271,7 @@
   return view;
 }
 
-/**
+/*
  * Exit the window when exit button is pressed
  */
 void
@@ -281,7 +281,7 @@
   gtk_widget_hide (GTK_WIDGET (user_data));
 }
 
-/**
+/*
  * Exit the application
  */
 gboolean
@@ -292,7 +292,7 @@
   return TRUE;
 }
 
-/**
+/*
  * Delete the tree model contents
  */
 gboolean
@@ -310,8 +310,8 @@
   return FALSE;
 }
 
-/**************************     display functions used by default configurator **********************/
-/**
+//     display functions used by default configurator
+/*
  * This function writes data in the second column, this data is going to be editable
  * if it is a NODE_ATTRIBUTE
  */
@@ -337,7 +337,7 @@
       g_object_set (renderer, "editable", FALSE, (char*) 0);
     }
 }
-/**
+/*
  * This function writes the attribute or typeid name in the column 0
  */
 void
@@ -364,7 +364,7 @@
 }
 
 
-/**
+/*
  *  This functions is called whenever there is a change in the value of an attribute
  *  If the input value is ok, it will be updated in the default value and in the
  *  gui, otherwise, it won't be updated in both.
@@ -389,12 +389,12 @@
     }
 }
 
-/**
+/*
  * This function is used to display a tooltip whenever the user puts the mouse
  * over a type ID or an attribute. It will give the type and the possible values of
  * an attribute value and the type of the object for an attribute object or a
  * typeID object
-
+ *
  * \param widget is the display object
  * \param x is the x position
  * \param y is the y position
@@ -464,7 +464,7 @@
   return FALSE;
 }
 
-/**
+/*
  * This is the action done when the user presses on the save button.
  * It will save the config to a file.
  *
@@ -507,7 +507,7 @@
   g_object_unref (native);
 }
 
-/**
+/*
  * If the user presses the button load, it will load the config file into memory.
  *
  * \param button (unused)
@@ -542,7 +542,7 @@
   g_object_unref (native);
 }
 
-/**
+/*
  * This is the action done when the user presses on the save button.
  * It will save the config to a file.
  *
@@ -585,7 +585,7 @@
   g_object_unref (native);
 }
 
-/**
+/*
  * If the user presses the button load, it will load the config file into memory.
  *
  * \param button (unused)
@@ -620,7 +620,7 @@
   g_object_unref (native);
 }
 
-/**
+/*
  * This is the main view opening the widget, getting tooltips and drawing the
  * tree of attributes
  */
@@ -661,7 +661,7 @@
   return view;
 }
 
-/**
+/*
  * Delete the tree model contents
  */
 gboolean
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/config-store/model/display-functions.h ns-3.34/src/config-store/model/display-functions.h
--- ns-3.33/src/config-store/model/display-functions.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/config-store/model/display-functions.h	2021-07-14 10:31:06.000000000 -0700
@@ -27,6 +27,12 @@
 /**
  * This function includes the name of the attribute or the editable value
  * in the second column 
+ *
+ * \param col Pointer to the GtkTreeViewColumn
+ * \param renderer Pointer to the GtkCellRenderer
+ * \param model Pointer to the GtkTreeModel
+ * \param iter  Pointer to the GtkTreeIter
+ * \param user_data Pointer to the data to be displayed (or modified)
  */
 void
 cell_data_function_col_1 (GtkTreeViewColumn *col, GtkCellRenderer *renderer,
@@ -34,12 +40,22 @@
 /**
  * This function includes the name of the object, pointer, vector or vector item
  * in the first column
+ * \param col Pointer to the GtkTreeViewColumn
+ * \param renderer Pointer to the GtkCellRenderer
+ * \param model Pointer to the GtkTreeModel
+ * \param iter  Pointer to the GtkTreeIter
+ * \param user_data Pointer to the data to be displayed (or modified)
  */
 void
 cell_data_function_col_0 (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model,
                           GtkTreeIter *iter, gpointer user_data);
 /**
  * This is the callback called when the value of an attribute is changed
+ *
+ *  \param cell the changed cell
+ *  \param path_string the path
+ *  \param new_text the updated text in the cell
+ *  \param user_data user data
  */
 void
 cell_edited_callback (GtkCellRendererText *cell, gchar *path_string,
@@ -47,12 +63,22 @@
 /**
  * This function gets the column number 0 or 1 from the mouse
  * click
+ * \param col the column being clicked
+ * \returns the column index
  */
 int
 get_col_number_from_tree_view_column (GtkTreeViewColumn *col);
 /**
  * This function displays the tooltip for an object, pointer, vector
  * item or an attribute
+ *
+ * \param widget is the display object
+ * \param x is the x position
+ * \param y is the y position
+ * \param keyboard_tip
+ * \param tooltip is the tooltip information to be displayed
+ * \param user_data
+ * \return false if the tooltip is not displayed
  */
 gboolean
 cell_tooltip_callback (GtkWidget *widget, gint x, gint y, gboolean keyboard_tip, 
@@ -60,29 +86,51 @@
 /**
  * This is the main view opening the widget, getting tooltips and drawing the 
  * tree of attributes...
+ * \param model the GtkTreeStore model
+ * \returns a GtkWidget on success
  */
 GtkWidget *
 create_view (GtkTreeStore *model);
 /**
  * Exit the window when exit button is pressed
+ * \param button the pressed button
+ * \param user_data
  */
 void
 exit_clicked_callback (GtkButton *button, gpointer user_data);
 /**
  * Exit the application
+ * \param widget a pointer to the widget
+ * \param event the event responsible for the aplication exit
+ * \param user_data user data
+ * \returns true on clean exit
  */
 gboolean
 delete_event_callback (GtkWidget *widget, GdkEvent *event, gpointer user_data);
 /**
  * Delete the tree model contents
+ * \param model the GtkTreeModel
+ * \param path the GtkTreePath
+ * \param iter a GtkTreeIter
+ * \param data user data
+ * \return true if an error occurred.
  */
 gboolean
 clean_model_callback (GtkTreeModel *model, GtkTreePath *path,
                       GtkTreeIter *iter, gpointer data);
-/**************************     display functions used by default configurator **********************/
+
+
+//     display functions used by default configurator
+
 /**
  * This function writes data in the second column, this data is going to be editable
  * if it is a NODE_ATTRIBUTE
+ *
+ * \param col Pointer to the GtkTreeViewColumn
+ * \param renderer Pointer to the GtkCellRenderer
+ * \param model Pointer to the GtkTreeModel
+ * \param iter  Pointer to the GtkTreeIter
+ * \param user_data Pointer to the data to be displayed (or modified)
  */
 void
 cell_data_function_col_1_config_default (GtkTreeViewColumn *col, GtkCellRenderer *renderer, 
@@ -90,6 +138,11 @@
                                          gpointer user_data);
 /**
  * This function writes the attribute or typeid name in the column 0
+ * \param col Pointer to the GtkTreeViewColumn
+ * \param renderer Pointer to the GtkCellRenderer
+ * \param model Pointer to the GtkTreeModel
+ * \param iter  Pointer to the GtkTreeIter
+ * \param user_data Pointer to the data to be displayed (or modified)
  */
 void
 cell_data_function_col_0_config_default (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, 
@@ -97,22 +150,34 @@
 /**
  * This is the action done when the user presses on the save button for the Default attributes.
  * It will save the config to a file.
+ *
+ * \param button (unused)
+ * \param user_data
  */
 void
 save_clicked_default (GtkButton *button, gpointer user_data);
 /**
  * If the user presses the button load, it will load the config file into memory for the Default attributes.
+ *
+ * \param button (unused)
+ * \param user_data
  */
 void
 load_clicked_default (GtkButton *button, gpointer user_data);
 /**
  * This is the action done when the user presses on the save button for the Attributes.
  * It will save the config to a file.
+ *
+ * \param button (unused)
+ * \param user_data
  */
 void
 save_clicked_attribute (GtkButton *button, gpointer user_data);
 /**
  * If the user presses the button load, it will load the config file into memory for the Attributes.
+ *
+ * \param button (unused)
+ * \param user_data
  */
 void
 load_clicked_attribute (GtkButton *button, gpointer user_data);
@@ -120,6 +185,11 @@
  *  This functions is called whenever there is a change in the value of an attribute
  *  If the input value is ok, it will be updated in the default value and in the
  *  GUI, otherwise, it won't be updated in both.
+ *
+ *  \param cell the changed cell
+ *  \param path_string the path
+ *  \param new_text the updated text in the cell
+ *  \param user_data user data
  */
 void
 cell_edited_callback_config_default (GtkCellRendererText *cell, gchar *path_string,
@@ -129,6 +199,14 @@
  * over a type ID or an attribute. It will give the type and the possible values of
  * an attribute value and the type of the object for an attribute object or a 
  * typeID object 
+ *
+ * \param widget is the display object
+ * \param x is the x position
+ * \param y is the y position
+ * \param keyboard_tip
+ * \param tooltip is the tooltip information to be displayed
+ * \param user_data
+ * \return false if the tooltip is not displayed
  */
 gboolean
 cell_tooltip_callback_config_default (GtkWidget *widget, gint x, gint y,
@@ -136,11 +214,18 @@
 /**
  * This is the main view opening the widget, getting tooltips and drawing the 
  * tree of attributes
+ * \param model the GtkTreeStore model
+ * \returns a GtkWidget on success
  */
 GtkWidget *
 create_view_config_default (GtkTreeStore *model);
 /**
  * Delete the tree model contents
+ * \param model the GtkTreeModel
+ * \param path the GtkTreePath
+ * \param iter a GtkTreeIter
+ * \param data user data
+ * \return true if an error occurred.
  */
 gboolean
 clean_model_callback_config_default (GtkTreeModel *model, GtkTreePath *path,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/config-store/model/model-typeid-creator.h ns-3.34/src/config-store/model/model-typeid-creator.h
--- ns-3.33/src/config-store/model/model-typeid-creator.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/config-store/model/model-typeid-creator.h	2021-07-14 10:31:06.000000000 -0700
@@ -66,15 +66,22 @@
   /**
    * \brief This method will iterate on typeIds having default attributes and create a model
    * for them, this model will be used by the view.
+   *
+   * \param treestore the GtkTreeStore.
    */
   void Build (GtkTreeStore *treestore);
 private:
   /**
    * \brief This method will add a ModelTypeid to the GtkTreeIterator
+   * \param tid TypeId
+   * \param name attribute name
+   * \param defaultValue default value
+   * \param index index of the attribute in the specified Typeid
    */
   virtual void VisitAttribute (TypeId tid, std::string name, std::string defaultValue, uint32_t index);
   /**
    * \brief Add a node for the new TypeId object
+   * \param name TypeId name
    */
   virtual void StartVisitTypeId (std::string name);
   /**
@@ -83,6 +90,7 @@
   virtual void EndVisitTypeId (void);
   /**
    * \brief Adds a treestore iterator to m_treestore model
+   * \param node the node to be added
    */
   void Add (ModelTypeid *node);
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/config-store/wscript ns-3.34/src/config-store/wscript
--- ns-3.33/src/config-store/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/config-store/wscript	2021-07-14 10:31:06.000000000 -0700
@@ -21,23 +21,21 @@
                                      conf.env['ENABLE_GTK'],
                                      "--disable-gtk option given")
     else:
-        have_gtk = conf.check_cfg(package='gtk+-3.0 >= 3.20',
+        have_gtk = conf.check_cfg(package='gtk+-3.0 >= 3.22',
                                   args=['--cflags', '--libs'], uselib_store='GTK',
                                   mandatory=False)
 
         conf.env['ENABLE_GTK'] = have_gtk
         conf.report_optional_feature("GtkConfigStore", "GtkConfigStore",
                                      conf.env['ENABLE_GTK'],
-                                     "library 'gtk+-3 >= 3.2' not found")
+                                     "library 'gtk+-3 >= 3.22' not found")
 
-        # Bug 2936 -Wparentheses issue for gcc >= 8
-        if conf.env['ENABLE_GTK']: 
+        # Bug 2936 and #340 -Wparentheses issue for gcc >= 8
+        # This have to be kept until we can bump the minimum GTK version to 3.24
+        if conf.env['ENABLE_GTK']:
             if conf.env['CXX_NAME'] in ['gcc']:
                 if tuple(map(int, conf.env['CC_VERSION'])) >= gcc_version_gtkplus_warning_issue:
                     conf.env.append_value('CXXFLAGS', '-Wno-parentheses')
-            # Bug 2978 gcc and clang warnings about deprecated declarations
-            if conf.env['CXX_NAME'] in ['clang', 'gcc']:
-                    conf.env.append_value ('CXXFLAGS', '-Wno-error=deprecated-declarations')
 
     have_libxml2 = conf.check_cfg(package='libxml-2.0 >= 2.7',
                                   args=['--cflags', '--libs'], uselib_store='LIBXML2',
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/bindings/modulegen__gcc_ILP32.py ns-3.34/src/core/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/core/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -161,6 +161,8 @@
     module.add_enum('State', ['RUNNING', 'EXPIRED', 'SUSPENDED'], outer_class=root_module['ns3::Timer'])
     ## timer-impl.h (module 'core'): ns3::TimerImpl [class]
     module.add_class('TimerImpl', allow_subclassing=True)
+    ## trickle-timer.h (module 'core'): ns3::TrickleTimer [class]
+    module.add_class('TrickleTimer')
     ## type-id.h (module 'core'): ns3::TypeId [class]
     module.add_class('TypeId')
     ## type-id.h (module 'core'): ns3::TypeId::AttributeFlag [enumeration]
@@ -604,6 +606,7 @@
     register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
     register_Ns3Timer_methods(root_module, root_module['ns3::Timer'])
     register_Ns3TimerImpl_methods(root_module, root_module['ns3::TimerImpl'])
+    register_Ns3TrickleTimer_methods(root_module, root_module['ns3::TrickleTimer'])
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
@@ -2092,6 +2095,73 @@
                    is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3TrickleTimer_methods(root_module, cls):
+    ## trickle-timer.h (module 'core'): ns3::TrickleTimer::TrickleTimer(ns3::TrickleTimer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::TrickleTimer const &', 'arg0')])
+    ## trickle-timer.h (module 'core'): ns3::TrickleTimer::TrickleTimer() [constructor]
+    cls.add_constructor([])
+    ## trickle-timer.h (module 'core'): ns3::TrickleTimer::TrickleTimer(ns3::Time minInterval, uint8_t doublings, uint16_t redundancy) [constructor]
+    cls.add_constructor([param('ns3::Time', 'minInterval'), param('uint8_t', 'doublings'), param('uint16_t', 'redundancy')])
+    ## trickle-timer.h (module 'core'): int64_t ns3::TrickleTimer::AssignStreams(int64_t streamNum) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'streamNum')])
+    ## trickle-timer.h (module 'core'): void ns3::TrickleTimer::ConsistentEvent() [member function]
+    cls.add_method('ConsistentEvent', 
+                   'void', 
+                   [])
+    ## trickle-timer.h (module 'core'): void ns3::TrickleTimer::Enable() [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [])
+    ## trickle-timer.h (module 'core'): ns3::Time ns3::TrickleTimer::GetDelayLeft() const [member function]
+    cls.add_method('GetDelayLeft', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## trickle-timer.h (module 'core'): uint8_t ns3::TrickleTimer::GetDoublings() const [member function]
+    cls.add_method('GetDoublings', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## trickle-timer.h (module 'core'): ns3::Time ns3::TrickleTimer::GetIntervalLeft() const [member function]
+    cls.add_method('GetIntervalLeft', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## trickle-timer.h (module 'core'): ns3::Time ns3::TrickleTimer::GetMaxInterval() const [member function]
+    cls.add_method('GetMaxInterval', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## trickle-timer.h (module 'core'): ns3::Time ns3::TrickleTimer::GetMinInterval() const [member function]
+    cls.add_method('GetMinInterval', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## trickle-timer.h (module 'core'): uint16_t ns3::TrickleTimer::GetRedundancy() const [member function]
+    cls.add_method('GetRedundancy', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## trickle-timer.h (module 'core'): void ns3::TrickleTimer::InconsistentEvent() [member function]
+    cls.add_method('InconsistentEvent', 
+                   'void', 
+                   [])
+    ## trickle-timer.h (module 'core'): void ns3::TrickleTimer::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [])
+    ## trickle-timer.h (module 'core'): void ns3::TrickleTimer::SetParameters(ns3::Time minInterval, uint8_t doublings, uint16_t redundancy) [member function]
+    cls.add_method('SetParameters', 
+                   'void', 
+                   [param('ns3::Time', 'minInterval'), param('uint8_t', 'doublings'), param('uint16_t', 'redundancy')])
+    ## trickle-timer.h (module 'core'): void ns3::TrickleTimer::Stop() [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [])
+    return
+
 def register_Ns3TypeId_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('!=')
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/bindings/modulegen__gcc_LP64.py ns-3.34/src/core/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/core/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -161,6 +161,8 @@
     module.add_enum('State', ['RUNNING', 'EXPIRED', 'SUSPENDED'], outer_class=root_module['ns3::Timer'])
     ## timer-impl.h (module 'core'): ns3::TimerImpl [class]
     module.add_class('TimerImpl', allow_subclassing=True)
+    ## trickle-timer.h (module 'core'): ns3::TrickleTimer [class]
+    module.add_class('TrickleTimer')
     ## type-id.h (module 'core'): ns3::TypeId [class]
     module.add_class('TypeId')
     ## type-id.h (module 'core'): ns3::TypeId::AttributeFlag [enumeration]
@@ -604,6 +606,7 @@
     register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
     register_Ns3Timer_methods(root_module, root_module['ns3::Timer'])
     register_Ns3TimerImpl_methods(root_module, root_module['ns3::TimerImpl'])
+    register_Ns3TrickleTimer_methods(root_module, root_module['ns3::TrickleTimer'])
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
@@ -2092,6 +2095,73 @@
                    is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3TrickleTimer_methods(root_module, cls):
+    ## trickle-timer.h (module 'core'): ns3::TrickleTimer::TrickleTimer(ns3::TrickleTimer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::TrickleTimer const &', 'arg0')])
+    ## trickle-timer.h (module 'core'): ns3::TrickleTimer::TrickleTimer() [constructor]
+    cls.add_constructor([])
+    ## trickle-timer.h (module 'core'): ns3::TrickleTimer::TrickleTimer(ns3::Time minInterval, uint8_t doublings, uint16_t redundancy) [constructor]
+    cls.add_constructor([param('ns3::Time', 'minInterval'), param('uint8_t', 'doublings'), param('uint16_t', 'redundancy')])
+    ## trickle-timer.h (module 'core'): int64_t ns3::TrickleTimer::AssignStreams(int64_t streamNum) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'streamNum')])
+    ## trickle-timer.h (module 'core'): void ns3::TrickleTimer::ConsistentEvent() [member function]
+    cls.add_method('ConsistentEvent', 
+                   'void', 
+                   [])
+    ## trickle-timer.h (module 'core'): void ns3::TrickleTimer::Enable() [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [])
+    ## trickle-timer.h (module 'core'): ns3::Time ns3::TrickleTimer::GetDelayLeft() const [member function]
+    cls.add_method('GetDelayLeft', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## trickle-timer.h (module 'core'): uint8_t ns3::TrickleTimer::GetDoublings() const [member function]
+    cls.add_method('GetDoublings', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## trickle-timer.h (module 'core'): ns3::Time ns3::TrickleTimer::GetIntervalLeft() const [member function]
+    cls.add_method('GetIntervalLeft', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## trickle-timer.h (module 'core'): ns3::Time ns3::TrickleTimer::GetMaxInterval() const [member function]
+    cls.add_method('GetMaxInterval', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## trickle-timer.h (module 'core'): ns3::Time ns3::TrickleTimer::GetMinInterval() const [member function]
+    cls.add_method('GetMinInterval', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## trickle-timer.h (module 'core'): uint16_t ns3::TrickleTimer::GetRedundancy() const [member function]
+    cls.add_method('GetRedundancy', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## trickle-timer.h (module 'core'): void ns3::TrickleTimer::InconsistentEvent() [member function]
+    cls.add_method('InconsistentEvent', 
+                   'void', 
+                   [])
+    ## trickle-timer.h (module 'core'): void ns3::TrickleTimer::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [])
+    ## trickle-timer.h (module 'core'): void ns3::TrickleTimer::SetParameters(ns3::Time minInterval, uint8_t doublings, uint16_t redundancy) [member function]
+    cls.add_method('SetParameters', 
+                   'void', 
+                   [param('ns3::Time', 'minInterval'), param('uint8_t', 'doublings'), param('uint16_t', 'redundancy')])
+    ## trickle-timer.h (module 'core'): void ns3::TrickleTimer::Stop() [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [])
+    return
+
 def register_Ns3TypeId_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('!=')
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/helper/csv-reader.cc ns-3.34/src/core/helper/csv-reader.cc
--- ns-3.33/src/core/helper/csv-reader.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/helper/csv-reader.cc	2021-07-14 10:31:06.000000000 -0700
@@ -28,6 +28,7 @@
 #include <iterator>
 #include <sstream>
 #include <vector>
+#include <limits>
 
 /**
  * \file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/helper/csv-reader.h ns-3.34/src/core/helper/csv-reader.h
--- ns-3.33/src/core/helper/csv-reader.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/helper/csv-reader.h	2021-07-14 10:31:06.000000000 -0700
@@ -71,7 +71,7 @@
  *   while (csv.FetchNextRow ())
  *     {
  *       // Ignore blank lines
- *       if (csv.IsBlankLine ())
+ *       if (csv.IsBlankRow ())
  *         {
  *           continue;
  *         }
@@ -129,7 +129,7 @@
  *     # This row treated as a single empty column, returning an empty string.
  *     "" # So is this
  *
- * IsBlankLine() will return \c true in either of these cases.
+ * IsBlankRow() will return \c true in either of these cases.
  *
  * Quoted Columns
  * --------------
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/model/attribute-container-accessor-helper.h ns-3.34/src/core/model/attribute-container-accessor-helper.h
--- ns-3.33/src/core/model/attribute-container-accessor-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/model/attribute-container-accessor-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -32,14 +32,66 @@
 namespace ns3 {
 
 /**
+ * Compile time check if type T has const iterator.
+ */
+template<typename T>
+struct has_const_iterator
+{
+private:
+    typedef char                      yes;
+    typedef struct { char array[2]; } no;
+
+    template<typename C> static yes test(typename C::const_iterator*);
+    template<typename C> static no  test(...);
+public:
+    static const bool value = sizeof(test<T>(0)) == sizeof(yes);
+    typedef T type;
+};
+
+/**
+ * Compile time check if type T has begin() and end() methods.
+ */
+template <typename T>
+struct has_begin_end
+{
+    template<typename C> static char (&f(typename std::enable_if<
+      std::is_same<decltype(static_cast<typename C::const_iterator (C::*)() const>(&C::begin)),
+      typename C::const_iterator(C::*)() const>::value, void>::type*))[1];
+
+    template<typename C> static char (&f(...))[2];
+
+    template<typename C> static char (&g(typename std::enable_if<
+      std::is_same<decltype(static_cast<typename C::const_iterator (C::*)() const>(&C::end)),
+      typename C::const_iterator(C::*)() const>::value, void>::type*))[1];
+
+    template<typename C> static char (&g(...))[2];
+
+    static bool const beg_value = sizeof(f<T>(0)) == 1;
+    static bool const end_value = sizeof(g<T>(0)) == 1;
+};
+
+/**
+ * Compile time check if type T is a container.
+ *
+ * Container here means has an iterator and supports begin() and end()
+ * methods.
+ * 
+ * Can be used when defining specializations when a type T is an STL
+ * like container.
+ */
+template<typename T> 
+struct is_container : std::integral_constant<bool, has_const_iterator<T>::value && has_begin_end<T>::beg_value && has_begin_end<T>::end_value> 
+{ };
+
+/**
  * \ingroup attributeimpl
  *
  * DoMakeAccessorHelperOne specialization for member containers
  *
- * The template parameter list contains an extra parameter that disambiguates
- * the templated Ptr type from container types by taking advantage of the fact
- * that container types have multiple template arguments and Ptr has only one.
- * This disambiguation works but is not sufficiently robust as a long term solution.
+ * The template parameter list contains an extra parameter that is
+ * intended to disambiguate an attribute container from any other
+ * templated attribute, e.g Ptr or Callback.  Disambiguation is based
+ * on begin/end and iterator.
  *
  * \tparam V  \explicit The specific AttributeValue type to use to represent
  *            the Attribute.
@@ -50,7 +102,7 @@
  * \returns The AttributeAccessor.
  */
 template <typename V, typename T, template <typename...> class U, typename ...I,
-          typename = typename std::enable_if< (sizeof...(I) > 1), void>::type >
+          typename = typename std::enable_if< ( is_container< U<I...> >::value ), void>::type >
 inline
 Ptr<const AttributeAccessor>
 DoMakeAccessorHelperOne (U<I...> T::*memberContainer)
@@ -98,4 +150,4 @@
 
 } // namespace ns3
 
-#endif  // ATTRIBUTE_CONTAINER_ACCESSOR_HELPER_H
\ No newline at end of file
+#endif  // ATTRIBUTE_CONTAINER_ACCESSOR_HELPER_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/model/config.cc ns-3.34/src/core/model/config.cc
--- ns-3.33/src/core/model/config.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/model/config.cc	2021-07-14 10:31:06.000000000 -0700
@@ -870,6 +870,8 @@
     {
       return false;
     }
+  struct TypeId::AttributeInformation info;
+  tid.LookupAttributeByName(paramName, &info);
   for (uint32_t j = 0; j < tid.GetAttributeN (); j++)
     {
       struct TypeId::AttributeInformation tmp = tid.GetAttribute (j);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/model/deprecated.h ns-3.34/src/core/model/deprecated.h
--- ns-3.33/src/core/model/deprecated.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/model/deprecated.h	2021-07-14 10:31:06.000000000 -0700
@@ -64,6 +64,15 @@
 
 /**
  * \ingroup core
+ * \def NS_DEPRECATED_3_34
+ * Tag for things deprecated in version ns-3.34.
+ */
+#ifdef NS_DEPRECATED
+#define NS_DEPRECATED_3_34 NS_DEPRECATED
+#endif
+
+/**
+ * \ingroup core
  * \def NS_DEPRECATED_3_32
  * Tag for things deprecated in version ns-3.32.
  */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/model/length.h ns-3.34/src/core/model/length.h
--- ns-3.33/src/core/model/length.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/model/length.h	2021-07-14 10:31:06.000000000 -0700
@@ -24,7 +24,7 @@
 #include "attribute.h"
 #include "attribute-helper.h"
 
-#ifdef HAVE_BOOST_UNITS
+#ifdef HAVE_BOOST
 #include <boost/units/quantity.hpp>
 #include <boost/units/systems/si.hpp>
 #endif
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/model/node-printer.cc ns-3.34/src/core/model/node-printer.cc
--- ns-3.33/src/core/model/node-printer.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/model/node-printer.cc	2021-07-14 10:31:06.000000000 -0700
@@ -34,12 +34,6 @@
 
 NS_LOG_COMPONENT_DEFINE ("NodePrinter");
 
-/**
- * \ingroup logging
- * Default node id printer implementation.
- *
- * \param [in,out] os The output stream to print the node id on.
- */
 void
 DefaultNodePrinter (std::ostream &os)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/model/node-printer.h ns-3.34/src/core/model/node-printer.h
--- ns-3.33/src/core/model/node-printer.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/model/node-printer.h	2021-07-14 10:31:06.000000000 -0700
@@ -40,9 +40,10 @@
 typedef void (*NodePrinter)(std::ostream &os);
 
 /**
- * Default Node printer.
+ * \ingroup logging
+ * Default node id printer implementation.
  *
- * \param [in,out] os The output stream to print on.
+ * \param [in,out] os The output stream to print the node id on.
  */
 void DefaultNodePrinter (std::ostream &os);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/model/object.h ns-3.34/src/core/model/object.h
--- ns-3.33/src/core/model/object.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/model/object.h	2021-07-14 10:31:06.000000000 -0700
@@ -485,6 +485,12 @@
   return 0;
 }
 
+/**
+ * Specialization of \link Object::GetObject () \endlink for
+ * objects of type ns3::Object.
+ *
+ * \returns A Ptr to the calling object.
+ */
 template
 <>
 inline Ptr<Object>
@@ -505,6 +511,13 @@
   return 0;
 }
 
+/**
+ * Specialization of \link Object::GetObject (TypeId tid) \endlink for
+ * objects of type ns3::Object.
+ *
+ * \param [in] tid The TypeId of the requested Object.
+ * \returns A Ptr to the calling object.
+ */
 template
 <>
 inline Ptr<Object>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/model/trickle-timer.cc ns-3.34/src/core/model/trickle-timer.cc
--- ns-3.33/src/core/model/trickle-timer.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/core/model/trickle-timer.cc	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,274 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#include "trickle-timer.h"
+#include "log.h"
+#include <limits>
+
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("TrickleTimer");
+
+TrickleTimer::TrickleTimer ()
+  : m_impl (0),
+    m_timerExpiration (),
+    m_intervalExpiration (),
+    m_currentInterval (Time(0)),
+    m_counter (0),
+    m_uniRand (CreateObject<UniformRandomVariable> ())
+{
+  NS_LOG_FUNCTION (this);
+
+  m_minInterval = Time (0);
+  m_ticks = 0;
+  m_maxInterval = Time (0);
+  m_redundancy = 0;
+}
+
+TrickleTimer::TrickleTimer (Time minInterval, uint8_t doublings, uint16_t redundancy)
+  : m_impl (0),
+    m_timerExpiration (),
+    m_intervalExpiration (),
+    m_currentInterval (Time(0)),
+    m_counter (0),
+    m_uniRand (CreateObject<UniformRandomVariable> ())
+{
+  NS_LOG_FUNCTION (this << minInterval << doublings << redundancy);
+  NS_ASSERT_MSG (doublings < std::numeric_limits<decltype(m_ticks)>::digits, "Doublings value is too large");
+
+  m_minInterval = minInterval;
+  m_ticks = 1;
+  m_ticks <<= doublings;
+  m_maxInterval = m_ticks * minInterval;
+  m_redundancy = redundancy;
+}
+
+TrickleTimer::~TrickleTimer ()
+{
+  NS_LOG_FUNCTION (this);
+  m_timerExpiration.Cancel ();
+  m_intervalExpiration.Cancel ();
+  delete m_impl;
+}
+
+int64_t
+TrickleTimer::AssignStreams (int64_t streamNum)
+{
+  m_uniRand->SetStream (streamNum);
+  return 1;
+}
+
+void
+TrickleTimer::SetParameters (Time minInterval, uint8_t doublings, uint16_t redundancy)
+{
+  NS_LOG_FUNCTION (this << minInterval << doublings << redundancy);
+  NS_ASSERT_MSG (doublings < std::numeric_limits<decltype(m_ticks)>::digits, "Doublings value is too large");
+
+  m_minInterval = minInterval;
+  m_ticks = 1;
+  m_ticks <<= doublings;
+  m_maxInterval = m_ticks * minInterval;
+  m_redundancy = redundancy;
+}
+
+Time
+TrickleTimer::GetMinInterval (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_minInterval;
+}
+
+Time
+TrickleTimer::GetMaxInterval (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_maxInterval;
+}
+
+uint8_t
+TrickleTimer::GetDoublings (void) const
+{
+  NS_LOG_FUNCTION (this);
+
+  if (m_ticks == 0)
+    {
+      return 0;
+    }
+
+  // Here we assume that m_ticks is a power of 2.
+  // This could have been way more elegant by using
+  // std::countl_zero() defined in the <bit> header
+  // which is c++20 - so not yet widely available.
+
+  uint64_t ticks = m_ticks;
+  uint8_t doublings = 0;
+  while (ticks != 1)
+    {
+      ticks >>= 1;
+      doublings ++;
+    }
+
+  return doublings;
+}
+
+uint16_t
+TrickleTimer::GetRedundancy (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_redundancy;
+}
+
+Time
+TrickleTimer::GetDelayLeft (void) const
+{
+  NS_LOG_FUNCTION (this);
+
+  if (m_timerExpiration.IsRunning ())
+    {
+      return Simulator::GetDelayLeft (m_timerExpiration);
+    }
+
+  return TimeStep (0);
+}
+
+Time
+TrickleTimer::GetIntervalLeft (void) const
+{
+  NS_LOG_FUNCTION (this);
+
+  if (m_intervalExpiration.IsRunning ())
+    {
+      return Simulator::GetDelayLeft (m_intervalExpiration);
+    }
+
+  return TimeStep (0);
+}
+
+
+void
+TrickleTimer::Enable ()
+{
+  NS_LOG_FUNCTION (this);
+
+  uint64_t randomInt;
+  double random;
+
+  NS_ASSERT_MSG (m_minInterval != Time (0), "Timer not initialized");
+
+  randomInt = m_uniRand->GetInteger (1, m_ticks);
+  random = randomInt;
+  if (randomInt < m_ticks)
+    {
+      random += m_uniRand->GetValue (0, 1);
+    }
+
+  m_currentInterval = m_minInterval * random;
+  m_intervalExpiration = Simulator::Schedule (m_currentInterval, &TrickleTimer::IntervalExpire, this);
+
+  m_counter = 0;
+
+  Time timerExpitation = m_uniRand->GetValue (0.5, 1) * m_currentInterval;
+  m_timerExpiration = Simulator::Schedule (timerExpitation, &TrickleTimer::TimerExpire, this);
+
+  return;
+}
+
+void
+TrickleTimer::ConsistentEvent ()
+{
+  NS_LOG_FUNCTION (this);
+  m_counter ++;
+}
+
+void
+TrickleTimer::InconsistentEvent ()
+{
+  NS_LOG_FUNCTION (this);
+  if (m_currentInterval > m_minInterval)
+    {
+      Reset ();
+    }
+}
+
+void
+TrickleTimer::Reset ()
+{
+  NS_LOG_FUNCTION (this);
+
+  m_currentInterval = m_minInterval;
+  m_intervalExpiration.Cancel ();
+  m_timerExpiration.Cancel ();
+
+  m_intervalExpiration = Simulator::Schedule (m_currentInterval, &TrickleTimer::IntervalExpire, this);
+
+  m_counter = 0;
+
+  Time timerExpitation = m_uniRand->GetValue (0.5, 1) * m_currentInterval;
+  m_timerExpiration = Simulator::Schedule (timerExpitation, &TrickleTimer::TimerExpire, this);
+
+  return;
+}
+
+void
+TrickleTimer::Stop ()
+{
+  NS_LOG_FUNCTION (this);
+
+  m_currentInterval = m_minInterval;
+  m_intervalExpiration.Cancel ();
+  m_timerExpiration.Cancel ();
+  m_counter = 0;
+}
+
+void
+TrickleTimer::TimerExpire(void)
+{
+  NS_LOG_FUNCTION (this);
+
+  if (m_counter < m_redundancy || m_redundancy == 0)
+    {
+      m_impl->Invoke ();
+    }
+}
+
+void
+TrickleTimer::IntervalExpire(void)
+{
+  NS_LOG_FUNCTION (this);
+
+  m_currentInterval = m_currentInterval * 2;
+  if (m_currentInterval > m_maxInterval)
+    {
+      m_currentInterval = m_maxInterval;
+    }
+
+  m_intervalExpiration = Simulator::Schedule (m_currentInterval, &TrickleTimer::IntervalExpire, this);
+
+  m_counter = 0;
+
+  Time timerExpitation = m_uniRand->GetValue (0.5, 1) * m_currentInterval;
+  m_timerExpiration = Simulator::Schedule (timerExpitation, &TrickleTimer::TimerExpire, this);
+}
+
+
+
+} // namespace ns3
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/model/trickle-timer.h ns-3.34/src/core/model/trickle-timer.h
--- ns-3.33/src/core/model/trickle-timer.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/core/model/trickle-timer.h	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,296 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#ifndef TRICKLE_TIMER_H
+#define TRICKLE_TIMER_H
+
+#include "nstime.h"
+#include "event-id.h"
+#include "random-variable-stream.h"
+
+/**
+ * \file
+ * \ingroup timer
+ * ns3::TrickleTimer timer class declaration.
+ */
+
+namespace ns3 {
+
+class TimerImpl;
+
+/**
+ * \ingroup timer
+ * \brief A Trickle Timer following \RFC{6206}.
+ *
+ * A Trickle Timer is a timer that varies its frequency between a minimum
+ * and a maximum, depending on events. It is typically used to exchange
+ * information in a highly robust, energy efficient, simple, and scalable manner.
+ *
+ * The Trickle Timer has three parameters:
+ *   - minInterval Minimum interval.
+ *   - doublings Number of doublings to reach the maximum interval.
+ *   - redundancy Redundancy constant.
+ *
+ * The timer *period* is variable. It starts at minInterval, and it doubles
+ * the period length up to maxInterval = std::exp2 (doublings) * minInterval.
+ *
+ * The period is reset to minInterval when an *inconsistent* event is detected
+ * (see `TrickleTimer::InconsistentEvent`).
+ *
+ * The actual function fired by the timer is *not* called when a period expires.
+ * Rather, it is called in random moment between half of the actual period,
+ * and the end of actual the period.
+ * Moreover, the function is *not* fired if the timer did detect in the actual
+ * period a number of *consistent* events (see `TrickleTimer::ConsistentEvent`)
+ * greater than the redundancy constant. Setting the redundancy constant to zero
+ * disables this feature.
+ *
+ * The Trickle Timer is mainly used to self-regulate the transmission of periodic
+ * information (e.g., Router Advertisements) in wireless networks - and
+ * particularly in LLNs. In these contexts the frequency of the timer is adjusted
+ * according to, e.g., RS multicast messages. Moreover, the redundancy constant
+ * can be used to avoid congestion in high density networks.
+ *
+ * Please refer to \RFC{6206} for a full description and discussion of the Trickle Timer.
+ */
+class TrickleTimer
+{
+public:
+  /** Constructor. */
+  TrickleTimer ();
+
+  /**
+   * Constructor.
+   *
+   * The maximum interval is set to std::exp2 (doublings) * minInterval.
+   *
+   * \param minInterval Minimum interval.
+   * \param doublings Number of doublings to reach the maximum interval.
+   * \param redundancy Redundancy constant.
+   *
+   * A zero value in the redundancy constant means that the suppression
+   * algorithm is disabled.
+   *
+   */
+  TrickleTimer (Time minInterval, uint8_t doublings, uint16_t redundancy);
+
+  /** Destructor. */
+  ~TrickleTimer ();
+
+  /**
+   * Assigns the stream number for the uniform random number generator to use
+   *
+   * \param streamNum first stream index to use
+   * \return the number of stream indices assigned by this helper
+   */
+  int64_t AssignStreams (int64_t streamNum);
+
+  /**
+   * \brief Set the timer parameters.
+   *
+   * The maximum interval is set to std::exp2 (doublings) * minInterval.
+   *
+   * \param minInterval Minimum interval.
+   * \param doublings Number of doublings to reach the maximum interval.
+   * \param redundancy Redundancy constant.
+   *
+   * A zero value in the redundancy constant means that the suppression
+   * algorithm is disabled.
+   *
+   */
+  void SetParameters (Time minInterval, uint8_t doublings, uint16_t redundancy);
+
+  /**
+   * \brief Get the MinInterval of the timer.
+   * \return The MinInterval
+   */
+  Time GetMinInterval (void) const;
+
+  /**
+   * \brief Get the MaxInterval of the timer.
+   *
+   * The timer MaxInterval is always std::exp2 (doublings) * minInterval
+   * \return The MaxInterval
+   */
+  Time GetMaxInterval (void) const;
+
+  /**
+   * \brief Get the doublings of the timer.
+   * \return The doublings
+   */
+  uint8_t GetDoublings (void) const;
+
+  /**
+   * \brief Get the Redundancy constant of the timer.
+   * \return The Redundancy
+   */
+  uint16_t GetRedundancy (void) const;
+
+  /**
+   * \returns The amount of time left until this timer expires.
+   *
+   * This method returns zero if the timer has never been started.
+   */
+  Time GetDelayLeft (void) const;
+
+  /**
+   * \returns The amount of time left until this timer interval expires.
+   *
+   * This method returns zero if the timer has never been started.
+   */
+  Time GetIntervalLeft (void) const;
+
+  /**
+   * \brief Enable the timer.
+   */
+  void Enable ();
+
+  /**
+   * \brief Records a consistent event.
+   */
+  void ConsistentEvent ();
+
+  /**
+   * \brief Records an inconsistent event.
+   */
+  void InconsistentEvent ();
+
+  /**
+   * \brief Reset the timer.
+   */
+  void Reset ();
+
+  /**
+   * \brief Stop the timer.
+   *
+   * This will reset the timer and cancel all the pending events.
+   */
+  void Stop ();
+
+  /**
+   * Set the function to execute when the timer expires.
+   *
+   * \tparam FN \deduced The type of the function.
+   * \param [in] fn The function
+   *
+   * Store this function in this Timer for later use by Timer::Schedule.
+   */
+  template <typename FN>
+  void SetFunction (FN fn);
+
+  /**
+   * Set the function to execute when the timer expires.
+   *
+   * \tparam MEM_PTR \deduced Class method function type.
+   * \tparam OBJ_PTR \deduced Class type containing the function.
+   * \param [in] memPtr The member function pointer
+   * \param [in] objPtr The pointer to object
+   *
+   * Store this function and object in this Timer for later use by Timer::Schedule.
+   */
+  template <typename MEM_PTR, typename OBJ_PTR>
+  void SetFunction (MEM_PTR memPtr, OBJ_PTR objPtr);
+
+
+  /**
+   * Set the arguments to be used when invoking the expire function.
+   */
+  /**@{*/
+  /**
+   * \tparam Ts \deduced Argument types.
+   * \param [in] args arguments
+   */
+  template <typename... Ts>
+  void SetArguments (Ts&&... args);
+  /**@}*/
+
+private:
+  /** Internal callback invoked when the timer expires. */
+  void TimerExpire (void);
+  /** Internal callback invoked when the interval expires. */
+  void IntervalExpire (void);
+
+  /**
+   * The timer implementation, which contains the bound callback
+   * function and arguments.
+   */
+  TimerImpl *m_impl;
+
+  /** The future event scheduled to expire the timer. */
+  EventId m_timerExpiration;
+
+  /** The future event scheduled to expire the interval. */
+  EventId m_intervalExpiration;
+
+
+  Time m_minInterval;    //!< Minimum interval
+  Time m_maxInterval;    //!< Maximum interval
+  uint16_t m_redundancy; //!< Redundancy constant.
+
+  uint64_t m_ticks;       //!< Interval span (i.e., exp2(doublings)).
+  Time m_currentInterval; //!< Current interval.
+  uint16_t m_counter;     //!< Event counter.
+
+  Ptr<UniformRandomVariable> m_uniRand; //!< Object to generate uniform random numbers
+};
+
+} // namespace ns3
+
+
+/********************************************************************
+ *  Implementation of the templates declared above.
+ ********************************************************************/
+
+#include "timer-impl.h"
+
+namespace ns3 {
+
+
+template <typename FN>
+void
+TrickleTimer::SetFunction (FN fn)
+{
+  delete m_impl;
+  m_impl = MakeTimerImpl (fn);
+}
+template <typename MEM_PTR, typename OBJ_PTR>
+void
+TrickleTimer::SetFunction (MEM_PTR memPtr, OBJ_PTR objPtr)
+{
+  delete m_impl;
+  m_impl = MakeTimerImpl (memPtr, objPtr);
+}
+
+template <typename... Ts>
+void
+TrickleTimer::SetArguments (Ts&&... args)
+{
+  if (m_impl == 0)
+    {
+      NS_FATAL_ERROR ("You cannot set the arguments of a TrickleTimer before setting its function.");
+      return;
+    }
+  m_impl->SetArgs (std::forward<Ts>(args)...);
+}
+
+} // namespace ns3
+
+
+#endif /* TRICKLE_TIMER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/test/attribute-test-suite.cc ns-3.34/src/core/test/attribute-test-suite.cc
--- ns-3.33/src/core/test/attribute-test-suite.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/test/attribute-test-suite.cc	2021-07-14 10:31:06.000000000 -0700
@@ -228,6 +228,12 @@
                      TimeValue (Seconds (-2)),
                      MakeTimeAccessor (&AttributeObjectTest::m_timeWithBounds),
                      MakeTimeChecker (Seconds (-5), Seconds (10)))
+      .AddAttribute ("TestDeprecated", "help text",
+                     BooleanValue (false),
+                     MakeBooleanAccessor (&AttributeObjectTest::m_boolTestDeprecated),
+                     MakeBooleanChecker (),
+                     TypeId::DEPRECATED,
+                     "DEPRECATED test working.")
     ;
 
     return tid;
@@ -320,6 +326,7 @@
 
   bool m_boolTestA;
   bool m_boolTest;
+  bool m_boolTestDeprecated;
   int16_t m_int16;
   int16_t m_int16WithBounds;
   int16_t m_int16SetGet;
@@ -424,6 +431,20 @@
   ok = CheckGetCodePaths (p, "TestBoolName", "true", BooleanValue (true));
   NS_TEST_ASSERT_MSG_EQ (ok, true, "Attribute not set properly by default value");
 
+  std::string expected ("Attribute 'TestDeprecated' is deprecated: DEPRECATED test working.\n");
+  // Temporarily redirect std::cerr to a stringstream
+  std::stringstream buffer;
+  std::streambuf *oldBuffer = std::cerr.rdbuf (buffer.rdbuf());
+  // Cause the deprecation warning to be sent to the stringstream
+  Config::SetDefault ("ns3::AttributeObjectTest::TestDeprecated", BooleanValue (true));
+
+  // Compare the obtained actual string with the expected string.
+  NS_TEST_ASSERT_MSG_EQ (buffer.str (), expected, "Deprecated attribute not working");
+  // Restore cerr to its original stream buffer
+  std::cerr.rdbuf (oldBuffer);
+
+
+
   //
   // Set the default value of the BooleanValue the other way and create an object.
   // The new default value should stick.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/test/length-test-suite.cc ns-3.34/src/core/test/length-test-suite.cc
--- ns-3.33/src/core/test/length-test-suite.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/test/length-test-suite.cc	2021-07-14 10:31:06.000000000 -0700
@@ -24,7 +24,7 @@
 #include "ns3/string.h"
 #include "ns3/test.h"
 
-#ifdef HAVE_BOOST_UNITS
+#ifdef HAVE_BOOST
 #include <boost/units/base_units/us/foot.hpp>
 #include <boost/units/systems/si.hpp>
 #include <boost/units/systems/si/prefixes.hpp>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/test/random-variable-stream-test-suite.cc ns-3.34/src/core/test/random-variable-stream-test-suite.cc
--- ns-3.33/src/core/test/random-variable-stream-test-suite.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/test/random-variable-stream-test-suite.cc	2021-07-14 10:31:06.000000000 -0700
@@ -280,30 +280,32 @@
   /**
    * Set the seed used for this test suite.
    *
-   * Over time, this test suite is designed to be run with varying seed
-   * values so that the distributions can be evaluated with chi-squared
-   * tests.  To enable this, normal invocation of this test suite will
-   * result in a seed value corresponding to the seconds since epoch
+   * This test suite is designed to be run with both deterministic and
+   * random seed and run number values.  Deterministic values can be used
+   * for basic regression testing; random values can be used to more
+   * exhaustively test the generated streams, with the side effect of
+   * occasional test failures.
+   * 
+   * By default, this test suite will use the default values of RngSeed = 1
+   * and RngRun = 1.  Users can configure any other seed and run number
+   * in the usual way, but the special value of RngRun = 0 results in
+   * selecting a RngSeed value that corresponds to the seconds since epoch
    * (\c time (0) from \c ctime).  Note: this is not a recommended practice for
    * seeding normal simulations, as described in the ns-3 manual, but
-   * suits our purposes here.
+   * allows the test to be exposed to a wider range of seeds.
    *
-   * However, we also want to provide the ability to run this test suite 
-   * with a repeatable value, such as when the seed or run number is configured
-   * to a specific value.  Therefore, we adopt the following policy.  When
-   * the test program is being run with the default global values for seed
-   * and run number, this function will instead pick a random, time-based
-   * seed for use within this test suite.  If the global values for seed or
-   * run number have been configured differently from the default values,
-   * the global seed value will be used instead of the time-based one.
+   * In either case, the values produced will be checked with a chi-squared
+   * test.
    *
    * For example, this command will cause this test suite to use the
-   * deterministic value of seed=3 every time:
+   * deterministic value of seed=3 and default run number=1 every time:
    *   NS_GLOBAL_VALUE="RngSeed=3" ./test.py -s random-variable-stream-generators
    * or equivalently (to see log output):
    *   NS_LOG="RandomVariableStreamGenerators" NS_GLOBAL_VALUE="RngSeed=3" ./waf --run "test-runner --suite=random-variable-stream-generators"
-   *  Similarly, if the value of RngRun is not set to 1, the globals will be
-   *  used.
+   *
+   * Conversely, this command will cause this test suite to use a seed
+   * based on time-of-day, and run number=0: 
+   *   NS_GLOBAL_VALUE="RngRun=0" ./test.py -s random-variable-stream-generators
    */
   void
   SetTestSuiteSeed (void)
@@ -311,18 +313,18 @@
     if (m_seedSet == false)
       {
         uint32_t seed;
-        if (RngSeedManager::GetSeed () == 1 && RngSeedManager::GetRun () == 1)
+        if (RngSeedManager::GetRun () == 0)
           {
             seed = static_cast<uint32_t> (time (0));
             m_seedSet = true;
-            NS_LOG_DEBUG ("Global seed and run number are default; seeding with time of day: " << seed);
+            NS_LOG_DEBUG ("Special run number value of zero; seeding with time of day: " << seed);
 
           }
         else
           {
             seed = RngSeedManager::GetSeed ();
             m_seedSet = true;
-            NS_LOG_DEBUG ("Global seed and run number are not default; using the non-default values seed: " <<
+            NS_LOG_DEBUG ("Using the values seed: " <<
                           seed << " and run: " << RngSeedManager::GetRun ());
           }
         SeedManager::SetSeed (seed);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/test/trickle-timer-test-suite.cc ns-3.34/src/core/test/trickle-timer-test-suite.cc
--- ns-3.33/src/core/test/trickle-timer-test-suite.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/core/test/trickle-timer-test-suite.cc	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,213 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#include "ns3/trickle-timer.h"
+#include "ns3/test.h"
+#include <vector>
+#include <numeric>
+#include <algorithm>
+
+/**
+ * \file
+ * \ingroup core-tests
+ * \ingroup timer
+ * \ingroup timer-tests
+ *
+ * Trickle Timer test suite.
+ *
+ * This test checks that the timer, in steady-state mode (i.e., after
+ * the transient period) have a frequency between [I/2, I + I/2].
+ *
+ * The test also checks that the redundancy works, i.e., if the timer
+ * receives enough "consistent" events it will suppress its output.
+ */
+
+namespace ns3 {
+
+namespace tests {
+
+
+/**
+ * \ingroup timer-tests
+ *  TrickleTimer test
+ */
+class TrickleTimerTestCase : public TestCase
+{
+public:
+  /** Constructor. */
+  TrickleTimerTestCase ();
+  virtual void DoRun (void);
+  /**
+   * Function to invoke when TrickleTimer expires.
+   */
+  void ExpireTimer (void);
+  std::vector<Time> m_expiredTimes;     //!< Time when TrickleTimer expired
+
+  /**
+   * Function to signal that the transient is over
+   */
+  void TransientOver (void);
+
+  /**
+   * Test the steady-state
+   * \param unit Minimum interval
+   */
+  void TestSteadyState (Time unit);
+
+  /**
+   * Test the redundancy suppression
+   * \param unit Minimum interval
+   */
+  void TestRedundancy (Time unit);
+
+  /**
+   * Inject in the timer a consistent event
+   * \param interval Interval
+   * \param tricklePtr Pointer to the TrickleTimer
+   */
+  void ConsistentEvent (Time interval, TrickleTimer* tricklePtr);
+
+  bool m_enableDataCollection;     //!< Collect data if true
+};
+
+TrickleTimerTestCase::TrickleTimerTestCase ()
+  : TestCase ("Check the Trickle Timer algorithm")
+{}
+
+void
+TrickleTimerTestCase::ExpireTimer (void)
+{
+  if (m_enableDataCollection==false)
+    {
+      return;
+    }
+
+  m_expiredTimes.push_back (Simulator::Now ());
+}
+
+void
+TrickleTimerTestCase::TransientOver (void)
+{
+  m_enableDataCollection = true;
+}
+
+void
+TrickleTimerTestCase::TestSteadyState (Time unit)
+{
+  m_expiredTimes.clear ();
+  m_enableDataCollection = false;
+
+  TrickleTimer trickle (unit, 4, 1);
+  trickle.SetFunction (&TrickleTimerTestCase::ExpireTimer, this);
+  trickle.Enable ();
+  // We reset the timer to force the interval to the minimum
+  trickle.Reset ();
+
+  NS_TEST_EXPECT_MSG_EQ (trickle.GetDoublings (), 4, "The doublings re-compute mechanism is not working.");
+
+  // The transient is over at (exp2(doublings +1) -1) * MinInterval (worst case).
+  Simulator::Schedule (unit*31, &TrickleTimerTestCase::TransientOver, this);
+
+  Simulator::Stop (unit * 50000);
+
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+  std::vector<Time> expirationFrequency;
+
+  expirationFrequency.resize (m_expiredTimes.size ());
+  std::adjacent_difference (m_expiredTimes.begin (), m_expiredTimes.end (), expirationFrequency.begin ());
+  expirationFrequency.erase (expirationFrequency.begin ());
+
+  int64x64_t min = (*std::min_element (expirationFrequency.begin (), expirationFrequency.end ()))/unit;
+  int64x64_t max = (*std::max_element (expirationFrequency.begin (), expirationFrequency.end ()))/unit;
+
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (min.GetDouble (), 8, "Timer did fire too fast ??");
+  NS_TEST_EXPECT_MSG_LT_OR_EQ (max.GetDouble (), 24, "Timer did fire too slow ??");
+}
+
+void
+TrickleTimerTestCase::TestRedundancy (Time unit)
+{
+  m_expiredTimes.clear ();
+  m_enableDataCollection = false;
+
+  TrickleTimer trickle (unit, 4, 1);
+  trickle.SetFunction (&TrickleTimerTestCase::ExpireTimer, this);
+  trickle.Enable ();
+  // We reset the timer to force the interval to the minimum
+  trickle.Reset ();
+
+  NS_TEST_EXPECT_MSG_EQ (trickle.GetDoublings (), 4, "The doublings re-compute mechanism is not working.");
+
+  // The transient is over at (exp2(doublings +1) -1) * MinInterval (worst case).
+  Simulator::Schedule (unit*31, &TrickleTimerTestCase::TransientOver, this);
+  Simulator::Schedule (unit*31, &TrickleTimerTestCase::ConsistentEvent, this, unit*8, &trickle);
+
+  Simulator::Stop (unit * 50000);
+
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+  NS_TEST_EXPECT_MSG_EQ (m_expiredTimes.size (), 0, "Timer did fire while being suppressed ??");
+}
+
+void
+TrickleTimerTestCase::ConsistentEvent (Time interval, TrickleTimer* tricklePtr)
+{
+  tricklePtr->ConsistentEvent ();
+  Simulator::Schedule (interval, &TrickleTimerTestCase::ConsistentEvent, this, interval, tricklePtr);
+}
+
+
+void
+TrickleTimerTestCase::DoRun (void)
+{
+  TestSteadyState (Time (1));
+  TestSteadyState (Seconds (1));
+  TestRedundancy (Seconds (1));
+}
+
+
+/**
+ * \ingroup timer-tests
+ *  Trickle Timer test suite
+ */
+class TrickleTimerTestSuite : public TestSuite
+{
+public:
+  /** Constructor. */
+  TrickleTimerTestSuite ()
+    : TestSuite ("trickle-timer")
+  {
+    AddTestCase (new TrickleTimerTestCase ());
+  }
+};
+
+/**
+ * \ingroup timer-tests
+ * TrickleTimerTestSuite instance variable.
+ */
+static TrickleTimerTestSuite g_trickleTimerTestSuite;
+
+
+}    // namespace tests
+
+}  // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/core/wscript ns-3.34/src/core/wscript
--- ns-3.33/src/core/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/core/wscript	2021-07-14 10:31:06.000000000 -0700
@@ -57,6 +57,8 @@
 
     conf.load('versioning', ['waf-tools'])
 
+    conf.require_boost_incs('core', 'ns-3 core module', required=False);
+
     int64x64_impl = Options.options.int64x64_impl
     if int64x64_impl == 'default' or int64x64_impl == 'int128':
 
@@ -166,28 +168,6 @@
     else:
         conf.env['ENABLE_BUILD_VERSION'] = False 
 
-    # Check for boost::units
-    if 'INCLUDES_BOOST' in conf.env:
-        fragment = r"""
-#include <boost/units/systems/si.hpp>
-int main ()
-{
-    auto q = 2 * boost::units::si::meter;
-    q.value ();
-}
-""" 
-        test_env = conf.env.derive()
-        test_env.append_value('INCLUDES', conf.env['INCLUDES_BOOST'])
-
-        ret = conf.check_nonfatal(compiler='cxx',
-                            define_name='HAVE_BOOST_UNITS',
-                            header_name='boost/units/systems/si.hpp',
-                            env=test_env,
-                            fragment=fragment,
-                            errmsg='not found')
-
-        conf.env.append_value ('CPPFLAGS', '-DHAVE_BOOST_UNITS')
-
     conf.write_config_header('ns3/core-config.h', top=True)
 
 def build(bld):
@@ -259,6 +239,7 @@
         'model/system-wall-clock-timestamp.cc',
         'helper/csv-reader.cc',
         'model/length.cc',
+        'model/trickle-timer.cc',
         ]
 
     if (bld.env['ENABLE_EXAMPLES']):
@@ -291,6 +272,7 @@
         'test/hash-test-suite.cc',
         'test/type-id-test-suite.cc',
         'test/length-test-suite.cc',
+        'test/trickle-timer-test-suite.cc',
         ]
 
     if (bld.env['ENABLE_EXAMPLES']):
@@ -394,7 +376,8 @@
         'model/time-printer.h',
         'model/show-progress.h',
         'helper/csv-reader.h',
-        'model/length.h'
+        'model/length.h',
+        'model/trickle-timer.h',
         ]
 
     if (bld.env['ENABLE_EXAMPLES']):
@@ -479,6 +462,9 @@
 
         headers.source.append('model/version.h')
 
+    if bld.env['INCLUDES_BOOST']:
+       core.use.append('BOOST')
+
     if Options.options.check_version:
         print_version(bld, vers_tg)
         raise SystemExit(0)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/csma/bindings/modulegen__gcc_ILP32.py ns-3.34/src/csma/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/csma/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/csma/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -93,12 +93,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -156,7 +160,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## queue-size.h (module 'network'): ns3::QueueSize [class]
@@ -595,8 +599,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1403,6 +1409,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1767,6 +1781,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1980,6 +2006,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2055,6 +2086,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2075,6 +2118,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -6287,6 +6335,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -6312,6 +6365,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -6373,6 +6431,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -6398,6 +6461,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/csma/bindings/modulegen__gcc_LP64.py ns-3.34/src/csma/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/csma/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/csma/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -93,12 +93,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -156,7 +160,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## queue-size.h (module 'network'): ns3::QueueSize [class]
@@ -595,8 +599,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1403,6 +1409,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1767,6 +1781,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1980,6 +2006,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2055,6 +2086,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2075,6 +2118,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -6287,6 +6335,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -6312,6 +6365,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -6373,6 +6431,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -6398,6 +6461,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/csma-layout/bindings/modulegen__gcc_ILP32.py ns-3.34/src/csma-layout/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/csma-layout/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/csma-layout/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -101,6 +101,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper [class]
     module.add_class('Ipv4AddressHelper', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
@@ -120,6 +122,8 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address-generator.h (module 'internet'): ns3::Ipv6AddressGenerator [class]
     module.add_class('Ipv6AddressGenerator', import_from_module='ns.internet')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper [class]
     module.add_class('Ipv6AddressHelper', import_from_module='ns.internet')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress [class]
@@ -190,7 +194,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -603,12 +607,14 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4AddressHelper_methods(root_module, root_module['ns3::Ipv4AddressHelper'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6AddressGenerator_methods(root_module, root_module['ns3::Ipv6AddressGenerator'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6AddressHelper_methods(root_module, root_module['ns3::Ipv6AddressHelper'])
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6InterfaceContainer_methods(root_module, root_module['ns3::Ipv6InterfaceContainer'])
@@ -1551,6 +1557,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1998,6 +2012,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4AddressHelper_methods(root_module, cls):
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper::Ipv4AddressHelper(ns3::Ipv4AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv4AddressHelper const &', 'arg0')])
@@ -2349,6 +2375,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2486,6 +2517,18 @@
                    is_static=True)
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6AddressHelper_methods(root_module, cls):
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper::Ipv6AddressHelper(ns3::Ipv6AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv6AddressHelper const &', 'arg0')])
@@ -2501,10 +2544,18 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    cls.add_method('Assign', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutAddress(ns3::NetDeviceContainer const & c) [member function]
     cls.add_method('AssignWithoutAddress', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutOnLink(ns3::NetDeviceContainer const & c) [member function]
+    cls.add_method('AssignWithoutOnLink', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6AddressHelper::NewAddress(ns3::Address addr) [member function]
     cls.add_method('NewAddress', 
                    'ns3::Ipv6Address', 
@@ -2533,6 +2584,8 @@
     cls.add_constructor([param('ns3::Ipv6Address', 'address')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
@@ -2545,6 +2598,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
     cls.add_method('GetPrefix', 
                    'ns3::Ipv6Prefix', 
@@ -2573,6 +2631,10 @@
     cls.add_method('SetNsDadUid', 
                    'void', 
                    [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
     cls.add_method('SetScope', 
                    'void', 
@@ -2675,6 +2737,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5291,10 +5358,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -6881,10 +6948,10 @@
     cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
     ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
     cls.add_constructor([])
-    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_pure_virtual=True, is_virtual=True)
     ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
@@ -7219,10 +7286,10 @@
                    'int32_t', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
                    is_const=True, is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
     cls.add_method('GetAddress', 
@@ -7353,6 +7420,10 @@
                    'bool', 
                    [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')], 
                    is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::ReachabilityHint(uint32_t ipInterfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('ReachabilityHint', 
+                   'bool', 
+                   [param('uint32_t', 'ipInterfaceIndex'), param('ns3::Ipv6Address', 'address')])
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/csma-layout/bindings/modulegen__gcc_LP64.py ns-3.34/src/csma-layout/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/csma-layout/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/csma-layout/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -101,6 +101,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper [class]
     module.add_class('Ipv4AddressHelper', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
@@ -120,6 +122,8 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address-generator.h (module 'internet'): ns3::Ipv6AddressGenerator [class]
     module.add_class('Ipv6AddressGenerator', import_from_module='ns.internet')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper [class]
     module.add_class('Ipv6AddressHelper', import_from_module='ns.internet')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress [class]
@@ -190,7 +194,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -603,12 +607,14 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4AddressHelper_methods(root_module, root_module['ns3::Ipv4AddressHelper'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6AddressGenerator_methods(root_module, root_module['ns3::Ipv6AddressGenerator'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6AddressHelper_methods(root_module, root_module['ns3::Ipv6AddressHelper'])
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6InterfaceContainer_methods(root_module, root_module['ns3::Ipv6InterfaceContainer'])
@@ -1551,6 +1557,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1998,6 +2012,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4AddressHelper_methods(root_module, cls):
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper::Ipv4AddressHelper(ns3::Ipv4AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv4AddressHelper const &', 'arg0')])
@@ -2349,6 +2375,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2486,6 +2517,18 @@
                    is_static=True)
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6AddressHelper_methods(root_module, cls):
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper::Ipv6AddressHelper(ns3::Ipv6AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv6AddressHelper const &', 'arg0')])
@@ -2501,10 +2544,18 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    cls.add_method('Assign', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutAddress(ns3::NetDeviceContainer const & c) [member function]
     cls.add_method('AssignWithoutAddress', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutOnLink(ns3::NetDeviceContainer const & c) [member function]
+    cls.add_method('AssignWithoutOnLink', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6AddressHelper::NewAddress(ns3::Address addr) [member function]
     cls.add_method('NewAddress', 
                    'ns3::Ipv6Address', 
@@ -2533,6 +2584,8 @@
     cls.add_constructor([param('ns3::Ipv6Address', 'address')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
@@ -2545,6 +2598,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
     cls.add_method('GetPrefix', 
                    'ns3::Ipv6Prefix', 
@@ -2573,6 +2631,10 @@
     cls.add_method('SetNsDadUid', 
                    'void', 
                    [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
     cls.add_method('SetScope', 
                    'void', 
@@ -2675,6 +2737,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5291,10 +5358,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -6881,10 +6948,10 @@
     cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
     ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
     cls.add_constructor([])
-    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_pure_virtual=True, is_virtual=True)
     ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
@@ -7219,10 +7286,10 @@
                    'int32_t', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
                    is_const=True, is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
     cls.add_method('GetAddress', 
@@ -7353,6 +7420,10 @@
                    'bool', 
                    [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')], 
                    is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::ReachabilityHint(uint32_t ipInterfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('ReachabilityHint', 
+                   'bool', 
+                   [param('uint32_t', 'ipInterfaceIndex'), param('ns3::Ipv6Address', 'address')])
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsdv/bindings/modulegen__gcc_ILP32.py ns-3.34/src/dsdv/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/dsdv/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsdv/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -113,6 +113,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -125,6 +127,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -610,10 +614,12 @@
     register_Ns3IntToType__5_methods(root_module, root_module['ns3::IntToType< 5 >'])
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv4RoutingHelper_methods(root_module, root_module['ns3::Ipv4RoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1705,6 +1711,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2036,6 +2054,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2111,6 +2134,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2131,6 +2166,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4298,10 +4338,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsdv/bindings/modulegen__gcc_LP64.py ns-3.34/src/dsdv/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/dsdv/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsdv/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -113,6 +113,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -125,6 +127,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -610,10 +614,12 @@
     register_Ns3IntToType__5_methods(root_module, root_module['ns3::IntToType< 5 >'])
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv4RoutingHelper_methods(root_module, root_module['ns3::Ipv4RoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1705,6 +1711,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2036,6 +2054,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2111,6 +2134,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2131,6 +2166,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4298,10 +4338,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsdv/model/dsdv-routing-protocol.cc ns-3.34/src/dsdv/model/dsdv-routing-protocol.cc
--- ns-3.33/src/dsdv/model/dsdv-routing-protocol.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsdv/model/dsdv-routing-protocol.cc	2021-07-14 10:31:06.000000000 -0700
@@ -241,7 +241,7 @@
 {
   *stream->GetStream () << "Node: " << m_ipv4->GetObject<Node> ()->GetId ()
                         << ", Time: " << Now ().As (unit)
-                        << ", Local time: " << GetObject<Node> ()->GetLocalTime ().As (unit)
+                        << ", Local time: " << m_ipv4->GetObject<Node> ()->GetLocalTime ().As (unit)
                         << ", DSDV Routing table" << std::endl;
 
   m_routingTable.Print (stream, unit);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsdv/model/dsdv-rtable.cc ns-3.34/src/dsdv/model/dsdv-rtable.cc
--- ns-3.33/src/dsdv/model/dsdv-rtable.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsdv/model/dsdv-rtable.cc	2021-07-14 10:31:06.000000000 -0700
@@ -197,11 +197,29 @@
 void
 RoutingTableEntry::Print (Ptr<OutputStreamWrapper> stream, Time::Unit unit /*= Time::S*/) const
 {
-  *stream->GetStream () << std::setiosflags (std::ios::fixed) << m_ipv4Route->GetDestination () << "\t\t" << m_ipv4Route->GetGateway () << "\t\t"
-                        << m_iface.GetLocal () << "\t\t" << std::setiosflags (std::ios::left)
-                        << std::setw (10) << m_hops << "\t" << std::setw (10) << m_seqNo << "\t"
-                        << std::setprecision (3) << (Simulator::Now () - m_lifeTime).As (unit)
-                        << "\t\t" << m_settlingTime.As (unit) << "\n";
+  std::ostream* os = stream->GetStream ();
+  // Copy the current ostream state
+  std::ios oldState (nullptr);
+  oldState.copyfmt (*os);
+
+  *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
+
+  std::ostringstream dest, gw, iface, ltime, stime;
+  dest << m_ipv4Route->GetDestination ();
+  gw << m_ipv4Route->GetGateway ();
+  iface << m_iface.GetLocal ();
+  ltime << std::setprecision (3) << (Simulator::Now () - m_lifeTime).As (unit);
+  stime << m_settlingTime.As (unit);
+
+  *os << std::setw (16) << dest.str ();
+  *os << std::setw (16) << gw.str ();
+  *os << std::setw (16) << iface.str ();
+  *os << std::setw (16) << m_hops;
+  *os << std::setw (16) << m_seqNo;
+  *os << std::setw(16) << ltime.str ();
+  *os << stime.str () << std::endl;
+  // Restore the previous ostream state
+  (*os).copyfmt (oldState);
 }
 
 void
@@ -251,13 +269,29 @@
 void
 RoutingTable::Print (Ptr<OutputStreamWrapper> stream, Time::Unit unit /*= Time::S*/) const
 {
-  *stream->GetStream () << "\nDSDV Routing table\n" << "Destination\t\tGateway\t\tInterface\t\tHopCount\t\tSeqNum\t\tLifeTime\t\tSettlingTime\n";
+  std::ostream* os = stream->GetStream ();
+  // Copy the current ostream state
+  std::ios oldState (nullptr);
+  oldState.copyfmt (*os);
+
+  *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
+
+  *os << "\nDSDV Routing table\n";
+  *os << std::setw (16) << "Destination";
+  *os << std::setw (16) << "Gateway";
+  *os << std::setw (16) << "Interface";
+  *os << std::setw (16) << "HopCount";
+  *os << std::setw (16) << "SeqNum";
+  *os << std::setw (16) << "LifeTime";
+  *os << "SettlingTime" << std::endl;
   for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = m_ipv4AddressEntry.begin (); i
        != m_ipv4AddressEntry.end (); ++i)
     {
       i->second.Print (stream, unit);
     }
-  *stream->GetStream () << "\n";
+  *os << std::endl;
+  // Restore the previous ostream state
+  (*os).copyfmt (oldState);
 }
 
 bool
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsr/bindings/callbacks_list.py ns-3.34/src/dsr/bindings/callbacks_list.py
--- ns-3.33/src/dsr/bindings/callbacks_list.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsr/bindings/callbacks_list.py	2021-07-14 10:31:06.000000000 -0700
@@ -11,6 +11,11 @@
     ['void', 'const ns3::Ipv4Header &', 'ns3::Ptr<const ns3::Packet>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::Ipv4>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'const ns3::Ipv4Header &', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ipv4L3Protocol::DropReason', 'ns3::Ptr<ns3::Ipv4>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::ArpCache>', 'ns3::Ipv4Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsr/bindings/modulegen__gcc_ILP32.py ns-3.34/src/dsr/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/dsr/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsr/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -20,22 +20,30 @@
 def register_types(module):
     root_module = module.get_root()
     
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT'], import_from_module='ns.wifi')
     ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
     module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'], import_from_module='ns.wifi')
-    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [enumeration]
-    module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'EXTENDED_COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
-    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduField [enumeration]
+    module.add_enum('WifiPpduField', ['WIFI_PPDU_FIELD_PREAMBLE', 'WIFI_PPDU_FIELD_NON_HT_HEADER', 'WIFI_PPDU_FIELD_HT_SIG', 'WIFI_PPDU_FIELD_TRAINING', 'WIFI_PPDU_FIELD_SIG_A', 'WIFI_PPDU_FIELD_SIG_B', 'WIFI_PPDU_FIELD_DATA'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
+    module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
     module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_holland', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
+    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
     module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
@@ -51,6 +59,14 @@
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator', 'ns3::AttributeConstructionList::CIterator')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator*', 'ns3::AttributeConstructionList::CIterator*')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator&', 'ns3::AttributeConstructionList::CIterator&')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType [struct]
+    module.add_class('BlockAckReqType', import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID'], outer_class=root_module['ns3::BlockAckReqType'], import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [struct]
+    module.add_class('BlockAckType', import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID', 'MULTI_STA'], outer_class=root_module['ns3::BlockAckType'], import_from_module='ns.wifi')
     ## buffer.h (module 'network'): ns3::Buffer [class]
     module.add_class('Buffer', import_from_module='ns.network')
     ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
@@ -141,6 +157,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -151,6 +169,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -242,10 +262,40 @@
     typehandlers.add_type_alias('uint32_t', 'ns3::TypeId::hash_t')
     typehandlers.add_type_alias('uint32_t*', 'ns3::TypeId::hash_t*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::TypeId::hash_t&')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc [class]
+    module.add_class('WifiAc', import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash [struct]
+    module.add_class('WifiAddressHash', import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash [struct]
+    module.add_class('WifiAddressTidHash', import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode [class]
     module.add_class('WifiMode', import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
     module.add_class('WifiModeFactory', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::CodeRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::CodeRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::CodeRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
     module.add_class('WifiRemoteStation', import_from_module='ns.wifi')
     ## wifi-remote-station-info.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
@@ -364,6 +414,9 @@
     module.add_class('WifiInformationElement', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >'])
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac [class]
     module.add_class('WifiMac', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiMac::ForwardUpCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiMac::ForwardUpCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiMac::ForwardUpCallback&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
     module.add_class('WifiRemoteStationManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::ProtectionMode [enumeration]
@@ -579,8 +632,18 @@
     module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv4Header &', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ipv4L3Protocol::DropReason', 'ns3::Ptr<ns3::Ipv4>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -611,6 +674,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## icmpv4-l4-protocol.h (module 'internet'): ns3::Icmpv4L4Protocol [class]
     module.add_class('Icmpv4L4Protocol', import_from_module='ns.internet', parent=root_module['ns3::IpL4Protocol'])
+    module.add_container('std::list< ns3::BlockAckReqType >', 'ns3::BlockAckReqType', container_type='list')
+    module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
@@ -631,12 +696,18 @@
     typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
     typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
+    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
+    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -871,6 +942,8 @@
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
+    register_Ns3BlockAckReqType_methods(root_module, root_module['ns3::BlockAckReqType'])
+    register_Ns3BlockAckType_methods(root_module, root_module['ns3::BlockAckType'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
     register_Ns3ByteTagIterator_methods(root_module, root_module['ns3::ByteTagIterator'])
@@ -906,9 +979,11 @@
     register_Ns3IntToType__5_methods(root_module, root_module['ns3::IntToType< 5 >'])
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -938,6 +1013,9 @@
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
+    register_Ns3WifiAc_methods(root_module, root_module['ns3::WifiAc'])
+    register_Ns3WifiAddressHash_methods(root_module, root_module['ns3::WifiAddressHash'])
+    register_Ns3WifiAddressTidHash_methods(root_module, root_module['ns3::WifiAddressTidHash'])
     register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
     register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
     register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
@@ -1051,7 +1129,12 @@
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1233,6 +1316,38 @@
     cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
     return
 
+def register_Ns3BlockAckReqType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v, uint8_t nSeqControls) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v'), param('uint8_t', 'nSeqControls')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_nSeqControls [variable]
+    cls.add_instance_attribute('m_nSeqControls', 'uint8_t', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckReqType::Variant', is_const=False)
+    return
+
+def register_Ns3BlockAckType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
+    cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckType::Variant', is_const=False)
+    return
+
 def register_Ns3Buffer_methods(root_module, cls):
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
@@ -1616,6 +1731,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1781,8 +1904,8 @@
 def register_Ns3DsrHelper_methods(root_module, cls):
     ## dsr-helper.h (module 'dsr'): ns3::DsrHelper::DsrHelper() [constructor]
     cls.add_constructor([])
-    ## dsr-helper.h (module 'dsr'): ns3::DsrHelper::DsrHelper(ns3::DsrHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DsrHelper const &', 'arg0')])
+    ## dsr-helper.h (module 'dsr'): ns3::DsrHelper::DsrHelper(ns3::DsrHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::DsrHelper const &', 'o')])
     ## dsr-helper.h (module 'dsr'): ns3::DsrHelper * ns3::DsrHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::DsrHelper *', 
@@ -1802,8 +1925,8 @@
 def register_Ns3DsrMainHelper_methods(root_module, cls):
     ## dsr-main-helper.h (module 'dsr'): ns3::DsrMainHelper::DsrMainHelper() [constructor]
     cls.add_constructor([])
-    ## dsr-main-helper.h (module 'dsr'): ns3::DsrMainHelper::DsrMainHelper(ns3::DsrMainHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DsrMainHelper const &', 'arg0')])
+    ## dsr-main-helper.h (module 'dsr'): ns3::DsrMainHelper::DsrMainHelper(ns3::DsrMainHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::DsrMainHelper const &', 'o')])
     ## dsr-main-helper.h (module 'dsr'): void ns3::DsrMainHelper::Install(ns3::DsrHelper & dsrHelper, ns3::NodeContainer nodes) [member function]
     cls.add_method('Install', 
                    'void', 
@@ -2171,6 +2294,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2445,6 +2580,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2520,6 +2660,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2540,6 +2692,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -3886,8 +4043,55 @@
     cls.add_instance_attribute('supportMsg', 'std::string', is_const=False)
     return
 
+def register_Ns3WifiAc_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(ns3::WifiAc const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAc const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(uint8_t lowTid, uint8_t highTid) [constructor]
+    cls.add_constructor([param('uint8_t', 'lowTid'), param('uint8_t', 'highTid')])
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetHighTid() const [member function]
+    cls.add_method('GetHighTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetLowTid() const [member function]
+    cls.add_method('GetLowTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetOtherTid(uint8_t tid) const [member function]
+    cls.add_method('GetOtherTid', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    return
+
+def register_Ns3WifiAddressHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash(ns3::WifiAddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressHash::operator()(ns3::Mac48Address const & address) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3WifiAddressTidHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash(ns3::WifiAddressTidHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressTidHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressTidHash::operator()(ns3::WifiAddressTidPair const & addressTidPair) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::WifiAddressTidPair const &', 'addressTidPair')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3WifiMode_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
     cls.add_output_stream_operator()
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [constructor]
@@ -3911,10 +4115,10 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector txVector, uint16_t staId=65535) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetDataRate', 
@@ -3941,10 +4145,15 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector txVector) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint16_t channelWidth) const [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'channelWidth')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -3981,15 +4190,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
     return
 
@@ -3998,6 +4207,8 @@
     cls.add_constructor([])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation(ns3::WifiRemoteStation const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRemoteStation const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_rssiAndUpdateTimePair [variable]
+    cls.add_instance_attribute('m_rssiAndUpdateTimePair', 'std::pair< double, ns3::Time >', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_state [variable]
     cls.add_instance_attribute('m_state', 'ns3::WifiRemoteStationState *', is_const=False)
     return
@@ -4033,6 +4244,10 @@
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
     cls.add_instance_attribute('m_channelWidth', 'uint16_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_dsssSupported [variable]
+    cls.add_instance_attribute('m_dsssSupported', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_erpOfdmSupported [variable]
+    cls.add_instance_attribute('m_erpOfdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_guardInterval [variable]
     cls.add_instance_attribute('m_guardInterval', 'uint16_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_heCapabilities [variable]
@@ -4043,6 +4258,8 @@
     cls.add_instance_attribute('m_info', 'ns3::WifiRemoteStationInfo', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint8_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ofdmSupported [variable]
+    cls.add_instance_attribute('m_ofdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
     cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
@@ -5288,10 +5505,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -5884,7 +6101,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5894,7 +6111,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'i')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -5967,6 +6184,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
     cls.add_method('GetVhtConfiguration', 
                    'ns3::Ptr< ns3::VhtConfiguration >', 
@@ -6016,7 +6238,7 @@
     cls.add_method('SetDevice', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::Callback<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function]
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
@@ -6046,6 +6268,11 @@
                    'void', 
                    [param('ns3::Ssid', 'ssid')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
     cls.add_method('SetWifiPhy', 
                    'void', 
@@ -6086,6 +6313,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): int64_t ns3::WifiRemoteStationManager::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
     cls.add_method('SetMaxSsrc', 
                    'void', 
@@ -6107,10 +6339,6 @@
     cls.add_method('SetFragmentationThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
-    cls.add_method('UpdateFragmentationThreshold', 
-                   'void', 
-                   [])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
     cls.add_method('SetQosSupport', 
                    'void', 
@@ -6154,20 +6382,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetPcfSupported(bool enable) [member function]
-    cls.add_method('SetPcfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetPcfSupported() const [member function]
-    cls.add_method('GetPcfSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported() const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported() const [member function]
     cls.add_method('GetLdpcSupported', 
                    'bool', 
@@ -6201,15 +6415,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseGreenfieldProtection(bool enable) [member function]
-    cls.add_method('SetUseGreenfieldProtection', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseGreenfieldProtection() const [member function]
-    cls.add_method('GetUseGreenfieldProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortPreambleEnabled(bool enable) [member function]
     cls.add_method('SetShortPreambleEnabled', 
                    'void', 
@@ -6261,11 +6466,6 @@
                    'ns3::WifiMode', 
                    [param('uint8_t', 'i')], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported(ns3::Mac48Address address) const [member function]
     cls.add_method('GetLdpcSupported', 
                    'bool', 
@@ -6329,6 +6529,21 @@
                    'uint8_t', 
                    [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetDsssSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetErpOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetErpOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::Mac48Address address) const [member function]
     cls.add_method('GetHtSupported', 
                    'bool', 
@@ -6412,42 +6627,62 @@
     cls.add_method('GetRtsTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsTxVector(ns3::Mac48Address to, ns3::WifiMode rtsTxMode) const [member function]
+    cls.add_method('GetCtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiMode', 'rtsTxMode')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector() [member function]
     cls.add_method('GetCtsToSelfTxVector', 
                    'ns3::WifiTxVector', 
                    [])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetBlockAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetBlockAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetControlAnswerMode(ns3::WifiMode reqMode) const [member function]
+    cls.add_method('GetControlAnswerMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'reqMode')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::WifiMacHeader const & header) [member function]
     cls.add_method('ReportRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('ReportDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::WifiMacHeader const & header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
     cls.add_method('ReportRtsOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector, uint32_t packetSize) [member function]
+                   [param('ns3::WifiMacHeader const &', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
     cls.add_method('ReportDataOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::WifiMacHeader const & header) [member function]
     cls.add_method('ReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('ReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
     cls.add_method('ReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, double rxSnr, ns3::WifiMode txMode) [member function]
+                   [param('ns3::Mac48Address', 'address'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
     cls.add_method('ReportRxOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')])
+                   [param('ns3::Mac48Address', 'address'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::WifiMacHeader const & header, uint32_t size) [member function]
     cls.add_method('NeedRts', 
                    'bool', 
@@ -6456,26 +6691,26 @@
     cls.add_method('NeedCtsToSelf', 
                    'bool', 
                    [param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NeedRetransmission', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NeedFragmentation', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
     cls.add_method('GetFragmentSize', 
                    'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
     cls.add_method('GetFragmentOffset', 
                    'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
     cls.add_method('IsLastFragment', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
     ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
     cls.add_method('GetDefaultTxPowerLevel', 
                    'uint8_t', 
@@ -6485,6 +6720,11 @@
     cls.add_method('GetInfo', 
                    'ns3::WifiRemoteStationInfo', 
                    [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): double ns3::WifiRemoteStationManager::GetMostRecentRssi(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetMostRecentRssi', 
+                   'double', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
     cls.add_method('SetDefaultTxPowerLevel', 
                    'void', 
@@ -6499,16 +6739,21 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseGreenfieldForDestination(ns3::Mac48Address dest) const [member function]
-    cls.add_method('UseGreenfieldForDestination', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseLdpcForDestination(ns3::Mac48Address dest) const [member function]
     cls.add_method('UseLdpcForDestination', 
                    'bool', 
                    [param('ns3::Mac48Address', 'dest')], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
+    cls.add_method('GetPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
+    cls.add_method('GetMac', 
+                   'ns3::Ptr< ns3::WifiMac >', 
+                   [], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
@@ -6591,11 +6836,6 @@
                    'bool', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetGreenfield', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetNumberOfSupportedStreams', 
                    'uint8_t', 
@@ -6606,16 +6846,6 @@
                    'uint8_t', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
-    cls.add_method('GetMac', 
-                   'ns3::Ptr< ns3::WifiMac >', 
-                   [], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
     cls.add_method('DoNeedRts', 
                    'bool', 
@@ -6681,10 +6911,10 @@
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
                    is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
     cls.add_method('DoReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
                    is_virtual=True, visibility='private')
     return
 
@@ -7145,6 +7375,11 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['unsigned long long'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -7703,7 +7938,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSupportedMcsAndNss() const [member function]
     cls.add_method('GetSupportedMcsAndNss', 
                    'uint16_t', 
@@ -7723,7 +7958,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -7802,11 +8037,6 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
-    cls.add_method('GetGreenfield', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetHtCapabilitiesInfo() const [member function]
     cls.add_method('GetHtCapabilitiesInfo', 
                    'uint16_t', 
@@ -7841,7 +8071,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval20() const [member function]
     cls.add_method('GetShortGuardInterval20', 
                    'uint8_t', 
@@ -7876,7 +8106,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -7894,10 +8124,6 @@
     cls.add_method('SetExtendedHtCapabilities', 
                    'void', 
                    [param('uint16_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
-    cls.add_method('SetGreenfield', 
-                   'void', 
-                   [param('uint8_t', 'greenfield')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtCapabilitiesInfo(uint16_t ctrl) [member function]
     cls.add_method('SetHtCapabilitiesInfo', 
                    'void', 
@@ -10000,7 +10226,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
     cls.add_method('GetSupportedChannelWidthSet', 
                    'uint8_t', 
@@ -10040,7 +10266,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -10210,6 +10436,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -10232,6 +10480,94 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0, short unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('ns3::WifiTxVector const &', 'arg0'), param('short unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): short unsigned int ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'short unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -12211,10 +12547,10 @@
     cls.add_constructor([param('ns3::dsr::DsrRouteCache const &', 'arg0')])
     ## dsr-rcache.h (module 'dsr'): ns3::dsr::DsrRouteCache::DsrRouteCache() [constructor]
     cls.add_constructor([])
-    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::AddArpCache(ns3::Ptr<ns3::ArpCache> arg0) [member function]
+    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::AddArpCache(ns3::Ptr<ns3::ArpCache> a) [member function]
     cls.add_method('AddArpCache', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ArpCache >', 'arg0')])
+                   [param('ns3::Ptr< ns3::ArpCache >', 'a')])
     ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::AddNeighbor(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > nodeList, ns3::Ipv4Address ownAddress, ns3::Time expire) [member function]
     cls.add_method('AddNeighbor', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsr/bindings/modulegen__gcc_LP64.py ns-3.34/src/dsr/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/dsr/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsr/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -20,22 +20,30 @@
 def register_types(module):
     root_module = module.get_root()
     
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT'], import_from_module='ns.wifi')
     ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
     module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'], import_from_module='ns.wifi')
-    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [enumeration]
-    module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'EXTENDED_COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
-    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduField [enumeration]
+    module.add_enum('WifiPpduField', ['WIFI_PPDU_FIELD_PREAMBLE', 'WIFI_PPDU_FIELD_NON_HT_HEADER', 'WIFI_PPDU_FIELD_HT_SIG', 'WIFI_PPDU_FIELD_TRAINING', 'WIFI_PPDU_FIELD_SIG_A', 'WIFI_PPDU_FIELD_SIG_B', 'WIFI_PPDU_FIELD_DATA'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
+    module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
     module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_holland', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
+    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
     module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
@@ -51,6 +59,14 @@
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator', 'ns3::AttributeConstructionList::CIterator')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator*', 'ns3::AttributeConstructionList::CIterator*')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator&', 'ns3::AttributeConstructionList::CIterator&')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType [struct]
+    module.add_class('BlockAckReqType', import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID'], outer_class=root_module['ns3::BlockAckReqType'], import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [struct]
+    module.add_class('BlockAckType', import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID', 'MULTI_STA'], outer_class=root_module['ns3::BlockAckType'], import_from_module='ns.wifi')
     ## buffer.h (module 'network'): ns3::Buffer [class]
     module.add_class('Buffer', import_from_module='ns.network')
     ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
@@ -141,6 +157,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -151,6 +169,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -242,10 +262,40 @@
     typehandlers.add_type_alias('uint32_t', 'ns3::TypeId::hash_t')
     typehandlers.add_type_alias('uint32_t*', 'ns3::TypeId::hash_t*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::TypeId::hash_t&')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc [class]
+    module.add_class('WifiAc', import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash [struct]
+    module.add_class('WifiAddressHash', import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash [struct]
+    module.add_class('WifiAddressTidHash', import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode [class]
     module.add_class('WifiMode', import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
     module.add_class('WifiModeFactory', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::CodeRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::CodeRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::CodeRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
     module.add_class('WifiRemoteStation', import_from_module='ns.wifi')
     ## wifi-remote-station-info.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
@@ -364,6 +414,9 @@
     module.add_class('WifiInformationElement', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >'])
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac [class]
     module.add_class('WifiMac', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiMac::ForwardUpCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiMac::ForwardUpCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiMac::ForwardUpCallback&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
     module.add_class('WifiRemoteStationManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::ProtectionMode [enumeration]
@@ -579,8 +632,18 @@
     module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv4Header &', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ipv4L3Protocol::DropReason', 'ns3::Ptr<ns3::Ipv4>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -611,6 +674,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## icmpv4-l4-protocol.h (module 'internet'): ns3::Icmpv4L4Protocol [class]
     module.add_class('Icmpv4L4Protocol', import_from_module='ns.internet', parent=root_module['ns3::IpL4Protocol'])
+    module.add_container('std::list< ns3::BlockAckReqType >', 'ns3::BlockAckReqType', container_type='list')
+    module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
@@ -631,12 +696,18 @@
     typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
     typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
+    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
+    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -871,6 +942,8 @@
     register_Ns3Address_methods(root_module, root_module['ns3::Address'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
+    register_Ns3BlockAckReqType_methods(root_module, root_module['ns3::BlockAckReqType'])
+    register_Ns3BlockAckType_methods(root_module, root_module['ns3::BlockAckType'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
     register_Ns3ByteTagIterator_methods(root_module, root_module['ns3::ByteTagIterator'])
@@ -906,9 +979,11 @@
     register_Ns3IntToType__5_methods(root_module, root_module['ns3::IntToType< 5 >'])
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -938,6 +1013,9 @@
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
+    register_Ns3WifiAc_methods(root_module, root_module['ns3::WifiAc'])
+    register_Ns3WifiAddressHash_methods(root_module, root_module['ns3::WifiAddressHash'])
+    register_Ns3WifiAddressTidHash_methods(root_module, root_module['ns3::WifiAddressTidHash'])
     register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
     register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
     register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
@@ -1051,7 +1129,12 @@
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1233,6 +1316,38 @@
     cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
     return
 
+def register_Ns3BlockAckReqType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v, uint8_t nSeqControls) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v'), param('uint8_t', 'nSeqControls')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_nSeqControls [variable]
+    cls.add_instance_attribute('m_nSeqControls', 'uint8_t', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckReqType::Variant', is_const=False)
+    return
+
+def register_Ns3BlockAckType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
+    cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckType::Variant', is_const=False)
+    return
+
 def register_Ns3Buffer_methods(root_module, cls):
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
@@ -1616,6 +1731,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1781,8 +1904,8 @@
 def register_Ns3DsrHelper_methods(root_module, cls):
     ## dsr-helper.h (module 'dsr'): ns3::DsrHelper::DsrHelper() [constructor]
     cls.add_constructor([])
-    ## dsr-helper.h (module 'dsr'): ns3::DsrHelper::DsrHelper(ns3::DsrHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DsrHelper const &', 'arg0')])
+    ## dsr-helper.h (module 'dsr'): ns3::DsrHelper::DsrHelper(ns3::DsrHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::DsrHelper const &', 'o')])
     ## dsr-helper.h (module 'dsr'): ns3::DsrHelper * ns3::DsrHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::DsrHelper *', 
@@ -1802,8 +1925,8 @@
 def register_Ns3DsrMainHelper_methods(root_module, cls):
     ## dsr-main-helper.h (module 'dsr'): ns3::DsrMainHelper::DsrMainHelper() [constructor]
     cls.add_constructor([])
-    ## dsr-main-helper.h (module 'dsr'): ns3::DsrMainHelper::DsrMainHelper(ns3::DsrMainHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DsrMainHelper const &', 'arg0')])
+    ## dsr-main-helper.h (module 'dsr'): ns3::DsrMainHelper::DsrMainHelper(ns3::DsrMainHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::DsrMainHelper const &', 'o')])
     ## dsr-main-helper.h (module 'dsr'): void ns3::DsrMainHelper::Install(ns3::DsrHelper & dsrHelper, ns3::NodeContainer nodes) [member function]
     cls.add_method('Install', 
                    'void', 
@@ -2171,6 +2294,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2445,6 +2580,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2520,6 +2660,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2540,6 +2692,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -3886,8 +4043,55 @@
     cls.add_instance_attribute('supportMsg', 'std::string', is_const=False)
     return
 
+def register_Ns3WifiAc_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(ns3::WifiAc const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAc const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(uint8_t lowTid, uint8_t highTid) [constructor]
+    cls.add_constructor([param('uint8_t', 'lowTid'), param('uint8_t', 'highTid')])
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetHighTid() const [member function]
+    cls.add_method('GetHighTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetLowTid() const [member function]
+    cls.add_method('GetLowTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetOtherTid(uint8_t tid) const [member function]
+    cls.add_method('GetOtherTid', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    return
+
+def register_Ns3WifiAddressHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash(ns3::WifiAddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressHash::operator()(ns3::Mac48Address const & address) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3WifiAddressTidHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash(ns3::WifiAddressTidHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressTidHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressTidHash::operator()(ns3::WifiAddressTidPair const & addressTidPair) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::WifiAddressTidPair const &', 'addressTidPair')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3WifiMode_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
     cls.add_output_stream_operator()
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [constructor]
@@ -3911,10 +4115,10 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector txVector, uint16_t staId=65535) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetDataRate', 
@@ -3941,10 +4145,15 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector txVector) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint16_t channelWidth) const [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'channelWidth')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -3981,15 +4190,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
     return
 
@@ -3998,6 +4207,8 @@
     cls.add_constructor([])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation(ns3::WifiRemoteStation const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRemoteStation const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_rssiAndUpdateTimePair [variable]
+    cls.add_instance_attribute('m_rssiAndUpdateTimePair', 'std::pair< double, ns3::Time >', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_state [variable]
     cls.add_instance_attribute('m_state', 'ns3::WifiRemoteStationState *', is_const=False)
     return
@@ -4033,6 +4244,10 @@
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
     cls.add_instance_attribute('m_channelWidth', 'uint16_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_dsssSupported [variable]
+    cls.add_instance_attribute('m_dsssSupported', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_erpOfdmSupported [variable]
+    cls.add_instance_attribute('m_erpOfdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_guardInterval [variable]
     cls.add_instance_attribute('m_guardInterval', 'uint16_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_heCapabilities [variable]
@@ -4043,6 +4258,8 @@
     cls.add_instance_attribute('m_info', 'ns3::WifiRemoteStationInfo', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint8_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ofdmSupported [variable]
+    cls.add_instance_attribute('m_ofdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
     cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
@@ -5288,10 +5505,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -5884,7 +6101,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5894,7 +6111,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'i')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -5967,6 +6184,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
     cls.add_method('GetVhtConfiguration', 
                    'ns3::Ptr< ns3::VhtConfiguration >', 
@@ -6016,7 +6238,7 @@
     cls.add_method('SetDevice', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::Callback<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function]
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
@@ -6046,6 +6268,11 @@
                    'void', 
                    [param('ns3::Ssid', 'ssid')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
     cls.add_method('SetWifiPhy', 
                    'void', 
@@ -6086,6 +6313,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): int64_t ns3::WifiRemoteStationManager::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
     cls.add_method('SetMaxSsrc', 
                    'void', 
@@ -6107,10 +6339,6 @@
     cls.add_method('SetFragmentationThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
-    cls.add_method('UpdateFragmentationThreshold', 
-                   'void', 
-                   [])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
     cls.add_method('SetQosSupport', 
                    'void', 
@@ -6154,20 +6382,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetPcfSupported(bool enable) [member function]
-    cls.add_method('SetPcfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetPcfSupported() const [member function]
-    cls.add_method('GetPcfSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported() const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported() const [member function]
     cls.add_method('GetLdpcSupported', 
                    'bool', 
@@ -6201,15 +6415,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseGreenfieldProtection(bool enable) [member function]
-    cls.add_method('SetUseGreenfieldProtection', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseGreenfieldProtection() const [member function]
-    cls.add_method('GetUseGreenfieldProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortPreambleEnabled(bool enable) [member function]
     cls.add_method('SetShortPreambleEnabled', 
                    'void', 
@@ -6261,11 +6466,6 @@
                    'ns3::WifiMode', 
                    [param('uint8_t', 'i')], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported(ns3::Mac48Address address) const [member function]
     cls.add_method('GetLdpcSupported', 
                    'bool', 
@@ -6329,6 +6529,21 @@
                    'uint8_t', 
                    [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetDsssSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetErpOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetErpOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::Mac48Address address) const [member function]
     cls.add_method('GetHtSupported', 
                    'bool', 
@@ -6412,42 +6627,62 @@
     cls.add_method('GetRtsTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsTxVector(ns3::Mac48Address to, ns3::WifiMode rtsTxMode) const [member function]
+    cls.add_method('GetCtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiMode', 'rtsTxMode')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector() [member function]
     cls.add_method('GetCtsToSelfTxVector', 
                    'ns3::WifiTxVector', 
                    [])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetBlockAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetBlockAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetControlAnswerMode(ns3::WifiMode reqMode) const [member function]
+    cls.add_method('GetControlAnswerMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'reqMode')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::WifiMacHeader const & header) [member function]
     cls.add_method('ReportRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('ReportDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::WifiMacHeader const & header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
     cls.add_method('ReportRtsOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector, uint32_t packetSize) [member function]
+                   [param('ns3::WifiMacHeader const &', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
     cls.add_method('ReportDataOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::WifiMacHeader const & header) [member function]
     cls.add_method('ReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('ReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
     cls.add_method('ReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, double rxSnr, ns3::WifiMode txMode) [member function]
+                   [param('ns3::Mac48Address', 'address'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
     cls.add_method('ReportRxOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')])
+                   [param('ns3::Mac48Address', 'address'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::WifiMacHeader const & header, uint32_t size) [member function]
     cls.add_method('NeedRts', 
                    'bool', 
@@ -6456,26 +6691,26 @@
     cls.add_method('NeedCtsToSelf', 
                    'bool', 
                    [param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NeedRetransmission', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NeedFragmentation', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
     cls.add_method('GetFragmentSize', 
                    'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
     cls.add_method('GetFragmentOffset', 
                    'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
     cls.add_method('IsLastFragment', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
     ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
     cls.add_method('GetDefaultTxPowerLevel', 
                    'uint8_t', 
@@ -6485,6 +6720,11 @@
     cls.add_method('GetInfo', 
                    'ns3::WifiRemoteStationInfo', 
                    [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): double ns3::WifiRemoteStationManager::GetMostRecentRssi(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetMostRecentRssi', 
+                   'double', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
     cls.add_method('SetDefaultTxPowerLevel', 
                    'void', 
@@ -6499,16 +6739,21 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseGreenfieldForDestination(ns3::Mac48Address dest) const [member function]
-    cls.add_method('UseGreenfieldForDestination', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseLdpcForDestination(ns3::Mac48Address dest) const [member function]
     cls.add_method('UseLdpcForDestination', 
                    'bool', 
                    [param('ns3::Mac48Address', 'dest')], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
+    cls.add_method('GetPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
+    cls.add_method('GetMac', 
+                   'ns3::Ptr< ns3::WifiMac >', 
+                   [], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
@@ -6591,11 +6836,6 @@
                    'bool', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetGreenfield', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetNumberOfSupportedStreams', 
                    'uint8_t', 
@@ -6606,16 +6846,6 @@
                    'uint8_t', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
-    cls.add_method('GetMac', 
-                   'ns3::Ptr< ns3::WifiMac >', 
-                   [], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
     cls.add_method('DoNeedRts', 
                    'bool', 
@@ -6681,10 +6911,10 @@
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
                    is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
     cls.add_method('DoReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
                    is_virtual=True, visibility='private')
     return
 
@@ -7145,6 +7375,11 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['unsigned long'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -7703,7 +7938,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSupportedMcsAndNss() const [member function]
     cls.add_method('GetSupportedMcsAndNss', 
                    'uint16_t', 
@@ -7723,7 +7958,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -7802,11 +8037,6 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
-    cls.add_method('GetGreenfield', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetHtCapabilitiesInfo() const [member function]
     cls.add_method('GetHtCapabilitiesInfo', 
                    'uint16_t', 
@@ -7841,7 +8071,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval20() const [member function]
     cls.add_method('GetShortGuardInterval20', 
                    'uint8_t', 
@@ -7876,7 +8106,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -7894,10 +8124,6 @@
     cls.add_method('SetExtendedHtCapabilities', 
                    'void', 
                    [param('uint16_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
-    cls.add_method('SetGreenfield', 
-                   'void', 
-                   [param('uint8_t', 'greenfield')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtCapabilitiesInfo(uint16_t ctrl) [member function]
     cls.add_method('SetHtCapabilitiesInfo', 
                    'void', 
@@ -10000,7 +10226,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
     cls.add_method('GetSupportedChannelWidthSet', 
                    'uint8_t', 
@@ -10040,7 +10266,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -10210,6 +10436,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -10232,6 +10480,94 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0, short unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('ns3::WifiTxVector const &', 'arg0'), param('short unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): short unsigned int ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'short unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -12211,10 +12547,10 @@
     cls.add_constructor([param('ns3::dsr::DsrRouteCache const &', 'arg0')])
     ## dsr-rcache.h (module 'dsr'): ns3::dsr::DsrRouteCache::DsrRouteCache() [constructor]
     cls.add_constructor([])
-    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::AddArpCache(ns3::Ptr<ns3::ArpCache> arg0) [member function]
+    ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::AddArpCache(ns3::Ptr<ns3::ArpCache> a) [member function]
     cls.add_method('AddArpCache', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ArpCache >', 'arg0')])
+                   [param('ns3::Ptr< ns3::ArpCache >', 'a')])
     ## dsr-rcache.h (module 'dsr'): void ns3::dsr::DsrRouteCache::AddNeighbor(std::vector<ns3::Ipv4Address, std::allocator<ns3::Ipv4Address> > nodeList, ns3::Ipv4Address ownAddress, ns3::Time expire) [member function]
     cls.add_method('AddNeighbor', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsr/helper/dsr-helper.h ns-3.34/src/dsr/helper/dsr-helper.h
--- ns-3.33/src/dsr/helper/dsr-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsr/helper/dsr-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -61,8 +61,9 @@
   /**
    * \brief Construct an DsrHelper from another previously initialized instance
    * (Copy Constructor).
+   * \param o object to copy from
    */
-  DsrHelper (const DsrHelper &);
+  DsrHelper (const DsrHelper &o);
   /**
    * \returns pointer to clone of this DsrHelper
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsr/helper/dsr-main-helper.h ns-3.34/src/dsr/helper/dsr-main-helper.h
--- ns-3.33/src/dsr/helper/dsr-main-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsr/helper/dsr-main-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -57,8 +57,9 @@
   /**
    * \brief Construct an DsrMainHelper from another previously initialized instance
    * (Copy Constructor).
+   * \param o object to copy from
    */
-  DsrMainHelper (const DsrMainHelper &);
+  DsrMainHelper (const DsrMainHelper &o);
   /**
    * Install routing to the nodes
    * \param dsrHelper The DSR helper class
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsr/model/dsr-fs-header.h ns-3.34/src/dsr/model/dsr-fs-header.h
--- ns-3.33/src/dsr/model/dsr-fs-header.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsr/model/dsr-fs-header.h	2021-07-14 10:31:06.000000000 -0700
@@ -150,7 +150,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
   /**
@@ -299,7 +298,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsr/model/dsr-option-header.h ns-3.34/src/dsr/model/dsr-option-header.h
--- ns-3.33/src/dsr/model/dsr-option-header.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsr/model/dsr-option-header.h	2021-07-14 10:31:06.000000000 -0700
@@ -100,7 +100,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
   /**
@@ -171,7 +170,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
   /**
@@ -221,7 +219,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
   /**
@@ -350,7 +347,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
   /**
@@ -502,7 +498,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
   /**
@@ -643,7 +638,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
   /**
@@ -795,7 +789,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
   /**
@@ -951,7 +944,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
   /**
@@ -1098,7 +1090,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
   /**
@@ -1197,7 +1188,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
   /**
@@ -1304,7 +1294,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsr/model/dsr-options.h ns-3.34/src/dsr/model/dsr-options.h
--- ns-3.33/src/dsr/model/dsr-options.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsr/model/dsr-options.h	2021-07-14 10:31:06.000000000 -0700
@@ -183,8 +183,7 @@
   /**
    * \brief Remove the duplicates from the route
    *
-   * \param vec List of IPv4 addresses to be clean
-   * \return the route after route shorten
+   * \param [in,out] vec List of IPv4 addresses to clean
    */
   void RemoveDuplicates (std::vector<Ipv4Address>& vec);
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsr/model/dsr-rcache.h ns-3.34/src/dsr/model/dsr-rcache.h
--- ns-3.33/src/dsr/model/dsr-rcache.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsr/model/dsr-rcache.h	2021-07-14 10:31:06.000000000 -0700
@@ -706,28 +706,36 @@
   }
   /**
    * \brief Add ARP cache to be used to allow layer 2 notifications processing
+   * \param a ARP cache
    */
-  void AddArpCache (Ptr<ArpCache>);
+  void AddArpCache (Ptr<ArpCache> a);
   /**
    * \brief Don't use the provided ARP cache any more (interface is down)
+   * \param a ARP cache
    */
   void DelArpCache (Ptr<ArpCache>);
   /**
    * \brief Get callback to ProcessTxError, this callback is trying to use the wifi mac tx error header to notify a link layer drop event, however,
    * it is not fully supported yet
+   * \return The callback to ProcessTxError
    */
   Callback<void, WifiMacHeader const &> GetTxErrorCallback () const
   {
     return m_txErrorCallback;
   }
 
-  /// Handle link failure callback
-  /// \param cb the callback to be set
+  /**
+   * Handle link failure callback
+   * \param cb the callback to be set
+   */
   void SetCallback (Callback<void, Ipv4Address, uint8_t > cb)
   {
     m_handleLinkFailure = cb;
   }
-  /// Handle link failure callback
+  /**
+   * Handle link failure callback
+   * \return The callback to LinkFailure
+   */
   Callback<void, Ipv4Address, uint8_t > GetCallback () const
   {
     return m_handleLinkFailure;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/dsr/model/dsr-routing.h ns-3.34/src/dsr/model/dsr-routing.h
--- ns-3.33/src/dsr/model/dsr-routing.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/dsr/model/dsr-routing.h	2021-07-14 10:31:06.000000000 -0700
@@ -153,86 +153,150 @@
     */
   Ptr<dsr::DsrPassiveBuffer> GetPassiveBuffer () const;
 
-  /// functions used to direct to route cache
-  //\{
+  /**
+   * \brief Checks if the link is cached in the route cache
+   * See also DsrRouteCache::IsLinkCache
+   *
+   * \return true if the link is cached
+   */
   bool IsLinkCache ();
+
+  /**
+   * \brief Extends the lifetime of a route cache entry.
+   * See also DsrRouteCache::UseExtends
+   *
+   * \param rt the route to extend
+   */
   void UseExtends (DsrRouteCacheEntry::IP_VECTOR rt);
+
+  /**
+   * \brief Lookup route cache entry with destination address dst
+   * See also DsrRouteCache::LookupRoute
+   *
+   * \param id destination address
+   * \param rt entry with destination address id, if exists
+   * \return true on success
+   */
   bool LookupRoute (Ipv4Address id, DsrRouteCacheEntry & rt);
+
+  /**
+   * \brief dd route link to cache
+   * See also DsrRouteCache::AddRoute_Link
+   *
+   * \param nodelist vector of nodes
+   * \param source ip address of node to add
+   * \return true if the link is cached
+   */
   bool AddRoute_Link (DsrRouteCacheEntry::IP_VECTOR nodelist, Ipv4Address source);
+
+  /**
+   * \brief Add route cache entry if it doesn't yet exist in route cache
+   * See also DsrRouteCache::AddRoute
+   *
+   * \param rt route cache entry
+   * \return true on success
+   */
   bool AddRoute (DsrRouteCacheEntry & rt);
+
+  /**
+   * \brief Delete all the routes which includes the link from next hop address that has just been notified
+   * as unreachable.
+   * See also DsrRouteCache::DeleteAllRoutesIncludeLink
+   *
+   * \param errorSrc The error source address
+   * \param unreachNode The unreachable node
+   * \param node This node's ip address
+   */
   void DeleteAllRoutesIncludeLink (Ipv4Address errorSrc, Ipv4Address unreachNode, Ipv4Address node);
+
+  /**
+   * \brief Update route cache entry if it has been recently used and successfully delivered the data packet.
+   * See also DsrRouteCache::UpdateRouteEntry
+   *
+   * \param dst destination address of the route
+   * \return true in success
+   */
   bool UpdateRouteEntry (Ipv4Address dst);
+
+  /**
+   * Find the source request entry in the route request queue, return false if not found.
+   * See also DsrRreqTable::FindSourceEntry
+   *
+   * \param src the source address we just received the source request
+   * \param dst the destination address the request is targeted at
+   * \param id the identification number for this request
+   * \return true if found, false otherwise
+   */
   bool FindSourceEntry (Ipv4Address src, Ipv4Address dst, uint16_t id);
-  //\}
 
   /**
-    * \brief Get the netdevice from the context.
-    * \param context context
-    * \return the netdevice we are looking for
-    */
+   * \brief Get the netdevice from the context.
+   * \param context context
+   * \return the netdevice we are looking for
+   */
   Ptr<NetDevice> GetNetDeviceFromContext (std::string context);
   /**
-    * \brief Get the elements from the tracing context.
-    * \param context context
-    * \return the elements we are looking for
-    */
+   * \brief Get the elements from the tracing context.
+   * \param context context
+   * \return the elements we are looking for
+   */
   std::vector<std::string> GetElementsFromContext (std::string context);
   /**
-    * \brief Get the node id from ip address.
-    * \param address IPv4 address
-    * \return the node id
-    */
+   * \brief Get the node id from ip address.
+   * \param address IPv4 address
+   * \return the node id
+   */
   uint16_t GetIDfromIP (Ipv4Address address);
   /**
-    * \brief Get the ip address from id.
-    * \param id unique ID
-    * \return the ip address for the id
-    */
+   * \brief Get the ip address from id.
+   * \param id unique ID
+   * \return the ip address for the id
+   */
   Ipv4Address GetIPfromID (uint16_t id);
   /**
-    * \brief Get the Ip address from mac address.
-    * \param address Mac48Address
-    * \return the ip address
-    */
+   * \brief Get the Ip address from mac address.
+   * \param address Mac48Address
+   * \return the ip address
+   */
   Ipv4Address GetIPfromMAC (Mac48Address address);
   /**
-    * \brief Get the node with give ip address.
-    * \param ipv4Address IPv4 address
-    * \return the node associated with the ip address
-    */
+   * \brief Get the node with give ip address.
+   * \param ipv4Address IPv4 address
+   * \return the node associated with the ip address
+   */
   Ptr<Node> GetNodeWithAddress (Ipv4Address ipv4Address);
   /**
-    * \brief Print the route vector.
-    * \param vec the vector to print.
-    */
+   * \brief Print the route vector.
+   * \param vec the vector to print.
+   */
   void PrintVector (std::vector<Ipv4Address>& vec);
   /**
-    * \brief Get the next hop of the route.
-    * \param ipv4Address
-    * \param vec Route
-    * \return the next hop address of the route
-    */
+   * \brief Get the next hop of the route.
+   * \param ipv4Address
+   * \param vec Route
+   * \return the next hop address of the route
+   */
   Ipv4Address SearchNextHop (Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec);
   /**
-    * \brief Get the dsr protocol number.
-    * \return protocol number
-    */
+   * \brief Get the dsr protocol number.
+   * \return protocol number
+   */
   int GetProtocolNumber (void) const;
   /**
-    * \brief The send buffer timer expire.
-    */
+   * \brief The send buffer timer expire.
+   */
   void SendBuffTimerExpire ();
   /**
-    * \brief Check the send buffer of packets with route when send buffer timer expire.
-    */
+   * \brief Check the send buffer of packets with route when send buffer timer expire.
+   */
   void CheckSendBuffer ();
   /**
-    * \brief When route vector corrupted, originate a new packet, normally not happening.
-    * \param packet to route
-    * \param source address
-    * \param destination address
-    * \param protocol number
-    */
+   * \brief When route vector corrupted, originate a new packet, normally not happening.
+   * \param packet to route
+   * \param source address
+   * \param destination address
+   * \param protocol number
+   */
   void PacketNewRoute (Ptr<Packet> packet,
                        Ipv4Address source,
                        Ipv4Address destination,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/energy/bindings/modulegen__gcc_ILP32.py ns-3.34/src/energy/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/energy/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/energy/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -86,12 +86,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## li-ion-energy-source-helper.h (module 'energy'): ns3::LiIonEnergySourceHelper [class]
@@ -542,8 +546,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LiIonEnergySourceHelper_methods(root_module, root_module['ns3::LiIonEnergySourceHelper'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
@@ -1612,6 +1618,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1825,6 +1843,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1900,6 +1923,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1920,6 +1955,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/energy/bindings/modulegen__gcc_LP64.py ns-3.34/src/energy/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/energy/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/energy/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -86,12 +86,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## li-ion-energy-source-helper.h (module 'energy'): ns3::LiIonEnergySourceHelper [class]
@@ -542,8 +546,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LiIonEnergySourceHelper_methods(root_module, root_module['ns3::LiIonEnergySourceHelper'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
@@ -1612,6 +1618,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1825,6 +1843,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1900,6 +1923,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1920,6 +1955,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/fd-net-device/bindings/modulegen__gcc_ILP32.py ns-3.34/src/fd-net-device/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/fd-net-device/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/fd-net-device/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -89,12 +89,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -152,7 +156,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
@@ -470,8 +474,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1196,6 +1202,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1572,6 +1586,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1785,6 +1811,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1860,6 +1891,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1880,6 +1923,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5445,6 +5493,11 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
+    ## fd-net-device.h (module 'fd-net-device'): void ns3::FdNetDevice::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     ## fd-net-device.h (module 'fd-net-device'): void ns3::FdNetDevice::FreeBuffer(uint8_t * buf) [member function]
     cls.add_method('FreeBuffer', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/fd-net-device/bindings/modulegen__gcc_LP64.py ns-3.34/src/fd-net-device/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/fd-net-device/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/fd-net-device/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -89,12 +89,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -152,7 +156,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
@@ -470,8 +474,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1196,6 +1202,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1572,6 +1586,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1785,6 +1811,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1860,6 +1891,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1880,6 +1923,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5445,6 +5493,11 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
+    ## fd-net-device.h (module 'fd-net-device'): void ns3::FdNetDevice::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     ## fd-net-device.h (module 'fd-net-device'): void ns3::FdNetDevice::FreeBuffer(uint8_t * buf) [member function]
     cls.add_method('FreeBuffer', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/fd-net-device/examples/dummy-network.cc ns-3.34/src/fd-net-device/examples/dummy-network.cc
--- ns-3.33/src/fd-net-device/examples/dummy-network.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/fd-net-device/examples/dummy-network.cc	2021-07-14 10:31:06.000000000 -0700
@@ -74,7 +74,16 @@
 
   fd.EnablePcapAll ("dummy-network", true);
 
-  Simulator::Stop (Seconds (5.));
+  // The next three lines will stop the simulator at time 5 seconds.  Usually,
+  // it is sufficient to just call Simulator::Stop (Seconds (5)).
+  // However, in order to produce a clean valgrind output
+  // when running this example in our test suite (see issue #343), we
+  // first stop each device explicitly at time 5, and then wait one
+  // simulator timestep later (1 nanosecond by default) to call
+  // Simulator::Stop ().
+  device1->Stop (Seconds (5));
+  device2->Stop (Seconds (5));
+  Simulator::Stop (Seconds (5) + TimeStep (1));
   Simulator::Run ();
   Simulator::Destroy ();
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/fd-net-device/model/fd-net-device.cc ns-3.34/src/fd-net-device/model/fd-net-device.cc
--- ns-3.33/src/fd-net-device/model/fd-net-device.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/fd-net-device/model/fd-net-device.cc	2021-07-14 10:31:06.000000000 -0700
@@ -178,16 +178,24 @@
     m_stopEvent ()
 {
   NS_LOG_FUNCTION (this);
-  Start (m_tStart);
 }
 
-FdNetDevice::FdNetDevice (FdNetDevice const &)
+FdNetDevice::~FdNetDevice ()
 {
+  NS_LOG_FUNCTION (this);
 }
 
-FdNetDevice::~FdNetDevice ()
+void
+FdNetDevice::DoInitialize (void)
 {
   NS_LOG_FUNCTION (this);
+  Start (m_tStart);
+  if (m_tStop != Seconds (0))
+    {
+        Stop (m_tStop);
+    }
+
+  NetDevice::DoInitialize ();
 }
 
 void
@@ -201,7 +209,7 @@
 void
 FdNetDevice::SetEncapsulationMode (enum EncapsulationMode mode)
 {
-  NS_LOG_FUNCTION (mode);
+  NS_LOG_FUNCTION (this << mode);
   m_encapMode = mode;
   NS_LOG_LOGIC ("m_encapMode = " << m_encapMode);
 }
@@ -216,7 +224,7 @@
 void
 FdNetDevice::Start (Time tStart)
 {
-  NS_LOG_FUNCTION (tStart);
+  NS_LOG_FUNCTION (this << tStart);
   Simulator::Cancel (m_startEvent);
   m_startEvent = Simulator::Schedule (tStart, &FdNetDevice::StartDevice, this);
 }
@@ -224,9 +232,9 @@
 void
 FdNetDevice::Stop (Time tStop)
 {
-  NS_LOG_FUNCTION (tStop);
+  NS_LOG_FUNCTION (this << tStop);
   Simulator::Cancel (m_stopEvent);
-  m_startEvent = Simulator::Schedule (tStop, &FdNetDevice::StopDevice, this);
+  m_stopEvent = Simulator::Schedule (tStop, &FdNetDevice::StopDevice, this);
 }
 
 void
@@ -294,7 +302,7 @@
 void
 FdNetDevice::ReceiveCallback (uint8_t *buf, ssize_t len)
 {
-  NS_LOG_FUNCTION (this << buf << len);
+  NS_LOG_FUNCTION (this << static_cast<void *> (buf) << len);
   bool skip = false;
 
   {
@@ -402,6 +410,7 @@
 void
 FdNetDevice::ForwardUp (void)
 {
+  NS_LOG_FUNCTION (this);
 
   uint8_t *buf = 0;
   ssize_t len = 0;
@@ -415,7 +424,7 @@
     len = next.second;
   }
 
-  NS_LOG_FUNCTION (this << buf << len);
+  NS_LOG_LOGIC ("buffer: " << static_cast<void *> (buf) << " length: " << len);
 
   // We need to remove the PI header and ignore it
   if (m_encapMode == DIXPI)
@@ -626,7 +635,7 @@
 ssize_t
 FdNetDevice::Write (uint8_t *buffer, size_t length)
 {
-  NS_LOG_FUNCTION (this << buffer << length);
+  NS_LOG_FUNCTION (this << static_cast<void *> (buffer) << length);
 
   uint32_t ret = write (m_fd, buffer, length);
   return ret;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/fd-net-device/model/fd-net-device.h ns-3.34/src/fd-net-device/model/fd-net-device.h
--- ns-3.33/src/fd-net-device/model/fd-net-device.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/fd-net-device/model/fd-net-device.h	2021-07-14 10:31:06.000000000 -0700
@@ -196,6 +196,11 @@
   virtual ssize_t Write (uint8_t *buffer, size_t length);
 
 protected:
+  /**
+   * Method Initialization for start and stop attributes.
+   */
+  virtual void DoInitialize (void);
+  
   virtual void DoDispose (void);
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/flow-monitor/bindings/modulegen__gcc_ILP32.py ns-3.34/src/flow-monitor/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/flow-monitor/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/flow-monitor/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -89,6 +89,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -99,6 +101,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress [class]
     module.add_class('Ipv6InterfaceAddress', import_from_module='ns.internet')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::State_e [enumeration]
@@ -613,9 +617,11 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
@@ -1743,6 +1749,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2017,6 +2035,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2092,6 +2115,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2102,6 +2137,8 @@
     cls.add_constructor([param('ns3::Ipv6Address', 'address')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
@@ -2114,6 +2151,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
     cls.add_method('GetPrefix', 
                    'ns3::Ipv6Prefix', 
@@ -2142,6 +2184,10 @@
     cls.add_method('SetNsDadUid', 
                    'void', 
                    [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
     cls.add_method('SetScope', 
                    'void', 
@@ -2172,6 +2218,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4293,10 +4344,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -6014,10 +6065,10 @@
     cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
     ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
     cls.add_constructor([])
-    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_pure_virtual=True, is_virtual=True)
     ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
@@ -6422,10 +6473,10 @@
                    'int32_t', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
                    is_const=True, is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
     cls.add_method('GetAddress', 
@@ -6556,6 +6607,10 @@
                    'bool', 
                    [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')], 
                    is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::ReachabilityHint(uint32_t ipInterfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('ReachabilityHint', 
+                   'bool', 
+                   [param('uint32_t', 'ipInterfaceIndex'), param('ns3::Ipv6Address', 'address')])
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/flow-monitor/bindings/modulegen__gcc_LP64.py ns-3.34/src/flow-monitor/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/flow-monitor/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/flow-monitor/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -89,6 +89,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -99,6 +101,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress [class]
     module.add_class('Ipv6InterfaceAddress', import_from_module='ns.internet')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::State_e [enumeration]
@@ -613,9 +617,11 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
@@ -1743,6 +1749,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2017,6 +2035,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2092,6 +2115,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2102,6 +2137,8 @@
     cls.add_constructor([param('ns3::Ipv6Address', 'address')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
@@ -2114,6 +2151,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
     cls.add_method('GetPrefix', 
                    'ns3::Ipv6Prefix', 
@@ -2142,6 +2184,10 @@
     cls.add_method('SetNsDadUid', 
                    'void', 
                    [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
     cls.add_method('SetScope', 
                    'void', 
@@ -2172,6 +2218,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4293,10 +4344,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -6014,10 +6065,10 @@
     cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
     ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
     cls.add_constructor([])
-    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_pure_virtual=True, is_virtual=True)
     ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
@@ -6422,10 +6473,10 @@
                    'int32_t', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
                    is_const=True, is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
     cls.add_method('GetAddress', 
@@ -6556,6 +6607,10 @@
                    'bool', 
                    [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')], 
                    is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::ReachabilityHint(uint32_t ipInterfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('ReachabilityHint', 
+                   'bool', 
+                   [param('uint32_t', 'ipInterfaceIndex'), param('ns3::Ipv6Address', 'address')])
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/bindings/modulegen__gcc_ILP32.py ns-3.34/src/internet/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/internet/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -147,6 +147,8 @@
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv4-address-generator.h (module 'internet'): ns3::Ipv4AddressGenerator [class]
     module.add_class('Ipv4AddressGenerator')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper [class]
     module.add_class('Ipv4AddressHelper')
     ## ipv4-end-point.h (module 'internet'): ns3::Ipv4EndPoint [class]
@@ -184,6 +186,8 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address-generator.h (module 'internet'): ns3::Ipv6AddressGenerator [class]
     module.add_class('Ipv6AddressGenerator')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper [class]
     module.add_class('Ipv6AddressHelper')
     ## ipv6-end-point.h (module 'internet'): ns3::Ipv6EndPoint [class]
@@ -274,7 +278,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -370,6 +374,10 @@
     typehandlers.add_type_alias('uint32_t', 'ns3::TypeId::hash_t')
     typehandlers.add_type_alias('uint32_t*', 'ns3::TypeId::hash_t*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::TypeId::hash_t&')
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int> [class]
+    module.add_class('WindowedFilter', template_parameters=['ns3::DataRate', 'ns3::MaxFilter<ns3::DataRate>', 'unsigned int', 'unsigned int'])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample [struct]
+    module.add_class('Sample', outer_class=root_module['ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int >'])
     ## empty.h (module 'core'): ns3::empty [class]
     module.add_class('empty', import_from_module='ns.core')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t [class]
@@ -418,6 +426,11 @@
     module.add_class('Icmpv6OptionMtu', parent=root_module['ns3::Icmpv6OptionHeader'])
     ## icmpv6-header.h (module 'internet'): ns3::Icmpv6OptionPrefixInformation [class]
     module.add_class('Icmpv6OptionPrefixInformation', parent=root_module['ns3::Icmpv6OptionHeader'])
+    ## icmpv6-header.h (module 'internet'): ns3::Icmpv6OptionPrefixInformation::Flags_t [enumeration]
+    module.add_enum('Flags_t', ['NONE', 'ROUTERADDR', 'AUTADDRCONF', 'ONLINK'], outer_class=root_module['ns3::Icmpv6OptionPrefixInformation'])
+    typehandlers.add_type_alias('ns3::Icmpv6OptionPrefixInformation::Flags_t', 'ns3::Icmpv6OptionPrefixInformation::Flags_t')
+    typehandlers.add_type_alias('ns3::Icmpv6OptionPrefixInformation::Flags_t*', 'ns3::Icmpv6OptionPrefixInformation::Flags_t*')
+    typehandlers.add_type_alias('ns3::Icmpv6OptionPrefixInformation::Flags_t&', 'ns3::Icmpv6OptionPrefixInformation::Flags_t&')
     ## icmpv6-header.h (module 'internet'): ns3::Icmpv6OptionRedirected [class]
     module.add_class('Icmpv6OptionRedirected', parent=root_module['ns3::Icmpv6OptionHeader'])
     ## icmpv6-header.h (module 'internet'): ns3::Icmpv6ParameterError [class]
@@ -1001,6 +1014,16 @@
     module.add_class('RipNg', parent=root_module['ns3::Ipv6RoutingProtocol'])
     ## ripng.h (module 'internet'): ns3::RipNg::SplitHorizonType_e [enumeration]
     module.add_enum('SplitHorizonType_e', ['NO_SPLIT_HORIZON', 'SPLIT_HORIZON', 'POISON_REVERSE'], outer_class=root_module['ns3::RipNg'])
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr [class]
+    module.add_class('TcpBbr', parent=root_module['ns3::TcpCongestionOps'])
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr::BbrMode_t [enumeration]
+    module.add_enum('BbrMode_t', ['BBR_STARTUP', 'BBR_DRAIN', 'BBR_PROBE_BW', 'BBR_PROBE_RTT'], outer_class=root_module['ns3::TcpBbr'])
+    typehandlers.add_type_alias('ns3::TcpBbr::BbrMode_t', 'ns3::TcpBbr::BbrMode_t')
+    typehandlers.add_type_alias('ns3::TcpBbr::BbrMode_t*', 'ns3::TcpBbr::BbrMode_t*')
+    typehandlers.add_type_alias('ns3::TcpBbr::BbrMode_t&', 'ns3::TcpBbr::BbrMode_t&')
+    typehandlers.add_type_alias('ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter< ns3::DataRate >, unsigned int, unsigned int >', 'ns3::TcpBbr::MaxBandwidthFilter_t')
+    typehandlers.add_type_alias('ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter< ns3::DataRate >, unsigned int, unsigned int >*', 'ns3::TcpBbr::MaxBandwidthFilter_t*')
+    typehandlers.add_type_alias('ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter< ns3::DataRate >, unsigned int, unsigned int >&', 'ns3::TcpBbr::MaxBandwidthFilter_t&')
     ## tcp-bic.h (module 'internet'): ns3::TcpBic [class]
     module.add_class('TcpBic', parent=root_module['ns3::TcpCongestionOps'])
     ## tcp-recovery-ops.h (module 'internet'): ns3::TcpClassicRecovery [class]
@@ -1361,6 +1384,7 @@
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
     register_Ns3Ipv4AddressGenerator_methods(root_module, root_module['ns3::Ipv4AddressGenerator'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4AddressHelper_methods(root_module, root_module['ns3::Ipv4AddressHelper'])
     register_Ns3Ipv4EndPoint_methods(root_module, root_module['ns3::Ipv4EndPoint'])
     register_Ns3Ipv4EndPointDemux_methods(root_module, root_module['ns3::Ipv4EndPointDemux'])
@@ -1373,6 +1397,7 @@
     register_Ns3Ipv4StaticRoutingHelper_methods(root_module, root_module['ns3::Ipv4StaticRoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6AddressGenerator_methods(root_module, root_module['ns3::Ipv6AddressGenerator'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6AddressHelper_methods(root_module, root_module['ns3::Ipv6AddressHelper'])
     register_Ns3Ipv6EndPoint_methods(root_module, root_module['ns3::Ipv6EndPoint'])
     register_Ns3Ipv6EndPointDemux_methods(root_module, root_module['ns3::Ipv6EndPointDemux'])
@@ -1433,6 +1458,8 @@
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
+    register_Ns3WindowedFilter__Ns3DataRate_Ns3MaxFilter__lt__ns3DataRate__gt___Unsigned_int_Unsigned_int_methods(root_module, root_module['ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int >'])
+    register_Ns3WindowedFilter__lt___ns3DataRate__ns3MaxFilter__lt__ns3DataRate__gt____unsigned_int__unsigned_int___gt__Sample_methods(root_module, root_module['ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int >::Sample'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
@@ -1645,6 +1672,7 @@
     register_Ns3QueueItem_methods(root_module, root_module['ns3::QueueItem'])
     register_Ns3Rip_methods(root_module, root_module['ns3::Rip'])
     register_Ns3RipNg_methods(root_module, root_module['ns3::RipNg'])
+    register_Ns3TcpBbr_methods(root_module, root_module['ns3::TcpBbr'])
     register_Ns3TcpBic_methods(root_module, root_module['ns3::TcpBic'])
     register_Ns3TcpClassicRecovery_methods(root_module, root_module['ns3::TcpClassicRecovery'])
     register_Ns3TcpDctcp_methods(root_module, root_module['ns3::TcpDctcp'])
@@ -2495,6 +2523,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2760,10 +2796,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## global-route-manager-impl.h (module 'internet'): void ns3::GlobalRouteManagerImpl::DebugUseLsdb(ns3::GlobalRouteManagerLSDB * arg0) [member function]
+    ## global-route-manager-impl.h (module 'internet'): void ns3::GlobalRouteManagerImpl::DebugUseLsdb(ns3::GlobalRouteManagerLSDB * lsdb) [member function]
     cls.add_method('DebugUseLsdb', 
                    'void', 
-                   [param('ns3::GlobalRouteManagerLSDB *', 'arg0')])
+                   [param('ns3::GlobalRouteManagerLSDB *', 'lsdb')])
     ## global-route-manager-impl.h (module 'internet'): void ns3::GlobalRouteManagerImpl::DebugSPFCalculate(ns3::Ipv4Address root) [member function]
     cls.add_method('DebugSPFCalculate', 
                    'void', 
@@ -3316,6 +3352,18 @@
                    is_static=True)
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4AddressHelper_methods(root_module, cls):
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper::Ipv4AddressHelper(ns3::Ipv4AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv4AddressHelper const &', 'arg0')])
@@ -3822,8 +3870,8 @@
 def register_Ns3Ipv4StaticRoutingHelper_methods(root_module, cls):
     ## ipv4-static-routing-helper.h (module 'internet'): ns3::Ipv4StaticRoutingHelper::Ipv4StaticRoutingHelper() [constructor]
     cls.add_constructor([])
-    ## ipv4-static-routing-helper.h (module 'internet'): ns3::Ipv4StaticRoutingHelper::Ipv4StaticRoutingHelper(ns3::Ipv4StaticRoutingHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4StaticRoutingHelper const &', 'arg0')])
+    ## ipv4-static-routing-helper.h (module 'internet'): ns3::Ipv4StaticRoutingHelper::Ipv4StaticRoutingHelper(ns3::Ipv4StaticRoutingHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv4StaticRoutingHelper const &', 'o')])
     ## ipv4-static-routing-helper.h (module 'internet'): ns3::Ipv4StaticRoutingHelper * ns3::Ipv4StaticRoutingHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ipv4StaticRoutingHelper *', 
@@ -4023,6 +4071,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -4160,6 +4213,18 @@
                    is_static=True)
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6AddressHelper_methods(root_module, cls):
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper::Ipv6AddressHelper(ns3::Ipv6AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv6AddressHelper const &', 'arg0')])
@@ -4175,10 +4240,18 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    cls.add_method('Assign', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutAddress(ns3::NetDeviceContainer const & c) [member function]
     cls.add_method('AssignWithoutAddress', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutOnLink(ns3::NetDeviceContainer const & c) [member function]
+    cls.add_method('AssignWithoutOnLink', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6AddressHelper::NewAddress(ns3::Address addr) [member function]
     cls.add_method('NewAddress', 
                    'ns3::Ipv6Address', 
@@ -4330,6 +4403,8 @@
     cls.add_constructor([param('ns3::Ipv6Address', 'address')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
@@ -4342,6 +4417,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
     cls.add_method('GetPrefix', 
                    'ns3::Ipv6Prefix', 
@@ -4370,6 +4450,10 @@
     cls.add_method('SetNsDadUid', 
                    'void', 
                    [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
     cls.add_method('SetScope', 
                    'void', 
@@ -4517,6 +4601,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4722,8 +4811,8 @@
 def register_Ns3Ipv6StaticRoutingHelper_methods(root_module, cls):
     ## ipv6-static-routing-helper.h (module 'internet'): ns3::Ipv6StaticRoutingHelper::Ipv6StaticRoutingHelper() [constructor]
     cls.add_constructor([])
-    ## ipv6-static-routing-helper.h (module 'internet'): ns3::Ipv6StaticRoutingHelper::Ipv6StaticRoutingHelper(ns3::Ipv6StaticRoutingHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv6StaticRoutingHelper const &', 'arg0')])
+    ## ipv6-static-routing-helper.h (module 'internet'): ns3::Ipv6StaticRoutingHelper::Ipv6StaticRoutingHelper(ns3::Ipv6StaticRoutingHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv6StaticRoutingHelper const &', 'o')])
     ## ipv6-static-routing-helper.h (module 'internet'): ns3::Ipv6StaticRoutingHelper * ns3::Ipv6StaticRoutingHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ipv6StaticRoutingHelper *', 
@@ -6998,6 +7087,61 @@
     cls.add_instance_attribute('supportMsg', 'std::string', is_const=False)
     return
 
+def register_Ns3WindowedFilter__Ns3DataRate_Ns3MaxFilter__lt__ns3DataRate__gt___Unsigned_int_Unsigned_int_methods(root_module, cls):
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::WindowedFilter(ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter< ns3::DataRate >, unsigned int, unsigned int > const &', 'arg0')])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::WindowedFilter() [constructor]
+    cls.add_constructor([])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::WindowedFilter(unsigned int windowLength, ns3::DataRate zeroValue, unsigned int zeroTime) [constructor]
+    cls.add_constructor([param('unsigned int', 'windowLength'), param('ns3::DataRate', 'zeroValue'), param('unsigned int', 'zeroTime')])
+    ## windowed-filter.h (module 'internet'): ns3::DataRate ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::GetBest() const [member function]
+    cls.add_method('GetBest', 
+                   'ns3::DataRate', 
+                   [], 
+                   is_const=True)
+    ## windowed-filter.h (module 'internet'): ns3::DataRate ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::GetSecondBest() const [member function]
+    cls.add_method('GetSecondBest', 
+                   'ns3::DataRate', 
+                   [], 
+                   is_const=True)
+    ## windowed-filter.h (module 'internet'): ns3::DataRate ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::GetThirdBest() const [member function]
+    cls.add_method('GetThirdBest', 
+                   'ns3::DataRate', 
+                   [], 
+                   is_const=True)
+    ## windowed-filter.h (module 'internet'): void ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Reset(ns3::DataRate new_sample, unsigned int new_time) [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [param('ns3::DataRate', 'new_sample'), param('unsigned int', 'new_time')])
+    ## windowed-filter.h (module 'internet'): void ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::SetWindowLength(unsigned int windowLength) [member function]
+    cls.add_method('SetWindowLength', 
+                   'void', 
+                   [param('unsigned int', 'windowLength')])
+    ## windowed-filter.h (module 'internet'): void ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Update(ns3::DataRate new_sample, unsigned int new_time) [member function]
+    cls.add_method('Update', 
+                   'void', 
+                   [param('ns3::DataRate', 'new_sample'), param('unsigned int', 'new_time')])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::m_samples [variable]
+    cls.add_instance_attribute('m_samples', 'ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter< ns3::DataRate >, unsigned int, unsigned int > Sample [ 3 ]', is_const=False)
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::m_windowLength [variable]
+    cls.add_instance_attribute('m_windowLength', 'unsigned int', is_const=False)
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::m_zeroValue [variable]
+    cls.add_instance_attribute('m_zeroValue', 'ns3::DataRate', is_const=False)
+    return
+
+def register_Ns3WindowedFilter__lt___ns3DataRate__ns3MaxFilter__lt__ns3DataRate__gt____unsigned_int__unsigned_int___gt__Sample_methods(root_module, cls):
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample::Sample(ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter< ns3::DataRate >, unsigned int, unsigned int > Sample const &', 'arg0')])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample::Sample() [constructor]
+    cls.add_constructor([])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample::Sample(ns3::DataRate init_sample, unsigned int init_time) [constructor]
+    cls.add_constructor([param('ns3::DataRate', 'init_sample'), param('unsigned int', 'init_time')])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample::sample [variable]
+    cls.add_instance_attribute('sample', 'ns3::DataRate', is_const=False)
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample::time [variable]
+    cls.add_instance_attribute('time', 'unsigned int', is_const=False)
+    return
+
 def register_Ns3Empty_methods(root_module, cls):
     ## empty.h (module 'core'): ns3::empty::empty() [constructor]
     cls.add_constructor([])
@@ -7987,7 +8131,7 @@
     cls.add_method('GetFlags', 
                    'uint8_t', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## icmpv6-header.h (module 'internet'): ns3::TypeId ns3::Icmpv6RA::GetInstanceTypeId() const [member function]
     cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
@@ -8047,7 +8191,8 @@
     ## icmpv6-header.h (module 'internet'): void ns3::Icmpv6RA::SetFlags(uint8_t f) [member function]
     cls.add_method('SetFlags', 
                    'void', 
-                   [param('uint8_t', 'f')])
+                   [param('uint8_t', 'f')], 
+                   deprecated=True)
     ## icmpv6-header.h (module 'internet'): void ns3::Icmpv6RA::SetLifeTime(uint16_t l) [member function]
     cls.add_method('SetLifeTime', 
                    'void', 
@@ -8363,8 +8508,8 @@
 def register_Ns3Ipv4GlobalRoutingHelper_methods(root_module, cls):
     ## ipv4-global-routing-helper.h (module 'internet'): ns3::Ipv4GlobalRoutingHelper::Ipv4GlobalRoutingHelper() [constructor]
     cls.add_constructor([])
-    ## ipv4-global-routing-helper.h (module 'internet'): ns3::Ipv4GlobalRoutingHelper::Ipv4GlobalRoutingHelper(ns3::Ipv4GlobalRoutingHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4GlobalRoutingHelper const &', 'arg0')])
+    ## ipv4-global-routing-helper.h (module 'internet'): ns3::Ipv4GlobalRoutingHelper::Ipv4GlobalRoutingHelper(ns3::Ipv4GlobalRoutingHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv4GlobalRoutingHelper const &', 'o')])
     ## ipv4-global-routing-helper.h (module 'internet'): ns3::Ipv4GlobalRoutingHelper * ns3::Ipv4GlobalRoutingHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ipv4GlobalRoutingHelper *', 
@@ -8562,8 +8707,8 @@
 def register_Ns3Ipv4ListRoutingHelper_methods(root_module, cls):
     ## ipv4-list-routing-helper.h (module 'internet'): ns3::Ipv4ListRoutingHelper::Ipv4ListRoutingHelper() [constructor]
     cls.add_constructor([])
-    ## ipv4-list-routing-helper.h (module 'internet'): ns3::Ipv4ListRoutingHelper::Ipv4ListRoutingHelper(ns3::Ipv4ListRoutingHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4ListRoutingHelper const &', 'arg0')])
+    ## ipv4-list-routing-helper.h (module 'internet'): ns3::Ipv4ListRoutingHelper::Ipv4ListRoutingHelper(ns3::Ipv4ListRoutingHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv4ListRoutingHelper const &', 'o')])
     ## ipv4-list-routing-helper.h (module 'internet'): ns3::Ipv4ListRoutingHelper * ns3::Ipv4ListRoutingHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ipv4ListRoutingHelper *', 
@@ -8922,8 +9067,8 @@
 def register_Ns3Ipv6ListRoutingHelper_methods(root_module, cls):
     ## ipv6-list-routing-helper.h (module 'internet'): ns3::Ipv6ListRoutingHelper::Ipv6ListRoutingHelper() [constructor]
     cls.add_constructor([])
-    ## ipv6-list-routing-helper.h (module 'internet'): ns3::Ipv6ListRoutingHelper::Ipv6ListRoutingHelper(ns3::Ipv6ListRoutingHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv6ListRoutingHelper const &', 'arg0')])
+    ## ipv6-list-routing-helper.h (module 'internet'): ns3::Ipv6ListRoutingHelper::Ipv6ListRoutingHelper(ns3::Ipv6ListRoutingHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv6ListRoutingHelper const &', 'o')])
     ## ipv6-list-routing-helper.h (module 'internet'): ns3::Ipv6ListRoutingHelper * ns3::Ipv6ListRoutingHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ipv6ListRoutingHelper *', 
@@ -10275,10 +10420,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -12697,6 +12842,8 @@
     cls.add_instance_attribute('m_initialSsThresh', 'uint32_t', is_const=False)
     ## tcp-socket-state.h (module 'internet'): ns3::TcpSocketState::m_isRetransDataAcked [variable]
     cls.add_instance_attribute('m_isRetransDataAcked', 'bool', is_const=False)
+    ## tcp-socket-state.h (module 'internet'): ns3::TcpSocketState::m_lastAckedSackedBytes [variable]
+    cls.add_instance_attribute('m_lastAckedSackedBytes', 'uint32_t', is_const=False)
     ## tcp-socket-state.h (module 'internet'): ns3::TcpSocketState::m_lastAckedSeq [variable]
     cls.add_instance_attribute('m_lastAckedSeq', 'ns3::SequenceNumber32', is_const=False)
     ## tcp-socket-state.h (module 'internet'): ns3::TcpSocketState::m_lastRtt [variable]
@@ -16012,10 +16159,10 @@
     cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
     ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
     cls.add_constructor([])
-    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_pure_virtual=True, is_virtual=True)
     ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
@@ -17005,10 +17152,10 @@
                    'int32_t', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
                    is_const=True, is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
     cls.add_method('GetAddress', 
@@ -17139,6 +17286,10 @@
                    'bool', 
                    [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')], 
                    is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::ReachabilityHint(uint32_t ipInterfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('ReachabilityHint', 
+                   'bool', 
+                   [param('uint32_t', 'ipInterfaceIndex'), param('ns3::Ipv6Address', 'address')])
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -17886,6 +18037,11 @@
     cls.add_method('FunctionRetransmitTimeout', 
                    'void', 
                    [])
+    ## ndisc-cache.h (module 'internet'): ns3::Ipv6Address ns3::NdiscCache::Entry::GetIpv6Address() const [member function]
+    cls.add_method('GetIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ndisc-cache.h (module 'internet'): ns3::Time ns3::NdiscCache::Entry::GetLastReachabilityConfirmation() const [member function]
     cls.add_method('GetLastReachabilityConfirmation', 
                    'ns3::Time', 
@@ -18849,6 +19005,244 @@
                    is_virtual=True, visibility='protected')
     return
 
+def register_Ns3TcpBbr_methods(root_module, cls):
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr::TcpBbr() [constructor]
+    cls.add_constructor([])
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr::TcpBbr(ns3::TcpBbr const & sock) [constructor]
+    cls.add_constructor([param('ns3::TcpBbr const &', 'sock')])
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CongControl(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateConnection const & rc, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('CongControl', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateConnection const &', 'rc'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CongestionStateSet(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpSocketState::TcpCongState_t const newState) [member function]
+    cls.add_method('CongestionStateSet', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpSocketState::TcpCongState_t const', 'newState')], 
+                   is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CwndEvent(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpSocketState::TcpCAEvent_t const event) [member function]
+    cls.add_method('CwndEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpSocketState::TcpCAEvent_t const', 'event')], 
+                   is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): ns3::Ptr<ns3::TcpCongestionOps> ns3::TcpBbr::Fork() [member function]
+    cls.add_method('Fork', 
+                   'ns3::Ptr< ns3::TcpCongestionOps >', 
+                   [], 
+                   is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): std::string ns3::TcpBbr::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): uint32_t ns3::TcpBbr::GetSsThresh(ns3::Ptr<const ns3::TcpSocketState> tcb, uint32_t bytesInFlight) [member function]
+    cls.add_method('GetSsThresh', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::TcpSocketState const >', 'tcb'), param('uint32_t', 'bytesInFlight')], 
+                   is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): static ns3::TypeId ns3::TcpBbr::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## tcp-bbr.h (module 'internet'): bool ns3::TcpBbr::HasCongControl() const [member function]
+    cls.add_method('HasCongControl', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::SetStream(uint32_t stream) [member function]
+    cls.add_method('SetStream', 
+                   'void', 
+                   [param('uint32_t', 'stream')], 
+                   is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr::BbrModeName [variable]
+    cls.add_static_attribute('BbrModeName', 'char const * [ 4 ] const', is_const=True)
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr::GAIN_CYCLE_LENGTH [variable]
+    cls.add_static_attribute('GAIN_CYCLE_LENGTH', 'uint8_t const', is_const=True)
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr::PACING_GAIN_CYCLE [variable]
+    cls.add_static_attribute('PACING_GAIN_CYCLE', 'double [ 0 ] const', is_const=True)
+    ## tcp-bbr.h (module 'internet'): uint32_t ns3::TcpBbr::AckAggregationCwnd() [member function]
+    cls.add_method('AckAggregationCwnd', 
+                   'uint32_t', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::AdvanceCyclePhase() [member function]
+    cls.add_method('AdvanceCyclePhase', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CheckCyclePhase(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('CheckCyclePhase', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CheckDrain(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('CheckDrain', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CheckFullPipe(ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('CheckFullPipe', 
+                   'void', 
+                   [param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CheckProbeRTT(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('CheckProbeRTT', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::EnterDrain() [member function]
+    cls.add_method('EnterDrain', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::EnterProbeBW() [member function]
+    cls.add_method('EnterProbeBW', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::EnterProbeRTT() [member function]
+    cls.add_method('EnterProbeRTT', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::EnterStartup() [member function]
+    cls.add_method('EnterStartup', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::ExitProbeRTT() [member function]
+    cls.add_method('ExitProbeRTT', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): uint32_t ns3::TcpBbr::GetBbrState() [member function]
+    cls.add_method('GetBbrState', 
+                   'uint32_t', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): double ns3::TcpBbr::GetCwndGain() [member function]
+    cls.add_method('GetCwndGain', 
+                   'double', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): double ns3::TcpBbr::GetPacingGain() [member function]
+    cls.add_method('GetPacingGain', 
+                   'double', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::HandleProbeRTT(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('HandleProbeRTT', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::HandleRestartFromIdle(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('HandleRestartFromIdle', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): uint32_t ns3::TcpBbr::InFlight(ns3::Ptr<ns3::TcpSocketState> tcb, double gain) [member function]
+    cls.add_method('InFlight', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('double', 'gain')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::InitFullPipe() [member function]
+    cls.add_method('InitFullPipe', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::InitPacingRate(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('InitPacingRate', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::InitRoundCounting() [member function]
+    cls.add_method('InitRoundCounting', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): bool ns3::TcpBbr::IsNextCyclePhase(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('IsNextCyclePhase', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::ModulateCwndForProbeRTT(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('ModulateCwndForProbeRTT', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): bool ns3::TcpBbr::ModulateCwndForRecovery(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('ModulateCwndForRecovery', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::RestoreCwnd(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('RestoreCwnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::SaveCwnd(ns3::Ptr<const ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('SaveCwnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState const >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::SetBbrState(ns3::TcpBbr::BbrMode_t state) [member function]
+    cls.add_method('SetBbrState', 
+                   'void', 
+                   [param('ns3::TcpBbr::BbrMode_t', 'state')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::SetCwnd(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('SetCwnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::SetPacingRate(ns3::Ptr<ns3::TcpSocketState> tcb, double gain) [member function]
+    cls.add_method('SetPacingRate', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('double', 'gain')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::SetSendQuantum(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('SetSendQuantum', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateAckAggregation(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('UpdateAckAggregation', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateBtlBw(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('UpdateBtlBw', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateControlParameters(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('UpdateControlParameters', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateModelAndState(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('UpdateModelAndState', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateRTprop(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('UpdateRTprop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateRound(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('UpdateRound', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateTargetCwnd(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('UpdateTargetCwnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    return
+
 def register_Ns3TcpBic_methods(root_module, cls):
     ## tcp-bic.h (module 'internet'): ns3::TcpBic::TcpBic() [constructor]
     cls.add_constructor([])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/bindings/modulegen__gcc_LP64.py ns-3.34/src/internet/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/internet/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -147,6 +147,8 @@
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv4-address-generator.h (module 'internet'): ns3::Ipv4AddressGenerator [class]
     module.add_class('Ipv4AddressGenerator')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper [class]
     module.add_class('Ipv4AddressHelper')
     ## ipv4-end-point.h (module 'internet'): ns3::Ipv4EndPoint [class]
@@ -184,6 +186,8 @@
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## ipv6-address-generator.h (module 'internet'): ns3::Ipv6AddressGenerator [class]
     module.add_class('Ipv6AddressGenerator')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper [class]
     module.add_class('Ipv6AddressHelper')
     ## ipv6-end-point.h (module 'internet'): ns3::Ipv6EndPoint [class]
@@ -274,7 +278,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -370,6 +374,10 @@
     typehandlers.add_type_alias('uint32_t', 'ns3::TypeId::hash_t')
     typehandlers.add_type_alias('uint32_t*', 'ns3::TypeId::hash_t*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::TypeId::hash_t&')
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int> [class]
+    module.add_class('WindowedFilter', template_parameters=['ns3::DataRate', 'ns3::MaxFilter<ns3::DataRate>', 'unsigned int', 'unsigned int'])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample [struct]
+    module.add_class('Sample', outer_class=root_module['ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int >'])
     ## empty.h (module 'core'): ns3::empty [class]
     module.add_class('empty', import_from_module='ns.core')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t [class]
@@ -418,6 +426,11 @@
     module.add_class('Icmpv6OptionMtu', parent=root_module['ns3::Icmpv6OptionHeader'])
     ## icmpv6-header.h (module 'internet'): ns3::Icmpv6OptionPrefixInformation [class]
     module.add_class('Icmpv6OptionPrefixInformation', parent=root_module['ns3::Icmpv6OptionHeader'])
+    ## icmpv6-header.h (module 'internet'): ns3::Icmpv6OptionPrefixInformation::Flags_t [enumeration]
+    module.add_enum('Flags_t', ['NONE', 'ROUTERADDR', 'AUTADDRCONF', 'ONLINK'], outer_class=root_module['ns3::Icmpv6OptionPrefixInformation'])
+    typehandlers.add_type_alias('ns3::Icmpv6OptionPrefixInformation::Flags_t', 'ns3::Icmpv6OptionPrefixInformation::Flags_t')
+    typehandlers.add_type_alias('ns3::Icmpv6OptionPrefixInformation::Flags_t*', 'ns3::Icmpv6OptionPrefixInformation::Flags_t*')
+    typehandlers.add_type_alias('ns3::Icmpv6OptionPrefixInformation::Flags_t&', 'ns3::Icmpv6OptionPrefixInformation::Flags_t&')
     ## icmpv6-header.h (module 'internet'): ns3::Icmpv6OptionRedirected [class]
     module.add_class('Icmpv6OptionRedirected', parent=root_module['ns3::Icmpv6OptionHeader'])
     ## icmpv6-header.h (module 'internet'): ns3::Icmpv6ParameterError [class]
@@ -1001,6 +1014,16 @@
     module.add_class('RipNg', parent=root_module['ns3::Ipv6RoutingProtocol'])
     ## ripng.h (module 'internet'): ns3::RipNg::SplitHorizonType_e [enumeration]
     module.add_enum('SplitHorizonType_e', ['NO_SPLIT_HORIZON', 'SPLIT_HORIZON', 'POISON_REVERSE'], outer_class=root_module['ns3::RipNg'])
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr [class]
+    module.add_class('TcpBbr', parent=root_module['ns3::TcpCongestionOps'])
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr::BbrMode_t [enumeration]
+    module.add_enum('BbrMode_t', ['BBR_STARTUP', 'BBR_DRAIN', 'BBR_PROBE_BW', 'BBR_PROBE_RTT'], outer_class=root_module['ns3::TcpBbr'])
+    typehandlers.add_type_alias('ns3::TcpBbr::BbrMode_t', 'ns3::TcpBbr::BbrMode_t')
+    typehandlers.add_type_alias('ns3::TcpBbr::BbrMode_t*', 'ns3::TcpBbr::BbrMode_t*')
+    typehandlers.add_type_alias('ns3::TcpBbr::BbrMode_t&', 'ns3::TcpBbr::BbrMode_t&')
+    typehandlers.add_type_alias('ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter< ns3::DataRate >, unsigned int, unsigned int >', 'ns3::TcpBbr::MaxBandwidthFilter_t')
+    typehandlers.add_type_alias('ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter< ns3::DataRate >, unsigned int, unsigned int >*', 'ns3::TcpBbr::MaxBandwidthFilter_t*')
+    typehandlers.add_type_alias('ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter< ns3::DataRate >, unsigned int, unsigned int >&', 'ns3::TcpBbr::MaxBandwidthFilter_t&')
     ## tcp-bic.h (module 'internet'): ns3::TcpBic [class]
     module.add_class('TcpBic', parent=root_module['ns3::TcpCongestionOps'])
     ## tcp-recovery-ops.h (module 'internet'): ns3::TcpClassicRecovery [class]
@@ -1361,6 +1384,7 @@
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
     register_Ns3Ipv4AddressGenerator_methods(root_module, root_module['ns3::Ipv4AddressGenerator'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4AddressHelper_methods(root_module, root_module['ns3::Ipv4AddressHelper'])
     register_Ns3Ipv4EndPoint_methods(root_module, root_module['ns3::Ipv4EndPoint'])
     register_Ns3Ipv4EndPointDemux_methods(root_module, root_module['ns3::Ipv4EndPointDemux'])
@@ -1373,6 +1397,7 @@
     register_Ns3Ipv4StaticRoutingHelper_methods(root_module, root_module['ns3::Ipv4StaticRoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
     register_Ns3Ipv6AddressGenerator_methods(root_module, root_module['ns3::Ipv6AddressGenerator'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6AddressHelper_methods(root_module, root_module['ns3::Ipv6AddressHelper'])
     register_Ns3Ipv6EndPoint_methods(root_module, root_module['ns3::Ipv6EndPoint'])
     register_Ns3Ipv6EndPointDemux_methods(root_module, root_module['ns3::Ipv6EndPointDemux'])
@@ -1433,6 +1458,8 @@
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
+    register_Ns3WindowedFilter__Ns3DataRate_Ns3MaxFilter__lt__ns3DataRate__gt___Unsigned_int_Unsigned_int_methods(root_module, root_module['ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int >'])
+    register_Ns3WindowedFilter__lt___ns3DataRate__ns3MaxFilter__lt__ns3DataRate__gt____unsigned_int__unsigned_int___gt__Sample_methods(root_module, root_module['ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int >::Sample'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
@@ -1645,6 +1672,7 @@
     register_Ns3QueueItem_methods(root_module, root_module['ns3::QueueItem'])
     register_Ns3Rip_methods(root_module, root_module['ns3::Rip'])
     register_Ns3RipNg_methods(root_module, root_module['ns3::RipNg'])
+    register_Ns3TcpBbr_methods(root_module, root_module['ns3::TcpBbr'])
     register_Ns3TcpBic_methods(root_module, root_module['ns3::TcpBic'])
     register_Ns3TcpClassicRecovery_methods(root_module, root_module['ns3::TcpClassicRecovery'])
     register_Ns3TcpDctcp_methods(root_module, root_module['ns3::TcpDctcp'])
@@ -2495,6 +2523,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2760,10 +2796,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## global-route-manager-impl.h (module 'internet'): void ns3::GlobalRouteManagerImpl::DebugUseLsdb(ns3::GlobalRouteManagerLSDB * arg0) [member function]
+    ## global-route-manager-impl.h (module 'internet'): void ns3::GlobalRouteManagerImpl::DebugUseLsdb(ns3::GlobalRouteManagerLSDB * lsdb) [member function]
     cls.add_method('DebugUseLsdb', 
                    'void', 
-                   [param('ns3::GlobalRouteManagerLSDB *', 'arg0')])
+                   [param('ns3::GlobalRouteManagerLSDB *', 'lsdb')])
     ## global-route-manager-impl.h (module 'internet'): void ns3::GlobalRouteManagerImpl::DebugSPFCalculate(ns3::Ipv4Address root) [member function]
     cls.add_method('DebugSPFCalculate', 
                    'void', 
@@ -3316,6 +3352,18 @@
                    is_static=True)
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4AddressHelper_methods(root_module, cls):
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper::Ipv4AddressHelper(ns3::Ipv4AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv4AddressHelper const &', 'arg0')])
@@ -3822,8 +3870,8 @@
 def register_Ns3Ipv4StaticRoutingHelper_methods(root_module, cls):
     ## ipv4-static-routing-helper.h (module 'internet'): ns3::Ipv4StaticRoutingHelper::Ipv4StaticRoutingHelper() [constructor]
     cls.add_constructor([])
-    ## ipv4-static-routing-helper.h (module 'internet'): ns3::Ipv4StaticRoutingHelper::Ipv4StaticRoutingHelper(ns3::Ipv4StaticRoutingHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4StaticRoutingHelper const &', 'arg0')])
+    ## ipv4-static-routing-helper.h (module 'internet'): ns3::Ipv4StaticRoutingHelper::Ipv4StaticRoutingHelper(ns3::Ipv4StaticRoutingHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv4StaticRoutingHelper const &', 'o')])
     ## ipv4-static-routing-helper.h (module 'internet'): ns3::Ipv4StaticRoutingHelper * ns3::Ipv4StaticRoutingHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ipv4StaticRoutingHelper *', 
@@ -4023,6 +4071,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -4160,6 +4213,18 @@
                    is_static=True)
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6AddressHelper_methods(root_module, cls):
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper::Ipv6AddressHelper(ns3::Ipv6AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv6AddressHelper const &', 'arg0')])
@@ -4175,10 +4240,18 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    cls.add_method('Assign', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutAddress(ns3::NetDeviceContainer const & c) [member function]
     cls.add_method('AssignWithoutAddress', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutOnLink(ns3::NetDeviceContainer const & c) [member function]
+    cls.add_method('AssignWithoutOnLink', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6AddressHelper::NewAddress(ns3::Address addr) [member function]
     cls.add_method('NewAddress', 
                    'ns3::Ipv6Address', 
@@ -4330,6 +4403,8 @@
     cls.add_constructor([param('ns3::Ipv6Address', 'address')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
@@ -4342,6 +4417,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
     cls.add_method('GetPrefix', 
                    'ns3::Ipv6Prefix', 
@@ -4370,6 +4450,10 @@
     cls.add_method('SetNsDadUid', 
                    'void', 
                    [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
     cls.add_method('SetScope', 
                    'void', 
@@ -4517,6 +4601,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4722,8 +4811,8 @@
 def register_Ns3Ipv6StaticRoutingHelper_methods(root_module, cls):
     ## ipv6-static-routing-helper.h (module 'internet'): ns3::Ipv6StaticRoutingHelper::Ipv6StaticRoutingHelper() [constructor]
     cls.add_constructor([])
-    ## ipv6-static-routing-helper.h (module 'internet'): ns3::Ipv6StaticRoutingHelper::Ipv6StaticRoutingHelper(ns3::Ipv6StaticRoutingHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv6StaticRoutingHelper const &', 'arg0')])
+    ## ipv6-static-routing-helper.h (module 'internet'): ns3::Ipv6StaticRoutingHelper::Ipv6StaticRoutingHelper(ns3::Ipv6StaticRoutingHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv6StaticRoutingHelper const &', 'o')])
     ## ipv6-static-routing-helper.h (module 'internet'): ns3::Ipv6StaticRoutingHelper * ns3::Ipv6StaticRoutingHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ipv6StaticRoutingHelper *', 
@@ -6998,6 +7087,61 @@
     cls.add_instance_attribute('supportMsg', 'std::string', is_const=False)
     return
 
+def register_Ns3WindowedFilter__Ns3DataRate_Ns3MaxFilter__lt__ns3DataRate__gt___Unsigned_int_Unsigned_int_methods(root_module, cls):
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::WindowedFilter(ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter< ns3::DataRate >, unsigned int, unsigned int > const &', 'arg0')])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::WindowedFilter() [constructor]
+    cls.add_constructor([])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::WindowedFilter(unsigned int windowLength, ns3::DataRate zeroValue, unsigned int zeroTime) [constructor]
+    cls.add_constructor([param('unsigned int', 'windowLength'), param('ns3::DataRate', 'zeroValue'), param('unsigned int', 'zeroTime')])
+    ## windowed-filter.h (module 'internet'): ns3::DataRate ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::GetBest() const [member function]
+    cls.add_method('GetBest', 
+                   'ns3::DataRate', 
+                   [], 
+                   is_const=True)
+    ## windowed-filter.h (module 'internet'): ns3::DataRate ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::GetSecondBest() const [member function]
+    cls.add_method('GetSecondBest', 
+                   'ns3::DataRate', 
+                   [], 
+                   is_const=True)
+    ## windowed-filter.h (module 'internet'): ns3::DataRate ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::GetThirdBest() const [member function]
+    cls.add_method('GetThirdBest', 
+                   'ns3::DataRate', 
+                   [], 
+                   is_const=True)
+    ## windowed-filter.h (module 'internet'): void ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Reset(ns3::DataRate new_sample, unsigned int new_time) [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [param('ns3::DataRate', 'new_sample'), param('unsigned int', 'new_time')])
+    ## windowed-filter.h (module 'internet'): void ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::SetWindowLength(unsigned int windowLength) [member function]
+    cls.add_method('SetWindowLength', 
+                   'void', 
+                   [param('unsigned int', 'windowLength')])
+    ## windowed-filter.h (module 'internet'): void ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Update(ns3::DataRate new_sample, unsigned int new_time) [member function]
+    cls.add_method('Update', 
+                   'void', 
+                   [param('ns3::DataRate', 'new_sample'), param('unsigned int', 'new_time')])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::m_samples [variable]
+    cls.add_instance_attribute('m_samples', 'ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter< ns3::DataRate >, unsigned int, unsigned int > Sample [ 3 ]', is_const=False)
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::m_windowLength [variable]
+    cls.add_instance_attribute('m_windowLength', 'unsigned int', is_const=False)
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::m_zeroValue [variable]
+    cls.add_instance_attribute('m_zeroValue', 'ns3::DataRate', is_const=False)
+    return
+
+def register_Ns3WindowedFilter__lt___ns3DataRate__ns3MaxFilter__lt__ns3DataRate__gt____unsigned_int__unsigned_int___gt__Sample_methods(root_module, cls):
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample::Sample(ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WindowedFilter< ns3::DataRate, ns3::MaxFilter< ns3::DataRate >, unsigned int, unsigned int > Sample const &', 'arg0')])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample::Sample() [constructor]
+    cls.add_constructor([])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample::Sample(ns3::DataRate init_sample, unsigned int init_time) [constructor]
+    cls.add_constructor([param('ns3::DataRate', 'init_sample'), param('unsigned int', 'init_time')])
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample::sample [variable]
+    cls.add_instance_attribute('sample', 'ns3::DataRate', is_const=False)
+    ## windowed-filter.h (module 'internet'): ns3::WindowedFilter<ns3::DataRate, ns3::MaxFilter<ns3::DataRate>, unsigned int, unsigned int>::Sample::time [variable]
+    cls.add_instance_attribute('time', 'unsigned int', is_const=False)
+    return
+
 def register_Ns3Empty_methods(root_module, cls):
     ## empty.h (module 'core'): ns3::empty::empty() [constructor]
     cls.add_constructor([])
@@ -7987,7 +8131,7 @@
     cls.add_method('GetFlags', 
                    'uint8_t', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## icmpv6-header.h (module 'internet'): ns3::TypeId ns3::Icmpv6RA::GetInstanceTypeId() const [member function]
     cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
@@ -8047,7 +8191,8 @@
     ## icmpv6-header.h (module 'internet'): void ns3::Icmpv6RA::SetFlags(uint8_t f) [member function]
     cls.add_method('SetFlags', 
                    'void', 
-                   [param('uint8_t', 'f')])
+                   [param('uint8_t', 'f')], 
+                   deprecated=True)
     ## icmpv6-header.h (module 'internet'): void ns3::Icmpv6RA::SetLifeTime(uint16_t l) [member function]
     cls.add_method('SetLifeTime', 
                    'void', 
@@ -8363,8 +8508,8 @@
 def register_Ns3Ipv4GlobalRoutingHelper_methods(root_module, cls):
     ## ipv4-global-routing-helper.h (module 'internet'): ns3::Ipv4GlobalRoutingHelper::Ipv4GlobalRoutingHelper() [constructor]
     cls.add_constructor([])
-    ## ipv4-global-routing-helper.h (module 'internet'): ns3::Ipv4GlobalRoutingHelper::Ipv4GlobalRoutingHelper(ns3::Ipv4GlobalRoutingHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4GlobalRoutingHelper const &', 'arg0')])
+    ## ipv4-global-routing-helper.h (module 'internet'): ns3::Ipv4GlobalRoutingHelper::Ipv4GlobalRoutingHelper(ns3::Ipv4GlobalRoutingHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv4GlobalRoutingHelper const &', 'o')])
     ## ipv4-global-routing-helper.h (module 'internet'): ns3::Ipv4GlobalRoutingHelper * ns3::Ipv4GlobalRoutingHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ipv4GlobalRoutingHelper *', 
@@ -8562,8 +8707,8 @@
 def register_Ns3Ipv4ListRoutingHelper_methods(root_module, cls):
     ## ipv4-list-routing-helper.h (module 'internet'): ns3::Ipv4ListRoutingHelper::Ipv4ListRoutingHelper() [constructor]
     cls.add_constructor([])
-    ## ipv4-list-routing-helper.h (module 'internet'): ns3::Ipv4ListRoutingHelper::Ipv4ListRoutingHelper(ns3::Ipv4ListRoutingHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4ListRoutingHelper const &', 'arg0')])
+    ## ipv4-list-routing-helper.h (module 'internet'): ns3::Ipv4ListRoutingHelper::Ipv4ListRoutingHelper(ns3::Ipv4ListRoutingHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv4ListRoutingHelper const &', 'o')])
     ## ipv4-list-routing-helper.h (module 'internet'): ns3::Ipv4ListRoutingHelper * ns3::Ipv4ListRoutingHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ipv4ListRoutingHelper *', 
@@ -8922,8 +9067,8 @@
 def register_Ns3Ipv6ListRoutingHelper_methods(root_module, cls):
     ## ipv6-list-routing-helper.h (module 'internet'): ns3::Ipv6ListRoutingHelper::Ipv6ListRoutingHelper() [constructor]
     cls.add_constructor([])
-    ## ipv6-list-routing-helper.h (module 'internet'): ns3::Ipv6ListRoutingHelper::Ipv6ListRoutingHelper(ns3::Ipv6ListRoutingHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv6ListRoutingHelper const &', 'arg0')])
+    ## ipv6-list-routing-helper.h (module 'internet'): ns3::Ipv6ListRoutingHelper::Ipv6ListRoutingHelper(ns3::Ipv6ListRoutingHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv6ListRoutingHelper const &', 'o')])
     ## ipv6-list-routing-helper.h (module 'internet'): ns3::Ipv6ListRoutingHelper * ns3::Ipv6ListRoutingHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ipv6ListRoutingHelper *', 
@@ -10275,10 +10420,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -12697,6 +12842,8 @@
     cls.add_instance_attribute('m_initialSsThresh', 'uint32_t', is_const=False)
     ## tcp-socket-state.h (module 'internet'): ns3::TcpSocketState::m_isRetransDataAcked [variable]
     cls.add_instance_attribute('m_isRetransDataAcked', 'bool', is_const=False)
+    ## tcp-socket-state.h (module 'internet'): ns3::TcpSocketState::m_lastAckedSackedBytes [variable]
+    cls.add_instance_attribute('m_lastAckedSackedBytes', 'uint32_t', is_const=False)
     ## tcp-socket-state.h (module 'internet'): ns3::TcpSocketState::m_lastAckedSeq [variable]
     cls.add_instance_attribute('m_lastAckedSeq', 'ns3::SequenceNumber32', is_const=False)
     ## tcp-socket-state.h (module 'internet'): ns3::TcpSocketState::m_lastRtt [variable]
@@ -16012,10 +16159,10 @@
     cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
     ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
     cls.add_constructor([])
-    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_pure_virtual=True, is_virtual=True)
     ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
@@ -17005,10 +17152,10 @@
                    'int32_t', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
                    is_const=True, is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
     cls.add_method('GetAddress', 
@@ -17139,6 +17286,10 @@
                    'bool', 
                    [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')], 
                    is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::ReachabilityHint(uint32_t ipInterfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('ReachabilityHint', 
+                   'bool', 
+                   [param('uint32_t', 'ipInterfaceIndex'), param('ns3::Ipv6Address', 'address')])
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -17886,6 +18037,11 @@
     cls.add_method('FunctionRetransmitTimeout', 
                    'void', 
                    [])
+    ## ndisc-cache.h (module 'internet'): ns3::Ipv6Address ns3::NdiscCache::Entry::GetIpv6Address() const [member function]
+    cls.add_method('GetIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ndisc-cache.h (module 'internet'): ns3::Time ns3::NdiscCache::Entry::GetLastReachabilityConfirmation() const [member function]
     cls.add_method('GetLastReachabilityConfirmation', 
                    'ns3::Time', 
@@ -18849,6 +19005,244 @@
                    is_virtual=True, visibility='protected')
     return
 
+def register_Ns3TcpBbr_methods(root_module, cls):
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr::TcpBbr() [constructor]
+    cls.add_constructor([])
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr::TcpBbr(ns3::TcpBbr const & sock) [constructor]
+    cls.add_constructor([param('ns3::TcpBbr const &', 'sock')])
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CongControl(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateConnection const & rc, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('CongControl', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateConnection const &', 'rc'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CongestionStateSet(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpSocketState::TcpCongState_t const newState) [member function]
+    cls.add_method('CongestionStateSet', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpSocketState::TcpCongState_t const', 'newState')], 
+                   is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CwndEvent(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpSocketState::TcpCAEvent_t const event) [member function]
+    cls.add_method('CwndEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpSocketState::TcpCAEvent_t const', 'event')], 
+                   is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): ns3::Ptr<ns3::TcpCongestionOps> ns3::TcpBbr::Fork() [member function]
+    cls.add_method('Fork', 
+                   'ns3::Ptr< ns3::TcpCongestionOps >', 
+                   [], 
+                   is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): std::string ns3::TcpBbr::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): uint32_t ns3::TcpBbr::GetSsThresh(ns3::Ptr<const ns3::TcpSocketState> tcb, uint32_t bytesInFlight) [member function]
+    cls.add_method('GetSsThresh', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::TcpSocketState const >', 'tcb'), param('uint32_t', 'bytesInFlight')], 
+                   is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): static ns3::TypeId ns3::TcpBbr::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## tcp-bbr.h (module 'internet'): bool ns3::TcpBbr::HasCongControl() const [member function]
+    cls.add_method('HasCongControl', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::SetStream(uint32_t stream) [member function]
+    cls.add_method('SetStream', 
+                   'void', 
+                   [param('uint32_t', 'stream')], 
+                   is_virtual=True)
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr::BbrModeName [variable]
+    cls.add_static_attribute('BbrModeName', 'char const * [ 4 ] const', is_const=True)
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr::GAIN_CYCLE_LENGTH [variable]
+    cls.add_static_attribute('GAIN_CYCLE_LENGTH', 'uint8_t const', is_const=True)
+    ## tcp-bbr.h (module 'internet'): ns3::TcpBbr::PACING_GAIN_CYCLE [variable]
+    cls.add_static_attribute('PACING_GAIN_CYCLE', 'double [ 0 ] const', is_const=True)
+    ## tcp-bbr.h (module 'internet'): uint32_t ns3::TcpBbr::AckAggregationCwnd() [member function]
+    cls.add_method('AckAggregationCwnd', 
+                   'uint32_t', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::AdvanceCyclePhase() [member function]
+    cls.add_method('AdvanceCyclePhase', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CheckCyclePhase(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('CheckCyclePhase', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CheckDrain(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('CheckDrain', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CheckFullPipe(ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('CheckFullPipe', 
+                   'void', 
+                   [param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::CheckProbeRTT(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('CheckProbeRTT', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::EnterDrain() [member function]
+    cls.add_method('EnterDrain', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::EnterProbeBW() [member function]
+    cls.add_method('EnterProbeBW', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::EnterProbeRTT() [member function]
+    cls.add_method('EnterProbeRTT', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::EnterStartup() [member function]
+    cls.add_method('EnterStartup', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::ExitProbeRTT() [member function]
+    cls.add_method('ExitProbeRTT', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): uint32_t ns3::TcpBbr::GetBbrState() [member function]
+    cls.add_method('GetBbrState', 
+                   'uint32_t', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): double ns3::TcpBbr::GetCwndGain() [member function]
+    cls.add_method('GetCwndGain', 
+                   'double', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): double ns3::TcpBbr::GetPacingGain() [member function]
+    cls.add_method('GetPacingGain', 
+                   'double', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::HandleProbeRTT(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('HandleProbeRTT', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::HandleRestartFromIdle(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('HandleRestartFromIdle', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): uint32_t ns3::TcpBbr::InFlight(ns3::Ptr<ns3::TcpSocketState> tcb, double gain) [member function]
+    cls.add_method('InFlight', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('double', 'gain')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::InitFullPipe() [member function]
+    cls.add_method('InitFullPipe', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::InitPacingRate(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('InitPacingRate', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::InitRoundCounting() [member function]
+    cls.add_method('InitRoundCounting', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): bool ns3::TcpBbr::IsNextCyclePhase(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('IsNextCyclePhase', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::ModulateCwndForProbeRTT(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('ModulateCwndForProbeRTT', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): bool ns3::TcpBbr::ModulateCwndForRecovery(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('ModulateCwndForRecovery', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::RestoreCwnd(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('RestoreCwnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::SaveCwnd(ns3::Ptr<const ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('SaveCwnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState const >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::SetBbrState(ns3::TcpBbr::BbrMode_t state) [member function]
+    cls.add_method('SetBbrState', 
+                   'void', 
+                   [param('ns3::TcpBbr::BbrMode_t', 'state')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::SetCwnd(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('SetCwnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::SetPacingRate(ns3::Ptr<ns3::TcpSocketState> tcb, double gain) [member function]
+    cls.add_method('SetPacingRate', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('double', 'gain')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::SetSendQuantum(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('SetSendQuantum', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateAckAggregation(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('UpdateAckAggregation', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateBtlBw(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('UpdateBtlBw', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateControlParameters(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('UpdateControlParameters', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateModelAndState(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('UpdateModelAndState', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateRTprop(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('UpdateRTprop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateRound(ns3::Ptr<ns3::TcpSocketState> tcb, ns3::TcpRateOps::TcpRateSample const & rs) [member function]
+    cls.add_method('UpdateRound', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb'), param('ns3::TcpRateOps::TcpRateSample const &', 'rs')], 
+                   visibility='protected')
+    ## tcp-bbr.h (module 'internet'): void ns3::TcpBbr::UpdateTargetCwnd(ns3::Ptr<ns3::TcpSocketState> tcb) [member function]
+    cls.add_method('UpdateTargetCwnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TcpSocketState >', 'tcb')], 
+                   visibility='protected')
+    return
+
 def register_Ns3TcpBic_methods(root_module, cls):
     ## tcp-bic.h (module 'internet'): ns3::TcpBic::TcpBic() [constructor]
     cls.add_constructor([])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/doc/ipv6.rst ns-3.34/src/internet/doc/ipv6.rst
--- ns-3.33/src/internet/doc/ipv6.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/doc/ipv6.rst	2021-07-14 10:31:06.000000000 -0700
@@ -185,7 +185,7 @@
 
 
 Auto-generated IPv6 addresses
-#############################
++++++++++++++++++++++++++++++
 
 This is accomplished by relying on the RADVD protocol, implemented by the class
 :cpp:class:`Radvd`. A helper class is available, which can be used to ease the most
@@ -205,6 +205,17 @@
 Examples of RADVD use are shown in ``examples/ipv6/radvd.cc`` 
 and ``examples/ipv6/radvd-two-prefix.cc``.
 
+Note that the router (i.e., the node with :cpp:class:`Radvd`) will have to have a global address,
+while the nodes using the auto-generated addresses (SLAAC) will have to have a link-local address.
+This is accomplished using :cpp:class:`Ipv6AddressHelper::AssignWithoutAddress`, e.g.:
+
+::
+
+    Ipv6AddressHelper ipv6;
+    NetDeviceContainer tmp;
+    tmp.Add (d1.Get (0)); /* n0 */
+    Ipv6InterfaceContainer iic1 = ipv6.AssignWithoutAddress (tmp); /* n0 interface */
+
 
 Random-generated IPv6 addresses
 ###############################
@@ -213,8 +224,23 @@
 does NOT have this capability. This feature haven't been so far considered as interesting
 for simulation.
 
+
+Networks with and without the onlink property
++++++++++++++++++++++++++++++++++++++++++++++
+
+IPv6 adds the concept of "on-link" for addresses and prefixes. Simplifying the concept, a
+network with the on-link property behaves roughly as IPv4: a node will assume that any address
+belonging to the on-link prefix is reachable on the link, so it uses Neighbor Discovery Protocol (NDP)
+to find the MAC address corresponding to the IPv6 address.
+If the prefix is not marked as "on-link", then any packet is sent to the default router.
+
+:cpp:class:`Radvd` can announce prefixes that have the on-link flag not set. Moreover, it is possible
+to add an address to a node without setting the on-link property for the prefix used in the address.
+The function to use is :cpp:class:`Ipv6AddressHelper::AssignWithoutOnLink`.
+
+
 Duplicate Address Detection (DAD)
-#################################
++++++++++++++++++++++++++++++++++
 
 Nodes will perform DAD (it can be disabled using an :cpp:class:`Icmpv6L4Protocol` attribute).
 Upon receiving a DAD, however, nodes will not react to it. As is: DAD reaction is 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/doc/routing-overview.rst ns-3.34/src/internet/doc/routing-overview.rst
--- ns-3.33/src/internet/doc/routing-overview.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/doc/routing-overview.rst	2021-07-14 10:31:06.000000000 -0700
@@ -358,10 +358,10 @@
 router invalidates a route, it will immediately propagate the route 
 unreachability, thus preventing most of the issues described in the RFC.
 
-However, with complex toplogies, it is still possible to have route 
+However, with complex topologies, it is still possible to have route 
 instability phenomena similar to the one described in the RFC after a 
 link failure. As a consequence, all the considerations about Split Horizon
-remanins valid.
+remains valid.
 
 
 Default routes
@@ -390,7 +390,7 @@
 and :rfc:`1058` for a complete discussion on the split horizoning strategies.
 
 Moreover, it is possible to use a non-standard value for Link Down Value (i.e.,
-the value after which a link is considered down). The defaul is value is 16. 
+the value after which a link is considered down). The default is value is 16. 
 
 Limitations
 ~~~~~~~~~~~
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/doc/tcp.rst ns-3.34/src/internet/doc/tcp.rst
--- ns-3.33/src/internet/doc/tcp.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/doc/tcp.rst	2021-07-14 10:31:06.000000000 -0700
@@ -48,13 +48,14 @@
 
 In brief, the native |ns3| TCP model supports a full bidirectional TCP with
 connection setup and close logic. Several congestion control algorithms
-are supported, with NewReno the default, and CUBIC, Westwood, Hybla, HighSpeed,
+are supported, with CUBIC the default, and NewReno, Westwood, Hybla, HighSpeed,
 Vegas, Scalable, Veno, Binary Increase Congestion Control (BIC), Yet Another
 HighSpeed TCP (YeAH), Illinois, H-TCP, Low Extra Delay Background Transport
-(LEDBAT), TCP Low Priority (TCP-LP) and and Data Center TCP (DCTCP) also supported. The model also supports
-Selective Acknowledgements (SACK), Proportional Rate Reduction (PRR) and
-Explicit Congestion Notification (ECN). Multipath-TCP is not yet supported in
-the |ns3| releases.
+(LEDBAT), TCP Low Priority (TCP-LP), Data Center TCP (DCTCP) and Bottleneck
+Bandwidth and RTT (BBR) also supported. The model also supports Selective
+Acknowledgements (SACK), Proportional Rate Reduction (PRR) and Explicit
+Congestion Notification (ECN). Multipath-TCP is not yet supported in the |ns3|
+releases.
 
 Model history
 +++++++++++++
@@ -89,6 +90,9 @@
 Proportional Rate Reduction (PRR) from the classic ack-clocked Fast
 Recovery algorithm.
 
+In the ns-3.34 release, the default congestion control algorithm was set
+to CUBIC from NewReno.
+
 Acknowledgments
 +++++++++++++++
 
@@ -1037,6 +1041,85 @@
 More information about DCTCP is available in the RFC 8257:
 https://tools.ietf.org/html/rfc8257
 
+BBR
+^^^
+BBR (class :cpp:class:`TcpBbr`) is a congestion control algorithm that
+regulates the sending rate by deriving an estimate of the bottleneck's
+available bandwidth and RTT of the path. It seeks to operate at an optimal
+point where sender experiences maximum delivery rate with minimum RTT. It
+creates a network model comprising maximum delivery rate with minimum RTT
+observed so far, and then estimates BDP (maximum bandwidth * minimum RTT)
+to control the maximum amount of inflight data. BBR controls congestion by
+limiting the rate at which packets are sent. It caps the cwnd to one BDP
+and paces out packets at a rate which is adjusted based on the latest estimate
+of delivery rate. BBR algorithm is agnostic to packet losses and ECN marks.
+
+pacing_gain controls the rate of sending data and cwnd_gain controls the amount
+of data to send.
+
+The following is a high level overview of BBR congestion control algorithm:
+
+On receiving an ACK:
+    rtt = now - packet.sent_time
+    update_minimum_rtt (rtt)
+    delivery_rate = estimate_delivery_rate (packet)
+    update_maximum_bandwidth (delivery_rate)
+
+After transmitting a data packet:
+    bdp = max_bandwidth * min_rtt
+    if (cwnd * bdp < inflight)
+      return
+    if (now > nextSendTime)
+      {
+        transmit (packet)
+        nextSendTime = now + packet.size / (pacing_gain * max_bandwidth)
+      }
+    else
+      return
+    Schedule (nextSendTime, Send)
+
+To enable BBR on all TCP sockets, the following configuration can be used:
+
+::
+
+  Config::SetDefault ("ns3::TcpL4Protocol::SocketType", TypeIdValue (TcpBbr::GetTypeId ()));
+
+To enable BBR on a chosen TCP socket, the following configuration can be used
+(note that an appropriate Node ID must be used instead of 1):
+
+::
+
+  Config::Set ("$ns3::NodeListPriv/NodeList/1/$ns3::TcpL4Protocol/SocketType", TypeIdValue (TcpBbr::GetTypeId ()));
+
+The ns-3 implementation of BBR is based on its Linux implementation. Linux 5.4
+kernel implementation has been used to validate the behavior of ns-3
+implementation of BBR (See below section on Validation).
+
+In addition, the following unit tests have been written to validate the
+implementation of BBR in ns-3:
+
+* BBR should enable (if not already done) TCP pacing feature.
+* Test to validate the values of pacing_gain and cwnd_gain in different phases
+of BBR.
+
+An example program, examples/tcp/tcp-bbr-example.cc, is provided to experiment
+with BBR for one long running flow. This example uses a simple topology
+consisting of one sender, one receiver and two routers to examine congestion
+window, throughput and queue control. A program similar to this has been run
+using the Network Stack Tester (NeST) using BBR from Linux kernel 5.4, and the
+results were compared against ns-3 results.
+
+More information about BBR is available in the following Internet Draft:
+https://tools.ietf.org/html/draft-cardwell-iccrg-bbr-congestion-control-00
+
+More information about Delivery Rate Estimation is in the following draft:
+https://tools.ietf.org/html/draft-cheng-iccrg-delivery-rate-estimation-00
+
+For an academic peer-reviewed paper on the BBR implementation in ns-3,
+please refer to:
+
+* Vivek Jain, Viyom Mittal and Mohit P. Tahiliani. "Design and Implementation of TCP BBR in ns-3." In Proceedings of the 10th Workshop on ns-3, pp. 16-22. 2018. (https://dl.acm.org/doi/abs/10.1145/3199902.3199911)
+
 Support for Explicit Congestion Notification (ECN)
 ++++++++++++++++++++++++++++++++++++++++++++++++++
 
@@ -1309,6 +1392,7 @@
 * **tcp-ledbat-test:** Unit tests on the LEDBAT congestion control
 * **tcp-lp-test:** Unit tests on the TCP-LP congestion control
 * **tcp-dctcp-test:** Unit tests on the DCTCP congestion control
+* **tcp-bbr-test:** Unit tests on the BBR congestion control
 * **tcp-option:** Unit tests on TCP options
 * **tcp-pkts-acked-test:** Unit test the number of time that PktsAcked is called
 * **tcp-rto-test:** Unit test behavior after a RTO occurs
@@ -1364,7 +1448,7 @@
    :scale: 70%
    :align: center
 
-   DCE Linux Reno vs. ns-3 Linux Reno
+   DCE Linux Reno vs. ns-3 NewReno
 
 The difference in the cwnd in the early stage of this flow is because of the
 way cwnd is plotted.  As ns-3 provides a trace source for cwnd, an ns-3 Linux
@@ -1373,17 +1457,6 @@
 Instead, we use the "ss" command of the Linux kernel to obtain
 cwnd values. The "ss" samples cwnd at an interval of 0.5 seconds.
 
-TCP ECN operation is tested in the ARED and RED tests that are documented in the traffic-control
-module documentation.
-
-.. _fig-dce-Linux-reno-vs-ns3-linux-reno:
-
-.. figure:: figures/dce-linux-reno-vs-ns3-linux-reno.*
-   :scale: 70 %
-   :align: center
-
-   DCE Linux Reno vs. ns-3 Linux Reno
-
 Figure :ref:`fig-dctcp-10ms-50mbps-tcp-throughput` shows a long-running
 file transfer using DCTCP over a 50 Mbps bottleneck (running CoDel queue
 disc with a 1ms CE threshold setting) with a 10 ms base RTT.  The figure
@@ -1444,6 +1517,36 @@
    CUBIC cwnd evolution for 50ms/50Mbps bottleneck, with ECN
 
 
+TCP ECN operation is tested in the ARED and RED tests that are documented in the traffic-control
+module documentation.
+
+Like DCTCP and TCP CUBIC, the ns-3 implementation of TCP BBR was validated
+against the BBR implementation of Linux kernel 5.4 using Network Stack Tester
+(NeST). NeST is a python package which allows the users to emulate kernel space
+protocols using Linux network namespaces. Figure :ref:`fig-ns3-bbr-vs-linux-bbr`
+compares the congestion window evolution between ns-3 and Linux for a single
+flow operating over a 10 Mbps link with 10 ms base RTT and FIFO queue
+discipline.
+
+.. _fig-ns3-bbr-vs-linux-bbr:
+
+.. figure:: figures/ns3-bbr-vs-linux-bbr.*
+   :scale: 80 %
+   :align: center
+
+   Congestion window evolution: ns-3 BBR vs. Linux BBR (using NeST)
+
+It can be observed that the congestion window traces for ns-3 BBR closely
+overlap with Linux BBR. The periodic drops in congestion window every 10
+seconds depict the PROBE_RTT phase of the BBR algorithm. In this phase, BBR
+algorithm keeps the congestion window fixed to 4 segments.
+
+The example program, examples/tcp-bbr-example.cc has been used to obtain the
+congestion window curve shown in Figure :ref:`fig-ns3-bbr-vs-linux-bbr`. The
+detailed instructions to reproduce ns-3 plot and NeST plot can be found at:
+https://github.com/mohittahiliani/BBR-Validation
+
+
 Writing a new congestion control algorithm
 ++++++++++++++++++++++++++++++++++++++++++
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/examples/main-simple.cc ns-3.34/src/internet/examples/main-simple.cc
--- ns-3.33/src/internet/examples/main-simple.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/examples/main-simple.cc	2021-07-14 10:31:06.000000000 -0700
@@ -26,21 +26,34 @@
 
 using namespace ns3;
 
+/**
+ * Generates traffic.
+ *
+ * The first call sends a packet of the specified size, and then
+ * the function is scheduled to send a packet of (size-50) after 0.5s.
+ * The process is iterated until the packet size is zero.
+ *
+ * \param socket output socket
+ * \param size packet size
+ */
 static void
-GenerateTraffic (Ptr<Socket> socket, uint32_t size)
+GenerateTraffic (Ptr<Socket> socket, int32_t size)
 {
-  std::cout << "at=" << Simulator::Now ().GetSeconds () << "s, tx bytes=" << size << std::endl;
-  socket->Send (Create<Packet> (size));
-  if (size > 0)
-    {
-      Simulator::Schedule (Seconds (0.5), &GenerateTraffic, socket, size - 50);
-    }
-  else
+  if (size <= 0)
     {
       socket->Close ();
+      return;
     }
+
+  std::cout << "at=" << Simulator::Now ().GetSeconds () << "s, tx bytes=" << size << std::endl;
+  socket->Send (Create<Packet> (size));
+  Simulator::Schedule (Seconds (0.5), &GenerateTraffic, socket, size - 50);
 }
 
+/**
+ * Prints the packets received by a socket
+ * \param socket input socket
+ */
 static void
 SocketPrinter (Ptr<Socket> socket)
 {
@@ -51,15 +64,11 @@
     }
 }
 
-static void
-PrintTraffic (Ptr<Socket> socket)
+int main (int argc, char *argv[])
 {
-  socket->SetRecvCallback (MakeCallback (&SocketPrinter));
-}
+  CommandLine cmd (__FILE__);
+  cmd.Parse (argc, argv);
 
-void
-RunSimulation (void)
-{
   NodeContainer c;
   c.Create (1);
 
@@ -77,20 +86,11 @@
   source->Connect (remote);
 
   GenerateTraffic (source, 500);
-  PrintTraffic (sink);
-
+  sink->SetRecvCallback (MakeCallback (&SocketPrinter));
 
   Simulator::Run ();
 
   Simulator::Destroy ();
-}
-
-int main (int argc, char *argv[])
-{
-  CommandLine cmd (__FILE__);
-  cmd.Parse (argc, argv);
-  
-  RunSimulation ();
 
   return 0;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/helper/ipv4-address-helper.h ns-3.34/src/internet/helper/ipv4-address-helper.h
--- ns-3.33/src/internet/helper/ipv4-address-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/helper/ipv4-address-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -47,137 +47,136 @@
 class Ipv4AddressHelper
 {
 public:
-/**
- * @brief Construct a helper class to make life easier while doing simple IPv4
- * address assignment in scripts.
- */
+  /**
+   * @brief Construct a helper class to make life easier while doing simple IPv4
+   * address assignment in scripts.
+   */
   Ipv4AddressHelper ();
 
-/**
- * @brief Construct a helper class to make life easier while doing simple IPv4
- * address assignment in scripts.  This version sets the base and mask
- * in the constructor
- * @param network the network part
- * @param mask the address mask
- * @param base the host part to start from
- */
+  /**
+   * @brief Construct a helper class to make life easier while doing simple IPv4
+   * address assignment in scripts.  This version sets the base and mask
+   * in the constructor
+   * @param network the network part
+   * @param mask the address mask
+   * @param base the host part to start from
+   */
   Ipv4AddressHelper (Ipv4Address network, Ipv4Mask mask, 
                      Ipv4Address base = "0.0.0.1");
 
-/**
- * @brief Set the base network number, network mask and base address.
- *
- * The address helper allocates IP addresses based on a given network number
- * and mask combination along with an initial IP address.
- *
- * For example, if you want to use a /24 prefix with an initial network number
- * of 192.168.1 (corresponding to a mask of 255.255.255.0) and you want to 
- * start allocating IP addresses out of that network beginning at 192.168.1.3,
- * you would call 
- *
- *   SetBase ("192.168.1.0", "255.255.255.0", "0.0.0.3");
- *
- * If you don't care about the initial address it defaults to "0.0.0.1" in 
- * which case you can simply use,
- *
- *   SetBase ("192.168.1.0", "255.255.255.0");
- *
- * and the first address generated will be 192.168.1.1.
- *
- * @param network The Ipv4Address containing the initial network number to
- * use during allocation.  The bits outside the network mask are not used.
- * @param mask The Ipv4Mask containing one bits in each bit position of the 
- * network number.
- * @param base An optional Ipv4Address containing the initial address used for 
- * IP address allocation.  Will be combined (ORed) with the network number to
- * generate the first IP address.  Defaults to 0.0.0.1.
- * @returns Nothing.
- */
+  /**
+   * @brief Set the base network number, network mask and base address.
+   *
+   * The address helper allocates IP addresses based on a given network number
+   * and mask combination along with an initial IP address.
+   *
+   * For example, if you want to use a /24 prefix with an initial network number
+   * of 192.168.1 (corresponding to a mask of 255.255.255.0) and you want to
+   * start allocating IP addresses out of that network beginning at 192.168.1.3,
+   * you would call
+   *
+   *   SetBase ("192.168.1.0", "255.255.255.0", "0.0.0.3");
+   *
+   * If you don't care about the initial address it defaults to "0.0.0.1" in
+   * which case you can simply use,
+   *
+   *   SetBase ("192.168.1.0", "255.255.255.0");
+   *
+   * and the first address generated will be 192.168.1.1.
+   *
+   * @param network The Ipv4Address containing the initial network number to
+   * use during allocation.  The bits outside the network mask are not used.
+   * @param mask The Ipv4Mask containing one bits in each bit position of the
+   * network number.
+   * @param base An optional Ipv4Address containing the initial address used for
+   * IP address allocation.  Will be combined (ORed) with the network number to
+   * generate the first IP address.  Defaults to 0.0.0.1.
+   */
   void SetBase (Ipv4Address network, Ipv4Mask mask, 
                 Ipv4Address base = "0.0.0.1");
 
-/**
- * @brief Increment the network number and reset the IP address counter to 
- * the base value provided in the SetBase method.
- *
- * The address helper allocates IP addresses based on a given network number
- * and initial IP address.  In order to separate the network number and IP 
- * address parts, SetBase was given an initial network number value, a network
- * mask and an initial address base.
- *
- * This method increments the network number and resets the IP address
- * counter to the last base value used.  For example, if the network number was
- * set to 192.168.0.0 with a mask of 255.255.255.0 and a base address of
- * 0.0.0.3 in the SetBase call; a call to NewNetwork will increment the 
- * network number counter resulting in network numbers incrementing as
- * 192.168.1.0, 192.168.2.0, etc.  After each network number increment, the
- * IP address counter is reset to the initial value specified in SetBase.  In 
- * this case, that would be 0.0.0.3. so if you were to call NewAddress after
- * the increment that resulted in a network number of 192.168.2.0, the 
- * allocated addresses returned by NewAddress would be 192.168.2.3, 
- * 192.168.2.4, etc.
- *
- * @returns The value of the incremented network number that will be used in
- * following address allocations.
- * @see SetBase
- * @see NewAddress
- */
+  /**
+   * @brief Increment the network number and reset the IP address counter to
+   * the base value provided in the SetBase method.
+   *
+   * The address helper allocates IP addresses based on a given network number
+   * and initial IP address.  In order to separate the network number and IP
+   * address parts, SetBase was given an initial network number value, a network
+   * mask and an initial address base.
+   *
+   * This method increments the network number and resets the IP address
+   * counter to the last base value used.  For example, if the network number was
+   * set to 192.168.0.0 with a mask of 255.255.255.0 and a base address of
+   * 0.0.0.3 in the SetBase call; a call to NewNetwork will increment the
+   * network number counter resulting in network numbers incrementing as
+   * 192.168.1.0, 192.168.2.0, etc.  After each network number increment, the
+   * IP address counter is reset to the initial value specified in SetBase.  In
+   * this case, that would be 0.0.0.3. so if you were to call NewAddress after
+   * the increment that resulted in a network number of 192.168.2.0, the
+   * allocated addresses returned by NewAddress would be 192.168.2.3,
+   * 192.168.2.4, etc.
+   *
+   * @returns The value of the incremented network number that will be used in
+   * following address allocations.
+   * @see SetBase
+   * @see NewAddress
+   */
   Ipv4Address NewNetwork (void);
 
-/**
- * @brief Increment the IP address counter used to allocate IP addresses
- *
- * The address helper allocates IP addresses based on a given network number
- * and initial IP address.  In order to separate the network number and IP 
- * address parts, SetBase was given an initial network number value, a network
- * mask and an initial address base.
- *
- * This method increments IP address counter.  A check is made to ensure that
- * the address returned will not overflow the number of bits allocated to IP
- * addresses in SetBase (the number of address bits is defined by the number
- * of mask bits that are not '1').
- *
- * For example, if the network number was set to 192.168.0.0 with a mask of 
- * 255.255.255.0 and a base address of 0.0.0.3 in SetBase, the next call to
- * NewAddress will return 192.168.1.3.  The NewAddress method 
- * has post-increment semantics.  A following NewAddress would return 
- * 192.168.0.4, etc., until the 253rd call which would assert due to an address
- * overflow.
- *
- * @returns The value of the newly allocated IP address.
- * @see SetBase
- * @see NewNetwork
- */
+  /**
+   * @brief Increment the IP address counter used to allocate IP addresses
+   *
+   * The address helper allocates IP addresses based on a given network number
+   * and initial IP address.  In order to separate the network number and IP
+   * address parts, SetBase was given an initial network number value, a network
+   * mask and an initial address base.
+   *
+   * This method increments IP address counter.  A check is made to ensure that
+   * the address returned will not overflow the number of bits allocated to IP
+   * addresses in SetBase (the number of address bits is defined by the number
+   * of mask bits that are not '1').
+   *
+   * For example, if the network number was set to 192.168.0.0 with a mask of
+   * 255.255.255.0 and a base address of 0.0.0.3 in SetBase, the next call to
+   * NewAddress will return 192.168.1.3.  The NewAddress method
+   * has post-increment semantics.  A following NewAddress would return
+   * 192.168.0.4, etc., until the 253rd call which would assert due to an address
+   * overflow.
+   *
+   * @returns The value of the newly allocated IP address.
+   * @see SetBase
+   * @see NewNetwork
+   */
   Ipv4Address NewAddress (void);
 
-/**
- * @brief Assign IP addresses to the net devices specified in the container
- * based on the current network prefix and address base.
- *
- * The address helper allocates IP addresses based on a given network number
- * and initial IP address.  In order to separate the network number and IP 
- * address parts, SetBase was given an initial value and a network mask.
- * The one bits of this mask define the prefix category from which the helper
- * will allocate new network numbers.  An initial value for the network
- * numbers was provided in the base parameter of the SetBase method in the 
- * bits corresponding to positions in the mask that were 1.  An initial value
- * for the IP address counter was also provided in the base parameter in the 
- * bits corresponding to positions in the mask that were 0.
- *
- * This method gets new addresses for each net device in the container.  For
- * each net device in the container, the helper finds the associated node and
- * looks up the Ipv4 interface corresponding to the net device.  It then sets
- * the Ipv4Address and mask in the interface to the appropriate values.  If 
- * the addresses overflow the number of bits allocated for them by the network 
- * mask in the SetBase method, the system will NS_ASSERT and halt.
- *
- * @param c The NetDeviceContainer holding the collection of net devices we
- * are asked to assign Ipv4 addresses to.
- *
- * @returns A container holding the added NetDevices
- * @see SetBase
- * @see NewNetwork
- */
+  /**
+   * @brief Assign IP addresses to the net devices specified in the container
+   * based on the current network prefix and address base.
+   *
+   * The address helper allocates IP addresses based on a given network number
+   * and initial IP address.  In order to separate the network number and IP
+   * address parts, SetBase was given an initial value and a network mask.
+   * The one bits of this mask define the prefix category from which the helper
+   * will allocate new network numbers.  An initial value for the network
+   * numbers was provided in the base parameter of the SetBase method in the
+   * bits corresponding to positions in the mask that were 1.  An initial value
+   * for the IP address counter was also provided in the base parameter in the
+   * bits corresponding to positions in the mask that were 0.
+   *
+   * This method gets new addresses for each net device in the container.  For
+   * each net device in the container, the helper finds the associated node and
+   * looks up the Ipv4 interface corresponding to the net device.  It then sets
+   * the Ipv4Address and mask in the interface to the appropriate values.  If
+   * the addresses overflow the number of bits allocated for them by the network
+   * mask in the SetBase method, the system will NS_ASSERT and halt.
+   *
+   * @param c The NetDeviceContainer holding the collection of net devices we
+   * are asked to assign Ipv4 addresses to.
+   *
+   * @returns A container holding the added NetDevices
+   * @see SetBase
+   * @see NewNetwork
+   */
   Ipv4InterfaceContainer Assign (const NetDeviceContainer &c);
 
 private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/helper/ipv4-global-routing-helper.h ns-3.34/src/internet/helper/ipv4-global-routing-helper.h
--- ns-3.33/src/internet/helper/ipv4-global-routing-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/helper/ipv4-global-routing-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -42,8 +42,9 @@
   /**
    * \brief Construct a GlobalRoutingHelper from another previously initialized
    * instance (Copy Constructor).
+   * \param o object to be copied
    */
-  Ipv4GlobalRoutingHelper (const Ipv4GlobalRoutingHelper &);
+  Ipv4GlobalRoutingHelper (const Ipv4GlobalRoutingHelper &o);
 
   /**
    * \returns pointer to clone of this Ipv4GlobalRoutingHelper
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/helper/ipv4-list-routing-helper.h ns-3.34/src/internet/helper/ipv4-list-routing-helper.h
--- ns-3.33/src/internet/helper/ipv4-list-routing-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/helper/ipv4-list-routing-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -51,8 +51,9 @@
   /**
    * \brief Construct an Ipv4ListRoutingHelper from another previously 
    * initialized instance (Copy Constructor).
+   * \param o object to be copied
    */
-  Ipv4ListRoutingHelper (const Ipv4ListRoutingHelper &);
+  Ipv4ListRoutingHelper (const Ipv4ListRoutingHelper &o);
 
   /**
    * \returns pointer to clone of this Ipv4ListRoutingHelper 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/helper/ipv4-routing-helper.h ns-3.34/src/internet/helper/ipv4-routing-helper.h
--- ns-3.33/src/internet/helper/ipv4-routing-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/helper/ipv4-routing-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -119,6 +119,7 @@
    * \brief prints the neighbor cache of all nodes at a particular time.
    * \param printTime the time at which the neighbor cache is supposed to be printed.
    * \param stream The output stream object to use
+   * \param unit The time unit to be used in the report
    *
    * This method calls the PrintArpCache() method of the
    * ArpCache associated with each Ipv4Interface stored in the Ipv4 object, for all nodes at the
@@ -134,6 +135,7 @@
    * \brief prints the neighbor cache of all nodes at regular intervals specified by user.
    * \param printInterval the time interval for which the neighbor cache is supposed to be printed.
    * \param stream The output stream object to use
+   * \param unit The time unit to be used in the report
    *
    * This method calls the PrintArpCache() method of the
    * ArpCache associated with each Ipv4Interface stored in the Ipv4 object, for all nodes at the
@@ -150,6 +152,7 @@
    * \param printTime the time at which the neighbor cache is supposed to be printed.
    * \param node The node ptr for which we need the neighbor cache to be printed
    * \param stream The output stream object to use
+   * \param unit The time unit to be used in the report
    *
    * This method calls the PrintArpCache() method of the
    * ArpCache associated with each Ipv4Interface stored in the Ipv4 object, for all nodes at the
@@ -166,6 +169,7 @@
    * \param printInterval the time interval for which the neighbor cache is supposed to be printed.
    * \param node The node ptr for which we need the neighbor cache to be printed
    * \param stream The output stream object to use
+   * \param unit The time unit to be used in the report
    *
    * This method calls the PrintArpCache() method of the
    * ArpCache associated with each Ipv4Interface stored in the Ipv4 object, for all nodes at the
@@ -219,6 +223,7 @@
    * \brief prints the neighbor cache of a node.
    * \param node The node ptr for which we need the neighbor cache to be printed
    * \param stream The output stream object to use
+   * \param unit The time unit to be used in the report
    *
    * This method calls the PrintArpCache() method of the
    * ArpCache associated with each Ipv4Interface stored in the Ipv4 object, for all nodes at the
@@ -235,6 +240,7 @@
    * \param printInterval the time interval for which the neighbor cache is supposed to be printed.
    * \param node The node ptr for which we need the neighbor cache to be printed
    * \param stream The output stream object to use
+   * \param unit The time unit to be used in the report
    *
    * This method calls the PrintArpCache() method of the
    * ArpCache associated with each Ipv4Interface stored in the Ipv4 object, for all nodes at the
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/helper/ipv4-static-routing-helper.h ns-3.34/src/internet/helper/ipv4-static-routing-helper.h
--- ns-3.33/src/internet/helper/ipv4-static-routing-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/helper/ipv4-static-routing-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -51,8 +51,9 @@
   /**
    * \brief Construct an Ipv4StaticRoutingHelper from another previously 
    * initialized instance (Copy Constructor).
+   * \param o object to be copied
    */
-  Ipv4StaticRoutingHelper (const Ipv4StaticRoutingHelper &);
+  Ipv4StaticRoutingHelper (const Ipv4StaticRoutingHelper &o);
 
   /**
    * \returns pointer to clone of this Ipv4StaticRoutingHelper
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/helper/ipv6-address-helper.cc ns-3.34/src/internet/helper/ipv6-address-helper.cc
--- ns-3.33/src/internet/helper/ipv6-address-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/helper/ipv6-address-helper.cc	2021-07-14 10:31:06.000000000 -0700
@@ -210,66 +210,30 @@
 Ipv6InterfaceContainer Ipv6AddressHelper::Assign (const NetDeviceContainer &c)
 {
   NS_LOG_FUNCTION (this);
-  Ipv6InterfaceContainer retval;
-
+  std::vector<bool> withConfiguration;
   for (uint32_t i = 0; i < c.GetN (); ++i) 
     {
-      Ptr<NetDevice> device = c.Get (i);
-
-      Ptr<Node> node = device->GetNode ();
-      NS_ASSERT_MSG (node, "Ipv6AddressHelper::Allocate (): Bad node");
-
-      Ptr<Ipv6> ipv6 = node->GetObject<Ipv6> ();
-      NS_ASSERT_MSG (ipv6, "Ipv6AddressHelper::Allocate (): Bad ipv6");
-      int32_t ifIndex = 0;
-
-      ifIndex = ipv6->GetInterfaceForDevice (device);
-      if (ifIndex == -1)
-        {
-          ifIndex = ipv6->AddInterface (device);
-        }
-      NS_ASSERT_MSG (ifIndex >= 0, "Ipv6AddressHelper::Allocate (): "
-                     "Interface index not found");
-
-      // the first round is to make sure that the interface is set up, including its link-local addresses.
-      ipv6->SetUp (ifIndex);
-
-      Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (NewAddress (device->GetAddress ()), Ipv6Prefix (64));
-      ipv6->SetMetric (ifIndex, 1);
-      ipv6->AddAddress (ifIndex, ipv6Addr);
-      ipv6->SetUp (ifIndex);
-
-      retval.Add (ipv6, ifIndex);
-
-      // Install the default traffic control configuration if the traffic
-      // control layer has been aggregated, if this is not
-      // a loopback interface, and there is no queue disc installed already
-      Ptr<TrafficControlLayer> tc = node->GetObject<TrafficControlLayer> ();
-      if (tc && DynamicCast<LoopbackNetDevice> (device) == 0 && tc->GetRootQueueDiscOnDevice (device) == 0)
-        {
-          Ptr<NetDeviceQueueInterface> ndqi = device->GetObject<NetDeviceQueueInterface> ();
-          // It is useless to install a queue disc if the device has no
-          // NetDeviceQueueInterface attached: the device queue is never
-          // stopped and every packet enqueued in the queue disc is
-          // immediately dequeued, hence there will never be backlog
-          if (ndqi)
-            {
-              std::size_t nTxQueues = ndqi->GetNTxQueues ();
-              NS_LOG_LOGIC ("Installing default traffic control configuration ("
-                            << nTxQueues << " device queue(s))");
-              TrafficControlHelper tcHelper = TrafficControlHelper::Default (nTxQueues);
-              tcHelper.Install (device);
-            }
-        }
+      withConfiguration.push_back (true);
     }
-  return retval;
+  return Assign (c, withConfiguration);
 }
 
 Ipv6InterfaceContainer Ipv6AddressHelper::Assign (const NetDeviceContainer &c, std::vector<bool> withConfiguration)
 {
   NS_LOG_FUNCTION (this);
+  std::vector<bool> onLink;
+  for (uint32_t i = 0; i < c.GetN (); ++i)
+    {
+      onLink.push_back (true);
+    }
+  return Assign (c, withConfiguration, onLink);
+}
+
+Ipv6InterfaceContainer Ipv6AddressHelper::Assign (const NetDeviceContainer &c, std::vector<bool> withConfiguration, std::vector<bool> onLink)
+{
+  NS_LOG_FUNCTION (this);
   Ipv6InterfaceContainer retval;
-  for (uint32_t i = 0; i < c.GetN (); ++i) 
+  for (uint32_t i = 0; i < c.GetN (); ++i)
     {
       Ptr<NetDevice> device = c.Get (i);
 
@@ -294,8 +258,8 @@
 
       if (withConfiguration.at (i))
         {
-          Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (NewAddress (device->GetAddress ()), Ipv6Prefix (64));
-          ipv6->AddAddress (ifIndex, ipv6Addr);
+          Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (NewAddress (device->GetAddress ()), Ipv6Prefix (64), onLink.at(i));
+          ipv6->AddAddress (ifIndex, ipv6Addr, onLink.at(i));
         }
 
       ipv6->SetUp (ifIndex);
@@ -337,5 +301,18 @@
   return Assign (c, withConfiguration);
 }
 
+Ipv6InterfaceContainer Ipv6AddressHelper::AssignWithoutOnLink (const NetDeviceContainer &c)
+{
+  NS_LOG_FUNCTION (this);
+  std::vector<bool> withConfiguration;
+  std::vector<bool> onLink;
+  for (uint32_t i = 0; i < c.GetN (); ++i)
+    {
+      withConfiguration.push_back (true);
+      onLink.push_back (false);
+    }
+  return Assign (c, withConfiguration, onLink);
+}
+
 } /* namespace ns3 */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/helper/ipv6-address-helper.h ns-3.34/src/internet/helper/ipv6-address-helper.h
--- ns-3.33/src/internet/helper/ipv6-address-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/helper/ipv6-address-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -155,6 +155,22 @@
   Ipv6InterfaceContainer Assign (const NetDeviceContainer &c, std::vector<bool> withConfiguration);
 
   /**
+   * \brief Allocate an Ipv6InterfaceContainer, and control whether the
+   *        interfaces have addresses auto-assigned to them
+   *
+   * \param c netdevice container
+   * \param withConfiguration a vector of values for which, for a
+   *        given device, true : interface automatically addressed,
+   *        false : no automatic address
+   * \param onLink a vector of values for which, for a
+   *        given device, true : on-link property added,
+   *        false : network is not on-link
+   *        Meaningful only if the address is automatically assigned.
+   * \return newly created Ipv6InterfaceContainer
+   */
+  Ipv6InterfaceContainer Assign (const NetDeviceContainer &c, std::vector<bool> withConfiguration, std::vector<bool> onLink);
+
+  /**
    * \brief Allocate an Ipv6InterfaceContainer but do not assign any IPv6 addresses
    *
    * This method is used when IPv6 address assignment may occur later
@@ -167,6 +183,18 @@
    */
   Ipv6InterfaceContainer AssignWithoutAddress (const NetDeviceContainer &c);
 
+  /**
+   * \brief Allocate an Ipv6InterfaceContainer with auto-assigned addresses,
+   * but do not set the on-link property for the network.
+   *
+   * This method will assign a valid global address to the interface but
+   * the routing will not consider the network as "on-link".
+   *
+   * \param c netdevice container
+   * \return newly created Ipv6InterfaceContainer
+   */
+  Ipv6InterfaceContainer AssignWithoutOnLink (const NetDeviceContainer &c);
+
 private:
   Ipv6Address m_network; //!< network address
   Ipv6Prefix m_prefix;   //!< prefix length
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/helper/ipv6-list-routing-helper.h ns-3.34/src/internet/helper/ipv6-list-routing-helper.h
--- ns-3.33/src/internet/helper/ipv6-list-routing-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/helper/ipv6-list-routing-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -53,8 +53,9 @@
   /**
    * \brief Construct an Ipv6ListRoutingHelper from another previously 
    * initialized instance (Copy Constructor).
+   * \param o object to be copied
    */
-  Ipv6ListRoutingHelper (const Ipv6ListRoutingHelper &);
+  Ipv6ListRoutingHelper (const Ipv6ListRoutingHelper &o);
 
   /**
    * \returns pointer to clone of this Ipv6ListRoutingHelper 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/helper/ipv6-routing-helper.h ns-3.34/src/internet/helper/ipv6-routing-helper.h
--- ns-3.33/src/internet/helper/ipv6-routing-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/helper/ipv6-routing-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -120,6 +120,7 @@
    * \brief prints the neighbor cache of all nodes at a particular time.
    * \param printTime the time at which the neighbor cache is supposed to be printed.
    * \param stream The output stream object to use
+   * \param unit The time unit to be used in the report
    *
    * This method calls the PrintNdiscCache() method of the
    * NdiscCache associated with each Ipv6Interface stored in the Ipv6 object, for all nodes at the
@@ -135,6 +136,7 @@
    * \brief prints the neighbor cache of all nodes at regular intervals specified by user.
    * \param printInterval the time interval for which the neighbor cache is supposed to be printed.
    * \param stream The output stream object to use
+   * \param unit The time unit to be used in the report
    *
    * This method calls the PrintNdiscCache() method of the
    * NdiscCache associated with each Ipv6Interface stored in the Ipv6 object, for all nodes at the
@@ -151,6 +153,7 @@
    * \param printTime the time at which the neighbor cache is supposed to be printed.
    * \param node The node ptr for which we need the neighbor cache to be printed
    * \param stream The output stream object to use
+   * \param unit The time unit to be used in the report
    *
    * This method calls the PrintNdiscCache() method of the
    * NdiscCache associated with each Ipv6Interface stored in the Ipv6 object, for all nodes at the
@@ -167,6 +170,7 @@
    * \param printInterval the time interval for which the neighbor cache is supposed to be printed.
    * \param node The node ptr for which we need the neighbor cache to be printed
    * \param stream The output stream object to use
+   * \param unit The time unit to be used in the report
    *
    * This method calls the PrintNdiscCache() method of the
    * NdiscCache associated with each Ipv6Interface stored in the Ipv6 object, for all nodes at the
@@ -220,6 +224,7 @@
    * \brief prints the neighbor cache of a node.
    * \param node The node ptr for which we need the neighbor cache to be printed
    * \param stream The output stream object to use
+   * \param unit The time unit to be used in the report
    *
    * This method calls the PrintNdiscCache() method of the
    * NdiscCache associated with each Ipv6Interface stored in the Ipv6 object, for all nodes at the
@@ -236,6 +241,7 @@
    * \param printInterval the time interval for which the neighbor cache is supposed to be printed.
    * \param node The node ptr for which we need the neighbor cache to be printed
    * \param stream The output stream object to use
+   * \param unit The time unit to be used in the report
    *
    * This method calls the PrintNdiscCache() method of the
    * NdiscCache associated with each Ipv6Interface stored in the Ipv6 object, for all nodes at the
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/helper/ipv6-static-routing-helper.h ns-3.34/src/internet/helper/ipv6-static-routing-helper.h
--- ns-3.33/src/internet/helper/ipv6-static-routing-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/helper/ipv6-static-routing-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -51,8 +51,9 @@
   /**
    * \brief Construct an Ipv6ListRoutingHelper from another previously 
    * initialized instance (Copy Constructor).
+   * \param o object to be copied
    */
-  Ipv6StaticRoutingHelper (const Ipv6StaticRoutingHelper &);
+  Ipv6StaticRoutingHelper (const Ipv6StaticRoutingHelper &o);
 
   /**
    * \returns pointer to clone of this Ipv6StaticRoutingHelper
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/arp-cache.h ns-3.34/src/internet/model/arp-cache.h
--- ns-3.33/src/internet/model/arp-cache.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/arp-cache.h	2021-07-14 10:31:06.000000000 -0700
@@ -22,6 +22,7 @@
 
 #include <stdint.h>
 #include <list>
+#include <unordered_map>
 #include "ns3/simulator.h"
 #include "ns3/callback.h"
 #include "ns3/packet.h"
@@ -32,7 +33,6 @@
 #include "ns3/ptr.h"
 #include "ns3/object.h"
 #include "ns3/traced-callback.h"
-#include "ns3/sgi-hashmap.h"
 #include "ns3/output-stream-wrapper.h"
 
 namespace ns3 {
@@ -313,11 +313,11 @@
   /**
    * \brief ARP Cache container
    */
-  typedef sgi::hash_map<Ipv4Address, ArpCache::Entry *, Ipv4AddressHash> Cache;
+  typedef std::unordered_map<Ipv4Address, ArpCache::Entry *, Ipv4AddressHash> Cache;
   /**
    * \brief ARP Cache container iterator
    */
-  typedef sgi::hash_map<Ipv4Address, ArpCache::Entry *, Ipv4AddressHash>::iterator CacheI;
+  typedef std::unordered_map<Ipv4Address, ArpCache::Entry *, Ipv4AddressHash>::iterator CacheI;
 
   virtual void DoDispose (void);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/global-route-manager-impl.h ns-3.34/src/internet/model/global-route-manager-impl.h
--- ns-3.33/src/internet/model/global-route-manager-impl.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/global-route-manager-impl.h	2021-07-14 10:31:06.000000000 -0700
@@ -737,8 +737,9 @@
 
 /**
  * @brief Debugging routine; allow client code to supply a pre-built LSDB
+ * @param lsdb the pre-built LSDB
  */
-  void DebugUseLsdb (GlobalRouteManagerLSDB*);
+  void DebugUseLsdb (GlobalRouteManagerLSDB* lsdb);
 
 /**
  * @brief Debugging routine; call the core SPF from the unit tests
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/icmpv6-header.cc ns-3.34/src/internet/model/icmpv6-header.cc
--- ns-3.33/src/internet/model/icmpv6-header.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/icmpv6-header.cc	2021-07-14 10:31:06.000000000 -0700
@@ -503,7 +503,6 @@
   NS_LOG_FUNCTION (this);
   SetType (ICMPV6_ND_ROUTER_ADVERTISEMENT);
   SetCode (0);
-  SetFlags (0);
   SetFlagM (0);
   SetFlagO (0);
   SetFlagH (0);
@@ -605,13 +604,12 @@
 uint8_t Icmpv6RA::GetFlags () const
 {
   NS_LOG_FUNCTION (this);
-  return m_flags;
+  return 0;
 }
 
 void Icmpv6RA::SetFlags (uint8_t f)
 {
   NS_LOG_FUNCTION (this << static_cast<uint32_t> (f));
-  m_flags = f;
 }
 
 void Icmpv6RA::Print (std::ostream& os) const
@@ -674,22 +672,22 @@
   SetCode (i.ReadU8 ());
   m_checksum = i.ReadU16 ();
   SetCurHopLimit (i.ReadU8 ());
-  m_flags = i.ReadU8 ();
+  uint8_t flags = i.ReadU8 ();
   m_flagM = false;
   m_flagO = false;
   m_flagH = false;
 
-  if (m_flags & (1 << 7))
+  if (flags & (1 << 7))
     {
       m_flagM = true;
     }
 
-  if (m_flags & (1 << 6))
+  if (flags & (1 << 6))
     {
       m_flagO = true;
     }
 
-  if (m_flags & (1 << 5))
+  if (flags & (1 << 5))
     {
       m_flagH = true;
     }
@@ -993,7 +991,8 @@
 {
   NS_LOG_FUNCTION (this << &os);
   os << "( type = " << (GetType () == 128 ? "128 (Request)" : "129 (Reply)") << 
-  " code = " << (uint32_t)GetCode () <<
+  " Id = " << (uint32_t)GetId () <<
+  " SeqNo = " << (uint32_t)GetSeq () <<
   " checksum = "  << (uint32_t)GetChecksum () << ")";
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/icmpv6-header.h ns-3.34/src/internet/model/icmpv6-header.h
--- ns-3.33/src/internet/model/icmpv6-header.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/icmpv6-header.h	2021-07-14 10:31:06.000000000 -0700
@@ -685,12 +685,14 @@
    * \brief Getflags.
    * \return the flags value
    */
+  NS_DEPRECATED_3_34
   uint8_t GetFlags () const;
 
   /**
    * \brief Setflags.
    * \param f the flags value
    */
+  NS_DEPRECATED_3_34
   void SetFlags (uint8_t f);
 
   /**
@@ -729,11 +731,6 @@
   bool m_flagH;
 
   /**
-   * \brief The flags field value.
-   */
-  uint8_t m_flags;
-
-  /**
    * \brief The lifetime value.
    */
   uint16_t m_LifeTime;
@@ -1501,6 +1498,17 @@
   virtual TypeId GetInstanceTypeId () const;
 
   /**
+   * \brief Icmpv6 Option Prefix Information flag field values
+   */
+  typedef enum
+  {
+    NONE         = 0,   //!< No flags
+    ROUTERADDR   = 32,  //!< Router Address
+    AUTADDRCONF  = 64,  //!< Autonomous Address Configuration
+    ONLINK       = 128  //!< On-link
+  } Flags_t;
+
+  /**
    * \brief Get the prefix length.
    * \return prefix length
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/icmpv6-l4-protocol.cc ns-3.34/src/internet/model/icmpv6-l4-protocol.cc
--- ns-3.33/src/internet/model/icmpv6-l4-protocol.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/icmpv6-l4-protocol.cc	2021-07-14 10:31:06.000000000 -0700
@@ -522,45 +522,74 @@
       return;
     }
 
-  Icmpv6OptionLinkLayerAddress lla (1);
-  Address hardwareAddress;
   NdiscCache::Entry* entry = 0;
   Ptr<NdiscCache> cache = FindCache (interface->GetDevice ());
   uint8_t flags = 0;
 
-  /* XXX search all options following the NS header */
+  /* search all options following the NS header */
+  Icmpv6OptionLinkLayerAddress sllaoHdr (true);
 
-  if (src != Ipv6Address::GetAny ())
+  bool next = true;
+  bool hasSllao = false;
+
+  while (next == true)
     {
       uint8_t type;
-      packet->CopyData (&type, sizeof(type));
+      packet->CopyData (&type, sizeof (type));
 
-      if (type != Icmpv6Header::ICMPV6_OPT_LINK_LAYER_SOURCE)
+      switch (type)
         {
-          return;
+          case Icmpv6Header::ICMPV6_OPT_LINK_LAYER_SOURCE:
+            if (!hasSllao)
+              {
+                packet->RemoveHeader (sllaoHdr);
+                hasSllao = true;
+              }
+            break;
+          default:
+            /* unknow option, quit */
+            next = false;
+        }
+      if (packet->GetSize () == 0)
+        {
+          next = false;
         }
+    }
 
-      /* Get LLA */
-      packet->RemoveHeader (lla);
+  Address replyMacAddress;
 
+  if (src != Ipv6Address::GetAny ())
+    {
       entry = cache->Lookup (src);
       if (!entry)
         {
+          if (!hasSllao)
+            {
+              NS_LOG_LOGIC ("Icmpv6L4Protocol::HandleNS: NS without SLLAO and we do not have a NCE, discarding.");
+              return;
+            }
           entry = cache->Add (src);
           entry->SetRouter (false);
-          entry->MarkStale (lla.GetAddress ());
+          entry->MarkStale (sllaoHdr.GetAddress ());
+          replyMacAddress = sllaoHdr.GetAddress ();
         }
-      else if (entry->GetMacAddress () != lla.GetAddress ())
+      else if (hasSllao && (entry->GetMacAddress () != sllaoHdr.GetAddress ()))
         {
-          entry->MarkStale (lla.GetAddress ());
+          entry->MarkStale (sllaoHdr.GetAddress ());
+          replyMacAddress = sllaoHdr.GetAddress ();
+        }
+      else
+        {
+          replyMacAddress = entry->GetMacAddress ();
         }
 
       flags = 3; /* S + O flags */
     }
   else
     {
-      /* it means someone do a DAD */
+      /* it's a DAD */
       flags = 1; /* O flag */
+      replyMacAddress = interface->GetDevice ()->GetMulticast (dst);
     }
 
   /* send a NA to src */
@@ -571,14 +600,16 @@
       flags += 4; /* R flag */
     }
 
-  hardwareAddress = interface->GetDevice ()->GetAddress ();
+  Address hardwareAddress = interface->GetDevice ()->GetAddress ();
   NdiscCache::Ipv6PayloadHeaderPair p = ForgeNA (target.IsLinkLocal () ? interface->GetLinkLocalAddress ().GetAddress () : ifaddr.GetAddress (),
                                                  src.IsAny () ? dst : src, // DAD replies must go to the multicast group it was sent to.
                                                  &hardwareAddress,
                                                  flags );
-  interface->Send (p.first, p.second, src.IsAny () ? Ipv6Address::GetAllNodesMulticast () : src);
 
-  /* not a NS for us discard it */
+  // We must bypass the IPv6 layer, as a NA must be sent regardless of the NCE status (and not change it beyond what we did already).
+  Ptr<Packet> pkt = p.first;
+  pkt->AddHeader (p.second);
+  interface->GetDevice ()->Send (pkt, replyMacAddress, Ipv6L3Protocol::PROT_NUMBER);
 }
 
 NdiscCache::Ipv6PayloadHeaderPair Icmpv6L4Protocol::ForgeRS (Ipv6Address src, Ipv6Address dst, Address hardwareAddress)
@@ -587,10 +618,16 @@
   Ptr<Packet> p = Create<Packet> ();
   Ipv6Header ipHeader;
   Icmpv6RS rs;
-  Icmpv6OptionLinkLayerAddress llOption (1, hardwareAddress);  /* we give our mac address in response */
 
-  NS_LOG_LOGIC ("Send RS ( from " << src << " to " << dst << ")");
-  p->AddHeader (llOption);
+  NS_LOG_LOGIC ("Forge RS (from " << src << " to " << dst << ")");
+  // RFC 4861:
+  // The link-layer address of the sender MUST NOT be included if the Source Address is the unspecified address.
+  // Otherwise, it SHOULD be included on link layers that have addresses.
+  if (!src.IsAny ())
+    {
+      Icmpv6OptionLinkLayerAddress llOption (1, hardwareAddress);  /* we give our mac address in response */
+      p->AddHeader (llOption);
+    }
 
   rs.CalculatePseudoHeaderChecksum (src, dst, p->GetSize () + rs.GetSerializedSize (), PROT_NUMBER);
   p->AddHeader (rs);
@@ -1036,15 +1073,17 @@
   NS_LOG_FUNCTION (this << src << dst << hardwareAddress);
   Ptr<Packet> p = Create<Packet> ();
   Icmpv6RS rs;
-  Icmpv6OptionLinkLayerAddress llOption (1, hardwareAddress);  /* we give our mac address in response */
 
-  /* if the source is unspec, multicast the NA to all-nodes multicast */
-  if (src != Ipv6Address::GetAny ())
+  // RFC 4861:
+  // The link-layer address of the sender MUST NOT be included if the Source Address is the unspecified address.
+  // Otherwise, it SHOULD be included on link layers that have addresses.
+  if (!src.IsAny ())
     {
+      Icmpv6OptionLinkLayerAddress llOption (1, hardwareAddress);
       p->AddHeader (llOption);
     }
 
-  NS_LOG_LOGIC ("Send RS ( from " << src << " to " << dst << ")");
+  NS_LOG_LOGIC ("Send RS (from " << src << " to " << dst << ")");
 
   rs.CalculatePseudoHeaderChecksum (src, dst, p->GetSize () + rs.GetSerializedSize (), PROT_NUMBER);
   p->AddHeader (rs);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/icmpv6-l4-protocol.h ns-3.34/src/internet/model/icmpv6-l4-protocol.h
--- ns-3.33/src/internet/model/icmpv6-l4-protocol.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/icmpv6-l4-protocol.h	2021-07-14 10:31:06.000000000 -0700
@@ -316,7 +316,6 @@
 
   /**
    * \brief Function called when DAD timeout.
-   * \param icmpv6 Icmpv6L4Protocol instance
    * \param interface the interface
    * \param addr the IPv6 address
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv4-global-routing.cc ns-3.34/src/internet/model/ipv4-global-routing.cc
--- ns-3.33/src/internet/model/ipv4-global-routing.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv4-global-routing.cc	2021-07-14 10:31:06.000000000 -0700
@@ -402,6 +402,11 @@
 {
   NS_LOG_FUNCTION (this << stream);
   std::ostream* os = stream->GetStream ();
+  // Copy the current ostream state
+  std::ios oldState (nullptr);
+  oldState.copyfmt (*os);
+
+  *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
 
   *os << "Node: " << m_ipv4->GetObject<Node> ()->GetId ()
       << ", Time: " << Now().As (unit)
@@ -416,11 +421,11 @@
           std::ostringstream dest, gw, mask, flags;
           Ipv4RoutingTableEntry route = GetRoute (j);
           dest << route.GetDest ();
-          *os << std::setiosflags (std::ios::left) << std::setw (16) << dest.str ();
+          *os << std::setw (16) << dest.str ();
           gw << route.GetGateway ();
-          *os << std::setiosflags (std::ios::left) << std::setw (16) << gw.str ();
+          *os << std::setw (16) << gw.str ();
           mask << route.GetDestNetworkMask ();
-          *os << std::setiosflags (std::ios::left) << std::setw (16) << mask.str ();
+          *os << std::setw (16) << mask.str ();
           flags << "U";
           if (route.IsHost ())
             {
@@ -430,7 +435,7 @@
             {
               flags << "G";
             }
-          *os << std::setiosflags (std::ios::left) << std::setw (6) << flags.str ();
+          *os << std::setw (6) << flags.str ();
           // Metric not implemented
           *os << "-" << "      ";
           // Ref ct not implemented
@@ -449,6 +454,8 @@
         }
     }
   *os << std::endl;
+  // Restore the previous ostream state
+  (*os).copyfmt (oldState);
 }
 
 Ptr<Ipv4Route>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv4-header.h ns-3.34/src/internet/model/ipv4-header.h
--- ns-3.33/src/internet/model/ipv4-header.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv4-header.h	2021-07-14 10:31:06.000000000 -0700
@@ -61,7 +61,7 @@
    * \brief DiffServ codepoints
    *
    * The values correspond to the 6-bit DSCP codepoint within the 8-bit
-   * DS field defined in \RFC {2474}.  ECN bits are separately set with the
+   * DS field defined in \RFC{2474}.  ECN bits are separately set with the
    * SetEcn() method.  Codepoints are defined in
    * Assured Forwarding (AF) \RFC{2597},
    * Expedited Forwarding (EF) \RFC{2598}, and
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv4-l3-protocol.h ns-3.34/src/internet/model/ipv4-l3-protocol.h
--- ns-3.33/src/internet/model/ipv4-l3-protocol.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv4-l3-protocol.h	2021-07-14 10:31:06.000000000 -0700
@@ -622,8 +622,7 @@
    */
   bool UpdateDuplicate (Ptr<const Packet> p, const Ipv4Header &header);
   /**
-   * Remove duplicate packet entry
-   * \param [in] iter Iterator into duplicate map to remove
+   * Remove expired duplicates packet entry
    */
   void RemoveDuplicates (void);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv4-static-routing.cc ns-3.34/src/internet/model/ipv4-static-routing.cc
--- ns-3.33/src/internet/model/ipv4-static-routing.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv4-static-routing.cc	2021-07-14 10:31:06.000000000 -0700
@@ -67,12 +67,17 @@
                                       uint32_t metric)
 {
   NS_LOG_FUNCTION (this << network << " " << networkMask << " " << nextHop << " " << interface << " " << metric);
-  Ipv4RoutingTableEntry *route = new Ipv4RoutingTableEntry ();
-  *route = Ipv4RoutingTableEntry::CreateNetworkRouteTo (network,
-                                                        networkMask,
-                                                        nextHop,
-                                                        interface);
-  m_networkRoutes.push_back (make_pair (route,metric));
+
+  Ipv4RoutingTableEntry route = Ipv4RoutingTableEntry::CreateNetworkRouteTo (network,
+                                                                             networkMask,
+                                                                             nextHop,
+                                                                             interface);
+
+  if (!LookupRoute (route, metric))
+    {
+      Ipv4RoutingTableEntry *routePtr = new Ipv4RoutingTableEntry (route);
+      m_networkRoutes.push_back (make_pair (routePtr, metric));
+    }
 }
 
 void 
@@ -82,11 +87,16 @@
                                       uint32_t metric)
 {
   NS_LOG_FUNCTION (this << network << " " << networkMask << " " << interface << " " << metric);
-  Ipv4RoutingTableEntry *route = new Ipv4RoutingTableEntry ();
-  *route = Ipv4RoutingTableEntry::CreateNetworkRouteTo (network,
-                                                        networkMask,
-                                                        interface);
-  m_networkRoutes.push_back (make_pair (route,metric));
+
+  Ipv4RoutingTableEntry route = Ipv4RoutingTableEntry::CreateNetworkRouteTo (network,
+                                                                             networkMask,
+                                                                             interface);
+  if (!LookupRoute (route, metric))
+    {
+      Ipv4RoutingTableEntry *routePtr = new Ipv4RoutingTableEntry (route);
+
+      m_networkRoutes.push_back (make_pair (routePtr, metric));
+    }
 }
 
 void 
@@ -219,6 +229,25 @@
     }
 }
 
+bool
+Ipv4StaticRouting::LookupRoute (const Ipv4RoutingTableEntry &route, uint32_t metric)
+{
+  for (NetworkRoutesI j = m_networkRoutes.begin (); j != m_networkRoutes.end (); j++)
+    {
+      Ipv4RoutingTableEntry* rtentry = j->first;
+
+      if (rtentry->GetDest () == route.GetDest () &&
+          rtentry->GetDestNetworkMask () == route.GetDestNetworkMask () &&
+          rtentry->GetGateway () == route.GetGateway () &&
+          rtentry->GetInterface () == route.GetInterface () &&
+          j->second == metric)
+        {
+          return true;
+        }
+    }
+  return false;
+}
+
 Ptr<Ipv4Route>
 Ipv4StaticRouting::LookupStatic (Ipv4Address dest, Ptr<NetDevice> oif)
 {
@@ -694,6 +723,11 @@
 {
   NS_LOG_FUNCTION (this << stream);
   std::ostream* os = stream->GetStream ();
+  // Copy the current ostream state
+  std::ios oldState (nullptr);
+  oldState.copyfmt (*os);
+
+  *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
 
   *os << "Node: " << m_ipv4->GetObject<Node> ()->GetId ()
       << ", Time: " << Now().As (unit)
@@ -708,11 +742,11 @@
           std::ostringstream dest, gw, mask, flags;
           Ipv4RoutingTableEntry route = GetRoute (j);
           dest << route.GetDest ();
-          *os << std::setiosflags (std::ios::left) << std::setw (16) << dest.str ();
+          *os << std::setw (16) << dest.str ();
           gw << route.GetGateway ();
-          *os << std::setiosflags (std::ios::left) << std::setw (16) << gw.str ();
+          *os << std::setw (16) << gw.str ();
           mask << route.GetDestNetworkMask ();
-          *os << std::setiosflags (std::ios::left) << std::setw (16) << mask.str ();
+          *os << std::setw (16) << mask.str ();
           flags << "U";
           if (route.IsHost ())
             {
@@ -722,8 +756,8 @@
             {
               flags << "GS";
             }
-          *os << std::setiosflags (std::ios::left) << std::setw (6) << flags.str ();
-          *os << std::setiosflags (std::ios::left) << std::setw (7) << GetMetric (j);
+          *os << std::setw (6) << flags.str ();
+          *os << std::setw (7) << GetMetric (j);
           // Ref ct not implemented
           *os << "-" << "      ";
           // Use not implemented
@@ -740,6 +774,8 @@
         }
     }
   *os << std::endl;
+  // Restore the previous ostream state
+  (*os).copyfmt (oldState);
 }
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv4-static-routing.h ns-3.34/src/internet/model/ipv4-static-routing.h
--- ns-3.33/src/internet/model/ipv4-static-routing.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv4-static-routing.h	2021-07-14 10:31:06.000000000 -0700
@@ -377,6 +377,14 @@
   typedef std::list<Ipv4MulticastRoutingTableEntry *>::iterator MulticastRoutesI;
 
   /**
+   * \brief Checks if a route is already present in the forwarding table.
+   * \param route route
+   * \param metric metric of route
+   * \return true if the route/metric is already in the forwarding table
+   */
+  bool LookupRoute (const Ipv4RoutingTableEntry &route, uint32_t metric);
+
+  /**
    * \brief Lookup in the forwarding table for destination.
    * \param dest destination address
    * \param oif output interface if any (put 0 otherwise)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv6-extension-header.h ns-3.34/src/internet/model/ipv6-extension-header.h
--- ns-3.33/src/internet/model/ipv6-extension-header.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv6-extension-header.h	2021-07-14 10:31:06.000000000 -0700
@@ -89,7 +89,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
 
@@ -248,7 +247,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
 
@@ -305,7 +303,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
 
@@ -398,7 +395,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
 
@@ -490,7 +486,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
 
@@ -590,7 +585,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
 
@@ -658,7 +652,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
 
@@ -715,7 +708,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv6.h ns-3.34/src/internet/model/ipv6.h
--- ns-3.33/src/internet/model/ipv6.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv6.h	2021-07-14 10:31:06.000000000 -0700
@@ -186,9 +186,10 @@
    * \brief Add an address on the specified IPv6 interface.
    * \param interface Interface number of an IPv6 interface
    * \param address Ipv6InterfaceAddress address to associate with the underlying IPv6 interface
+   * \param addOnLinkRoute add on-link route to the network (default true)
    * \returns true if the operation succeeded
    */
-  virtual bool AddAddress (uint32_t interface, Ipv6InterfaceAddress address) = 0;
+  virtual bool AddAddress (uint32_t interface, Ipv6InterfaceAddress address, bool addOnLinkRoute = true) = 0;
 
   /**
    * \brief Get number of addresses on specified IPv6 interface.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv6-header.h ns-3.34/src/internet/model/ipv6-header.h
--- ns-3.33/src/internet/model/ipv6-header.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv6-header.h	2021-07-14 10:31:06.000000000 -0700
@@ -249,7 +249,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream& os) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv6-interface-address.cc ns-3.34/src/internet/model/ipv6-interface-address.cc
--- ns-3.33/src/internet/model/ipv6-interface-address.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv6-interface-address.cc	2021-07-14 10:31:06.000000000 -0700
@@ -35,6 +35,7 @@
     m_prefix (Ipv6Prefix ()),
     m_state (TENTATIVE_OPTIMISTIC),
     m_scope (HOST),
+    m_onLink (true),
     m_nsDadUid (0)
 {
   NS_LOG_FUNCTION (this);
@@ -46,6 +47,7 @@
   m_prefix = Ipv6Prefix (64);
   SetAddress (address);
   SetState (TENTATIVE_OPTIMISTIC);
+  m_onLink = true;
   m_nsDadUid = 0;
 }
 
@@ -55,6 +57,17 @@
   m_prefix = prefix;
   SetAddress (address);
   SetState (TENTATIVE_OPTIMISTIC);
+  m_onLink = true;
+  m_nsDadUid = 0;
+}
+
+Ipv6InterfaceAddress::Ipv6InterfaceAddress (Ipv6Address address, Ipv6Prefix prefix, bool onLink)
+{
+  NS_LOG_FUNCTION (this << address << prefix << onLink);
+  m_prefix = prefix;
+  SetAddress (address);
+  SetState (TENTATIVE_OPTIMISTIC);
+  m_onLink = onLink;
   m_nsDadUid = 0;
 }
 
@@ -63,6 +76,7 @@
     m_prefix (o.m_prefix),
     m_state (o.m_state),
     m_scope (o.m_scope),
+    m_onLink (o.m_onLink),
     m_nsDadUid (o.m_nsDadUid)
 {
 }
@@ -193,6 +207,18 @@
   m_nsDadUid = nsDadUid;
 }
 
+bool Ipv6InterfaceAddress::GetOnLink () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_onLink;
+}
+
+void Ipv6InterfaceAddress::SetOnLink (bool onLink)
+{
+  NS_LOG_FUNCTION (this << onLink);
+  m_onLink = onLink;
+}
+
 #if 0
 void Ipv6InterfaceAddress::StartDadTimer (Ptr<Ipv6Interface> interface)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv6-interface-address.h ns-3.34/src/internet/model/ipv6-interface-address.h
--- ns-3.33/src/internet/model/ipv6-interface-address.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv6-interface-address.h	2021-07-14 10:31:06.000000000 -0700
@@ -82,6 +82,14 @@
   Ipv6InterfaceAddress (Ipv6Address address, Ipv6Prefix prefix);
 
   /**
+   * \brief Constructor.
+   * \param address IPv6 address to set
+   * \param prefix IPv6 prefix
+   * \param onLink on-link property
+   */
+  Ipv6InterfaceAddress (Ipv6Address address, Ipv6Prefix prefix, bool onLink);
+
+  /**
    * \brief Copy constructor.
    * \param o object to copy
    */
@@ -153,6 +161,18 @@
    */
   uint32_t GetNsDadUid () const;
 
+  /**
+   * \brief Get the on-link property.
+   * \param onLink the on-link property
+   */
+  void SetOnLink (bool onLink);
+
+  /**
+   * \brief Get the on-link property.
+   * \return on-link flag
+   */
+  bool GetOnLink () const;
+
 #if 0
   /**
    * \brief Start the DAD timer.
@@ -188,6 +208,11 @@
   Scope_e m_scope;
 
   /**
+   * \brief The address belongs to an on-link network.
+   */
+  bool m_onLink;
+
+  /**
    * \brief Equal to operator.
    *
    * \param a the first operand
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv6-l3-protocol.cc ns-3.34/src/internet/model/ipv6-l3-protocol.cc
--- ns-3.33/src/internet/model/ipv6-l3-protocol.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv6-l3-protocol.cc	2021-07-14 10:31:06.000000000 -0700
@@ -310,9 +310,21 @@
 
   Address addr = GetInterface (interface)->GetDevice ()->GetAddress ();
 
-  if (flags & (1 << 6)) /* auto flag */
+  if (!defaultRouter.IsAny())
+    {
+      GetRoutingProtocol ()->NotifyAddRoute (Ipv6Address::GetAny (), Ipv6Prefix ((uint8_t)0), defaultRouter, interface, network);
+    }
+
+  bool onLink = false;
+  if (flags & Icmpv6OptionPrefixInformation::ONLINK)
+    {
+      onLink = true;
+    }
+
+  if (flags & Icmpv6OptionPrefixInformation::AUTADDRCONF) /* auto flag */
     {
       address = Ipv6Address::MakeAutoconfiguredAddress (addr, network);
+      address.SetOnLink (onLink);
 
       /* see if we have already the prefix */
       for (Ipv6AutoconfiguredPrefixListI it = m_prefixes.begin (); it != m_prefixes.end (); ++it)
@@ -328,21 +340,21 @@
 
       /* no prefix found, add autoconfigured address and the prefix */
       NS_LOG_INFO ("Autoconfigured address is :" << address.GetAddress ());
-      AddAddress (interface, address);
-
-      /* add default router
-       * if a previous default route exists, the new ones is simply added
-       */
-      if (!defaultRouter.IsAny())
-        {
-          GetRoutingProtocol ()->NotifyAddRoute (Ipv6Address::GetAny (), Ipv6Prefix ((uint8_t)0), defaultRouter, interface, network);
-        }
+      AddAddress (interface, address, onLink);
 
       Ptr<Ipv6AutoconfiguredPrefix> aPrefix = CreateObject<Ipv6AutoconfiguredPrefix> (m_node, interface, network, mask, preferredTime, validTime, defaultRouter);
       aPrefix->StartPreferredTimer ();
 
       m_prefixes.push_back (aPrefix);
     }
+
+  if (onLink) /* on-link flag */
+    {
+      /* add default router
+       * if a previous default route exists, the new ones is simply added
+       */
+      m_routingProtocol->NotifyAddRoute (network, mask, Ipv6Address::GetAny (), interface);
+    }
 }
 
 void Ipv6L3Protocol::RemoveAutoconfiguredAddress (uint32_t interface, Ipv6Address network, Ipv6Prefix mask, Ipv6Address defaultRouter)
@@ -376,16 +388,24 @@
   GetRoutingProtocol ()->NotifyRemoveRoute (Ipv6Address::GetAny (), Ipv6Prefix ((uint8_t)0), defaultRouter, interface, network);
 }
 
-bool Ipv6L3Protocol::AddAddress (uint32_t i, Ipv6InterfaceAddress address)
+bool Ipv6L3Protocol::AddAddress (uint32_t i, Ipv6InterfaceAddress address, bool addOnLinkRoute)
 {
   NS_LOG_FUNCTION (this << i << address);
   Ptr<Ipv6Interface> interface = GetInterface (i);
+  address.SetOnLink (addOnLinkRoute);
   bool ret = interface->AddAddress (address);
 
   if (m_routingProtocol != 0)
     {
       m_routingProtocol->NotifyAddAddress (i, address);
     }
+
+  if (addOnLinkRoute)
+    {
+      Ipv6Address networkAddress = address.GetAddress ().CombinePrefix (address.GetPrefix ());
+      Ipv6Prefix networkMask = address.GetPrefix ();
+      GetRoutingProtocol ()->NotifyAddRoute (networkAddress, networkMask, Ipv6Address::GetZero (), i);
+    }
   return ret;
 }
 
@@ -1581,5 +1601,54 @@
   return true;
 }
 
+bool Ipv6L3Protocol::ReachabilityHint (uint32_t ipInterfaceIndex, Ipv6Address address)
+{
+  if (ipInterfaceIndex >= m_interfaces.size ())
+    {
+      return false;
+    }
+
+  Ptr<NdiscCache> ndiscCache = m_interfaces[ipInterfaceIndex]->GetNdiscCache ();
+  if (!ndiscCache)
+    {
+      return false;
+    }
+
+  NdiscCache::Entry* entry = ndiscCache->Lookup (address);
+  if (!entry || entry->IsIncomplete ())
+    {
+      return false;
+    }
+
+
+  if (entry->IsReachable ())
+    {
+      entry->UpdateReachableTimer ();
+    }
+  else if (entry->IsPermanent ())
+    {
+      return true;
+    }
+  else if (entry->IsProbe ())
+    {
+      // we just confirm the entry's MAC address to get the waiting packets (if any)
+      std::list<NdiscCache::Ipv6PayloadHeaderPair> waiting = entry->MarkReachable (entry->GetMacAddress ());
+      for (std::list<NdiscCache::Ipv6PayloadHeaderPair>::const_iterator it = waiting.begin (); it != waiting.end (); it++)
+        {
+          ndiscCache->GetInterface ()->Send (it->first, it->second, it->second.GetSourceAddress ());
+        }
+      entry->ClearWaitingPacket ();
+      entry->StartReachableTimer ();
+    }
+  else // STALE OR DELAY
+    {
+      entry->MarkReachable ();
+      entry->StartReachableTimer ();
+    }
+
+
+  return true;
+}
+
 } /* namespace ns3 */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv6-l3-protocol.h ns-3.34/src/internet/model/ipv6-l3-protocol.h
--- ns-3.33/src/internet/model/ipv6-l3-protocol.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv6-l3-protocol.h	2021-07-14 10:31:06.000000000 -0700
@@ -210,10 +210,11 @@
   /**
    * \brief Add an address on interface.
    * \param i interface index
-   * \param address to add
+   * \param address address to add
+   * \param addOnLinkRoute add on-link route to the network (default true)
    * \returns true if the operation succeeded
    */
-  bool AddAddress (uint32_t i, Ipv6InterfaceAddress address);
+  bool AddAddress (uint32_t i, Ipv6InterfaceAddress address, bool addOnLinkRoute = true);
 
   /**
    * \brief Get an address.
@@ -448,6 +449,25 @@
    */
   bool IsRegisteredMulticastAddress (Ipv6Address address, uint32_t interface) const;
 
+  /**
+   * Provides reachability hint for Neighbor Cache Entries from L4-L7 protocols.
+   * 
+   * This function shall be called by L4-L7 protocols when an address is confirmed
+   * to be reachable (i.e., at least a packet send and a reply received).
+   * The net effect is to extend the NCE reachability time if the NCE is in
+   * REACHABLE state, and to mark the NCE as REACHABLE if it is in STALE, PROBE, or
+   * DELAY states. NCEs in INCOMPLETE state are not changed.
+   * 
+   * Note that the IP interface index might not be the same as the NetDevice index.
+   * The correct way to check the IP interface index is by using 
+   * Ipv6::GetInterfaceForDevice ().
+   * 
+   * \param ipInterfaceIndex IP interface index
+   * \param address reachable address
+   * \return true if the NCE has been successfully updated.
+   */
+  bool ReachabilityHint (uint32_t ipInterfaceIndex, Ipv6Address address);
+
 protected:
   /**
    * \brief Dispose object.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv6-list-routing.cc ns-3.34/src/internet/model/ipv6-list-routing.cc
--- ns-3.33/src/internet/model/ipv6-list-routing.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv6-list-routing.cc	2021-07-14 10:31:06.000000000 -0700
@@ -216,7 +216,7 @@
 
   *stream->GetStream () << "Node: " << m_ipv6->GetObject<Node> ()->GetId ()
                         << ", Time: " << Now().As (unit)
-                        << ", Local time: " << GetObject<Node> ()->GetLocalTime ().As (unit)
+                        << ", Local time: " << m_ipv6->GetObject<Node> ()->GetLocalTime ().As (unit)
                         << ", Ipv6ListRouting table" << std::endl;
   for (Ipv6RoutingProtocolList::const_iterator i = m_routingProtocols.begin ();
        i != m_routingProtocols.end (); i++)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv6-option-header.h ns-3.34/src/internet/model/ipv6-option-header.h
--- ns-3.33/src/internet/model/ipv6-option-header.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv6-option-header.h	2021-07-14 10:31:06.000000000 -0700
@@ -99,7 +99,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
 
@@ -181,7 +180,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
 
@@ -239,7 +237,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
 
@@ -308,7 +305,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
 
@@ -389,7 +385,6 @@
   /**
    * \brief Print some information about the packet.
    * \param os output stream
-   * \return info about this packet
    */
   virtual void Print (std::ostream &os) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv6-static-routing.cc ns-3.34/src/internet/model/ipv6-static-routing.cc
--- ns-3.33/src/internet/model/ipv6-static-routing.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv6-static-routing.cc	2021-07-14 10:31:06.000000000 -0700
@@ -83,6 +83,11 @@
 {
   NS_LOG_FUNCTION (this << stream);
   std::ostream* os = stream->GetStream ();
+  // Copy the current ostream state
+  std::ios oldState (nullptr);
+  oldState.copyfmt (*os);
+
+  *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
 
   *os << "Node: " << m_ipv6->GetObject<Node> ()->GetId ()
       << ", Time: " << Now().As (unit)
@@ -97,9 +102,9 @@
           std::ostringstream dest, gw, mask, flags;
           Ipv6RoutingTableEntry route = GetRoute (j);
           dest << route.GetDest () << "/" << int(route.GetDestNetworkPrefix ().GetPrefixLength ());
-          *os << std::setiosflags (std::ios::left) << std::setw (31) << dest.str ();
+          *os << std::setw (31) << dest.str ();
           gw << route.GetGateway ();
-          *os << std::setiosflags (std::ios::left) << std::setw (27) << gw.str ();
+          *os << std::setw (27) << gw.str ();
           flags << "U";
           if (route.IsHost ())
             {
@@ -109,8 +114,8 @@
             {
               flags << "G";
             }
-          *os << std::setiosflags (std::ios::left) << std::setw (5) << flags.str ();
-          *os << std::setiosflags (std::ios::left) << std::setw (4) << GetMetric (j);
+          *os << std::setw (5) << flags.str ();
+          *os << std::setw (4) << GetMetric (j);
           // Ref ct not implemented
           *os << "-" << "   ";
           // Use not implemented
@@ -127,6 +132,8 @@
         }
     }
   *os << std::endl;
+  // Restore the previous ostream state
+  (*os).copyfmt (oldState);
 }
 
 void Ipv6StaticRouting::AddHostRouteTo (Ipv6Address dst, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse, uint32_t metric)
@@ -149,9 +156,14 @@
 void Ipv6StaticRouting::AddNetworkRouteTo (Ipv6Address network, Ipv6Prefix networkPrefix, Ipv6Address nextHop, uint32_t interface, uint32_t metric)
 {
   NS_LOG_FUNCTION (this << network << networkPrefix << nextHop << interface << metric);
-  Ipv6RoutingTableEntry* route = new Ipv6RoutingTableEntry ();
-  *route = Ipv6RoutingTableEntry::CreateNetworkRouteTo (network, networkPrefix, nextHop, interface);
-  m_networkRoutes.push_back (std::make_pair (route, metric));
+
+  Ipv6RoutingTableEntry route = Ipv6RoutingTableEntry::CreateNetworkRouteTo (network, networkPrefix, nextHop, interface);
+
+  if (!LookupRoute (route, metric))
+    {
+      Ipv6RoutingTableEntry* routePtr = new Ipv6RoutingTableEntry (route);
+      m_networkRoutes.push_back (std::make_pair (routePtr, metric));
+    }
 }
 
 void Ipv6StaticRouting::AddNetworkRouteTo (Ipv6Address network, Ipv6Prefix networkPrefix, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse, uint32_t metric)
@@ -162,17 +174,24 @@
       NS_LOG_WARN ("Ipv6StaticRouting::AddNetworkRouteTo - Next hop should be link-local");
     }
 
-  Ipv6RoutingTableEntry* route = new Ipv6RoutingTableEntry ();
-  *route = Ipv6RoutingTableEntry::CreateNetworkRouteTo (network, networkPrefix, nextHop, interface, prefixToUse);
-  m_networkRoutes.push_back (std::make_pair (route, metric));
+  Ipv6RoutingTableEntry route = Ipv6RoutingTableEntry::CreateNetworkRouteTo (network, networkPrefix, nextHop, interface, prefixToUse);
+  if (!LookupRoute (route, metric))
+    {
+      Ipv6RoutingTableEntry* routePtr = new Ipv6RoutingTableEntry (route);
+      m_networkRoutes.push_back (std::make_pair (routePtr, metric));
+    }
 }
 
 void Ipv6StaticRouting::AddNetworkRouteTo (Ipv6Address network, Ipv6Prefix networkPrefix, uint32_t interface, uint32_t metric)
 {
   NS_LOG_FUNCTION (this << network << networkPrefix << interface);
-  Ipv6RoutingTableEntry* route = new Ipv6RoutingTableEntry ();
-  *route = Ipv6RoutingTableEntry::CreateNetworkRouteTo (network, networkPrefix, interface);
-  m_networkRoutes.push_back (std::make_pair (route, metric));
+
+  Ipv6RoutingTableEntry route = Ipv6RoutingTableEntry::CreateNetworkRouteTo (network, networkPrefix, interface);
+  if (!LookupRoute (route, metric))
+    {
+      Ipv6RoutingTableEntry* routePtr = new Ipv6RoutingTableEntry (route);
+      m_networkRoutes.push_back (std::make_pair (routePtr, metric));
+    }
 }
 
 void Ipv6StaticRouting::SetDefaultRoute (Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse, uint32_t metric)
@@ -281,6 +300,25 @@
   return false;
 }
 
+bool Ipv6StaticRouting::LookupRoute (const Ipv6RoutingTableEntry &route, uint32_t metric)
+{
+  for (NetworkRoutesI j = m_networkRoutes.begin (); j != m_networkRoutes.end (); j++)
+    {
+      Ipv6RoutingTableEntry* rtentry = j->first;
+
+      if (rtentry->GetDest () == route.GetDest () &&
+          rtentry->GetDestNetworkPrefix () == route.GetDestNetworkPrefix () &&
+          rtentry->GetGateway () == route.GetGateway () &&
+          rtentry->GetInterface () == route.GetInterface () &&
+          rtentry->GetPrefixToUse () == route.GetPrefixToUse () &&
+          j->second == metric)
+        {
+          return true;
+        }
+    }
+  return false;
+}
+
 Ptr<Ipv6Route> Ipv6StaticRouting::LookupStatic (Ipv6Address dst, Ptr<NetDevice> interface)
 {
   NS_LOG_FUNCTION (this << dst << interface);
@@ -646,18 +684,23 @@
 {
   for (uint32_t j = 0; j < m_ipv6->GetNAddresses (i); j++)
     {
-      if (m_ipv6->GetAddress (i, j).GetAddress () != Ipv6Address ()
-          && m_ipv6->GetAddress (i, j).GetPrefix () != Ipv6Prefix ())
+      Ipv6InterfaceAddress addr = m_ipv6->GetAddress (i, j);
+
+      if (addr.GetAddress () != Ipv6Address ()
+          && addr.GetPrefix () != Ipv6Prefix ())
         {
-          if (m_ipv6->GetAddress (i, j).GetPrefix () == Ipv6Prefix (128))
+          if (addr.GetPrefix () == Ipv6Prefix (128))
             {
               /* host route */
-              AddHostRouteTo (m_ipv6->GetAddress (i, j).GetAddress (), i);
+              AddHostRouteTo (addr.GetAddress (), i);
             }
           else
             {
-              AddNetworkRouteTo (m_ipv6->GetAddress (i, j).GetAddress ().CombinePrefix (m_ipv6->GetAddress (i, j).GetPrefix ()),
-                                 m_ipv6->GetAddress (i, j).GetPrefix (), i);
+              if (addr.GetOnLink ())
+                {
+                  AddNetworkRouteTo (addr.GetAddress ().CombinePrefix (addr.GetPrefix ()),
+                                     addr.GetPrefix (), i);
+                }
             }
         }
     }
@@ -688,14 +731,6 @@
     {
       return;
     }
-
-  Ipv6Address networkAddress = address.GetAddress ().CombinePrefix (address.GetPrefix ());
-  Ipv6Prefix networkMask = address.GetPrefix ();
-
-  if (address.GetAddress () != Ipv6Address () && address.GetPrefix () != Ipv6Prefix ())
-    {
-      AddNetworkRouteTo (networkAddress, networkMask, interface);
-    }
 }
 
 void Ipv6StaticRouting::NotifyRemoveAddress (uint32_t interface, Ipv6InterfaceAddress address)
@@ -730,7 +765,11 @@
 void Ipv6StaticRouting::NotifyAddRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse)
 {
   NS_LOG_INFO (this << dst << mask << nextHop << interface << prefixToUse);
-  if (dst != Ipv6Address::GetZero ())
+  if (nextHop == Ipv6Address::GetZero ())
+    {
+      AddNetworkRouteTo (dst, mask, interface);
+    }
+  else if (dst != Ipv6Address::GetZero ())
     {
       AddNetworkRouteTo (dst, mask, nextHop, interface);
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ipv6-static-routing.h ns-3.34/src/internet/model/ipv6-static-routing.h
--- ns-3.33/src/internet/model/ipv6-static-routing.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ipv6-static-routing.h	2021-07-14 10:31:06.000000000 -0700
@@ -265,6 +265,14 @@
   typedef std::list<Ipv6MulticastRoutingTableEntry *>::iterator MulticastRoutesI;
 
   /**
+   * \brief Checks if a route is already present in the forwarding table.
+   * \param route route
+   * \param metric metric of route
+   * \return true if the route/metric is already in the forwarding table
+   */
+  bool LookupRoute (const Ipv6RoutingTableEntry &route, uint32_t metric);
+
+  /**
    * \brief Lookup in the forwarding table for destination.
    * \param dest destination address
    * \param interface output interface if any (put 0 otherwise)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ndisc-cache.cc ns-3.34/src/internet/model/ndisc-cache.cc
--- ns-3.33/src/internet/model/ndisc-cache.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ndisc-cache.cc	2021-07-14 10:31:06.000000000 -0700
@@ -409,6 +409,12 @@
   m_ipv6Address = ipv6Address;
 }
 
+Ipv6Address NdiscCache::Entry::GetIpv6Address (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_ipv6Address;
+}
+
 Time NdiscCache::Entry::GetLastReachabilityConfirmation () const
 {
   NS_LOG_FUNCTION (this);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ndisc-cache.h ns-3.34/src/internet/model/ndisc-cache.h
--- ns-3.33/src/internet/model/ndisc-cache.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ndisc-cache.h	2021-07-14 10:31:06.000000000 -0700
@@ -23,6 +23,7 @@
 
 #include <stdint.h>
 #include <list>
+#include <unordered_map>
 
 #include "ns3/packet.h"
 #include "ns3/nstime.h"
@@ -30,7 +31,6 @@
 #include "ns3/ipv6-address.h"
 #include "ns3/ptr.h"
 #include "ns3/timer.h"
-#include "ns3/sgi-hashmap.h"
 #include "ns3/output-stream-wrapper.h"
 
 namespace ns3
@@ -343,6 +343,12 @@
      * \param ipv6Address IPv6 address
      */
     void SetIpv6Address (Ipv6Address ipv6Address);
+    
+    /**
+     * \brief Get the IPv6 address.
+     * \returns The IPv6 address
+     */
+    Ipv6Address GetIpv6Address (void) const;
 
     /**
      * \brief Print this entry to the given output stream.
@@ -421,11 +427,11 @@
   /**
    * \brief Neighbor Discovery Cache container
    */
-  typedef sgi::hash_map<Ipv6Address, NdiscCache::Entry *, Ipv6AddressHash> Cache;
+  typedef std::unordered_map<Ipv6Address, NdiscCache::Entry *, Ipv6AddressHash> Cache;
   /**
    * \brief Neighbor Discovery Cache container iterator
    */
-  typedef sgi::hash_map<Ipv6Address, NdiscCache::Entry *, Ipv6AddressHash>::iterator CacheI;
+  typedef std::unordered_map<Ipv6Address, NdiscCache::Entry *, Ipv6AddressHash>::iterator CacheI;
 
   /**
    * \brief A list of Entry.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/nsc-tcp-l4-protocol.cc ns-3.34/src/internet/model/nsc-tcp-l4-protocol.cc
--- ns-3.33/src/internet/model/nsc-tcp-l4-protocol.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/nsc-tcp-l4-protocol.cc	2021-07-14 10:31:06.000000000 -0700
@@ -89,8 +89,12 @@
    *
    * Its also used by the cradle code to add a timestamp to
    * printk/printf/debug output.
+   *
+   * \param [out] sec seconds
+   * \param [out] usec microseconds
+   *
    */
-  virtual void gettime (unsigned int *, unsigned int *);
+  virtual void gettime (unsigned int *sec, unsigned int *usec);
 private:
   Ptr<NscTcpL4Protocol> m_prot; //!< the NSC TCP protocol
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/rip.cc ns-3.34/src/internet/model/rip.cc
--- ns-3.33/src/internet/model/rip.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/rip.cc	2021-07-14 10:31:06.000000000 -0700
@@ -493,10 +493,15 @@
   NS_LOG_FUNCTION (this << stream);
 
   std::ostream* os = stream->GetStream ();
+  // Copy the current ostream state
+  std::ios oldState (nullptr);
+  oldState.copyfmt (*os);
+
+  *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
 
   *os << "Node: " << m_ipv4->GetObject<Node> ()->GetId ()
       << ", Time: " << Now().As (unit)
-      << ", Local time: " << GetObject<Node> ()->GetLocalTime ().As (unit)
+      << ", Local time: " << m_ipv4->GetObject<Node> ()->GetLocalTime ().As (unit)
       << ", IPv4 RIP table" << std::endl;
 
   if (!m_routes.empty ())
@@ -511,11 +516,11 @@
             {
               std::ostringstream dest, gw, mask, flags;
               dest << route->GetDest ();
-              *os << std::setiosflags (std::ios::left) << std::setw (16) << dest.str ();
+              *os << std::setw (16) << dest.str ();
               gw << route->GetGateway ();
-              *os << std::setiosflags (std::ios::left) << std::setw (16) << gw.str ();
+              *os << std::setw (16) << gw.str ();
               mask << route->GetDestNetworkMask ();
-              *os << std::setiosflags (std::ios::left) << std::setw (16) << mask.str ();
+              *os << std::setw (16) << mask.str ();
               flags << "U";
               if (route->IsHost ())
                 {
@@ -525,8 +530,8 @@
                 {
                   flags << "GS";
                 }
-              *os << std::setiosflags (std::ios::left) << std::setw (6) << flags.str ();
-              *os << std::setiosflags (std::ios::left) << std::setw (7) << int(route->GetRouteMetric ());
+              *os << std::setw (6) << flags.str ();
+              *os << std::setw (7) << int(route->GetRouteMetric ());
               // Ref ct not implemented
               *os << "-" << "      ";
               // Use not implemented
@@ -544,6 +549,8 @@
         }
     }
   *os << std::endl;
+  // Restore the previous ostream state
+  (*os).copyfmt (oldState);
 }
 
 void Rip::DoDispose ()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/ripng.cc ns-3.34/src/internet/model/ripng.cc
--- ns-3.33/src/internet/model/ripng.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/ripng.cc	2021-07-14 10:31:06.000000000 -0700
@@ -473,10 +473,11 @@
   NS_LOG_FUNCTION (this << stream);
 
   std::ostream* os = stream->GetStream ();
+  *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
 
   *os << "Node: " << m_ipv6->GetObject<Node> ()->GetId ()
       << ", Time: " << Now().As (unit)
-      << ", Local time: " << GetObject<Node> ()->GetLocalTime ().As (unit)
+      << ", Local time: " << m_ipv6->GetObject<Node> ()->GetLocalTime ().As (unit)
       << ", IPv6 RIPng table" << std::endl;
 
   if (!m_routes.empty ())
@@ -492,9 +493,9 @@
               std::ostringstream dest, gw, mask, flags;
 
               dest << route->GetDest () << "/" << int(route->GetDestNetworkPrefix ().GetPrefixLength ());
-              *os << std::setiosflags (std::ios::left) << std::setw (31) << dest.str ();
+              *os << std::setw (31) << dest.str ();
               gw << route->GetGateway ();
-              *os << std::setiosflags (std::ios::left) << std::setw (27) << gw.str ();
+              *os << std::setw (27) << gw.str ();
               flags << "U";
               if (route->IsHost ())
                 {
@@ -504,8 +505,8 @@
                 {
                   flags << "G";
                 }
-              *os << std::setiosflags (std::ios::left) << std::setw (5) << flags.str ();
-              *os << std::setiosflags (std::ios::left) << std::setw (4) << int(route->GetRouteMetric ());
+              *os << std::setw (5) << flags.str ();
+              *os << std::setw (4) << int(route->GetRouteMetric ());
               // Ref ct not implemented
               *os << "-" << "   ";
               // Use not implemented
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-bbr.cc ns-3.34/src/internet/model/tcp-bbr.cc
--- ns-3.33/src/internet/model/tcp-bbr.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-bbr.cc	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,790 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018 NITK Surathkal
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Vivek Jain <jain.vivek.anand@gmail.com>
+ *          Viyom Mittal <viyommittal@gmail.com>
+ *          Mohit P. Tahiliani <tahiliani@nitk.edu.in>
+ */
+
+#include "tcp-bbr.h"
+
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("TcpBbr");
+NS_OBJECT_ENSURE_REGISTERED (TcpBbr);
+
+const double TcpBbr::PACING_GAIN_CYCLE [] = {5.0 / 4, 3.0 / 4, 1, 1, 1, 1, 1, 1};
+
+TypeId
+TcpBbr::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::TcpBbr")
+    .SetParent<TcpCongestionOps> ()
+    .AddConstructor<TcpBbr> ()
+    .SetGroupName ("Internet")
+    .AddAttribute ("Stream",
+                   "Random number stream (default is set to 4 to align with Linux results)",
+                   UintegerValue (4),
+                   MakeUintegerAccessor (&TcpBbr::SetStream),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("HighGain",
+                   "Value of high gain",
+                   DoubleValue (2.89),
+                   MakeDoubleAccessor (&TcpBbr::m_highGain),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("BwWindowLength",
+                   "Length of bandwidth windowed filter",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&TcpBbr::m_bandwidthWindowLength),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("RttWindowLength",
+                   "Length of RTT windowed filter",
+                   TimeValue (Seconds (10)),
+                   MakeTimeAccessor (&TcpBbr::m_rtPropFilterLen),
+                   MakeTimeChecker ())
+    .AddAttribute ("ProbeRttDuration",
+                   "Time to be spent in PROBE_RTT phase",
+                   TimeValue (MilliSeconds (200)),
+                   MakeTimeAccessor (&TcpBbr::m_probeRttDuration),
+                   MakeTimeChecker ())
+    .AddAttribute ("ExtraAckedRttWindowLength",
+                   "Window length of extra acked window",
+                   UintegerValue (5),
+                   MakeUintegerAccessor (&TcpBbr::m_extraAckedWinRttLength),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("AckEpochAckedResetThresh",
+                   "Max allowed val for m_ackEpochAcked, after which sampling epoch is reset",
+                   UintegerValue (1 << 12),
+                   MakeUintegerAccessor (&TcpBbr::m_ackEpochAckedResetThresh),
+                   MakeUintegerChecker<uint32_t> ())
+  ;
+  return tid;
+}
+
+TcpBbr::TcpBbr ()
+  : TcpCongestionOps ()
+{
+  NS_LOG_FUNCTION (this);
+  m_uv = CreateObject<UniformRandomVariable> ();
+}
+
+TcpBbr::TcpBbr (const TcpBbr &sock)
+  : TcpCongestionOps (sock),
+    m_bandwidthWindowLength (sock.m_bandwidthWindowLength),
+    m_pacingGain (sock.m_pacingGain),
+    m_cWndGain (sock.m_cWndGain),
+    m_highGain (sock.m_highGain),
+    m_isPipeFilled (sock.m_isPipeFilled),
+    m_minPipeCwnd (sock.m_minPipeCwnd),
+    m_roundCount (sock.m_roundCount),
+    m_roundStart (sock.m_roundStart),
+    m_nextRoundDelivered (sock.m_nextRoundDelivered),
+    m_probeRttDuration (sock.m_probeRttDuration),
+    m_probeRtPropStamp (sock.m_probeRtPropStamp),
+    m_probeRttDoneStamp (sock.m_probeRttDoneStamp),
+    m_probeRttRoundDone (sock.m_probeRttRoundDone),
+    m_packetConservation (sock.m_packetConservation),
+    m_priorCwnd (sock.m_priorCwnd),
+    m_idleRestart (sock.m_idleRestart),
+    m_targetCWnd (sock.m_targetCWnd),
+    m_fullBandwidth (sock.m_fullBandwidth),
+    m_fullBandwidthCount (sock.m_fullBandwidthCount),
+    m_rtProp (Time::Max ()),
+    m_sendQuantum (sock.m_sendQuantum),
+    m_cycleStamp (sock.m_cycleStamp),
+    m_cycleIndex (sock.m_cycleIndex),
+    m_rtPropExpired (sock.m_rtPropExpired),
+    m_rtPropFilterLen (sock.m_rtPropFilterLen),
+    m_rtPropStamp (sock.m_rtPropStamp),
+    m_isInitialized (sock.m_isInitialized),
+    m_uv (sock.m_uv),
+    m_delivered (sock.m_delivered),
+    m_appLimited (sock.m_appLimited),  
+    m_txItemDelivered (sock.m_txItemDelivered),  
+    m_extraAckedGain (sock.m_extraAckedGain),
+    m_extraAckedWinRtt (sock.m_extraAckedWinRtt),
+    m_extraAckedWinRttLength (sock.m_extraAckedWinRttLength),
+    m_ackEpochAckedResetThresh (sock.m_ackEpochAckedResetThresh),
+    m_extraAckedIdx (sock.m_extraAckedIdx),
+    m_ackEpochTime (sock.m_ackEpochTime),
+    m_ackEpochAcked (sock.m_ackEpochAcked),
+    m_hasSeenRtt (sock.m_hasSeenRtt)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+const char* const
+TcpBbr::BbrModeName[BBR_PROBE_RTT + 1] =
+{
+  "BBR_STARTUP", "BBR_DRAIN", "BBR_PROBE_BW", "BBR_PROBE_RTT"
+};
+
+void
+TcpBbr::SetStream (uint32_t stream)
+{
+  NS_LOG_FUNCTION (this << stream);
+  m_uv->SetStream (stream);
+}
+
+void
+TcpBbr::InitRoundCounting ()
+{
+  NS_LOG_FUNCTION (this);
+  m_nextRoundDelivered = 0;
+  m_roundStart = false;
+  m_roundCount = 0;
+}
+
+void
+TcpBbr::InitFullPipe ()
+{
+  NS_LOG_FUNCTION (this);
+  m_isPipeFilled = false;
+  m_fullBandwidth = 0;
+  m_fullBandwidthCount = 0;
+}
+
+void
+TcpBbr::InitPacingRate (Ptr<TcpSocketState> tcb)
+{
+  NS_LOG_FUNCTION (this << tcb);
+
+  if (!tcb->m_pacing)
+    {
+      NS_LOG_WARN ("BBR must use pacing");
+      tcb->m_pacing = true;
+    }
+
+  Time rtt;
+  if (tcb->m_minRtt != Time::Max ())
+    {
+      rtt = MilliSeconds (std::max<long int> (tcb->m_minRtt.GetMilliSeconds (), 1));
+      m_hasSeenRtt = true;
+    }
+  else
+    {
+      rtt = MilliSeconds (1);
+    }
+  
+  DataRate nominalBandwidth (tcb->m_cWnd * 8 / rtt.GetSeconds ());
+  tcb->m_pacingRate = DataRate (m_pacingGain * nominalBandwidth.GetBitRate ());
+  m_maxBwFilter = MaxBandwidthFilter_t (m_bandwidthWindowLength,
+                                        DataRate (tcb->m_cWnd * 8 / rtt.GetSeconds ()),
+                                        0);
+}
+
+void
+TcpBbr::EnterStartup ()
+{
+  NS_LOG_FUNCTION (this);
+  SetBbrState (BbrMode_t::BBR_STARTUP);
+  m_pacingGain = m_highGain;
+  m_cWndGain = m_highGain;
+}
+
+void
+TcpBbr::HandleRestartFromIdle (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs)
+{
+  NS_LOG_FUNCTION (this << tcb << rs);
+  if (tcb->m_bytesInFlight.Get () == 0U && rs.m_isAppLimited)
+    {
+      m_idleRestart = true;
+      if (m_state == BbrMode_t::BBR_PROBE_BW)
+        {
+          SetPacingRate (tcb, 1);
+        }
+    }
+}
+
+void
+TcpBbr::SetPacingRate (Ptr<TcpSocketState> tcb, double gain)
+{
+  NS_LOG_FUNCTION (this << tcb << gain);
+  DataRate rate (gain * m_maxBwFilter.GetBest ().GetBitRate ());
+  rate = std::min (rate, tcb->m_maxPacingRate);
+  
+  if (!m_hasSeenRtt && tcb->m_minRtt != Time::Max ())
+    {
+      InitPacingRate (tcb);
+    }
+
+  if (m_isPipeFilled || rate > tcb->m_pacingRate)
+    {
+      tcb->m_pacingRate = rate;
+    }
+}
+
+uint32_t
+TcpBbr::InFlight (Ptr<TcpSocketState> tcb, double gain)
+{
+  NS_LOG_FUNCTION (this << tcb << gain);
+  if (m_rtProp == Time::Max ())
+    {
+      return tcb->m_initialCWnd * tcb->m_segmentSize;
+    }
+  double quanta = 3 * m_sendQuantum;
+  double estimatedBdp = m_maxBwFilter.GetBest () * m_rtProp / 8.0;
+
+  if (m_state == BbrMode_t::BBR_PROBE_BW && m_cycleIndex == 0)
+    {
+      return (gain * estimatedBdp) + quanta + (2 * tcb->m_segmentSize);
+    }
+  return (gain * estimatedBdp) + quanta;
+}
+
+void
+TcpBbr::AdvanceCyclePhase ()
+{
+  NS_LOG_FUNCTION (this);
+  m_cycleStamp = Simulator::Now ();
+  m_cycleIndex = (m_cycleIndex + 1) % GAIN_CYCLE_LENGTH;
+  m_pacingGain = PACING_GAIN_CYCLE [m_cycleIndex];
+}
+
+bool
+TcpBbr::IsNextCyclePhase (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs)
+{
+  NS_LOG_FUNCTION (this << tcb << rs);
+  bool isFullLength = (Simulator::Now () - m_cycleStamp) > m_rtProp;
+  if (m_pacingGain == 1)
+    {
+      return isFullLength;
+    }
+  else if (m_pacingGain > 1)
+    {
+      return isFullLength && (rs.m_bytesLoss > 0 || rs.m_priorInFlight >= InFlight (tcb, m_pacingGain));
+    }
+  else
+    {
+      return isFullLength || rs.m_priorInFlight <= InFlight (tcb, 1);
+    }
+}
+
+void
+TcpBbr::CheckCyclePhase (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs)
+{
+  NS_LOG_FUNCTION (this << tcb << rs);
+  if (m_state == BbrMode_t::BBR_PROBE_BW && IsNextCyclePhase (tcb, rs))
+    {
+      AdvanceCyclePhase ();
+    }
+}
+
+void
+TcpBbr::CheckFullPipe (const TcpRateOps::TcpRateSample &rs)
+{
+  NS_LOG_FUNCTION (this << rs);
+  if (m_isPipeFilled || !m_roundStart || rs.m_isAppLimited)
+    {
+      return;
+    }
+
+  /* Check if Bottleneck bandwidth is still growing*/
+  if (m_maxBwFilter.GetBest ().GetBitRate () >= m_fullBandwidth.GetBitRate () * 1.25)
+    {
+      m_fullBandwidth = m_maxBwFilter.GetBest ();
+      m_fullBandwidthCount = 0;
+      return;
+    }
+
+  m_fullBandwidthCount++;
+  if (m_fullBandwidthCount >= 3)
+    {
+      NS_LOG_DEBUG ("Pipe filled");
+      m_isPipeFilled = true;
+    }
+}
+
+void
+TcpBbr::EnterDrain ()
+{
+  NS_LOG_FUNCTION (this);
+  SetBbrState (BbrMode_t::BBR_DRAIN);
+  m_pacingGain = 1.0 / m_highGain;
+  m_cWndGain = m_highGain;
+}
+
+void
+TcpBbr::EnterProbeBW ()
+{
+  NS_LOG_FUNCTION (this);
+  SetBbrState (BbrMode_t::BBR_PROBE_BW);
+  m_pacingGain = 1;
+  m_cWndGain = 2;
+  m_cycleIndex = GAIN_CYCLE_LENGTH - 1 - (int) m_uv->GetValue (0, 6);
+  AdvanceCyclePhase ();
+}
+
+void
+TcpBbr::CheckDrain (Ptr<TcpSocketState> tcb)
+{
+  NS_LOG_FUNCTION (this << tcb);
+  if (m_state == BbrMode_t::BBR_STARTUP && m_isPipeFilled)
+    {
+      EnterDrain ();
+      tcb->m_ssThresh = InFlight (tcb, 1);
+    }
+
+  if (m_state == BbrMode_t::BBR_DRAIN && tcb->m_bytesInFlight <= InFlight (tcb, 1))
+    {
+      EnterProbeBW ();
+    }
+}
+
+void
+TcpBbr::UpdateRTprop (Ptr<TcpSocketState> tcb)
+{
+  NS_LOG_FUNCTION (this << tcb);
+  m_rtPropExpired = Simulator::Now () > (m_rtPropStamp + m_rtPropFilterLen);
+  if (tcb->m_lastRtt >= Seconds (0) && (tcb->m_lastRtt <= m_rtProp || m_rtPropExpired))
+    {
+      m_rtProp = tcb->m_lastRtt;
+      m_rtPropStamp = Simulator::Now ();
+    }
+}
+
+void
+TcpBbr::EnterProbeRTT ()
+{
+  NS_LOG_FUNCTION (this);
+  SetBbrState (BbrMode_t::BBR_PROBE_RTT);
+  m_pacingGain = 1;
+  m_cWndGain = 1;
+}
+
+void
+TcpBbr::SaveCwnd (Ptr<const TcpSocketState> tcb)
+{
+  NS_LOG_FUNCTION (this << tcb);
+  if (tcb->m_congState != TcpSocketState::CA_RECOVERY && m_state != BbrMode_t::BBR_PROBE_RTT)
+    {
+      m_priorCwnd = tcb->m_cWnd;
+    }
+  else
+    {
+      m_priorCwnd = std::max (m_priorCwnd, tcb->m_cWnd.Get ());
+    }
+}
+
+void
+TcpBbr::RestoreCwnd (Ptr<TcpSocketState> tcb)
+{
+  NS_LOG_FUNCTION (this << tcb);
+  tcb->m_cWnd = std::max (m_priorCwnd, tcb->m_cWnd.Get ());
+}
+
+void
+TcpBbr::ExitProbeRTT ()
+{
+  NS_LOG_FUNCTION (this);
+  if (m_isPipeFilled)
+    {
+      EnterProbeBW ();
+    }
+  else
+    {
+      EnterStartup ();
+    }
+}
+
+void
+TcpBbr::HandleProbeRTT (Ptr<TcpSocketState> tcb)
+{
+  NS_LOG_FUNCTION (this << tcb);
+  m_appLimited = (m_delivered + tcb->m_bytesInFlight.Get ()) ? : 1;
+
+  if (m_probeRttDoneStamp == Seconds (0) && tcb->m_bytesInFlight <= m_minPipeCwnd)
+    {
+      m_probeRttDoneStamp = Simulator::Now () + m_probeRttDuration;
+      m_probeRttRoundDone = false;
+      m_nextRoundDelivered = m_delivered;
+    }
+  else if (m_probeRttDoneStamp != Seconds (0))
+    {
+      if (m_roundStart)
+        {
+          m_probeRttRoundDone = true;
+        }
+      if (m_probeRttRoundDone && Simulator::Now () > m_probeRttDoneStamp)
+        {
+          m_rtPropStamp = Simulator::Now ();
+          RestoreCwnd (tcb);
+          ExitProbeRTT ();
+        }
+    }
+}
+
+void
+TcpBbr::CheckProbeRTT (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs)
+{
+  NS_LOG_FUNCTION (this << tcb);
+  if (m_state != BbrMode_t::BBR_PROBE_RTT && m_rtPropExpired && !m_idleRestart)
+    {
+      EnterProbeRTT ();
+      SaveCwnd (tcb);
+      m_probeRttDoneStamp = Seconds (0);
+    }
+
+  if (m_state == BbrMode_t::BBR_PROBE_RTT)
+    {
+      HandleProbeRTT (tcb);
+    }
+
+  if (rs.m_delivered)
+    {
+      m_idleRestart = false;
+    }
+}
+
+void
+TcpBbr::SetSendQuantum (Ptr<TcpSocketState> tcb)
+{
+  NS_LOG_FUNCTION (this << tcb);
+  m_sendQuantum = 1 * tcb->m_segmentSize;
+}
+
+void
+TcpBbr::UpdateTargetCwnd (Ptr<TcpSocketState> tcb)
+{
+  NS_LOG_FUNCTION (this << tcb);
+  m_targetCWnd = InFlight (tcb, m_cWndGain) + AckAggregationCwnd ();
+}
+
+uint32_t
+TcpBbr::AckAggregationCwnd ()
+{
+  uint32_t maxAggrBytes; // MaxBW * 0.1 secs
+  uint32_t aggrCwndBytes = 0;
+
+  if (m_extraAckedGain && m_isPipeFilled)
+    {
+      maxAggrBytes = m_maxBwFilter.GetBest ().GetBitRate () / (10 * 8);
+      aggrCwndBytes = m_extraAckedGain * std::max (m_extraAcked[0], m_extraAcked[1]);
+      aggrCwndBytes = std::min (aggrCwndBytes, maxAggrBytes);
+    }
+  return aggrCwndBytes;
+}
+
+void
+TcpBbr::UpdateAckAggregation (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs)
+{
+  uint32_t expectedAcked, extraAck;
+  uint32_t epochProp;
+
+  if (!m_extraAckedGain || rs.m_ackedSacked <= 0 || rs.m_delivered < 0)
+    {
+      return;
+    }
+
+  if (m_roundStart)
+    {
+      m_extraAckedWinRtt = std::min<uint32_t> (31, m_extraAckedWinRtt + 1);
+      if (m_extraAckedWinRtt >= m_extraAckedWinRttLength)
+        {
+          m_extraAckedWinRtt = 0;
+          m_extraAckedIdx = m_extraAckedIdx ? 0 : 1;
+          m_extraAcked[m_extraAckedIdx] = 0;
+        }
+    }
+
+  epochProp = Simulator::Now ().GetSeconds () - m_ackEpochTime.GetSeconds ();
+  expectedAcked = m_maxBwFilter.GetBest ().GetBitRate () * epochProp / 8;
+
+  if (m_ackEpochAcked <= expectedAcked ||
+      (m_ackEpochAcked + rs.m_ackedSacked >= m_ackEpochAckedResetThresh))
+    {
+      m_ackEpochAcked = 0;
+      m_ackEpochTime = Simulator::Now ();
+      expectedAcked = 0;
+    }
+
+  m_ackEpochAcked = m_ackEpochAcked + rs.m_ackedSacked;
+  extraAck = m_ackEpochAcked - expectedAcked;
+  extraAck = std::min (extraAck, tcb->m_cWnd.Get ());
+
+  if (extraAck > m_extraAcked[m_extraAckedIdx])
+    {
+      m_extraAcked[m_extraAckedIdx] = extraAck;
+    }
+}
+
+bool
+TcpBbr::ModulateCwndForRecovery (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs)
+{
+  NS_LOG_FUNCTION (this << tcb << rs);
+  if (rs.m_bytesLoss > 0)
+    {
+      tcb->m_cWnd = std::max ((int) tcb->m_cWnd.Get () - (int) rs.m_bytesLoss, (int) tcb->m_segmentSize);
+    }
+
+  if (m_packetConservation)
+    {
+      tcb->m_cWnd = std::max (tcb->m_cWnd.Get (), tcb->m_bytesInFlight.Get () + rs.m_ackedSacked);
+      return true;
+    }
+  return false;
+}
+
+void
+TcpBbr::ModulateCwndForProbeRTT (Ptr<TcpSocketState> tcb)
+{
+  NS_LOG_FUNCTION (this << tcb);
+  if (m_state == BbrMode_t::BBR_PROBE_RTT)
+    {
+      tcb->m_cWnd = std::min (tcb->m_cWnd.Get (), m_minPipeCwnd);
+    }
+}
+
+void
+TcpBbr::SetCwnd (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs)
+{
+  NS_LOG_FUNCTION (this << tcb << rs);
+
+  if (!rs.m_ackedSacked)
+    {
+      goto done;
+    }
+
+  if (tcb->m_congState == TcpSocketState::CA_RECOVERY)
+    {
+      if (ModulateCwndForRecovery (tcb, rs)) 
+        {
+          goto done;
+        }
+    }
+
+    UpdateTargetCwnd (tcb);
+
+  if (m_isPipeFilled)
+    {
+      tcb->m_cWnd = std::min (tcb->m_cWnd.Get () + (uint32_t) rs.m_ackedSacked, m_targetCWnd);
+    }
+  else if (tcb->m_cWnd < m_targetCWnd || m_delivered < tcb->m_initialCWnd * tcb->m_segmentSize)
+    {
+      tcb->m_cWnd = tcb->m_cWnd.Get () + rs.m_ackedSacked;
+    }
+  tcb->m_cWnd = std::max (tcb->m_cWnd.Get (), m_minPipeCwnd);
+  
+done:
+  ModulateCwndForProbeRTT (tcb);
+}
+
+void
+TcpBbr::UpdateRound (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs)
+{
+  NS_LOG_FUNCTION (this << tcb << rs);
+  if (rs.m_priorDelivered >= m_nextRoundDelivered)
+    {
+      m_nextRoundDelivered = m_delivered;
+      m_roundCount++;
+      m_roundStart = true;
+      m_packetConservation = false;
+    }
+  else
+    {
+      m_roundStart = false;
+    }
+}
+
+void
+TcpBbr::UpdateBtlBw (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs)
+{
+  NS_LOG_FUNCTION (this << tcb << rs);
+
+  if (rs.m_deliveryRate == 0)
+    {
+      return;
+    }
+
+  UpdateRound (tcb, rs);
+
+  if (rs.m_deliveryRate >= m_maxBwFilter.GetBest () || !rs.m_isAppLimited)
+    {
+      m_maxBwFilter.Update (rs.m_deliveryRate, m_roundCount);
+    }
+}
+
+void
+TcpBbr::UpdateModelAndState (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs)
+{
+  NS_LOG_FUNCTION (this << tcb << rs);
+  UpdateBtlBw (tcb, rs);
+  UpdateAckAggregation (tcb, rs);
+  CheckCyclePhase (tcb, rs);
+  CheckFullPipe (rs);
+  CheckDrain (tcb);
+  UpdateRTprop (tcb);
+  CheckProbeRTT (tcb, rs);
+}
+
+void
+TcpBbr::UpdateControlParameters (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs)
+{
+  NS_LOG_FUNCTION (this << tcb << rs);
+  SetPacingRate (tcb, m_pacingGain);
+  SetSendQuantum (tcb);
+  SetCwnd (tcb, rs);
+}
+
+void
+TcpBbr::SetBbrState (BbrMode_t mode)
+{
+  NS_LOG_FUNCTION (this << mode);
+  NS_LOG_DEBUG (Simulator::Now () << " Changing from " << BbrModeName[m_state] << " to " << BbrModeName[mode]);
+  m_state = mode;
+}
+
+uint32_t
+TcpBbr::GetBbrState ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_state;
+}
+
+double
+TcpBbr::GetCwndGain ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_cWndGain;
+}
+
+double
+TcpBbr::GetPacingGain ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_pacingGain;
+}
+
+std::string
+TcpBbr::GetName () const
+{
+  return "TcpBbr";
+}
+
+bool
+TcpBbr::HasCongControl () const
+{
+  NS_LOG_FUNCTION (this);
+  return true;
+}
+
+void
+TcpBbr::CongControl (Ptr<TcpSocketState> tcb,
+                     const TcpRateOps::TcpRateConnection &rc,
+                     const TcpRateOps::TcpRateSample &rs)
+{
+  NS_LOG_FUNCTION (this << tcb << rs);
+  m_delivered = rc.m_delivered;
+  m_txItemDelivered = rc.m_txItemDelivered;
+  UpdateModelAndState (tcb, rs);
+  UpdateControlParameters (tcb, rs);
+}
+
+void
+TcpBbr::CongestionStateSet (Ptr<TcpSocketState> tcb,
+                            const TcpSocketState::TcpCongState_t newState)
+{
+  NS_LOG_FUNCTION (this << tcb << newState);
+  if (newState == TcpSocketState::CA_OPEN && !m_isInitialized)
+    {
+      NS_LOG_DEBUG ("CongestionStateSet triggered to CA_OPEN :: " << newState);
+      m_rtProp = tcb->m_lastRtt.Get () != Time::Max () ? tcb->m_lastRtt.Get () : Time::Max ();
+      m_rtPropStamp = Simulator::Now ();
+      m_priorCwnd = tcb->m_cWnd;
+      tcb->m_ssThresh = tcb->m_initialSsThresh;
+      m_targetCWnd = tcb->m_cWnd;
+      m_minPipeCwnd = 4 * tcb->m_segmentSize;
+      m_sendQuantum = 1 * tcb->m_segmentSize;
+      
+      InitRoundCounting ();
+      InitFullPipe ();
+      EnterStartup ();      
+      InitPacingRate (tcb);
+      m_ackEpochTime = Simulator::Now();
+      m_extraAckedWinRtt = 0;
+      m_extraAckedIdx = 0;
+      m_ackEpochAcked = 0;
+      m_extraAcked[0] = 0;
+      m_extraAcked[1] = 0;
+      m_isInitialized = true;
+    }
+  else if (newState == TcpSocketState::CA_LOSS)
+    {
+      NS_LOG_DEBUG ("CongestionStateSet triggered to CA_LOSS :: " << newState);
+      SaveCwnd (tcb);      
+      m_roundStart = true;
+    }
+  else if (newState == TcpSocketState::CA_RECOVERY)
+    {
+      NS_LOG_DEBUG ("CongestionStateSet triggered to CA_RECOVERY :: " << newState);
+      SaveCwnd (tcb);
+      tcb->m_cWnd = tcb->m_bytesInFlight.Get () + std::max (tcb->m_lastAckedSackedBytes, tcb->m_segmentSize);
+      m_packetConservation = true;
+    }
+}
+
+void
+TcpBbr::CwndEvent (Ptr<TcpSocketState> tcb,
+                   const TcpSocketState::TcpCAEvent_t event)
+{
+  NS_LOG_FUNCTION (this << tcb << event);
+  if (event == TcpSocketState::CA_EVENT_COMPLETE_CWR)
+    {
+      NS_LOG_DEBUG ("CwndEvent triggered to CA_EVENT_COMPLETE_CWR :: " << event);
+      m_packetConservation = false;
+      RestoreCwnd (tcb);
+    }
+  else if (event == TcpSocketState::CA_EVENT_TX_START && m_appLimited )
+    {
+      NS_LOG_DEBUG ("CwndEvent triggered to CA_EVENT_TX_START :: " << event);
+      m_idleRestart = true;
+      m_ackEpochTime = Simulator::Now ();
+      m_ackEpochAcked = 0;
+      if (m_state == BbrMode_t::BBR_PROBE_BW)
+        {
+          SetPacingRate (tcb, 1);
+        }
+      else if (m_state == BbrMode_t::BBR_PROBE_RTT)
+        {
+          if (m_probeRttRoundDone && Simulator::Now () > m_probeRttDoneStamp)
+            {
+              m_rtPropStamp = Simulator::Now ();
+              RestoreCwnd (tcb);
+              ExitProbeRTT ();
+            }
+        }
+    }
+}
+
+uint32_t
+TcpBbr::GetSsThresh (Ptr<const TcpSocketState> tcb, uint32_t bytesInFlight)
+{
+  NS_LOG_FUNCTION (this << tcb << bytesInFlight);
+  SaveCwnd (tcb);
+  return tcb->m_ssThresh;
+}
+
+Ptr<TcpCongestionOps>
+TcpBbr::Fork (void)
+{
+  return CopyObject<TcpBbr> (this);
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-bbr.h ns-3.34/src/internet/model/tcp-bbr.h
--- ns-3.33/src/internet/model/tcp-bbr.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-bbr.h	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,388 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018 NITK Surathkal
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Vivek Jain <jain.vivek.anand@gmail.com>
+ *          Viyom Mittal <viyommittal@gmail.com>
+ *          Mohit P. Tahiliani <tahiliani@nitk.edu.in>
+ */
+
+#ifndef TCPBBR_H
+#define TCPBBR_H
+
+#include "ns3/tcp-congestion-ops.h"
+#include "ns3/traced-value.h"
+#include "ns3/data-rate.h"
+#include "ns3/random-variable-stream.h"
+#include "ns3/windowed-filter.h"
+
+class TcpBbrCheckGainValuesTest;
+
+namespace ns3 {
+
+class TcpBbr : public TcpCongestionOps
+{
+public:
+  /**
+   * \brief The number of phases in the BBR ProbeBW gain cycle.
+   */
+  static const uint8_t GAIN_CYCLE_LENGTH = 8;
+
+  /**
+   * \brief BBR uses an eight-phase cycle with the given pacing_gain value
+   * in the BBR ProbeBW gain cycle.
+   */
+  const static double PACING_GAIN_CYCLE [];
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  /**
+   * \brief Constructor
+   */
+  TcpBbr ();
+
+  /**
+   * Copy constructor.
+   * \param sock The socket to copy from.
+   */
+  TcpBbr (const TcpBbr &sock);
+
+  /**
+   * \brief BBR has the following 4 modes for deciding how fast to send:
+   */
+  typedef enum
+  {
+    BBR_STARTUP,        /**< Ramp up sending rate rapidly to fill pipe */
+    BBR_DRAIN,          /**< Drain any queue created during startup */
+    BBR_PROBE_BW,       /**< Discover, share bw: pace around estimated bw */
+    BBR_PROBE_RTT,      /**< Cut inflight to min to probe min_rtt */
+  } BbrMode_t;
+
+  typedef WindowedFilter<DataRate,
+                         MaxFilter<DataRate>,
+                         uint32_t,
+                         uint32_t>
+  MaxBandwidthFilter_t; //!< Definition of max bandwidth filter.
+
+  /**
+   * \brief Literal names of BBR mode for use in log messages
+   */
+  static const char* const BbrModeName[BBR_PROBE_RTT + 1];
+
+  /**
+   * Assign a fixed random variable stream number to the random variables
+   * used by this model.
+   *
+   * \param stream first stream index to use
+   */
+  virtual void SetStream (uint32_t stream);
+
+  virtual std::string GetName () const;
+  virtual bool HasCongControl () const;
+  virtual void CongControl (Ptr<TcpSocketState> tcb,
+                            const TcpRateOps::TcpRateConnection &rc,
+                            const TcpRateOps::TcpRateSample &rs);
+  virtual void CongestionStateSet (Ptr<TcpSocketState> tcb,
+                                   const TcpSocketState::TcpCongState_t newState);
+  virtual void CwndEvent (Ptr<TcpSocketState> tcb,
+                          const TcpSocketState::TcpCAEvent_t event);
+  virtual uint32_t GetSsThresh (Ptr<const TcpSocketState> tcb,
+                                uint32_t bytesInFlight);
+  virtual Ptr<TcpCongestionOps> Fork ();
+
+protected:
+  /**
+   * \brief TcpBbrCheckGainValuesTest friend class (for tests).
+   * \relates TcpBbrCheckGainValuesTest
+   */
+  friend class TcpBbrCheckGainValuesTest;
+
+  /**
+   * \brief Advances pacing gain using cycle gain algorithm, while in BBR_PROBE_BW state
+   */
+  void AdvanceCyclePhase ();
+
+  /**
+   * \brief Checks whether to advance pacing gain in BBR_PROBE_BW state,
+   *  and if allowed calls AdvanceCyclePhase ()
+   * \param tcb the socket state.
+   * \param rs rate sample.
+   */
+  void CheckCyclePhase (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs);
+
+  /**
+   * \brief Checks whether its time to enter BBR_DRAIN or BBR_PROBE_BW state
+   * \param tcb the socket state.
+   */
+  void CheckDrain (Ptr<TcpSocketState> tcb);
+
+  /**
+   * \brief Identifies whether pipe or BDP is already full
+   * \param rs rate sample.
+   */
+  void CheckFullPipe (const TcpRateOps::TcpRateSample &rs);
+
+  /**
+   * \brief This method handles the steps related to the ProbeRTT state
+   * \param tcb the socket state.
+   * \param rs rate sample.
+   */
+  void CheckProbeRTT (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs);
+
+  /**
+   * \brief Updates variables specific to BBR_DRAIN state
+   */
+  void EnterDrain ();
+
+  /**
+   * \brief Updates variables specific to BBR_PROBE_BW state
+   */
+  void EnterProbeBW ();
+
+  /**
+   * \brief Updates variables specific to BBR_PROBE_RTT state
+   */
+  void EnterProbeRTT ();
+
+  /**
+   * \brief Updates variables specific to BBR_STARTUP state
+   */
+  void EnterStartup ();
+
+  /**
+   * \brief Called on exiting from BBR_PROBE_RTT state, it eithers invoke EnterProbeBW () or EnterStartup ()
+   */
+  void ExitProbeRTT ();
+
+  /**
+   * \brief Gets BBR state.
+   * \return returns BBR state.
+   */
+  uint32_t GetBbrState ();
+
+  /**
+   * \brief Gets current pacing gain.
+   * \return returns current pacing gain.
+   */
+  double GetPacingGain ();
+
+  /**
+   * \brief Gets current cwnd gain.
+   * \return returns current cwnd gain.
+   */
+  double GetCwndGain ();
+
+  /**
+   * \brief Handles the steps for BBR_PROBE_RTT state.
+   * \param tcb the socket state.
+   */
+  void HandleProbeRTT (Ptr<TcpSocketState> tcb);
+
+  /**
+   * \brief Updates pacing rate if socket is restarting from idle state.
+   * \param tcb the socket state.
+   * \param rs rate sample.
+   */
+  void HandleRestartFromIdle (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs);
+
+  /**
+   * \brief Estimates the target value for congestion window
+   * \param tcb  the socket state.
+   * \param gain cwnd gain.
+   * \return returns congestion window based on max bandwidth and min RTT.
+   */
+  uint32_t InFlight (Ptr<TcpSocketState> tcb, double gain);
+
+  /**
+   * \brief Intializes the full pipe estimator.
+   */
+  void InitFullPipe ();
+
+  /**
+   * \brief Intializes the pacing rate.
+   * \param tcb  the socket state.
+   */
+  void InitPacingRate (Ptr<TcpSocketState> tcb);
+
+  /**
+   * \brief Intializes the round counting related variables.
+   */
+  void InitRoundCounting ();
+
+  /**
+   * \brief Checks whether to move to next value of pacing gain while in BBR_PROBE_BW.
+   * \param tcb the socket state.
+   * \param rs  rate sample.
+   * \returns true if want to move to next value otherwise false.
+   */
+  bool IsNextCyclePhase (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs);
+
+  /**
+   * \brief Modulates congestion window in BBR_PROBE_RTT.
+   * \param tcb the socket state.
+   */
+  void ModulateCwndForProbeRTT (Ptr<TcpSocketState> tcb);
+
+  /**
+   * \brief Modulates congestion window in CA_RECOVERY.
+   * \param tcb the socket state.
+   * \param rs rate sample.
+   * \return true if congestion window is updated in CA_RECOVERY.
+   */
+  bool ModulateCwndForRecovery (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs);
+
+  /**
+   * \brief Helper to restore the last-known good congestion window
+   * \param tcb the socket state.
+   */
+  void RestoreCwnd (Ptr<TcpSocketState> tcb);
+
+  /**
+   * \brief Helper to remember the last-known good congestion window or
+   *        the latest congestion window unmodulated by loss recovery or ProbeRTT.
+   * \param tcb the socket state.
+   */
+  void SaveCwnd (Ptr<const TcpSocketState> tcb);
+
+  /**
+   * \brief Updates congestion window based on the network model.
+   * \param tcb the socket state.
+   * \param rs  rate sample
+   */
+  void SetCwnd (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs);
+
+  /**
+   * \brief Updates pacing rate based on network model.
+   * \param tcb the socket state.
+   * \param gain pacing gain.
+   */
+  void SetPacingRate (Ptr<TcpSocketState> tcb, double gain);
+
+  /**
+   * \brief Updates send quantum based on the network model.
+   * \param tcb the socket state.
+   */
+  void SetSendQuantum (Ptr<TcpSocketState> tcb);
+
+  /**
+   * \brief Updates maximum bottleneck.
+   * \param tcb the socket state.
+   * \param rs rate sample.
+   */
+  void UpdateBtlBw (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs);
+
+  /**
+   * \brief Updates control parameters congestion windowm, pacing rate, send quantum.
+   * \param tcb the socket state.
+   * \param rs rate sample.
+   */
+  void UpdateControlParameters (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs);
+
+  /**
+   * \brief Updates BBR network model (Maximum bandwidth and minimum RTT).
+   * \param tcb the socket state.
+   * \param rs rate sample.
+   */
+  void UpdateModelAndState (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs);
+
+  /**
+   * \brief Updates round counting related variables.
+   * \param tcb the socket state.
+   * \param rs rate sample.
+   */
+  void UpdateRound (Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs);
+
+  /**
+   * \brief Updates minimum RTT.
+   * \param tcb the socket state.
+   */
+  void UpdateRTprop (Ptr<TcpSocketState> tcb);
+
+  /**
+   * \brief Updates target congestion window.
+   * \param tcb the socket state.
+   */
+  void UpdateTargetCwnd (Ptr<TcpSocketState> tcb);
+
+  /**
+   * \brief Sets BBR state.
+   * \param state BBR state.
+   */
+  void SetBbrState (BbrMode_t state);
+
+  /**
+  * \brief Find Cwnd increment based on ack aggregation.
+  * \return uint32_t aggregate cwnd.
+  */
+  uint32_t AckAggregationCwnd();
+
+  /**
+  * \brief Estimates max degree of aggregation.
+  * \param tcb the socket state.
+  * \param rs rate sample.
+  */
+  void UpdateAckAggregation(Ptr<TcpSocketState> tcb, const TcpRateOps::TcpRateSample &rs);
+
+private:
+  BbrMode_t   m_state        {BbrMode_t::BBR_STARTUP};           //!< Current state of BBR state machine
+  MaxBandwidthFilter_t   m_maxBwFilter;                          //!< Maximum bandwidth filter
+  uint32_t    m_bandwidthWindowLength       {0};                 //!< A constant specifying the length of the BBR.BtlBw max filter window, default 10 packet-timed round trips.
+  double      m_pacingGain                  {0};                 //!< The dynamic pacing gain factor
+  double      m_cWndGain                    {0};                 //!< The dynamic congestion window gain factor
+  double      m_highGain                    {0};                 //!< A constant specifying highest gain factor, default is 2.89
+  bool        m_isPipeFilled                {false};             //!< A boolean that records whether BBR has filled the pipe
+  uint32_t    m_minPipeCwnd                 {0};                 //!< The minimal congestion window value BBR tries to target, default 4 Segment size
+  uint32_t    m_roundCount                  {0};                 //!< Count of packet-timed round trips
+  bool        m_roundStart                  {false};             //!< A boolean that BBR sets to true once per packet-timed round trip
+  uint32_t    m_nextRoundDelivered          {0};                 //!< Denotes the end of a packet-timed round trip
+  Time        m_probeRttDuration            {MilliSeconds (200)};//!< A constant specifying the minimum duration for which ProbeRTT state, default 200 millisecs
+  Time        m_probeRtPropStamp            {Seconds (0)};       //!< The wall clock time at which the current BBR.RTProp sample was obtained.
+  Time        m_probeRttDoneStamp           {Seconds (0)};       //!< Time to exit from BBR_PROBE_RTT state
+  bool        m_probeRttRoundDone           {false};             //!< True when it is time to exit BBR_PROBE_RTT
+  bool        m_packetConservation          {false};             //!< Enable/Disable packet conservation mode
+  uint32_t    m_priorCwnd                   {0};                 //!< The last-known good congestion window
+  bool        m_idleRestart                 {false};             //!< When restarting from idle, set it true
+  uint32_t    m_targetCWnd                  {0};                 //!< Target value for congestion window, adapted to the estimated BDP
+  DataRate    m_fullBandwidth               {0};                 //!< Value of full bandwidth recorded
+  uint32_t    m_fullBandwidthCount          {0};                 //!< Count of full bandwidth recorded consistently
+  Time        m_rtProp                      {Time::Max ()};      //!< Estimated two-way round-trip propagation delay of the path, estimated from the windowed minimum recent round-trip delay sample.
+  uint32_t    m_sendQuantum                 {0};                 //!< The maximum size of a data aggregate scheduled and transmitted together
+  Time        m_cycleStamp                  {Seconds (0)};       //!< Last time gain cycle updated
+  uint32_t    m_cycleIndex                  {0};                 //!< Current index of gain cycle
+  bool        m_rtPropExpired               {false};             //!< A boolean recording whether the BBR.RTprop has expired
+  Time        m_rtPropFilterLen             {Seconds (10)};      //!< A constant specifying the length of the RTProp min filter window, default 10 secs.
+  Time        m_rtPropStamp                 {Seconds (0)};       //!< The wall clock time at which the current BBR.RTProp sample was obtained
+  bool        m_isInitialized               {false};             //!< Set to true after first time initializtion variables
+  Ptr<UniformRandomVariable> m_uv           {nullptr};           //!< Uniform Random Variable
+  uint64_t    m_delivered                   {0};                 //!< The total amount of data in bytes delivered so far
+  uint32_t    m_appLimited                  {0};                 //!< The index of the last transmitted packet marked as application-limited
+  uint32_t    m_txItemDelivered             {0};                 //!< The number of bytes already delivered at the time of new packet transmission
+  uint32_t    m_extraAckedGain              {1};                 //!< Gain factor for adding extra ack to cwnd
+  uint32_t    m_extraAcked [2]              {0, 0};              //!< Maximum excess data acked in epoch
+  uint32_t    m_extraAckedWinRtt            {0};                 //!< Age of extra acked in rtt
+  uint32_t    m_extraAckedWinRttLength      {5};                 //!< Window length of extra acked window
+  uint32_t    m_ackEpochAckedResetThresh    {1 << 17};           //!< Max allowed val for m_ackEpochAcked, after which sampling epoch is reset 
+  uint32_t    m_extraAckedIdx               {0};                 //!< Current index in extra acked array
+  Time        m_ackEpochTime                {Seconds(0)};        //!< Starting of ACK sampling epoch time
+  uint32_t    m_ackEpochAcked               {0};                 //!< Bytes ACked in sampling epoch
+  bool        m_hasSeenRtt                  {false};             //!< Have we seen RTT sample yet?
+};
+
+} // namespace ns3
+#endif // TCPBBR_H
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-cubic.h ns-3.34/src/internet/model/tcp-cubic.h
--- ns-3.33/src/internet/model/tcp-cubic.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-cubic.h	2021-07-14 10:31:06.000000000 -0700
@@ -77,6 +77,11 @@
   static TypeId GetTypeId (void);
 
   TcpCubic ();
+
+  /**
+   * Copy constructor
+   * \param sock Socket to copy
+   */
   TcpCubic (const TcpCubic& sock);
 
   virtual std::string GetName () const;
@@ -133,13 +138,20 @@
 private:
   /**
    * \brief Reset HyStart parameters
+   * \param tcb Transmission Control Block of the connection
    */
   void HystartReset (Ptr<const TcpSocketState> tcb);
 
+  /**
+   * \brief Reset Cubic parameters
+   * \param tcb Transmission Control Block of the connection
+   */
   void CubicReset (Ptr<const TcpSocketState> tcb);
 
   /**
    * \brief Cubic window update after a new ack received
+   * \param tcb Transmission Control Block of the connection
+   * \returns the congestion window update counter
    */
   uint32_t Update (Ptr<TcpSocketState> tcb);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-l4-protocol.cc ns-3.34/src/internet/model/tcp-l4-protocol.cc
--- ns-3.33/src/internet/model/tcp-l4-protocol.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-l4-protocol.cc	2021-07-14 10:31:06.000000000 -0700
@@ -42,6 +42,7 @@
 #include "tcp-socket-factory-impl.h"
 #include "tcp-socket-base.h"
 #include "tcp-congestion-ops.h"
+#include "tcp-cubic.h"
 #include "tcp-recovery-ops.h"
 #include "tcp-prr-recovery.h"
 #include "rtt-estimator.h"
@@ -79,7 +80,7 @@
                    MakeTypeIdChecker ())
     .AddAttribute ("SocketType",
                    "Socket type of TCP objects.",
-                   TypeIdValue (TcpNewReno::GetTypeId ()),
+                   TypeIdValue (TcpCubic::GetTypeId ()),
                    MakeTypeIdAccessor (&TcpL4Protocol::m_congestionTypeId),
                    MakeTypeIdChecker ())
     .AddAttribute ("RecoveryType",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-linux-reno.cc ns-3.34/src/internet/model/tcp-linux-reno.cc
--- ns-3.33/src/internet/model/tcp-linux-reno.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-linux-reno.cc	2021-07-14 10:31:06.000000000 -0700
@@ -77,6 +77,13 @@
   NS_LOG_FUNCTION (this << tcb << segmentsAcked);
 
   uint32_t w = tcb->m_cWnd / tcb->m_segmentSize;
+
+  // Floor w to 1 if w == 0 
+  if (w == 0)
+    {
+      w = 1;
+    }
+
   NS_LOG_DEBUG ("w in segments " << w << " m_cWndCnt " << m_cWndCnt << " segments acked " << segmentsAcked);
   if (m_cWndCnt >= w)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-linux-reno.h ns-3.34/src/internet/model/tcp-linux-reno.h
--- ns-3.33/src/internet/model/tcp-linux-reno.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-linux-reno.h	2021-07-14 10:31:06.000000000 -0700
@@ -55,7 +55,18 @@
   virtual Ptr<TcpCongestionOps> Fork ();
 
 protected:
+  /**
+   * Slow start phase handler
+   * \param tcb Transmission Control Block of the connection
+   * \param segmentsAcked count of segments acked
+   * \return Number of segments acked minus the difference between the receiver and sender Cwnd
+   */
   virtual uint32_t SlowStart (Ptr<TcpSocketState> tcb, uint32_t segmentsAcked);
+  /**
+   * Congestion avoidance phase handler
+   * \param tcb Transmission Control Block of the connection
+   * \param segmentsAcked count of segments acked
+   */
   virtual void CongestionAvoidance (Ptr<TcpSocketState> tcb, uint32_t segmentsAcked);
 
 private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-rate-ops.h ns-3.34/src/internet/model/tcp-rate-ops.h
--- ns-3.33/src/internet/model/tcp-rate-ops.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-rate-ops.h	2021-07-14 10:31:06.000000000 -0700
@@ -75,7 +75,7 @@
 
   /**
    * \brief If a gap is detected between sends, it means we are app-limited.
-   * \return TODO What the Linux kernel is setting in tp->app_limited?
+   * TODO What the Linux kernel is setting in tp->app_limited?
    * https://elixir.bootlin.com/linux/latest/source/net/ipv4/tcp_rate.c#L177
    *
    * \param cWnd Congestion Window
@@ -104,6 +104,7 @@
    * (S)ACK received
    * \param lost number of segments that we detected as lost after the reception
    * of the most recent (S)ACK
+   * \param priorInFlight number of segments previously considered in flight
    * \param is_sack_reneg Is SACK reneged?
    * \param minRtt Minimum RTT so far
    * \return The TcpRateSample that will be used for CA
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-recovery-ops.h ns-3.34/src/internet/model/tcp-recovery-ops.h
--- ns-3.33/src/internet/model/tcp-recovery-ops.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-recovery-ops.h	2021-07-14 10:31:06.000000000 -0700
@@ -120,7 +120,6 @@
    * The function is called when the TcpSocketState is changed from CA_RECOVERY.
    *
    * \param tcb internal congestion state
-   * \param isSackEnabled
    */
   virtual void ExitRecovery (Ptr<TcpSocketState> tcb) = 0;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-socket-base.cc ns-3.34/src/internet/model/tcp-socket-base.cc
--- ns-3.33/src/internet/model/tcp-socket-base.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-socket-base.cc	2021-07-14 10:31:06.000000000 -0700
@@ -1811,6 +1811,7 @@
   m_txBuffer->DiscardUpTo (ackNumber, MakeCallback (&TcpRateOps::SkbDelivered, m_rateOps));
 
   uint32_t currentDelivered = static_cast<uint32_t> (m_rateOps->GetConnectionRate ().m_delivered - previousDelivered);
+  m_tcb->m_lastAckedSackedBytes = currentDelivered;
 
   if (m_tcb->m_congState == TcpSocketState::CA_CWR && (ackNumber > m_recover))
     {
@@ -3520,13 +3521,6 @@
     }
 }
 
-/**
- * \brief Estimate the RTT
- *
- * Called by ForwardUp() to estimate RTT.
- *
- * \param tcpHeader TCP header for the incoming packet
- */
 void
 TcpSocketBase::EstimateRtt (const TcpHeader& tcpHeader)
 {
@@ -3546,6 +3540,11 @@
               Ptr<const TcpOptionTS> ts;
               ts = DynamicCast<const TcpOptionTS> (tcpHeader.GetOption (TcpOption::TS));
               m = TcpOptionTS::ElapsedTimeFromTsValue (ts->GetEcho ());
+              if (m.IsZero ())
+                {
+                  NS_LOG_LOGIC ("TcpSocketBase::EstimateRtt - RTT calculated from TcpOption::TS is zero, approximating to 1us.");
+                  m = MicroSeconds (1);
+                }
             }
           else
             {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-socket-base.h ns-3.34/src/internet/model/tcp-socket-base.h
--- ns-3.33/src/internet/model/tcp-socket-base.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-socket-base.h	2021-07-14 10:31:06.000000000 -0700
@@ -533,6 +533,7 @@
   /**
    * \brief Checks for CE codepoint
    *
+   * \param tos the TOS byte to check
    * \return true if TOS has CE codepoint set; otherwise false
    */
   inline bool CheckEcnCe (uint8_t tos) const
@@ -567,7 +568,7 @@
 
   /**
    * \brief Enable or disable pacing of the initial window
-   * \param pacing Boolean to enable or disable pacing of the initial window
+   * \param paceWindow Boolean to enable or disable pacing of the initial window
    */
   void SetPaceInitialWindow (bool paceWindow);
 
@@ -696,6 +697,7 @@
    * \param seq the sequence number of packet's TCP header
    * \param tcpHeaderSize the size of packet's TCP header
    * \param tcpPayloadSize the size of TCP payload
+   * \return true if the TCP segment is valid
    */
   bool IsValidTcpSegment (const SequenceNumber32 seq, const uint32_t tcpHeaderSize,
                           const uint32_t tcpPayloadSize);
@@ -1001,7 +1003,6 @@
    * \param oldHeadSequence value of HeadSequence before ack
    * updated with SACK information
    * \param currentDelivered The number of bytes (S)ACKed
-   * \return the number of bytes (newly) acked, or 0 if it was a dupack
    */
   virtual void ProcessAck (const SequenceNumber32 &ackNumber, bool scoreboardUpdated,
                            uint32_t currentDelivered, const SequenceNumber32 &oldHeadSequence);
@@ -1217,8 +1218,6 @@
 
   /**
    * \brief Dynamically update the pacing rate
-   *
-   * \param tcb internal congestion state
    */
   void UpdatePacingRate (void);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-socket-state.cc ns-3.34/src/internet/model/tcp-socket-state.cc
--- ns-3.33/src/internet/model/tcp-socket-state.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-socket-state.cc	2021-07-14 10:31:06.000000000 -0700
@@ -116,7 +116,10 @@
     m_bytesInFlight (other.m_bytesInFlight),
     m_lastRtt (other.m_lastRtt),
     m_ecnMode (other.m_ecnMode),
-    m_useEcn (other.m_useEcn)
+    m_useEcn (other.m_useEcn),
+    m_ectCodePoint (other.m_ectCodePoint),
+    m_lastAckedSackedBytes (other.m_lastAckedSackedBytes)
+
 {
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-socket-state.h ns-3.34/src/internet/model/tcp-socket-state.h
--- ns-3.33/src/internet/model/tcp-socket-state.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-socket-state.h	2021-07-14 10:31:06.000000000 -0700
@@ -88,6 +88,9 @@
   } TcpCongState_t;
 
   // Note: "not triggered" events are currently not triggered by the code.
+  /**
+   * \brief Congestion avoidance events
+   */
   typedef enum
   {
     CA_EVENT_TX_START,     /**< first transmit when no packets in flight */
@@ -204,6 +207,8 @@
 
   EcnCodePoint_t         m_ectCodePoint {Ect0};  //!< ECT code point to use
 
+  uint32_t               m_lastAckedSackedBytes {0}; //!< The number of bytes acked and sacked as indicated by the current ACK received. This is similar to acked_sacked variable in Linux
+
   /**
    * \brief Get cwnd in segments rather than bytes
    *
@@ -224,6 +229,9 @@
     return m_ssThresh / m_segmentSize;
   }
 
+  /**
+   * Callback to send an empty packet
+   */
   Callback <void, uint8_t> m_sendEmptyPacketCallback;
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-tx-buffer.cc ns-3.34/src/internet/model/tcp-tx-buffer.cc
--- ns-3.33/src/internet/model/tcp-tx-buffer.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-tx-buffer.cc	2021-07-14 10:31:06.000000000 -0700
@@ -582,11 +582,6 @@
   NS_FATAL_ERROR ("This point is not reachable");
 }
 
-static bool AreEquals (const bool &first, const bool &second)
-{
-  return first ? second : !second;
-}
-
 void
 TcpTxBuffer::MergeItems (TcpTxItem *t1, TcpTxItem *t2) const
 {
@@ -594,15 +589,15 @@
   NS_LOG_FUNCTION (this << *t1 << *t2);
   NS_LOG_INFO ("Merging " << *t2 << " into " << *t1);
 
-  NS_ASSERT_MSG (AreEquals (t1->m_sacked, t2->m_sacked),
+  NS_ASSERT_MSG (t1->m_sacked == t2->m_sacked,
                  "Merging one sacked and another not sacked. Impossible");
-  NS_ASSERT_MSG (AreEquals (t1->m_lost, t2->m_lost),
+  NS_ASSERT_MSG (t1->m_lost == t2->m_lost,
                  "Merging one lost and another not lost. Impossible");
 
   // If one is retrans and the other is not, cancel the retransmitted flag.
   // We are merging this segment for the retransmit, so the count will
   // be updated in MarkTransmittedSegment.
-  if (! AreEquals (t1->m_retrans, t2->m_retrans))
+  if (t1->m_retrans != t2->m_retrans)
     {
       if (t1->m_retrans)
         {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-tx-buffer.h ns-3.34/src/internet/model/tcp-tx-buffer.h
--- ns-3.33/src/internet/model/tcp-tx-buffer.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-tx-buffer.h	2021-07-14 10:31:06.000000000 -0700
@@ -168,6 +168,7 @@
 
   /**
    * \brief check whether SACK is used on the corresponding TCP socket
+   * \return true if SACK is used
    */
   bool IsSackEnabled (void) const;
 
@@ -304,8 +305,6 @@
    * as lost for an external class
    *
    * \param seq sequence to check
-   * \param dupThresh dupAck threshold
-   * \param segmentSize segment size
    * \return true if the sequence is supposed to be lost, false otherwise
    */
   bool IsLost (const SequenceNumber32 &seq) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/tcp-tx-item.h ns-3.34/src/internet/model/tcp-tx-item.h
--- ns-3.33/src/internet/model/tcp-tx-item.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/model/tcp-tx-item.h	2021-07-14 10:31:06.000000000 -0700
@@ -102,7 +102,7 @@
   bool m_retrans       {false};      //!< Indicates if the segment is retransmitted
 
 private:
-  // Only TcpTxBuffer is allower to touch this part of the TcpTxItem, to manage
+  // Only TcpTxBuffer is allowed to touch this part of the TcpTxItem, to manage
   // its internal lists and counters
   friend class TcpTxBuffer;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/model/windowed-filter.h ns-3.34/src/internet/model/windowed-filter.h
--- ns-3.33/src/internet/model/windowed-filter.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/internet/model/windowed-filter.h	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,299 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ *  Copyright (c) 2016 The Chromium Authors. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *    * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *    * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *    * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ *  Note: This code is modified to work under ns-3's environment.
+ *  Modified by: Vivek Jain <jain.vivek.anand@gmail.com>
+ *               Viyom Mittal <viyommittal@gmail.com>
+ *               Mohit P. Tahiliani <tahiliani@nitk.edu.in>
+ */
+
+// Implements Kathleen Nichols' algorithm for tracking the minimum (or maximum)
+// estimate of a stream of samples over some fixed time interval. (E.g.,
+// the minimum RTT over the past five minutes.) The algorithm keeps track of
+// the best, second best, and third best min (or max) estimates, maintaining an
+// invariant that the measurement time of the n'th best >= n-1'th best.
+// The algorithm works as follows. On a reset, all three estimates are set to
+// the same sample. The second best estimate is then recorded in the second
+// quarter of the window, and a third best estimate is recorded in the second
+// half of the window, bounding the worst case error when the true min is
+// monotonically increasing (or true max is monotonically decreasing) over the
+// window.
+//
+// A new best sample replaces all three estimates, since the new best is lower
+// (or higher) than everything else in the window and it is the most recent.
+// The window thus effectively gets reset on every new min. The same property
+// holds true for second best and third best estimates. Specifically, when a
+// sample arrives that is better than the second best but not better than the
+// best, it replaces the second and third best estimates but not the best
+// estimate. Similarly, a sample that is better than the third best estimate
+// but not the other estimates replaces only the third best estimate.
+//
+// Finally, when the best expires, it is replaced by the second best, which in
+// turn is replaced by the third best. The newest sample replaces the third
+// best.
+
+#ifndef WINDOWED_FILTER_H_
+#define WINDOWED_FILTER_H_
+
+namespace ns3 {
+/**
+ * \brief Compares two values
+ * \param T  type of the measurement that is being filtered.
+ */
+template <class T>
+struct MinFilter
+{
+public:
+  /**
+   * \brief Compares two values
+   *
+   * \param lhs left hand value
+   * \param rhs right hand value
+   * \return returns true if the first is less than or equal to the second.
+   */
+  bool operator() (const T& lhs, const T& rhs) const
+  {
+    if (rhs == 0 || lhs == 0)
+      {
+        return false;
+      }
+    return lhs <= rhs;
+  }
+};
+/**
+ * \brief Compares two values
+ * \param T  type of the measurement that is being filtered.
+ */
+template <class T>
+struct MaxFilter
+{
+public:
+  /**
+   * \brief Compares two values
+   *
+   * \param lhs left hand value
+   * \param rhs right hand value
+   * \return returns true if the first is greater than or equal to the second.
+   */
+  bool operator() (const T& lhs, const T& rhs) const
+  {
+    if (rhs == 0 || lhs == 0)
+      {
+        return false;
+      }
+    return lhs >= rhs;
+  }
+};
+/**
+ * \brief Construct a windowed filter
+ *
+ * Use the following to construct a windowed filter object of type T.
+ * For example, a min filter using QuicTime as the time type:
+ *      WindowedFilter<T, MinFilter<T>, QuicTime, QuicTime::Delta> ObjectName;
+ * max filter using 64-bit integers as the time type:
+ *      WindowedFilter<T, MaxFilter<T>, uint64_t, int64_t> ObjectName;
+ *
+ * \param T -- type of the measurement that is being filtered.
+ * \param Compare -- MinFilter<T> or MaxFilter<T>, depending on the type of filter desired.
+ * \param TimeT -- the type used to represent timestamps.
+ * \param TimeDeltaT -- the type used to represent continuous time intervals between
+ * two timestamps.  Has to be the type of (a - b) if both |a| and |b| are
+ * of type TimeT.
+ */
+template <class T, class Compare, typename TimeT, typename TimeDeltaT>
+class WindowedFilter
+{
+public:
+  /**
+   * \brief contructor
+   */
+  WindowedFilter ()
+  {
+  }
+
+  /**
+   * \brief contructor
+   * \param windowLength is the period after which a best estimate expires.
+   * \param zeroValue is used as the uninitialized value for objects of T. Importantly,
+   * zeroValue should be an invalid value for a true sample.
+   * \param zeroTime is the time of instance record time.
+   */
+  WindowedFilter (TimeDeltaT windowLength, T zeroValue, TimeT zeroTime)
+    : m_windowLength (windowLength),
+      m_zeroValue (zeroValue),
+      m_samples
+  {
+    Sample (m_zeroValue, zeroTime),
+    Sample (m_zeroValue, zeroTime),
+    Sample (m_zeroValue, zeroTime)
+  } {}
+  /**
+   * \brief Changes the window length.  Does not update any current samples.
+   * \param windowLength is the period after which a best estimate expires.
+   */
+  void SetWindowLength (TimeDeltaT windowLength)
+  {
+    m_windowLength = windowLength;
+  }
+  /**
+   * \brief Updates best estimates with |sample|, and expires and updates best
+   * estimates as necessary.
+   *
+   * \param new_sample update new sample.
+   * \param new_time record time of the new sample.
+   */
+  void Update (T new_sample, TimeT new_time)
+  {
+    // Reset all estimates if they have not yet been initialized, if new sample
+    // is a new best, or if the newest recorded estimate is too old.
+    if (m_samples[0].sample == m_zeroValue
+        || Compare () (new_sample, m_samples[0].sample)
+        || new_time - m_samples[2].time > m_windowLength)
+      {
+        Reset (new_sample, new_time);
+        return;
+      }
+    if (Compare () (new_sample, m_samples[1].sample))
+      {
+        m_samples[1] = Sample (new_sample, new_time);
+        m_samples[2] = m_samples[1];
+      }
+    else if (Compare () (new_sample, m_samples[2].sample))
+      {
+        m_samples[2] = Sample (new_sample, new_time);
+      }
+    // Expire and update estimates as necessary.
+    if (new_time - m_samples[0].time > m_windowLength)
+      {
+        // The best estimate hasn't been updated for an entire window, so promote
+        // second and third best estimates.
+        m_samples[0] = m_samples[1];
+        m_samples[1] = m_samples[2];
+        m_samples[2] = Sample (new_sample, new_time);
+        // Need to iterate one more time. Check if the new best estimate is
+        // outside the window as well, since it may also have been recorded a
+        // long time ago. Don't need to iterate once more since we cover that
+        // case at the beginning of the method.
+        if (new_time - m_samples[0].time > m_windowLength)
+          {
+            m_samples[0] = m_samples[1];
+            m_samples[1] = m_samples[2];
+          }
+        return;
+      }
+    if (m_samples[1].sample == m_samples[0].sample
+        && new_time - m_samples[1].time > m_windowLength >> 2)
+      {
+        // A quarter of the window has passed without a better sample, so the
+        // second-best estimate is taken from the second quarter of the window.
+        m_samples[2] = m_samples[1] = Sample (new_sample, new_time);
+        return;
+      }
+    if (m_samples[2].sample == m_samples[1].sample
+        && new_time - m_samples[2].time > m_windowLength >> 1)
+      {
+        // We've passed a half of the window without a better estimate, so take
+        // a third-best estimate from the second half of the window.
+        m_samples[2] = Sample (new_sample, new_time);
+      }
+  }
+
+  /**
+   * \brief Resets all estimates to new sample.
+   * \param new_sample update new sample.
+   * \param new_time record time of the new sample.
+   */
+  void Reset (T new_sample, TimeT new_time)
+  {
+    m_samples[0] = m_samples[1] = m_samples[2] = Sample (new_sample, new_time);
+  }
+
+  /**
+   * \brief Returns Max/Min value so far among the windowed samples.
+   * \return returns Best (max/min) value so far among the windowed samples.
+   */
+  T GetBest () const
+  {
+    return m_samples[0].sample;
+  }
+
+  /**
+   * \brief Returns second Max/Min value so far among the windowed samples.
+   * \return returns second Best (max/min) value so far among the windowed samples.
+   */
+  T GetSecondBest () const
+  {
+    return m_samples[1].sample;
+  }
+
+  /**
+   * \brief Returns third Max/Min value so far among the windowed samples.
+   * \return returns third Best (max/min) value so far among the windowed samples.
+   */
+  T GetThirdBest () const
+  {
+    return m_samples[2].sample;
+  }
+
+  /**
+   * \brief sample.
+   */
+  struct Sample
+  {
+    T sample; //!< recorded sample.
+    TimeT time; //!< time when the sample was recorded.
+    /**
+     * \brief constructor
+     */
+    Sample ()
+    {
+    }
+
+    /**
+     * \brief constructor
+     * \param init_sample value of sample.
+     * \param init_time time when the sample was recorded..
+     */
+    Sample (T init_sample, TimeT init_time)
+      : sample (init_sample),
+        time (init_time)
+    {
+    }
+  };
+
+  TimeDeltaT m_windowLength;    //!< Time length of window.
+  T          m_zeroValue;       //!< Uninitialized value of T.
+  Sample     m_samples[3];      //!< Best estimate is element 0.
+};
+
+}  // namespace ns3
+#endif  // WINDOWED_FILTER_H_
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/icmp-test.cc ns-3.34/src/internet/test/icmp-test.cc
--- ns-3.33/src/internet/test/icmp-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/icmp-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -100,13 +100,21 @@
   IcmpEchoReplyTestCase ();
   virtual ~IcmpEchoReplyTestCase ();
 
+  /**
+   * Send data
+   * \param socket output socket
+   * \param dst destination address
+   */
   void SendData (Ptr<Socket> socket, Ipv4Address dst);
-  void DoSendData (Ptr<Socket> socket, Ipv4Address dst);
+  /**
+   * Receive data
+   * \param socket input socket
+   */
   void ReceivePkt (Ptr<Socket> socket);
 
 private:
   virtual void DoRun (void);
-  Ptr<Packet> m_receivedPacket;
+  Ptr<Packet> m_receivedPacket; //!< received packet
 
 };
 
@@ -125,7 +133,7 @@
 
 
 void
-IcmpEchoReplyTestCase::DoSendData (Ptr<Socket> socket, Ipv4Address dst)
+IcmpEchoReplyTestCase::SendData (Ptr<Socket> socket, Ipv4Address dst)
 {
   Ptr<Packet> p = Create<Packet> ();
   Icmpv4Echo echo;
@@ -147,15 +155,6 @@
 
 
 void
-IcmpEchoReplyTestCase::SendData (Ptr<Socket> socket, Ipv4Address dst)
-{
-  m_receivedPacket = Create<Packet> ();
-  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
-                                  &IcmpEchoReplyTestCase::DoSendData, this, socket, dst);
-  Simulator::Run ();
-}
-
-void
 IcmpEchoReplyTestCase::ReceivePkt (Ptr <Socket> socket)
 {
   Address from;
@@ -210,7 +209,9 @@
 
   // Set a TTL big enough
   socket->SetIpTtl (1);
-  SendData (socket, i.GetAddress (1,0));
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
+                                  &IcmpEchoReplyTestCase::SendData, this, socket, i.GetAddress (1,0));
+  Simulator::Run ();
 
   NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 28, " Unexpected ICMPV4_ECHO_REPLY packet size");
 
@@ -231,13 +232,21 @@
   IcmpTimeExceedTestCase ();
   virtual ~IcmpTimeExceedTestCase ();
 
+  /**
+   * Send data
+   * \param socket output socket
+   * \param dst destination address
+   */
   void SendData (Ptr<Socket> socket, Ipv4Address dst);
-  void DoSendData (Ptr<Socket> socket, Ipv4Address dst);
+  /**
+   * Receive data
+   * \param socket input socket
+   */
   void ReceivePkt (Ptr<Socket> socket);
 
 private:
   virtual void DoRun (void);
-  Ptr<Packet> m_receivedPacket;
+  Ptr<Packet> m_receivedPacket; //!< received packet
 
 };
 
@@ -256,7 +265,7 @@
 
 
 void
-IcmpTimeExceedTestCase::DoSendData (Ptr<Socket> socket, Ipv4Address dst)
+IcmpTimeExceedTestCase::SendData (Ptr<Socket> socket, Ipv4Address dst)
 {
   Ptr<Packet> p = Create<Packet> ();
   Icmpv4Echo echo;
@@ -277,16 +286,6 @@
 
 
 void
-IcmpTimeExceedTestCase::SendData (Ptr<Socket> socket, Ipv4Address dst)
-{
-  m_receivedPacket = Create<Packet> ();
-  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
-                                  &IcmpTimeExceedTestCase::DoSendData, this, socket, dst);
-  Simulator::Run ();
-}
-
-
-void
 IcmpTimeExceedTestCase::ReceivePkt (Ptr<Socket> socket)
 {
   Address from;
@@ -355,7 +354,9 @@
 
   // The ttl is not big enough , causing an ICMP Time Exceeded response
   socket->SetIpTtl (1);
-  SendData (socket, i2.GetAddress (1,0));
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
+                                  &IcmpTimeExceedTestCase::SendData, this, socket, i2.GetAddress (1,0));
+  Simulator::Run ();
 
   NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 56, " Unexpected ICMP Time Exceed Response packet size");
 
@@ -375,13 +376,21 @@
   IcmpV6EchoReplyTestCase ();
   virtual ~IcmpV6EchoReplyTestCase ();
 
+  /**
+   * Send data
+   * \param socket output socket
+   * \param dst destination address
+   */
   void SendData (Ptr<Socket> socket, Ipv6Address dst);
-  void DoSendData (Ptr<Socket> socket, Ipv6Address dst);
+  /**
+   * Receive data
+   * \param socket input socket
+   */
   void ReceivePkt (Ptr<Socket> socket);
 
 private:
   virtual void DoRun (void);
-  Ptr<Packet> m_receivedPacket;
+  Ptr<Packet> m_receivedPacket; //!< received packet
 
 };
 
@@ -400,7 +409,7 @@
 
 
 void
-IcmpV6EchoReplyTestCase::DoSendData (Ptr<Socket> socket, Ipv6Address dst)
+IcmpV6EchoReplyTestCase::SendData (Ptr<Socket> socket, Ipv6Address dst)
 {
   Ptr<Packet> p = Create<Packet> ();
   Icmpv6Echo echo (1);
@@ -422,15 +431,6 @@
 
 
 void
-IcmpV6EchoReplyTestCase::SendData (Ptr<Socket> socket, Ipv6Address dst)
-{
-  m_receivedPacket = Create<Packet> ();
-  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
-                                  &IcmpV6EchoReplyTestCase::DoSendData, this, socket, dst);
-  Simulator::Run ();
-}
-
-void
 IcmpV6EchoReplyTestCase::ReceivePkt (Ptr <Socket> socket)
 {
   Address from;
@@ -498,7 +498,9 @@
   // Set a TTL big enough
   socket->SetIpTtl (1);
 
-  SendData (socket, i.GetAddress (1,1));
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
+                                  &IcmpV6EchoReplyTestCase::SendData, this, socket, i.GetAddress (1,1));
+  Simulator::Run ();
 
   NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 72, " Unexpected ICMPV6_ECHO_REPLY packet size");
 
@@ -518,13 +520,21 @@
   IcmpV6TimeExceedTestCase ();
   virtual ~IcmpV6TimeExceedTestCase ();
 
+  /**
+   * Send data
+   * \param socket output socket
+   * \param dst destination address
+   */
   void SendData (Ptr<Socket> socket, Ipv6Address dst);
-  void DoSendData (Ptr<Socket> socket, Ipv6Address dst);
+  /**
+   * Receive data
+   * \param socket input socket
+   */
   void ReceivePkt (Ptr<Socket> socket);
 
 private:
   virtual void DoRun (void);
-  Ptr<Packet> m_receivedPacket;
+  Ptr<Packet> m_receivedPacket; //!< received packet
 
 };
 
@@ -543,7 +553,7 @@
 
 
 void
-IcmpV6TimeExceedTestCase::DoSendData (Ptr<Socket> socket, Ipv6Address dst)
+IcmpV6TimeExceedTestCase::SendData (Ptr<Socket> socket, Ipv6Address dst)
 {
   Ptr<Packet> p = Create<Packet> ();
   Icmpv6Echo echo (1);
@@ -565,15 +575,6 @@
 
 
 void
-IcmpV6TimeExceedTestCase::SendData (Ptr<Socket> socket, Ipv6Address dst)
-{
-  m_receivedPacket = Create<Packet> ();
-  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
-                                  &IcmpV6TimeExceedTestCase::DoSendData, this, socket, dst);
-  Simulator::Run ();
-}
-
-void
 IcmpV6TimeExceedTestCase::ReceivePkt (Ptr <Socket> socket)
 {
   Address from;
@@ -658,7 +659,9 @@
   // The hop limit is not big enough , causing an ICMPV6 Time Exceeded error
   socket->SetIpv6HopLimit (1);
 
-  SendData (socket, interfaces2.GetAddress (1,1));
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
+                                  &IcmpV6TimeExceedTestCase::SendData, this, socket, interfaces2.GetAddress (1,1));
+  Simulator::Run ();
 
   NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 72, " Unexpected ICMPV6_ECHO_REPLY packet size");
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/ipv4-deduplication-test.cc ns-3.34/src/internet/test/ipv4-deduplication-test.cc
--- ns-3.33/src/internet/test/ipv4-deduplication-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/ipv4-deduplication-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -126,19 +126,35 @@
    */
   void CheckDrops (const std::string &name);
 
-  static const Time DELAY;
+  static const Time DELAY; //!< Channel delay
+
+  /**
+   * Creates the test name according to the parameters
+   * \param enable deduplication enabled
+   * \param expire expiration delay for duplicate cache entries
+   * \returns A string describing the test
+   */
   static std::string MakeName (bool enable, Time expire);
 
+  /**
+   * Enum of test types
+   */
   enum MODE {ENABLED = 0,
              DISABLED,
              DEGENERATE};  // enabled, but expiration time too low
-  MODE m_mode;
-  Time m_expire;
-  std::map<std::string, uint32_t> m_packetCountMap;
-  std::map<std::string, uint32_t> m_dropCountMap;
+  MODE m_mode; //!< Test type
+  Time m_expire; //!< Expiration delay for duplicate cache entries
+  std::map<std::string, uint32_t> m_packetCountMap; //!< map of received packets (node name, counter)
+  std::map<std::string, uint32_t> m_dropCountMap; //!< map of received packets (node name, counter)
 
 public:
   virtual void DoRun (void);
+
+  /**
+   * Constructor
+   * \param enable deduplication enabled
+   * \param expire expiration delay for duplicate cache entries
+   */
   Ipv4DeduplicationTest (bool enable, Time expire = Seconds (1));
 
   /**
@@ -532,9 +548,16 @@
     Ipv4DeduplicationPerformanceTest (void);
     virtual void DoRun (void);
   private:
-    std::vector <Ptr<Socket> > m_sockets;
-    std::vector <uint8_t> m_txPackets;
-    uint8_t m_target;
+    std::vector <Ptr<Socket> > m_sockets; //!< sockets in use
+    std::vector <uint8_t> m_txPackets;  //!< transmitted packets for each socket
+    uint8_t m_target; //!< number of packets to transmit on each socket
+
+    /**
+     * Send data
+     * \param socket output socket
+     * \param to destination address
+     * \param socketIndex index of the socket
+     */
     void DoSendData (Ptr<Socket> socket, Address to, uint8_t socketIndex);
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/ipv4-fragmentation-test.cc ns-3.34/src/internet/test/ipv4-fragmentation-test.cc
--- ns-3.33/src/internet/test/ipv4-fragmentation-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/ipv4-fragmentation-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -113,6 +113,10 @@
 
 public:
   virtual void DoRun (void);
+  /**
+   * Constructor
+   * \param broadcast send broadcast packets (true) or unicast packets (false)
+   */
   Ipv4FragmentationTest (bool broadcast);
   ~Ipv4FragmentationTest ();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/ipv6-ripng-test.cc ns-3.34/src/internet/test/ipv6-ripng-test.cc
--- ns-3.33/src/internet/test/ipv6-ripng-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/ipv6-ripng-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -229,7 +229,7 @@
   Ipv6AddressHelper ipv6;
 
   ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
-  Ipv6InterfaceContainer iic1 = ipv6.Assign (net1);
+  Ipv6InterfaceContainer iic1 = ipv6.AssignWithoutOnLink (net1);
   iic1.SetForwarding (1, true);
   iic1.SetDefaultRouteInAllNodes (1);
 
@@ -242,7 +242,7 @@
   iic3.SetForwarding (1, true);
 
   ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
-  Ipv6InterfaceContainer iic4 = ipv6.Assign (net4);
+  Ipv6InterfaceContainer iic4 = ipv6.AssignWithoutOnLink (net4);
   iic4.SetForwarding (0, true);
   iic4.SetDefaultRouteInAllNodes (0);
 
@@ -459,7 +459,7 @@
   Ipv6AddressHelper ipv6;
 
   ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
-  Ipv6InterfaceContainer iic1 = ipv6.Assign (net1);
+  Ipv6InterfaceContainer iic1 = ipv6.AssignWithoutOnLink (net1);
   iic1.SetForwarding (1, true);
   iic1.SetDefaultRouteInAllNodes (1);
 
@@ -472,7 +472,7 @@
   iic3.SetForwarding (1, true);
 
   ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
-  Ipv6InterfaceContainer iic4 = ipv6.Assign (net4);
+  Ipv6InterfaceContainer iic4 = ipv6.AssignWithoutOnLink (net4);
   iic4.SetForwarding (0, true);
   iic4.SetDefaultRouteInAllNodes (0);
 
@@ -653,7 +653,7 @@
   Ipv6AddressHelper ipv6;
 
   ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
-  Ipv6InterfaceContainer iic0 = ipv6.Assign (net0);
+  Ipv6InterfaceContainer iic0 = ipv6.AssignWithoutOnLink (net0);
 
   Ipv6InterfaceContainer iic1 = ipv6.AssignWithoutAddress (net1);
   iic1.SetForwarding (0, true);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/tcp-advertised-window-test.cc ns-3.34/src/internet/test/tcp-advertised-window-test.cc
--- ns-3.33/src/internet/test/tcp-advertised-window-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/tcp-advertised-window-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -353,6 +353,11 @@
 }
 //-----------------------------------------------------------------------------
 
+/**
+ * \ingroup internet-tests
+ * \ingroup test
+ * \brief Test the TCP's advertised window size when there is a loss of specific packets.
+ */
 class TcpAdvWindowOnLossTest : public TcpGeneralTest
 {
 public:
@@ -361,7 +366,7 @@
    * \param desc description
    * \param size segment size
    * \param packets number of packets to send
-   * \param lossRatio error ratio
+   * \param toDrop packets to be dropped
    */
   TcpAdvWindowOnLossTest (const std::string &desc, uint32_t size, uint32_t packets,
                           std::vector<uint32_t> &toDrop);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/tcp-bbr-test.cc ns-3.34/src/internet/test/tcp-bbr-test.cc
--- ns-3.33/src/internet/test/tcp-bbr-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/internet/test/tcp-bbr-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,203 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018 NITK Surathkal
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Vivek Jain <jain.vivek.anand@gmail.com>
+ *          Viyom Mittal <viyommittal@gmail.com>
+ *          Mohit P. Tahiliani <tahiliani@nitk.edu.in>
+ *
+ */
+
+#include "ns3/test.h"
+#include "ns3/log.h"
+#include "ns3/tcp-congestion-ops.h"
+#include "ns3/tcp-socket-base.h"
+#include "ns3/tcp-bbr.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("TcpBbrTestSuite");
+
+/**
+ * \brief Testing whether BBR enables pacing
+ */
+class TcpBbrPacingEnableTest : public TestCase
+{
+public:
+  /**
+   * \brief constructor
+   * \param pacing pacing configuration
+   * \param name description of the test
+   */
+  TcpBbrPacingEnableTest (bool pacing, const std::string &name);
+
+private:
+  virtual void DoRun (void);
+  /**
+   * \brief Execute the test.
+   */
+  void ExecuteTest (void);
+  bool m_pacing; //!< Initial pacing configuration.
+};
+
+TcpBbrPacingEnableTest::TcpBbrPacingEnableTest (bool pacing, const std::string &name)
+  : TestCase (name),
+    m_pacing (pacing)
+{}
+
+void
+TcpBbrPacingEnableTest::DoRun ()
+{
+  Simulator::Schedule (Seconds (0.0), &TcpBbrPacingEnableTest::ExecuteTest, this);
+  Simulator::Run ();
+  Simulator::Destroy ();
+}
+
+void
+TcpBbrPacingEnableTest::ExecuteTest ()
+{
+  Ptr<TcpSocketState> state = CreateObject <TcpSocketState> ();
+  state->m_pacing = m_pacing;
+
+  Ptr<TcpBbr> cong = CreateObject <TcpBbr> ();
+
+  cong->CongestionStateSet (state, TcpSocketState::CA_OPEN);
+
+  NS_TEST_ASSERT_MSG_EQ (state->m_pacing, true,
+                         "BBR has not updated pacing value");
+}
+
+/**
+ * \brief Tests whether BBR sets correct value of pacing and cwnd gain based on different state.
+ */
+class TcpBbrCheckGainValuesTest : public TestCase
+{
+public:
+  /**
+   * \brief constructor
+   * \param state BBR state/mode under test
+   * \param highGain value of pacing and cwnd gain
+   * \param name description of the test
+   */
+  TcpBbrCheckGainValuesTest (TcpBbr::BbrMode_t state, double highGain, const std::string &name);
+
+private:
+  virtual void DoRun (void);
+  /**
+   * \brief Execute the test.
+   */
+  void ExecuteTest (void);
+  TcpBbr::BbrMode_t m_mode; //!< BBR mode under test
+  double m_highGain;        //!< Value of BBR high gain
+};
+
+TcpBbrCheckGainValuesTest::TcpBbrCheckGainValuesTest (TcpBbr::BbrMode_t state,
+                                                      double highGain, const std::string &name)
+  : TestCase (name),
+    m_mode (state),
+    m_highGain (highGain)
+{}
+
+void
+TcpBbrCheckGainValuesTest::DoRun ()
+{
+  Simulator::Schedule (Seconds (0.0), &TcpBbrCheckGainValuesTest::ExecuteTest, this);
+  Simulator::Run ();
+  Simulator::Destroy ();
+}
+
+void
+TcpBbrCheckGainValuesTest::ExecuteTest ()
+{
+  Ptr<TcpBbr> cong = CreateObject <TcpBbr> ();
+  cong->SetAttribute ("HighGain", DoubleValue (m_highGain));
+  double actualPacingGain, actualCwndGain, desiredPacingGain = m_highGain, desiredCwndGain = m_highGain;
+  TcpBbr::BbrMode_t desiredMode = TcpBbr::BBR_STARTUP;
+  switch (m_mode)
+    {
+      case TcpBbr::BBR_STARTUP:
+        cong->EnterStartup ();
+        desiredPacingGain = m_highGain;
+        desiredCwndGain  = m_highGain;
+        actualPacingGain = cong->GetPacingGain ();
+        actualCwndGain = cong->GetCwndGain ();
+        desiredMode = TcpBbr::BBR_STARTUP;
+        break;
+      case TcpBbr::BBR_DRAIN:
+        cong->EnterDrain ();
+        desiredPacingGain = 1 / m_highGain;
+        desiredCwndGain  = m_highGain;
+        desiredMode = TcpBbr::BBR_DRAIN;
+        break;
+      case TcpBbr::BBR_PROBE_BW:
+        cong->EnterProbeBW ();
+        // The value of desiredPacingGain is sensitive to the setting of random
+        // variable stream. The value of 1.25 has been used in this test with a
+        // stream value of 4 (default for TCP BBR). Note that if the stream value
+        // is changed, this test might fail because when BBR enters the PROBE_BW
+        // phase, the value of actualPacingGain is chosen randomly from 1.25,
+        // 0.75, 1, 1, 1, 1, 1, 1.
+        desiredPacingGain = 1.25;
+        desiredCwndGain  = 2;
+        desiredMode = TcpBbr::BBR_PROBE_BW;
+        break;
+      case TcpBbr::BBR_PROBE_RTT:
+        cong->EnterProbeRTT ();
+        desiredPacingGain = 1;
+        desiredCwndGain  = 1;
+        desiredMode = TcpBbr::BBR_PROBE_RTT;
+        break;
+      default:
+        NS_ASSERT (false);
+    }
+
+  actualPacingGain = cong->GetPacingGain ();
+  actualCwndGain = cong->GetCwndGain ();
+  NS_TEST_ASSERT_MSG_EQ (m_mode, desiredMode, "BBR has not entered into desired state");
+  NS_TEST_ASSERT_MSG_EQ (actualPacingGain, desiredPacingGain, "BBR has not updated into desired pacing gain");
+  NS_TEST_ASSERT_MSG_EQ (actualCwndGain, desiredCwndGain, "BBR has not updated into desired cwnd gain");
+}
+
+/**
+ * \ingroup internet-test
+ * \ingroup tests
+ *
+ * \brief TCP BBR TestSuite
+ */
+class TcpBbrTestSuite : public TestSuite
+{
+public:
+  /**
+   * \brief constructor
+   */
+  TcpBbrTestSuite () : TestSuite ("tcp-bbr-test", UNIT)
+  {
+    AddTestCase (new TcpBbrPacingEnableTest (true, "BBR must keep pacing feature on"), TestCase::QUICK);
+
+    AddTestCase (new TcpBbrPacingEnableTest (false, "BBR must turn on pacing feature"), TestCase::QUICK);
+
+    AddTestCase (new TcpBbrCheckGainValuesTest (TcpBbr::BBR_STARTUP, 4, "BBR should enter to STARTUP phase and set cwnd and pacing gain accordingly"), TestCase::QUICK);
+
+    AddTestCase (new TcpBbrCheckGainValuesTest (TcpBbr::BBR_DRAIN, 4, "BBR should enter to DRAIN phase and set cwnd and pacing gain accordingly"), TestCase::QUICK);
+
+    AddTestCase (new TcpBbrCheckGainValuesTest (TcpBbr::BBR_PROBE_BW, 4, "BBR should enter to BBR_PROBE_BW phase and set cwnd and pacing gain accordingly"), TestCase::QUICK);
+
+    AddTestCase (new TcpBbrCheckGainValuesTest (TcpBbr::BBR_PROBE_RTT, 4, "BBR should enter to BBR_PROBE_RTT phase and set cwnd and pacing gain accordingly"), TestCase::QUICK);
+  }
+};
+
+static TcpBbrTestSuite g_tcpBbrTest; //!< static variable for test initialization
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/tcp-close-test.cc ns-3.34/src/internet/test/tcp-close-test.cc
--- ns-3.33/src/internet/test/tcp-close-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/tcp-close-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -55,10 +55,14 @@
       m_recvClose = true;
   }
 
+  /**
+   * Called when a packet is dropped.
+   * \param ipH IP header
+   * \param tcpH TCP header
+   * \param pkt packet
+   */
   void PktDropped (const Ipv4Header &ipH, const TcpHeader& tcpH, Ptr<const Packet> pkt);
   
-  virtual void BytesAvailable (uint32_t size, SocketWho who);
-
 private:
   Ptr<TcpSeqErrorModel> m_errorModel; //!< The error model
   bool m_sendClose;                   //!< true when the sender has closed
@@ -108,18 +112,6 @@
 
   return m_errorModel;
 }
-  
-void TcpCloseWithLossTestCase::BytesAvailable(uint32_t size, SocketWho who)
-  {
-    if (m_synReceived && (who == SENDER))
-    {
-      this->GetSenderSocket()->Close();
-    }
-    else
-    {
-      m_synReceived = true;
-    }
-  }
 
 void
 TcpCloseWithLossTestCase::PktDropped (const Ipv4Header &ipH, const TcpHeader& tcpH, Ptr<const Packet> pkt)
@@ -154,8 +146,8 @@
 }
 
 /**
-  * Check if the TCP is correctly closing its state
-  */
+ * Check if the TCP is correctly closing its state
+ */
 class TcpTcpCloseTestSuite : public TestSuite
 {
 public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/tcp-dctcp-test.cc ns-3.34/src/internet/test/tcp-dctcp-test.cc
--- ns-3.33/src/internet/test/tcp-dctcp-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/tcp-dctcp-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -21,8 +21,8 @@
 
 #include "ns3/ipv4.h"
 #include "ns3/ipv6.h"
-#include "../model/ipv4-end-point.h"
-#include "../model/ipv6-end-point.h"
+#include "ns3/ipv4-end-point.h"
+#include "ns3/ipv6-end-point.h"
 #include "tcp-general-test.h"
 #include "ns3/node.h"
 #include "ns3/log.h"
@@ -63,10 +63,10 @@
   void ConfigureEnvironment ();
 
 private:
-  uint32_t m_senderSent;
-  uint32_t m_receiverSent;
-  uint32_t m_senderReceived;
-  uint8_t m_testCase;
+  uint32_t m_senderSent;      //!< Number of packets sent by the sender
+  uint32_t m_receiverSent;    //!< Number of packets sent by the receiver
+  uint32_t m_senderReceived;  //!< Number of packets received by the sender
+  uint8_t m_testCase;         //!< Test type
 };
 
 TcpDctcpCodePointsTest::TcpDctcpCodePointsTest (uint8_t testCase, const std::string &desc)
@@ -197,8 +197,8 @@
    */
   static TypeId GetTypeId (void);
 
-  uint32_t m_dataPacketSent;
-  uint8_t m_testCase;
+  uint32_t m_dataPacketSent;  //!< Number of packets sent
+  uint8_t m_testCase;         //!< Test type
 
   TcpDctcpCongestedRouter ()
     : TcpSocketMsgBase ()
@@ -215,6 +215,10 @@
   {
   }
 
+  /**
+   * Set the test case type
+   * \param testCase test case type
+   */
   void SetTestCase (uint8_t testCase);
 protected:
   virtual uint32_t SendDataPacket (SequenceNumber32 seq, uint32_t maxSize, bool withAck);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/tcp-ecn-test.cc ns-3.34/src/internet/test/tcp-ecn-test.cc
--- ns-3.33/src/internet/test/tcp-ecn-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/tcp-ecn-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -25,8 +25,8 @@
 #include "ns3/ipv6-route.h"
 #include "ns3/ipv4-routing-protocol.h"
 #include "ns3/ipv6-routing-protocol.h"
-#include "../model/ipv4-end-point.h"
-#include "../model/ipv6-end-point.h"
+#include "ns3/ipv4-end-point.h"
+#include "ns3/ipv6-end-point.h"
 #include "tcp-general-test.h"
 #include "ns3/node.h"
 #include "ns3/log.h"
@@ -69,11 +69,11 @@
   void ConfigureProperties ();
 
 private:
-  uint32_t m_cwndChangeCount;
-  uint32_t m_senderSent;
-  uint32_t m_senderReceived;
-  uint32_t m_receiverReceived;
-  uint32_t m_testcase;
+  uint32_t m_cwndChangeCount;     //!< Number of times the congestion window did change
+  uint32_t m_senderSent;          //!< Number of segments sent by the sender
+  uint32_t m_senderReceived;      //!< Number of segments received by the sender
+  uint32_t m_receiverReceived;    //!< Number of segments received by the receiver
+  uint32_t m_testcase;            //!< Test case type
 };
 
 
@@ -98,8 +98,8 @@
    */
   static TypeId GetTypeId (void);
 
-  uint32_t m_dataPacketSent;
-  uint8_t m_testcase;
+  uint32_t m_dataPacketSent;  //!< Number of packets sent
+  uint8_t m_testcase;         //!< Test case type
 
   TcpSocketCongestedRouter ()
     : TcpSocketMsgBase ()
@@ -116,6 +116,10 @@
   {
   }
 
+  /**
+   * Set the test case type
+   * \param testCase Test case type
+   */
   void SetTestCase (uint8_t testCase);
 
 protected:
@@ -528,7 +532,7 @@
  *
  * \brief TCP ECN TestSuite
  */
-static class TcpEcnTestSuite : public TestSuite
+class TcpEcnTestSuite : public TestSuite
 {
 public:
   TcpEcnTestSuite () : TestSuite ("tcp-ecn-test", UNIT)
@@ -546,6 +550,8 @@
     AddTestCase (new TcpEcnTest (6, "Congestion Window Reduction Test :ECN capable sender and ECN capable receiver"),
                  TestCase::QUICK);
   }
-} g_tcpECNTestSuite;
+};
+
+static TcpEcnTestSuite g_tcpECNTestSuite; //!< static var for test initialization
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/tcp-general-test.cc ns-3.34/src/internet/test/tcp-general-test.cc
--- ns-3.33/src/internet/test/tcp-general-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/tcp-general-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -26,8 +26,8 @@
 #include "ns3/log.h"
 #include "ns3/queue.h"
 #include "ns3/tcp-l4-protocol.h"
-#include "../model/ipv4-end-point.h"
-#include "../model/ipv6-end-point.h"
+#include "ns3/ipv4-end-point.h"
+#include "ns3/ipv6-end-point.h"
 #include "ns3/tcp-header.h"
 #include "ns3/tcp-tx-buffer.h"
 #include "ns3/tcp-rx-buffer.h"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/tcp-general-test.h ns-3.34/src/internet/test/tcp-general-test.h
--- ns-3.33/src/internet/test/tcp-general-test.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/tcp-general-test.h	2021-07-14 10:31:06.000000000 -0700
@@ -619,7 +619,7 @@
    * \brief Enable or disable pacing of the initial window
    * 
    * \param who socket
-   * \param pacing Boolean to enable or disable pacing of initial window
+   * \param paceWindow Boolean to enable or disable pacing of initial window
    */
   void SetPaceInitialWindow (SocketWho who, bool paceWindow);
 
@@ -682,7 +682,7 @@
    *
    * \param recovery typeid of the recovery algorithm
    */
-  void SetRecoveryAlgorithm (TypeId reccovery) { m_recoveryTypeId = reccovery; }
+  void SetRecoveryAlgorithm (TypeId recovery) { m_recoveryTypeId = recovery; }
 
   /**
    * \brief MTU of the bottleneck link
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/tcp-linux-reno-test.cc ns-3.34/src/internet/test/tcp-linux-reno-test.cc
--- ns-3.33/src/internet/test/tcp-linux-reno-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/tcp-linux-reno-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -29,15 +29,21 @@
 
 NS_LOG_COMPONENT_DEFINE ("TcpLinuxRenoTest");
 
-// This unit test checks that the slow start and congestion avoidance
-// behavior matches Linux behavior as follows:
-// 1) in both slow start and congestion avoidance phases, presence or
-//    absence of delayed acks does not alter the window growth
-// 2) in congestion avoidance phase, the arithmetic for counting the number
-//    of segments acked and deciding when to increment the congestion window
-//    (i.e. following the Linux function tcp_cong_avoid_ai()) is followed.
-// Different segment sizes (524 bytes and 1500 bytes) are tested.
-
+/**
+ * \ingroup internet-test
+ * \ingroup tests
+ *
+ * This unit test checks that the slow start and congestion avoidance
+ * behavior matches Linux behavior as follows:
+ * 1) in both slow start and congestion avoidance phases, presence or
+ *    absence of delayed acks does not alter the window growth
+ * 2) in congestion avoidance phase, the arithmetic for counting the number
+ *    of segments acked and deciding when to increment the congestion window
+ *    (i.e. following the Linux function tcp_cong_avoid_ai()) is followed.
+ * Different segment sizes (524 bytes and 1500 bytes) are tested.
+ *
+ * This is the Slow Start test.
+ */
 class
 TcpLinuxRenoSSTest : public TcpGeneralTest
 {
@@ -181,6 +187,21 @@
   TcpGeneralTest::DoTeardown (); // call up to base class method to finish
 }
 
+/**
+ * \ingroup internet-test
+ * \ingroup tests
+ *
+ * This unit test checks that the slow start and congestion avoidance
+ * behavior matches Linux behavior as follows:
+ * 1) in both slow start and congestion avoidance phases, presence or
+ *    absence of delayed acks does not alter the window growth
+ * 2) in congestion avoidance phase, the arithmetic for counting the number
+ *    of segments acked and deciding when to increment the congestion window
+ *    (i.e. following the Linux function tcp_cong_avoid_ai()) is followed.
+ * Different segment sizes (524 bytes and 1500 bytes) are tested.
+ *
+ * This is the Congestion avoidance test.
+ */
 class
 TcpLinuxRenoCongAvoidTest : public TcpGeneralTest
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/tcp-loss-test.cc ns-3.34/src/internet/test/tcp-loss-test.cc
--- ns-3.33/src/internet/test/tcp-loss-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/tcp-loss-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -74,12 +74,12 @@
                        const TcpSocketState::TcpCongState_t newValue);
   Ptr<ErrorModel> CreateReceiverErrorModel ();
 private:
-  uint32_t m_firstLoss;
-  uint32_t m_secondLoss;
-  uint32_t m_sent {0};
-  uint32_t m_received {0};
-  uint32_t m_lastSegment {0};
-  std::list<int> m_expectedStates;
+  uint32_t m_firstLoss;             //!< First segment loss
+  uint32_t m_secondLoss;            //!< Second segment loss
+  uint32_t m_sent {0};              //!< Number of segments sent
+  uint32_t m_received {0};          //!< Number of segments received
+  uint32_t m_lastSegment {0};       //!< Last received segment
+  std::list<int> m_expectedStates;  //!< Expected TCP states
 };
 
 TcpLargeTransferLossTest::TcpLargeTransferLossTest (uint32_t firstLoss, uint32_t secondLoss, uint32_t lastSegment, const std::string &desc)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/tcp-lp-test.cc ns-3.34/src/internet/test/tcp-lp-test.cc
--- ns-3.33/src/internet/test/tcp-lp-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/tcp-lp-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -32,23 +32,34 @@
 NS_LOG_COMPONENT_DEFINE ("TcpLpTestSuite");
 
 /**
+ * \ingroup internet-test
+ * \ingroup tests
+ *
  * \brief Testing the behaviour common to New Reno
  */
 class TcpLpToNewReno : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * \param cWnd Congestion window size
+   * \param segmentSize Segment size
+   * \param segmentsAcked Segments acked
+   * \param ssThresh Slow start threshold
+   * \param rtt RTT
+   * \param name Test case name
+   */
   TcpLpToNewReno (uint32_t cWnd, uint32_t segmentSize,
-                  uint32_t segmentsAcked,uint32_t ssThresh, Time rtt, const std::string &name);
+                  uint32_t segmentsAcked, uint32_t ssThresh, Time rtt, const std::string &name);
 
 private:
   virtual void DoRun (void);
-  void ExecuteTest (void);
-  uint32_t m_cWnd;
-  uint32_t m_segmentSize;
-  uint32_t m_ssThresh;
-  uint32_t m_segmentsAcked;
-  Time m_rtt;
-  Ptr<TcpSocketState> m_state;
+  uint32_t m_cWnd;          //!< Congestion window size
+  uint32_t m_segmentSize;   //!< Segment size
+  uint32_t m_ssThresh;      //!< Slow start threshold
+  uint32_t m_segmentsAcked; //!< Segments acked
+  Time m_rtt;               //!< RTT
+  Ptr<TcpSocketState> m_state;  //!< TCP socket state
 };
 
 TcpLpToNewReno::TcpLpToNewReno (uint32_t cWnd, uint32_t segmentSize,
@@ -65,14 +76,6 @@
 void
 TcpLpToNewReno::DoRun ()
 {
-  Simulator::Schedule (Seconds (0.0), &TcpLpToNewReno::ExecuteTest, this);
-  Simulator::Run ();
-  Simulator::Destroy ();
-}
-
-void
-TcpLpToNewReno::ExecuteTest ()
-{
   m_state = CreateObject <TcpSocketState> ();
   m_state->m_cWnd = m_cWnd;
   m_state->m_ssThresh = m_ssThresh;
@@ -96,26 +99,38 @@
 
   NS_TEST_ASSERT_MSG_EQ (m_state->m_cWnd.Get (), state->m_cWnd.Get (),
                          "cWnd has not updated correctly");
+  Simulator::Run ();
+  Simulator::Destroy ();
 }
+
 /**
- * \brief Testing TcpLp when owd exceeds threshold
+ * \ingroup internet-test
+ * \ingroup tests
+ *
+ * \brief Testing TcpLp when cwd exceeds threshold
  */
-
 class TcpLpInferenceTest1 : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * \param cWnd Congestion window size
+   * \param segmentSize Segment size
+   * \param segmentsAcked Segments acked
+   * \param rtt RTT
+   * \param name Test case name
+   */
   TcpLpInferenceTest1 (uint32_t cWnd, uint32_t segmentSize,
                        uint32_t segmentsAcked, Time rtt, const std::string &name);
 
 private:
   virtual void DoRun (void);
-  void ExecuteTest (void);
 
-  uint32_t m_cWnd;
-  uint32_t m_segmentSize;
-  uint32_t m_segmentsAcked;
-  Time m_rtt;
-  Ptr<TcpSocketState> m_state;
+  uint32_t m_cWnd;          //!< Congestion window size
+  uint32_t m_segmentSize;   //!< Segment size
+  uint32_t m_segmentsAcked; //!< Segments acked
+  Time m_rtt;               //!< RTT
+  Ptr<TcpSocketState> m_state;  //!< TCP socket state
 };
 
 TcpLpInferenceTest1::TcpLpInferenceTest1 (uint32_t cWnd, uint32_t segmentSize,
@@ -131,14 +146,6 @@
 void
 TcpLpInferenceTest1::DoRun ()
 {
-  Simulator::Schedule (Seconds (0.0), &TcpLpInferenceTest1::ExecuteTest, this);
-  Simulator::Run ();
-  Simulator::Destroy ();
-}
-
-void
-TcpLpInferenceTest1::ExecuteTest ()
-{
   m_state = CreateObject <TcpSocketState> ();
   m_state->m_cWnd = m_cWnd;
   m_state->m_segmentSize = m_segmentSize;
@@ -157,26 +164,38 @@
   m_cWnd =  m_cWnd / 2;
   NS_TEST_ASSERT_MSG_EQ (m_state->m_cWnd.Get (), m_cWnd,
                          "cWnd has not updated correctly");
+  Simulator::Run ();
+  Simulator::Destroy ();
 }
 
 /**
+ * \ingroup internet-test
+ * \ingroup tests
+ *
  * \brief Testing TcpLp when it is inference phase
  */
 class TcpLpInferenceTest2 : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * \param cWnd Congestion window size
+   * \param segmentSize Segment size
+   * \param segmentsAcked Segments acked
+   * \param rtt RTT
+   * \param name Test case name
+   */
   TcpLpInferenceTest2 (uint32_t cWnd, uint32_t segmentSize,
                        uint32_t segmentsAcked, Time rtt, const std::string &name);
 
 private:
   virtual void DoRun (void);
-  void ExecuteTest (void);
 
-  uint32_t m_cWnd;
-  uint32_t m_segmentSize;
-  uint32_t m_segmentsAcked;
-  Time m_rtt;
-  Ptr<TcpSocketState> m_state;
+  uint32_t m_cWnd;          //!< Congestion window size
+  uint32_t m_segmentSize;   //!< Segment size
+  uint32_t m_segmentsAcked; //!< Segments acked
+  Time m_rtt;               //!< RTT
+  Ptr<TcpSocketState> m_state;  //!< TCP socket state
 };
 
 TcpLpInferenceTest2::TcpLpInferenceTest2 (uint32_t cWnd, uint32_t segmentSize,uint32_t segmentsAcked, Time rtt, const std::string &name)
@@ -191,14 +210,6 @@
 void
 TcpLpInferenceTest2::DoRun ()
 {
-  Simulator::Schedule (Seconds (0.0), &TcpLpInferenceTest2::ExecuteTest, this);
-  Simulator::Run ();
-  Simulator::Destroy ();
-}
-
-void
-TcpLpInferenceTest2::ExecuteTest ()
-{
   m_state = CreateObject <TcpSocketState> ();
   m_state->m_cWnd = m_cWnd;
   m_state->m_segmentSize = m_segmentSize;
@@ -221,19 +232,29 @@
 
   NS_TEST_ASSERT_MSG_EQ (m_state->m_cWnd.Get (), m_cWnd,
                          "cWnd has not updated correctly");
+  Simulator::Run ();
+  Simulator::Destroy ();
 }
 
-static class TcpLpTestSuite : public TestSuite
+/**
+ * \ingroup internet-test
+ * \ingroup tests
+ *
+ * Test the behaviour common to New Reno
+ */
+class TcpLpTestSuite : public TestSuite
 {
 public:
   TcpLpTestSuite () : TestSuite ("tcp-lp-test", UNIT)
   {
-    AddTestCase (new TcpLpToNewReno (4 * 1446, 1446,2, 2 * 1446, MilliSeconds (100), "LP falls to New Reno if the owd is within threshold"), TestCase::QUICK);
+    AddTestCase (new TcpLpToNewReno (4 * 1446, 1446, 2, 2 * 1446, MilliSeconds (100), "LP falls to New Reno if the cwd is within threshold"), TestCase::QUICK);
 
-    AddTestCase (new TcpLpInferenceTest1 (2 * 1446, 1446,2, MilliSeconds (100), "LP enters Inference phase when owd exceeds threshold for the first time"), TestCase::QUICK);
+    AddTestCase (new TcpLpInferenceTest1 (2 * 1446, 1446, 2, MilliSeconds (100), "LP enters Inference phase when cwd exceeds threshold for the first time"), TestCase::QUICK);
 
-    AddTestCase (new TcpLpInferenceTest2 (2 * 1446, 1446,2, MilliSeconds (100), "LP reduces cWnd to 1 if owd exceeds threshold in inference phase"), TestCase::QUICK);
+    AddTestCase (new TcpLpInferenceTest2 (2 * 1446, 1446, 2, MilliSeconds (100), "LP reduces cWnd to 1 if cwd exceeds threshold in inference phase"), TestCase::QUICK);
   }
-} g_tcplpTest;
+};
+
+static TcpLpTestSuite g_tcplpTest; //!< static var for test initialization
 
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/tcp-rate-ops-test.cc ns-3.34/src/internet/test/tcp-rate-ops-test.cc
--- ns-3.33/src/internet/test/tcp-rate-ops-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/tcp-rate-ops-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -44,31 +44,47 @@
 class TcpRateLinuxBasicTest : public TestCase
 {
 public:
+
+  /**
+   * Constructor
+   * \param cWnd Congestion window size
+   * \param tailSeq Tail sequence number
+   * \param nextTx Tx next sequence number
+   * \param testCase test case type
+   * \param testName test name
+   */
   TcpRateLinuxBasicTest (uint32_t cWnd, SequenceNumber32 tailSeq, SequenceNumber32 nextTx,
-                         uint32_t lostOut, uint32_t retransOut, uint32_t testCase,
-                         std::string testName);
+                         uint32_t testCase, std::string testName);
 
 private:
   virtual void DoRun (void);
 
+  /**
+   * Send an application packet
+   * \param skb the data to send
+   */
   void SendSkb (TcpTxItem * skb);
+  /**
+   * Deliver an application packet
+   * \param skb the data to deliver
+   */
   void SkbDelivered (TcpTxItem * skb);
 
-  TcpRateLinux              m_rateOps;
-  uint32_t                  m_cWnd;
-  uint32_t                  m_inFlight;
-  uint32_t                  m_segmentSize;
-  uint32_t                  m_delivered;
-  Time                      m_deliveredTime;
-  SequenceNumber32          m_tailSeq;
-  SequenceNumber32          m_nextTx;
-  uint32_t                  m_testCase;
-  std::vector <TcpTxItem *> m_skbs;
+  TcpRateLinux              m_rateOps;        //!< Rate information for TCP
+  uint32_t                  m_cWnd;           //!< Congestion window size
+  uint32_t                  m_inFlight;       //!< Number of packets in-flight
+  uint32_t                  m_segmentSize;    //!< Segment size
+  uint32_t                  m_delivered;      //!< Number of segments delivered
+  Time                      m_deliveredTime;  //!< Last time of a delivery
+  SequenceNumber32          m_tailSeq;        //!< Tail sequence number
+  SequenceNumber32          m_nextTx;         //!< Tx next sequence number
+  uint32_t                  m_testCase;       //!< Test case type
+  std::vector <TcpTxItem *> m_skbs;           //!< Application packets
 };
 
 TcpRateLinuxBasicTest::TcpRateLinuxBasicTest (uint32_t cWnd, SequenceNumber32 tailSeq,
-                                              SequenceNumber32 nextTx, uint32_t lostOut,
-                                              uint32_t retransOut, uint32_t testCase, std::string testName)
+                                              SequenceNumber32 nextTx,
+                                              uint32_t testCase, std::string testName)
   : TestCase (testName),
   m_cWnd (cWnd),
   m_inFlight (0),
@@ -548,8 +564,8 @@
   TcpRateOpsTestSuite ()
     : TestSuite ("tcp-rate-ops", UNIT)
   {
-    AddTestCase (new TcpRateLinuxBasicTest (1000, SequenceNumber32 (20), SequenceNumber32 (11), 1, 0, 0, "Testing SkbDelivered and SkbSent"), TestCase::QUICK);
-    AddTestCase (new TcpRateLinuxBasicTest (1000, SequenceNumber32 (11), SequenceNumber32 (11), 2, 0, 0, "Testing SkbDelivered and SkbSent with app limited data"), TestCase::QUICK);
+    AddTestCase (new TcpRateLinuxBasicTest (1000, SequenceNumber32 (20), SequenceNumber32 (11), 1, "Testing SkbDelivered and SkbSent"), TestCase::QUICK);
+    AddTestCase (new TcpRateLinuxBasicTest (1000, SequenceNumber32 (11), SequenceNumber32 (11), 2, "Testing SkbDelivered and SkbSent with app limited data"), TestCase::QUICK);
 
     std::vector<uint32_t> toDrop;
     toDrop.push_back (4001);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/tcp-syn-connection-failed-test.cc ns-3.34/src/internet/test/tcp-syn-connection-failed-test.cc
--- ns-3.33/src/internet/test/tcp-syn-connection-failed-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/tcp-syn-connection-failed-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -51,8 +51,8 @@
   virtual void DoRun ();
 
 private:
-  bool m_connectionFailed{false};
-  bool m_useEcn {false};
+  bool m_connectionFailed{false}; //!< Connection failure indicator
+  bool m_useEcn {false}; //!< Use ECN (true or false)
 };
 
 TcpSynConnectionFailedTest::TcpSynConnectionFailedTest (std::string desc, bool useEcn) : TestCase (desc), m_useEcn (useEcn)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/test/tcp-tx-buffer-test.cc ns-3.34/src/internet/test/tcp-tx-buffer-test.cc
--- ns-3.33/src/internet/test/tcp-tx-buffer-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/test/tcp-tx-buffer-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -53,7 +53,10 @@
   /** \brief Test the logic of merging items in GetTransmittedSegment()
    * which is triggered by CopyFromSequence()*/
   void TestMergeItemsWhenGetTransmittedSegment ();
-  /** \brief Callback to provide a value of receiver window */
+  /**
+   * \brief Callback to provide a value of receiver window
+   * \returns the receiver window size
+   */
   uint32_t GetRWnd (void) const;
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet/wscript ns-3.34/src/internet/wscript
--- ns-3.33/src/internet/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet/wscript	2021-07-14 10:31:06.000000000 -0700
@@ -163,6 +163,7 @@
         'model/tcp-htcp.cc',
         'model/tcp-lp.cc',
         'model/tcp-dctcp.cc',
+        'model/tcp-bbr.cc',
         'model/tcp-rx-buffer.cc',
         'model/tcp-tx-buffer.cc',
         'model/tcp-tx-item.cc',
@@ -307,6 +308,7 @@
         'test/tcp-dctcp-test.cc',
         'test/tcp-syn-connection-failed-test.cc',
         'test/tcp-pacing-test.cc',
+        'test/tcp-bbr-test.cc',
         ]
     # Tests encapsulating example programs should be listed here
     if (bld.env['ENABLE_EXAMPLES']):
@@ -420,6 +422,8 @@
         'model/tcp-htcp.h',
         'model/tcp-lp.h',
         'model/tcp-dctcp.h',
+        'model/windowed-filter.h',
+        'model/tcp-bbr.h',
         'model/tcp-ledbat.h',
         'model/tcp-socket-base.h',
         'model/tcp-socket-state.h',
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet-apps/bindings/callbacks_list.py ns-3.34/src/internet-apps/bindings/callbacks_list.py
--- ns-3.33/src/internet-apps/bindings/callbacks_list.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet-apps/bindings/callbacks_list.py	2021-07-14 10:31:06.000000000 -0700
@@ -7,5 +7,8 @@
     ['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::Ipv6>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'const ns3::Ipv6Header &', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ipv6L3Protocol::DropReason', 'ns3::Ptr<ns3::Ipv6>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'const ns3::Ipv6Header &', 'ns3::Ptr<const ns3::Packet>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet-apps/bindings/modulegen__gcc_ILP32.py ns-3.34/src/internet-apps/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/internet-apps/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet-apps/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -100,6 +100,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -115,6 +117,14 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress [class]
+    module.add_class('Ipv6InterfaceAddress', import_from_module='ns.internet')
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::State_e [enumeration]
+    module.add_enum('State_e', ['TENTATIVE', 'DEPRECATED', 'PREFERRED', 'PERMANENT', 'HOMEADDRESS', 'TENTATIVE_OPTIMISTIC', 'INVALID'], outer_class=root_module['ns3::Ipv6InterfaceAddress'], import_from_module='ns.internet')
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Scope_e [enumeration]
+    module.add_enum('Scope_e', ['HOST', 'LINKLOCAL', 'GLOBAL'], outer_class=root_module['ns3::Ipv6InterfaceAddress'], import_from_module='ns.internet')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -219,6 +229,14 @@
     module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## header.h (module 'network'): ns3::Header [class]
     module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header [class]
+    module.add_class('Ipv6Header', import_from_module='ns.internet', parent=root_module['ns3::Header'])
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType [enumeration]
+    module.add_enum('DscpType', ['DscpDefault', 'DSCP_CS1', 'DSCP_AF11', 'DSCP_AF12', 'DSCP_AF13', 'DSCP_CS2', 'DSCP_AF21', 'DSCP_AF22', 'DSCP_AF23', 'DSCP_CS3', 'DSCP_AF31', 'DSCP_AF32', 'DSCP_AF33', 'DSCP_CS4', 'DSCP_AF41', 'DSCP_AF42', 'DSCP_AF43', 'DSCP_CS5', 'DSCP_EF', 'DSCP_CS6', 'DSCP_CS7'], outer_class=root_module['ns3::Ipv6Header'], import_from_module='ns.internet')
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::NextHeader_e [enumeration]
+    module.add_enum('NextHeader_e', ['IPV6_EXT_HOP_BY_HOP', 'IPV6_IPV4', 'IPV6_TCP', 'IPV6_UDP', 'IPV6_IPV6', 'IPV6_EXT_ROUTING', 'IPV6_EXT_FRAGMENTATION', 'IPV6_EXT_CONFIDENTIALITY', 'IPV6_EXT_AUTHENTIFICATION', 'IPV6_ICMPV6', 'IPV6_EXT_END', 'IPV6_EXT_DESTINATION', 'IPV6_SCTP', 'IPV6_EXT_MOBILITY', 'IPV6_UDP_LITE'], outer_class=root_module['ns3::Ipv6Header'], import_from_module='ns.internet')
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::EcnType [enumeration]
+    module.add_enum('EcnType', ['ECN_NotECT', 'ECN_ECT1', 'ECN_ECT0', 'ECN_CE'], outer_class=root_module['ns3::Ipv6Header'], import_from_module='ns.internet')
     ## object.h (module 'core'): ns3::Object [class]
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
@@ -371,10 +389,27 @@
     module.add_class('Ipv4MulticastRoute', import_from_module='ns.internet', parent=root_module['ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >'])
     ## ipv4-route.h (module 'internet'): ns3::Ipv4Route [class]
     module.add_class('Ipv4Route', import_from_module='ns.internet', parent=root_module['ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >'])
+    ## ipv6.h (module 'internet'): ns3::Ipv6 [class]
+    module.add_class('Ipv6', import_from_module='ns.internet', parent=root_module['ns3::Object'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker [class]
     module.add_class('Ipv6AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue [class]
     module.add_class('Ipv6AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6L3Protocol [class]
+    module.add_class('Ipv6L3Protocol', import_from_module='ns.internet', parent=root_module['ns3::Ipv6'])
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6L3Protocol::DropReason [enumeration]
+    module.add_enum('DropReason', ['DROP_TTL_EXPIRED', 'DROP_NO_ROUTE', 'DROP_INTERFACE_DOWN', 'DROP_ROUTE_ERROR', 'DROP_UNKNOWN_PROTOCOL', 'DROP_UNKNOWN_OPTION', 'DROP_MALFORMED_HEADER', 'DROP_FRAGMENT_TIMEOUT'], outer_class=root_module['ns3::Ipv6L3Protocol'], import_from_module='ns.internet')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, uint32_t )', 'ns3::Ipv6L3Protocol::SentTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, uint32_t )*', 'ns3::Ipv6L3Protocol::SentTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, uint32_t )&', 'ns3::Ipv6L3Protocol::SentTracedCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv6 >, uint32_t )', 'ns3::Ipv6L3Protocol::TxRxTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv6 >, uint32_t )*', 'ns3::Ipv6L3Protocol::TxRxTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv6 >, uint32_t )&', 'ns3::Ipv6L3Protocol::TxRxTracedCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr< ns3::Ipv6 >, uint32_t )', 'ns3::Ipv6L3Protocol::DropTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr< ns3::Ipv6 >, uint32_t )*', 'ns3::Ipv6L3Protocol::DropTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr< ns3::Ipv6 >, uint32_t )&', 'ns3::Ipv6L3Protocol::DropTracedCallback&')
+    ## ipv6-pmtu-cache.h (module 'internet'): ns3::Ipv6PmtuCache [class]
+    module.add_class('Ipv6PmtuCache', import_from_module='ns.internet', parent=root_module['ns3::Object'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker [class]
     module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
@@ -479,6 +514,12 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv4Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv6Header &', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ipv6L3Protocol::DropReason', 'ns3::Ptr<ns3::Ipv6>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv6Header &', 'ns3::Ptr<const ns3::Packet>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::Ipv6>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -638,10 +679,13 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
+    register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -677,6 +721,7 @@
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
+    register_Ns3Ipv6Header_methods(root_module, root_module['ns3::Ipv6Header'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
     register_Ns3RandomVariableStream_methods(root_module, root_module['ns3::RandomVariableStream'])
@@ -744,8 +789,11 @@
     register_Ns3Ipv4MaskValue_methods(root_module, root_module['ns3::Ipv4MaskValue'])
     register_Ns3Ipv4MulticastRoute_methods(root_module, root_module['ns3::Ipv4MulticastRoute'])
     register_Ns3Ipv4Route_methods(root_module, root_module['ns3::Ipv4Route'])
+    register_Ns3Ipv6_methods(root_module, root_module['ns3::Ipv6'])
     register_Ns3Ipv6AddressChecker_methods(root_module, root_module['ns3::Ipv6AddressChecker'])
     register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
+    register_Ns3Ipv6L3Protocol_methods(root_module, root_module['ns3::Ipv6L3Protocol'])
+    register_Ns3Ipv6PmtuCache_methods(root_module, root_module['ns3::Ipv6PmtuCache'])
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
     register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
@@ -776,6 +824,9 @@
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Const_ns3Ipv6Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv6L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv6__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Const_ns3Ipv6Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ptr__lt__ns3Ipv6__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1909,6 +1960,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2235,6 +2298,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2310,6 +2378,89 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3Ipv6InterfaceAddress_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress() [constructor]
+    cls.add_constructor([])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): uint32_t ns3::Ipv6InterfaceAddress::GetNsDadUid() const [member function]
+    cls.add_method('GetNsDadUid', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
+    cls.add_method('GetPrefix', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Scope_e ns3::Ipv6InterfaceAddress::GetScope() const [member function]
+    cls.add_method('GetScope', 
+                   'ns3::Ipv6InterfaceAddress::Scope_e', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::State_e ns3::Ipv6InterfaceAddress::GetState() const [member function]
+    cls.add_method('GetState', 
+                   'ns3::Ipv6InterfaceAddress::State_e', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::IsInSameSubnet(ns3::Ipv6Address b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'b')], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetAddress(ns3::Ipv6Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetNsDadUid(uint32_t uid) [member function]
+    cls.add_method('SetNsDadUid', 
+                   'void', 
+                   [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
+    cls.add_method('SetScope', 
+                   'void', 
+                   [param('ns3::Ipv6InterfaceAddress::Scope_e', 'scope')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetState(ns3::Ipv6InterfaceAddress::State_e state) [member function]
+    cls.add_method('SetState', 
+                   'void', 
+                   [param('ns3::Ipv6InterfaceAddress::State_e', 'state')])
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2330,6 +2481,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -3919,6 +4075,134 @@
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3Ipv6Header_methods(root_module, cls):
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::Ipv6Header(ns3::Ipv6Header const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Header const &', 'arg0')])
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::Ipv6Header() [constructor]
+    cls.add_constructor([])
+    ## ipv6-header.h (module 'internet'): uint32_t ns3::Ipv6Header::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ipv6-header.h (module 'internet'): std::string ns3::Ipv6Header::DscpTypeToString(ns3::Ipv6Header::DscpType dscp) const [member function]
+    cls.add_method('DscpTypeToString', 
+                   'std::string', 
+                   [param('ns3::Ipv6Header::DscpType', 'dscp')], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): std::string ns3::Ipv6Header::EcnTypeToString(ns3::Ipv6Header::EcnType ecn) const [member function]
+    cls.add_method('EcnTypeToString', 
+                   'std::string', 
+                   [param('ns3::Ipv6Header::EcnType', 'ecn')], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestinationAddress() const [member function]
+    cls.add_method('GetDestinationAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
+    cls.add_method('GetDscp', 
+                   'ns3::Ipv6Header::DscpType', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::EcnType ns3::Ipv6Header::GetEcn() const [member function]
+    cls.add_method('GetEcn', 
+                   'ns3::Ipv6Header::EcnType', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint32_t ns3::Ipv6Header::GetFlowLabel() const [member function]
+    cls.add_method('GetFlowLabel', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetHopLimit() const [member function]
+    cls.add_method('GetHopLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::TypeId ns3::Ipv6Header::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetNextHeader() const [member function]
+    cls.add_method('GetNextHeader', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint16_t ns3::Ipv6Header::GetPayloadLength() const [member function]
+    cls.add_method('GetPayloadLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint32_t ns3::Ipv6Header::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
+    cls.add_method('GetSourceAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
+    cls.add_method('GetTrafficClass', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): static ns3::TypeId ns3::Ipv6Header::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestinationAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
+    cls.add_method('SetDscp', 
+                   'void', 
+                   [param('ns3::Ipv6Header::DscpType', 'dscp')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetEcn(ns3::Ipv6Header::EcnType ecn) [member function]
+    cls.add_method('SetEcn', 
+                   'void', 
+                   [param('ns3::Ipv6Header::EcnType', 'ecn')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetFlowLabel(uint32_t flow) [member function]
+    cls.add_method('SetFlowLabel', 
+                   'void', 
+                   [param('uint32_t', 'flow')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetHopLimit(uint8_t limit) [member function]
+    cls.add_method('SetHopLimit', 
+                   'void', 
+                   [param('uint8_t', 'limit')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetNextHeader(uint8_t next) [member function]
+    cls.add_method('SetNextHeader', 
+                   'void', 
+                   [param('uint8_t', 'next')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetPayloadLength(uint16_t len) [member function]
+    cls.add_method('SetPayloadLength', 
+                   'void', 
+                   [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSourceAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
+    cls.add_method('SetTrafficClass', 
+                   'void', 
+                   [param('uint8_t', 'traffic')])
+    return
+
 def register_Ns3Object_methods(root_module, cls):
     ## object.h (module 'core'): ns3::Object::Object() [constructor]
     cls.add_constructor([])
@@ -4452,10 +4736,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -5348,6 +5632,21 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ipv6Header const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ipv6L3Protocol::DropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::Time'], visibility='protected')
     return
 
@@ -6543,6 +6842,200 @@
                    [param('ns3::Ipv4Address', 'src')])
     return
 
+def register_Ns3Ipv6_methods(root_module, cls):
+    ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6(ns3::Ipv6 const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
+    ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
+    cls.add_constructor([])
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
+    cls.add_method('AddAddress', 
+                   'bool', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('AddInterface', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6::GetAddress(uint32_t interface, uint32_t addressIndex) const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [param('uint32_t', 'interface'), param('uint32_t', 'addressIndex')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): int32_t ns3::Ipv6::GetInterfaceForAddress(ns3::Ipv6Address address) const [member function]
+    cls.add_method('GetInterfaceForAddress', 
+                   'int32_t', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): int32_t ns3::Ipv6::GetInterfaceForDevice(ns3::Ptr<const ns3::NetDevice> device) const [member function]
+    cls.add_method('GetInterfaceForDevice', 
+                   'int32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): int32_t ns3::Ipv6::GetInterfaceForPrefix(ns3::Ipv6Address address, ns3::Ipv6Prefix mask) const [member function]
+    cls.add_method('GetInterfaceForPrefix', 
+                   'int32_t', 
+                   [param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'mask')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): uint16_t ns3::Ipv6::GetMetric(uint32_t interface) const [member function]
+    cls.add_method('GetMetric', 
+                   'uint16_t', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): uint16_t ns3::Ipv6::GetMtu(uint32_t interface) const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::GetNAddresses(uint32_t interface) const [member function]
+    cls.add_method('GetNAddresses', 
+                   'uint32_t', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::GetNInterfaces() const [member function]
+    cls.add_method('GetNInterfaces', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv6::GetNetDevice(uint32_t interface) [member function]
+    cls.add_method('GetNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'interface')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv6::GetProtocol(int protocolNumber) const [member function]
+    cls.add_method('GetProtocol', 
+                   'ns3::Ptr< ns3::IpL4Protocol >', 
+                   [param('int', 'protocolNumber')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv6::GetProtocol(int protocolNumber, int32_t interfaceIndex) const [member function]
+    cls.add_method('GetProtocol', 
+                   'ns3::Ptr< ns3::IpL4Protocol >', 
+                   [param('int', 'protocolNumber'), param('int32_t', 'interfaceIndex')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ptr<ns3::Ipv6RoutingProtocol> ns3::Ipv6::GetRoutingProtocol() const [member function]
+    cls.add_method('GetRoutingProtocol', 
+                   'ns3::Ptr< ns3::Ipv6RoutingProtocol >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): static ns3::TypeId ns3::Ipv6::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::Insert(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
+    cls.add_method('Insert', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::Insert(ns3::Ptr<ns3::IpL4Protocol> protocol, uint32_t interfaceIndex) [member function]
+    cls.add_method('Insert', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol'), param('uint32_t', 'interfaceIndex')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::IsForwarding(uint32_t interface) const [member function]
+    cls.add_method('IsForwarding', 
+                   'bool', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::IsUp(uint32_t interface) const [member function]
+    cls.add_method('IsUp', 
+                   'bool', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::RegisterExtensions() [member function]
+    cls.add_method('RegisterExtensions', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::RegisterOptions() [member function]
+    cls.add_method('RegisterOptions', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol, uint32_t interfaceIndex) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol'), param('uint32_t', 'interfaceIndex')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::RemoveAddress(uint32_t interface, uint32_t addressIndex) [member function]
+    cls.add_method('RemoveAddress', 
+                   'bool', 
+                   [param('uint32_t', 'interface'), param('uint32_t', 'addressIndex')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::RemoveAddress(uint32_t interface, ns3::Ipv6Address address) [member function]
+    cls.add_method('RemoveAddress', 
+                   'bool', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'address')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Address source, ns3::Ipv6Address destination, uint8_t protocol, ns3::Ptr<ns3::Ipv6Route> route) [member function]
+    cls.add_method('Send', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Address', 'source'), param('ns3::Ipv6Address', 'destination'), param('uint8_t', 'protocol'), param('ns3::Ptr< ns3::Ipv6Route >', 'route')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetDown(uint32_t interface) [member function]
+    cls.add_method('SetDown', 
+                   'void', 
+                   [param('uint32_t', 'interface')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetForwarding(uint32_t interface, bool val) [member function]
+    cls.add_method('SetForwarding', 
+                   'void', 
+                   [param('uint32_t', 'interface'), param('bool', 'val')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetMetric(uint32_t interface, uint16_t metric) [member function]
+    cls.add_method('SetMetric', 
+                   'void', 
+                   [param('uint32_t', 'interface'), param('uint16_t', 'metric')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetPmtu(ns3::Ipv6Address dst, uint32_t pmtu) [member function]
+    cls.add_method('SetPmtu', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('uint32_t', 'pmtu')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetRoutingProtocol(ns3::Ptr<ns3::Ipv6RoutingProtocol> routingProtocol) [member function]
+    cls.add_method('SetRoutingProtocol', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Ipv6RoutingProtocol >', 'routingProtocol')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetUp(uint32_t interface) [member function]
+    cls.add_method('SetUp', 
+                   'void', 
+                   [param('uint32_t', 'interface')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6::SourceAddressSelection(uint32_t interface, ns3::Ipv6Address dest) [member function]
+    cls.add_method('SourceAddressSelection', 
+                   'ns3::Ipv6Address', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'dest')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ipv6::IF_ANY [variable]
+    cls.add_static_attribute('IF_ANY', 'uint32_t const', is_const=True)
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::GetIpForward() const [member function]
+    cls.add_method('GetIpForward', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::GetMtuDiscover() const [member function]
+    cls.add_method('GetMtuDiscover', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetIpForward(bool forward) [member function]
+    cls.add_method('SetIpForward', 
+                   'void', 
+                   [param('bool', 'forward')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetMtuDiscover(bool mtuDiscover) [member function]
+    cls.add_method('SetMtuDiscover', 
+                   'void', 
+                   [param('bool', 'mtuDiscover')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
 def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
     ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
     cls.add_constructor([])
@@ -6583,6 +7076,329 @@
                    [param('ns3::Ipv6Address const &', 'value')])
     return
 
+def register_Ns3Ipv6L3Protocol_methods(root_module, cls):
+    ## ipv6-l3-protocol.h (module 'internet'): static ns3::TypeId ns3::Ipv6L3Protocol::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6L3Protocol::PROT_NUMBER [variable]
+    cls.add_static_attribute('PROT_NUMBER', 'uint16_t const', is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6L3Protocol::Ipv6L3Protocol() [constructor]
+    cls.add_constructor([])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::Insert(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
+    cls.add_method('Insert', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::Insert(ns3::Ptr<ns3::IpL4Protocol> protocol, uint32_t interfaceIndex) [member function]
+    cls.add_method('Insert', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol'), param('uint32_t', 'interfaceIndex')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol, uint32_t interfaceIndex) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol'), param('uint32_t', 'interfaceIndex')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv6L3Protocol::GetProtocol(int protocolNumber) const [member function]
+    cls.add_method('GetProtocol', 
+                   'ns3::Ptr< ns3::IpL4Protocol >', 
+                   [param('int', 'protocolNumber')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv6L3Protocol::GetProtocol(int protocolNumber, int32_t interfaceIndex) const [member function]
+    cls.add_method('GetProtocol', 
+                   'ns3::Ptr< ns3::IpL4Protocol >', 
+                   [param('int', 'protocolNumber'), param('int32_t', 'interfaceIndex')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Socket> ns3::Ipv6L3Protocol::CreateRawSocket() [member function]
+    cls.add_method('CreateRawSocket', 
+                   'ns3::Ptr< ns3::Socket >', 
+                   [])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DeleteRawSocket(ns3::Ptr<ns3::Socket> socket) [member function]
+    cls.add_method('DeleteRawSocket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Socket >', 'socket')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetDefaultTtl(uint8_t ttl) [member function]
+    cls.add_method('SetDefaultTtl', 
+                   'void', 
+                   [param('uint8_t', 'ttl')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetDefaultTclass(uint8_t tclass) [member function]
+    cls.add_method('SetDefaultTclass', 
+                   'void', 
+                   [param('uint8_t', 'tclass')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::Receive(ns3::Ptr<ns3::NetDevice> device, ns3::Ptr<const ns3::Packet> p, uint16_t protocol, ns3::Address const & from, ns3::Address const & to, ns3::NetDevice::PacketType packetType) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::Ptr< ns3::Packet const >', 'p'), param('uint16_t', 'protocol'), param('ns3::Address const &', 'from'), param('ns3::Address const &', 'to'), param('ns3::NetDevice::PacketType', 'packetType')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Address source, ns3::Ipv6Address destination, uint8_t protocol, ns3::Ptr<ns3::Ipv6Route> route) [member function]
+    cls.add_method('Send', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Address', 'source'), param('ns3::Ipv6Address', 'destination'), param('uint8_t', 'protocol'), param('ns3::Ptr< ns3::Ipv6Route >', 'route')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetRoutingProtocol(ns3::Ptr<ns3::Ipv6RoutingProtocol> routingProtocol) [member function]
+    cls.add_method('SetRoutingProtocol', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Ipv6RoutingProtocol >', 'routingProtocol')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Ipv6RoutingProtocol> ns3::Ipv6L3Protocol::GetRoutingProtocol() const [member function]
+    cls.add_method('GetRoutingProtocol', 
+                   'ns3::Ptr< ns3::Ipv6RoutingProtocol >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): uint32_t ns3::Ipv6L3Protocol::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('AddInterface', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Ipv6Interface> ns3::Ipv6L3Protocol::GetInterface(uint32_t i) const [member function]
+    cls.add_method('GetInterface', 
+                   'ns3::Ptr< ns3::Ipv6Interface >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): uint32_t ns3::Ipv6L3Protocol::GetNInterfaces() const [member function]
+    cls.add_method('GetNInterfaces', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): int32_t ns3::Ipv6L3Protocol::GetInterfaceForAddress(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetInterfaceForAddress', 
+                   'int32_t', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): int32_t ns3::Ipv6L3Protocol::GetInterfaceForPrefix(ns3::Ipv6Address addr, ns3::Ipv6Prefix mask) const [member function]
+    cls.add_method('GetInterfaceForPrefix', 
+                   'int32_t', 
+                   [param('ns3::Ipv6Address', 'addr'), param('ns3::Ipv6Prefix', 'mask')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): int32_t ns3::Ipv6L3Protocol::GetInterfaceForDevice(ns3::Ptr<const ns3::NetDevice> device) const [member function]
+    cls.add_method('GetInterfaceForDevice', 
+                   'int32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
+    cls.add_method('AddAddress', 
+                   'bool', 
+                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [param('uint32_t', 'interfaceIndex'), param('uint32_t', 'addressIndex')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): uint32_t ns3::Ipv6L3Protocol::GetNAddresses(uint32_t interface) const [member function]
+    cls.add_method('GetNAddresses', 
+                   'uint32_t', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interfaceIndex, uint32_t addressIndex) [member function]
+    cls.add_method('RemoveAddress', 
+                   'bool', 
+                   [param('uint32_t', 'interfaceIndex'), param('uint32_t', 'addressIndex')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('RemoveAddress', 
+                   'bool', 
+                   [param('uint32_t', 'interfaceIndex'), param('ns3::Ipv6Address', 'address')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetMetric(uint32_t i, uint16_t metric) [member function]
+    cls.add_method('SetMetric', 
+                   'void', 
+                   [param('uint32_t', 'i'), param('uint16_t', 'metric')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): uint16_t ns3::Ipv6L3Protocol::GetMetric(uint32_t i) const [member function]
+    cls.add_method('GetMetric', 
+                   'uint16_t', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): uint16_t ns3::Ipv6L3Protocol::GetMtu(uint32_t i) const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetPmtu(ns3::Ipv6Address dst, uint32_t pmtu) [member function]
+    cls.add_method('SetPmtu', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('uint32_t', 'pmtu')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::IsUp(uint32_t i) const [member function]
+    cls.add_method('IsUp', 
+                   'bool', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetUp(uint32_t i) [member function]
+    cls.add_method('SetUp', 
+                   'void', 
+                   [param('uint32_t', 'i')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetDown(uint32_t i) [member function]
+    cls.add_method('SetDown', 
+                   'void', 
+                   [param('uint32_t', 'i')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::IsForwarding(uint32_t i) const [member function]
+    cls.add_method('IsForwarding', 
+                   'bool', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetForwarding(uint32_t i, bool val) [member function]
+    cls.add_method('SetForwarding', 
+                   'void', 
+                   [param('uint32_t', 'i'), param('bool', 'val')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6L3Protocol::SourceAddressSelection(uint32_t interface, ns3::Ipv6Address dest) [member function]
+    cls.add_method('SourceAddressSelection', 
+                   'ns3::Ipv6Address', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'dest')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv6L3Protocol::GetNetDevice(uint32_t i) [member function]
+    cls.add_method('GetNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'i')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Icmpv6L4Protocol> ns3::Ipv6L3Protocol::GetIcmpv6() const [member function]
+    cls.add_method('GetIcmpv6', 
+                   'ns3::Ptr< ns3::Icmpv6L4Protocol >', 
+                   [], 
+                   is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::AddAutoconfiguredAddress(uint32_t interface, ns3::Ipv6Address network, ns3::Ipv6Prefix mask, uint8_t flags, uint32_t validTime, uint32_t preferredTime, ns3::Ipv6Address defaultRouter=ns3::Ipv6Address::GetZero()) [member function]
+    cls.add_method('AddAutoconfiguredAddress', 
+                   'void', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'network'), param('ns3::Ipv6Prefix', 'mask'), param('uint8_t', 'flags'), param('uint32_t', 'validTime'), param('uint32_t', 'preferredTime'), param('ns3::Ipv6Address', 'defaultRouter', default_value='ns3::Ipv6Address::GetZero()')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::RemoveAutoconfiguredAddress(uint32_t interface, ns3::Ipv6Address network, ns3::Ipv6Prefix mask, ns3::Ipv6Address defaultRouter) [member function]
+    cls.add_method('RemoveAutoconfiguredAddress', 
+                   'void', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'network'), param('ns3::Ipv6Prefix', 'mask'), param('ns3::Ipv6Address', 'defaultRouter')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::RegisterExtensions() [member function]
+    cls.add_method('RegisterExtensions', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::RegisterOptions() [member function]
+    cls.add_method('RegisterOptions', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::ReportDrop(ns3::Ipv6Header ipHeader, ns3::Ptr<ns3::Packet> p, ns3::Ipv6L3Protocol::DropReason dropReason) [member function]
+    cls.add_method('ReportDrop', 
+                   'void', 
+                   [param('ns3::Ipv6Header', 'ipHeader'), param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6L3Protocol::DropReason', 'dropReason')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::AddMulticastAddress(ns3::Ipv6Address address) [member function]
+    cls.add_method('AddMulticastAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::AddMulticastAddress(ns3::Ipv6Address address, uint32_t interface) [member function]
+    cls.add_method('AddMulticastAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::RemoveMulticastAddress(ns3::Ipv6Address address) [member function]
+    cls.add_method('RemoveMulticastAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::RemoveMulticastAddress(ns3::Ipv6Address address, uint32_t interface) [member function]
+    cls.add_method('RemoveMulticastAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')])
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::IsRegisteredMulticastAddress(ns3::Ipv6Address address) const [member function]
+    cls.add_method('IsRegisteredMulticastAddress', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::IsRegisteredMulticastAddress(ns3::Ipv6Address address, uint32_t interface) const [member function]
+    cls.add_method('IsRegisteredMulticastAddress', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')], 
+                   is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::ReachabilityHint(uint32_t ipInterfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('ReachabilityHint', 
+                   'bool', 
+                   [param('uint32_t', 'ipInterfaceIndex'), param('ns3::Ipv6Address', 'address')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetIpForward(bool forward) [member function]
+    cls.add_method('SetIpForward', 
+                   'void', 
+                   [param('bool', 'forward')], 
+                   is_virtual=True, visibility='private')
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::GetIpForward() const [member function]
+    cls.add_method('GetIpForward', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetMtuDiscover(bool mtuDiscover) [member function]
+    cls.add_method('SetMtuDiscover', 
+                   'void', 
+                   [param('bool', 'mtuDiscover')], 
+                   is_virtual=True, visibility='private')
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::GetMtuDiscover() const [member function]
+    cls.add_method('GetMtuDiscover', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetSendIcmpv6Redirect(bool sendIcmpv6Redirect) [member function]
+    cls.add_method('SetSendIcmpv6Redirect', 
+                   'void', 
+                   [param('bool', 'sendIcmpv6Redirect')], 
+                   is_virtual=True, visibility='private')
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::GetSendIcmpv6Redirect() const [member function]
+    cls.add_method('GetSendIcmpv6Redirect', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3Ipv6PmtuCache_methods(root_module, cls):
+    ## ipv6-pmtu-cache.h (module 'internet'): ns3::Ipv6PmtuCache::Ipv6PmtuCache(ns3::Ipv6PmtuCache const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6PmtuCache const &', 'arg0')])
+    ## ipv6-pmtu-cache.h (module 'internet'): ns3::Ipv6PmtuCache::Ipv6PmtuCache() [constructor]
+    cls.add_constructor([])
+    ## ipv6-pmtu-cache.h (module 'internet'): void ns3::Ipv6PmtuCache::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ipv6-pmtu-cache.h (module 'internet'): uint32_t ns3::Ipv6PmtuCache::GetPmtu(ns3::Ipv6Address dst) [member function]
+    cls.add_method('GetPmtu', 
+                   'uint32_t', 
+                   [param('ns3::Ipv6Address', 'dst')])
+    ## ipv6-pmtu-cache.h (module 'internet'): ns3::Time ns3::Ipv6PmtuCache::GetPmtuValidityTime() const [member function]
+    cls.add_method('GetPmtuValidityTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ipv6-pmtu-cache.h (module 'internet'): static ns3::TypeId ns3::Ipv6PmtuCache::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-pmtu-cache.h (module 'internet'): void ns3::Ipv6PmtuCache::SetPmtu(ns3::Ipv6Address dst, uint32_t pmtu) [member function]
+    cls.add_method('SetPmtu', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('uint32_t', 'pmtu')])
+    ## ipv6-pmtu-cache.h (module 'internet'): bool ns3::Ipv6PmtuCache::SetPmtuValidityTime(ns3::Time validity) [member function]
+    cls.add_method('SetPmtuValidityTime', 
+                   'bool', 
+                   [param('ns3::Time', 'validity')])
+    return
+
 def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
     ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
     cls.add_constructor([])
@@ -8005,6 +8821,72 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Const_ns3Ipv6Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv6L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv6__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr< ns3::Ipv6 >, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ipv6Header const & arg0, ns3::Ptr<const ns3::Packet> arg1, ns3::Ipv6L3Protocol::DropReason arg2, ns3::Ptr<ns3::Ipv6> arg3, unsigned int arg4) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ipv6Header const &', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('ns3::Ipv6L3Protocol::DropReason', 'arg2'), param('ns3::Ptr< ns3::Ipv6 >', 'arg3'), param('unsigned int', 'arg4')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Const_ns3Ipv6Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ipv6Header const & arg0, ns3::Ptr<const ns3::Packet> arg1, unsigned int arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ipv6Header const &', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('unsigned int', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ptr__lt__ns3Ipv6__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv6 >, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::Ptr<ns3::Ipv6> arg1, unsigned int arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::Ptr< ns3::Ipv6 >', 'arg1'), param('unsigned int', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet-apps/bindings/modulegen__gcc_LP64.py ns-3.34/src/internet-apps/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/internet-apps/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet-apps/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -100,6 +100,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -115,6 +117,14 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress [class]
+    module.add_class('Ipv6InterfaceAddress', import_from_module='ns.internet')
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::State_e [enumeration]
+    module.add_enum('State_e', ['TENTATIVE', 'DEPRECATED', 'PREFERRED', 'PERMANENT', 'HOMEADDRESS', 'TENTATIVE_OPTIMISTIC', 'INVALID'], outer_class=root_module['ns3::Ipv6InterfaceAddress'], import_from_module='ns.internet')
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Scope_e [enumeration]
+    module.add_enum('Scope_e', ['HOST', 'LINKLOCAL', 'GLOBAL'], outer_class=root_module['ns3::Ipv6InterfaceAddress'], import_from_module='ns.internet')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -219,6 +229,14 @@
     module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## header.h (module 'network'): ns3::Header [class]
     module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header [class]
+    module.add_class('Ipv6Header', import_from_module='ns.internet', parent=root_module['ns3::Header'])
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType [enumeration]
+    module.add_enum('DscpType', ['DscpDefault', 'DSCP_CS1', 'DSCP_AF11', 'DSCP_AF12', 'DSCP_AF13', 'DSCP_CS2', 'DSCP_AF21', 'DSCP_AF22', 'DSCP_AF23', 'DSCP_CS3', 'DSCP_AF31', 'DSCP_AF32', 'DSCP_AF33', 'DSCP_CS4', 'DSCP_AF41', 'DSCP_AF42', 'DSCP_AF43', 'DSCP_CS5', 'DSCP_EF', 'DSCP_CS6', 'DSCP_CS7'], outer_class=root_module['ns3::Ipv6Header'], import_from_module='ns.internet')
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::NextHeader_e [enumeration]
+    module.add_enum('NextHeader_e', ['IPV6_EXT_HOP_BY_HOP', 'IPV6_IPV4', 'IPV6_TCP', 'IPV6_UDP', 'IPV6_IPV6', 'IPV6_EXT_ROUTING', 'IPV6_EXT_FRAGMENTATION', 'IPV6_EXT_CONFIDENTIALITY', 'IPV6_EXT_AUTHENTIFICATION', 'IPV6_ICMPV6', 'IPV6_EXT_END', 'IPV6_EXT_DESTINATION', 'IPV6_SCTP', 'IPV6_EXT_MOBILITY', 'IPV6_UDP_LITE'], outer_class=root_module['ns3::Ipv6Header'], import_from_module='ns.internet')
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::EcnType [enumeration]
+    module.add_enum('EcnType', ['ECN_NotECT', 'ECN_ECT1', 'ECN_ECT0', 'ECN_CE'], outer_class=root_module['ns3::Ipv6Header'], import_from_module='ns.internet')
     ## object.h (module 'core'): ns3::Object [class]
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
@@ -371,10 +389,27 @@
     module.add_class('Ipv4MulticastRoute', import_from_module='ns.internet', parent=root_module['ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >'])
     ## ipv4-route.h (module 'internet'): ns3::Ipv4Route [class]
     module.add_class('Ipv4Route', import_from_module='ns.internet', parent=root_module['ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >'])
+    ## ipv6.h (module 'internet'): ns3::Ipv6 [class]
+    module.add_class('Ipv6', import_from_module='ns.internet', parent=root_module['ns3::Object'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker [class]
     module.add_class('Ipv6AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue [class]
     module.add_class('Ipv6AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6L3Protocol [class]
+    module.add_class('Ipv6L3Protocol', import_from_module='ns.internet', parent=root_module['ns3::Ipv6'])
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6L3Protocol::DropReason [enumeration]
+    module.add_enum('DropReason', ['DROP_TTL_EXPIRED', 'DROP_NO_ROUTE', 'DROP_INTERFACE_DOWN', 'DROP_ROUTE_ERROR', 'DROP_UNKNOWN_PROTOCOL', 'DROP_UNKNOWN_OPTION', 'DROP_MALFORMED_HEADER', 'DROP_FRAGMENT_TIMEOUT'], outer_class=root_module['ns3::Ipv6L3Protocol'], import_from_module='ns.internet')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, uint32_t )', 'ns3::Ipv6L3Protocol::SentTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, uint32_t )*', 'ns3::Ipv6L3Protocol::SentTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, uint32_t )&', 'ns3::Ipv6L3Protocol::SentTracedCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv6 >, uint32_t )', 'ns3::Ipv6L3Protocol::TxRxTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv6 >, uint32_t )*', 'ns3::Ipv6L3Protocol::TxRxTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv6 >, uint32_t )&', 'ns3::Ipv6L3Protocol::TxRxTracedCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr< ns3::Ipv6 >, uint32_t )', 'ns3::Ipv6L3Protocol::DropTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr< ns3::Ipv6 >, uint32_t )*', 'ns3::Ipv6L3Protocol::DropTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr< ns3::Ipv6 >, uint32_t )&', 'ns3::Ipv6L3Protocol::DropTracedCallback&')
+    ## ipv6-pmtu-cache.h (module 'internet'): ns3::Ipv6PmtuCache [class]
+    module.add_class('Ipv6PmtuCache', import_from_module='ns.internet', parent=root_module['ns3::Object'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker [class]
     module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
@@ -479,6 +514,12 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv4Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv6Header &', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ipv6L3Protocol::DropReason', 'ns3::Ptr<ns3::Ipv6>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv6Header &', 'ns3::Ptr<const ns3::Packet>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ptr<ns3::Ipv6>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -638,10 +679,13 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
+    register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -677,6 +721,7 @@
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
+    register_Ns3Ipv6Header_methods(root_module, root_module['ns3::Ipv6Header'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
     register_Ns3RandomVariableStream_methods(root_module, root_module['ns3::RandomVariableStream'])
@@ -744,8 +789,11 @@
     register_Ns3Ipv4MaskValue_methods(root_module, root_module['ns3::Ipv4MaskValue'])
     register_Ns3Ipv4MulticastRoute_methods(root_module, root_module['ns3::Ipv4MulticastRoute'])
     register_Ns3Ipv4Route_methods(root_module, root_module['ns3::Ipv4Route'])
+    register_Ns3Ipv6_methods(root_module, root_module['ns3::Ipv6'])
     register_Ns3Ipv6AddressChecker_methods(root_module, root_module['ns3::Ipv6AddressChecker'])
     register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
+    register_Ns3Ipv6L3Protocol_methods(root_module, root_module['ns3::Ipv6L3Protocol'])
+    register_Ns3Ipv6PmtuCache_methods(root_module, root_module['ns3::Ipv6PmtuCache'])
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
     register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
@@ -776,6 +824,9 @@
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Const_ns3Ipv6Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv6L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv6__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Const_ns3Ipv6Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ptr__lt__ns3Ipv6__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1909,6 +1960,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2235,6 +2298,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2310,6 +2378,89 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3Ipv6InterfaceAddress_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress() [constructor]
+    cls.add_constructor([])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): uint32_t ns3::Ipv6InterfaceAddress::GetNsDadUid() const [member function]
+    cls.add_method('GetNsDadUid', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
+    cls.add_method('GetPrefix', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Scope_e ns3::Ipv6InterfaceAddress::GetScope() const [member function]
+    cls.add_method('GetScope', 
+                   'ns3::Ipv6InterfaceAddress::Scope_e', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::State_e ns3::Ipv6InterfaceAddress::GetState() const [member function]
+    cls.add_method('GetState', 
+                   'ns3::Ipv6InterfaceAddress::State_e', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::IsInSameSubnet(ns3::Ipv6Address b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'b')], 
+                   is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetAddress(ns3::Ipv6Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetNsDadUid(uint32_t uid) [member function]
+    cls.add_method('SetNsDadUid', 
+                   'void', 
+                   [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
+    cls.add_method('SetScope', 
+                   'void', 
+                   [param('ns3::Ipv6InterfaceAddress::Scope_e', 'scope')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetState(ns3::Ipv6InterfaceAddress::State_e state) [member function]
+    cls.add_method('SetState', 
+                   'void', 
+                   [param('ns3::Ipv6InterfaceAddress::State_e', 'state')])
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2330,6 +2481,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -3919,6 +4075,134 @@
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3Ipv6Header_methods(root_module, cls):
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::Ipv6Header(ns3::Ipv6Header const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Header const &', 'arg0')])
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::Ipv6Header() [constructor]
+    cls.add_constructor([])
+    ## ipv6-header.h (module 'internet'): uint32_t ns3::Ipv6Header::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ipv6-header.h (module 'internet'): std::string ns3::Ipv6Header::DscpTypeToString(ns3::Ipv6Header::DscpType dscp) const [member function]
+    cls.add_method('DscpTypeToString', 
+                   'std::string', 
+                   [param('ns3::Ipv6Header::DscpType', 'dscp')], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): std::string ns3::Ipv6Header::EcnTypeToString(ns3::Ipv6Header::EcnType ecn) const [member function]
+    cls.add_method('EcnTypeToString', 
+                   'std::string', 
+                   [param('ns3::Ipv6Header::EcnType', 'ecn')], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestinationAddress() const [member function]
+    cls.add_method('GetDestinationAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
+    cls.add_method('GetDscp', 
+                   'ns3::Ipv6Header::DscpType', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::EcnType ns3::Ipv6Header::GetEcn() const [member function]
+    cls.add_method('GetEcn', 
+                   'ns3::Ipv6Header::EcnType', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint32_t ns3::Ipv6Header::GetFlowLabel() const [member function]
+    cls.add_method('GetFlowLabel', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetHopLimit() const [member function]
+    cls.add_method('GetHopLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::TypeId ns3::Ipv6Header::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetNextHeader() const [member function]
+    cls.add_method('GetNextHeader', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint16_t ns3::Ipv6Header::GetPayloadLength() const [member function]
+    cls.add_method('GetPayloadLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint32_t ns3::Ipv6Header::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
+    cls.add_method('GetSourceAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
+    cls.add_method('GetTrafficClass', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): static ns3::TypeId ns3::Ipv6Header::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestinationAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
+    cls.add_method('SetDscp', 
+                   'void', 
+                   [param('ns3::Ipv6Header::DscpType', 'dscp')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetEcn(ns3::Ipv6Header::EcnType ecn) [member function]
+    cls.add_method('SetEcn', 
+                   'void', 
+                   [param('ns3::Ipv6Header::EcnType', 'ecn')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetFlowLabel(uint32_t flow) [member function]
+    cls.add_method('SetFlowLabel', 
+                   'void', 
+                   [param('uint32_t', 'flow')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetHopLimit(uint8_t limit) [member function]
+    cls.add_method('SetHopLimit', 
+                   'void', 
+                   [param('uint8_t', 'limit')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetNextHeader(uint8_t next) [member function]
+    cls.add_method('SetNextHeader', 
+                   'void', 
+                   [param('uint8_t', 'next')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetPayloadLength(uint16_t len) [member function]
+    cls.add_method('SetPayloadLength', 
+                   'void', 
+                   [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSourceAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
+    cls.add_method('SetTrafficClass', 
+                   'void', 
+                   [param('uint8_t', 'traffic')])
+    return
+
 def register_Ns3Object_methods(root_module, cls):
     ## object.h (module 'core'): ns3::Object::Object() [constructor]
     cls.add_constructor([])
@@ -4452,10 +4736,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -5348,6 +5632,21 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ipv6Header const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ipv6L3Protocol::DropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::Time'], visibility='protected')
     return
 
@@ -6543,6 +6842,200 @@
                    [param('ns3::Ipv4Address', 'src')])
     return
 
+def register_Ns3Ipv6_methods(root_module, cls):
+    ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6(ns3::Ipv6 const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
+    ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
+    cls.add_constructor([])
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
+    cls.add_method('AddAddress', 
+                   'bool', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('AddInterface', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6::GetAddress(uint32_t interface, uint32_t addressIndex) const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [param('uint32_t', 'interface'), param('uint32_t', 'addressIndex')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): int32_t ns3::Ipv6::GetInterfaceForAddress(ns3::Ipv6Address address) const [member function]
+    cls.add_method('GetInterfaceForAddress', 
+                   'int32_t', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): int32_t ns3::Ipv6::GetInterfaceForDevice(ns3::Ptr<const ns3::NetDevice> device) const [member function]
+    cls.add_method('GetInterfaceForDevice', 
+                   'int32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): int32_t ns3::Ipv6::GetInterfaceForPrefix(ns3::Ipv6Address address, ns3::Ipv6Prefix mask) const [member function]
+    cls.add_method('GetInterfaceForPrefix', 
+                   'int32_t', 
+                   [param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'mask')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): uint16_t ns3::Ipv6::GetMetric(uint32_t interface) const [member function]
+    cls.add_method('GetMetric', 
+                   'uint16_t', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): uint16_t ns3::Ipv6::GetMtu(uint32_t interface) const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::GetNAddresses(uint32_t interface) const [member function]
+    cls.add_method('GetNAddresses', 
+                   'uint32_t', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::GetNInterfaces() const [member function]
+    cls.add_method('GetNInterfaces', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv6::GetNetDevice(uint32_t interface) [member function]
+    cls.add_method('GetNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'interface')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv6::GetProtocol(int protocolNumber) const [member function]
+    cls.add_method('GetProtocol', 
+                   'ns3::Ptr< ns3::IpL4Protocol >', 
+                   [param('int', 'protocolNumber')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv6::GetProtocol(int protocolNumber, int32_t interfaceIndex) const [member function]
+    cls.add_method('GetProtocol', 
+                   'ns3::Ptr< ns3::IpL4Protocol >', 
+                   [param('int', 'protocolNumber'), param('int32_t', 'interfaceIndex')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ptr<ns3::Ipv6RoutingProtocol> ns3::Ipv6::GetRoutingProtocol() const [member function]
+    cls.add_method('GetRoutingProtocol', 
+                   'ns3::Ptr< ns3::Ipv6RoutingProtocol >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): static ns3::TypeId ns3::Ipv6::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::Insert(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
+    cls.add_method('Insert', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::Insert(ns3::Ptr<ns3::IpL4Protocol> protocol, uint32_t interfaceIndex) [member function]
+    cls.add_method('Insert', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol'), param('uint32_t', 'interfaceIndex')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::IsForwarding(uint32_t interface) const [member function]
+    cls.add_method('IsForwarding', 
+                   'bool', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::IsUp(uint32_t interface) const [member function]
+    cls.add_method('IsUp', 
+                   'bool', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::RegisterExtensions() [member function]
+    cls.add_method('RegisterExtensions', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::RegisterOptions() [member function]
+    cls.add_method('RegisterOptions', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol, uint32_t interfaceIndex) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol'), param('uint32_t', 'interfaceIndex')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::RemoveAddress(uint32_t interface, uint32_t addressIndex) [member function]
+    cls.add_method('RemoveAddress', 
+                   'bool', 
+                   [param('uint32_t', 'interface'), param('uint32_t', 'addressIndex')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::RemoveAddress(uint32_t interface, ns3::Ipv6Address address) [member function]
+    cls.add_method('RemoveAddress', 
+                   'bool', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'address')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Address source, ns3::Ipv6Address destination, uint8_t protocol, ns3::Ptr<ns3::Ipv6Route> route) [member function]
+    cls.add_method('Send', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Address', 'source'), param('ns3::Ipv6Address', 'destination'), param('uint8_t', 'protocol'), param('ns3::Ptr< ns3::Ipv6Route >', 'route')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetDown(uint32_t interface) [member function]
+    cls.add_method('SetDown', 
+                   'void', 
+                   [param('uint32_t', 'interface')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetForwarding(uint32_t interface, bool val) [member function]
+    cls.add_method('SetForwarding', 
+                   'void', 
+                   [param('uint32_t', 'interface'), param('bool', 'val')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetMetric(uint32_t interface, uint16_t metric) [member function]
+    cls.add_method('SetMetric', 
+                   'void', 
+                   [param('uint32_t', 'interface'), param('uint16_t', 'metric')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetPmtu(ns3::Ipv6Address dst, uint32_t pmtu) [member function]
+    cls.add_method('SetPmtu', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('uint32_t', 'pmtu')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetRoutingProtocol(ns3::Ptr<ns3::Ipv6RoutingProtocol> routingProtocol) [member function]
+    cls.add_method('SetRoutingProtocol', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Ipv6RoutingProtocol >', 'routingProtocol')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetUp(uint32_t interface) [member function]
+    cls.add_method('SetUp', 
+                   'void', 
+                   [param('uint32_t', 'interface')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6::SourceAddressSelection(uint32_t interface, ns3::Ipv6Address dest) [member function]
+    cls.add_method('SourceAddressSelection', 
+                   'ns3::Ipv6Address', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'dest')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6.h (module 'internet'): ns3::Ipv6::IF_ANY [variable]
+    cls.add_static_attribute('IF_ANY', 'uint32_t const', is_const=True)
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::GetIpForward() const [member function]
+    cls.add_method('GetIpForward', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::GetMtuDiscover() const [member function]
+    cls.add_method('GetMtuDiscover', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetIpForward(bool forward) [member function]
+    cls.add_method('SetIpForward', 
+                   'void', 
+                   [param('bool', 'forward')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## ipv6.h (module 'internet'): void ns3::Ipv6::SetMtuDiscover(bool mtuDiscover) [member function]
+    cls.add_method('SetMtuDiscover', 
+                   'void', 
+                   [param('bool', 'mtuDiscover')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
 def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
     ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
     cls.add_constructor([])
@@ -6583,6 +7076,329 @@
                    [param('ns3::Ipv6Address const &', 'value')])
     return
 
+def register_Ns3Ipv6L3Protocol_methods(root_module, cls):
+    ## ipv6-l3-protocol.h (module 'internet'): static ns3::TypeId ns3::Ipv6L3Protocol::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6L3Protocol::PROT_NUMBER [variable]
+    cls.add_static_attribute('PROT_NUMBER', 'uint16_t const', is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6L3Protocol::Ipv6L3Protocol() [constructor]
+    cls.add_constructor([])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::Insert(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
+    cls.add_method('Insert', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::Insert(ns3::Ptr<ns3::IpL4Protocol> protocol, uint32_t interfaceIndex) [member function]
+    cls.add_method('Insert', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol'), param('uint32_t', 'interfaceIndex')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol, uint32_t interfaceIndex) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol'), param('uint32_t', 'interfaceIndex')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv6L3Protocol::GetProtocol(int protocolNumber) const [member function]
+    cls.add_method('GetProtocol', 
+                   'ns3::Ptr< ns3::IpL4Protocol >', 
+                   [param('int', 'protocolNumber')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv6L3Protocol::GetProtocol(int protocolNumber, int32_t interfaceIndex) const [member function]
+    cls.add_method('GetProtocol', 
+                   'ns3::Ptr< ns3::IpL4Protocol >', 
+                   [param('int', 'protocolNumber'), param('int32_t', 'interfaceIndex')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Socket> ns3::Ipv6L3Protocol::CreateRawSocket() [member function]
+    cls.add_method('CreateRawSocket', 
+                   'ns3::Ptr< ns3::Socket >', 
+                   [])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DeleteRawSocket(ns3::Ptr<ns3::Socket> socket) [member function]
+    cls.add_method('DeleteRawSocket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Socket >', 'socket')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetDefaultTtl(uint8_t ttl) [member function]
+    cls.add_method('SetDefaultTtl', 
+                   'void', 
+                   [param('uint8_t', 'ttl')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetDefaultTclass(uint8_t tclass) [member function]
+    cls.add_method('SetDefaultTclass', 
+                   'void', 
+                   [param('uint8_t', 'tclass')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::Receive(ns3::Ptr<ns3::NetDevice> device, ns3::Ptr<const ns3::Packet> p, uint16_t protocol, ns3::Address const & from, ns3::Address const & to, ns3::NetDevice::PacketType packetType) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::Ptr< ns3::Packet const >', 'p'), param('uint16_t', 'protocol'), param('ns3::Address const &', 'from'), param('ns3::Address const &', 'to'), param('ns3::NetDevice::PacketType', 'packetType')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Address source, ns3::Ipv6Address destination, uint8_t protocol, ns3::Ptr<ns3::Ipv6Route> route) [member function]
+    cls.add_method('Send', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Address', 'source'), param('ns3::Ipv6Address', 'destination'), param('uint8_t', 'protocol'), param('ns3::Ptr< ns3::Ipv6Route >', 'route')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetRoutingProtocol(ns3::Ptr<ns3::Ipv6RoutingProtocol> routingProtocol) [member function]
+    cls.add_method('SetRoutingProtocol', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Ipv6RoutingProtocol >', 'routingProtocol')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Ipv6RoutingProtocol> ns3::Ipv6L3Protocol::GetRoutingProtocol() const [member function]
+    cls.add_method('GetRoutingProtocol', 
+                   'ns3::Ptr< ns3::Ipv6RoutingProtocol >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): uint32_t ns3::Ipv6L3Protocol::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('AddInterface', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Ipv6Interface> ns3::Ipv6L3Protocol::GetInterface(uint32_t i) const [member function]
+    cls.add_method('GetInterface', 
+                   'ns3::Ptr< ns3::Ipv6Interface >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): uint32_t ns3::Ipv6L3Protocol::GetNInterfaces() const [member function]
+    cls.add_method('GetNInterfaces', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): int32_t ns3::Ipv6L3Protocol::GetInterfaceForAddress(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetInterfaceForAddress', 
+                   'int32_t', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): int32_t ns3::Ipv6L3Protocol::GetInterfaceForPrefix(ns3::Ipv6Address addr, ns3::Ipv6Prefix mask) const [member function]
+    cls.add_method('GetInterfaceForPrefix', 
+                   'int32_t', 
+                   [param('ns3::Ipv6Address', 'addr'), param('ns3::Ipv6Prefix', 'mask')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): int32_t ns3::Ipv6L3Protocol::GetInterfaceForDevice(ns3::Ptr<const ns3::NetDevice> device) const [member function]
+    cls.add_method('GetInterfaceForDevice', 
+                   'int32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
+    cls.add_method('AddAddress', 
+                   'bool', 
+                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [param('uint32_t', 'interfaceIndex'), param('uint32_t', 'addressIndex')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): uint32_t ns3::Ipv6L3Protocol::GetNAddresses(uint32_t interface) const [member function]
+    cls.add_method('GetNAddresses', 
+                   'uint32_t', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interfaceIndex, uint32_t addressIndex) [member function]
+    cls.add_method('RemoveAddress', 
+                   'bool', 
+                   [param('uint32_t', 'interfaceIndex'), param('uint32_t', 'addressIndex')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('RemoveAddress', 
+                   'bool', 
+                   [param('uint32_t', 'interfaceIndex'), param('ns3::Ipv6Address', 'address')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetMetric(uint32_t i, uint16_t metric) [member function]
+    cls.add_method('SetMetric', 
+                   'void', 
+                   [param('uint32_t', 'i'), param('uint16_t', 'metric')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): uint16_t ns3::Ipv6L3Protocol::GetMetric(uint32_t i) const [member function]
+    cls.add_method('GetMetric', 
+                   'uint16_t', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): uint16_t ns3::Ipv6L3Protocol::GetMtu(uint32_t i) const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetPmtu(ns3::Ipv6Address dst, uint32_t pmtu) [member function]
+    cls.add_method('SetPmtu', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('uint32_t', 'pmtu')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::IsUp(uint32_t i) const [member function]
+    cls.add_method('IsUp', 
+                   'bool', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetUp(uint32_t i) [member function]
+    cls.add_method('SetUp', 
+                   'void', 
+                   [param('uint32_t', 'i')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetDown(uint32_t i) [member function]
+    cls.add_method('SetDown', 
+                   'void', 
+                   [param('uint32_t', 'i')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::IsForwarding(uint32_t i) const [member function]
+    cls.add_method('IsForwarding', 
+                   'bool', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetForwarding(uint32_t i, bool val) [member function]
+    cls.add_method('SetForwarding', 
+                   'void', 
+                   [param('uint32_t', 'i'), param('bool', 'val')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6L3Protocol::SourceAddressSelection(uint32_t interface, ns3::Ipv6Address dest) [member function]
+    cls.add_method('SourceAddressSelection', 
+                   'ns3::Ipv6Address', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'dest')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv6L3Protocol::GetNetDevice(uint32_t i) [member function]
+    cls.add_method('GetNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'i')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Icmpv6L4Protocol> ns3::Ipv6L3Protocol::GetIcmpv6() const [member function]
+    cls.add_method('GetIcmpv6', 
+                   'ns3::Ptr< ns3::Icmpv6L4Protocol >', 
+                   [], 
+                   is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::AddAutoconfiguredAddress(uint32_t interface, ns3::Ipv6Address network, ns3::Ipv6Prefix mask, uint8_t flags, uint32_t validTime, uint32_t preferredTime, ns3::Ipv6Address defaultRouter=ns3::Ipv6Address::GetZero()) [member function]
+    cls.add_method('AddAutoconfiguredAddress', 
+                   'void', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'network'), param('ns3::Ipv6Prefix', 'mask'), param('uint8_t', 'flags'), param('uint32_t', 'validTime'), param('uint32_t', 'preferredTime'), param('ns3::Ipv6Address', 'defaultRouter', default_value='ns3::Ipv6Address::GetZero()')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::RemoveAutoconfiguredAddress(uint32_t interface, ns3::Ipv6Address network, ns3::Ipv6Prefix mask, ns3::Ipv6Address defaultRouter) [member function]
+    cls.add_method('RemoveAutoconfiguredAddress', 
+                   'void', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'network'), param('ns3::Ipv6Prefix', 'mask'), param('ns3::Ipv6Address', 'defaultRouter')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::RegisterExtensions() [member function]
+    cls.add_method('RegisterExtensions', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::RegisterOptions() [member function]
+    cls.add_method('RegisterOptions', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::ReportDrop(ns3::Ipv6Header ipHeader, ns3::Ptr<ns3::Packet> p, ns3::Ipv6L3Protocol::DropReason dropReason) [member function]
+    cls.add_method('ReportDrop', 
+                   'void', 
+                   [param('ns3::Ipv6Header', 'ipHeader'), param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6L3Protocol::DropReason', 'dropReason')], 
+                   is_virtual=True)
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::AddMulticastAddress(ns3::Ipv6Address address) [member function]
+    cls.add_method('AddMulticastAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::AddMulticastAddress(ns3::Ipv6Address address, uint32_t interface) [member function]
+    cls.add_method('AddMulticastAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::RemoveMulticastAddress(ns3::Ipv6Address address) [member function]
+    cls.add_method('RemoveMulticastAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::RemoveMulticastAddress(ns3::Ipv6Address address, uint32_t interface) [member function]
+    cls.add_method('RemoveMulticastAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')])
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::IsRegisteredMulticastAddress(ns3::Ipv6Address address) const [member function]
+    cls.add_method('IsRegisteredMulticastAddress', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::IsRegisteredMulticastAddress(ns3::Ipv6Address address, uint32_t interface) const [member function]
+    cls.add_method('IsRegisteredMulticastAddress', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')], 
+                   is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::ReachabilityHint(uint32_t ipInterfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('ReachabilityHint', 
+                   'bool', 
+                   [param('uint32_t', 'ipInterfaceIndex'), param('ns3::Ipv6Address', 'address')])
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetIpForward(bool forward) [member function]
+    cls.add_method('SetIpForward', 
+                   'void', 
+                   [param('bool', 'forward')], 
+                   is_virtual=True, visibility='private')
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::GetIpForward() const [member function]
+    cls.add_method('GetIpForward', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetMtuDiscover(bool mtuDiscover) [member function]
+    cls.add_method('SetMtuDiscover', 
+                   'void', 
+                   [param('bool', 'mtuDiscover')], 
+                   is_virtual=True, visibility='private')
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::GetMtuDiscover() const [member function]
+    cls.add_method('GetMtuDiscover', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetSendIcmpv6Redirect(bool sendIcmpv6Redirect) [member function]
+    cls.add_method('SetSendIcmpv6Redirect', 
+                   'void', 
+                   [param('bool', 'sendIcmpv6Redirect')], 
+                   is_virtual=True, visibility='private')
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::GetSendIcmpv6Redirect() const [member function]
+    cls.add_method('GetSendIcmpv6Redirect', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3Ipv6PmtuCache_methods(root_module, cls):
+    ## ipv6-pmtu-cache.h (module 'internet'): ns3::Ipv6PmtuCache::Ipv6PmtuCache(ns3::Ipv6PmtuCache const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6PmtuCache const &', 'arg0')])
+    ## ipv6-pmtu-cache.h (module 'internet'): ns3::Ipv6PmtuCache::Ipv6PmtuCache() [constructor]
+    cls.add_constructor([])
+    ## ipv6-pmtu-cache.h (module 'internet'): void ns3::Ipv6PmtuCache::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## ipv6-pmtu-cache.h (module 'internet'): uint32_t ns3::Ipv6PmtuCache::GetPmtu(ns3::Ipv6Address dst) [member function]
+    cls.add_method('GetPmtu', 
+                   'uint32_t', 
+                   [param('ns3::Ipv6Address', 'dst')])
+    ## ipv6-pmtu-cache.h (module 'internet'): ns3::Time ns3::Ipv6PmtuCache::GetPmtuValidityTime() const [member function]
+    cls.add_method('GetPmtuValidityTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## ipv6-pmtu-cache.h (module 'internet'): static ns3::TypeId ns3::Ipv6PmtuCache::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-pmtu-cache.h (module 'internet'): void ns3::Ipv6PmtuCache::SetPmtu(ns3::Ipv6Address dst, uint32_t pmtu) [member function]
+    cls.add_method('SetPmtu', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('uint32_t', 'pmtu')])
+    ## ipv6-pmtu-cache.h (module 'internet'): bool ns3::Ipv6PmtuCache::SetPmtuValidityTime(ns3::Time validity) [member function]
+    cls.add_method('SetPmtuValidityTime', 
+                   'bool', 
+                   [param('ns3::Time', 'validity')])
+    return
+
 def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
     ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
     cls.add_constructor([])
@@ -8005,6 +8821,72 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Const_ns3Ipv6Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv6L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv6__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr< ns3::Ipv6 >, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ipv6Header const & arg0, ns3::Ptr<const ns3::Packet> arg1, ns3::Ipv6L3Protocol::DropReason arg2, ns3::Ptr<ns3::Ipv6> arg3, unsigned int arg4) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ipv6Header const &', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('ns3::Ipv6L3Protocol::DropReason', 'arg2'), param('ns3::Ptr< ns3::Ipv6 >', 'arg3'), param('unsigned int', 'arg4')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Const_ns3Ipv6Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ipv6Header const &, ns3::Ptr< ns3::Packet const >, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ipv6Header const & arg0, ns3::Ptr<const ns3::Packet> arg1, unsigned int arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ipv6Header const &', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('unsigned int', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ptr__lt__ns3Ipv6__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv6 >, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::Ptr<ns3::Ipv6> arg1, unsigned int arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::Ptr< ns3::Ipv6 >', 'arg1'), param('unsigned int', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet-apps/model/ping6.cc ns-3.34/src/internet-apps/model/ping6.cc
--- ns-3.33/src/internet-apps/model/ping6.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet-apps/model/ping6.cc	2021-07-14 10:31:06.000000000 -0700
@@ -26,7 +26,6 @@
 #include "ns3/packet.h"
 #include "ns3/socket.h"
 #include "ns3/uinteger.h"
-#include "ns3/ipv6.h"
 #include "ns3/inet6-socket-address.h"
 #include "ns3/icmpv6-header.h"
 #include "ns3/ipv6-raw-socket-factory.h"
@@ -82,6 +81,8 @@
   m_sent = 0;
   m_socket = 0;
   m_seq = 0;
+  m_ipInterfaceIndex = 0;
+  m_ifIndex = 0;
   m_sendEvent = EventId ();
 }
 
@@ -111,6 +112,12 @@
       m_socket->Bind (Inet6SocketAddress (m_localAddress, 0));
       m_socket->SetAttribute ("Protocol", UintegerValue (Ipv6Header::IPV6_ICMPV6));
       m_socket->SetRecvCallback (MakeCallback (&Ping6::HandleRead, this));
+      m_ipv6Protocol = m_node->GetObject<Ipv6L3Protocol> ();
+
+      if (!m_localAddress.IsAny ())
+        {
+          m_ipInterfaceIndex = m_ipv6Protocol->GetInterfaceForAddress (m_localAddress);
+        }
     }
 
   ScheduleTransmit (Seconds (0.));
@@ -270,6 +277,16 @@
                            " id =  " << (uint16_t)reply.GetId () <<
                            " seq = " << (uint16_t)reply.GetSeq () <<
                            " Hop Count = " << (uint16_t) (64 - hdr.GetHopLimit ()));
+
+              if (m_ifIndex)
+                {
+                  m_ipv6Protocol->ReachabilityHint (m_ifIndex, address.GetIpv6 ());
+                }
+              else
+                {
+                  m_ipv6Protocol->ReachabilityHint (m_ipInterfaceIndex, address.GetIpv6 ());
+                }
+
               break;
             case Icmpv6Header::ICMPV6_ERROR_DESTINATION_UNREACHABLE:
               packet->RemoveHeader (destUnreach);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet-apps/model/ping6.h ns-3.34/src/internet-apps/model/ping6.h
--- ns-3.33/src/internet-apps/model/ping6.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet-apps/model/ping6.h	2021-07-14 10:31:06.000000000 -0700
@@ -23,6 +23,7 @@
 
 #include "ns3/application.h"
 #include "ns3/ipv6-address.h"
+#include "ns3/ipv6-l3-protocol.h"
 
 namespace ns3
 {
@@ -139,7 +140,7 @@
   uint32_t m_size;
 
   /**
-   * \brief Intervall between packets sent.
+   * \brief Interval between packets sent.
    */
   Time m_interval;
 
@@ -149,6 +150,16 @@
   Ipv6Address m_localAddress;
 
   /**
+   * \brief IP interface index relative to the local address.
+   */
+  uint32_t m_ipInterfaceIndex;
+
+  /**
+   * \brief IP interface index relative to the local address.
+   */
+  Ptr<Ipv6L3Protocol> m_ipv6Protocol;
+
+  /**
    * \brief Peer address.
    */
   Ipv6Address m_peerAddress;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet-apps/model/radvd.cc ns-3.34/src/internet-apps/model/radvd.cc
--- ns-3.33/src/internet-apps/model/radvd.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet-apps/model/radvd.cc	2021-07-14 10:31:06.000000000 -0700
@@ -227,17 +227,17 @@
 
       if ((*jt)->IsOnLinkFlag ())
         {
-          flags += 1 << 7;
+          flags |= Icmpv6OptionPrefixInformation::ONLINK;
         }
 
       if ((*jt)->IsAutonomousFlag ())
         {
-          flags += 1 << 6;
+          flags |= Icmpv6OptionPrefixInformation::AUTADDRCONF;
         }
 
       if ((*jt)->IsRouterAddrFlag ())
         {
-          flags += 1 << 5;
+          flags |= Icmpv6OptionPrefixInformation::ROUTERADDR;
         }
 
       prefixHdr.SetFlags (flags);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet-apps/model/v4traceroute.h ns-3.34/src/internet-apps/model/v4traceroute.h
--- ns-3.33/src/internet-apps/model/v4traceroute.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet-apps/model/v4traceroute.h	2021-07-14 10:31:06.000000000 -0700
@@ -59,6 +59,7 @@
   virtual ~V4TraceRoute ();
   /**
    * \brief Prints the application traced routes into a given OutputStream.
+   * \param stream the output stream
    */
   void Print (Ptr<OutputStreamWrapper> stream);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet-apps/test/ipv6-radvd-test.cc ns-3.34/src/internet-apps/test/ipv6-radvd-test.cc
--- ns-3.33/src/internet-apps/test/ipv6-radvd-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/internet-apps/test/ipv6-radvd-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -0,0 +1,278 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ *
+ */
+
+#include "ns3/data-rate.h"
+#include "ns3/simple-net-device.h"
+#include "ns3/simple-net-device-helper.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv6-address-helper.h"
+#include "ns3/ipv6-routing-protocol.h"
+#include "ns3/ipv6-routing-helper.h"
+#include "ns3/ipv6-route.h"
+#include "ns3/radvd-helper.h"
+#include "ns3/test.h"
+
+using namespace ns3;
+
+/**
+ * \ingroup radvd
+ * \defgroup radvd-test radvd tests
+ */
+
+
+/**
+ * \ingroup radvd-test
+ * \ingroup tests
+ *
+ * \brief radvd basic tests
+ */
+class RadvdTestCase : public TestCase
+{
+public:
+  RadvdTestCase ();
+  virtual ~RadvdTestCase ();
+
+private:
+  virtual void DoRun (void);
+
+  /**
+   * Checks the addresses on the selected NetDevices.
+   * \param n0Dev node 0 device
+   * \param r0Dev router device toward node 0
+   * \param r1Dev router device toward node 1
+   * \param n1Dev node 1 device
+   */
+  void CheckAddresses (Ptr<NetDevice> n0Dev, Ptr<NetDevice> r0Dev, Ptr<NetDevice> r1Dev, Ptr<NetDevice> n1Dev);
+  /**
+   * Checks the routing between the selected NetDevices.
+   * \param n0Dev node 0 device
+   * \param r0Dev router device toward node 0
+   * \param r1Dev router device toward node 1
+   * \param n1Dev node 1 device
+   */
+  void CheckRouting (Ptr<NetDevice> n0Dev, Ptr<NetDevice> r0Dev, Ptr<NetDevice> r1Dev, Ptr<NetDevice> n1Dev);
+
+  std::vector<Ipv6Address> m_addresses; //!< Addresses on the nodes
+  std::vector<Socket::SocketErrno> m_routingResults; //!< Routing call return values
+  std::vector<Ptr<Ipv6Route> > m_routes; //!< Routing call results
+};
+
+RadvdTestCase::RadvdTestCase ()
+  : TestCase ("Radvd test case ")
+{
+}
+
+RadvdTestCase::~RadvdTestCase ()
+{
+}
+
+void
+RadvdTestCase::CheckAddresses (Ptr<NetDevice> n0Dev, Ptr<NetDevice> r0Dev, Ptr<NetDevice> r1Dev, Ptr<NetDevice> n1Dev)
+{
+  Ptr<Ipv6L3Protocol> ipv6;
+
+  ipv6 = n0Dev->GetNode ()->GetObject<Ipv6L3Protocol> ();
+  m_addresses.push_back (ipv6->GetAddress (ipv6->GetInterfaceForDevice (n0Dev), 1).GetAddress ());
+
+  ipv6 = r0Dev->GetNode ()->GetObject<Ipv6L3Protocol> ();
+  m_addresses.push_back (ipv6->GetAddress (ipv6->GetInterfaceForDevice (r0Dev), 1).GetAddress ());
+
+  ipv6 = r1Dev->GetNode ()->GetObject<Ipv6L3Protocol> ();
+  m_addresses.push_back (ipv6->GetAddress (ipv6->GetInterfaceForDevice (r1Dev), 1).GetAddress ());
+
+  ipv6 = n1Dev->GetNode ()->GetObject<Ipv6L3Protocol> ();
+  m_addresses.push_back (ipv6->GetAddress (ipv6->GetInterfaceForDevice (n1Dev), 1).GetAddress ());
+}
+
+void
+RadvdTestCase::CheckRouting (Ptr<NetDevice> n0Dev, Ptr<NetDevice> r0Dev, Ptr<NetDevice> r1Dev, Ptr<NetDevice> n1Dev)
+{
+  Ptr<Ipv6L3Protocol> ipv6;
+  Ptr<Packet> p = Create<Packet> ();
+  Ipv6Header ipHdr;
+  Socket::SocketErrno sockerr;
+  Ptr<Ipv6Route> route;
+
+  ipv6 = n0Dev->GetNode ()->GetObject<Ipv6L3Protocol> ();
+  ipHdr.SetSourceAddress (m_addresses[0]);
+  ipHdr.SetDestinationAddress (m_addresses[1]);
+  route = ipv6->GetRoutingProtocol ()->RouteOutput (p, ipHdr, n0Dev, sockerr);
+  m_routingResults.push_back (sockerr);
+  m_routes.push_back (route);
+
+  ipv6 = r0Dev->GetNode ()->GetObject<Ipv6L3Protocol> ();
+  ipHdr.SetSourceAddress (m_addresses[1]);
+  ipHdr.SetDestinationAddress (m_addresses[0]);
+  route = ipv6->GetRoutingProtocol ()->RouteOutput (p, ipHdr, r0Dev, sockerr);
+  m_routingResults.push_back (sockerr);
+  m_routes.push_back (route);
+
+  ipv6 = r1Dev->GetNode ()->GetObject<Ipv6L3Protocol> ();
+  ipHdr.SetSourceAddress (m_addresses[2]);
+  ipHdr.SetDestinationAddress (m_addresses[3]);
+  route = ipv6->GetRoutingProtocol ()->RouteOutput (p, ipHdr, r1Dev, sockerr);
+  m_routingResults.push_back (sockerr);
+  m_routes.push_back (route);
+
+  ipv6 = n1Dev->GetNode ()->GetObject<Ipv6L3Protocol> ();
+  ipHdr.SetSourceAddress (m_addresses[3]);
+  ipHdr.SetDestinationAddress (m_addresses[2]);
+  route = ipv6->GetRoutingProtocol ()->RouteOutput (p, ipHdr, n1Dev, sockerr);
+  m_routingResults.push_back (sockerr);
+  m_routes.push_back (route);
+}
+
+void
+RadvdTestCase::DoRun (void)
+{
+   // Create nodes
+  Ptr<Node> n0 = CreateObject<Node> ();
+  Ptr<Node> r = CreateObject<Node> ();
+  Ptr<Node> n1 = CreateObject<Node> ();
+
+  NodeContainer net1 (n0, r);
+  NodeContainer net2 (r, n1);
+  NodeContainer all (n0, r, n1);
+
+  // Create IPv6 Internet Stack
+  InternetStackHelper internetv6;
+  internetv6.Install (all);
+
+  // Create channels
+  SimpleNetDeviceHelper simpleNetDevice;
+  simpleNetDevice.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
+  simpleNetDevice.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("5Mbps")));
+
+  NetDeviceContainer d1 = simpleNetDevice.Install (net1); /* n0 - R */
+  NetDeviceContainer d2 = simpleNetDevice.Install (net2); /* R - n1 */
+
+  // Create networks and assign IPv6 Addresses
+  Ipv6AddressHelper ipv6;
+
+  /* first subnet */
+  ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
+  NetDeviceContainer tmp;
+  tmp.Add (d1.Get (0)); /* n0 */
+  Ipv6InterfaceContainer iic1 = ipv6.AssignWithoutAddress (tmp); /* n0 interface */
+
+  NetDeviceContainer tmp2;
+  tmp2.Add (d1.Get (1)); /* R */
+  Ipv6InterfaceContainer iicr1 = ipv6.AssignWithoutOnLink (tmp2); /* R interface to the first subnet is just statically assigned */
+  iicr1.SetForwarding (0, true);
+  iic1.Add (iicr1);
+
+  /* second subnet R - n1 */
+  ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
+  NetDeviceContainer tmp3;
+  tmp3.Add (d2.Get (0)); /* R */
+  Ipv6InterfaceContainer iicr2 = ipv6.Assign (tmp3); /* R interface */
+  iicr2.SetForwarding (0, true);
+
+  NetDeviceContainer tmp4;
+  tmp4.Add (d2.Get (1)); /* n1 */
+  Ipv6InterfaceContainer iic2 = ipv6.AssignWithoutAddress (tmp4);
+  iic2.Add (iicr2);
+
+  /* radvd configuration */
+  RadvdHelper radvdHelper;
+
+  /* R interface (n0 - R) */
+  /* n0 will receive unsolicited (periodic) RA */
+  radvdHelper.AddAnnouncedPrefix (iic1.GetInterfaceIndex (1), Ipv6Address("2001:1::0"), 64);
+  Ptr<RadvdPrefix> prefix = *(radvdHelper.GetRadvdInterface (iic1.GetInterfaceIndex (1))->GetPrefixes ().begin ());
+  prefix->SetOnLinkFlag (false);
+
+  /* R interface (R - n1) */
+  /* n1 will have to use RS, as RA are not sent automatically */
+  radvdHelper.AddAnnouncedPrefix(iic2.GetInterfaceIndex (1), Ipv6Address("2001:2::0"), 64);
+  radvdHelper.GetRadvdInterface (iic2.GetInterfaceIndex (1))->SetSendAdvert (false);
+
+  ApplicationContainer radvdApps = radvdHelper.Install (r);
+  radvdApps.Start (Seconds (1.0));
+  radvdApps.Stop (Seconds (10.0));
+
+  Simulator::Schedule (Seconds (2), &RadvdTestCase::CheckAddresses, this, d1.Get (0), d1.Get (1), d2.Get (0), d2.Get (1));
+  Simulator::Schedule (Seconds (3), &RadvdTestCase::CheckRouting, this, d1.Get (0), d1.Get (1), d2.Get (0), d2.Get (1));
+
+
+  Simulator::Stop (Seconds (10.0));
+
+  Simulator::Run ();
+
+  // Address assignment checks
+  NS_TEST_ASSERT_MSG_EQ (m_addresses[0], Ipv6Address ("2001:1::200:ff:fe00:1"),
+                         m_addresses[0] << " instead of " << "2001:1::200:ff:fe00:1");
+
+  NS_TEST_ASSERT_MSG_EQ (m_addresses[1], Ipv6Address ("2001:1::200:ff:fe00:2"),
+                         m_addresses[1] << " instead of " << "2001:1::200:ff:fe00:2");
+
+  NS_TEST_ASSERT_MSG_EQ (m_addresses[2], Ipv6Address ("2001:2::200:ff:fe00:3"),
+                         m_addresses[2] << " instead of " << "2001:2::200:ff:fe00:3");
+
+  NS_TEST_ASSERT_MSG_EQ (m_addresses[3], Ipv6Address ("2001:2::200:ff:fe00:4"),
+                         m_addresses[3] << " instead of " << "2001:2::200:ff:fe00:4");
+
+  // Routes checks
+  NS_TEST_ASSERT_MSG_EQ (m_routingResults[0], Socket::ERROR_NOTERROR,
+                         (int) m_routingResults[0] << " instead of Socket::ERROR_NOTERROR");
+
+  NS_TEST_ASSERT_MSG_EQ (m_routes[0]->GetGateway (), Ipv6Address ("fe80::200:ff:fe00:2"),
+                         m_routes[0]->GetGateway () << " instead of " << "fe80::200:ff:fe00:2");
+
+  NS_TEST_ASSERT_MSG_EQ (m_routingResults[1], Socket::ERROR_NOROUTETOHOST,
+                         (int) m_routingResults[1] << " instead of Socket::ERROR_NOROUTETOHOST");
+
+  NS_TEST_ASSERT_MSG_EQ (m_routingResults[2], Socket::ERROR_NOTERROR,
+                         (int) m_routingResults[2] << " instead of Socket::ERROR_NOTERROR");
+
+  NS_TEST_ASSERT_MSG_EQ (m_routes[2]->GetGateway (), Ipv6Address ("::"),
+                         m_routes[2]->GetGateway () << " instead of " << "::");
+
+  NS_TEST_ASSERT_MSG_EQ (m_routingResults[3], Socket::ERROR_NOTERROR,
+                         (int) m_routingResults[3] << " instead of Socket::ERROR_NOTERROR");
+
+  NS_TEST_ASSERT_MSG_EQ (m_routes[3]->GetGateway (), Ipv6Address ("::"),
+                         m_routes[3]->GetGateway () << " instead of " << "::");
+
+
+  Simulator::Destroy ();
+}
+
+/**
+ * \ingroup radvd-test
+ * \ingroup tests
+ *
+ * \brief radvd TestSuite
+ */
+class RadvdTestSuite : public TestSuite
+{
+public:
+  RadvdTestSuite ();
+};
+
+RadvdTestSuite::RadvdTestSuite ()
+  : TestSuite ("radvd", UNIT)
+{
+  AddTestCase (new RadvdTestCase, TestCase::QUICK);
+}
+
+static RadvdTestSuite radvdTestSuite; //!< Static variable for test initialization
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/internet-apps/wscript ns-3.34/src/internet-apps/wscript
--- ns-3.33/src/internet-apps/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/internet-apps/wscript	2021-07-14 10:31:06.000000000 -0700
@@ -28,6 +28,7 @@
     applications_test = bld.create_ns3_module_test_library('internet-apps')
     applications_test.source = [
         'test/dhcp-test.cc',
+        'test/ipv6-radvd-test.cc',
         ]
 
     # Tests encapsulating example programs should be listed here
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/bindings/callbacks_list.py ns-3.34/src/lr-wpan/bindings/callbacks_list.py
--- ns-3.33/src/lr-wpan/bindings/callbacks_list.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/bindings/callbacks_list.py	2021-07-14 10:31:06.000000000 -0700
@@ -16,6 +16,7 @@
     ['void', 'ns3::MlmeBeaconNotifyIndicationParams', 'ns3::Ptr<ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::MlmeSyncLossIndicationParams', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::MlmePollConfirmParams', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned char', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::LrWpanMacState', 'ns3::LrWpanMacState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::SuperframeStatus', 'ns3::SuperframeStatus', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/bindings/modulegen__gcc_ILP32.py ns-3.34/src/lr-wpan/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/lr-wpan/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -115,12 +115,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -216,7 +220,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## lr-wpan-fields.h (module 'lr-wpan'): ns3::PendingAddrFields [class]
@@ -507,6 +511,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::SuperframeStatus', 'ns3::SuperframeStatus', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::LrWpanPhyEnumeration', 'ns3::LrWpanPhyEnumeration', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## lr-wpan-net-device.h (module 'lr-wpan'): ns3::LrWpanNetDevice [class]
@@ -774,8 +780,10 @@
     register_Ns3GtsFields_methods(root_module, root_module['ns3::GtsFields'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3LrWpanEdPower_methods(root_module, root_module['ns3::LrWpanEdPower'])
@@ -923,6 +931,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3SuperframeStatus_Ns3SuperframeStatus_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::SuperframeStatus, ns3::SuperframeStatus, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3LrWpanPhyEnumeration_Ns3LrWpanPhyEnumeration_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3LrWpanNetDevice_methods(root_module, root_module['ns3::LrWpanNetDevice'])
     register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
@@ -1926,6 +1935,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2139,6 +2160,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2214,6 +2240,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2234,6 +2272,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5067,11 +5110,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
     cls.add_method('SetChannel', 
                    'void', 
@@ -5082,11 +5125,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -6531,11 +6574,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
                    is_virtual=True)
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::MobilityModel> ns3::LrWpanPhy::GetMobility() [member function]
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::MobilityModel> ns3::LrWpanPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lr-wpan-phy.h (module 'lr-wpan'): void ns3::LrWpanPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
     cls.add_method('SetChannel', 
                    'void', 
@@ -6559,11 +6602,11 @@
     cls.add_method('SetAntenna', 
                    'void', 
                    [param('ns3::Ptr< ns3::AntennaModel >', 'a')])
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::AntennaModel> ns3::LrWpanPhy::GetRxAntenna() [member function]
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::AntennaModel> ns3::LrWpanPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<const ns3::SpectrumModel> ns3::LrWpanPhy::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -7842,6 +7885,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Time', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/bindings/modulegen__gcc_LP64.py ns-3.34/src/lr-wpan/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/lr-wpan/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -115,12 +115,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -216,7 +220,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## lr-wpan-fields.h (module 'lr-wpan'): ns3::PendingAddrFields [class]
@@ -507,6 +511,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::SuperframeStatus', 'ns3::SuperframeStatus', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::LrWpanPhyEnumeration', 'ns3::LrWpanPhyEnumeration', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## lr-wpan-net-device.h (module 'lr-wpan'): ns3::LrWpanNetDevice [class]
@@ -774,8 +780,10 @@
     register_Ns3GtsFields_methods(root_module, root_module['ns3::GtsFields'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3LrWpanEdPower_methods(root_module, root_module['ns3::LrWpanEdPower'])
@@ -923,6 +931,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3SuperframeStatus_Ns3SuperframeStatus_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::SuperframeStatus, ns3::SuperframeStatus, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3LrWpanPhyEnumeration_Ns3LrWpanPhyEnumeration_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::LrWpanPhyEnumeration, ns3::LrWpanPhyEnumeration, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3LrWpanNetDevice_methods(root_module, root_module['ns3::LrWpanNetDevice'])
     register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
@@ -1926,6 +1935,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2139,6 +2160,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2214,6 +2240,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2234,6 +2272,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5067,11 +5110,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
     cls.add_method('SetChannel', 
                    'void', 
@@ -5082,11 +5125,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -6531,11 +6574,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
                    is_virtual=True)
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::MobilityModel> ns3::LrWpanPhy::GetMobility() [member function]
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::MobilityModel> ns3::LrWpanPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lr-wpan-phy.h (module 'lr-wpan'): void ns3::LrWpanPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
     cls.add_method('SetChannel', 
                    'void', 
@@ -6559,11 +6602,11 @@
     cls.add_method('SetAntenna', 
                    'void', 
                    [param('ns3::Ptr< ns3::AntennaModel >', 'a')])
-    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::AntennaModel> ns3::LrWpanPhy::GetRxAntenna() [member function]
+    ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<ns3::AntennaModel> ns3::LrWpanPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lr-wpan-phy.h (module 'lr-wpan'): ns3::Ptr<const ns3::SpectrumModel> ns3::LrWpanPhy::GetRxSpectrumModel() const [member function]
     cls.add_method('GetRxSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel const >', 
@@ -7842,6 +7885,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Time', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/doc/lr-wpan.rst ns-3.34/src/lr-wpan/doc/lr-wpan.rst
--- ns-3.33/src/lr-wpan/doc/lr-wpan.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/doc/lr-wpan.rst	2021-07-14 10:31:06.000000000 -0700
@@ -1,9 +1,13 @@
+.. include:: replace.txt
+.. highlight:: cpp
+.. highlight:: bash
+
 PageBreak
 
 Low-Rate Wireless Personal Area Network (LR-WPAN)
 -------------------------------------------------
 
-This chapter describes the implementation of ns-3 models for the
+This chapter describes the implementation of |ns3| models for the
 low-rate, wireless personal area network (LR-WPAN) as specified by
 IEEE standard 802.15.4 (2006).
 
@@ -34,7 +38,7 @@
 APIs
 ####
 
-The APIs closely follow the standard, adapted for ns-3 naming conventions
+The APIs closely follow the standard, adapted for |ns3| naming conventions
 and idioms.  The APIs are organized around the concept of service primitives
 as shown in the following figure adapted from Figure 14 of 
 IEEE Std. 802.15.4-2006.
@@ -71,7 +75,7 @@
                           KeyIndex
                           )
 
-This maps to ns-3 classes and methods such as:::
+This maps to |ns3| classes and methods such as:::
 
   struct McpsDataRequestParameters
   {
@@ -158,7 +162,7 @@
 The 16-bit addresses are not guaranteed to be unique, and they are typically either assigned 
 during the devices deployment, or assigned dynamically during the device bootstrap.
 
-In |ns-3| the device bootstrap is not (yet) present. Hence, both addresses are set when the
+In |ns3| the device bootstrap is not (yet) present. Hence, both addresses are set when the
 device is created.
 
 The other relavant "address" to consider is the PanId (16 bits), which represents the PAN
@@ -180,7 +184,7 @@
 where ``XXXX`` is the device short address, and ``YYYY`` is the PanId.
 In both cases the U/L bit must be set to local, so in the RFC 4944 the PanId might have one bit flipped.
 
-In order to facilitate interoperability, and to avoid unwanted module dependencies, the |ns-3| 
+In order to facilitate interoperability, and to avoid unwanted module dependencies, the |ns3| 
 implementation moves the IID calculation in the ``LrWpanNetDevice::GetAddress ()``, which will
 return an ``Address`` formatted properly, i.e.:
 
@@ -229,7 +233,7 @@
 Enabling lr-wpan
 ================
 
-Add ``lr-wpan`` to the list of modules built with ns-3.
+Add ``lr-wpan`` to the list of modules built with |ns3|.
 
 Helper
 ======
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/examples/lr-wpan-data.cc ns-3.34/src/lr-wpan/examples/lr-wpan-data.cc
--- ns-3.33/src/lr-wpan/examples/lr-wpan-data.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/examples/lr-wpan-data.cc	2021-07-14 10:31:06.000000000 -0700
@@ -39,16 +39,32 @@
 
 using namespace ns3;
 
+/**
+ * Function called when a Data indication is invoked
+ * \param params MCPS data indication parameters
+ * \param p packet
+ */
 static void DataIndication (McpsDataIndicationParams params, Ptr<Packet> p)
 {
   NS_LOG_UNCOND ("Received packet of size " << p->GetSize ());
 }
 
+/**
+ * Function called when a Data confirm is invoked
+ * \param params MCPS data confirm parameters
+ */
 static void DataConfirm (McpsDataConfirmParams params)
 {
   NS_LOG_UNCOND ("LrWpanMcpsDataConfirmStatus = " << params.m_status);
 }
 
+/**
+ * Function called when a the PHY state changes
+ * \param context context
+ * \param now time at which the function is called
+ * \param oldState old PHY state
+ * \param newState new PHY state
+ */
 static void StateChangeNotification (std::string context, Time now, LrWpanPhyEnumeration oldState, LrWpanPhyEnumeration newState)
 {
   NS_LOG_UNCOND (context << " state change at " << now.As (Time::S)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/examples/lr-wpan-error-distance-plot.cc ns-3.34/src/lr-wpan/examples/lr-wpan-error-distance-plot.cc
--- ns-3.33/src/lr-wpan/examples/lr-wpan-error-distance-plot.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/examples/lr-wpan-error-distance-plot.cc	2021-07-14 10:31:06.000000000 -0700
@@ -54,10 +54,15 @@
 using namespace ns3;
 using namespace std;
 
-static uint32_t g_received = 0;
+static uint32_t g_received = 0; //!< number of packets received
 
 NS_LOG_COMPONENT_DEFINE ("LrWpanErrorDistancePlot");
 
+/**
+ * Function called when a Data indication is invoked
+ * \param params MCPS data indication parameters
+ * \param p packet
+ */
 static void
 LrWpanErrorDistanceCallback (McpsDataIndicationParams params, Ptr<Packet> p)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/examples/lr-wpan-phy-test.cc ns-3.34/src/lr-wpan/examples/lr-wpan-phy-test.cc
--- ns-3.33/src/lr-wpan/examples/lr-wpan-phy-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/examples/lr-wpan-phy-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -29,12 +29,23 @@
 
 using namespace ns3;
 
-void GetSetTRXStateConfirm (LrWpanPhyEnumeration status)
+/**
+ * Function called when a the PHY state change is confirmed
+ * \param status PHY state
+ */
+void
+GetSetTRXStateConfirm (LrWpanPhyEnumeration status)
 {
   NS_LOG_UNCOND ("At: " << Simulator::Now ()
                         << " Received Set TRX Confirm: " << status);
 }
 
+/**
+ * Function called when a the PHY receives a packet
+ * \param psduLength PSDU length
+ * \param p packet
+ * \param lqi link quality indication
+ */
 void
 ReceivePdDataIndication (uint32_t psduLength,
                          Ptr<Packet> p,
@@ -45,7 +56,13 @@
                  (uint16_t) lqi);
 }
 
-void SendOnePacket (Ptr<LrWpanPhy> sender, Ptr<LrWpanPhy> receiver)
+/**
+ * Send one packet
+ * \param sender sender PHY
+ * \param receiver receiver PHY
+ */
+void
+SendOnePacket (Ptr<LrWpanPhy> sender, Ptr<LrWpanPhy> receiver)
 {
   uint32_t n = 10;
   Ptr<Packet> p = Create<Packet> (n);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/helper/lr-wpan-helper.h ns-3.34/src/lr-wpan/helper/lr-wpan-helper.h
--- ns-3.33/src/lr-wpan/helper/lr-wpan-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/helper/lr-wpan-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -116,7 +116,7 @@
    * \brief Associate the nodes to the same PAN and initiate beacon enabled mode.
    *
    * \param c a set of nodes
-   * \param panID the PAN id
+   * \param panId the PAN id
    * \param coor the address of the PAN coordinator
    * \param bcnOrd indicates the interval between beacons.
    *               The value must be an int between 0 and 14.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/model/lr-wpan-fields.cc ns-3.34/src/lr-wpan/model/lr-wpan-fields.cc
--- ns-3.33/src/lr-wpan/model/lr-wpan-fields.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/model/lr-wpan-fields.cc	2021-07-14 10:31:06.000000000 -0700
@@ -179,14 +179,6 @@
   return i;
 }
 
-/**
- * output stream output operator
- *
- * \param os output stream
- * \param superframeField The Superframe Specification Field
- *
- * \returns output stream
- */
 std::ostream &
 operator << (std::ostream &os, const SuperframeField &superframeField)
 {
@@ -312,6 +304,13 @@
   return i;
 }
 
+std::ostream &
+operator << (std::ostream &os, const GtsFields &gtsFields)
+{
+  os << " GTS specification = "  << uint32_t (gtsFields.GetGtsSpecField ())
+     << ", GTS direction = "     << uint32_t (gtsFields.GetGtsDirectionField ());
+  return os;
+}
 
 /***********************************************************
  *              Pending Address Fields
@@ -472,14 +471,6 @@
   return i;
 }
 
-/**
- * output stream output operator
- *
- * \param os output stream
- * \param PendingAddrField the Pending Address Specification Field
- *
- * \returns output stream
- */
 std::ostream &
 operator << (std::ostream &os, const PendingAddrFields &pendingAddrFields)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/model/lr-wpan-fields.h ns-3.34/src/lr-wpan/model/lr-wpan-fields.h
--- ns-3.33/src/lr-wpan/model/lr-wpan-fields.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/model/lr-wpan-fields.h	2021-07-14 10:31:06.000000000 -0700
@@ -37,6 +37,7 @@
 namespace ns3 {
 
 /**
+ * \ingroup lr-wpan
  * The device Capabilities.
  */
 enum DeviceType
@@ -92,26 +93,32 @@
   void SetAssocPermit (bool assocPermit);
   /**
    * Get the Superframe Specification Beacon Order field.
+   * \return the Superframe Specification Beacon Order field.
    */
   uint8_t GetBeaconOrder (void) const;
   /**
    * Get the Superframe Specification Frame Order field.
+   * \return The Superframe Specification Frame Order field.
    */
   uint8_t GetFrameOrder (void) const;
   /**
-   * Check if the Final CAP Slot bit is enabled.
+   * Get the the Final CAP Slot.
+   * \returns The Final CAP Slot
    */
   uint8_t GetFinalCapSlot (void) const;
   /**
    * Check if the Battery Life Extension bit is enabled.
+   * \returns true if the Battery Life Extension bit is enabled
    */
   bool IsBattLifeExt (void) const;
   /**
    * Check if the PAN Coordinator bit is enabled.
+   * \returns true if the PAN Coordinator bit is enabled
    */
   bool IsPanCoor (void) const;
   /**
    * Check if the Association Permit bit is enabled.
+   * \returns true if the Association Permit bit is enabled
    */
   bool IsAssocPermit (void) const;
   /**
@@ -150,6 +157,14 @@
   bool    m_sspecAssocPermit; //!< Superframe Specification field Association Permit (Bit 15)
 
 };
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param [in] os The reference to the output stream.
+ * \param [in] superframeField The Superframe fields.
+ * \returns The reference to the output stream.
+ */
 std::ostream &operator << (std::ostream &os, const SuperframeField &superframeField);
 
 /**
@@ -174,12 +189,12 @@
   uint8_t GetGtsDirectionField (void) const;
   /**
    * Set the GTS Specification Field to the GTS Fields
-   * gtsSpec The GTS Specification Field to set.
+   * \param gtsSpec The GTS Specification Field to set.
    */
   void SetGtsSpecField (uint8_t gtsSpec);
   /**
    * Set the GTS direction field to the GTS Fields
-   * gtsDir The GTS Direction Field to set
+   * \param gtsDir The GTS Direction Field to set
    */
   void SetGtsDirectionField (uint8_t gtsDir);
   /**
@@ -201,7 +216,9 @@
   Buffer::Iterator Deserialize (Buffer::Iterator i);
 
 private:
-  //GTS Descriptor
+  /**
+   * GTS Descriptor
+   */
   struct gtsDescriptor
   {
     Mac16Address m_gtsDescDevShortAddr;      //!< GTS Descriptor Device Short Address (Bit 0-15)
@@ -211,14 +228,23 @@
 
   //GTS specification field
   uint8_t m_gtsSpecDescCount;            //!< GTS specification field Descriptor Count (Bit 0-2)
-                                         //!< GTS specification field Reserved (Not necessary) (Bit 3-6)
+                                         // GTS specification field Reserved (Not necessary) (Bit 3-6)
   uint8_t m_gtsSpecPermit;               //!< GTS specification field GTS Permit (Bit 7)
   //GTS Direction field
   uint8_t m_gtsDirMask;                  //!< GTS Direction field Directions Mask (Bit 0-6)
-                                         //!< GTS Direction field Reserved (Not Necessary) (Bit 7)
+                                         // GTS Direction field Reserved (Not Necessary) (Bit 7)
   //GTS List
-  gtsDescriptor m_gtsList[6];            //!< GTS List field (maximum descriptors stored == 7)
+  gtsDescriptor m_gtsList[7];            //!< GTS List field (maximum descriptors stored == 7)
 };
+
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param [in] os The reference to the output stream.
+ * \param [in] gtsFields The GTS fields.
+ * \returns The reference to the output stream.
+ */
 std::ostream &operator << (std::ostream &os, const GtsFields &gtsFields);
 
 
@@ -290,7 +316,7 @@
   Buffer::Iterator Serialize (Buffer::Iterator i) const;
   /**
    * Deserialize the all the Pending Address Fields.
-   * \param start an iterator which points to where the Pending Address Fields should be read.
+   * \param i an iterator which points to where the Pending Address Fields should be read.
    * \return an iterator.
    */
   Buffer::Iterator Deserialize (Buffer::Iterator i);
@@ -306,6 +332,14 @@
   std::array<Mac64Address,7>  m_extAddrList;      //!< Pending Extended Address List
 
 };
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param [in] os The reference to the output stream.
+ * \param [in] pendingAddrFields The Pending Address fields.
+ * \returns The reference to the output stream.
+ */
 std::ostream &operator << (std::ostream &os, const PendingAddrFields &pendingAddrFields);
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/model/lr-wpan-mac.cc ns-3.34/src/lr-wpan/model/lr-wpan-mac.cc
--- ns-3.33/src/lr-wpan/model/lr-wpan-mac.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/model/lr-wpan-mac.cc	2021-07-14 10:31:06.000000000 -0700
@@ -140,6 +140,11 @@
                      "the sent packet",
                      MakeTraceSourceAccessor (&LrWpanMac::m_sentPktTrace),
                      "ns3::LrWpanMac::SentTracedCallback")
+    .AddTraceSource ("IfsEnd",
+                     "Trace source reporting the end of an "
+                     "Interframe space (IFS) ",
+                     MakeTraceSourceAccessor (&LrWpanMac::m_macIfsEndTrace),
+                     "ns3::Packet::TracedCallback")
   ;
   return tid;
 }
@@ -390,7 +395,7 @@
         {
           // short address and ACK requested.
           Mac16Address shortAddr = macHdr.GetShortDstAddr ();
-          if (shortAddr.IsBroadcast() || shortAddr.IsMulticast())
+          if (shortAddr.IsBroadcast () || shortAddr.IsMulticast ())
             {
               NS_LOG_LOGIC ("LrWpanMac::McpsDataRequest: requested an ACK on broadcast or multicast destination (" << shortAddr << ") - forcefully removing it.");
               macHdr.SetNoAckReq ();
@@ -899,9 +904,13 @@
       //TODO: this should check if the node is a coordinator and using the outcoming superframe not just the PAN coordinator
       if (m_csmaCa->IsUnSlottedCsmaCa () || (m_outSuperframeStatus == CAP && m_panCoor) || m_incSuperframeStatus == CAP)
         {
-          TxQueueElement *txQElement = m_txQueue.front ();
-          m_txPkt = txQElement->txQPkt;
-          m_setMacState = Simulator::ScheduleNow (&LrWpanMac::SetLrWpanMacState, this, MAC_CSMA);
+          // check MAC is not in a IFS
+          if (!m_ifsEvent.IsRunning ())
+            {
+              TxQueueElement *txQElement = m_txQueue.front ();
+              m_txPkt = txQElement->txQPkt;
+              m_setMacState = Simulator::ScheduleNow (&LrWpanMac::SetLrWpanMacState, this, MAC_CSMA);
+            }
         }
     }
 }
@@ -1362,9 +1371,10 @@
                           m_mcpsDataConfirmCallback (confirmParams);
                         }
                       RemoveFirstTxQElement ();
-
+                      m_setMacState.Cancel ();
+                      m_setMacState = Simulator::ScheduleNow (&LrWpanMac::SetLrWpanMacState, this, MAC_IDLE);
                       // Ack was succesfully received, wait for the Interframe Space (IFS) and then proceed
-                      m_ifsEvent = Simulator::Schedule (ifsWaitTime, &LrWpanMac::IfsWaitTimeout, this);
+                      m_ifsEvent = Simulator::Schedule (ifsWaitTime, &LrWpanMac::IfsWaitTimeout, this, ifsWaitTime);
                     }
                   else
                     {
@@ -1433,7 +1443,7 @@
   Ptr<Packet> pkt = p->Copy ();
   LrWpanMacHeader hdr;
   pkt->RemoveHeader (hdr);
-  if (!hdr.GetShortDstAddr ().IsBroadcast () && !hdr.GetShortDstAddr ().IsMulticast())
+  if (!hdr.GetShortDstAddr ().IsBroadcast () && !hdr.GetShortDstAddr ().IsMulticast ())
     {
       m_sentPktTrace (p, m_retransmission + 1, m_numCsmacaRetry);
     }
@@ -1466,11 +1476,27 @@
 }
 
 void
-LrWpanMac::IfsWaitTimeout (void)
+LrWpanMac::IfsWaitTimeout (Time ifsTime)
 {
-  NS_LOG_DEBUG ("IFS Completed");
-  m_setMacState.Cancel ();
-  m_setMacState = Simulator::ScheduleNow (&LrWpanMac::SetLrWpanMacState, this, MAC_IDLE);
+  uint64_t symbolRate = (uint64_t) m_phy->GetDataOrSymbolRate (false);
+  Time lifsTime = Seconds ((double) m_macLIFSPeriod / symbolRate);
+  Time sifsTime = Seconds ((double) m_macSIFSPeriod / symbolRate);
+
+  if (ifsTime == lifsTime)
+    {
+      NS_LOG_DEBUG ("LIFS of " << m_macLIFSPeriod << " symbols (" << ifsTime.As (Time::S) << ") completed ");
+    }
+  else if (ifsTime == sifsTime)
+    {
+      NS_LOG_DEBUG ("SIFS of " << m_macSIFSPeriod << " symbols (" << ifsTime.As (Time::S) << ") completed ");
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Unknown IFS size (" << ifsTime.As (Time::S) << ") completed ");
+    }
+
+  m_macIfsEndTrace (ifsTime);
+  CheckQueue ();
 }
 
 
@@ -1612,14 +1638,13 @@
 
   if (!ifsWaitTime.IsZero ())
     {
-      m_ifsEvent = Simulator::Schedule (ifsWaitTime, &LrWpanMac::IfsWaitTimeout, this);
-    }
-  else
-    {
-      m_setMacState.Cancel ();
-      m_setMacState = Simulator::ScheduleNow (&LrWpanMac::SetLrWpanMacState, this, MAC_IDLE);
+      m_ifsEvent = Simulator::Schedule (ifsWaitTime, &LrWpanMac::IfsWaitTimeout, this, ifsWaitTime);
     }
 
+  m_setMacState.Cancel ();
+  m_setMacState = Simulator::ScheduleNow (&LrWpanMac::SetLrWpanMacState, this, MAC_IDLE);
+
+
 }
 
 void
@@ -1668,7 +1693,13 @@
   else if (m_lrWpanMacState == MAC_IDLE)
     {
       NS_ASSERT (status == IEEE_802_15_4_PHY_RX_ON || status == IEEE_802_15_4_PHY_SUCCESS || status == IEEE_802_15_4_PHY_TRX_OFF);
-      // Do nothing special when going idle.
+
+      if (status == IEEE_802_15_4_PHY_RX_ON || status == IEEE_802_15_4_PHY_SUCCESS)
+        {
+          // Check if there is not messages to transmit when going idle
+          CheckQueue ();
+        }
+
     }
   else if (m_lrWpanMacState == MAC_ACK_PENDING)
     {
@@ -1710,7 +1741,7 @@
           m_phy->PlmeSetTRXStateRequest (IEEE_802_15_4_PHY_TRX_OFF);
         }
 
-      CheckQueue ();
+
     }
   else if (macState == MAC_ACK_PENDING)
     {
@@ -1805,7 +1836,7 @@
 void
 LrWpanMac::PrintTransmitQueueSize (void)
 {
-  NS_LOG_DEBUG("Transit Queue Size: "<<m_txQueue.size());
+  NS_LOG_DEBUG ("Transmit Queue Size: " << m_txQueue.size ());
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/model/lr-wpan-mac.h ns-3.34/src/lr-wpan/model/lr-wpan-mac.h
--- ns-3.33/src/lr-wpan/model/lr-wpan-mac.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/model/lr-wpan-mac.h	2021-07-14 10:31:06.000000000 -0700
@@ -1058,8 +1058,10 @@
    * After a successful transmission of a frame (beacon, data) or an ack frame reception,
    * the mac layer wait an Interframe Space (IFS) time and triggers this function
    * to continue with the MAC flow.
+   *
+   * \param ifsTime IFS time
    */
-  void IfsWaitTimeout (void);
+  void IfsWaitTimeout (Time ifsTime);
   /**
    * Check for remaining retransmissions for the packet currently being sent.
    * Drop the packet, if there are no retransmissions left.
@@ -1076,20 +1078,30 @@
   /**
    * Constructs a Superframe specification field from the local information,
    * the superframe Specification field is necessary to create a beacon frame.
+   *
+   * \returns the Superframe specification field
    */
   SuperframeField GetSuperframeField (void);
   /**
-   * Constructs the Guaranteed Time Slots (GTS) Fields from local information
+   * Constructs the Guaranteed Time Slots (GTS) Fields from local information.
    * The GTS Fields are part of the beacon frame.
+   *
+   * \returns the Guaranteed Time Slots (GTS) Fields
    */
   GtsFields GetGtsFields (void);
   /**
-    * Constructs Pending Address Fields from the local information,
-    * the Pending Address Fields are part of the beacon frame.
-    */
+   * Constructs Pending Address Fields from the local information,
+   * the Pending Address Fields are part of the beacon frame.
+   *
+   * \returns the Pending Address Fields
+   */
   PendingAddrFields GetPendingAddrFields (void);
 
   /**
+   * The trace source is fired at the end of any Interframe Space (IFS).
+   */
+  TracedCallback<Time> m_macIfsEndTrace;
+  /**
    * The trace source fired when packets are considered as successfully sent
    * or the transmission has been given up.
    * Only non-broadcast packets are traced.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/model/lr-wpan-mac-pl-headers.h ns-3.34/src/lr-wpan/model/lr-wpan-mac-pl-headers.h
--- ns-3.33/src/lr-wpan/model/lr-wpan-mac-pl-headers.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/model/lr-wpan-mac-pl-headers.h	2021-07-14 10:31:06.000000000 -0700
@@ -76,7 +76,7 @@
    * \return The GTS fields.
    */
   GtsFields GetGtsFields (void) const;
-  /***
+  /**
    * Get the pending address fields from the beacon payload header.
    * \return The Pending Address fields.
    */
@@ -146,10 +146,12 @@
 
   /**
    * Set the command frame type
+   * \param macCmd the command frame type
    */
-  void SetCommandFrameType (MacCommand  macCmd);
+  void SetCommandFrameType (MacCommand macCmd);
   /**
    * Get the command frame type
+   * \return the command frame type
    */
   MacCommand GetCommandFrameType (void) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/model/lr-wpan-net-device.h ns-3.34/src/lr-wpan/model/lr-wpan-net-device.h
--- ns-3.33/src/lr-wpan/model/lr-wpan-net-device.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/model/lr-wpan-net-device.h	2021-07-14 10:31:06.000000000 -0700
@@ -215,7 +215,7 @@
    * As a consequence, here we set it to 1.
    *
    * \param panId The PanID
-   * \param shortMac The Short MAC address
+   * \param shortAddr The Short MAC address
    * \return a Pseudo-Mac48Adress
    */
   Mac48Address BuildPseudoMacAddress (uint16_t panId, Mac16Address shortAddr) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/model/lr-wpan-phy.cc ns-3.34/src/lr-wpan/model/lr-wpan-phy.cc
--- ns-3.33/src/lr-wpan/model/lr-wpan-phy.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/model/lr-wpan-phy.cc	2021-07-14 10:31:06.000000000 -0700
@@ -146,7 +146,7 @@
   // default -110 dBm in W for 2.4 GHz
   m_rxSensitivity = pow (10.0, -106.58 / 10.0) / 1000.0;
   LrWpanSpectrumValueHelper psdHelper;
-  m_txPsd = psdHelper.CreateTxPowerSpectralDensity (m_phyPIBAttributes.phyTransmitPower,
+  m_txPsd = psdHelper.CreateTxPowerSpectralDensity (GetNominalTxPowerFromPib (m_phyPIBAttributes.phyTransmitPower),
                                                     m_phyPIBAttributes.phyCurrentChannel);
   m_noise = psdHelper.CreateNoisePowerSpectralDensity (m_phyPIBAttributes.phyCurrentChannel);
   m_signal = Create<LrWpanInterferenceHelper> (m_noise->GetSpectrumModel ());
@@ -206,7 +206,7 @@
 
 
 Ptr<MobilityModel>
-LrWpanPhy::GetMobility (void)
+LrWpanPhy::GetMobility (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_mobility;
@@ -260,7 +260,7 @@
 }
 
 Ptr<AntennaModel>
-LrWpanPhy::GetRxAntenna (void)
+LrWpanPhy::GetRxAntenna (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_antenna;
@@ -938,7 +938,8 @@
               }
             m_phyPIBAttributes.phyCurrentChannel = attribute->phyCurrentChannel;
             LrWpanSpectrumValueHelper psdHelper;
-            m_txPsd = psdHelper.CreateTxPowerSpectralDensity (m_phyPIBAttributes.phyTransmitPower, m_phyPIBAttributes.phyCurrentChannel);
+            m_txPsd = psdHelper.CreateTxPowerSpectralDensity (GetNominalTxPowerFromPib (m_phyPIBAttributes.phyTransmitPower),
+                                                                                        m_phyPIBAttributes.phyCurrentChannel);
           }
         break;
       }
@@ -956,15 +957,17 @@
       }
     case phyTransmitPower:
       {
-        if (attribute->phyTransmitPower > 0xbf)
+        if (attribute->phyTransmitPower & 0xC0)
           {
+            NS_LOG_LOGIC ("LrWpanPhy::PlmeSetAttributeRequest error - can not change read-only attribute bits.");
             status = IEEE_802_15_4_PHY_INVALID_PARAMETER;
           }
         else
           {
             m_phyPIBAttributes.phyTransmitPower = attribute->phyTransmitPower;
             LrWpanSpectrumValueHelper psdHelper;
-            m_txPsd = psdHelper.CreateTxPowerSpectralDensity (m_phyPIBAttributes.phyTransmitPower, m_phyPIBAttributes.phyCurrentChannel);
+            m_txPsd = psdHelper.CreateTxPowerSpectralDensity (GetNominalTxPowerFromPib (m_phyPIBAttributes.phyTransmitPower),
+                                                              m_phyPIBAttributes.phyCurrentChannel);
           }
         break;
       }
@@ -1416,6 +1419,29 @@
   return dataSymbolRates [m_phyOption].symbolRate / (dataSymbolRates [m_phyOption].bitRate / 8);
 }
 
+int8_t
+LrWpanPhy::GetNominalTxPowerFromPib (uint8_t phyTransmitPower)
+{
+  NS_LOG_FUNCTION (this << +phyTransmitPower);
+
+  // The nominal Tx power is stored in the PIB as a 6-bit
+  // twos-complement, signed number.
+
+  // The 5 LSBs can be copied - as their representation
+  // is the same for unsigned and signed integers.
+  int8_t nominalTxPower = phyTransmitPower & 0x1F;
+
+  // Now check the 6th LSB (the "sign" bit).
+  // It's a twos-complement format, so the "sign"
+  // bit represents -2^5 = -32.
+  if (phyTransmitPower & 0x20)
+    {
+      nominalTxPower -= 32;
+    }
+  return nominalTxPower;
+}
+
+
 int64_t
 LrWpanPhy::AssignStreams (int64_t stream)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/model/lr-wpan-phy.h ns-3.34/src/lr-wpan/model/lr-wpan-phy.h
--- ns-3.33/src/lr-wpan/model/lr-wpan-phy.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/model/lr-wpan-phy.h	2021-07-14 10:31:06.000000000 -0700
@@ -51,7 +51,7 @@
 {
   double averagePower;    //!< Average measured power
   Time lastUpdate;        //!< Last update time
-  Time measurementLength; //!< Total measuremement period
+  Time measurementLength; //!< Total measurement period
 } LrWpanEdPower;
 
 /**
@@ -158,7 +158,7 @@
 {
   uint8_t phyCurrentChannel;         //!< The RF channel to use
   uint32_t phyChannelsSupported[32]; //!< BitField representing the available channels supported by a channel page.
-  uint8_t phyTransmitPower;          //!< Transmit power
+  uint8_t phyTransmitPower;          //!< 2 MSB: tolerance on the transmit power, 6 LSB: Tx power in dBm relative to 1mW (signed int in 2-complement format)
   uint8_t phyCCAMode;                //!< CCA mode
   uint32_t phyCurrentPage;           //!< Current channel page
   uint32_t phyMaxFrameDuration;      //!< The maximum number of symbols in a frame
@@ -276,7 +276,7 @@
 
   // inherited from SpectrumPhy
   void SetMobility (Ptr<MobilityModel> m);
-  Ptr<MobilityModel> GetMobility (void);
+  Ptr<MobilityModel> GetMobility (void) const;
   void SetChannel (Ptr<SpectrumChannel> c);
 
   /**
@@ -294,7 +294,7 @@
    * \param a the antenna
    */
   void SetAntenna (Ptr<AntennaModel> a);
-  Ptr<AntennaModel> GetRxAntenna (void);
+  Ptr<AntennaModel> GetRxAntenna (void) const;
   virtual Ptr<const SpectrumModel> GetRxSpectrumModel (void) const;
 
   /**
@@ -676,6 +676,24 @@
   TracedCallback<Time, LrWpanPhyEnumeration, LrWpanPhyEnumeration> m_trxStateLogger;
 
   /**
+   * Calculates the nominal transmit power of the device in decibels relative to 1 mW
+   * according to the representation of the PIB attribute phyTransmitPower.
+   *
+   * The phyTransmitPower (table 23 of IEEE 802.15.4-2006) is a 8-bit bitmap, stored
+   * as a `uint8_t`. The bitmap has the following meaning:
+   * The 2 MSBs represent the tolerance on the transmit power.
+   * The 6 LSBs represent a signed integer in twos-complement format, corresponding
+   * to the nominal transmit power of the device in decibels relative to 1 mW.
+   *
+   * This function extracts the 6 LSBs corresponding to the nominal transmit power and
+   * converts it to a `int8_t`.
+   *
+   * \param phyTransmitPower the PIB attribute
+   * \return The nominal transmit power in dBm.
+   */
+  int8_t GetNominalTxPowerFromPib (uint8_t phyTransmitPower);
+
+  /**
    * The mobility model used by the PHY.
    */
   Ptr<MobilityModel> m_mobility;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/test/lr-wpan-ack-test.cc ns-3.34/src/lr-wpan/test/lr-wpan-ack-test.cc
--- ns-3.33/src/lr-wpan/test/lr-wpan-ack-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/test/lr-wpan-ack-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -56,12 +56,15 @@
 {
 public:
 
+  /**
+   * Test modes
+   */
   typedef enum
   {
-    EXTENDED_ADDRESS_UNICAST,
-    SHORT_ADDRESS_UNICAST,
-    SHORT_ADDRESS_MULTICAST,
-    SHORT_ADDRESS_BROADCAST,
+    EXTENDED_ADDRESS_UNICAST,   //!< extended addresses
+    SHORT_ADDRESS_UNICAST,      //!< short addresses, unicast
+    SHORT_ADDRESS_MULTICAST,    //!< short addresses, multicast
+    SHORT_ADDRESS_BROADCAST,    //!< short addresses, broadcast
   } TestMode_e;
 
   /**
@@ -74,27 +77,23 @@
 
   /**
    * \brief Function called when DataIndication is hit on dev0.
-   * \param testCase The TestCase.
    * \param params The MCPS params.
    * \param p the packet.
    */
   void DataIndicationDev0 (McpsDataIndicationParams params, Ptr<Packet> p);
   /**
    * \brief Function called when DataIndication is hit on dev1.
-   * \param testCase The TestCase.
    * \param params The MCPS params.
    * \param p the packet.
    */
   void DataIndicationDev1 (McpsDataIndicationParams params, Ptr<Packet> p);
   /**
    * \brief Function called when DataConfirm is hit on dev0.
-   * \param testCase The TestCase.
    * \param params The MCPS params.
    */
   void DataConfirmDev0 (McpsDataConfirmParams params);
   /**
    * \brief Function called when DataConfirm is hit on dev1.
-   * \param testCase The TestCase.
    * \param params The MCPS params.
    */
   void DataConfirmDev1 (McpsDataConfirmParams params);
@@ -187,6 +186,8 @@
   RngSeedManager::SetSeed (1);
   RngSeedManager::SetRun (6);
 
+  Packet::EnablePrinting ();
+
   // Helper - used to create traces
   LrWpanHelper helper;
   std::string asciiPrefix;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lr-wpan/test/lr-wpan-ifs-test.cc ns-3.34/src/lr-wpan/test/lr-wpan-ifs-test.cc
--- ns-3.33/src/lr-wpan/test/lr-wpan-ifs-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lr-wpan/test/lr-wpan-ifs-test.cc	2021-07-14 10:31:06.000000000 -0700
@@ -37,6 +37,7 @@
 
 NS_LOG_COMPONENT_DEFINE ("lr-wpan-ifs-test");
 
+
 /**
  * \ingroup lr-wpan-test
  * \ingroup tests
@@ -49,79 +50,147 @@
   LrWpanDataIfsTestCase ();
   virtual ~LrWpanDataIfsTestCase ();
 
-
-
 private:
+  /**
+   * \brief Function called when DataConfirm is hit.
+   * \param testcase pointer to the testcase
+   * \param dev originating NetDevice
+   * \param params the MCPS params
+   */
   static void DataConfirm (LrWpanDataIfsTestCase *testcase,
                            Ptr<LrWpanNetDevice> dev,
                            McpsDataConfirmParams params);
 
-  static void DataReceived (LrWpanDataIfsTestCase *testcase,
-                            Ptr<LrWpanNetDevice> dev,
-                            Ptr<const Packet>);
-
-  static void MacState (LrWpanDataIfsTestCase *testcase,
-                        Ptr<LrWpanNetDevice> dev,
-                        LrWpanMacState oldValue,
-                        LrWpanMacState newValue);
+  /**
+   * \brief Function called when DataReceived is hit.
+   * \param testcase pointer to the testcase
+   * \param dev originating NetDevice
+   * \param p packet
+   */
+  static void DataReceivedDev0 (LrWpanDataIfsTestCase *testcase,
+                                Ptr<LrWpanNetDevice> dev,
+                                Ptr<const Packet> p);
+
+  /**
+   * \brief Function called when PhyDataRxStart is hit.
+   * \param testcase pointer to the testcase
+   * \param dev originating NetDevice
+   * \param p packet
+   */
+  static void PhyDataRxStart (LrWpanDataIfsTestCase *testcase,
+                              Ptr<LrWpanNetDevice> dev,
+                              Ptr<const Packet> p);
+
+  /**
+   * \brief Function called when DataConfirm is hit.
+   * \param testcase pointer to the testcase
+   * \param dev originating NetDevice
+   * \param p packet
+   */
+  static void DataReceivedDev1 (LrWpanDataIfsTestCase *testcase,
+                                Ptr<LrWpanNetDevice> dev,
+                                Ptr<const Packet>);
+
+  /**
+   * \brief Function called when the IFS ends.
+   * \param testcase pointer to the testcase
+   * \param dev originating NetDevice
+   * \param IfsTime the IFS time
+   */
+  static void IfsEnd (LrWpanDataIfsTestCase *testcase,
+                      Ptr<LrWpanNetDevice> dev,
+                      Time IfsTime);
 
 
 
   virtual void DoRun (void);
   Time m_lastTxTime; //!< The time of the last transmitted packet
-  Time m_ackRxTime; //!< The time of the received acknoledgment.
+  Time m_ackRxTime; //!< The time of the received acknowledgment.
   Time m_endIfs; //!< The time where the Interframe Space ended.
+  Time m_phyStartRx; //!< The time the phy start receiving a packet.
 
 
 };
 
 
 LrWpanDataIfsTestCase::LrWpanDataIfsTestCase ()
-  : TestCase ("Lrwpan: IFS with and without ACK")
-{
-
-}
+  : TestCase ("Lrwpan: IFS tests")
+{}
 
 LrWpanDataIfsTestCase::~LrWpanDataIfsTestCase ()
-{
-
-}
+{}
 
 void
 LrWpanDataIfsTestCase::DataConfirm (LrWpanDataIfsTestCase *testcase, Ptr<LrWpanNetDevice> dev, McpsDataConfirmParams params)
 {
-  std::cout << Simulator::Now ().GetSeconds () << " | Dataframe Sent\n";
+  // get the end time of transmission
   testcase->m_lastTxTime = Simulator::Now ();
-
 }
 
 void
-LrWpanDataIfsTestCase::DataReceived (LrWpanDataIfsTestCase *testcase,Ptr<LrWpanNetDevice> dev, Ptr<const Packet> p)
+LrWpanDataIfsTestCase::DataReceivedDev0 (LrWpanDataIfsTestCase *testcase, Ptr<LrWpanNetDevice> dev, Ptr<const Packet> p)
 {
+  // Callback for Data received in the Dev0
   Ptr<Packet> RxPacket = p->Copy ();
   LrWpanMacHeader receivedMacHdr;
   RxPacket->RemoveHeader (receivedMacHdr);
 
-  NS_ASSERT (receivedMacHdr.IsAcknowledgment ());
-  testcase->m_ackRxTime = Simulator::Now ();
+  if (receivedMacHdr.IsAcknowledgment ())
+    {
+      testcase->m_ackRxTime = Simulator::Now ();
+      std::cout << Simulator::Now ().GetSeconds () << " | Dev0 (Node 0) received Acknowledgment.\n";
+    }
+  else if (receivedMacHdr.GetShortDstAddr ().IsBroadcast ())
+    {
+      std::cout << Simulator::Now ().GetSeconds () << " | Dev0 (Node 0) received Broadcast. \n";
+    }
 
-  std::cout << Simulator::Now ().GetSeconds () << " | ACK received\n";
 }
 
 void
-LrWpanDataIfsTestCase::MacState (LrWpanDataIfsTestCase *testcase, Ptr<LrWpanNetDevice> dev,LrWpanMacState oldValue, LrWpanMacState newValue)
+LrWpanDataIfsTestCase::PhyDataRxStart (LrWpanDataIfsTestCase *testcase, Ptr<LrWpanNetDevice> dev, Ptr<const Packet>)
 {
-  // Check the time after the MAC layer go back to IDLE state
-  // (i.e. after the packet has been sent and the IFS is finished)
+  //get the start time the phy in dev 0 ( Node 0) start receiving a frame
+  testcase->m_phyStartRx = Simulator::Now ();
+}
 
-  if (newValue == LrWpanMacState::MAC_IDLE)
+void
+LrWpanDataIfsTestCase::DataReceivedDev1 (LrWpanDataIfsTestCase *testcase, Ptr<LrWpanNetDevice> dev, Ptr<const Packet> p)
+{
+  // Callback for Data received in the Dev1
+  Ptr<Packet> RxPacket = p->Copy ();
+  LrWpanMacHeader receivedMacHdr;
+  RxPacket->RemoveHeader (receivedMacHdr);
+
+  if (receivedMacHdr.GetShortDstAddr ().IsBroadcast ())
     {
-      testcase->m_endIfs = Simulator::Now ();
-      std::cout << Simulator::Now ().GetSeconds () << " | MAC layer is free\n";
+      std::cout << Simulator::Now ().GetSeconds () << " | Dev1 (Node 1) received Broadcast. \n";
+
+      // Bcst received, respond with another bcst
+
+      Ptr<Packet> p0 = Create<Packet> (50);      // 50 bytes of dummy data
+      McpsDataRequestParams params1;
+      params1.m_dstPanId = 0;
+      params1.m_srcAddrMode = SHORT_ADDR;
+      params1.m_dstAddrMode = SHORT_ADDR;
+      params1.m_dstAddr = Mac16Address ("ff:ff");
+      params1.m_msduHandle = 0;
+
+      Simulator::ScheduleNow (&LrWpanMac::McpsDataRequest,
+                              dev->GetMac (), params1,p0);
     }
 
 }
 
+
+void
+LrWpanDataIfsTestCase::IfsEnd (LrWpanDataIfsTestCase *testcase, Ptr<LrWpanNetDevice> dev, Time IfsTime)
+{
+  // take the time of the end of the IFS
+  testcase->m_endIfs = Simulator::Now ();
+}
+
+
 void
 LrWpanDataIfsTestCase::DoRun ()
 {
@@ -133,6 +202,11 @@
   // implemented and its size correspond to the situations described by the standard.
   // For more info see IEEE 802.15.4-2011 Section 5.1.1.3
 
+  LogComponentEnableAll (LOG_PREFIX_TIME);
+  LogComponentEnableAll (LOG_PREFIX_FUNC);
+  LogComponentEnable ("LrWpanPhy", LOG_LEVEL_DEBUG);
+  LogComponentEnable ("LrWpanMac", LOG_LEVEL_DEBUG);
+  LogComponentEnable ("LrWpanCsmaCa", LOG_LEVEL_DEBUG);
 
   // Create 2 nodes, and a NetDevice for each one
   Ptr<Node> n0 = CreateObject <Node> ();
@@ -159,8 +233,10 @@
   n1->AddDevice (dev1);
 
   // Connect to trace files in the MAC layer
-  dev0->GetMac ()->TraceConnectWithoutContext ("MacStateValue", MakeBoundCallback (&LrWpanDataIfsTestCase::MacState, this, dev0));
-  dev0->GetMac ()->TraceConnectWithoutContext ("MacRx", MakeBoundCallback (&LrWpanDataIfsTestCase::DataReceived, this, dev0));
+  dev0->GetMac ()->TraceConnectWithoutContext ("IfsEnd", MakeBoundCallback (&LrWpanDataIfsTestCase::IfsEnd, this, dev0));
+  dev0->GetMac ()->TraceConnectWithoutContext ("MacRx", MakeBoundCallback (&LrWpanDataIfsTestCase::DataReceivedDev0, this, dev0));
+  dev0->GetPhy ()->TraceConnectWithoutContext ("PhyRxBegin", MakeBoundCallback (&LrWpanDataIfsTestCase::PhyDataRxStart, this, dev0));
+  dev1->GetMac ()->TraceConnectWithoutContext ("MacRx", MakeBoundCallback (&LrWpanDataIfsTestCase::DataReceivedDev1, this, dev1));
 
   Ptr<ConstantPositionMobilityModel> sender0Mobility = CreateObject<ConstantPositionMobilityModel> ();
   sender0Mobility->SetPosition (Vector (0,0,0));
@@ -174,6 +250,10 @@
   cb0 = MakeBoundCallback (&LrWpanDataIfsTestCase::DataConfirm, this, dev0);
   dev0->GetMac ()->SetMcpsDataConfirmCallback (cb0);
 
+  McpsDataConfirmCallback cb1;
+  cb1 = MakeBoundCallback (&LrWpanDataIfsTestCase::DataConfirm, this, dev1);
+  dev1->GetMac ()->SetMcpsDataConfirmCallback (cb1);
+
   Ptr<Packet> p0 = Create<Packet> (2);
   McpsDataRequestParams params;
   params.m_dstPanId = 0;
@@ -199,6 +279,7 @@
   // SIFS = 12 symbols (192 Microseconds on a 2.4Ghz O-QPSK PHY)
   ifsSize = m_endIfs - m_lastTxTime;
   NS_TEST_EXPECT_MSG_EQ (ifsSize, Time (MicroSeconds (192)), "Wrong Short InterFrame Space (SIFS) Size after dataframe Tx");
+  std::cout << "----------------------------------\n";
 
   ////////////////////////  LIFS ///////////////////////////
 
@@ -213,9 +294,10 @@
 
   // MPDU = MAC header (11 bytes) + MSDU (6 bytes)+ MAC trailer (2 bytes)  = 19)
   // MPDU (19 bytes) > 18 bytes therefore IFS = LIFS
-  // LIFS = 20 symbols (640 Microseconds on a 2.4Ghz O-QPSK PHY)
+  // LIFS = 40 symbols (640 Microseconds on a 2.4Ghz O-QPSK PHY)
   ifsSize = m_endIfs - m_lastTxTime;
   NS_TEST_EXPECT_MSG_EQ (ifsSize, Time (MicroSeconds (640)), "Wrong Long InterFrame Space (LIFS) Size after dataframe Tx");
+  std::cout << "----------------------------------\n";
 
   //////////////////////// SIFS after ACK //////////////////
 
@@ -233,6 +315,7 @@
   // SIFS = 12 symbols (192 Microseconds on a 2.4Ghz O-QPSK PHY)
   ifsSize = m_endIfs - m_ackRxTime;
   NS_TEST_EXPECT_MSG_EQ (ifsSize, Time (MicroSeconds (192)), "Wrong Short InterFrame Space (SIFS) Size after ACK Rx");
+  std::cout << "----------------------------------\n";
 
   ////////////////////////  LIFS after ACK //////////////////
 
@@ -248,9 +331,40 @@
 
   // MPDU = MAC header (11 bytes) + MSDU (6 bytes)+ MAC trailer (2 bytes)  = 19)
   // MPDU (19 bytes) > 18 bytes therefore IFS = LIFS
-  // LIFS = 20 symbols (640 Microseconds on a 2.4Ghz O-QPSK PHY)
+  // LIFS = 40 symbols (640 Microseconds on a 2.4Ghz O-QPSK PHY)
   ifsSize = m_endIfs - m_ackRxTime;
   NS_TEST_EXPECT_MSG_EQ (ifsSize, Time (MicroSeconds (640)), "Wrong Long InterFrame Space (LIFS) Size after ACK Rx");
+  std::cout << "----------------------------------\n";
+
+  /////////////////////// BCST frame with immediate BCST response //////////////////
+
+  // A packet is broadcasted and the receiving device respond with another broadcast.
+  // The devices are configured to not have any backoff delays in their CSMA/CA.
+  // In most cases, a device receive a packet after its IFS, however in this test,
+  // the receiving device of the reply broadcast will still be in its IFS when the
+  // broadcast is received (i.e. a PHY StartRX () occur before the end of IFS).
+  // This demonstrates that a device can start receiving a frame even during an IFS.
+
+  // Makes the backoff delay period = 0 in the CSMA/CA
+  dev0->GetCsmaCa ()->SetMacMinBE (0);
+  dev1->GetCsmaCa ()->SetMacMinBE (0);
+
+  p0 = Create<Packet> (50);  // 50 bytes of dummy data
+  params.m_dstPanId = 0;
+  params.m_srcAddrMode = SHORT_ADDR;
+  params.m_dstAddrMode = SHORT_ADDR;
+  params.m_dstAddr = Mac16Address ("ff:ff");
+  params.m_msduHandle = 0;
+
+  Simulator::ScheduleWithContext (1, Seconds (0.0),
+                                  &LrWpanMac::McpsDataRequest,
+                                  dev0->GetMac (), params, p0);
+
+  Simulator::Run ();
+
+  NS_TEST_ASSERT_MSG_GT (m_endIfs, m_phyStartRx, "Error, IFS end time should be greater than PHY start Rx time");
+
+  //////////////////////////////////////////////////////////////////////////////////
 
   Simulator::Destroy ();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/bindings/modulegen__gcc_ILP32.py ns-3.34/src/lte/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/lte/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
@@ -54,7 +54,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::BuildBroadcastListElement_s [struct]
     module.add_class('BuildBroadcastListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::BuildBroadcastListElement_s::Type_e [enumeration]
-    module.add_enum('Type_e', ['BCCH', 'PCCH'], outer_class=root_module['ns3::BuildBroadcastListElement_s'])
+    module.add_enum('Type_e', ['BCCH', 'PCCH', 'NotValid'], outer_class=root_module['ns3::BuildBroadcastListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::BuildDataListElement_s [struct]
     module.add_class('BuildDataListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::BuildRarListElement_s [struct]
@@ -80,7 +80,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::CqiListElement_s [struct]
     module.add_class('CqiListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::CqiListElement_s::CqiType_e [enumeration]
-    module.add_enum('CqiType_e', ['P10', 'P11', 'P20', 'P21', 'A12', 'A22', 'A20', 'A30', 'A31'], outer_class=root_module['ns3::CqiListElement_s'])
+    module.add_enum('CqiType_e', ['P10', 'P11', 'P20', 'P21', 'A12', 'A22', 'A20', 'A30', 'A31', 'NotValid'], outer_class=root_module['ns3::CqiListElement_s'])
     ## data-output-interface.h (module 'stats'): ns3::DataOutputCallback [class]
     module.add_class('DataOutputCallback', allow_subclassing=True, import_from_module='ns.stats')
     ## data-rate.h (module 'network'): ns3::DataRate [class]
@@ -126,11 +126,11 @@
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s [struct]
     module.add_class('DlDciListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s::Format_e [enumeration]
-    module.add_enum('Format_e', ['ONE', 'ONE_A', 'ONE_B', 'ONE_C', 'ONE_D', 'TWO', 'TWO_A', 'TWO_B'], outer_class=root_module['ns3::DlDciListElement_s'])
+    module.add_enum('Format_e', ['ONE', 'ONE_A', 'ONE_B', 'ONE_C', 'ONE_D', 'TWO', 'TWO_A', 'TWO_B', 'NotValid_Dci_Format'], outer_class=root_module['ns3::DlDciListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s::VrbFormat_e [enumeration]
-    module.add_enum('VrbFormat_e', ['VRB_DISTRIBUTED', 'VRB_LOCALIZED'], outer_class=root_module['ns3::DlDciListElement_s'])
+    module.add_enum('VrbFormat_e', ['VRB_DISTRIBUTED', 'VRB_LOCALIZED', 'NotValid_VRB_Format'], outer_class=root_module['ns3::DlDciListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s::Ngap_e [enumeration]
-    module.add_enum('Ngap_e', ['GAP1', 'GAP2'], outer_class=root_module['ns3::DlDciListElement_s'])
+    module.add_enum('Ngap_e', ['GAP1', 'GAP2', 'NotValid_Ngap'], outer_class=root_module['ns3::DlDciListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::DlInfoListElement_s [struct]
     module.add_class('DlInfoListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::DlInfoListElement_s::HarqStatus_e [enumeration]
@@ -357,6 +357,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper [class]
     module.add_class('Ipv4AddressHelper', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
@@ -374,6 +376,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper [class]
     module.add_class('Ipv6AddressHelper', import_from_module='ns.internet')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress [class]
@@ -397,9 +401,9 @@
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s [struct]
     module.add_class('LogicalChannelConfigListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s::Direction_e [enumeration]
-    module.add_enum('Direction_e', ['DIR_UL', 'DIR_DL', 'DIR_BOTH'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'])
+    module.add_enum('Direction_e', ['DIR_UL', 'DIR_DL', 'DIR_BOTH', 'NotValid'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s::QosBearerType_e [enumeration]
-    module.add_enum('QosBearerType_e', ['QBT_NON_GBR', 'QBT_GBR'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'])
+    module.add_enum('QosBearerType_e', ['QBT_NON_GBR', 'QBT_GBR', 'NotValid_QosBearerType'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'])
     ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapProvider [class]
     module.add_class('LteAnrSapProvider', allow_subclassing=True)
     ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapUser [class]
@@ -732,7 +736,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::MacCeListElement_s [struct]
     module.add_class('MacCeListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::MacCeListElement_s::MacCeType_e [enumeration]
-    module.add_enum('MacCeType_e', ['BSR', 'PHR', 'CRNTI'], outer_class=root_module['ns3::MacCeListElement_s'])
+    module.add_enum('MacCeType_e', ['BSR', 'PHR', 'CRNTI', 'NotValid'], outer_class=root_module['ns3::MacCeListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::MacCeValue_u [struct]
     module.add_class('MacCeValue_u')
     ## names.h (module 'core'): ns3::Names [class]
@@ -776,7 +780,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::PhichListElement_s [struct]
     module.add_class('PhichListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::PhichListElement_s::Phich_e [enumeration]
-    module.add_enum('Phich_e', ['ACK', 'NACK'], outer_class=root_module['ns3::PhichListElement_s'])
+    module.add_enum('Phich_e', ['ACK', 'NACK', 'NotValid'], outer_class=root_module['ns3::PhichListElement_s'])
     ## lte-common.h (module 'lte'): ns3::PhyReceptionStatParameters [struct]
     module.add_class('PhyReceptionStatParameters')
     typehandlers.add_type_alias('void ( * ) ( ns3::PhyReceptionStatParameters const )', 'ns3::PhyReceptionStatParameters::TracedCallback')
@@ -856,7 +860,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::UlCqi_s [struct]
     module.add_class('UlCqi_s')
     ## ff-mac-common.h (module 'lte'): ns3::UlCqi_s::Type_e [enumeration]
-    module.add_enum('Type_e', ['SRS', 'PUSCH', 'PUCCH_1', 'PUCCH_2', 'PRACH'], outer_class=root_module['ns3::UlCqi_s'])
+    module.add_enum('Type_e', ['SRS', 'PUSCH', 'PUCCH_1', 'PUCCH_2', 'PRACH', 'NotValid'], outer_class=root_module['ns3::UlCqi_s'])
     ## ff-mac-common.h (module 'lte'): ns3::UlDciListElement_s [struct]
     module.add_class('UlDciListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::UlGrant_s [struct]
@@ -2299,11 +2303,13 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4AddressHelper_methods(root_module, root_module['ns3::Ipv4AddressHelper'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6AddressHelper_methods(root_module, root_module['ns3::Ipv6AddressHelper'])
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6InterfaceContainer_methods(root_module, root_module['ns3::Ipv6InterfaceContainer'])
@@ -3551,6 +3557,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -5891,6 +5905,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4AddressHelper_methods(root_module, cls):
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper::Ipv4AddressHelper(ns3::Ipv4AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv4AddressHelper const &', 'arg0')])
@@ -6242,6 +6268,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -6317,6 +6348,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6AddressHelper_methods(root_module, cls):
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper::Ipv6AddressHelper(ns3::Ipv6AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv6AddressHelper const &', 'arg0')])
@@ -6332,10 +6375,18 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    cls.add_method('Assign', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutAddress(ns3::NetDeviceContainer const & c) [member function]
     cls.add_method('AssignWithoutAddress', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutOnLink(ns3::NetDeviceContainer const & c) [member function]
+    cls.add_method('AssignWithoutOnLink', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6AddressHelper::NewAddress(ns3::Address addr) [member function]
     cls.add_method('NewAddress', 
                    'ns3::Ipv6Address', 
@@ -6364,6 +6415,8 @@
     cls.add_constructor([param('ns3::Ipv6Address', 'address')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
@@ -6376,6 +6429,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
     cls.add_method('GetPrefix', 
                    'ns3::Ipv6Prefix', 
@@ -6404,6 +6462,10 @@
     cls.add_method('SetNsDadUid', 
                    'void', 
                    [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
     cls.add_method('SetScope', 
                    'void', 
@@ -6506,6 +6568,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -13125,10 +13192,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -13593,11 +13660,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
     cls.add_method('SetChannel', 
                    'void', 
@@ -13608,11 +13675,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -17893,10 +17960,10 @@
     cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
     ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
     cls.add_constructor([])
-    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_pure_virtual=True, is_virtual=True)
     ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
@@ -20125,10 +20192,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p')], 
                    is_virtual=True, visibility='protected')
-    ## lte-pdcp.h (module 'lte'): void ns3::LtePdcp::DoTransmitPdcpSdu(ns3::Ptr<ns3::Packet> p) [member function]
+    ## lte-pdcp.h (module 'lte'): void ns3::LtePdcp::DoTransmitPdcpSdu(ns3::LtePdcpSapProvider::TransmitPdcpSduParameters params) [member function]
     cls.add_method('DoTransmitPdcpSdu', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
+                   [param('ns3::LtePdcpSapProvider::TransmitPdcpSduParameters', 'params')], 
                    is_virtual=True, visibility='protected')
     return
 
@@ -20543,11 +20610,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::MobilityModel> ns3::LteSpectrumPhy::GetMobility() [member function]
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::MobilityModel> ns3::LteSpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::LteSpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -20558,11 +20625,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::LteSpectrumPhy::GetRxAntenna() [member function]
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::LteSpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -23195,11 +23262,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::MobilityModel> ns3::RemSpectrumPhy::GetMobility() [member function]
+    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::MobilityModel> ns3::RemSpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::RemSpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -23210,11 +23277,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::RemSpectrumPhy::GetRxAntenna() [member function]
+    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::RemSpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## rem-spectrum-phy.h (module 'lte'): void ns3::RemSpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/bindings/modulegen__gcc_LP64.py ns-3.34/src/lte/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/lte/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
@@ -54,7 +54,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::BuildBroadcastListElement_s [struct]
     module.add_class('BuildBroadcastListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::BuildBroadcastListElement_s::Type_e [enumeration]
-    module.add_enum('Type_e', ['BCCH', 'PCCH'], outer_class=root_module['ns3::BuildBroadcastListElement_s'])
+    module.add_enum('Type_e', ['BCCH', 'PCCH', 'NotValid'], outer_class=root_module['ns3::BuildBroadcastListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::BuildDataListElement_s [struct]
     module.add_class('BuildDataListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::BuildRarListElement_s [struct]
@@ -80,7 +80,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::CqiListElement_s [struct]
     module.add_class('CqiListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::CqiListElement_s::CqiType_e [enumeration]
-    module.add_enum('CqiType_e', ['P10', 'P11', 'P20', 'P21', 'A12', 'A22', 'A20', 'A30', 'A31'], outer_class=root_module['ns3::CqiListElement_s'])
+    module.add_enum('CqiType_e', ['P10', 'P11', 'P20', 'P21', 'A12', 'A22', 'A20', 'A30', 'A31', 'NotValid'], outer_class=root_module['ns3::CqiListElement_s'])
     ## data-output-interface.h (module 'stats'): ns3::DataOutputCallback [class]
     module.add_class('DataOutputCallback', allow_subclassing=True, import_from_module='ns.stats')
     ## data-rate.h (module 'network'): ns3::DataRate [class]
@@ -126,11 +126,11 @@
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s [struct]
     module.add_class('DlDciListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s::Format_e [enumeration]
-    module.add_enum('Format_e', ['ONE', 'ONE_A', 'ONE_B', 'ONE_C', 'ONE_D', 'TWO', 'TWO_A', 'TWO_B'], outer_class=root_module['ns3::DlDciListElement_s'])
+    module.add_enum('Format_e', ['ONE', 'ONE_A', 'ONE_B', 'ONE_C', 'ONE_D', 'TWO', 'TWO_A', 'TWO_B', 'NotValid_Dci_Format'], outer_class=root_module['ns3::DlDciListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s::VrbFormat_e [enumeration]
-    module.add_enum('VrbFormat_e', ['VRB_DISTRIBUTED', 'VRB_LOCALIZED'], outer_class=root_module['ns3::DlDciListElement_s'])
+    module.add_enum('VrbFormat_e', ['VRB_DISTRIBUTED', 'VRB_LOCALIZED', 'NotValid_VRB_Format'], outer_class=root_module['ns3::DlDciListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s::Ngap_e [enumeration]
-    module.add_enum('Ngap_e', ['GAP1', 'GAP2'], outer_class=root_module['ns3::DlDciListElement_s'])
+    module.add_enum('Ngap_e', ['GAP1', 'GAP2', 'NotValid_Ngap'], outer_class=root_module['ns3::DlDciListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::DlInfoListElement_s [struct]
     module.add_class('DlInfoListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::DlInfoListElement_s::HarqStatus_e [enumeration]
@@ -357,6 +357,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper [class]
     module.add_class('Ipv4AddressHelper', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
@@ -374,6 +376,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper [class]
     module.add_class('Ipv6AddressHelper', import_from_module='ns.internet')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress [class]
@@ -397,9 +401,9 @@
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s [struct]
     module.add_class('LogicalChannelConfigListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s::Direction_e [enumeration]
-    module.add_enum('Direction_e', ['DIR_UL', 'DIR_DL', 'DIR_BOTH'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'])
+    module.add_enum('Direction_e', ['DIR_UL', 'DIR_DL', 'DIR_BOTH', 'NotValid'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s::QosBearerType_e [enumeration]
-    module.add_enum('QosBearerType_e', ['QBT_NON_GBR', 'QBT_GBR'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'])
+    module.add_enum('QosBearerType_e', ['QBT_NON_GBR', 'QBT_GBR', 'NotValid_QosBearerType'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'])
     ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapProvider [class]
     module.add_class('LteAnrSapProvider', allow_subclassing=True)
     ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapUser [class]
@@ -732,7 +736,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::MacCeListElement_s [struct]
     module.add_class('MacCeListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::MacCeListElement_s::MacCeType_e [enumeration]
-    module.add_enum('MacCeType_e', ['BSR', 'PHR', 'CRNTI'], outer_class=root_module['ns3::MacCeListElement_s'])
+    module.add_enum('MacCeType_e', ['BSR', 'PHR', 'CRNTI', 'NotValid'], outer_class=root_module['ns3::MacCeListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::MacCeValue_u [struct]
     module.add_class('MacCeValue_u')
     ## names.h (module 'core'): ns3::Names [class]
@@ -776,7 +780,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::PhichListElement_s [struct]
     module.add_class('PhichListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::PhichListElement_s::Phich_e [enumeration]
-    module.add_enum('Phich_e', ['ACK', 'NACK'], outer_class=root_module['ns3::PhichListElement_s'])
+    module.add_enum('Phich_e', ['ACK', 'NACK', 'NotValid'], outer_class=root_module['ns3::PhichListElement_s'])
     ## lte-common.h (module 'lte'): ns3::PhyReceptionStatParameters [struct]
     module.add_class('PhyReceptionStatParameters')
     typehandlers.add_type_alias('void ( * ) ( ns3::PhyReceptionStatParameters const )', 'ns3::PhyReceptionStatParameters::TracedCallback')
@@ -856,7 +860,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::UlCqi_s [struct]
     module.add_class('UlCqi_s')
     ## ff-mac-common.h (module 'lte'): ns3::UlCqi_s::Type_e [enumeration]
-    module.add_enum('Type_e', ['SRS', 'PUSCH', 'PUCCH_1', 'PUCCH_2', 'PRACH'], outer_class=root_module['ns3::UlCqi_s'])
+    module.add_enum('Type_e', ['SRS', 'PUSCH', 'PUCCH_1', 'PUCCH_2', 'PRACH', 'NotValid'], outer_class=root_module['ns3::UlCqi_s'])
     ## ff-mac-common.h (module 'lte'): ns3::UlDciListElement_s [struct]
     module.add_class('UlDciListElement_s')
     ## ff-mac-common.h (module 'lte'): ns3::UlGrant_s [struct]
@@ -2299,11 +2303,13 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4AddressHelper_methods(root_module, root_module['ns3::Ipv4AddressHelper'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6AddressHelper_methods(root_module, root_module['ns3::Ipv6AddressHelper'])
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6InterfaceContainer_methods(root_module, root_module['ns3::Ipv6InterfaceContainer'])
@@ -3551,6 +3557,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -5891,6 +5905,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4AddressHelper_methods(root_module, cls):
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper::Ipv4AddressHelper(ns3::Ipv4AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv4AddressHelper const &', 'arg0')])
@@ -6242,6 +6268,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -6317,6 +6348,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6AddressHelper_methods(root_module, cls):
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper::Ipv6AddressHelper(ns3::Ipv6AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv6AddressHelper const &', 'arg0')])
@@ -6332,10 +6375,18 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    cls.add_method('Assign', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutAddress(ns3::NetDeviceContainer const & c) [member function]
     cls.add_method('AssignWithoutAddress', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutOnLink(ns3::NetDeviceContainer const & c) [member function]
+    cls.add_method('AssignWithoutOnLink', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6AddressHelper::NewAddress(ns3::Address addr) [member function]
     cls.add_method('NewAddress', 
                    'ns3::Ipv6Address', 
@@ -6364,6 +6415,8 @@
     cls.add_constructor([param('ns3::Ipv6Address', 'address')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
@@ -6376,6 +6429,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
     cls.add_method('GetPrefix', 
                    'ns3::Ipv6Prefix', 
@@ -6404,6 +6462,10 @@
     cls.add_method('SetNsDadUid', 
                    'void', 
                    [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
     cls.add_method('SetScope', 
                    'void', 
@@ -6506,6 +6568,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -13125,10 +13192,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -13593,11 +13660,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
     cls.add_method('SetChannel', 
                    'void', 
@@ -13608,11 +13675,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -17893,10 +17960,10 @@
     cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
     ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
     cls.add_constructor([])
-    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_pure_virtual=True, is_virtual=True)
     ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
@@ -20125,10 +20192,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p')], 
                    is_virtual=True, visibility='protected')
-    ## lte-pdcp.h (module 'lte'): void ns3::LtePdcp::DoTransmitPdcpSdu(ns3::Ptr<ns3::Packet> p) [member function]
+    ## lte-pdcp.h (module 'lte'): void ns3::LtePdcp::DoTransmitPdcpSdu(ns3::LtePdcpSapProvider::TransmitPdcpSduParameters params) [member function]
     cls.add_method('DoTransmitPdcpSdu', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
+                   [param('ns3::LtePdcpSapProvider::TransmitPdcpSduParameters', 'params')], 
                    is_virtual=True, visibility='protected')
     return
 
@@ -20543,11 +20610,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::MobilityModel> ns3::LteSpectrumPhy::GetMobility() [member function]
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::MobilityModel> ns3::LteSpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::LteSpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -20558,11 +20625,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::LteSpectrumPhy::GetRxAntenna() [member function]
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::LteSpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -23195,11 +23262,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::MobilityModel> ns3::RemSpectrumPhy::GetMobility() [member function]
+    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::MobilityModel> ns3::RemSpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::RemSpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -23210,11 +23277,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::RemSpectrumPhy::GetRxAntenna() [member function]
+    ## rem-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::RemSpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## rem-spectrum-phy.h (module 'lte'): void ns3::RemSpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/doc/source/lte-design.rst ns-3.34/src/lte/doc/source/lte-design.rst
--- ns-3.33/src/lte/doc/source/lte-design.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/doc/source/lte-design.rst	2021-07-14 10:31:06.000000000 -0700
@@ -679,9 +679,9 @@
 Integration of the BLER curves in the ns-3 LTE module
 -----------------------------------------------------
 
-The model implemented uses the curves for the LSM of the recently LTE PHY Error Model released in the ns3 community by the Signet Group [PaduaPEM]_ and the new ones generated for different CB sizes. The ``LteSpectrumPhy`` class is in charge of evaluating the TB BLER thanks to the methods provided by the ``LteMiErrorModel`` class, which is in charge of evaluating the TB BLER according to the vector of the perceived SINR per RB, the MCS and the size in order to proper model the segmentation of the TB in CBs. In order to obtain the vector of the perceived SINR two instances of ``LtePemSinrChunkProcessor`` (child of ``LteChunkProcessor`` dedicated to evaluate the SINR for obtaining physical error performance) have been attached to UE downlink and eNB uplink ``LteSpectrumPhy`` modules for evaluating the error model distribution respectively of PDSCH (UE side) and ULSCH (eNB side).
+The model implemented uses the curves for the LSM of the recently LTE PHY Error Model released in the ns3 community by the Signet Group [PaduaPEM]_ and the new ones generated for different CB sizes. The ``LteSpectrumPhy`` class is in charge of evaluating the TB BLER thanks to the methods provided by the ``LteMiErrorModel`` class, which is in charge of evaluating the TB BLER according to the vector of the perceived SINR per RB, the MCS and the size in order to proper model the segmentation of the TB in CBs. In order to obtain the vector of the perceived SINRs for data and control signals, two instances of ``LteChunkProcessor`` (dedicated to evaluate the SINR for obtaining physical error performance) have been attached to UE downlink and eNB uplink ``LteSpectrumPhy`` modules for evaluating the error model distribution of PDSCH (UE side) and ULSCH (eNB side).
 
-The model can be disabled for working with a zero-losses channel by setting the ``PemEnabled`` attribute of the ``LteSpectrumPhy`` class (by default is active). This can be done according to the standard ns3 attribute system procedure, that is::
+The model can be disabled for working with a zero-losses channel by setting the ``DataErrorModelEnabled`` attribute of the ``LteSpectrumPhy`` class (by default is active). This can be done according to the standard ns3 attribute system procedure, that is::
 
   Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
 
@@ -1542,8 +1542,8 @@
     * **Transmission Buffer**: it is the RLC SDU queue. 
       When the AM RLC entity receives a SDU in the TransmitPdcpPdu service primitive from the
       upper PDCP entity, it enqueues it in the Transmission Buffer. We
-      put a limit on the RLC buffer size and just silently drop SDUs
-      when the buffer is full. 
+      put a limit on the RLC buffer size and the LteRlc TxDrop trace source
+      is called when a drop due to a full buffer occurs. 
 
     * **Transmitted PDUs Buffer**: it is the queue of transmitted RLC PDUs for which an ACK/NACK has not
       been received yet. When the AM RLC entity sends a PDU to the MAC
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/doc/source/lte-references.rst ns-3.34/src/lte/doc/source/lte-references.rst
--- ns-3.33/src/lte/doc/source/lte-references.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/doc/source/lte-references.rst	2021-07-14 10:31:06.000000000 -0700
@@ -86,10 +86,10 @@
    March 2011 
 
 .. [PaduaPEM] `"Ns-developers - LTE error model contribution"
-   <http://mailman.isi.edu/pipermail/ns-developers/2011-November/009559.html>`_
+   <http://mailman.isi.edu/pipermail/ns-developers/2011-November/009397.html>`_
 
 .. [ViennaLteSim] `"The Vienna LTE Simulators"
-   <http://www.nt.tuwien.ac.at/about-us/staff/josep-colom-ikuno/lte-simulators/>`_
+   <https://www.nt.tuwien.ac.at/research/mobile-communications/vccs/vienna-lte-a-simulators/>`_
 
 .. [LozanoCost] Joan Olmos, Silvia Ruiz, Mario García-Lozano and David Martín-Sacristán,
    "Link Abstraction Models Based on Mutual Information for LTE Downlink",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/doc/source/lte-user.rst ns-3.34/src/lte/doc/source/lte-user.rst
--- ns-3.33/src/lte/doc/source/lte-user.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/doc/source/lte-user.rst	2021-07-14 10:31:06.000000000 -0700
@@ -684,7 +684,7 @@
 program towards the end, right before the call to Simulator::Run ()::
 
   Ptr<RadioEnvironmentMapHelper> remHelper = CreateObject<RadioEnvironmentMapHelper> ();
-  remHelper->SetAttribute ("ChannelPath", StringValue ("/ChannelList/0"));
+  remHelper->SetAttribute ("Channel", PointerValue (lteHelper->GetDownlinkSpectrumChannel ()));
   remHelper->SetAttribute ("OutputFile", StringValue ("rem.out"));
   remHelper->SetAttribute ("XMin", DoubleValue (-400.0));
   remHelper->SetAttribute ("XMax", DoubleValue (400.0));
@@ -2600,19 +2600,25 @@
 
    Downlink instantaneous throughput of UE in scenario A
 
-In this scenario, when using the *Ideal* RRC the UE after the RLF will connect
-and disconnect from the eNB several times. This is because it can
-synchronize (i.e., start reading system information) with an eNB at a low
-RSRP level, which is default to -140 dBm (see QRxLevMin attribute of eNB RRC).
-It enables the UE to start the random access procedure with the eNB. With the 
-*Ideal* RRC, the UE can complete the random access without any errors, since
-all the RRC messages are exchanged ideally between the eNB and the UE.
+In the simulator, a UE can synchronize (i.e., start reading system information)
+with an eNB at a low RSRP level, which defaults to -140 dBm (see QRxLevMin attribute of eNB RRC).
+It enables the UE to start the random access procedure with the eNB. In this scenario,
+when using the *Ideal* RRC the UE after the RLF will connect and disconnect from
+the eNB several times. This is because in the *Ideal* RRC mode, once the UE is
+able to receive Random Access Response (RAR) from the eNB, it can complete the
+RRC connection establishment procedure
+(:ref:`sec-rrc-connection-establishment`) without any
+errors, since all the RRC messages are exchanged ideally between the eNB and the UE.
 However, soon after the connection establishment, it ends up in RLF due to the
 poor channel quality. On the other hand, with the *Real* RRC the UE after the RLF
-will not be able to complete the random access procedure due to the poor channel
-conditions, thus, will not be able to establish the connection with the eNB.
-Therefore, in both the cases the UE throughput drops to zero as shown in the
-Figure :ref:`fig-lena-radio-link-failure-one-enb-thrput`.
+will not be able to complete the RRC connection establishment procedure due to
+the loss of RRC messages. Thus, it will not be able to establish the connection
+with the eNB. Therefore, in both the cases the UE throughput drops to zero as shown in the
+Figure :ref:`fig-lena-radio-link-failure-one-enb-thrput`. It is also worthwhile
+to mention that towards the end of the simulation (using *Ideal* or *Real* RRC)
+there are occasions where RAR timer at the UE MAC would timeout due to the
+increased distance between the eNB and the UE, which causes errors while decoding
+this message at the UE (Note: the downlink control error model is enabled by default).
 
 
 .. _lena-radio-link-failure-two-enb:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/examples/lena-distributed-ffr.cc ns-3.34/src/lte/examples/lena-distributed-ffr.cc
--- ns-3.33/src/lte/examples/lena-distributed-ffr.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/examples/lena-distributed-ffr.cc	2021-07-14 10:31:06.000000000 -0700
@@ -355,7 +355,7 @@
       Ptr<SpectrumChannel> dlChannel = enbDlSpectrumPhy->GetChannel ();
       uint32_t dlChannelId = dlChannel->GetId ();
       NS_LOG_INFO ("DL ChannelId: " << dlChannelId);
-      remHelper->SetAttribute ("ChannelPath", StringValue ("/ChannelList/1"));
+      remHelper->SetAttribute ("Channel", PointerValue (dlChannel));
       remHelper->SetAttribute ("OutputFile", StringValue ("lena-distributed-ffr.rem"));
       remHelper->SetAttribute ("XMin", DoubleValue (macroUeBox.xMin));
       remHelper->SetAttribute ("XMax", DoubleValue (macroUeBox.xMax));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/examples/lena-dual-stripe.cc ns-3.34/src/lte/examples/lena-dual-stripe.cc
--- ns-3.33/src/lte/examples/lena-dual-stripe.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/examples/lena-dual-stripe.cc	2021-07-14 10:31:06.000000000 -0700
@@ -851,7 +851,7 @@
       PrintGnuplottableUeListToFile ("ues.txt");
 
       remHelper = CreateObject<RadioEnvironmentMapHelper> ();
-      remHelper->SetAttribute ("ChannelPath", StringValue ("/ChannelList/0"));
+      remHelper->SetAttribute ("Channel", PointerValue (lteHelper->GetDownlinkSpectrumChannel ()));
       remHelper->SetAttribute ("OutputFile", StringValue ("lena-dual-stripe.rem"));
       remHelper->SetAttribute ("XMin", DoubleValue (macroUeBox.xMin));
       remHelper->SetAttribute ("XMax", DoubleValue (macroUeBox.xMax));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/examples/lena-radio-link-failure.cc ns-3.34/src/lte/examples/lena-radio-link-failure.cc
--- ns-3.33/src/lte/examples/lena-radio-link-failure.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/examples/lena-radio-link-failure.cc	2021-07-14 10:31:06.000000000 -0700
@@ -222,7 +222,6 @@
             << ", preamble Tx Counter " << (uint16_t) preambleTxCounter
             << ", Max Preamble Tx Limit " << (uint16_t) maxPreambleTxLimit
             << ", UE RA response timeout" << std::endl;
-  NS_FATAL_ERROR ("NotifyRaResponseTimeoutUe");
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/examples/lena-rem-sector-antenna.cc ns-3.34/src/lte/examples/lena-rem-sector-antenna.cc
--- ns-3.33/src/lte/examples/lena-rem-sector-antenna.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/examples/lena-rem-sector-antenna.cc	2021-07-14 10:31:06.000000000 -0700
@@ -37,7 +37,7 @@
 int
 main (int argc, char *argv[])
 {
-  CommandLine cmd (__FILE__);
+  CommandLine cmd;
   cmd.Parse (argc, argv);
 
   ConfigStore inputConfig;
@@ -178,20 +178,20 @@
   // Beam width is made quite narrow so sectors can be noticed in the REM
   lteHelper->SetEnbAntennaModelType ("ns3::CosineAntennaModel");
   lteHelper->SetEnbAntennaModelAttribute ("Orientation", DoubleValue (0));
-  lteHelper->SetEnbAntennaModelAttribute ("Beamwidth",   DoubleValue (100));
-  lteHelper->SetEnbAntennaModelAttribute ("MaxGain",     DoubleValue (0.0));
+  lteHelper->SetEnbAntennaModelAttribute ("HorizontalBeamwidth", DoubleValue (100));
+  lteHelper->SetEnbAntennaModelAttribute ("MaxGain", DoubleValue (0.0));
   enbDevs.Add ( lteHelper->InstallEnbDevice (threeSectorNodes.Get (0)));
 
   lteHelper->SetEnbAntennaModelType ("ns3::CosineAntennaModel");
   lteHelper->SetEnbAntennaModelAttribute ("Orientation", DoubleValue (360/3));
-  lteHelper->SetEnbAntennaModelAttribute ("Beamwidth",   DoubleValue (100));
-  lteHelper->SetEnbAntennaModelAttribute ("MaxGain",     DoubleValue (0.0));
+  lteHelper->SetEnbAntennaModelAttribute ("HorizontalBeamwidth", DoubleValue (100));
+  lteHelper->SetEnbAntennaModelAttribute ("MaxGain", DoubleValue (0.0));
   enbDevs.Add ( lteHelper->InstallEnbDevice (threeSectorNodes.Get (1)));
 
   lteHelper->SetEnbAntennaModelType ("ns3::CosineAntennaModel");
   lteHelper->SetEnbAntennaModelAttribute ("Orientation", DoubleValue (2*360/3));
-  lteHelper->SetEnbAntennaModelAttribute ("Beamwidth",   DoubleValue (100));
-  lteHelper->SetEnbAntennaModelAttribute ("MaxGain",     DoubleValue (0.0));
+  lteHelper->SetEnbAntennaModelAttribute ("HorizontalBeamwidth", DoubleValue (100));
+  lteHelper->SetEnbAntennaModelAttribute ("MaxGain", DoubleValue (0.0));
   enbDevs.Add ( lteHelper->InstallEnbDevice (threeSectorNodes.Get (2)));
 
   for (uint32_t i = 0; i < nEnb; i++)
@@ -205,7 +205,7 @@
     }
 
   // by default, simulation will anyway stop right after the REM has been generated
-  Simulator::Stop (Seconds (0.0069));  
+  Simulator::Stop (Seconds (0.0069));
 
   Ptr<RadioEnvironmentMapHelper> remHelper = CreateObject<RadioEnvironmentMapHelper> ();
   remHelper->SetAttribute ("ChannelPath", StringValue ("/ChannelList/0"));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/helper/radio-environment-map-helper.cc ns-3.34/src/lte/helper/radio-environment-map-helper.cc
--- ns-3.33/src/lte/helper/radio-environment-map-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/helper/radio-environment-map-helper.cc	2021-07-14 10:31:06.000000000 -0700
@@ -28,6 +28,7 @@
 #include <ns3/uinteger.h>
 #include <ns3/string.h>
 #include <ns3/boolean.h>
+#include <ns3/pointer.h>
 #include <ns3/spectrum-channel.h>
 #include <ns3/config.h>
 #include <ns3/rem-spectrum-phy.h>
@@ -72,7 +73,16 @@
     .SetParent<Object> ()
     .SetGroupName("Lte")
     .AddConstructor<RadioEnvironmentMapHelper> ()
-    .AddAttribute ("ChannelPath", "The path to the channel for which the Radio Environment Map is to be generated",
+    .AddAttribute ("Channel",
+                   "The DL spectrum channel for which the RadioEnvironment Map is to be generated. "
+                   "Alternatively ChannelPath attribute can be used."
+                   "Only one of the two (Channel or ChannelPath) should be set.",
+                   PointerValue (nullptr),
+                   MakePointerAccessor (&RadioEnvironmentMapHelper::m_channel),
+                   MakePointerChecker<SpectrumChannel> ())
+    .AddAttribute ("ChannelPath", "The path to the channel for which the Radio Environment Map is to be generated."
+                   "This attribute is an alternative to Channel attribute and is only used if Channel is not set (equal to nullptr). "
+                   "Only one of the two (Channel or ChannelPath) should be set.",
                    StringValue ("/ChannelList/0"),
                    MakeStringAccessor (&RadioEnvironmentMapHelper::m_channelPath),
                    MakeStringChecker ())
@@ -185,13 +195,17 @@
     {
       NS_FATAL_ERROR ("only one REM supported per instance of RadioEnvironmentMapHelper");
     }
-  Config::MatchContainer match = Config::LookupMatches (m_channelPath);
-  if (match.GetN () != 1)
+
+  if (m_channel == nullptr) // if Channel attribute is not set, then use the ChannelPath attribute
     {
-      NS_FATAL_ERROR ("Lookup " << m_channelPath << " should have exactly one match");
+      Config::MatchContainer match = Config::LookupMatches (m_channelPath);
+      if (match.GetN () != 1)
+        {
+          NS_FATAL_ERROR ("Lookup " << m_channelPath << " should have exactly one match");
+        }
+      m_channel = match.Get (0)->GetObject<SpectrumChannel> ();
+      NS_ABORT_MSG_IF (m_channel == 0, "object at " << m_channelPath << " is not of type SpectrumChannel");
     }
-  m_channel = match.Get (0)->GetObject<SpectrumChannel> ();
-  NS_ABORT_MSG_IF (m_channel == 0, "object at " << m_channelPath << "is not of type SpectrumChannel");
 
   m_outFile.open (m_outputFile.c_str ());
   if (!m_outFile.is_open ())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/helper/radio-environment-map-helper.h ns-3.34/src/lte/helper/radio-environment-map-helper.h
--- ns-3.33/src/lte/helper/radio-environment-map-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/helper/radio-environment-map-helper.h	2021-07-14 10:31:06.000000000 -0700
@@ -137,12 +137,23 @@
  
   double m_z;  ///< The `Z` attribute.
 
-  std::string m_channelPath;  ///< The `ChannelPath` attribute.
+  /**
+   * The `ChannelPath` attribute. If `Channel` attribute is not set, then
+   * `ChannelPath` will be used to determine the DL channel object for which
+   * the REM will be created.
+   */
+  std::string m_channelPath;
+
   std::string m_outputFile;   ///< The `OutputFile` attribute.
 
   bool m_stopWhenDone;   ///< The `StopWhenDone` attribute.
   
-  /// The channel object taken from the `ChannelPath` attribute.
+  /**
+   * The `Channel` attribute, which is a direct pointer to the DL channel
+   * object for which will be created the REM. Alternatively, `ChannelPath`
+   * attribute can be used. If `ChannelPath` attribute is being used then the
+   * m_channel object is configured by using the `ChannelPath` attribute value.
+   */
   Ptr<SpectrumChannel> m_channel;
 
   double m_noisePower;  ///< The `NoisePower` attribute.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/epc-x2-sap.h ns-3.34/src/lte/model/epc-x2-sap.h
--- ns-3.33/src/lte/model/epc-x2-sap.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/epc-x2-sap.h	2021-07-14 10:31:06.000000000 -0700
@@ -142,10 +142,10 @@
   struct RelativeNarrowbandTxBand
   {
     std::vector <bool> rntpPerPrbList; ///< RNTP per prb list
-    int16_t     rntpThreshold; ///< RNTP threshold
-    uint16_t    antennaPorts; ///< antenna ports
-    uint16_t    pB; ///< PB
-    uint16_t    pdcchInterferenceImpact; ///< PDC channel interference list
+    int16_t     rntpThreshold {INT16_MIN}; ///< RNTP threshold
+    uint16_t    antennaPorts {UINT16_MAX}; ///< antenna ports
+    uint16_t    pB {UINT16_MAX}; ///< PB
+    uint16_t    pdcchInterferenceImpact {UINT16_MAX}; ///< PDC channel interference list
   };
 
   /**
@@ -302,7 +302,7 @@
    */
   struct LoadInformationParams
   {
-    uint16_t            targetCellId; ///< target cell ID
+    uint16_t            targetCellId {UINT16_MAX}; ///< target cell ID
     std::vector <CellInformationItem> cellInformationList; ///< cell information list
   };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/fading-traces/fading_trace_generator.m ns-3.34/src/lte/model/fading-traces/fading_trace_generator.m
--- ns-3.33/src/lte/model/fading-traces/fading_trace_generator.m	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/fading-traces/fading_trace_generator.m	2021-07-14 10:31:07.000000000 -0700
@@ -42,12 +42,9 @@
 
 
 % create the channel object
-c = rayleighchan(ts, fd, delays_pedestrianEPA, power_pedestrianEPA);
-%c = rayleighchan(ts, fd, delays_vehicularEVA, power_vehicularEVA);
-%c = rayleighchan(ts, fd, delays_urbanETU, power_urbanETU);
-%c.StorePathGains = 1;
-c.ResetBeforeFiltering = 0;
-c.NormalizePathGains = 1;
+c = comm.RayleighChannel('SampleRate', 1/ts, 'MaximumDopplerShift', fd, 'PathDelays', delays_pedestrianEPA, 'AveragePathGains', power_pedestrianEPA);
+%c = comm.RayleighChannel('SampleRate', 1/ts, 'MaximumDopplerShift', fd, 'PathDelays', delays_vehicularEVA, 'AveragePathGains', power_vehicularEVA);
+%c = comm.RayleighChannel('SampleRate', 1/ts, 'MaximumDopplerShift', fd, 'PathDelays', delays_urbanETU, 'AveragePathGains', power_urbanETU);
 
 TTI = 0.001;
 
@@ -67,7 +64,7 @@
 for ii=1:round((traceDuration/TTI))
         
     % y is the frequency response of the channel
-    y = filter(c,sig);   
+    y = c(sig);   
     
 %     [Pxx,F] = PWELCH(X,WINDOW,NOVERLAP,NFFT,Fs) returns a PSD computed as
 %     a function of physical frequency (Hz).  Fs is the sampling frequency
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/ff-mac-common.h ns-3.34/src/lte/model/ff-mac-common.h
--- ns-3.33/src/lte/model/ff-mac-common.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/ff-mac-common.h	2021-07-14 10:31:07.000000000 -0700
@@ -92,44 +92,45 @@
  */
 struct DlDciListElement_s
 {
-  uint16_t  m_rnti; ///< RNTI
-  uint32_t  m_rbBitmap; ///< RB bitmap
-  uint8_t   m_rbShift; ///< RB shift
-  uint8_t   m_resAlloc; ///< The type of resource allocation
+  uint16_t  m_rnti {UINT16_MAX}; ///< RNTI
+  uint32_t  m_rbBitmap {UINT8_MAX}; ///< RB bitmap
+  uint8_t   m_rbShift {UINT8_MAX}; ///< RB shift
+  uint8_t   m_resAlloc {UINT8_MAX}; ///< The type of resource allocation
   std::vector <uint16_t>  m_tbsSize; ///< The TBs size
   std::vector <uint8_t>   m_mcs; ///< MCS
   std::vector <uint8_t>   m_ndi; ///< New data indicator
   std::vector <uint8_t>   m_rv; ///< Redundancy version
-  uint8_t   m_cceIndex; ///< Control Channel Element index
-  uint8_t   m_aggrLevel; ///< The aggregation level
-  uint8_t   m_precodingInfo; ///< precoding info
+  uint8_t   m_cceIndex {UINT8_MAX}; ///< Control Channel Element index
+  uint8_t   m_aggrLevel {UINT8_MAX}; ///< The aggregation level
+  uint8_t   m_precodingInfo {UINT8_MAX}; ///< precoding info
   /// Format enumeration
   enum Format_e
   {
-    ONE, ONE_A, ONE_B, ONE_C, ONE_D, TWO, TWO_A, TWO_B
-  } m_format; ///< the format
-  uint8_t   m_tpc; ///< Tx power control command
-  uint8_t   m_harqProcess; ///< HARQ process
-  uint8_t   m_dai; ///< DL assignment index
+    ONE, ONE_A, ONE_B, ONE_C, ONE_D, TWO, TWO_A, TWO_B, NotValid_Dci_Format
+  } m_format {NotValid_Dci_Format}; ///< the format
+  uint8_t   m_tpc {UINT8_MAX}; ///< Tx power control command
+  uint8_t   m_harqProcess {UINT8_MAX}; ///< HARQ process
+  uint8_t   m_dai {UINT8_MAX}; ///< DL assignment index
   /// Vrb Format enum
   enum VrbFormat_e
   {
     VRB_DISTRIBUTED,
-    VRB_LOCALIZED
-  } m_vrbFormat; ///< the format
-  bool      m_tbSwap; ///< swap?
-  bool      m_spsRelease; ///< release?
-  bool      m_pdcchOrder; ///< cch order?
-  uint8_t   m_preambleIndex; ///< preamble index
-  uint8_t   m_prachMaskIndex; ///< RACH mask index
+    VRB_LOCALIZED,
+    NotValid_VRB_Format
+  } m_vrbFormat {NotValid_VRB_Format}; ///< the format
+  bool      m_tbSwap {false}; ///< swap?
+  bool      m_spsRelease {false}; ///< release?
+  bool      m_pdcchOrder {false}; ///< cch order?
+  uint8_t   m_preambleIndex {UINT8_MAX}; ///< preamble index
+  uint8_t   m_prachMaskIndex {UINT8_MAX}; ///< RACH mask index
   /// Ngap enum
   enum Ngap_e
   {
-    GAP1, GAP2
-  } m_nGap; ///< the gap
-  uint8_t   m_tbsIdx; ///< tbs index
-  uint8_t   m_dlPowerOffset; ///< DL power offset
-  uint8_t   m_pdcchPowerOffset; ///<  CCH power offset
+    GAP1, GAP2, NotValid_Ngap
+  } m_nGap {NotValid_Ngap}; ///< the gap
+  uint8_t   m_tbsIdx {UINT8_MAX}; ///< tbs index
+  uint8_t   m_dlPowerOffset {UINT8_MAX}; ///< DL power offset
+  uint8_t   m_pdcchPowerOffset {UINT8_MAX}; ///<  CCH power offset
 };
 
 /**
@@ -138,23 +139,23 @@
  */
 struct UlDciListElement_s
 {
-  uint16_t  m_rnti; ///< RNTI
-  uint8_t   m_rbStart; ///< start
-  uint8_t   m_rbLen; ///< length
-  uint16_t  m_tbSize; ///< size
-  uint8_t   m_mcs; ///< MCS
-  uint8_t   m_ndi; ///< NDI
-  uint8_t   m_cceIndex; ///< Control Channel Element index
-  uint8_t   m_aggrLevel; ///< The aggregation level
-  uint8_t   m_ueTxAntennaSelection; ///< UE antenna selection
-  bool      m_hopping; ///< hopping?
-  uint8_t   m_n2Dmrs; ///< n2 DMRS
-  int8_t    m_tpc; ///< Tx power control command
-  bool      m_cqiRequest; ///< CQI request
-  uint8_t   m_ulIndex; ///< UL index
-  uint8_t   m_dai; ///< DL assignment index
-  uint8_t   m_freqHopping; ///< freq hopping
-  int8_t    m_pdcchPowerOffset; ///< CCH power offset
+  uint16_t  m_rnti {UINT16_MAX}; ///< RNTI
+  uint8_t   m_rbStart {UINT8_MAX}; ///< start
+  uint8_t   m_rbLen {UINT8_MAX}; ///< length
+  uint16_t  m_tbSize {UINT16_MAX}; ///< size
+  uint8_t   m_mcs {UINT8_MAX}; ///< MCS
+  uint8_t   m_ndi {UINT8_MAX}; ///< NDI
+  uint8_t   m_cceIndex {UINT8_MAX}; ///< Control Channel Element index
+  uint8_t   m_aggrLevel {UINT8_MAX}; ///< The aggregation level
+  uint8_t   m_ueTxAntennaSelection {UINT8_MAX}; ///< UE antenna selection
+  bool      m_hopping {false}; ///< hopping?
+  uint8_t   m_n2Dmrs {UINT8_MAX}; ///< n2 DMRS
+  int8_t    m_tpc {INT8_MIN}; ///< Tx power control command
+  bool      m_cqiRequest {false}; ///< CQI request
+  uint8_t   m_ulIndex {UINT8_MAX}; ///< UL index
+  uint8_t   m_dai {UINT8_MAX}; ///< DL assignment index
+  uint8_t   m_freqHopping {UINT8_MAX}; ///< freq hopping
+  int8_t    m_pdcchPowerOffset {INT8_MIN}; ///< CCH power offset
 };
 
 /**
@@ -172,8 +173,8 @@
  */
 struct VendorSpecificListElement_s
 {
-  uint32_t m_type; ///< type
-  uint32_t m_length; ///< length
+  uint32_t m_type {UINT32_MAX}; ///< type
+  uint32_t m_length {UINT32_MAX}; ///< length
   Ptr<VendorSpecificValue> m_value; ///< value
 };
 
@@ -183,29 +184,31 @@
  */
 struct LogicalChannelConfigListElement_s
 {
-  uint8_t   m_logicalChannelIdentity; ///< logical channel identity
-  uint8_t   m_logicalChannelGroup; ///< logical channel group
+  uint8_t   m_logicalChannelIdentity {UINT8_MAX}; ///< logical channel identity
+  uint8_t   m_logicalChannelGroup {UINT8_MAX}; ///< logical channel group
 
   /// Direction enum
   enum Direction_e
   {
     DIR_UL,
     DIR_DL,
-    DIR_BOTH
-  } m_direction; ///< the direction
+    DIR_BOTH,
+    NotValid
+  } m_direction {NotValid}; ///< the direction
 
   /// QosBearerType enum
   enum QosBearerType_e
   {
     QBT_NON_GBR,
-    QBT_GBR
-  } m_qosBearerType; ///< the QOS bearer type
-
-  uint8_t   m_qci; ///< QCI
-  uint64_t  m_eRabMaximulBitrateUl; ///< ERAB maximum bit rate UL
-  uint64_t  m_eRabMaximulBitrateDl; ///< ERAB maximum bit rate DL
-  uint64_t  m_eRabGuaranteedBitrateUl; ///< ERAB guaranteed bit rate UL
-  uint64_t  m_eRabGuaranteedBitrateDl; ///< ERAB guaranteed bit rate DL
+    QBT_GBR,
+    NotValid_QosBearerType
+  } m_qosBearerType {NotValid_QosBearerType}; ///< the QOS bearer type
+
+  uint8_t   m_qci {UINT8_MAX}; ///< QCI
+  uint64_t  m_eRabMaximulBitrateUl {UINT64_MAX}; ///< ERAB maximum bit rate UL
+  uint64_t  m_eRabMaximulBitrateDl {UINT64_MAX}; ///< ERAB maximum bit rate DL
+  uint64_t  m_eRabGuaranteedBitrateUl {UINT64_MAX}; ///< ERAB guaranteed bit rate UL
+  uint64_t  m_eRabGuaranteedBitrateDl {UINT64_MAX}; ///< ERAB guaranteed bit rate DL
 };
 
 /**
@@ -214,8 +217,8 @@
  */
 struct RachListElement_s
 {
-  uint16_t  m_rnti; ///< RNTI
-  uint16_t  m_estimatedSize; ///< estimated size
+  uint16_t  m_rnti {UINT16_MAX}; ///< RNTI
+  uint16_t  m_estimatedSize {UINT16_MAX}; ///< estimated size
 };
 
 /**
@@ -224,12 +227,12 @@
  */
 struct PhichListElement_s
 {
-  uint16_t  m_rnti; ///< RNTI
+  uint16_t  m_rnti {UINT16_MAX}; ///< RNTI
   /// Phich enum
   enum Phich_e
   {
-    ACK, NACK
-  } m_phich; ///< the phich
+    ACK, NACK, NotValid
+  } m_phich {NotValid}; ///< the phich
 };
 
 /**
@@ -237,8 +240,8 @@
  */
 struct RlcPduListElement_s
 {
-  uint8_t   m_logicalChannelIdentity; ///< logical channel identity
-  uint16_t  m_size; ///< size
+  uint8_t   m_logicalChannelIdentity {UINT8_MAX}; ///< logical channel identity
+  uint16_t  m_size {UINT16_MAX}; ///< size
 };
 
 /**
@@ -247,7 +250,7 @@
  */
 struct BuildDataListElement_s
 {
-  uint16_t  m_rnti; ///< RNTI
+  uint16_t  m_rnti {UINT16_MAX}; ///< RNTI
   struct DlDciListElement_s m_dci; ///< DCI
   std::vector <enum CeBitmap_e> m_ceBitmap; ///< CE bitmap
   std::vector < std::vector <struct RlcPduListElement_s> > m_rlcPduList; ///< RLC PDU list
@@ -258,15 +261,15 @@
  */
 struct UlGrant_s
 {
-  uint16_t m_rnti; ///< RNTI
-  uint8_t m_rbStart; ///< start
-  uint8_t m_rbLen; ///< length
-  uint16_t m_tbSize; ///< size
-  uint8_t m_mcs; ///< MCS
-  bool m_hopping; ///< hopping?
-  int8_t m_tpc; ///< Tx power control command
-  bool m_cqiRequest; ///< CQI request?
-  bool m_ulDelay; ///< UL delay?
+  uint16_t m_rnti {UINT16_MAX}; ///< RNTI
+  uint8_t m_rbStart {UINT8_MAX}; ///< start
+  uint8_t m_rbLen {UINT8_MAX}; ///< length
+  uint16_t m_tbSize {UINT16_MAX}; ///< size
+  uint8_t m_mcs {UINT8_MAX}; ///< MCS
+  bool m_hopping {false}; ///< hopping?
+  int8_t m_tpc {INT8_MIN}; ///< Tx power control command
+  bool m_cqiRequest {false}; ///< CQI request?
+  bool m_ulDelay {false}; ///< UL delay?
 }; 
 
 /**
@@ -274,7 +277,7 @@
  */
 struct BuildRarListElement_s
 {
-  uint16_t  m_rnti; ///< RNTI
+  uint16_t  m_rnti {UINT16_MAX}; ///< RNTI
   //uint32_t  m_grant; // Substituted with type UlGrant_s
   UlGrant_s m_grant; ///< grant
   struct DlDciListElement_s m_dci; ///< DCI
@@ -288,9 +291,9 @@
   /// Type enum
   enum Type_e
   {
-    BCCH, PCCH
-  } m_type; ///< the type
-  uint8_t m_index; ///< index
+    BCCH, PCCH, NotValid
+  } m_type {NotValid}; ///< the type
+  uint8_t m_index {UINT8_MAX}; ///< index
   struct DlDciListElement_s m_dci; ///< DCI
 };
 
@@ -299,14 +302,14 @@
  */
 struct UlInfoListElement_s
 {
-  uint16_t  m_rnti; ///< RNTI
+  uint16_t  m_rnti {UINT16_MAX}; ///< RNTI
   std::vector <uint16_t> m_ulReception; ///< UL reception
   /// Reception status enum
   enum ReceptionStatus_e 
   {
     Ok, NotOk, NotValid
-  } m_receptionStatus; ///< the status
-  uint8_t   m_tpc; ///< Tx power control command
+  } m_receptionStatus {NotValid}; ///< the status
+  uint8_t   m_tpc {UINT8_MAX}; ///< Tx power control command
 };
 
 /**
@@ -314,7 +317,7 @@
  */
 struct SrListElement_s
 {
-  uint16_t  m_rnti; ///< RNTI
+  uint16_t  m_rnti {UINT16_MAX}; ///< RNTI
 };
 
 /**
@@ -322,8 +325,8 @@
  */
 struct MacCeValue_u
 {
-  uint8_t   m_phr; ///< phr
-  uint8_t   m_crnti; ///< NRTI
+  uint8_t   m_phr {UINT8_MAX}; ///< phr
+  uint8_t   m_crnti {UINT8_MAX}; ///< NRTI
   std::vector <uint8_t> m_bufferStatus; ///< buffer status
 };
 
@@ -332,12 +335,12 @@
  */
 struct MacCeListElement_s
 {
-  uint16_t  m_rnti; ///< RNTI
+  uint16_t  m_rnti {UINT16_MAX}; ///< RNTI
   /// MAC CE type enum
   enum MacCeType_e
   {
-    BSR, PHR, CRNTI
-  } m_macCeType; ///< MAC CE type
+    BSR, PHR, CRNTI, NotValid
+  } m_macCeType {NotValid}; ///< MAC CE type
   struct MacCeValue_u m_macCeValue; ///< MAC CE value
 };
 
@@ -346,13 +349,13 @@
  */
 struct DrxConfig_s
 {
-  uint8_t   m_onDurationTimer; ///< on duration timer
-  uint16_t  m_drxInactivityTimer; ///< inactivity timer
-  uint16_t  m_drxRetransmissionTimer; ///< retransmission timer
-  uint16_t  m_longDrxCycle; ///< long DRX cycle 
-  uint16_t  m_longDrxCycleStartOffset; ///< long DRX cycle start offset
-  uint16_t  m_shortDrxCycle; ///< short DRX cycle
-  uint8_t   m_drxShortCycleTimer; ///< short DRX cycle timer
+  uint8_t   m_onDurationTimer {UINT8_MAX}; ///< on duration timer
+  uint16_t  m_drxInactivityTimer {UINT16_MAX}; ///< inactivity timer
+  uint16_t  m_drxRetransmissionTimer {UINT16_MAX}; ///< retransmission timer
+  uint16_t  m_longDrxCycle {UINT16_MAX}; ///< long DRX cycle
+  uint16_t  m_longDrxCycleStartOffset {UINT16_MAX}; ///< long DRX cycle start offset
+  uint16_t  m_shortDrxCycle {UINT16_MAX}; ///< short DRX cycle
+  uint8_t   m_drxShortCycleTimer {UINT8_MAX}; ///< short DRX cycle timer
 };
 
 /**
@@ -360,12 +363,12 @@
  */
 struct SpsConfig_s
 {
-  uint16_t  m_semiPersistSchedIntervalUl; ///< UL semi persist schedule interval
-  uint16_t  m_semiPersistSchedIntervalDl; ///< DL semi persist schedule interval
-  uint8_t   m_numberOfConfSpsProcesses; ///< number of conf SPS process
-  uint8_t   m_n1PucchAnPersistentListSize; ///< N1pu CCH  persistent list size
+  uint16_t  m_semiPersistSchedIntervalUl {UINT16_MAX}; ///< UL semi persist schedule interval
+  uint16_t  m_semiPersistSchedIntervalDl {UINT16_MAX}; ///< DL semi persist schedule interval
+  uint8_t   m_numberOfConfSpsProcesses {UINT8_MAX}; ///< number of conf SPS process
+  uint8_t   m_n1PucchAnPersistentListSize {UINT8_MAX}; ///< N1pu CCH  persistent list size
   std::vector <uint16_t> m_n1PucchAnPersistentList; ///< N1pu CCH persistent list
-  uint8_t   m_implicitReleaseAfter; ///< implicit release after
+  uint8_t   m_implicitReleaseAfter {UINT8_MAX}; ///< implicit release after
 };
 
 /**
@@ -373,9 +376,9 @@
  */
 struct SrConfig_s
 {
-  enum SetupRelease_e m_action; ///< action
-  uint8_t   m_schedInterval; ///< sched interval
-  uint8_t   m_dsrTransMax; ///< trans max
+  enum SetupRelease_e m_action {setup}; ///< action
+  uint8_t   m_schedInterval {UINT8_MAX}; ///< sched interval
+  uint8_t   m_dsrTransMax {UINT8_MAX}; ///< trans max
 };
 
 /**
@@ -383,9 +386,9 @@
  */
 struct CqiConfig_s
 {
-  enum SetupRelease_e m_action; ///< action
-  uint16_t  m_cqiSchedInterval; ///< CQI schedule interval
-  uint8_t   m_riSchedInterval; ///< RI schedule interval
+  enum SetupRelease_e m_action {setup}; ///< action
+  uint16_t  m_cqiSchedInterval {UINT16_MAX}; ///< CQI schedule interval
+  uint8_t   m_riSchedInterval {UINT8_MAX}; ///< RI schedule interval
 };
 
 /**
@@ -393,11 +396,11 @@
  */
 struct UeCapabilities_s
 {
-  bool      m_halfDuplex; ///< half duplex
-  bool      m_intraSfHopping; ///< intra SF hopping
-  bool      m_type2Sb1; ///< type 2Sb1
-  uint8_t   m_ueCategory; ///< UE category
-  bool      m_resAllocType1; ///< alloc type 1
+  bool      m_halfDuplex {false}; ///< half duplex
+  bool      m_intraSfHopping {false}; ///< intra SF hopping
+  bool      m_type2Sb1 {false}; ///< type 2Sb1
+  uint8_t   m_ueCategory {UINT8_MAX}; ///< UE category
+  bool      m_resAllocType1 {false}; ///< alloc type 1
 };
 
 /**
@@ -405,8 +408,8 @@
  */
 struct SiMessageListElement_s
 {
-  uint16_t  m_periodicity; ///< periodicity
-  uint16_t  m_length; ///< length
+  uint16_t  m_periodicity {UINT16_MAX}; ///< periodicity
+  uint16_t  m_length {UINT16_MAX}; ///< length
 };
 
 /**
@@ -414,9 +417,9 @@
  */
 struct SiConfiguration_s
 {
-  uint16_t  m_sfn; ///< sfn
-  uint16_t  m_sib1Length; ///< sib1 length
-  uint8_t   m_siWindowLength; ///< window length
+  uint16_t  m_sfn {UINT16_MAX}; ///< sfn
+  uint16_t  m_sib1Length {UINT16_MAX}; ///< sib1 length
+  uint8_t   m_siWindowLength {UINT8_MAX}; ///< window length
   std::vector <struct SiMessageListElement_s> m_siMessageList; ///< message list
 };
 
@@ -425,8 +428,8 @@
  */
 struct DlInfoListElement_s
 {
-  uint16_t  m_rnti; ///< RNTI
-  uint8_t   m_harqProcessId; ///< HARQ process ID
+  uint16_t  m_rnti {UINT16_MAX}; ///< RNTI
+  uint8_t   m_harqProcessId {UINT8_MAX}; ///< HARQ process ID
   /// HARQ status enum
   enum HarqStatus_e
   {
@@ -440,9 +443,9 @@
  */
 struct BwPart_s
 {
-  uint8_t   m_bwPartIndex; ///< bw part index
-  uint8_t   m_sb; ///< sb
-  uint8_t   m_cqi; ///< CQI
+  uint8_t   m_bwPartIndex {UINT8_MAX}; ///< bw part index
+  uint8_t   m_sb {UINT8_MAX}; ///< sb
+  uint8_t   m_cqi {UINT8_MAX}; ///< CQI
 };
 
 /**
@@ -450,7 +453,7 @@
  */
 struct HigherLayerSelected_s
 {
-  uint8_t   m_sbPmi; ///< sb PMI
+  uint8_t   m_sbPmi {UINT8_MAX}; ///< sb PMI
   std::vector <uint8_t> m_sbCqi; ///< sb CQI
 };
 
@@ -460,7 +463,7 @@
 struct UeSelected_s
 {
   std::vector <uint8_t> m_sbList; ///< sb list
-  uint8_t   m_sbPmi; ///< sb PMI
+  uint8_t   m_sbPmi {UINT8_MAX}; ///< sb PMI
   std::vector <uint8_t> m_sbCqi; ///< sb CQI
 };
 
@@ -479,15 +482,15 @@
  */
 struct CqiListElement_s
 {
-  uint16_t  m_rnti; ///< RNTI
-  uint8_t   m_ri; ///< RI
+  uint16_t  m_rnti {UINT16_MAX}; ///< RNTI
+  uint8_t   m_ri {UINT8_MAX}; ///< RI
   /// CqiType_e enumeration
   enum CqiType_e
   {
-    P10, P11, P20, P21, A12, A22, A20, A30, A31
-  } m_cqiType; ///< CQI type
+    P10, P11, P20, P21, A12, A22, A20, A30, A31, NotValid
+  } m_cqiType {NotValid}; ///< CQI type
   std::vector <uint8_t> m_wbCqi; ///< wb CQI
-  uint8_t   m_wbPmi; ///< wb PMI
+  uint8_t   m_wbPmi {UINT8_MAX}; ///< wb PMI
 
   struct SbMeasResult_s m_sbMeasResult; ///< sb measure result
 };
@@ -505,8 +508,9 @@
     PUSCH,
     PUCCH_1,
     PUCCH_2,
-    PRACH
-  } m_type; ///< type
+    PRACH,
+    NotValid
+  } m_type {NotValid}; ///< type
 };
 
 /**
@@ -514,9 +518,9 @@
  */
 struct PagingInfoListElement_s
 {
-  uint8_t   m_pagingIndex; ///< paging index
-  uint16_t  m_pagingMessageSize; ///< paging message size
-  uint8_t   m_pagingSubframe; ///< paging subframe
+  uint8_t   m_pagingIndex {UINT8_MAX}; ///< paging index
+  uint16_t  m_pagingMessageSize {UINT16_MAX}; ///< paging message size
+  uint8_t   m_pagingSubframe {UINT8_MAX}; ///< paging subframe
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-asn1-header.cc ns-3.34/src/lte/model/lte-asn1-header.cc
--- ns-3.33/src/lte/model/lte-asn1-header.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-asn1-header.cc	2021-07-14 10:31:07.000000000 -0700
@@ -321,7 +321,14 @@
 
 void Asn1Header::SerializeInteger (int n, int nmin, int nmax) const
 {
-  NS_ASSERT_MSG (nmin <= n && n <= nmax,
+  // The following is equivalent to:
+  //  NS_ASSERT_MSG (nmin <= n && n <= nmax,
+  //               "Integer " << n << " is outside range [" << nmin << ", " << nmax << "]");
+  // This is a workaround to gcc-7 aggressive optimization, see #346, and can be dropped
+  // once gcc-7 will not be anymore supported.
+  long int nComp = nmin;
+  nComp -= n;
+  NS_ASSERT_MSG (nComp <= 0 && n <= nmax,
                  "Integer " << n << " is outside range [" << nmin << ", " << nmax << "]");
 
   // Clause 11.5.3 ITU-T X.691
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-enb-mac.cc ns-3.34/src/lte/model/lte-enb-mac.cc
--- ns-3.33/src/lte/model/lte-enb-mac.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-enb-mac.cc	2021-07-14 10:31:07.000000000 -0700
@@ -996,7 +996,7 @@
        */
       if ((it != m_allocatedNcRaPreambleMap.end ()) && (it->second.expiryTime < Simulator::Now ()))
         {
-          if (!m_cmacSapUser->IsRandomAccessCompleted (rnti))
+          if (!m_cmacSapUser->IsRandomAccessCompleted (it->second.rnti))
             {
               //random access of the UE is not completed,
               //check other preambles
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-enb-rrc.cc ns-3.34/src/lte/model/lte-enb-rrc.cc
--- ns-3.33/src/lte/model/lte-enb-rrc.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-enb-rrc.cc	2021-07-14 10:31:07.000000000 -0700
@@ -2443,9 +2443,14 @@
 LteEnbRrc::DoRecvIdealUeContextRemoveRequest (uint16_t rnti)
 {
   NS_LOG_FUNCTION (this << rnti);
-  GetUeManager (rnti)->RecvIdealUeContextRemoveRequest (rnti);
-  //delete the UE context at the eNB
-  RemoveUe (rnti);
+  // TODO: remove after merge of ho_failure branch
+  // check if the RNTI to be removed is not stale
+  if (HasUeManager (rnti))
+    {
+      GetUeManager (rnti)->RecvIdealUeContextRemoveRequest (rnti);
+      // delete the UE context at the eNB
+      RemoveUe (rnti);
+    }
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-pdcp.cc ns-3.34/src/lte/model/lte-pdcp.cc
--- ns-3.33/src/lte/model/lte-pdcp.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-pdcp.cc	2021-07-14 10:31:07.000000000 -0700
@@ -174,9 +174,10 @@
 ////////////////////////////////////////
 
 void
-LtePdcp::DoTransmitPdcpSdu (Ptr<Packet> p)
+LtePdcp::DoTransmitPdcpSdu (LtePdcpSapProvider::TransmitPdcpSduParameters params)
 {
-  NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << p->GetSize ());
+  NS_LOG_FUNCTION (this << m_rnti << static_cast <uint16_t> (m_lcid) << params.pdcpSdu->GetSize ());
+  Ptr<Packet> p = params.pdcpSdu;
 
   // Sender timestamp
   PdcpTag pdcpTag (Simulator::Now ());
@@ -198,12 +199,12 @@
 
   m_txPdu (m_rnti, m_lcid, p->GetSize ());
 
-  LteRlcSapProvider::TransmitPdcpPduParameters params;
-  params.rnti = m_rnti;
-  params.lcid = m_lcid;
-  params.pdcpPdu = p;
+  LteRlcSapProvider::TransmitPdcpPduParameters txParams;
+  txParams.rnti = m_rnti;
+  txParams.lcid = m_lcid;
+  txParams.pdcpPdu = p;
 
-  m_rlcSapProvider->TransmitPdcpPdu (params);
+  m_rlcSapProvider->TransmitPdcpPdu (txParams);
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-pdcp.h ns-3.34/src/lte/model/lte-pdcp.h
--- ns-3.33/src/lte/model/lte-pdcp.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-pdcp.h	2021-07-14 10:31:07.000000000 -0700
@@ -145,9 +145,9 @@
   /**
    * Interface provided to upper RRC entity
    *
-   * \param p packet
+   * \param params the TransmitPdcpSduParameters
    */
-  virtual void DoTransmitPdcpSdu (Ptr<Packet> p);
+  virtual void DoTransmitPdcpSdu (LtePdcpSapProvider::TransmitPdcpSduParameters params);
 
   LtePdcpSapUser* m_pdcpSapUser; ///< PDCP SAP user
   LtePdcpSapProvider* m_pdcpSapProvider; ///< PDCP SAP provider
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-pdcp-sap.h ns-3.34/src/lte/model/lte-pdcp-sap.h
--- ns-3.33/src/lte/model/lte-pdcp-sap.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-pdcp-sap.h	2021-07-14 10:31:07.000000000 -0700
@@ -48,9 +48,10 @@
   };
 
   /**
-   * Send a RRC PDU to the RDCP for transmission
-   * This method is to be called
-   * when upper RRC entity has a RRC PDU ready to send   
+   * Send RRC PDU parameters to the PDCP for transmission
+   *
+   * This method is to be called when upper RRC entity has a
+   * RRC PDU ready to send
    * 
    * \param params 
    */
@@ -123,7 +124,7 @@
 template <class C>
 void LtePdcpSpecificLtePdcpSapProvider<C>::TransmitPdcpSdu (TransmitPdcpSduParameters params)
 {
-  m_pdcp->DoTransmitPdcpSdu (params.pdcpSdu);
+  m_pdcp->DoTransmitPdcpSdu (params);
 }
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-rlc-am.cc ns-3.34/src/lte/model/lte-rlc-am.cc
--- ns-3.33/src/lte/model/lte-rlc-am.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-rlc-am.cc	2021-07-14 10:31:07.000000000 -0700
@@ -119,7 +119,11 @@
                    BooleanValue (false),
                    MakeBooleanAccessor (&LteRlcAm::m_txOpportunityForRetxAlwaysBigEnough),
                    MakeBooleanChecker ())
-
+    .AddAttribute ("MaxTxBufferSize",
+                   "Maximum Size of the Transmission Buffer (in Bytes).  If zero is configured, the buffer is unlimited.",
+                   UintegerValue (10 * 1024),
+                   MakeUintegerAccessor (&LteRlcAm::m_maxTxBufferSize),
+                   MakeUintegerChecker<uint32_t> ())
     ;
   return tid;
 }
@@ -133,6 +137,7 @@
   m_statusProhibitTimer.Cancel ();
   m_rbsTimer.Cancel ();
 
+  m_maxTxBufferSize = 0;
   m_txonBuffer.clear ();
   m_txonBufferSize = 0;
   m_txedBuffer.clear ();
@@ -157,17 +162,28 @@
 {
   NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << p->GetSize ());
 
-  /** Store PDCP PDU */
-
-  LteRlcSduStatusTag tag;
-  tag.SetStatus (LteRlcSduStatusTag::FULL_SDU);
-  p->AddPacketTag (tag);
-
-  NS_LOG_LOGIC ("Txon Buffer: New packet added");
-  m_txonBuffer.push_back (TxPdu (p, Simulator::Now ()));
-  m_txonBufferSize += p->GetSize ();
-  NS_LOG_LOGIC ("NumOfBuffers = " << m_txonBuffer.size() );
-  NS_LOG_LOGIC ("txonBufferSize = " << m_txonBufferSize);
+  if (m_txonBufferSize + p->GetSize () <= m_maxTxBufferSize || (m_maxTxBufferSize == 0))
+    {
+      /** Store PDCP PDU */
+      LteRlcSduStatusTag tag;
+      tag.SetStatus (LteRlcSduStatusTag::FULL_SDU);
+      p->AddPacketTag (tag);
+
+      NS_LOG_LOGIC ("Txon Buffer: New packet added");
+      m_txonBuffer.push_back (TxPdu (p, Simulator::Now ()));
+      m_txonBufferSize += p->GetSize ();
+      NS_LOG_LOGIC ("NumOfBuffers = " << m_txonBuffer.size() );
+      NS_LOG_LOGIC ("txonBufferSize = " << m_txonBufferSize);
+    }
+  else
+    {
+      // Discard full RLC SDU
+      NS_LOG_LOGIC ("TxonBuffer is full. RLC SDU discarded");
+      NS_LOG_LOGIC ("MaxTxBufferSize = " << m_maxTxBufferSize);
+      NS_LOG_LOGIC ("txonBufferSize    = " << m_txonBufferSize);
+      NS_LOG_LOGIC ("packet size     = " << p->GetSize ());
+      m_txDropTrace (p);
+    }
 
   /** Report Buffer Status */
   DoReportBufferStatus ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-rlc-am.h ns-3.34/src/lte/model/lte-rlc-am.h
--- ns-3.33/src/lte/model/lte-rlc-am.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-rlc-am.h	2021-07-14 10:31:07.000000000 -0700
@@ -143,6 +143,7 @@
                                        ///< for retransmission 
   std::vector <RetxPdu> m_retxBuffer;  ///< Buffer for PDUs considered for retransmission
 
+    uint32_t m_maxTxBufferSize; ///< maximum transmission buffer size
     uint32_t m_txonBufferSize; ///< transmit on buffer size
     uint32_t m_retxBufferSize; ///< retransmit buffer size
     uint32_t m_txedBufferSize; ///< transmit ed buffer size
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-rlc.cc ns-3.34/src/lte/model/lte-rlc.cc
--- ns-3.33/src/lte/model/lte-rlc.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-rlc.cc	2021-07-14 10:31:07.000000000 -0700
@@ -112,6 +112,11 @@
                      "PDU received.",
                      MakeTraceSourceAccessor (&LteRlc::m_rxPdu),
                      "ns3::LteRlc::ReceiveTracedCallback")
+    .AddTraceSource ("TxDrop",
+                     "Trace source indicating a packet "
+                     "has been dropped before transmission",
+                     MakeTraceSourceAccessor (&LteRlc::m_txDropTrace),
+                     "ns3::Packet::TracedCallback")
   ;
   return tid;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-rlc.h ns-3.34/src/lte/model/lte-rlc.h
--- ns-3.33/src/lte/model/lte-rlc.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-rlc.h	2021-07-14 10:31:07.000000000 -0700
@@ -176,6 +176,11 @@
    * Used to inform of a PDU reception from the MAC SAP user
    */
   TracedCallback<uint16_t, uint8_t, uint32_t, uint64_t> m_rxPdu;
+  /**
+   * The trace source fired when the RLC drops a packet before
+   * transmission.
+   */
+  TracedCallback<Ptr<const Packet> > m_txDropTrace;
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-rlc-um.cc ns-3.34/src/lte/model/lte-rlc-um.cc
--- ns-3.33/src/lte/model/lte-rlc-um.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-rlc-um.cc	2021-07-14 10:31:07.000000000 -0700
@@ -111,6 +111,7 @@
       NS_LOG_LOGIC ("MaxTxBufferSize = " << m_maxTxBufferSize);
       NS_LOG_LOGIC ("txBufferSize    = " << m_txBufferSize);
       NS_LOG_LOGIC ("packet size     = " << p->GetSize ());
+      m_txDropTrace (p);
     }
 
   /** Report Buffer Status */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-rrc-protocol-real.cc ns-3.34/src/lte/model/lte-rrc-protocol-real.cc
--- ns-3.33/src/lte/model/lte-rrc-protocol-real.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-rrc-protocol-real.cc	2021-07-14 10:31:07.000000000 -0700
@@ -448,9 +448,12 @@
 {
   std::map<uint16_t, LteUeRrcSapProvider*>::iterator it;
   it = m_enbRrcSapProviderMap.find (rnti);
-  NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (), "Cell id " << m_cellId
-                                         << " could not find RNTI = " << rnti);
-  it->second = p;
+  // TODO: remove after merge of ho_failure branch
+  // assign UE RRC only if the RNTI is found at eNB
+  if (it != m_enbRrcSapProviderMap.end ())
+    {
+      it->second = p;
+    }
 }
 
 void 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-spectrum-phy.cc ns-3.34/src/lte/model/lte-spectrum-phy.cc
--- ns-3.33/src/lte/model/lte-spectrum-phy.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-spectrum-phy.cc	2021-07-14 10:31:07.000000000 -0700
@@ -267,7 +267,7 @@
 
 
 Ptr<MobilityModel>
-LteSpectrumPhy::GetMobility ()
+LteSpectrumPhy::GetMobility () const
 {
   NS_LOG_FUNCTION (this);
   return m_mobility;
@@ -404,7 +404,7 @@
 
 
 Ptr<AntennaModel>
-LteSpectrumPhy::GetRxAntenna ()
+LteSpectrumPhy::GetRxAntenna () const
 {
   return m_antenna;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-spectrum-phy.h ns-3.34/src/lte/model/lte-spectrum-phy.h
--- ns-3.33/src/lte/model/lte-spectrum-phy.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-spectrum-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -177,10 +177,10 @@
   void SetChannel (Ptr<SpectrumChannel> c);
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
-  Ptr<MobilityModel> GetMobility ();
+  Ptr<MobilityModel> GetMobility () const;
   Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna ();
+  Ptr<AntennaModel> GetRxAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
   /**
    * \brief Start receive data function
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/lte-ue-rrc.cc ns-3.34/src/lte/model/lte-ue-rrc.cc
--- ns-3.33/src/lte/model/lte-ue-rrc.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/lte-ue-rrc.cc	2021-07-14 10:31:07.000000000 -0700
@@ -1359,7 +1359,7 @@
       uint16_t dlBand = scell.radioResourceConfigCommonSCell.nonUlConfiguration.dlBandwidth;
       uint32_t dlEarfcn = scell.cellIdentification.dlCarrierFreq;
       uint8_t txMode = scell.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.antennaInfo.transmissionMode;
-      uint8_t srsIndex = scell.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.soundingRsUlConfigDedicated.srsConfigIndex;
+      uint16_t srsIndex = scell.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCell.soundingRsUlConfigDedicated.srsConfigIndex;
 
       m_cphySapProvider.at (ccId)->SynchronizeWithEnb (physCellId, dlEarfcn);
       m_cphySapProvider.at (ccId)->SetDlBandwidth (dlBand);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/rem-spectrum-phy.cc ns-3.34/src/lte/model/rem-spectrum-phy.cc
--- ns-3.33/src/lte/model/rem-spectrum-phy.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/rem-spectrum-phy.cc	2021-07-14 10:31:07.000000000 -0700
@@ -97,7 +97,7 @@
 }
 
 Ptr<MobilityModel>
-RemSpectrumPhy::GetMobility ()
+RemSpectrumPhy::GetMobility () const
 {
   return m_mobility;
 }
@@ -115,7 +115,7 @@
 }
 
 Ptr<AntennaModel>
-RemSpectrumPhy::GetRxAntenna ()
+RemSpectrumPhy::GetRxAntenna () const
 {
   return 0;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/model/rem-spectrum-phy.h ns-3.34/src/lte/model/rem-spectrum-phy.h
--- ns-3.33/src/lte/model/rem-spectrum-phy.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/model/rem-spectrum-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -67,10 +67,10 @@
   void SetChannel (Ptr<SpectrumChannel> c);
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
-  Ptr<MobilityModel> GetMobility ();
+  Ptr<MobilityModel> GetMobility () const;
   Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna ();
+  Ptr<AntennaModel> GetRxAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
 
   /** 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/test/lte-simple-spectrum-phy.cc ns-3.34/src/lte/test/lte-simple-spectrum-phy.cc
--- ns-3.33/src/lte/test/lte-simple-spectrum-phy.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/test/lte-simple-spectrum-phy.cc	2021-07-14 10:31:07.000000000 -0700
@@ -81,7 +81,7 @@
 
 
 Ptr<MobilityModel>
-LteSimpleSpectrumPhy::GetMobility ()
+LteSimpleSpectrumPhy::GetMobility () const
 {
   NS_LOG_FUNCTION (this);
   return m_mobility;
@@ -119,7 +119,7 @@
 
 
 Ptr<AntennaModel>
-LteSimpleSpectrumPhy::GetRxAntenna ()
+LteSimpleSpectrumPhy::GetRxAntenna () const
 {
   return m_antenna;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/test/lte-simple-spectrum-phy.h ns-3.34/src/lte/test/lte-simple-spectrum-phy.h
--- ns-3.33/src/lte/test/lte-simple-spectrum-phy.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/test/lte-simple-spectrum-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -63,10 +63,10 @@
   void SetChannel (Ptr<SpectrumChannel> c);
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
-  Ptr<MobilityModel> GetMobility ();
+  Ptr<MobilityModel> GetMobility () const;
   Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna ();
+  Ptr<AntennaModel> GetRxAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/test/lte-test-rlc-am-e2e.cc ns-3.34/src/lte/test/lte-test-rlc-am-e2e.cc
--- ns-3.33/src/lte/test/lte-test-rlc-am-e2e.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/test/lte-test-rlc-am-e2e.cc	2021-07-14 10:31:07.000000000 -0700
@@ -149,6 +149,8 @@
   Config::SetDefault ("ns3::LteRlcAm::PollRetransmitTimer", TimeValue (MilliSeconds (20)));
   Config::SetDefault ("ns3::LteRlcAm::ReorderingTimer", TimeValue (MilliSeconds (10)));
   Config::SetDefault ("ns3::LteRlcAm::StatusProhibitTimer", TimeValue (MilliSeconds (40)));
+  // This test was written for an unlimited transmit buffer (special value of 0)
+  Config::SetDefault ("ns3::LteRlcAm::MaxTxBufferSize", UintegerValue (0));
 
   Ptr<LteSimpleHelper> lteSimpleHelper = CreateObject<LteSimpleHelper> ();
   // lteSimpleHelper->EnableLogComponents ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/lte/test/test-lte-antenna.cc ns-3.34/src/lte/test/test-lte-antenna.cc
--- ns-3.33/src/lte/test/test-lte-antenna.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/lte/test/test-lte-antenna.cc	2021-07-14 10:31:07.000000000 -0700
@@ -158,8 +158,12 @@
   lteHelper->SetSchedulerAttribute ("UlCqiFilter", EnumValue (FfMacScheduler::PUSCH_UL_CQI));
   lteHelper->SetEnbAntennaModelType ("ns3::CosineAntennaModel");
   lteHelper->SetEnbAntennaModelAttribute ("Orientation", DoubleValue (m_orientationDegrees));
-  lteHelper->SetEnbAntennaModelAttribute ("Beamwidth",   DoubleValue (m_beamwidthDegrees));
-  lteHelper->SetEnbAntennaModelAttribute ("MaxGain",     DoubleValue (0.0));
+  lteHelper->SetEnbAntennaModelAttribute ("HorizontalBeamwidth", DoubleValue (m_beamwidthDegrees));
+  lteHelper->SetEnbAntennaModelAttribute ("MaxGain", DoubleValue (0.0));
+
+  // set DL and UL bandwidth. 
+  lteHelper->SetEnbDeviceAttribute ("DlBandwidth", UintegerValue (25));
+  lteHelper->SetEnbDeviceAttribute ("UlBandwidth", UintegerValue (25));
 
   enbDevs = lteHelper->InstallEnbDevice (enbNodes);
   ueDevs = lteHelper->InstallUeDevice (ueNodes);
@@ -220,6 +224,7 @@
         }      
       // remember that propagation loss is 0dB
       double calculatedAntennaGainDbDl = - (enbTxPowerDbm - calculatedSinrDbDl - noisePowerDbm - ueNoiseFigureDb);      
+      NS_LOG_INFO ("expected " << m_antennaGainDb << " actual " << calculatedAntennaGainDbDl << " tol " << tolerance);
       NS_TEST_ASSERT_MSG_EQ_TOL (calculatedAntennaGainDbDl, m_antennaGainDb, tolerance, "Wrong DL antenna gain!");
     }
   double expectedSinrUl = ueTxPowerDbm + m_antennaGainDb - noisePowerDbm + enbNoiseFigureDb;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/bindings/callbacks_list.py ns-3.34/src/mesh/bindings/callbacks_list.py
--- ns-3.33/src/mesh/bindings/callbacks_list.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/bindings/callbacks_list.py	2021-07-14 10:31:07.000000000 -0700
@@ -6,17 +6,27 @@
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'bool', 'ns3::Ptr<ns3::Packet>', 'ns3::Mac48Address', 'ns3::Mac48Address', 'unsigned short', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'unsigned char', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'const ns3::WifiMacHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::Mac48Address', 'unsigned char', 'ns3::OriginatorBlockAckAgreement::State', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'const ns3::WifiMacHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['unsigned int', 'ns3::Mac48Address', 'ns3::Ptr<ns3::MeshWifiInterfaceMac>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['std::vector<ns3::Mac48Address, std::allocator<ns3::Mac48Address> >', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/bindings/modulegen__gcc_ILP32.py ns-3.34/src/mesh/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/mesh/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -20,26 +20,34 @@
 def register_types(module):
     root_module = module.get_root()
     
-    ## qos-txop.h (module 'wifi'): ns3::TypeOfStation [enumeration]
-    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA', 'OCB'], import_from_module='ns.wifi')
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
-    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::WifiTxTimerReason [enumeration]
+    module.add_enum('WifiTxTimerReason', [], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT'], import_from_module='ns.wifi')
     ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
     module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'], import_from_module='ns.wifi')
-    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [enumeration]
-    module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'EXTENDED_COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
-    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
+    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_TRIGGER', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduField [enumeration]
+    module.add_enum('WifiPpduField', ['WIFI_PPDU_FIELD_PREAMBLE', 'WIFI_PPDU_FIELD_NON_HT_HEADER', 'WIFI_PPDU_FIELD_HT_SIG', 'WIFI_PPDU_FIELD_TRAINING', 'WIFI_PPDU_FIELD_SIG_A', 'WIFI_PPDU_FIELD_SIG_B', 'WIFI_PPDU_FIELD_DATA'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
+    module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
     module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_holland', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
+    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
     module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
     ## ht-operation.h (module 'wifi'): ns3::HtProtectionType [enumeration]
@@ -60,7 +68,15 @@
     ## block-ack-manager.h (module 'wifi'): ns3::Bar [struct]
     module.add_class('Bar', import_from_module='ns.wifi')
     ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement [class]
-    module.add_class('BlockAckAgreement', import_from_module='ns.wifi')
+    module.add_class('BlockAckAgreement', allow_subclassing=True, import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType [struct]
+    module.add_class('BlockAckReqType', import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID'], outer_class=root_module['ns3::BlockAckReqType'], import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [struct]
+    module.add_class('BlockAckType', import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID', 'MULTI_STA'], outer_class=root_module['ns3::BlockAckType'], import_from_module='ns.wifi')
     ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow [class]
     module.add_class('BlockAckWindow', import_from_module='ns.wifi')
     ## buffer.h (module 'network'): ns3::Buffer [class]
@@ -115,16 +131,40 @@
     module.add_class('EventId', import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo [struct]
+    module.add_class('HeMuUserInfo', import_from_module='ns.wifi')
+    ## he-ru.h (module 'wifi'): ns3::HeRu [class]
+    module.add_class('HeRu', import_from_module='ns.wifi')
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType [enumeration]
+    module.add_enum('RuType', ['RU_26_TONE', 'RU_52_TONE', 'RU_106_TONE', 'RU_242_TONE', 'RU_484_TONE', 'RU_996_TONE', 'RU_2x996_TONE'], outer_class=root_module['ns3::HeRu'], import_from_module='ns.wifi')
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [class]
+    module.add_class('RuSpec', import_from_module='ns.wifi', outer_class=root_module['ns3::HeRu'])
+    typehandlers.add_type_alias('std::pair< short, short >', 'ns3::HeRu::SubcarrierRange')
+    typehandlers.add_type_alias('std::pair< short, short >*', 'ns3::HeRu::SubcarrierRange*')
+    typehandlers.add_type_alias('std::pair< short, short >&', 'ns3::HeRu::SubcarrierRange&')
+    typehandlers.add_type_alias('std::vector< std::pair< short, short > >', 'ns3::HeRu::SubcarrierGroup')
+    typehandlers.add_type_alias('std::vector< std::pair< short, short > >*', 'ns3::HeRu::SubcarrierGroup*')
+    typehandlers.add_type_alias('std::vector< std::pair< short, short > >&', 'ns3::HeRu::SubcarrierGroup&')
+    typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >', 'ns3::HeRu::BwTonesPair')
+    typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >*', 'ns3::HeRu::BwTonesPair*')
+    typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >&', 'ns3::HeRu::BwTonesPair&')
+    typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', 'ns3::HeRu::SubcarrierGroups')
+    typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >*', 'ns3::HeRu::SubcarrierGroups*')
+    typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >&', 'ns3::HeRu::SubcarrierGroups&')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -143,8 +183,6 @@
     module.add_class('Mac8Address', import_from_module='ns.network')
     ## mac8-address.h (module 'network'): ns3::Mac8Address [class]
     root_module['ns3::Mac8Address'].implicitly_converts_to(root_module['ns3::Address'])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters [class]
-    module.add_class('MacLowTransmissionParameters', import_from_module='ns.wifi')
     ## mesh-helper.h (module 'mesh'): ns3::MeshHelper [class]
     module.add_class('MeshHelper')
     ## mesh-helper.h (module 'mesh'): ns3::MeshHelper::ChannelPolicy [enumeration]
@@ -211,10 +249,40 @@
     typehandlers.add_type_alias('uint32_t', 'ns3::TypeId::hash_t')
     typehandlers.add_type_alias('uint32_t*', 'ns3::TypeId::hash_t*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::TypeId::hash_t&')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc [class]
+    module.add_class('WifiAc', import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash [struct]
+    module.add_class('WifiAddressHash', import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash [struct]
+    module.add_class('WifiAddressTidHash', import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode [class]
     module.add_class('WifiMode', import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
     module.add_class('WifiModeFactory', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::CodeRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::CodeRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::CodeRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
     module.add_class('WifiRemoteStation', import_from_module='ns.wifi')
     ## wifi-remote-station-info.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
@@ -225,6 +293,11 @@
     module.add_enum('', ['BRAND_NEW', 'DISASSOC', 'WAIT_ASSOC_TX_OK', 'GOT_ASSOC_TX_OK'], outer_class=root_module['ns3::WifiRemoteStationState'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
     module.add_class('WifiStandardInfo', import_from_module='ns.wifi')
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
+    module.add_class('WifiTxVector', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >', 'ns3::WifiTxVector::HeMuUserInfoMap')
+    typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >*', 'ns3::WifiTxVector::HeMuUserInfoMap*')
+    typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >&', 'ns3::WifiTxVector::HeMuUserInfoMap&')
     ## empty.h (module 'core'): ns3::empty [class]
     module.add_class('empty', import_from_module='ns.core')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t [class]
@@ -289,15 +362,11 @@
     module.add_class('Trailer', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
     ## txop.h (module 'wifi'): ns3::Txop [class]
     module.add_class('Txop', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxFailed&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxDropped')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxDropped*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxDropped&')
+    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus [enumeration]
+    module.add_enum('ChannelAccessStatus', ['NOT_REQUESTED', 'REQUESTED', 'GRANTED'], outer_class=root_module['ns3::Txop'], import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::DroppedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::DroppedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::DroppedMpdu&')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
@@ -325,6 +394,9 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::WifiInformationElement > > iterator&', 'ns3::WifiInformationElementVector::Iterator&')
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac [class]
     module.add_class('WifiMac', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiMac::ForwardUpCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiMac::ForwardUpCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiMac::ForwardUpCallback&')
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader [class]
     module.add_class('WifiMacHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy [enumeration]
@@ -336,6 +408,17 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiMacHeader const & )&', 'ns3::WifiMacHeader::TracedCallback&')
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem [class]
     module.add_class('WifiMacQueueItem', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >'])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair [struct]
+    module.add_class('QueueIteratorPair', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiMacQueueItem'])
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::WifiMacQueueItem::DeaggregatedMsdus')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::WifiMacQueueItem::DeaggregatedMsdus*')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::WifiMacQueueItem::DeaggregatedMsdus&')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI*')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI&')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'ns3::WifiMacQueueItem::ConstIterator')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator*', 'ns3::WifiMacQueueItem::ConstIterator*')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator&', 'ns3::WifiMacQueueItem::ConstIterator&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
     module.add_class('WifiRemoteStationManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::ProtectionMode [enumeration]
@@ -362,12 +445,12 @@
     module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager [class]
     module.add_class('BlockAckManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )', 'ns3::BlockAckManager::AgreementStateTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )*', 'ns3::BlockAckManager::AgreementStateTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )&', 'ns3::BlockAckManager::AgreementStateTracedCallback&')
@@ -381,8 +464,6 @@
     module.add_class('CallbackImplBase', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
     ## callback.h (module 'core'): ns3::CallbackValue [class]
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
-    ## cf-parameter-set.h (module 'wifi'): ns3::CfParameterSet [class]
-    module.add_class('CfParameterSet', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## channel.h (module 'network'): ns3::Channel [class]
     module.add_class('Channel', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## data-rate.h (module 'network'): ns3::DataRateChecker [class]
@@ -456,17 +537,6 @@
     module.add_class('MeshWifiInterfaceMacPlugin', parent=root_module['ns3::SimpleRefCount< ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin> >'])
     ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader [class]
     module.add_class('MgtBeaconHeader', import_from_module='ns.wifi', parent=root_module['ns3::MgtProbeResponseHeader'])
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator [class]
-    module.add_class('MsduAggregator', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::MsduAggregator::DeaggregatedMsdus')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::MsduAggregator::DeaggregatedMsdus*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::MsduAggregator::DeaggregatedMsdus&')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::MsduAggregator::DeaggregatedMsdusCI')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::MsduAggregator::DeaggregatedMsdusCI*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::MsduAggregator::DeaggregatedMsdusCI&')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'ns3::MsduAggregator::EdcaQueues')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >*', 'ns3::MsduAggregator::EdcaQueues*')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >&', 'ns3::MsduAggregator::EdcaQueues&')
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -518,9 +588,6 @@
     module.add_class('QosTxop', import_from_module='ns.wifi', parent=root_module['ns3::Txop'])
     ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
     module.add_class('RegularWifiMac', import_from_module='ns.wifi', parent=root_module['ns3::WifiMac'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RegularWifiMac::ForwardUpCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RegularWifiMac::ForwardUpCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RegularWifiMac::ForwardUpCallback&')
     ## ssid.h (module 'wifi'): ns3::Ssid [class]
     module.add_class('Ssid', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## ssid.h (module 'wifi'): ns3::SsidChecker [class]
@@ -555,8 +622,18 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, unsigned short, unsigned int, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'bool', 'ns3::Ptr<ns3::Packet>', 'ns3::Mac48Address', 'ns3::Mac48Address', 'unsigned short', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -567,6 +644,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -577,8 +656,16 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::dot11s::RouteChange, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::dot11s::RouteChange', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -591,23 +678,38 @@
     module.add_class('MeshPointDevice', parent=root_module['ns3::NetDevice'])
     ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::MeshWifiInterfaceMac [class]
     module.add_class('MeshWifiInterfaceMac', parent=root_module['ns3::RegularWifiMac'])
+    module.add_container('std::list< ns3::BlockAckReqType >', 'ns3::BlockAckReqType', container_type='list')
+    module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
+    module.add_container('std::vector< std::pair< short, short > >', 'std::pair< short, short >', container_type='vector')
+    module.add_container('std::vector< ns3::HeRu::RuSpec >', 'ns3::HeRu::RuSpec', container_type='vector')
+    module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
+    module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
+    module.add_container('std::map< unsigned short, ns3::HeMuUserInfo >', ('short unsigned int', 'ns3::HeMuUserInfo'), container_type='map')
+    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
+    module.add_container('std::list< ns3::WifiMacQueueItem::QueueIteratorPair >', 'ns3::WifiMacQueueItem::QueueIteratorPair', container_type='list')
     module.add_container('std::vector< ns3::WifiRemoteStation * >', 'ns3::WifiRemoteStation *', container_type='vector')
     module.add_container('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationState *', container_type='vector')
-    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('ns3::MsduAggregator::DeaggregatedMsdus', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('ns3::MsduAggregator::EdcaQueues', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('std::map< ns3::Mac48Address, bool >', ('ns3::Mac48Address', 'bool'), container_type='map')
-    module.add_container('std::list< ns3::Ptr< ns3::WifiMacQueueItem > >', 'ns3::Ptr< ns3::WifiMacQueueItem >', container_type='list')
+    module.add_container('std::set< unsigned char >', 'unsigned char', container_type='set')
+    module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
+    module.add_container('std::set< ns3::Mac48Address >', 'ns3::Mac48Address', container_type='set')
     module.add_container('std::vector< ns3::Ptr< ns3::NetDevice > >', 'ns3::Ptr< ns3::NetDevice >', container_type='vector')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
+    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
+    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
     typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
@@ -754,10 +856,6 @@
     module.add_class('HwmpProtocol', parent=root_module['ns3::MeshL2RoutingProtocol'])
     ## hwmp-protocol.h (module 'mesh'): ns3::dot11s::HwmpProtocol::FailedDestination [struct]
     module.add_class('FailedDestination', outer_class=root_module['ns3::dot11s::HwmpProtocol'])
-    typehandlers.add_type_alias('ns3::dot11s::HwmpProtocol::FailedDestination', 'ns3::dot11s::HwmpProtocol::FailedDestination')
-    typehandlers.add_type_alias('ns3::dot11s::HwmpProtocol::FailedDestination*', 'ns3::dot11s::HwmpProtocol::FailedDestination*')
-    typehandlers.add_type_alias('ns3::dot11s::HwmpProtocol::FailedDestination&', 'ns3::dot11s::HwmpProtocol::FailedDestination&')
-    module.add_typedef(root_module['ns3::dot11s::HwmpProtocol::FailedDestination'], 'FailedDestination')
     ## hwmp-rtable.h (module 'mesh'): ns3::dot11s::HwmpRtable [class]
     module.add_class('HwmpRtable', parent=root_module['ns3::Object'])
     ## hwmp-rtable.h (module 'mesh'): ns3::dot11s::HwmpRtable::LookupResult [struct]
@@ -778,10 +876,6 @@
     module.add_class('IeLinkMetricReport', parent=root_module['ns3::WifiInformationElement'])
     ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshId [class]
     module.add_class('IeMeshId', parent=root_module['ns3::WifiInformationElement'])
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdChecker [class]
-    module.add_class('IeMeshIdChecker', parent=root_module['ns3::AttributeChecker'])
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdValue [class]
-    module.add_class('IeMeshIdValue', parent=root_module['ns3::AttributeValue'])
     ## ie-dot11s-peer-management.h (module 'mesh'): ns3::dot11s::IePeerManagement [class]
     module.add_class('IePeerManagement', parent=root_module['ns3::WifiInformationElement'])
     ## ie-dot11s-peer-management.h (module 'mesh'): ns3::dot11s::IePeerManagement::Subtype [enumeration]
@@ -859,6 +953,8 @@
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
     register_Ns3Bar_methods(root_module, root_module['ns3::Bar'])
     register_Ns3BlockAckAgreement_methods(root_module, root_module['ns3::BlockAckAgreement'])
+    register_Ns3BlockAckReqType_methods(root_module, root_module['ns3::BlockAckReqType'])
+    register_Ns3BlockAckType_methods(root_module, root_module['ns3::BlockAckType'])
     register_Ns3BlockAckWindow_methods(root_module, root_module['ns3::BlockAckWindow'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
@@ -886,14 +982,18 @@
     register_Ns3DefaultDeleter__Ns3Dot11sIeBeaconTimingUnit_methods(root_module, root_module['ns3::DefaultDeleter< ns3::dot11s::IeBeaconTimingUnit >'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
+    register_Ns3HeMuUserInfo_methods(root_module, root_module['ns3::HeMuUserInfo'])
+    register_Ns3HeRu_methods(root_module, root_module['ns3::HeRu'])
+    register_Ns3HeRuRuSpec_methods(root_module, root_module['ns3::HeRu::RuSpec'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
-    register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
     register_Ns3MeshHelper_methods(root_module, root_module['ns3::MeshHelper'])
     register_Ns3MeshWifiBeacon_methods(root_module, root_module['ns3::MeshWifiBeacon'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -918,12 +1018,16 @@
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
+    register_Ns3WifiAc_methods(root_module, root_module['ns3::WifiAc'])
+    register_Ns3WifiAddressHash_methods(root_module, root_module['ns3::WifiAddressHash'])
+    register_Ns3WifiAddressTidHash_methods(root_module, root_module['ns3::WifiAddressTidHash'])
     register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
     register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
     register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
     register_Ns3WifiRemoteStationInfo_methods(root_module, root_module['ns3::WifiRemoteStationInfo'])
     register_Ns3WifiRemoteStationState_methods(root_module, root_module['ns3::WifiRemoteStationState'])
     register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
+    register_Ns3WifiTxVector_methods(root_module, root_module['ns3::WifiTxVector'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
@@ -962,6 +1066,7 @@
     register_Ns3WifiMac_methods(root_module, root_module['ns3::WifiMac'])
     register_Ns3WifiMacHeader_methods(root_module, root_module['ns3::WifiMacHeader'])
     register_Ns3WifiMacQueueItem_methods(root_module, root_module['ns3::WifiMacQueueItem'])
+    register_Ns3WifiMacQueueItemQueueIteratorPair_methods(root_module, root_module['ns3::WifiMacQueueItem::QueueIteratorPair'])
     register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
     register_Ns3AmsduSubframeHeader_methods(root_module, root_module['ns3::AmsduSubframeHeader'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
@@ -973,7 +1078,6 @@
     register_Ns3CallbackChecker_methods(root_module, root_module['ns3::CallbackChecker'])
     register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
     register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
-    register_Ns3CfParameterSet_methods(root_module, root_module['ns3::CfParameterSet'])
     register_Ns3Channel_methods(root_module, root_module['ns3::Channel'])
     register_Ns3DataRateChecker_methods(root_module, root_module['ns3::DataRateChecker'])
     register_Ns3DataRateValue_methods(root_module, root_module['ns3::DataRateValue'])
@@ -1009,7 +1113,6 @@
     register_Ns3MeshStack_methods(root_module, root_module['ns3::MeshStack'])
     register_Ns3MeshWifiInterfaceMacPlugin_methods(root_module, root_module['ns3::MeshWifiInterfaceMacPlugin'])
     register_Ns3MgtBeaconHeader_methods(root_module, root_module['ns3::MgtBeaconHeader'])
-    register_Ns3MsduAggregator_methods(root_module, root_module['ns3::MsduAggregator'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3Node_methods(root_module, root_module['ns3::Node'])
@@ -1035,18 +1138,28 @@
     register_Ns3BridgeChannel_methods(root_module, root_module['ns3::BridgeChannel'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Bool_Ns3Ptr__lt__ns3Packet__gt___Ns3Mac48Address_Ns3Mac48Address_Unsigned_short_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, bool, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, unsigned short, unsigned int, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Dot11sRouteChange_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::dot11s::RouteChange, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3Dot11sStack_methods(root_module, root_module['ns3::Dot11sStack'])
@@ -1069,8 +1182,6 @@
     register_Ns3Dot11sIeConfiguration_methods(root_module, root_module['ns3::dot11s::IeConfiguration'])
     register_Ns3Dot11sIeLinkMetricReport_methods(root_module, root_module['ns3::dot11s::IeLinkMetricReport'])
     register_Ns3Dot11sIeMeshId_methods(root_module, root_module['ns3::dot11s::IeMeshId'])
-    register_Ns3Dot11sIeMeshIdChecker_methods(root_module, root_module['ns3::dot11s::IeMeshIdChecker'])
-    register_Ns3Dot11sIeMeshIdValue_methods(root_module, root_module['ns3::dot11s::IeMeshIdValue'])
     register_Ns3Dot11sIePeerManagement_methods(root_module, root_module['ns3::dot11s::IePeerManagement'])
     register_Ns3Dot11sIePeeringProtocol_methods(root_module, root_module['ns3::dot11s::IePeeringProtocol'])
     register_Ns3Dot11sIePerr_methods(root_module, root_module['ns3::dot11s::IePerr'])
@@ -1224,11 +1335,26 @@
     cls.add_constructor([param('ns3::BlockAckAgreement const &', 'arg0')])
     ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::Mac48Address peer, uint8_t tid) [constructor]
     cls.add_constructor([param('ns3::Mac48Address', 'peer'), param('uint8_t', 'tid')])
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckAgreement::GetBlockAckReqType() const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckAgreement::GetBlockAckType() const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [], 
+                   is_const=True)
     ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetBufferSize() const [member function]
     cls.add_method('GetBufferSize', 
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): static std::size_t ns3::BlockAckAgreement::GetDistance(uint16_t seqNumber, uint16_t startingSeqNumber) [member function]
+    cls.add_method('GetDistance', 
+                   'std::size_t', 
+                   [param('uint16_t', 'seqNumber'), param('uint16_t', 'startingSeqNumber')], 
+                   is_static=True)
     ## block-ack-agreement.h (module 'wifi'): ns3::Mac48Address ns3::BlockAckAgreement::GetPeer() const [member function]
     cls.add_method('GetPeer', 
                    'ns3::Mac48Address', 
@@ -1238,7 +1364,7 @@
     cls.add_method('GetStartingSequence', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequenceControl() const [member function]
     cls.add_method('GetStartingSequenceControl', 
                    'uint16_t', 
@@ -1308,6 +1434,38 @@
                    [param('uint16_t', 'timeout')])
     return
 
+def register_Ns3BlockAckReqType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v, uint8_t nSeqControls) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v'), param('uint8_t', 'nSeqControls')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_nSeqControls [variable]
+    cls.add_instance_attribute('m_nSeqControls', 'uint8_t', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckReqType::Variant', is_const=False)
+    return
+
+def register_Ns3BlockAckType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
+    cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckType::Variant', is_const=False)
+    return
+
 def register_Ns3BlockAckWindow_methods(root_module, cls):
     ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow::BlockAckWindow(ns3::BlockAckWindow const & arg0) [constructor]
     cls.add_constructor([param('ns3::BlockAckWindow const &', 'arg0')])
@@ -1321,6 +1479,11 @@
     cls.add_method('At', 
                    'std::vector< bool > reference', 
                    [param('std::size_t', 'distance')])
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
+    cls.add_method('At', 
+                   'std::vector< bool > const_reference', 
+                   [param('std::size_t', 'distance')], 
+                   is_const=True)
     ## block-ack-window.h (module 'wifi'): uint16_t ns3::BlockAckWindow::GetWinEnd() const [member function]
     cls.add_method('GetWinEnd', 
                    'uint16_t', 
@@ -1795,6 +1958,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2072,6 +2243,117 @@
                    [])
     return
 
+def register_Ns3HeMuUserInfo_methods(root_module, cls):
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo(ns3::HeMuUserInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeMuUserInfo const &', 'arg0')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::mcs [variable]
+    cls.add_instance_attribute('mcs', 'ns3::WifiMode', is_const=False)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::nss [variable]
+    cls.add_instance_attribute('nss', 'uint8_t', is_const=False)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::ru [variable]
+    cls.add_instance_attribute('ru', 'ns3::HeRu::RuSpec', is_const=False)
+    return
+
+def register_Ns3HeRu_methods(root_module, cls):
+    ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu() [constructor]
+    cls.add_constructor([])
+    ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, ns3::HeRu::SubcarrierGroup const & toneRanges) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('ns3::HeRu::SubcarrierGroup const &', 'toneRanges')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuSpec ns3::HeRu::FindOverlappingRu(uint16_t bw, ns3::HeRu::RuSpec referenceRu, ns3::HeRu::RuType searchedRuType) [member function]
+    cls.add_method('FindOverlappingRu', 
+                   'ns3::HeRu::RuSpec', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'referenceRu'), param('ns3::HeRu::RuType', 'searchedRuType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static uint16_t ns3::HeRu::GetBandwidth(ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetBandwidth', 
+                   'uint16_t', 
+                   [param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetCentral26TonesRus', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations, std::size_t & nCentral26TonesRus) [member function]
+    cls.add_method('GetEqualSizedRusForStations', 
+                   'ns3::HeRu::RuType', 
+                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations'), param('std::size_t &', 'nCentral26TonesRus')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetNRus', 
+                   'std::size_t', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetRuType(uint16_t bandwidth) [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [param('uint16_t', 'bandwidth')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetRusOfType', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint16_t bw, ns3::HeRu::RuType ruType, std::size_t phyIndex) [member function]
+    cls.add_method('GetSubcarrierGroup', 
+                   'ns3::HeRu::SubcarrierGroup', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'phyIndex')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::m_heRuSubcarrierGroups [variable]
+    cls.add_static_attribute('m_heRuSubcarrierGroups', 'ns3::HeRu::SubcarrierGroups const', is_const=True)
+    return
+
+def register_Ns3HeRuRuSpec_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
+    cls.add_constructor([])
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuType ruType, std::size_t index, bool primary80MHz) [constructor]
+    cls.add_constructor([param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index'), param('bool', 'primary80MHz')])
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetIndex() const [member function]
+    cls.add_method('GetIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetPhyIndex() const [member function]
+    cls.add_method('GetPhyIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::GetPrimary80MHz() const [member function]
+    cls.add_method('GetPrimary80MHz', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType ns3::HeRu::RuSpec::GetRuType() const [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::IsPhyIndexSet() const [member function]
+    cls.add_method('IsPhyIndexSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): void ns3::HeRu::RuSpec::SetPhyIndex(uint16_t bw, uint8_t p20Index) [member function]
+    cls.add_method('SetPhyIndex', 
+                   'void', 
+                   [param('uint16_t', 'bw'), param('uint8_t', 'p20Index')])
+    return
+
 def register_Ns3Ipv4Address_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2195,6 +2477,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2408,6 +2702,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2483,6 +2782,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2503,6 +2814,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -2717,90 +3033,6 @@
                    is_static=True)
     return
 
-def register_Ns3MacLowTransmissionParameters_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters(ns3::MacLowTransmissionParameters const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacLowTransmissionParameters const &', 'arg0')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters() [constructor]
-    cls.add_constructor([])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableAck() [member function]
-    cls.add_method('DisableAck', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableBlockAckRequest() [member function]
-    cls.add_method('DisableBlockAckRequest', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableNextData() [member function]
-    cls.add_method('DisableNextData', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableRts() [member function]
-    cls.add_method('DisableRts', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableAck() [member function]
-    cls.add_method('EnableAck', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBlockAck(ns3::BlockAckType type) [member function]
-    cls.add_method('EnableBlockAck', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBlockAckRequest(ns3::BlockAckType type) [member function]
-    cls.add_method('EnableBlockAckRequest', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableNextData(uint32_t size) [member function]
-    cls.add_method('EnableNextData', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableRts() [member function]
-    cls.add_method('EnableRts', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::BlockAckType ns3::MacLowTransmissionParameters::GetBlockAckRequestType() const [member function]
-    cls.add_method('GetBlockAckRequestType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::BlockAckType ns3::MacLowTransmissionParameters::GetBlockAckType() const [member function]
-    cls.add_method('GetBlockAckType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): uint32_t ns3::MacLowTransmissionParameters::GetNextPacketSize() const [member function]
-    cls.add_method('GetNextPacketSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::HasNextPacket() const [member function]
-    cls.add_method('HasNextPacket', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendBlockAckRequest() const [member function]
-    cls.add_method('MustSendBlockAckRequest', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendRts() const [member function]
-    cls.add_method('MustSendRts', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitBlockAck() const [member function]
-    cls.add_method('MustWaitBlockAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitNormalAck() const [member function]
-    cls.add_method('MustWaitNormalAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    return
-
 def register_Ns3MeshHelper_methods(root_module, cls):
     ## mesh-helper.h (module 'mesh'): ns3::MeshHelper::MeshHelper(ns3::MeshHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::MeshHelper const &', 'arg0')])
@@ -2828,10 +3060,6 @@
     cls.add_method('ResetStats', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice > const &', 'device')])
-    ## mesh-helper.h (module 'mesh'): void ns3::MeshHelper::SetAckPolicySelectorForAc(ns3::AcIndex ac, std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetAckPolicySelectorForAc', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac'), param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
     ## mesh-helper.h (module 'mesh'): void ns3::MeshHelper::SetMacType(std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetMacType', 
                    'void', 
@@ -3013,7 +3241,7 @@
     cls.add_method('GetStartingSequence', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::InitTxWindow() [member function]
     cls.add_method('InitTxWindow', 
                    'void', 
@@ -3876,8 +4104,55 @@
     cls.add_instance_attribute('supportMsg', 'std::string', is_const=False)
     return
 
+def register_Ns3WifiAc_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(ns3::WifiAc const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAc const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(uint8_t lowTid, uint8_t highTid) [constructor]
+    cls.add_constructor([param('uint8_t', 'lowTid'), param('uint8_t', 'highTid')])
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetHighTid() const [member function]
+    cls.add_method('GetHighTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetLowTid() const [member function]
+    cls.add_method('GetLowTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetOtherTid(uint8_t tid) const [member function]
+    cls.add_method('GetOtherTid', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    return
+
+def register_Ns3WifiAddressHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash(ns3::WifiAddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressHash::operator()(ns3::Mac48Address const & address) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3WifiAddressTidHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash(ns3::WifiAddressTidHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressTidHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressTidHash::operator()(ns3::WifiAddressTidPair const & addressTidPair) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::WifiAddressTidPair const &', 'addressTidPair')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3WifiMode_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
     cls.add_output_stream_operator()
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [constructor]
@@ -3901,10 +4176,10 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector txVector, uint16_t staId=65535) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetDataRate', 
@@ -3931,10 +4206,15 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector txVector) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('uint16_t', 'channelWidth')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -3971,15 +4251,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
     return
 
@@ -3988,6 +4268,8 @@
     cls.add_constructor([])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation(ns3::WifiRemoteStation const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRemoteStation const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_rssiAndUpdateTimePair [variable]
+    cls.add_instance_attribute('m_rssiAndUpdateTimePair', 'std::pair< double, ns3::Time >', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_state [variable]
     cls.add_instance_attribute('m_state', 'ns3::WifiRemoteStationState *', is_const=False)
     return
@@ -4023,6 +4305,10 @@
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
     cls.add_instance_attribute('m_channelWidth', 'uint16_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_dsssSupported [variable]
+    cls.add_instance_attribute('m_dsssSupported', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_erpOfdmSupported [variable]
+    cls.add_instance_attribute('m_erpOfdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_guardInterval [variable]
     cls.add_instance_attribute('m_guardInterval', 'uint16_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_heCapabilities [variable]
@@ -4033,6 +4319,8 @@
     cls.add_instance_attribute('m_info', 'ns3::WifiRemoteStationInfo', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint8_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ofdmSupported [variable]
+    cls.add_instance_attribute('m_ofdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
     cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
@@ -4060,6 +4348,208 @@
     cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
     return
 
+def register_Ns3WifiTxVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0, uint16_t length=0) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0'), param('uint16_t', 'length', default_value='0')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & txVector) [constructor]
+    cls.add_constructor([param('ns3::WifiTxVector const &', 'txVector')])
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetBssColor() const [member function]
+    cls.add_method('GetBssColor', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo ns3::WifiTxVector::GetHeMuUserInfo(uint16_t staId) const [member function]
+    cls.add_method('GetHeMuUserInfo', 
+                   'ns3::HeMuUserInfo', 
+                   [param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap const & ns3::WifiTxVector::GetHeMuUserInfoMap() const [member function]
+    cls.add_method('GetHeMuUserInfoMap', 
+                   'ns3::WifiTxVector::HeMuUserInfoMap const &', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap & ns3::WifiTxVector::GetHeMuUserInfoMap() [member function]
+    cls.add_method('GetHeMuUserInfoMap', 
+                   'ns3::WifiTxVector::HeMuUserInfoMap &', 
+                   [])
+    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode(uint16_t staId=65535) const [member function]
+    cls.add_method('GetMode', 
+                   'ns3::WifiMode', 
+                   [param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::GetModeInitialized() const [member function]
+    cls.add_method('GetModeInitialized', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiTxVector::GetModulationClass() const [member function]
+    cls.add_method('GetModulationClass', 
+                   'ns3::WifiModulationClass', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNTx() const [member function]
+    cls.add_method('GetNTx', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNess() const [member function]
+    cls.add_method('GetNess', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNss(uint16_t staId=65535) const [member function]
+    cls.add_method('GetNss', 
+                   'uint8_t', 
+                   [param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNssMax() const [member function]
+    cls.add_method('GetNssMax', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): std::pair<unsigned long long, unsigned long long> ns3::WifiTxVector::GetNumRusPerHeSigBContentChannel() const [member function]
+    cls.add_method('GetNumRusPerHeSigBContentChannel', 
+                   'std::pair< unsigned long long, unsigned long long >', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiPreamble ns3::WifiTxVector::GetPreambleType() const [member function]
+    cls.add_method('GetPreambleType', 
+                   'ns3::WifiPreamble', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeRu::RuSpec ns3::WifiTxVector::GetRu(uint16_t staId) const [member function]
+    cls.add_method('GetRu', 
+                   'ns3::HeRu::RuSpec', 
+                   [param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetTxPowerLevel() const [member function]
+    cls.add_method('GetTxPowerLevel', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsAggregation() const [member function]
+    cls.add_method('IsAggregation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsDlMu() const [member function]
+    cls.add_method('IsDlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsLdpc() const [member function]
+    cls.add_method('IsLdpc', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsMu() const [member function]
+    cls.add_method('IsMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsStbc() const [member function]
+    cls.add_method('IsStbc', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsUlMu() const [member function]
+    cls.add_method('IsUlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsValid() const [member function]
+    cls.add_method('IsValid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetAggregation(bool aggregation) [member function]
+    cls.add_method('SetAggregation', 
+                   'void', 
+                   [param('bool', 'aggregation')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetBssColor(uint8_t color) [member function]
+    cls.add_method('SetBssColor', 
+                   'void', 
+                   [param('uint8_t', 'color')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetChannelWidth(uint16_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetGuardInterval(uint16_t guardInterval) [member function]
+    cls.add_method('SetGuardInterval', 
+                   'void', 
+                   [param('uint16_t', 'guardInterval')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetHeMuUserInfo(uint16_t staId, ns3::HeMuUserInfo userInfo) [member function]
+    cls.add_method('SetHeMuUserInfo', 
+                   'void', 
+                   [param('uint16_t', 'staId'), param('ns3::HeMuUserInfo', 'userInfo')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLdpc(bool ldpc) [member function]
+    cls.add_method('SetLdpc', 
+                   'void', 
+                   [param('bool', 'ldpc')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
+    cls.add_method('SetMode', 
+                   'void', 
+                   [param('ns3::WifiMode', 'mode')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode, uint16_t staId) [member function]
+    cls.add_method('SetMode', 
+                   'void', 
+                   [param('ns3::WifiMode', 'mode'), param('uint16_t', 'staId')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNTx(uint8_t nTx) [member function]
+    cls.add_method('SetNTx', 
+                   'void', 
+                   [param('uint8_t', 'nTx')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNess(uint8_t ness) [member function]
+    cls.add_method('SetNess', 
+                   'void', 
+                   [param('uint8_t', 'ness')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNss(uint8_t nss) [member function]
+    cls.add_method('SetNss', 
+                   'void', 
+                   [param('uint8_t', 'nss')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNss(uint8_t nss, uint16_t staId) [member function]
+    cls.add_method('SetNss', 
+                   'void', 
+                   [param('uint8_t', 'nss'), param('uint16_t', 'staId')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetPreambleType(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('SetPreambleType', 
+                   'void', 
+                   [param('ns3::WifiPreamble', 'preamble')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetRu(ns3::HeRu::RuSpec ru, uint16_t staId) [member function]
+    cls.add_method('SetRu', 
+                   'void', 
+                   [param('ns3::HeRu::RuSpec', 'ru'), param('uint16_t', 'staId')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
+    cls.add_method('SetStbc', 
+                   'void', 
+                   [param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
+    cls.add_method('SetTxPowerLevel', 
+                   'void', 
+                   [param('uint8_t', 'powerlevel')])
+    return
+
 def register_Ns3Empty_methods(root_module, cls):
     ## empty.h (module 'core'): ns3::empty::empty() [constructor]
     cls.add_constructor([])
@@ -4826,11 +5316,6 @@
                    'ns3::CapabilityInformation', 
                    [], 
                    is_const=True)
-    ## mgt-headers.h (module 'wifi'): ns3::CfParameterSet ns3::MgtProbeResponseHeader::GetCfParameterSet() const [member function]
-    cls.add_method('GetCfParameterSet', 
-                   'ns3::CfParameterSet', 
-                   [], 
-                   is_const=True)
     ## mgt-headers.h (module 'wifi'): ns3::DsssParameterSet ns3::MgtProbeResponseHeader::GetDsssParameterSet() const [member function]
     cls.add_method('GetDsssParameterSet', 
                    'ns3::DsssParameterSet', 
@@ -4928,10 +5413,6 @@
     cls.add_method('SetCapabilities', 
                    'void', 
                    [param('ns3::CapabilityInformation', 'capabilities')])
-    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetCfParameterSet(ns3::CfParameterSet cfParameterSet) [member function]
-    cls.add_method('SetCfParameterSet', 
-                   'void', 
-                   [param('ns3::CfParameterSet', 'cfParameterSet')])
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetDsssParameterSet(ns3::DsssParameterSet dsssParameterSet) [member function]
     cls.add_method('SetDsssParameterSet', 
                    'void', 
@@ -5352,10 +5833,11 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMacLow(ns3::Ptr<ns3::MacLow> const low) [member function]
-    cls.add_method('SetMacLow', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacLow > const', 'low')])
+    ## txop.h (module 'wifi'): ns3::AcIndex ns3::Txop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::SetChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> const manager) [member function]
     cls.add_method('SetChannelAccessManager', 
                    'void', 
@@ -5369,23 +5851,11 @@
     cls.add_method('SetTxMiddle', 
                    'void', 
                    [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxOkCallback(ns3::Txop::TxOk callback) [member function]
-    cls.add_method('SetTxOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxFailedCallback(ns3::Txop::TxFailed callback) [member function]
-    cls.add_method('SetTxFailedCallback', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxDroppedCallback(ns3::Txop::TxDropped callback) [member function]
-    cls.add_method('SetTxDroppedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::MacLow> ns3::Txop::GetLow() const [member function]
-    cls.add_method('GetLow', 
-                   'ns3::Ptr< ns3::MacLow >', 
-                   [], 
-                   is_const=True)
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
     ## txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::Txop::GetWifiMacQueue() const [member function]
     cls.add_method('GetWifiMacQueue', 
                    'ns3::Ptr< ns3::WifiMacQueue >', 
@@ -5427,9 +5897,17 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
-    cls.add_method('NotifyChannelSwitching', 
-                   'void', 
+    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
+    cls.add_method('ResetCw', 
+                   'void', 
+                   [])
+    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
+    cls.add_method('UpdateFailedCw', 
+                   'void', 
+                   [])
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
+                   'void', 
                    [], 
                    is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::NotifySleep() [member function]
@@ -5457,85 +5935,23 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SendCfFrame(ns3::WifiMacType frameType, ns3::Mac48Address addr) [member function]
-    cls.add_method('SendCfFrame', 
-                   'void', 
-                   [param('ns3::WifiMacType', 'frameType'), param('ns3::Mac48Address', 'addr')])
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedCts() [member function]
-    cls.add_method('MissedCts', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotAck() [member function]
-    cls.add_method('GotAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedAck() [member function]
-    cls.add_method('MissedAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotCfEnd() [member function]
-    cls.add_method('GotCfEnd', 
-                   'void', 
-                   [])
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedCfPollResponse(bool expectedCfAck) [member function]
-    cls.add_method('MissedCfPollResponse', 
-                   'void', 
-                   [param('bool', 'expectedCfAck')])
-    ## txop.h (module 'wifi'): void ns3::Txop::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('GotBlockAck', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedBlockAck(uint8_t nMpdus) [member function]
-    cls.add_method('MissedBlockAck', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelAccessed(ns3::Time txopDuration=ns3::Seconds(0)) [member function]
+    cls.add_method('NotifyChannelAccessed', 
                    'void', 
-                   [param('uint8_t', 'nMpdus')], 
+                   [param('ns3::Time', 'txopDuration', default_value='ns3::Seconds(0)')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::StartNextFragment() [member function]
-    cls.add_method('StartNextFragment', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelReleased() [member function]
+    cls.add_method('NotifyChannelReleased', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::Cancel() [member function]
-    cls.add_method('Cancel', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::StartNextPacket() [member function]
-    cls.add_method('StartNextPacket', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::EndTxNoAck() [member function]
-    cls.add_method('EndTxNoAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopRemaining() const [member function]
-    cls.add_method('GetTxopRemaining', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::TerminateTxop() [member function]
-    cls.add_method('TerminateTxop', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): bool ns3::Txop::CanStartNextPolling() const [member function]
-    cls.add_method('CanStartNextPolling', 
-                   'bool', 
-                   [], 
-                   is_const=True)
     ## txop.h (module 'wifi'): int64_t ns3::Txop::AssignStreams(int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsAccessRequested() const [member function]
-    cls.add_method('IsAccessRequested', 
-                   'bool', 
+    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus ns3::Txop::GetAccessStatus() const [member function]
+    cls.add_method('GetAccessStatus', 
+                   'ns3::Txop::ChannelAccessStatus', 
                    [], 
                    is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
@@ -5559,11 +5975,6 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessGranted() [member function]
-    cls.add_method('NotifyAccessGranted', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::NotifyInternalCollision() [member function]
     cls.add_method('NotifyInternalCollision', 
                    'void', 
@@ -5579,31 +5990,21 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::RestartAccessIfNeeded() [member function]
-    cls.add_method('RestartAccessIfNeeded', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::StartAccessIfNeeded() [member function]
     cls.add_method('StartAccessIfNeeded', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
+    ## txop.h (module 'wifi'): void ns3::Txop::RequestAccess() [member function]
+    cls.add_method('RequestAccess', 
+                   'void', 
+                   [], 
+                   visibility='protected')
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetCw() const [member function]
     cls.add_method('GetCw', 
                    'uint32_t', 
                    [], 
                    is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
-    cls.add_method('ResetCw', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
-    cls.add_method('UpdateFailedCw', 
-                   'void', 
-                   [], 
-                   visibility='protected')
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetBackoffSlots() const [member function]
     cls.add_method('GetBackoffSlots', 
                    'uint32_t', 
@@ -5619,56 +6020,6 @@
                    'void', 
                    [param('uint32_t', 'nSlots'), param('ns3::Time', 'backoffUpdateBound')], 
                    visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedRtsRetransmission(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('NeedRtsRetransmission', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedDataRetransmission(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('NeedDataRetransmission', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedFragmentation() const [member function]
-    cls.add_method('NeedFragmentation', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NextFragment() [member function]
-    cls.add_method('NextFragment', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::Txop::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
-    cls.add_method('GetFragmentPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('ns3::WifiMacHeader *', 'hdr')], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetNextFragmentSize() const [member function]
-    cls.add_method('GetNextFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetFragmentSize() const [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetFragmentOffset() const [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsLastFragment() const [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::TxDroppedPacket(ns3::Ptr<const ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('TxDroppedPacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item')], 
-                   visibility='protected')
     return
 
 def register_Ns3WifiActionHeader_methods(root_module, cls):
@@ -5773,7 +6124,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5783,7 +6134,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'i')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -5926,6 +6277,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
     cls.add_method('GetVhtConfiguration', 
                    'ns3::Ptr< ns3::VhtConfiguration >', 
@@ -5975,7 +6331,7 @@
     cls.add_method('SetDevice', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::Callback<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function]
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
@@ -6005,6 +6361,11 @@
                    'void', 
                    [param('ns3::Ssid', 'ssid')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
     cls.add_method('SetWifiPhy', 
                    'void', 
@@ -6032,6 +6393,8 @@
     cls.add_constructor([param('ns3::WifiMacHeader const &', 'arg0')])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader() [constructor]
     cls.add_constructor([])
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader(ns3::WifiMacType type) [constructor]
+    cls.add_constructor([param('ns3::WifiMacType', 'type')])
     ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -6077,6 +6440,11 @@
                    'ns3::WifiMacHeader::QosAckPolicy', 
                    [], 
                    is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosQueueSize() const [member function]
+    cls.add_method('GetQosQueueSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosTid() const [member function]
     cls.add_method('GetQosTid', 
                    'uint8_t', 
@@ -6292,6 +6660,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsTrigger() const [member function]
+    cls.add_method('IsTrigger', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -6394,6 +6767,10 @@
     cls.add_method('SetQosNoMeshControlPresent', 
                    'void', 
                    [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosQueueSize(uint8_t size) [member function]
+    cls.add_method('SetQosQueueSize', 
+                   'void', 
+                   [param('uint8_t', 'size')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTid(uint8_t tid) [member function]
     cls.add_method('SetQosTid', 
                    'void', 
@@ -6451,11 +6828,21 @@
                    'ns3::Ptr< ns3::Packet const >', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetPacketSize() const [member function]
+    cls.add_method('GetPacketSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiMacQueueItem::GetProtocolDataUnit() const [member function]
     cls.add_method('GetProtocolDataUnit', 
                    'ns3::Ptr< ns3::Packet >', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): std::list<ns3::WifiMacQueueItem::QueueIteratorPair, std::allocator<ns3::WifiMacQueueItem::QueueIteratorPair> > const & ns3::WifiMacQueueItem::GetQueueIteratorPairs() const [member function]
+    cls.add_method('GetQueueIteratorPairs', 
+                   'std::list< ns3::WifiMacQueueItem::QueueIteratorPair > const &', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
     cls.add_method('GetSize', 
                    'uint32_t', 
@@ -6466,21 +6853,42 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsFragment() const [member function]
+    cls.add_method('IsFragment', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
+    cls.add_method('IsQueued', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::MsduAggregator::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
     cls.add_method('begin', 
-                   'ns3::MsduAggregator::DeaggregatedMsdusCI', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
                    [])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::MsduAggregator::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
     cls.add_method('end', 
-                   'ns3::MsduAggregator::DeaggregatedMsdusCI', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
                    [])
     return
 
+def register_Ns3WifiMacQueueItemQueueIteratorPair_methods(root_module, cls):
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::QueueIteratorPair() [constructor]
+    cls.add_constructor([])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::QueueIteratorPair(ns3::WifiMacQueueItem::QueueIteratorPair const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiMacQueueItem::QueueIteratorPair const &', 'arg0')])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::it [variable]
+    cls.add_instance_attribute('it', 'ns3::WifiMacQueueItem::ConstIterator', is_const=False)
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::queue [variable]
+    cls.add_instance_attribute('queue', 'ns3::WifiMacQueue *', is_const=False)
+    return
+
 def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
     ## wifi-remote-station-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiRemoteStationManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -6499,6 +6907,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): int64_t ns3::WifiRemoteStationManager::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
     cls.add_method('SetMaxSsrc', 
                    'void', 
@@ -6520,10 +6933,6 @@
     cls.add_method('SetFragmentationThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
-    cls.add_method('UpdateFragmentationThreshold', 
-                   'void', 
-                   [])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
     cls.add_method('SetQosSupport', 
                    'void', 
@@ -6567,20 +6976,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetPcfSupported(bool enable) [member function]
-    cls.add_method('SetPcfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetPcfSupported() const [member function]
-    cls.add_method('GetPcfSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported() const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported() const [member function]
     cls.add_method('GetLdpcSupported', 
                    'bool', 
@@ -6614,15 +7009,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseGreenfieldProtection(bool enable) [member function]
-    cls.add_method('SetUseGreenfieldProtection', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseGreenfieldProtection() const [member function]
-    cls.add_method('GetUseGreenfieldProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortPreambleEnabled(bool enable) [member function]
     cls.add_method('SetShortPreambleEnabled', 
                    'void', 
@@ -6674,11 +7060,6 @@
                    'ns3::WifiMode', 
                    [param('uint8_t', 'i')], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported(ns3::Mac48Address address) const [member function]
     cls.add_method('GetLdpcSupported', 
                    'bool', 
@@ -6742,6 +7123,21 @@
                    'uint8_t', 
                    [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetDsssSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetErpOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetErpOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::Mac48Address address) const [member function]
     cls.add_method('GetHtSupported', 
                    'bool', 
@@ -6825,42 +7221,62 @@
     cls.add_method('GetRtsTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsTxVector(ns3::Mac48Address to, ns3::WifiMode rtsTxMode) const [member function]
+    cls.add_method('GetCtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiMode', 'rtsTxMode')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector() [member function]
     cls.add_method('GetCtsToSelfTxVector', 
                    'ns3::WifiTxVector', 
                    [])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetBlockAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetBlockAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetControlAnswerMode(ns3::WifiMode reqMode) const [member function]
+    cls.add_method('GetControlAnswerMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'reqMode')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::WifiMacHeader const & header) [member function]
     cls.add_method('ReportRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('ReportDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::WifiMacHeader const & header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
     cls.add_method('ReportRtsOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector, uint32_t packetSize) [member function]
+                   [param('ns3::WifiMacHeader const &', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
     cls.add_method('ReportDataOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::WifiMacHeader const & header) [member function]
     cls.add_method('ReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('ReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
     cls.add_method('ReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, double rxSnr, ns3::WifiMode txMode) [member function]
+                   [param('ns3::Mac48Address', 'address'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
     cls.add_method('ReportRxOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')])
+                   [param('ns3::Mac48Address', 'address'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::WifiMacHeader const & header, uint32_t size) [member function]
     cls.add_method('NeedRts', 
                    'bool', 
@@ -6869,26 +7285,26 @@
     cls.add_method('NeedCtsToSelf', 
                    'bool', 
                    [param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NeedRetransmission', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NeedFragmentation', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
     cls.add_method('GetFragmentSize', 
                    'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
     cls.add_method('GetFragmentOffset', 
                    'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
     cls.add_method('IsLastFragment', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
     ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
     cls.add_method('GetDefaultTxPowerLevel', 
                    'uint8_t', 
@@ -6898,6 +7314,11 @@
     cls.add_method('GetInfo', 
                    'ns3::WifiRemoteStationInfo', 
                    [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): double ns3::WifiRemoteStationManager::GetMostRecentRssi(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetMostRecentRssi', 
+                   'double', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
     cls.add_method('SetDefaultTxPowerLevel', 
                    'void', 
@@ -6912,16 +7333,21 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseGreenfieldForDestination(ns3::Mac48Address dest) const [member function]
-    cls.add_method('UseGreenfieldForDestination', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseLdpcForDestination(ns3::Mac48Address dest) const [member function]
     cls.add_method('UseLdpcForDestination', 
                    'bool', 
                    [param('ns3::Mac48Address', 'dest')], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
+    cls.add_method('GetPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
+    cls.add_method('GetMac', 
+                   'ns3::Ptr< ns3::WifiMac >', 
+                   [], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
@@ -7004,11 +7430,6 @@
                    'bool', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetGreenfield', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetNumberOfSupportedStreams', 
                    'uint8_t', 
@@ -7019,16 +7440,6 @@
                    'uint8_t', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
-    cls.add_method('GetMac', 
-                   'ns3::Ptr< ns3::WifiMac >', 
-                   [], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
     cls.add_method('DoNeedRts', 
                    'bool', 
@@ -7094,10 +7505,10 @@
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
                    is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
     cls.add_method('DoReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
                    is_virtual=True, visibility='private')
     return
 
@@ -7286,18 +7697,18 @@
     cls.add_method('DestroyAgreement', 
                    'void', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient, uint16_t startingSeq) [member function]
     cls.add_method('UpdateAgreement', 
                    'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient'), param('uint16_t', 'startingSeq')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::StorePacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('StorePacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true) [member function]
+    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
     cls.add_method('GetBar', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('bool', 'remove', default_value='true')])
+                   [param('bool', 'remove', default_value='true'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
     ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasPackets() [member function]
     cls.add_method('HasPackets', 
                    'bool', 
@@ -7310,10 +7721,10 @@
     cls.add_method('NotifyMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, double rxSnr, double dataSnr, ns3::WifiTxVector const & dataTxVector, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
                    'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector const &', 'dataTxVector'), param('size_t', 'index', default_value='0')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('NotifyMissedBlockAck', 
                    'void', 
@@ -7355,14 +7766,6 @@
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueue > const', 'queue')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
-    cls.add_method('SetTxMiddle', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckType(ns3::BlockAckType bAckType) [member function]
-    cls.add_method('SetBlockAckType', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'bAckType')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckInactivityCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
     cls.add_method('SetBlockAckInactivityCallback', 
                    'void', 
@@ -7388,6 +7791,16 @@
                    'uint16_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
                    is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckManager::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckManager::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
     ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetOriginatorStartingSequence(ns3::Mac48Address recipient, uint8_t tid) const [member function]
     cls.add_method('GetOriginatorStartingSequence', 
                    'uint16_t', 
@@ -7396,11 +7809,11 @@
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxOkCallback(ns3::BlockAckManager::TxOk callback) [member function]
     cls.add_method('SetTxOkCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxFailedCallback(ns3::BlockAckManager::TxFailed callback) [member function]
     cls.add_method('SetTxFailedCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyDiscardedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NotifyDiscardedMpdu', 
                    'void', 
@@ -7533,6 +7946,21 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['unsigned long long'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -7543,12 +7971,17 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -7558,6 +7991,21 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -7594,84 +8042,6 @@
                    [param('ns3::CallbackBase', 'base')])
     return
 
-def register_Ns3CfParameterSet_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## cf-parameter-set.h (module 'wifi'): ns3::CfParameterSet::CfParameterSet(ns3::CfParameterSet const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CfParameterSet const &', 'arg0')])
-    ## cf-parameter-set.h (module 'wifi'): ns3::CfParameterSet::CfParameterSet() [constructor]
-    cls.add_constructor([])
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::CfParameterSet::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::GetCFPCount() const [member function]
-    cls.add_method('GetCFPCount', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint64_t ns3::CfParameterSet::GetCFPDurRemainingUs() const [member function]
-    cls.add_method('GetCFPDurRemainingUs', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint64_t ns3::CfParameterSet::GetCFPMaxDurationUs() const [member function]
-    cls.add_method('GetCFPMaxDurationUs', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::GetCFPPeriod() const [member function]
-    cls.add_method('GetCFPPeriod', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): uint16_t ns3::CfParameterSet::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::CfParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPCount(uint8_t count) [member function]
-    cls.add_method('SetCFPCount', 
-                   'void', 
-                   [param('uint8_t', 'count')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPDurRemainingUs(uint64_t durRemaining) [member function]
-    cls.add_method('SetCFPDurRemainingUs', 
-                   'void', 
-                   [param('uint64_t', 'durRemaining')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPMaxDurationUs(uint64_t maxDuration) [member function]
-    cls.add_method('SetCFPMaxDurationUs', 
-                   'void', 
-                   [param('uint64_t', 'maxDuration')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPPeriod(uint8_t period) [member function]
-    cls.add_method('SetCFPPeriod', 
-                   'void', 
-                   [param('uint8_t', 'period')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetPcfSupported(uint8_t pcfSupported) [member function]
-    cls.add_method('SetPcfSupported', 
-                   'void', 
-                   [param('uint8_t', 'pcfSupported')])
-    return
-
 def register_Ns3Channel_methods(root_module, cls):
     ## channel.h (module 'network'): ns3::Channel::Channel(ns3::Channel const & arg0) [constructor]
     cls.add_constructor([param('ns3::Channel const &', 'arg0')])
@@ -7796,12 +8166,12 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## dsss-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::DsssParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -7886,7 +8256,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetViAifsn() const [member function]
     cls.add_method('GetViAifsn', 
                    'uint8_t', 
@@ -7936,7 +8306,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8241,7 +8611,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetUseProtection() const [member function]
     cls.add_method('GetUseProtection', 
                    'uint8_t', 
@@ -8251,7 +8621,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8364,12 +8734,12 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## extended-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8443,12 +8813,12 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## supported-rates.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedSupportedRatesIE::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## supported-rates.h (module 'wifi'): void ns3::ExtendedSupportedRatesIE::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8540,7 +8910,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSupportedMcsAndNss() const [member function]
     cls.add_method('GetSupportedMcsAndNss', 
                    'uint16_t', 
@@ -8560,7 +8930,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8653,12 +9023,12 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::HeOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-operation.h (module 'wifi'): void ns3::HeOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8713,11 +9083,6 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
-    cls.add_method('GetGreenfield', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetHtCapabilitiesInfo() const [member function]
     cls.add_method('GetHtCapabilitiesInfo', 
                    'uint16_t', 
@@ -8752,7 +9117,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval20() const [member function]
     cls.add_method('GetShortGuardInterval20', 
                    'uint8_t', 
@@ -8787,7 +9152,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8805,10 +9170,6 @@
     cls.add_method('SetExtendedHtCapabilities', 
                    'void', 
                    [param('uint16_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
-    cls.add_method('SetGreenfield', 
-                   'void', 
-                   [param('uint8_t', 'greenfield')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtCapabilitiesInfo(uint16_t ctrl) [member function]
     cls.add_method('SetHtCapabilitiesInfo', 
                    'void', 
@@ -8989,7 +9350,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetStaChannelWidth() const [member function]
     cls.add_method('GetStaChannelWidth', 
                    'uint8_t', 
@@ -9029,7 +9390,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -9490,47 +9851,6 @@
                    is_static=True)
     return
 
-def register_Ns3MsduAggregator_methods(root_module, cls):
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator(ns3::MsduAggregator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MsduAggregator const &', 'arg0')])
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator() [constructor]
-    cls.add_constructor([])
-    ## msdu-aggregator.h (module 'wifi'): static uint8_t ns3::MsduAggregator::CalculatePadding(uint16_t amsduSize) [member function]
-    cls.add_method('CalculatePadding', 
-                   'uint8_t', 
-                   [param('uint16_t', 'amsduSize')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): static ns3::MsduAggregator::DeaggregatedMsdus ns3::MsduAggregator::Deaggregate(ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
-    cls.add_method('Deaggregate', 
-                   'ns3::MsduAggregator::DeaggregatedMsdus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): uint16_t ns3::MsduAggregator::GetMaxAmsduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
-    cls.add_method('GetMaxAmsduSize', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
-                   is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::MsduAggregator::GetNextAmsdu(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiTxVector txVector, uint32_t ampduSize=0, ns3::Time ppduDurationLimit=ns3::Time::Min()) const [member function]
-    cls.add_method('GetNextAmsdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize', default_value='0'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')], 
-                   is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): static uint16_t ns3::MsduAggregator::GetSizeIfAggregated(uint16_t msduSize, uint16_t amsduSize) [member function]
-    cls.add_method('GetSizeIfAggregated', 
-                   'uint16_t', 
-                   [param('uint16_t', 'msduSize'), param('uint16_t', 'amsduSize')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MsduAggregator::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::SetEdcaQueues(ns3::MsduAggregator::EdcaQueues map) [member function]
-    cls.add_method('SetEdcaQueues', 
-                   'void', 
-                   [param('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'map')])
-    return
-
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -10035,8 +10355,6 @@
     return
 
 def register_Ns3QosTxop_methods(root_module, cls):
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::m_aMpduEnabled [variable]
-    cls.add_instance_attribute('m_aMpduEnabled', 'std::map< ns3::Mac48Address, bool >', is_const=False)
     ## qos-txop.h (module 'wifi'): static ns3::TypeId ns3::QosTxop::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -10049,6 +10367,11 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): ns3::AcIndex ns3::QosTxop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
     cls.add_method('SetWifiRemoteStationManager', 
                    'void', 
@@ -10059,89 +10382,39 @@
                    'bool', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyAccessGranted() [member function]
-    cls.add_method('NotifyAccessGranted', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyInternalCollision() [member function]
     cls.add_method('NotifyInternalCollision', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAck() [member function]
-    cls.add_method('GotAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('GotBlockAck', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::MissedBlockAck(uint8_t nMpdus) [member function]
-    cls.add_method('MissedBlockAck', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
+    cls.add_method('NotifyChannelAccessed', 
                    'void', 
-                   [param('uint8_t', 'nMpdus')], 
+                   [param('ns3::Time', 'txopDuration')], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::MissedAck() [member function]
-    cls.add_method('MissedAck', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelReleased() [member function]
+    cls.add_method('NotifyChannelReleased', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartNextPacket() [member function]
-    cls.add_method('StartNextPacket', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
                    'void', 
-                   [], 
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::EndTxNoAck() [member function]
-    cls.add_method('EndTxNoAck', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosFrameExchangeManager(ns3::Ptr<ns3::QosFrameExchangeManager> const qosFem) [member function]
+    cls.add_method('SetQosFrameExchangeManager', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::RestartAccessIfNeeded() [member function]
-    cls.add_method('RestartAccessIfNeeded', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartAccessIfNeeded() [member function]
-    cls.add_method('StartAccessIfNeeded', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetTxopRemaining() const [member function]
-    cls.add_method('GetTxopRemaining', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::NeedFragmentation() const [member function]
-    cls.add_method('NeedFragmentation', 
+                   [param('ns3::Ptr< ns3::QosFrameExchangeManager > const', 'qosFem')])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::UseExplicitBarAfterMissedBlockAck() const [member function]
+    cls.add_method('UseExplicitBarAfterMissedBlockAck', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::QosTxop::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
-    cls.add_method('GetFragmentPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('ns3::WifiMacHeader *', 'hdr')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAckPolicySelector(ns3::Ptr<ns3::WifiAckPolicySelector> ackSelector) [member function]
-    cls.add_method('SetAckPolicySelector', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiAckPolicySelector >', 'ackSelector')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiAckPolicySelector> ns3::QosTxop::GetAckPolicySelector() const [member function]
-    cls.add_method('GetAckPolicySelector', 
-                   'ns3::Ptr< ns3::WifiAckPolicySelector >', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')])
-    ## qos-txop.h (module 'wifi'): ns3::TypeOfStation ns3::QosTxop::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
-                   [], 
                    is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::BlockAckManager> ns3::QosTxop::GetBaManager() [member function]
+    cls.add_method('GetBaManager', 
+                   'ns3::Ptr< ns3::BlockAckManager >', 
+                   [])
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetBaAgreementEstablished(ns3::Mac48Address address, uint8_t tid) const [member function]
     cls.add_method('GetBaAgreementEstablished', 
                    'bool', 
@@ -10157,6 +10430,16 @@
                    'uint16_t', 
                    [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
                    is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::BlockAckReqType ns3::QosTxop::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::BlockAckType ns3::QosTxop::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PrepareBlockAckRequest(ns3::Mac48Address recipient, uint8_t tid) const [member function]
     cls.add_method('PrepareBlockAckRequest', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
@@ -10166,10 +10449,6 @@
     cls.add_method('ScheduleBar', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyMissedCts(std::list<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [member function]
-    cls.add_method('NotifyMissedCts', 
-                   'void', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAddBaResponse(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
     cls.add_method('GotAddBaResponse', 
                    'void', 
@@ -10178,10 +10457,14 @@
     cls.add_method('GotDelBaFrame', 
                    'void', 
                    [param('ns3::MgtDelBaHeader const *', 'delBaHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::NeedBarRetransmission() [member function]
-    cls.add_method('NeedBarRetransmission', 
-                   'bool', 
-                   [])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AddBaResponseTimeout(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('AddBaResponseTimeout', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ResetBa(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('ResetBa', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAccessCategory(ns3::AcIndex ac) [member function]
     cls.add_method('SetAccessCategory', 
                    'void', 
@@ -10190,10 +10473,6 @@
     cls.add_method('PushFront', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteConfig() [member function]
-    cls.add_method('CompleteConfig', 
-                   'void', 
-                   [])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckThreshold(uint8_t threshold) [member function]
     cls.add_method('SetBlockAckThreshold', 
                    'void', 
@@ -10207,23 +10486,15 @@
     cls.add_method('SetBlockAckInactivityTimeout', 
                    'void', 
                    [param('uint16_t', 'timeout')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
-    cls.add_method('SendDelbaFrame', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteMpduTx(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('CompleteMpduTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetAmpduExist(ns3::Mac48Address dest) const [member function]
-    cls.add_method('GetAmpduExist', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBlockAckInactivityTimeout() const [member function]
+    cls.add_method('GetBlockAckInactivityTimeout', 
+                   'uint16_t', 
+                   [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAmpduExist(ns3::Mac48Address dest, bool enableAmpdu) [member function]
-    cls.add_method('SetAmpduExist', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteMpduTx(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('CompleteMpduTx', 
                    'void', 
-                   [param('ns3::Mac48Address', 'dest'), param('bool', 'enableAmpdu')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAddBaResponseTimeout(ns3::Time addBaResponseTimeout) [member function]
     cls.add_method('SetAddBaResponseTimeout', 
                    'void', 
@@ -10250,76 +10521,49 @@
     cls.add_method('PeekNextSequenceNumberFor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextFrame(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextFrame', 
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('PeekNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
                    [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::DequeuePeekedFrame(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxVector txVector, bool aggregate=true, uint32_t ampduSize=0, ns3::Time ppduDurationLimit=ns3::Time::Min()) [member function]
-    cls.add_method('DequeuePeekedFrame', 
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::QueueIteratorPair queueIt, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('PeekNextMpdu', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::WifiMacQueueItem::QueueIteratorPair', 'queueIt'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame, ns3::WifiMacQueueItem::QueueIteratorPair & queueIt) [member function]
+    cls.add_method('GetNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxVector', 'txVector'), param('bool', 'aggregate', default_value='true'), param('uint32_t', 'ampduSize', default_value='0'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')])
-    ## qos-txop.h (module 'wifi'): ns3::MacLowTransmissionParameters ns3::QosTxop::GetTransmissionParameters(ns3::Ptr<const ns3::WifiMacQueueItem> frame) const [member function]
-    cls.add_method('GetTransmissionParameters', 
-                   'ns3::MacLowTransmissionParameters', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'frame')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::QueueIteratorPair &', 'queueIt')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AssignSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('AssignSequenceNumber', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::UpdateCurrentPacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('UpdateCurrentPacket', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosQueueSize(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('SetQosQueueSize', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::BaTxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('BaTxOk', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::BaTxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('BaTxFailed', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Mac48Address ns3::QosTxop::MapSrcAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('MapSrcAddressForAggregation', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Mac48Address ns3::QosTxop::MapDestAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('MapDestAddressForAggregation', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsTxopStarted() const [member function]
+    cls.add_method('IsTxopStarted', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetRemainingTxop() const [member function]
+    cls.add_method('GetRemainingTxop', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::QosTxop const & arg0) [constructor]
     cls.add_constructor([param('ns3::QosTxop const &', 'arg0')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='private')
+                   is_virtual=True, visibility='protected')
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::TerminateTxop() [member function]
-    cls.add_method('TerminateTxop', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetNextFragmentSize() const [member function]
-    cls.add_method('GetNextFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetFragmentSize() const [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetFragmentOffset() const [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsLastFragment() const [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3RegularWifiMac_methods(root_module, cls):
@@ -10405,7 +10649,12 @@
                    'void', 
                    [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::RegularWifiMac::ForwardUpCallback upCallback) [member function]
+    ## regular-wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::RegularWifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
@@ -10420,11 +10669,21 @@
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
                    is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
+    cls.add_method('GetWifiRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
     cls.add_method('Enqueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::RegularWifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
     cls.add_method('SetCtsToSelfSupported', 
                    'void', 
@@ -10433,11 +10692,21 @@
     cls.add_method('SetBssid', 
                    'void', 
                    [param('ns3::Mac48Address', 'bssid')])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
                    [], 
-                   is_const=True, is_virtual=True)
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
     cls.add_method('GetExtendedCapabilities', 
                    'ns3::ExtendedCapabilities', 
@@ -10468,11 +10737,11 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
-    cls.add_method('GetTxop', 
-                   'ns3::Ptr< ns3::Txop >', 
-                   [], 
-                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_virtual=True, visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
     cls.add_method('GetVOQueue', 
                    'ns3::Ptr< ns3::QosTxop >', 
@@ -10498,26 +10767,11 @@
                    'void', 
                    [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
                    visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('Receive', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxOk', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxFailed', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
     cls.add_method('ForwardUp', 
                    'void', 
@@ -10528,11 +10782,6 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SendAddBaResponse(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address originator) [member function]
-    cls.add_method('SendAddBaResponse', 
-                   'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'originator')], 
-                   visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
     cls.add_method('SetQosSupported', 
                    'void', 
@@ -10543,6 +10792,11 @@
                    'bool', 
                    [], 
                    is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetupFrameExchangeManager() [member function]
+    cls.add_method('SetupFrameExchangeManager', 
+                   'void', 
+                   [], 
+                   visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
     cls.add_method('GetHtSupported', 
                    'bool', 
@@ -10669,8 +10923,8 @@
     cls.add_output_stream_operator()
     ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates() [constructor]
     cls.add_constructor([])
-    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates(ns3::SupportedRates const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SupportedRates const &', 'arg0')])
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates(ns3::SupportedRates const & rates) [constructor]
+    cls.add_constructor([param('ns3::SupportedRates const &', 'rates')])
     ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::AddBssMembershipSelectorRate(uint64_t bs) [member function]
     cls.add_method('AddBssMembershipSelectorRate', 
                    'void', 
@@ -10890,7 +11144,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
     cls.add_method('GetSupportedChannelWidthSet', 
                    'uint8_t', 
@@ -10930,7 +11184,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -11043,12 +11297,12 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -11228,6 +11482,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11250,6 +11526,94 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0, short unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('ns3::WifiTxVector const &', 'arg0'), param('short unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): short unsigned int ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'short unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Bool_Ns3Ptr__lt__ns3Packet__gt___Ns3Mac48Address_Ns3Mac48Address_Unsigned_short_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, unsigned short, unsigned int, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11360,6 +11724,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::WifiMacQueueItem> arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11470,6 +11856,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiMacDropReason arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::WifiMacDropReason', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Ns3Dot11sRouteChange_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::dot11s::RouteChange, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11492,6 +11900,73 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiPsdu> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiPsdu const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * arg2, long unsigned int arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
+    return
+
 def register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11839,10 +12314,10 @@
     cls.add_method('InstallPlugin', 
                    'void', 
                    [param('ns3::Ptr< ns3::MeshWifiInterfaceMacPlugin >', 'plugin')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Report(std::ostream & arg0) const [member function]
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Report(std::ostream & os) const [member function]
     cls.add_method('Report', 
                    'void', 
-                   [param('std::ostream &', 'arg0')], 
+                   [param('std::ostream &', 'os')], 
                    is_const=True)
     ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ResetStats() [member function]
     cls.add_method('ResetStats', 
@@ -11869,10 +12344,10 @@
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
                    is_virtual=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetMeshPointAddress(ns3::Mac48Address arg0) [member function]
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetMeshPointAddress(ns3::Mac48Address addr) [member function]
     cls.add_method('SetMeshPointAddress', 
                    'void', 
-                   [param('ns3::Mac48Address', 'arg0')])
+                   [param('ns3::Mac48Address', 'addr')])
     ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetRandomStartDelay(ns3::Time interval) [member function]
     cls.add_method('SetRandomStartDelay', 
                    'void', 
@@ -12122,10 +12597,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## hwmp-protocol.h (module 'mesh'): bool ns3::dot11s::HwmpProtocol::Install(ns3::Ptr<ns3::MeshPointDevice> arg0) [member function]
+    ## hwmp-protocol.h (module 'mesh'): bool ns3::dot11s::HwmpProtocol::Install(ns3::Ptr<ns3::MeshPointDevice> mp) [member function]
     cls.add_method('Install', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::MeshPointDevice >', 'arg0')])
+                   [param('ns3::Ptr< ns3::MeshPointDevice >', 'mp')])
     ## hwmp-protocol.h (module 'mesh'): void ns3::dot11s::HwmpProtocol::PeerLinkStatus(ns3::Mac48Address meshPontAddress, ns3::Mac48Address peerAddress, uint32_t interface, bool status) [member function]
     cls.add_method('PeerLinkStatus', 
                    'void', 
@@ -12135,10 +12610,10 @@
                    'bool', 
                    [param('uint32_t', 'fromIface'), param('ns3::Mac48Address const', 'source'), param('ns3::Mac48Address const', 'destination'), param('ns3::Ptr< ns3::Packet >', 'packet'), param('uint16_t &', 'protocolType')], 
                    is_virtual=True)
-    ## hwmp-protocol.h (module 'mesh'): void ns3::dot11s::HwmpProtocol::Report(std::ostream & arg0) const [member function]
+    ## hwmp-protocol.h (module 'mesh'): void ns3::dot11s::HwmpProtocol::Report(std::ostream & os) const [member function]
     cls.add_method('Report', 
                    'void', 
-                   [param('std::ostream &', 'arg0')], 
+                   [param('std::ostream &', 'os')], 
                    is_const=True)
     ## hwmp-protocol.h (module 'mesh'): bool ns3::dot11s::HwmpProtocol::RequestRoute(uint32_t sourceIface, ns3::Mac48Address const source, ns3::Mac48Address const destination, ns3::Ptr<const ns3::Packet> packet, uint16_t protocolType, ns3::MeshL2RoutingProtocol::RouteReplyCallback routeReply) [member function]
     cls.add_method('RequestRoute', 
@@ -12514,46 +12989,6 @@
                    is_const=True, is_virtual=True)
     return
 
-def register_Ns3Dot11sIeMeshIdChecker_methods(root_module, cls):
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdChecker::IeMeshIdChecker() [constructor]
-    cls.add_constructor([])
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdChecker::IeMeshIdChecker(ns3::dot11s::IeMeshIdChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::dot11s::IeMeshIdChecker const &', 'arg0')])
-    return
-
-def register_Ns3Dot11sIeMeshIdValue_methods(root_module, cls):
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdValue::IeMeshIdValue() [constructor]
-    cls.add_constructor([])
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdValue::IeMeshIdValue(ns3::dot11s::IeMeshId const & value) [constructor]
-    cls.add_constructor([param('ns3::dot11s::IeMeshId const &', 'value')])
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdValue::IeMeshIdValue(ns3::dot11s::IeMeshIdValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::dot11s::IeMeshIdValue const &', 'arg0')])
-    ## ie-dot11s-id.h (module 'mesh'): ns3::Ptr<ns3::AttributeValue> ns3::dot11s::IeMeshIdValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ie-dot11s-id.h (module 'mesh'): bool ns3::dot11s::IeMeshIdValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshId ns3::dot11s::IeMeshIdValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::dot11s::IeMeshId', 
-                   [], 
-                   is_const=True)
-    ## ie-dot11s-id.h (module 'mesh'): std::string ns3::dot11s::IeMeshIdValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## ie-dot11s-id.h (module 'mesh'): void ns3::dot11s::IeMeshIdValue::Set(ns3::dot11s::IeMeshId const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::dot11s::IeMeshId const &', 'value')])
-    return
-
 def register_Ns3Dot11sIePeerManagement_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     cls.add_output_stream_operator()
@@ -13535,10 +13970,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## peer-management-protocol.h (module 'mesh'): bool ns3::dot11s::PeerManagementProtocol::Install(ns3::Ptr<ns3::MeshPointDevice> arg0) [member function]
+    ## peer-management-protocol.h (module 'mesh'): bool ns3::dot11s::PeerManagementProtocol::Install(ns3::Ptr<ns3::MeshPointDevice> mp) [member function]
     cls.add_method('Install', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::MeshPointDevice >', 'arg0')])
+                   [param('ns3::Ptr< ns3::MeshPointDevice >', 'mp')])
     ## peer-management-protocol.h (module 'mesh'): bool ns3::dot11s::PeerManagementProtocol::IsActiveLink(uint32_t interface, ns3::Mac48Address peerAddress) [member function]
     cls.add_method('IsActiveLink', 
                    'bool', 
@@ -13712,10 +14147,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## flame-protocol.h (module 'mesh'): bool ns3::flame::FlameProtocol::Install(ns3::Ptr<ns3::MeshPointDevice> arg0) [member function]
+    ## flame-protocol.h (module 'mesh'): bool ns3::flame::FlameProtocol::Install(ns3::Ptr<ns3::MeshPointDevice> mp) [member function]
     cls.add_method('Install', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::MeshPointDevice >', 'arg0')])
+                   [param('ns3::Ptr< ns3::MeshPointDevice >', 'mp')])
     ## flame-protocol.h (module 'mesh'): bool ns3::flame::FlameProtocol::RemoveRoutingStuff(uint32_t fromIface, ns3::Mac48Address const source, ns3::Mac48Address const destination, ns3::Ptr<ns3::Packet> packet, uint16_t & protocolType) [member function]
     cls.add_method('RemoveRoutingStuff', 
                    'bool', 
@@ -13896,10 +14331,6 @@
     return
 
 def register_functions_ns3_dot11s(module, root_module):
-    ## ie-dot11s-id.h (module 'mesh'): ns3::Ptr<const ns3::AttributeChecker> ns3::dot11s::MakeIeMeshIdChecker() [free function]
-    module.add_function('MakeIeMeshIdChecker', 
-                        'ns3::Ptr< ns3::AttributeChecker const >', 
-                        [])
     return
 
 def register_functions_ns3_flame(module, root_module):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/bindings/modulegen__gcc_LP64.py ns-3.34/src/mesh/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/mesh/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -20,26 +20,34 @@
 def register_types(module):
     root_module = module.get_root()
     
-    ## qos-txop.h (module 'wifi'): ns3::TypeOfStation [enumeration]
-    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA', 'OCB'], import_from_module='ns.wifi')
-    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
-    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::WifiTxTimerReason [enumeration]
+    module.add_enum('WifiTxTimerReason', [], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT'], import_from_module='ns.wifi')
     ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
     module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'], import_from_module='ns.wifi')
-    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [enumeration]
-    module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'EXTENDED_COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
-    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
+    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_TRIGGER', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduField [enumeration]
+    module.add_enum('WifiPpduField', ['WIFI_PPDU_FIELD_PREAMBLE', 'WIFI_PPDU_FIELD_NON_HT_HEADER', 'WIFI_PPDU_FIELD_HT_SIG', 'WIFI_PPDU_FIELD_TRAINING', 'WIFI_PPDU_FIELD_SIG_A', 'WIFI_PPDU_FIELD_SIG_B', 'WIFI_PPDU_FIELD_DATA'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
+    module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
     module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_holland', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
+    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
     module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
     ## ht-operation.h (module 'wifi'): ns3::HtProtectionType [enumeration]
@@ -60,7 +68,15 @@
     ## block-ack-manager.h (module 'wifi'): ns3::Bar [struct]
     module.add_class('Bar', import_from_module='ns.wifi')
     ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement [class]
-    module.add_class('BlockAckAgreement', import_from_module='ns.wifi')
+    module.add_class('BlockAckAgreement', allow_subclassing=True, import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType [struct]
+    module.add_class('BlockAckReqType', import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID'], outer_class=root_module['ns3::BlockAckReqType'], import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [struct]
+    module.add_class('BlockAckType', import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID', 'MULTI_STA'], outer_class=root_module['ns3::BlockAckType'], import_from_module='ns.wifi')
     ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow [class]
     module.add_class('BlockAckWindow', import_from_module='ns.wifi')
     ## buffer.h (module 'network'): ns3::Buffer [class]
@@ -115,16 +131,40 @@
     module.add_class('EventId', import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo [struct]
+    module.add_class('HeMuUserInfo', import_from_module='ns.wifi')
+    ## he-ru.h (module 'wifi'): ns3::HeRu [class]
+    module.add_class('HeRu', import_from_module='ns.wifi')
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType [enumeration]
+    module.add_enum('RuType', ['RU_26_TONE', 'RU_52_TONE', 'RU_106_TONE', 'RU_242_TONE', 'RU_484_TONE', 'RU_996_TONE', 'RU_2x996_TONE'], outer_class=root_module['ns3::HeRu'], import_from_module='ns.wifi')
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [class]
+    module.add_class('RuSpec', import_from_module='ns.wifi', outer_class=root_module['ns3::HeRu'])
+    typehandlers.add_type_alias('std::pair< short, short >', 'ns3::HeRu::SubcarrierRange')
+    typehandlers.add_type_alias('std::pair< short, short >*', 'ns3::HeRu::SubcarrierRange*')
+    typehandlers.add_type_alias('std::pair< short, short >&', 'ns3::HeRu::SubcarrierRange&')
+    typehandlers.add_type_alias('std::vector< std::pair< short, short > >', 'ns3::HeRu::SubcarrierGroup')
+    typehandlers.add_type_alias('std::vector< std::pair< short, short > >*', 'ns3::HeRu::SubcarrierGroup*')
+    typehandlers.add_type_alias('std::vector< std::pair< short, short > >&', 'ns3::HeRu::SubcarrierGroup&')
+    typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >', 'ns3::HeRu::BwTonesPair')
+    typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >*', 'ns3::HeRu::BwTonesPair*')
+    typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >&', 'ns3::HeRu::BwTonesPair&')
+    typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', 'ns3::HeRu::SubcarrierGroups')
+    typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >*', 'ns3::HeRu::SubcarrierGroups*')
+    typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >&', 'ns3::HeRu::SubcarrierGroups&')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -143,8 +183,6 @@
     module.add_class('Mac8Address', import_from_module='ns.network')
     ## mac8-address.h (module 'network'): ns3::Mac8Address [class]
     root_module['ns3::Mac8Address'].implicitly_converts_to(root_module['ns3::Address'])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters [class]
-    module.add_class('MacLowTransmissionParameters', import_from_module='ns.wifi')
     ## mesh-helper.h (module 'mesh'): ns3::MeshHelper [class]
     module.add_class('MeshHelper')
     ## mesh-helper.h (module 'mesh'): ns3::MeshHelper::ChannelPolicy [enumeration]
@@ -211,10 +249,40 @@
     typehandlers.add_type_alias('uint32_t', 'ns3::TypeId::hash_t')
     typehandlers.add_type_alias('uint32_t*', 'ns3::TypeId::hash_t*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::TypeId::hash_t&')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc [class]
+    module.add_class('WifiAc', import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash [struct]
+    module.add_class('WifiAddressHash', import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash [struct]
+    module.add_class('WifiAddressTidHash', import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode [class]
     module.add_class('WifiMode', import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
     module.add_class('WifiModeFactory', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::CodeRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::CodeRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::CodeRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
     module.add_class('WifiRemoteStation', import_from_module='ns.wifi')
     ## wifi-remote-station-info.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
@@ -225,6 +293,11 @@
     module.add_enum('', ['BRAND_NEW', 'DISASSOC', 'WAIT_ASSOC_TX_OK', 'GOT_ASSOC_TX_OK'], outer_class=root_module['ns3::WifiRemoteStationState'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
     module.add_class('WifiStandardInfo', import_from_module='ns.wifi')
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
+    module.add_class('WifiTxVector', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >', 'ns3::WifiTxVector::HeMuUserInfoMap')
+    typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >*', 'ns3::WifiTxVector::HeMuUserInfoMap*')
+    typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >&', 'ns3::WifiTxVector::HeMuUserInfoMap&')
     ## empty.h (module 'core'): ns3::empty [class]
     module.add_class('empty', import_from_module='ns.core')
     ## int64x64-128.h (module 'core'): ns3::int64x64_t [class]
@@ -289,15 +362,11 @@
     module.add_class('Trailer', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
     ## txop.h (module 'wifi'): ns3::Txop [class]
     module.add_class('Txop', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxFailed&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxDropped')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxDropped*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxDropped&')
+    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus [enumeration]
+    module.add_enum('ChannelAccessStatus', ['NOT_REQUESTED', 'REQUESTED', 'GRANTED'], outer_class=root_module['ns3::Txop'], import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::DroppedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::DroppedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::DroppedMpdu&')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
@@ -325,6 +394,9 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::WifiInformationElement > > iterator&', 'ns3::WifiInformationElementVector::Iterator&')
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac [class]
     module.add_class('WifiMac', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiMac::ForwardUpCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiMac::ForwardUpCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiMac::ForwardUpCallback&')
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader [class]
     module.add_class('WifiMacHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy [enumeration]
@@ -336,6 +408,17 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiMacHeader const & )&', 'ns3::WifiMacHeader::TracedCallback&')
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem [class]
     module.add_class('WifiMacQueueItem', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >'])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair [struct]
+    module.add_class('QueueIteratorPair', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiMacQueueItem'])
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::WifiMacQueueItem::DeaggregatedMsdus')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::WifiMacQueueItem::DeaggregatedMsdus*')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::WifiMacQueueItem::DeaggregatedMsdus&')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI*')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI&')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'ns3::WifiMacQueueItem::ConstIterator')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator*', 'ns3::WifiMacQueueItem::ConstIterator*')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator&', 'ns3::WifiMacQueueItem::ConstIterator&')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
     module.add_class('WifiRemoteStationManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::ProtectionMode [enumeration]
@@ -362,12 +445,12 @@
     module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager [class]
     module.add_class('BlockAckManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )', 'ns3::BlockAckManager::AgreementStateTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )*', 'ns3::BlockAckManager::AgreementStateTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )&', 'ns3::BlockAckManager::AgreementStateTracedCallback&')
@@ -381,8 +464,6 @@
     module.add_class('CallbackImplBase', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
     ## callback.h (module 'core'): ns3::CallbackValue [class]
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
-    ## cf-parameter-set.h (module 'wifi'): ns3::CfParameterSet [class]
-    module.add_class('CfParameterSet', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## channel.h (module 'network'): ns3::Channel [class]
     module.add_class('Channel', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## data-rate.h (module 'network'): ns3::DataRateChecker [class]
@@ -456,17 +537,6 @@
     module.add_class('MeshWifiInterfaceMacPlugin', parent=root_module['ns3::SimpleRefCount< ns3::MeshWifiInterfaceMacPlugin, ns3::empty, ns3::DefaultDeleter<ns3::MeshWifiInterfaceMacPlugin> >'])
     ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader [class]
     module.add_class('MgtBeaconHeader', import_from_module='ns.wifi', parent=root_module['ns3::MgtProbeResponseHeader'])
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator [class]
-    module.add_class('MsduAggregator', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::MsduAggregator::DeaggregatedMsdus')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::MsduAggregator::DeaggregatedMsdus*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::MsduAggregator::DeaggregatedMsdus&')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::MsduAggregator::DeaggregatedMsdusCI')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::MsduAggregator::DeaggregatedMsdusCI*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::MsduAggregator::DeaggregatedMsdusCI&')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'ns3::MsduAggregator::EdcaQueues')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >*', 'ns3::MsduAggregator::EdcaQueues*')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >&', 'ns3::MsduAggregator::EdcaQueues&')
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -518,9 +588,6 @@
     module.add_class('QosTxop', import_from_module='ns.wifi', parent=root_module['ns3::Txop'])
     ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
     module.add_class('RegularWifiMac', import_from_module='ns.wifi', parent=root_module['ns3::WifiMac'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RegularWifiMac::ForwardUpCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RegularWifiMac::ForwardUpCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RegularWifiMac::ForwardUpCallback&')
     ## ssid.h (module 'wifi'): ns3::Ssid [class]
     module.add_class('Ssid', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## ssid.h (module 'wifi'): ns3::SsidChecker [class]
@@ -555,8 +622,18 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, unsigned short, unsigned int, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'bool', 'ns3::Ptr<ns3::Packet>', 'ns3::Mac48Address', 'ns3::Mac48Address', 'unsigned short', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -567,6 +644,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -577,8 +656,16 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::dot11s::RouteChange, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::dot11s::RouteChange', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -591,23 +678,38 @@
     module.add_class('MeshPointDevice', parent=root_module['ns3::NetDevice'])
     ## mesh-wifi-interface-mac.h (module 'mesh'): ns3::MeshWifiInterfaceMac [class]
     module.add_class('MeshWifiInterfaceMac', parent=root_module['ns3::RegularWifiMac'])
+    module.add_container('std::list< ns3::BlockAckReqType >', 'ns3::BlockAckReqType', container_type='list')
+    module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
+    module.add_container('std::vector< std::pair< short, short > >', 'std::pair< short, short >', container_type='vector')
+    module.add_container('std::vector< ns3::HeRu::RuSpec >', 'ns3::HeRu::RuSpec', container_type='vector')
+    module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
+    module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
+    module.add_container('std::map< unsigned short, ns3::HeMuUserInfo >', ('short unsigned int', 'ns3::HeMuUserInfo'), container_type='map')
+    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
+    module.add_container('std::list< ns3::WifiMacQueueItem::QueueIteratorPair >', 'ns3::WifiMacQueueItem::QueueIteratorPair', container_type='list')
     module.add_container('std::vector< ns3::WifiRemoteStation * >', 'ns3::WifiRemoteStation *', container_type='vector')
     module.add_container('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationState *', container_type='vector')
-    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('ns3::MsduAggregator::DeaggregatedMsdus', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('ns3::MsduAggregator::EdcaQueues', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('std::map< ns3::Mac48Address, bool >', ('ns3::Mac48Address', 'bool'), container_type='map')
-    module.add_container('std::list< ns3::Ptr< ns3::WifiMacQueueItem > >', 'ns3::Ptr< ns3::WifiMacQueueItem >', container_type='list')
+    module.add_container('std::set< unsigned char >', 'unsigned char', container_type='set')
+    module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
+    module.add_container('std::set< ns3::Mac48Address >', 'ns3::Mac48Address', container_type='set')
     module.add_container('std::vector< ns3::Ptr< ns3::NetDevice > >', 'ns3::Ptr< ns3::NetDevice >', container_type='vector')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
+    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
+    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
     typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
@@ -754,10 +856,6 @@
     module.add_class('HwmpProtocol', parent=root_module['ns3::MeshL2RoutingProtocol'])
     ## hwmp-protocol.h (module 'mesh'): ns3::dot11s::HwmpProtocol::FailedDestination [struct]
     module.add_class('FailedDestination', outer_class=root_module['ns3::dot11s::HwmpProtocol'])
-    typehandlers.add_type_alias('ns3::dot11s::HwmpProtocol::FailedDestination', 'ns3::dot11s::HwmpProtocol::FailedDestination')
-    typehandlers.add_type_alias('ns3::dot11s::HwmpProtocol::FailedDestination*', 'ns3::dot11s::HwmpProtocol::FailedDestination*')
-    typehandlers.add_type_alias('ns3::dot11s::HwmpProtocol::FailedDestination&', 'ns3::dot11s::HwmpProtocol::FailedDestination&')
-    module.add_typedef(root_module['ns3::dot11s::HwmpProtocol::FailedDestination'], 'FailedDestination')
     ## hwmp-rtable.h (module 'mesh'): ns3::dot11s::HwmpRtable [class]
     module.add_class('HwmpRtable', parent=root_module['ns3::Object'])
     ## hwmp-rtable.h (module 'mesh'): ns3::dot11s::HwmpRtable::LookupResult [struct]
@@ -778,10 +876,6 @@
     module.add_class('IeLinkMetricReport', parent=root_module['ns3::WifiInformationElement'])
     ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshId [class]
     module.add_class('IeMeshId', parent=root_module['ns3::WifiInformationElement'])
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdChecker [class]
-    module.add_class('IeMeshIdChecker', parent=root_module['ns3::AttributeChecker'])
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdValue [class]
-    module.add_class('IeMeshIdValue', parent=root_module['ns3::AttributeValue'])
     ## ie-dot11s-peer-management.h (module 'mesh'): ns3::dot11s::IePeerManagement [class]
     module.add_class('IePeerManagement', parent=root_module['ns3::WifiInformationElement'])
     ## ie-dot11s-peer-management.h (module 'mesh'): ns3::dot11s::IePeerManagement::Subtype [enumeration]
@@ -859,6 +953,8 @@
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
     register_Ns3Bar_methods(root_module, root_module['ns3::Bar'])
     register_Ns3BlockAckAgreement_methods(root_module, root_module['ns3::BlockAckAgreement'])
+    register_Ns3BlockAckReqType_methods(root_module, root_module['ns3::BlockAckReqType'])
+    register_Ns3BlockAckType_methods(root_module, root_module['ns3::BlockAckType'])
     register_Ns3BlockAckWindow_methods(root_module, root_module['ns3::BlockAckWindow'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
@@ -886,14 +982,18 @@
     register_Ns3DefaultDeleter__Ns3Dot11sIeBeaconTimingUnit_methods(root_module, root_module['ns3::DefaultDeleter< ns3::dot11s::IeBeaconTimingUnit >'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
+    register_Ns3HeMuUserInfo_methods(root_module, root_module['ns3::HeMuUserInfo'])
+    register_Ns3HeRu_methods(root_module, root_module['ns3::HeRu'])
+    register_Ns3HeRuRuSpec_methods(root_module, root_module['ns3::HeRu::RuSpec'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
-    register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
     register_Ns3MeshHelper_methods(root_module, root_module['ns3::MeshHelper'])
     register_Ns3MeshWifiBeacon_methods(root_module, root_module['ns3::MeshWifiBeacon'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -918,12 +1018,16 @@
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
+    register_Ns3WifiAc_methods(root_module, root_module['ns3::WifiAc'])
+    register_Ns3WifiAddressHash_methods(root_module, root_module['ns3::WifiAddressHash'])
+    register_Ns3WifiAddressTidHash_methods(root_module, root_module['ns3::WifiAddressTidHash'])
     register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
     register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
     register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
     register_Ns3WifiRemoteStationInfo_methods(root_module, root_module['ns3::WifiRemoteStationInfo'])
     register_Ns3WifiRemoteStationState_methods(root_module, root_module['ns3::WifiRemoteStationState'])
     register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
+    register_Ns3WifiTxVector_methods(root_module, root_module['ns3::WifiTxVector'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
     register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
@@ -962,6 +1066,7 @@
     register_Ns3WifiMac_methods(root_module, root_module['ns3::WifiMac'])
     register_Ns3WifiMacHeader_methods(root_module, root_module['ns3::WifiMacHeader'])
     register_Ns3WifiMacQueueItem_methods(root_module, root_module['ns3::WifiMacQueueItem'])
+    register_Ns3WifiMacQueueItemQueueIteratorPair_methods(root_module, root_module['ns3::WifiMacQueueItem::QueueIteratorPair'])
     register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
     register_Ns3AmsduSubframeHeader_methods(root_module, root_module['ns3::AmsduSubframeHeader'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
@@ -973,7 +1078,6 @@
     register_Ns3CallbackChecker_methods(root_module, root_module['ns3::CallbackChecker'])
     register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
     register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
-    register_Ns3CfParameterSet_methods(root_module, root_module['ns3::CfParameterSet'])
     register_Ns3Channel_methods(root_module, root_module['ns3::Channel'])
     register_Ns3DataRateChecker_methods(root_module, root_module['ns3::DataRateChecker'])
     register_Ns3DataRateValue_methods(root_module, root_module['ns3::DataRateValue'])
@@ -1009,7 +1113,6 @@
     register_Ns3MeshStack_methods(root_module, root_module['ns3::MeshStack'])
     register_Ns3MeshWifiInterfaceMacPlugin_methods(root_module, root_module['ns3::MeshWifiInterfaceMacPlugin'])
     register_Ns3MgtBeaconHeader_methods(root_module, root_module['ns3::MgtBeaconHeader'])
-    register_Ns3MsduAggregator_methods(root_module, root_module['ns3::MsduAggregator'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3Node_methods(root_module, root_module['ns3::Node'])
@@ -1035,18 +1138,28 @@
     register_Ns3BridgeChannel_methods(root_module, root_module['ns3::BridgeChannel'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Bool_Ns3Ptr__lt__ns3Packet__gt___Ns3Mac48Address_Ns3Mac48Address_Unsigned_short_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, bool, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, unsigned short, unsigned int, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Dot11sRouteChange_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::dot11s::RouteChange, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3Dot11sStack_methods(root_module, root_module['ns3::Dot11sStack'])
@@ -1069,8 +1182,6 @@
     register_Ns3Dot11sIeConfiguration_methods(root_module, root_module['ns3::dot11s::IeConfiguration'])
     register_Ns3Dot11sIeLinkMetricReport_methods(root_module, root_module['ns3::dot11s::IeLinkMetricReport'])
     register_Ns3Dot11sIeMeshId_methods(root_module, root_module['ns3::dot11s::IeMeshId'])
-    register_Ns3Dot11sIeMeshIdChecker_methods(root_module, root_module['ns3::dot11s::IeMeshIdChecker'])
-    register_Ns3Dot11sIeMeshIdValue_methods(root_module, root_module['ns3::dot11s::IeMeshIdValue'])
     register_Ns3Dot11sIePeerManagement_methods(root_module, root_module['ns3::dot11s::IePeerManagement'])
     register_Ns3Dot11sIePeeringProtocol_methods(root_module, root_module['ns3::dot11s::IePeeringProtocol'])
     register_Ns3Dot11sIePerr_methods(root_module, root_module['ns3::dot11s::IePerr'])
@@ -1224,11 +1335,26 @@
     cls.add_constructor([param('ns3::BlockAckAgreement const &', 'arg0')])
     ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::Mac48Address peer, uint8_t tid) [constructor]
     cls.add_constructor([param('ns3::Mac48Address', 'peer'), param('uint8_t', 'tid')])
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckAgreement::GetBlockAckReqType() const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckAgreement::GetBlockAckType() const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [], 
+                   is_const=True)
     ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetBufferSize() const [member function]
     cls.add_method('GetBufferSize', 
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): static std::size_t ns3::BlockAckAgreement::GetDistance(uint16_t seqNumber, uint16_t startingSeqNumber) [member function]
+    cls.add_method('GetDistance', 
+                   'std::size_t', 
+                   [param('uint16_t', 'seqNumber'), param('uint16_t', 'startingSeqNumber')], 
+                   is_static=True)
     ## block-ack-agreement.h (module 'wifi'): ns3::Mac48Address ns3::BlockAckAgreement::GetPeer() const [member function]
     cls.add_method('GetPeer', 
                    'ns3::Mac48Address', 
@@ -1238,7 +1364,7 @@
     cls.add_method('GetStartingSequence', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequenceControl() const [member function]
     cls.add_method('GetStartingSequenceControl', 
                    'uint16_t', 
@@ -1308,6 +1434,38 @@
                    [param('uint16_t', 'timeout')])
     return
 
+def register_Ns3BlockAckReqType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v, uint8_t nSeqControls) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v'), param('uint8_t', 'nSeqControls')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_nSeqControls [variable]
+    cls.add_instance_attribute('m_nSeqControls', 'uint8_t', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckReqType::Variant', is_const=False)
+    return
+
+def register_Ns3BlockAckType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
+    cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckType::Variant', is_const=False)
+    return
+
 def register_Ns3BlockAckWindow_methods(root_module, cls):
     ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow::BlockAckWindow(ns3::BlockAckWindow const & arg0) [constructor]
     cls.add_constructor([param('ns3::BlockAckWindow const &', 'arg0')])
@@ -1321,6 +1479,11 @@
     cls.add_method('At', 
                    'std::vector< bool > reference', 
                    [param('std::size_t', 'distance')])
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
+    cls.add_method('At', 
+                   'std::vector< bool > const_reference', 
+                   [param('std::size_t', 'distance')], 
+                   is_const=True)
     ## block-ack-window.h (module 'wifi'): uint16_t ns3::BlockAckWindow::GetWinEnd() const [member function]
     cls.add_method('GetWinEnd', 
                    'uint16_t', 
@@ -1795,6 +1958,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2072,6 +2243,117 @@
                    [])
     return
 
+def register_Ns3HeMuUserInfo_methods(root_module, cls):
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::HeMuUserInfo(ns3::HeMuUserInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeMuUserInfo const &', 'arg0')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::mcs [variable]
+    cls.add_instance_attribute('mcs', 'ns3::WifiMode', is_const=False)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::nss [variable]
+    cls.add_instance_attribute('nss', 'uint8_t', is_const=False)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo::ru [variable]
+    cls.add_instance_attribute('ru', 'ns3::HeRu::RuSpec', is_const=False)
+    return
+
+def register_Ns3HeRu_methods(root_module, cls):
+    ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu() [constructor]
+    cls.add_constructor([])
+    ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, ns3::HeRu::SubcarrierGroup const & toneRanges) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('ns3::HeRu::SubcarrierGroup const &', 'toneRanges')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuSpec ns3::HeRu::FindOverlappingRu(uint16_t bw, ns3::HeRu::RuSpec referenceRu, ns3::HeRu::RuType searchedRuType) [member function]
+    cls.add_method('FindOverlappingRu', 
+                   'ns3::HeRu::RuSpec', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'referenceRu'), param('ns3::HeRu::RuType', 'searchedRuType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static uint16_t ns3::HeRu::GetBandwidth(ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetBandwidth', 
+                   'uint16_t', 
+                   [param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetCentral26TonesRus', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations, std::size_t & nCentral26TonesRus) [member function]
+    cls.add_method('GetEqualSizedRusForStations', 
+                   'ns3::HeRu::RuType', 
+                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations'), param('std::size_t &', 'nCentral26TonesRus')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetNRus', 
+                   'std::size_t', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetRuType(uint16_t bandwidth) [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [param('uint16_t', 'bandwidth')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetRusOfType', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint16_t bw, ns3::HeRu::RuType ruType, std::size_t phyIndex) [member function]
+    cls.add_method('GetSubcarrierGroup', 
+                   'ns3::HeRu::SubcarrierGroup', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'phyIndex')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::m_heRuSubcarrierGroups [variable]
+    cls.add_static_attribute('m_heRuSubcarrierGroups', 'ns3::HeRu::SubcarrierGroups const', is_const=True)
+    return
+
+def register_Ns3HeRuRuSpec_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
+    cls.add_constructor([])
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuType ruType, std::size_t index, bool primary80MHz) [constructor]
+    cls.add_constructor([param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index'), param('bool', 'primary80MHz')])
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetIndex() const [member function]
+    cls.add_method('GetIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetPhyIndex() const [member function]
+    cls.add_method('GetPhyIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::GetPrimary80MHz() const [member function]
+    cls.add_method('GetPrimary80MHz', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType ns3::HeRu::RuSpec::GetRuType() const [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::IsPhyIndexSet() const [member function]
+    cls.add_method('IsPhyIndexSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): void ns3::HeRu::RuSpec::SetPhyIndex(uint16_t bw, uint8_t p20Index) [member function]
+    cls.add_method('SetPhyIndex', 
+                   'void', 
+                   [param('uint16_t', 'bw'), param('uint8_t', 'p20Index')])
+    return
+
 def register_Ns3Ipv4Address_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2195,6 +2477,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2408,6 +2702,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2483,6 +2782,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2503,6 +2814,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -2717,90 +3033,6 @@
                    is_static=True)
     return
 
-def register_Ns3MacLowTransmissionParameters_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters(ns3::MacLowTransmissionParameters const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacLowTransmissionParameters const &', 'arg0')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters() [constructor]
-    cls.add_constructor([])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableAck() [member function]
-    cls.add_method('DisableAck', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableBlockAckRequest() [member function]
-    cls.add_method('DisableBlockAckRequest', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableNextData() [member function]
-    cls.add_method('DisableNextData', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableRts() [member function]
-    cls.add_method('DisableRts', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableAck() [member function]
-    cls.add_method('EnableAck', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBlockAck(ns3::BlockAckType type) [member function]
-    cls.add_method('EnableBlockAck', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBlockAckRequest(ns3::BlockAckType type) [member function]
-    cls.add_method('EnableBlockAckRequest', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableNextData(uint32_t size) [member function]
-    cls.add_method('EnableNextData', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableRts() [member function]
-    cls.add_method('EnableRts', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::BlockAckType ns3::MacLowTransmissionParameters::GetBlockAckRequestType() const [member function]
-    cls.add_method('GetBlockAckRequestType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::BlockAckType ns3::MacLowTransmissionParameters::GetBlockAckType() const [member function]
-    cls.add_method('GetBlockAckType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): uint32_t ns3::MacLowTransmissionParameters::GetNextPacketSize() const [member function]
-    cls.add_method('GetNextPacketSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::HasNextPacket() const [member function]
-    cls.add_method('HasNextPacket', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendBlockAckRequest() const [member function]
-    cls.add_method('MustSendBlockAckRequest', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendRts() const [member function]
-    cls.add_method('MustSendRts', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitBlockAck() const [member function]
-    cls.add_method('MustWaitBlockAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitNormalAck() const [member function]
-    cls.add_method('MustWaitNormalAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    return
-
 def register_Ns3MeshHelper_methods(root_module, cls):
     ## mesh-helper.h (module 'mesh'): ns3::MeshHelper::MeshHelper(ns3::MeshHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::MeshHelper const &', 'arg0')])
@@ -2828,10 +3060,6 @@
     cls.add_method('ResetStats', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice > const &', 'device')])
-    ## mesh-helper.h (module 'mesh'): void ns3::MeshHelper::SetAckPolicySelectorForAc(ns3::AcIndex ac, std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetAckPolicySelectorForAc', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac'), param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
     ## mesh-helper.h (module 'mesh'): void ns3::MeshHelper::SetMacType(std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetMacType', 
                    'void', 
@@ -3013,7 +3241,7 @@
     cls.add_method('GetStartingSequence', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::InitTxWindow() [member function]
     cls.add_method('InitTxWindow', 
                    'void', 
@@ -3876,8 +4104,55 @@
     cls.add_instance_attribute('supportMsg', 'std::string', is_const=False)
     return
 
+def register_Ns3WifiAc_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(ns3::WifiAc const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAc const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(uint8_t lowTid, uint8_t highTid) [constructor]
+    cls.add_constructor([param('uint8_t', 'lowTid'), param('uint8_t', 'highTid')])
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetHighTid() const [member function]
+    cls.add_method('GetHighTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetLowTid() const [member function]
+    cls.add_method('GetLowTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetOtherTid(uint8_t tid) const [member function]
+    cls.add_method('GetOtherTid', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    return
+
+def register_Ns3WifiAddressHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash(ns3::WifiAddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressHash::operator()(ns3::Mac48Address const & address) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3WifiAddressTidHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash(ns3::WifiAddressTidHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressTidHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressTidHash::operator()(ns3::WifiAddressTidPair const & addressTidPair) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::WifiAddressTidPair const &', 'addressTidPair')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3WifiMode_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
     cls.add_output_stream_operator()
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [constructor]
@@ -3901,10 +4176,10 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector txVector, uint16_t staId=65535) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetDataRate', 
@@ -3931,10 +4206,15 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector txVector) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('uint16_t', 'channelWidth')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -3971,15 +4251,15 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
     return
 
@@ -3988,6 +4268,8 @@
     cls.add_constructor([])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation(ns3::WifiRemoteStation const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRemoteStation const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_rssiAndUpdateTimePair [variable]
+    cls.add_instance_attribute('m_rssiAndUpdateTimePair', 'std::pair< double, ns3::Time >', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_state [variable]
     cls.add_instance_attribute('m_state', 'ns3::WifiRemoteStationState *', is_const=False)
     return
@@ -4023,6 +4305,10 @@
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
     cls.add_instance_attribute('m_channelWidth', 'uint16_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_dsssSupported [variable]
+    cls.add_instance_attribute('m_dsssSupported', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_erpOfdmSupported [variable]
+    cls.add_instance_attribute('m_erpOfdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_guardInterval [variable]
     cls.add_instance_attribute('m_guardInterval', 'uint16_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_heCapabilities [variable]
@@ -4033,6 +4319,8 @@
     cls.add_instance_attribute('m_info', 'ns3::WifiRemoteStationInfo', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint8_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ofdmSupported [variable]
+    cls.add_instance_attribute('m_ofdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
     cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
@@ -4060,6 +4348,208 @@
     cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
     return
 
+def register_Ns3WifiTxVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0, uint16_t length=0) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0'), param('uint16_t', 'length', default_value='0')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & txVector) [constructor]
+    cls.add_constructor([param('ns3::WifiTxVector const &', 'txVector')])
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetBssColor() const [member function]
+    cls.add_method('GetBssColor', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo ns3::WifiTxVector::GetHeMuUserInfo(uint16_t staId) const [member function]
+    cls.add_method('GetHeMuUserInfo', 
+                   'ns3::HeMuUserInfo', 
+                   [param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap const & ns3::WifiTxVector::GetHeMuUserInfoMap() const [member function]
+    cls.add_method('GetHeMuUserInfoMap', 
+                   'ns3::WifiTxVector::HeMuUserInfoMap const &', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap & ns3::WifiTxVector::GetHeMuUserInfoMap() [member function]
+    cls.add_method('GetHeMuUserInfoMap', 
+                   'ns3::WifiTxVector::HeMuUserInfoMap &', 
+                   [])
+    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode(uint16_t staId=65535) const [member function]
+    cls.add_method('GetMode', 
+                   'ns3::WifiMode', 
+                   [param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::GetModeInitialized() const [member function]
+    cls.add_method('GetModeInitialized', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiTxVector::GetModulationClass() const [member function]
+    cls.add_method('GetModulationClass', 
+                   'ns3::WifiModulationClass', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNTx() const [member function]
+    cls.add_method('GetNTx', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNess() const [member function]
+    cls.add_method('GetNess', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNss(uint16_t staId=65535) const [member function]
+    cls.add_method('GetNss', 
+                   'uint8_t', 
+                   [param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNssMax() const [member function]
+    cls.add_method('GetNssMax', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): std::pair<unsigned long, unsigned long> ns3::WifiTxVector::GetNumRusPerHeSigBContentChannel() const [member function]
+    cls.add_method('GetNumRusPerHeSigBContentChannel', 
+                   'std::pair< unsigned long, unsigned long >', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiPreamble ns3::WifiTxVector::GetPreambleType() const [member function]
+    cls.add_method('GetPreambleType', 
+                   'ns3::WifiPreamble', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::HeRu::RuSpec ns3::WifiTxVector::GetRu(uint16_t staId) const [member function]
+    cls.add_method('GetRu', 
+                   'ns3::HeRu::RuSpec', 
+                   [param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetTxPowerLevel() const [member function]
+    cls.add_method('GetTxPowerLevel', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsAggregation() const [member function]
+    cls.add_method('IsAggregation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsDlMu() const [member function]
+    cls.add_method('IsDlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsLdpc() const [member function]
+    cls.add_method('IsLdpc', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsMu() const [member function]
+    cls.add_method('IsMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsStbc() const [member function]
+    cls.add_method('IsStbc', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsUlMu() const [member function]
+    cls.add_method('IsUlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsValid() const [member function]
+    cls.add_method('IsValid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetAggregation(bool aggregation) [member function]
+    cls.add_method('SetAggregation', 
+                   'void', 
+                   [param('bool', 'aggregation')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetBssColor(uint8_t color) [member function]
+    cls.add_method('SetBssColor', 
+                   'void', 
+                   [param('uint8_t', 'color')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetChannelWidth(uint16_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetGuardInterval(uint16_t guardInterval) [member function]
+    cls.add_method('SetGuardInterval', 
+                   'void', 
+                   [param('uint16_t', 'guardInterval')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetHeMuUserInfo(uint16_t staId, ns3::HeMuUserInfo userInfo) [member function]
+    cls.add_method('SetHeMuUserInfo', 
+                   'void', 
+                   [param('uint16_t', 'staId'), param('ns3::HeMuUserInfo', 'userInfo')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLdpc(bool ldpc) [member function]
+    cls.add_method('SetLdpc', 
+                   'void', 
+                   [param('bool', 'ldpc')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
+    cls.add_method('SetMode', 
+                   'void', 
+                   [param('ns3::WifiMode', 'mode')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode, uint16_t staId) [member function]
+    cls.add_method('SetMode', 
+                   'void', 
+                   [param('ns3::WifiMode', 'mode'), param('uint16_t', 'staId')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNTx(uint8_t nTx) [member function]
+    cls.add_method('SetNTx', 
+                   'void', 
+                   [param('uint8_t', 'nTx')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNess(uint8_t ness) [member function]
+    cls.add_method('SetNess', 
+                   'void', 
+                   [param('uint8_t', 'ness')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNss(uint8_t nss) [member function]
+    cls.add_method('SetNss', 
+                   'void', 
+                   [param('uint8_t', 'nss')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNss(uint8_t nss, uint16_t staId) [member function]
+    cls.add_method('SetNss', 
+                   'void', 
+                   [param('uint8_t', 'nss'), param('uint16_t', 'staId')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetPreambleType(ns3::WifiPreamble preamble) [member function]
+    cls.add_method('SetPreambleType', 
+                   'void', 
+                   [param('ns3::WifiPreamble', 'preamble')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetRu(ns3::HeRu::RuSpec ru, uint16_t staId) [member function]
+    cls.add_method('SetRu', 
+                   'void', 
+                   [param('ns3::HeRu::RuSpec', 'ru'), param('uint16_t', 'staId')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
+    cls.add_method('SetStbc', 
+                   'void', 
+                   [param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
+    cls.add_method('SetTxPowerLevel', 
+                   'void', 
+                   [param('uint8_t', 'powerlevel')])
+    return
+
 def register_Ns3Empty_methods(root_module, cls):
     ## empty.h (module 'core'): ns3::empty::empty() [constructor]
     cls.add_constructor([])
@@ -4826,11 +5316,6 @@
                    'ns3::CapabilityInformation', 
                    [], 
                    is_const=True)
-    ## mgt-headers.h (module 'wifi'): ns3::CfParameterSet ns3::MgtProbeResponseHeader::GetCfParameterSet() const [member function]
-    cls.add_method('GetCfParameterSet', 
-                   'ns3::CfParameterSet', 
-                   [], 
-                   is_const=True)
     ## mgt-headers.h (module 'wifi'): ns3::DsssParameterSet ns3::MgtProbeResponseHeader::GetDsssParameterSet() const [member function]
     cls.add_method('GetDsssParameterSet', 
                    'ns3::DsssParameterSet', 
@@ -4928,10 +5413,6 @@
     cls.add_method('SetCapabilities', 
                    'void', 
                    [param('ns3::CapabilityInformation', 'capabilities')])
-    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetCfParameterSet(ns3::CfParameterSet cfParameterSet) [member function]
-    cls.add_method('SetCfParameterSet', 
-                   'void', 
-                   [param('ns3::CfParameterSet', 'cfParameterSet')])
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetDsssParameterSet(ns3::DsssParameterSet dsssParameterSet) [member function]
     cls.add_method('SetDsssParameterSet', 
                    'void', 
@@ -5352,10 +5833,11 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMacLow(ns3::Ptr<ns3::MacLow> const low) [member function]
-    cls.add_method('SetMacLow', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacLow > const', 'low')])
+    ## txop.h (module 'wifi'): ns3::AcIndex ns3::Txop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::SetChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> const manager) [member function]
     cls.add_method('SetChannelAccessManager', 
                    'void', 
@@ -5369,23 +5851,11 @@
     cls.add_method('SetTxMiddle', 
                    'void', 
                    [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxOkCallback(ns3::Txop::TxOk callback) [member function]
-    cls.add_method('SetTxOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxFailedCallback(ns3::Txop::TxFailed callback) [member function]
-    cls.add_method('SetTxFailedCallback', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxDroppedCallback(ns3::Txop::TxDropped callback) [member function]
-    cls.add_method('SetTxDroppedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::MacLow> ns3::Txop::GetLow() const [member function]
-    cls.add_method('GetLow', 
-                   'ns3::Ptr< ns3::MacLow >', 
-                   [], 
-                   is_const=True)
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
     ## txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::Txop::GetWifiMacQueue() const [member function]
     cls.add_method('GetWifiMacQueue', 
                    'ns3::Ptr< ns3::WifiMacQueue >', 
@@ -5427,9 +5897,17 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
-    cls.add_method('NotifyChannelSwitching', 
-                   'void', 
+    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
+    cls.add_method('ResetCw', 
+                   'void', 
+                   [])
+    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
+    cls.add_method('UpdateFailedCw', 
+                   'void', 
+                   [])
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
+                   'void', 
                    [], 
                    is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::NotifySleep() [member function]
@@ -5457,85 +5935,23 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SendCfFrame(ns3::WifiMacType frameType, ns3::Mac48Address addr) [member function]
-    cls.add_method('SendCfFrame', 
-                   'void', 
-                   [param('ns3::WifiMacType', 'frameType'), param('ns3::Mac48Address', 'addr')])
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedCts() [member function]
-    cls.add_method('MissedCts', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotAck() [member function]
-    cls.add_method('GotAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedAck() [member function]
-    cls.add_method('MissedAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotCfEnd() [member function]
-    cls.add_method('GotCfEnd', 
-                   'void', 
-                   [])
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedCfPollResponse(bool expectedCfAck) [member function]
-    cls.add_method('MissedCfPollResponse', 
-                   'void', 
-                   [param('bool', 'expectedCfAck')])
-    ## txop.h (module 'wifi'): void ns3::Txop::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('GotBlockAck', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedBlockAck(uint8_t nMpdus) [member function]
-    cls.add_method('MissedBlockAck', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelAccessed(ns3::Time txopDuration=ns3::Seconds(0)) [member function]
+    cls.add_method('NotifyChannelAccessed', 
                    'void', 
-                   [param('uint8_t', 'nMpdus')], 
+                   [param('ns3::Time', 'txopDuration', default_value='ns3::Seconds(0)')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::StartNextFragment() [member function]
-    cls.add_method('StartNextFragment', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelReleased() [member function]
+    cls.add_method('NotifyChannelReleased', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::Cancel() [member function]
-    cls.add_method('Cancel', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::StartNextPacket() [member function]
-    cls.add_method('StartNextPacket', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::EndTxNoAck() [member function]
-    cls.add_method('EndTxNoAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopRemaining() const [member function]
-    cls.add_method('GetTxopRemaining', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::TerminateTxop() [member function]
-    cls.add_method('TerminateTxop', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): bool ns3::Txop::CanStartNextPolling() const [member function]
-    cls.add_method('CanStartNextPolling', 
-                   'bool', 
-                   [], 
-                   is_const=True)
     ## txop.h (module 'wifi'): int64_t ns3::Txop::AssignStreams(int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsAccessRequested() const [member function]
-    cls.add_method('IsAccessRequested', 
-                   'bool', 
+    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus ns3::Txop::GetAccessStatus() const [member function]
+    cls.add_method('GetAccessStatus', 
+                   'ns3::Txop::ChannelAccessStatus', 
                    [], 
                    is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
@@ -5559,11 +5975,6 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessGranted() [member function]
-    cls.add_method('NotifyAccessGranted', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::NotifyInternalCollision() [member function]
     cls.add_method('NotifyInternalCollision', 
                    'void', 
@@ -5579,31 +5990,21 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::RestartAccessIfNeeded() [member function]
-    cls.add_method('RestartAccessIfNeeded', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::StartAccessIfNeeded() [member function]
     cls.add_method('StartAccessIfNeeded', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
+    ## txop.h (module 'wifi'): void ns3::Txop::RequestAccess() [member function]
+    cls.add_method('RequestAccess', 
+                   'void', 
+                   [], 
+                   visibility='protected')
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetCw() const [member function]
     cls.add_method('GetCw', 
                    'uint32_t', 
                    [], 
                    is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
-    cls.add_method('ResetCw', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
-    cls.add_method('UpdateFailedCw', 
-                   'void', 
-                   [], 
-                   visibility='protected')
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetBackoffSlots() const [member function]
     cls.add_method('GetBackoffSlots', 
                    'uint32_t', 
@@ -5619,56 +6020,6 @@
                    'void', 
                    [param('uint32_t', 'nSlots'), param('ns3::Time', 'backoffUpdateBound')], 
                    visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedRtsRetransmission(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('NeedRtsRetransmission', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedDataRetransmission(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('NeedDataRetransmission', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedFragmentation() const [member function]
-    cls.add_method('NeedFragmentation', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NextFragment() [member function]
-    cls.add_method('NextFragment', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::Txop::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
-    cls.add_method('GetFragmentPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('ns3::WifiMacHeader *', 'hdr')], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetNextFragmentSize() const [member function]
-    cls.add_method('GetNextFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetFragmentSize() const [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetFragmentOffset() const [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsLastFragment() const [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::TxDroppedPacket(ns3::Ptr<const ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('TxDroppedPacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item')], 
-                   visibility='protected')
     return
 
 def register_Ns3WifiActionHeader_methods(root_module, cls):
@@ -5773,7 +6124,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -5783,7 +6134,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'i')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -5926,6 +6277,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
     cls.add_method('GetVhtConfiguration', 
                    'ns3::Ptr< ns3::VhtConfiguration >', 
@@ -5975,7 +6331,7 @@
     cls.add_method('SetDevice', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::Callback<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function]
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
@@ -6005,6 +6361,11 @@
                    'void', 
                    [param('ns3::Ssid', 'ssid')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
     cls.add_method('SetWifiPhy', 
                    'void', 
@@ -6032,6 +6393,8 @@
     cls.add_constructor([param('ns3::WifiMacHeader const &', 'arg0')])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader() [constructor]
     cls.add_constructor([])
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader(ns3::WifiMacType type) [constructor]
+    cls.add_constructor([param('ns3::WifiMacType', 'type')])
     ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -6077,6 +6440,11 @@
                    'ns3::WifiMacHeader::QosAckPolicy', 
                    [], 
                    is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosQueueSize() const [member function]
+    cls.add_method('GetQosQueueSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosTid() const [member function]
     cls.add_method('GetQosTid', 
                    'uint8_t', 
@@ -6292,6 +6660,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsTrigger() const [member function]
+    cls.add_method('IsTrigger', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -6394,6 +6767,10 @@
     cls.add_method('SetQosNoMeshControlPresent', 
                    'void', 
                    [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosQueueSize(uint8_t size) [member function]
+    cls.add_method('SetQosQueueSize', 
+                   'void', 
+                   [param('uint8_t', 'size')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTid(uint8_t tid) [member function]
     cls.add_method('SetQosTid', 
                    'void', 
@@ -6451,11 +6828,21 @@
                    'ns3::Ptr< ns3::Packet const >', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetPacketSize() const [member function]
+    cls.add_method('GetPacketSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiMacQueueItem::GetProtocolDataUnit() const [member function]
     cls.add_method('GetProtocolDataUnit', 
                    'ns3::Ptr< ns3::Packet >', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): std::list<ns3::WifiMacQueueItem::QueueIteratorPair, std::allocator<ns3::WifiMacQueueItem::QueueIteratorPair> > const & ns3::WifiMacQueueItem::GetQueueIteratorPairs() const [member function]
+    cls.add_method('GetQueueIteratorPairs', 
+                   'std::list< ns3::WifiMacQueueItem::QueueIteratorPair > const &', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
     cls.add_method('GetSize', 
                    'uint32_t', 
@@ -6466,21 +6853,42 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsFragment() const [member function]
+    cls.add_method('IsFragment', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
+    cls.add_method('IsQueued', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::MsduAggregator::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
     cls.add_method('begin', 
-                   'ns3::MsduAggregator::DeaggregatedMsdusCI', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
                    [])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::MsduAggregator::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
     cls.add_method('end', 
-                   'ns3::MsduAggregator::DeaggregatedMsdusCI', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
                    [])
     return
 
+def register_Ns3WifiMacQueueItemQueueIteratorPair_methods(root_module, cls):
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::QueueIteratorPair() [constructor]
+    cls.add_constructor([])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::QueueIteratorPair(ns3::WifiMacQueueItem::QueueIteratorPair const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiMacQueueItem::QueueIteratorPair const &', 'arg0')])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::it [variable]
+    cls.add_instance_attribute('it', 'ns3::WifiMacQueueItem::ConstIterator', is_const=False)
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::queue [variable]
+    cls.add_instance_attribute('queue', 'ns3::WifiMacQueue *', is_const=False)
+    return
+
 def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
     ## wifi-remote-station-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiRemoteStationManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -6499,6 +6907,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
                    is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): int64_t ns3::WifiRemoteStationManager::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
     cls.add_method('SetMaxSsrc', 
                    'void', 
@@ -6520,10 +6933,6 @@
     cls.add_method('SetFragmentationThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
-    cls.add_method('UpdateFragmentationThreshold', 
-                   'void', 
-                   [])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
     cls.add_method('SetQosSupport', 
                    'void', 
@@ -6567,20 +6976,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetPcfSupported(bool enable) [member function]
-    cls.add_method('SetPcfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetPcfSupported() const [member function]
-    cls.add_method('GetPcfSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported() const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported() const [member function]
     cls.add_method('GetLdpcSupported', 
                    'bool', 
@@ -6614,15 +7009,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseGreenfieldProtection(bool enable) [member function]
-    cls.add_method('SetUseGreenfieldProtection', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseGreenfieldProtection() const [member function]
-    cls.add_method('GetUseGreenfieldProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortPreambleEnabled(bool enable) [member function]
     cls.add_method('SetShortPreambleEnabled', 
                    'void', 
@@ -6674,11 +7060,6 @@
                    'ns3::WifiMode', 
                    [param('uint8_t', 'i')], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported(ns3::Mac48Address address) const [member function]
     cls.add_method('GetLdpcSupported', 
                    'bool', 
@@ -6742,6 +7123,21 @@
                    'uint8_t', 
                    [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetDsssSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetErpOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetErpOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::Mac48Address address) const [member function]
     cls.add_method('GetHtSupported', 
                    'bool', 
@@ -6825,42 +7221,62 @@
     cls.add_method('GetRtsTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsTxVector(ns3::Mac48Address to, ns3::WifiMode rtsTxMode) const [member function]
+    cls.add_method('GetCtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiMode', 'rtsTxMode')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector() [member function]
     cls.add_method('GetCtsToSelfTxVector', 
                    'ns3::WifiTxVector', 
                    [])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetBlockAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetBlockAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetControlAnswerMode(ns3::WifiMode reqMode) const [member function]
+    cls.add_method('GetControlAnswerMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'reqMode')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::WifiMacHeader const & header) [member function]
     cls.add_method('ReportRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('ReportDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::WifiMacHeader const & header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
     cls.add_method('ReportRtsOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector, uint32_t packetSize) [member function]
+                   [param('ns3::WifiMacHeader const &', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
     cls.add_method('ReportDataOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::WifiMacHeader const & header) [member function]
     cls.add_method('ReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('ReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
     cls.add_method('ReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, double rxSnr, ns3::WifiMode txMode) [member function]
+                   [param('ns3::Mac48Address', 'address'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
     cls.add_method('ReportRxOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')])
+                   [param('ns3::Mac48Address', 'address'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::WifiMacHeader const & header, uint32_t size) [member function]
     cls.add_method('NeedRts', 
                    'bool', 
@@ -6869,26 +7285,26 @@
     cls.add_method('NeedCtsToSelf', 
                    'bool', 
                    [param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NeedRetransmission', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NeedFragmentation', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
     cls.add_method('GetFragmentSize', 
                    'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
     cls.add_method('GetFragmentOffset', 
                    'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
     cls.add_method('IsLastFragment', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
     ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
     cls.add_method('GetDefaultTxPowerLevel', 
                    'uint8_t', 
@@ -6898,6 +7314,11 @@
     cls.add_method('GetInfo', 
                    'ns3::WifiRemoteStationInfo', 
                    [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): double ns3::WifiRemoteStationManager::GetMostRecentRssi(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetMostRecentRssi', 
+                   'double', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
     cls.add_method('SetDefaultTxPowerLevel', 
                    'void', 
@@ -6912,16 +7333,21 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseGreenfieldForDestination(ns3::Mac48Address dest) const [member function]
-    cls.add_method('UseGreenfieldForDestination', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseLdpcForDestination(ns3::Mac48Address dest) const [member function]
     cls.add_method('UseLdpcForDestination', 
                    'bool', 
                    [param('ns3::Mac48Address', 'dest')], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
+    cls.add_method('GetPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
+    cls.add_method('GetMac', 
+                   'ns3::Ptr< ns3::WifiMac >', 
+                   [], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
@@ -7004,11 +7430,6 @@
                    'bool', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetGreenfield', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetNumberOfSupportedStreams', 
                    'uint8_t', 
@@ -7019,16 +7440,6 @@
                    'uint8_t', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
-    cls.add_method('GetMac', 
-                   'ns3::Ptr< ns3::WifiMac >', 
-                   [], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
     cls.add_method('DoNeedRts', 
                    'bool', 
@@ -7094,10 +7505,10 @@
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
                    is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
     cls.add_method('DoReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
                    is_virtual=True, visibility='private')
     return
 
@@ -7286,18 +7697,18 @@
     cls.add_method('DestroyAgreement', 
                    'void', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient, uint16_t startingSeq) [member function]
     cls.add_method('UpdateAgreement', 
                    'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient'), param('uint16_t', 'startingSeq')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::StorePacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('StorePacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true) [member function]
+    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
     cls.add_method('GetBar', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('bool', 'remove', default_value='true')])
+                   [param('bool', 'remove', default_value='true'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
     ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasPackets() [member function]
     cls.add_method('HasPackets', 
                    'bool', 
@@ -7310,10 +7721,10 @@
     cls.add_method('NotifyMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, double rxSnr, double dataSnr, ns3::WifiTxVector const & dataTxVector, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
                    'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector const &', 'dataTxVector'), param('size_t', 'index', default_value='0')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('NotifyMissedBlockAck', 
                    'void', 
@@ -7355,14 +7766,6 @@
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueue > const', 'queue')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
-    cls.add_method('SetTxMiddle', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckType(ns3::BlockAckType bAckType) [member function]
-    cls.add_method('SetBlockAckType', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'bAckType')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckInactivityCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
     cls.add_method('SetBlockAckInactivityCallback', 
                    'void', 
@@ -7388,6 +7791,16 @@
                    'uint16_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
                    is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckManager::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckManager::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
     ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetOriginatorStartingSequence(ns3::Mac48Address recipient, uint8_t tid) const [member function]
     cls.add_method('GetOriginatorStartingSequence', 
                    'uint16_t', 
@@ -7396,11 +7809,11 @@
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxOkCallback(ns3::BlockAckManager::TxOk callback) [member function]
     cls.add_method('SetTxOkCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxFailedCallback(ns3::BlockAckManager::TxFailed callback) [member function]
     cls.add_method('SetTxFailedCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyDiscardedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NotifyDiscardedMpdu', 
                    'void', 
@@ -7533,6 +7946,21 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['unsigned long'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -7543,12 +7971,17 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -7558,6 +7991,21 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::Packet> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -7594,84 +8042,6 @@
                    [param('ns3::CallbackBase', 'base')])
     return
 
-def register_Ns3CfParameterSet_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## cf-parameter-set.h (module 'wifi'): ns3::CfParameterSet::CfParameterSet(ns3::CfParameterSet const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CfParameterSet const &', 'arg0')])
-    ## cf-parameter-set.h (module 'wifi'): ns3::CfParameterSet::CfParameterSet() [constructor]
-    cls.add_constructor([])
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::CfParameterSet::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::GetCFPCount() const [member function]
-    cls.add_method('GetCFPCount', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint64_t ns3::CfParameterSet::GetCFPDurRemainingUs() const [member function]
-    cls.add_method('GetCFPDurRemainingUs', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint64_t ns3::CfParameterSet::GetCFPMaxDurationUs() const [member function]
-    cls.add_method('GetCFPMaxDurationUs', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::GetCFPPeriod() const [member function]
-    cls.add_method('GetCFPPeriod', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): uint16_t ns3::CfParameterSet::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::CfParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPCount(uint8_t count) [member function]
-    cls.add_method('SetCFPCount', 
-                   'void', 
-                   [param('uint8_t', 'count')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPDurRemainingUs(uint64_t durRemaining) [member function]
-    cls.add_method('SetCFPDurRemainingUs', 
-                   'void', 
-                   [param('uint64_t', 'durRemaining')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPMaxDurationUs(uint64_t maxDuration) [member function]
-    cls.add_method('SetCFPMaxDurationUs', 
-                   'void', 
-                   [param('uint64_t', 'maxDuration')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPPeriod(uint8_t period) [member function]
-    cls.add_method('SetCFPPeriod', 
-                   'void', 
-                   [param('uint8_t', 'period')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetPcfSupported(uint8_t pcfSupported) [member function]
-    cls.add_method('SetPcfSupported', 
-                   'void', 
-                   [param('uint8_t', 'pcfSupported')])
-    return
-
 def register_Ns3Channel_methods(root_module, cls):
     ## channel.h (module 'network'): ns3::Channel::Channel(ns3::Channel const & arg0) [constructor]
     cls.add_constructor([param('ns3::Channel const &', 'arg0')])
@@ -7796,12 +8166,12 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## dsss-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::DsssParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -7886,7 +8256,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetViAifsn() const [member function]
     cls.add_method('GetViAifsn', 
                    'uint8_t', 
@@ -7936,7 +8306,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8241,7 +8611,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetUseProtection() const [member function]
     cls.add_method('GetUseProtection', 
                    'uint8_t', 
@@ -8251,7 +8621,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8364,12 +8734,12 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## extended-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8443,12 +8813,12 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## supported-rates.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedSupportedRatesIE::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## supported-rates.h (module 'wifi'): void ns3::ExtendedSupportedRatesIE::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8540,7 +8910,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSupportedMcsAndNss() const [member function]
     cls.add_method('GetSupportedMcsAndNss', 
                    'uint16_t', 
@@ -8560,7 +8930,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8653,12 +9023,12 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::HeOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-operation.h (module 'wifi'): void ns3::HeOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8713,11 +9083,6 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
-    cls.add_method('GetGreenfield', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetHtCapabilitiesInfo() const [member function]
     cls.add_method('GetHtCapabilitiesInfo', 
                    'uint16_t', 
@@ -8752,7 +9117,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval20() const [member function]
     cls.add_method('GetShortGuardInterval20', 
                    'uint8_t', 
@@ -8787,7 +9152,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -8805,10 +9170,6 @@
     cls.add_method('SetExtendedHtCapabilities', 
                    'void', 
                    [param('uint16_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
-    cls.add_method('SetGreenfield', 
-                   'void', 
-                   [param('uint8_t', 'greenfield')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtCapabilitiesInfo(uint16_t ctrl) [member function]
     cls.add_method('SetHtCapabilitiesInfo', 
                    'void', 
@@ -8989,7 +9350,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetStaChannelWidth() const [member function]
     cls.add_method('GetStaChannelWidth', 
                    'uint8_t', 
@@ -9029,7 +9390,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -9490,47 +9851,6 @@
                    is_static=True)
     return
 
-def register_Ns3MsduAggregator_methods(root_module, cls):
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator(ns3::MsduAggregator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MsduAggregator const &', 'arg0')])
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator() [constructor]
-    cls.add_constructor([])
-    ## msdu-aggregator.h (module 'wifi'): static uint8_t ns3::MsduAggregator::CalculatePadding(uint16_t amsduSize) [member function]
-    cls.add_method('CalculatePadding', 
-                   'uint8_t', 
-                   [param('uint16_t', 'amsduSize')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): static ns3::MsduAggregator::DeaggregatedMsdus ns3::MsduAggregator::Deaggregate(ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
-    cls.add_method('Deaggregate', 
-                   'ns3::MsduAggregator::DeaggregatedMsdus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): uint16_t ns3::MsduAggregator::GetMaxAmsduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
-    cls.add_method('GetMaxAmsduSize', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
-                   is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::MsduAggregator::GetNextAmsdu(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiTxVector txVector, uint32_t ampduSize=0, ns3::Time ppduDurationLimit=ns3::Time::Min()) const [member function]
-    cls.add_method('GetNextAmsdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize', default_value='0'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')], 
-                   is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): static uint16_t ns3::MsduAggregator::GetSizeIfAggregated(uint16_t msduSize, uint16_t amsduSize) [member function]
-    cls.add_method('GetSizeIfAggregated', 
-                   'uint16_t', 
-                   [param('uint16_t', 'msduSize'), param('uint16_t', 'amsduSize')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MsduAggregator::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::SetEdcaQueues(ns3::MsduAggregator::EdcaQueues map) [member function]
-    cls.add_method('SetEdcaQueues', 
-                   'void', 
-                   [param('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'map')])
-    return
-
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -10035,8 +10355,6 @@
     return
 
 def register_Ns3QosTxop_methods(root_module, cls):
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::m_aMpduEnabled [variable]
-    cls.add_instance_attribute('m_aMpduEnabled', 'std::map< ns3::Mac48Address, bool >', is_const=False)
     ## qos-txop.h (module 'wifi'): static ns3::TypeId ns3::QosTxop::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -10049,6 +10367,11 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): ns3::AcIndex ns3::QosTxop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
     cls.add_method('SetWifiRemoteStationManager', 
                    'void', 
@@ -10059,89 +10382,39 @@
                    'bool', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyAccessGranted() [member function]
-    cls.add_method('NotifyAccessGranted', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyInternalCollision() [member function]
     cls.add_method('NotifyInternalCollision', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAck() [member function]
-    cls.add_method('GotAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('GotBlockAck', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::MissedBlockAck(uint8_t nMpdus) [member function]
-    cls.add_method('MissedBlockAck', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
+    cls.add_method('NotifyChannelAccessed', 
                    'void', 
-                   [param('uint8_t', 'nMpdus')], 
+                   [param('ns3::Time', 'txopDuration')], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::MissedAck() [member function]
-    cls.add_method('MissedAck', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelReleased() [member function]
+    cls.add_method('NotifyChannelReleased', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartNextPacket() [member function]
-    cls.add_method('StartNextPacket', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
                    'void', 
-                   [], 
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::EndTxNoAck() [member function]
-    cls.add_method('EndTxNoAck', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosFrameExchangeManager(ns3::Ptr<ns3::QosFrameExchangeManager> const qosFem) [member function]
+    cls.add_method('SetQosFrameExchangeManager', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::RestartAccessIfNeeded() [member function]
-    cls.add_method('RestartAccessIfNeeded', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartAccessIfNeeded() [member function]
-    cls.add_method('StartAccessIfNeeded', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetTxopRemaining() const [member function]
-    cls.add_method('GetTxopRemaining', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::NeedFragmentation() const [member function]
-    cls.add_method('NeedFragmentation', 
+                   [param('ns3::Ptr< ns3::QosFrameExchangeManager > const', 'qosFem')])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::UseExplicitBarAfterMissedBlockAck() const [member function]
+    cls.add_method('UseExplicitBarAfterMissedBlockAck', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::QosTxop::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
-    cls.add_method('GetFragmentPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('ns3::WifiMacHeader *', 'hdr')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAckPolicySelector(ns3::Ptr<ns3::WifiAckPolicySelector> ackSelector) [member function]
-    cls.add_method('SetAckPolicySelector', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiAckPolicySelector >', 'ackSelector')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiAckPolicySelector> ns3::QosTxop::GetAckPolicySelector() const [member function]
-    cls.add_method('GetAckPolicySelector', 
-                   'ns3::Ptr< ns3::WifiAckPolicySelector >', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')])
-    ## qos-txop.h (module 'wifi'): ns3::TypeOfStation ns3::QosTxop::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
-                   [], 
                    is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::BlockAckManager> ns3::QosTxop::GetBaManager() [member function]
+    cls.add_method('GetBaManager', 
+                   'ns3::Ptr< ns3::BlockAckManager >', 
+                   [])
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetBaAgreementEstablished(ns3::Mac48Address address, uint8_t tid) const [member function]
     cls.add_method('GetBaAgreementEstablished', 
                    'bool', 
@@ -10157,6 +10430,16 @@
                    'uint16_t', 
                    [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
                    is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::BlockAckReqType ns3::QosTxop::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::BlockAckType ns3::QosTxop::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PrepareBlockAckRequest(ns3::Mac48Address recipient, uint8_t tid) const [member function]
     cls.add_method('PrepareBlockAckRequest', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
@@ -10166,10 +10449,6 @@
     cls.add_method('ScheduleBar', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyMissedCts(std::list<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [member function]
-    cls.add_method('NotifyMissedCts', 
-                   'void', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAddBaResponse(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
     cls.add_method('GotAddBaResponse', 
                    'void', 
@@ -10178,10 +10457,14 @@
     cls.add_method('GotDelBaFrame', 
                    'void', 
                    [param('ns3::MgtDelBaHeader const *', 'delBaHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::NeedBarRetransmission() [member function]
-    cls.add_method('NeedBarRetransmission', 
-                   'bool', 
-                   [])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AddBaResponseTimeout(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('AddBaResponseTimeout', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ResetBa(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('ResetBa', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAccessCategory(ns3::AcIndex ac) [member function]
     cls.add_method('SetAccessCategory', 
                    'void', 
@@ -10190,10 +10473,6 @@
     cls.add_method('PushFront', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteConfig() [member function]
-    cls.add_method('CompleteConfig', 
-                   'void', 
-                   [])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckThreshold(uint8_t threshold) [member function]
     cls.add_method('SetBlockAckThreshold', 
                    'void', 
@@ -10207,23 +10486,15 @@
     cls.add_method('SetBlockAckInactivityTimeout', 
                    'void', 
                    [param('uint16_t', 'timeout')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
-    cls.add_method('SendDelbaFrame', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteMpduTx(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('CompleteMpduTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetAmpduExist(ns3::Mac48Address dest) const [member function]
-    cls.add_method('GetAmpduExist', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBlockAckInactivityTimeout() const [member function]
+    cls.add_method('GetBlockAckInactivityTimeout', 
+                   'uint16_t', 
+                   [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAmpduExist(ns3::Mac48Address dest, bool enableAmpdu) [member function]
-    cls.add_method('SetAmpduExist', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteMpduTx(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('CompleteMpduTx', 
                    'void', 
-                   [param('ns3::Mac48Address', 'dest'), param('bool', 'enableAmpdu')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAddBaResponseTimeout(ns3::Time addBaResponseTimeout) [member function]
     cls.add_method('SetAddBaResponseTimeout', 
                    'void', 
@@ -10250,76 +10521,49 @@
     cls.add_method('PeekNextSequenceNumberFor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextFrame(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextFrame', 
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('PeekNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
                    [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::DequeuePeekedFrame(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxVector txVector, bool aggregate=true, uint32_t ampduSize=0, ns3::Time ppduDurationLimit=ns3::Time::Min()) [member function]
-    cls.add_method('DequeuePeekedFrame', 
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::QueueIteratorPair queueIt, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('PeekNextMpdu', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::WifiMacQueueItem::QueueIteratorPair', 'queueIt'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame, ns3::WifiMacQueueItem::QueueIteratorPair & queueIt) [member function]
+    cls.add_method('GetNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxVector', 'txVector'), param('bool', 'aggregate', default_value='true'), param('uint32_t', 'ampduSize', default_value='0'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')])
-    ## qos-txop.h (module 'wifi'): ns3::MacLowTransmissionParameters ns3::QosTxop::GetTransmissionParameters(ns3::Ptr<const ns3::WifiMacQueueItem> frame) const [member function]
-    cls.add_method('GetTransmissionParameters', 
-                   'ns3::MacLowTransmissionParameters', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'frame')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::QueueIteratorPair &', 'queueIt')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AssignSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('AssignSequenceNumber', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::UpdateCurrentPacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('UpdateCurrentPacket', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosQueueSize(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('SetQosQueueSize', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::BaTxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('BaTxOk', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::BaTxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('BaTxFailed', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Mac48Address ns3::QosTxop::MapSrcAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('MapSrcAddressForAggregation', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Mac48Address ns3::QosTxop::MapDestAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('MapDestAddressForAggregation', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsTxopStarted() const [member function]
+    cls.add_method('IsTxopStarted', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetRemainingTxop() const [member function]
+    cls.add_method('GetRemainingTxop', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::QosTxop const & arg0) [constructor]
     cls.add_constructor([param('ns3::QosTxop const &', 'arg0')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='private')
+                   is_virtual=True, visibility='protected')
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::TerminateTxop() [member function]
-    cls.add_method('TerminateTxop', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetNextFragmentSize() const [member function]
-    cls.add_method('GetNextFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetFragmentSize() const [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetFragmentOffset() const [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsLastFragment() const [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3RegularWifiMac_methods(root_module, cls):
@@ -10405,7 +10649,12 @@
                    'void', 
                    [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::RegularWifiMac::ForwardUpCallback upCallback) [member function]
+    ## regular-wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::RegularWifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
@@ -10420,11 +10669,21 @@
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
                    is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
+    cls.add_method('GetWifiRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
     cls.add_method('Enqueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::RegularWifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
     cls.add_method('SetCtsToSelfSupported', 
                    'void', 
@@ -10433,11 +10692,21 @@
     cls.add_method('SetBssid', 
                    'void', 
                    [param('ns3::Mac48Address', 'bssid')])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
                    [], 
-                   is_const=True, is_virtual=True)
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
     cls.add_method('GetExtendedCapabilities', 
                    'ns3::ExtendedCapabilities', 
@@ -10468,11 +10737,11 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
-    cls.add_method('GetTxop', 
-                   'ns3::Ptr< ns3::Txop >', 
-                   [], 
-                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_virtual=True, visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
     cls.add_method('GetVOQueue', 
                    'ns3::Ptr< ns3::QosTxop >', 
@@ -10498,26 +10767,11 @@
                    'void', 
                    [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
                    visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('Receive', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxOk', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxFailed', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
     cls.add_method('ForwardUp', 
                    'void', 
@@ -10528,11 +10782,6 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SendAddBaResponse(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address originator) [member function]
-    cls.add_method('SendAddBaResponse', 
-                   'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'originator')], 
-                   visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
     cls.add_method('SetQosSupported', 
                    'void', 
@@ -10543,6 +10792,11 @@
                    'bool', 
                    [], 
                    is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetupFrameExchangeManager() [member function]
+    cls.add_method('SetupFrameExchangeManager', 
+                   'void', 
+                   [], 
+                   visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
     cls.add_method('GetHtSupported', 
                    'bool', 
@@ -10669,8 +10923,8 @@
     cls.add_output_stream_operator()
     ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates() [constructor]
     cls.add_constructor([])
-    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates(ns3::SupportedRates const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SupportedRates const &', 'arg0')])
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates(ns3::SupportedRates const & rates) [constructor]
+    cls.add_constructor([param('ns3::SupportedRates const &', 'rates')])
     ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::AddBssMembershipSelectorRate(uint64_t bs) [member function]
     cls.add_method('AddBssMembershipSelectorRate', 
                    'void', 
@@ -10890,7 +11144,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
     cls.add_method('GetSupportedChannelWidthSet', 
                    'uint8_t', 
@@ -10930,7 +11184,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -11043,12 +11297,12 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -11228,6 +11482,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11250,6 +11526,94 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0, short unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('ns3::WifiTxVector const &', 'arg0'), param('short unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): short unsigned int ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'short unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Bool_Ns3Ptr__lt__ns3Packet__gt___Ns3Mac48Address_Ns3Mac48Address_Unsigned_short_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, unsigned short, unsigned int, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11360,6 +11724,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::WifiMacQueueItem> arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11470,6 +11856,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiMacDropReason arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::WifiMacDropReason', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Ns3Dot11sRouteChange_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::dot11s::RouteChange, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11492,6 +11900,73 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiPsdu> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiPsdu const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * arg2, long unsigned int arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
+    return
+
 def register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -11839,10 +12314,10 @@
     cls.add_method('InstallPlugin', 
                    'void', 
                    [param('ns3::Ptr< ns3::MeshWifiInterfaceMacPlugin >', 'plugin')])
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Report(std::ostream & arg0) const [member function]
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::Report(std::ostream & os) const [member function]
     cls.add_method('Report', 
                    'void', 
-                   [param('std::ostream &', 'arg0')], 
+                   [param('std::ostream &', 'os')], 
                    is_const=True)
     ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::ResetStats() [member function]
     cls.add_method('ResetStats', 
@@ -11869,10 +12344,10 @@
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
                    is_virtual=True)
-    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetMeshPointAddress(ns3::Mac48Address arg0) [member function]
+    ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetMeshPointAddress(ns3::Mac48Address addr) [member function]
     cls.add_method('SetMeshPointAddress', 
                    'void', 
-                   [param('ns3::Mac48Address', 'arg0')])
+                   [param('ns3::Mac48Address', 'addr')])
     ## mesh-wifi-interface-mac.h (module 'mesh'): void ns3::MeshWifiInterfaceMac::SetRandomStartDelay(ns3::Time interval) [member function]
     cls.add_method('SetRandomStartDelay', 
                    'void', 
@@ -12122,10 +12597,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## hwmp-protocol.h (module 'mesh'): bool ns3::dot11s::HwmpProtocol::Install(ns3::Ptr<ns3::MeshPointDevice> arg0) [member function]
+    ## hwmp-protocol.h (module 'mesh'): bool ns3::dot11s::HwmpProtocol::Install(ns3::Ptr<ns3::MeshPointDevice> mp) [member function]
     cls.add_method('Install', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::MeshPointDevice >', 'arg0')])
+                   [param('ns3::Ptr< ns3::MeshPointDevice >', 'mp')])
     ## hwmp-protocol.h (module 'mesh'): void ns3::dot11s::HwmpProtocol::PeerLinkStatus(ns3::Mac48Address meshPontAddress, ns3::Mac48Address peerAddress, uint32_t interface, bool status) [member function]
     cls.add_method('PeerLinkStatus', 
                    'void', 
@@ -12135,10 +12610,10 @@
                    'bool', 
                    [param('uint32_t', 'fromIface'), param('ns3::Mac48Address const', 'source'), param('ns3::Mac48Address const', 'destination'), param('ns3::Ptr< ns3::Packet >', 'packet'), param('uint16_t &', 'protocolType')], 
                    is_virtual=True)
-    ## hwmp-protocol.h (module 'mesh'): void ns3::dot11s::HwmpProtocol::Report(std::ostream & arg0) const [member function]
+    ## hwmp-protocol.h (module 'mesh'): void ns3::dot11s::HwmpProtocol::Report(std::ostream & os) const [member function]
     cls.add_method('Report', 
                    'void', 
-                   [param('std::ostream &', 'arg0')], 
+                   [param('std::ostream &', 'os')], 
                    is_const=True)
     ## hwmp-protocol.h (module 'mesh'): bool ns3::dot11s::HwmpProtocol::RequestRoute(uint32_t sourceIface, ns3::Mac48Address const source, ns3::Mac48Address const destination, ns3::Ptr<const ns3::Packet> packet, uint16_t protocolType, ns3::MeshL2RoutingProtocol::RouteReplyCallback routeReply) [member function]
     cls.add_method('RequestRoute', 
@@ -12514,46 +12989,6 @@
                    is_const=True, is_virtual=True)
     return
 
-def register_Ns3Dot11sIeMeshIdChecker_methods(root_module, cls):
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdChecker::IeMeshIdChecker() [constructor]
-    cls.add_constructor([])
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdChecker::IeMeshIdChecker(ns3::dot11s::IeMeshIdChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::dot11s::IeMeshIdChecker const &', 'arg0')])
-    return
-
-def register_Ns3Dot11sIeMeshIdValue_methods(root_module, cls):
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdValue::IeMeshIdValue() [constructor]
-    cls.add_constructor([])
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdValue::IeMeshIdValue(ns3::dot11s::IeMeshId const & value) [constructor]
-    cls.add_constructor([param('ns3::dot11s::IeMeshId const &', 'value')])
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshIdValue::IeMeshIdValue(ns3::dot11s::IeMeshIdValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::dot11s::IeMeshIdValue const &', 'arg0')])
-    ## ie-dot11s-id.h (module 'mesh'): ns3::Ptr<ns3::AttributeValue> ns3::dot11s::IeMeshIdValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ie-dot11s-id.h (module 'mesh'): bool ns3::dot11s::IeMeshIdValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## ie-dot11s-id.h (module 'mesh'): ns3::dot11s::IeMeshId ns3::dot11s::IeMeshIdValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::dot11s::IeMeshId', 
-                   [], 
-                   is_const=True)
-    ## ie-dot11s-id.h (module 'mesh'): std::string ns3::dot11s::IeMeshIdValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## ie-dot11s-id.h (module 'mesh'): void ns3::dot11s::IeMeshIdValue::Set(ns3::dot11s::IeMeshId const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::dot11s::IeMeshId const &', 'value')])
-    return
-
 def register_Ns3Dot11sIePeerManagement_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     cls.add_output_stream_operator()
@@ -13535,10 +13970,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## peer-management-protocol.h (module 'mesh'): bool ns3::dot11s::PeerManagementProtocol::Install(ns3::Ptr<ns3::MeshPointDevice> arg0) [member function]
+    ## peer-management-protocol.h (module 'mesh'): bool ns3::dot11s::PeerManagementProtocol::Install(ns3::Ptr<ns3::MeshPointDevice> mp) [member function]
     cls.add_method('Install', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::MeshPointDevice >', 'arg0')])
+                   [param('ns3::Ptr< ns3::MeshPointDevice >', 'mp')])
     ## peer-management-protocol.h (module 'mesh'): bool ns3::dot11s::PeerManagementProtocol::IsActiveLink(uint32_t interface, ns3::Mac48Address peerAddress) [member function]
     cls.add_method('IsActiveLink', 
                    'bool', 
@@ -13712,10 +14147,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## flame-protocol.h (module 'mesh'): bool ns3::flame::FlameProtocol::Install(ns3::Ptr<ns3::MeshPointDevice> arg0) [member function]
+    ## flame-protocol.h (module 'mesh'): bool ns3::flame::FlameProtocol::Install(ns3::Ptr<ns3::MeshPointDevice> mp) [member function]
     cls.add_method('Install', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::MeshPointDevice >', 'arg0')])
+                   [param('ns3::Ptr< ns3::MeshPointDevice >', 'mp')])
     ## flame-protocol.h (module 'mesh'): bool ns3::flame::FlameProtocol::RemoveRoutingStuff(uint32_t fromIface, ns3::Mac48Address const source, ns3::Mac48Address const destination, ns3::Ptr<ns3::Packet> packet, uint16_t & protocolType) [member function]
     cls.add_method('RemoveRoutingStuff', 
                    'bool', 
@@ -13896,10 +14331,6 @@
     return
 
 def register_functions_ns3_dot11s(module, root_module):
-    ## ie-dot11s-id.h (module 'mesh'): ns3::Ptr<const ns3::AttributeChecker> ns3::dot11s::MakeIeMeshIdChecker() [free function]
-    module.add_function('MakeIeMeshIdChecker', 
-                        'ns3::Ptr< ns3::AttributeChecker const >', 
-                        [])
     return
 
 def register_functions_ns3_flame(module, root_module):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/helper/mesh-helper.cc ns-3.34/src/mesh/helper/mesh-helper.cc
--- ns-3.33/src/mesh/helper/mesh-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/helper/mesh-helper.cc	2021-07-14 10:31:07.000000000 -0700
@@ -27,7 +27,9 @@
 #include "ns3/minstrel-wifi-manager.h"
 #include "ns3/mesh-wifi-interface-mac.h"
 #include "ns3/wifi-helper.h"
-#include "ns3/wifi-ack-policy-selector.h"
+#include "ns3/frame-exchange-manager.h"
+#include "ns3/wifi-default-protection-manager.h"
+#include "ns3/wifi-default-ack-manager.h"
 
 namespace ns3
 {
@@ -97,11 +99,11 @@
           uint32_t channel = 0;
           if (m_spreadChannelPolicy == ZERO_CHANNEL)
             {
-              channel = 0;
+              channel = 100;
             }
           if (m_spreadChannelPolicy == SPREAD_CHANNELS)
             {
-              channel = i * 5;
+              channel = 100 + i * 5;
             }
           Ptr<WifiNetDevice> iface = CreateInterface (phyHelper, node, channel);
           mp->AddInterface (iface);
@@ -120,10 +122,6 @@
   MeshHelper helper;
   helper.SetMacType ();
   helper.SetRemoteStationManager ("ns3::ArfWifiManager");
-  helper.SetAckPolicySelectorForAc (AC_BE, "ns3::ConstantWifiAckPolicySelector");
-  helper.SetAckPolicySelectorForAc (AC_BK, "ns3::ConstantWifiAckPolicySelector");
-  helper.SetAckPolicySelectorForAc (AC_VI, "ns3::ConstantWifiAckPolicySelector");
-  helper.SetAckPolicySelectorForAc (AC_VO, "ns3::ConstantWifiAckPolicySelector");
   helper.SetSpreadInterfaceChannels (SPREAD_CHANNELS);
   return helper;
 }
@@ -170,28 +168,6 @@
   m_stationManager.Set (n6, v6);
   m_stationManager.Set (n7, v7);
 }
-void
-MeshHelper::SetAckPolicySelectorForAc (AcIndex ac, std::string type,
-                                       std::string n0, const AttributeValue &v0,
-                                       std::string n1, const AttributeValue &v1,
-                                       std::string n2, const AttributeValue &v2,
-                                       std::string n3, const AttributeValue &v3,
-                                       std::string n4, const AttributeValue &v4,
-                                       std::string n5, const AttributeValue &v5,
-                                       std::string n6, const AttributeValue &v6,
-                                       std::string n7, const AttributeValue &v7)
-{
-  m_ackPolicySelector[ac] = ObjectFactory ();
-  m_ackPolicySelector[ac].SetTypeId (type);
-  m_ackPolicySelector[ac].Set (n0, v0);
-  m_ackPolicySelector[ac].Set (n1, v1);
-  m_ackPolicySelector[ac].Set (n2, v2);
-  m_ackPolicySelector[ac].Set (n3, v3);
-  m_ackPolicySelector[ac].Set (n4, v4);
-  m_ackPolicySelector[ac].Set (n5, v5);
-  m_ackPolicySelector[ac].Set (n6, v6);
-  m_ackPolicySelector[ac].Set (n7, v7);
-}
 void 
 MeshHelper::SetStandard (enum WifiStandard standard)
 {
@@ -219,35 +195,24 @@
   Ptr<WifiPhy> phy = phyHelper.Create (node, device);
   mac->SetAddress (Mac48Address::Allocate ());
   mac->ConfigureStandard (m_standard);
+  Ptr<RegularWifiMac> wifiMac = DynamicCast<RegularWifiMac> (mac);
+  Ptr<FrameExchangeManager> fem;
+  if (wifiMac != 0 && (fem = wifiMac->GetFrameExchangeManager ()) != 0)
+    {
+      Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
+      protectionManager->SetWifiMac (wifiMac);
+      fem->SetProtectionManager (protectionManager);
+
+      Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager> ();
+      ackManager->SetWifiMac (wifiMac);
+      fem->SetAckManager (ackManager);
+    }
   phy->ConfigureStandardAndBand (it->second.phyStandard, it->second.phyBand);
   device->SetMac (mac);
   device->SetPhy (phy);
   device->SetRemoteStationManager (manager);
   node->AddDevice (device);
   mac->SwitchFrequencyChannel (channelId);
-  // Install ack policy selector
-  PointerValue ptr;
-  Ptr<WifiAckPolicySelector> ackSelector;
-
-  mac->GetAttributeFailSafe ("BE_Txop", ptr);
-  ackSelector = m_ackPolicySelector[AC_BE].Create<WifiAckPolicySelector> ();
-  ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
-  ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
-
-  mac->GetAttributeFailSafe ("BK_Txop", ptr);
-  ackSelector = m_ackPolicySelector[AC_BK].Create<WifiAckPolicySelector> ();
-  ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
-  ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
-
-  mac->GetAttributeFailSafe ("VI_Txop", ptr);
-  ackSelector = m_ackPolicySelector[AC_VI].Create<WifiAckPolicySelector> ();
-  ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
-  ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
-
-  mac->GetAttributeFailSafe ("VO_Txop", ptr);
-  ackSelector = m_ackPolicySelector[AC_VO].Create<WifiAckPolicySelector> ();
-  ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
-  ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
 
   return device;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/helper/mesh-helper.h ns-3.34/src/mesh/helper/mesh-helper.h
--- ns-3.33/src/mesh/helper/mesh-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/helper/mesh-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -122,38 +122,6 @@
                            std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
                            std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
   /**
-   * \param ac the Access Category to attach the ack policy selector to.
-   * \param type the type of ns3::WifiAckPolicySelector to create.
-   * \param n0 the name of the attribute to set
-   * \param v0 the value of the attribute to set
-   * \param n1 the name of the attribute to set
-   * \param v1 the value of the attribute to set
-   * \param n2 the name of the attribute to set
-   * \param v2 the value of the attribute to set
-   * \param n3 the name of the attribute to set
-   * \param v3 the value of the attribute to set
-   * \param n4 the name of the attribute to set
-   * \param v4 the value of the attribute to set
-   * \param n5 the name of the attribute to set
-   * \param v5 the value of the attribute to set
-   * \param n6 the name of the attribute to set
-   * \param v6 the value of the attribute to set
-   * \param n7 the name of the attribute to set
-   * \param v7 the value of the attribute to set
-   *
-   * All the attributes specified in this method should exist
-   * in the requested ack policy selector.
-   */
-  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 ());
-  /**
    * Set standard
    * \param standard the wifi phy standard
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/dot11s/hwmp-protocol.cc ns-3.34/src/mesh/model/dot11s/hwmp-protocol.cc
--- ns-3.33/src/mesh/model/dot11s/hwmp-protocol.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/dot11s/hwmp-protocol.cc	2021-07-14 10:31:07.000000000 -0700
@@ -92,7 +92,7 @@
                     MakeTimeChecker ()
                     )
     .AddAttribute ( "Dot11MeshHWMPactiveRootTimeout",
-                    "Lifetime of poractive routing information",
+                    "Lifetime of proactive routing information",
                     TimeValue (MicroSeconds (1024*5000)),
                     MakeTimeAccessor (
                       &HwmpProtocol::m_dot11MeshHWMPactiveRootTimeout),
@@ -113,7 +113,7 @@
                     MakeTimeChecker ()
                     )
     .AddAttribute ( "Dot11MeshHWMPrannInterval",
-                    "Lifetime of poractive routing information",
+                    "Lifetime of proactive routing information",
                     TimeValue (MicroSeconds (1024*5000)),
                     MakeTimeAccessor (
                       &HwmpProtocol::m_dot11MeshHWMPrannInterval),
@@ -141,7 +141,7 @@
                     MakeUintegerChecker<uint8_t> (1)
                     )
     .AddAttribute ( "UnicastDataThreshold",
-                    "Maximum number ofbroadcast receivers, when we send a broadcast as a chain of unicasts",
+                    "Maximum number of broadcast receivers, when we send a broadcast as a chain of unicasts",
                     UintegerValue (1),
                     MakeUintegerAccessor (
                       &HwmpProtocol::m_unicastDataThreshold),
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/dot11s/hwmp-protocol.h ns-3.34/src/mesh/model/dot11s/hwmp-protocol.h
--- ns-3.33/src/mesh/model/dot11s/hwmp-protocol.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/dot11s/hwmp-protocol.h	2021-07-14 10:31:07.000000000 -0700
@@ -70,6 +70,7 @@
   HwmpProtocol ();
   ~HwmpProtocol ();
   void DoDispose ();
+
   /**
    * \brief structure of unreachable destination - address and sequence number
    */
@@ -79,7 +80,6 @@
     uint32_t seqnum; ///< sequence number
   };
 
-  typedef struct FailedDestination FailedDestination;
   /**
    * Route request, inherited from MeshL2RoutingProtocol
    *
@@ -107,6 +107,7 @@
                            const Mac48Address destination, Ptr<Packet>  packet, uint16_t&  protocolType);
   /**
    * \brief Install HWMP on given mesh point.
+   * \param mp the MeshPointDevice
    * \returns true if successful
    *
    * Installing protocol causes installation of its interface MAC plugins.
@@ -114,7 +115,7 @@
    * Also MP aggregates all installed protocols, HWMP protocol can be accessed
    * via MeshPointDevice::GetObject<dot11s::HwmpProtocol>();
    */
-  bool Install (Ptr<MeshPointDevice>);
+  bool Install (Ptr<MeshPointDevice> mp);
   /**
    * Peer link status function
    * \param meshPontAddress The MAC address of the mesh point
@@ -128,15 +129,25 @@
    * \param cb is a callback, which returns a list of addresses on given interface (uint32_t)
    */
   void SetNeighboursCallback (Callback<std::vector<Mac48Address>, uint32_t> cb);
-  ///\name Proactive PREQ mechanism:
-  ///\{
+  /// \name Proactive PREQ mechanism:
+  ///@{
+  /// Set the current node as root
   void SetRoot ();
+  /// Unset the current node as root
   void UnsetRoot ();
-  ///\}
-  ///\brief Statistics:
-  void Report (std::ostream &) const;
+  ///@}
+
+  /// \brief Statistics:
+  ///@{
+  /**
+   *  Print statistics counters
+   *  \param os the output stream
+   */
+  void Report (std::ostream & os) const;
   ///\brief Reset Statistics:
   void ResetStats ();
+  ///@}
+
   /**
    * Assign a fixed random variable stream number to the random variables
    * used by this model.  Return the number of streams (possibly zero) that
@@ -166,10 +177,10 @@
    */
   HwmpProtocol& operator= (const HwmpProtocol & hwmp);
   /**
-   * type conversion
-   * \returns the HWMP protocol
+   * Copy constructor - defined but not implemented (on purpose)
+   * \param hwmp the HWMP protocol
    */
-  HwmpProtocol (const HwmpProtocol &);
+  HwmpProtocol (const HwmpProtocol & hwmp);
 
   /**
    * \brief Structure of path error: IePerr and list of receivers:
@@ -208,8 +219,8 @@
   bool ForwardUnicast (uint32_t sourceIface, const Mac48Address source, const Mac48Address destination,
                        Ptr<Packet> packet, uint16_t protocolType, RouteReplyCallback routeReply, uint32_t ttl);
 
-  ///\name Interaction with HWMP MAC plugin
-  //\{
+  /// \name Interaction with HWMP MAC plugin
+  ///@{
   /**
    * \brief Handler for receiving Path Request
    *
@@ -307,23 +318,47 @@
    * \param source is the source address
    */
   bool DropDataFrame (uint32_t seqno, Mac48Address source);
-  //\}
+  ///@}
+
   /// Route discovery time:
   TracedCallback<Time> m_routeDiscoveryTimeCallback;
   /// RouteChangeTracedCallback typedef
   typedef TracedCallback <struct RouteChange> RouteChangeTracedCallback;
   /// Route change trace source
   TracedCallback<struct RouteChange> m_routeChangeTraceSource;
-  ///\name Methods related to Queue/Dequeue procedures
-  ///\{
+
+  // /\name Methods related to Queue/Dequeue procedures
+  ///@{
+  /**
+   * Queue a packet
+   * \param packet the packet to be queued
+   * \return true on success
+   */
   bool QueuePacket (QueuedPacket packet);
+  /**
+   * Dequeue the first packet for a given destination
+   * \param dst the destination
+   * \return the dequeued packet
+   */
   QueuedPacket  DequeueFirstPacketByDst (Mac48Address dst);
+  /**
+   * Dequeue the first packet in the queue
+   * \return the dequeued packet
+   */
   QueuedPacket  DequeueFirstPacket ();
+  /**
+   * Signal the protocol that the reactive path toward a destination is now available
+   * \param dst the destination
+   */
   void ReactivePathResolved (Mac48Address dst);
+  /**
+   * Signal the protocol that the proactive path is now available
+   */
   void ProactivePathResolved ();
-  ///\}
-  ///\name Methods responsible for path discovery retry procedure:
-  ///\{
+  ///@}
+
+  /// \name Methods responsible for path discovery retry procedure:
+  ///@{
   /**
    * \brief checks when the last path discovery procedure was started for a given destination.
    * \return true if should send PREQ
@@ -343,10 +378,12 @@
   void  RetryPathDiscovery (Mac48Address dst, uint8_t numOfRetry);
   /// Proactive Preq routines:
   void SendProactivePreq ();
-  ///\}
+  ///@}
+
   ///\return address of MeshPointDevice
   Mac48Address GetAddress ();
-  ///\name Methods needed by HwmpMacLugin to access protocol parameters:
+  /// \name Methods needed by HwmpMacLugin to access protocol parameters:
+  ///@{
   /**
    * Get do flag function
    * \returns DO flag
@@ -392,6 +429,8 @@
    * \returns the unicast PERR threshold
    */
   uint8_t GetUnicastPerrThreshold ();
+  ///@}
+
 private:
   /// Statistics structure
   struct Statistics
@@ -421,13 +460,13 @@
   uint32_t m_dataSeqno; ///< data sequence no
   uint32_t m_hwmpSeqno; ///< HWMP sequence no
   uint32_t m_preqId; ///< PREQ ID
-  ///\name Sequence number filters
-  ///\{
+  /// \name Sequence number filters
+  ///@{
   /// Data sequence number database
   std::map<Mac48Address, uint32_t> m_lastDataSeqno;
   /// keeps HWMP seqno (first in pair) and HWMP metric (second in pair) for each address
   std::map<Mac48Address, std::pair<uint32_t, uint32_t> > m_hwmpSeqnoMetricDatabase;
-  ///\}
+  ///@}
 
   /// Routing table
   Ptr<HwmpRtable> m_rtable;
@@ -447,24 +486,24 @@
   
   /// \name HWMP-protocol parameters
   /// These are all Attributes
-  /// \{
-  uint16_t m_maxQueueSize;
-  uint8_t m_dot11MeshHWMPmaxPREQretries;
-  Time m_dot11MeshHWMPnetDiameterTraversalTime;
-  Time m_dot11MeshHWMPpreqMinInterval;
-  Time m_dot11MeshHWMPperrMinInterval;
-  Time m_dot11MeshHWMPactiveRootTimeout;
-  Time m_dot11MeshHWMPactivePathTimeout;
-  Time m_dot11MeshHWMPpathToRootInterval;
-  Time m_dot11MeshHWMPrannInterval;
-  bool m_isRoot;
-  uint8_t m_maxTtl;
-  uint8_t m_unicastPerrThreshold;
-  uint8_t m_unicastPreqThreshold;
-  uint8_t m_unicastDataThreshold;
-  bool m_doFlag;
-  bool m_rfFlag;
-  ///\}
+  ///@{
+  uint16_t m_maxQueueSize;                        //!< Maximum number of packets we can store when resolving route
+  uint8_t m_dot11MeshHWMPmaxPREQretries;          //!< Maximum number of retries before we suppose the destination to be unreachable
+  Time m_dot11MeshHWMPnetDiameterTraversalTime;   //!< Time we suppose the packet to go from one edge of the network to another
+  Time m_dot11MeshHWMPpreqMinInterval;            //!< Minimal interval between to successive PREQs
+  Time m_dot11MeshHWMPperrMinInterval;            //!< Minimal interval between to successive PREQs
+  Time m_dot11MeshHWMPactiveRootTimeout;          //!< Lifetime of proactive routing information
+  Time m_dot11MeshHWMPactivePathTimeout;          //!< Lifetime of reactive routing information
+  Time m_dot11MeshHWMPpathToRootInterval;         //!< Interval between two successive proactive PREQs
+  Time m_dot11MeshHWMPrannInterval;               //!< Lifetime of proactive routing information
+  bool m_isRoot;                                  //!< True if the node is a root
+  uint8_t m_maxTtl;                               //!< Initial value of Time To Live field
+  uint8_t m_unicastPerrThreshold;                 //!< Maximum number of PERR receivers, when we send a PERR as a chain of unicasts
+  uint8_t m_unicastPreqThreshold;                 //!< Maximum number of PREQ receivers, when we send a PREQ as a chain of unicasts
+  uint8_t m_unicastDataThreshold;                 //!< Maximum number of broadcast receivers, when we send a broadcast as a chain of unicasts
+  bool m_doFlag;                                  //!< Destination only HWMP flag
+  bool m_rfFlag;                                  //!< Reply and forward flag
+  ///@}
   
   /// Random variable for random start time
   Ptr<UniformRandomVariable> m_coefficient; ///< coefficient
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/dot11s/hwmp-protocol-mac.h ns-3.34/src/mesh/model/dot11s/hwmp-protocol-mac.h
--- ns-3.33/src/mesh/model/dot11s/hwmp-protocol-mac.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/dot11s/hwmp-protocol-mac.h	2021-07-14 10:31:07.000000000 -0700
@@ -31,7 +31,6 @@
 
 namespace dot11s {
 
-class HwmpProtocol;
 class IePreq;
 class IePrep;
 class IePerr;
@@ -52,15 +51,14 @@
    */
   HwmpProtocolMac (uint32_t ifIndex, Ptr<HwmpProtocol> protocol);
   ~HwmpProtocolMac ();
-  ///\name Inherited from MAC plugin
-  //\{
+
+  // Inherited from MAC plugin
   void SetParent (Ptr<MeshWifiInterfaceMac> parent);
   bool Receive (Ptr<Packet> packet, const WifiMacHeader & header);
   bool UpdateOutcomingFrame (Ptr<Packet> packet, WifiMacHeader & header, Mac48Address from, Mac48Address to);
-  /// Update beacon is empty, because HWMP does not know anything about beacons
+  // Update beacon is empty, because HWMP does not know anything about beacons
   void UpdateBeacon (MeshWifiBeacon & beacon) const {};
   int64_t AssignStreams (int64_t stream);
-  //\}
 
 private:
   /// allow HwmpProtocol class friend access
@@ -69,8 +67,8 @@
    * \returns a path selection action header
    */
   static WifiActionHeader GetWifiActionHeader ();
-  ///\name Interaction with HWMP:
-  //\{
+  /// \name Interaction with HWMP:
+  ///@{
   /**
    * Send PREQ function
    * \param preq the PREQ
@@ -107,7 +105,7 @@
    * \param dst_seqno is a sequence number taken from routing table
    */
   void RequestDestination (Mac48Address dest, uint32_t originator_seqno, uint32_t dst_seqno);
-  //\}
+  ///@}
 
   /// Sends one PREQ when PreqMinInterval after last PREQ expires (if any PREQ exists in rhe queue)
   void SendMyPreq ();
@@ -135,13 +133,14 @@
   uint32_t m_ifIndex; ///< IF index
   Ptr<HwmpProtocol> m_protocol; ///< protocol
 
-  ///\name my PREQ and PREQ timer:
-  //\{
-  EventId m_preqTimer; 
-  std::vector<IePreq>  m_myPreq;
-  //\}
-  ///\name PERR timer and stored path error
-  //\{
+  /// \name my PREQ and PREQ timer:
+  ///@{
+  EventId m_preqTimer; //!< Timer for PREQs
+  std::vector<IePreq>  m_myPreq; //!< container of PREQs
+  ///@}
+
+  /// \name PERR timer and stored path error
+  ///@{
   EventId m_perrTimer;
   /// MyPerr structure
   struct MyPerr {
@@ -149,9 +148,14 @@
     std::vector<Mac48Address> receivers; ///< receivers
   };
   MyPerr m_myPerr; ///< PERR
-  ///\name Statistics:
-  //\{
-  /// Statistics structure
+  ///@}
+
+  /// \name Statistics
+  ///@{
+
+  /**
+   * Statistics structure
+   */
   struct Statistics
   {
     uint16_t txPreq; ///< transmit PREQ
@@ -175,8 +179,10 @@
     void Print (std::ostream & os) const;
     Statistics ();
   };
+
   Statistics m_stats; ///< statistics
-  //\}
+  ///@}
+
 private:
   /**
    * Receive data frame
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/dot11s/hwmp-rtable.h ns-3.34/src/mesh/model/dot11s/hwmp-rtable.h
--- ns-3.33/src/mesh/model/dot11s/hwmp-rtable.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/dot11s/hwmp-rtable.h	2021-07-14 10:31:07.000000000 -0700
@@ -86,42 +86,100 @@
   ~HwmpRtable ();
   void DoDispose ();
 
-  ///\name Add/delete paths
-  //\{
+  /// \name Add/delete paths
+  ///@{
+
+  /**
+   * Add a reactive path
+   * \param destination the destination address
+   * \param retransmitter the retransmitter address
+   * \param interface the interface
+   * \param metric  the metric
+   * \param lifetime  the lifetime
+   * \param seqnum  the sequence number
+   */
   void AddReactivePath (
-    Mac48Address destination,
-    Mac48Address retransmitter,
-    uint32_t interface,
-    uint32_t metric,
-    Time  lifetime,
-    uint32_t seqnum
-    );
+      Mac48Address destination,
+      Mac48Address retransmitter,
+      uint32_t interface,
+      uint32_t metric,
+      Time  lifetime,
+      uint32_t seqnum
+  );
+  /**
+   * Add a proactive path
+   * \param metric  the metric
+   * \param root the address of the root
+   * \param retransmitter the retransmitter address
+   * \param interface the interface
+   * \param lifetime  the lifetime
+   * \param seqnum  the sequence number
+   */
   void AddProactivePath (
-    uint32_t metric,
-    Mac48Address root,
-    Mac48Address retransmitter,
-    uint32_t interface,
-    Time  lifetime,
-    uint32_t seqnum
-    );
+      uint32_t metric,
+      Mac48Address root,
+      Mac48Address retransmitter,
+      uint32_t interface,
+      Time  lifetime,
+      uint32_t seqnum
+  );
+   /**
+    * Add a precursor
+   * \param destination the destination address
+    * \param precursorInterface the precursor interface
+    * \param precursorAddress the address of the precursor
+    * \param lifetime the lifetime
+    */
   void AddPrecursor (Mac48Address destination, uint32_t precursorInterface, Mac48Address precursorAddress, Time lifetime);
+
+  /**
+   * Get the precursors list
+   * \param destination the destination
+   * \return the precursors list
+   */
   PrecursorList GetPrecursors (Mac48Address destination);
+
+  /**
+   * Delete all the proactive paths
+   */
   void DeleteProactivePath ();
+  /**
+   * Delete all the proactive paths from a given root
+   * \param root the address of the root
+   */
   void DeleteProactivePath (Mac48Address root);
+  /**
+   * Delete the reactive paths toward a destination
+   * \param destination the destination
+   */
   void DeleteReactivePath (Mac48Address destination);
-  //\}
+  ///@}
 
-  ///\name Lookup
-  //\{
-  /// Lookup path to destination
+  /// \name Lookup
+  ///@{
+  /**
+   * Lookup path to destination
+   * \param destination the destination
+   * \return The lookup result
+   */
   LookupResult LookupReactive (Mac48Address destination);
-  /// Return all reactive paths, including expired
+  /**
+   * Return all reactive paths, including expired
+   * \param destination the destination
+   * \return The lookup result
+   */
   LookupResult LookupReactiveExpired (Mac48Address destination);
-  /// Find proactive path to tree root. Note that calling this method has side effect of deleting expired proactive path
+  /**
+   * Find proactive path to tree root. Note that calling this method has side effect of deleting expired proactive path
+   * \return The lookup result
+   */
   LookupResult LookupProactive ();
-  /// Return all proactive paths, including expired
+  /**
+   * Return all proactive paths, including expired
+   * \return The lookup result
+   */
   LookupResult LookupProactiveExpired ();
-  //\}
+  ///@}
 
   /**
    * When peer link with a given MAC-address fails - it returns list of unreachable destination addresses
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/dot11s/ie-dot11s-id.cc ns-3.34/src/mesh/model/dot11s/ie-dot11s-id.cc
--- ns-3.33/src/mesh/model/dot11s/ie-dot11s-id.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/dot11s/ie-dot11s-id.cc	2021-07-14 10:31:07.000000000 -0700
@@ -149,8 +149,6 @@
   return is;
 }
 
-ATTRIBUTE_HELPER_CPP (IeMeshId);
-
 
 } // namespace dot11s
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/dot11s/ie-dot11s-id.h ns-3.34/src/mesh/model/dot11s/ie-dot11s-id.h
--- ns-3.33/src/mesh/model/dot11s/ie-dot11s-id.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/dot11s/ie-dot11s-id.h	2021-07-14 10:31:07.000000000 -0700
@@ -27,6 +27,7 @@
 
 namespace ns3 {
 namespace dot11s {
+
 /**
  * \brief a IEEE 802.11 Mesh ID element (Section 8.4.2.101 of IEEE 802.11-2012)
  * \see attribute_IeMeshId
@@ -81,9 +82,15 @@
 
 };
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param [in] os The reference to the output stream.
+ * \param [in] meshId The IeMeshId object.
+ * \returns The reference to the output stream.
+ */
 std::ostream &operator << (std::ostream &os, const IeMeshId &meshId);
 
-ATTRIBUTE_HELPER_HEADER (IeMeshId);
   
 } // namespace dot11s
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/dot11s/peer-link.h ns-3.34/src/mesh/model/dot11s/peer-link.h
--- ns-3.33/src/mesh/model/dot11s/peer-link.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/dot11s/peer-link.h	2021-07-14 10:31:07.000000000 -0700
@@ -81,29 +81,73 @@
    * with address (Mac48Address) was opened (bool is true) or closed (bool is false) 
    */
   void  SetLinkStatusCallback (Callback<void, uint32_t, Mac48Address, bool> cb);
+  /// \name Peer link getters/setters
+  ///@{
   /**
-   * \name Peer link getters/setters
-   * \{
+   * Set the peer address
+   * \param macaddr the peer mac address
    */
   void SetPeerAddress (Mac48Address macaddr);
+  /**
+   * Set the peer mesh point address
+   * \param macaddr the peer mesh point address
+   */
   void SetPeerMeshPointAddress (Mac48Address macaddr);
+  /**
+   * Set the interface
+   * \param interface the interface
+   */
   void SetInterface (uint32_t interface);
+  /**
+   * Set the local link ID
+   * \param id the local link ID
+   */
   void SetLocalLinkId (uint16_t id);
+  /**
+   * Set the local association ID
+   * \param aid the local association ID
+   */
   void SetLocalAid (uint16_t aid);
+  /**
+   * Set the peer association ID
+   * \return The peer association ID
+   */
   uint16_t GetPeerAid () const;
+  /**
+   * Set the beacon timing element
+   * \param beaconTiming the beacon timing element
+   */
   void SetBeaconTimingElement (IeBeaconTiming beaconTiming);
+  /**
+   * Get the peer address
+   * \return The peer address
+   */
   Mac48Address GetPeerAddress () const;
+  /**
+   * Get the local association ID
+   * \return The local association ID
+   */
   uint16_t GetLocalAid () const;
+  /**
+   * Get the time of the last received beacon
+   * \return The time of the last received beacon
+   */
   Time GetLastBeacon () const;
+  /**
+   * Get the beacon interval
+   * \return The beacon interval
+   */
   Time GetBeaconInterval () const;
+  /**
+   * Get the beacon timing element
+   * \return The beacon timing element
+   */
   IeBeaconTiming GetBeaconTimingElement () const;
   //IePeerManagement GetPeerLinkDescriptorElement ()const;
-  //\}
+  ///@}
 
-  /**
-   * \name MLME
-   * \{
-   */
+  /// \name MLME
+  ///@{
   /**
    * MLME-CancelPeerLink.request
    * \param reason the reason for the request
@@ -123,7 +167,8 @@
   /// Reports about transmission success/failure
   void TransmissionSuccess ();
   void TransmissionFailure ();
-  //\}
+  ///@}
+
   /**
    * \brief Statistics
    * \param os the output stream
@@ -159,8 +204,8 @@
    * \attention In all this methods {local/peer}LinkID correspond to _peer_ station, as written in
    * received frame, e.g. I am peerLinkID and peer link is localLinkID .
    *
-   * \{
    */
+  ///@{
   /**
    * Close link
    *
@@ -218,7 +263,8 @@
     Mac48Address peerMp,
     PmpReasonCode reason
     );
-  //\}
+  ///@}
+
   /**
    * \returns True if link is established
    */
@@ -235,33 +281,49 @@
   void SetMacPlugin (Ptr<PeerManagementProtocolMac> plugin);
   /**
    * \name Event handlers
-   * \{
    */
+  ///@{
+  /// Clear the retry timer
   void ClearRetryTimer ();
+  /// Clear the confirm timer
   void ClearConfirmTimer ();
+  /// Clear the holding timer
   void ClearHoldingTimer ();
+  /// Set the holding timer
   void SetHoldingTimer ();
+  /// Set the retry timer
   void SetRetryTimer ();
+  /// Set the confirm timer
   void SetConfirmTimer ();
-  //\}
+  ///@}
 
   /**
    * \name Work with management frames
-   * \{
+   */
+  ///@{
+  /**
+   * Send a peer link close
+   * \param reasoncode reason for closing the line
    */
   void SendPeerLinkClose (PmpReasonCode reasoncode);
+  /// Send a peer link open
   void SendPeerLinkOpen ();
+  /// Send a peer link confirm
   void SendPeerLinkConfirm ();
-  //\}
+  ///@}
 
   /**
    * \name Timeout handlers
-   * \{
    */
+  ///@{
+  /// Holding Timeout event handler
   void HoldingTimeout ();
+  /// Retry Timeout event handler
   void RetryTimeout ();
+  /// Confirm Timeout event handler
   void ConfirmTimeout ();
-  //\}
+  ///@}
+
   /// Several successive beacons were lost, close link
   void BeaconLoss ();
 private:
@@ -273,10 +335,10 @@
    */
   PeerLink& operator= (const PeerLink & link);
   /**
-   * type conversion operator
-   * \returns the peer link
+   * Copy constructor. Intentionally unimplemented
+   * \param o object to copy
    */
-  PeerLink (const PeerLink &);
+  PeerLink (const PeerLink & o);
 
   /// The number of interface I am associated with
   uint32_t m_interface;
@@ -315,21 +377,22 @@
 
   /**
    * \name Timers & counters used for internal state transitions
-   * \{
    */
-  uint16_t m_dot11MeshMaxRetries;
-  Time     m_dot11MeshRetryTimeout;
-  Time     m_dot11MeshHoldingTimeout;
-  Time     m_dot11MeshConfirmTimeout;
-
-  EventId  m_retryTimer;
-  EventId  m_holdingTimer;
-  EventId  m_confirmTimer;
-  uint16_t m_retryCounter;
-  EventId  m_beaconLossTimer;
-  uint16_t m_maxBeaconLoss;
-  uint16_t m_maxPacketFail;
-  // \}
+  ///@{
+  uint16_t m_dot11MeshMaxRetries;     //!< Maximum number of retries
+  Time     m_dot11MeshRetryTimeout;   //!< Retry timeout
+  Time     m_dot11MeshHoldingTimeout; //!< Holding timeout
+  Time     m_dot11MeshConfirmTimeout; //!< Confirm timeout
+
+  EventId  m_retryTimer;            //!< Retry timer
+  EventId  m_holdingTimer;          //!< Holding timer
+  EventId  m_confirmTimer;          //!< Confirm timer
+  uint16_t m_retryCounter;          //!< Retry counter
+  EventId  m_beaconLossTimer;       //!< Beacon loss timer
+  uint16_t m_maxBeaconLoss;         //!< Maximum number of lost beacons before link will be closed
+  uint16_t m_maxPacketFail;         //!< Maximum number of failed packets before link will be closed
+  ///@}
+
   /// How to report my status change
   SignalStatusCallback m_linkStatusCallback;
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/dot11s/peer-management-protocol.h ns-3.34/src/mesh/model/dot11s/peer-management-protocol.h
--- ns-3.33/src/mesh/model/dot11s/peer-management-protocol.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/dot11s/peer-management-protocol.h	2021-07-14 10:31:07.000000000 -0700
@@ -59,6 +59,7 @@
   void DoDispose ();
   /**
    * \brief Install PMP on given mesh point.
+   * \param mp the MeshPointDevice to install onto
    * \return true if successful
    *
    * Installing protocol causes installation of its interface MAC plugins.
@@ -66,13 +67,13 @@
    * Also MP aggregates all installed protocols, PMP protocol can be accessed
    * via MeshPointDevice::GetObject<PeerManagementProtocol>();
    */
-  bool Install (Ptr<MeshPointDevice>);
+  bool Install (Ptr<MeshPointDevice> mp);
   /**
    * \brief Methods that handle beacon sending/receiving procedure.
    *
    * \name This methods interact with MAC_layer plug-in
-   * \{
    */
+  ///@{
   /**
    * \brief When we are sending a beacon - we fill beacon timing
    * element
@@ -88,19 +89,17 @@
    * \param beaconTiming beacon timing element (needed by BCA)
    */
   void ReceiveBeacon (uint32_t interface, Mac48Address peerAddress, Time beaconInterval, Ptr<IeBeaconTiming> beaconTiming);
-  // \}
+  ///@}
+
   /**
-   * \brief Methods that handle Peer link management frames
-   * interaction:
-   * \{
+   * \name Methods that handle Peer link management frames interaction:
    */
+  ///@{
   /**
    * Deliver Peer link management information to the protocol-part
-   * \param interface is a interface ID of a given MAC (interfaceID rather
-   * than MAC address, because many interfaces may have the same MAC)
+   * \param interface is a interface ID of a given MAC (interfaceID rather than MAC address, because many interfaces may have the same MAC)
    * \param peerAddress is address of peer
-   * \param peerMeshPointAddress is address of peer mesh point device (equal
-   * to peer address when only one interface)
+   * \param peerMeshPointAddress is address of peer mesh point device (equal to peer address when only one interface)
    * \param aid is association ID, which peer has assigned to us
    * \param peerManagementElement is peer link management element
    * \param meshConfig is mesh configuration element taken from the peer management frame
@@ -116,30 +115,55 @@
   /**
    * \brief Cancels peer link due to broken configuration (Mesh ID or Supported
    * rates)
+   * \param interface interface of the link to cancel
+   * \param peerAddress peer address of the link to cancel
    */
   void ConfigurationMismatch (uint32_t interface, Mac48Address peerAddress);
   /**
    * \brief Cancels peer link due to successive transmission failures
+   * \param interface interface of the link to cancel
+   * \param peerAddress peer address of the link to cancel
    */
   void TransmissionFailure (uint32_t interface, const Mac48Address peerAddress);
   /**
    * \brief resets transmission failure statistics
+   * \param interface interface of the link to reset
+   * \param peerAddress peer address of the link to reset
    */
   void TransmissionSuccess (uint32_t interface, const Mac48Address peerAddress);
   /**
    * \brief Checks if there is established link
+   * \param interface interface of the link to check
+   * \param peerAddress peer address of the link to check
+   * \return true if the link is active
    */
   bool IsActiveLink (uint32_t interface, Mac48Address peerAddress);
-  // \}
-  ///\name Interface to other protocols (MLME)
-  // \{
-  /// Set peer link status change callback
+  ///@}
+
+  /// \name Interface to other protocols (MLME)
+  ///@{
+  /**
+   *  Set peer link status change callback
+   *  \param cb the callback
+   */
   void SetPeerLinkStatusCallback (Callback<void, Mac48Address, Mac48Address, uint32_t, bool> cb);
-  /// Find active peer link by my interface and peer interface MAC
+  /**
+   * Find active peer link by my interface and peer interface MAC
+   * \param interface interface of the link to find
+   * \param peerAddress peer address of the link to find
+   * \return The peer link (null if not found)
+   */
   Ptr<PeerLink> FindPeerLink (uint32_t interface, Mac48Address peerAddress);
-  /// Get list of all active peer links
+  /**
+   * Get list of all active peer links
+   * \return a list of all the active peer links
+   */
   std::vector < Ptr<PeerLink> > GetPeerLinks () const;
-  /// Get list of active peers of my given interface
+  /**
+   * Get list of active peers of my given interface
+   * \param interface the interface
+   * \return a list of all the active peer links on an interface
+   */
   std::vector<Mac48Address> GetPeers (uint32_t interface) const;
   /**
    * Get mesh point address. \todo this used by plugins only. Now MAC plugins can ask MP address directly from main MAC
@@ -178,10 +202,10 @@
    * \param beaconInterval the beacon interval
    */
   void NotifyBeaconSent (uint32_t interface, Time beaconInterval);
-  // \}
+  ///@}
   
   /**
-   * \brief: Report statistics
+   * \brief Report statistics
    * \param os the output stream
    */
   void Report (std::ostream & os) const;
@@ -255,36 +279,67 @@
     Mac48Address peerMeshPointAddress
     );
   /**
-   * \name External peer-chooser
+   * \brief External peer-chooser
    * \param interface the interface to use
    * \param peerAddress the peer address
    * \returns true is should send an open
    */
   bool ShouldSendOpen (uint32_t interface, Mac48Address peerAddress);
   /**
-   * \name External peer-chooser
+   * \brief External peer-chooser
+   * \param interface the interface to use
+   * \param peerAddress the peer address
+   * \param reasonCode reason code
+   * \returns true is should send an open
    */
   bool ShouldAcceptOpen (uint32_t interface, Mac48Address peerAddress, PmpReasonCode & reasonCode);
   /**
    * \brief Indicates changes in peer links
+   * \param interface the interface
+   * \param peerAddress the peer address
+   * \param peerMeshPointAddres the peer mesh point address
+   * \param ostate old state
+   * \param nstate new state
    */
   void PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddres, PeerLink::PeerState ostate, PeerLink::PeerState nstate);
-  ///\brief BCA
+  /**
+   * \brief BCA
+   * \param interface interface
+   */
   void CheckBeaconCollisions (uint32_t interface);
-  /// Shift own beacon function
+  /**
+   * Shift own beacon function
+   * \param interface interface
+   */
   void ShiftOwnBeacon (uint32_t interface);
   /**
-   * \name Time<-->TU converters:
+   * \brief Time<-->TU converters:
+   * \param x TU
+   * \return Time
    */
   Time TuToTime (int x);
   /**
-   * \name Time<-->TU converters:
+   * \brief Time<-->TU converters:
+   * \param x Time
+   * \return TU
    */
   int TimeToTu (Time x);
 
-  /// Aux. method to register open links
+  /**
+   * Aux. method to register open links
+   * \param peerMp peer mesh point address
+   * \param peerIface peer address
+   * \param myIface my address
+   * \param interface interface
+   */
   void NotifyLinkOpen (Mac48Address peerMp, Mac48Address peerIface, Mac48Address myIface, uint32_t interface);
-  /// Aux. method to register closed links
+  /**
+   * Aux. method to register closed links
+   * \param peerMp peer mesh point address
+   * \param peerIface peer address
+   * \param myIface my address
+   * \param interface interface
+   */
   void NotifyLinkClose (Mac48Address peerMp, Mac48Address peerIface, Mac48Address myIface, uint32_t interface);
 private:
   PeerManagementProtocolMacMap m_plugins; ///< plugins
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/dot11s/peer-management-protocol-mac.cc ns-3.34/src/mesh/model/dot11s/peer-management-protocol-mac.cc
--- ns-3.33/src/mesh/model/dot11s/peer-management-protocol-mac.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/dot11s/peer-management-protocol-mac.cc	2021-07-14 10:31:07.000000000 -0700
@@ -49,18 +49,18 @@
 PeerManagementProtocolMac::SetParent (Ptr<MeshWifiInterfaceMac> parent)
 {
   m_parent = parent;
-  m_parent->TraceConnectWithoutContext ("TxErrHeader", MakeCallback (&PeerManagementProtocolMac::TxError, this));
-  m_parent->TraceConnectWithoutContext ("TxOkHeader",  MakeCallback (&PeerManagementProtocolMac::TxOk,    this));
+  m_parent->TraceConnectWithoutContext ("DroppedMpdu", MakeCallback (&PeerManagementProtocolMac::TxError, this));
+  m_parent->TraceConnectWithoutContext ("AckedMpdu",   MakeCallback (&PeerManagementProtocolMac::TxOk,    this));
 }
 void
-PeerManagementProtocolMac::TxError (WifiMacHeader const &hdr)
+PeerManagementProtocolMac::TxError (WifiMacDropReason reason, Ptr<const WifiMacQueueItem> mpdu)
 {
-  m_protocol->TransmissionFailure (m_ifIndex, hdr.GetAddr1 ());
+  m_protocol->TransmissionFailure (m_ifIndex, mpdu->GetHeader ().GetAddr1 ());
 }
 void
-PeerManagementProtocolMac::TxOk (WifiMacHeader const &hdr)
+PeerManagementProtocolMac::TxOk (Ptr <const WifiMacQueueItem> mpdu)
 {
-  m_protocol->TransmissionSuccess (m_ifIndex, hdr.GetAddr1 ());
+  m_protocol->TransmissionSuccess (m_ifIndex, mpdu->GetHeader ().GetAddr1 ());
 }
 bool
 PeerManagementProtocolMac::Receive (Ptr<Packet> const_packet, const WifiMacHeader & header)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/dot11s/peer-management-protocol-mac.h ns-3.34/src/mesh/model/dot11s/peer-management-protocol-mac.h
--- ns-3.33/src/mesh/model/dot11s/peer-management-protocol-mac.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/dot11s/peer-management-protocol-mac.h	2021-07-14 10:31:07.000000000 -0700
@@ -25,6 +25,8 @@
 
 namespace ns3 {
 class MeshWifiInterfaceMac;
+class WifiMacQueueItem;
+enum WifiMacDropReason : uint8_t;  // opaque enum declaration
 namespace dot11s {
 class PeerManagementProtocol;
 class IeConfiguration;
@@ -87,12 +89,23 @@
    * \return the assigned stream
    */
   int64_t AssignStreams (int64_t stream);
-  ///\name Statistics
-  // \{
+
+  /// \name Statistics
+  ///@{
+  /**
+   * \brief Report statistics
+   * \param os the output stream
+   */
   void Report (std::ostream &) const;
+  /// Reset stats
   void ResetStats ();
+  /**
+   * Get the link metric
+   * \param peerAddress the peer address
+   * \return The metric
+   */
   uint32_t GetLinkMetric (Mac48Address peerAddress);
-  // \}
+  ///@}
 
 private:
   /**
@@ -146,14 +159,15 @@
   // \}
   /**
    *  Closes link when a proper number of successive transmissions have failed
-   * \param hdr the header
+   * \param reason the reason why the MPDU was dropped
+   * \param mpdu the dropped MPDU
    */
-  void TxError (WifiMacHeader const &hdr);
+  void TxError (WifiMacDropReason reason, Ptr<const WifiMacQueueItem> mpdu);
   /**
    * Transmit OK function
-   * \param hdr the header
+   * \param mpdu the MPDU
    */
-  void TxOk (WifiMacHeader const &hdr);
+  void TxOk (Ptr <const WifiMacQueueItem> mpdu);
   // BCA functionality
   /**
    * Set beacon shift function
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/flame/flame-protocol.h ns-3.34/src/mesh/model/flame/flame-protocol.h
--- ns-3.33/src/mesh/model/flame/flame-protocol.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/flame/flame-protocol.h	2021-07-14 10:31:07.000000000 -0700
@@ -124,6 +124,7 @@
                            const Mac48Address destination, Ptr<Packet> packet, uint16_t& protocolType);
   /**
    * \brief Install FLAME on given mesh point.
+   * \param mp the MeshPointDevice
    * \returns true if successful
    *
    * Installing protocol causes installation of its interface MAC plugins.
@@ -131,7 +132,7 @@
    * Also MP aggregates all installed protocols, FLAME protocol can be accessed
    * via MeshPointDevice::GetObject<flame::FlameProtocol>();
    */
-  bool Install (Ptr<MeshPointDevice>);
+  bool Install (Ptr<MeshPointDevice> mp);
   /**
    * Get address of this instance
    * \returns the MAC address
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/mesh-point-device.h ns-3.34/src/mesh/model/mesh-point-device.h
--- ns-3.33/src/mesh/model/mesh-point-device.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/mesh-point-device.h	2021-07-14 10:31:07.000000000 -0700
@@ -39,7 +39,7 @@
  *   - Aggregating and coordinating 1..* real devices -- mesh interfaces, see MeshInterfaceDevice class.
  *   - Hosting all mesh-related level 2 protocols.
  *
- * One of hosted L2 protocols must inplement L2RoutingProtocol interface and is used for packets forwarding.
+ * One of hosted L2 protocols must implement L2RoutingProtocol interface and is used for packets forwarding.
  *
  * From the level 3 point of view MeshPointDevice is similar to BridgeNetDevice, but the packets,
  * which going through may be changed (because L2 protocols may require their own headers or tags).
@@ -59,8 +59,8 @@
   /// D-tor
   virtual ~MeshPointDevice ();
 
-  ///\name Interfaces
-  //\{
+  /// \name Interfaces
+  ///@{
   /**
    * \brief Attach new interface to the station. Interface must support 48-bit MAC address and SendFrom method.
    * \param port the port used
@@ -81,15 +81,24 @@
    * \return vector of interfaces
    */
   std::vector<Ptr<NetDevice> > GetInterfaces () const;
-  //\}
+  ///@}
 
-  ///\name Protocols
-  //\{
-  /// Register routing protocol to be used. Protocol must be already installed on this mesh point.
+
+  /// \name Protocols
+  ///@{
+  /**
+   * Register routing protocol to be used. Protocol must be already installed on this mesh point.
+   *
+   * \param protocol the routing protocol
+   */
   void SetRoutingProtocol (Ptr<MeshL2RoutingProtocol> protocol);
-  /// Access current routing protocol
+  /**
+   * Access current routing protocol
+   *
+   * \return the current routing protocol
+   */
   Ptr<MeshL2RoutingProtocol> GetRoutingProtocol () const;
-  //\}
+  ///@}
 
   // Inherited from NetDevice
   virtual void SetIfIndex (const uint32_t index);
@@ -118,13 +127,16 @@
   virtual Address GetMulticast (Ipv6Address addr) const;
   virtual void DoDispose ();
 
-  ///\name Statistics
-  //\{
-  /// Print statistics counters
+  /// \name Statistics
+  ///@{
+  /**
+   *  Print statistics counters
+   *  \param os the output stream
+   */
   void Report (std::ostream & os) const;
   /// Reset statistics counters
   void ResetStats ();
-  //\}
+  ///@}
 
 private:
   /**
@@ -197,7 +209,7 @@
     /// constructor
     Statistics ();
   };
-  /// Counters
+  // Counters
   Statistics m_rxStats; ///< receive statistics
   Statistics m_txStats; ///< transmit statistics
   Statistics m_fwdStats; ///< forward statistics
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/mesh-wifi-interface-mac.cc ns-3.34/src/mesh/model/mesh-wifi-interface-mac.cc
--- ns-3.33/src/mesh/model/mesh-wifi-interface-mac.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/mesh-wifi-interface-mac.cc	2021-07-14 10:31:07.000000000 -0700
@@ -23,7 +23,6 @@
 #include "ns3/mesh-wifi-beacon.h"
 #include "ns3/log.h"
 #include "ns3/boolean.h"
-#include "ns3/mac-low.h"
 #include "ns3/random-variable-stream.h"
 #include "ns3/simulator.h"
 #include "ns3/yans-wifi-phy.h"
@@ -33,6 +32,7 @@
 #include "ns3/trace-source-accessor.h"
 #include "ns3/socket.h"
 #include "ns3/wifi-net-device.h"
+#include "ns3/channel-access-manager.h"
 
 namespace ns3 {
 
@@ -98,7 +98,7 @@
 MeshWifiInterfaceMac::Enqueue (Ptr<Packet> packet, Mac48Address to)
 {
   NS_LOG_FUNCTION (this << packet << to);
-  ForwardDown (packet, m_low->GetAddress (), to);
+  ForwardDown (packet, GetAddress (), to);
 }
 bool
 MeshWifiInterfaceMac::SupportsSendFrom () const
@@ -236,9 +236,9 @@
     {
       // in adhoc mode, we assume that every destination
       // supports all the rates we support.
-      for (uint32_t i = 0; i < m_phy->GetNModes (); i++)
+      for (const auto & mode : m_phy->GetModeList ())
         {
-          m_stationManager->AddSupportedMode (hdr.GetAddr1 (), m_phy->GetMode (i));
+          m_stationManager->AddSupportedMode (hdr.GetAddr1 (), mode);
         }
       m_stationManager->RecordDisassociated (hdr.GetAddr1 ());
     }
@@ -303,9 +303,8 @@
   // set the set of supported rates and make sure that we indicate
   // the Basic Rate set in this set of supported rates.
   SupportedRates rates;
-  for (uint32_t i = 0; i < m_phy->GetNModes (); i++)
+  for (const auto & mode : m_phy->GetModeList ())
     {
-      WifiMode mode = m_phy->GetMode (i);
       uint16_t gi = ConvertGuardIntervalToNanoSeconds (mode, DynamicCast<WifiNetDevice> (m_phy->GetDevice ()));
       rates.AddSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth (), gi, 1));
     }
@@ -431,9 +430,8 @@
         {
           SupportedRates rates = beacon_hdr.GetSupportedRates ();
 
-          for (uint32_t i = 0; i < m_phy->GetNModes (); i++)
+          for (const auto & mode : m_phy->GetModeList ())
             {
-              WifiMode mode = m_phy->GetMode (i);
               uint16_t gi = ConvertGuardIntervalToNanoSeconds (mode, DynamicCast<WifiNetDevice> (m_phy->GetDevice ()));
               uint64_t rate = mode.GetDataRate (m_phy->GetChannelWidth (), gi, 1);
               if (rates.IsSupportedRate (rate))
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mesh/model/mesh-wifi-interface-mac.h ns-3.34/src/mesh/model/mesh-wifi-interface-mac.h
--- ns-3.33/src/mesh/model/mesh-wifi-interface-mac.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mesh/model/mesh-wifi-interface-mac.h	2021-07-14 10:31:07.000000000 -0700
@@ -65,16 +65,32 @@
   virtual void  Enqueue (Ptr<Packet> packet, Mac48Address to);
   virtual bool  SupportsSendFrom () const;
   virtual void  SetLinkUpCallback (Callback<void> linkUp);
-  ///\name Each mesh point interface must know the mesh point address
-  // \{
-  void SetMeshPointAddress (Mac48Address);
+
+  /// \name Each mesh point interface must know the mesh point address
+  ///@{
+  /**
+   * Set the mesh point address
+   * \param addr the mesh point address
+   */
+  void SetMeshPointAddress (Mac48Address addr);
+  /**
+   * Get the mesh point address
+   * \return The mesh point address
+   */
   Mac48Address GetMeshPointAddress () const;
-  // \}
-  ///\name Beacons
-  // \{
-  /// Set maximum initial random delay before first beacon
+  ///@}
+
+  /// \name Beacons
+  ///@{
+  /**
+   *  Set maximum initial random delay before first beacon
+   *  \param interval maximum random interval
+   */
   void SetRandomStartDelay (Time interval);
-  /// Set interval between two successive beacons
+  /**
+   *  Set interval between two successive beacons
+   *  \param interval beacon interval
+   */
   void SetBeaconInterval (Time interval);
   /// \return interval between two beacons
   Time GetBeaconInterval () const;
@@ -94,7 +110,7 @@
    * \attention User of ShiftTbtt () must take care to not shift it to the past.
    */
   void ShiftTbtt (Time shift);
-  // \}
+  ///@}
 
   /**
    * Install plugin.
@@ -140,15 +156,30 @@
   bool CheckSupportedRates (SupportedRates rates) const;
   /// \return list of supported bitrates
   SupportedRates GetSupportedRates () const;
-  ///\name Metric Calculation routines:
-  // \{
+
+  /// \name Metric Calculation routines:
+  ///@{
+  /**
+   * Set the link metric callback
+   * \param cb the callback
+   */
   void SetLinkMetricCallback (Callback<uint32_t, Mac48Address, Ptr<MeshWifiInterfaceMac> > cb);
+  /**
+   * Get the link metric
+   * \param peerAddress the peer address
+   * \return The metric
+   */
   uint32_t GetLinkMetric (Mac48Address peerAddress);
-  // \}
-  ///\brief Statistics:
-  void Report (std::ostream &) const;
-  /// Reset statistics
+  ///@}
+
+  /**
+   * \brief Report statistics
+   * \param os the output stream
+   */
+  void Report (std::ostream & os) const;
+  /// Reset statistics function
   void ResetStats ();
+
   /**
    * Enable/disable beacons
    *
@@ -203,8 +234,8 @@
 
   virtual void DoInitialize ();
 
-  ///\name Mesh timing intervals
-  // \{
+  /// \name Mesh timing intervals
+  ///@{
   /// whether beaconing is enabled
   bool m_beaconEnable;
   /// Beaconing interval.
@@ -213,7 +244,7 @@
   Time m_randomStart;
   /// Time for the next frame
   Time m_tbtt;
-  // \}
+  ///@}
 
   /// Mesh point address
   Mac48Address m_mpAddress;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mobility/bindings/modulegen__gcc_ILP32.py ns-3.34/src/mobility/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/mobility/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mobility/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -85,12 +85,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -527,8 +531,10 @@
     register_Ns3GeographicPositions_methods(root_module, root_module['ns3::GeographicPositions'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1579,6 +1585,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1792,6 +1810,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1867,6 +1890,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1887,6 +1922,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mobility/bindings/modulegen__gcc_LP64.py ns-3.34/src/mobility/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/mobility/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mobility/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -85,12 +85,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -527,8 +531,10 @@
     register_Ns3GeographicPositions_methods(root_module, root_module['ns3::GeographicPositions'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1579,6 +1585,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1792,6 +1810,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1867,6 +1890,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1887,6 +1922,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mobility/examples/main-random-topology.cc ns-3.34/src/mobility/examples/main-random-topology.cc
--- ns-3.33/src/mobility/examples/main-random-topology.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mobility/examples/main-random-topology.cc	2021-07-14 10:31:07.000000000 -0700
@@ -22,6 +22,11 @@
 
 using namespace ns3;
 
+/**
+ * Function called when there is a course change
+ * \param context event context
+ * \param position a pointer to the mobility model
+ */
 static void 
 CourseChange (std::string context, Ptr<const MobilityModel> position)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mobility/examples/main-random-walk.cc ns-3.34/src/mobility/examples/main-random-walk.cc
--- ns-3.33/src/mobility/examples/main-random-walk.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mobility/examples/main-random-walk.cc	2021-07-14 10:31:07.000000000 -0700
@@ -21,8 +21,13 @@
 
 using namespace ns3;
 
+/**
+ * Function called when there is a course change
+ * \param context event context
+ * \param mobility a pointer to the mobility model
+ */
 static void 
-CourseChange (std::string foo, Ptr<const MobilityModel> mobility)
+CourseChange (std::string context, Ptr<const MobilityModel> mobility)
 {
   Vector pos = mobility->GetPosition ();
   Vector vel = mobility->GetVelocity ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mobility/helper/ns2-mobility-helper.cc ns-3.34/src/mobility/helper/ns2-mobility-helper.cc
--- ns-3.33/src/mobility/helper/ns2-mobility-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mobility/helper/ns2-mobility-helper.cc	2021-07-14 10:31:07.000000000 -0700
@@ -103,16 +103,22 @@
 
 /**
  * Parses a line of ns2 mobility
+ * \param str the string to parse
+ * \returns The parsed line
  */
 static ParseResult ParseNs2Line (const std::string& str);
 
 /** 
  * Put out blank spaces at the start and end of a line
+ * \param str input line
+ * \returns the line trimmed
  */
 static std::string TrimNs2Line (const std::string& str);
 
 /**
- * Checks if a string represents a number or it has others characters than digits an point.
+ * Checks if a string represents a number or it has others characters than digits and point.
+ * \param s the string to check
+ * \returns true if the string represents a number
  */
 static bool IsNumber (const std::string& s);
 
@@ -127,57 +133,91 @@
 
 /**
  * Checks if the value between brackets is a correct nodeId number
+ * \param str string to check
+ * \returns true if the string represents a nodeId number
  */ 
 static bool HasNodeIdNumber (std::string str);
 
 /** 
  * Gets nodeId number in string format from the string like $node_(4)
+ * \param str string to de-tokenize
+ * \returns A string with the nodeId number
  */
 static std::string GetNodeIdFromToken (std::string str);
 
 /** 
  * Get node id number in int format
+ * \param pr the ParseResult to analyze
+ * \returns the node ID (as an int)
  */
 static int GetNodeIdInt (ParseResult pr);
 
 /**  
  * Get node id number in string format
+ * \param pr the ParseResult to analyze
+ * \returns the node ID (as a string)
  */
 static std::string GetNodeIdString (ParseResult pr);
 
 /**
  * Add one coord to a vector position
+ * \param actPos actual position (overwritten)
+ * \param coord coordinate (x, y, or z)
+ * \param value value of the coordinate
+ * \return The vector of the position
  */
 static Vector SetOneInitialCoord (Vector actPos, std::string& coord, double value);
 
 /** 
  * Check if this corresponds to a line like this: $node_(0) set X_ 123
+ * \param pr the ParseResult to analyze
+ * \returns true if the ParseResult looks like a coordinate without a scheduled time
  */
 static bool IsSetInitialPos (ParseResult pr);
 
 /** 
  * Check if this corresponds to a line like this: $ns_ at 1 "$node_(0) setdest 2 3 4"
+ * \param pr the ParseResult to analyze
+ * \returns true if the ParseResult looks like a coordinate with a scheduled time and destionation
  */
 static bool IsSchedSetPos (ParseResult pr);
 
 /**
  * Check if this corresponds to a line like this: $ns_ at 1 "$node_(0) set X_ 2"
+ * \param pr the ParseResult to analyze
+ * \returns true if the ParseResult looks like a coordinate with a scheduled time
  */
 static bool IsSchedMobilityPos (ParseResult pr);
 
 /**
  * Set waypoints and speed for movement.
+ * \param model mobility model
+ * \param lastPos last position
+ * \param at initial movement time
+ * \param xFinalPosition final position (X axis)
+ * \param yFinalPosition final position (Y axis)
+ * \param speed movement speed
+ * \returns A descriptor of the movement
  */
 static DestinationPoint SetMovement (Ptr<ConstantVelocityMobilityModel> model, Vector lastPos, double at,
                                      double xFinalPosition, double yFinalPosition, double speed);
 
 /**
  * Set initial position for a node
+ * \param model mobility model
+ * \param coord coordinate (x, y, or z)
+ * \param coordVal value of the coordinate
+ * \return The vector of the position
  */
 static Vector SetInitialPosition (Ptr<ConstantVelocityMobilityModel> model, std::string coord, double coordVal);
 
 /** 
  * Schedule a set of position for a node
+ * \param model mobility model
+ * \param at initial movement time
+ * \param coord coordinate (x, y, or z)
+ * \param coordVal value of the coordinate
+ * \return The vector of the position at the given time
  */
 static Vector SetSchedPosition (Ptr<ConstantVelocityMobilityModel> model, double at, std::string coord, double coordVal);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mobility/model/hierarchical-mobility-model.h ns-3.34/src/mobility/model/hierarchical-mobility-model.h
--- ns-3.33/src/mobility/model/hierarchical-mobility-model.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mobility/model/hierarchical-mobility-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -104,10 +104,12 @@
 
   /**
    * Callback for when parent mobility model course change occurs
+   * \param model mobility mode (unused)
    */
   void ParentChanged (Ptr<const MobilityModel> model);
   /**
    * Callback for when child mobility model course change occurs
+   * \param model mobility mode (unused)
    */
   void ChildChanged (Ptr<const MobilityModel> model);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mobility/model/position-allocator.h ns-3.34/src/mobility/model/position-allocator.h
--- ns-3.33/src/mobility/model/position-allocator.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mobility/model/position-allocator.h	2021-07-14 10:31:07.000000000 -0700
@@ -88,7 +88,7 @@
    * \brief Add the positions listed in a file.
    * The file should be a simple text file, with one position per line,
    * either X and Y, or X, Y and Z, in meters.  The delimiter can
-   * be any character, such as ',' or '\t'; the default is a comma ','.
+   * be any character, such as ',' or '\\t'; the default is a comma ','.
    *
    * The file is read using CsvReader, which explains how comments
    * and whitespace are handled.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mobility/model/random-walk-2d-mobility-model.h ns-3.34/src/mobility/model/random-walk-2d-mobility-model.h
--- ns-3.33/src/mobility/model/random-walk-2d-mobility-model.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mobility/model/random-walk-2d-mobility-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -66,6 +66,7 @@
   /**
    * Walk according to position and velocity, until distance is reached,
    * time is reached, or intersection with the bounding box
+   * \param timeLeft The remaining time of the walk
    */
   void DoWalk (Time timeLeft);
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mobility/model/waypoint-mobility-model.h ns-3.34/src/mobility/model/waypoint-mobility-model.h
--- ns-3.33/src/mobility/model/waypoint-mobility-model.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mobility/model/waypoint-mobility-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -111,12 +111,14 @@
 
   /**
    * Get the waypoint that this object is traveling towards.
+   * \returns The waypoint
    */
   Waypoint GetNextWaypoint (void) const;
 
   /**
    * Get the number of waypoints left for this object, excluding
    * the next one.
+   * \returns The number of waypoints left
    */
   uint32_t WaypointsLeft (void) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mobility/test/ns2-mobility-helper-test-suite.cc ns-3.34/src/mobility/test/ns2-mobility-helper-test-suite.cc
--- ns-3.33/src/mobility/test/ns2-mobility-helper-test-suite.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mobility/test/ns2-mobility-helper-test-suite.cc	2021-07-14 10:31:07.000000000 -0700
@@ -109,7 +109,11 @@
         vel (v)
     {
     }
-    /// Sort by timestamp
+    /**
+     * Less-than operator - used to sort by timestamp
+     * \param o object to compare to
+     * \returns true if the timestamp of the 1nd operand is less than the other one's
+     */
     bool operator< (ReferencePoint const & o) const
     {
       return (time < o.time);
@@ -133,17 +137,29 @@
   virtual ~Ns2MobilityHelperTest ()
   {
   }
-  /// Set NS-2 trace to read as single large string (don't forget to add \\n and quote \"'s)
+  /**
+   * Set NS-2 trace to read as single large string (don't forget to add \\n and quote \"'s)
+   *  \param trace the mobility trace
+   */
   void SetTrace (std::string const & trace)
   {
     m_trace = trace;
   }
-  /// Add next reference point
+  /**
+   * Add next reference point
+   * \param r reference point to add
+   */
   void AddReferencePoint (ReferencePoint const & r)
   {
     m_reference.push_back (r);
   }
-  /// Sugar
+  /**
+   * Add next reference point
+   * \param id reference point id
+   * \param sec reference point ime (in seconds)
+   * \param p reference point position
+   * \param v reference point velocity
+   */
   void AddReferencePoint (const char * id, double sec, Vector const & p, Vector const & v)
   {
     AddReferencePoint (ReferencePoint (id, Seconds (sec), p, v));
@@ -164,7 +180,10 @@
   std::string m_traceFile;
 
 private:
-  /// Dump NS-2 trace to tmp file
+  /**
+   * Dump NS-2 trace to tmp file
+   * \return true on error.
+   */
   bool WriteTrace ()
   {
     m_traceFile = CreateTempDirFilename ("Ns2MobilityHelperTest.tcl");
@@ -186,7 +205,10 @@
         Names::Add (os.str (), nodes.Get (i));
       }
   }
-  /// Check that all initial positions are correct
+  /**
+   * Check that all initial positions are correct
+   * \return true on error.
+   */
   bool CheckInitialPositions ()
   {
     std::stable_sort (m_reference.begin (), m_reference.end ());
@@ -206,7 +228,11 @@
       }
     return IsStatusFailure ();
   }
-  /// Listen for course change events
+  /**
+   * Listen for course change events
+   * \param context event context
+   * \param mobility a pointer to the mobility model
+   */
   void CourseChange (std::string context, Ptr<const MobilityModel> mobility)
   {
     Time time = Simulator::Now ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/mpi/doc/distributed.rst ns-3.34/src/mpi/doc/distributed.rst
--- ns-3.33/src/mpi/doc/distributed.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/mpi/doc/distributed.rst	2021-07-14 10:31:07.000000000 -0700
@@ -158,6 +158,27 @@
 These lines can be added into ~/.bash_profile or ~/.bashrc to avoid having to
 retype them when a new shell is opened.
 
+Note 2:  There is a separate issue on recent Fedora distributions, which is
+that the libraries are built with AVX instructions.  On older machines or
+some virtual machines, this results in an illegal instruction 
+being thrown.  This is not an |ns3| issue, a simple MPI test case will also
+fail.  The AVX instructions are being called during initialization.
+
+The symptom of this is that attempts to run an ns-3 MPI program will fail
+with the error: `terminated with signal SIGILL`.  To check if this is the
+problem, run::
+
+    $ grep avx /proc/cpuinfo
+
+and it will not return anything if AVX is not present.
+
+If AVX is not supported, it is recommended to switch to a different MPI
+implementation such as MPICH::
+
+    $ dnf remove openmpi openmpi-devel
+    $ dnf install mpich mpich-devel environment-modules
+    $ module load mpi/mpich-x86_64
+
 Building and Running Examples
 +++++++++++++++++++++++++++++
 
@@ -177,15 +198,18 @@
     $ ./waf
 
 After building |ns3| with mpi enabled, the example programs are now
-ready to run with mpirun. Here are a few examples (from the root |ns3|
-directory)::
+ready to run with `mpiexec`.  It is advised to avoid running Waf directly
+with `mpiexec`; two options that should be more robust are to either use
+the `--command-template` way of running the mpiexec program, or to use
+`./waf shell` and run the executables directly on the command line.
+Here are a few examples (from the root |ns3| directory)::
 
-    $ mpirun -np 2 ./waf --run simple-distributed
-    $ mpirun -np 4 -machinefile mpihosts ./waf --run 'nms-udp-nix --LAN=2 --CN=4 --nix=1'
+    $ ./waf --command-template="mpiexec -np 2 %s" --run simple-distributed
+    $ ./waf --command-template="mpiexec -np 2 -machinefile mpihosts %s --nix=0" --run nms-p2p-nix-distributed
             
-An examle using the null message synchronization algorithm::
+An example using the null message synchronization algorithm::
 
-    $ mpirun -np 2 ./waf --run simple-distributed --nullmsg
+    $ ./waf --command-template="mpiexec -np 2 %s --nullmsg" --run simple-distributed
 
 The np switch is the number of logical processors to use. The machinefile switch
 is which machines to use. In order to use machinefile, the target file must
@@ -200,12 +224,14 @@
 
 Or if you have a cluster of machines, you can name them.
 
-NOTE: Some users have experienced issues using mpirun and waf together. An
-alternative way to run distributed examples is shown below::
+The other alternative to `command-template` is to use `./waf shell`.  Here
+are the equivalent examples to the above (assuming optimized build profile)::
 
     $ ./waf shell
-    $ cd build/debug
-    $ mpirun -np 2 src/mpi/examples/simple-distributed
+    $ cd build/src/mpi/examples
+    $ mpiexec -np 2 ns3-dev-simple-distributed-optimized
+    $ mpiexec -np 2 -machinefile mpihosts ns3-dev-nms-p2p-nix-distributed-optimized --nix=0
+    $ mpiexec -np 2 ns3-dev-simple-distributed-optimized --nullmsg
 
 Setting synchronization algorithm to use
 ++++++++++++++++++++++++++++++++++++++++
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/netanim/bindings/callbacks_list.py ns-3.34/src/netanim/bindings/callbacks_list.py
--- ns-3.33/src/netanim/bindings/callbacks_list.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/netanim/bindings/callbacks_list.py	2021-07-14 10:31:07.000000000 -0700
@@ -27,7 +27,12 @@
     ['void', 'ns3::Ptr<ns3::Packet>', 'double', 'ns3::UanTxMode', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Packet>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::UanTxMode', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'double', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::Time', 'WifiPhyState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::WifiMode', 'ns3::WifiPreamble', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
@@ -39,7 +44,6 @@
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiPhyRxfailureReason', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'ns3::SignalNoiseDbm', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::HePreambleParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/netanim/bindings/modulegen__gcc_ILP32.py ns-3.34/src/netanim/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/netanim/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/netanim/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -20,24 +20,28 @@
 def register_types(module):
     root_module = module.get_root()
     
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'SIG_A_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'FILTERED'], import_from_module='ns.wifi')
-    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
-    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduField [enumeration]
+    module.add_enum('WifiPpduField', ['WIFI_PPDU_FIELD_PREAMBLE', 'WIFI_PPDU_FIELD_NON_HT_HEADER', 'WIFI_PPDU_FIELD_HT_SIG', 'WIFI_PPDU_FIELD_TRAINING', 'WIFI_PPDU_FIELD_SIG_A', 'WIFI_PPDU_FIELD_SIG_B', 'WIFI_PPDU_FIELD_DATA'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
+    module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
+    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
+    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
     module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_holland', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
+    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
     module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
-    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'], import_from_module='ns.wifi')
     ## ff-mac-common.h (module 'lte'): ns3::Result_e [enumeration]
     module.add_enum('Result_e', ['SUCCESS', 'FAILURE'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::SetupRelease_e [enumeration]
@@ -82,7 +86,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::BuildBroadcastListElement_s [struct]
     module.add_class('BuildBroadcastListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::BuildBroadcastListElement_s::Type_e [enumeration]
-    module.add_enum('Type_e', ['BCCH', 'PCCH'], outer_class=root_module['ns3::BuildBroadcastListElement_s'], import_from_module='ns.lte')
+    module.add_enum('Type_e', ['BCCH', 'PCCH', 'NotValid'], outer_class=root_module['ns3::BuildBroadcastListElement_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::BuildDataListElement_s [struct]
     module.add_class('BuildDataListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::BuildRarListElement_s [struct]
@@ -106,7 +110,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::CqiListElement_s [struct]
     module.add_class('CqiListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::CqiListElement_s::CqiType_e [enumeration]
-    module.add_enum('CqiType_e', ['P10', 'P11', 'P20', 'P21', 'A12', 'A22', 'A20', 'A30', 'A31'], outer_class=root_module['ns3::CqiListElement_s'], import_from_module='ns.lte')
+    module.add_enum('CqiType_e', ['P10', 'P11', 'P20', 'P21', 'A12', 'A22', 'A20', 'A30', 'A31', 'NotValid'], outer_class=root_module['ns3::CqiListElement_s'], import_from_module='ns.lte')
     ## data-rate.h (module 'network'): ns3::DataRate [class]
     module.add_class('DataRate', import_from_module='ns.network')
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::AttributeAccessor> [struct]
@@ -131,6 +135,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::NixVector'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Packet> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Packet'])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity> [struct]
+    module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::PhyEntity'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SpectrumModel> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::SpectrumModel'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SpectrumSignalParameters> [struct]
@@ -146,11 +152,11 @@
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s [struct]
     module.add_class('DlDciListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s::Format_e [enumeration]
-    module.add_enum('Format_e', ['ONE', 'ONE_A', 'ONE_B', 'ONE_C', 'ONE_D', 'TWO', 'TWO_A', 'TWO_B'], outer_class=root_module['ns3::DlDciListElement_s'], import_from_module='ns.lte')
+    module.add_enum('Format_e', ['ONE', 'ONE_A', 'ONE_B', 'ONE_C', 'ONE_D', 'TWO', 'TWO_A', 'TWO_B', 'NotValid_Dci_Format'], outer_class=root_module['ns3::DlDciListElement_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s::VrbFormat_e [enumeration]
-    module.add_enum('VrbFormat_e', ['VRB_DISTRIBUTED', 'VRB_LOCALIZED'], outer_class=root_module['ns3::DlDciListElement_s'], import_from_module='ns.lte')
+    module.add_enum('VrbFormat_e', ['VRB_DISTRIBUTED', 'VRB_LOCALIZED', 'NotValid_VRB_Format'], outer_class=root_module['ns3::DlDciListElement_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s::Ngap_e [enumeration]
-    module.add_enum('Ngap_e', ['GAP1', 'GAP2'], outer_class=root_module['ns3::DlDciListElement_s'], import_from_module='ns.lte')
+    module.add_enum('Ngap_e', ['GAP1', 'GAP2', 'NotValid_Ngap'], outer_class=root_module['ns3::DlDciListElement_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::DlInfoListElement_s [struct]
     module.add_class('DlInfoListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::DlInfoListElement_s::HarqStatus_e [enumeration]
@@ -201,13 +207,11 @@
     module.add_class('Hasher', import_from_module='ns.core')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo [struct]
     module.add_class('HeMuUserInfo', import_from_module='ns.wifi')
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters [struct]
-    module.add_class('HePreambleParameters', import_from_module='ns.wifi')
     ## he-ru.h (module 'wifi'): ns3::HeRu [class]
     module.add_class('HeRu', import_from_module='ns.wifi')
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuType [enumeration]
     module.add_enum('RuType', ['RU_26_TONE', 'RU_52_TONE', 'RU_106_TONE', 'RU_242_TONE', 'RU_484_TONE', 'RU_996_TONE', 'RU_2x996_TONE'], outer_class=root_module['ns3::HeRu'], import_from_module='ns.wifi')
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [struct]
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [class]
     module.add_class('RuSpec', import_from_module='ns.wifi', outer_class=root_module['ns3::HeRu'])
     typehandlers.add_type_alias('std::pair< short, short >', 'ns3::HeRu::SubcarrierRange')
     typehandlers.add_type_alias('std::pair< short, short >*', 'ns3::HeRu::SubcarrierRange*')
@@ -215,10 +219,6 @@
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >', 'ns3::HeRu::SubcarrierGroup')
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >*', 'ns3::HeRu::SubcarrierGroup*')
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >&', 'ns3::HeRu::SubcarrierGroup&')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec', 'ns3::HeRu::RuSpec')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec*', 'ns3::HeRu::RuSpec*')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec&', 'ns3::HeRu::RuSpec&')
-    module.add_typedef(root_module['ns3::HeRu::RuSpec'], 'RuSpec')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >', 'ns3::HeRu::BwTonesPair')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >*', 'ns3::HeRu::BwTonesPair*')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >&', 'ns3::HeRu::BwTonesPair&')
@@ -239,12 +239,12 @@
     root_module['ns3::InetSocketAddress'].implicitly_converts_to(root_module['ns3::Address'])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper [class]
     module.add_class('InterferenceHelper', import_from_module='ns.wifi')
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer [struct]
-    module.add_class('SnrPer', import_from_module='ns.wifi', outer_class=root_module['ns3::InterferenceHelper'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -255,6 +255,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -265,9 +267,9 @@
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s [struct]
     module.add_class('LogicalChannelConfigListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s::Direction_e [enumeration]
-    module.add_enum('Direction_e', ['DIR_UL', 'DIR_DL', 'DIR_BOTH'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'], import_from_module='ns.lte')
+    module.add_enum('Direction_e', ['DIR_UL', 'DIR_DL', 'DIR_BOTH', 'NotValid'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s::QosBearerType_e [enumeration]
-    module.add_enum('QosBearerType_e', ['QBT_NON_GBR', 'QBT_GBR'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'], import_from_module='ns.lte')
+    module.add_enum('QosBearerType_e', ['QBT_NON_GBR', 'QBT_GBR', 'NotValid_QosBearerType'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'], import_from_module='ns.lte')
     ## lte-enb-cphy-sap.h (module 'lte'): ns3::LteEnbCphySapProvider [class]
     module.add_class('LteEnbCphySapProvider', allow_subclassing=True, import_from_module='ns.lte')
     ## lte-enb-cphy-sap.h (module 'lte'): ns3::LteEnbCphySapUser [class]
@@ -510,10 +512,10 @@
     ## ff-mac-common.h (module 'lte'): ns3::MacCeListElement_s [struct]
     module.add_class('MacCeListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::MacCeListElement_s::MacCeType_e [enumeration]
-    module.add_enum('MacCeType_e', ['BSR', 'PHR', 'CRNTI'], outer_class=root_module['ns3::MacCeListElement_s'], import_from_module='ns.lte')
+    module.add_enum('MacCeType_e', ['BSR', 'PHR', 'CRNTI', 'NotValid'], outer_class=root_module['ns3::MacCeListElement_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::MacCeValue_u [struct]
     module.add_class('MacCeValue_u', import_from_module='ns.lte')
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo [struct]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo [struct]
     module.add_class('MpduInfo', import_from_module='ns.wifi')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
     module.add_class('NodeContainer', import_from_module='ns.network')
@@ -554,7 +556,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::PhichListElement_s [struct]
     module.add_class('PhichListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::PhichListElement_s::Phich_e [enumeration]
-    module.add_enum('Phich_e', ['ACK', 'NACK'], outer_class=root_module['ns3::PhichListElement_s'], import_from_module='ns.lte')
+    module.add_enum('Phich_e', ['ACK', 'NACK', 'NotValid'], outer_class=root_module['ns3::PhichListElement_s'], import_from_module='ns.lte')
     ## lte-common.h (module 'lte'): ns3::PhyReceptionStatParameters [struct]
     module.add_class('PhyReceptionStatParameters', import_from_module='ns.lte')
     typehandlers.add_type_alias('void ( * ) ( ns3::PhyReceptionStatParameters const )', 'ns3::PhyReceptionStatParameters::TracedCallback')
@@ -573,13 +575,15 @@
     module.add_enum('Side', ['RIGHT', 'LEFT', 'TOP', 'BOTTOM'], outer_class=root_module['ns3::Rectangle'], import_from_module='ns.mobility')
     ## ff-mac-common.h (module 'lte'): ns3::RlcPduListElement_s [struct]
     module.add_class('RlcPduListElement_s', import_from_module='ns.lte')
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo [struct]
+    module.add_class('RxSignalInfo', import_from_module='ns.wifi')
     ## ff-mac-common.h (module 'lte'): ns3::SbMeasResult_s [struct]
     module.add_class('SbMeasResult_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::SiConfiguration_s [struct]
     module.add_class('SiConfiguration_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::SiMessageListElement_s [struct]
     module.add_class('SiMessageListElement_s', import_from_module='ns.lte')
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm [struct]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm [struct]
     module.add_class('SignalNoiseDbm', import_from_module='ns.wifi')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::ObjectBase'], template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'])
@@ -652,7 +656,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::UlCqi_s [struct]
     module.add_class('UlCqi_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::UlCqi_s::Type_e [enumeration]
-    module.add_enum('Type_e', ['SRS', 'PUSCH', 'PUCCH_1', 'PUCCH_2', 'PRACH'], outer_class=root_module['ns3::UlCqi_s'], import_from_module='ns.lte')
+    module.add_enum('Type_e', ['SRS', 'PUSCH', 'PUCCH_1', 'PUCCH_2', 'PRACH', 'NotValid'], outer_class=root_module['ns3::UlCqi_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::UlDciListElement_s [struct]
     module.add_class('UlDciListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::UlGrant_s [struct]
@@ -671,6 +675,32 @@
     module.add_class('WifiMode', import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
     module.add_class('WifiModeFactory', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::CodeRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::CodeRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::CodeRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel [class]
+    module.add_class('WifiPhyOperatingChannel', import_from_module='ns.wifi')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory [class]
     module.add_class('WifiSpectrumValue5MhzFactory', allow_subclassing=True, import_from_module='ns.spectrum')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValueHelper [class]
@@ -700,16 +730,12 @@
     module.add_enum('Qci', ['GBR_CONV_VOICE', 'GBR_CONV_VIDEO', 'GBR_GAMING', 'GBR_NON_CONV_VIDEO', 'GBR_MC_PUSH_TO_TALK', 'GBR_NMC_PUSH_TO_TALK', 'GBR_MC_VIDEO', 'GBR_V2X', 'NGBR_IMS', 'NGBR_VIDEO_TCP_OPERATOR', 'NGBR_VOICE_VIDEO_GAMING', 'NGBR_VIDEO_TCP_PREMIUM', 'NGBR_VIDEO_TCP_DEFAULT', 'NGBR_MC_DELAY_SIGNAL', 'NGBR_MC_DATA', 'NGBR_V2X', 'NGBR_LOW_LAT_EMBB', 'DGBR_DISCRETE_AUT_SMALL', 'DGBR_DISCRETE_AUT_LARGE', 'DGBR_ITS', 'DGBR_ELECTRICITY'], outer_class=root_module['ns3::EpsBearer'], import_from_module='ns.lte')
     ## header.h (module 'network'): ns3::Header [class]
     module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader [class]
-    module.add_class('HtSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## ipv4-header.h (module 'internet'): ns3::Ipv4Header [class]
     module.add_class('Ipv4Header', import_from_module='ns.internet', parent=root_module['ns3::Header'])
     ## ipv4-header.h (module 'internet'): ns3::Ipv4Header::DscpType [enumeration]
     module.add_enum('DscpType', ['DscpDefault', 'DSCP_CS1', 'DSCP_AF11', 'DSCP_AF12', 'DSCP_AF13', 'DSCP_CS2', 'DSCP_AF21', 'DSCP_AF22', 'DSCP_AF23', 'DSCP_CS3', 'DSCP_AF31', 'DSCP_AF32', 'DSCP_AF33', 'DSCP_CS4', 'DSCP_AF41', 'DSCP_AF42', 'DSCP_AF43', 'DSCP_CS5', 'DSCP_EF', 'DSCP_CS6', 'DSCP_CS7'], outer_class=root_module['ns3::Ipv4Header'], import_from_module='ns.internet')
     ## ipv4-header.h (module 'internet'): ns3::Ipv4Header::EcnType [enumeration]
     module.add_enum('EcnType', ['ECN_NotECT', 'ECN_ECT1', 'ECN_ECT0', 'ECN_CE'], outer_class=root_module['ns3::Ipv4Header'], import_from_module='ns.internet')
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader [class]
-    module.add_class('LSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteEnbRrcSapProvider [class]
     module.add_class('LteEnbRrcSapProvider', import_from_module='ns.lte', parent=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteEnbRrcSapProvider::CompleteSetupUeParameters [struct]
@@ -769,6 +795,8 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PhyEntity', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PhyEntity>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumModel', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumModel>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > [class]
@@ -878,21 +906,10 @@
     module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## ff-mac-common.h (module 'lte'): ns3::VendorSpecificValue [struct]
     module.add_class('VendorSpecificValue', import_from_module='ns.lte', parent=root_module['ns3::SimpleRefCount< ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> >'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader [class]
-    module.add_class('VhtSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## random-variable-stream.h (module 'core'): ns3::WeibullRandomVariable [class]
     module.add_class('WeibullRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy [class]
     module.add_class('WifiPhy', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >', 'ns3::WifiPhy::ChannelNumberBandPair')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >*', 'ns3::WifiPhy::ChannelNumberBandPair*')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >&', 'ns3::WifiPhy::ChannelNumberBandPair&')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >', 'ns3::WifiPhy::ChannelNumberStandardPair')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >*', 'ns3::WifiPhy::ChannelNumberStandardPair*')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >&', 'ns3::WifiPhy::ChannelNumberStandardPair&')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >', 'ns3::WifiPhy::FrequencyWidthPair')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >*', 'ns3::WifiPhy::FrequencyWidthPair*')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >&', 'ns3::WifiPhy::FrequencyWidthPair&')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )', 'ns3::WifiPhy::MonitorSnifferRxCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )*', 'ns3::WifiPhy::MonitorSnifferRxCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )&', 'ns3::WifiPhy::MonitorSnifferRxCallback&')
@@ -902,9 +919,6 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )', 'ns3::WifiPhy::PsduTxBeginCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )*', 'ns3::WifiPhy::PsduTxBeginCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )&', 'ns3::WifiPhy::PsduTxBeginCallback&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )', 'ns3::WifiPhy::EndOfHePreambleCallback')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )*', 'ns3::WifiPhy::EndOfHePreambleCallback*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )&', 'ns3::WifiPhy::EndOfHePreambleCallback&')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )*', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )&', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback&')
@@ -965,8 +979,6 @@
     typehandlers.add_type_alias('ns3::Callback< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::DeviceEnergyModel::ChangeStateCallback')
     typehandlers.add_type_alias('ns3::Callback< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::DeviceEnergyModel::ChangeStateCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::DeviceEnergyModel::ChangeStateCallback&')
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader [class]
-    module.add_class('DsssSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable [class]
     module.add_class('EmpiricalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor [class]
@@ -991,8 +1003,6 @@
     module.add_class('FriisPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable [class]
     module.add_class('GammaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader [class]
-    module.add_class('HeSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## ipv4.h (module 'internet'): ns3::Ipv4 [class]
     module.add_class('Ipv4', import_from_module='ns.internet', parent=root_module['ns3::Object'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
@@ -1162,6 +1172,20 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::Packet::SinrTracedCallback&')
     ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable [class]
     module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity [class]
+    module.add_class('PhyEntity', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyRxFailureAction [enumeration]
+    module.add_enum('PhyRxFailureAction', ['DROP', 'ABORT', 'IGNORE'], outer_class=root_module['ns3::PhyEntity'], import_from_module='ns.wifi')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus [struct]
+    module.add_class('PhyFieldRxStatus', import_from_module='ns.wifi', outer_class=root_module['ns3::PhyEntity'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer [struct]
+    module.add_class('SnrPer', import_from_module='ns.wifi', outer_class=root_module['ns3::PhyEntity'])
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >', 'ns3::PhyEntity::PhyHeaderChunkInfo')
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >*', 'ns3::PhyEntity::PhyHeaderChunkInfo*')
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >&', 'ns3::PhyEntity::PhyHeaderChunkInfo&')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', 'ns3::PhyEntity::PhyHeaderSections')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >*', 'ns3::PhyEntity::PhyHeaderSections*')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >&', 'ns3::PhyEntity::PhyHeaderSections&')
     ## pointer.h (module 'core'): ns3::PointerChecker [class]
     module.add_class('PointerChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## pointer.h (module 'core'): ns3::PointerValue [class]
@@ -1233,16 +1257,24 @@
     module.add_class('BurstErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv4Header &', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ipv4L3Protocol::DropReason', 'ns3::Ptr<ns3::Ipv4>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv4Header &', 'ns3::Ptr<const ns3::Packet>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::HePreambleParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::PhyReceptionStatParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::PhyReceptionStatParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::PhyTransmissionStatParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1291,8 +1323,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::SpectrumSignalParameters>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'double', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1356,6 +1388,7 @@
     module.add_container('std::vector< ns3::UlDciListElement_s >', 'ns3::UlDciListElement_s', container_type='vector')
     module.add_container('std::vector< ns3::PhichListElement_s >', 'ns3::PhichListElement_s', container_type='vector')
     module.add_container('std::vector< std::pair< short, short > >', 'std::pair< short, short >', container_type='vector')
+    module.add_container('std::vector< ns3::HeRu::RuSpec >', 'ns3::HeRu::RuSpec', container_type='vector')
     module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
     module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('ns3::RxPowerWattPerChannelBand', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
@@ -1387,37 +1420,47 @@
     module.add_container('ns3::Bands', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::list< ns3::UanPacketArrival >', 'ns3::UanPacketArrival', container_type='list')
     module.add_container('std::list< ns3::Ptr< ns3::UanPhy > >', 'ns3::Ptr< ns3::UanPhy >', container_type='list')
+    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiConstPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
+    module.add_container('std::list< ns3::WifiMode >', 'ns3::WifiMode', container_type='list')
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
     module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     module.add_container('ns3::HarqProcessInfoList_t', 'ns3::HarqProcessInfoElement_t', container_type='vector')
     module.add_container('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ns3::Ptr< ns3::LteControlMessage >', container_type='list')
+    module.add_container('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
+    module.add_container('ns3::PhyEntity::PhyHeaderSections', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
     module.add_container('std::map< std::pair< unsigned int, unsigned int >, double >', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
     module.add_container('std::list< ns3::UlDciLteControlMessage >', 'ns3::UlDciLteControlMessage', container_type='list')
     module.add_container('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierUe > >', ('unsigned char', 'ns3::Ptr< ns3::ComponentCarrierUe >'), container_type='map')
     module.add_container('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', ('unsigned char', 'ns3::Ptr< ns3::ComponentCarrierBaseStation >'), container_type='map')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxOkCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxOkCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxOkCallback&')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', 'ns3::FrequencyChannelInfo')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >*', 'ns3::FrequencyChannelInfo*')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >&', 'ns3::FrequencyChannelInfo&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxOkCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxOkCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxOkCallback&')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxErrorCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxErrorCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxErrorCallback&')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >', 'ns3::RxPowerWattPerChannelBand')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >*', 'ns3::RxPowerWattPerChannelBand*')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >&', 'ns3::RxPowerWattPerChannelBand&')
+    typehandlers.add_type_alias('std::pair< unsigned int, unsigned int >', 'ns3::WifiSpectrumBand')
+    typehandlers.add_type_alias('std::pair< unsigned int, unsigned int >*', 'ns3::WifiSpectrumBand*')
+    typehandlers.add_type_alias('std::pair< unsigned int, unsigned int >&', 'ns3::WifiSpectrumBand&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
-    typehandlers.add_type_alias('std::pair< unsigned int, unsigned int >', 'ns3::WifiSpectrumBand')
-    typehandlers.add_type_alias('std::pair< unsigned int, unsigned int >*', 'ns3::WifiSpectrumBand*')
-    typehandlers.add_type_alias('std::pair< unsigned int, unsigned int >&', 'ns3::WifiSpectrumBand&')
+    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
+    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
+    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('std::map< ns3::TbId_t, ns3::tbInfo_t >', 'ns3::expectedTbs_t')
     typehandlers.add_type_alias('std::map< ns3::TbId_t, ns3::tbInfo_t >*', 'ns3::expectedTbs_t*')
     typehandlers.add_type_alias('std::map< ns3::TbId_t, ns3::tbInfo_t >&', 'ns3::expectedTbs_t&')
@@ -1611,6 +1654,7 @@
     register_Ns3DefaultDeleter__Ns3LteHarqPhy_methods(root_module, root_module['ns3::DefaultDeleter< ns3::LteHarqPhy >'])
     register_Ns3DefaultDeleter__Ns3NixVector_methods(root_module, root_module['ns3::DefaultDeleter< ns3::NixVector >'])
     register_Ns3DefaultDeleter__Ns3Packet_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Packet >'])
+    register_Ns3DefaultDeleter__Ns3PhyEntity_methods(root_module, root_module['ns3::DefaultDeleter< ns3::PhyEntity >'])
     register_Ns3DefaultDeleter__Ns3SpectrumModel_methods(root_module, root_module['ns3::DefaultDeleter< ns3::SpectrumModel >'])
     register_Ns3DefaultDeleter__Ns3SpectrumSignalParameters_methods(root_module, root_module['ns3::DefaultDeleter< ns3::SpectrumSignalParameters >'])
     register_Ns3DefaultDeleter__Ns3SpectrumValue_methods(root_module, root_module['ns3::DefaultDeleter< ns3::SpectrumValue >'])
@@ -1642,7 +1686,6 @@
     register_Ns3HarqProcessInfoElement_t_methods(root_module, root_module['ns3::HarqProcessInfoElement_t'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3HeMuUserInfo_methods(root_module, root_module['ns3::HeMuUserInfo'])
-    register_Ns3HePreambleParameters_methods(root_module, root_module['ns3::HePreambleParameters'])
     register_Ns3HeRu_methods(root_module, root_module['ns3::HeRu'])
     register_Ns3HeRuRuSpec_methods(root_module, root_module['ns3::HeRu::RuSpec'])
     register_Ns3HigherLayerSelected_s_methods(root_module, root_module['ns3::HigherLayerSelected_s'])
@@ -1650,11 +1693,12 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3InterferenceHelper_methods(root_module, root_module['ns3::InterferenceHelper'])
-    register_Ns3InterferenceHelperSnrPer_methods(root_module, root_module['ns3::InterferenceHelper::SnrPer'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3LogicalChannelConfigListElement_s_methods(root_module, root_module['ns3::LogicalChannelConfigListElement_s'])
@@ -1781,6 +1825,7 @@
     register_Ns3RachListElement_s_methods(root_module, root_module['ns3::RachListElement_s'])
     register_Ns3Rectangle_methods(root_module, root_module['ns3::Rectangle'])
     register_Ns3RlcPduListElement_s_methods(root_module, root_module['ns3::RlcPduListElement_s'])
+    register_Ns3RxSignalInfo_methods(root_module, root_module['ns3::RxSignalInfo'])
     register_Ns3SbMeasResult_s_methods(root_module, root_module['ns3::SbMeasResult_s'])
     register_Ns3SiConfiguration_s_methods(root_module, root_module['ns3::SiConfiguration_s'])
     register_Ns3SiMessageListElement_s_methods(root_module, root_module['ns3::SiMessageListElement_s'])
@@ -1817,6 +1862,7 @@
     register_Ns3VendorSpecificListElement_s_methods(root_module, root_module['ns3::VendorSpecificListElement_s'])
     register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
     register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
+    register_Ns3WifiPhyOperatingChannel_methods(root_module, root_module['ns3::WifiPhyOperatingChannel'])
     register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, root_module['ns3::WifiSpectrumValue5MhzFactory'])
     register_Ns3WifiSpectrumValueHelper_methods(root_module, root_module['ns3::WifiSpectrumValueHelper'])
     register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
@@ -1828,9 +1874,7 @@
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3EpsBearer_methods(root_module, root_module['ns3::EpsBearer'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
-    register_Ns3HtSigHeader_methods(root_module, root_module['ns3::HtSigHeader'])
     register_Ns3Ipv4Header_methods(root_module, root_module['ns3::Ipv4Header'])
-    register_Ns3LSigHeader_methods(root_module, root_module['ns3::LSigHeader'])
     register_Ns3LteEnbRrcSapProvider_methods(root_module, root_module['ns3::LteEnbRrcSapProvider'])
     register_Ns3LteEnbRrcSapProviderCompleteSetupUeParameters_methods(root_module, root_module['ns3::LteEnbRrcSapProvider::CompleteSetupUeParameters'])
     register_Ns3LteEnbRrcSapUser_methods(root_module, root_module['ns3::LteEnbRrcSapUser'])
@@ -1859,6 +1903,7 @@
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >'])
     register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >'])
     register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >'])
     register_Ns3SimpleRefCount__Ns3SpectrumSignalParameters_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumSignalParameters__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >'])
     register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >'])
@@ -1897,7 +1942,6 @@
     register_Ns3UanTransducer_methods(root_module, root_module['ns3::UanTransducer'])
     register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
     register_Ns3VendorSpecificValue_methods(root_module, root_module['ns3::VendorSpecificValue'])
-    register_Ns3VhtSigHeader_methods(root_module, root_module['ns3::VhtSigHeader'])
     register_Ns3WeibullRandomVariable_methods(root_module, root_module['ns3::WeibullRandomVariable'])
     register_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
     register_Ns3WifiPhyStateHelper_methods(root_module, root_module['ns3::WifiPhyStateHelper'])
@@ -1921,7 +1965,6 @@
     register_Ns3DataRateValue_methods(root_module, root_module['ns3::DataRateValue'])
     register_Ns3DeterministicRandomVariable_methods(root_module, root_module['ns3::DeterministicRandomVariable'])
     register_Ns3DeviceEnergyModel_methods(root_module, root_module['ns3::DeviceEnergyModel'])
-    register_Ns3DsssSigHeader_methods(root_module, root_module['ns3::DsssSigHeader'])
     register_Ns3EmpiricalRandomVariable_methods(root_module, root_module['ns3::EmpiricalRandomVariable'])
     register_Ns3EmptyAttributeAccessor_methods(root_module, root_module['ns3::EmptyAttributeAccessor'])
     register_Ns3EmptyAttributeChecker_methods(root_module, root_module['ns3::EmptyAttributeChecker'])
@@ -1934,7 +1977,6 @@
     register_Ns3FixedRssLossModel_methods(root_module, root_module['ns3::FixedRssLossModel'])
     register_Ns3FriisPropagationLossModel_methods(root_module, root_module['ns3::FriisPropagationLossModel'])
     register_Ns3GammaRandomVariable_methods(root_module, root_module['ns3::GammaRandomVariable'])
-    register_Ns3HeSigHeader_methods(root_module, root_module['ns3::HeSigHeader'])
     register_Ns3Ipv4_methods(root_module, root_module['ns3::Ipv4'])
     register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
     register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
@@ -1976,6 +2018,9 @@
     register_Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::OutputStreamWrapper'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
     register_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
+    register_Ns3PhyEntity_methods(root_module, root_module['ns3::PhyEntity'])
+    register_Ns3PhyEntityPhyFieldRxStatus_methods(root_module, root_module['ns3::PhyEntity::PhyFieldRxStatus'])
+    register_Ns3PhyEntitySnrPer_methods(root_module, root_module['ns3::PhyEntity::SnrPer'])
     register_Ns3PointerChecker_methods(root_module, root_module['ns3::PointerChecker'])
     register_Ns3PointerValue_methods(root_module, root_module['ns3::PointerValue'])
     register_Ns3RachPreambleLteControlMessage_methods(root_module, root_module['ns3::RachPreambleLteControlMessage'])
@@ -2006,11 +2051,15 @@
     register_Ns3BsrLteControlMessage_methods(root_module, root_module['ns3::BsrLteControlMessage'])
     register_Ns3BurstErrorModel_methods(root_module, root_module['ns3::BurstErrorModel'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3HePreambleParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3PhyReceptionStatParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::PhyReceptionStatParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3PhyTransmissionStatParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::PhyTransmissionStatParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Ptr__lt__const_ns3MobilityModel__gt___Double_Double_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2035,7 +2084,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3SpectrumSignalParameters__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Double_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2824,6 +2873,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2986,6 +3043,18 @@
                    is_static=True)
     return
 
+def register_Ns3DefaultDeleter__Ns3PhyEntity_methods(root_module, cls):
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity>::DefaultDeleter() [constructor]
+    cls.add_constructor([])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity>::DefaultDeleter(ns3::DefaultDeleter<ns3::PhyEntity> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DefaultDeleter< ns3::PhyEntity > const &', 'arg0')])
+    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::PhyEntity>::Delete(ns3::PhyEntity * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::PhyEntity *', 'object')], 
+                   is_static=True)
+    return
+
 def register_Ns3DefaultDeleter__Ns3SpectrumModel_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SpectrumModel>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -3625,41 +3694,60 @@
     cls.add_instance_attribute('ru', 'ns3::HeRu::RuSpec', is_const=False)
     return
 
-def register_Ns3HePreambleParameters_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::HePreambleParameters() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::HePreambleParameters(ns3::HePreambleParameters const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HePreambleParameters const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::bssColor [variable]
-    cls.add_instance_attribute('bssColor', 'uint8_t', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::rssiW [variable]
-    cls.add_instance_attribute('rssiW', 'double', is_const=False)
-    return
-
 def register_Ns3HeRu_methods(root_module, cls):
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu() [constructor]
     cls.add_constructor([])
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, ns3::HeRu::SubcarrierGroup const & toneRanges) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('ns3::HeRu::SubcarrierGroup const &', 'toneRanges')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuSpec ns3::HeRu::FindOverlappingRu(uint16_t bw, ns3::HeRu::RuSpec referenceRu, ns3::HeRu::RuType searchedRuType) [member function]
+    cls.add_method('FindOverlappingRu', 
+                   'ns3::HeRu::RuSpec', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'referenceRu'), param('ns3::HeRu::RuType', 'searchedRuType')], 
+                   is_static=True)
     ## he-ru.h (module 'wifi'): static uint16_t ns3::HeRu::GetBandwidth(ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetBandwidth', 
                    'uint16_t', 
                    [param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetCentral26TonesRus', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations, std::size_t & nCentral26TonesRus) [member function]
     cls.add_method('GetEqualSizedRusForStations', 
                    'ns3::HeRu::RuType', 
-                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations')], 
+                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations'), param('std::size_t &', 'nCentral26TonesRus')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint8_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetNRus', 
                    'std::size_t', 
-                   [param('uint8_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetRuType(uint16_t bandwidth) [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [param('uint16_t', 'bandwidth')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetRusOfType', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint8_t bw, ns3::HeRu::RuType ruType, std::size_t index) [member function]
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint16_t bw, ns3::HeRu::RuType ruType, std::size_t phyIndex) [member function]
     cls.add_method('GetSubcarrierGroup', 
                    'ns3::HeRu::SubcarrierGroup', 
-                   [param('uint8_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index')], 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'phyIndex')], 
                    is_static=True)
     ## he-ru.h (module 'wifi'): ns3::HeRu::m_heRuSubcarrierGroups [variable]
     cls.add_static_attribute('m_heRuSubcarrierGroups', 'ns3::HeRu::SubcarrierGroups const', is_const=True)
@@ -3667,16 +3755,41 @@
 
 def register_Ns3HeRuRuSpec_methods(root_module, cls):
     cls.add_output_stream_operator()
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec() [constructor]
-    cls.add_constructor([])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::index [variable]
-    cls.add_instance_attribute('index', 'std::size_t', is_const=False)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::primary80MHz [variable]
-    cls.add_instance_attribute('primary80MHz', 'bool', is_const=False)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::ruType [variable]
-    cls.add_instance_attribute('ruType', 'ns3::HeRu::RuType', is_const=False)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
+    cls.add_constructor([])
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuType ruType, std::size_t index, bool primary80MHz) [constructor]
+    cls.add_constructor([param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index'), param('bool', 'primary80MHz')])
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetIndex() const [member function]
+    cls.add_method('GetIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetPhyIndex() const [member function]
+    cls.add_method('GetPhyIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::GetPrimary80MHz() const [member function]
+    cls.add_method('GetPrimary80MHz', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType ns3::HeRu::RuSpec::GetRuType() const [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::IsPhyIndexSet() const [member function]
+    cls.add_method('IsPhyIndexSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): void ns3::HeRu::RuSpec::SetPhyIndex(uint16_t bw, uint8_t p20Index) [member function]
+    cls.add_method('SetPhyIndex', 
+                   'void', 
+                   [param('uint16_t', 'bw'), param('uint8_t', 'p20Index')])
     return
 
 def register_Ns3HigherLayerSelected_s_methods(root_module, cls):
@@ -3805,10 +3918,10 @@
     cls.add_constructor([param('ns3::InterferenceHelper const &', 'arg0')])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper() [constructor]
     cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::InterferenceHelper::Add(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::InterferenceHelper::Add(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [member function]
     cls.add_method('Add', 
                    'ns3::Ptr< ns3::Event >', 
-                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')])
     ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddBand(ns3::WifiSpectrumBand band) [member function]
     cls.add_method('AddBand', 
                    'void', 
@@ -3817,21 +3930,16 @@
     cls.add_method('AddForeignSignal', 
                    'void', 
                    [param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateHtPhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('CalculateHtPhyHeaderSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
-                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateNonHtPhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('CalculateNonHtPhyHeaderSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
-                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculatePayloadSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, uint16_t staId, std::pair<ns3::Time, ns3::Time> relativeMpduStartStop) const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::InterferenceHelper::CalculatePayloadSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, uint16_t staId, std::pair<ns3::Time, ns3::Time> relativeMpduStartStop) const [member function]
     cls.add_method('CalculatePayloadSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
                    [param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'channelWidth'), param('std::pair< unsigned int, unsigned int >', 'band'), param('uint16_t', 'staId'), param('std::pair< ns3::Time, ns3::Time >', 'relativeMpduStartStop')], 
                    is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::InterferenceHelper::CalculatePhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, ns3::WifiPpduField header) const [member function]
+    cls.add_method('CalculatePhyHeaderSnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'channelWidth'), param('std::pair< unsigned int, unsigned int >', 'band'), param('ns3::WifiPpduField', 'header')], 
+                   is_const=True)
     ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateSnr(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, uint8_t nss, ns3::WifiSpectrumBand band) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
@@ -3841,20 +3949,19 @@
     cls.add_method('EraseEvents', 
                    'void', 
                    [])
-    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW, ns3::WifiSpectrumBand band) const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW, ns3::WifiSpectrumBand band) [member function]
     cls.add_method('GetEnergyDuration', 
                    'ns3::Time', 
-                   [param('double', 'energyW'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
+                   [param('double', 'energyW'), param('std::pair< unsigned int, unsigned int >', 'band')])
     ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::ErrorRateModel> ns3::InterferenceHelper::GetErrorRateModel() const [member function]
     cls.add_method('GetErrorRateModel', 
                    'ns3::Ptr< ns3::ErrorRateModel >', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd() [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd(ns3::Time endTime) [member function]
     cls.add_method('NotifyRxEnd', 
                    'void', 
-                   [])
+                   [param('ns3::Time', 'endTime')])
     ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxStart() [member function]
     cls.add_method('NotifyRxStart', 
                    'void', 
@@ -3875,10 +3982,19 @@
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint8_t', 'rx')])
-    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiMode mode, ns3::WifiTxVector txVector) const [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiMode mode, ns3::WifiTxVector const & txVector, ns3::WifiPpduField field) const [member function]
     cls.add_method('CalculateChunkSuccessRate', 
                    'double', 
-                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector')], 
+                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPpduField', 'field')], 
+                   is_const=True, visibility='protected')
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculatePayloadChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
+    cls.add_method('CalculatePayloadChunkSuccessRate', 
+                   'double', 
+                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True, visibility='protected')
     ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateSnr(double signal, double noiseInterference, uint16_t channelWidth, uint8_t nss) const [member function]
     cls.add_method('CalculateSnr', 
@@ -3887,17 +4003,6 @@
                    is_const=True, visibility='protected')
     return
 
-def register_Ns3InterferenceHelperSnrPer_methods(root_module, cls):
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer() [constructor]
-    cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer(ns3::InterferenceHelper::SnrPer const & arg0) [constructor]
-    cls.add_constructor([param('ns3::InterferenceHelper::SnrPer const &', 'arg0')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::per [variable]
-    cls.add_instance_attribute('per', 'double', is_const=False)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::snr [variable]
-    cls.add_instance_attribute('snr', 'double', is_const=False)
-    return
-
 def register_Ns3Ipv4Address_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -4021,6 +4126,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -4295,6 +4412,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -4370,6 +4492,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -4390,6 +4524,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -6248,13 +6387,13 @@
     return
 
 def register_Ns3MpduInfo_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::MpduInfo() [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::MpduInfo() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::MpduInfo(ns3::MpduInfo const & arg0) [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::MpduInfo(ns3::MpduInfo const & arg0) [constructor]
     cls.add_constructor([param('ns3::MpduInfo const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::mpduRefNumber [variable]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::mpduRefNumber [variable]
     cls.add_instance_attribute('mpduRefNumber', 'uint32_t', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::type [variable]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::type [variable]
     cls.add_instance_attribute('type', 'ns3::MpduType', is_const=False)
     return
 
@@ -6830,6 +6969,18 @@
     cls.add_instance_attribute('m_size', 'uint16_t', is_const=False)
     return
 
+def register_Ns3RxSignalInfo_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::RxSignalInfo() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::RxSignalInfo(ns3::RxSignalInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RxSignalInfo const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::rssi [variable]
+    cls.add_instance_attribute('rssi', 'double', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
+    return
+
 def register_Ns3SbMeasResult_s_methods(root_module, cls):
     ## ff-mac-common.h (module 'lte'): ns3::SbMeasResult_s::SbMeasResult_s() [constructor]
     cls.add_constructor([])
@@ -6870,13 +7021,13 @@
     return
 
 def register_Ns3SignalNoiseDbm_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm() [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm(ns3::SignalNoiseDbm const & arg0) [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm(ns3::SignalNoiseDbm const & arg0) [constructor]
     cls.add_constructor([param('ns3::SignalNoiseDbm const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::noise [variable]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::noise [variable]
     cls.add_instance_attribute('noise', 'double', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::signal [variable]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::signal [variable]
     cls.add_instance_attribute('signal', 'double', is_const=False)
     return
 
@@ -7744,6 +7895,11 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
+    ## uan-phy.h (module 'uan'): void ns3::UanPhyListener::NotifyTxEnd() [member function]
+    cls.add_method('NotifyTxEnd', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
     ## uan-phy.h (module 'uan'): void ns3::UanPhyListener::NotifyTxStart(ns3::Time duration) [member function]
     cls.add_method('NotifyTxStart', 
                    'void', 
@@ -8014,6 +8170,7 @@
 
 def register_Ns3WifiMode_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
     cls.add_output_stream_operator()
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [constructor]
@@ -8037,10 +8194,10 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector txVector, uint16_t staId=65535) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetDataRate', 
@@ -8067,10 +8224,15 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector txVector) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint16_t channelWidth) const [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'channelWidth')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -8107,18 +8269,67 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
     return
 
+def register_Ns3WifiPhyOperatingChannel_methods(root_module, cls):
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel(ns3::WifiPhyOperatingChannel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhyOperatingChannel const &', 'arg0')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetNumber() const [member function]
+    cls.add_method('GetNumber', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelCenterFrequency(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelCenterFrequency', 
+                   'uint16_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelIndex(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelIndex', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetWidth() const [member function]
+    cls.add_method('GetWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): bool ns3::WifiPhyOperatingChannel::IsSet() const [member function]
+    cls.add_method('IsSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('SetDefault', 
+                   'void', 
+                   [param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetPrimary20Index(uint8_t index) [member function]
+    cls.add_method('SetPrimary20Index', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    return
+
 def register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, cls):
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory::WifiSpectrumValue5MhzFactory() [constructor]
     cls.add_constructor([])
@@ -8151,6 +8362,11 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeMuOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, ns3::WifiSpectrumBand ru) [member function]
+    cls.add_method('CreateHeMuOfdmTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('uint32_t', 'centerFrequency'), param('uint16_t', 'channelWidth'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'ru')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40) [member function]
     cls.add_method('CreateHeOfdmTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
@@ -8220,8 +8436,8 @@
     cls.add_output_stream_operator()
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0, uint16_t length=0) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0'), param('uint16_t', 'length', default_value='0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & txVector) [constructor]
     cls.add_constructor([param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetBssColor() const [member function]
@@ -8249,6 +8465,15 @@
                    'ns3::WifiTxVector::HeMuUserInfoMap const &', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap & ns3::WifiTxVector::GetHeMuUserInfoMap() [member function]
+    cls.add_method('GetHeMuUserInfoMap', 
+                   'ns3::WifiTxVector::HeMuUserInfoMap &', 
+                   [])
+    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode(uint16_t staId=65535) const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -8259,6 +8484,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiTxVector::GetModulationClass() const [member function]
+    cls.add_method('GetModulationClass', 
+                   'ns3::WifiModulationClass', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNTx() const [member function]
     cls.add_method('GetNTx', 
                    'uint8_t', 
@@ -8279,6 +8509,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): std::pair<unsigned long long, unsigned long long> ns3::WifiTxVector::GetNumRusPerHeSigBContentChannel() const [member function]
+    cls.add_method('GetNumRusPerHeSigBContentChannel', 
+                   'std::pair< unsigned long long, unsigned long long >', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiPreamble ns3::WifiTxVector::GetPreambleType() const [member function]
     cls.add_method('GetPreambleType', 
                    'ns3::WifiPreamble', 
@@ -8299,16 +8534,31 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsDlMu() const [member function]
+    cls.add_method('IsDlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsLdpc() const [member function]
     cls.add_method('IsLdpc', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsMu() const [member function]
+    cls.add_method('IsMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsStbc() const [member function]
     cls.add_method('IsStbc', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsUlMu() const [member function]
+    cls.add_method('IsUlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsValid() const [member function]
     cls.add_method('IsValid', 
                    'bool', 
@@ -8338,6 +8588,10 @@
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('bool', 'ldpc')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -8654,97 +8908,6 @@
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3HtSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader::HtSigHeader(ns3::HtSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader::HtSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::GetAggregation() const [member function]
-    cls.add_method('GetAggregation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HtSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HtSigHeader::GetHtLength() const [member function]
-    cls.add_method('GetHtLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::HtSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HtSigHeader::GetMcs() const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HtSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::GetShortGuardInterval() const [member function]
-    cls.add_method('GetShortGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::HtSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::IsLdpcFecCoding() const [member function]
-    cls.add_method('IsLdpcFecCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetAggregation(bool aggregation) [member function]
-    cls.add_method('SetAggregation', 
-                   'void', 
-                   [param('bool', 'aggregation')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetFecCoding(bool ldpc) [member function]
-    cls.add_method('SetFecCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetHtLength(uint16_t length) [member function]
-    cls.add_method('SetHtLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetMcs(uint8_t mcs) [member function]
-    cls.add_method('SetMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetShortGuardInterval(bool sgi) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'sgi')])
-    return
-
 def register_Ns3Ipv4Header_methods(root_module, cls):
     ## ipv4-header.h (module 'internet'): ns3::Ipv4Header::Ipv4Header(ns3::Ipv4Header const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv4Header const &', 'arg0')])
@@ -8917,61 +9080,6 @@
                    [param('uint8_t', 'ttl')])
     return
 
-def register_Ns3LSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader::LSigHeader(ns3::LSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader::LSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::LSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::LSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::LSigHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint64_t ns3::LSigHeader::GetRate(uint16_t channelWidth=20) const [member function]
-    cls.add_method('GetRate', 
-                   'uint64_t', 
-                   [param('uint16_t', 'channelWidth', default_value='20')], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::LSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::LSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::SetRate(uint64_t rate, uint16_t channelWidth=20) [member function]
-    cls.add_method('SetRate', 
-                   'void', 
-                   [param('uint64_t', 'rate'), param('uint16_t', 'channelWidth', default_value='20')])
-    return
-
 def register_Ns3LteEnbRrcSapProvider_methods(root_module, cls):
     ## lte-rrc-sap.h (module 'lte'): ns3::LteEnbRrcSapProvider::LteEnbRrcSapProvider() [constructor]
     cls.add_constructor([])
@@ -9551,6 +9659,13 @@
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
+def register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter< ns3::PhyEntity > > const &', 'o')])
+    return
+
 def register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -9864,10 +9979,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -10332,11 +10447,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
     cls.add_method('SetChannel', 
                    'void', 
@@ -10347,11 +10462,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -11450,101 +11565,6 @@
     cls.add_constructor([param('ns3::VendorSpecificValue const &', 'arg0')])
     return
 
-def register_Ns3VhtSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader::VhtSigHeader(ns3::VhtSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::VhtSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader::VhtSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::VhtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::VhtSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::VhtSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::VhtSigHeader::GetNStreams() const [member function]
-    cls.add_method('GetNStreams', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::VhtSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::GetShortGuardInterval() const [member function]
-    cls.add_method('GetShortGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::GetShortGuardIntervalDisambiguation() const [member function]
-    cls.add_method('GetShortGuardIntervalDisambiguation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::VhtSigHeader::GetSuMcs() const [member function]
-    cls.add_method('GetSuMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::VhtSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::IsLdpcCoding() const [member function]
-    cls.add_method('IsLdpcCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetCoding(bool ldpc) [member function]
-    cls.add_method('SetCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetMuFlag(bool mu) [member function]
-    cls.add_method('SetMuFlag', 
-                   'void', 
-                   [param('bool', 'mu')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetNStreams(uint8_t nStreams) [member function]
-    cls.add_method('SetNStreams', 
-                   'void', 
-                   [param('uint8_t', 'nStreams')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetShortGuardInterval(bool sgi) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'sgi')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetShortGuardIntervalDisambiguation(bool disambiguation) [member function]
-    cls.add_method('SetShortGuardIntervalDisambiguation', 
-                   'void', 
-                   [param('bool', 'disambiguation')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetSuMcs(uint8_t mcs) [member function]
-    cls.add_method('SetSuMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    return
-
 def register_Ns3WeibullRandomVariable_methods(root_module, cls):
     ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::WeibullRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -11596,6 +11616,8 @@
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
     cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::m_frequencyChannels [variable]
+    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPhyStateHelper> ns3::WifiPhy::GetState() const [member function]
     cls.add_method('GetState', 
                    'ns3::Ptr< ns3::WifiPhyStateHelper >', 
@@ -11604,7 +11626,7 @@
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
     cls.add_method('SetReceiveOkCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
     cls.add_method('SetReceiveErrorCallback', 
                    'void', 
@@ -11621,26 +11643,10 @@
     cls.add_method('SetCapabilitiesChangedCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
     cls.add_method('StartReceivePreamble', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('StartReceiveHeader', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ContinueReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('ContinueReceiveHeader', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('StartReceivePayload', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::EndReceive(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('EndReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
     cls.add_method('ResetReceive', 
                    'void', 
@@ -11649,10 +11655,15 @@
     cls.add_method('EndReceiveInterBss', 
                    'void', 
                    [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiConstPsduMap ns3::WifiPhy::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector', 'txVector')])
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
     cls.add_method('Send', 
                    'void', 
@@ -11727,125 +11738,75 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, uint16_t staId=65535) [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector txVector, ns3::WifiPhyBand band) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('CalculatePhyPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPreambleDetectionDuration() [member function]
     cls.add_method('GetPreambleDetectionDuration', 
                    'ns3::Time', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyTrainingSymbolDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyTrainingSymbolDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPhyHeaderMode() [member function]
-    cls.add_method('GetHtPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPhyHeaderMode() [member function]
-    cls.add_method('GetVhtPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHePhyHeaderMode() [member function]
-    cls.add_method('GetHePhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhyHtSigHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigA1Duration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigA1Duration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigA2Duration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigA2Duration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigBDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigBDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPhyHeaderMode(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyHeaderDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyPreambleDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyPreambleDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype=::ns3::MpduType::NORMAL_MPDU, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype=::ns3::MpduType::NORMAL_MPDU, uint16_t staId=65535) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype', default_value='::ns3::MpduType::NORMAL_MPDU'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype', default_value='::ns3::MpduType::NORMAL_MPDU'), param('uint16_t', 'staId', default_value='65535')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('GetStartOfPacketDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint8_t', 
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList() const [member function]
+    cls.add_method('GetModeList', 
+                   'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint8_t mode) const [member function]
-    cls.add_method('GetMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mode')], 
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetModeList', 
+                   'std::list< ns3::WifiMode >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
                    'bool', 
                    [param('ns3::WifiMode', 'mode')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiMode mcs) const [member function]
-    cls.add_method('IsMcsSupported', 
-                   'bool', 
-                   [param('ns3::WifiMode', 'mcs')], 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetDefaultMode() const [member function]
+    cls.add_method('GetDefaultMode', 
+                   'ns3::WifiMode', 
+                   [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiModulationClass mc, uint8_t mcs) const [member function]
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
     cls.add_method('IsMcsSupported', 
                    'bool', 
-                   [param('ns3::WifiModulationClass', 'mc'), param('uint8_t', 'mcs')], 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiTxVector txVector, double ber) const [member function]
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiTxVector const & txVector, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('double', 'ber')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('double', 'ber')], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSifs(ns3::Time sifs) [member function]
     cls.add_method('SetSifs', 
@@ -11884,535 +11845,76 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetBssMembershipSelector(uint8_t selector) const [member function]
-    cls.add_method('GetBssMembershipSelector', 
-                   'uint8_t', 
-                   [param('uint8_t', 'selector')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs(uint8_t mcs) [member function]
-    cls.add_method('GetHtMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs(uint8_t mcs) [member function]
-    cls.add_method('GetVhtMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs(uint8_t mcs) [member function]
-    cls.add_method('GetHeMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetMaxPsduSize(ns3::WifiModulationClass modulation) [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
-                   'void', 
-                   [param('uint8_t', 'id')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetChannelNumber() const [member function]
-    cls.add_method('GetChannelNumber', 
-                   'uint8_t', 
+    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char> > ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
+    cls.add_method('GetBssMembershipSelectorList', 
+                   'std::list< unsigned char >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetChannelSwitchDelay() const [member function]
-    cls.add_method('GetChannelSwitchDelay', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
-    cls.add_method('ConfigureStandardAndBand', 
-                   'void', 
-                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
-    cls.add_method('GetPhyStandard', 
-                   'ns3::WifiPhyStandard', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyBand ns3::WifiPhy::GetPhyBand() const [member function]
-    cls.add_method('GetPhyBand', 
-                   'ns3::WifiPhyBand', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DefineChannelNumber(uint8_t channelNumber, ns3::WifiPhyBand band, ns3::WifiPhyStandard standard, uint16_t frequency, uint16_t channelWidth) [member function]
-    cls.add_method('DefineChannelNumber', 
-                   'bool', 
-                   [param('uint8_t', 'channelNumber'), param('ns3::WifiPhyBand', 'band'), param('ns3::WifiPhyStandard', 'standard'), param('uint16_t', 'frequency'), param('uint16_t', 'channelWidth')])
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::WifiPhy::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::Channel >', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate1Mbps() [member function]
-    cls.add_method('GetDsssRate1Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate2Mbps() [member function]
-    cls.add_method('GetDsssRate2Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate5_5Mbps() [member function]
-    cls.add_method('GetDsssRate5_5Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate11Mbps() [member function]
-    cls.add_method('GetDsssRate11Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate6Mbps() [member function]
-    cls.add_method('GetErpOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate9Mbps() [member function]
-    cls.add_method('GetErpOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate12Mbps() [member function]
-    cls.add_method('GetErpOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate18Mbps() [member function]
-    cls.add_method('GetErpOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate24Mbps() [member function]
-    cls.add_method('GetErpOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate36Mbps() [member function]
-    cls.add_method('GetErpOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate48Mbps() [member function]
-    cls.add_method('GetErpOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate54Mbps() [member function]
-    cls.add_method('GetErpOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
-    cls.add_method('GetOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
-    cls.add_method('GetHtMcs0', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
-    cls.add_method('GetHtMcs1', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
-    cls.add_method('GetHtMcs2', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
-    cls.add_method('GetHtMcs3', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
-    cls.add_method('GetHtMcs4', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
-    cls.add_method('GetHtMcs5', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
-    cls.add_method('GetHtMcs6', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
-    cls.add_method('GetHtMcs7', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
-    cls.add_method('GetHtMcs8', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
-    cls.add_method('GetHtMcs9', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
-    cls.add_method('GetHtMcs10', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
-    cls.add_method('GetHtMcs11', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
-    cls.add_method('GetHtMcs12', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
-    cls.add_method('GetHtMcs13', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
-    cls.add_method('GetHtMcs14', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
-    cls.add_method('GetHtMcs15', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
-    cls.add_method('GetHtMcs16', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
-    cls.add_method('GetHtMcs17', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
-    cls.add_method('GetHtMcs18', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
-    cls.add_method('GetHtMcs19', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
-    cls.add_method('GetHtMcs20', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
-    cls.add_method('GetHtMcs21', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
-    cls.add_method('GetHtMcs22', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
-    cls.add_method('GetHtMcs23', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
-    cls.add_method('GetHtMcs24', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
-    cls.add_method('GetHtMcs25', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
-    cls.add_method('GetHtMcs26', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
-    cls.add_method('GetHtMcs27', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
-    cls.add_method('GetHtMcs28', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
-    cls.add_method('GetHtMcs29', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
-    cls.add_method('GetHtMcs30', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
-    cls.add_method('GetHtMcs31', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
-    cls.add_method('GetVhtMcs0', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
-    cls.add_method('GetVhtMcs1', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
-    cls.add_method('GetVhtMcs2', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
-    cls.add_method('GetVhtMcs3', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
-    cls.add_method('GetVhtMcs4', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
-    cls.add_method('GetVhtMcs5', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
-    cls.add_method('GetVhtMcs6', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
-    cls.add_method('GetVhtMcs7', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
-    cls.add_method('GetVhtMcs8', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
-    cls.add_method('GetVhtMcs9', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs0() [member function]
-    cls.add_method('GetHeMcs0', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs1() [member function]
-    cls.add_method('GetHeMcs1', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs2() [member function]
-    cls.add_method('GetHeMcs2', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs3() [member function]
-    cls.add_method('GetHeMcs3', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs4() [member function]
-    cls.add_method('GetHeMcs4', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs5() [member function]
-    cls.add_method('GetHeMcs5', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList() const [member function]
+    cls.add_method('GetMcsList', 
+                   'std::list< ns3::WifiMode >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs6() [member function]
-    cls.add_method('GetHeMcs6', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetMcsList', 
+                   'std::list< ns3::WifiMode >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
                    'ns3::WifiMode', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
+    cls.add_method('SetChannelNumber', 
+                   'void', 
+                   [param('uint8_t', 'id')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetChannelNumber() const [member function]
+    cls.add_method('GetChannelNumber', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs7() [member function]
-    cls.add_method('GetHeMcs7', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetChannelSwitchDelay() const [member function]
+    cls.add_method('GetChannelSwitchDelay', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs8() [member function]
-    cls.add_method('GetHeMcs8', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('ConfigureStandardAndBand', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
+    cls.add_method('GetPhyStandard', 
+                   'ns3::WifiPhyStandard', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs9() [member function]
-    cls.add_method('GetHeMcs9', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyBand ns3::WifiPhy::GetPhyBand() const [member function]
+    cls.add_method('GetPhyBand', 
+                   'ns3::WifiPhyBand', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs10() [member function]
-    cls.add_method('GetHeMcs10', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyOperatingChannel const & ns3::WifiPhy::GetOperatingChannel() const [member function]
+    cls.add_method('GetOperatingChannel', 
+                   'ns3::WifiPhyOperatingChannel const &', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs11() [member function]
-    cls.add_method('GetHeMcs11', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::WifiPhy::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
                    [], 
-                   is_static=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::WifiConstPsduMap psdus, double txPowerW) [member function]
     cls.add_method('NotifyTxBegin', 
                    'void', 
@@ -12445,10 +11947,6 @@
     cls.add_method('NotifyMonitorSniffTx', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyEndOfHePreamble(ns3::HePreambleParameters params) [member function]
-    cls.add_method('NotifyEndOfHePreamble', 
-                   'void', 
-                   [param('ns3::HePreambleParameters', 'params')])
     ## wifi-phy.h (module 'wifi'): int64_t ns3::WifiPhy::AssignStreams(int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
@@ -12539,6 +12037,10 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(uint8_t number, uint16_t frequency, uint16_t width) [member function]
+    cls.add_method('SetOperatingChannel', 
+                   'void', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
     cls.add_method('SetFrequency', 
                    'void', 
@@ -12549,6 +12051,10 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPrimary20Index(uint8_t index) [member function]
+    cls.add_method('SetPrimary20Index', 
+                   'void', 
+                   [param('uint8_t', 'index')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
     cls.add_method('SetNumberOfAntennas', 
                    'void', 
@@ -12633,57 +12139,92 @@
     cls.add_method('ResetCca', 
                    'void', 
                    [param('bool', 'powerRestricted'), param('double', 'txPowerMaxSiso', default_value='0'), param('double', 'txPowerMaxMimo', default_value='0')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerForTransmission(ns3::WifiTxVector txVector) const [member function]
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerForTransmission(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
     cls.add_method('GetTxPowerForTransmission', 
                    'double', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyChannelAccessRequested() [member function]
     cls.add_method('NotifyChannelAccessRequested', 
                    'void', 
                    [])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t bandWidth, uint16_t guardBandwidth, ns3::HeRu::SubcarrierRange range, uint8_t bandIndex=0) const [member function]
+    cls.add_method('ConvertHeRuSubcarriers', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< short, short >', 'range'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static void ns3::WifiPhy::AddStaticPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
+    cls.add_method('AddStaticPhyEntity', 
                    'void', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Ptr<const ns3::PhyEntity> const ns3::WifiPhy::GetStaticPhyEntity(ns3::WifiModulationClass modulation) [member function]
+    cls.add_method('GetStaticPhyEntity', 
+                   'ns3::Ptr< ns3::PhyEntity const > const', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::PhyEntity> ns3::WifiPhy::GetPhyEntity(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetPhyEntity', 
+                   'ns3::Ptr< ns3::PhyEntity >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint64_t ns3::WifiPhy::GetPreviouslyRxPpduUid() const [member function]
+    cls.add_method('GetPreviouslyRxPpduUid', 
+                   'uint64_t', 
                    [], 
-                   is_virtual=True, visibility='protected')
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): std::tuple<double, double, double> ns3::WifiPhy::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DoChannelSwitch(uint8_t id) [member function]
-    cls.add_method('DoChannelSwitch', 
-                   'bool', 
-                   [param('uint8_t', 'id')], 
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [], 
                    visibility='protected')
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DoFrequencySwitch(uint16_t frequency) [member function]
-    cls.add_method('DoFrequencySwitch', 
-                   'bool', 
-                   [param('uint16_t', 'frequency')], 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::DoChannelSwitch() [member function]
+    cls.add_method('DoChannelSwitch', 
+                   'ns3::Time', 
+                   [], 
                    visibility='protected')
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy() [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy(uint16_t channelWidth) [member function]
     cls.add_method('SwitchMaybeToCcaBusy', 
                    'void', 
-                   [], 
+                   [param('uint16_t', 'channelWidth')], 
                    visibility='protected')
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetStaId() const [member function]
-    cls.add_method('GetStaId', 
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
                    'uint16_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, visibility='protected')
     ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
     cls.add_method('GetBand', 
                    'ns3::WifiSpectrumBand', 
                    [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
                    is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t channelWidth, ns3::HeRu::SubcarrierRange range) const [member function]
-    cls.add_method('ConvertHeRuSubcarriers', 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetPrimaryBand(uint16_t bandWidth) [member function]
+    cls.add_method('GetPrimaryBand', 
                    'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'channelWidth'), param('std::pair< short, short >', 'range')], 
-                   is_const=True, is_virtual=True, visibility='protected')
+                   [param('uint16_t', 'bandWidth')], 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
+    cls.add_method('AddPhyEntity', 
+                   'void', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
+                   visibility='protected')
     return
 
 def register_Ns3WifiPhyStateHelper_methods(root_module, cls):
@@ -12691,10 +12232,10 @@
     cls.add_constructor([param('ns3::WifiPhyStateHelper const &', 'arg0')])
     ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::ContinueRxNextMpdu(ns3::Ptr<ns3::WifiPsdu> psdu, double snr, ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::ContinueRxNextMpdu(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
     cls.add_method('ContinueRxNextMpdu', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector')])
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
     ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetDelayUntilIdle() const [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
@@ -12766,7 +12307,7 @@
     ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
     cls.add_method('SetReceiveOkCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromOff(ns3::Time duration) [member function]
     cls.add_method('SwitchFromOff', 
                    'void', 
@@ -12779,10 +12320,10 @@
     cls.add_method('SwitchFromRxEndError', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, double snr, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
     cls.add_method('SwitchFromRxEndOk', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
     ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromSleep(ns3::Time duration) [member function]
     cls.add_method('SwitchFromSleep', 
                    'void', 
@@ -12818,36 +12359,55 @@
     return
 
 def register_Ns3WifiPpdu_methods(root_module, cls):
-    cls.add_output_stream_operator()
     ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiPpdu const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiPpdu const &', 'arg0')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band) [constructor]
-    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, uint64_t uid=(18446744073709551615UL)) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('uint64_t', 'uid', default_value='(18446744073709551615UL)')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('uint64_t', 'uid')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::WifiPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## wifi-ppdu.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiPpdu::GetModulation() const [member function]
     cls.add_method('GetModulation', 
                    'ns3::WifiModulationClass', 
                    [], 
                    is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::WifiPpdu::GetPsdu(uint8_t bssColor=64, uint16_t staId=65535) const [member function]
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPreamble ns3::WifiPpdu::GetPreamble() const [member function]
+    cls.add_method('GetPreamble', 
+                   'ns3::WifiPreamble', 
+                   [], 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::WifiPpdu::GetPsdu() const [member function]
     cls.add_method('GetPsdu', 
                    'ns3::Ptr< ns3::WifiPsdu const >', 
-                   [param('uint8_t', 'bssColor', default_value='64'), param('uint16_t', 'staId', default_value='65535')], 
+                   [], 
                    is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): uint16_t ns3::WifiPpdu::GetStaId() const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
     cls.add_method('GetTxDuration', 
                    'ns3::Time', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::GetTxVector() const [member function]
     cls.add_method('GetTxVector', 
                    'ns3::WifiTxVector', 
                    [], 
                    is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsMu() const [member function]
-    cls.add_method('IsMu', 
-                   'bool', 
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpduType ns3::WifiPpdu::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::WifiPpduType', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): uint64_t ns3::WifiPpdu::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
                    [], 
                    is_const=True)
     ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsTruncatedTx() const [member function]
@@ -12864,6 +12424,16 @@
     cls.add_method('SetTruncatedTx', 
                    'void', 
                    [])
+    ## wifi-ppdu.h (module 'wifi'): std::string ns3::WifiPpdu::PrintPayload() const [member function]
+    cls.add_method('PrintPayload', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3ZetaRandomVariable_methods(root_module, cls):
@@ -13169,6 +12739,16 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['unsigned long long'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::Time'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -13194,6 +12774,11 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -13229,11 +12814,6 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::HePreambleParameters'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -13688,61 +13268,6 @@
                    is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3DsssSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader::DsssSigHeader(ns3::DsssSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DsssSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader::DsssSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::DsssSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::DsssSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::DsssSigHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint64_t ns3::DsssSigHeader::GetRate() const [member function]
-    cls.add_method('GetRate', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::DsssSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::DsssSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::SetRate(uint64_t rate) [member function]
-    cls.add_method('SetRate', 
-                   'void', 
-                   [param('uint64_t', 'rate')])
-    return
-
 def register_Ns3EmpiricalRandomVariable_methods(root_module, cls):
     ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable::EmpiricalRandomVariable() [constructor]
     cls.add_constructor([])
@@ -13947,8 +13472,8 @@
     cls.add_output_stream_operator()
     ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Event const & arg0) [constructor]
     cls.add_constructor([param('ns3::Event const &', 'arg0')])
-    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand', 'rxPower')])
     ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetDuration() const [member function]
     cls.add_method('GetDuration', 
                    'ns3::Time', 
@@ -13984,11 +13509,15 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::WifiTxVector ns3::Event::GetTxVector() const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::WifiTxVector const & ns3::Event::GetTxVector() const [member function]
     cls.add_method('GetTxVector', 
-                   'ns3::WifiTxVector', 
+                   'ns3::WifiTxVector const &', 
                    [], 
                    is_const=True)
+    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateRxPowerW', 
+                   'void', 
+                   [param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
     return
 
 def register_Ns3EventImpl_methods(root_module, cls):
@@ -14142,119 +13671,24 @@
                    'double', 
                    [], 
                    is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue(double alpha, double beta) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'alpha'), param('double', 'beta')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger(uint32_t alpha, uint32_t beta) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'alpha'), param('uint32_t', 'beta')])
-    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [], 
-                   is_virtual=True)
-    return
-
-def register_Ns3HeSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader::HeSigHeader(ns3::HeSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader::HeSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HeSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetBssColor() const [member function]
-    cls.add_method('GetBssColor', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HeSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HeSigHeader::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::HeSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetMcs() const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetNStreams() const [member function]
-    cls.add_method('GetNStreams', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HeSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::HeSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HeSigHeader::IsLdpcCoding() const [member function]
-    cls.add_method('IsLdpcCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetBssColor(uint8_t bssColor) [member function]
-    cls.add_method('SetBssColor', 
-                   'void', 
-                   [param('uint8_t', 'bssColor')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetCoding(bool ldpc) [member function]
-    cls.add_method('SetCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetGuardIntervalAndLtfSize(uint16_t gi, uint8_t ltf) [member function]
-    cls.add_method('SetGuardIntervalAndLtfSize', 
-                   'void', 
-                   [param('uint16_t', 'gi'), param('uint8_t', 'ltf')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetMcs(uint8_t mcs) [member function]
-    cls.add_method('SetMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetMuFlag(bool mu) [member function]
-    cls.add_method('SetMuFlag', 
-                   'void', 
-                   [param('bool', 'mu')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetNStreams(uint8_t nStreams) [member function]
-    cls.add_method('SetNStreams', 
-                   'void', 
-                   [param('uint8_t', 'nStreams')])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue(double alpha, double beta) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha'), param('double', 'beta')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger(uint32_t alpha, uint32_t beta) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'alpha'), param('uint32_t', 'beta')])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
     return
 
 def register_Ns3Ipv4_methods(root_module, cls):
@@ -15419,11 +14853,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::MobilityModel> ns3::LteSpectrumPhy::GetMobility() [member function]
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::MobilityModel> ns3::LteSpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::LteSpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -15434,11 +14868,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::LteSpectrumPhy::GetRxAntenna() [member function]
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::LteSpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -16674,6 +16108,385 @@
                    is_virtual=True)
     return
 
+def register_Ns3PhyEntity_methods(root_module, cls):
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyEntity() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyEntity(ns3::PhyEntity const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::PhyEntity::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('CalculatePhyPreambleAndHeaderDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) const [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::CanReceivePpdu(ns3::Ptr<ns3::WifiPpdu> ppdu, uint16_t txCenterFreq) const [member function]
+    cls.add_method('CanReceivePpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('uint16_t', 'txCenterFreq')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::CancelAllEvents() [member function]
+    cls.add_method('CancelAllEvents', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::CancelRunningEndPreambleDetectionEvents(bool clear=false) [member function]
+    cls.add_method('CancelRunningEndPreambleDetectionEvents', 
+                   'void', 
+                   [param('bool', 'clear', default_value='false')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceiveField', 
+                   'void', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::PhyEntity::GetAddressedPsduInPpdu(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetAddressedPsduInPpdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetDurationUpToField(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDurationUpToField', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint32_t ns3::PhyEntity::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiMode ns3::PhyEntity::GetMcs(uint8_t index) const [member function]
+    cls.add_method('GetMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiPpduField ns3::PhyEntity::GetNextField(ns3::WifiPpduField currentField, ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetNextField', 
+                   'ns3::WifiPpduField', 
+                   [param('ns3::WifiPpduField', 'currentField'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint8_t ns3::PhyEntity::GetNumModes() const [member function]
+    cls.add_method('GetNumModes', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) const [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyHeaderSections ns3::PhyEntity::GetPhyHeaderSections(ns3::WifiTxVector const & txVector, ns3::Time ppduStart) const [member function]
+    cls.add_method('GetPhyHeaderSections', 
+                   'ns3::PhyEntity::PhyHeaderSections', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduStart')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetRemainingDurationAfterField(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiPpduField field) const [member function]
+    cls.add_method('GetRemainingDurationAfterField', 
+                   'ns3::Time', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiPpduField', 'field')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetRxChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetRxChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiMode ns3::PhyEntity::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetStaId(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetTransmissionChannelWidth(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTransmissionChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiConstPsduMap ns3::PhyEntity::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::HandlesMcsModes() const [member function]
+    cls.add_method('HandlesMcsModes', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsMcsSupported(uint8_t index) const [member function]
+    cls.add_method('IsMcsSupported', 
+                   'bool', 
+                   [param('uint8_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsModeSupported(ns3::WifiMode mode) const [member function]
+    cls.add_method('IsModeSupported', 
+                   'bool', 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::NoEndPreambleDetectionEvents() const [member function]
+    cls.add_method('NoEndPreambleDetectionEvents', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::SetOwner(ns3::Ptr<ns3::WifiPhy> wifiPhy) [member function]
+    cls.add_method('SetOwner', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'wifiPhy')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceiveField', 
+                   'void', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreamble', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::Transmit(ns3::Time txDuration, ns3::Ptr<ns3::WifiPpdu> ppdu, std::string type) [member function]
+    cls.add_method('Transmit', 
+                   'void', 
+                   [param('ns3::Time', 'txDuration'), param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::string', 'type')])
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::begin() const [member function]
+    cls.add_method('begin', 
+                   'std::list< ns3::WifiMode > const_iterator', 
+                   [], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::end() const [member function]
+    cls.add_method('end', 
+                   'std::list< ns3::WifiMode > const_iterator', 
+                   [], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::AbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('AbortCurrentReception', 
+                   'void', 
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::AddPreambleEvent(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('AddPreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::PhyEntity::CreateInterferenceEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [member function]
+    cls.add_method('CreateInterferenceEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoAbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('DoAbortCurrentReception', 
+                   'void', 
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::PhyEntity::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoEndReceivePayload(ns3::Ptr<const ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('DoEndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::PhyEntity::DoEndReceivePreamble(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceivePreamble', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::PhyEntity::DoGetEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    cls.add_method('DoGetEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::DoStartReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceiveField', 
+                   'bool', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoStartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DropPreambleEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiPhyRxfailureReason reason, ns3::Time endRx, uint16_t measurementChannelWidth) [member function]
+    cls.add_method('DropPreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiPhyRxfailureReason', 'reason'), param('ns3::Time', 'endRx'), param('uint16_t', 'measurementChannelWidth')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndOfMpdu(ns3::Ptr<ns3::Event> event, ns3::Ptr<const ns3::WifiPsdu> psdu, size_t mpduIndex, ns3::Time relativeStart, ns3::Time mpduDuration) [member function]
+    cls.add_method('EndOfMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('size_t', 'mpduIndex'), param('ns3::Time', 'relativeStart'), param('ns3::Time', 'mpduDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndPreambleDetectionPeriod(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndPreambleDetectionPeriod', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ErasePreambleEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::Time rxDuration) [member function]
+    cls.add_method('ErasePreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::Time', 'rxDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetCenterFrequencyForChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetCenterFrequencyForChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetChannelWidthAndBand', 
+                   'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<const ns3::Event> ns3::PhyEntity::GetCurrentEvent() const [member function]
+    cls.add_method('GetCurrentEvent', 
+                   'ns3::Ptr< ns3::Event const >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long long, ns3::WifiPreamble> >, std::allocator<std::pair<const std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event> > > > const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
+    cls.add_method('GetCurrentPreambleEvents', 
+                   'std::map< std::pair< unsigned long long, ns3::WifiPreamble >, ns3::Ptr< ns3::Event > > const &', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::PhyEntity::GetPhyHeaderSnrPer(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) const [member function]
+    cls.add_method('GetPhyHeaderSnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::PhyEntity::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): double ns3::PhyEntity::GetRandomValue() const [member function]
+    cls.add_method('GetRandomValue', 
+                   'double', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::pair<bool, ns3::SignalNoiseDbm> ns3::PhyEntity::GetReceptionStatus(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::Ptr<ns3::Event> event, uint16_t staId, ns3::Time relativeMpduStart, ns3::Time mpduDuration) [member function]
+    cls.add_method('GetReceptionStatus', 
+                   'std::pair< bool, ns3::SignalNoiseDbm >', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'staId'), param('ns3::Time', 'relativeMpduStart'), param('ns3::Time', 'mpduDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): double ns3::PhyEntity::GetRxPowerWForPpdu(ns3::Ptr<ns3::Event> event) const [member function]
+    cls.add_method('GetRxPowerWForPpdu', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::tuple<double, double, double> ns3::PhyEntity::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::PhyEntity::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsConfigSupported(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsConfigSupported', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::NotifyInterferenceRxEndAndClear(bool reset) [member function]
+    cls.add_method('NotifyInterferenceRxEndAndClear', 
+                   'void', 
+                   [param('bool', 'reset')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint64_t ns3::PhyEntity::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('ObtainNextUid', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ScheduleEndOfMpdus(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ScheduleEndOfMpdus', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartPreambleDetectionPeriod(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartPreambleDetectionPeriod', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::UpdateInterferenceEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateInterferenceEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')], 
+                   visibility='protected')
+    return
+
+def register_Ns3PhyEntityPhyFieldRxStatus_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(ns3::PhyEntity::PhyFieldRxStatus const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity::PhyFieldRxStatus const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(bool s) [constructor]
+    cls.add_constructor([param('bool', 's')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(bool s, ns3::WifiPhyRxfailureReason r, ns3::PhyEntity::PhyRxFailureAction a) [constructor]
+    cls.add_constructor([param('bool', 's'), param('ns3::WifiPhyRxfailureReason', 'r'), param('ns3::PhyEntity::PhyRxFailureAction', 'a')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::actionIfFailure [variable]
+    cls.add_instance_attribute('actionIfFailure', 'ns3::PhyEntity::PhyRxFailureAction', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::isSuccess [variable]
+    cls.add_instance_attribute('isSuccess', 'bool', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::reason [variable]
+    cls.add_instance_attribute('reason', 'ns3::WifiPhyRxfailureReason', is_const=False)
+    return
+
+def register_Ns3PhyEntitySnrPer_methods(root_module, cls):
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer(ns3::PhyEntity::SnrPer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity::SnrPer const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer(double s, double p) [constructor]
+    cls.add_constructor([param('double', 's'), param('double', 'p')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::per [variable]
+    cls.add_instance_attribute('per', 'double', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
+    return
+
 def register_Ns3PointerChecker_methods(root_module, cls):
     ## pointer.h (module 'core'): ns3::PointerChecker::PointerChecker() [constructor]
     cls.add_constructor([])
@@ -17396,6 +17209,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -17418,6 +17253,94 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0, short unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('ns3::WifiTxVector const &', 'arg0'), param('short unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): short unsigned int ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'short unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -17484,28 +17407,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3HePreambleParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::HePreambleParameters arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::HePreambleParameters', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Void_Ns3PhyReceptionStatParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::PhyReceptionStatParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -18035,25 +17936,25 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Double_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, double arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('double', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('ns3::RxSignalInfo', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     cls.add_copy_constructor()
     return
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/netanim/bindings/modulegen__gcc_LP64.py ns-3.34/src/netanim/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/netanim/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/netanim/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -20,24 +20,28 @@
 def register_types(module):
     root_module = module.get_root()
     
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'SIG_A_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'FILTERED'], import_from_module='ns.wifi')
-    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
-    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduField [enumeration]
+    module.add_enum('WifiPpduField', ['WIFI_PPDU_FIELD_PREAMBLE', 'WIFI_PPDU_FIELD_NON_HT_HEADER', 'WIFI_PPDU_FIELD_HT_SIG', 'WIFI_PPDU_FIELD_TRAINING', 'WIFI_PPDU_FIELD_SIG_A', 'WIFI_PPDU_FIELD_SIG_B', 'WIFI_PPDU_FIELD_DATA'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
+    module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
+    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
+    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
     module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_holland', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
+    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
     module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
-    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'], import_from_module='ns.wifi')
     ## ff-mac-common.h (module 'lte'): ns3::Result_e [enumeration]
     module.add_enum('Result_e', ['SUCCESS', 'FAILURE'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::SetupRelease_e [enumeration]
@@ -82,7 +86,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::BuildBroadcastListElement_s [struct]
     module.add_class('BuildBroadcastListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::BuildBroadcastListElement_s::Type_e [enumeration]
-    module.add_enum('Type_e', ['BCCH', 'PCCH'], outer_class=root_module['ns3::BuildBroadcastListElement_s'], import_from_module='ns.lte')
+    module.add_enum('Type_e', ['BCCH', 'PCCH', 'NotValid'], outer_class=root_module['ns3::BuildBroadcastListElement_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::BuildDataListElement_s [struct]
     module.add_class('BuildDataListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::BuildRarListElement_s [struct]
@@ -106,7 +110,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::CqiListElement_s [struct]
     module.add_class('CqiListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::CqiListElement_s::CqiType_e [enumeration]
-    module.add_enum('CqiType_e', ['P10', 'P11', 'P20', 'P21', 'A12', 'A22', 'A20', 'A30', 'A31'], outer_class=root_module['ns3::CqiListElement_s'], import_from_module='ns.lte')
+    module.add_enum('CqiType_e', ['P10', 'P11', 'P20', 'P21', 'A12', 'A22', 'A20', 'A30', 'A31', 'NotValid'], outer_class=root_module['ns3::CqiListElement_s'], import_from_module='ns.lte')
     ## data-rate.h (module 'network'): ns3::DataRate [class]
     module.add_class('DataRate', import_from_module='ns.network')
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::AttributeAccessor> [struct]
@@ -131,6 +135,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::NixVector'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Packet> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Packet'])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity> [struct]
+    module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::PhyEntity'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SpectrumModel> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::SpectrumModel'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SpectrumSignalParameters> [struct]
@@ -146,11 +152,11 @@
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s [struct]
     module.add_class('DlDciListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s::Format_e [enumeration]
-    module.add_enum('Format_e', ['ONE', 'ONE_A', 'ONE_B', 'ONE_C', 'ONE_D', 'TWO', 'TWO_A', 'TWO_B'], outer_class=root_module['ns3::DlDciListElement_s'], import_from_module='ns.lte')
+    module.add_enum('Format_e', ['ONE', 'ONE_A', 'ONE_B', 'ONE_C', 'ONE_D', 'TWO', 'TWO_A', 'TWO_B', 'NotValid_Dci_Format'], outer_class=root_module['ns3::DlDciListElement_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s::VrbFormat_e [enumeration]
-    module.add_enum('VrbFormat_e', ['VRB_DISTRIBUTED', 'VRB_LOCALIZED'], outer_class=root_module['ns3::DlDciListElement_s'], import_from_module='ns.lte')
+    module.add_enum('VrbFormat_e', ['VRB_DISTRIBUTED', 'VRB_LOCALIZED', 'NotValid_VRB_Format'], outer_class=root_module['ns3::DlDciListElement_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::DlDciListElement_s::Ngap_e [enumeration]
-    module.add_enum('Ngap_e', ['GAP1', 'GAP2'], outer_class=root_module['ns3::DlDciListElement_s'], import_from_module='ns.lte')
+    module.add_enum('Ngap_e', ['GAP1', 'GAP2', 'NotValid_Ngap'], outer_class=root_module['ns3::DlDciListElement_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::DlInfoListElement_s [struct]
     module.add_class('DlInfoListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::DlInfoListElement_s::HarqStatus_e [enumeration]
@@ -201,13 +207,11 @@
     module.add_class('Hasher', import_from_module='ns.core')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo [struct]
     module.add_class('HeMuUserInfo', import_from_module='ns.wifi')
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters [struct]
-    module.add_class('HePreambleParameters', import_from_module='ns.wifi')
     ## he-ru.h (module 'wifi'): ns3::HeRu [class]
     module.add_class('HeRu', import_from_module='ns.wifi')
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuType [enumeration]
     module.add_enum('RuType', ['RU_26_TONE', 'RU_52_TONE', 'RU_106_TONE', 'RU_242_TONE', 'RU_484_TONE', 'RU_996_TONE', 'RU_2x996_TONE'], outer_class=root_module['ns3::HeRu'], import_from_module='ns.wifi')
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [struct]
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [class]
     module.add_class('RuSpec', import_from_module='ns.wifi', outer_class=root_module['ns3::HeRu'])
     typehandlers.add_type_alias('std::pair< short, short >', 'ns3::HeRu::SubcarrierRange')
     typehandlers.add_type_alias('std::pair< short, short >*', 'ns3::HeRu::SubcarrierRange*')
@@ -215,10 +219,6 @@
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >', 'ns3::HeRu::SubcarrierGroup')
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >*', 'ns3::HeRu::SubcarrierGroup*')
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >&', 'ns3::HeRu::SubcarrierGroup&')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec', 'ns3::HeRu::RuSpec')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec*', 'ns3::HeRu::RuSpec*')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec&', 'ns3::HeRu::RuSpec&')
-    module.add_typedef(root_module['ns3::HeRu::RuSpec'], 'RuSpec')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >', 'ns3::HeRu::BwTonesPair')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >*', 'ns3::HeRu::BwTonesPair*')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >&', 'ns3::HeRu::BwTonesPair&')
@@ -239,12 +239,12 @@
     root_module['ns3::InetSocketAddress'].implicitly_converts_to(root_module['ns3::Address'])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper [class]
     module.add_class('InterferenceHelper', import_from_module='ns.wifi')
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer [struct]
-    module.add_class('SnrPer', import_from_module='ns.wifi', outer_class=root_module['ns3::InterferenceHelper'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -255,6 +255,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -265,9 +267,9 @@
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s [struct]
     module.add_class('LogicalChannelConfigListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s::Direction_e [enumeration]
-    module.add_enum('Direction_e', ['DIR_UL', 'DIR_DL', 'DIR_BOTH'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'], import_from_module='ns.lte')
+    module.add_enum('Direction_e', ['DIR_UL', 'DIR_DL', 'DIR_BOTH', 'NotValid'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s::QosBearerType_e [enumeration]
-    module.add_enum('QosBearerType_e', ['QBT_NON_GBR', 'QBT_GBR'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'], import_from_module='ns.lte')
+    module.add_enum('QosBearerType_e', ['QBT_NON_GBR', 'QBT_GBR', 'NotValid_QosBearerType'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'], import_from_module='ns.lte')
     ## lte-enb-cphy-sap.h (module 'lte'): ns3::LteEnbCphySapProvider [class]
     module.add_class('LteEnbCphySapProvider', allow_subclassing=True, import_from_module='ns.lte')
     ## lte-enb-cphy-sap.h (module 'lte'): ns3::LteEnbCphySapUser [class]
@@ -510,10 +512,10 @@
     ## ff-mac-common.h (module 'lte'): ns3::MacCeListElement_s [struct]
     module.add_class('MacCeListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::MacCeListElement_s::MacCeType_e [enumeration]
-    module.add_enum('MacCeType_e', ['BSR', 'PHR', 'CRNTI'], outer_class=root_module['ns3::MacCeListElement_s'], import_from_module='ns.lte')
+    module.add_enum('MacCeType_e', ['BSR', 'PHR', 'CRNTI', 'NotValid'], outer_class=root_module['ns3::MacCeListElement_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::MacCeValue_u [struct]
     module.add_class('MacCeValue_u', import_from_module='ns.lte')
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo [struct]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo [struct]
     module.add_class('MpduInfo', import_from_module='ns.wifi')
     ## node-container.h (module 'network'): ns3::NodeContainer [class]
     module.add_class('NodeContainer', import_from_module='ns.network')
@@ -554,7 +556,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::PhichListElement_s [struct]
     module.add_class('PhichListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::PhichListElement_s::Phich_e [enumeration]
-    module.add_enum('Phich_e', ['ACK', 'NACK'], outer_class=root_module['ns3::PhichListElement_s'], import_from_module='ns.lte')
+    module.add_enum('Phich_e', ['ACK', 'NACK', 'NotValid'], outer_class=root_module['ns3::PhichListElement_s'], import_from_module='ns.lte')
     ## lte-common.h (module 'lte'): ns3::PhyReceptionStatParameters [struct]
     module.add_class('PhyReceptionStatParameters', import_from_module='ns.lte')
     typehandlers.add_type_alias('void ( * ) ( ns3::PhyReceptionStatParameters const )', 'ns3::PhyReceptionStatParameters::TracedCallback')
@@ -573,13 +575,15 @@
     module.add_enum('Side', ['RIGHT', 'LEFT', 'TOP', 'BOTTOM'], outer_class=root_module['ns3::Rectangle'], import_from_module='ns.mobility')
     ## ff-mac-common.h (module 'lte'): ns3::RlcPduListElement_s [struct]
     module.add_class('RlcPduListElement_s', import_from_module='ns.lte')
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo [struct]
+    module.add_class('RxSignalInfo', import_from_module='ns.wifi')
     ## ff-mac-common.h (module 'lte'): ns3::SbMeasResult_s [struct]
     module.add_class('SbMeasResult_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::SiConfiguration_s [struct]
     module.add_class('SiConfiguration_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::SiMessageListElement_s [struct]
     module.add_class('SiMessageListElement_s', import_from_module='ns.lte')
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm [struct]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm [struct]
     module.add_class('SignalNoiseDbm', import_from_module='ns.wifi')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::ObjectBase'], template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'])
@@ -652,7 +656,7 @@
     ## ff-mac-common.h (module 'lte'): ns3::UlCqi_s [struct]
     module.add_class('UlCqi_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::UlCqi_s::Type_e [enumeration]
-    module.add_enum('Type_e', ['SRS', 'PUSCH', 'PUCCH_1', 'PUCCH_2', 'PRACH'], outer_class=root_module['ns3::UlCqi_s'], import_from_module='ns.lte')
+    module.add_enum('Type_e', ['SRS', 'PUSCH', 'PUCCH_1', 'PUCCH_2', 'PRACH', 'NotValid'], outer_class=root_module['ns3::UlCqi_s'], import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::UlDciListElement_s [struct]
     module.add_class('UlDciListElement_s', import_from_module='ns.lte')
     ## ff-mac-common.h (module 'lte'): ns3::UlGrant_s [struct]
@@ -671,6 +675,32 @@
     module.add_class('WifiMode', import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
     module.add_class('WifiModeFactory', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::CodeRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::CodeRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::CodeRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel [class]
+    module.add_class('WifiPhyOperatingChannel', import_from_module='ns.wifi')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory [class]
     module.add_class('WifiSpectrumValue5MhzFactory', allow_subclassing=True, import_from_module='ns.spectrum')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValueHelper [class]
@@ -700,16 +730,12 @@
     module.add_enum('Qci', ['GBR_CONV_VOICE', 'GBR_CONV_VIDEO', 'GBR_GAMING', 'GBR_NON_CONV_VIDEO', 'GBR_MC_PUSH_TO_TALK', 'GBR_NMC_PUSH_TO_TALK', 'GBR_MC_VIDEO', 'GBR_V2X', 'NGBR_IMS', 'NGBR_VIDEO_TCP_OPERATOR', 'NGBR_VOICE_VIDEO_GAMING', 'NGBR_VIDEO_TCP_PREMIUM', 'NGBR_VIDEO_TCP_DEFAULT', 'NGBR_MC_DELAY_SIGNAL', 'NGBR_MC_DATA', 'NGBR_V2X', 'NGBR_LOW_LAT_EMBB', 'DGBR_DISCRETE_AUT_SMALL', 'DGBR_DISCRETE_AUT_LARGE', 'DGBR_ITS', 'DGBR_ELECTRICITY'], outer_class=root_module['ns3::EpsBearer'], import_from_module='ns.lte')
     ## header.h (module 'network'): ns3::Header [class]
     module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader [class]
-    module.add_class('HtSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## ipv4-header.h (module 'internet'): ns3::Ipv4Header [class]
     module.add_class('Ipv4Header', import_from_module='ns.internet', parent=root_module['ns3::Header'])
     ## ipv4-header.h (module 'internet'): ns3::Ipv4Header::DscpType [enumeration]
     module.add_enum('DscpType', ['DscpDefault', 'DSCP_CS1', 'DSCP_AF11', 'DSCP_AF12', 'DSCP_AF13', 'DSCP_CS2', 'DSCP_AF21', 'DSCP_AF22', 'DSCP_AF23', 'DSCP_CS3', 'DSCP_AF31', 'DSCP_AF32', 'DSCP_AF33', 'DSCP_CS4', 'DSCP_AF41', 'DSCP_AF42', 'DSCP_AF43', 'DSCP_CS5', 'DSCP_EF', 'DSCP_CS6', 'DSCP_CS7'], outer_class=root_module['ns3::Ipv4Header'], import_from_module='ns.internet')
     ## ipv4-header.h (module 'internet'): ns3::Ipv4Header::EcnType [enumeration]
     module.add_enum('EcnType', ['ECN_NotECT', 'ECN_ECT1', 'ECN_ECT0', 'ECN_CE'], outer_class=root_module['ns3::Ipv4Header'], import_from_module='ns.internet')
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader [class]
-    module.add_class('LSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteEnbRrcSapProvider [class]
     module.add_class('LteEnbRrcSapProvider', import_from_module='ns.lte', parent=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteEnbRrcSapProvider::CompleteSetupUeParameters [struct]
@@ -769,6 +795,8 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PhyEntity', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PhyEntity>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::SpectrumModel', 'ns3::empty', 'ns3::DefaultDeleter<ns3::SpectrumModel>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> > [class]
@@ -878,21 +906,10 @@
     module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## ff-mac-common.h (module 'lte'): ns3::VendorSpecificValue [struct]
     module.add_class('VendorSpecificValue', import_from_module='ns.lte', parent=root_module['ns3::SimpleRefCount< ns3::VendorSpecificValue, ns3::empty, ns3::DefaultDeleter<ns3::VendorSpecificValue> >'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader [class]
-    module.add_class('VhtSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## random-variable-stream.h (module 'core'): ns3::WeibullRandomVariable [class]
     module.add_class('WeibullRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy [class]
     module.add_class('WifiPhy', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >', 'ns3::WifiPhy::ChannelNumberBandPair')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >*', 'ns3::WifiPhy::ChannelNumberBandPair*')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >&', 'ns3::WifiPhy::ChannelNumberBandPair&')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >', 'ns3::WifiPhy::ChannelNumberStandardPair')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >*', 'ns3::WifiPhy::ChannelNumberStandardPair*')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >&', 'ns3::WifiPhy::ChannelNumberStandardPair&')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >', 'ns3::WifiPhy::FrequencyWidthPair')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >*', 'ns3::WifiPhy::FrequencyWidthPair*')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >&', 'ns3::WifiPhy::FrequencyWidthPair&')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )', 'ns3::WifiPhy::MonitorSnifferRxCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )*', 'ns3::WifiPhy::MonitorSnifferRxCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )&', 'ns3::WifiPhy::MonitorSnifferRxCallback&')
@@ -902,9 +919,6 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )', 'ns3::WifiPhy::PsduTxBeginCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )*', 'ns3::WifiPhy::PsduTxBeginCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )&', 'ns3::WifiPhy::PsduTxBeginCallback&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )', 'ns3::WifiPhy::EndOfHePreambleCallback')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )*', 'ns3::WifiPhy::EndOfHePreambleCallback*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )&', 'ns3::WifiPhy::EndOfHePreambleCallback&')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )*', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )&', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback&')
@@ -965,8 +979,6 @@
     typehandlers.add_type_alias('ns3::Callback< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::DeviceEnergyModel::ChangeStateCallback')
     typehandlers.add_type_alias('ns3::Callback< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::DeviceEnergyModel::ChangeStateCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::DeviceEnergyModel::ChangeStateCallback&')
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader [class]
-    module.add_class('DsssSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable [class]
     module.add_class('EmpiricalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor [class]
@@ -991,8 +1003,6 @@
     module.add_class('FriisPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable [class]
     module.add_class('GammaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader [class]
-    module.add_class('HeSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## ipv4.h (module 'internet'): ns3::Ipv4 [class]
     module.add_class('Ipv4', import_from_module='ns.internet', parent=root_module['ns3::Object'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
@@ -1162,6 +1172,20 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::Packet::SinrTracedCallback&')
     ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable [class]
     module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity [class]
+    module.add_class('PhyEntity', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyRxFailureAction [enumeration]
+    module.add_enum('PhyRxFailureAction', ['DROP', 'ABORT', 'IGNORE'], outer_class=root_module['ns3::PhyEntity'], import_from_module='ns.wifi')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus [struct]
+    module.add_class('PhyFieldRxStatus', import_from_module='ns.wifi', outer_class=root_module['ns3::PhyEntity'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer [struct]
+    module.add_class('SnrPer', import_from_module='ns.wifi', outer_class=root_module['ns3::PhyEntity'])
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >', 'ns3::PhyEntity::PhyHeaderChunkInfo')
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >*', 'ns3::PhyEntity::PhyHeaderChunkInfo*')
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >&', 'ns3::PhyEntity::PhyHeaderChunkInfo&')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', 'ns3::PhyEntity::PhyHeaderSections')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >*', 'ns3::PhyEntity::PhyHeaderSections*')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >&', 'ns3::PhyEntity::PhyHeaderSections&')
     ## pointer.h (module 'core'): ns3::PointerChecker [class]
     module.add_class('PointerChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## pointer.h (module 'core'): ns3::PointerValue [class]
@@ -1233,16 +1257,24 @@
     module.add_class('BurstErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv4Header &', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ipv4L3Protocol::DropReason', 'ns3::Ptr<ns3::Ipv4>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv4Header &', 'ns3::Ptr<const ns3::Packet>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::HePreambleParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::PhyReceptionStatParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::PhyReceptionStatParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::PhyTransmissionStatParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1291,8 +1323,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::SpectrumSignalParameters>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'double', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1356,6 +1388,7 @@
     module.add_container('std::vector< ns3::UlDciListElement_s >', 'ns3::UlDciListElement_s', container_type='vector')
     module.add_container('std::vector< ns3::PhichListElement_s >', 'ns3::PhichListElement_s', container_type='vector')
     module.add_container('std::vector< std::pair< short, short > >', 'std::pair< short, short >', container_type='vector')
+    module.add_container('std::vector< ns3::HeRu::RuSpec >', 'ns3::HeRu::RuSpec', container_type='vector')
     module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
     module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('ns3::RxPowerWattPerChannelBand', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
@@ -1387,37 +1420,47 @@
     module.add_container('ns3::Bands', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::list< ns3::UanPacketArrival >', 'ns3::UanPacketArrival', container_type='list')
     module.add_container('std::list< ns3::Ptr< ns3::UanPhy > >', 'ns3::Ptr< ns3::UanPhy >', container_type='list')
+    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiConstPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
+    module.add_container('std::list< ns3::WifiMode >', 'ns3::WifiMode', container_type='list')
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
     module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     module.add_container('ns3::HarqProcessInfoList_t', 'ns3::HarqProcessInfoElement_t', container_type='vector')
     module.add_container('std::list< ns3::Ptr< ns3::LteControlMessage > >', 'ns3::Ptr< ns3::LteControlMessage >', container_type='list')
+    module.add_container('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
+    module.add_container('ns3::PhyEntity::PhyHeaderSections', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
     module.add_container('std::map< std::pair< unsigned int, unsigned int >, double >', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
     module.add_container('std::list< ns3::UlDciLteControlMessage >', 'ns3::UlDciLteControlMessage', container_type='list')
     module.add_container('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierUe > >', ('unsigned char', 'ns3::Ptr< ns3::ComponentCarrierUe >'), container_type='map')
     module.add_container('std::map< unsigned char, ns3::Ptr< ns3::ComponentCarrierBaseStation > >', ('unsigned char', 'ns3::Ptr< ns3::ComponentCarrierBaseStation >'), container_type='map')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxOkCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxOkCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxOkCallback&')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', 'ns3::FrequencyChannelInfo')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >*', 'ns3::FrequencyChannelInfo*')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >&', 'ns3::FrequencyChannelInfo&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxOkCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxOkCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxOkCallback&')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxErrorCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxErrorCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxErrorCallback&')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >', 'ns3::RxPowerWattPerChannelBand')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >*', 'ns3::RxPowerWattPerChannelBand*')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >&', 'ns3::RxPowerWattPerChannelBand&')
+    typehandlers.add_type_alias('std::pair< unsigned int, unsigned int >', 'ns3::WifiSpectrumBand')
+    typehandlers.add_type_alias('std::pair< unsigned int, unsigned int >*', 'ns3::WifiSpectrumBand*')
+    typehandlers.add_type_alias('std::pair< unsigned int, unsigned int >&', 'ns3::WifiSpectrumBand&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
-    typehandlers.add_type_alias('std::pair< unsigned int, unsigned int >', 'ns3::WifiSpectrumBand')
-    typehandlers.add_type_alias('std::pair< unsigned int, unsigned int >*', 'ns3::WifiSpectrumBand*')
-    typehandlers.add_type_alias('std::pair< unsigned int, unsigned int >&', 'ns3::WifiSpectrumBand&')
+    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
+    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
+    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('std::map< ns3::TbId_t, ns3::tbInfo_t >', 'ns3::expectedTbs_t')
     typehandlers.add_type_alias('std::map< ns3::TbId_t, ns3::tbInfo_t >*', 'ns3::expectedTbs_t*')
     typehandlers.add_type_alias('std::map< ns3::TbId_t, ns3::tbInfo_t >&', 'ns3::expectedTbs_t&')
@@ -1611,6 +1654,7 @@
     register_Ns3DefaultDeleter__Ns3LteHarqPhy_methods(root_module, root_module['ns3::DefaultDeleter< ns3::LteHarqPhy >'])
     register_Ns3DefaultDeleter__Ns3NixVector_methods(root_module, root_module['ns3::DefaultDeleter< ns3::NixVector >'])
     register_Ns3DefaultDeleter__Ns3Packet_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Packet >'])
+    register_Ns3DefaultDeleter__Ns3PhyEntity_methods(root_module, root_module['ns3::DefaultDeleter< ns3::PhyEntity >'])
     register_Ns3DefaultDeleter__Ns3SpectrumModel_methods(root_module, root_module['ns3::DefaultDeleter< ns3::SpectrumModel >'])
     register_Ns3DefaultDeleter__Ns3SpectrumSignalParameters_methods(root_module, root_module['ns3::DefaultDeleter< ns3::SpectrumSignalParameters >'])
     register_Ns3DefaultDeleter__Ns3SpectrumValue_methods(root_module, root_module['ns3::DefaultDeleter< ns3::SpectrumValue >'])
@@ -1642,7 +1686,6 @@
     register_Ns3HarqProcessInfoElement_t_methods(root_module, root_module['ns3::HarqProcessInfoElement_t'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3HeMuUserInfo_methods(root_module, root_module['ns3::HeMuUserInfo'])
-    register_Ns3HePreambleParameters_methods(root_module, root_module['ns3::HePreambleParameters'])
     register_Ns3HeRu_methods(root_module, root_module['ns3::HeRu'])
     register_Ns3HeRuRuSpec_methods(root_module, root_module['ns3::HeRu::RuSpec'])
     register_Ns3HigherLayerSelected_s_methods(root_module, root_module['ns3::HigherLayerSelected_s'])
@@ -1650,11 +1693,12 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3InterferenceHelper_methods(root_module, root_module['ns3::InterferenceHelper'])
-    register_Ns3InterferenceHelperSnrPer_methods(root_module, root_module['ns3::InterferenceHelper::SnrPer'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3LogicalChannelConfigListElement_s_methods(root_module, root_module['ns3::LogicalChannelConfigListElement_s'])
@@ -1781,6 +1825,7 @@
     register_Ns3RachListElement_s_methods(root_module, root_module['ns3::RachListElement_s'])
     register_Ns3Rectangle_methods(root_module, root_module['ns3::Rectangle'])
     register_Ns3RlcPduListElement_s_methods(root_module, root_module['ns3::RlcPduListElement_s'])
+    register_Ns3RxSignalInfo_methods(root_module, root_module['ns3::RxSignalInfo'])
     register_Ns3SbMeasResult_s_methods(root_module, root_module['ns3::SbMeasResult_s'])
     register_Ns3SiConfiguration_s_methods(root_module, root_module['ns3::SiConfiguration_s'])
     register_Ns3SiMessageListElement_s_methods(root_module, root_module['ns3::SiMessageListElement_s'])
@@ -1817,6 +1862,7 @@
     register_Ns3VendorSpecificListElement_s_methods(root_module, root_module['ns3::VendorSpecificListElement_s'])
     register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
     register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
+    register_Ns3WifiPhyOperatingChannel_methods(root_module, root_module['ns3::WifiPhyOperatingChannel'])
     register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, root_module['ns3::WifiSpectrumValue5MhzFactory'])
     register_Ns3WifiSpectrumValueHelper_methods(root_module, root_module['ns3::WifiSpectrumValueHelper'])
     register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
@@ -1828,9 +1874,7 @@
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3EpsBearer_methods(root_module, root_module['ns3::EpsBearer'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
-    register_Ns3HtSigHeader_methods(root_module, root_module['ns3::HtSigHeader'])
     register_Ns3Ipv4Header_methods(root_module, root_module['ns3::Ipv4Header'])
-    register_Ns3LSigHeader_methods(root_module, root_module['ns3::LSigHeader'])
     register_Ns3LteEnbRrcSapProvider_methods(root_module, root_module['ns3::LteEnbRrcSapProvider'])
     register_Ns3LteEnbRrcSapProviderCompleteSetupUeParameters_methods(root_module, root_module['ns3::LteEnbRrcSapProvider::CompleteSetupUeParameters'])
     register_Ns3LteEnbRrcSapUser_methods(root_module, root_module['ns3::LteEnbRrcSapUser'])
@@ -1859,6 +1903,7 @@
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >'])
     register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >'])
     register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >'])
     register_Ns3SimpleRefCount__Ns3SpectrumSignalParameters_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumSignalParameters__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SpectrumSignalParameters, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumSignalParameters> >'])
     register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >'])
@@ -1897,7 +1942,6 @@
     register_Ns3UanTransducer_methods(root_module, root_module['ns3::UanTransducer'])
     register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
     register_Ns3VendorSpecificValue_methods(root_module, root_module['ns3::VendorSpecificValue'])
-    register_Ns3VhtSigHeader_methods(root_module, root_module['ns3::VhtSigHeader'])
     register_Ns3WeibullRandomVariable_methods(root_module, root_module['ns3::WeibullRandomVariable'])
     register_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
     register_Ns3WifiPhyStateHelper_methods(root_module, root_module['ns3::WifiPhyStateHelper'])
@@ -1921,7 +1965,6 @@
     register_Ns3DataRateValue_methods(root_module, root_module['ns3::DataRateValue'])
     register_Ns3DeterministicRandomVariable_methods(root_module, root_module['ns3::DeterministicRandomVariable'])
     register_Ns3DeviceEnergyModel_methods(root_module, root_module['ns3::DeviceEnergyModel'])
-    register_Ns3DsssSigHeader_methods(root_module, root_module['ns3::DsssSigHeader'])
     register_Ns3EmpiricalRandomVariable_methods(root_module, root_module['ns3::EmpiricalRandomVariable'])
     register_Ns3EmptyAttributeAccessor_methods(root_module, root_module['ns3::EmptyAttributeAccessor'])
     register_Ns3EmptyAttributeChecker_methods(root_module, root_module['ns3::EmptyAttributeChecker'])
@@ -1934,7 +1977,6 @@
     register_Ns3FixedRssLossModel_methods(root_module, root_module['ns3::FixedRssLossModel'])
     register_Ns3FriisPropagationLossModel_methods(root_module, root_module['ns3::FriisPropagationLossModel'])
     register_Ns3GammaRandomVariable_methods(root_module, root_module['ns3::GammaRandomVariable'])
-    register_Ns3HeSigHeader_methods(root_module, root_module['ns3::HeSigHeader'])
     register_Ns3Ipv4_methods(root_module, root_module['ns3::Ipv4'])
     register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
     register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
@@ -1976,6 +2018,9 @@
     register_Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::OutputStreamWrapper'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
     register_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
+    register_Ns3PhyEntity_methods(root_module, root_module['ns3::PhyEntity'])
+    register_Ns3PhyEntityPhyFieldRxStatus_methods(root_module, root_module['ns3::PhyEntity::PhyFieldRxStatus'])
+    register_Ns3PhyEntitySnrPer_methods(root_module, root_module['ns3::PhyEntity::SnrPer'])
     register_Ns3PointerChecker_methods(root_module, root_module['ns3::PointerChecker'])
     register_Ns3PointerValue_methods(root_module, root_module['ns3::PointerValue'])
     register_Ns3RachPreambleLteControlMessage_methods(root_module, root_module['ns3::RachPreambleLteControlMessage'])
@@ -2006,11 +2051,15 @@
     register_Ns3BsrLteControlMessage_methods(root_module, root_module['ns3::BsrLteControlMessage'])
     register_Ns3BurstErrorModel_methods(root_module, root_module['ns3::BurstErrorModel'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3HePreambleParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3PhyReceptionStatParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::PhyReceptionStatParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3PhyTransmissionStatParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::PhyTransmissionStatParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Ptr__lt__const_ns3MobilityModel__gt___Double_Double_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2035,7 +2084,7 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3SpectrumSignalParameters__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Double_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -2824,6 +2873,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2986,6 +3043,18 @@
                    is_static=True)
     return
 
+def register_Ns3DefaultDeleter__Ns3PhyEntity_methods(root_module, cls):
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity>::DefaultDeleter() [constructor]
+    cls.add_constructor([])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity>::DefaultDeleter(ns3::DefaultDeleter<ns3::PhyEntity> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DefaultDeleter< ns3::PhyEntity > const &', 'arg0')])
+    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::PhyEntity>::Delete(ns3::PhyEntity * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::PhyEntity *', 'object')], 
+                   is_static=True)
+    return
+
 def register_Ns3DefaultDeleter__Ns3SpectrumModel_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SpectrumModel>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -3625,41 +3694,60 @@
     cls.add_instance_attribute('ru', 'ns3::HeRu::RuSpec', is_const=False)
     return
 
-def register_Ns3HePreambleParameters_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::HePreambleParameters() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::HePreambleParameters(ns3::HePreambleParameters const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HePreambleParameters const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::bssColor [variable]
-    cls.add_instance_attribute('bssColor', 'uint8_t', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::rssiW [variable]
-    cls.add_instance_attribute('rssiW', 'double', is_const=False)
-    return
-
 def register_Ns3HeRu_methods(root_module, cls):
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu() [constructor]
     cls.add_constructor([])
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, ns3::HeRu::SubcarrierGroup const & toneRanges) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('ns3::HeRu::SubcarrierGroup const &', 'toneRanges')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuSpec ns3::HeRu::FindOverlappingRu(uint16_t bw, ns3::HeRu::RuSpec referenceRu, ns3::HeRu::RuType searchedRuType) [member function]
+    cls.add_method('FindOverlappingRu', 
+                   'ns3::HeRu::RuSpec', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'referenceRu'), param('ns3::HeRu::RuType', 'searchedRuType')], 
+                   is_static=True)
     ## he-ru.h (module 'wifi'): static uint16_t ns3::HeRu::GetBandwidth(ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetBandwidth', 
                    'uint16_t', 
                    [param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetCentral26TonesRus', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations, std::size_t & nCentral26TonesRus) [member function]
     cls.add_method('GetEqualSizedRusForStations', 
                    'ns3::HeRu::RuType', 
-                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations')], 
+                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations'), param('std::size_t &', 'nCentral26TonesRus')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint8_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetNRus', 
                    'std::size_t', 
-                   [param('uint8_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetRuType(uint16_t bandwidth) [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [param('uint16_t', 'bandwidth')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetRusOfType', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint8_t bw, ns3::HeRu::RuType ruType, std::size_t index) [member function]
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint16_t bw, ns3::HeRu::RuType ruType, std::size_t phyIndex) [member function]
     cls.add_method('GetSubcarrierGroup', 
                    'ns3::HeRu::SubcarrierGroup', 
-                   [param('uint8_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index')], 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'phyIndex')], 
                    is_static=True)
     ## he-ru.h (module 'wifi'): ns3::HeRu::m_heRuSubcarrierGroups [variable]
     cls.add_static_attribute('m_heRuSubcarrierGroups', 'ns3::HeRu::SubcarrierGroups const', is_const=True)
@@ -3667,16 +3755,41 @@
 
 def register_Ns3HeRuRuSpec_methods(root_module, cls):
     cls.add_output_stream_operator()
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec() [constructor]
-    cls.add_constructor([])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::index [variable]
-    cls.add_instance_attribute('index', 'std::size_t', is_const=False)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::primary80MHz [variable]
-    cls.add_instance_attribute('primary80MHz', 'bool', is_const=False)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::ruType [variable]
-    cls.add_instance_attribute('ruType', 'ns3::HeRu::RuType', is_const=False)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
+    cls.add_constructor([])
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuType ruType, std::size_t index, bool primary80MHz) [constructor]
+    cls.add_constructor([param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index'), param('bool', 'primary80MHz')])
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetIndex() const [member function]
+    cls.add_method('GetIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetPhyIndex() const [member function]
+    cls.add_method('GetPhyIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::GetPrimary80MHz() const [member function]
+    cls.add_method('GetPrimary80MHz', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType ns3::HeRu::RuSpec::GetRuType() const [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::IsPhyIndexSet() const [member function]
+    cls.add_method('IsPhyIndexSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): void ns3::HeRu::RuSpec::SetPhyIndex(uint16_t bw, uint8_t p20Index) [member function]
+    cls.add_method('SetPhyIndex', 
+                   'void', 
+                   [param('uint16_t', 'bw'), param('uint8_t', 'p20Index')])
     return
 
 def register_Ns3HigherLayerSelected_s_methods(root_module, cls):
@@ -3805,10 +3918,10 @@
     cls.add_constructor([param('ns3::InterferenceHelper const &', 'arg0')])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper() [constructor]
     cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::InterferenceHelper::Add(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::InterferenceHelper::Add(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [member function]
     cls.add_method('Add', 
                    'ns3::Ptr< ns3::Event >', 
-                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')])
     ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddBand(ns3::WifiSpectrumBand band) [member function]
     cls.add_method('AddBand', 
                    'void', 
@@ -3817,21 +3930,16 @@
     cls.add_method('AddForeignSignal', 
                    'void', 
                    [param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateHtPhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('CalculateHtPhyHeaderSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
-                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateNonHtPhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('CalculateNonHtPhyHeaderSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
-                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculatePayloadSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, uint16_t staId, std::pair<ns3::Time, ns3::Time> relativeMpduStartStop) const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::InterferenceHelper::CalculatePayloadSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, uint16_t staId, std::pair<ns3::Time, ns3::Time> relativeMpduStartStop) const [member function]
     cls.add_method('CalculatePayloadSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
                    [param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'channelWidth'), param('std::pair< unsigned int, unsigned int >', 'band'), param('uint16_t', 'staId'), param('std::pair< ns3::Time, ns3::Time >', 'relativeMpduStartStop')], 
                    is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::InterferenceHelper::CalculatePhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, ns3::WifiPpduField header) const [member function]
+    cls.add_method('CalculatePhyHeaderSnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'channelWidth'), param('std::pair< unsigned int, unsigned int >', 'band'), param('ns3::WifiPpduField', 'header')], 
+                   is_const=True)
     ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateSnr(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, uint8_t nss, ns3::WifiSpectrumBand band) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
@@ -3841,20 +3949,19 @@
     cls.add_method('EraseEvents', 
                    'void', 
                    [])
-    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW, ns3::WifiSpectrumBand band) const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW, ns3::WifiSpectrumBand band) [member function]
     cls.add_method('GetEnergyDuration', 
                    'ns3::Time', 
-                   [param('double', 'energyW'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
+                   [param('double', 'energyW'), param('std::pair< unsigned int, unsigned int >', 'band')])
     ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::ErrorRateModel> ns3::InterferenceHelper::GetErrorRateModel() const [member function]
     cls.add_method('GetErrorRateModel', 
                    'ns3::Ptr< ns3::ErrorRateModel >', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd() [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd(ns3::Time endTime) [member function]
     cls.add_method('NotifyRxEnd', 
                    'void', 
-                   [])
+                   [param('ns3::Time', 'endTime')])
     ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxStart() [member function]
     cls.add_method('NotifyRxStart', 
                    'void', 
@@ -3875,10 +3982,19 @@
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint8_t', 'rx')])
-    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiMode mode, ns3::WifiTxVector txVector) const [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiMode mode, ns3::WifiTxVector const & txVector, ns3::WifiPpduField field) const [member function]
     cls.add_method('CalculateChunkSuccessRate', 
                    'double', 
-                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector')], 
+                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPpduField', 'field')], 
+                   is_const=True, visibility='protected')
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculatePayloadChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
+    cls.add_method('CalculatePayloadChunkSuccessRate', 
+                   'double', 
+                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True, visibility='protected')
     ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateSnr(double signal, double noiseInterference, uint16_t channelWidth, uint8_t nss) const [member function]
     cls.add_method('CalculateSnr', 
@@ -3887,17 +4003,6 @@
                    is_const=True, visibility='protected')
     return
 
-def register_Ns3InterferenceHelperSnrPer_methods(root_module, cls):
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer() [constructor]
-    cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer(ns3::InterferenceHelper::SnrPer const & arg0) [constructor]
-    cls.add_constructor([param('ns3::InterferenceHelper::SnrPer const &', 'arg0')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::per [variable]
-    cls.add_instance_attribute('per', 'double', is_const=False)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::snr [variable]
-    cls.add_instance_attribute('snr', 'double', is_const=False)
-    return
-
 def register_Ns3Ipv4Address_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -4021,6 +4126,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -4295,6 +4412,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -4370,6 +4492,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -4390,6 +4524,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -6248,13 +6387,13 @@
     return
 
 def register_Ns3MpduInfo_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::MpduInfo() [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::MpduInfo() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::MpduInfo(ns3::MpduInfo const & arg0) [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::MpduInfo(ns3::MpduInfo const & arg0) [constructor]
     cls.add_constructor([param('ns3::MpduInfo const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::mpduRefNumber [variable]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::mpduRefNumber [variable]
     cls.add_instance_attribute('mpduRefNumber', 'uint32_t', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::type [variable]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::type [variable]
     cls.add_instance_attribute('type', 'ns3::MpduType', is_const=False)
     return
 
@@ -6830,6 +6969,18 @@
     cls.add_instance_attribute('m_size', 'uint16_t', is_const=False)
     return
 
+def register_Ns3RxSignalInfo_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::RxSignalInfo() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::RxSignalInfo(ns3::RxSignalInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RxSignalInfo const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::rssi [variable]
+    cls.add_instance_attribute('rssi', 'double', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
+    return
+
 def register_Ns3SbMeasResult_s_methods(root_module, cls):
     ## ff-mac-common.h (module 'lte'): ns3::SbMeasResult_s::SbMeasResult_s() [constructor]
     cls.add_constructor([])
@@ -6870,13 +7021,13 @@
     return
 
 def register_Ns3SignalNoiseDbm_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm() [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm(ns3::SignalNoiseDbm const & arg0) [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm(ns3::SignalNoiseDbm const & arg0) [constructor]
     cls.add_constructor([param('ns3::SignalNoiseDbm const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::noise [variable]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::noise [variable]
     cls.add_instance_attribute('noise', 'double', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::signal [variable]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::signal [variable]
     cls.add_instance_attribute('signal', 'double', is_const=False)
     return
 
@@ -7744,6 +7895,11 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
+    ## uan-phy.h (module 'uan'): void ns3::UanPhyListener::NotifyTxEnd() [member function]
+    cls.add_method('NotifyTxEnd', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
     ## uan-phy.h (module 'uan'): void ns3::UanPhyListener::NotifyTxStart(ns3::Time duration) [member function]
     cls.add_method('NotifyTxStart', 
                    'void', 
@@ -8014,6 +8170,7 @@
 
 def register_Ns3WifiMode_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
     cls.add_output_stream_operator()
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [constructor]
@@ -8037,10 +8194,10 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector txVector, uint16_t staId=65535) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetDataRate', 
@@ -8067,10 +8224,15 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector txVector) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint16_t channelWidth) const [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'channelWidth')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -8107,18 +8269,67 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
     return
 
+def register_Ns3WifiPhyOperatingChannel_methods(root_module, cls):
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel(ns3::WifiPhyOperatingChannel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhyOperatingChannel const &', 'arg0')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetNumber() const [member function]
+    cls.add_method('GetNumber', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelCenterFrequency(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelCenterFrequency', 
+                   'uint16_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelIndex(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelIndex', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetWidth() const [member function]
+    cls.add_method('GetWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): bool ns3::WifiPhyOperatingChannel::IsSet() const [member function]
+    cls.add_method('IsSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('SetDefault', 
+                   'void', 
+                   [param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetPrimary20Index(uint8_t index) [member function]
+    cls.add_method('SetPrimary20Index', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    return
+
 def register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, cls):
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory::WifiSpectrumValue5MhzFactory() [constructor]
     cls.add_constructor([])
@@ -8151,6 +8362,11 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeMuOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, ns3::WifiSpectrumBand ru) [member function]
+    cls.add_method('CreateHeMuOfdmTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('uint32_t', 'centerFrequency'), param('uint16_t', 'channelWidth'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'ru')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40) [member function]
     cls.add_method('CreateHeOfdmTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
@@ -8220,8 +8436,8 @@
     cls.add_output_stream_operator()
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0, uint16_t length=0) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0'), param('uint16_t', 'length', default_value='0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & txVector) [constructor]
     cls.add_constructor([param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetBssColor() const [member function]
@@ -8249,6 +8465,15 @@
                    'ns3::WifiTxVector::HeMuUserInfoMap const &', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap & ns3::WifiTxVector::GetHeMuUserInfoMap() [member function]
+    cls.add_method('GetHeMuUserInfoMap', 
+                   'ns3::WifiTxVector::HeMuUserInfoMap &', 
+                   [])
+    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode(uint16_t staId=65535) const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -8259,6 +8484,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiTxVector::GetModulationClass() const [member function]
+    cls.add_method('GetModulationClass', 
+                   'ns3::WifiModulationClass', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNTx() const [member function]
     cls.add_method('GetNTx', 
                    'uint8_t', 
@@ -8279,6 +8509,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): std::pair<unsigned long, unsigned long> ns3::WifiTxVector::GetNumRusPerHeSigBContentChannel() const [member function]
+    cls.add_method('GetNumRusPerHeSigBContentChannel', 
+                   'std::pair< unsigned long, unsigned long >', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiPreamble ns3::WifiTxVector::GetPreambleType() const [member function]
     cls.add_method('GetPreambleType', 
                    'ns3::WifiPreamble', 
@@ -8299,16 +8534,31 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsDlMu() const [member function]
+    cls.add_method('IsDlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsLdpc() const [member function]
     cls.add_method('IsLdpc', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsMu() const [member function]
+    cls.add_method('IsMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsStbc() const [member function]
     cls.add_method('IsStbc', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsUlMu() const [member function]
+    cls.add_method('IsUlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsValid() const [member function]
     cls.add_method('IsValid', 
                    'bool', 
@@ -8338,6 +8588,10 @@
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('bool', 'ldpc')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -8654,97 +8908,6 @@
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3HtSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader::HtSigHeader(ns3::HtSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader::HtSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::GetAggregation() const [member function]
-    cls.add_method('GetAggregation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HtSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HtSigHeader::GetHtLength() const [member function]
-    cls.add_method('GetHtLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::HtSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HtSigHeader::GetMcs() const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HtSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::GetShortGuardInterval() const [member function]
-    cls.add_method('GetShortGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::HtSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::IsLdpcFecCoding() const [member function]
-    cls.add_method('IsLdpcFecCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetAggregation(bool aggregation) [member function]
-    cls.add_method('SetAggregation', 
-                   'void', 
-                   [param('bool', 'aggregation')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetFecCoding(bool ldpc) [member function]
-    cls.add_method('SetFecCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetHtLength(uint16_t length) [member function]
-    cls.add_method('SetHtLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetMcs(uint8_t mcs) [member function]
-    cls.add_method('SetMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetShortGuardInterval(bool sgi) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'sgi')])
-    return
-
 def register_Ns3Ipv4Header_methods(root_module, cls):
     ## ipv4-header.h (module 'internet'): ns3::Ipv4Header::Ipv4Header(ns3::Ipv4Header const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv4Header const &', 'arg0')])
@@ -8917,61 +9080,6 @@
                    [param('uint8_t', 'ttl')])
     return
 
-def register_Ns3LSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader::LSigHeader(ns3::LSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader::LSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::LSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::LSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::LSigHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint64_t ns3::LSigHeader::GetRate(uint16_t channelWidth=20) const [member function]
-    cls.add_method('GetRate', 
-                   'uint64_t', 
-                   [param('uint16_t', 'channelWidth', default_value='20')], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::LSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::LSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::SetRate(uint64_t rate, uint16_t channelWidth=20) [member function]
-    cls.add_method('SetRate', 
-                   'void', 
-                   [param('uint64_t', 'rate'), param('uint16_t', 'channelWidth', default_value='20')])
-    return
-
 def register_Ns3LteEnbRrcSapProvider_methods(root_module, cls):
     ## lte-rrc-sap.h (module 'lte'): ns3::LteEnbRrcSapProvider::LteEnbRrcSapProvider() [constructor]
     cls.add_constructor([])
@@ -9551,6 +9659,13 @@
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
+def register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter< ns3::PhyEntity > > const &', 'o')])
+    return
+
 def register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -9864,10 +9979,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -10332,11 +10447,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
     cls.add_method('SetChannel', 
                    'void', 
@@ -10347,11 +10462,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -11450,101 +11565,6 @@
     cls.add_constructor([param('ns3::VendorSpecificValue const &', 'arg0')])
     return
 
-def register_Ns3VhtSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader::VhtSigHeader(ns3::VhtSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::VhtSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader::VhtSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::VhtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::VhtSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::VhtSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::VhtSigHeader::GetNStreams() const [member function]
-    cls.add_method('GetNStreams', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::VhtSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::GetShortGuardInterval() const [member function]
-    cls.add_method('GetShortGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::GetShortGuardIntervalDisambiguation() const [member function]
-    cls.add_method('GetShortGuardIntervalDisambiguation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::VhtSigHeader::GetSuMcs() const [member function]
-    cls.add_method('GetSuMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::VhtSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::IsLdpcCoding() const [member function]
-    cls.add_method('IsLdpcCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetCoding(bool ldpc) [member function]
-    cls.add_method('SetCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetMuFlag(bool mu) [member function]
-    cls.add_method('SetMuFlag', 
-                   'void', 
-                   [param('bool', 'mu')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetNStreams(uint8_t nStreams) [member function]
-    cls.add_method('SetNStreams', 
-                   'void', 
-                   [param('uint8_t', 'nStreams')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetShortGuardInterval(bool sgi) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'sgi')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetShortGuardIntervalDisambiguation(bool disambiguation) [member function]
-    cls.add_method('SetShortGuardIntervalDisambiguation', 
-                   'void', 
-                   [param('bool', 'disambiguation')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetSuMcs(uint8_t mcs) [member function]
-    cls.add_method('SetSuMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    return
-
 def register_Ns3WeibullRandomVariable_methods(root_module, cls):
     ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::WeibullRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -11596,6 +11616,8 @@
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
     cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::m_frequencyChannels [variable]
+    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPhyStateHelper> ns3::WifiPhy::GetState() const [member function]
     cls.add_method('GetState', 
                    'ns3::Ptr< ns3::WifiPhyStateHelper >', 
@@ -11604,7 +11626,7 @@
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
     cls.add_method('SetReceiveOkCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
     cls.add_method('SetReceiveErrorCallback', 
                    'void', 
@@ -11621,26 +11643,10 @@
     cls.add_method('SetCapabilitiesChangedCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
     cls.add_method('StartReceivePreamble', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('StartReceiveHeader', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ContinueReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('ContinueReceiveHeader', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('StartReceivePayload', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::EndReceive(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('EndReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
     cls.add_method('ResetReceive', 
                    'void', 
@@ -11649,10 +11655,15 @@
     cls.add_method('EndReceiveInterBss', 
                    'void', 
                    [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiConstPsduMap ns3::WifiPhy::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector', 'txVector')])
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
     cls.add_method('Send', 
                    'void', 
@@ -11727,125 +11738,75 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, uint16_t staId=65535) [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector txVector, ns3::WifiPhyBand band) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('CalculatePhyPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPreambleDetectionDuration() [member function]
     cls.add_method('GetPreambleDetectionDuration', 
                    'ns3::Time', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyTrainingSymbolDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyTrainingSymbolDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPhyHeaderMode() [member function]
-    cls.add_method('GetHtPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPhyHeaderMode() [member function]
-    cls.add_method('GetVhtPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHePhyHeaderMode() [member function]
-    cls.add_method('GetHePhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhyHtSigHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigA1Duration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigA1Duration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigA2Duration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigA2Duration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigBDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigBDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPhyHeaderMode(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyHeaderDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyPreambleDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyPreambleDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype=::ns3::MpduType::NORMAL_MPDU, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype=::ns3::MpduType::NORMAL_MPDU, uint16_t staId=65535) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype', default_value='::ns3::MpduType::NORMAL_MPDU'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype', default_value='::ns3::MpduType::NORMAL_MPDU'), param('uint16_t', 'staId', default_value='65535')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('GetStartOfPacketDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint8_t', 
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList() const [member function]
+    cls.add_method('GetModeList', 
+                   'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint8_t mode) const [member function]
-    cls.add_method('GetMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mode')], 
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetModeList', 
+                   'std::list< ns3::WifiMode >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
                    'bool', 
                    [param('ns3::WifiMode', 'mode')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiMode mcs) const [member function]
-    cls.add_method('IsMcsSupported', 
-                   'bool', 
-                   [param('ns3::WifiMode', 'mcs')], 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetDefaultMode() const [member function]
+    cls.add_method('GetDefaultMode', 
+                   'ns3::WifiMode', 
+                   [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiModulationClass mc, uint8_t mcs) const [member function]
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
     cls.add_method('IsMcsSupported', 
                    'bool', 
-                   [param('ns3::WifiModulationClass', 'mc'), param('uint8_t', 'mcs')], 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiTxVector txVector, double ber) const [member function]
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiTxVector const & txVector, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('double', 'ber')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('double', 'ber')], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSifs(ns3::Time sifs) [member function]
     cls.add_method('SetSifs', 
@@ -11884,535 +11845,76 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetBssMembershipSelector(uint8_t selector) const [member function]
-    cls.add_method('GetBssMembershipSelector', 
-                   'uint8_t', 
-                   [param('uint8_t', 'selector')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs(uint8_t mcs) [member function]
-    cls.add_method('GetHtMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs(uint8_t mcs) [member function]
-    cls.add_method('GetVhtMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs(uint8_t mcs) [member function]
-    cls.add_method('GetHeMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetMaxPsduSize(ns3::WifiModulationClass modulation) [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
-                   'void', 
-                   [param('uint8_t', 'id')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetChannelNumber() const [member function]
-    cls.add_method('GetChannelNumber', 
-                   'uint8_t', 
+    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char> > ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
+    cls.add_method('GetBssMembershipSelectorList', 
+                   'std::list< unsigned char >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetChannelSwitchDelay() const [member function]
-    cls.add_method('GetChannelSwitchDelay', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
-    cls.add_method('ConfigureStandardAndBand', 
-                   'void', 
-                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
-    cls.add_method('GetPhyStandard', 
-                   'ns3::WifiPhyStandard', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyBand ns3::WifiPhy::GetPhyBand() const [member function]
-    cls.add_method('GetPhyBand', 
-                   'ns3::WifiPhyBand', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DefineChannelNumber(uint8_t channelNumber, ns3::WifiPhyBand band, ns3::WifiPhyStandard standard, uint16_t frequency, uint16_t channelWidth) [member function]
-    cls.add_method('DefineChannelNumber', 
-                   'bool', 
-                   [param('uint8_t', 'channelNumber'), param('ns3::WifiPhyBand', 'band'), param('ns3::WifiPhyStandard', 'standard'), param('uint16_t', 'frequency'), param('uint16_t', 'channelWidth')])
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::WifiPhy::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::Channel >', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate1Mbps() [member function]
-    cls.add_method('GetDsssRate1Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate2Mbps() [member function]
-    cls.add_method('GetDsssRate2Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate5_5Mbps() [member function]
-    cls.add_method('GetDsssRate5_5Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate11Mbps() [member function]
-    cls.add_method('GetDsssRate11Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate6Mbps() [member function]
-    cls.add_method('GetErpOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate9Mbps() [member function]
-    cls.add_method('GetErpOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate12Mbps() [member function]
-    cls.add_method('GetErpOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate18Mbps() [member function]
-    cls.add_method('GetErpOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate24Mbps() [member function]
-    cls.add_method('GetErpOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate36Mbps() [member function]
-    cls.add_method('GetErpOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate48Mbps() [member function]
-    cls.add_method('GetErpOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate54Mbps() [member function]
-    cls.add_method('GetErpOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
-    cls.add_method('GetOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
-    cls.add_method('GetHtMcs0', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
-    cls.add_method('GetHtMcs1', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
-    cls.add_method('GetHtMcs2', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
-    cls.add_method('GetHtMcs3', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
-    cls.add_method('GetHtMcs4', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
-    cls.add_method('GetHtMcs5', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
-    cls.add_method('GetHtMcs6', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
-    cls.add_method('GetHtMcs7', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
-    cls.add_method('GetHtMcs8', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
-    cls.add_method('GetHtMcs9', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
-    cls.add_method('GetHtMcs10', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
-    cls.add_method('GetHtMcs11', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
-    cls.add_method('GetHtMcs12', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
-    cls.add_method('GetHtMcs13', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
-    cls.add_method('GetHtMcs14', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
-    cls.add_method('GetHtMcs15', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
-    cls.add_method('GetHtMcs16', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
-    cls.add_method('GetHtMcs17', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
-    cls.add_method('GetHtMcs18', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
-    cls.add_method('GetHtMcs19', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
-    cls.add_method('GetHtMcs20', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
-    cls.add_method('GetHtMcs21', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
-    cls.add_method('GetHtMcs22', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
-    cls.add_method('GetHtMcs23', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
-    cls.add_method('GetHtMcs24', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
-    cls.add_method('GetHtMcs25', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
-    cls.add_method('GetHtMcs26', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
-    cls.add_method('GetHtMcs27', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
-    cls.add_method('GetHtMcs28', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
-    cls.add_method('GetHtMcs29', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
-    cls.add_method('GetHtMcs30', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
-    cls.add_method('GetHtMcs31', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
-    cls.add_method('GetVhtMcs0', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
-    cls.add_method('GetVhtMcs1', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
-    cls.add_method('GetVhtMcs2', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
-    cls.add_method('GetVhtMcs3', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
-    cls.add_method('GetVhtMcs4', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
-    cls.add_method('GetVhtMcs5', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
-    cls.add_method('GetVhtMcs6', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
-    cls.add_method('GetVhtMcs7', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
-    cls.add_method('GetVhtMcs8', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
-    cls.add_method('GetVhtMcs9', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs0() [member function]
-    cls.add_method('GetHeMcs0', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs1() [member function]
-    cls.add_method('GetHeMcs1', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs2() [member function]
-    cls.add_method('GetHeMcs2', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs3() [member function]
-    cls.add_method('GetHeMcs3', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs4() [member function]
-    cls.add_method('GetHeMcs4', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs5() [member function]
-    cls.add_method('GetHeMcs5', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList() const [member function]
+    cls.add_method('GetMcsList', 
+                   'std::list< ns3::WifiMode >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs6() [member function]
-    cls.add_method('GetHeMcs6', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetMcsList', 
+                   'std::list< ns3::WifiMode >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
                    'ns3::WifiMode', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
+    cls.add_method('SetChannelNumber', 
+                   'void', 
+                   [param('uint8_t', 'id')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetChannelNumber() const [member function]
+    cls.add_method('GetChannelNumber', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs7() [member function]
-    cls.add_method('GetHeMcs7', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetChannelSwitchDelay() const [member function]
+    cls.add_method('GetChannelSwitchDelay', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs8() [member function]
-    cls.add_method('GetHeMcs8', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('ConfigureStandardAndBand', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
+    cls.add_method('GetPhyStandard', 
+                   'ns3::WifiPhyStandard', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs9() [member function]
-    cls.add_method('GetHeMcs9', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyBand ns3::WifiPhy::GetPhyBand() const [member function]
+    cls.add_method('GetPhyBand', 
+                   'ns3::WifiPhyBand', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs10() [member function]
-    cls.add_method('GetHeMcs10', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyOperatingChannel const & ns3::WifiPhy::GetOperatingChannel() const [member function]
+    cls.add_method('GetOperatingChannel', 
+                   'ns3::WifiPhyOperatingChannel const &', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs11() [member function]
-    cls.add_method('GetHeMcs11', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::WifiPhy::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
                    [], 
-                   is_static=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::WifiConstPsduMap psdus, double txPowerW) [member function]
     cls.add_method('NotifyTxBegin', 
                    'void', 
@@ -12445,10 +11947,6 @@
     cls.add_method('NotifyMonitorSniffTx', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyEndOfHePreamble(ns3::HePreambleParameters params) [member function]
-    cls.add_method('NotifyEndOfHePreamble', 
-                   'void', 
-                   [param('ns3::HePreambleParameters', 'params')])
     ## wifi-phy.h (module 'wifi'): int64_t ns3::WifiPhy::AssignStreams(int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
@@ -12539,6 +12037,10 @@
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
                    is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(uint8_t number, uint16_t frequency, uint16_t width) [member function]
+    cls.add_method('SetOperatingChannel', 
+                   'void', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
     cls.add_method('SetFrequency', 
                    'void', 
@@ -12549,6 +12051,10 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPrimary20Index(uint8_t index) [member function]
+    cls.add_method('SetPrimary20Index', 
+                   'void', 
+                   [param('uint8_t', 'index')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
     cls.add_method('SetNumberOfAntennas', 
                    'void', 
@@ -12633,57 +12139,92 @@
     cls.add_method('ResetCca', 
                    'void', 
                    [param('bool', 'powerRestricted'), param('double', 'txPowerMaxSiso', default_value='0'), param('double', 'txPowerMaxMimo', default_value='0')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerForTransmission(ns3::WifiTxVector txVector) const [member function]
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerForTransmission(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
     cls.add_method('GetTxPowerForTransmission', 
                    'double', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyChannelAccessRequested() [member function]
     cls.add_method('NotifyChannelAccessRequested', 
                    'void', 
                    [])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t bandWidth, uint16_t guardBandwidth, ns3::HeRu::SubcarrierRange range, uint8_t bandIndex=0) const [member function]
+    cls.add_method('ConvertHeRuSubcarriers', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< short, short >', 'range'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static void ns3::WifiPhy::AddStaticPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
+    cls.add_method('AddStaticPhyEntity', 
                    'void', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Ptr<const ns3::PhyEntity> const ns3::WifiPhy::GetStaticPhyEntity(ns3::WifiModulationClass modulation) [member function]
+    cls.add_method('GetStaticPhyEntity', 
+                   'ns3::Ptr< ns3::PhyEntity const > const', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::PhyEntity> ns3::WifiPhy::GetPhyEntity(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetPhyEntity', 
+                   'ns3::Ptr< ns3::PhyEntity >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint64_t ns3::WifiPhy::GetPreviouslyRxPpduUid() const [member function]
+    cls.add_method('GetPreviouslyRxPpduUid', 
+                   'uint64_t', 
                    [], 
-                   is_virtual=True, visibility='protected')
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): std::tuple<double, double, double> ns3::WifiPhy::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DoChannelSwitch(uint8_t id) [member function]
-    cls.add_method('DoChannelSwitch', 
-                   'bool', 
-                   [param('uint8_t', 'id')], 
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [], 
                    visibility='protected')
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DoFrequencySwitch(uint16_t frequency) [member function]
-    cls.add_method('DoFrequencySwitch', 
-                   'bool', 
-                   [param('uint16_t', 'frequency')], 
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::DoChannelSwitch() [member function]
+    cls.add_method('DoChannelSwitch', 
+                   'ns3::Time', 
+                   [], 
                    visibility='protected')
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy() [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy(uint16_t channelWidth) [member function]
     cls.add_method('SwitchMaybeToCcaBusy', 
                    'void', 
-                   [], 
+                   [param('uint16_t', 'channelWidth')], 
                    visibility='protected')
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetStaId() const [member function]
-    cls.add_method('GetStaId', 
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
                    'uint16_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, visibility='protected')
     ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
     cls.add_method('GetBand', 
                    'ns3::WifiSpectrumBand', 
                    [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
                    is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t channelWidth, ns3::HeRu::SubcarrierRange range) const [member function]
-    cls.add_method('ConvertHeRuSubcarriers', 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetPrimaryBand(uint16_t bandWidth) [member function]
+    cls.add_method('GetPrimaryBand', 
                    'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'channelWidth'), param('std::pair< short, short >', 'range')], 
-                   is_const=True, is_virtual=True, visibility='protected')
+                   [param('uint16_t', 'bandWidth')], 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
+    cls.add_method('AddPhyEntity', 
+                   'void', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
+                   visibility='protected')
     return
 
 def register_Ns3WifiPhyStateHelper_methods(root_module, cls):
@@ -12691,10 +12232,10 @@
     cls.add_constructor([param('ns3::WifiPhyStateHelper const &', 'arg0')])
     ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::ContinueRxNextMpdu(ns3::Ptr<ns3::WifiPsdu> psdu, double snr, ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::ContinueRxNextMpdu(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
     cls.add_method('ContinueRxNextMpdu', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector')])
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
     ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetDelayUntilIdle() const [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
@@ -12766,7 +12307,7 @@
     ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
     cls.add_method('SetReceiveOkCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromOff(ns3::Time duration) [member function]
     cls.add_method('SwitchFromOff', 
                    'void', 
@@ -12779,10 +12320,10 @@
     cls.add_method('SwitchFromRxEndError', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, double snr, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
     cls.add_method('SwitchFromRxEndOk', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
     ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromSleep(ns3::Time duration) [member function]
     cls.add_method('SwitchFromSleep', 
                    'void', 
@@ -12818,36 +12359,55 @@
     return
 
 def register_Ns3WifiPpdu_methods(root_module, cls):
-    cls.add_output_stream_operator()
     ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiPpdu const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiPpdu const &', 'arg0')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band) [constructor]
-    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, uint64_t uid=(18446744073709551615UL)) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('uint64_t', 'uid', default_value='(18446744073709551615UL)')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('uint64_t', 'uid')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::WifiPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## wifi-ppdu.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiPpdu::GetModulation() const [member function]
     cls.add_method('GetModulation', 
                    'ns3::WifiModulationClass', 
                    [], 
                    is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::WifiPpdu::GetPsdu(uint8_t bssColor=64, uint16_t staId=65535) const [member function]
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPreamble ns3::WifiPpdu::GetPreamble() const [member function]
+    cls.add_method('GetPreamble', 
+                   'ns3::WifiPreamble', 
+                   [], 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::WifiPpdu::GetPsdu() const [member function]
     cls.add_method('GetPsdu', 
                    'ns3::Ptr< ns3::WifiPsdu const >', 
-                   [param('uint8_t', 'bssColor', default_value='64'), param('uint16_t', 'staId', default_value='65535')], 
+                   [], 
                    is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): uint16_t ns3::WifiPpdu::GetStaId() const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
     cls.add_method('GetTxDuration', 
                    'ns3::Time', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::GetTxVector() const [member function]
     cls.add_method('GetTxVector', 
                    'ns3::WifiTxVector', 
                    [], 
                    is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsMu() const [member function]
-    cls.add_method('IsMu', 
-                   'bool', 
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpduType ns3::WifiPpdu::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::WifiPpduType', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): uint64_t ns3::WifiPpdu::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
                    [], 
                    is_const=True)
     ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsTruncatedTx() const [member function]
@@ -12864,6 +12424,16 @@
     cls.add_method('SetTruncatedTx', 
                    'void', 
                    [])
+    ## wifi-ppdu.h (module 'wifi'): std::string ns3::WifiPpdu::PrintPayload() const [member function]
+    cls.add_method('PrintPayload', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3ZetaRandomVariable_methods(root_module, cls):
@@ -13169,6 +12739,16 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['unsigned long'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::Time'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -13194,6 +12774,11 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
+                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
                    is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -13229,11 +12814,6 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::HePreambleParameters'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
                    is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
@@ -13688,61 +13268,6 @@
                    is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3DsssSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader::DsssSigHeader(ns3::DsssSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DsssSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader::DsssSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::DsssSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::DsssSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::DsssSigHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint64_t ns3::DsssSigHeader::GetRate() const [member function]
-    cls.add_method('GetRate', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::DsssSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::DsssSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::SetRate(uint64_t rate) [member function]
-    cls.add_method('SetRate', 
-                   'void', 
-                   [param('uint64_t', 'rate')])
-    return
-
 def register_Ns3EmpiricalRandomVariable_methods(root_module, cls):
     ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable::EmpiricalRandomVariable() [constructor]
     cls.add_constructor([])
@@ -13947,8 +13472,8 @@
     cls.add_output_stream_operator()
     ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Event const & arg0) [constructor]
     cls.add_constructor([param('ns3::Event const &', 'arg0')])
-    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand', 'rxPower')])
     ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetDuration() const [member function]
     cls.add_method('GetDuration', 
                    'ns3::Time', 
@@ -13984,11 +13509,15 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::WifiTxVector ns3::Event::GetTxVector() const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::WifiTxVector const & ns3::Event::GetTxVector() const [member function]
     cls.add_method('GetTxVector', 
-                   'ns3::WifiTxVector', 
+                   'ns3::WifiTxVector const &', 
                    [], 
                    is_const=True)
+    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateRxPowerW', 
+                   'void', 
+                   [param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
     return
 
 def register_Ns3EventImpl_methods(root_module, cls):
@@ -14142,119 +13671,24 @@
                    'double', 
                    [], 
                    is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue(double alpha, double beta) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'alpha'), param('double', 'beta')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger(uint32_t alpha, uint32_t beta) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'alpha'), param('uint32_t', 'beta')])
-    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [], 
-                   is_virtual=True)
-    return
-
-def register_Ns3HeSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader::HeSigHeader(ns3::HeSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader::HeSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HeSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetBssColor() const [member function]
-    cls.add_method('GetBssColor', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HeSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HeSigHeader::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::HeSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetMcs() const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetNStreams() const [member function]
-    cls.add_method('GetNStreams', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HeSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::HeSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HeSigHeader::IsLdpcCoding() const [member function]
-    cls.add_method('IsLdpcCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetBssColor(uint8_t bssColor) [member function]
-    cls.add_method('SetBssColor', 
-                   'void', 
-                   [param('uint8_t', 'bssColor')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetCoding(bool ldpc) [member function]
-    cls.add_method('SetCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetGuardIntervalAndLtfSize(uint16_t gi, uint8_t ltf) [member function]
-    cls.add_method('SetGuardIntervalAndLtfSize', 
-                   'void', 
-                   [param('uint16_t', 'gi'), param('uint8_t', 'ltf')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetMcs(uint8_t mcs) [member function]
-    cls.add_method('SetMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetMuFlag(bool mu) [member function]
-    cls.add_method('SetMuFlag', 
-                   'void', 
-                   [param('bool', 'mu')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetNStreams(uint8_t nStreams) [member function]
-    cls.add_method('SetNStreams', 
-                   'void', 
-                   [param('uint8_t', 'nStreams')])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue(double alpha, double beta) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha'), param('double', 'beta')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger(uint32_t alpha, uint32_t beta) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'alpha'), param('uint32_t', 'beta')])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
     return
 
 def register_Ns3Ipv4_methods(root_module, cls):
@@ -15419,11 +14853,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::MobilityModel> ns3::LteSpectrumPhy::GetMobility() [member function]
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::MobilityModel> ns3::LteSpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::NetDevice> ns3::LteSpectrumPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -15434,11 +14868,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::LteSpectrumPhy::GetRxAntenna() [member function]
+    ## lte-spectrum-phy.h (module 'lte'): ns3::Ptr<ns3::AntennaModel> ns3::LteSpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -16674,6 +16108,385 @@
                    is_virtual=True)
     return
 
+def register_Ns3PhyEntity_methods(root_module, cls):
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyEntity() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyEntity(ns3::PhyEntity const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::PhyEntity::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('CalculatePhyPreambleAndHeaderDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) const [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::CanReceivePpdu(ns3::Ptr<ns3::WifiPpdu> ppdu, uint16_t txCenterFreq) const [member function]
+    cls.add_method('CanReceivePpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('uint16_t', 'txCenterFreq')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::CancelAllEvents() [member function]
+    cls.add_method('CancelAllEvents', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::CancelRunningEndPreambleDetectionEvents(bool clear=false) [member function]
+    cls.add_method('CancelRunningEndPreambleDetectionEvents', 
+                   'void', 
+                   [param('bool', 'clear', default_value='false')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceiveField', 
+                   'void', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::PhyEntity::GetAddressedPsduInPpdu(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetAddressedPsduInPpdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetDurationUpToField(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDurationUpToField', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint32_t ns3::PhyEntity::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiMode ns3::PhyEntity::GetMcs(uint8_t index) const [member function]
+    cls.add_method('GetMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiPpduField ns3::PhyEntity::GetNextField(ns3::WifiPpduField currentField, ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetNextField', 
+                   'ns3::WifiPpduField', 
+                   [param('ns3::WifiPpduField', 'currentField'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint8_t ns3::PhyEntity::GetNumModes() const [member function]
+    cls.add_method('GetNumModes', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) const [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyHeaderSections ns3::PhyEntity::GetPhyHeaderSections(ns3::WifiTxVector const & txVector, ns3::Time ppduStart) const [member function]
+    cls.add_method('GetPhyHeaderSections', 
+                   'ns3::PhyEntity::PhyHeaderSections', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduStart')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetRemainingDurationAfterField(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiPpduField field) const [member function]
+    cls.add_method('GetRemainingDurationAfterField', 
+                   'ns3::Time', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiPpduField', 'field')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetRxChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetRxChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiMode ns3::PhyEntity::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetStaId(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetTransmissionChannelWidth(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTransmissionChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiConstPsduMap ns3::PhyEntity::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::HandlesMcsModes() const [member function]
+    cls.add_method('HandlesMcsModes', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsMcsSupported(uint8_t index) const [member function]
+    cls.add_method('IsMcsSupported', 
+                   'bool', 
+                   [param('uint8_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsModeSupported(ns3::WifiMode mode) const [member function]
+    cls.add_method('IsModeSupported', 
+                   'bool', 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::NoEndPreambleDetectionEvents() const [member function]
+    cls.add_method('NoEndPreambleDetectionEvents', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::SetOwner(ns3::Ptr<ns3::WifiPhy> wifiPhy) [member function]
+    cls.add_method('SetOwner', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'wifiPhy')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceiveField', 
+                   'void', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreamble', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::Transmit(ns3::Time txDuration, ns3::Ptr<ns3::WifiPpdu> ppdu, std::string type) [member function]
+    cls.add_method('Transmit', 
+                   'void', 
+                   [param('ns3::Time', 'txDuration'), param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::string', 'type')])
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::begin() const [member function]
+    cls.add_method('begin', 
+                   'std::list< ns3::WifiMode > const_iterator', 
+                   [], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::end() const [member function]
+    cls.add_method('end', 
+                   'std::list< ns3::WifiMode > const_iterator', 
+                   [], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::AbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('AbortCurrentReception', 
+                   'void', 
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::AddPreambleEvent(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('AddPreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::PhyEntity::CreateInterferenceEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [member function]
+    cls.add_method('CreateInterferenceEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoAbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('DoAbortCurrentReception', 
+                   'void', 
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::PhyEntity::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoEndReceivePayload(ns3::Ptr<const ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('DoEndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::PhyEntity::DoEndReceivePreamble(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceivePreamble', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::PhyEntity::DoGetEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    cls.add_method('DoGetEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::DoStartReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceiveField', 
+                   'bool', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoStartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DropPreambleEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiPhyRxfailureReason reason, ns3::Time endRx, uint16_t measurementChannelWidth) [member function]
+    cls.add_method('DropPreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiPhyRxfailureReason', 'reason'), param('ns3::Time', 'endRx'), param('uint16_t', 'measurementChannelWidth')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndOfMpdu(ns3::Ptr<ns3::Event> event, ns3::Ptr<const ns3::WifiPsdu> psdu, size_t mpduIndex, ns3::Time relativeStart, ns3::Time mpduDuration) [member function]
+    cls.add_method('EndOfMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('size_t', 'mpduIndex'), param('ns3::Time', 'relativeStart'), param('ns3::Time', 'mpduDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndPreambleDetectionPeriod(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndPreambleDetectionPeriod', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ErasePreambleEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::Time rxDuration) [member function]
+    cls.add_method('ErasePreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::Time', 'rxDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetCenterFrequencyForChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetCenterFrequencyForChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetChannelWidthAndBand', 
+                   'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<const ns3::Event> ns3::PhyEntity::GetCurrentEvent() const [member function]
+    cls.add_method('GetCurrentEvent', 
+                   'ns3::Ptr< ns3::Event const >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long, ns3::WifiPreamble> >, std::allocator<std::pair<const std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event> > > > const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
+    cls.add_method('GetCurrentPreambleEvents', 
+                   'std::map< std::pair< unsigned long, ns3::WifiPreamble >, ns3::Ptr< ns3::Event > > const &', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::PhyEntity::GetPhyHeaderSnrPer(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) const [member function]
+    cls.add_method('GetPhyHeaderSnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::PhyEntity::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): double ns3::PhyEntity::GetRandomValue() const [member function]
+    cls.add_method('GetRandomValue', 
+                   'double', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::pair<bool, ns3::SignalNoiseDbm> ns3::PhyEntity::GetReceptionStatus(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::Ptr<ns3::Event> event, uint16_t staId, ns3::Time relativeMpduStart, ns3::Time mpduDuration) [member function]
+    cls.add_method('GetReceptionStatus', 
+                   'std::pair< bool, ns3::SignalNoiseDbm >', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'staId'), param('ns3::Time', 'relativeMpduStart'), param('ns3::Time', 'mpduDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): double ns3::PhyEntity::GetRxPowerWForPpdu(ns3::Ptr<ns3::Event> event) const [member function]
+    cls.add_method('GetRxPowerWForPpdu', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::tuple<double, double, double> ns3::PhyEntity::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::PhyEntity::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsConfigSupported(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsConfigSupported', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::NotifyInterferenceRxEndAndClear(bool reset) [member function]
+    cls.add_method('NotifyInterferenceRxEndAndClear', 
+                   'void', 
+                   [param('bool', 'reset')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint64_t ns3::PhyEntity::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('ObtainNextUid', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ScheduleEndOfMpdus(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ScheduleEndOfMpdus', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartPreambleDetectionPeriod(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartPreambleDetectionPeriod', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::UpdateInterferenceEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateInterferenceEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')], 
+                   visibility='protected')
+    return
+
+def register_Ns3PhyEntityPhyFieldRxStatus_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(ns3::PhyEntity::PhyFieldRxStatus const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity::PhyFieldRxStatus const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(bool s) [constructor]
+    cls.add_constructor([param('bool', 's')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(bool s, ns3::WifiPhyRxfailureReason r, ns3::PhyEntity::PhyRxFailureAction a) [constructor]
+    cls.add_constructor([param('bool', 's'), param('ns3::WifiPhyRxfailureReason', 'r'), param('ns3::PhyEntity::PhyRxFailureAction', 'a')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::actionIfFailure [variable]
+    cls.add_instance_attribute('actionIfFailure', 'ns3::PhyEntity::PhyRxFailureAction', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::isSuccess [variable]
+    cls.add_instance_attribute('isSuccess', 'bool', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::reason [variable]
+    cls.add_instance_attribute('reason', 'ns3::WifiPhyRxfailureReason', is_const=False)
+    return
+
+def register_Ns3PhyEntitySnrPer_methods(root_module, cls):
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer(ns3::PhyEntity::SnrPer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity::SnrPer const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer(double s, double p) [constructor]
+    cls.add_constructor([param('double', 's'), param('double', 'p')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::per [variable]
+    cls.add_instance_attribute('per', 'double', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
+    return
+
 def register_Ns3PointerChecker_methods(root_module, cls):
     ## pointer.h (module 'core'): ns3::PointerChecker::PointerChecker() [constructor]
     cls.add_constructor([])
@@ -17396,6 +17209,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -17418,6 +17253,94 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0, short unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('ns3::WifiTxVector const &', 'arg0'), param('short unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): short unsigned int ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'short unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -17484,28 +17407,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3HePreambleParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::HePreambleParameters arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::HePreambleParameters', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Void_Ns3PhyReceptionStatParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::PhyReceptionStatParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -18035,25 +17936,25 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Double_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, double arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('double', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('ns3::RxSignalInfo', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     cls.add_copy_constructor()
     return
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/netanim/wscript ns-3.34/src/netanim/wscript
--- ns-3.33/src/netanim/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/netanim/wscript	2021-07-14 10:31:07.000000000 -0700
@@ -6,7 +6,7 @@
 NETANIM_RELEASE_NAME = "netanim-3.108"
 
 def build (bld) :
-    module = bld.create_ns3_module ('netanim', ['internet', 'mobility', 'wimax', 'wifi', 'csma', 'lte', 'uan', 'lr-wpan', 'energy', 'wave'])
+    module = bld.create_ns3_module ('netanim', ['internet', 'mobility', 'wimax', 'wifi', 'csma', 'lte', 'uan', 'lr-wpan', 'energy', 'wave', 'point-to-point-layout'])
     module.includes = '.'
     module.source = [ 'model/animation-interface.cc', ]
     netanim_test = bld.create_ns3_module_test_library('netanim')
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/bindings/modulegen__gcc_ILP32.py ns-3.34/src/network/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/network/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -48,6 +48,10 @@
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator', 'ns3::AttributeConstructionList::CIterator')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator*', 'ns3::AttributeConstructionList::CIterator*')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator&', 'ns3::AttributeConstructionList::CIterator&')
+    ## bit-deserializer.h (module 'network'): ns3::BitDeserializer [class]
+    module.add_class('BitDeserializer')
+    ## bit-serializer.h (module 'network'): ns3::BitSerializer [class]
+    module.add_class('BitSerializer')
     ## buffer.h (module 'network'): ns3::Buffer [class]
     module.add_class('Buffer')
     ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
@@ -119,12 +123,16 @@
     module.add_class('Ipv4Address')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -219,7 +227,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'])
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'])
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True)
     ## queue-size.h (module 'network'): ns3::QueueSize [class]
@@ -736,6 +744,7 @@
     module.add_class('PbbAddressTlv', parent=root_module['ns3::PbbTlv'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', parent=root_module['ns3::QueueItem'])
+    module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type='list')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
@@ -912,6 +921,8 @@
     register_Ns3AsciiTraceHelperForDevice_methods(root_module, root_module['ns3::AsciiTraceHelperForDevice'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
+    register_Ns3BitDeserializer_methods(root_module, root_module['ns3::BitDeserializer'])
+    register_Ns3BitSerializer_methods(root_module, root_module['ns3::BitSerializer'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
     register_Ns3ByteTagIterator_methods(root_module, root_module['ns3::ByteTagIterator'])
@@ -943,8 +954,10 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac16Address_methods(root_module, root_module['ns3::Mac16Address'])
@@ -1441,6 +1454,52 @@
     cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
     return
 
+def register_Ns3BitDeserializer_methods(root_module, cls):
+    ## bit-deserializer.h (module 'network'): ns3::BitDeserializer::BitDeserializer(ns3::BitDeserializer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BitDeserializer const &', 'arg0')])
+    ## bit-deserializer.h (module 'network'): ns3::BitDeserializer::BitDeserializer() [constructor]
+    cls.add_constructor([])
+    ## bit-deserializer.h (module 'network'): uint64_t ns3::BitDeserializer::GetBits(uint8_t size) [member function]
+    cls.add_method('GetBits', 
+                   'uint64_t', 
+                   [param('uint8_t', 'size')])
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushByte(uint8_t byte) [member function]
+    cls.add_method('PushByte', 
+                   'void', 
+                   [param('uint8_t', 'byte')])
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(std::vector<unsigned char, std::allocator<unsigned char> > bytes) [member function]
+    cls.add_method('PushBytes', 
+                   'void', 
+                   [param('std::vector< unsigned char >', 'bytes')])
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(uint8_t * bytes, uint32_t size) [member function]
+    cls.add_method('PushBytes', 
+                   'void', 
+                   [param('uint8_t *', 'bytes'), param('uint32_t', 'size')])
+    return
+
+def register_Ns3BitSerializer_methods(root_module, cls):
+    ## bit-serializer.h (module 'network'): ns3::BitSerializer::BitSerializer(ns3::BitSerializer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BitSerializer const &', 'arg0')])
+    ## bit-serializer.h (module 'network'): ns3::BitSerializer::BitSerializer() [constructor]
+    cls.add_constructor([])
+    ## bit-serializer.h (module 'network'): std::vector<unsigned char, std::allocator<unsigned char> > ns3::BitSerializer::GetBytes() [member function]
+    cls.add_method('GetBytes', 
+                   'std::vector< unsigned char >', 
+                   [])
+    ## bit-serializer.h (module 'network'): uint8_t ns3::BitSerializer::GetBytes(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('GetBytes', 
+                   'uint8_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## bit-serializer.h (module 'network'): void ns3::BitSerializer::InsertPaddingAtEnd(bool padAtEnd) [member function]
+    cls.add_method('InsertPaddingAtEnd', 
+                   'void', 
+                   [param('bool', 'padAtEnd')])
+    ## bit-serializer.h (module 'network'): void ns3::BitSerializer::PushBits(uint64_t value, uint8_t significantBits) [member function]
+    cls.add_method('PushBits', 
+                   'void', 
+                   [param('uint64_t', 'value'), param('uint8_t', 'significantBits')])
+    return
+
 def register_Ns3Buffer_methods(root_module, cls):
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
@@ -1893,6 +1952,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2414,6 +2481,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2627,6 +2706,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2702,6 +2786,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2722,6 +2818,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5542,10 +5643,10 @@
     cls.add_method('SetHeMuFields', 
                    'void', 
                    [param('uint16_t', 'flags1'), param('uint16_t', 'flags2'), param('std::array< unsigned char, 4 > const &', 'ruChannel1'), param('std::array< unsigned char, 4 > const &', 'ruChannel2')])
-    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetHeMuPerUserFields(uint16_t per_user_1, uint16_t per_user_2, uint8_t perUserPosition, uint8_t perUserKnown) [member function]
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetHeMuPerUserFields(uint16_t perUser1, uint16_t perUser2, uint8_t perUserPosition, uint8_t perUserKnown) [member function]
     cls.add_method('SetHeMuPerUserFields', 
                    'void', 
-                   [param('uint16_t', 'per_user_1'), param('uint16_t', 'per_user_2'), param('uint8_t', 'perUserPosition'), param('uint8_t', 'perUserKnown')])
+                   [param('uint16_t', 'perUser1'), param('uint16_t', 'perUser2'), param('uint8_t', 'perUserPosition'), param('uint8_t', 'perUserKnown')])
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetMcsFields(uint8_t known, uint8_t flags, uint8_t mcs) [member function]
     cls.add_method('SetMcsFields', 
                    'void', 
@@ -6078,10 +6179,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -10345,6 +10446,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -10370,6 +10476,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -10431,6 +10542,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -10456,6 +10572,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/bindings/modulegen__gcc_LP64.py ns-3.34/src/network/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/network/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -48,6 +48,10 @@
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator', 'ns3::AttributeConstructionList::CIterator')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator*', 'ns3::AttributeConstructionList::CIterator*')
     typehandlers.add_type_alias('std::list< ns3::AttributeConstructionList::Item > const_iterator&', 'ns3::AttributeConstructionList::CIterator&')
+    ## bit-deserializer.h (module 'network'): ns3::BitDeserializer [class]
+    module.add_class('BitDeserializer')
+    ## bit-serializer.h (module 'network'): ns3::BitSerializer [class]
+    module.add_class('BitSerializer')
     ## buffer.h (module 'network'): ns3::Buffer [class]
     module.add_class('Buffer')
     ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
@@ -119,12 +123,16 @@
     module.add_class('Ipv4Address')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -219,7 +227,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'])
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'])
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True)
     ## queue-size.h (module 'network'): ns3::QueueSize [class]
@@ -736,6 +744,7 @@
     module.add_class('PbbAddressTlv', parent=root_module['ns3::PbbTlv'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', parent=root_module['ns3::QueueItem'])
+    module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::list< ns3::Ptr< ns3::Packet > >', 'ns3::Ptr< ns3::Packet >', container_type='list')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
@@ -912,6 +921,8 @@
     register_Ns3AsciiTraceHelperForDevice_methods(root_module, root_module['ns3::AsciiTraceHelperForDevice'])
     register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
     register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
+    register_Ns3BitDeserializer_methods(root_module, root_module['ns3::BitDeserializer'])
+    register_Ns3BitSerializer_methods(root_module, root_module['ns3::BitSerializer'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
     register_Ns3ByteTagIterator_methods(root_module, root_module['ns3::ByteTagIterator'])
@@ -943,8 +954,10 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac16Address_methods(root_module, root_module['ns3::Mac16Address'])
@@ -1441,6 +1454,52 @@
     cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
     return
 
+def register_Ns3BitDeserializer_methods(root_module, cls):
+    ## bit-deserializer.h (module 'network'): ns3::BitDeserializer::BitDeserializer(ns3::BitDeserializer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BitDeserializer const &', 'arg0')])
+    ## bit-deserializer.h (module 'network'): ns3::BitDeserializer::BitDeserializer() [constructor]
+    cls.add_constructor([])
+    ## bit-deserializer.h (module 'network'): uint64_t ns3::BitDeserializer::GetBits(uint8_t size) [member function]
+    cls.add_method('GetBits', 
+                   'uint64_t', 
+                   [param('uint8_t', 'size')])
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushByte(uint8_t byte) [member function]
+    cls.add_method('PushByte', 
+                   'void', 
+                   [param('uint8_t', 'byte')])
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(std::vector<unsigned char, std::allocator<unsigned char> > bytes) [member function]
+    cls.add_method('PushBytes', 
+                   'void', 
+                   [param('std::vector< unsigned char >', 'bytes')])
+    ## bit-deserializer.h (module 'network'): void ns3::BitDeserializer::PushBytes(uint8_t * bytes, uint32_t size) [member function]
+    cls.add_method('PushBytes', 
+                   'void', 
+                   [param('uint8_t *', 'bytes'), param('uint32_t', 'size')])
+    return
+
+def register_Ns3BitSerializer_methods(root_module, cls):
+    ## bit-serializer.h (module 'network'): ns3::BitSerializer::BitSerializer(ns3::BitSerializer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BitSerializer const &', 'arg0')])
+    ## bit-serializer.h (module 'network'): ns3::BitSerializer::BitSerializer() [constructor]
+    cls.add_constructor([])
+    ## bit-serializer.h (module 'network'): std::vector<unsigned char, std::allocator<unsigned char> > ns3::BitSerializer::GetBytes() [member function]
+    cls.add_method('GetBytes', 
+                   'std::vector< unsigned char >', 
+                   [])
+    ## bit-serializer.h (module 'network'): uint8_t ns3::BitSerializer::GetBytes(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('GetBytes', 
+                   'uint8_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## bit-serializer.h (module 'network'): void ns3::BitSerializer::InsertPaddingAtEnd(bool padAtEnd) [member function]
+    cls.add_method('InsertPaddingAtEnd', 
+                   'void', 
+                   [param('bool', 'padAtEnd')])
+    ## bit-serializer.h (module 'network'): void ns3::BitSerializer::PushBits(uint64_t value, uint8_t significantBits) [member function]
+    cls.add_method('PushBits', 
+                   'void', 
+                   [param('uint64_t', 'value'), param('uint8_t', 'significantBits')])
+    return
+
 def register_Ns3Buffer_methods(root_module, cls):
     ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [constructor]
     cls.add_constructor([param('ns3::Buffer const &', 'o')])
@@ -1893,6 +1952,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2414,6 +2481,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2627,6 +2706,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2702,6 +2786,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2722,6 +2818,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5542,10 +5643,10 @@
     cls.add_method('SetHeMuFields', 
                    'void', 
                    [param('uint16_t', 'flags1'), param('uint16_t', 'flags2'), param('std::array< unsigned char, 4 > const &', 'ruChannel1'), param('std::array< unsigned char, 4 > const &', 'ruChannel2')])
-    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetHeMuPerUserFields(uint16_t per_user_1, uint16_t per_user_2, uint8_t perUserPosition, uint8_t perUserKnown) [member function]
+    ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetHeMuPerUserFields(uint16_t perUser1, uint16_t perUser2, uint8_t perUserPosition, uint8_t perUserKnown) [member function]
     cls.add_method('SetHeMuPerUserFields', 
                    'void', 
-                   [param('uint16_t', 'per_user_1'), param('uint16_t', 'per_user_2'), param('uint8_t', 'perUserPosition'), param('uint8_t', 'perUserKnown')])
+                   [param('uint16_t', 'perUser1'), param('uint16_t', 'perUser2'), param('uint8_t', 'perUserPosition'), param('uint8_t', 'perUserKnown')])
     ## radiotap-header.h (module 'network'): void ns3::RadiotapHeader::SetMcsFields(uint8_t known, uint8_t flags, uint8_t mcs) [member function]
     cls.add_method('SetMcsFields', 
                    'void', 
@@ -6078,10 +6179,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -10345,6 +10446,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -10370,6 +10476,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -10431,6 +10542,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -10456,6 +10572,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/examples/bit-serializer.cc ns-3.34/src/network/examples/bit-serializer.cc
--- ns-3.33/src/network/examples/bit-serializer.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/network/examples/bit-serializer.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,128 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#include <iostream>
+#include "ns3/bit-serializer.h"
+#include "ns3/bit-deserializer.h"
+
+using namespace ns3;
+
+// The main purpose of the BitSerializer and bitDeserializer classes is to
+// simplify the bit serialization and deserialization in headers, trailers
+// and packet bodies.
+//
+// This is usually performed by using bit masks, which works great if the
+// field delimiters are known in advance, and are in a fixed position.
+// If the field (i.e., a group of bits) position is dependent from some
+// other parameter, then the code is more complex.
+// If the field boundary is not even a multiple of a byte, then the problem
+// is even more complex.
+//
+// BitSerializer allows you to "push" bits into a temporary buffer, and then
+// extract an array of uint8_t to be used in
+// Buffer::Iterator:Write (uint8_t const *buffer, uint32_t size).
+//
+// Similarly, BitDeserializer can be initialized by an array of uint8_t,
+// typically obtained by a Buffer::Iterator:Read (uint8_t *buffer, uint32_t size)
+// and then "pop" bits from the underlying buffer.
+//
+// This example shows the basic operations.
+
+int main ()
+{
+
+  BitSerializer testBitSerializer1;
+
+  // add 7 bits - 0x55 (101 0101)
+  testBitSerializer1.PushBits (0x55, 7);
+  // add 3 bits - 0x7 (111)
+  testBitSerializer1.PushBits (0x7, 3);
+  // add 2 bits - 0x0 (00)
+  testBitSerializer1.PushBits (0x0, 2);
+  // The results is 1010 1011 1100.
+  // Adding 4 bits of padding at the end the result is 0xabc0.
+
+  std::vector<uint8_t> result = testBitSerializer1.GetBytes ();
+
+  std::cout << "Result:    ";
+  for (uint8_t i = 0; i < result.size (); i++)
+    {
+      std::cout << std::hex << int(result[i]) << " ";
+    }
+  std::cout << std::endl;
+  std::cout << "Expecting: ab c0" << std::endl;
+
+  // Here, instead of printing bits, you typically serialize them using
+  // Buffer::Iterator:Write (uint8_t const *buffer, uint32_t size).
+  //
+  // In this case the number of bits pushed is not a multiple of a byte
+  // so the class adds a padding at the end of the buffer.
+  // This is the default behaviour.
+
+  BitSerializer testBitSerializer2;
+
+  // add 7 bits - 0x55 (101 0101)
+  testBitSerializer2.PushBits (0x55, 7);
+  // add 3 bits - 0x7 (111)
+  testBitSerializer2.PushBits (0x7, 3);
+  // add 2 bits - 0x0 (00)
+  testBitSerializer2.PushBits (0x0, 2);
+
+  // Change the class behaviour so to use a padding at the start of the buffer.
+  testBitSerializer2.InsertPaddingAtEnd (false);
+  // The results is 1010 1011 1100.
+  // Adding 4 bits of padding at the start the result is 0xabc.
+
+  result = testBitSerializer2.GetBytes ();
+
+  std::cout << "Result:    ";
+  for (uint8_t i = 0; i < result.size (); i++)
+    {
+      std::cout << std::hex << int(result[i]) << " ";
+    }
+  std::cout << std::endl;
+  std::cout << "Expecting: a bc" << std::endl;
+
+  // Here, instead of printing bits, you typically serialize them using
+  // Buffer::Iterator:Write (uint8_t const *buffer, uint32_t size).
+  //
+  // In this case the number of bits pushed is not a multiple of a byte
+  // so the class adds a padding at the start of the buffer.
+
+  BitDeserializer testBitDeserializer;
+  uint8_t test[2];
+  test[0] = 0xab;
+  test[1] = 0xc0;
+
+  // Typically a BitDeserializer will be initialized by an array obtained by
+  // Buffer::Iterator:Read (uint8_t *buffer, uint32_t size).
+
+  testBitDeserializer.PushBytes (test, 2);
+  uint16_t nibble1 = testBitDeserializer.GetBits (7);
+  uint8_t nibble2 = testBitDeserializer.GetBits (3);
+  uint8_t nibble3 = testBitDeserializer.GetBits (2);
+//  if you deserialize too many bits you'll get an assert.
+//  uint8_t errorNibble = testBitDeserializer.GetBits (6);
+
+  std::cout << "Result:    " << std::hex << nibble1 << " " << +nibble2 << " " << +nibble3 << " " << std::endl;
+  std::cout << "Expecting: 55 7 0" << std::endl;
+
+  return 0;
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/examples/wscript ns-3.34/src/network/examples/wscript
--- ns-3.33/src/network/examples/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/examples/wscript	2021-07-14 10:31:07.000000000 -0700
@@ -15,3 +15,6 @@
 
     obj = bld.create_ns3_program('lollipop-comparisions', ['core', 'network'])
     obj.source = 'lollipop-comparisions.cc'
+
+    obj = bld.create_ns3_program('bit-serializer', ['core', 'network'])
+    obj.source = 'bit-serializer.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/helper/delay-jitter-estimation.h ns-3.34/src/network/helper/delay-jitter-estimation.h
--- ns-3.33/src/network/helper/delay-jitter-estimation.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/helper/delay-jitter-estimation.h	2021-07-14 10:31:07.000000000 -0700
@@ -30,7 +30,7 @@
  *
  * \brief Quick and dirty delay and jitter estimation,
  * implementing the jitter algorithm originally from
- * \RFC{1889} (RTP), and unchanged in \RFC(3550) 
+ * \RFC{1889} (RTP), and unchanged in \RFC{3550}
  *
  * This implementation uses the integer variant of the algorithm
  * given in RFC 1889 Appendix A.8 ,p. 71, and repeated in
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/helper/trace-helper.h ns-3.34/src/network/helper/trace-helper.h
--- ns-3.33/src/network/helper/trace-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/helper/trace-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -57,7 +57,8 @@
     DLT_PRISM_HEADER = 119,
     DLT_IEEE802_11_RADIO = 127,
     DLT_IEEE802_15_4 = 195,
-    DLT_NETLINK = 253
+    DLT_NETLINK = 253,
+    DLT_LORATAP = 270
   };
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/model/byte-tag-list.h ns-3.34/src/network/model/byte-tag-list.h
--- ns-3.33/src/network/model/byte-tag-list.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/model/byte-tag-list.h	2021-07-14 10:31:07.000000000 -0700
@@ -152,7 +152,6 @@
    * Copy constructor, copies the data and increases reference count
    *
    * \param o The ByteTagList to copy
-   * \returns The newly created ByteTagList
    *
    */
   ByteTagList (const ByteTagList &o);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/model/socket.h ns-3.34/src/network/model/socket.h
--- ns-3.33/src/network/model/socket.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/model/socket.h	2021-07-14 10:31:07.000000000 -0700
@@ -250,8 +250,11 @@
    *        This callback is intended to notify a socket that would
    *        have been blocked in a blocking socket model that data
    *        is available to be read.
+   * \param receivedData Callback for the event that data is received
+   *        from the underlying transport protocol.  This callback
+   *        is passed a pointer to the socket.
    */
-  void SetRecvCallback (Callback<void, Ptr<Socket> >);
+  void SetRecvCallback (Callback<void, Ptr<Socket> > receivedData);
   /** 
    * \brief Allocate a local endpoint for this socket.
    * \param address the address to try to allocate
@@ -617,7 +620,6 @@
    * the socket can not receive any packets as a result.
    *
    * \param netdevice Pointer to NetDevice of desired interface
-   * \returns nothing
    */
   virtual void BindToNetDevice (Ptr<NetDevice> netdevice);
 
@@ -666,7 +668,6 @@
    * it is enabled for all types of sockets that supports packet information
    *
    * \param flag Enable/Disable receive information
-   * \returns nothing
    */
   void SetRecvPktInfo (bool flag);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/test/bit-serializer-test.cc ns-3.34/src/network/test/bit-serializer-test.cc
--- ns-3.33/src/network/test/bit-serializer-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/network/test/bit-serializer-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,148 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+#include <cstdarg>
+#include <iostream>
+#include <sstream>
+#include "ns3/test.h"
+#include "ns3/bit-serializer.h"
+#include "ns3/bit-deserializer.h"
+
+using namespace ns3;
+
+/**
+ * \ingroup network-test
+ * \ingroup tests
+ *
+ * \brief Bit serialization test
+ */
+class BitSerializerTest : public TestCase
+{
+public:
+  virtual void DoRun (void);
+  BitSerializerTest ();
+};
+
+BitSerializerTest::BitSerializerTest ()
+  : TestCase ("BitSerializer")
+{}
+
+void BitSerializerTest::DoRun ()
+{
+  BitSerializer testBitSerializer1;
+
+  testBitSerializer1.PushBits (0x55, 7);
+  testBitSerializer1.PushBits (0x7, 3);
+  testBitSerializer1.PushBits (0x0, 2);
+
+  std::vector<uint8_t> result = testBitSerializer1.GetBytes ();
+  NS_TEST_EXPECT_MSG_EQ ((result[0] == 0xab) && (result[1] == 0xc0), true,
+                         "Incorrect serialization " << std::hex << +result[0] << +result[1] << " instead of " << 0xab << " " << 0xc0 << std::dec);
+
+  BitSerializer testBitSerializer2;
+
+  testBitSerializer2.PushBits (0x55, 7);
+  testBitSerializer2.PushBits (0x7, 3);
+  testBitSerializer2.PushBits (0x0, 2);
+
+  testBitSerializer2.InsertPaddingAtEnd (false);
+
+  result = testBitSerializer2.GetBytes ();
+  NS_TEST_EXPECT_MSG_EQ ((result[0] == 0x0a) && (result[1] == 0xbc), true,
+                         "Incorrect serialization " << std::hex << +result[0] << +result[1] << " instead of " << 0x0a << " " << 0xbc << std::dec);
+}
+
+/**
+ * \ingroup network-test
+ * \ingroup tests
+ *
+ * \brief Bit deserialization test
+ */
+class BitDeserializerTest : public TestCase
+{
+public:
+  virtual void DoRun (void);
+  BitDeserializerTest ();
+};
+
+BitDeserializerTest::BitDeserializerTest ()
+  : TestCase ("BitDeserializer")
+{}
+
+void BitDeserializerTest::DoRun ()
+{
+  uint16_t nibble1;
+  uint16_t nibble2;
+  uint16_t nibble3;
+  bool result;
+
+  BitDeserializer testBitDeserializer1;
+  uint8_t test1[2];
+  test1[0] = 0xab;
+  test1[1] = 0xc0;
+
+  testBitDeserializer1.PushBytes (test1, 2);
+  nibble1 = testBitDeserializer1.GetBits (7);
+  nibble2 = testBitDeserializer1.GetBits (3);
+  nibble3 = testBitDeserializer1.GetBits (2);
+  result = (nibble1 == 0x55) && (nibble2 == 0x7) && (nibble3 == 0x0);
+
+  NS_TEST_EXPECT_MSG_EQ (result, true,
+                         "Incorrect deserialization " << std::hex << nibble1 << " " << nibble2 << " " << nibble3 <<
+                         " << instead of " << " " << 0x55 << " " << 0x7 << " " << 0x0 << std::dec);
+
+  BitDeserializer testBitDeserializer2;
+  std::vector<uint8_t> test2;
+  test2.push_back (0xab);
+  test2.push_back (0xc0);
+
+  testBitDeserializer2.PushBytes (test2);
+  nibble1 = testBitDeserializer2.GetBits (7);
+  nibble2 = testBitDeserializer2.GetBits (3);
+  nibble3 = testBitDeserializer2.GetBits (2);
+
+  result = (nibble1 == 0x55) && (nibble2 == 0x7) && (nibble3 == 0x0);
+
+  NS_TEST_EXPECT_MSG_EQ (result, true,
+                         "Incorrect deserialization " << std::hex << nibble1 << " " << nibble2 << " " << nibble3 <<
+                         " << instead of " << " " << 0x55 << " " << 0x7 << " " << 0x0 << std::dec);
+
+}
+
+/**
+ * \ingroup network-test
+ * \ingroup tests
+ *
+ * \brief Packet Metadata TestSuite
+ */
+class BitSerializerTestSuite : public TestSuite
+{
+public:
+  BitSerializerTestSuite ();
+};
+
+
+BitSerializerTestSuite::BitSerializerTestSuite ()
+  : TestSuite ("bit-serializer", UNIT)
+{
+  AddTestCase (new BitSerializerTest, TestCase::QUICK);
+  AddTestCase (new BitDeserializerTest, TestCase::QUICK);
+}
+
+static BitSerializerTestSuite g_bitSerializerTest; //!< Static variable for test initialization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/test/packet-test-suite.cc ns-3.34/src/network/test/packet-test-suite.cc
--- ns-3.33/src/network/test/packet-test-suite.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/test/packet-test-suite.cc	2021-07-14 10:31:07.000000000 -0700
@@ -449,6 +449,14 @@
    * \param ... The variable arguments
    */
   void DoCheck (Ptr<const Packet> p, const char *file, int line, uint32_t n, ...);
+  /**
+   * Checks the packet and its data
+   * \param p The packet
+   * \param file The file name
+   * \param line The line number
+   * \param n The number of variable arguments
+   * \param ... The variable arguments
+   */
   void DoCheckData (Ptr<const Packet> p, const char *file, int line, uint32_t n, ...);
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/test/test-data-rate.cc ns-3.34/src/network/test/test-data-rate.cc
--- ns-3.33/src/network/test/test-data-rate.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/test/test-data-rate.cc	2021-07-14 10:31:07.000000000 -0700
@@ -25,12 +25,37 @@
 
 using namespace ns3;
 
+/**
+ * \ingroup network-test
+ * \ingroup tests
+ *
+ * \brief Test Data rate
+ *
+ */
 class DataRateTestCase : public TestCase
 {
 public:
+  /**
+   * Constructor
+   * \param name test name
+   */
   DataRateTestCase (std::string name);
   virtual ~DataRateTestCase ();
+
+  /**
+   * Checks if two time values are equal
+   * \param t1 first time to check
+   * \param t2 second time to check
+   * \param msg check output message
+   */
   void CheckTimesEqual (Time t1, Time t2, const std::string msg);
+  /**
+   * Checks if two data rates values are equal
+   * \param d1 first data rate to check
+   * \param d2 second data rate to check
+   * \param msg check output message
+   */
+  void CheckDataRateEqual (DataRate d1, DataRate d2, const std::string msg);
 
 protected:
   virtual void DoRun (void) = 0;
@@ -52,10 +77,31 @@
   NS_TEST_EXPECT_MSG_EQ (actualFemtos, correctFemtos, msg);
 }
 
+void
+DataRateTestCase::CheckDataRateEqual (DataRate d1, DataRate d2, const std::string msg)
+{
+  NS_TEST_EXPECT_MSG_EQ (d1, d2, msg);
+}
+
+/**
+ * \ingroup network-test
+ * \ingroup tests
+ *
+ * \brief Test Data rate
+ *
+ */
 class DataRateTestCase1 : public DataRateTestCase
 {
 public:
   DataRateTestCase1 ();
+
+  /**
+   * Checks that a given number of bits, at a specified datarate, are
+   * corresponding to a given time
+   * \param rate the DataRate
+   * \param nBits number of bits
+   * \param correctTime expected time
+   */
   void SingleTest (std::string rate, size_t nBits, Time correctTime);
 
 private:
@@ -107,6 +153,124 @@
     }
 }
 
+/**
+ * \ingroup network-test
+ * \ingroup tests
+ *
+ * \brief Test Data rate
+ *
+ */
+class DataRateTestCase2 : public DataRateTestCase
+{
+public:
+  DataRateTestCase2 (); 
+  /**
+   * Checks data rate addition
+   * \param rate1 first data rate
+   * \param rate2 second data rate
+   * \param rate3 third data rate (first plus second)
+   */
+  void AdditionTest (std::string rate1, std::string rate2, std::string rate3);
+  /**
+   * Checks data rate subtraction
+   * \param rate1 first data rate
+   * \param rate2 second data rate
+   * \param rate3 third data rate (first minus second)
+   */
+  void SubtractionTest (std::string rate1, std::string rate2, std::string rate3);
+  /**
+   * Checks data rate integer multiplication
+   * \param rate1 first data rate
+   * \param factor multiplication factor
+   * \param rate2 second data rate  (first multiplied by factor)
+   */
+  void MultiplicationIntTest (std::string rate1, uint64_t factor, std::string rate2);
+  /**
+   * Checks data rate floating point multiplication
+   * \param rate1 first data rate
+   * \param factor multiplication factor
+   * \param rate2 second data rate  (first multiplied by factor)
+   */
+  void MultiplicationDoubleTest (std::string rate1, double factor, std::string rate2);
+
+private:
+  virtual void DoRun (void); 
+};
+
+DataRateTestCase2::DataRateTestCase2 ()
+    : DataRateTestCase ("Test arithmatic on DateRate")
+{
+}
+
+void
+DataRateTestCase2::AdditionTest (std::string rate1, std::string rate2, std::string rate3)
+{
+  DataRate dr1 (rate1);
+  DataRate dr2 (rate2);
+  DataRate dr3 (rate3);
+
+  CheckDataRateEqual(dr1 + dr2, dr3, "DataRate Addition returned incorrect value");
+  
+  dr1 += dr2;
+  CheckDataRateEqual(dr1, dr3, "DataRate Addition returned incorrect value");
+}
+
+void
+DataRateTestCase2::SubtractionTest (std::string rate1, std::string rate2, std::string rate3)
+{
+  DataRate dr1 (rate1);
+  DataRate dr2 (rate2);
+  DataRate dr3 (rate3);
+
+  CheckDataRateEqual(dr1 - dr2, dr3, "DataRate Subtraction returned incorrect value");
+
+  dr1 -= dr2;
+  CheckDataRateEqual(dr1, dr3, "DataRate Subtraction returned incorrect value");
+}
+
+void
+DataRateTestCase2::MultiplicationIntTest (std::string rate1, uint64_t factor, std::string rate2)
+{
+  DataRate dr1 (rate1);
+  DataRate dr2 (rate2);
+
+  CheckDataRateEqual(dr1 * factor, dr2, "DataRate Multiplication with Int returned incorrect value");
+
+  dr1 *= factor;
+  CheckDataRateEqual(dr1, dr2, "DataRate Multiplication with Int returned incorrect value");
+}
+
+void
+DataRateTestCase2::MultiplicationDoubleTest (std::string rate1, double factor, std::string rate2)
+{
+  DataRate dr1 (rate1);
+  DataRate dr2 (rate2);
+
+  CheckDataRateEqual(dr1 * factor, dr2, "DataRate Multiplication with Double returned incorrect value");
+
+  dr1 *= factor;
+  CheckDataRateEqual(dr1, dr2, "DataRate Multiplication with Double returned incorrect value");
+}
+
+void
+DataRateTestCase2::DoRun ()
+{
+  AdditionTest("1Mb/s", "3Mb/s", "4Mb/s");
+  AdditionTest("1Gb/s", "1b/s", "1000000001b/s");
+  SubtractionTest("1Mb/s", "1b/s", "999999b/s");
+  SubtractionTest("2Gb/s", "2Gb/s", "0Gb/s");
+  MultiplicationIntTest("5Gb/s", 2, "10Gb/s");
+  MultiplicationIntTest("4Mb/s", 1000, "4Gb/s");
+  MultiplicationDoubleTest("1Gb/s", 0.001, "1Mb/s");
+  MultiplicationDoubleTest("6Gb/s", 1.0/7.0, "857142857.14b/s");
+}
+
+/**
+ * \ingroup network-test
+ * \ingroup tests
+ *
+ * \brief DataRate TestSuite
+ */
 class DataRateTestSuite : public TestSuite
 {
 public:
@@ -116,7 +280,7 @@
 DataRateTestSuite::DataRateTestSuite () : TestSuite ("data-rate", UNIT)
 {
   AddTestCase (new DataRateTestCase1 (), TestCase::QUICK);
+  AddTestCase (new DataRateTestCase2 (), TestCase::QUICK);
 }
 
-// Do not forget to allocate an instance of this TestSuite
-static DataRateTestSuite sDataRateTestSuite;
+static DataRateTestSuite sDataRateTestSuite; //!< Static variable for test initialization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/bit-deserializer.cc ns-3.34/src/network/utils/bit-deserializer.cc
--- ns-3.33/src/network/utils/bit-deserializer.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/network/utils/bit-deserializer.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,98 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#include <iostream>
+#include "bit-deserializer.h"
+#include "ns3/log.h"
+#include "ns3/abort.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("BitDeserializer");
+
+BitDeserializer::BitDeserializer ()
+{
+  NS_LOG_FUNCTION (this);
+  m_deserializing = false;
+}
+
+void BitDeserializer::PushBytes (std::vector<uint8_t> bytes)
+{
+  NS_LOG_FUNCTION (this << bytes);
+  NS_ABORT_MSG_IF (m_deserializing, "Can't add bytes after deserialization started");
+  m_bytesBlob.insert (m_bytesBlob.end (), bytes.begin (), bytes.end ());
+}
+
+void BitDeserializer::PushBytes (uint8_t* bytes, uint32_t size)
+{
+  NS_LOG_FUNCTION (this << bytes << size);
+  NS_ABORT_MSG_IF (m_deserializing, "Can't add bytes after deserialization started");
+  for (uint32_t index = 0; index < size; index++)
+    {
+      m_bytesBlob.push_back (bytes[index]);
+    }
+}
+
+void BitDeserializer::PushByte (uint8_t byte)
+{
+  NS_LOG_FUNCTION (this << +byte);
+  NS_ABORT_MSG_IF (m_deserializing, "Can't add bytes after deserialization started");
+  m_bytesBlob.push_back (byte);
+}
+
+uint64_t BitDeserializer::GetBits (uint8_t size)
+{
+  NS_LOG_FUNCTION (this << +size);
+  uint8_t result = 0;
+  PrepareDeserialization ();
+
+  NS_ABORT_MSG_IF (size > 64, "Number of requested bits exceeds 64");
+  NS_ABORT_MSG_IF (size > m_blob.size (), "Number of requested bits exceeds blob size");
+
+  for (uint8_t i = 0; i < size; i++)
+    {
+      result <<= 1;
+      result |= m_blob.front ();
+      m_blob.pop_front ();
+    }
+  return result;
+}
+
+void BitDeserializer::PrepareDeserialization ()
+{
+  NS_LOG_FUNCTION (this);
+  if (m_deserializing == false)
+    {
+      m_deserializing = true;
+      for (auto index = m_bytesBlob.begin (); index != m_bytesBlob.end (); index++)
+        {
+          m_blob.push_back (*index & 0x80);
+          m_blob.push_back (*index & 0x40);
+          m_blob.push_back (*index & 0x20);
+          m_blob.push_back (*index & 0x10);
+          m_blob.push_back (*index & 0x8);
+          m_blob.push_back (*index & 0x4);
+          m_blob.push_back (*index & 0x2);
+          m_blob.push_back (*index & 0x1);
+        }
+    }
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/bit-deserializer.h ns-3.34/src/network/utils/bit-deserializer.h
--- ns-3.33/src/network/utils/bit-deserializer.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/network/utils/bit-deserializer.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,90 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#ifndef BITDESERIALIZER_H_
+#define BITDESERIALIZER_H_
+
+#include <vector>
+#include <deque>
+
+namespace ns3 {
+
+/**
+ * \ingroup packet
+ *
+ * \brief Bit deserializer. See also \sa ns3::BitSerializer
+ *
+ * This class helps converting a variable number, variable sized
+ * number of bit-boundary fields stored as byte array representation
+ * and extract the original bit-fields.
+ *
+ * Note that once the Deserialization starts, it's not anymore
+ * possible to add more data to the byte blob to deserialize.
+ */
+
+class BitDeserializer
+{
+public:
+  BitDeserializer ();
+
+  /**
+   * Pushes some bytes into the blob to be deserialized.
+   * \param bytes The bytes to add.
+   */
+  void PushBytes (std::vector<uint8_t> bytes);
+
+  /**
+   * Pushes some bytes into the blob to be deserialized.
+   * \param bytes The bytes to add.
+   * \param size The length of the array.
+   */
+  void PushBytes (uint8_t* bytes, uint32_t size);
+
+  /**
+   * Pushes one byte into the blob to be deserialized.
+   * \param byte The byte to add.
+   */
+  void PushByte (uint8_t byte);
+
+  /**
+   * Pops a given number of bits from the blob front. In other terms,
+   * 'size' bits are shifted from the contents of the byte blob
+   * onto the return value.
+   *
+   * The maximum number of bits to be deserialized in one single call is 64.
+   *
+   * \param size The number of bits to pop.
+   */
+  uint64_t GetBits (uint8_t size);
+
+private:
+  /**
+   * Prepare the byte array to the deserialization.
+   */
+  void PrepareDeserialization ();
+
+  std::deque<bool> m_blob; //!< Blob of bits ready to be deserialized.
+  std::vector<uint8_t> m_bytesBlob;  //!< Blob of bytes to be deserialized.
+  bool m_deserializing; //!< True if the deserialization did start already.
+};
+
+} // namespace ns3
+
+#endif /* BITDESERIALIZER_H_ */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/bit-serializer.cc ns-3.34/src/network/utils/bit-serializer.cc
--- ns-3.33/src/network/utils/bit-serializer.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/network/utils/bit-serializer.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,130 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#include <iostream>
+#include "bit-serializer.h"
+#include "ns3/log.h"
+#include "ns3/assert.h"
+#include "ns3/abort.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("BitSerializer");
+
+BitSerializer::BitSerializer ()
+{
+  NS_LOG_FUNCTION (this);
+  m_padAtEnd = true;
+}
+
+void BitSerializer::InsertPaddingAtEnd (bool padAtEnd)
+{
+  NS_LOG_FUNCTION (this);
+  m_padAtEnd = padAtEnd;
+}
+
+void BitSerializer::PadAtStart ()
+{
+  NS_LOG_FUNCTION (this);
+
+  uint8_t padding = 8 - (m_blob.size () % 8);
+
+  m_blob.insert (m_blob.begin (), padding, false);
+}
+
+void BitSerializer::PadAtEnd ()
+{
+  uint8_t padding = 8 - (m_blob.size () % 8);
+
+  m_blob.insert (m_blob.end (), padding, false);
+}
+
+void BitSerializer::PushBits (uint64_t value, uint8_t significantBits)
+{
+  NS_LOG_FUNCTION (this << value << +significantBits);
+
+  uint64_t mask = 1;
+  mask <<= significantBits - 1;
+
+  for (uint8_t i = 0; i < significantBits; i++)
+    {
+      if (value & mask)
+        {
+          m_blob.push_back (true);
+        }
+      else
+        {
+          m_blob.push_back (false);
+        }
+      mask >>= 1;
+    }
+}
+
+std::vector<uint8_t> BitSerializer::GetBytes ()
+{
+  NS_LOG_FUNCTION (this);
+
+  std::vector<uint8_t> result;
+
+  m_padAtEnd ? PadAtEnd () : PadAtStart ();
+
+  for (auto it = m_blob.begin (); it != m_blob.end ();)
+    {
+      uint8_t tmp = 0;
+      for (uint8_t i = 0; i < 8; ++i)
+        {
+          tmp <<= 1;
+          tmp |= (*it & 1);
+          it++;
+        }
+      result.push_back (tmp);
+    }
+  m_blob.clear ();
+  return result;
+}
+
+uint8_t BitSerializer::GetBytes (uint8_t *buffer, uint32_t size)
+{
+  NS_LOG_FUNCTION (this << buffer << size);
+
+  uint8_t resultLen = 0;
+
+  m_padAtEnd ? PadAtEnd () : PadAtStart ();
+
+  NS_ABORT_MSG_IF (m_blob.size () <= 8 * size, "Target buffer is too short, " << m_blob.size () / 8 << " bytes needed" );
+
+  for (auto it = m_blob.begin (); it != m_blob.end ();)
+    {
+      uint8_t tmp = 0;
+      for (uint8_t i = 0; i < 8; ++i)
+        {
+          tmp <<= 1;
+          tmp |= (*it & 1);
+          it++;
+        }
+      buffer[resultLen] = tmp;
+      resultLen++;
+
+    }
+  m_blob.clear ();
+  return resultLen;
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/bit-serializer.h ns-3.34/src/network/utils/bit-serializer.h
--- ns-3.33/src/network/utils/bit-serializer.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/network/utils/bit-serializer.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,117 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#ifndef BITSERIALIZER_H_
+#define BITSERIALIZER_H_
+
+#include <vector>
+
+namespace ns3 {
+
+/**
+ * \ingroup packet
+ *
+ * \brief Bit serializer. See also \sa ns3::BitDeserializer
+ *
+ * This class helps converting a variable number, variable sized
+ * number of bit-boundary fields to its final byte array representation.
+ *
+ * The typical use-case is:
+ * \verbatim
+   aaa: A field
+   bbb: B field
+   ccc: C field
+   ddd: D field
+   000: padding
+
+   |aaaa abbb bbcc cdd0|
+ \endverbatim
+ *
+ *
+ * Padding can be automatically added at the end or at the start
+ * of the byte blob to reach a multiple of 8 bits.
+ * By default the padding is added at the end of the byte blob.
+ *
+ * This class should be used in two cases:
+ *   - When the number of fields is large.
+ *   - When the number of fields is variable.
+ * In the other cases it's more convenient to use a simple bitmask.
+ */
+
+class BitSerializer
+{
+public:
+  BitSerializer ();
+
+  /**
+   * Toggles the padding insertion policy.
+   * \param padAtEnd true if the padding have to be inserted at the end of the bit blob.
+   */
+  void InsertPaddingAtEnd (bool padAtEnd);
+
+  /**
+   * Pushes a number of bits in the blob.
+   * \param value the bits to be inserted.
+   * \param significantBits Number of bits to insert.
+   */
+  void PushBits (uint64_t value, uint8_t significantBits);
+
+  /**
+   * Get the bytes representation of the blob.
+   * Note that this operation  \b automatically add the
+   * needed padding at the end (or start) of the blob.
+   *
+   * \warning {This operation clears the stored data.}
+   *
+   * \returns The byte representation of the blob.
+   */
+  std::vector<uint8_t> GetBytes ();
+
+  /**
+   * Get the bytes representation of the blob.
+   * Note that this operation  \b automatically add the
+   * needed padding at the end (or start) of the blob.
+   *
+   * \warning {This operation clears the stored data.}
+   *
+   * \param [out] buffer The buffer where to store the return data.
+   * \param [in] size The size of the buffer.
+   * \returns The number of bytes actually used in the buffer.
+   */
+  uint8_t GetBytes (uint8_t *buffer, uint32_t size);
+
+private:
+  /**
+   * Add the padding at the start of the blob.
+   */
+  void PadAtStart ();
+
+  /**
+   * Add the padding at the end of the blob.
+   */
+  void PadAtEnd ();
+
+  std::vector<bool> m_blob; //!< Blob of serialized bits.
+  bool m_padAtEnd; //!< True if the padding must be added at the end of the blob.
+};
+
+} // namespace ns3
+
+#endif /* BITSERIALIZER_H_ */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/data-rate.cc ns-3.34/src/network/utils/data-rate.cc
--- ns-3.33/src/network/utils/data-rate.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/data-rate.cc	2021-07-14 10:31:07.000000000 -0700
@@ -196,6 +196,52 @@
   NS_LOG_FUNCTION (this << bps);
 }
 
+DataRate DataRate::operator + (DataRate rhs)
+{
+  return DataRate(m_bps + rhs.m_bps);
+}
+
+DataRate& DataRate::operator += (DataRate rhs)
+{
+  m_bps += rhs.m_bps;
+  return *this;
+}
+
+DataRate DataRate::operator - (DataRate rhs)
+{
+  NS_ASSERT_MSG(m_bps >= rhs.m_bps, "Data Rate cannot be negative.");
+  return DataRate(m_bps - rhs.m_bps);
+}
+
+DataRate& DataRate::operator -= (DataRate rhs)
+{
+  NS_ASSERT_MSG(m_bps >= rhs.m_bps, "Data Rate cannot be negative.");
+  m_bps -= rhs.m_bps;
+  return *this;
+}
+
+DataRate DataRate::operator * (double rhs)
+{
+  return DataRate(((uint64_t)(m_bps * rhs)));
+}
+
+DataRate& DataRate::operator *= (double rhs)
+{
+  m_bps *= rhs;
+  return *this;
+}
+
+DataRate DataRate::operator * (uint64_t rhs)
+{
+  return DataRate(m_bps * rhs);
+}
+
+DataRate& DataRate::operator *= (uint64_t rhs)
+{
+  m_bps *= rhs;
+  return *this;
+}
+
 bool DataRate::operator < (const DataRate& rhs) const
 {
   return m_bps<rhs.m_bps;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/data-rate.h ns-3.34/src/network/utils/data-rate.h
--- ns-3.33/src/network/utils/data-rate.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/data-rate.h	2021-07-14 10:31:07.000000000 -0700
@@ -119,6 +119,75 @@
   DataRate (std::string rate);
 
   /**
+   * \return the DataRate representing the sum of this object with rhs
+   * 
+   * \param rhs the DataRate to add to this DataRate
+   */
+  DataRate operator + (DataRate rhs);
+
+  /**
+   * \return the DataRate representing the sum of this object with rhs
+   * 
+   * \param rhs the DataRate to add to this DataRate
+   */
+  DataRate& operator += (DataRate rhs);
+
+  /**
+   * \return the DataRate representing the difference of this object with rhs
+   * 
+   * \param rhs the DataRate to subtract from this DataRate
+   */
+  DataRate operator - (DataRate rhs);
+
+  /**
+   * \return the DataRate representing the difference of this object with rhs
+   * 
+   * \param rhs the DataRate to subtract from this DataRate
+   */
+  DataRate& operator -= (DataRate rhs);
+
+  /**
+   * \brief Scales the DataRate
+   * 
+   * Multiplies with double and is re-casted to an int
+   * 
+   * \return DataRate object representing the product of this object with rhs 
+   * 
+   * \param rhs the double to multiply to this datarate
+   */
+  DataRate operator * (double rhs);
+
+  /**
+   * \brief Scales the DataRate
+   * 
+   * Multiplies with double and is re-casted to an int 
+   * 
+   * \return DataRate object representing the product of this object with rhs
+   * 
+   * \param rhs the double to multipy to this datarate
+   */
+  DataRate& operator *= (double rhs);
+
+  /**
+   * \brief Scales the DataRate
+   * 
+   * \return DataRate object representing the product of this object with rhs
+   * 
+   * \param rhs the uint64_t to multipy to this datarate
+   */
+  DataRate operator * (uint64_t rhs);
+
+  /**
+   * \brief Scales the DataRate
+   * 
+   * \return DataRate object representing the product of this object with rhs
+   * 
+   * \param rhs the uint64_t to multipy to this datarate
+   */
+  DataRate& operator *= (uint64_t rhs);
+
+
+  /**
    * \return true if this rate is less than rhs
    *
    * \param rhs the datarate to compare to this datarate
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/ipv4-address.cc ns-3.34/src/network/utils/ipv4-address.cc
--- ns-3.33/src/network/utils/ipv4-address.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/ipv4-address.cc	2021-07-14 10:31:07.000000000 -0700
@@ -197,6 +197,10 @@
   return tmp; 
 }
 
+/**
+ *  Value of a not-yet-initialized IPv4 address, corresponding to 102.102.102.102.
+ *  This is totally arbitrary.
+ */
 static constexpr uint32_t UNINITIALIZED = 0x66666666U;
 
 Ipv4Address::Ipv4Address ()
@@ -422,7 +426,7 @@
 
 size_t Ipv4AddressHash::operator() (Ipv4Address const &x) const
 { 
-  return x.Get ();
+  return std::hash<uint32_t>()(x.Get ());
 }
 
 std::ostream& operator<< (std::ostream& os, Ipv4Address const& address)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/ipv4-address.h ns-3.34/src/network/utils/ipv4-address.h
--- ns-3.33/src/network/utils/ipv4-address.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/ipv4-address.h	2021-07-14 10:31:07.000000000 -0700
@@ -396,35 +396,16 @@
  */
 std::istream & operator >> (std::istream &is, Ipv4Mask &mask);
 
-/**
- * \brief Equal to operator.
- *
- * \param a the first operand
- * \param b the first operand
- * \returns true if the operands are equal
- */
 inline bool operator == (const Ipv4Address &a, const Ipv4Address &b)
 {
   return (a.m_address == b.m_address);
 }
-/**
- * \brief Not equal to operator.
- *
- * \param a the first operand
- * \param b the first operand
- * \returns true if the operands are not equal
- */
+
 inline bool operator != (const Ipv4Address &a, const Ipv4Address &b)
 {
   return (a.m_address != b.m_address);
 }
-/**
- * \brief Less than operator.
- *
- * \param a the first operand
- * \param b the first operand
- * \returns true if the operand a is less than operand b
- */
+
 inline bool operator < (const Ipv4Address &a, const Ipv4Address &b)
 {
   return (a.m_address < b.m_address);
@@ -435,35 +416,24 @@
  *
  * \brief Class providing an hash for IPv4 addresses
  */
-class Ipv4AddressHash : public std::unary_function<Ipv4Address, size_t> {
+class Ipv4AddressHash {
 public:
   /**
-   * Returns the hash of the address
+   * \brief Returns the hash of an IPv4 address.
    * \param x the address
    * \return the hash
+   *
+   * This method uses std::hash rather than class Hash
+   * as speed is more important than cryptographic robustness.
    */
   size_t operator() (Ipv4Address const &x) const;
 };
 
-/**
- * \brief Equal to operator.
- *
- * \param a the first operand
- * \param b the first operand
- * \returns true if the operands are equal
- */
 inline bool operator == (Ipv4Mask const &a, Ipv4Mask const &b)
 {
   return (a.m_mask == b.m_mask);
 }
 
-/**
- * \brief Not equal to operator.
- *
- * \param a the first operand
- * \param b the first operand
- * \returns true if the operands are not equal
- */
 inline bool operator != (Ipv4Mask const &a, Ipv4Mask const &b)
 {
   return (a.m_mask != b.m_mask);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/ipv6-address.cc ns-3.34/src/network/utils/ipv6-address.cc
--- ns-3.33/src/network/utils/ipv6-address.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/ipv6-address.cc	2021-07-14 10:31:07.000000000 -0700
@@ -375,19 +375,19 @@
 
   if (Mac64Address::IsMatchingType (addr))
     {
-      ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac64Address::ConvertFrom (addr), Ipv6Address (prefix) );
+      ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac64Address::ConvertFrom (addr), prefix);
     }
   else if (Mac48Address::IsMatchingType (addr))
     {
-      ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac48Address::ConvertFrom (addr), Ipv6Address (prefix));
+      ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac48Address::ConvertFrom (addr), prefix);
     }
   else if (Mac16Address::IsMatchingType (addr))
     {
-      ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac16Address::ConvertFrom (addr), Ipv6Address (prefix) );
+      ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac16Address::ConvertFrom (addr), prefix);
     }
   else if (Mac8Address::IsMatchingType (addr))
     {
-      ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac8Address::ConvertFrom (addr), Ipv6Address (prefix) );
+      ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac8Address::ConvertFrom (addr), prefix);
     }
 
   if (ipv6Addr.IsAny ())
@@ -397,6 +397,12 @@
   return ipv6Addr;
 }
 
+Ipv6Address Ipv6Address::MakeAutoconfiguredAddress (Address addr, Ipv6Prefix prefix)
+{
+  Ipv6Address ipv6PrefixAddr = Ipv6Address::GetOnes ().CombinePrefix(prefix);
+  return MakeAutoconfiguredAddress (addr, ipv6PrefixAddr);
+}
+
 Ipv6Address Ipv6Address::MakeAutoconfiguredAddress (Mac16Address addr, Ipv6Address prefix)
 {
   NS_LOG_FUNCTION (addr << prefix);
@@ -728,8 +734,8 @@
 bool Ipv6Address::IsIpv4MappedAddress () const
 {
   NS_LOG_FUNCTION (this);
-  uint8_t v4MappedPrefix[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                                 0x00, 0x00, 0xff, 0xff };
+  static uint8_t v4MappedPrefix[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                        0x00, 0x00, 0xff, 0xff };
   if (memcmp(m_address, v4MappedPrefix, sizeof(v4MappedPrefix)) == 0)
     {
       return (true);
@@ -760,14 +766,9 @@
 bool Ipv6Address::IsSolicitedMulticast () const
 {
   NS_LOG_FUNCTION (this);
-  uint8_t buf[16];
-
-  Serialize (buf);
 
-  if (buf[0] == 0xff && 
-      buf[1] == 0x02 &&
-      buf[11] == 0x01 &&
-      buf[12] == 0xff)
+  static Ipv6Address documentation ("ff02::1:ff00:0");
+  if (CombinePrefix (Ipv6Prefix (104)) == documentation)
     {
       return true;
     }
@@ -804,8 +805,8 @@
 bool Ipv6Address::IsDocumentation () const
 {
   NS_LOG_FUNCTION (this);
-  Ipv6Address documentation ("2001:db8::0");
-  if (((Ipv6Address*)this)->CombinePrefix (Ipv6Prefix (32)) == documentation)
+  static Ipv6Address documentation ("2001:db8::0");
+  if (CombinePrefix (Ipv6Prefix (32)) == documentation)
     {
       return true;
     }
@@ -916,8 +917,8 @@
 bool Ipv6Address::IsLinkLocal () const
 {
   NS_LOG_FUNCTION (this);
-  Ipv6Address linkLocal ("fe80::0");
-  if (!IsMulticast () && ((Ipv6Address*)this)->CombinePrefix (Ipv6Prefix (64)) == linkLocal)
+  static Ipv6Address linkLocal ("fe80::0");
+  if (CombinePrefix (Ipv6Prefix (64)) == linkLocal)
     {
       return true;
     }
@@ -1106,6 +1107,15 @@
   memcpy (buf, m_prefix, 16);
 }
 
+Ipv6Address Ipv6Prefix::ConvertToIpv6Address () const
+{
+  uint8_t prefixBytes[16];
+  memcpy (prefixBytes, m_prefix, 16);
+
+  Ipv6Address convertedPrefix = Ipv6Address (prefixBytes);
+  return convertedPrefix;
+}
+
 uint8_t Ipv6Prefix::GetPrefixLength () const
 {
   NS_LOG_FUNCTION (this);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/ipv6-address.h ns-3.34/src/network/utils/ipv6-address.h
--- ns-3.33/src/network/utils/ipv6-address.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/ipv6-address.h	2021-07-14 10:31:07.000000000 -0700
@@ -155,6 +155,18 @@
   static Ipv6Address MakeAutoconfiguredAddress (Address addr, Ipv6Address prefix);
 
   /**
+   * \brief Make the autoconfigured IPv6 address from a Mac address.
+   *
+   * Actually the MAC supported are: Mac8, Mac16, Mac48, and Mac64.
+   *
+   * \param addr the MAC address.
+   * \param prefix the IPv6 prefix
+   * \return autoconfigured IPv6 address
+   */
+
+  static Ipv6Address MakeAutoconfiguredAddress (Address addr, Ipv6Prefix prefix);
+
+  /**
    * \brief Make the autoconfigured IPv6 address with Mac16Address.
    *
    * The EUI-64 scheme used is based on the \RFC{4944}.
@@ -394,7 +406,6 @@
   /**
    * \brief Get the bytes corresponding to the address.
    * \param buf buffer to store the data
-   * \return bytes of the address
    */
   void GetBytes (uint8_t buf[16]) const;
 
@@ -533,6 +544,12 @@
   void GetBytes (uint8_t buf[16]) const;
 
   /**
+   * \brief Convert the Prefix into an IPv6 Address.
+   * \return an IPv6 address representing the prefix
+   */
+  Ipv6Address ConvertToIpv6Address () const;
+
+  /**
    * \brief Get prefix length.
    * \return prefix length
    */
@@ -685,11 +702,11 @@
  * \class Ipv6AddressHash
  * \brief Hash function class for IPv6 addresses.
  */
-class Ipv6AddressHash : public std::unary_function<Ipv6Address, size_t>
+class Ipv6AddressHash
 {
 public:
   /**
-   * \brief Unary operator to hash IPv6 address.
+   * \brief Returns the hash of an IPv6 address.
    * \param x IPv6 address to hash
    * \returns the hash of the address
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/lollipop-counter.h ns-3.34/src/network/utils/lollipop-counter.h
--- ns-3.33/src/network/utils/lollipop-counter.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/lollipop-counter.h	2021-07-14 10:31:07.000000000 -0700
@@ -136,7 +136,7 @@
   }
 
   /**
-   * Checks if two counters are comparable (i.e., not desynchronized).
+   * Checks if the counter is comparable with another counter (i.e., not desynchronized).
    *
    * If the absolute magnitude of difference of the two
    * sequence counters is greater than Sequence Window, then a
@@ -146,7 +146,8 @@
    * Sequence Window is equal to 2^N where N is (by default) half the number
    * of digits of the underlying type.
    *
-   * \returns true if the two counters are comparable.
+   * \param val counter to compare
+   * \returns true if the counters are comparable.
    */
   bool IsComparable (const LollipopCounter &val) const
   {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/mac16-address.h ns-3.34/src/network/utils/mac16-address.h
--- ns-3.33/src/network/utils/mac16-address.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/mac16-address.h	2021-07-14 10:31:07.000000000 -0700
@@ -110,6 +110,7 @@
    * bits 3-7 within DST[15].  The initial 3-bit pattern of "100" follows
    * the 16-bit address format for multicast addresses (Section 12).
    *
+   * \param address base IPv6 address
    * \returns the multicast 16-bit address.
    */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/pcap-file.h ns-3.34/src/network/utils/pcap-file.h
--- ns-3.33/src/network/utils/pcap-file.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/pcap-file.h	2021-07-14 10:31:07.000000000 -0700
@@ -111,8 +111,6 @@
    * \param nanosecMode Flag indicating the time resolution of the writing
    * system. Default to false.
    *
-   * \return false if the open succeeds, true otherwise.
-   *
    * \warning Calling this method on an existing file will result in the loss
    * any existing data.
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/queue.h ns-3.34/src/network/utils/queue.h
--- ns-3.33/src/network/utils/queue.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/queue.h	2021-07-14 10:31:07.000000000 -0700
@@ -271,14 +271,14 @@
 
   /**
    * Remove an item from the Queue (each subclass defines the position),
-   * counting it as dequeued
+   * counting it and tracing it as dequeued
    * \return 0 if the operation was not successful; the item otherwise.
    */
   virtual Ptr<Item> Dequeue (void) = 0;
 
   /**
    * Remove an item from the Queue (each subclass defines the position),
-   * counting it as dropped
+   * counting it and tracing it as both dequeued and dropped
    * \return 0 if the operation was not successful; the item otherwise.
    */
   virtual Ptr<Item>  Remove (void) = 0;
@@ -291,7 +291,9 @@
   virtual Ptr<const Item> Peek (void) const = 0;
 
   /**
-   * Flush the queue.
+   * Flush the queue by calling Remove() on each item enqueued.  Note that
+   * this operation will cause dequeue and drop counts to be incremented and
+   * traces to be triggered for each Remove() action.
    */
   void Flush (void);
 
@@ -371,13 +373,22 @@
 
   /**
    * Push an item in the queue
-   * \param pos the position where the item is inserted
+   * \param pos the position before which the item will be inserted
    * \param item the item to enqueue
    * \return true if success, false if the packet has been dropped.
    */
   bool DoEnqueue (ConstIterator pos, Ptr<Item> item);
 
   /**
+   * Push an item in the queue
+   * \param pos the position before which the item will be inserted
+   * \param item the item to enqueue
+   * \param[out] ret an iterator pointing to the inserted value
+   * \return true if success, false if the packet has been dropped.
+   */
+  bool DoEnqueue (ConstIterator pos, Ptr<Item> item, Iterator& ret);
+
+  /**
    * Pull the item to dequeue from the queue
    * \param pos the position of the item to dequeue
    * \return the item.
@@ -418,6 +429,8 @@
    */
   void DropAfterDequeue (Ptr<Item> item);
 
+  void DoDispose (void) override;
+
 private:
   std::list<Ptr<Item> > m_packets;          //!< the items in the queue
   NS_LOG_TEMPLATE_DECLARE;                  //!< the log component
@@ -481,6 +494,14 @@
 bool
 Queue<Item>::DoEnqueue (ConstIterator pos, Ptr<Item> item)
 {
+  Iterator ret;
+  return DoEnqueue (pos, item, ret);
+}
+
+template <typename Item>
+bool
+Queue<Item>::DoEnqueue (ConstIterator pos, Ptr<Item> item, Iterator& ret)
+{
   NS_LOG_FUNCTION (this << item);
 
   if (GetCurrentSize () + item > GetMaxSize ())
@@ -490,7 +511,7 @@
       return false;
     }
 
-  m_packets.insert (pos, item);
+  ret = m_packets.insert (pos, item);
 
   uint32_t size = item->GetSize ();
   m_nBytes += size;
@@ -578,6 +599,15 @@
 }
 
 template <typename Item>
+void
+Queue<Item>::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_packets.clear ();
+  Object::DoDispose ();
+}
+
+template <typename Item>
 Ptr<const Item>
 Queue<Item>::DoPeek (ConstIterator pos) const
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/radiotap-header.cc ns-3.34/src/network/utils/radiotap-header.cc
--- ns-3.33/src/network/utils/radiotap-header.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/radiotap-header.cc	2021-07-14 10:31:07.000000000 -0700
@@ -872,11 +872,11 @@
 }
 
 void
-RadiotapHeader::SetHeMuPerUserFields (uint16_t per_user_1, uint16_t per_user_2, uint8_t perUserPosition, uint8_t perUserKnown)
+RadiotapHeader::SetHeMuPerUserFields (uint16_t perUser1, uint16_t perUser2, uint8_t perUserPosition, uint8_t perUserKnown)
 {
-  NS_LOG_FUNCTION (this << per_user_1 << per_user_2 << +perUserPosition << +perUserKnown);
-  m_heMuPerUser1 = per_user_1;
-  m_heMuPerUser2 = per_user_2;
+  NS_LOG_FUNCTION (this << perUser1 << perUser2 << +perUserPosition << +perUserKnown);
+  m_heMuPerUser1 = perUser1;
+  m_heMuPerUser2 = perUser2;
   m_heMuPerUserPosition = perUserPosition;
   m_heMuPerUserKnown = perUserKnown;
   if (!(m_present & RADIOTAP_HE_MU_OTHER_USER))
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/radiotap-header.h ns-3.34/src/network/utils/radiotap-header.h
--- ns-3.33/src/network/utils/radiotap-header.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/radiotap-header.h	2021-07-14 10:31:07.000000000 -0700
@@ -429,7 +429,7 @@
    * @param perUserPosition The per_user_position field.
    * @param perUserKnown The per_user_known field.
    */
-  void SetHeMuPerUserFields (uint16_t per_user_1, uint16_t per_user_2, uint8_t perUserPosition, uint8_t perUserKnown);
+  void SetHeMuPerUserFields (uint16_t perUser1, uint16_t perUser2, uint8_t perUserPosition, uint8_t perUserKnown);
 
 private:
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/sgi-hashmap.h ns-3.34/src/network/utils/sgi-hashmap.h
--- ns-3.33/src/network/utils/sgi-hashmap.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/sgi-hashmap.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,67 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@cutebugs.net>
- */
-
-/* This code snippet was ripped out of the gcc 
- * documentation and slightly modified to work
- * with gcc 4.x
- */
-#ifndef SGI_HASHMAP_H
-#define SGI_HASHMAP_H
-
-/* To use gcc extensions.
- */
-#ifdef __GNUC__
-  #if __GNUC__ < 3 // GCC 2.x
-    #include <hash_map.h>
-    namespace sgi { using ::hash_map; }; // inherit globals
-  #else
-    #if __GNUC__ < 4 // GCC 3.x
-      #include <ext/hash_map>
-      #if __GNUC_MINOR__ == 0
-        namespace sgi = std; // GCC 3.0
-      #else
-        namespace sgi = ::__gnu_cxx; // GCC 3.1 and later
-      #endif
-    #else
-       #if __GNUC__ < 5 // GCC 4.x
-         #if __GNUC_MINOR__ < 3 // GCC 4.0, 4.1 and 4.2
-           #ifdef __clang__ // Clang identifies as GCC 4.2
-             #undef __DEPRECATED
-           #endif
-           #include <ext/hash_map>
-           namespace sgi = ::__gnu_cxx;
-         #else
-           #undef __DEPRECATED
-           #include <backward/hash_map>
-           namespace sgi = ::__gnu_cxx;
-         #endif
-       #else // GCC 5.x
-         #undef __DEPRECATED
-         #include <backward/hash_map>
-         namespace sgi = ::__gnu_cxx;
-       #endif
-     #endif
-  #endif
-#else      // ...  there are other compilers, right?
-namespace sgi = std;
-#endif
-
-
-#endif /* SGI_HASHMAP_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/utils/simple-net-device.cc ns-3.34/src/network/utils/simple-net-device.cc
--- ns-3.33/src/network/utils/simple-net-device.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/utils/simple-net-device.cc	2021-07-14 10:31:07.000000000 -0700
@@ -539,7 +539,7 @@
   m_channel = 0;
   m_node = 0;
   m_receiveErrorModel = 0;
-  m_queue->Flush ();
+  m_queue->Dispose ();
   if (FinishTransmissionEvent.IsRunning ())
     {
       FinishTransmissionEvent.Cancel ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/network/wscript ns-3.34/src/network/wscript
--- ns-3.33/src/network/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/network/wscript	2021-07-14 10:31:07.000000000 -0700
@@ -24,6 +24,8 @@
         'model/tag-buffer.cc',
         'model/trailer.cc',
         'utils/address-utils.cc',
+        'utils/bit-deserializer.cc',
+        'utils/bit-serializer.cc',
         'utils/crc32.cc',
         'utils/data-rate.cc',
         'utils/drop-tail-queue.cc',
@@ -74,6 +76,7 @@
 
     network_test = bld.create_ns3_module_test_library('network')
     network_test.source = [
+        'test/bit-serializer-test.cc',
         'test/buffer-test.cc',
         'test/drop-tail-queue-test-suite.cc',
         'test/error-model-test-suite.cc',
@@ -118,6 +121,8 @@
         'model/tag-buffer.h',
         'model/trailer.h',
         'utils/address-utils.h',
+        'utils/bit-deserializer.h',
+        'utils/bit-serializer.h',
         'utils/crc32.h',
         'utils/data-rate.h',
         'utils/drop-tail-queue.h',
@@ -151,7 +156,6 @@
         'utils/net-device-queue-interface.h',
         'utils/radiotap-header.h',
         'utils/sequence-number.h',
-        'utils/sgi-hashmap.h',
         'utils/simple-channel.h',
         'utils/simple-net-device.h',
         'utils/sll-header.h',
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py ns-3.34/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -85,6 +85,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -97,6 +99,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -503,10 +507,12 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv4RoutingHelper_methods(root_module, root_module['ns3::Ipv4RoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1524,6 +1530,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1855,6 +1873,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1930,6 +1953,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1950,6 +1985,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -3571,8 +3611,8 @@
 def register_Ns3Ipv4NixVectorHelper_methods(root_module, cls):
     ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorHelper::Ipv4NixVectorHelper() [constructor]
     cls.add_constructor([])
-    ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorHelper::Ipv4NixVectorHelper(ns3::Ipv4NixVectorHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4NixVectorHelper const &', 'arg0')])
+    ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorHelper::Ipv4NixVectorHelper(ns3::Ipv4NixVectorHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv4NixVectorHelper const &', 'o')])
     ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorHelper * ns3::Ipv4NixVectorHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ipv4NixVectorHelper *', 
@@ -3583,6 +3623,10 @@
                    'ns3::Ptr< ns3::Ipv4RoutingProtocol >', 
                    [param('ns3::Ptr< ns3::Node >', 'node')], 
                    is_const=True, is_virtual=True)
+    ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorHelper::PrintRoutingPathAt(ns3::Time printTime, ns3::Ptr<ns3::Node> source, ns3::Ipv4Address dest, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintRoutingPathAt', 
+                   'void', 
+                   [param('ns3::Time', 'printTime'), param('ns3::Ptr< ns3::Node >', 'source'), param('ns3::Ipv4Address', 'dest'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')])
     return
 
 def register_Ns3Object_methods(root_module, cls):
@@ -4021,10 +4065,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -6410,6 +6454,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::PrintRoutingPath(ns3::Ptr<ns3::Node> source, ns3::Ipv4Address dest, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit) const [member function]
+    cls.add_method('PrintRoutingPath', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'source'), param('ns3::Ipv4Address', 'dest'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit')], 
+                   is_const=True)
     ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::SetNode(ns3::Ptr<ns3::Node> node) [member function]
     cls.add_method('SetNode', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py ns-3.34/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -85,6 +85,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -97,6 +99,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -503,10 +507,12 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv4RoutingHelper_methods(root_module, root_module['ns3::Ipv4RoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1524,6 +1530,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1855,6 +1873,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1930,6 +1953,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1950,6 +1985,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -3571,8 +3611,8 @@
 def register_Ns3Ipv4NixVectorHelper_methods(root_module, cls):
     ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorHelper::Ipv4NixVectorHelper() [constructor]
     cls.add_constructor([])
-    ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorHelper::Ipv4NixVectorHelper(ns3::Ipv4NixVectorHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4NixVectorHelper const &', 'arg0')])
+    ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorHelper::Ipv4NixVectorHelper(ns3::Ipv4NixVectorHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::Ipv4NixVectorHelper const &', 'o')])
     ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorHelper * ns3::Ipv4NixVectorHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ipv4NixVectorHelper *', 
@@ -3583,6 +3623,10 @@
                    'ns3::Ptr< ns3::Ipv4RoutingProtocol >', 
                    [param('ns3::Ptr< ns3::Node >', 'node')], 
                    is_const=True, is_virtual=True)
+    ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorHelper::PrintRoutingPathAt(ns3::Time printTime, ns3::Ptr<ns3::Node> source, ns3::Ipv4Address dest, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintRoutingPathAt', 
+                   'void', 
+                   [param('ns3::Time', 'printTime'), param('ns3::Ptr< ns3::Node >', 'source'), param('ns3::Ipv4Address', 'dest'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')])
     return
 
 def register_Ns3Object_methods(root_module, cls):
@@ -4021,10 +4065,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -6410,6 +6454,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::PrintRoutingPath(ns3::Ptr<ns3::Node> source, ns3::Ipv4Address dest, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit) const [member function]
+    cls.add_method('PrintRoutingPath', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'source'), param('ns3::Ipv4Address', 'dest'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit')], 
+                   is_const=True)
     ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::SetNode(ns3::Ptr<ns3::Node> node) [member function]
     cls.add_method('SetNode', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/nix-vector-routing/doc/nix-vector-routing.rst ns-3.34/src/nix-vector-routing/doc/nix-vector-routing.rst
--- ns-3.33/src/nix-vector-routing/doc/nix-vector-routing.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/nix-vector-routing/doc/nix-vector-routing.rst	2021-07-14 10:31:07.000000000 -0700
@@ -37,6 +37,11 @@
 nix-vector and transmits the packet through the corresponding 
 net-device.  This continues until the packet reaches the destination.
 
+NixVectorRouting bases its routing decisions on the nodes addresses,
+and it does **not** check that the nodes are in the proper subnets.
+In other terms, using NixVectorRouting you could have an (apparently)
+working network that violates every good practice in IP address assignments.
+
 Scope and Limitations
 =====================
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/nix-vector-routing/examples/nix-simple.cc ns-3.34/src/nix-vector-routing/examples/nix-simple.cc
--- ns-3.33/src/nix-vector-routing/examples/nix-simple.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/nix-vector-routing/examples/nix-simple.cc	2021-07-14 10:31:07.000000000 -0700
@@ -23,19 +23,89 @@
 #include "ns3/ipv4-list-routing-helper.h"
 #include "ns3/ipv4-nix-vector-helper.h"
 
-/*
- *  Simple point to point links:
+/**
+ * This program demonstrates two types of
+ * trace output that are available:
+ * 1) Print Routing Table for all the nodes.
+ * 2) Print Routing Path, given source and destination.
  *
- *  n0 -- n1 -- n2 -- n3
- *
- *  n0 has UdpEchoClient 
- *  n3 has UdpEchoServer
- *
- *  n0 IP: 10.1.1.1
- *  n1 IP: 10.1.1.2, 10.1.2.1
- *  n2 IP: 10.1.2.2, 10.1.3.1
- *  n3 IP: 10.1.3.2
+ * Simple point to point links:
+ * \verbatim
+       ________
+      /        \
+    n0 -- n1 -- n2 -- n3
+
+    n0 IP: 10.1.1.1, 10.1.4.1
+    n1 IP: 10.1.1.2, 10.1.2.1
+    n2 IP: 10.1.2.2, 10.1.3.1, 10.1.4.2
+    n3 IP: 10.1.3.2
+   \endverbatim
  *
+ * Route Path for considered cases:
+ * - Source (n0) and Destination (n3)
+ *   It goes from n0 -> n2 -> n3
+ * - Source (n1) and Destination (n3)
+ *   It goes from n1 -> n2 -> n3
+ * - Source (n2) and Destination (n0)
+ *   It goes from n2 -> n0
+ * - Source (n1) and Destination (n1)
+ *   It goes from n1 -> n1
+ * .
+ * \verbatim
+   Expected Routing Path output for above
+   cases (in the output stream):
+   Time: +3s, Nix Routing
+   Route Path: (Node 0 to Node 3, Nix Vector: 101)
+   10.1.4.1 (Node 0)   ---->   10.1.4.2 (Node 2)
+   10.1.3.1 (Node 2)   ---->   10.1.3.2 (Node 3)
+
+   Time: +5s, Nix Routing
+   Route Path: (Node 1 to Node 3, Nix Vector: 101)
+   10.1.2.1 (Node 1)   ---->   10.1.2.2 (Node 2)
+   10.1.3.1 (Node 2)   ---->   10.1.3.2 (Node 3)
+
+   Time: +6s, Nix Routing
+   Route Path: (Node 2 to Node 0, Nix Vector: 10)
+   10.1.4.2 (Node 2)   ---->   10.1.4.1 (Node 0)
+
+   Time: +7s, Nix Routing
+   Route Path: (Node 1 to Node 1, Nix Vector: )
+   10.1.1.2 (Node 1)   ---->   10.1.1.2 (Node 1)
+
+   Node: 0, Time: +8s, Local time: +8s, Nix Routing
+   NixCache:
+   Destination     NixVector
+   10.1.3.2        101
+   Ipv4RouteCache:
+   Destination     Gateway         Source            OutputDevice
+   10.1.3.2        10.1.4.2        10.1.4.1          2
+
+   Node: 1, Time: +8s, Local time: +8s, Nix Routing
+   NixCache:
+   Destination     NixVector
+   10.1.3.2        101
+   Ipv4RouteCache:
+   Destination     Gateway         Source            OutputDevice
+   10.1.3.2        10.1.2.2        10.1.2.1          2
+
+   Node: 2, Time: +8s, Local time: +8s, Nix Routing
+   NixCache:
+   Destination     NixVector
+   10.1.1.1        10
+   Ipv4RouteCache:
+   Destination     Gateway         Source            OutputDevice
+   10.1.1.1        10.1.4.1        10.1.4.2          3
+   10.1.3.2        10.1.3.2        10.1.3.1          2
+   10.1.4.1        10.1.4.1        10.1.4.2          3
+
+   Node: 3, Time: +8s, Local time: +8s, Nix Routing
+   NixCache:
+   Destination     NixVector
+   10.1.4.1        010
+   Ipv4RouteCache:
+   Destination     Gateway         Source            OutputDevice
+   10.1.4.1        10.1.3.1        10.1.3.2          1
+   \endverbatim
  */
 
 using namespace ns3;
@@ -47,7 +117,7 @@
 {
   CommandLine cmd (__FILE__);
   cmd.Parse (argc, argv);
-  
+
   LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
   LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
 
@@ -62,6 +132,10 @@
   nodes34.Add (nodes23.Get (1));
   nodes34.Create (1);
 
+  NodeContainer nodes13;
+  nodes13.Add (nodes12.Get (0));
+  nodes13.Add (nodes34.Get (0));
+
   PointToPointHelper pointToPoint;
   pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
   pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
@@ -78,9 +152,11 @@
   NetDeviceContainer devices12;
   NetDeviceContainer devices23;
   NetDeviceContainer devices34;
+  NetDeviceContainer devices13;
   devices12 = pointToPoint.Install (nodes12);
   devices23 = pointToPoint.Install (nodes23);
   devices34 = pointToPoint.Install (nodes34);
+  devices13 = pointToPoint.Install (nodes13);
 
   Ipv4AddressHelper address1;
   address1.SetBase ("10.1.1.0", "255.255.255.0");
@@ -88,10 +164,13 @@
   address2.SetBase ("10.1.2.0", "255.255.255.0");
   Ipv4AddressHelper address3;
   address3.SetBase ("10.1.3.0", "255.255.255.0");
+  Ipv4AddressHelper address4;
+  address4.SetBase ("10.1.4.0", "255.255.255.0");
 
-  address1.Assign (devices12);
-  address2.Assign (devices23);
-  Ipv4InterfaceContainer interfaces = address3.Assign (devices34);
+  Ipv4InterfaceContainer interfaces12 = address1.Assign (devices12);
+  Ipv4InterfaceContainer interfaces23 = address2.Assign (devices23);
+  Ipv4InterfaceContainer interfaces34 = address3.Assign (devices34);
+  Ipv4InterfaceContainer interfaces13 = address4.Assign (devices13);
 
   UdpEchoServerHelper echoServer (9);
 
@@ -99,7 +178,7 @@
   serverApps.Start (Seconds (1.0));
   serverApps.Stop (Seconds (10.0));
 
-  UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
+  UdpEchoClientHelper echoClient (interfaces34.GetAddress (1), 9);
   echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
   echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.)));
   echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
@@ -108,8 +187,13 @@
   clientApps.Start (Seconds (2.0));
   clientApps.Stop (Seconds (10.0));
 
-  // Trace routing tables
+  // Trace routing paths for different source and destinations.
   Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("nix-simple.routes", std::ios::out);
+  nixRouting.PrintRoutingPathAt (Seconds (3), nodes12.Get (0), interfaces34.GetAddress (1), routingStream);
+  nixRouting.PrintRoutingPathAt (Seconds (5), nodes12.Get (1), interfaces34.GetAddress (1), routingStream);
+  nixRouting.PrintRoutingPathAt (Seconds (6), nodes23.Get (1), interfaces12.GetAddress (0), routingStream);
+  nixRouting.PrintRoutingPathAt (Seconds (7), nodes12.Get (1), interfaces12.GetAddress (1), routingStream);
+  // Trace routing tables
   nixRouting.PrintRoutingTableAllAt (Seconds (8), routingStream);
 
   Simulator::Run ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/nix-vector-routing/examples/nix-simple-multi-address.cc ns-3.34/src/nix-vector-routing/examples/nix-simple-multi-address.cc
--- ns-3.33/src/nix-vector-routing/examples/nix-simple-multi-address.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/nix-vector-routing/examples/nix-simple-multi-address.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,231 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021 NITK Surathkal
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Ameya Deshpande <ameyanrd@outlook.com>
+ *
+ */
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/ipv4-list-routing-helper.h"
+#include "ns3/ipv4-nix-vector-helper.h"
+
+/**
+ * This program demonstrates a routing and
+ * PrintRoutingPath example for multiple interface
+ * addresses.
+ *
+ * Simple point-to-point links:
+ * \verbatim
+    n0 -- n1 -- n2 -- n3
+
+    From t = 0s onwards,
+    n0 (right) IP: 10.1.1.1, 10.2.1.1
+    n1 (left)  IP: 10.1.1.2, 10.2.1.2
+    n1 (right) IP: 10.1.2.1
+    n2 (left)  IP: 10.1.2.2
+    n2 (right) IP: 10.1.3.1
+    n3 (left)  IP: 10.1.3.2
+
+    From t = +5s onwards (new address subnet
+    added for n2 and n3),
+    n0 (right) IP: 10.1.1.1, 10.2.1.1
+    n1 (left)  IP: 10.1.1.2, 10.2.1.2
+    n1 (right) IP: 10.1.2.1
+    n2 (left)  IP: 10.1.2.2
+    n2 (right) IP: 10.1.3.1, 10.2.3.1
+    n3 (left)  IP: 10.1.3.2, 10.2.3.2
+
+   \endverbatim
+ *
+ * Cases considered:
+ * 1. For UDP Echo Application:
+ *  - At t = +2s, Path from n0 to n3 (10.1.3.2).
+ * 2. For PrintRoutingPath, 10.1.1.3
+ *  - At t = +3s, Path from n0 to n1 (10.2.1.2).
+ *  - At t = +7s, Path from n0 to n3 (10.2.3.2).
+ *
+ * \verbatim
+   Logging output:
+   At time +2s client sent 1024 bytes to 10.1.3.2 port 9
+   At time +2.01106s server received 1024 bytes from 10.1.1.1 port 49153
+   At time +2.01106s server sent 1024 bytes to 10.1.1.1 port 49153
+   At time +2.02212s client received 1024 bytes from 10.1.3.2 port 9
+
+   Output in nix-simple-multi-address.routes:
+   Time: +3s, Nix Routing
+   Route Path: (Node 0 to Node 1, Nix Vector: 0)
+   10.2.1.1 (Node 0)   ---->   10.2.1.2 (Node 1)
+
+   Node: 0, Time: +4s, Local time: +4s, Nix Routing
+   NixCache:
+   Destination     NixVector
+   10.1.3.2        011
+   10.2.1.2        0
+   Ipv4RouteCache:
+   Destination     Gateway         Source            OutputDevice
+   10.1.3.2        10.1.1.2        10.1.1.1          1
+
+   Node: 1, Time: +4s, Local time: +4s, Nix Routing
+   NixCache:
+   Ipv4RouteCache:
+   Destination     Gateway         Source            OutputDevice
+   10.1.1.1        10.1.1.1        10.1.1.2          1
+   10.1.3.2        10.1.2.2        10.1.2.1          2
+
+   Node: 2, Time: +4s, Local time: +4s, Nix Routing
+   NixCache:
+   Ipv4RouteCache:
+   Destination     Gateway         Source            OutputDevice
+   10.1.1.1        10.1.2.1        10.1.2.2          1
+   10.1.3.2        10.1.3.2        10.1.3.1          2
+
+   Node: 3, Time: +4s, Local time: +4s, Nix Routing
+   NixCache:
+   Destination     NixVector
+   10.1.1.1        000
+   Ipv4RouteCache:
+   Destination     Gateway         Source            OutputDevice
+   10.1.1.1        10.1.3.1        10.1.3.2          1
+
+   Node: 0, Time: +6s, Local time: +6s, Nix Routing
+   NixCache:
+   Ipv4RouteCache:
+
+   Node: 1, Time: +6s, Local time: +6s, Nix Routing
+   NixCache:
+   Ipv4RouteCache:
+
+   Node: 2, Time: +6s, Local time: +6s, Nix Routing
+   NixCache:
+   Ipv4RouteCache:
+
+   Node: 3, Time: +6s, Local time: +6s, Nix Routing
+   NixCache:
+   Ipv4RouteCache:
+
+   Time: +7s, Nix Routing
+   Route Path: (Node 0 to Node 3, Nix Vector: 011)
+   10.1.1.1 (Node 0)   ---->   10.1.1.2 (Node 1)
+   10.1.2.1 (Node 1)   ---->   10.1.2.2 (Node 2)
+   10.1.3.1 (Node 2)   ---->   10.2.3.2 (Node 3)
+ * \endverbatim
+ */
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("NixSimpleExample");
+
+int
+main (int argc, char *argv[])
+{
+  CommandLine cmd (__FILE__);
+  cmd.Parse (argc, argv);
+
+  LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
+  LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
+
+  NodeContainer nodes12;
+  nodes12.Create (2);
+
+  NodeContainer nodes23;
+  nodes23.Add (nodes12.Get (1));
+  nodes23.Create (1);
+
+  NodeContainer nodes34;
+  nodes34.Add (nodes23.Get (1));
+  nodes34.Create (1);
+
+  PointToPointHelper pointToPoint;
+  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
+  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
+
+  NodeContainer allNodes = NodeContainer (nodes12, nodes23.Get (1), nodes34.Get (1));
+
+  // NixHelper to install nix-vector routing
+  // on all nodes
+  Ipv4NixVectorHelper nixRouting;
+  InternetStackHelper stack;
+  stack.SetRoutingHelper (nixRouting); // has effect on the next Install ()
+  stack.Install (allNodes);
+
+  NetDeviceContainer devices12;
+  NetDeviceContainer devices23;
+  NetDeviceContainer devices34;
+  devices12 = pointToPoint.Install (nodes12);
+  devices23 = pointToPoint.Install (nodes23);
+  devices34 = pointToPoint.Install (nodes34);
+
+  Ipv4AddressHelper address1;
+  address1.SetBase ("10.1.1.0", "255.255.255.0");
+  Ipv4AddressHelper address2;
+  address2.SetBase ("10.1.2.0", "255.255.255.0");
+  Ipv4AddressHelper address3;
+  address3.SetBase ("10.1.3.0", "255.255.255.0");
+  Ipv4AddressHelper address4;
+  address4.SetBase ("10.2.1.0", "255.255.255.0");
+  Ipv4AddressHelper address5;
+  address5.SetBase ("10.2.3.0", "255.255.255.0");
+
+  address1.Assign (devices12);
+  address2.Assign (devices23);
+  Ipv4InterfaceContainer interfaces34 = address3.Assign (devices34);
+  Ipv4InterfaceContainer interfaces12 = address4.Assign (devices12);
+
+  UdpEchoServerHelper echoServer (9);
+
+  ApplicationContainer serverApps = echoServer.Install (nodes34.Get (1));
+  serverApps.Start (Seconds (1.0));
+  serverApps.Stop (Seconds (10.0));
+
+  // Set the destination address as 10.1.3.2
+  UdpEchoClientHelper echoClient (interfaces34.GetAddress (1), 9);
+  echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
+  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.)));
+  echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
+
+  ApplicationContainer clientApps = echoClient.Install (nodes12.Get (0));
+  clientApps.Start (Seconds (2.0));
+  clientApps.Stop (Seconds (10.0));
+
+  // Trace routing paths for different source and destinations.
+  Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("nix-simple-multi-address.routes", std::ios::out);
+  // Check the path from n0 to n1 (10.1.3.2).
+  nixRouting.PrintRoutingPathAt (Seconds (3), nodes12.Get (0), interfaces12.GetAddress (1, 1), routingStream);
+  // Trace routing tables.
+  nixRouting.PrintRoutingTableAllAt (Seconds (4), routingStream);
+  // Assign address5 addresses to n2 and n3.
+  // n2 gets 10.2.3.1 and n3 gets 10.2.3.2 on the same interface.
+  Simulator::Schedule(Seconds (5), &Ipv4AddressHelper::Assign, &address5, devices34);
+
+  // Trace routing tables.
+  // Notice that NixCache and Ipv4RouteCache becomes empty for each node.
+  // This happens because new addresses are added at t = +5s, due to which
+  // existing caches get flushed.
+  nixRouting.PrintRoutingTableAllAt (Seconds (6), routingStream);
+
+  // Check the path from n0 to n3 (10.2.3.2).
+  nixRouting.PrintRoutingPathAt (Seconds (7), nodes12.Get (0), Ipv4Address ("10.2.3.2"), routingStream);
+
+  Simulator::Run ();
+  Simulator::Destroy ();
+  return 0;
+}
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/nix-vector-routing/examples/wscript ns-3.34/src/nix-vector-routing/examples/wscript
--- ns-3.33/src/nix-vector-routing/examples/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/nix-vector-routing/examples/wscript	2021-07-14 10:31:07.000000000 -0700
@@ -8,3 +8,7 @@
     obj = bld.create_ns3_program('nms-p2p-nix',
                                  ['point-to-point', 'applications', 'internet', 'nix-vector-routing'])
     obj.source = 'nms-p2p-nix.cc'
+
+    obj = bld.create_ns3_program('nix-simple-multi-address',
+                                 ['point-to-point', 'applications', 'internet', 'nix-vector-routing'])
+    obj.source = 'nix-simple-multi-address.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/nix-vector-routing/helper/ipv4-nix-vector-helper.cc ns-3.34/src/nix-vector-routing/helper/ipv4-nix-vector-helper.cc
--- ns-3.33/src/nix-vector-routing/helper/ipv4-nix-vector-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/nix-vector-routing/helper/ipv4-nix-vector-helper.cc	2021-07-14 10:31:07.000000000 -0700
@@ -47,4 +47,19 @@
   node->AggregateObject (agent);
   return agent;
 }
+
+void
+Ipv4NixVectorHelper::PrintRoutingPathAt (Time printTime, Ptr<Node> source, Ipv4Address dest, Ptr<OutputStreamWrapper> stream, Time::Unit unit)
+{
+  Simulator::Schedule (printTime, &Ipv4NixVectorHelper::PrintRoute, source, dest, stream, unit);
+}
+
+void
+Ipv4NixVectorHelper::PrintRoute (Ptr<Node> source, Ipv4Address dest, Ptr<OutputStreamWrapper> stream, Time::Unit unit)
+{
+  Ptr<Ipv4NixVectorRouting> rp = Ipv4RoutingHelper::GetRouting <Ipv4NixVectorRouting> (source->GetObject<Ipv4> ()->GetRoutingProtocol ());
+  NS_ASSERT (rp);
+  rp->PrintRoutingPath (source, dest, stream, unit);
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/nix-vector-routing/helper/ipv4-nix-vector-helper.h ns-3.34/src/nix-vector-routing/helper/ipv4-nix-vector-helper.h
--- ns-3.33/src/nix-vector-routing/helper/ipv4-nix-vector-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/nix-vector-routing/helper/ipv4-nix-vector-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -47,8 +47,10 @@
   /**
    * \brief Construct an Ipv4NixVectorHelper from another previously 
    * initialized instance (Copy Constructor).
+   *
+   * \param o object to copy
    */
-  Ipv4NixVectorHelper (const Ipv4NixVectorHelper &);
+  Ipv4NixVectorHelper (const Ipv4NixVectorHelper &o);
 
   /**
    * \returns pointer to clone of this Ipv4NixVectorHelper 
@@ -66,6 +68,22 @@
   */
   virtual Ptr<Ipv4RoutingProtocol> Create (Ptr<Node> node) const;
 
+  /**
+   * \brief prints the routing path for a source and destination at a particular time.
+   * If the routing path does not exist, it prints that the path does not exist between
+   * the nodes in the ostream.
+   * \param printTime the time at which the routing path is supposed to be printed.
+   * \param source the source node pointer to start traversing
+   * \param dest the IPv4 destination address
+   * \param stream the output stream object to use
+   * \param unit the time unit to be used in the report
+   *
+   * This method calls the PrintRoutingPath() method of the
+   * Ipv4NixVectorRouting for the source and destination to provide
+   * the routing path at the specified time.
+   */
+  void PrintRoutingPathAt (Time printTime, Ptr<Node> source, Ipv4Address dest, Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S);
+
 private:
   /**
    * \brief Assignment operator declared private and not implemented to disallow
@@ -75,6 +93,20 @@
   Ipv4NixVectorHelper &operator = (const Ipv4NixVectorHelper &);
 
   ObjectFactory m_agentFactory; //!< Object factory
+
+  /**
+   * \brief prints the routing path for the source and destination. If the routing path
+   * does not exist, it prints that the path does not exist between the nodes in the ostream.
+   * \param source the source node pointer to start traversing
+   * \param dest the IPv4 destination address
+   * \param stream the output stream object to use
+   * \param unit the time unit to be used in the report
+   *
+   * This method calls the PrintRoutingPath() method of the
+   * Ipv4NixVectorRouting for the source and destination to provide
+   * the routing path.
+   */
+  static void PrintRoute (Ptr<Node> source, Ipv4Address dest, Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S);
 };
 } // namespace ns3
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc ns-3.34/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc
--- ns-3.33/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc	2021-07-14 10:31:07.000000000 -0700
@@ -128,7 +128,7 @@
 }
 
 Ptr<NixVector>
-Ipv4NixVectorRouting::GetNixVector (Ptr<Node> source, Ipv4Address dest, Ptr<NetDevice> oif)
+Ipv4NixVectorRouting::GetNixVector (Ptr<Node> source, Ipv4Address dest, Ptr<NetDevice> oif) const
 {
   NS_LOG_FUNCTION_NOARGS ();
 
@@ -173,7 +173,7 @@
 }
 
 Ptr<NixVector>
-Ipv4NixVectorRouting::GetNixVectorInCache (Ipv4Address address)
+Ipv4NixVectorRouting::GetNixVectorInCache (Ipv4Address address) const
 {
   NS_LOG_FUNCTION_NOARGS ();
 
@@ -236,7 +236,7 @@
 }
 
 bool
-Ipv4NixVectorRouting::BuildNixVector (const std::vector< Ptr<Node> > & parentVector, uint32_t source, uint32_t dest, Ptr<NixVector> nixVector)
+Ipv4NixVectorRouting::BuildNixVector (const std::vector< Ptr<Node> > & parentVector, uint32_t source, uint32_t dest, Ptr<NixVector> nixVector) const
 {
   NS_LOG_FUNCTION_NOARGS ();
 
@@ -309,7 +309,7 @@
 }
 
 void
-Ipv4NixVectorRouting::GetAdjacentNetDevices (Ptr<NetDevice> netDevice, Ptr<Channel> channel, NetDeviceContainer & netDeviceContainer)
+Ipv4NixVectorRouting::GetAdjacentNetDevices (Ptr<NetDevice> netDevice, Ptr<Channel> channel, NetDeviceContainer & netDeviceContainer) const
 {
   NS_LOG_FUNCTION_NOARGS ();
 
@@ -349,7 +349,7 @@
 }
 
 void
-Ipv4NixVectorRouting::BuildIpv4AddressToNodeMap (void)
+Ipv4NixVectorRouting::BuildIpv4AddressToNodeMap (void) const
 {
   NS_LOG_FUNCTION_NOARGS ();
 
@@ -372,14 +372,18 @@
                   int32_t interfaceIndex = (ipv4)->GetInterfaceForDevice (node->GetDevice (deviceId));
                   if (interfaceIndex != -1)
                     {
-                      Ipv4InterfaceAddress ifAddr = ipv4->GetAddress (interfaceIndex, 0);
-                      Ipv4Address addr = ifAddr.GetLocal ();
-
-                      NS_ABORT_MSG_IF (g_ipv4AddressToNodeMap.count (addr),
-                                       "Duplicate IPv4 address (" << addr << ") found during NIX Vector map construction for node " << node->GetId ());
-
-                      NS_LOG_LOGIC ("Adding IPv4 address " << addr << " for node " << node->GetId () << " to NIX Vector IPv4 address to node map");
-                      g_ipv4AddressToNodeMap[addr] = node;
+                      uint32_t numberOfAddresses = ipv4->GetNAddresses (interfaceIndex);
+                      for (uint32_t addressIndex = 0; addressIndex < numberOfAddresses; addressIndex++)
+                        {
+                          Ipv4InterfaceAddress ifAddr = ipv4->GetAddress (interfaceIndex, addressIndex);
+                          Ipv4Address addr = ifAddr.GetLocal ();
+
+                          NS_ABORT_MSG_IF (g_ipv4AddressToNodeMap.count (addr),
+                                          "Duplicate IPv4 address (" << addr << ") found during NIX Vector map construction for node " << node->GetId ());
+
+                          NS_LOG_LOGIC ("Adding IPv4 address " << addr << " for node " << node->GetId () << " to NIX Vector IPv4 address to node map");
+                          g_ipv4AddressToNodeMap[addr] = node;
+                        }
                     }
                 }
             }
@@ -388,7 +392,7 @@
 }
 
 Ptr<Node>
-Ipv4NixVectorRouting::GetNodeByIp (Ipv4Address dest)
+Ipv4NixVectorRouting::GetNodeByIp (Ipv4Address dest) const
 {
   NS_LOG_FUNCTION_NOARGS ();
 
@@ -416,9 +420,9 @@
 }
 
 uint32_t
-Ipv4NixVectorRouting::FindTotalNeighbors (void)
+Ipv4NixVectorRouting::FindTotalNeighbors (Ptr<Node> node) const
 {
-  uint32_t numberOfDevices = m_node->GetNDevices ();
+  uint32_t numberOfDevices = node->GetNDevices ();
   uint32_t totalNeighbors = 0;
 
   // scan through the net devices on the parent node
@@ -428,7 +432,7 @@
       // Get a net device from the node
       // as well as the channel, and figure
       // out the adjacent net devices
-      Ptr<NetDevice> localNetDevice = m_node->GetDevice (i);
+      Ptr<NetDevice> localNetDevice = node->GetDevice (i);
       Ptr<Channel> channel = localNetDevice->GetChannel ();
       if (channel == 0)
         {
@@ -487,9 +491,9 @@
 }
 
 uint32_t
-Ipv4NixVectorRouting::FindNetDeviceForNixIndex (uint32_t nodeIndex, Ipv4Address & gatewayIp)
+Ipv4NixVectorRouting::FindNetDeviceForNixIndex (Ptr<Node> node, uint32_t nodeIndex, Ipv4Address & gatewayIp) const
 {
-  uint32_t numberOfDevices = m_node->GetNDevices ();
+  uint32_t numberOfDevices = node->GetNDevices ();
   uint32_t index = 0;
   uint32_t totalNeighbors = 0;
 
@@ -500,7 +504,7 @@
       // Get a net device from the node
       // as well as the channel, and figure
       // out the adjacent net devices
-      Ptr<NetDevice> localNetDevice = m_node->GetDevice (i);
+      Ptr<NetDevice> localNetDevice = node->GetDevice (i);
       Ptr<Channel> channel = localNetDevice->GetChannel ();
       if (channel == 0)
         {
@@ -565,14 +569,13 @@
 
       // create a new nix vector to be used, 
       // we want to keep the cached version clean
-      nixVectorForPacket = Create<NixVector> ();
       nixVectorForPacket = nixVectorInCache->Copy (); 
 
       // Get the interface number that we go out of, by extracting
       // from the nix-vector
       if (m_totalNeighbors == 0)
         {
-          m_totalNeighbors = FindTotalNeighbors ();
+          m_totalNeighbors = FindTotalNeighbors (m_node);
         }
 
       // Get the interface number that we go out of, by extracting
@@ -598,7 +601,7 @@
 
           NS_LOG_LOGIC ("Ipv4Route not in cache, build: ");
           Ipv4Address gatewayIp;
-          uint32_t index = FindNetDeviceForNixIndex (nodeIndex, gatewayIp);
+          uint32_t index = FindNetDeviceForNixIndex (m_node, nodeIndex, gatewayIp);
           int32_t interfaceIndex = 0;
 
           if (!oif)
@@ -612,11 +615,11 @@
 
           NS_ASSERT_MSG (interfaceIndex != -1, "Interface index not found for device");
 
-          Ipv4InterfaceAddress ifAddr = m_ipv4->GetAddress (interfaceIndex, 0);
+          Ipv4Address sourceIPAddr = m_ipv4->SourceAddressSelection (interfaceIndex, header.GetDestination ());
 
           // start filling in the Ipv4Route info
           rtentry = Create<Ipv4Route> ();
-          rtentry->SetSource (ifAddr.GetLocal ());
+          rtentry->SetSource (sourceIPAddr);
 
           rtentry->SetGateway (gatewayIp);
           rtentry->SetDestination (header.GetDestination ());
@@ -701,7 +704,7 @@
   // from the nix-vector
   if (m_totalNeighbors == 0)
     {
-      m_totalNeighbors = FindTotalNeighbors ();
+      m_totalNeighbors = FindTotalNeighbors (m_node);
     }
   uint32_t numberOfBits = nixVector->BitCount (m_totalNeighbors);
   uint32_t nodeIndex = nixVector->ExtractNeighborIndex (numberOfBits);
@@ -712,7 +715,7 @@
     {
       NS_LOG_LOGIC ("Ipv4Route not in cache, build: ");
       Ipv4Address gatewayIp;
-      uint32_t index = FindNetDeviceForNixIndex (nodeIndex, gatewayIp);
+      uint32_t index = FindNetDeviceForNixIndex (m_node, nodeIndex, gatewayIp);
       uint32_t interfaceIndex = (m_ipv4)->GetInterfaceForDevice (m_node->GetDevice (index));
       Ipv4InterfaceAddress ifAddr = m_ipv4->GetAddress (interfaceIndex, 0);
 
@@ -747,10 +750,15 @@
   CheckCacheStateAndFlush ();
 
   std::ostream* os = stream->GetStream ();
+  // Copy the current ostream state
+  std::ios oldState (nullptr);
+  oldState.copyfmt (*os);
+
+  *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
 
   *os << "Node: " << m_ipv4->GetObject<Node> ()->GetId ()
       << ", Time: " << Now().As (unit)
-      << ", Local time: " << GetObject<Node> ()->GetLocalTime ().As (unit)
+      << ", Local time: " << m_ipv4->GetObject<Node> ()->GetLocalTime ().As (unit)
       << ", Nix Routing" << std::endl;
 
   *os << "NixCache:" << std::endl;
@@ -761,7 +769,7 @@
         {
           std::ostringstream dest;
           dest << it->first;
-          *os << std::setiosflags (std::ios::left) << std::setw (16) << dest.str ();
+          *os << std::setw (16) << dest.str ();
           *os << *(it->second) << std::endl;
         }
     }
@@ -773,11 +781,11 @@
         {
           std::ostringstream dest, gw, src;
           dest << it->second->GetDestination ();
-          *os << std::setiosflags (std::ios::left) << std::setw (16) << dest.str ();
+          *os << std::setw (16) << dest.str ();
           gw << it->second->GetGateway ();
-          *os << std::setiosflags (std::ios::left) << std::setw (16) << gw.str ();
+          *os << std::setw (16) << gw.str ();
           src << it->second->GetSource ();
-          *os << std::setiosflags (std::ios::left) << std::setw (16) << src.str ();
+          *os << std::setw (16) << src.str ();
           *os << "  ";
           if (Names::FindName (it->second->GetOutputDevice ()) != "")
             {
@@ -791,6 +799,8 @@
         }
     }
   *os << std::endl;
+  // Restore the previous ostream state
+  (*os).copyfmt (oldState);
 }
 
 // virtual functions from Ipv4RoutingProtocol 
@@ -818,7 +828,7 @@
 bool
 Ipv4NixVectorRouting::BFS (uint32_t numberOfNodes, Ptr<Node> source, 
                            Ptr<Node> dest, std::vector< Ptr<Node> > & parentVector,
-                           Ptr<NetDevice> oif)
+                           Ptr<NetDevice> oif) const
 {
   NS_LOG_FUNCTION_NOARGS ();
 
@@ -961,6 +971,126 @@
   return false;
 }
 
+void
+Ipv4NixVectorRouting::PrintRoutingPath (Ptr<Node> source, Ipv4Address dest,
+                                        Ptr<OutputStreamWrapper> stream, Time::Unit unit) const
+{
+  NS_LOG_FUNCTION (this << source << dest);
+  Ptr<NixVector> nixVectorInCache;
+  Ptr<NixVector> nixVector;
+  Ptr<Ipv4Route> rtentry;
+
+  CheckCacheStateAndFlush ();
+
+  Ptr<Node> destNode = GetNodeByIp (dest);
+  if (destNode == 0)
+    {
+      NS_LOG_ERROR ("No routing path exists");
+      return;
+    }
+
+  std::ostream* os = stream->GetStream ();
+  // Copy the current ostream state
+  std::ios oldState (nullptr);
+  oldState.copyfmt (*os);
+
+  *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
+  *os << "Time: " << Now().As (unit)
+      << ", Nix Routing" << std::endl;
+  *os << "Route Path: ";
+  *os << "(Node " << source->GetId () << " to Node " << destNode->GetId () << ", ";
+  *os << "Nix Vector: ";
+
+  nixVectorInCache = GetNixVectorInCache (dest);
+
+  // not in cache
+  if (!nixVectorInCache)
+    {
+      NS_LOG_LOGIC ("Nix-vector not in cache, build: ");
+      // Build the nix-vector, given the source node and the
+      // dest IP address
+      nixVectorInCache = GetNixVector (source, dest, nullptr);
+    }
+
+  if (nixVectorInCache || (!nixVectorInCache && source == destNode))
+    {
+      Ptr<Node> curr = source;
+      uint32_t totalNeighbors = 0;
+
+      if (nixVectorInCache)
+        {
+          // cache it
+          m_nixCache.insert (NixMap_t::value_type (dest, nixVectorInCache));
+          // Make a NixVector copy to work with. This is because
+          // we don't want to extract the bits from nixVectorInCache
+          // which is stored in the m_nixCache.
+          nixVector = nixVectorInCache->Copy ();
+
+          *os << *nixVector;
+        }
+      *os << ")" << std::endl;
+
+      if (source == destNode)
+        {
+          std::ostringstream src, dst;
+          src << dest << " (Node " << destNode->GetId () << ")";
+          *os << std::setw (20) << src.str ();
+          dst << "---->   " << dest << " (Node " << destNode->GetId () << ")";
+          *os << dst.str () << std::endl;
+        }
+
+      while (curr != destNode)
+        {
+          totalNeighbors = FindTotalNeighbors (curr);
+          // Get the number of bits required
+          // to represent all the neighbors
+          uint32_t numberOfBits = nixVector->BitCount (totalNeighbors);
+          // Get the nixIndex
+          uint32_t nixIndex = nixVector->ExtractNeighborIndex (numberOfBits);
+          // gatewayIP is the IP of next
+          // node on channel found from nixIndex
+          Ipv4Address gatewayIp;
+          // Get the Net Device index from the nixIndex
+          uint32_t NetDeviceIndex = FindNetDeviceForNixIndex (curr, nixIndex, gatewayIp);
+          // Get the interfaceIndex with the help of NetDeviceIndex.
+          // It will be used to get the IP address on interfaceIndex
+          // interface of 'curr' node.
+          Ptr<Ipv4> ipv4 = curr->GetObject<Ipv4> ();
+          Ptr<NetDevice> outDevice = curr->GetDevice (NetDeviceIndex);
+          uint32_t interfaceIndex = ipv4->GetInterfaceForDevice (outDevice);
+          Ipv4Address sourceIPAddr;
+          if (curr == source)
+            {
+              sourceIPAddr = ipv4->SourceAddressSelection (interfaceIndex, dest);
+            }
+          else
+            {
+              // We use the first address because it's indifferent which one
+              // we use to identify intermediate routers
+              sourceIPAddr = ipv4->GetAddress (interfaceIndex, 0).GetLocal ();
+            }
+
+          std::ostringstream currNode, nextNode;
+          currNode << sourceIPAddr << " (Node " << curr->GetId () << ")";
+          *os << std::setw (20) << currNode.str ();
+          // Replace curr with the next node
+          curr = GetNodeByIp (gatewayIp);
+          nextNode << "---->   " << ((curr == destNode) ? dest : gatewayIp) << " (Node " << curr->GetId () << ")";
+          *os << nextNode.str () << std::endl;
+        }
+        *os << std::endl;
+    }
+  else
+    {
+      *os << ")" << std::endl;
+      // No Route exists
+      *os << "There does not exist a path from Node " << source->GetId ()
+          << " to Node " << destNode->GetId () << "." << std::endl;
+    }
+  // Restore the previous ostream state
+  (*os).copyfmt (oldState);
+}
+
 void 
 Ipv4NixVectorRouting::CheckCacheStateAndFlush (void) const
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/nix-vector-routing/model/ipv4-nix-vector-routing.h ns-3.34/src/nix-vector-routing/model/ipv4-nix-vector-routing.h
--- ns-3.33/src/nix-vector-routing/model/ipv4-nix-vector-routing.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/nix-vector-routing/model/ipv4-nix-vector-routing.h	2021-07-14 10:31:07.000000000 -0700
@@ -89,6 +89,16 @@
    */
   void FlushGlobalNixRoutingCache (void) const;
 
+  /**
+   * @brief Print the Routing Path according to Nix Routing
+   * \param source Source node
+   * \param dest Destination node address
+   * \param stream The ostream the Routing path is printed to
+   * \param unit the time unit to be used in the report
+   */
+  void PrintRoutingPath (Ptr<Node> source, Ipv4Address dest, Ptr<OutputStreamWrapper> stream, Time::Unit unit) const;
+
+
 private:
 
   /**
@@ -120,14 +130,14 @@
    * \param oif Preferred output interface
    * \returns The NixVector to be used in routing.
    */
-  Ptr<NixVector> GetNixVector (Ptr<Node> source, Ipv4Address dest, Ptr<NetDevice> oif);
+  Ptr<NixVector> GetNixVector (Ptr<Node> source, Ipv4Address dest, Ptr<NetDevice> oif) const;
 
   /**
    * Checks the cache based on dest IP for the nix-vector
    * \param address Address to check
    * \returns The NixVector to be used in routing.
    */
-  Ptr<NixVector> GetNixVectorInCache (Ipv4Address address);
+  Ptr<NixVector> GetNixVectorInCache (Ipv4Address address) const;
 
   /**
    * Checks the cache based on dest IP for the Ipv4Route
@@ -143,7 +153,7 @@
    * \param [in] channel the channel to check
    * \param [out] netDeviceContainer the NetDeviceContainer of the NetDevices in the channel.
    */
-  void GetAdjacentNetDevices (Ptr<NetDevice> netDevice, Ptr<Channel> channel, NetDeviceContainer & netDeviceContainer);
+  void GetAdjacentNetDevices (Ptr<NetDevice> netDevice, Ptr<Channel> channel, NetDeviceContainer & netDeviceContainer) const;
 
   /**
    * Iterates through the node list and finds the one
@@ -151,7 +161,7 @@
    * \param dest destination node IP
    * \return The node with the specified IP.
    */
-  Ptr<Node> GetNodeByIp (Ipv4Address dest);
+  Ptr<Node> GetNodeByIp (Ipv4Address dest) const;
 
   /**
    * Recurses the parent vector, created by BFS and actually builds the nixvector
@@ -161,7 +171,7 @@
    * \param [out] nixVector the NixVector to be used for routing
    * \returns true on success, false otherwise.
    */
-  bool BuildNixVector (const std::vector< Ptr<Node> > & parentVector, uint32_t source, uint32_t dest, Ptr<NixVector> nixVector);
+  bool BuildNixVector (const std::vector< Ptr<Node> > & parentVector, uint32_t source, uint32_t dest, Ptr<NixVector> nixVector) const;
 
   /**
    * Special variation of BuildNixVector for when a node is sending to itself
@@ -171,11 +181,13 @@
   bool BuildNixVectorLocal (Ptr<NixVector> nixVector);
 
   /**
-   * Simple iterates through the nodes net-devices and determines
-   * how many neighbors it has
-   * \returns the number of neighbors.
+   * Simply iterates through the nodes net-devices and determines
+   * how many neighbors the node has.
+   * \param [in] node node pointer
+   * \returns the number of neighbors of m_node.
    */
-  uint32_t FindTotalNeighbors (void);
+  uint32_t FindTotalNeighbors (Ptr<Node> node) const;
+
 
   /**
    * Determine if the NetDevice is bridged
@@ -188,11 +200,12 @@
   /**
    * Nix index is with respect to the neighbors.  The net-device index must be
    * derived from this
+   * \param [in] node the current node under consideration
    * \param [in] nodeIndex Nix Node index
    * \param [out] gatewayIp IP address of the gateway
    * \returns the index of the NetDevice in the node.
    */
-  uint32_t FindNetDeviceForNixIndex (uint32_t nodeIndex, Ipv4Address & gatewayIp);
+  uint32_t FindNetDeviceForNixIndex (Ptr<Node> node, uint32_t nodeIndex, Ipv4Address & gatewayIp) const;
 
   /**
    * \brief Breadth first search algorithm.
@@ -207,7 +220,7 @@
             Ptr<Node> source,
             Ptr<Node> dest,
             std::vector< Ptr<Node> > & parentVector,
-            Ptr<NetDevice> oif);
+            Ptr<NetDevice> oif) const;
 
   void DoDispose (void);
 
@@ -231,7 +244,7 @@
   /**
    * Build map from IPv4 Address to Node for faster lookup.
    */
-  void BuildIpv4AddressToNodeMap (void);
+  void BuildIpv4AddressToNodeMap (void) const;
 
   /**
    * Flag to mark when caches are dirty and need to be flushed.  
@@ -253,22 +266,6 @@
 
 
   /**
-   * \brief Hashing for the ipv4Address class
-   */
-  struct Ipv4AddressHash
-  {
-    /**
-     * \brief operator ()
-     * \param address the IPv4 address to hash
-     * \return the hash of the address
-     */
-    size_t operator() (const Ipv4Address &address) const
-    {
-      return std::hash<uint32_t>()(address.Get ());
-    }
-  };
-
-  /**
    * Mapping of IPv4 address to ns-3 node.
    *
    * Used to avoid linear searching of nodes/devices to find a node in
@@ -276,7 +273,7 @@
    * are unique so mapping can be done without duplication.
    **/
   typedef std::unordered_map<Ipv4Address, ns3::Ptr<ns3::Node>, Ipv4AddressHash > Ipv4AddressToNodeMap;
-  static Ipv4AddressToNodeMap g_ipv4AddressToNodeMap;
+  static Ipv4AddressToNodeMap g_ipv4AddressToNodeMap; //!< Address to node map.
 };
 } // namespace ns3
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/olsr/bindings/modulegen__gcc_ILP32.py ns-3.34/src/olsr/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/olsr/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/olsr/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -113,6 +113,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -125,6 +127,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -683,10 +687,12 @@
     register_Ns3IntToType__5_methods(root_module, root_module['ns3::IntToType< 5 >'])
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv4RoutingHelper_methods(root_module, root_module['ns3::Ipv4RoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1789,6 +1795,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2120,6 +2138,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2195,6 +2218,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2215,6 +2250,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -2623,8 +2663,8 @@
 def register_Ns3OlsrHelper_methods(root_module, cls):
     ## olsr-helper.h (module 'olsr'): ns3::OlsrHelper::OlsrHelper() [constructor]
     cls.add_constructor([])
-    ## olsr-helper.h (module 'olsr'): ns3::OlsrHelper::OlsrHelper(ns3::OlsrHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::OlsrHelper const &', 'arg0')])
+    ## olsr-helper.h (module 'olsr'): ns3::OlsrHelper::OlsrHelper(ns3::OlsrHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::OlsrHelper const &', 'o')])
     ## olsr-helper.h (module 'olsr'): ns3::OlsrHelper * ns3::OlsrHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::OlsrHelper *', 
@@ -4426,10 +4466,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -8158,7 +8198,7 @@
     cls.add_method('GetIpv4', 
                    'ns3::Ptr< ns3::Ipv4 >', 
                    [], 
-                   is_const=True, is_virtual=True)
+                   deprecated=True, is_const=True, is_virtual=True)
     ## olsr-routing-protocol.h (module 'olsr'): void ns3::olsr::RoutingProtocol::PrintRoutingTable(ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) const [member function]
     cls.add_method('PrintRoutingTable', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/olsr/bindings/modulegen__gcc_LP64.py ns-3.34/src/olsr/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/olsr/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/olsr/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -113,6 +113,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -125,6 +127,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -683,10 +687,12 @@
     register_Ns3IntToType__5_methods(root_module, root_module['ns3::IntToType< 5 >'])
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv4RoutingHelper_methods(root_module, root_module['ns3::Ipv4RoutingHelper'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1789,6 +1795,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2120,6 +2138,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2195,6 +2218,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2215,6 +2250,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -2623,8 +2663,8 @@
 def register_Ns3OlsrHelper_methods(root_module, cls):
     ## olsr-helper.h (module 'olsr'): ns3::OlsrHelper::OlsrHelper() [constructor]
     cls.add_constructor([])
-    ## olsr-helper.h (module 'olsr'): ns3::OlsrHelper::OlsrHelper(ns3::OlsrHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::OlsrHelper const &', 'arg0')])
+    ## olsr-helper.h (module 'olsr'): ns3::OlsrHelper::OlsrHelper(ns3::OlsrHelper const & o) [constructor]
+    cls.add_constructor([param('ns3::OlsrHelper const &', 'o')])
     ## olsr-helper.h (module 'olsr'): ns3::OlsrHelper * ns3::OlsrHelper::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::OlsrHelper *', 
@@ -4426,10 +4466,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -8158,7 +8198,7 @@
     cls.add_method('GetIpv4', 
                    'ns3::Ptr< ns3::Ipv4 >', 
                    [], 
-                   is_const=True, is_virtual=True)
+                   deprecated=True, is_const=True, is_virtual=True)
     ## olsr-routing-protocol.h (module 'olsr'): void ns3::olsr::RoutingProtocol::PrintRoutingTable(ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) const [member function]
     cls.add_method('PrintRoutingTable', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/olsr/examples/olsr-hna.cc ns-3.34/src/olsr/examples/olsr-hna.cc
--- ns-3.33/src/olsr/examples/olsr-hna.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/olsr/examples/olsr-hna.cc	2021-07-14 10:31:07.000000000 -0700
@@ -251,6 +251,9 @@
   // Tracing
   wifiPhy.EnablePcap ("olsr-hna", devices);
   csma.EnablePcap ("olsr-hna", csmaDevices, false);
+  AsciiTraceHelper ascii;
+  wifiPhy.EnableAsciiAll (ascii.CreateFileStream ("olsr-hna-wifi.tr"));
+  csma.EnableAsciiAll (ascii.CreateFileStream ("olsr-hna-csma.tr"));
 
   Simulator::ScheduleWithContext (source->GetNode ()->GetId (),
                                   Seconds (15.0), &GenerateTraffic,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/olsr/helper/olsr-helper.h ns-3.34/src/olsr/helper/olsr-helper.h
--- ns-3.33/src/olsr/helper/olsr-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/olsr/helper/olsr-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -49,8 +49,10 @@
   /**
    * \brief Construct an OlsrHelper from another previously initialized instance
    * (Copy Constructor).
+   *
+   * \param o object to copy
    */
-  OlsrHelper (const OlsrHelper &);
+  OlsrHelper (const OlsrHelper &o);
 
   /**
    * \returns pointer to clone of this OlsrHelper
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/olsr/model/olsr-header.cc ns-3.34/src/olsr/model/olsr-header.cc
--- ns-3.33/src/olsr/model/olsr-header.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/olsr/model/olsr-header.cc	2021-07-14 10:31:07.000000000 -0700
@@ -135,7 +135,7 @@
 void
 PacketHeader::Print (std::ostream &os) const
 {
-  /// \todo
+  os << "len: " << m_packetLength	<< " seqNo: " << m_packetSequenceNumber;
 }
 
 void
@@ -213,7 +213,46 @@
 void
 MessageHeader::Print (std::ostream &os) const
 {
-  /// \todo
+  switch (m_messageType)
+  {
+    case HELLO_MESSAGE:
+      os << "type: HELLO";
+      break;
+    case TC_MESSAGE:
+      os << "type: TC";
+      break;
+    case MID_MESSAGE:
+      os << "type: MID";
+      break;
+    case HNA_MESSAGE:
+      os << "type: HNA";
+      break;
+  }
+
+  os << " TTL: " << +m_timeToLive;
+  os << " Orig: " << m_originatorAddress;
+  os << " SeqNo: " << m_messageSequenceNumber;
+  os << " Validity: " << +m_vTime;
+  os << " Hop count: " << +m_hopCount;
+  os << " Size: " << m_messageSize;
+
+  switch (m_messageType)
+    {
+    case MID_MESSAGE:
+      m_message.mid.Print (os);
+      break;
+    case HELLO_MESSAGE:
+      m_message.hello.Print (os);
+      break;
+    case TC_MESSAGE:
+      m_message.tc.Print (os);
+      break;
+    case HNA_MESSAGE:
+      m_message.hna.Print (os);
+      break;
+    default:
+      NS_ASSERT (false);
+    }
 }
 
 void
@@ -294,7 +333,21 @@
 void
 MessageHeader::Mid::Print (std::ostream &os) const
 {
-  /// \todo
+  bool first = true;
+  os << " [";
+  for (const auto& iAddr : interfaceAddresses)
+    {
+      if (first)
+        {
+          first = false;
+        }
+      else
+        {
+          os << ", ";
+        }
+      os << iAddr;
+    }
+  os << "]";
 }
 
 void
@@ -348,7 +401,30 @@
 void
 MessageHeader::Hello::Print (std::ostream &os) const
 {
-  /// \todo
+  os << " Interval: " << +hTime << " (" << EmfToSeconds (hTime) << "s)";
+  os << " Willingness: " << +willingness;
+
+  for (const auto& ilinkMessage : linkMessages)
+  	{
+  	  const LinkMessage &lm = ilinkMessage;
+  	  os << " Link code: " << +(lm.linkCode);
+  	  os << " [";
+  	  bool first = true;
+  	  for (const auto& neigh_iter : lm.neighborInterfaceAddresses)
+  	    {
+  	      if (first)
+  	        {
+  	          first = false;
+  	        }
+  	      else
+  	        {
+  	          os << ", ";
+  	        }
+  	      os << neigh_iter;
+  	    }
+      os << "]";
+  	}
+
 }
 
 void
@@ -431,7 +507,22 @@
 void
 MessageHeader::Tc::Print (std::ostream &os) const
 {
-  /// \todo
+  os << " Adv. SeqNo: " << ansn;
+  os << " [";
+  bool first = true;
+  for (const auto& iAddr : neighborAddresses)
+    {
+      if (first)
+        {
+          first = false;
+        }
+      else
+        {
+          os << ", ";
+        }
+      os << iAddr;
+    }
+  os << "]";
 }
 
 void
@@ -483,7 +574,21 @@
 void
 MessageHeader::Hna::Print (std::ostream &os) const
 {
-  /// \todo
+  os << " [";
+  bool first = true;
+  for (const auto& iAssoc : associations)
+  	{
+      if (first)
+        {
+          first = false;
+        }
+      else
+        {
+          os << ", ";
+        }
+  	  os << iAssoc.address << "/" << iAssoc.mask.GetPrefixLength ();
+  	}
+  os << "]";
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/olsr/model/olsr-header.h ns-3.34/src/olsr/model/olsr-header.h
--- ns-3.33/src/olsr/model/olsr-header.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/olsr/model/olsr-header.h	2021-07-14 10:31:07.000000000 -0700
@@ -408,7 +408,7 @@
     std::vector<LinkMessage> linkMessages; //!< Link messages container.
 
     /**
-     * This method is used to print the content of a MID message.
+     * This method is used to print the content of a Hello message.
      * \param os output stream
      */
     void Print (std::ostream &os) const;
@@ -461,7 +461,7 @@
     uint16_t ansn;  //!< Advertised Neighbor Sequence Number.
 
     /**
-     * This method is used to print the content of a MID message.
+     * This method is used to print the content of a Tc message.
      * \param os output stream
      */
     void Print (std::ostream &os) const;
@@ -525,7 +525,7 @@
     std::vector<Association> associations; //!< Association container.
 
     /**
-     * This method is used to print the content of a MID message.
+     * This method is used to print the content of a Hna message.
      * \param os output stream
      */
     void Print (std::ostream &os) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/olsr/model/olsr-routing-protocol.cc ns-3.34/src/olsr/model/olsr-routing-protocol.cc
--- ns-3.33/src/olsr/model/olsr-routing-protocol.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/olsr/model/olsr-routing-protocol.cc	2021-07-14 10:31:07.000000000 -0700
@@ -32,6 +32,7 @@
   if (GetObject<Node> ()) { std::clog << "[node " << GetObject<Node> ()->GetId () << "] "; }
 
 
+#include <iomanip>
 #include "olsr-routing-protocol.h"
 #include "ns3/socket-factory.h"
 #include "ns3/udp-socket-factory.h"
@@ -270,41 +271,52 @@
 RoutingProtocol::PrintRoutingTable (Ptr<OutputStreamWrapper> stream, Time::Unit unit) const
 {
   std::ostream* os = stream->GetStream ();
+  // Copy the current ostream state
+  std::ios oldState (nullptr);
+  oldState.copyfmt (*os);
+
+  *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
 
   *os << "Node: " << m_ipv4->GetObject<Node> ()->GetId ()
       << ", Time: " << Now ().As (unit)
-      << ", Local time: " << GetObject<Node> ()->GetLocalTime ().As (unit)
+      << ", Local time: " << m_ipv4->GetObject<Node> ()->GetLocalTime ().As (unit)
       << ", OLSR Routing table" << std::endl;
 
-  *os << "Destination\t\tNextHop\t\tInterface\tDistance\n";
+  *os << std::setw (16) << "Destination";
+  *os << std::setw (16) << "NextHop";
+  *os << std::setw (16) << "Interface";
+  *os << "Distance" << std::endl;
 
   for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator iter = m_table.begin ();
        iter != m_table.end (); iter++)
     {
-      *os << iter->first << "\t\t";
-      *os << iter->second.nextAddr << "\t\t";
+      *os << std::setw (16) << iter->first;
+      *os << std::setw (16) << iter->second.nextAddr;
+      *os << std::setw (16);
       if (Names::FindName (m_ipv4->GetNetDevice (iter->second.interface)) != "")
         {
-          *os << Names::FindName (m_ipv4->GetNetDevice (iter->second.interface)) << "\t\t";
+          *os << Names::FindName (m_ipv4->GetNetDevice (iter->second.interface));
         }
       else
         {
-          *os << iter->second.interface << "\t\t";
+          *os << iter->second.interface;
         }
-      *os << iter->second.distance << "\t";
-      *os << "\n";
+      *os << iter->second.distance << std::endl;
     }
+  *os << std::endl;
 
   // Also print the HNA routing table
   if (m_hnaRoutingTable->GetNRoutes () > 0)
     {
-      *os << " HNA Routing Table: ";
+      *os << "HNA Routing Table:" << std::endl;
       m_hnaRoutingTable->PrintRoutingTable (stream, unit);
     }
   else
     {
-      *os << " HNA Routing Table: empty" << std::endl;
+      *os << "HNA Routing Table: empty" << std::endl;
     }
+  // Restore the previous ostream state
+  (*os).copyfmt (oldState);
 }
 
 void RoutingProtocol::DoInitialize ()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/olsr/model/olsr-routing-protocol.h ns-3.34/src/olsr/model/olsr-routing-protocol.h
--- ns-3.33/src/olsr/model/olsr-routing-protocol.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/olsr/model/olsr-routing-protocol.h	2021-07-14 10:31:07.000000000 -0700
@@ -351,6 +351,11 @@
                            LocalDeliverCallback lcb,
                            ErrorCallback ecb);
   virtual void SetIpv4 (Ptr<Ipv4> ipv4);
+
+  /**
+   * \returns the ipv4 object this routing protocol is associated with
+   */
+  NS_DEPRECATED_3_34
   virtual Ptr<Ipv4> GetIpv4 (void) const;
   virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/openflow/doc/openflow-switch.rst ns-3.34/src/openflow/doc/openflow-switch.rst
--- ns-3.33/src/openflow/doc/openflow-switch.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/openflow/doc/openflow-switch.rst	2021-07-14 10:31:07.000000000 -0700
@@ -127,8 +127,7 @@
 Usage
 *****
 
-The OFSID requires libxml2 (for MPLS FIB xml file parsing), libdl (for address fault checking), 
-and boost (for assert) libraries to be installed.
+The OFSID requires libxml2 (for MPLS FIB xml file parsing), and libdl (for address fault checking).
 
 Building OFSID
 ==============
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/openflow/wscript ns-3.34/src/openflow/wscript
--- ns-3.33/src/openflow/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/openflow/wscript	2021-07-14 10:31:07.000000000 -0700
@@ -9,39 +9,7 @@
                    help=('Path to OFSID source for NS-3 OpenFlow Integration support'),
                    default='', dest='with_openflow')
 
-REQUIRED_BOOST_LIBS = ['system', 'signals', 'filesystem']
-
-def required_boost_libs(conf):
-    conf.env['REQUIRED_BOOST_LIBS'] += REQUIRED_BOOST_LIBS
-
 def configure(conf):
-    if not conf.env['LIB_BOOST']:
-        conf.report_optional_feature("openflow", "NS-3 OpenFlow Integration", False,
-                                     "Required boost libraries not found")
-
-        # Add this module to the list of modules that won't be built
-        # if they are enabled.
-        conf.env['MODULES_NOT_BUILT'].append('openflow')
-        return 
-
-    present_boost_libs = []
-    for boost_lib_name in conf.env['LIB_BOOST']:
-        if boost_lib_name.startswith("boost_"):
-            boost_lib_name = boost_lib_name[6:]
-        if boost_lib_name.endswith("-mt"):
-            boost_lib_name = boost_lib_name[:-3]
-        present_boost_libs.append(boost_lib_name)
-
-    missing_boost_libs = [lib for lib in REQUIRED_BOOST_LIBS if lib not in present_boost_libs]
-    if missing_boost_libs != []:
-        conf.report_optional_feature("openflow", "NS-3 OpenFlow Integration", False,
-                                     "Required boost libraries not found, missing: %s" % ', '.join(missing_boost_libs))
-
-        # Add this module to the list of modules that won't be built
-        # if they are enabled.
-        conf.env['MODULES_NOT_BUILT'].append('openflow')
-        return 
-
     if Options.options.with_openflow:
         if os.path.isdir(Options.options.with_openflow):
             conf.msg("Checking for OpenFlow location", ("%s (given)" % Options.options.with_openflow))
@@ -70,6 +38,10 @@
         conf.env['MODULES_NOT_BUILT'].append('openflow')
         return 
 
+    if not conf.require_boost_incs('openflow', 'NS-3 OpenFlow Integration'):
+        conf.env['MODULES_NOT_BUILT'].append('openflow')
+        return 
+
     test_code = '''
 #include "openflow/openflow.h"
 #include "openflow/nicira-ext.h"
@@ -116,29 +88,30 @@
   return 0;
 }
 '''
+    conf.env['HAVE_DL'] = conf.check(mandatory=True, lib='dl', define_name='HAVE_DL', uselib_store='DL')
 
-    conf.env['DL'] = conf.check(mandatory=True, lib='dl', define_name='DL', uselib_store='DL')
-    conf.env['XML2'] = conf.check(mandatory=True, lib='xml2', define_name='XML2', uselib_store='XML2')
-    
-    conf.env.append_value('NS3_MODULE_PATH',os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'build','default')))
+    conf.env.append_value('NS3_MODULE_PATH',os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'build')))
     conf.env.append_value('NS3_MODULE_PATH',os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'lib')))
     
     conf.env['INCLUDES_OPENFLOW'] = [
         os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'include'))]
     conf.env['LIBPATH_OPENFLOW'] = [
-        os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'build','default')),
+        os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'build')),
         os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'lib'))]
     
     conf.env['DEFINES_OPENFLOW'] = ['NS3_OPENFLOW']
 
     conf.env['OPENFLOW'] = conf.check_nonfatal(fragment=test_code, lib='openflow', 
                                                libpath=conf.env['LIBPATH_OPENFLOW'],
-                                               use='OPENFLOW DL XML2')
+                                               use='OPENFLOW DL')
     conf.env.append_value('LIB_OPENFLOW', 'dl')
     conf.report_optional_feature("openflow", "NS-3 OpenFlow Integration",
                                  conf.env['OPENFLOW'], "openflow library not found")
     if conf.env['OPENFLOW']:
         conf.env['ENABLE_OPENFLOW'] = True
+        # Openflow library has some strncpy() usage that can trigger warnings
+        if conf.env['BUILD_PROFILE'] == 'optimized':
+            conf.env.append_value('CXXFLAGS', '-Wno-stringop-truncation')
     else:
         # Add this module to the list of modules that won't be built
         # if they are enabled.
@@ -153,6 +126,7 @@
 
     # Build the Switch module
     obj = bld.create_ns3_module('openflow', ['internet'])
+    obj.use.append('BOOST')
     obj.source = [
         ]
 
@@ -166,9 +140,9 @@
         #   'test/openflow-examples-test-suite.cc',
             ])
     
-    if bld.env['OPENFLOW'] and bld.env['DL'] and bld.env['XML2']:
-        obj.use.extend('OPENFLOW DL XML2'.split())
-        obj_test.use.extend('OPENFLOW DL XML2'.split())
+    if bld.env['OPENFLOW'] and bld.env['HAVE_DL']:
+        obj.use.extend('OPENFLOW DL'.split())
+        obj_test.use.extend('OPENFLOW DL'.split())
 
     headers = bld(features='ns3header')
     headers.module = 'openflow'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/point-to-point/bindings/modulegen__gcc_ILP32.py ns-3.34/src/point-to-point/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/point-to-point/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/point-to-point/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -87,12 +87,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -150,7 +154,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## point-to-point-helper.h (module 'point-to-point'): ns3::PointToPointHelper [class]
@@ -589,8 +593,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1343,6 +1349,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1707,6 +1721,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1920,6 +1946,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1995,6 +2026,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2015,6 +2058,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -6386,6 +6434,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -6411,6 +6464,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -6472,6 +6530,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -6497,6 +6560,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/point-to-point/bindings/modulegen__gcc_LP64.py ns-3.34/src/point-to-point/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/point-to-point/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/point-to-point/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -87,12 +87,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -150,7 +154,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## point-to-point-helper.h (module 'point-to-point'): ns3::PointToPointHelper [class]
@@ -589,8 +593,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1343,6 +1349,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1707,6 +1721,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1920,6 +1946,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1995,6 +2026,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2015,6 +2058,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -6386,6 +6434,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -6411,6 +6464,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -6472,6 +6530,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -6497,6 +6560,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/point-to-point/test/point-to-point-test.cc ns-3.34/src/point-to-point/test/point-to-point-test.cc
--- ns-3.33/src/point-to-point/test/point-to-point-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/point-to-point/test/point-to-point-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -25,6 +25,8 @@
 #include "ns3/point-to-point-channel.h"
 #include "ns3/net-device-queue-interface.h"
 
+#include <string>
+
 using namespace ns3;
 
 /**
@@ -47,12 +49,27 @@
   virtual void DoRun (void);
 
 private:
+  
+  Ptr<const Packet> m_recvdPacket; //!< received packet
   /**
    * \brief Send one packet to the device specified
    *
-   * \param device NetDevice to send to
+   * \param device NetDevice to send to.
+   * \param buffer Payload content of the packet.
+   * \param size Size of the payload.
    */
-  void SendOnePacket (Ptr<PointToPointNetDevice> device);
+  void SendOnePacket (Ptr<PointToPointNetDevice> device, uint8_t const *buffer, uint32_t size);
+  /**
+   * \brief Callback function which sets the recvdPacket parameter
+   *
+   * \param dev The receiving device.
+   * \param pkt The received packet.
+   * \param mode The protocol mode used.
+   * \param sender The sender address.
+   * 
+   * \return A boolean indicating packet handled properly.
+   */
+  bool RxPacket (Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address &sender);
 };
 
 PointToPointTest::PointToPointTest ()
@@ -61,12 +78,19 @@
 }
 
 void
-PointToPointTest::SendOnePacket (Ptr<PointToPointNetDevice> device)
+PointToPointTest::SendOnePacket (Ptr<PointToPointNetDevice> device, uint8_t const *buffer, uint32_t size)
 {
-  Ptr<Packet> p = Create<Packet> ();
+  Ptr<Packet> p = Create<Packet> (buffer, size);
   device->Send (p, device->GetBroadcast (), 0x800);
 }
 
+bool
+PointToPointTest::RxPacket (Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address &sender)
+{
+  m_recvdPacket = pkt;
+  return true;
+}
+
 
 void
 PointToPointTest::DoRun (void)
@@ -86,11 +110,23 @@
 
   a->AddDevice (devA);
   b->AddDevice (devB);
-
-  Simulator::Schedule (Seconds (1.0), &PointToPointTest::SendOnePacket, this, devA);
+  
+  devB->SetReceiveCallback (MakeCallback (&PointToPointTest::RxPacket,
+                                          this));
+  uint8_t txBuffer [] = "\"Can you tell me where my country lies?\" \\ said the unifaun to his true love's eyes. \\ \"It lies with me!\" cried the Queen of Maybe \\ - for her merchandise, he traded in his prize.";
+  size_t txBufferSize = sizeof(txBuffer);
+  
+  Simulator::Schedule (Seconds (1.0), &PointToPointTest::SendOnePacket, this, devA, txBuffer, txBufferSize);
 
   Simulator::Run ();
 
+  NS_TEST_EXPECT_MSG_EQ (m_recvdPacket->GetSize (), txBufferSize, "trivial");
+
+  uint8_t rxBuffer [1500]; // As large as the P2P MTU size, assuming that the user didn't change it.
+  
+  m_recvdPacket->CopyData (rxBuffer, txBufferSize);
+  NS_TEST_EXPECT_MSG_EQ (memcmp (rxBuffer, txBuffer, txBufferSize), 0, "trivial");
+  
   Simulator::Destroy ();
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py ns-3.34/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -93,6 +93,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper [class]
     module.add_class('Ipv4AddressHelper', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
@@ -110,6 +112,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper [class]
     module.add_class('Ipv6AddressHelper', import_from_module='ns.internet')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress [class]
@@ -180,7 +184,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -585,11 +589,13 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4AddressHelper_methods(root_module, root_module['ns3::Ipv4AddressHelper'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6AddressHelper_methods(root_module, root_module['ns3::Ipv6AddressHelper'])
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6InterfaceContainer_methods(root_module, root_module['ns3::Ipv6InterfaceContainer'])
@@ -1864,6 +1870,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4AddressHelper_methods(root_module, cls):
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper::Ipv4AddressHelper(ns3::Ipv4AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv4AddressHelper const &', 'arg0')])
@@ -2215,6 +2233,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2290,6 +2313,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6AddressHelper_methods(root_module, cls):
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper::Ipv6AddressHelper(ns3::Ipv6AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv6AddressHelper const &', 'arg0')])
@@ -2305,10 +2340,18 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    cls.add_method('Assign', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutAddress(ns3::NetDeviceContainer const & c) [member function]
     cls.add_method('AssignWithoutAddress', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutOnLink(ns3::NetDeviceContainer const & c) [member function]
+    cls.add_method('AssignWithoutOnLink', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6AddressHelper::NewAddress(ns3::Address addr) [member function]
     cls.add_method('NewAddress', 
                    'ns3::Ipv6Address', 
@@ -2337,6 +2380,8 @@
     cls.add_constructor([param('ns3::Ipv6Address', 'address')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
@@ -2349,6 +2394,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
     cls.add_method('GetPrefix', 
                    'ns3::Ipv6Prefix', 
@@ -2377,6 +2427,10 @@
     cls.add_method('SetNsDadUid', 
                    'void', 
                    [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
     cls.add_method('SetScope', 
                    'void', 
@@ -2479,6 +2533,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5232,10 +5291,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -6670,10 +6729,10 @@
     cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
     ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
     cls.add_constructor([])
-    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_pure_virtual=True, is_virtual=True)
     ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
@@ -7008,10 +7067,10 @@
                    'int32_t', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
                    is_const=True, is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
     cls.add_method('GetAddress', 
@@ -7142,6 +7201,10 @@
                    'bool', 
                    [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')], 
                    is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::ReachabilityHint(uint32_t ipInterfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('ReachabilityHint', 
+                   'bool', 
+                   [param('uint32_t', 'ipInterfaceIndex'), param('ns3::Ipv6Address', 'address')])
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py ns-3.34/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -93,6 +93,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper [class]
     module.add_class('Ipv4AddressHelper', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
@@ -110,6 +112,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper [class]
     module.add_class('Ipv6AddressHelper', import_from_module='ns.internet')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress [class]
@@ -180,7 +184,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -585,11 +589,13 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4AddressHelper_methods(root_module, root_module['ns3::Ipv4AddressHelper'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6AddressHelper_methods(root_module, root_module['ns3::Ipv6AddressHelper'])
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6InterfaceContainer_methods(root_module, root_module['ns3::Ipv6InterfaceContainer'])
@@ -1864,6 +1870,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4AddressHelper_methods(root_module, cls):
     ## ipv4-address-helper.h (module 'internet'): ns3::Ipv4AddressHelper::Ipv4AddressHelper(ns3::Ipv4AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv4AddressHelper const &', 'arg0')])
@@ -2215,6 +2233,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2290,6 +2313,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6AddressHelper_methods(root_module, cls):
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6AddressHelper::Ipv6AddressHelper(ns3::Ipv6AddressHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::Ipv6AddressHelper const &', 'arg0')])
@@ -2305,10 +2340,18 @@
     cls.add_method('Assign', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::Assign(ns3::NetDeviceContainer const & c, std::vector<bool, std::allocator<bool> > withConfiguration, std::vector<bool, std::allocator<bool> > onLink) [member function]
+    cls.add_method('Assign', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c'), param('std::vector< bool >', 'withConfiguration'), param('std::vector< bool >', 'onLink')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutAddress(ns3::NetDeviceContainer const & c) [member function]
     cls.add_method('AssignWithoutAddress', 
                    'ns3::Ipv6InterfaceContainer', 
                    [param('ns3::NetDeviceContainer const &', 'c')])
+    ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6InterfaceContainer ns3::Ipv6AddressHelper::AssignWithoutOnLink(ns3::NetDeviceContainer const & c) [member function]
+    cls.add_method('AssignWithoutOnLink', 
+                   'ns3::Ipv6InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer const &', 'c')])
     ## ipv6-address-helper.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6AddressHelper::NewAddress(ns3::Address addr) [member function]
     cls.add_method('NewAddress', 
                    'ns3::Ipv6Address', 
@@ -2337,6 +2380,8 @@
     cls.add_constructor([param('ns3::Ipv6Address', 'address')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
@@ -2349,6 +2394,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
     cls.add_method('GetPrefix', 
                    'ns3::Ipv6Prefix', 
@@ -2377,6 +2427,10 @@
     cls.add_method('SetNsDadUid', 
                    'void', 
                    [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
     cls.add_method('SetScope', 
                    'void', 
@@ -2479,6 +2533,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5232,10 +5291,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -6670,10 +6729,10 @@
     cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
     ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
     cls.add_constructor([])
-    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_pure_virtual=True, is_virtual=True)
     ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
@@ -7008,10 +7067,10 @@
                    'int32_t', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
                    is_const=True, is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
     cls.add_method('GetAddress', 
@@ -7142,6 +7201,10 @@
                    'bool', 
                    [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')], 
                    is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::ReachabilityHint(uint32_t ipInterfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('ReachabilityHint', 
+                   'bool', 
+                   [param('uint32_t', 'ipInterfaceIndex'), param('ns3::Ipv6Address', 'address')])
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/propagation/doc/propagation.rst ns-3.34/src/propagation/doc/propagation.rst
--- ns-3.33/src/propagation/doc/propagation.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/propagation/doc/propagation.rst	2021-07-14 10:31:07.000000000 -0700
@@ -21,27 +21,27 @@
 
 The following propagation loss models are implemented:
 
-* Cost231PropagationLossModel
-* FixedRssLossModel
-* FriisPropagationLossModel
-* ItuR1411LosPropagationLossModel
-* ItuR1411NlosOverRooftopPropagationLossModel
-* JakesPropagationLossModel
-* Kun2600MhzPropagationLossModel
-* LogDistancePropagationLossModel
-* MatrixPropagationLossModel
-* NakagamiPropagationLossModel
-* OkumuraHataPropagationLossModel
-* RandomPropagationLossModel
-* RangePropagationLossModel
-* ThreeLogDistancePropagationLossModel
-* TwoRayGroundPropagationLossModel
-* ThreeGppPropagationLossModel
-
-  * ThreeGppRMaPropagationLossModel
-  * ThreeGppUMaPropagationLossModel
-  * ThreeGppUmiStreetCanyonPropagationLossModel
-  * ThreeGppIndoorOfficePropagationLossModel
+   * Cost231PropagationLossModel
+   * FixedRssLossModel
+   * FriisPropagationLossModel
+   * ItuR1411LosPropagationLossModel
+   * ItuR1411NlosOverRooftopPropagationLossModel
+   * JakesPropagationLossModel
+   * Kun2600MhzPropagationLossModel
+   * LogDistancePropagationLossModel
+   * MatrixPropagationLossModel
+   * NakagamiPropagationLossModel
+   * OkumuraHataPropagationLossModel
+   * RandomPropagationLossModel
+   * RangePropagationLossModel
+   * ThreeLogDistancePropagationLossModel
+   * TwoRayGroundPropagationLossModel
+   * ThreeGppPropagationLossModel
+
+      * ThreeGppRMaPropagationLossModel
+      * ThreeGppUMaPropagationLossModel
+      * ThreeGppUmiStreetCanyonPropagationLossModel
+      * ThreeGppIndoorOfficePropagationLossModel
 
 Other models could be available thanks to other modules, e.g., the ``building`` module.
 
@@ -819,6 +819,7 @@
 
 To properly capture channel dynamics in vehicular environments, three different 
 channel conditions have been identified: 
+
   * LOS (Line Of Sight): represents the case in which the direct path between 
     the transmitter and the receiver is not blocked
   * NLOSv (Non Line Of Sight vehicle): when the direct path 
@@ -829,7 +830,8 @@
 the wireless channel between a pair of nodes, the first for urban and the second 
 for highway environments. 
 Each model includes both a deterministic and a stochastic part, and works as 
-follows. 
+follows:
+
   1. The model determines the presence of buildings obstructing the direct path 
      between the communicating nodes. This is done in a deterministic way, looking at 
      the possible interceptions between the direct path and the buildings. 
@@ -843,10 +845,12 @@
 :cpp:class:`ChannelConditionModel` with the following classes. They have been included in 
 the ``building`` module, because they make use of :cpp:class:`Buildings` objects to determine 
 the presence of obstructions caused by buildings.
+
   * :cpp:class:`ThreeGppV2vUrbanChannelConditionModel`: implements the model 
     described in Table 6.2-1 of TR 37.885 for the urban scenario. 
   * :cpp:class:`ThreeGppV2vHighwayChannelConditionModel`: implements the model 
     described in Table 6.2-1 of TR 37.885 for the highway scenario.   
+
 These models rely on :cpp:class:`Buildings` objects to determine the presence 
 of obstructing buildings. When considering large scenarios with a large number of 
 buildings, this process may become computationally demanding and dramatically 
@@ -862,11 +866,13 @@
 environment, i.e., urban or highway, as well as for the density of vehicles in the 
 scenario, which can be high, medium, or low.
 
-The classes implementing the fully-probabilistic models are: 
+The classes implementing the fully-probabilistic models are:
+
   * :cpp:class:`ProbabilisticV2vUrbanChannelConditionModel`: implements the model 
     described in [Boban2016Modeling]_ for the urban scenario. 
   * :cpp:class:`ProbabilisticV2vHighwayChannelConditionModel`: implements the model 
     described in [Boban2016Modeling]_ for the highway scenario. 
+
 Both the classes own the attribute "Density", which can be used to select the 
 proper value depending on the scenario that have to be simulated. 
 Differently from the hybrid models described above, these classes have been 
@@ -886,11 +892,13 @@
 
 These models have been implemented by extending the interface 
 :cpp:class:`ThreeGppPropagationLossModel` with the following classes, which 
-are part of the ``propagation`` module: 
+are part of the ``propagation`` module:
+
   * :cpp:class:`ThreeGppV2vUrbanPropagationLossModel`: implements the models 
     defined in Table 6.2.1-1 of TR 37.885 for the urban scenario.
   * :cpp:class:`ThreeGppV2vHighwayPropagationLossModel`: implements the models 
     defined in Table 6.2.1-1 of TR 37.885 for the highway scenario.       
+
 As for all the classes extending the interface :cpp:class:`ThreeGppPropagationLossModel`, 
 they have to be paired with an instance of the class :cpp:class:`ChannelConditionModel` 
 which is used to determine the channel condition. 
@@ -944,6 +952,7 @@
 optimal beamforming vectors are computed at the beginning of the simulation. 
  
 The simulation script accepts the following command line parameters: 
+
   * *frequency*: the operating frequency in Hz
   * *txPow*: the transmission power in dBm
   * *noiseFigure*: the noise figure in dB
@@ -967,9 +976,11 @@
 
 We also provide the bash script ``three-gpp-v2v-channel-example.sh`` which reads the 
 output file and generates two figures:
+
   1. map.gif, a GIF representing the simulation scenario and vehicle mobility;
   2. snr.png, which represents the behavior of the SNR.
 
+
 References
 **********
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/propagation/model/three-gpp-propagation-loss-model.cc ns-3.34/src/propagation/model/three-gpp-propagation-loss-model.cc
--- ns-3.33/src/propagation/model/three-gpp-propagation-loss-model.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/propagation/model/three-gpp-propagation-loss-model.cc	2021-07-14 10:31:07.000000000 -0700
@@ -357,7 +357,7 @@
   double distanceBp = GetBpDistance (m_frequency, hBs, hUt);
   NS_LOG_DEBUG ("breakpoint distance " << distanceBp);
 
-  // check if the distace is outside the validity range
+  // check if the distance is outside the validity range
   if (distance2D < 10.0 || distance2D > 10.0e3)
     {
       NS_LOG_WARN ("The 2D distance is outside the validity range, the pathloss value may not be accurate");
@@ -405,7 +405,7 @@
   // range and the warning message is printed (hBS for the UT-UT case and hUT
   // for the BS-BS case).
 
-  // check if the distace is outside the validity range
+  // check if the distance is outside the validity range
   if (distance2D < 10.0 || distance2D > 5.0e3)
     {
       NS_LOG_WARN ("The 2D distance is outside the validity range, the pathloss value may not be accurate");
@@ -589,7 +589,7 @@
   double distanceBp = GetBpDistance (hUt, hBs, distance2D);
   NS_LOG_DEBUG ("breakpoint distance " << distanceBp);
 
-  // check if the distace is outside the validity range
+  // check if the distance is outside the validity range
   if (distance2D < 10.0 || distance2D > 5.0e3)
     {
       NS_LOG_WARN ("The 2D distance is outside the validity range, the pathloss value may not be accurate");
@@ -636,7 +636,7 @@
   // range and the warning message is printed (hBS for the UT-UT case and hUT
   // for the BS-BS case).
 
-  // check if the distace is outside the validity range
+  // check if the distance is outside the validity range
   if (distance2D < 10.0 || distance2D > 5.0e3)
     {
       NS_LOG_WARN ("The 2D distance is outside the validity range, the pathloss value may not be accurate");
@@ -777,7 +777,7 @@
   double distanceBp = GetBpDistance (hUt, hBs, distance2D);
   NS_LOG_DEBUG ("breakpoint distance " << distanceBp);
 
-  // check if the distace is outside the validity range
+  // check if the distance is outside the validity range
   if (distance2D < 10.0 || distance2D > 5.0e3)
     {
       NS_LOG_WARN ("The 2D distance is outside the validity range, the pathloss value may not be accurate");
@@ -824,7 +824,7 @@
   // range and the warning message is printed (hBS for the UT-UT case and hUT
   // for the BS-BS case).
 
-  // check if the distace is outside the validity range
+  // check if the distance is outside the validity range
   if (distance2D < 10.0 || distance2D > 5.0e3)
     {
       NS_LOG_WARN ("The 2D distance is outside the validity range, the pathloss value may not be accurate");
@@ -951,10 +951,10 @@
   NS_UNUSED (hUt);
   NS_UNUSED (hBs);
 
-  // check if the distace is outside the validity range
+  // check if the distance is outside the validity range
   if (distance3D < 1.0 || distance3D > 150.0)
     {
-      NS_LOG_WARN ("The 2D distance is outside the validity range, the pathloss value may not be accurate");
+      NS_LOG_WARN ("The 3D distance is outside the validity range, the pathloss value may not be accurate");
     }
 
   // compute the pathloss (see 3GPP TR 38.901, Table 7.4.1-1)
@@ -970,10 +970,10 @@
 {
   NS_LOG_FUNCTION (this);
 
-  // check if the distace is outside the validity range
+  // check if the distance is outside the validity range
   if (distance3D < 1.0 || distance3D > 150.0)
     {
-      NS_LOG_WARN ("The 2D distance is outside the validity range, the pathloss value may not be accurate");
+      NS_LOG_WARN ("The 3D distance is outside the validity range, the pathloss value may not be accurate");
     }
 
   // compute the pathloss
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/propagation/model/three-gpp-v2v-propagation-loss-model.cc ns-3.34/src/propagation/model/three-gpp-v2v-propagation-loss-model.cc
--- ns-3.33/src/propagation/model/three-gpp-v2v-propagation-loss-model.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/propagation/model/three-gpp-v2v-propagation-loss-model.cc	2021-07-14 10:31:07.000000000 -0700
@@ -99,7 +99,7 @@
   double blockerHeight = 0;
   double mu_a = 0;
   double sigma_a = 0;
-  double randomValue = m_uniformVar->GetValue () * 3.0;
+  double randomValue = m_uniformVar->GetValue () * 100.0;
   if (randomValue < m_percType3Vehicles)
     {
       // vehicles of type 3 have height 3 meters
@@ -122,8 +122,8 @@
       // Case 2: Maximum antenna height value of TX and RX < Blocker height
       mu_a = 9.0 + std::max (0.0, 15 * log10 (distance3D) - 41.0);
       sigma_a = 4.5;
-      m_logNorVar->SetAttribute ("Mu", DoubleValue (log10 (pow (mu_a, 2) / sqrt (pow (sigma_a, 2) + pow (mu_a, 2)))));
-      m_logNorVar->SetAttribute ("Sigma", DoubleValue (sqrt (log10 (pow (sigma_a, 2) / pow (mu_a, 2) + 1))));
+      m_logNorVar->SetAttribute ("Mu", DoubleValue (log (pow (mu_a, 2) / sqrt (pow (sigma_a, 2) + pow (mu_a, 2)))));
+      m_logNorVar->SetAttribute ("Sigma", DoubleValue (sqrt (log (pow (sigma_a, 2) / pow (mu_a, 2) + 1))));
       additionalLoss = std::max (0.0, m_logNorVar->GetValue ());
     }
   else
@@ -132,8 +132,8 @@
       mu_a = 5.0 + std::max (0.0, 15 * log10 (distance3D) - 41.0);
       sigma_a = 4.0;
 
-      m_logNorVar->SetAttribute ("Mu", DoubleValue (log10 (pow (mu_a,2) / sqrt (pow (sigma_a, 2) + pow (mu_a, 2)))));
-      m_logNorVar->SetAttribute ("Sigma", DoubleValue (sqrt (log10 (pow (sigma_a,2) / pow (mu_a, 2) + 1))));
+      m_logNorVar->SetAttribute ("Mu", DoubleValue (log (pow (mu_a,2) / sqrt (pow (sigma_a, 2) + pow (mu_a, 2)))));
+      m_logNorVar->SetAttribute ("Sigma", DoubleValue (sqrt (log (pow (sigma_a,2) / pow (mu_a, 2) + 1))));
       additionalLoss = std::max (0.0, m_logNorVar->GetValue ());
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/sixlowpan/bindings/modulegen__gcc_ILP32.py ns-3.34/src/sixlowpan/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/sixlowpan/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/sixlowpan/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -75,12 +75,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -350,7 +354,7 @@
     ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::SixLowPanNetDevice [class]
     module.add_class('SixLowPanNetDevice', parent=root_module['ns3::NetDevice'])
     ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::SixLowPanNetDevice::DropReason [enumeration]
-    module.add_enum('DropReason', ['DROP_FRAGMENT_TIMEOUT', 'DROP_FRAGMENT_BUFFER_FULL', 'DROP_UNKNOWN_EXTENSION', 'DROP_DISALLOWED_COMPRESSION'], outer_class=root_module['ns3::SixLowPanNetDevice'])
+    module.add_enum('DropReason', ['DROP_FRAGMENT_TIMEOUT', 'DROP_FRAGMENT_BUFFER_FULL', 'DROP_UNKNOWN_EXTENSION', 'DROP_DISALLOWED_COMPRESSION', 'DROP_SATETFUL_DECOMPRESSION_PROBLEM'], outer_class=root_module['ns3::SixLowPanNetDevice'])
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::SixLowPanNetDevice >, uint32_t )', 'ns3::SixLowPanNetDevice::RxTxTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::SixLowPanNetDevice >, uint32_t )*', 'ns3::SixLowPanNetDevice::RxTxTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::SixLowPanNetDevice >, uint32_t )&', 'ns3::SixLowPanNetDevice::RxTxTracedCallback&')
@@ -464,8 +468,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1375,6 +1381,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1588,6 +1606,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1663,6 +1686,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1683,6 +1718,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -2386,6 +2426,10 @@
     cls.add_constructor([param('ns3::SixLowPanHelper const &', 'arg0')])
     ## sixlowpan-helper.h (module 'sixlowpan'): ns3::SixLowPanHelper::SixLowPanHelper() [constructor]
     cls.add_constructor([])
+    ## sixlowpan-helper.h (module 'sixlowpan'): void ns3::SixLowPanHelper::AddContext(ns3::NetDeviceContainer c, uint8_t contextId, ns3::Ipv6Prefix context, ns3::Time validity) [member function]
+    cls.add_method('AddContext', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'c'), param('uint8_t', 'contextId'), param('ns3::Ipv6Prefix', 'context'), param('ns3::Time', 'validity')])
     ## sixlowpan-helper.h (module 'sixlowpan'): int64_t ns3::SixLowPanHelper::AssignStreams(ns3::NetDeviceContainer c, int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
@@ -2394,6 +2438,18 @@
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::NetDeviceContainer', 'c')])
+    ## sixlowpan-helper.h (module 'sixlowpan'): void ns3::SixLowPanHelper::InvalidateContext(ns3::NetDeviceContainer c, uint8_t contextId) [member function]
+    cls.add_method('InvalidateContext', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'c'), param('uint8_t', 'contextId')])
+    ## sixlowpan-helper.h (module 'sixlowpan'): void ns3::SixLowPanHelper::RemoveContext(ns3::NetDeviceContainer c, uint8_t contextId) [member function]
+    cls.add_method('RemoveContext', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'c'), param('uint8_t', 'contextId')])
+    ## sixlowpan-helper.h (module 'sixlowpan'): void ns3::SixLowPanHelper::RenewContext(ns3::NetDeviceContainer c, uint8_t contextId, ns3::Time validity) [member function]
+    cls.add_method('RenewContext', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'c'), param('uint8_t', 'contextId'), param('ns3::Time', 'validity')])
     ## sixlowpan-helper.h (module 'sixlowpan'): void ns3::SixLowPanHelper::SetDeviceAttribute(std::string n1, ns3::AttributeValue const & v1) [member function]
     cls.add_method('SetDeviceAttribute', 
                    'void', 
@@ -3638,16 +3694,16 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## sixlowpan-header.h (module 'sixlowpan'): ns3::Ipv6Address ns3::SixLowPanIphc::GetDstAddress() const [member function]
-    cls.add_method('GetDstAddress', 
-                   'ns3::Ipv6Address', 
-                   [], 
-                   is_const=True)
     ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetDstContextId() const [member function]
     cls.add_method('GetDstContextId', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t const * ns3::SixLowPanIphc::GetDstInlinePart() const [member function]
+    cls.add_method('GetDstInlinePart', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
     ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetEcn() const [member function]
     cls.add_method('GetEcn', 
                    'uint8_t', 
@@ -3703,16 +3759,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## sixlowpan-header.h (module 'sixlowpan'): ns3::Ipv6Address ns3::SixLowPanIphc::GetSrcAddress() const [member function]
-    cls.add_method('GetSrcAddress', 
-                   'ns3::Ipv6Address', 
-                   [], 
-                   is_const=True)
     ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetSrcContextId() const [member function]
     cls.add_method('GetSrcContextId', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t const * ns3::SixLowPanIphc::GetSrcInlinePart() const [member function]
+    cls.add_method('GetSrcInlinePart', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
     ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::TrafficClassFlowLabel_e ns3::SixLowPanIphc::GetTf() const [member function]
     cls.add_method('GetTf', 
                    'ns3::SixLowPanIphc::TrafficClassFlowLabel_e', 
@@ -3749,14 +3805,14 @@
     cls.add_method('SetDscp', 
                    'void', 
                    [param('uint8_t', 'dscp')])
-    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDstAddress(ns3::Ipv6Address dstAddress) [member function]
-    cls.add_method('SetDstAddress', 
-                   'void', 
-                   [param('ns3::Ipv6Address', 'dstAddress')])
     ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDstContextId(uint8_t dstContextId) [member function]
     cls.add_method('SetDstContextId', 
                    'void', 
                    [param('uint8_t', 'dstContextId')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDstInlinePart(uint8_t * dstInlinePart, uint8_t size) [member function]
+    cls.add_method('SetDstInlinePart', 
+                   'void', 
+                   [param('uint8_t *', 'dstInlinePart'), param('uint8_t', 'size')])
     ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetEcn(uint8_t ecn) [member function]
     cls.add_method('SetEcn', 
                    'void', 
@@ -3793,14 +3849,14 @@
     cls.add_method('SetSam', 
                    'void', 
                    [param('ns3::SixLowPanIphc::HeaderCompression_e', 'samField')])
-    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSrcAddress(ns3::Ipv6Address srcAddress) [member function]
-    cls.add_method('SetSrcAddress', 
-                   'void', 
-                   [param('ns3::Ipv6Address', 'srcAddress')])
     ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSrcContextId(uint8_t srcContextId) [member function]
     cls.add_method('SetSrcContextId', 
                    'void', 
                    [param('uint8_t', 'srcContextId')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSrcInlinePart(uint8_t * srcInlinePart, uint8_t size) [member function]
+    cls.add_method('SetSrcInlinePart', 
+                   'void', 
+                   [param('uint8_t *', 'srcInlinePart'), param('uint8_t', 'size')])
     ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetTf(ns3::SixLowPanIphc::TrafficClassFlowLabel_e tfField) [member function]
     cls.add_method('SetTf', 
                    'void', 
@@ -5573,6 +5629,10 @@
 def register_Ns3SixLowPanNetDevice_methods(root_module, cls):
     ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::SixLowPanNetDevice::SixLowPanNetDevice() [constructor]
     cls.add_constructor([])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::AddContext(uint8_t contextId, ns3::Ipv6Prefix contextPrefix, bool compressionAllowed, ns3::Time validLifetime) [member function]
+    cls.add_method('AddContext', 
+                   'void', 
+                   [param('uint8_t', 'contextId'), param('ns3::Ipv6Prefix', 'contextPrefix'), param('bool', 'compressionAllowed'), param('ns3::Time', 'validLifetime')])
     ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
     cls.add_method('AddLinkChangeCallback', 
                    'void', 
@@ -5597,6 +5657,10 @@
                    'ns3::Ptr< ns3::Channel >', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::GetContext(uint8_t contextId, ns3::Ipv6Prefix & contextPrefix, bool & compressionAllowed, ns3::Time & validLifetime) [member function]
+    cls.add_method('GetContext', 
+                   'bool', 
+                   [param('uint8_t', 'contextId'), param('ns3::Ipv6Prefix &', 'contextPrefix'), param('bool &', 'compressionAllowed'), param('ns3::Time &', 'validLifetime')])
     ## sixlowpan-net-device.h (module 'sixlowpan'): uint32_t ns3::SixLowPanNetDevice::GetIfIndex() const [member function]
     cls.add_method('GetIfIndex', 
                    'uint32_t', 
@@ -5632,6 +5696,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::InvalidateContext(uint8_t contextId) [member function]
+    cls.add_method('InvalidateContext', 
+                   'void', 
+                   [param('uint8_t', 'contextId')])
     ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::IsBridge() const [member function]
     cls.add_method('IsBridge', 
                    'bool', 
@@ -5662,6 +5730,14 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::RemoveContext(uint8_t contextId) [member function]
+    cls.add_method('RemoveContext', 
+                   'void', 
+                   [param('uint8_t', 'contextId')])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::RenewContext(uint8_t contextId, ns3::Time validLifetime) [member function]
+    cls.add_method('RenewContext', 
+                   'void', 
+                   [param('uint8_t', 'contextId'), param('ns3::Time', 'validLifetime')])
     ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
     cls.add_method('Send', 
                    'bool', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/sixlowpan/bindings/modulegen__gcc_LP64.py ns-3.34/src/sixlowpan/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/sixlowpan/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/sixlowpan/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -75,12 +75,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -350,7 +354,7 @@
     ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::SixLowPanNetDevice [class]
     module.add_class('SixLowPanNetDevice', parent=root_module['ns3::NetDevice'])
     ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::SixLowPanNetDevice::DropReason [enumeration]
-    module.add_enum('DropReason', ['DROP_FRAGMENT_TIMEOUT', 'DROP_FRAGMENT_BUFFER_FULL', 'DROP_UNKNOWN_EXTENSION', 'DROP_DISALLOWED_COMPRESSION'], outer_class=root_module['ns3::SixLowPanNetDevice'])
+    module.add_enum('DropReason', ['DROP_FRAGMENT_TIMEOUT', 'DROP_FRAGMENT_BUFFER_FULL', 'DROP_UNKNOWN_EXTENSION', 'DROP_DISALLOWED_COMPRESSION', 'DROP_SATETFUL_DECOMPRESSION_PROBLEM'], outer_class=root_module['ns3::SixLowPanNetDevice'])
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::SixLowPanNetDevice >, uint32_t )', 'ns3::SixLowPanNetDevice::RxTxTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::SixLowPanNetDevice >, uint32_t )*', 'ns3::SixLowPanNetDevice::RxTxTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::SixLowPanNetDevice >, uint32_t )&', 'ns3::SixLowPanNetDevice::RxTxTracedCallback&')
@@ -464,8 +468,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1375,6 +1381,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1588,6 +1606,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1663,6 +1686,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1683,6 +1718,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -2386,6 +2426,10 @@
     cls.add_constructor([param('ns3::SixLowPanHelper const &', 'arg0')])
     ## sixlowpan-helper.h (module 'sixlowpan'): ns3::SixLowPanHelper::SixLowPanHelper() [constructor]
     cls.add_constructor([])
+    ## sixlowpan-helper.h (module 'sixlowpan'): void ns3::SixLowPanHelper::AddContext(ns3::NetDeviceContainer c, uint8_t contextId, ns3::Ipv6Prefix context, ns3::Time validity) [member function]
+    cls.add_method('AddContext', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'c'), param('uint8_t', 'contextId'), param('ns3::Ipv6Prefix', 'context'), param('ns3::Time', 'validity')])
     ## sixlowpan-helper.h (module 'sixlowpan'): int64_t ns3::SixLowPanHelper::AssignStreams(ns3::NetDeviceContainer c, int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
@@ -2394,6 +2438,18 @@
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::NetDeviceContainer', 'c')])
+    ## sixlowpan-helper.h (module 'sixlowpan'): void ns3::SixLowPanHelper::InvalidateContext(ns3::NetDeviceContainer c, uint8_t contextId) [member function]
+    cls.add_method('InvalidateContext', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'c'), param('uint8_t', 'contextId')])
+    ## sixlowpan-helper.h (module 'sixlowpan'): void ns3::SixLowPanHelper::RemoveContext(ns3::NetDeviceContainer c, uint8_t contextId) [member function]
+    cls.add_method('RemoveContext', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'c'), param('uint8_t', 'contextId')])
+    ## sixlowpan-helper.h (module 'sixlowpan'): void ns3::SixLowPanHelper::RenewContext(ns3::NetDeviceContainer c, uint8_t contextId, ns3::Time validity) [member function]
+    cls.add_method('RenewContext', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'c'), param('uint8_t', 'contextId'), param('ns3::Time', 'validity')])
     ## sixlowpan-helper.h (module 'sixlowpan'): void ns3::SixLowPanHelper::SetDeviceAttribute(std::string n1, ns3::AttributeValue const & v1) [member function]
     cls.add_method('SetDeviceAttribute', 
                    'void', 
@@ -3638,16 +3694,16 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## sixlowpan-header.h (module 'sixlowpan'): ns3::Ipv6Address ns3::SixLowPanIphc::GetDstAddress() const [member function]
-    cls.add_method('GetDstAddress', 
-                   'ns3::Ipv6Address', 
-                   [], 
-                   is_const=True)
     ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetDstContextId() const [member function]
     cls.add_method('GetDstContextId', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t const * ns3::SixLowPanIphc::GetDstInlinePart() const [member function]
+    cls.add_method('GetDstInlinePart', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
     ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetEcn() const [member function]
     cls.add_method('GetEcn', 
                    'uint8_t', 
@@ -3703,16 +3759,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## sixlowpan-header.h (module 'sixlowpan'): ns3::Ipv6Address ns3::SixLowPanIphc::GetSrcAddress() const [member function]
-    cls.add_method('GetSrcAddress', 
-                   'ns3::Ipv6Address', 
-                   [], 
-                   is_const=True)
     ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetSrcContextId() const [member function]
     cls.add_method('GetSrcContextId', 
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t const * ns3::SixLowPanIphc::GetSrcInlinePart() const [member function]
+    cls.add_method('GetSrcInlinePart', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
     ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::TrafficClassFlowLabel_e ns3::SixLowPanIphc::GetTf() const [member function]
     cls.add_method('GetTf', 
                    'ns3::SixLowPanIphc::TrafficClassFlowLabel_e', 
@@ -3749,14 +3805,14 @@
     cls.add_method('SetDscp', 
                    'void', 
                    [param('uint8_t', 'dscp')])
-    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDstAddress(ns3::Ipv6Address dstAddress) [member function]
-    cls.add_method('SetDstAddress', 
-                   'void', 
-                   [param('ns3::Ipv6Address', 'dstAddress')])
     ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDstContextId(uint8_t dstContextId) [member function]
     cls.add_method('SetDstContextId', 
                    'void', 
                    [param('uint8_t', 'dstContextId')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDstInlinePart(uint8_t * dstInlinePart, uint8_t size) [member function]
+    cls.add_method('SetDstInlinePart', 
+                   'void', 
+                   [param('uint8_t *', 'dstInlinePart'), param('uint8_t', 'size')])
     ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetEcn(uint8_t ecn) [member function]
     cls.add_method('SetEcn', 
                    'void', 
@@ -3793,14 +3849,14 @@
     cls.add_method('SetSam', 
                    'void', 
                    [param('ns3::SixLowPanIphc::HeaderCompression_e', 'samField')])
-    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSrcAddress(ns3::Ipv6Address srcAddress) [member function]
-    cls.add_method('SetSrcAddress', 
-                   'void', 
-                   [param('ns3::Ipv6Address', 'srcAddress')])
     ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSrcContextId(uint8_t srcContextId) [member function]
     cls.add_method('SetSrcContextId', 
                    'void', 
                    [param('uint8_t', 'srcContextId')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSrcInlinePart(uint8_t * srcInlinePart, uint8_t size) [member function]
+    cls.add_method('SetSrcInlinePart', 
+                   'void', 
+                   [param('uint8_t *', 'srcInlinePart'), param('uint8_t', 'size')])
     ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetTf(ns3::SixLowPanIphc::TrafficClassFlowLabel_e tfField) [member function]
     cls.add_method('SetTf', 
                    'void', 
@@ -5573,6 +5629,10 @@
 def register_Ns3SixLowPanNetDevice_methods(root_module, cls):
     ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::SixLowPanNetDevice::SixLowPanNetDevice() [constructor]
     cls.add_constructor([])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::AddContext(uint8_t contextId, ns3::Ipv6Prefix contextPrefix, bool compressionAllowed, ns3::Time validLifetime) [member function]
+    cls.add_method('AddContext', 
+                   'void', 
+                   [param('uint8_t', 'contextId'), param('ns3::Ipv6Prefix', 'contextPrefix'), param('bool', 'compressionAllowed'), param('ns3::Time', 'validLifetime')])
     ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
     cls.add_method('AddLinkChangeCallback', 
                    'void', 
@@ -5597,6 +5657,10 @@
                    'ns3::Ptr< ns3::Channel >', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::GetContext(uint8_t contextId, ns3::Ipv6Prefix & contextPrefix, bool & compressionAllowed, ns3::Time & validLifetime) [member function]
+    cls.add_method('GetContext', 
+                   'bool', 
+                   [param('uint8_t', 'contextId'), param('ns3::Ipv6Prefix &', 'contextPrefix'), param('bool &', 'compressionAllowed'), param('ns3::Time &', 'validLifetime')])
     ## sixlowpan-net-device.h (module 'sixlowpan'): uint32_t ns3::SixLowPanNetDevice::GetIfIndex() const [member function]
     cls.add_method('GetIfIndex', 
                    'uint32_t', 
@@ -5632,6 +5696,10 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::InvalidateContext(uint8_t contextId) [member function]
+    cls.add_method('InvalidateContext', 
+                   'void', 
+                   [param('uint8_t', 'contextId')])
     ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::IsBridge() const [member function]
     cls.add_method('IsBridge', 
                    'bool', 
@@ -5662,6 +5730,14 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::RemoveContext(uint8_t contextId) [member function]
+    cls.add_method('RemoveContext', 
+                   'void', 
+                   [param('uint8_t', 'contextId')])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::RenewContext(uint8_t contextId, ns3::Time validLifetime) [member function]
+    cls.add_method('RenewContext', 
+                   'void', 
+                   [param('uint8_t', 'contextId'), param('ns3::Time', 'validLifetime')])
     ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
     cls.add_method('Send', 
                    'bool', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/sixlowpan/doc/sixlowpan.rst ns-3.34/src/sixlowpan/doc/sixlowpan.rst
--- ns-3.33/src/sixlowpan/doc/sixlowpan.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/sixlowpan/doc/sixlowpan.rst	2021-07-14 10:31:07.000000000 -0700
@@ -23,17 +23,15 @@
 other kinds of networks.
 
 Other than that, the module strictly follows :rfc:`4944` and :rfc:`6282`, with the
-following exceptions:
-
-* HC2 encoding is not supported
-* IPHC's SAC and DAC are not supported
-
-The HC2 encoding is not supported, as it has been superseded by IPHC and NHC
+exception that HC2 encoding is not supported, as it has been superseded by IPHC and NHC
 compression type (\ :rfc:`6282`).
 
-IPHC SAC and DAC are not yet supported, as they do require :rfc:`6775` 
+IPHC sateful (context-based) compression is supported but, since :rfc:`6775`   
 ("Neighbor Discovery Optimization for IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs)")
-for full compliance. It is planned to support them in the future.
+is not yet implemented, it is necessary to add the context to the nodes manually.
+
+This is possible though the ``SixLowPanHelper::AddContext`` function.
+Mind that installing different contexts in different nodes will lead to decompression failures.
 
 NetDevice
 #########
@@ -117,8 +115,9 @@
 Contex-based compression
 ########################
 
-The present implementation does not support context-based (stateful) compression.
-This limitation will be removed in the future.
+IPHC sateful (context-based) compression is supported but, since :rfc:`6775`   
+("Neighbor Discovery Optimization for IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs)")
+is not yet implemented, it is necessary to add the context to the nodes manually.
 
 6LoWPAM-ND
 ##########
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/sixlowpan/helper/sixlowpan-helper.cc ns-3.34/src/sixlowpan/helper/sixlowpan-helper.cc
--- ns-3.33/src/sixlowpan/helper/sixlowpan-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/sixlowpan/helper/sixlowpan-helper.cc	2021-07-14 10:31:07.000000000 -0700
@@ -66,6 +66,66 @@
   return devs;
 }
 
+void SixLowPanHelper::AddContext (NetDeviceContainer c, uint8_t contextId, Ipv6Prefix context, Time validity)
+{
+  NS_LOG_FUNCTION (this << +contextId << context << validity);
+
+  for (uint32_t i = 0; i < c.GetN (); ++i)
+    {
+      Ptr<NetDevice> device = c.Get (i);
+      Ptr<SixLowPanNetDevice> sixDevice = DynamicCast<SixLowPanNetDevice> (device);
+      if (sixDevice)
+        {
+          sixDevice->AddContext (contextId, context, true, validity);
+        }
+    }
+}
+
+void SixLowPanHelper::RenewContext (NetDeviceContainer c, uint8_t contextId, Time validity)
+{
+  NS_LOG_FUNCTION (this << +contextId << validity);
+
+  for (uint32_t i = 0; i < c.GetN (); ++i)
+    {
+      Ptr<NetDevice> device = c.Get (i);
+      Ptr<SixLowPanNetDevice> sixDevice = DynamicCast<SixLowPanNetDevice> (device);
+      if (sixDevice)
+        {
+          sixDevice->RenewContext (contextId, validity);
+        }
+    }
+}
+
+void SixLowPanHelper::InvalidateContext (NetDeviceContainer c, uint8_t contextId)
+{
+  NS_LOG_FUNCTION (this << +contextId);
+
+  for (uint32_t i = 0; i < c.GetN (); ++i)
+    {
+      Ptr<NetDevice> device = c.Get (i);
+      Ptr<SixLowPanNetDevice> sixDevice = DynamicCast<SixLowPanNetDevice> (device);
+      if (sixDevice)
+        {
+          sixDevice->InvalidateContext (contextId);
+        }
+    }
+}
+
+void SixLowPanHelper::RemoveContext (NetDeviceContainer c, uint8_t contextId)
+{
+  NS_LOG_FUNCTION (this << +contextId);
+
+  for (uint32_t i = 0; i < c.GetN (); ++i)
+    {
+      Ptr<NetDevice> device = c.Get (i);
+      Ptr<SixLowPanNetDevice> sixDevice = DynamicCast<SixLowPanNetDevice> (device);
+      if (sixDevice)
+        {
+          sixDevice->RemoveContext (contextId);
+        }
+    }
+}
+
 int64_t SixLowPanHelper::AssignStreams (NetDeviceContainer c, int64_t stream)
 {
   int64_t currentStream = stream;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/sixlowpan/helper/sixlowpan-helper.h ns-3.34/src/sixlowpan/helper/sixlowpan-helper.h
--- ns-3.33/src/sixlowpan/helper/sixlowpan-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/sixlowpan/helper/sixlowpan-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -29,6 +29,7 @@
 
 class Node;
 class AttributeValue;
+class Time;
 
 /**
  * \ingroup sixlowpan
@@ -80,16 +81,64 @@
   NetDeviceContainer Install (NetDeviceContainer c);
 
   /**
-  * Assign a fixed random variable stream number to the random variables
-  * used by this model. Return the number of streams (possibly zero) that
-  * have been assigned. The Install() method should have previously been
-  * called by the user.
-  *
-  * \param [in] c NetDeviceContainer of the set of net devices for which the
-  *          SixLowPanNetDevice should be modified to use a fixed stream.
-  * \param [in] stream First stream index to use.
-  * \return The number of stream indices assigned by this helper.
-  */
+   * \brief Adds a compression Context to a set of NetDevices.
+   *
+   * This function installs one Compression Context on a set of NetDevices.
+   * The context is used only in IPHC compression and decompression.
+   *
+   * \param [in] c The NetDevice container.
+   * \param [in] contextId The context id (must be less than 16).
+   * \param [in] context The context prefix.
+   * \param [in] validity the context validity time (relative to the actual time).
+   */
+  void AddContext (NetDeviceContainer c, uint8_t contextId, Ipv6Prefix context, Time validity);
+
+  /**
+   * \brief Renew a compression Context in a set of NetDevices.
+   *
+   * The context will have its lifetime extended and its validity for compression re-enabled.
+   *
+   * \param [in] c The NetDevice container.
+   * \param [in] contextId The context id (must be less than 16).
+   * \param [in] validity the context validity time (relative to the actual time).
+   */
+  void RenewContext (NetDeviceContainer c, uint8_t contextId, Time validity);
+
+  /**
+   * \brief Invalidates a compression Context in a set of NetDevices.
+   *
+   * An invalid context is used only in IPHC decompression and not
+   * in IPHC compression.
+   *
+   * This is necessary to avoid that a context reaching its validity lifetime
+   * can not be used for decompression whie packets are traveling the network.
+   *
+   * \param [in] c The NetDevice container.
+   * \param [in] contextId The context id (must be less than 16).
+   */
+  void InvalidateContext (NetDeviceContainer c, uint8_t contextId);
+
+  /**
+   * \brief Remove a compression Context in a set of NetDevices.
+   *
+   * The context is removed immediately from the contexts in the devices.
+   *
+   * \param [in] c The NetDevice container.
+   * \param [in] contextId The context id (must be less than 16).
+   */
+  void RemoveContext (NetDeviceContainer c, uint8_t contextId);
+
+  /**
+   * Assign a fixed random variable stream number to the random variables
+   * used by this model. Return the number of streams (possibly zero) that
+   * have been assigned. The Install() method should have previously been
+   * called by the user.
+   *
+   * \param [in] c NetDeviceContainer of the set of net devices for which the
+   *          SixLowPanNetDevice should be modified to use a fixed stream.
+   * \param [in] stream First stream index to use.
+   * \return The number of stream indices assigned by this helper.
+   */
   int64_t AssignStreams (NetDeviceContainer c, int64_t stream);
 
 private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/sixlowpan/model/sixlowpan-header.cc ns-3.34/src/sixlowpan/model/sixlowpan-header.cc
--- ns-3.33/src/sixlowpan/model/sixlowpan-header.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/sixlowpan/model/sixlowpan-header.cc	2021-07-14 10:31:07.000000000 -0700
@@ -793,6 +793,7 @@
 {
   // 011x xxxx xxxx xxxx
   m_baseFormat = 0x6000;
+  m_srcdstContextId = 0;
 }
 
 SixLowPanIphc::SixLowPanIphc (uint8_t dispatch)
@@ -800,6 +801,7 @@
   // 011x xxxx xxxx xxxx
   m_baseFormat = dispatch;
   m_baseFormat <<= 8;
+  m_srcdstContextId = 0;
 }
 
 TypeId SixLowPanIphc::GetTypeId (void)
@@ -818,7 +820,48 @@
 
 void SixLowPanIphc::Print (std::ostream & os) const
 {
-  os << "Compression kind: " << +m_baseFormat;
+  switch ( GetTf () )
+    {
+    case TF_FULL:
+      os << "TF_FULL(" << +m_ecn << ", " << +m_dscp << ", " << m_flowLabel << ")";
+      break;
+    case TF_DSCP_ELIDED:
+      os << "TF_DSCP_ELIDED(" << +m_ecn << ", " << m_flowLabel << ")";
+      break;
+    case TF_FL_ELIDED:
+      os << "TF_FL_ELIDED(" << +m_ecn << ", " << +m_dscp << ")";
+      break;
+    default:
+      os << "TF_ELIDED";
+      break;
+    }
+
+  GetNh () ? os << " NH(1)" : os << " NH(0)";
+
+  switch ( GetHlim () )
+    {
+    case HLIM_INLINE:
+      os << " HLIM_INLINE(" << +m_hopLimit << ")";
+      break;
+    case HLIM_COMPR_1:
+      os << " HLIM_COMPR_1(1)";
+      break;
+    case HLIM_COMPR_64:
+      os << " HLIM_COMPR_64(64)";
+      break;
+    default:
+      os << " HLIM_COMPR_255(255)";
+      break;
+    }
+
+  GetCid () ? os << " CID(" << +m_srcdstContextId << ")" : os << " CID(0)";
+
+  GetSac () ? os << " SAC(1)" : os << " SAC(0)";
+  os << " SAM (" << GetSam () << ")";
+
+  GetM () ? os << " M(1)" : os << " M(0)";
+  GetDac () ? os << " DAC(1)" : os << " DAC(0)";
+  os << " DAM (" << GetDam () << ")";
 }
 
 uint32_t SixLowPanIphc::GetSerializedSize () const
@@ -983,22 +1026,17 @@
   // Source Address
   switch (GetSam () )
     {
-      uint8_t temp[16];
     case HC_INLINE:
       if ( GetSac () == false )
         {
-          uint8_t temp[16];
-          m_srcAddress.Serialize (temp);
-          i.Write (temp, 16);
+          i.Write (m_srcInlinePart, 16);
         }
       break;
     case HC_COMPR_64:
-      m_srcAddress.Serialize (temp);
-      i.Write (temp + 8, 8);
+      i.Write (m_srcInlinePart, 8);
       break;
     case HC_COMPR_16:
-      m_srcAddress.Serialize (temp);
-      i.Write (temp + 14, 2);
+      i.Write (m_srcInlinePart, 2);
       break;
     case HC_COMPR_0:
     default:
@@ -1007,23 +1045,17 @@
   // Destination Address
   if ( GetM () == false)
     {
-      uint8_t temp[16];
+      // unicast
       switch (GetDam () )
         {
         case HC_INLINE:
-          if ( GetDac () == false )
-            {
-              m_dstAddress.Serialize (temp);
-              i.Write (temp, 16);
-            }
+          i.Write (m_dstInlinePart, 16);
           break;
         case HC_COMPR_64:
-          m_dstAddress.Serialize (temp);
-          i.Write (temp + 8, 8);
+          i.Write (m_dstInlinePart, 8);
           break;
         case HC_COMPR_16:
-          m_dstAddress.Serialize (temp);
-          i.Write (temp + 14, 2);
+          i.Write (m_dstInlinePart, 2);
           break;
         case HC_COMPR_0:
         default:
@@ -1032,45 +1064,22 @@
     }
   else
     {
+      // multicast
       switch (GetDam () )
         {
-          uint8_t temp[16];
         case HC_INLINE:
-          if ( GetDac () == false )
-            {
-              m_dstAddress.Serialize (temp);
-              i.Write (temp, 16);
-            }
-          else
-            {
-              m_dstAddress.Serialize (temp);
-              i.Write (temp + 1, 2);
-              i.Write (temp + 12, 4);
-            }
+          i.Write (m_dstInlinePart, 16);
           break;
         case HC_COMPR_64:
-          if ( GetDac () == false )
-            {
-              m_dstAddress.Serialize (temp);
-              i.Write (temp + 1, 1);
-              i.Write (temp + 11, 5);
-            }
+          i.Write (m_dstInlinePart, 6);
           break;
         case HC_COMPR_16:
-          if ( GetDac () == false )
-            {
-              m_dstAddress.Serialize (temp);
-              i.Write (temp + 1, 1);
-              i.Write (temp + 13, 3);
-            }
+          i.Write (m_dstInlinePart, 4);
           break;
         case HC_COMPR_0:
-        default:
-          if ( GetDac () == false )
-            {
-              m_dstAddress.Serialize (temp);
-              i.WriteU8 (temp[15]);
-            }
+          i.Write (m_dstInlinePart, 1);
+          break;
+       default:
           break;
         }
     }
@@ -1086,6 +1095,10 @@
     {
       m_srcdstContextId = i.ReadU8 ();
     }
+  else
+    {
+      m_srcdstContextId = 0;
+    }
   // Traffic Class and Flow Label
   switch ( GetTf () )
     {
@@ -1142,68 +1155,41 @@
 
     }
   // Source Address
+  memset (m_srcInlinePart, 0x00, sizeof (m_srcInlinePart));
   switch (GetSam () )
     {
-      uint8_t temp[16];
     case HC_INLINE:
       if ( GetSac () == false )
         {
-          i.Read (temp, 16);
-          m_srcAddress = Ipv6Address::Deserialize (temp);
+          i.Read (m_srcInlinePart, 16);
         }
       break;
     case HC_COMPR_64:
-      memset (temp, 0x00, sizeof (temp));
-      i.Read (temp + 8, 8);
-      temp[0] = 0xfe;
-      temp[1] = 0x80;
-      m_srcAddress = Ipv6Address::Deserialize (temp);
+      i.Read (m_srcInlinePart, 8);
       break;
     case HC_COMPR_16:
-      memset (temp, 0x00, sizeof (temp));
-      i.Read (temp + 14, 2);
-      temp[0] = 0xfe;
-      temp[1] = 0x80;
-      temp[11] = 0xff;
-      temp[12] = 0xfe;
-      m_srcAddress = Ipv6Address::Deserialize (temp);
+      i.Read (m_srcInlinePart, 2);
       break;
     case HC_COMPR_0:
     default:
       break;
     }
-  if ( GetSac () == true )
-    {
-      PostProcessSac ();
-    }
+
   // Destination Address
+  memset (m_dstInlinePart, 0x00, sizeof (m_dstInlinePart));
   if ( GetM () == false)
     {
-      uint8_t temp[16];
+      // unicast
       switch (GetDam () )
         {
         case HC_INLINE:
-          if ( GetDac () == false )
-            {
-              i.Read (temp, 16);
-              m_dstAddress = Ipv6Address::Deserialize (temp);
-            }
+          i.Read (m_dstInlinePart, 16);
           break;
         case HC_COMPR_64:
-          memset (temp, 0x00, sizeof (temp));
-          i.Read (temp + 8, 8);
-          temp[0] = 0xfe;
-          temp[1] = 0x80;
-          m_dstAddress = Ipv6Address::Deserialize (temp);
+          i.Read (m_dstInlinePart, 8);
           break;
         case HC_COMPR_16:
-          memset (temp, 0x00, sizeof (temp));
-          i.Read (temp + 14, 2);
-          temp[0] = 0xfe;
-          temp[1] = 0x80;
-          temp[11] = 0xff;
-          temp[12] = 0xfe;
-          m_dstAddress = Ipv6Address::Deserialize (temp);
+          i.Read (m_dstInlinePart, 2);
           break;
         case HC_COMPR_0:
         default:
@@ -1212,61 +1198,26 @@
     }
   else
     {
+      // multicast
       switch (GetDam () )
         {
-          uint8_t temp[16];
         case HC_INLINE:
-          if ( GetDac () == false )
-            {
-              i.Read (temp, 16);
-              m_dstAddress = Ipv6Address::Deserialize (temp);
-            }
-          else
-            {
-              memset (temp, 0x00, sizeof (temp));
-              i.Read (temp + 1, 2);
-              i.Read (temp + 12, 4);
-              temp[0] = 0xff;
-              m_dstAddress = Ipv6Address::Deserialize (temp);
-            }
+          i.Read (m_dstInlinePart, 16);
           break;
         case HC_COMPR_64:
-          if ( GetDac () == false )
-            {
-              memset (temp, 0x00, sizeof (temp));
-              i.Read (temp + 1, 1);
-              i.Read (temp + 11, 5);
-              temp[0] = 0xff;
-              m_dstAddress = Ipv6Address::Deserialize (temp);
-            }
+          i.Read (m_dstInlinePart, 6);
           break;
         case HC_COMPR_16:
-          if ( GetDac () == false )
-            {
-              memset (temp, 0x00, sizeof (temp));
-              i.Read (temp + 1, 1);
-              i.Read (temp + 13, 3);
-              temp[0] = 0xff;
-              m_dstAddress = Ipv6Address::Deserialize (temp);
-            }
+          i.Read (m_dstInlinePart, 4);
           break;
         case HC_COMPR_0:
+          i.Read (m_dstInlinePart, 1);
+          break;
         default:
-          if ( GetDac () == false )
-            {
-              memset (temp, 0x00, sizeof (temp));
-              temp[15] = i.ReadU8 ();
-              temp[0] = 0xff;
-              temp[1] = 0x02;
-              m_dstAddress = Ipv6Address::Deserialize (temp);
-            }
           break;
         }
     }
-  if ( GetDac () == true )
-    {
-      PostProcessDac ();
-    }
+
   return GetSerializedSize ();
 }
 
@@ -1336,6 +1287,19 @@
   return HeaderCompression_e ((m_baseFormat >> 4) & 0x3);
 }
 
+const uint8_t* SixLowPanIphc::GetSrcInlinePart (void) const
+{
+  return m_srcInlinePart;
+}
+
+void SixLowPanIphc::SetSrcInlinePart (uint8_t srcInlinePart[16], uint8_t size)
+{
+  NS_ASSERT_MSG (size <= 16,  "Src inline part too large");
+
+  memcpy (m_srcInlinePart, srcInlinePart, size);
+  return;
+}
+
 void SixLowPanIphc::SetM (bool mField)
 {
   uint16_t field = mField;
@@ -1369,6 +1333,19 @@
   return HeaderCompression_e (m_baseFormat & 0x3);
 }
 
+const uint8_t* SixLowPanIphc::GetDstInlinePart (void) const
+{
+  return m_dstInlinePart;
+}
+
+void SixLowPanIphc::SetDstInlinePart (uint8_t dstInlinePart[16], uint8_t size)
+{
+  NS_ASSERT_MSG (size <= 16,  "Dst inline part too large");
+
+  memcpy (m_dstInlinePart, dstInlinePart, size);
+  return;
+}
+
 void SixLowPanIphc::SetSrcContextId (uint8_t srcContextId)
 {
   NS_ASSERT_MSG (srcContextId < 16,  "Src Context ID too large");
@@ -1444,38 +1421,6 @@
   return m_hopLimit;
 }
 
-void SixLowPanIphc::SetSrcAddress (Ipv6Address srcAddress)
-{
-  m_srcAddress = srcAddress;
-}
-
-Ipv6Address SixLowPanIphc::GetSrcAddress () const
-{
-  return m_srcAddress;
-}
-
-void SixLowPanIphc::SetDstAddress (Ipv6Address dstAddress)
-{
-  m_dstAddress = dstAddress;
-}
-
-Ipv6Address SixLowPanIphc::GetDstAddress () const
-{
-  return m_dstAddress;
-}
-
-void SixLowPanIphc::PostProcessSac ()
-{
-  NS_ABORT_MSG ("Unsupported; Context destination is not implemented");
-  return;
-}
-
-void SixLowPanIphc::PostProcessDac ()
-{
-  NS_ABORT_MSG ("Unsupported; Context destination is not implemented");
-  return;
-}
-
 std::ostream & operator << (std::ostream & os, const SixLowPanIphc & h)
 {
   h.Print (os);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/sixlowpan/model/sixlowpan-header.h ns-3.34/src/sixlowpan/model/sixlowpan-header.h
--- ns-3.33/src/sixlowpan/model/sixlowpan-header.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/sixlowpan/model/sixlowpan-header.h	2021-07-14 10:31:07.000000000 -0700
@@ -769,6 +769,19 @@
   HeaderCompression_e GetSam (void) const;
 
   /**
+   * brief Set the source address inline part
+   * \param srcInlinePart The inline portion of the compressed source address (16 bytes)
+   * \param size The number of inline bytes
+   */
+  void SetSrcInlinePart (uint8_t srcInlinePart[16], uint8_t size);
+
+  /**
+   * brief Get the source address inline part
+   * \return The inline portion of the compressed source address (16 bytes)
+   */
+  const uint8_t* GetSrcInlinePart (void) const;
+
+  /**
    * \brief Set the M (Multicast) compression.
    * \param [in] mField True if destination is multicast.
    */
@@ -805,6 +818,19 @@
   HeaderCompression_e GetDam (void) const;
 
   /**
+   * brief Set the destination address inline part
+   * \param dstInlinePart The inline portion of the compressed destination address (16 bytes)
+   * \param size The number of inline bytes
+   */
+  void SetDstInlinePart (uint8_t dstInlinePart[16], uint8_t size);
+
+  /**
+   * brief Get the destination address inline part
+   * \return The inline portion of the compressed destination address (16 bytes)
+   */
+  const uint8_t* GetDstInlinePart (void) const;
+
+   /**
    * \brief Set the SrcContextId.
    * \param [in] srcContextId Valid values are [0:15].
    */
@@ -888,51 +914,16 @@
    */
   uint8_t GetHopLimit (void) const;
 
-  /**
-   * \brief Set the Source Address.
-   * \param [in] srcAddress The Source Address.
-   */
-  void SetSrcAddress (Ipv6Address srcAddress);
-
-  /**
-   * \brief Get the Source Address.
-   * \return The Source Address.
-   */
-  Ipv6Address GetSrcAddress () const;
-
-  /**
-   * \brief Set the Destination Address.
-   * \param [in] dstAddress The Destination Address.
-   */
-  void SetDstAddress (Ipv6Address dstAddress);
-
-  /**
-   * \brief Get the Destination Address.
-   * \return The Destination Address.
-   */
-  Ipv6Address GetDstAddress () const;
-
 private:
-  uint16_t m_baseFormat;      //!< Dispatch + encoding fields.
-  uint8_t m_srcdstContextId;  //!< Src and Dst Context ID.
-  uint8_t m_ecn : 2;          //!< ECN bits.
-  uint8_t m_dscp : 6;         //!< DSCP bits.
-  uint32_t m_flowLabel : 20;  //!< Flow Label bits.
-  uint8_t m_nextHeader;       //!< Next header.
-  uint8_t m_hopLimit;         //!< Hop Limit.
-  Ipv6Address m_srcAddress;   //!< Src address.
-  Ipv6Address m_dstAddress;   //!< Dst address.
-
-  /**
-   * \brief Post-process the Source address stateful compression
-   * \note Currently unsupported.
-   */
-  void PostProcessSac ();
-  /**
-   * \brief Post-process the Destination address stateful compression.
-   * \note Currently unsupported.
-   */
-  void PostProcessDac ();
+  uint16_t m_baseFormat;       //!< Dispatch + encoding fields.
+  uint8_t m_srcdstContextId;   //!< Src and Dst Context ID.
+  uint8_t m_ecn : 2;           //!< ECN bits.
+  uint8_t m_dscp : 6;          //!< DSCP bits.
+  uint32_t m_flowLabel : 20;   //!< Flow Label bits.
+  uint8_t m_nextHeader;        //!< Next header.
+  uint8_t m_hopLimit;          //!< Hop Limit.
+  uint8_t m_srcInlinePart[16]; //!< source address inline part.
+  uint8_t m_dstInlinePart[16]; //!< destination address inline part.
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/sixlowpan/model/sixlowpan-net-device.cc ns-3.34/src/sixlowpan/model/sixlowpan-net-device.cc
--- ns-3.33/src/sixlowpan/model/sixlowpan-net-device.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/sixlowpan/model/sixlowpan-net-device.cc	2021-07-14 10:31:07.000000000 -0700
@@ -196,7 +196,6 @@
                                             PacketType packetType)
 {
   NS_LOG_FUNCTION (this << incomingPort << packet << protocol << src << dst);
-  NS_LOG_DEBUG ("UID is " << packet->GetUid ());
 
   uint8_t dispatchRawVal = 0;
   SixLowPanDispatch::Dispatch_e dispatchVal;
@@ -349,8 +348,14 @@
           m_dropTrace (DROP_DISALLOWED_COMPRESSION, copyPkt, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
           return;
         }
-      DecompressLowPanIphc (copyPkt, realSrc, realDst);
-      isPktDecompressed = true;
+      if (DecompressLowPanIphc (copyPkt, realSrc, realDst))
+        {
+          m_dropTrace (DROP_SATETFUL_DECOMPRESSION_PROBLEM, copyPkt, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+        }
+      else
+        {
+          isPktDecompressed = true;
+        }
       break;
     default:
       NS_LOG_DEBUG ("Unsupported 6LoWPAN encoding: dropping.");
@@ -568,6 +573,8 @@
 
   SixLowPanMesh meshHdr;
   SixLowPanBc0 bc0Hdr;
+  uint32_t extraHdrSize = 0;
+
   if (useMesh)
     {
       Address source = src;
@@ -591,7 +598,9 @@
       meshHdr.SetFinalDst (destination);
       meshHdr.SetHopsLeft (m_meshUnderHopsLeft);
       destination = m_netDevice->GetBroadcast ();
-      pktSize += meshHdr.GetSerializedSize () + bc0Hdr.GetSerializedSize ();
+      // We are storing sum of mesh and bc0 header sizes. We will need it if packet is fragmented.
+      extraHdrSize = meshHdr.GetSerializedSize () + bc0Hdr.GetSerializedSize ();
+      pktSize +=  extraHdrSize;
     }
 
   if (pktSize < m_compressionThreshold)
@@ -613,7 +622,7 @@
       NS_LOG_LOGIC ("Fragmentation: Packet size " << packet->GetSize () << " - Mtu " << m_netDevice->GetMtu () );
       // fragment
       std::list<Ptr<Packet> > fragmentList;
-      DoFragmentation (packet, origPacketSize, origHdrSize, fragmentList);
+      DoFragmentation (packet, origPacketSize, origHdrSize, extraHdrSize, fragmentList);
       std::list<Ptr<Packet> >::iterator it;
       bool success = true;
       for ( it = fragmentList.begin (); it != fragmentList.end (); it++ )
@@ -711,6 +720,8 @@
   SixLowPanHc1 hc1Header;
   uint32_t size = 0;
 
+  NS_LOG_DEBUG ( "Original packet: " << *packet << " Size " << packet->GetSize () );
+
   if ( packet->PeekHeader (ipHeader) != 0 )
     {
       packet->RemoveHeader (ipHeader);
@@ -922,7 +933,7 @@
 
   packet->AddHeader (ipHeader);
 
-  NS_LOG_DEBUG ( "Rebuilt packet: " << *packet << " Size " << packet->GetSize () );
+  NS_LOG_DEBUG ( "Rebuilt packet:  " << *packet << " Size " << packet->GetSize () );
 }
 
 uint32_t
@@ -934,6 +945,7 @@
   SixLowPanIphc iphcHeader;
   uint32_t size = 0;
 
+  NS_LOG_DEBUG ( "Original packet: " << *packet << " Size " << packet->GetSize () << " src: " << src << " dst: " << dst);
 
   if ( packet->PeekHeader (ipHeader) != 0 )
     {
@@ -1002,7 +1014,6 @@
           iphcHeader.SetNextHeader (nextHeader);
         }
 
-
       // Set the HLIM field
       if (ipHeader.GetHopLimit () == 1)
         {
@@ -1023,44 +1034,101 @@
           iphcHeader.SetHopLimit (ipHeader.GetHopLimit ());
         }
 
-      // \todo Add the check of CID if there is context-based compression
-      // Set the CID field
+      // Set the CID + SAC + DAC fields to their default value
       iphcHeader.SetCid (false);
-
-      // \todo Add the check of SAC if there is context-based compression
-      // Set the SAC field
       iphcHeader.SetSac (false);
+      iphcHeader.SetDac (false);
 
-      uint8_t addressBuf[16];
-      uint8_t unicastAddrCheckerBuf[16];
-      Ipv6Address srcAddr = ipHeader.GetSourceAddress ();
-      srcAddr.GetBytes (addressBuf);
 
       Ipv6Address checker = Ipv6Address ("fe80:0000:0000:0000:0000:00ff:fe00:1");
+      uint8_t unicastAddrCheckerBuf[16];
       checker.GetBytes (unicastAddrCheckerBuf);
+      uint8_t addressBuf[16];
 
-      // \todo Add the check of SAC if there is context-based compression
-      // Set the Source Address
-      iphcHeader.SetSrcAddress (srcAddr);
+      // This is just to limit the scope of some variables.
+      if (true)
+        {
+          Ipv6Address srcAddr = ipHeader.GetSourceAddress ();
+          uint8_t srcContextId;
 
-      Ipv6Address mySrcAddr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src);
-      NS_LOG_LOGIC ("Checking source compression: " << mySrcAddr << " - " << srcAddr );
+          // The "::" address is compressed as a fake stateful compression.
+          if (srcAddr == Ipv6Address::GetAny ())
+            {
+              // No context information is needed.
+              iphcHeader.SetSam (SixLowPanIphc::HC_INLINE);
+              iphcHeader.SetSac (true);
+            }
+          // Check if the address can be compressed with stateful compression
+          else if ( FindUnicastCompressionContext (srcAddr, srcContextId) )
+            {
+              // We can do stateful compression.
+              NS_LOG_LOGIC ("Checking stateful source compression: " << srcAddr );
 
-      if ( mySrcAddr == srcAddr )
-        {
-          iphcHeader.SetSam (SixLowPanIphc::HC_COMPR_0);
-        }
-      else if (memcmp (addressBuf, unicastAddrCheckerBuf, 14) == 0)
-        {
-          iphcHeader.SetSam (SixLowPanIphc::HC_COMPR_16);
-        }
-      else if ( srcAddr.IsLinkLocal () )
-        {
-          iphcHeader.SetSam (SixLowPanIphc::HC_COMPR_64);
-        }
-      else
-        {
-          iphcHeader.SetSam (SixLowPanIphc::HC_INLINE);
+              iphcHeader.SetSac (true);
+              if (srcContextId != 0)
+                {
+                  // the default context is zero, no need to explicit it if it's zero
+                  iphcHeader.SetSrcContextId (srcContextId);
+                  iphcHeader.SetCid (true);
+                }
+
+              // Note that a context might include parts of the EUI-64 (i.e., be as long as 128 bits).
+
+              if (Ipv6Address::MakeAutoconfiguredAddress (src, m_contextTable[srcContextId].contextPrefix) == srcAddr)
+                {
+                  iphcHeader.SetSam (SixLowPanIphc::HC_COMPR_0);
+                }
+              else
+                {
+                  Ipv6Address cleanedAddr = CleanPrefix (srcAddr, m_contextTable[srcContextId].contextPrefix);
+                  uint8_t serializedCleanedAddress[16];
+                  cleanedAddr.Serialize (serializedCleanedAddress);
+
+                  if ( serializedCleanedAddress[8] == 0x00 && serializedCleanedAddress[9] == 0x00 &&
+                      serializedCleanedAddress[10] == 0x00 && serializedCleanedAddress[11] == 0xff &&
+                      serializedCleanedAddress[12] == 0xfe && serializedCleanedAddress[13] == 0x00 )
+                    {
+                      iphcHeader.SetSam (SixLowPanIphc::HC_COMPR_16);
+                      iphcHeader.SetSrcInlinePart (serializedCleanedAddress+14, 2);
+                    }
+                  else
+                    {
+                      iphcHeader.SetSam (SixLowPanIphc::HC_COMPR_64);
+                      iphcHeader.SetSrcInlinePart (serializedCleanedAddress+8, 8);
+
+                    }
+                }
+            }
+          else
+            {
+              // We must do stateless compression.
+              NS_LOG_LOGIC ("Checking stateless source compression: " << srcAddr );
+
+              srcAddr.GetBytes (addressBuf);
+
+              uint8_t serializedSrcAddress[16];
+              srcAddr.Serialize (serializedSrcAddress);
+
+              if ( srcAddr == Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src) )
+                {
+                  iphcHeader.SetSam (SixLowPanIphc::HC_COMPR_0);
+                }
+              else if (memcmp (addressBuf, unicastAddrCheckerBuf, 14) == 0)
+                {
+                  iphcHeader.SetSrcInlinePart (serializedSrcAddress+14, 2);
+                  iphcHeader.SetSam (SixLowPanIphc::HC_COMPR_16);
+                }
+              else if ( srcAddr.IsLinkLocal () )
+                {
+                  iphcHeader.SetSrcInlinePart (serializedSrcAddress+8, 8);
+                  iphcHeader.SetSam (SixLowPanIphc::HC_COMPR_64);
+                }
+              else
+                {
+                  iphcHeader.SetSrcInlinePart (serializedSrcAddress, 16);
+                  iphcHeader.SetSam (SixLowPanIphc::HC_INLINE);
+                }
+            }
         }
 
       // Set the M field
@@ -1073,69 +1141,156 @@
           iphcHeader.SetM (false);
         }
 
-      // \todo Add the check of DAC if there is context-based compression
-      // Set the DAC field
-      iphcHeader.SetDac (false);
-
-      Ipv6Address dstAddr = ipHeader.GetDestinationAddress ();
-      dstAddr.GetBytes (addressBuf);
+      // This is just to limit the scope of some variables.
+      if (true)
+        {
+          Ipv6Address dstAddr = ipHeader.GetDestinationAddress ();
+          dstAddr.GetBytes (addressBuf);
 
-      // \todo Add the check of DAC if there is context-based compression
-      // Set the Destination Address
-      iphcHeader.SetDstAddress (dstAddr);
+          NS_LOG_LOGIC ("Checking destination compression: " << dstAddr );
 
-      Ipv6Address myDstAddr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst);
-      NS_LOG_LOGIC ("Checking destination compression: " << myDstAddr << " - " << dstAddr );
+          uint8_t serializedDstAddress[16];
+          dstAddr.Serialize (serializedDstAddress);
 
-      if ( !iphcHeader.GetM () )
-      // Unicast address
-        {
-          if ( myDstAddr == dstAddr )
-            {
-              iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_0);
-            }
-          else if (memcmp (addressBuf, unicastAddrCheckerBuf, 14) == 0)
-            {
-              iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_16);
-            }
-          else if ( dstAddr.IsLinkLocal () )
+          if ( !iphcHeader.GetM () )
             {
-              iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_64);
-            }
-          else
-            {
-              iphcHeader.SetDam (SixLowPanIphc::HC_INLINE);
-            }
-        }
-      else
-        {
-          // Multicast address
-          uint8_t multicastAddrCheckerBuf[16];
-          Ipv6Address multicastCheckAddress = Ipv6Address ("ff02::1");
-          multicastCheckAddress.GetBytes (multicastAddrCheckerBuf);
+              // Unicast address
 
-          // The address takes the form ff02::00XX.
-          if ( memcmp (addressBuf, multicastAddrCheckerBuf, 15) == 0 )
-            {
-              iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_0);
-            }
-          // The address takes the form ffXX::00XX:XXXX.
-          //                            ffXX:0000:0000:0000:0000:0000:00XX:XXXX.
-          else if ( (addressBuf[0] == multicastAddrCheckerBuf[0])
-                    && (memcmp (addressBuf + 2, multicastAddrCheckerBuf + 2, 11) == 0) )
-            {
-              iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_16);
-            }
-          // The address takes the form ffXX::00XX:XXXX:XXXX.
-          //                            ffXX:0000:0000:0000:0000:00XX:XXXX:XXXX.
-          else if ( (addressBuf[0] == multicastAddrCheckerBuf[0])
-                    && (memcmp (addressBuf + 2, multicastAddrCheckerBuf + 2, 9) == 0) )
-            {
-              iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_64);
+              uint8_t dstContextId;
+              if ( FindUnicastCompressionContext (dstAddr, dstContextId) )
+                {
+                  // We can do stateful compression.
+                  NS_LOG_LOGIC ("Checking stateful destination compression: " << dstAddr );
+
+                  iphcHeader.SetDac (true);
+                  if (dstContextId != 0)
+                    {
+                      // the default context is zero, no need to explicit it if it's zero
+                      iphcHeader.SetDstContextId (dstContextId);
+                      iphcHeader.SetCid (true);
+                    }
+
+                  // Note that a context might include parts of the EUI-64 (i.e., be as long as 128 bits).
+                  if (Ipv6Address::MakeAutoconfiguredAddress (dst, m_contextTable[dstContextId].contextPrefix) == dstAddr)
+                    {
+                      iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_0);
+                    }
+                  else
+                    {
+                      Ipv6Address cleanedAddr = CleanPrefix (dstAddr, m_contextTable[dstContextId].contextPrefix);
+
+                      uint8_t serializedCleanedAddress[16];
+                      cleanedAddr.Serialize (serializedCleanedAddress);
+
+                      if ( serializedCleanedAddress[8] == 0x00 && serializedCleanedAddress[9] == 0x00 &&
+                          serializedCleanedAddress[10] == 0x00 && serializedCleanedAddress[11] == 0xff &&
+                          serializedCleanedAddress[12] == 0xfe && serializedCleanedAddress[13] == 0x00 )
+                        {
+                          iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_16);
+                          iphcHeader.SetDstInlinePart (serializedCleanedAddress+14, 2);
+                        }
+                      else
+                        {
+                          iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_64);
+                          iphcHeader.SetDstInlinePart (serializedCleanedAddress+8, 8);
+                        }
+                    }
+                }
+              else
+                {
+                  NS_LOG_LOGIC ("Checking stateless destination compression: " << dstAddr );
+
+                  if ( dstAddr == Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst) )
+                    {
+                      iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_0);
+                    }
+                  else if (memcmp (addressBuf, unicastAddrCheckerBuf, 14) == 0)
+                    {
+                      iphcHeader.SetDstInlinePart (serializedDstAddress+14, 2);
+                      iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_16);
+                    }
+                  else if ( dstAddr.IsLinkLocal () )
+                    {
+                      iphcHeader.SetDstInlinePart (serializedDstAddress+8, 8);
+                      iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_64);
+                    }
+                  else
+                    {
+                      iphcHeader.SetDstInlinePart (serializedDstAddress, 16);
+                      iphcHeader.SetDam (SixLowPanIphc::HC_INLINE);
+                    }
+                }
             }
           else
             {
-              iphcHeader.SetDam (SixLowPanIphc::HC_INLINE);
+              // Multicast address
+
+              uint8_t dstContextId;
+              if ( FindMulticastCompressionContext (dstAddr, dstContextId) )
+                {
+                  // Stateful compression (only one possible case)
+
+                  // ffXX:XXLL:PPPP:PPPP:PPPP:PPPP:XXXX:XXXX
+                  uint8_t dstInlinePart[6] = {};
+                  dstInlinePart[0] = serializedDstAddress[1];
+                  dstInlinePart[1] = serializedDstAddress[2];
+                  dstInlinePart[2] = serializedDstAddress[12];
+                  dstInlinePart[3] = serializedDstAddress[13];
+                  dstInlinePart[4] = serializedDstAddress[14];
+                  dstInlinePart[5] = serializedDstAddress[15];
+
+                  iphcHeader.SetDac (true);
+                  if (dstContextId != 0)
+                    {
+                      // the default context is zero, no need to explicit it if it's zero
+                      iphcHeader.SetDstContextId (dstContextId);
+                      iphcHeader.SetCid (true);
+                    }
+                  iphcHeader.SetDstInlinePart (dstInlinePart, 6);
+                  iphcHeader.SetDam (SixLowPanIphc::HC_INLINE);
+                }
+              else
+                {
+                  // Stateless compression
+
+                  uint8_t multicastAddrCheckerBuf[16];
+                  Ipv6Address multicastCheckAddress = Ipv6Address ("ff02::1");
+                  multicastCheckAddress.GetBytes (multicastAddrCheckerBuf);
+
+                  // The address takes the form ff02::00XX.
+                  if ( memcmp (addressBuf, multicastAddrCheckerBuf, 15) == 0 )
+                    {
+                      iphcHeader.SetDstInlinePart (serializedDstAddress+15, 1);
+                      iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_0);
+                    }
+                  // The address takes the form ffXX::00XX:XXXX.
+                  //                            ffXX:0000:0000:0000:0000:0000:00XX:XXXX.
+                  else if ( (addressBuf[0] == multicastAddrCheckerBuf[0])
+                      && (memcmp (addressBuf + 2, multicastAddrCheckerBuf + 2, 11) == 0) )
+                    {
+                      uint8_t dstInlinePart[4] = {};
+                      memcpy (dstInlinePart, serializedDstAddress+1, 1);
+                      memcpy (dstInlinePart+1, serializedDstAddress+13, 3);
+                      iphcHeader.SetDstInlinePart (dstInlinePart, 4);
+                      iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_16);
+                    }
+                  // The address takes the form ffXX::00XX:XXXX:XXXX.
+                  //                            ffXX:0000:0000:0000:0000:00XX:XXXX:XXXX.
+                  else if ( (addressBuf[0] == multicastAddrCheckerBuf[0])
+                      && (memcmp (addressBuf + 2, multicastAddrCheckerBuf + 2, 9) == 0) )
+                    {
+                      uint8_t dstInlinePart[6] = {};
+                      memcpy (dstInlinePart, serializedDstAddress+1, 1);
+                      memcpy (dstInlinePart+1, serializedDstAddress+11, 5);
+                      iphcHeader.SetDstInlinePart (dstInlinePart, 6);
+                      iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_64);
+                    }
+                  else
+                    {
+                      iphcHeader.SetDstInlinePart (serializedDstAddress, 16);
+                      iphcHeader.SetDam (SixLowPanIphc::HC_INLINE);
+                    }
+                }
             }
         }
 
@@ -1148,7 +1303,6 @@
 
       return size;
     }
-
   return 0;
 }
 
@@ -1173,7 +1327,7 @@
   return ret;
 }
 
-void
+bool
 SixLowPanNetDevice::DecompressLowPanIphc (Ptr<Packet> packet, Address const &src, Address const &dst)
 {
   NS_LOG_FUNCTION (this << *packet << src << dst);
@@ -1191,29 +1345,99 @@
   // Source address
   if ( encoding.GetSac () )
     {
+      // Source address compression uses stateful, context-based compression.
       if ( encoding.GetSam () == SixLowPanIphc::HC_INLINE )
         {
           ipHeader.SetSourceAddress ( Ipv6Address::GetAny () );
         }
       else
         {
-          NS_ABORT_MSG ("SAC option not yet implemented");
+          uint8_t contextId = encoding.GetSrcContextId ();
+          if (m_contextTable.find (contextId) == m_contextTable.end ())
+            {
+              NS_LOG_LOGIC ("Unknown Source compression context (" << +contextId << "), dropping packet");
+              return true;
+            }
+          if (m_contextTable[contextId].validLifetime < Simulator::Now ())
+            {
+              NS_LOG_LOGIC ("Expired Source compression context (" << +contextId << "), dropping packet");
+              return true;
+           }
+
+          uint8_t contexPrefix[16];
+          m_contextTable[contextId].contextPrefix.GetBytes(contexPrefix);
+          uint8_t contextLength = m_contextTable[contextId].contextPrefix.GetPrefixLength ();
+
+          uint8_t srcAddress[16] = { };
+          if ( encoding.GetSam () == SixLowPanIphc::HC_COMPR_64 )
+            {
+              memcpy (srcAddress +8, encoding.GetSrcInlinePart (), 8);
+            }
+          else if ( encoding.GetSam () == SixLowPanIphc::HC_COMPR_16 )
+            {
+              srcAddress[11] = 0xff;
+              srcAddress[12] = 0xfe;
+              memcpy (srcAddress +14, encoding.GetSrcInlinePart (), 2);
+            }
+          else // SixLowPanIphc::HC_COMPR_0
+            {
+              Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src).GetBytes (srcAddress);
+            }
+
+          uint8_t bytesToCopy = contextLength / 8;
+          uint8_t bitsToCopy = contextLength % 8;
+
+          // Do not combine the prefix - we want to override the bytes.
+          for (uint8_t i=0; i<bytesToCopy; i++)
+            {
+              srcAddress[i] = contexPrefix[i];
+            }
+          if (bitsToCopy)
+            {
+              uint8_t addressBitMask = (1<<(8-bitsToCopy))-1;
+              uint8_t prefixBitMask = ~addressBitMask;
+              srcAddress[bytesToCopy] = (contexPrefix[bytesToCopy] & prefixBitMask) | (srcAddress[bytesToCopy] & addressBitMask);
+            }
+          ipHeader.SetSourceAddress ( Ipv6Address::Deserialize (srcAddress) );
         }
     }
   else
     {
-      if ( encoding.GetSam () == SixLowPanIphc::HC_COMPR_0 )
+      // Source address compression uses stateless compression.
+
+      if ( encoding.GetSam () == SixLowPanIphc::HC_INLINE )
         {
-          ipHeader.SetSourceAddress (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src));
+          uint8_t srcAddress[16] = { };
+          memcpy (srcAddress, encoding.GetSrcInlinePart (), 16);
+          ipHeader.SetSourceAddress ( Ipv6Address::Deserialize (srcAddress) );
+        }
+      else if ( encoding.GetSam () == SixLowPanIphc::HC_COMPR_64 )
+        {
+          uint8_t srcAddress[16] = { };
+          memcpy (srcAddress +8, encoding.GetSrcInlinePart (), 8);
+          srcAddress[0] = 0xfe;
+          srcAddress[1] = 0x80;
+          ipHeader.SetSourceAddress ( Ipv6Address::Deserialize (srcAddress) );
+        }
+      else if ( encoding.GetSam () == SixLowPanIphc::HC_COMPR_16 )
+        {
+          uint8_t srcAddress[16] = { };
+          memcpy (srcAddress +14, encoding.GetSrcInlinePart (), 2);
+          srcAddress[0] = 0xfe;
+          srcAddress[1] = 0x80;
+          srcAddress[11] = 0xff;
+          srcAddress[12] = 0xfe;
+          ipHeader.SetSourceAddress ( Ipv6Address::Deserialize (srcAddress) );
         }
-      else
+      else // SixLowPanIphc::HC_COMPR_0
         {
-          ipHeader.SetSourceAddress ( encoding.GetSrcAddress () );
+          ipHeader.SetSourceAddress (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src));
         }
     }
   // Destination address
   if ( encoding.GetDac () )
     {
+      // Destination address compression uses stateful, context-based compression.
       if ((encoding.GetDam () == SixLowPanIphc::HC_INLINE  && !encoding.GetM ())
           || (encoding.GetDam () == SixLowPanIphc::HC_COMPR_64  && encoding.GetM ())
           || (encoding.GetDam () == SixLowPanIphc::HC_COMPR_16  && encoding.GetM ())
@@ -1221,20 +1445,139 @@
         {
           NS_ABORT_MSG ("Reserved code found");
         }
+
+      uint8_t contextId = encoding.GetDstContextId ();
+      if (m_contextTable.find (contextId) == m_contextTable.end ())
+        {
+          NS_LOG_LOGIC ("Unknown Destination compression context (" << +contextId << "), dropping packet");
+          return true;
+        }
+      if (m_contextTable[contextId].validLifetime < Simulator::Now ())
+        {
+          NS_LOG_LOGIC ("Expired Destination compression context (" << +contextId << "), dropping packet");
+          return true;
+       }
+
+      uint8_t contexPrefix[16];
+      m_contextTable[contextId].contextPrefix.GetBytes(contexPrefix);
+      uint8_t contextLength = m_contextTable[contextId].contextPrefix.GetPrefixLength ();
+
+      if (encoding.GetM () == false)
+        {
+          // unicast
+          uint8_t dstAddress[16] = { };
+          if ( encoding.GetDam () == SixLowPanIphc::HC_COMPR_64 )
+            {
+              memcpy (dstAddress +8, encoding.GetDstInlinePart (), 8);
+            }
+          else if ( encoding.GetDam () == SixLowPanIphc::HC_COMPR_16 )
+            {
+              dstAddress[11] = 0xff;
+              dstAddress[12] = 0xfe;
+              memcpy (dstAddress +14, encoding.GetDstInlinePart (), 2);
+            }
+          else // SixLowPanIphc::HC_COMPR_0
+            {
+              Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst).GetBytes (dstAddress);
+            }
+
+          uint8_t bytesToCopy = m_contextTable[contextId].contextPrefix.GetPrefixLength () / 8;
+          uint8_t bitsToCopy = contextLength % 8;
+
+          // Do not combine the prefix - we want to override the bytes.
+          for (uint8_t i=0; i<bytesToCopy; i++)
+            {
+              dstAddress[i] = contexPrefix[i];
+            }
+          if (bitsToCopy)
+            {
+              uint8_t addressBitMask = (1<<(8-bitsToCopy))-1;
+              uint8_t prefixBitMask = ~addressBitMask;
+              dstAddress[bytesToCopy] = (contexPrefix[bytesToCopy] & prefixBitMask) | (dstAddress[bytesToCopy] & addressBitMask);
+            }
+          ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+        }
       else
         {
-          NS_ABORT_MSG ("DAC option not yet implemented");
+          // multicast
+          // Just one possibility: ffXX:XXLL:PPPP:PPPP:PPPP:PPPP:XXXX:XXXX
+          uint8_t dstAddress[16] = { };
+          dstAddress[0] = 0xff;
+          memcpy (dstAddress +1, encoding.GetDstInlinePart (), 2);
+          dstAddress[3] = contextLength;
+          memcpy (dstAddress +4, contexPrefix, 8);
+          memcpy (dstAddress +12, encoding.GetDstInlinePart ()+2, 4);
+          ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
         }
     }
   else
     {
-      if ( !encoding.GetM () && encoding.GetDam () == SixLowPanIphc::HC_COMPR_0 )
-        {
-          ipHeader.SetDestinationAddress (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst));
-        }
-      else
+      // Destination address compression uses stateless compression.
+      if (encoding.GetM () == false)
         {
-          ipHeader.SetDestinationAddress ( encoding.GetDstAddress () );
+          // unicast
+          if ( encoding.GetDam () == SixLowPanIphc::HC_INLINE )
+             {
+               uint8_t dstAddress[16] = { };
+               memcpy (dstAddress, encoding.GetDstInlinePart (), 16);
+               ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+             }
+          else if ( encoding.GetDam () == SixLowPanIphc::HC_COMPR_64 )
+            {
+              uint8_t dstAddress[16] = { };
+              memcpy (dstAddress +8, encoding.GetDstInlinePart (), 8);
+              dstAddress[0] = 0xfe;
+              dstAddress[1] = 0x80;
+              ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+            }
+          else if ( encoding.GetDam () == SixLowPanIphc::HC_COMPR_16 )
+            {
+              uint8_t dstAddress[16] = { };
+              memcpy (dstAddress +14, encoding.GetDstInlinePart (), 2);
+              dstAddress[0] = 0xfe;
+              dstAddress[1] = 0x80;
+              dstAddress[11] = 0xff;
+              dstAddress[12] = 0xfe;
+              ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+            }
+          else // SixLowPanIphc::HC_COMPR_0
+            {
+              ipHeader.SetDestinationAddress (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst));
+            }
+         }
+      else
+        {
+          // multicast
+          if ( encoding.GetDam () == SixLowPanIphc::HC_INLINE )
+            {
+              uint8_t dstAddress[16] = { };
+              memcpy (dstAddress, encoding.GetDstInlinePart (), 16);
+              ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+            }
+          else if ( encoding.GetDam () == SixLowPanIphc::HC_COMPR_64 )
+            {
+              uint8_t dstAddress[16] = { };
+              dstAddress[0] = 0xff;
+              memcpy (dstAddress +1, encoding.GetDstInlinePart (), 1);
+              memcpy (dstAddress +11, encoding.GetDstInlinePart ()+1, 5);
+              ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+            }
+          else if ( encoding.GetDam () == SixLowPanIphc::HC_COMPR_16 )
+            {
+              uint8_t dstAddress[16] = { };
+              dstAddress[0] = 0xff;
+              memcpy (dstAddress +1, encoding.GetDstInlinePart (), 1);
+              memcpy (dstAddress +13, encoding.GetDstInlinePart ()+1, 3);
+              ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+            }
+          else // SixLowPanIphc::HC_COMPR_0
+            {
+              uint8_t dstAddress[16] = { };
+              dstAddress[0] = 0xff;
+              dstAddress[1] = 0x02;
+              memcpy (dstAddress+15, encoding.GetDstInlinePart (), 1);
+              ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+            }
         }
     }
 
@@ -1282,7 +1625,15 @@
         }
       else
         {
-          ipHeader.SetNextHeader (DecompressLowPanNhc (packet, src, dst, ipHeader.GetSourceAddress (), ipHeader.GetDestinationAddress ()));
+          std::pair <uint8_t, bool> retval = DecompressLowPanNhc (packet, src, dst, ipHeader.GetSourceAddress (), ipHeader.GetDestinationAddress ());
+          if ( retval.second == true )
+            {
+              return true;
+            }
+          else
+            {
+              ipHeader.SetNextHeader (retval.first);
+            }
         }
     }
   else
@@ -1294,8 +1645,9 @@
 
   packet->AddHeader (ipHeader);
 
-  NS_LOG_DEBUG ( "Rebuilt packet: " << *packet << " Size " << packet->GetSize () );
+  NS_LOG_DEBUG ( "Rebuilt packet:  " << *packet << " Size " << packet->GetSize () );
 
+  return false;
 }
 
 uint32_t
@@ -1557,7 +1909,7 @@
   return size;
 }
 
-uint8_t
+std::pair <uint8_t, bool>
 SixLowPanNetDevice::DecompressLowPanNhc (Ptr<Packet> packet, Address const &src, Address const &dst, Ipv6Address srcAddress, Ipv6Address dstAddress)
 {
   NS_LOG_FUNCTION (this << *packet);
@@ -1602,7 +1954,7 @@
             }
           else
             {
-              blobData [0] = DecompressLowPanNhc (packet, src, dst, srcAddress, dstAddress);
+              blobData [0] = DecompressLowPanNhc (packet, src, dst, srcAddress, dstAddress).first;
             }
         }
       else
@@ -1654,7 +2006,7 @@
             }
           else
             {
-              blobData [0] = DecompressLowPanNhc (packet, src, dst, srcAddress, dstAddress);
+              blobData [0] = DecompressLowPanNhc (packet, src, dst, srcAddress, dstAddress).first;
             }
         }
       else
@@ -1686,7 +2038,7 @@
             }
           else
             {
-              blobData [0] = DecompressLowPanNhc (packet, src, dst, srcAddress, dstAddress);
+              blobData [0] = DecompressLowPanNhc (packet, src, dst, srcAddress, dstAddress).first;
             }
         }
       else
@@ -1720,7 +2072,7 @@
             }
           else
             {
-              blobData [0] = DecompressLowPanNhc (packet, src, dst, srcAddress, dstAddress);
+              blobData [0] = DecompressLowPanNhc (packet, src, dst, srcAddress, dstAddress).first;
             }
         }
       else
@@ -1759,7 +2111,11 @@
       break;
     case SixLowPanNhcExtension::EID_IPv6_H:
       actualHeaderType = Ipv6Header::IPV6_IPV6;
-      DecompressLowPanIphc (packet, src, dst);
+      if (DecompressLowPanIphc (packet, src, dst))
+        {
+          m_dropTrace (DROP_SATETFUL_DECOMPRESSION_PROBLEM, packet, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+          return std::pair<uint8_t, bool> (0, true);
+        }
       break;
     default:
       NS_ABORT_MSG ("Trying to decode unknown Extension Header");
@@ -1767,7 +2123,7 @@
     }
 
   NS_LOG_DEBUG ( "Rebuilt packet: " << *packet << " Size " << packet->GetSize () );
-  return actualHeaderType;
+  return std::pair<uint8_t, bool> (actualHeaderType, false);
 }
 
 uint32_t
@@ -1898,6 +2254,7 @@
 void SixLowPanNetDevice::DoFragmentation (Ptr<Packet> packet,
                                           uint32_t origPacketSize,
                                           uint32_t origHdrSize,
+                                          uint32_t extraHdrSize,
                                           std::list<Ptr<Packet> >& listFragments)
 {
   NS_LOG_FUNCTION (this << *packet);
@@ -1920,8 +2277,9 @@
   uint32_t size;
   NS_ASSERT_MSG ( l2Mtu > frag1Hdr.GetSerializedSize (),
                   "6LoWPAN: can not fragment, 6LoWPAN headers are bigger than MTU");
-
-  size = l2Mtu - frag1Hdr.GetSerializedSize () - compressedHeaderSize;
+  
+  // All the headers are substracted to get remaining units for data
+  size = l2Mtu - frag1Hdr.GetSerializedSize () - compressedHeaderSize - extraHdrSize;
   size -= size % 8;
   size += compressedHeaderSize;
 
@@ -1942,7 +2300,7 @@
       fragNHdr.SetDatagramSize (origPacketSize);
       fragNHdr.SetDatagramOffset ((offset) >> 3);
 
-      size = l2Mtu - fragNHdr.GetSerializedSize ();
+      size = l2Mtu - fragNHdr.GetSerializedSize () - extraHdrSize;
       size -= size % 8;
 
       if ( (offsetData + size) > packetSize )
@@ -1951,16 +2309,18 @@
           moreFrag = false;
         }
 
-      NS_LOG_LOGIC ("Fragment creation - " << offset << ", " << offset );
-      Ptr<Packet> fragment = p->CreateFragment (offsetData, size);
-      NS_LOG_LOGIC ("Fragment created - " << offset << ", " << fragment->GetSize () );
-
-      offset += size;
-      offsetData += size;
+      if (size > 0)
+        {
+          NS_LOG_LOGIC ("Fragment creation - " << offset << ", " << offset );
+          Ptr<Packet> fragment = p->CreateFragment (offsetData, size);
+          NS_LOG_LOGIC ("Fragment created - " << offset << ", " << fragment->GetSize () );
 
-      fragment->AddHeader (fragNHdr);
-      listFragments.push_back (fragment);
+          offset += size;
+          offsetData += size;
 
+          fragment->AddHeader (fragNHdr);
+          listFragments.push_back (fragment);
+        }
     }
   while (moreFrag);
 
@@ -2013,7 +2373,11 @@
           DecompressLowPanHc1 (p, src, dst);
           break;
         case SixLowPanDispatch::LOWPAN_IPHC:
-          DecompressLowPanIphc (p, src, dst);
+          if (DecompressLowPanIphc (p, src, dst))
+            {
+              m_dropTrace (DROP_SATETFUL_DECOMPRESSION_PROBLEM, p, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+              return false;
+            }
           break;
         default:
           NS_FATAL_ERROR ("Unsupported 6LoWPAN encoding, exiting.");
@@ -2294,6 +2658,205 @@
   return;
 }
 
+void SixLowPanNetDevice::AddContext (uint8_t contextId, Ipv6Prefix contextPrefix, bool compressionAllowed, Time validLifetime)
+{
+  NS_LOG_FUNCTION (this << +contextId << Ipv6Address::GetOnes ().CombinePrefix (contextPrefix) << contextPrefix << compressionAllowed << validLifetime.As (Time::S));
+
+  if (contextId > 15)
+    {
+      NS_LOG_LOGIC ("Invalid context ID (" << +contextId << "), ignoring");
+      return;
+    }
+
+  if (validLifetime == Time(0))
+    {
+      NS_LOG_LOGIC ("Context (" << +contextId << "), removed (validity time is zero)");
+      m_contextTable.erase (contextId);
+      return;
+    }
+
+  m_contextTable[contextId].contextPrefix = contextPrefix;
+  m_contextTable[contextId].compressionAllowed = compressionAllowed;
+  m_contextTable[contextId].validLifetime = Simulator::Now () + validLifetime;
+
+  return;
+}
+
+bool SixLowPanNetDevice::GetContext (uint8_t contextId, Ipv6Prefix& contextPrefix, bool& compressionAllowed, Time& validLifetime)
+{
+  NS_LOG_FUNCTION (this << +contextId);
+
+  if (contextId > 15)
+    {
+      NS_LOG_LOGIC ("Invalid context ID (" << +contextId << "), ignoring");
+      return false;
+    }
+
+  if (m_contextTable.find (contextId) == m_contextTable.end ())
+    {
+      NS_LOG_LOGIC ("Context not found (" << +contextId << "), ignoring");
+      return false;
+    }
+
+  contextPrefix = m_contextTable[contextId].contextPrefix;
+  compressionAllowed = m_contextTable[contextId].compressionAllowed;
+  validLifetime = m_contextTable[contextId].validLifetime;
+
+  return true;
+}
+
+void SixLowPanNetDevice::RenewContext (uint8_t contextId, Time validLifetime)
+{
+  NS_LOG_FUNCTION (this << +contextId << validLifetime.As (Time::S));
+
+  if (contextId > 15)
+    {
+      NS_LOG_LOGIC ("Invalid context ID (" << +contextId << "), ignoring");
+      return;
+    }
+
+  if (m_contextTable.find (contextId) == m_contextTable.end ())
+    {
+      NS_LOG_LOGIC ("Context not found (" << +contextId << "), ignoring");
+      return;
+    }
+  m_contextTable[contextId].compressionAllowed = true;
+  m_contextTable[contextId].validLifetime = Simulator::Now () + validLifetime;
+  return;
+}
+
+
+void SixLowPanNetDevice::InvalidateContext (uint8_t contextId)
+{
+  NS_LOG_FUNCTION (this << +contextId);
+
+  if (contextId > 15)
+    {
+      NS_LOG_LOGIC ("Invalid context ID (" << +contextId << "), ignoring");
+      return;
+    }
+
+  if (m_contextTable.find (contextId) == m_contextTable.end ())
+    {
+      NS_LOG_LOGIC ("Context not found (" << +contextId << "), ignoring");
+      return;
+    }
+  m_contextTable[contextId].compressionAllowed = false;
+  return;
+}
+
+void SixLowPanNetDevice::RemoveContext (uint8_t contextId)
+{
+  NS_LOG_FUNCTION (this << +contextId);
+
+  if (contextId > 15)
+    {
+      NS_LOG_LOGIC ("Invalid context ID (" << +contextId << "), ignoring");
+      return;
+    }
+
+  if (m_contextTable.find (contextId) == m_contextTable.end ())
+    {
+      NS_LOG_LOGIC ("Context not found (" << +contextId << "), ignoring");
+      return;
+    }
+
+  m_contextTable.erase (contextId);
+  return;
+}
+
+bool SixLowPanNetDevice::FindUnicastCompressionContext (Ipv6Address address, uint8_t& contextId)
+{
+  NS_LOG_FUNCTION (this << address);
+
+  for (const auto& iter: m_contextTable)
+    {
+      ContextEntry context = iter.second;
+
+      if ( (context.compressionAllowed == true) && (context.validLifetime > Simulator::Now ()) )
+        {
+
+          if (address.HasPrefix (context.contextPrefix))
+            {
+              NS_LOG_LOGIC ("Fount context " << +contextId << " " <<
+                            Ipv6Address::GetOnes ().CombinePrefix (context.contextPrefix) << context.contextPrefix << " matching");
+
+              contextId = iter.first;
+              return true;
+            }
+        }
+    }
+  return false;
+}
+
+bool SixLowPanNetDevice::FindMulticastCompressionContext (Ipv6Address address, uint8_t& contextId)
+{
+  NS_LOG_FUNCTION (this << address);
+
+  // The only allowed context-based compressed multicast address is in the form
+  // ffXX:XXLL:PPPP:PPPP:PPPP:PPPP:XXXX:XXXX
+
+  for (const auto& iter: m_contextTable)
+    {
+      ContextEntry context = iter.second;
+
+      if ( (context.compressionAllowed == true) && (context.validLifetime > Simulator::Now ()) )
+        {
+          uint8_t contextLength = context.contextPrefix.GetPrefixLength ();
+
+          if (contextLength <= 64) // only 64-bit prefixes or less are allowed.
+            {
+              uint8_t contextBytes[16];
+              uint8_t addressBytes[16];
+
+              context.contextPrefix.GetBytes (contextBytes);
+              address.GetBytes (addressBytes);
+
+              if (addressBytes[3] == contextLength &&
+                  addressBytes[4] == contextBytes[0] &&
+                  addressBytes[5] == contextBytes[1] &&
+                  addressBytes[6] == contextBytes[2] &&
+                  addressBytes[7] == contextBytes[3] &&
+                  addressBytes[8] == contextBytes[4] &&
+                  addressBytes[9] == contextBytes[5] &&
+                  addressBytes[10] == contextBytes[6] &&
+                  addressBytes[11] == contextBytes[7])
+                {
+                  NS_LOG_LOGIC ("Fount context " << +contextId << " " <<
+                                Ipv6Address::GetOnes ().CombinePrefix (context.contextPrefix) << context.contextPrefix << " matching");
+
+                  contextId = iter.first;
+                  return true;
+                }
+            }
+        }
+    }
+  return false;
+}
+
+Ipv6Address SixLowPanNetDevice::CleanPrefix (Ipv6Address address, Ipv6Prefix prefix)
+{
+  uint8_t addressBytes[16];
+  address.GetBytes (addressBytes);
+  uint8_t prefixLength = prefix.GetPrefixLength ();
+
+  uint8_t bytesToClean = prefixLength / 8;
+  uint8_t bitsToClean = prefixLength % 8;
+  for (uint8_t i=0; i<bytesToClean; i++)
+    {
+      addressBytes[i] = 0;
+    }
+  if (bitsToClean)
+    {
+      uint8_t cleanupMask = (1<<bitsToClean)-1;
+      addressBytes[bytesToClean] &= cleanupMask;
+    }
+
+  Ipv6Address cleanedAddress = Ipv6Address::Deserialize (addressBytes);
+
+  return cleanedAddress;
+}
+
 }
 
 // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/sixlowpan/model/sixlowpan-net-device.h ns-3.34/src/sixlowpan/model/sixlowpan-net-device.h
--- ns-3.33/src/sixlowpan/model/sixlowpan-net-device.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/sixlowpan/model/sixlowpan-net-device.h	2021-07-14 10:31:07.000000000 -0700
@@ -70,10 +70,11 @@
    */
   enum DropReason
   {
-    DROP_FRAGMENT_TIMEOUT = 1,   /**< Fragment timeout exceeded */
-    DROP_FRAGMENT_BUFFER_FULL,   /**< Fragment buffer size exceeded */
-    DROP_UNKNOWN_EXTENSION,      /**< Unsupported compression kind */
-    DROP_DISALLOWED_COMPRESSION  /**< HC1 while in IPHC mode or viceversa */
+    DROP_FRAGMENT_TIMEOUT = 1,    /**< Fragment timeout exceeded */
+    DROP_FRAGMENT_BUFFER_FULL,    /**< Fragment buffer size exceeded */
+    DROP_UNKNOWN_EXTENSION,       /**< Unsupported compression kind */
+    DROP_DISALLOWED_COMPRESSION,  /**< HC1 while in IPHC mode or viceversa */
+    DROP_SATETFUL_DECOMPRESSION_PROBLEM, /**< Decompression failed due to missing or expired context */
   };
 
   /**
@@ -162,7 +163,7 @@
                                       uint32_t ifindex);
 
   /**
-   * TracedCallback signature for
+   * TracedCallback signature fo packet drop events
    *
    * \param [in] reason The reason for the drop.
    * \param [in] packet The packet.
@@ -177,6 +178,58 @@
                                       Ptr<SixLowPanNetDevice> sixNetDevice,
                                       uint32_t ifindex);
 
+  /**
+   * Add, remove, or update a context used in IPHC stateful compression.
+   *
+   * A context with a zero validLifetime will be immediately removed.
+   *
+   * \param [in] contextId context id (most be between 0 and 15 included).
+   * \param [in] contextPrefix context prefix to be used in compression/decompression.
+   * \param [in] compressionAllowed compression and decompression allowed (true), decompression only (false).
+   * \param [in] validLifetime validity time (relative to the actual time).
+   *
+   */
+  void AddContext (uint8_t contextId, Ipv6Prefix contextPrefix, bool compressionAllowed, Time validLifetime);
+
+  /**
+   * Get a context used in IPHC stateful compression.
+   *
+   * \param [in] contextId context id (most be between 0 and 15 included).
+   * \param [out] contextPrefix context prefix to be used in compression/decompression.
+   * \param [out] compressionAllowed compression and decompression allowed (true), decompression only (false).
+   * \param [out] validLifetime validity time (relative to the actual time).
+   *
+   * \return false if the context has not been found.
+   *
+   */
+  bool GetContext (uint8_t contextId, Ipv6Prefix& contextPrefix, bool& compressionAllowed, Time& validLifetime);
+
+  /**
+   * Renew a context used in IPHC stateful compression.
+   *
+   * The context will have its lifetime extended and its validity for compression re-enabled.
+   *
+   * \param [in] contextId context id (most be between 0 and 15 included).
+   * \param [in] validLifetime validity time (relative to the actual time).
+   */
+  void RenewContext (uint8_t contextId, Time validLifetime);
+
+  /**
+   * Invalidate a context used in IPHC stateful compression.
+   *
+   * An invalid context will not be used for compression but it will be used for decompression.
+   *
+   * \param [in] contextId context id (most be between 0 and 15 included).
+   */
+  void InvalidateContext (uint8_t contextId);
+
+  /**
+   * Remove a context used in IPHC stateful compression.
+   *
+   * \param [in] contextId context id (most be between 0 and 15 included).
+   */
+  void RemoveContext (uint8_t contextId);
+
 protected:
   virtual void DoDispose (void);
 
@@ -202,7 +255,6 @@
    * \param [in] source The source address.
    * \param [in] destination The destination address.
    * \param [in] packetType The packet kind (e.g., HOST, BROADCAST, etc.).
-   * \return The IPv6 link-local address.
    */
   void ReceiveFromDevice (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol,
                           Address const &source, Address const &destination, PacketType packetType);
@@ -312,8 +364,9 @@
    * \param [in] packet The packet to be compressed.
    * \param [in] src The MAC source address.
    * \param [in] dst The MAC destination address.
+   * \return true if the packet can not be decompressed due to wrong context informations.
    */
-  void DecompressLowPanIphc (Ptr<Packet> packet, Address const &src, Address const &dst);
+  bool DecompressLowPanIphc (Ptr<Packet> packet, Address const &src, Address const &dst);
 
   /**
    * \brief Compress the headers according to NHC compression.
@@ -332,9 +385,9 @@
    * \param [in] dst The MAC destination address.
    * \param [in] srcAddress The IPv6 source address.
    * \param [in] dstAddress The IPv6 destination address.
-   * \return The decompressed header type.
+   * \return A std::pair containing the decompressed header type and a flag - true if the packet can not be decompressed due to wrong context informations.
    */
-  uint8_t DecompressLowPanNhc (Ptr<Packet> packet, Address const &src, Address const &dst, Ipv6Address srcAddress, Ipv6Address dstAddress);
+  std::pair<uint8_t, bool> DecompressLowPanNhc (Ptr<Packet> packet, Address const &src, Address const &dst, Ipv6Address srcAddress, Ipv6Address dstAddress);
 
   /**
    * \brief Compress the headers according to NHC compression.
@@ -472,9 +525,10 @@
    * \param [in] packet the packet to be fragmented (with headers already compressed with 6LoWPAN).
    * \param [in] origPacketSize the size of the IP packet before the 6LoWPAN header compression, including the IP/L4 headers.
    * \param [in] origHdrSize the size of the IP header before the 6LoWPAN header compression.
+   * \param [in] extraHdrSize the sum of the sizes of BC0 header and MESH header if mesh routing is used or 0.
    * \param [out] listFragments A reference to the list of the resulting packets, all with the proper headers in place.
    */
-  void DoFragmentation (Ptr<Packet> packet, uint32_t origPacketSize, uint32_t origHdrSize,
+  void DoFragmentation (Ptr<Packet> packet, uint32_t origPacketSize, uint32_t origHdrSize, uint32_t extraHdrSize,
                         std::list<Ptr<Packet> >& listFragments);
 
   /**
@@ -549,6 +603,48 @@
   uint32_t m_compressionThreshold; //!< Minimum L2 payload size.
 
   Ptr<UniformRandomVariable> m_rng; //!< Rng for the fragments tag.
+
+  /**
+   * Structure holding the informations for a context (used in compression and decompression)
+   */
+  struct ContextEntry
+  {
+    Ipv6Prefix contextPrefix;    //!< context prefix to be used in compression/decompression
+    bool compressionAllowed;     //!< compression and decompression allowed (true), decompression only (false)
+    Time validLifetime;          //!< validity period
+  };
+
+  std::map<uint8_t, ContextEntry> m_contextTable; //!< Table of the contexts used in compression/decompression
+
+  /**
+   * \brief Finds if the given unicast address matches a context for compression
+   *
+   * \param[in] address the address to check
+   * \param[out] contextId the context found
+   * \return true if a valid context has been found
+   */
+  bool FindUnicastCompressionContext (Ipv6Address address, uint8_t& contextId);
+
+  /**
+   * \brief Finds if the given multicast address matches a context for compression
+   *
+   * \param[in] address the address to check
+   * \param[out] contextId the context found
+   * \return true if a valid context has been found
+   */
+  bool FindMulticastCompressionContext (Ipv6Address address, uint8_t& contextId);
+
+  /**
+   * \brief Clean an address from its prefix.
+   *
+   * This function is used to find the relevant bits to be sent in stateful IPHC compression.
+   * Only the pefix length is used - the address prefix is assumed to be matching the prefix.
+   *
+   * \param address the address to be cleaned
+   * \param prefix the prefix to remove
+   * \return An address with the prefix zeroed.
+   */
+  Ipv6Address CleanPrefix (Ipv6Address address, Ipv6Prefix prefix);
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/sixlowpan/test/mock-net-device.cc ns-3.34/src/sixlowpan/test/mock-net-device.cc
--- ns-3.33/src/sixlowpan/test/mock-net-device.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/sixlowpan/test/mock-net-device.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,348 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+#include "mock-net-device.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/log.h"
+#include "ns3/pointer.h"
+#include "ns3/trace-source-accessor.h"
+#include "ns3/boolean.h"
+#include "ns3/simulator.h"
+#include "ns3/channel.h"
+#include "ns3/mac64-address.h"
+#include "ns3/mac48-address.h"
+#include "ns3/mac16-address.h"
+#include "ns3/mac8-address.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("MockNetDevice");
+NS_OBJECT_ENSURE_REGISTERED (MockNetDevice);
+
+TypeId
+MockNetDevice::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::MockNetDevice")
+    .SetParent<NetDevice> ()
+    .SetGroupName("Network")
+    .AddConstructor<MockNetDevice> ()
+    .AddAttribute ("PointToPointMode",
+                   "The device is configured in Point to Point mode",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&MockNetDevice::m_pointToPointMode),
+                   MakeBooleanChecker ())
+  ;
+  return tid;
+}
+
+MockNetDevice::MockNetDevice ()
+  : m_node (0),
+    m_mtu (0xffff),
+    m_ifIndex (0),
+    m_linkUp (true)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+MockNetDevice::Receive (Ptr<Packet> packet, uint16_t protocol,
+                          Address to, Address from, NetDevice::PacketType packetType)
+{
+  NS_LOG_FUNCTION (this << packet << protocol << to << from);
+
+  if (packetType != NetDevice::PACKET_OTHERHOST)
+    {
+      m_rxCallback (this, packet, protocol, from);
+    }
+
+  if (!m_promiscCallback.IsNull ())
+    {
+      m_promiscCallback (this, packet, protocol, from, to, packetType);
+    }
+}
+
+void
+MockNetDevice::SetIfIndex (const uint32_t index)
+{
+  NS_LOG_FUNCTION (this << index);
+  m_ifIndex = index;
+}
+
+uint32_t
+MockNetDevice::GetIfIndex (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_ifIndex;
+}
+
+Ptr<Channel>
+MockNetDevice::GetChannel (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return 0;
+}
+
+void
+MockNetDevice::SetAddress (Address address)
+{
+  NS_LOG_FUNCTION (this << address);
+  m_address = address;
+}
+
+Address
+MockNetDevice::GetAddress (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_address;
+}
+
+bool
+MockNetDevice::SetMtu (const uint16_t mtu)
+{
+  NS_LOG_FUNCTION (this << mtu);
+  m_mtu = mtu;
+  return true;
+}
+
+uint16_t
+MockNetDevice::GetMtu (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_mtu;
+}
+
+bool
+MockNetDevice::IsLinkUp (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_linkUp;
+}
+
+void
+MockNetDevice::AddLinkChangeCallback (Callback<void> callback)
+{
+  NS_LOG_FUNCTION (this << &callback);
+  m_linkChangeCallbacks.ConnectWithoutContext (callback);
+}
+
+bool
+MockNetDevice::IsBroadcast (void) const
+{
+  NS_LOG_FUNCTION (this);
+  if (m_pointToPointMode)
+    {
+      return false;
+    }
+  if (Mac64Address::IsMatchingType (m_address))
+    {
+      return false;
+    }
+  if (Mac8Address::IsMatchingType (m_address))
+    {
+      return false;
+    }
+
+  return true;
+}
+
+Address
+MockNetDevice::GetBroadcast (void) const
+{
+  NS_LOG_FUNCTION (this);
+
+  Address address;
+
+  if (Mac48Address::IsMatchingType (m_address))
+    {
+      address = Mac48Address::GetBroadcast ();
+    }
+  else if (Mac16Address::IsMatchingType (m_address))
+    {
+      address = Mac16Address::GetBroadcast ();
+    }
+
+  return address;
+}
+
+bool
+MockNetDevice::IsMulticast (void) const
+{
+  NS_LOG_FUNCTION (this);
+  if (m_pointToPointMode)
+    {
+      return false;
+    }
+  if (Mac64Address::IsMatchingType (m_address))
+    {
+      return false;
+    }
+  if (Mac8Address::IsMatchingType (m_address))
+    {
+      return false;
+    }
+
+  return true;
+}
+
+Address
+MockNetDevice::GetMulticast (Ipv4Address multicastGroup) const
+{
+  NS_LOG_FUNCTION (this << multicastGroup);
+
+  Address address;
+
+  if (Mac48Address::IsMatchingType (m_address))
+    {
+      address = Mac48Address::GetMulticast (multicastGroup);
+    }
+  else if (Mac16Address::IsMatchingType (m_address))
+    {
+      address = Mac16Address::GetMulticast (Ipv6Address::MakeIpv4MappedAddress (multicastGroup));
+    }
+
+  return address;
+}
+
+Address MockNetDevice::GetMulticast (Ipv6Address addr) const
+{
+  NS_LOG_FUNCTION (this << addr);
+  Address address;
+
+  if (Mac48Address::IsMatchingType (m_address))
+    {
+      address = Mac48Address::GetMulticast (addr);
+    }
+  else if (Mac16Address::IsMatchingType (m_address))
+    {
+      address = Mac16Address::GetMulticast (addr);
+    }
+
+  return address;
+}
+
+bool
+MockNetDevice::IsPointToPoint (void) const
+{
+  NS_LOG_FUNCTION (this);
+  if (m_pointToPointMode)
+    {
+      return true;
+    }
+  return false;
+}
+
+bool
+MockNetDevice::IsBridge (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return false;
+}
+
+bool
+MockNetDevice::Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber)
+{
+  NS_LOG_FUNCTION (this << packet << dest << protocolNumber);
+
+  return SendFrom (packet, m_address, dest, protocolNumber);
+}
+
+bool
+MockNetDevice::SendFrom (Ptr<Packet> p, const Address& source, const Address& dest, uint16_t protocolNumber)
+{
+  NS_LOG_FUNCTION (this << p << source << dest << protocolNumber);
+  if (p->GetSize () > GetMtu ())
+    {
+      return false;
+    }
+
+  if (!m_sendCallback.IsNull ())
+    {
+      m_sendCallback (this, p, protocolNumber, source, dest, NetDevice::PACKET_HOST);
+    }
+
+  return true;
+}
+
+
+Ptr<Node>
+MockNetDevice::GetNode (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_node;
+}
+void
+MockNetDevice::SetNode (Ptr<Node> node)
+{
+  NS_LOG_FUNCTION (this << node);
+  m_node = node;
+}
+
+bool
+MockNetDevice::NeedsArp (void) const
+{
+  NS_LOG_FUNCTION (this);
+  if (m_pointToPointMode)
+    {
+      return false;
+    }
+  return true;
+}
+
+void
+MockNetDevice::SetReceiveCallback (NetDevice::ReceiveCallback cb)
+{
+  NS_LOG_FUNCTION (this << &cb);
+  m_rxCallback = cb;
+}
+
+void
+MockNetDevice::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_node = 0;
+  m_rxCallback.Nullify ();
+  m_promiscCallback.Nullify ();
+  m_sendCallback.Nullify ();
+  NetDevice::DoDispose ();
+}
+
+void
+MockNetDevice::SetPromiscReceiveCallback (PromiscReceiveCallback cb)
+{
+  NS_LOG_FUNCTION (this << &cb);
+  m_promiscCallback = cb;
+}
+
+bool
+MockNetDevice::SupportsSendFrom (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return true;
+}
+
+void
+MockNetDevice::SetSendCallback (PromiscReceiveCallback cb)
+{
+  NS_LOG_FUNCTION (this << &cb);
+  m_sendCallback = cb;
+}
+
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/sixlowpan/test/mock-net-device.h ns-3.34/src/sixlowpan/test/mock-net-device.h
--- ns-3.33/src/sixlowpan/test/mock-net-device.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/sixlowpan/test/mock-net-device.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,132 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+#ifndef MOCK_NET_DEVICE_H
+#define MOCK_NET_DEVICE_H
+
+#include <stdint.h>
+#include <string>
+
+#include "ns3/traced-callback.h"
+#include "ns3/net-device.h"
+
+namespace ns3 {
+
+class Node;
+
+/**
+ * \ingroup netdevice
+ *
+ * This device assumes 48-bit mac addressing; there is also the possibility to
+ * add an ErrorModel if you want to force losses on the device.
+ * 
+ * The device can be installed on a node through the MockNetDeviceHelper.
+ * In case of manual creation, the user is responsible for assigning an unique
+ * address to the device.
+ *
+ * By default the device is in Broadcast mode, with infinite bandwidth.
+ *
+ * \brief simple net device for simple things and testing
+ */
+class MockNetDevice : public NetDevice
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  MockNetDevice ();
+
+  /**
+   * Pretend that a packet has been received from a connected Channel.
+   *
+   * Note that no analysis is performed on the addresses, and the
+   * packet is forwarded to the callbacks according to the packetType.
+   *
+   * \param packet Packet received on the channel
+   * \param protocol protocol number
+   * \param to address packet should be sent to
+   * \param from address packet was sent from
+   * \param packetType type of the packet (e.g., NetDevice::PACKET_HOST, NetDevice::PACKET_OTHERHOST, etc.)
+   */
+  void Receive (Ptr<Packet> packet, uint16_t protocol, Address to, Address from, NetDevice::PacketType packetType);
+
+  // inherited from NetDevice base class.
+  virtual void SetIfIndex (const uint32_t index);
+  virtual uint32_t GetIfIndex (void) const;
+  virtual Ptr<Channel> GetChannel (void) const;
+  virtual void SetAddress (Address address);
+  virtual Address GetAddress (void) const;
+  virtual bool SetMtu (const uint16_t mtu);
+  virtual uint16_t GetMtu (void) const;
+  virtual bool IsLinkUp (void) const;
+  virtual void AddLinkChangeCallback (Callback<void> callback);
+  virtual bool IsBroadcast (void) const;
+  virtual Address GetBroadcast (void) const;
+  virtual bool IsMulticast (void) const;
+  virtual Address GetMulticast (Ipv4Address multicastGroup) const;
+  virtual Address GetMulticast (Ipv6Address addr) const;
+  virtual bool IsPointToPoint (void) const;
+  virtual bool IsBridge (void) const;
+  virtual bool Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber);
+  virtual bool SendFrom (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber);
+  virtual Ptr<Node> GetNode (void) const;
+  virtual void SetNode (Ptr<Node> node);
+  virtual bool NeedsArp (void) const;
+  virtual void SetReceiveCallback (NetDevice::ReceiveCallback cb);
+  virtual void SetPromiscReceiveCallback (PromiscReceiveCallback cb);
+  virtual bool SupportsSendFrom (void) const;
+
+  /**
+   *
+   * Add a callback to be invoked when the MockNetDevice has a packet to "send".
+   *
+   * In the callback the PacketType is always set to NetDevice::PACKET_HOST.
+   *
+   * \param cb callback to invoke whenever the MockNetDevice has one packet to "send".
+   *
+   */
+  void SetSendCallback (PromiscReceiveCallback cb);
+
+protected:
+  virtual void DoDispose (void);
+
+private:
+
+  NetDevice::ReceiveCallback m_rxCallback; //!< Receive callback
+  NetDevice::PromiscReceiveCallback m_promiscCallback; //!< Promiscuous receive callback
+  NetDevice::PromiscReceiveCallback m_sendCallback; //!< Send callback
+  Ptr<Node> m_node; //!< Node this netDevice is associated to
+  uint16_t m_mtu;   //!< MTU
+  uint32_t m_ifIndex; //!< Interface index
+  Address m_address; //!< MAC address
+
+  bool m_linkUp; //!< Flag indicating whether or not the link is up
+  bool m_pointToPointMode; //!< Enabling this will disable Broadcast and Arp.
+
+  /**
+   * List of callbacks to fire if the link changes state (up or down).
+   */
+  TracedCallback<> m_linkChangeCallbacks;
+};
+
+} // namespace ns3
+
+#endif /* MOCK_NET_DEVICE_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc ns-3.34/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc
--- ns-3.33/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,339 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#include "ns3/test.h"
+#include "ns3/socket-factory.h"
+#include "ns3/simulator.h"
+#include "ns3/socket.h"
+#include "ns3/boolean.h"
+
+#include "ns3/log.h"
+#include "ns3/node.h"
+#include "ns3/inet6-socket-address.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv6-address-helper.h"
+#include "ns3/icmpv6-l4-protocol.h"
+
+#include "ns3/sixlowpan-net-device.h"
+#include "ns3/sixlowpan-header.h"
+#include "ns3/sixlowpan-helper.h"
+#include "mock-net-device.h"
+
+#include <string>
+#include <limits>
+#include <vector>
+
+using namespace ns3;
+
+/**
+ * \ingroup sixlowpan
+ * \defgroup sixlowpan-test 6LoWPAN module tests
+ */
+
+
+/**
+ * \ingroup sixlowpan-test
+ * \ingroup tests
+ *
+ * \brief 6LoWPAN IPHC stateful compression Test
+ */
+class SixlowpanIphcStatefulImplTest : public TestCase
+{
+  /**
+   * \brief Structure to hold the Rx/Tx packets.
+   */
+  typedef struct
+  {
+    Ptr<Packet> packet;   /**< Packet data */
+    Address src;   /**< Source address */
+    Address dst;   /**< Destination address */
+  } Data;
+
+
+  std::vector<Data> m_txPackets; //!< Transmitted packets
+  std::vector<Data> m_rxPackets; //!< Received packets
+
+  /**
+   * Receive from a MockDevice.
+   * \param device a pointer to the net device which is calling this function
+   * \param packet the packet received
+   * \param protocol the 16 bit protocol number associated with this packet.
+   * \param source the address of the sender
+   * \param destination the address of the receiver
+   * \param packetType type of packet received (broadcast/multicast/unicast/otherhost)
+   * \returns true.
+   */
+  bool ReceiveFromMockDevice (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol,
+                              Address const &source, Address const &destination, NetDevice::PacketType packetType);
+
+  /**
+   * Promiscuous receive from a SixLowPanNetDevice.
+   * \param device a pointer to the net device which is calling this function
+   * \param packet the packet received
+   * \param protocol the 16 bit protocol number associated with this packet.
+   * \param source the address of the sender
+   * \param destination the address of the receiver
+   * \param packetType type of packet received (broadcast/multicast/unicast/otherhost)
+   * \returns true.
+   */
+  bool PromiscReceiveFromSixLowPanDevice (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol,
+                                          Address const &source, Address const &destination, NetDevice::PacketType packetType);
+
+  /**
+   * Send one packet.
+   * \param device the device to send from
+   * \param from sender address
+   * \param to destination address
+   */
+  void SendOnePacket (Ptr<NetDevice> device, Ipv6Address from, Ipv6Address to);
+
+  NetDeviceContainer m_mockDevices; //!< MockNetDevice container
+  NetDeviceContainer m_sixDevices; //!< SixLowPanNetDevice container
+
+public:
+  virtual void DoRun (void);
+  SixlowpanIphcStatefulImplTest ();
+};
+
+SixlowpanIphcStatefulImplTest::SixlowpanIphcStatefulImplTest ()
+  : TestCase ("Sixlowpan IPHC stateful implementation")
+{
+}
+
+bool
+SixlowpanIphcStatefulImplTest::ReceiveFromMockDevice (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol,
+                                                      Address const &source, Address const &destination, NetDevice::PacketType packetType)
+{
+  Data incomingPkt;
+  incomingPkt.packet = packet->Copy ();
+  incomingPkt.src = source;
+  incomingPkt.dst = destination;
+  m_txPackets.push_back (incomingPkt);
+
+  Ptr<MockNetDevice> mockDev = DynamicCast<MockNetDevice> (m_mockDevices.Get(1));
+  if (mockDev)
+    {
+      uint32_t id = mockDev->GetNode ()->GetId ();
+      Simulator::ScheduleWithContext (id, Time(1), &MockNetDevice::Receive, mockDev, incomingPkt.packet, protocol, destination, source, packetType);
+    }
+  return true;
+}
+
+bool
+SixlowpanIphcStatefulImplTest::PromiscReceiveFromSixLowPanDevice (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol,
+                                                                  Address const &source, Address const &destination, NetDevice::PacketType packetType)
+{
+  Data incomingPkt;
+  incomingPkt.packet = packet->Copy ();
+  incomingPkt.src = source;
+  incomingPkt.dst = destination;
+  m_rxPackets.push_back (incomingPkt);
+
+  return true;
+}
+
+void
+SixlowpanIphcStatefulImplTest::SendOnePacket (Ptr<NetDevice> device, Ipv6Address from, Ipv6Address to)
+{
+  Ptr<Packet> pkt = Create<Packet> (10);
+  Ipv6Header ipHdr;
+  ipHdr.SetSourceAddress (from);
+  ipHdr.SetDestinationAddress (to);
+  ipHdr.SetHopLimit (64);
+  ipHdr.SetPayloadLength (10);
+  ipHdr.SetNextHeader (0xff);
+  pkt->AddHeader (ipHdr);
+
+  device->Send (pkt, Mac48Address ("00:00:00:00:00:02"), 0);
+}
+
+void
+SixlowpanIphcStatefulImplTest::DoRun (void)
+{
+  NodeContainer nodes;
+  nodes.Create(2);
+
+  // First node, setup NetDevices.
+  Ptr<MockNetDevice> mockNetDevice0 = CreateObject<MockNetDevice> ();
+  nodes.Get (0)->AddDevice (mockNetDevice0);
+  mockNetDevice0->SetNode (nodes.Get (0));
+  mockNetDevice0->SetAddress (Mac48Address ("00:00:00:00:00:01"));
+  mockNetDevice0->SetMtu (150);
+  mockNetDevice0->SetSendCallback ( MakeCallback (&SixlowpanIphcStatefulImplTest::ReceiveFromMockDevice, this) );
+  m_mockDevices.Add (mockNetDevice0);
+
+  // Second node, setup NetDevices.
+  Ptr<MockNetDevice> mockNetDevice1 = CreateObject<MockNetDevice> ();
+  nodes.Get (1)->AddDevice (mockNetDevice1);
+  mockNetDevice1->SetNode (nodes.Get (1));
+  mockNetDevice1->SetAddress (Mac48Address ("00:00:00:00:00:02"));
+  mockNetDevice1->SetMtu (150);
+  m_mockDevices.Add (mockNetDevice1);
+
+  InternetStackHelper internetv6;
+  internetv6.Install (nodes);
+
+  SixLowPanHelper sixlowpan;
+  m_sixDevices = sixlowpan.Install (m_mockDevices);
+  m_sixDevices.Get (1)->SetPromiscReceiveCallback ( MakeCallback (&SixlowpanIphcStatefulImplTest::PromiscReceiveFromSixLowPanDevice, this) );
+
+  Ipv6AddressHelper ipv6;
+  ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
+  Ipv6InterfaceContainer deviceInterfaces;
+  deviceInterfaces = ipv6.Assign (m_sixDevices);
+
+  // This is a hack to prevent Router Solicitations and Duplicate Address Detection being sent.
+  for (auto i = nodes.Begin (); i != nodes.End (); i++)
+    {
+      Ptr<Node> node = *i;
+      Ptr<Ipv6L3Protocol> ipv6L3 = (*i)->GetObject<Ipv6L3Protocol> ();
+      if (ipv6L3)
+        {
+          ipv6L3->SetAttribute ("IpForward", BooleanValue (true));
+          ipv6L3->SetAttribute ("SendIcmpv6Redirect", BooleanValue (false));
+        }
+      Ptr<Icmpv6L4Protocol> icmpv6 = (*i)->GetObject<Icmpv6L4Protocol> ();
+      if (icmpv6)
+        {
+          icmpv6->SetAttribute ("DAD", BooleanValue (false));
+        }
+    }
+
+  sixlowpan.AddContext (m_sixDevices, 0, Ipv6Prefix ("2001:2::", 64), Time (Minutes (30)));
+  sixlowpan.AddContext (m_sixDevices, 1, Ipv6Prefix ("2001:1::", 64), Time (Minutes (30)));
+
+  Ipv6Address srcElided = deviceInterfaces.GetAddress (0, 1);
+  Ipv6Address dstElided = Ipv6Address::MakeAutoconfiguredAddress (Mac48Address ("00:00:00:00:00:02"), Ipv6Prefix ("2001:2::", 64));
+
+  Simulator::Schedule (Seconds (1), &SixlowpanIphcStatefulImplTest::SendOnePacket, this, m_sixDevices.Get (0),
+                       Ipv6Address::GetAny (),
+                       dstElided);
+
+  Simulator::Schedule (Seconds (2), &SixlowpanIphcStatefulImplTest::SendOnePacket, this, m_sixDevices.Get (0),
+                       Ipv6Address ("2001:2::f00d:f00d:cafe:cafe"),
+                       Ipv6Address ("2001:1::0000:00ff:fe00:cafe"));
+
+  Simulator::Schedule (Seconds (3), &SixlowpanIphcStatefulImplTest::SendOnePacket, this, m_sixDevices.Get (0),
+                       Ipv6Address ("2001:1::0000:00ff:fe00:cafe"),
+                       Ipv6Address ("2001:1::f00d:f00d:cafe:cafe"));
+
+  Simulator::Schedule (Seconds (4), &SixlowpanIphcStatefulImplTest::SendOnePacket, this, m_sixDevices.Get (0),
+                       srcElided,
+                       Ipv6Address ("2001:1::f00d:f00d:cafe:cafe"));
+
+  Simulator::Stop (Seconds (10));
+
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+  // ------ Now the tests ------------
+
+  SixLowPanIphc iphcHdr;
+  Ipv6Header ipv6Hdr;
+
+  // first packet sent, expected CID(0) SAC(1) SAM (0) M(0) DAC(1) DAM (3)
+  m_txPackets[0].packet->RemoveHeader (iphcHdr);
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetCid (), false, "CID should be false, is true");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetSac (), true, "SAC should be true, is false");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetSam (), SixLowPanIphc::HC_INLINE, "SAM should be HC_INLINE, it is not");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetM (), false, "M should be false, is true");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetDac (), true, "DAC should be true, is false");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetSrcContextId (), 0, "Src context should be 0, it is not");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetDstContextId (), 0, "Dst context should be 0, it is not");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetDam (), SixLowPanIphc::HC_COMPR_0, "DAM should be HC_COMPR_0, it is not");
+
+  // first packet received, expected :: -> dstElided
+  m_rxPackets[0].packet->RemoveHeader (ipv6Hdr);
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetSourceAddress (), Ipv6Address::GetAny (), "Src address wrongly rebuilt");
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetDestinationAddress (), dstElided, "Dst address wrongly rebuilt");
+
+  // second packet sent, expected CID(1) SAC(1) SAM (1) M(0) DAC(1) DAM (2)
+  m_txPackets[1].packet->RemoveHeader (iphcHdr);
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetCid (), true, "CID should be true, is false");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetSac (), true, "SAC should be true, is false");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetSam (), SixLowPanIphc::HC_COMPR_64, "SAM should be HC_COMPR_64, it is not");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetM (), false, "M should be false, is true");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetDac (), true, "DAC should be true, is false");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetSrcContextId (), 0, "Src context should be 0, it is not");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetDstContextId (), 1, "Dst context should be 1, it is not");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetDam (), SixLowPanIphc::HC_COMPR_16, "DAM should be HC_COMPR_16, it is not");
+
+  // second packet received, expected 2001:2::f00d:f00d:cafe:cafe -> 2001:1::0000:00ff:fe00:cafe
+  m_rxPackets[1].packet->RemoveHeader (ipv6Hdr);
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetSourceAddress (), Ipv6Address ("2001:2::f00d:f00d:cafe:cafe"), "Src address wrongly rebuilt");
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetDestinationAddress (), Ipv6Address ("2001:1::0000:00ff:fe00:cafe"), "Dst address wrongly rebuilt");
+
+  // third packet sent, expected CID(17) SAC(1) SAM (2) M(0) DAC(1) DAM (1)
+  m_txPackets[2].packet->RemoveHeader (iphcHdr);
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetCid (), true, "CID should be true, is false");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetSac (), true, "SAC should be true, is false");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetSam (), SixLowPanIphc::HC_COMPR_16, "SAM should be HC_COMPR_16, it is not");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetM (), false, "M should be false, is true");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetDac (), true, "DAC should be true, is false");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetSrcContextId (), 1, "Src context should be 1, it is not");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetDstContextId (), 1, "Dst context should be 1, it is not");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetDam (), SixLowPanIphc::HC_COMPR_64, "DAM should be HC_COMPR_64, it is not");
+
+  // third packet received, expected 2001:1::0000:00ff:fe00:cafe -> 2001:1::f00d:f00d:cafe:cafe
+  m_rxPackets[2].packet->RemoveHeader (ipv6Hdr);
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetSourceAddress (), Ipv6Address ("2001:1::0000:00ff:fe00:cafe"), "Src address wrongly rebuilt");
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetDestinationAddress (), Ipv6Address ("2001:1::f00d:f00d:cafe:cafe"), "Dst address wrongly rebuilt");
+
+  // fourth packet sent, expected CID(1) SAC(1) SAM (3) M(0) DAC(1) DAM (1)
+  m_txPackets[3].packet->RemoveHeader (iphcHdr);
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetCid (), true, "CID should be true, is false");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetSac (), true, "SAC should be true, is false");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetSam (), SixLowPanIphc::HC_COMPR_0, "SAM should be HC_COMPR_0, it is not");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetM (), false, "M should be false, is true");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetDac (), true, "DAC should be true, is false");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetSrcContextId (), 0, "Src context should be 0, it is not");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetDstContextId (), 1, "Dst context should be 1, it is not");
+  NS_TEST_EXPECT_MSG_EQ (iphcHdr.GetDam (), SixLowPanIphc::HC_COMPR_64, "DAM should be HC_COMPR_64, it is not");
+
+  // fourth packet received, expected srcElided -> 2001:1::f00d:f00d:cafe:cafe
+  m_rxPackets[3].packet->RemoveHeader (ipv6Hdr);
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetSourceAddress (), srcElided, "Src address wrongly rebuilt");
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetDestinationAddress (), Ipv6Address ("2001:1::f00d:f00d:cafe:cafe"), "Dst address wrongly rebuilt");
+
+  m_rxPackets.clear ();
+  m_txPackets.clear ();
+}
+
+
+/**
+ * \ingroup sixlowpan-test
+ * \ingroup tests
+ *
+ * \brief 6LoWPAN IPHC TestSuite
+ */
+class SixlowpanIphcStatefulTestSuite : public TestSuite
+{
+public:
+  SixlowpanIphcStatefulTestSuite ();
+private:
+};
+
+SixlowpanIphcStatefulTestSuite::SixlowpanIphcStatefulTestSuite ()
+  : TestSuite ("sixlowpan-iphc-stateful", UNIT)
+{
+  AddTestCase (new SixlowpanIphcStatefulImplTest (), TestCase::QUICK);
+}
+
+static SixlowpanIphcStatefulTestSuite g_sixlowpanIphcStatefulTestSuite; //!< Static variable for test initialization
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/sixlowpan/wscript ns-3.34/src/sixlowpan/wscript
--- ns-3.33/src/sixlowpan/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/sixlowpan/wscript	2021-07-14 10:31:07.000000000 -0700
@@ -11,8 +11,10 @@
 
     module_test = bld.create_ns3_module_test_library('sixlowpan')
     module_test.source = [
+        'test/mock-net-device.cc',
         'test/sixlowpan-hc1-test.cc',
         'test/sixlowpan-iphc-test.cc',
+        'test/sixlowpan-iphc-stateful-test.cc',
         'test/sixlowpan-fragmentation-test.cc',
         ]
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/bindings/modulegen__gcc_ILP32.py ns-3.34/src/spectrum/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/spectrum/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -30,7 +30,7 @@
     module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
     ## adhoc-aloha-noack-ideal-phy-helper.h (module 'spectrum'): ns3::AdhocAlohaNoackIdealPhyHelper [class]
     module.add_class('AdhocAlohaNoackIdealPhyHelper')
-    ## angles.h (module 'antenna'): ns3::Angles [struct]
+    ## angles.h (module 'antenna'): ns3::Angles [class]
     module.add_class('Angles', import_from_module='ns.antenna')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
     module.add_class('AttributeConstructionList', import_from_module='ns.core')
@@ -95,12 +95,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -239,6 +243,11 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel [class]
+    module.add_class('PhasedArrayModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel [class]
     module.add_class('PropagationDelayModel', import_from_module='ns.propagation', parent=root_module['ns3::Object'])
     ## propagation-loss-model.h (module 'propagation'): ns3::PropagationLossModel [class]
@@ -304,11 +313,6 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::SpectrumValue > )', 'ns3::SpectrumValue::TracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::SpectrumValue > )*', 'ns3::SpectrumValue::TracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::SpectrumValue > )&', 'ns3::SpectrumValue::TracedCallback&')
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel [class]
-    module.add_class('ThreeGppAntennaArrayModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::ThreeGppAntennaArrayModel::ComplexVector')
-    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::ThreeGppAntennaArrayModel::ComplexVector*')
-    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::ThreeGppAntennaArrayModel::ComplexVector&')
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::ThreeGppSpectrumPropagationLossModel [class]
     module.add_class('ThreeGppSpectrumPropagationLossModel', parent=root_module['ns3::SpectrumPropagationLossModel'])
     ## propagation-loss-model.h (module 'propagation'): ns3::ThreeLogDistancePropagationLossModel [class]
@@ -651,13 +655,14 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::SpectrumPhy > >', 'ns3::SingleModelSpectrumChannel::PhyList')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::SpectrumPhy > >*', 'ns3::SingleModelSpectrumChannel::PhyList*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::SpectrumPhy > >&', 'ns3::SingleModelSpectrumChannel::PhyList&')
+    module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ptr< ns3::SpectrumPhy > >', 'ns3::Ptr< ns3::SpectrumPhy >', container_type='vector')
     module.add_container('ns3::SpectrumConverterMap_t', ('unsigned int', 'ns3::SpectrumConverter'), container_type='map')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
-    module.add_container('std::vector< double >', 'double', container_type='vector')
-    module.add_container('ns3::Bands', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
+    module.add_container('ns3::PhasedArrayModel::ComplexVector', 'std::complex< double >', container_type='vector')
+    module.add_container('ns3::Bands', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::vector< std::vector< double > >', 'std::vector< double >', container_type='vector')
     module.add_container('std::vector< std::vector< std::vector< double > > >', 'std::vector< std::vector< double > >', container_type='vector')
     module.add_container('std::vector< std::vector< std::complex< double > > >', 'std::vector< std::complex< double > >', container_type='vector')
@@ -878,8 +883,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac16Address_methods(root_module, root_module['ns3::Mac16Address'])
@@ -929,6 +936,7 @@
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
+    register_Ns3PhasedArrayModel_methods(root_module, root_module['ns3::PhasedArrayModel'])
     register_Ns3PropagationDelayModel_methods(root_module, root_module['ns3::PropagationDelayModel'])
     register_Ns3PropagationLossModel_methods(root_module, root_module['ns3::PropagationLossModel'])
     register_Ns3QueueBase_methods(root_module, root_module['ns3::QueueBase'])
@@ -960,7 +968,6 @@
     register_Ns3SpectrumPropagationLossModel_methods(root_module, root_module['ns3::SpectrumPropagationLossModel'])
     register_Ns3SpectrumSignalParameters_methods(root_module, root_module['ns3::SpectrumSignalParameters'])
     register_Ns3SpectrumValue_methods(root_module, root_module['ns3::SpectrumValue'])
-    register_Ns3ThreeGppAntennaArrayModel_methods(root_module, root_module['ns3::ThreeGppAntennaArrayModel'])
     register_Ns3ThreeGppSpectrumPropagationLossModel_methods(root_module, root_module['ns3::ThreeGppSpectrumPropagationLossModel'])
     register_Ns3ThreeLogDistancePropagationLossModel_methods(root_module, root_module['ns3::ThreeLogDistancePropagationLossModel'])
     register_Ns3TraceFadingLossModel_methods(root_module, root_module['ns3::TraceFadingLossModel'])
@@ -1218,18 +1225,32 @@
     cls.add_output_stream_operator()
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Angles const & arg0) [constructor]
     cls.add_constructor([param('ns3::Angles const &', 'arg0')])
-    ## angles.h (module 'antenna'): ns3::Angles::Angles() [constructor]
-    cls.add_constructor([])
-    ## angles.h (module 'antenna'): ns3::Angles::Angles(double phi, double theta) [constructor]
-    cls.add_constructor([param('double', 'phi'), param('double', 'theta')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(double azimuth, double inclination) [constructor]
+    cls.add_constructor([param('double', 'azimuth'), param('double', 'inclination')])
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v) [constructor]
     cls.add_constructor([param('ns3::Vector', 'v')])
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v, ns3::Vector o) [constructor]
     cls.add_constructor([param('ns3::Vector', 'v'), param('ns3::Vector', 'o')])
-    ## angles.h (module 'antenna'): ns3::Angles::phi [variable]
-    cls.add_instance_attribute('phi', 'double', is_const=False)
-    ## angles.h (module 'antenna'): ns3::Angles::theta [variable]
-    cls.add_instance_attribute('theta', 'double', is_const=False)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetAzimuth() const [member function]
+    cls.add_method('GetAzimuth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetInclination() const [member function]
+    cls.add_method('GetInclination', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): void ns3::Angles::SetAzimuth(double azimuth) [member function]
+    cls.add_method('SetAzimuth', 
+                   'void', 
+                   [param('double', 'azimuth')])
+    ## angles.h (module 'antenna'): void ns3::Angles::SetInclination(double inclination) [member function]
+    cls.add_method('SetInclination', 
+                   'void', 
+                   [param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::m_printDeg [variable]
+    cls.add_static_attribute('m_printDeg', 'bool', is_const=False)
     return
 
 def register_Ns3AttributeConstructionList_methods(root_module, cls):
@@ -1667,6 +1688,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2067,6 +2096,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2280,6 +2321,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2355,6 +2401,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2375,6 +2433,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4093,6 +4156,11 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeMuOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, ns3::WifiSpectrumBand ru) [member function]
+    cls.add_method('CreateHeMuOfdmTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('uint32_t', 'centerFrequency'), param('uint16_t', 'channelWidth'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'ru')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40) [member function]
     cls.add_method('CreateHeOfdmTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
@@ -4371,6 +4439,66 @@
                    [])
     return
 
+def register_Ns3PhasedArrayModel_methods(root_module, cls):
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel(ns3::PhasedArrayModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArrayModel const &', 'arg0')])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-model.h (module 'antenna'): ns3::Ptr<const ns3::AntennaModel> ns3::PhasedArrayModel::GetAntennaElement() const [member function]
+    cls.add_method('GetAntennaElement', 
+                   'ns3::Ptr< ns3::AntennaModel const >', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector() const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector(ns3::Angles a) const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): std::pair<double, double> ns3::PhasedArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
+    cls.add_method('GetElementFieldPattern', 
+                   'std::pair< double, double >', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::Vector ns3::PhasedArrayModel::GetElementLocation(uint64_t index) const [member function]
+    cls.add_method('GetElementLocation', 
+                   'ns3::Vector', 
+                   [param('uint64_t', 'index')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
+    cls.add_method('GetNumberOfElements', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetSteeringVector(ns3::Angles a) const [member function]
+    cls.add_method('GetSteeringVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): static ns3::TypeId ns3::PhasedArrayModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetAntennaElement(ns3::Ptr<ns3::AntennaModel> antennaElement) [member function]
+    cls.add_method('SetAntennaElement', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::AntennaModel >', 'antennaElement')])
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetBeamformingVector(ns3::PhasedArrayModel::ComplexVector const & beamformingVector) [member function]
+    cls.add_method('SetBeamformingVector', 
+                   'void', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'beamformingVector')])
+    ## phased-array-model.h (module 'antenna'): static double ns3::PhasedArrayModel::ComputeNorm(ns3::PhasedArrayModel::ComplexVector const & vector) [member function]
+    cls.add_method('ComputeNorm', 
+                   'double', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'vector')], 
+                   is_static=True, visibility='protected')
+    return
+
 def register_Ns3PropagationDelayModel_methods(root_module, cls):
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel::PropagationDelayModel() [constructor]
     cls.add_constructor([])
@@ -4914,11 +5042,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
     cls.add_method('SetChannel', 
                    'void', 
@@ -4929,11 +5057,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -5072,60 +5200,15 @@
                    [])
     return
 
-def register_Ns3ThreeGppAntennaArrayModel_methods(root_module, cls):
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel::ThreeGppAntennaArrayModel(ns3::ThreeGppAntennaArrayModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ThreeGppAntennaArrayModel const &', 'arg0')])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel::ThreeGppAntennaArrayModel() [constructor]
-    cls.add_constructor([])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): void ns3::ThreeGppAntennaArrayModel::ChangeToOmniTx() [member function]
-    cls.add_method('ChangeToOmniTx', 
-                   'void', 
-                   [])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel::ComplexVector const & ns3::ThreeGppAntennaArrayModel::GetBeamformingVector() const [member function]
-    cls.add_method('GetBeamformingVector', 
-                   'ns3::ThreeGppAntennaArrayModel::ComplexVector const &', 
-                   [], 
-                   is_const=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): std::pair<double, double> ns3::ThreeGppAntennaArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
-    cls.add_method('GetElementFieldPattern', 
-                   'std::pair< double, double >', 
-                   [param('ns3::Angles', 'a')], 
-                   is_const=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::Vector ns3::ThreeGppAntennaArrayModel::GetElementLocation(uint64_t index) const [member function]
-    cls.add_method('GetElementLocation', 
-                   'ns3::Vector', 
-                   [param('uint64_t', 'index')], 
-                   is_const=True, is_virtual=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): uint64_t ns3::ThreeGppAntennaArrayModel::GetNumberOfElements() const [member function]
-    cls.add_method('GetNumberOfElements', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): static ns3::TypeId ns3::ThreeGppAntennaArrayModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): bool ns3::ThreeGppAntennaArrayModel::IsOmniTx() const [member function]
-    cls.add_method('IsOmniTx', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): void ns3::ThreeGppAntennaArrayModel::SetBeamformingVector(ns3::ThreeGppAntennaArrayModel::ComplexVector const & beamformingVector) [member function]
-    cls.add_method('SetBeamformingVector', 
-                   'void', 
-                   [param('ns3::ThreeGppAntennaArrayModel::ComplexVector const &', 'beamformingVector')])
-    return
-
 def register_Ns3ThreeGppSpectrumPropagationLossModel_methods(root_module, cls):
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::ThreeGppSpectrumPropagationLossModel::ThreeGppSpectrumPropagationLossModel(ns3::ThreeGppSpectrumPropagationLossModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::ThreeGppSpectrumPropagationLossModel const &', 'arg0')])
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::ThreeGppSpectrumPropagationLossModel::ThreeGppSpectrumPropagationLossModel() [constructor]
     cls.add_constructor([])
-    ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::ThreeGppSpectrumPropagationLossModel::AddDevice(ns3::Ptr<ns3::NetDevice> n, ns3::Ptr<const ns3::ThreeGppAntennaArrayModel> a) [member function]
+    ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::ThreeGppSpectrumPropagationLossModel::AddDevice(ns3::Ptr<ns3::NetDevice> n, ns3::Ptr<const ns3::PhasedArrayModel> a) [member function]
     cls.add_method('AddDevice', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'n'), param('ns3::Ptr< ns3::ThreeGppAntennaArrayModel const >', 'a')])
+                   [param('ns3::Ptr< ns3::NetDevice >', 'n'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'a')])
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::ThreeGppSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
@@ -5338,11 +5421,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::TvSpectrumTransmitter::GetMobility() [member function]
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::TvSpectrumTransmitter::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::TvSpectrumTransmitter::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -5353,11 +5436,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::TvSpectrumTransmitter::GetRxAntenna() [member function]
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::TvSpectrumTransmitter::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -5507,11 +5590,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::WaveformGenerator::GetMobility() [member function]
+    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::WaveformGenerator::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::WaveformGenerator::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -5522,11 +5605,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::WaveformGenerator::GetRxAntenna() [member function]
+    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::WaveformGenerator::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## waveform-generator.h (module 'spectrum'): void ns3::WaveformGenerator::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -6797,11 +6880,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::HalfDuplexIdealPhy::GetMobility() [member function]
+    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::HalfDuplexIdealPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::HalfDuplexIdealPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -6812,11 +6895,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::HalfDuplexIdealPhy::GetRxAntenna() [member function]
+    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::HalfDuplexIdealPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## half-duplex-ideal-phy.h (module 'spectrum'): void ns3::HalfDuplexIdealPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -7273,10 +7356,10 @@
     cls.add_constructor([])
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::MatrixBasedChannelModel(ns3::MatrixBasedChannelModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::MatrixBasedChannelModel const &', 'arg0')])
-    ## matrix-based-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelMatrix> ns3::MatrixBasedChannelModel::GetChannel(ns3::Ptr<const ns3::MobilityModel> aMob, ns3::Ptr<const ns3::MobilityModel> bMob, ns3::Ptr<const ns3::ThreeGppAntennaArrayModel> aAntenna, ns3::Ptr<const ns3::ThreeGppAntennaArrayModel> bAntenna) [member function]
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelMatrix> ns3::MatrixBasedChannelModel::GetChannel(ns3::Ptr<const ns3::MobilityModel> aMob, ns3::Ptr<const ns3::MobilityModel> bMob, ns3::Ptr<const ns3::PhasedArrayModel> aAntenna, ns3::Ptr<const ns3::PhasedArrayModel> bAntenna) [member function]
     cls.add_method('GetChannel', 
                    'ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelMatrix const >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob'), param('ns3::Ptr< ns3::ThreeGppAntennaArrayModel const >', 'aAntenna'), param('ns3::Ptr< ns3::ThreeGppAntennaArrayModel const >', 'bAntenna')], 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aAntenna'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bAntenna')], 
                    is_pure_virtual=True, is_virtual=True)
     ## matrix-based-channel-model.h (module 'spectrum'): static uint32_t ns3::MatrixBasedChannelModel::GetKey(uint32_t x1, uint32_t x2) [member function]
     cls.add_method('GetKey', 
@@ -8268,6 +8351,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -8293,6 +8381,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -8354,6 +8447,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -8379,6 +8477,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
@@ -8502,11 +8605,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumAnalyzer::GetMobility() [member function]
+    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumAnalyzer::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumAnalyzer::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -8517,11 +8620,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumAnalyzer::GetRxAntenna() [member function]
+    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumAnalyzer::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## spectrum-analyzer.h (module 'spectrum'): void ns3::SpectrumAnalyzer::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -8658,10 +8761,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelMatrix> ns3::ThreeGppChannelModel::GetChannel(ns3::Ptr<const ns3::MobilityModel> aMob, ns3::Ptr<const ns3::MobilityModel> bMob, ns3::Ptr<const ns3::ThreeGppAntennaArrayModel> aAntenna, ns3::Ptr<const ns3::ThreeGppAntennaArrayModel> bAntenna) [member function]
+    ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelMatrix> ns3::ThreeGppChannelModel::GetChannel(ns3::Ptr<const ns3::MobilityModel> aMob, ns3::Ptr<const ns3::MobilityModel> bMob, ns3::Ptr<const ns3::PhasedArrayModel> aAntenna, ns3::Ptr<const ns3::PhasedArrayModel> bAntenna) [member function]
     cls.add_method('GetChannel', 
                    'ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelMatrix const >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob'), param('ns3::Ptr< ns3::ThreeGppAntennaArrayModel const >', 'aAntenna'), param('ns3::Ptr< ns3::ThreeGppAntennaArrayModel const >', 'bAntenna')], 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aAntenna'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bAntenna')], 
                    is_virtual=True)
     ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<ns3::ChannelConditionModel> ns3::ThreeGppChannelModel::GetChannelConditionModel() const [member function]
     cls.add_method('GetChannelConditionModel', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/bindings/modulegen__gcc_LP64.py ns-3.34/src/spectrum/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/spectrum/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -30,7 +30,7 @@
     module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
     ## adhoc-aloha-noack-ideal-phy-helper.h (module 'spectrum'): ns3::AdhocAlohaNoackIdealPhyHelper [class]
     module.add_class('AdhocAlohaNoackIdealPhyHelper')
-    ## angles.h (module 'antenna'): ns3::Angles [struct]
+    ## angles.h (module 'antenna'): ns3::Angles [class]
     module.add_class('Angles', import_from_module='ns.antenna')
     ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
     module.add_class('AttributeConstructionList', import_from_module='ns.core')
@@ -95,12 +95,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -239,6 +243,11 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel [class]
+    module.add_class('PhasedArrayModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::PhasedArrayModel::ComplexVector')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::PhasedArrayModel::ComplexVector*')
+    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::PhasedArrayModel::ComplexVector&')
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel [class]
     module.add_class('PropagationDelayModel', import_from_module='ns.propagation', parent=root_module['ns3::Object'])
     ## propagation-loss-model.h (module 'propagation'): ns3::PropagationLossModel [class]
@@ -304,11 +313,6 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::SpectrumValue > )', 'ns3::SpectrumValue::TracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::SpectrumValue > )*', 'ns3::SpectrumValue::TracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::SpectrumValue > )&', 'ns3::SpectrumValue::TracedCallback&')
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel [class]
-    module.add_class('ThreeGppAntennaArrayModel', import_from_module='ns.antenna', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::vector< std::complex< double > >', 'ns3::ThreeGppAntennaArrayModel::ComplexVector')
-    typehandlers.add_type_alias('std::vector< std::complex< double > >*', 'ns3::ThreeGppAntennaArrayModel::ComplexVector*')
-    typehandlers.add_type_alias('std::vector< std::complex< double > >&', 'ns3::ThreeGppAntennaArrayModel::ComplexVector&')
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::ThreeGppSpectrumPropagationLossModel [class]
     module.add_class('ThreeGppSpectrumPropagationLossModel', parent=root_module['ns3::SpectrumPropagationLossModel'])
     ## propagation-loss-model.h (module 'propagation'): ns3::ThreeLogDistancePropagationLossModel [class]
@@ -651,13 +655,14 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::SpectrumPhy > >', 'ns3::SingleModelSpectrumChannel::PhyList')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::SpectrumPhy > >*', 'ns3::SingleModelSpectrumChannel::PhyList*')
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::SpectrumPhy > >&', 'ns3::SingleModelSpectrumChannel::PhyList&')
+    module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('std::vector< ns3::Ptr< ns3::SpectrumPhy > >', 'ns3::Ptr< ns3::SpectrumPhy >', container_type='vector')
     module.add_container('ns3::SpectrumConverterMap_t', ('unsigned int', 'ns3::SpectrumConverter'), container_type='map')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
-    module.add_container('std::vector< double >', 'double', container_type='vector')
-    module.add_container('ns3::Bands', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::vector< std::complex< double > >', 'std::complex< double >', container_type='vector')
+    module.add_container('ns3::PhasedArrayModel::ComplexVector', 'std::complex< double >', container_type='vector')
+    module.add_container('ns3::Bands', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::vector< std::vector< double > >', 'std::vector< double >', container_type='vector')
     module.add_container('std::vector< std::vector< std::vector< double > > >', 'std::vector< std::vector< double > >', container_type='vector')
     module.add_container('std::vector< std::vector< std::complex< double > > >', 'std::vector< std::complex< double > >', container_type='vector')
@@ -878,8 +883,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac16Address_methods(root_module, root_module['ns3::Mac16Address'])
@@ -929,6 +936,7 @@
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
+    register_Ns3PhasedArrayModel_methods(root_module, root_module['ns3::PhasedArrayModel'])
     register_Ns3PropagationDelayModel_methods(root_module, root_module['ns3::PropagationDelayModel'])
     register_Ns3PropagationLossModel_methods(root_module, root_module['ns3::PropagationLossModel'])
     register_Ns3QueueBase_methods(root_module, root_module['ns3::QueueBase'])
@@ -960,7 +968,6 @@
     register_Ns3SpectrumPropagationLossModel_methods(root_module, root_module['ns3::SpectrumPropagationLossModel'])
     register_Ns3SpectrumSignalParameters_methods(root_module, root_module['ns3::SpectrumSignalParameters'])
     register_Ns3SpectrumValue_methods(root_module, root_module['ns3::SpectrumValue'])
-    register_Ns3ThreeGppAntennaArrayModel_methods(root_module, root_module['ns3::ThreeGppAntennaArrayModel'])
     register_Ns3ThreeGppSpectrumPropagationLossModel_methods(root_module, root_module['ns3::ThreeGppSpectrumPropagationLossModel'])
     register_Ns3ThreeLogDistancePropagationLossModel_methods(root_module, root_module['ns3::ThreeLogDistancePropagationLossModel'])
     register_Ns3TraceFadingLossModel_methods(root_module, root_module['ns3::TraceFadingLossModel'])
@@ -1218,18 +1225,32 @@
     cls.add_output_stream_operator()
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Angles const & arg0) [constructor]
     cls.add_constructor([param('ns3::Angles const &', 'arg0')])
-    ## angles.h (module 'antenna'): ns3::Angles::Angles() [constructor]
-    cls.add_constructor([])
-    ## angles.h (module 'antenna'): ns3::Angles::Angles(double phi, double theta) [constructor]
-    cls.add_constructor([param('double', 'phi'), param('double', 'theta')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(double azimuth, double inclination) [constructor]
+    cls.add_constructor([param('double', 'azimuth'), param('double', 'inclination')])
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v) [constructor]
     cls.add_constructor([param('ns3::Vector', 'v')])
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v, ns3::Vector o) [constructor]
     cls.add_constructor([param('ns3::Vector', 'v'), param('ns3::Vector', 'o')])
-    ## angles.h (module 'antenna'): ns3::Angles::phi [variable]
-    cls.add_instance_attribute('phi', 'double', is_const=False)
-    ## angles.h (module 'antenna'): ns3::Angles::theta [variable]
-    cls.add_instance_attribute('theta', 'double', is_const=False)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetAzimuth() const [member function]
+    cls.add_method('GetAzimuth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetInclination() const [member function]
+    cls.add_method('GetInclination', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): void ns3::Angles::SetAzimuth(double azimuth) [member function]
+    cls.add_method('SetAzimuth', 
+                   'void', 
+                   [param('double', 'azimuth')])
+    ## angles.h (module 'antenna'): void ns3::Angles::SetInclination(double inclination) [member function]
+    cls.add_method('SetInclination', 
+                   'void', 
+                   [param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::m_printDeg [variable]
+    cls.add_static_attribute('m_printDeg', 'bool', is_const=False)
     return
 
 def register_Ns3AttributeConstructionList_methods(root_module, cls):
@@ -1667,6 +1688,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2067,6 +2096,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2280,6 +2321,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2355,6 +2401,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2375,6 +2433,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4093,6 +4156,11 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeMuOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, ns3::WifiSpectrumBand ru) [member function]
+    cls.add_method('CreateHeMuOfdmTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('uint32_t', 'centerFrequency'), param('uint16_t', 'channelWidth'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'ru')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40) [member function]
     cls.add_method('CreateHeOfdmTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
@@ -4371,6 +4439,66 @@
                    [])
     return
 
+def register_Ns3PhasedArrayModel_methods(root_module, cls):
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel(ns3::PhasedArrayModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhasedArrayModel const &', 'arg0')])
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::PhasedArrayModel() [constructor]
+    cls.add_constructor([])
+    ## phased-array-model.h (module 'antenna'): ns3::Ptr<const ns3::AntennaModel> ns3::PhasedArrayModel::GetAntennaElement() const [member function]
+    cls.add_method('GetAntennaElement', 
+                   'ns3::Ptr< ns3::AntennaModel const >', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector() const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetBeamformingVector(ns3::Angles a) const [member function]
+    cls.add_method('GetBeamformingVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): std::pair<double, double> ns3::PhasedArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
+    cls.add_method('GetElementFieldPattern', 
+                   'std::pair< double, double >', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::Vector ns3::PhasedArrayModel::GetElementLocation(uint64_t index) const [member function]
+    cls.add_method('GetElementLocation', 
+                   'ns3::Vector', 
+                   [param('uint64_t', 'index')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): uint64_t ns3::PhasedArrayModel::GetNumberOfElements() const [member function]
+    cls.add_method('GetNumberOfElements', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phased-array-model.h (module 'antenna'): ns3::PhasedArrayModel::ComplexVector ns3::PhasedArrayModel::GetSteeringVector(ns3::Angles a) const [member function]
+    cls.add_method('GetSteeringVector', 
+                   'ns3::PhasedArrayModel::ComplexVector', 
+                   [param('ns3::Angles', 'a')], 
+                   is_const=True)
+    ## phased-array-model.h (module 'antenna'): static ns3::TypeId ns3::PhasedArrayModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetAntennaElement(ns3::Ptr<ns3::AntennaModel> antennaElement) [member function]
+    cls.add_method('SetAntennaElement', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::AntennaModel >', 'antennaElement')])
+    ## phased-array-model.h (module 'antenna'): void ns3::PhasedArrayModel::SetBeamformingVector(ns3::PhasedArrayModel::ComplexVector const & beamformingVector) [member function]
+    cls.add_method('SetBeamformingVector', 
+                   'void', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'beamformingVector')])
+    ## phased-array-model.h (module 'antenna'): static double ns3::PhasedArrayModel::ComputeNorm(ns3::PhasedArrayModel::ComplexVector const & vector) [member function]
+    cls.add_method('ComputeNorm', 
+                   'double', 
+                   [param('ns3::PhasedArrayModel::ComplexVector const &', 'vector')], 
+                   is_static=True, visibility='protected')
+    return
+
 def register_Ns3PropagationDelayModel_methods(root_module, cls):
     ## propagation-delay-model.h (module 'propagation'): ns3::PropagationDelayModel::PropagationDelayModel() [constructor]
     cls.add_constructor([])
@@ -4914,11 +5042,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
     cls.add_method('SetChannel', 
                    'void', 
@@ -4929,11 +5057,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -5072,60 +5200,15 @@
                    [])
     return
 
-def register_Ns3ThreeGppAntennaArrayModel_methods(root_module, cls):
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel::ThreeGppAntennaArrayModel(ns3::ThreeGppAntennaArrayModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ThreeGppAntennaArrayModel const &', 'arg0')])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel::ThreeGppAntennaArrayModel() [constructor]
-    cls.add_constructor([])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): void ns3::ThreeGppAntennaArrayModel::ChangeToOmniTx() [member function]
-    cls.add_method('ChangeToOmniTx', 
-                   'void', 
-                   [])
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::ThreeGppAntennaArrayModel::ComplexVector const & ns3::ThreeGppAntennaArrayModel::GetBeamformingVector() const [member function]
-    cls.add_method('GetBeamformingVector', 
-                   'ns3::ThreeGppAntennaArrayModel::ComplexVector const &', 
-                   [], 
-                   is_const=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): std::pair<double, double> ns3::ThreeGppAntennaArrayModel::GetElementFieldPattern(ns3::Angles a) const [member function]
-    cls.add_method('GetElementFieldPattern', 
-                   'std::pair< double, double >', 
-                   [param('ns3::Angles', 'a')], 
-                   is_const=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): ns3::Vector ns3::ThreeGppAntennaArrayModel::GetElementLocation(uint64_t index) const [member function]
-    cls.add_method('GetElementLocation', 
-                   'ns3::Vector', 
-                   [param('uint64_t', 'index')], 
-                   is_const=True, is_virtual=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): uint64_t ns3::ThreeGppAntennaArrayModel::GetNumberOfElements() const [member function]
-    cls.add_method('GetNumberOfElements', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): static ns3::TypeId ns3::ThreeGppAntennaArrayModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): bool ns3::ThreeGppAntennaArrayModel::IsOmniTx() const [member function]
-    cls.add_method('IsOmniTx', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## three-gpp-antenna-array-model.h (module 'antenna'): void ns3::ThreeGppAntennaArrayModel::SetBeamformingVector(ns3::ThreeGppAntennaArrayModel::ComplexVector const & beamformingVector) [member function]
-    cls.add_method('SetBeamformingVector', 
-                   'void', 
-                   [param('ns3::ThreeGppAntennaArrayModel::ComplexVector const &', 'beamformingVector')])
-    return
-
 def register_Ns3ThreeGppSpectrumPropagationLossModel_methods(root_module, cls):
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::ThreeGppSpectrumPropagationLossModel::ThreeGppSpectrumPropagationLossModel(ns3::ThreeGppSpectrumPropagationLossModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::ThreeGppSpectrumPropagationLossModel const &', 'arg0')])
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::ThreeGppSpectrumPropagationLossModel::ThreeGppSpectrumPropagationLossModel() [constructor]
     cls.add_constructor([])
-    ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::ThreeGppSpectrumPropagationLossModel::AddDevice(ns3::Ptr<ns3::NetDevice> n, ns3::Ptr<const ns3::ThreeGppAntennaArrayModel> a) [member function]
+    ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): void ns3::ThreeGppSpectrumPropagationLossModel::AddDevice(ns3::Ptr<ns3::NetDevice> n, ns3::Ptr<const ns3::PhasedArrayModel> a) [member function]
     cls.add_method('AddDevice', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'n'), param('ns3::Ptr< ns3::ThreeGppAntennaArrayModel const >', 'a')])
+                   [param('ns3::Ptr< ns3::NetDevice >', 'n'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'a')])
     ## three-gpp-spectrum-propagation-loss-model.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumValue> ns3::ThreeGppSpectrumPropagationLossModel::DoCalcRxPowerSpectralDensity(ns3::Ptr<const ns3::SpectrumValue> txPsd, ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
@@ -5338,11 +5421,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::TvSpectrumTransmitter::GetMobility() [member function]
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::TvSpectrumTransmitter::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::TvSpectrumTransmitter::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -5353,11 +5436,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::TvSpectrumTransmitter::GetRxAntenna() [member function]
+    ## tv-spectrum-transmitter.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::TvSpectrumTransmitter::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## tv-spectrum-transmitter.h (module 'spectrum'): void ns3::TvSpectrumTransmitter::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -5507,11 +5590,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::WaveformGenerator::GetMobility() [member function]
+    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::WaveformGenerator::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::WaveformGenerator::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -5522,11 +5605,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::WaveformGenerator::GetRxAntenna() [member function]
+    ## waveform-generator.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::WaveformGenerator::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## waveform-generator.h (module 'spectrum'): void ns3::WaveformGenerator::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -6797,11 +6880,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::HalfDuplexIdealPhy::GetMobility() [member function]
+    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::HalfDuplexIdealPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::HalfDuplexIdealPhy::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -6812,11 +6895,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::HalfDuplexIdealPhy::GetRxAntenna() [member function]
+    ## half-duplex-ideal-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::HalfDuplexIdealPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## half-duplex-ideal-phy.h (module 'spectrum'): void ns3::HalfDuplexIdealPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -7273,10 +7356,10 @@
     cls.add_constructor([])
     ## matrix-based-channel-model.h (module 'spectrum'): ns3::MatrixBasedChannelModel::MatrixBasedChannelModel(ns3::MatrixBasedChannelModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::MatrixBasedChannelModel const &', 'arg0')])
-    ## matrix-based-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelMatrix> ns3::MatrixBasedChannelModel::GetChannel(ns3::Ptr<const ns3::MobilityModel> aMob, ns3::Ptr<const ns3::MobilityModel> bMob, ns3::Ptr<const ns3::ThreeGppAntennaArrayModel> aAntenna, ns3::Ptr<const ns3::ThreeGppAntennaArrayModel> bAntenna) [member function]
+    ## matrix-based-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelMatrix> ns3::MatrixBasedChannelModel::GetChannel(ns3::Ptr<const ns3::MobilityModel> aMob, ns3::Ptr<const ns3::MobilityModel> bMob, ns3::Ptr<const ns3::PhasedArrayModel> aAntenna, ns3::Ptr<const ns3::PhasedArrayModel> bAntenna) [member function]
     cls.add_method('GetChannel', 
                    'ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelMatrix const >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob'), param('ns3::Ptr< ns3::ThreeGppAntennaArrayModel const >', 'aAntenna'), param('ns3::Ptr< ns3::ThreeGppAntennaArrayModel const >', 'bAntenna')], 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aAntenna'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bAntenna')], 
                    is_pure_virtual=True, is_virtual=True)
     ## matrix-based-channel-model.h (module 'spectrum'): static uint32_t ns3::MatrixBasedChannelModel::GetKey(uint32_t x1, uint32_t x2) [member function]
     cls.add_method('GetKey', 
@@ -8268,6 +8351,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -8293,6 +8381,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -8354,6 +8447,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -8379,6 +8477,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
@@ -8502,11 +8605,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'd')], 
                    is_virtual=True)
-    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumAnalyzer::GetMobility() [member function]
+    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumAnalyzer::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::NetDevice> ns3::SpectrumAnalyzer::GetDevice() const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -8517,11 +8620,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumAnalyzer::GetRxAntenna() [member function]
+    ## spectrum-analyzer.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumAnalyzer::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## spectrum-analyzer.h (module 'spectrum'): void ns3::SpectrumAnalyzer::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -8658,10 +8761,10 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelMatrix> ns3::ThreeGppChannelModel::GetChannel(ns3::Ptr<const ns3::MobilityModel> aMob, ns3::Ptr<const ns3::MobilityModel> bMob, ns3::Ptr<const ns3::ThreeGppAntennaArrayModel> aAntenna, ns3::Ptr<const ns3::ThreeGppAntennaArrayModel> bAntenna) [member function]
+    ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<const ns3::MatrixBasedChannelModel::ChannelMatrix> ns3::ThreeGppChannelModel::GetChannel(ns3::Ptr<const ns3::MobilityModel> aMob, ns3::Ptr<const ns3::MobilityModel> bMob, ns3::Ptr<const ns3::PhasedArrayModel> aAntenna, ns3::Ptr<const ns3::PhasedArrayModel> bAntenna) [member function]
     cls.add_method('GetChannel', 
                    'ns3::Ptr< ns3::MatrixBasedChannelModel::ChannelMatrix const >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob'), param('ns3::Ptr< ns3::ThreeGppAntennaArrayModel const >', 'aAntenna'), param('ns3::Ptr< ns3::ThreeGppAntennaArrayModel const >', 'bAntenna')], 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'aMob'), param('ns3::Ptr< ns3::MobilityModel const >', 'bMob'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'aAntenna'), param('ns3::Ptr< ns3::PhasedArrayModel const >', 'bAntenna')], 
                    is_virtual=True)
     ## three-gpp-channel-model.h (module 'spectrum'): ns3::Ptr<ns3::ChannelConditionModel> ns3::ThreeGppChannelModel::GetChannelConditionModel() const [member function]
     cls.add_method('GetChannelConditionModel', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/doc/spectrum.rst ns-3.34/src/spectrum/doc/spectrum.rst
--- ns-3.33/src/spectrum/doc/spectrum.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/doc/spectrum.rst	2021-07-14 10:31:07.000000000 -0700
@@ -586,8 +586,6 @@
 test suite by verifying that the generated points do not exceed the given
 maximum distance radius from the origin point.
 
-.. _sec-3gpp-fast-fading-model: 
-
 3GPP TR 38.901 fast fading model
 ================================
 The framework described by TR 38.901 [TR38901]_ is a 3D statistical Spatial
@@ -634,12 +632,12 @@
   * Issue regarding the blockage model: according to 3GPP TR 38.901 v15.0.0
     (2018-06) section 7.6.4.1, the blocking region for self-blocking is provided
     in LCS.
-  
+
     However, here, clusterAOA and clusterZOA are in GCS and blocking check is
     performed for self-blocking similar to non-self blocking, that is in GCS.
     One would expect the angles to be transposed to LCS before checking
     self-blockage.
-  
+
 
 ThreeGppSpectrumPropagationLossModel
 ####################################
@@ -660,7 +658,7 @@
 antenna objects associated to the transmitting and receiving devices, and calls
 the method GetCurrentBeamformingVector to retrieve the beamforming vectors.
 For each device using the channel, the m_deviceAntennaMap contains the associated
-antenna object of type ThreeGppAntennaArrayModel. Since the mapping is one-to-one,
+antenna object of type PhasedArrayModel. Since the mapping is one-to-one,
 the model supports a single antenna object for each device.
 The m_deviceAntennaMap has to be initialized by inserting the device-antenna
 pairs using the method AddDevice.
@@ -698,6 +696,7 @@
 The value of :math:`v_{scatt}` can be configured using the attribute "vScatt" 
 (by default it is set to 0, so that the scattering effect is not considered). 
 
+
 ThreeGppChannelModel
 ####################
 
@@ -760,7 +759,7 @@
   of the class ThreeGppSpectrumPropagationLossModel. It builds a simple
   network composed of two nodes, computes the power spectral density
   received by the receiving node, and
-  
+
     1. Checks if the long term components for the direct and
        the reverse link are the same,
     2. Checks if the long term component is updated when changing
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/examples/three-gpp-channel-example.cc ns-3.34/src/spectrum/examples/three-gpp-channel-example.cc
--- ns-3.33/src/spectrum/examples/three-gpp-channel-example.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/examples/three-gpp-channel-example.cc	2021-07-14 10:31:07.000000000 -0700
@@ -30,7 +30,7 @@
 
 #include "ns3/core-module.h"
 #include "ns3/three-gpp-channel-model.h"
-#include "ns3/three-gpp-antenna-array-model.h"
+#include "ns3/uniform-planar-array.h"
 #include <fstream>
 #include "ns3/three-gpp-spectrum-propagation-loss-model.h"
 #include "ns3/net-device.h"
@@ -57,9 +57,9 @@
  * \param otherDevice the device towards which point the beam
  */
 static void
-DoBeamforming (Ptr<NetDevice> thisDevice, Ptr<ThreeGppAntennaArrayModel> thisAntenna, Ptr<NetDevice> otherDevice)
+DoBeamforming (Ptr<NetDevice> thisDevice, Ptr<PhasedArrayModel> thisAntenna, Ptr<NetDevice> otherDevice)
 {
-  ThreeGppAntennaArrayModel::ComplexVector antennaWeights;
+  PhasedArrayModel::ComplexVector antennaWeights;
 
   // retrieve the position of the two devices
   Vector aPos = thisDevice->GetNode ()->GetObject<MobilityModel> ()->GetPosition ();
@@ -67,13 +67,9 @@
 
   // compute the azimuth and the elevation angles
   Angles completeAngle (bPos,aPos);
-
-  double hAngleRadian = fmod (completeAngle.phi, 2.0 * M_PI); // the azimuth angle
-  if (hAngleRadian < 0)
-  {
-    hAngleRadian += 2.0 * M_PI;     
-  } 
-  double vAngleRadian = completeAngle.theta; // the elevation angle
+  double hAngleRadian = completeAngle.GetAzimuth ();
+  
+  double vAngleRadian = completeAngle.GetInclination (); // the elevation angle
 
   // retrieve the number of antenna elements
   int totNoArrayElements = thisAntenna->GetNumberOfElements ();
@@ -232,8 +228,8 @@
   nodes.Get (1)->AggregateObject (rxMob);
 
   // create the antenna objects and set their dimensions
-  Ptr<ThreeGppAntennaArrayModel> txAntenna = CreateObjectWithAttributes<ThreeGppAntennaArrayModel> ("NumColumns", UintegerValue (2), "NumRows", UintegerValue (2));
-  Ptr<ThreeGppAntennaArrayModel> rxAntenna = CreateObjectWithAttributes<ThreeGppAntennaArrayModel> ("NumColumns", UintegerValue (2), "NumRows", UintegerValue (2));
+  Ptr<PhasedArrayModel> txAntenna = CreateObjectWithAttributes<UniformPlanarArray> ("NumColumns", UintegerValue (2), "NumRows", UintegerValue (2));
+  Ptr<PhasedArrayModel> rxAntenna = CreateObjectWithAttributes<UniformPlanarArray> ("NumColumns", UintegerValue (2), "NumRows", UintegerValue (2));
 
   // initialize the devices in the ThreeGppSpectrumPropagationLossModel
   m_spectrumLossModel->AddDevice (txDev, txAntenna);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/half-duplex-ideal-phy.cc ns-3.34/src/spectrum/model/half-duplex-ideal-phy.cc
--- ns-3.33/src/spectrum/model/half-duplex-ideal-phy.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/half-duplex-ideal-phy.cc	2021-07-14 10:31:07.000000000 -0700
@@ -150,7 +150,7 @@
 
 
 Ptr<MobilityModel>
-HalfDuplexIdealPhy::GetMobility ()
+HalfDuplexIdealPhy::GetMobility () const
 {
   NS_LOG_FUNCTION (this);
   return m_mobility;
@@ -256,7 +256,7 @@
 }
 
 Ptr<AntennaModel>
-HalfDuplexIdealPhy::GetRxAntenna ()
+HalfDuplexIdealPhy::GetRxAntenna () const
 {
   NS_LOG_FUNCTION (this);
   return m_antenna;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/half-duplex-ideal-phy.h ns-3.34/src/spectrum/model/half-duplex-ideal-phy.h
--- ns-3.33/src/spectrum/model/half-duplex-ideal-phy.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/half-duplex-ideal-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -102,10 +102,10 @@
   void SetChannel (Ptr<SpectrumChannel> c);
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
-  Ptr<MobilityModel> GetMobility ();
+  Ptr<MobilityModel> GetMobility () const;
   Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna ();
+  Ptr<AntennaModel> GetRxAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/matrix-based-channel-model.h ns-3.34/src/spectrum/model/matrix-based-channel-model.h
--- ns-3.33/src/spectrum/model/matrix-based-channel-model.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/matrix-based-channel-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -26,7 +26,7 @@
 #include <ns3/object.h>
 #include <ns3/nstime.h>
 #include <ns3/vector.h>
-#include <ns3/three-gpp-antenna-array-model.h>
+#include <ns3/phased-array-model.h>
 #include <tuple>
 
 namespace ns3 {
@@ -51,7 +51,7 @@
   typedef std::vector<double> DoubleVector; //!< type definition for vectors of doubles
   typedef std::vector<DoubleVector> Double2DVector; //!< type definition for matrices of doubles
   typedef std::vector<Double2DVector> Double3DVector; //!< type definition for 3D matrices of doubles
-  typedef std::vector<ThreeGppAntennaArrayModel::ComplexVector> Complex2DVector; //!< type definition for complex matrices
+  typedef std::vector<PhasedArrayModel::ComplexVector> Complex2DVector; //!< type definition for complex matrices
   typedef std::vector<Complex2DVector> Complex3DVector; //!< type definition for complex 3D matrices
 
 
@@ -108,8 +108,8 @@
    */
   virtual Ptr<const ChannelMatrix> GetChannel (Ptr<const MobilityModel> aMob,
                                                Ptr<const MobilityModel> bMob,
-                                               Ptr<const ThreeGppAntennaArrayModel> aAntenna,
-                                               Ptr<const ThreeGppAntennaArrayModel> bAntenna) = 0;
+                                               Ptr<const PhasedArrayModel> aAntenna,
+                                               Ptr<const PhasedArrayModel> bAntenna) = 0;
   
   /**
    * Calculate the channel key using the Cantor function
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/spectrum-analyzer.cc ns-3.34/src/spectrum/model/spectrum-analyzer.cc
--- ns-3.33/src/spectrum/model/spectrum-analyzer.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/spectrum-analyzer.cc	2021-07-14 10:31:07.000000000 -0700
@@ -106,7 +106,7 @@
 
 
 Ptr<MobilityModel>
-SpectrumAnalyzer::GetMobility ()
+SpectrumAnalyzer::GetMobility () const
 {
   return m_mobility;
 }
@@ -143,7 +143,7 @@
 
 
 Ptr<AntennaModel>
-SpectrumAnalyzer::GetRxAntenna ()
+SpectrumAnalyzer::GetRxAntenna () const
 {
   return m_antenna;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/spectrum-analyzer.h ns-3.34/src/spectrum/model/spectrum-analyzer.h
--- ns-3.33/src/spectrum/model/spectrum-analyzer.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/spectrum-analyzer.h	2021-07-14 10:31:07.000000000 -0700
@@ -62,10 +62,10 @@
   void SetChannel (Ptr<SpectrumChannel> c);
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
-  Ptr<MobilityModel> GetMobility ();
+  Ptr<MobilityModel> GetMobility () const;
   Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna ();
+  Ptr<AntennaModel> GetRxAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/spectrum-phy.h ns-3.34/src/spectrum/model/spectrum-phy.h
--- ns-3.33/src/spectrum/model/spectrum-phy.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/spectrum-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -81,7 +81,7 @@
    *
    * @return a Ptr to the associated MobilityModel instance
    */
-  virtual Ptr<MobilityModel> GetMobility () = 0;
+  virtual Ptr<MobilityModel> GetMobility () const = 0;
 
   /**
    * Set the channel attached to this device.
@@ -103,7 +103,7 @@
    *
    * @return a Ptr to the AntennaModel used by the NetDevice for reception
    */
-  virtual Ptr<AntennaModel> GetRxAntenna () = 0;
+  virtual Ptr<AntennaModel> GetRxAntenna () const = 0;
 
   /**
    * Notify the SpectrumPhy instance of an incoming signal
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/three-gpp-channel-model.cc ns-3.34/src/spectrum/model/three-gpp-channel-model.cc
--- ns-3.33/src/spectrum/model/three-gpp-channel-model.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/three-gpp-channel-model.cc	2021-07-14 10:31:07.000000000 -0700
@@ -22,7 +22,7 @@
 
 #include "three-gpp-channel-model.h"
 #include "ns3/log.h"
-#include "ns3/three-gpp-antenna-array-model.h"
+#include "ns3/phased-array-model.h"
 #include "ns3/node.h"
 #include "ns3/double.h"
 #include "ns3/string.h"
@@ -970,8 +970,8 @@
 Ptr<const MatrixBasedChannelModel::ChannelMatrix>
 ThreeGppChannelModel::GetChannel (Ptr<const MobilityModel> aMob,
                                   Ptr<const MobilityModel> bMob,
-                                  Ptr<const ThreeGppAntennaArrayModel> aAntenna,
-                                  Ptr<const ThreeGppAntennaArrayModel> bAntenna)
+                                  Ptr<const PhasedArrayModel> aAntenna,
+                                  Ptr<const PhasedArrayModel> bAntenna)
 {
   NS_LOG_FUNCTION (this);
 
@@ -1038,8 +1038,8 @@
 
 Ptr<ThreeGppChannelModel::ThreeGppChannelMatrix>
 ThreeGppChannelModel::GetNewChannel (Vector locUT, Ptr<const ChannelCondition> channelCondition,
-                                     Ptr<const ThreeGppAntennaArrayModel> sAntenna,
-                                     Ptr<const ThreeGppAntennaArrayModel> uAntenna,
+                                     Ptr<const PhasedArrayModel> sAntenna,
+                                     Ptr<const PhasedArrayModel> uAntenna,
                                      Angles &uAngle, Angles &sAngle,
                                      double dis2D, double hBS, double hUT) const
 {
@@ -1333,17 +1333,17 @@
         {
           Xn = -1;
         }
-      clusterAoa[cIndex] = clusterAoa[cIndex] * Xn + (m_normalRv->GetValue () * ASA / 7) + uAngle.phi * 180 / M_PI;        //(7.5-11)
-      clusterAod[cIndex] = clusterAod[cIndex] * Xn + (m_normalRv->GetValue () * ASD / 7) + sAngle.phi * 180 / M_PI;
+      clusterAoa[cIndex] = clusterAoa[cIndex] * Xn + (m_normalRv->GetValue () * ASA / 7) + RadiansToDegrees (uAngle.GetAzimuth ());        //(7.5-11)
+      clusterAod[cIndex] = clusterAod[cIndex] * Xn + (m_normalRv->GetValue () * ASD / 7) + RadiansToDegrees (sAngle.GetAzimuth ());
       if (o2i)
         {
           clusterZoa[cIndex] = clusterZoa[cIndex] * Xn + (m_normalRv->GetValue () * ZSA / 7) + 90;            //(7.5-16)
         }
       else
         {
-          clusterZoa[cIndex] = clusterZoa[cIndex] * Xn + (m_normalRv->GetValue () * ZSA / 7) + uAngle.theta * 180 / M_PI;            //(7.5-16)
+          clusterZoa[cIndex] = clusterZoa[cIndex] * Xn + (m_normalRv->GetValue () * ZSA / 7) + RadiansToDegrees (uAngle.GetInclination ());            //(7.5-16)
         }
-      clusterZod[cIndex] = clusterZod[cIndex] * Xn + (m_normalRv->GetValue () * ZSD / 7) + sAngle.theta * 180 / M_PI + table3gpp->m_offsetZOD;        //(7.5-19)
+      clusterZod[cIndex] = clusterZod[cIndex] * Xn + (m_normalRv->GetValue () * ZSD / 7) + RadiansToDegrees (sAngle.GetInclination ()) + table3gpp->m_offsetZOD;        //(7.5-19)
 
     }
 
@@ -1351,10 +1351,10 @@
     {
       //The 7.5-12 can be rewrite as Theta_n,ZOA = Theta_n,ZOA - (Theta_1,ZOA - Theta_LOS,ZOA) = Theta_n,ZOA - diffZOA,
       //Similar as AOD, ZSA and ZSD.
-      double diffAoa = clusterAoa[0] - uAngle.phi * 180 / M_PI;
-      double diffAod = clusterAod[0] - sAngle.phi * 180 / M_PI;
-      double diffZsa = clusterZoa[0] - uAngle.theta * 180 / M_PI;
-      double diffZsd = clusterZod[0] - sAngle.theta * 180 / M_PI;
+      double diffAoa = clusterAoa[0] - RadiansToDegrees (uAngle.GetAzimuth ());
+      double diffAod = clusterAod[0] - RadiansToDegrees (sAngle.GetAzimuth ());
+      double diffZsa = clusterZoa[0] - RadiansToDegrees (uAngle.GetInclination ());
+      double diffZsd = clusterZod[0] - RadiansToDegrees (sAngle.GetInclination ());
 
       for (uint8_t cIndex = 0; cIndex < numReducedCluster; cIndex++)
         {
@@ -1376,69 +1376,12 @@
       for (uint8_t mInd = 0; mInd < raysPerCluster; mInd++)
         {
           double tempAoa = clusterAoa[nInd] + table3gpp->m_cASA * offSetAlpha[mInd]; //(7.5-13)
-          while (tempAoa > 360)
-            {
-              tempAoa -= 360;
-            }
-
-          while (tempAoa < 0)
-            {
-              tempAoa += 360;
-
-            }
-          NS_ASSERT_MSG (tempAoa >= 0 && tempAoa <= 360, "the AOA should be the range of [0,360]");
-          rayAoa_radian[nInd][mInd] = tempAoa * M_PI / 180;
-
-          double tempAod = clusterAod[nInd] + table3gpp->m_cASD * offSetAlpha[mInd];
-          while (tempAod > 360)
-            {
-              tempAod -= 360;
-            }
-
-          while (tempAod < 0)
-            {
-              tempAod += 360;
-            }
-          NS_ASSERT_MSG (tempAod >= 0 && tempAod <= 360, "the AOD should be the range of [0,360]");
-          rayAod_radian[nInd][mInd] = tempAod * M_PI / 180;
-
           double tempZoa = clusterZoa[nInd] + table3gpp->m_cZSA * offSetAlpha[mInd]; //(7.5-18)
+          std::tie (rayAoa_radian[nInd][mInd], rayZoa_radian[nInd][mInd]) = WrapAngles (DegreesToRadians (tempAoa), DegreesToRadians (tempZoa));
 
-          while (tempZoa > 360)
-            {
-              tempZoa -= 360;
-            }
-
-          while (tempZoa < 0)
-            {
-              tempZoa += 360;
-            }
-
-          if (tempZoa > 180)
-            {
-              tempZoa = 360 - tempZoa;
-            }
-
-          NS_ASSERT_MSG (tempZoa >= 0&&tempZoa <= 180, "the ZOA should be the range of [0,180]");
-          rayZoa_radian[nInd][mInd] = tempZoa * M_PI / 180;
-
-          double tempZod = clusterZod[nInd] + 0.375 * pow (10,table3gpp->m_uLgZSD) * offSetAlpha[mInd];             //(7.5-20)
-
-          while (tempZod > 360)
-            {
-              tempZod -= 360;
-            }
-
-          while (tempZod < 0)
-            {
-              tempZod += 360;
-            }
-          if (tempZod > 180)
-            {
-              tempZod = 360 - tempZod;
-            }
-          NS_ASSERT_MSG (tempZod >= 0&&tempZod <= 180, "the ZOD should be the range of [0,180]");
-          rayZod_radian[nInd][mInd] = tempZod * M_PI / 180;
+          double tempAod = clusterAod[nInd] + table3gpp->m_cASD * offSetAlpha[mInd]; //(7.5-13)
+          double tempZod = clusterZod[nInd] + 0.375 * pow (10,table3gpp->m_uLgZSD) * offSetAlpha[mInd]; //(7.5-20)
+          std::tie (rayAod_radian[nInd][mInd], rayZod_radian[nInd][mInd]) = WrapAngles (DegreesToRadians (tempAod), DegreesToRadians (tempZod));
         }
     }
   DoubleVector angle_degree;
@@ -1712,16 +1655,16 @@
           if (los) //(7.5-29) && (7.5-30)
             {
               std::complex<double> ray (0,0);
-              double rxPhaseDiff = 2 * M_PI * (sin (uAngle.theta) * cos (uAngle.phi) * uLoc.x
-                                               + sin (uAngle.theta) * sin (uAngle.phi) * uLoc.y
-                                               + cos (uAngle.theta) * uLoc.z);
-              double txPhaseDiff = 2 * M_PI * (sin (sAngle.theta) * cos (sAngle.phi) * sLoc.x
-                                               + sin (sAngle.theta) * sin (sAngle.phi) * sLoc.y
-                                               + cos (sAngle.theta) * sLoc.z);
+              double rxPhaseDiff = 2 * M_PI * (sin (uAngle.GetInclination ()) * cos (uAngle.GetAzimuth ()) * uLoc.x
+                                               + sin (uAngle.GetInclination ()) * sin (uAngle.GetAzimuth ()) * uLoc.y
+                                               + cos (uAngle.GetInclination ()) * uLoc.z);
+              double txPhaseDiff = 2 * M_PI * (sin (sAngle.GetInclination ()) * cos (sAngle.GetAzimuth ()) * sLoc.x
+                                               + sin (sAngle.GetInclination ()) * sin (sAngle.GetAzimuth ()) * sLoc.y
+                                               + cos (sAngle.GetInclination ()) * sLoc.z);
 
               double rxFieldPatternPhi, rxFieldPatternTheta, txFieldPatternPhi, txFieldPatternTheta;
-              std::tie (rxFieldPatternPhi, rxFieldPatternTheta) = uAntenna->GetElementFieldPattern (Angles (uAngle.phi, uAngle.theta));
-              std::tie (txFieldPatternPhi, txFieldPatternTheta) = sAntenna->GetElementFieldPattern (Angles (sAngle.phi, sAngle.theta));
+              std::tie (rxFieldPatternPhi, rxFieldPatternTheta) = uAntenna->GetElementFieldPattern (Angles (uAngle.GetAzimuth (), uAngle.GetInclination ()));
+              std::tie (txFieldPatternPhi, txFieldPatternTheta) = sAntenna->GetElementFieldPattern (Angles (sAngle.GetAzimuth (), sAngle.GetInclination ()));
 
               double lambda = 3e8 / m_frequency; // the wavelength of the carrier frequency
 
@@ -1816,6 +1759,27 @@
   return channelParams;
 }
 
+std::pair<double, double>
+ThreeGppChannelModel::WrapAngles (double azimuthRad, double inclinationRad)
+{
+  inclinationRad = WrapTo2Pi (inclinationRad);
+  if (inclinationRad > M_PI)
+  {
+    // inclination must be in [0, M_PI]
+    inclinationRad -= M_PI;
+    azimuthRad += M_PI;
+  }
+
+  azimuthRad = WrapTo2Pi (azimuthRad);
+
+  NS_ASSERT_MSG (0 <= inclinationRad && inclinationRad <= M_PI,
+                 "inclinationRad=" << inclinationRad << " not valid, should be in [0, pi]");
+  NS_ASSERT_MSG (0 <= azimuthRad && azimuthRad <= 2 * M_PI,
+                 "azimuthRad=" << azimuthRad << " not valid, should be in [0, 2*pi]");
+
+  return std::make_pair (azimuthRad, inclinationRad);
+}
+
 MatrixBasedChannelModel::DoubleVector
 ThreeGppChannelModel::CalcAttenuationOfBlockage (Ptr<ThreeGppChannelModel::ThreeGppChannelMatrix> params,
                                                  const DoubleVector &clusterAOA,
@@ -2018,13 +1982,13 @@
                 }
               double lambda = 3e8 / m_frequency;
               double F_A1 = atan (signA1 * M_PI / 2 * sqrt (M_PI / lambda *
-                                                            params->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (A1 * M_PI / 180) - 1))) / M_PI; //(7.6-23)
+                                                            params->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (DegreesToRadians (A1)) - 1))) / M_PI; //(7.6-23)
               double F_A2 = atan (signA2 * M_PI / 2 * sqrt (M_PI / lambda *
-                                                            params->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (A2 * M_PI / 180) - 1))) / M_PI;
+                                                            params->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (DegreesToRadians (A2)) - 1))) / M_PI;
               double F_Z1 = atan (signZ1 * M_PI / 2 * sqrt (M_PI / lambda *
-                                                            params->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (Z1 * M_PI / 180) - 1))) / M_PI;
+                                                            params->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (DegreesToRadians (Z1)) - 1))) / M_PI;
               double F_Z2 = atan (signZ2 * M_PI / 2 * sqrt (M_PI / lambda *
-                                                            params->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (Z2 * M_PI / 180) - 1))) / M_PI;
+                                                            params->m_nonSelfBlocking[blockInd][R_INDEX] * (1 / cos (DegreesToRadians (Z2)) - 1))) / M_PI;
               double L_dB = -20 * log10 (1 - (F_A1 + F_A2) * (F_Z1 + F_Z2));                  //(7.6-22)
               powerAttenuation[cInd] += L_dB;
               NS_LOG_INFO ("Cluster[" << (int)cInd << "] is blocked by no-self blocking, "
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/three-gpp-channel-model.h ns-3.34/src/spectrum/model/three-gpp-channel-model.h
--- ns-3.33/src/spectrum/model/three-gpp-channel-model.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/three-gpp-channel-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -117,8 +117,8 @@
    */
   Ptr<const ChannelMatrix> GetChannel (Ptr<const MobilityModel> aMob,
                                        Ptr<const MobilityModel> bMob,
-                                       Ptr<const ThreeGppAntennaArrayModel> aAntenna,
-                                       Ptr<const ThreeGppAntennaArrayModel> bAntenna) override;
+                                       Ptr<const PhasedArrayModel> aAntenna,
+                                       Ptr<const PhasedArrayModel> bAntenna) override;
   /**
    * \brief Assign a fixed random variable stream number to the random variables
    * used by this model.
@@ -130,6 +130,20 @@
   
 private:
   /**
+   * Wrap an (azimuth, inclination) angle pair in a valid range.
+   * Specifically, inclination must be in [0, M_PI] and azimuth in [0, 2*M_PI).
+   * If the inclination angle is outside of its range, the azimuth angle is
+   * rotated by M_PI.
+   * This methods aims specifically at solving the problem of generating angles at
+   * the boundaries of the angle domain, specifically, generating angle distributions
+   * close to inclinationRad=0 and inclinationRad=M_PI.
+   *
+   * \param azimuthRad the azimuth angle in radians
+   * \param inclinationRad the inclination angle in radians
+   * \return the wrapped (azimuth, inclination) angle pair in radians
+   */
+  static std::pair<double, double> WrapAngles (double azimuthRad, double inclinationRad);
+  /**
    * \brief Shuffle the elements of a simple sequence container of type double
    * \param first Pointer to the first element among the elements to be shuffled
    * \param last Pointer to the last element among the elements to be shuffled
@@ -217,8 +231,8 @@
    * \return the channel realization
    */
   Ptr<ThreeGppChannelMatrix> GetNewChannel (Vector locUT, Ptr<const ChannelCondition> channelCondition,
-                                            Ptr<const ThreeGppAntennaArrayModel> sAntenna,
-                                            Ptr<const ThreeGppAntennaArrayModel> uAntenna,
+                                            Ptr<const PhasedArrayModel> sAntenna,
+                                            Ptr<const PhasedArrayModel> uAntenna,
                                             Angles &uAngle, Angles &sAngle,
                                             double dis2D, double hBS, double hUT) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc ns-3.34/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc
--- ns-3.33/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.cc	2021-07-14 10:31:07.000000000 -0700
@@ -23,7 +23,7 @@
 #include "ns3/log.h"
 #include "three-gpp-spectrum-propagation-loss-model.h"
 #include "ns3/net-device.h"
-#include "ns3/three-gpp-antenna-array-model.h"
+#include "ns3/phased-array-model.h"
 #include "ns3/node.h"
 #include "ns3/channel-condition-model.h"
 #include "ns3/double.h"
@@ -95,7 +95,7 @@
 }
 
 void
-ThreeGppSpectrumPropagationLossModel::AddDevice (Ptr<NetDevice> n, Ptr<const ThreeGppAntennaArrayModel> a)
+ThreeGppSpectrumPropagationLossModel::AddDevice (Ptr<NetDevice> n, Ptr<const PhasedArrayModel> a)
 {
   NS_ASSERT_MSG (m_deviceAntennaMap.find (n->GetNode ()->GetId ()) == m_deviceAntennaMap.end (), "Device is already present in the map");
   m_deviceAntennaMap.insert (std::make_pair (n->GetNode ()->GetId (), a));
@@ -121,10 +121,10 @@
   m_channelModel->GetAttribute (name, value);
 }
 
-ThreeGppAntennaArrayModel::ComplexVector
+PhasedArrayModel::ComplexVector
 ThreeGppSpectrumPropagationLossModel::CalcLongTerm (Ptr<const MatrixBasedChannelModel::ChannelMatrix> params,
-                                                    const ThreeGppAntennaArrayModel::ComplexVector &sW,
-                                                    const ThreeGppAntennaArrayModel::ComplexVector &uW) const
+                                                    const PhasedArrayModel::ComplexVector &sW,
+                                                    const PhasedArrayModel::ComplexVector &uW) const
 {
   NS_LOG_FUNCTION (this);
 
@@ -134,7 +134,7 @@
   NS_LOG_DEBUG ("CalcLongTerm with sAntenna " << sAntenna << " uAntenna " << uAntenna);
   //store the long term part to reduce computation load
   //only the small scale fading needs to be updated if the large scale parameters and antenna weights remain unchanged.
-  ThreeGppAntennaArrayModel::ComplexVector longTerm;
+  PhasedArrayModel::ComplexVector longTerm;
   uint8_t numCluster = static_cast<uint8_t> (params->m_channel[0][0].size ());
 
   for (uint8_t cIndex = 0; cIndex < numCluster; cIndex++)
@@ -156,7 +156,7 @@
 
 Ptr<SpectrumValue>
 ThreeGppSpectrumPropagationLossModel::CalcBeamformingGain (Ptr<SpectrumValue> txPsd,
-                                                           ThreeGppAntennaArrayModel::ComplexVector longTerm,
+                                                           PhasedArrayModel::ComplexVector longTerm,
                                                            Ptr<const MatrixBasedChannelModel::ChannelMatrix> params,
                                                            const ns3::Vector &sSpeed, const ns3::Vector &uSpeed) const
 {
@@ -171,7 +171,7 @@
   // NOTE the update of Doppler is simplified by only taking the center angle of
   // each cluster in to consideration.
   double slotTime = Simulator::Now ().GetSeconds ();
-  ThreeGppAntennaArrayModel::ComplexVector doppler;
+  PhasedArrayModel::ComplexVector doppler;
   for (uint8_t cIndex = 0; cIndex < numCluster; cIndex++)
     {
       // Compute alpha and D as described in 3GPP TR 37.885 v15.3.0, Sec. 6.2.3
@@ -226,17 +226,17 @@
   return tempPsd;
 }
 
-ThreeGppAntennaArrayModel::ComplexVector
+PhasedArrayModel::ComplexVector
 ThreeGppSpectrumPropagationLossModel::GetLongTerm (uint32_t aId, uint32_t bId,
                                                    Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix,
-                                                   const ThreeGppAntennaArrayModel::ComplexVector &aW,
-                                                   const ThreeGppAntennaArrayModel::ComplexVector &bW) const
+                                                   const PhasedArrayModel::ComplexVector &aW,
+                                                   const PhasedArrayModel::ComplexVector &bW) const
 {
-  ThreeGppAntennaArrayModel::ComplexVector longTerm; // vector containing the long term component for each cluster
+  PhasedArrayModel::ComplexVector longTerm; // vector containing the long term component for each cluster
 
   // check if the channel matrix was generated considering a as the s-node and
   // b as the u-node or viceversa
-  ThreeGppAntennaArrayModel::ComplexVector sW, uW;
+  PhasedArrayModel::ComplexVector sW, uW;
   if (!channelMatrix->IsReverse (aId, bId))
   {
     sW = aW;
@@ -311,28 +311,22 @@
 
   // retrieve the antenna of device a
   NS_ASSERT_MSG (m_deviceAntennaMap.find (aId) != m_deviceAntennaMap.end (), "Antenna not found for node " << aId);
-  Ptr<const ThreeGppAntennaArrayModel> aAntenna = m_deviceAntennaMap.at (aId);
+  Ptr<const PhasedArrayModel> aAntenna = m_deviceAntennaMap.at (aId);
   NS_LOG_DEBUG ("a node " << a->GetObject<Node> () << " antenna " << aAntenna);
 
   // retrieve the antenna of the device b
   NS_ASSERT_MSG (m_deviceAntennaMap.find (bId) != m_deviceAntennaMap.end (), "Antenna not found for device " << bId);
-  Ptr<const ThreeGppAntennaArrayModel> bAntenna = m_deviceAntennaMap.at (bId);
+  Ptr<const PhasedArrayModel> bAntenna = m_deviceAntennaMap.at (bId);
   NS_LOG_DEBUG ("b node " << bId << " antenna " << bAntenna);
 
-  if (aAntenna->IsOmniTx () || bAntenna->IsOmniTx () )
-    {
-      NS_LOG_LOGIC ("Omni transmission, do nothing.");
-      return rxPsd;
-    }
-
   Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix = m_channelModel->GetChannel (a, b, aAntenna, bAntenna);
 
   // get the precoding and combining vectors
-  ThreeGppAntennaArrayModel::ComplexVector aW = aAntenna->GetBeamformingVector ();
-  ThreeGppAntennaArrayModel::ComplexVector bW = bAntenna->GetBeamformingVector ();
+  PhasedArrayModel::ComplexVector aW = aAntenna->GetBeamformingVector ();
+  PhasedArrayModel::ComplexVector bW = bAntenna->GetBeamformingVector ();
 
   // retrieve the long term component
-  ThreeGppAntennaArrayModel::ComplexVector longTerm = GetLongTerm (aId, bId, channelMatrix, aW, bW);
+  PhasedArrayModel::ComplexVector longTerm = GetLongTerm (aId, bId, channelMatrix, aW, bW);
 
   // apply the beamforming gain
   rxPsd = CalcBeamformingGain (rxPsd, longTerm, channelMatrix, a->GetVelocity (), b->GetVelocity ());
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h ns-3.34/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h
--- ns-3.33/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/three-gpp-spectrum-propagation-loss-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -46,7 +46,7 @@
  * returns the PSD of the received signal.
  *
  * \see MatrixBasedChannelModel
- * \see ThreeGppAntennaArrayModel
+ * \see PhasedArrayModel
  * \see ChannelCondition
  */
 class ThreeGppSpectrumPropagationLossModel : public SpectrumPropagationLossModel
@@ -85,9 +85,9 @@
   /**
    * Add a device-antenna pair
    * \param n a pointer to the NetDevice
-   * \param a a pointer to the associated ThreeGppAntennaArrayModel
+   * \param a a pointer to the associated PhasedArrayModel
    */
-  void AddDevice (Ptr<NetDevice> n, Ptr<const ThreeGppAntennaArrayModel> a);
+  void AddDevice (Ptr<NetDevice> n, Ptr<const PhasedArrayModel> a);
 
 
   /**
@@ -136,10 +136,10 @@
    */
   struct LongTerm : public SimpleRefCount<LongTerm>
   {
-    ThreeGppAntennaArrayModel::ComplexVector m_longTerm; //!< vector containing the long term component for each cluster
+    PhasedArrayModel::ComplexVector m_longTerm; //!< vector containing the long term component for each cluster
     Ptr<const MatrixBasedChannelModel::ChannelMatrix> m_channel; //!< pointer to the channel matrix used to compute the long term
-    ThreeGppAntennaArrayModel::ComplexVector m_sW; //!< the beamforming vector for the node s used to compute the long term
-    ThreeGppAntennaArrayModel::ComplexVector m_uW; //!< the beamforming vector for the node u used to compute the long term
+    PhasedArrayModel::ComplexVector m_sW; //!< the beamforming vector for the node s used to compute the long term
+    PhasedArrayModel::ComplexVector m_uW; //!< the beamforming vector for the node u used to compute the long term
   };
 
   /**
@@ -159,10 +159,10 @@
    * \param bW the beamforming vector of the second device
    * \return vector containing the long term compoenent for each cluster
    */
-  ThreeGppAntennaArrayModel::ComplexVector GetLongTerm (uint32_t aId, uint32_t bId,
+  PhasedArrayModel::ComplexVector GetLongTerm (uint32_t aId, uint32_t bId,
                                                         Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix,
-                                                        const ThreeGppAntennaArrayModel::ComplexVector &aW,
-                                                        const ThreeGppAntennaArrayModel::ComplexVector &bW) const;
+                                                        const PhasedArrayModel::ComplexVector &aW,
+                                                        const PhasedArrayModel::ComplexVector &bW) const;
   /**
    * Computes the long term component
    * \param channelMatrix the channel matrix H
@@ -170,9 +170,9 @@
    * \param uW the beamforming vector of the u device
    * \return the long term component
    */
-  ThreeGppAntennaArrayModel::ComplexVector CalcLongTerm (Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix,
-                                                         const ThreeGppAntennaArrayModel::ComplexVector &sW,
-                                                         const ThreeGppAntennaArrayModel::ComplexVector &uW) const;
+  PhasedArrayModel::ComplexVector CalcLongTerm (Ptr<const MatrixBasedChannelModel::ChannelMatrix> channelMatrix,
+                                                         const PhasedArrayModel::ComplexVector &sW,
+                                                         const PhasedArrayModel::ComplexVector &uW) const;
 
   /**
    * Computes the beamforming gain and applies it to the tx PSD
@@ -184,11 +184,11 @@
    * \return the rx PSD
    */
   Ptr<SpectrumValue> CalcBeamformingGain (Ptr<SpectrumValue> txPsd,
-                                          ThreeGppAntennaArrayModel::ComplexVector longTerm,
+                                          PhasedArrayModel::ComplexVector longTerm,
                                           Ptr<const MatrixBasedChannelModel::ChannelMatrix> params,
                                           const Vector &sSpeed, const Vector &uSpeed) const;
 
-  std::unordered_map <uint32_t, Ptr<const ThreeGppAntennaArrayModel> > m_deviceAntennaMap; //!< map containig the <node, antenna> associations
+  std::unordered_map <uint32_t, Ptr<const PhasedArrayModel> > m_deviceAntennaMap; //!< map containig the <node, antenna> associations
   mutable std::unordered_map < uint32_t, Ptr<const LongTerm> > m_longTermMap; //!< map containing the long term components
   Ptr<MatrixBasedChannelModel> m_channelModel; //!< the model to generate the channel matrix
   
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/tv-spectrum-transmitter.cc ns-3.34/src/spectrum/model/tv-spectrum-transmitter.cc
--- ns-3.33/src/spectrum/model/tv-spectrum-transmitter.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/tv-spectrum-transmitter.cc	2021-07-14 10:31:07.000000000 -0700
@@ -144,7 +144,7 @@
 }
 
 Ptr<MobilityModel>
-TvSpectrumTransmitter::GetMobility ()
+TvSpectrumTransmitter::GetMobility () const
 {
   NS_LOG_FUNCTION (this);
   return m_mobility;
@@ -165,7 +165,7 @@
 }
 
 Ptr<AntennaModel>
-TvSpectrumTransmitter::GetRxAntenna ()
+TvSpectrumTransmitter::GetRxAntenna () const
 {
   NS_LOG_FUNCTION (this);
   return m_antenna;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/tv-spectrum-transmitter.h ns-3.34/src/spectrum/model/tv-spectrum-transmitter.h
--- ns-3.33/src/spectrum/model/tv-spectrum-transmitter.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/tv-spectrum-transmitter.h	2021-07-14 10:31:07.000000000 -0700
@@ -70,11 +70,11 @@
   void SetChannel (Ptr<SpectrumChannel> c);
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
-  Ptr<MobilityModel> GetMobility ();
+  Ptr<MobilityModel> GetMobility () const;
   Ptr<NetDevice> GetDevice () const;
   // device does not use Rx but these pure virtual methods must be implemented
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna ();
+  Ptr<AntennaModel> GetRxAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
 
   /** 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/waveform-generator.cc ns-3.34/src/spectrum/model/waveform-generator.cc
--- ns-3.33/src/spectrum/model/waveform-generator.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/waveform-generator.cc	2021-07-14 10:31:07.000000000 -0700
@@ -105,7 +105,7 @@
 
 
 Ptr<MobilityModel>
-WaveformGenerator::GetMobility ()
+WaveformGenerator::GetMobility () const
 {
   return m_mobility;
 }
@@ -155,7 +155,7 @@
 }
 
 Ptr<AntennaModel>
-WaveformGenerator::GetRxAntenna ()
+WaveformGenerator::GetRxAntenna () const
 {
   return m_antenna;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/waveform-generator.h ns-3.34/src/spectrum/model/waveform-generator.h
--- ns-3.33/src/spectrum/model/waveform-generator.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/waveform-generator.h	2021-07-14 10:31:07.000000000 -0700
@@ -67,10 +67,10 @@
   void SetChannel (Ptr<SpectrumChannel> c);
   void SetMobility (Ptr<MobilityModel> m);
   void SetDevice (Ptr<NetDevice> d);
-  Ptr<MobilityModel> GetMobility ();
+  Ptr<MobilityModel> GetMobility () const;
   Ptr<NetDevice> GetDevice () const;
   Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna ();
+  Ptr<AntennaModel> GetRxAntenna () const;
   void StartRx (Ptr<SpectrumSignalParameters> params);
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/wifi-spectrum-value-helper.cc ns-3.34/src/spectrum/model/wifi-spectrum-value-helper.cc
--- ns-3.33/src/spectrum/model/wifi-spectrum-value-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/wifi-spectrum-value-helper.cc	2021-07-14 10:31:07.000000000 -0700
@@ -422,6 +422,33 @@
 }
 
 Ptr<SpectrumValue>
+WifiSpectrumValueHelper::CreateHeMuOfdmTxPowerSpectralDensity (uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, WifiSpectrumBand ru)
+{
+  NS_LOG_FUNCTION (centerFrequency << channelWidth << txPowerW << guardBandwidth << ru.first << ru.second);
+  uint32_t bandBandwidth = 78125;
+  Ptr<SpectrumValue> c = Create<SpectrumValue> (GetSpectrumModel (centerFrequency, channelWidth, bandBandwidth, guardBandwidth));
+
+  //Build spectrum mask
+  Values::iterator vit = c->ValuesBegin ();
+  Bands::const_iterator bit = c->ConstBandsBegin ();
+  double txPowerPerBandW = (txPowerW / (ru.second - ru.first + 1)); //FIXME: null subcarriers
+  uint32_t numBands = c->GetSpectrumModel ()->GetNumBands ();
+  for (size_t i = 0; i < numBands; i++, vit++, bit++)
+    {
+      if (i < ru.first || i > ru.second) //outside the spectrum mask
+        {
+          *vit = 0.0;
+        }
+      else
+        {
+          *vit = (txPowerPerBandW / (bit->fh - bit->fl));
+        }
+    }
+  
+  return c;
+}
+
+Ptr<SpectrumValue>
 WifiSpectrumValueHelper::CreateNoisePowerSpectralDensity (uint32_t centerFrequency, uint16_t channelWidth, uint32_t bandBandwidth, double noiseFigure, uint16_t guardBandwidth)
 {
   Ptr<SpectrumModel> model = GetSpectrumModel (centerFrequency, channelWidth, bandBandwidth, guardBandwidth);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/model/wifi-spectrum-value-helper.h ns-3.34/src/spectrum/model/wifi-spectrum-value-helper.h
--- ns-3.33/src/spectrum/model/wifi-spectrum-value-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/model/wifi-spectrum-value-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -131,6 +131,20 @@
                                                                 double minInnerBandDbr = -20, double minOuterbandDbr = -28, double lowestPointDbr = -40);
 
   /**
+   * Create a transmit power spectral density corresponding to the OFDMA part
+   * of HE TB PPDUs for a given RU.
+   * An ideal (i.e. rectangular) spectral mask is considered for the time being.
+   *
+   * \param centerFrequency center frequency (MHz)
+   * \param channelWidth channel width (MHz)
+   * \param txPowerW  transmit power (W) to allocate
+   * \param guardBandwidth width of the guard band (MHz)
+   * \param ru the RU band used by the STA
+   * \return a pointer to a newly allocated SpectrumValue representing the HE OFDM Transmit Power Spectral Density on the RU used by the STA in W/Hz for each Band
+   */
+  static Ptr<SpectrumValue> CreateHeMuOfdmTxPowerSpectralDensity (uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, WifiSpectrumBand ru);
+
+  /**
    * Create a power spectral density corresponding to the noise
    *
    * \param centerFrequency center frequency (MHz)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/spectrum/test/three-gpp-channel-test-suite.cc ns-3.34/src/spectrum/test/three-gpp-channel-test-suite.cc
--- ns-3.33/src/spectrum/test/three-gpp-channel-test-suite.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/spectrum/test/three-gpp-channel-test-suite.cc	2021-07-14 10:31:07.000000000 -0700
@@ -27,7 +27,8 @@
 #include "ns3/pointer.h"
 #include "ns3/node-container.h"
 #include "ns3/constant-position-mobility-model.h"
-#include "ns3/three-gpp-antenna-array-model.h"
+#include "ns3/uniform-planar-array.h"
+#include "ns3/isotropic-antenna-model.h"
 #include "ns3/three-gpp-channel-model.h"
 #include "ns3/simple-net-device.h"
 #include "ns3/simulator.h"
@@ -71,7 +72,7 @@
    * \param txAntenna the antenna object associated to the first node
    * \param rxAntenna the antenna object associated to the second node
    */
-  void DoComputeNorm (Ptr<ThreeGppChannelModel> channelModel, Ptr<MobilityModel> txMob, Ptr<MobilityModel> rxMob, Ptr<ThreeGppAntennaArrayModel> txAntenna, Ptr<ThreeGppAntennaArrayModel> rxAntenna);
+  void DoComputeNorm (Ptr<ThreeGppChannelModel> channelModel, Ptr<MobilityModel> txMob, Ptr<MobilityModel> rxMob, Ptr<PhasedArrayModel> txAntenna, Ptr<PhasedArrayModel> rxAntenna);
 
   std::vector<double> m_normVector; //!< each element is the norm of a channel realization
 };
@@ -86,7 +87,7 @@
 }
 
 void
-ThreeGppChannelMatrixComputationTest::DoComputeNorm (Ptr<ThreeGppChannelModel> channelModel, Ptr<MobilityModel> txMob, Ptr<MobilityModel> rxMob, Ptr<ThreeGppAntennaArrayModel> txAntenna, Ptr<ThreeGppAntennaArrayModel> rxAntenna)
+ThreeGppChannelMatrixComputationTest::DoComputeNorm (Ptr<ThreeGppChannelModel> channelModel, Ptr<MobilityModel> txMob, Ptr<MobilityModel> rxMob, Ptr<PhasedArrayModel> txAntenna, Ptr<PhasedArrayModel> rxAntenna)
 {
   uint64_t txAntennaElements = txAntenna->GetNumberOfElements ();
   uint64_t rxAntennaElements = rxAntenna->GetNumberOfElements ();
@@ -153,8 +154,12 @@
   nodes.Get (1)->AggregateObject (rxMob);
 
   // create the tx and rx antennas and set the their dimensions
-  Ptr<ThreeGppAntennaArrayModel> txAntenna = CreateObjectWithAttributes<ThreeGppAntennaArrayModel> ("NumColumns", UintegerValue (txAntennaElements [0]), "NumRows", UintegerValue (txAntennaElements [1]), "IsotropicElements", BooleanValue (true));
-  Ptr<ThreeGppAntennaArrayModel> rxAntenna = CreateObjectWithAttributes<ThreeGppAntennaArrayModel> ("NumColumns", UintegerValue (rxAntennaElements [0]), "NumRows", UintegerValue (rxAntennaElements [1]), "IsotropicElements", BooleanValue (true));
+  Ptr<PhasedArrayModel> txAntenna = CreateObjectWithAttributes<UniformPlanarArray> ("NumColumns", UintegerValue (txAntennaElements [0]),
+                                                                                    "NumRows", UintegerValue (txAntennaElements [1]),
+                                                                                    "AntennaElement", PointerValue(CreateObject<IsotropicAntennaModel> ()));
+  Ptr<PhasedArrayModel> rxAntenna = CreateObjectWithAttributes<UniformPlanarArray> ("NumColumns", UintegerValue (rxAntennaElements [0]),
+                                                                                    "NumRows", UintegerValue (rxAntennaElements [1]),
+                                                                                    "AntennaElement", PointerValue(CreateObject<IsotropicAntennaModel> ()));
 
   // generate the channel matrix
   Ptr<const ThreeGppChannelModel::ChannelMatrix> channelMatrix = channelModel->GetChannel (txMob, rxMob, txAntenna, rxAntenna);
@@ -235,7 +240,7 @@
    * \param rxAntenna the antenna object associated to the second node
    * \param update whether if the channel matrix should be updated or not
    */
-  void DoGetChannel (Ptr<ThreeGppChannelModel> channelModel, Ptr<MobilityModel> txMob, Ptr<MobilityModel> rxMob, Ptr<ThreeGppAntennaArrayModel> txAntenna, Ptr<ThreeGppAntennaArrayModel> rxAntenna, bool update);
+  void DoGetChannel (Ptr<ThreeGppChannelModel> channelModel, Ptr<MobilityModel> txMob, Ptr<MobilityModel> rxMob, Ptr<PhasedArrayModel> txAntenna, Ptr<PhasedArrayModel> rxAntenna, bool update);
 
   Ptr<const ThreeGppChannelModel::ChannelMatrix> m_currentChannel; //!< used by DoGetChannel to store the current channel matrix
 };
@@ -250,7 +255,7 @@
 }
 
 void
-ThreeGppChannelMatrixUpdateTest::DoGetChannel (Ptr<ThreeGppChannelModel> channelModel, Ptr<MobilityModel> txMob, Ptr<MobilityModel> rxMob, Ptr<ThreeGppAntennaArrayModel> txAntenna, Ptr<ThreeGppAntennaArrayModel> rxAntenna, bool update)
+ThreeGppChannelMatrixUpdateTest::DoGetChannel (Ptr<ThreeGppChannelModel> channelModel, Ptr<MobilityModel> txMob, Ptr<MobilityModel> rxMob, Ptr<PhasedArrayModel> txAntenna, Ptr<PhasedArrayModel> rxAntenna, bool update)
 {
   // retrieve the channel matrix
   Ptr<const ThreeGppChannelModel::ChannelMatrix> channelMatrix = channelModel->GetChannel (txMob, rxMob, txAntenna, rxAntenna);
@@ -312,22 +317,29 @@
   nodes.Get (1)->AggregateObject (rxMob);
 
   // create the tx and rx antennas and set the their dimensions
-  Ptr<ThreeGppAntennaArrayModel> txAntenna = CreateObjectWithAttributes<ThreeGppAntennaArrayModel> ("NumColumns", UintegerValue (txAntennaElements [0]), "NumRows", UintegerValue (txAntennaElements [1]), "IsotropicElements", BooleanValue (true));
-  Ptr<ThreeGppAntennaArrayModel> rxAntenna = CreateObjectWithAttributes<ThreeGppAntennaArrayModel> ("NumColumns", UintegerValue (rxAntennaElements [0]), "NumRows", UintegerValue (rxAntennaElements [1]), "IsotropicElements", BooleanValue (true));
-
+  Ptr<PhasedArrayModel> txAntenna = CreateObjectWithAttributes<UniformPlanarArray> ("NumColumns", UintegerValue (txAntennaElements [0]),
+                                                                                    "NumRows", UintegerValue (txAntennaElements [1]),
+                                                                                    "AntennaElement", PointerValue(CreateObject<IsotropicAntennaModel> ()));
+  Ptr<PhasedArrayModel> rxAntenna = CreateObjectWithAttributes<UniformPlanarArray> ("NumColumns", UintegerValue (rxAntennaElements [0]),
+                                                                                    "NumRows", UintegerValue (rxAntennaElements [1]),
+                                                                                    "AntennaElement", PointerValue(CreateObject<IsotropicAntennaModel> ()));
+  
   // check if the channel matrix is correctly updated
 
   // compute the channel matrix for the first time
   uint32_t firstTimeMs = 1; // time instant at which the channel matrix is generated for the first time
-  Simulator::Schedule (MilliSeconds (firstTimeMs), &ThreeGppChannelMatrixUpdateTest::DoGetChannel, this, channelModel, txMob, rxMob, txAntenna, rxAntenna, true);
+  Simulator::Schedule (MilliSeconds (firstTimeMs), &ThreeGppChannelMatrixUpdateTest::DoGetChannel,
+                       this, channelModel, txMob, rxMob, txAntenna, rxAntenna, true);
 
   // call GetChannel before the update period is exceeded, the channel matrix
   // should not be updated
-  Simulator::Schedule (MilliSeconds (firstTimeMs + updatePeriodMs / 2), &ThreeGppChannelMatrixUpdateTest::DoGetChannel, this, channelModel, txMob, rxMob, txAntenna, rxAntenna, false);
+  Simulator::Schedule (MilliSeconds (firstTimeMs + updatePeriodMs / 2), &ThreeGppChannelMatrixUpdateTest::DoGetChannel,
+                       this, channelModel, txMob, rxMob, txAntenna, rxAntenna, false);
 
   // call GetChannel when the update period is exceeded, the channel matrix
   // should be recomputed
-  Simulator::Schedule (MilliSeconds (firstTimeMs + updatePeriodMs + 1), &ThreeGppChannelMatrixUpdateTest::DoGetChannel, this, channelModel, txMob, rxMob, txAntenna, rxAntenna, true);
+  Simulator::Schedule (MilliSeconds (firstTimeMs + updatePeriodMs + 1), &ThreeGppChannelMatrixUpdateTest::DoGetChannel,
+                       this, channelModel, txMob, rxMob, txAntenna, rxAntenna, true);
 
   Simulator::Run ();
   Simulator::Destroy ();
@@ -367,7 +379,7 @@
    * \param otherDevice the device to communicate with
    * \param otherAntenna the antenna object associated to otherDevice
    */
-  void DoBeamforming (Ptr<NetDevice> thisDevice, Ptr<ThreeGppAntennaArrayModel> thisAntenna, Ptr<NetDevice> otherDevice, Ptr<ThreeGppAntennaArrayModel> otherAntenna);
+  void DoBeamforming (Ptr<NetDevice> thisDevice, Ptr<PhasedArrayModel> thisAntenna, Ptr<NetDevice> otherDevice, Ptr<PhasedArrayModel> otherAntenna);
 
   /**
    * Test of the long term component is correctly updated when the channel
@@ -400,35 +412,15 @@
 }
 
 void
-ThreeGppSpectrumPropagationLossModelTest::DoBeamforming (Ptr<NetDevice> thisDevice, Ptr<ThreeGppAntennaArrayModel> thisAntenna, Ptr<NetDevice> otherDevice, Ptr<ThreeGppAntennaArrayModel> otherAntenna)
+ThreeGppSpectrumPropagationLossModelTest::DoBeamforming (Ptr<NetDevice> thisDevice, Ptr<PhasedArrayModel> thisAntenna, Ptr<NetDevice> otherDevice, Ptr<PhasedArrayModel> otherAntenna)
 {
-  ThreeGppAntennaArrayModel::ComplexVector antennaWeights;
-
   Vector aPos = thisDevice->GetNode ()->GetObject<MobilityModel> ()->GetPosition ();
   Vector bPos = otherDevice->GetNode ()->GetObject<MobilityModel> ()->GetPosition ();
 
   // compute the azimuth and the elevation angles
   Angles completeAngle (bPos,aPos);
 
-  double hAngleRadian = fmod (completeAngle.phi, 2.0 * M_PI); // the azimuth angle
-  if (hAngleRadian < 0)
-  {
-    hAngleRadian += 2.0 * M_PI;     
-  } 
-  double vAngleRadian = completeAngle.theta; // the elevation angle
-
-  int totNoArrayElements = thisAntenna->GetNumberOfElements ();
-  double power = 1 / sqrt (totNoArrayElements);
-
-  for (int ind = 0; ind < totNoArrayElements; ind++)
-    {
-      Vector loc = thisAntenna->GetElementLocation (ind);
-      double phase = -2 * M_PI * (sin (vAngleRadian) * cos (hAngleRadian) * loc.x
-                                  + sin (vAngleRadian) * sin (hAngleRadian) * loc.y
-                                  + cos (vAngleRadian) * loc.z);
-      antennaWeights.push_back (exp (std::complex<double> (0, phase)) * power);
-    }
-
+  PhasedArrayModel::ComplexVector antennaWeights = thisAntenna->GetBeamformingVector (completeAngle);
   thisAntenna->SetBeamformingVector (antennaWeights);
 }
 
@@ -499,9 +491,13 @@
   nodes.Get (1)->AggregateObject (rxMob);
 
   // create the tx and rx antennas and set the their dimensions
-  Ptr<ThreeGppAntennaArrayModel> txAntenna = CreateObjectWithAttributes<ThreeGppAntennaArrayModel> ("NumColumns", UintegerValue (txAntennaElements [0]), "NumRows", UintegerValue (txAntennaElements [1]));
-  Ptr<ThreeGppAntennaArrayModel> rxAntenna = CreateObjectWithAttributes<ThreeGppAntennaArrayModel> ("NumColumns", UintegerValue (rxAntennaElements [0]), "NumRows", UintegerValue (rxAntennaElements [1]));
-
+  Ptr<PhasedArrayModel> txAntenna = CreateObjectWithAttributes<UniformPlanarArray> ("NumColumns", UintegerValue (txAntennaElements [0]),
+                                                                                    "NumRows", UintegerValue (txAntennaElements [1]),
+                                                                                    "AntennaElement", PointerValue(CreateObject<IsotropicAntennaModel> ()));
+  Ptr<PhasedArrayModel> rxAntenna = CreateObjectWithAttributes<UniformPlanarArray> ("NumColumns", UintegerValue (rxAntennaElements [0]),
+                                                                                    "NumRows", UintegerValue (rxAntennaElements [1]),
+                                                                                    "AntennaElement", PointerValue(CreateObject<IsotropicAntennaModel> ()));
+  
   // initialize ThreeGppSpectrumPropagationLossModel
   lossModel->AddDevice (txDev, txAntenna);
   lossModel->AddDevice (rxDev, rxAntenna);
@@ -526,7 +522,7 @@
   // 2) check if the long term is updated when changing the BF vector
   // change the position of the rx device and recompute the beamforming vectors
   rxMob->SetPosition (Vector (10.0, 5.0, 10.0));
-  ThreeGppAntennaArrayModel::ComplexVector txBfVector = txAntenna->GetBeamformingVector ();
+  PhasedArrayModel::ComplexVector txBfVector = txAntenna->GetBeamformingVector ();
   txBfVector [0] = std::complex<double> (0.0, 0.0);
   txAntenna->SetBeamformingVector (txBfVector);
 
@@ -537,7 +533,8 @@
   rxPsdOld = rxPsdNew;
 
   // 3) check if the long term is updated when the channel matrix is recomputed
-  Simulator::Schedule (MilliSeconds (101), &ThreeGppSpectrumPropagationLossModelTest::CheckLongTermUpdate, this, lossModel, txPsd, txMob, rxMob, rxPsdOld);
+  Simulator::Schedule (MilliSeconds (101), &ThreeGppSpectrumPropagationLossModelTest::CheckLongTermUpdate,
+                       this, lossModel, txPsd, txMob, rxMob, rxPsdOld);
 
   Simulator::Run ();
   Simulator::Destroy ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/tap-bridge/bindings/modulegen__gcc_ILP32.py ns-3.34/src/tap-bridge/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/tap-bridge/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/tap-bridge/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -81,12 +81,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -429,8 +433,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1018,6 +1024,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1382,6 +1396,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1595,6 +1621,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1670,6 +1701,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1690,6 +1733,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/tap-bridge/bindings/modulegen__gcc_LP64.py ns-3.34/src/tap-bridge/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/tap-bridge/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/tap-bridge/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -81,12 +81,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -429,8 +433,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1018,6 +1024,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1382,6 +1396,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1595,6 +1621,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1670,6 +1701,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1690,6 +1733,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/tap-bridge/examples/tap-wifi-virtual-machine.py ns-3.34/src/tap-bridge/examples/tap-wifi-virtual-machine.py
--- ns-3.33/src/tap-bridge/examples/tap-wifi-virtual-machine.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/tap-bridge/examples/tap-wifi-virtual-machine.py	2021-07-14 10:31:07.000000000 -0700
@@ -61,7 +61,7 @@
     # Configure the physical layer.
     #
     wifiChannel = ns.wifi.YansWifiChannelHelper.Default()
-    wifiPhy = ns.wifi.YansWifiPhyHelper.Default()
+    wifiPhy = ns.wifi.YansWifiPhyHelper()
     wifiPhy.SetChannel(wifiChannel.Create())
 
     #
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/tap-bridge/examples/virtual-network-setup.sh ns-3.34/src/tap-bridge/examples/virtual-network-setup.sh
--- ns-3.33/src/tap-bridge/examples/virtual-network-setup.sh	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/tap-bridge/examples/virtual-network-setup.sh	2021-07-14 10:31:07.000000000 -0700
@@ -9,8 +9,14 @@
 ifconfig br-left up
 brctl addif br-right tap-right
 ifconfig br-right up
+# Note:  you also need to have loaded br_netfilter module
+# ('modprobe br_netfilter') to enable /proc/sys/net/bridge
 pushd /proc/sys/net/bridge
 for f in bridge-nf-*; do echo 0 > $f; done
 popd
-lxc-create -n left -f lxc-left.conf
-lxc-create -n right -f lxc-right.conf
+# lxc-create now requires a template parameter, such as '-t ubuntu'
+lxc-create -n left -t ubuntu -f lxc-left.conf
+lxc-create -n right -t ubuntu -f lxc-right.conf
+# Start both containers
+lxc-start -n left -d
+lxc-start -n right -d
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/tap-bridge/examples/virtual-network-teardown.sh ns-3.34/src/tap-bridge/examples/virtual-network-teardown.sh
--- ns-3.33/src/tap-bridge/examples/virtual-network-teardown.sh	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/tap-bridge/examples/virtual-network-teardown.sh	2021-07-14 10:31:07.000000000 -0700
@@ -1,4 +1,6 @@
 #!/bin/sh
+lxc-stop -n left
+lxc-stop -n right
 lxc-destroy -n left
 lxc-destroy -n right
 ifconfig br-left down
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/test/ns3tc/fq-cobalt-queue-disc-test-suite.cc ns-3.34/src/test/ns3tc/fq-cobalt-queue-disc-test-suite.cc
--- ns-3.33/src/test/ns3tc/fq-cobalt-queue-disc-test-suite.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/test/ns3tc/fq-cobalt-queue-disc-test-suite.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,1125 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016 Universita' degli Studi di Napoli Federico II
+ * Copyright (c) 2020 NITK Surathkal (adapted for COBALT)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Pasquale Imputato <p.imputato@gmail.com>
+ *          Stefano Avallone <stefano.avallone@unina.it>
+ * Modified by: Bhaskar Kataria <bhaskar.k7920@gmail.com> (COBALT changes)
+ */
+
+#include "ns3/test.h"
+#include "ns3/simulator.h"
+#include "ns3/fq-cobalt-queue-disc.h"
+#include "ns3/cobalt-queue-disc.h"
+#include "ns3/ipv4-header.h"
+#include "ns3/ipv4-packet-filter.h"
+#include "ns3/ipv4-queue-disc-item.h"
+#include "ns3/ipv4-address.h"
+#include "ns3/ipv6-header.h"
+#include "ns3/ipv6-packet-filter.h"
+#include "ns3/ipv6-queue-disc-item.h"
+#include "ns3/tcp-header.h"
+#include "ns3/udp-header.h"
+#include "ns3/string.h"
+#include "ns3/pointer.h"
+
+using namespace ns3;
+
+// Variable to assign m_hash to a new packet's flow
+int32_t m_hash;
+
+/**
+ * Simple test packet filter able to classify IPv4 packets
+ *
+ */
+class Ipv4FqCobaltTestPacketFilter : public Ipv4PacketFilter {
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  Ipv4FqCobaltTestPacketFilter ();
+  virtual ~Ipv4FqCobaltTestPacketFilter ();
+
+private:
+  virtual int32_t DoClassify (Ptr<QueueDiscItem> item) const;
+  virtual bool CheckProtocol (Ptr<QueueDiscItem> item) const;
+};
+
+TypeId
+Ipv4FqCobaltTestPacketFilter::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::Ipv4FqCobaltTestPacketFilter")
+    .SetParent<Ipv4PacketFilter> ()
+    .SetGroupName ("Internet")
+    .AddConstructor<Ipv4FqCobaltTestPacketFilter> ()
+  ;
+  return tid;
+}
+
+Ipv4FqCobaltTestPacketFilter::Ipv4FqCobaltTestPacketFilter ()
+{
+}
+
+Ipv4FqCobaltTestPacketFilter::~Ipv4FqCobaltTestPacketFilter ()
+{
+}
+
+int32_t
+Ipv4FqCobaltTestPacketFilter::DoClassify (Ptr<QueueDiscItem> item) const
+{
+  return m_hash;
+}
+
+bool
+Ipv4FqCobaltTestPacketFilter::CheckProtocol (Ptr<QueueDiscItem> item) const
+{
+  return true;
+}
+
+/**
+ * This class tests packets for which there is no suitable filter
+ */
+class FqCobaltQueueDiscNoSuitableFilter : public TestCase
+{
+public:
+  FqCobaltQueueDiscNoSuitableFilter ();
+  virtual ~FqCobaltQueueDiscNoSuitableFilter ();
+
+private:
+  virtual void DoRun (void);
+};
+
+FqCobaltQueueDiscNoSuitableFilter::FqCobaltQueueDiscNoSuitableFilter ()
+  : TestCase ("Test packets that are not classified by any filter")
+{
+}
+
+FqCobaltQueueDiscNoSuitableFilter::~FqCobaltQueueDiscNoSuitableFilter ()
+{
+}
+
+void
+FqCobaltQueueDiscNoSuitableFilter::DoRun (void)
+{
+  // Packets that cannot be classified by the available filters should be dropped
+  Ptr<FqCobaltQueueDisc> queueDisc = CreateObjectWithAttributes<FqCobaltQueueDisc> ("MaxSize", StringValue ("4p"));
+  Ptr<Ipv4FqCobaltTestPacketFilter> filter = CreateObject<Ipv4FqCobaltTestPacketFilter> ();
+  queueDisc->AddPacketFilter (filter);
+
+  m_hash = -1;
+  queueDisc->SetQuantum (1500);
+  queueDisc->Initialize ();
+
+  Ptr<Packet> p;
+  p = Create<Packet> ();
+  Ptr<Ipv6QueueDiscItem> item;
+  Ipv6Header ipv6Header;
+  Address dest;
+  item = Create<Ipv6QueueDiscItem> (p, dest, 0, ipv6Header);
+  queueDisc->Enqueue (item);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetNQueueDiscClasses (), 0, "no flow queue should have been created");
+
+  p = Create<Packet> (reinterpret_cast<const uint8_t*> ("hello, world"), 12);
+  item = Create<Ipv6QueueDiscItem> (p, dest, 0, ipv6Header);
+  queueDisc->Enqueue (item);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetNQueueDiscClasses (), 0, "no flow queue should have been created");
+
+  Simulator::Destroy ();
+}
+
+/**
+ * This class tests the IP flows separation and the packet limit
+ */
+class FqCobaltQueueDiscIPFlowsSeparationAndPacketLimit : public TestCase
+{
+public:
+  FqCobaltQueueDiscIPFlowsSeparationAndPacketLimit ();
+  virtual ~FqCobaltQueueDiscIPFlowsSeparationAndPacketLimit ();
+
+private:
+  virtual void DoRun (void);
+  void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr);
+};
+
+FqCobaltQueueDiscIPFlowsSeparationAndPacketLimit::FqCobaltQueueDiscIPFlowsSeparationAndPacketLimit ()
+  : TestCase ("Test IP flows separation and packet limit")
+{
+}
+
+FqCobaltQueueDiscIPFlowsSeparationAndPacketLimit::~FqCobaltQueueDiscIPFlowsSeparationAndPacketLimit ()
+{
+}
+
+void
+FqCobaltQueueDiscIPFlowsSeparationAndPacketLimit::AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr)
+{
+  Ptr<Packet> p = Create<Packet> (100);
+  Address dest;
+  Ptr<Ipv4QueueDiscItem> item = Create<Ipv4QueueDiscItem> (p, dest, 0, hdr);
+  queue->Enqueue (item);
+}
+
+void
+FqCobaltQueueDiscIPFlowsSeparationAndPacketLimit::DoRun (void)
+{
+  Ptr<FqCobaltQueueDisc> queueDisc = CreateObjectWithAttributes<FqCobaltQueueDisc> ("MaxSize", StringValue ("4p"));
+
+  queueDisc->SetQuantum (1500);
+  queueDisc->Initialize ();
+
+  Ipv4Header hdr;
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (7);
+
+  // Add three packets from the first flow
+  AddPacket (queueDisc, hdr);
+  AddPacket (queueDisc, hdr);
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 3, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the flow queue");
+
+  // Add two packets from the second flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.7"));
+  // Add the first packet
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 4, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the flow queue");
+  // Add the second packet that causes two packets to be dropped from the fat flow (max backlog = 300, threshold = 150)
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 3, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the flow queue");
+
+  Simulator::Destroy ();
+}
+
+/**
+ * This class tests the deficit per flow
+ */
+class FqCobaltQueueDiscDeficit : public TestCase
+{
+public:
+  FqCobaltQueueDiscDeficit ();
+  virtual ~FqCobaltQueueDiscDeficit ();
+
+private:
+  virtual void DoRun (void);
+  void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr);
+};
+
+FqCobaltQueueDiscDeficit::FqCobaltQueueDiscDeficit ()
+  : TestCase ("Test credits and flows status")
+{
+}
+
+FqCobaltQueueDiscDeficit::~FqCobaltQueueDiscDeficit ()
+{
+}
+
+void
+FqCobaltQueueDiscDeficit::AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr)
+{
+  Ptr<Packet> p = Create<Packet> (100);
+  Address dest;
+  Ptr<Ipv4QueueDiscItem> item = Create<Ipv4QueueDiscItem> (p, dest, 0, hdr);
+  queue->Enqueue (item);
+}
+
+void
+FqCobaltQueueDiscDeficit::DoRun (void)
+{
+  Ptr<FqCobaltQueueDisc> queueDisc = CreateObjectWithAttributes<FqCobaltQueueDisc> ();
+
+  queueDisc->SetQuantum (90);
+  queueDisc->Initialize ();
+
+  Ipv4Header hdr;
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (7);
+
+  // Add a packet from the first flow
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 1, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the first flow queue");
+  Ptr<FqCobaltFlow> flow1 = StaticCast<FqCobaltFlow> (queueDisc->GetQueueDiscClass (0));
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), static_cast<int32_t> (queueDisc->GetQuantum ()), "the deficit of the first flow must equal the quantum");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqCobaltFlow::NEW_FLOW, "the first flow must be in the list of new queues");
+  // Dequeue a packet
+  queueDisc->Dequeue ();
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 0, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 0, "unexpected number of packets in the first flow queue");
+  // the deficit for the first flow becomes 90 - (100+20) = -30
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), -30, "unexpected deficit for the first flow");
+
+  // Add two packets from the first flow
+  AddPacket (queueDisc, hdr);
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 2, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqCobaltFlow::NEW_FLOW, "the first flow must still be in the list of new queues");
+
+  // Add two packets from the second flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.10"));
+  AddPacket (queueDisc, hdr);
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 4, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the second flow queue");
+  Ptr<FqCobaltFlow> flow2 = StaticCast<FqCobaltFlow> (queueDisc->GetQueueDiscClass (1));
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetDeficit (), static_cast<int32_t> (queueDisc->GetQuantum ()), "the deficit of the second flow must equal the quantum");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetStatus (), FqCobaltFlow::NEW_FLOW, "the second flow must be in the list of new queues");
+
+  // Dequeue a packet (from the second flow, as the first flow has a negative deficit)
+  queueDisc->Dequeue ();
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 3, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+  // the first flow got a quantum of deficit (-30+90=60) and has been moved to the end of the list of old queues
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), 60, "unexpected deficit for the first flow");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqCobaltFlow::OLD_FLOW, "the first flow must be in the list of old queues");
+  // the second flow has a negative deficit (-30) and is still in the list of new queues
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetDeficit (), -30, "unexpected deficit for the second flow");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetStatus (), FqCobaltFlow::NEW_FLOW, "the second flow must be in the list of new queues");
+
+  // Dequeue a packet (from the first flow, as the second flow has a negative deficit)
+  queueDisc->Dequeue ();
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 2, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+  // the first flow has a negative deficit (60-(100+20)= -60) and stays in the list of old queues
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), -60, "unexpected deficit for the first flow");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqCobaltFlow::OLD_FLOW, "the first flow must be in the list of old queues");
+  // the second flow got a quantum of deficit (-30+90=60) and has been moved to the end of the list of old queues
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetDeficit (), 60, "unexpected deficit for the second flow");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetStatus (), FqCobaltFlow::OLD_FLOW, "the second flow must be in the list of new queues");
+
+  // Dequeue a packet (from the second flow, as the first flow has a negative deficit)
+  queueDisc->Dequeue ();
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 1, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 0, "unexpected number of packets in the second flow queue");
+  // the first flow got a quantum of deficit (-60+90=30) and has been moved to the end of the list of old queues
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), 30, "unexpected deficit for the first flow");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqCobaltFlow::OLD_FLOW, "the first flow must be in the list of old queues");
+  // the second flow has a negative deficit (60-(100+20)= -60)
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetDeficit (), -60, "unexpected deficit for the second flow");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetStatus (), FqCobaltFlow::OLD_FLOW, "the second flow must be in the list of new queues");
+
+  // Dequeue a packet (from the first flow, as the second flow has a negative deficit)
+  queueDisc->Dequeue ();
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 0, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 0, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 0, "unexpected number of packets in the second flow queue");
+  // the first flow has a negative deficit (30-(100+20)= -90)
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), -90, "unexpected deficit for the first flow");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqCobaltFlow::OLD_FLOW, "the first flow must be in the list of old queues");
+  // the second flow got a quantum of deficit (-60+90=30) and has been moved to the end of the list of old queues
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetDeficit (), 30, "unexpected deficit for the second flow");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetStatus (), FqCobaltFlow::OLD_FLOW, "the second flow must be in the list of new queues");
+
+  // Dequeue a packet
+  queueDisc->Dequeue ();
+  // the first flow is at the head of the list of old queues but has a negative deficit, thus it gets a quantun
+  // of deficit (-90+90=0) and is moved to the end of the list of old queues. Then, the second flow (which has a
+  // positive deficit) is selected, but the second flow is empty and thus it is set to inactive. The first flow is
+  // reconsidered, but it has a null deficit, hence it gets another quantum of deficit (0+90=90). Then, the first
+  // flow is reconsidered again, now it has a positive deficit and hence it is selected. But, it is empty and
+  // therefore is set to inactive, too.
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), 90, "unexpected deficit for the first flow");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqCobaltFlow::INACTIVE, "the first flow must be inactive");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetDeficit (), 30, "unexpected deficit for the second flow");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetStatus (), FqCobaltFlow::INACTIVE, "the second flow must be inactive");
+
+  Simulator::Destroy ();
+}
+
+/**
+ * This class tests the TCP flows separation
+ */
+class FqCobaltQueueDiscTCPFlowsSeparation : public TestCase
+{
+public:
+  FqCobaltQueueDiscTCPFlowsSeparation ();
+  virtual ~FqCobaltQueueDiscTCPFlowsSeparation ();
+
+private:
+  virtual void DoRun (void);
+  void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header ipHdr, TcpHeader tcpHdr);
+};
+
+FqCobaltQueueDiscTCPFlowsSeparation::FqCobaltQueueDiscTCPFlowsSeparation ()
+  : TestCase ("Test TCP flows separation")
+{
+}
+
+FqCobaltQueueDiscTCPFlowsSeparation::~FqCobaltQueueDiscTCPFlowsSeparation ()
+{
+}
+
+void
+FqCobaltQueueDiscTCPFlowsSeparation::AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header ipHdr, TcpHeader tcpHdr)
+{
+  Ptr<Packet> p = Create<Packet> (100);
+  p->AddHeader (tcpHdr);
+  Address dest;
+  Ptr<Ipv4QueueDiscItem> item = Create<Ipv4QueueDiscItem> (p, dest, 0, ipHdr);
+  queue->Enqueue (item);
+}
+
+void
+FqCobaltQueueDiscTCPFlowsSeparation::DoRun (void)
+{
+  Ptr<FqCobaltQueueDisc> queueDisc = CreateObjectWithAttributes<FqCobaltQueueDisc> ("MaxSize", StringValue ("10p"));
+
+  queueDisc->SetQuantum (1500);
+  queueDisc->Initialize ();
+
+  Ipv4Header hdr;
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (6);
+
+  TcpHeader tcpHdr;
+  tcpHdr.SetSourcePort (7);
+  tcpHdr.SetDestinationPort (27);
+
+  // Add three packets from the first flow
+  AddPacket (queueDisc, hdr, tcpHdr);
+  AddPacket (queueDisc, hdr, tcpHdr);
+  AddPacket (queueDisc, hdr, tcpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 3, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+
+  // Add a packet from the second flow
+  tcpHdr.SetSourcePort (8);
+  AddPacket (queueDisc, hdr, tcpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 4, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+
+  // Add a packet from the third flow
+  tcpHdr.SetDestinationPort (28);
+  AddPacket (queueDisc, hdr, tcpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 5, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (2)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the third flow queue");
+
+  // Add two packets from the fourth flow
+  tcpHdr.SetSourcePort (7);
+  AddPacket (queueDisc, hdr, tcpHdr);
+  AddPacket (queueDisc, hdr, tcpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 7, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (2)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the third flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (3)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the third flow queue");
+
+  Simulator::Destroy ();
+}
+
+/**
+ * This class tests the UDP flows separation
+ */
+class FqCobaltQueueDiscUDPFlowsSeparation : public TestCase
+{
+public:
+  FqCobaltQueueDiscUDPFlowsSeparation ();
+  virtual ~FqCobaltQueueDiscUDPFlowsSeparation ();
+
+private:
+  virtual void DoRun (void);
+  void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header ipHdr, UdpHeader udpHdr);
+};
+
+FqCobaltQueueDiscUDPFlowsSeparation::FqCobaltQueueDiscUDPFlowsSeparation ()
+  : TestCase ("Test UDP flows separation")
+{
+}
+
+FqCobaltQueueDiscUDPFlowsSeparation::~FqCobaltQueueDiscUDPFlowsSeparation ()
+{
+}
+
+void
+FqCobaltQueueDiscUDPFlowsSeparation::AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header ipHdr, UdpHeader udpHdr)
+{
+  Ptr<Packet> p = Create<Packet> (100);
+  p->AddHeader (udpHdr);
+  Address dest;
+  Ptr<Ipv4QueueDiscItem> item = Create<Ipv4QueueDiscItem> (p, dest, 0, ipHdr);
+  queue->Enqueue (item);
+}
+
+void
+FqCobaltQueueDiscUDPFlowsSeparation::DoRun (void)
+{
+  Ptr<FqCobaltQueueDisc> queueDisc = CreateObjectWithAttributes<FqCobaltQueueDisc> ("MaxSize", StringValue ("10p"));
+
+  queueDisc->SetQuantum (1500);
+  queueDisc->Initialize ();
+
+  Ipv4Header hdr;
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (17);
+
+  UdpHeader udpHdr;
+  udpHdr.SetSourcePort (7);
+  udpHdr.SetDestinationPort (27);
+
+  // Add three packets from the first flow
+  AddPacket (queueDisc, hdr, udpHdr);
+  AddPacket (queueDisc, hdr, udpHdr);
+  AddPacket (queueDisc, hdr, udpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 3, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+
+  // Add a packet from the second flow
+  udpHdr.SetSourcePort (8);
+  AddPacket (queueDisc, hdr, udpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 4, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+
+  // Add a packet from the third flow
+  udpHdr.SetDestinationPort (28);
+  AddPacket (queueDisc, hdr, udpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 5, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (2)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the third flow queue");
+
+  // Add two packets from the fourth flow
+  udpHdr.SetSourcePort (7);
+  AddPacket (queueDisc, hdr, udpHdr);
+  AddPacket (queueDisc, hdr, udpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 7, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (2)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the third flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (3)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the third flow queue");
+
+  Simulator::Destroy ();
+}
+
+/**
+ * This class tests ECN marking
+ * The test is divided into 3 sub test cases.
+ * 1) CE threshold disabled
+ * This test enqueues 100 packets in the beginning of the test and dequeues 60 (some packets are dropped too) packets with the
+ * delay of 110ms. This test checks that ECT0 packets are marked and are marked appropriately and NotECT packets are dropped.
+ * 
+ * 2) CE threshold enabled.
+ * This test enqueues 100 packets in the beginning of the test and dequeues 60 packets with delay of 1ms. This test checks that
+ * the ECT0 packets are marked appropriately at CE threshold.
+ * 
+ * 3) CE threshold enabled with higher queue delay.
+ * This test is similar to the 2nd sub test cases just with higher queue delay and aims to test that the packets are not
+ * marked twice
+ * Any future classifier options (e.g. SetAssociativehash) should be disabled to prevent a hash collision on this test case.
+ */
+class FqCobaltQueueDiscEcnMarking : public TestCase
+{
+public:
+  FqCobaltQueueDiscEcnMarking ();
+  virtual ~FqCobaltQueueDiscEcnMarking ();
+
+private:
+  virtual void DoRun (void);
+  void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr, u_int32_t nPkt, u_int32_t nPktEnqueued, u_int32_t nQueueFlows);
+  void Dequeue (Ptr<FqCobaltQueueDisc> queue, uint32_t nPkt);
+  void DequeueWithDelay (Ptr<FqCobaltQueueDisc> queue, double delay, uint32_t nPkt);
+  void DropNextTracer (int64_t oldVal, int64_t newVal);
+  uint32_t m_dropNextCount;    ///< count the number of times m_dropNext is recalculated
+};
+
+FqCobaltQueueDiscEcnMarking::FqCobaltQueueDiscEcnMarking ()
+  : TestCase ("Test ECN marking")
+{
+  m_dropNextCount = 0;
+}
+
+FqCobaltQueueDiscEcnMarking::~FqCobaltQueueDiscEcnMarking ()
+{
+}
+
+void
+FqCobaltQueueDiscEcnMarking::AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr, u_int32_t nPkt, u_int32_t nPktEnqueued, u_int32_t nQueueFlows)
+{
+  Address dest;
+  Ptr<Packet> p = Create<Packet> (100);
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Ptr<Ipv4QueueDiscItem> item = Create<Ipv4QueueDiscItem> (p, dest, 0, hdr);
+      queue->Enqueue (item);
+    }
+  NS_TEST_EXPECT_MSG_EQ (queue->GetNQueueDiscClasses (), nQueueFlows, "unexpected number of flow queues");
+  NS_TEST_EXPECT_MSG_EQ (queue->GetNPackets (), nPktEnqueued, "unexpected number of enqueued packets");
+}
+
+void
+FqCobaltQueueDiscEcnMarking::Dequeue (Ptr<FqCobaltQueueDisc> queue, uint32_t nPkt)
+{
+  Ptr<CobaltQueueDisc> q3 = queue->GetQueueDiscClass (3)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+
+  // Trace DropNext after the first dequeue as m_dropNext value is set after the first dequeue
+  if (q3->GetNPackets () == 19)
+    {
+      q3->TraceConnectWithoutContext ("DropNext", MakeCallback (&FqCobaltQueueDiscEcnMarking::DropNextTracer, this));
+    }
+
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Ptr<QueueDiscItem> item = queue->Dequeue ();
+    }
+}
+
+void
+FqCobaltQueueDiscEcnMarking::DequeueWithDelay (Ptr<FqCobaltQueueDisc> queue, double delay, uint32_t nPkt)
+{
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Simulator::Schedule (Time (Seconds ((i + 1) * delay)), &FqCobaltQueueDiscEcnMarking::Dequeue, this, queue, 1);
+    }
+}
+
+void
+FqCobaltQueueDiscEcnMarking::DropNextTracer (int64_t oldVal, int64_t newVal)
+{
+  NS_UNUSED (oldVal);
+  NS_UNUSED (newVal);
+  m_dropNextCount++;
+}
+
+void
+FqCobaltQueueDiscEcnMarking::DoRun (void)
+{
+  // Test is divided into 3 sub test cases:
+  // 1) CeThreshold disabled
+  // 2) CeThreshold enabled
+  // 3) Same as 2 but with higher queue delay
+
+  // Test case 1, CeThreshold disabled
+  Ptr<FqCobaltQueueDisc> queueDisc = CreateObjectWithAttributes<FqCobaltQueueDisc> ("MaxSize", StringValue ("10240p"), "UseEcn", BooleanValue (true),
+    "Perturbation", UintegerValue (0), "BlueThreshold", TimeValue (Time::Max ()));
+
+  queueDisc->SetQuantum (1514);
+  queueDisc->Initialize ();
+  Ipv4Header hdr;
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (7);
+  hdr.SetEcn (Ipv4Header::ECN_ECT0);
+
+  // Add 20 ECT0 (ECN capable) packets from the first flow
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 20, 1);
+
+  // Add 20 ECT0 (ECN capable) packets from second flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.10"));
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 40, 2);
+
+  // Add 20 ECT0 (ECN capable) packets from third flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.20"));
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 60, 3);
+
+  // Add 20 NotECT packets from fourth flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.30"));
+  hdr.SetEcn (Ipv4Header::ECN_NotECT);
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 80, 4);
+
+  // Add 20 NotECT packets from fifth flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.40"));
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 100, 5);
+
+  //Dequeue 60 packets with delay 110ms to induce packet drops and keep some remaining packets in each queue
+  DequeueWithDelay (queueDisc, 0.11, 60);
+  Simulator::Run ();
+  Simulator::Stop (Seconds (8.0));
+  Ptr<CobaltQueueDisc> q0 = queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  Ptr<CobaltQueueDisc> q1 = queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  Ptr<CobaltQueueDisc> q2 = queueDisc->GetQueueDiscClass (2)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  Ptr<CobaltQueueDisc> q3 = queueDisc->GetQueueDiscClass (3)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  Ptr<CobaltQueueDisc> q4 = queueDisc->GetQueueDiscClass (4)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+
+ // As packets in flow queues are ECN capable
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK), 19, "There should be 19 marked packets."
+                        "As there is no CoDel minBytes parameter so all the packets apart from the first one gets marked. As q3 and q4 have"
+                        "NotEct packets and the queue delay is much higher than 5ms so the queue gets empty pretty quickly so more"
+                        "packets from q0 can be dequeued.");
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not be any dropped packets");
+  NS_TEST_EXPECT_MSG_EQ (q1->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK), 16, "There should be 16 marked packets"
+                        "As there is no CoDel minBytes parameter so all the packets apart from the first one until no more packets are dequeued"
+                        "are marked.");
+  NS_TEST_EXPECT_MSG_EQ (q1->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not be any dropped packets");
+  NS_TEST_EXPECT_MSG_EQ (q2->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK), 12, "There should be 12 marked packets"
+                        "Each packet size is 120 bytes and the quantum is 1500 bytes so in the first turn (1514/120 = 12.61) 13 packets are"
+                        "dequeued and apart from the first one, all the packets are marked.");
+  NS_TEST_EXPECT_MSG_EQ (q2->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not be any dropped packets");
+  
+  // As packets in flow queues are not ECN capable
+  NS_TEST_EXPECT_MSG_EQ (q3->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), m_dropNextCount, "The number of drops should"
+                        "be equal to the number of times m_dropNext is updated");
+  NS_TEST_EXPECT_MSG_EQ (q3->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK), 0, "There should not be any marked packets");
+  NS_TEST_EXPECT_MSG_EQ (q4->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), m_dropNextCount, "The number of drops should"
+                        "be equal to the number of times m_dropNext is updated");
+  NS_TEST_EXPECT_MSG_EQ (q4->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK), 0, "There should not be any marked packets");
+
+  Simulator::Destroy ();
+
+  // Test case 2, CeThreshold set to 2ms
+  queueDisc = CreateObjectWithAttributes<FqCobaltQueueDisc> ("MaxSize", StringValue ("10240p"), "UseEcn", BooleanValue (true),
+                                                                                   "CeThreshold", TimeValue (MilliSeconds (2)));
+  queueDisc->SetQuantum (1514);
+  queueDisc->Initialize ();
+  
+  // Add 20 ECT0 (ECN capable) packets from first flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetEcn (Ipv4Header::ECN_ECT0);
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 20, 1);
+
+  // Add 20 ECT0 (ECN capable) packets from second flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.10"));
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 40, 2);
+
+  // Add 20 ECT0 (ECN capable) packets from third flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.20"));
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 60, 3);
+
+  // Add 20 NotECT packets from fourth flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.30"));
+  hdr.SetEcn (Ipv4Header::ECN_NotECT);
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 80, 4);
+
+  // Add 20 NotECT packets from fifth flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.40"));
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 100, 5);
+
+  //Dequeue 60 packets with delay 0.1ms to induce packet drops and keep some remaining packets in each queue
+  DequeueWithDelay (queueDisc, 0.0001, 60);
+  Simulator::Run ();
+  Simulator::Stop (Seconds (8.0));
+  q0 = queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  q1 = queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  q2 = queueDisc->GetQueueDiscClass (2)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  q3 = queueDisc->GetQueueDiscClass (3)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  q4 = queueDisc->GetQueueDiscClass (4)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+
+  // As packets in flow queues are ECN capable
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not be any dropped packets");
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK), 0, "There should not be any marked packets"
+                        "with quantum of 1514, 13 packets of size 120 bytes can be dequeued. sojourn time of 13th packet is 1.3ms which is"
+                        "less than CE threshold");
+  NS_TEST_EXPECT_MSG_EQ (q1->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not be any dropped packets");
+  NS_TEST_EXPECT_MSG_EQ (q1->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK), 6, "There should be 6 marked packets"
+                        "with quantum of 1514, 13 packets of size 120 bytes can be dequeued. sojourn time of 8th packet is 2.1ms which is greater"
+                        "than CE threshold and subsequent packet also have sojourn time more 8th packet hence remaining packet are marked.");
+  NS_TEST_EXPECT_MSG_EQ (q2->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not be any dropped packets");
+  NS_TEST_EXPECT_MSG_EQ (q2->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK), 13, "There should be 13 marked packets"
+                        "with quantum of 1514, 13 packets of size 120 bytes can be dequeued and all of them have sojourn time more than CE threshold");
+
+  // As packets in flow queues are not ECN capable
+  NS_TEST_EXPECT_MSG_EQ (q3->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK), 0, "There should not be any marked packets");
+  NS_TEST_EXPECT_MSG_EQ (q3->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not be any dropped packets");
+  NS_TEST_EXPECT_MSG_EQ (q4->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK), 0, "There should not be any marked packets");
+  NS_TEST_EXPECT_MSG_EQ (q4->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 1, "There should 1 dropped packet. As the queue"
+                        "delay for the first dequeue is greater than the target (5ms), Cobalt overloads the m_dropNext field as an activity timeout"
+                        "and dropNext is to set to the current Time value so on the next dequeue a packet is dropped.");
+
+  Simulator::Destroy ();
+
+  // Test case 3, CeThreshold set to 2ms with higher queue delay. This test is mainly to check that the packets are not getting marked twice.
+  queueDisc = CreateObjectWithAttributes<FqCobaltQueueDisc> ("MaxSize", StringValue ("10240p"), "UseEcn", BooleanValue (true),
+    "CeThreshold", TimeValue (MilliSeconds (2)), "BlueThreshold", TimeValue (Time::Max()));
+  queueDisc->SetQuantum (1514);
+  queueDisc->Initialize ();
+  
+  // Add 20 ECT0 (ECN capable) packets from first flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetEcn (Ipv4Header::ECN_ECT0);
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 20, 1);
+
+  // Add 20 ECT0 (ECN capable) packets from second flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.10"));
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 40, 2);
+
+  // Add 20 ECT0 (ECN capable) packets from third flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.20"));
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 60, 3);
+
+  // Add 20 NotECT packets from fourth flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.30"));
+  hdr.SetEcn (Ipv4Header::ECN_NotECT);
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 80, 4);
+
+  // Add 20 NotECT packets from fifth flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.40"));
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscEcnMarking::AddPacket, this, queueDisc, hdr, 20, 100, 5);
+
+  // Reset m_dropNextCount value;
+  m_dropNextCount = 0;
+
+  //Dequeue 60 packets with delay 110ms to induce packet drops and keep some remaining packets in each queue
+  DequeueWithDelay (queueDisc, 0.110, 60);
+  Simulator::Run ();
+  Simulator::Stop (Seconds (8.0));
+  q0 = queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  q1 = queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  q2 = queueDisc->GetQueueDiscClass (2)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  q3 = queueDisc->GetQueueDiscClass (3)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  q4 = queueDisc->GetQueueDiscClass (4)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+
+  // As packets in flow queues are ECN capable
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not be any dropped packets");
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK) + 
+                         q0->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK), 20 - q0->GetNPackets (), "Number of CE threshold"
+                        " exceeded marks plus Number of Target exceeded marks should be equal to total number of packets dequeued");
+  NS_TEST_EXPECT_MSG_EQ (q1->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not be any dropped packets");
+  NS_TEST_EXPECT_MSG_EQ (q1->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK) + 
+                         q1->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK), 20 - q1->GetNPackets (), "Number of CE threshold"
+                        " exceeded marks plus Number of Target exceeded marks should be equal to total number of packets dequeued");
+  NS_TEST_EXPECT_MSG_EQ (q2->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not be any dropped packets");
+  NS_TEST_EXPECT_MSG_EQ (q2->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK) + 
+                         q2->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK), 20 - q2->GetNPackets (), "Number of CE threshold"
+                        " exceeded marks plus Number of Target exceeded marks should be equal to total number of packets dequeued");
+
+  // As packets in flow queues are not ECN capable
+  NS_TEST_EXPECT_MSG_EQ (q3->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK), 0, "There should not be any marked packets");
+  NS_TEST_EXPECT_MSG_EQ (q3->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), m_dropNextCount, "The number of drops should"
+                        "be equal to the number of times m_dropNext is updated");
+  NS_TEST_EXPECT_MSG_EQ (q4->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK), 0, "There should not be any marked packets");
+  NS_TEST_EXPECT_MSG_EQ (q4->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), m_dropNextCount, "The number of drops should"
+                        "be equal to the number of times m_dropNext is updated");
+
+  Simulator::Destroy ();
+}
+
+/*
+ * This class tests linear probing, collision response, and set
+ * creation capability of set associative hashing in FqCodel.
+ * We modified DoClassify () and CheckProtocol () so that we could control
+ * the hash returned for each packet. In the beginning, we use flow hashes
+ * ranging from 0 to 7. These must go into different queues in the same set. 
+ * The set number for these is obtained using outerhash, which is 0.  
+ * When a new packet arrives with flow hash 1024, outerhash = 0 is obtained
+ * and the first set is iteratively searched.
+ * The packet is eventually added to queue 0 since the tags of queues 
+ * in the set do not match with the hash of the flow. The tag of queue 0 is 
+ * updated as 1024. When a packet with hash 1025 arrives, outerhash = 0
+ * is obtained and the first set is iteratively searched. 
+ * Since there is no match, it is added to queue 0 and the tag of queue 0 is
+ * updated to 1025.
+ *
+ * The variable outerhash stores the nearest multiple of 8 that is lesser than
+ * the hash. When a flow hash of 20 arrives, the value of outerhash
+ * is 16. Since m_flowIndices[16] wasn’t previously allotted, a new flow
+ * is created, and the tag corresponding to this queue is set to 20.
+*/
+
+class FqCobaltQueueDiscSetLinearProbing : public TestCase
+{
+public:
+  FqCobaltQueueDiscSetLinearProbing ();
+  virtual ~FqCobaltQueueDiscSetLinearProbing ();
+private:
+  virtual void DoRun (void);
+  void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr);
+};
+
+FqCobaltQueueDiscSetLinearProbing::FqCobaltQueueDiscSetLinearProbing ()
+    : TestCase ("Test credits and flows status")
+{
+}
+
+FqCobaltQueueDiscSetLinearProbing::~FqCobaltQueueDiscSetLinearProbing ()
+{
+}
+
+void
+FqCobaltQueueDiscSetLinearProbing::AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr)
+{
+  Ptr<Packet> p = Create<Packet> (100);
+  Address dest;
+  Ptr<Ipv4QueueDiscItem> item = Create<Ipv4QueueDiscItem> (p, dest, 0, hdr);
+  queue->Enqueue (item);
+}
+
+void
+FqCobaltQueueDiscSetLinearProbing::DoRun (void)
+{
+  Ptr<FqCobaltQueueDisc> queueDisc = CreateObjectWithAttributes<FqCobaltQueueDisc> ("EnableSetAssociativeHash", BooleanValue (true));
+  queueDisc->SetQuantum (90);
+  queueDisc->Initialize ();
+
+  Ptr<Ipv4FqCobaltTestPacketFilter> filter = CreateObject<Ipv4FqCobaltTestPacketFilter> ();
+  queueDisc->AddPacketFilter (filter);
+
+  Ipv4Header hdr;
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (7);
+
+  m_hash = 0;
+  AddPacket (queueDisc, hdr);
+  m_hash = 1;
+  AddPacket (queueDisc, hdr);
+  AddPacket (queueDisc, hdr);
+  m_hash = 2;
+  AddPacket (queueDisc, hdr);
+  m_hash = 3;
+  AddPacket (queueDisc, hdr);
+  m_hash = 4;
+  AddPacket (queueDisc, hdr);
+  AddPacket (queueDisc, hdr);
+  m_hash = 5;
+  AddPacket (queueDisc, hdr);
+  m_hash = 6;
+  AddPacket (queueDisc, hdr);
+  m_hash = 7;
+  AddPacket (queueDisc, hdr);
+  m_hash = 1024;
+  AddPacket (queueDisc, hdr);
+
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 11,
+                         "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 2,
+                         "unexpected number of packets in the first flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 2,
+                         "unexpected number of packets in the second flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (2)->GetQueueDisc ()->GetNPackets (), 1,
+                         "unexpected number of packets in the third flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (3)->GetQueueDisc ()->GetNPackets (), 1,
+                         "unexpected number of packets in the fourth flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (4)->GetQueueDisc ()->GetNPackets (), 2,
+                         "unexpected number of packets in the fifth flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (5)->GetQueueDisc ()->GetNPackets (), 1,
+                         "unexpected number of packets in the sixth flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (6)->GetQueueDisc ()->GetNPackets (), 1,
+                         "unexpected number of packets in the seventh flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (7)->GetQueueDisc ()->GetNPackets (), 1,
+                         "unexpected number of packets in the eighth flow queue of set one");
+  m_hash = 1025;
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3,
+                         "unexpected number of packets in the first flow of set one");
+  m_hash = 10;
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (8)->GetQueueDisc ()->GetNPackets (), 1,
+                         "unexpected number of packets in the first flow of set two");
+  Simulator::Destroy ();
+}
+
+
+/**
+ * This class tests L4S mode. This test is divided to sub test one without hash collisions and so ECT0 and ECT1 flows are
+ * classified into different flows.
+ * Sub Test 1
+ * 70 packets are enqueued into both the flows with the delay of 0.5ms between two enqueues, and dequeued with the delay of 
+ * 1ms between two dequeues.
+ * Sub Test 2
+ * 140(70 ECT0 + 70 ECT1) packets are enqueued such that ECT1 packets are enqueued at 0.5ms, 1.5ms, 2.5ms and so on, and ECT0 packets are
+ * enqueued are enqueued at 1ms, 2ms, 3ms and so on
+ * Any future classifier options (e.g. SetAssociativehash) should be disabled to prevent a hash collision on this test case.
+ */
+class FqCobaltQueueDiscL4sMode : public TestCase
+{
+public:
+  FqCobaltQueueDiscL4sMode ();
+  virtual ~FqCobaltQueueDiscL4sMode ();
+
+private:
+  virtual void DoRun (void);
+  void AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr, u_int32_t nPkt);
+  void AddPacketWithDelay (Ptr<FqCobaltQueueDisc> queue,Ipv4Header hdr, double delay, uint32_t nPkt);
+  void Dequeue (Ptr<FqCobaltQueueDisc> queue, uint32_t nPkt);
+  void DequeueWithDelay (Ptr<FqCobaltQueueDisc> queue, double delay, uint32_t nPkt);
+};
+
+FqCobaltQueueDiscL4sMode::FqCobaltQueueDiscL4sMode ()
+  : TestCase ("Test L4S mode")
+{
+}
+
+FqCobaltQueueDiscL4sMode::~FqCobaltQueueDiscL4sMode ()
+{
+}
+
+void
+FqCobaltQueueDiscL4sMode::AddPacket (Ptr<FqCobaltQueueDisc> queue, Ipv4Header hdr, uint32_t nPkt)
+{
+  Address dest;
+  Ptr<Packet> p = Create<Packet> (100);
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Ptr<Ipv4QueueDiscItem> item = Create<Ipv4QueueDiscItem> (p, dest, 0, hdr);
+      queue->Enqueue (item);
+    }
+}
+
+void
+FqCobaltQueueDiscL4sMode::AddPacketWithDelay (Ptr<FqCobaltQueueDisc> queue,Ipv4Header hdr, double delay, uint32_t nPkt)
+{
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Simulator::Schedule (Time (Seconds ((i + 1) * delay)), &FqCobaltQueueDiscL4sMode::AddPacket, this, queue, hdr, 1);
+    }
+}
+
+void
+FqCobaltQueueDiscL4sMode::Dequeue (Ptr<FqCobaltQueueDisc> queue, uint32_t nPkt)
+{
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Ptr<QueueDiscItem> item = queue->Dequeue ();
+    }
+}
+
+void
+FqCobaltQueueDiscL4sMode::DequeueWithDelay (Ptr<FqCobaltQueueDisc> queue, double delay, uint32_t nPkt)
+{
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Simulator::Schedule (Time (Seconds ((i + 1) * delay)), &FqCobaltQueueDiscL4sMode::Dequeue, this, queue, 1);
+    }
+}
+
+void
+FqCobaltQueueDiscL4sMode::DoRun (void)
+{
+  // Test is divided into 2 sub test cases:
+  // 1) Without hash collisions
+  // 2) With hash collisions
+
+  // Test case 1, Without hash collisions
+  Ptr<FqCobaltQueueDisc> queueDisc = CreateObjectWithAttributes<FqCobaltQueueDisc> ("MaxSize", StringValue ("10240p"), "UseEcn", BooleanValue (true),
+                                                                                  "Perturbation", UintegerValue (0), "UseL4s", BooleanValue (true),
+                                                                                  "CeThreshold", TimeValue (MilliSeconds (2)));
+
+  queueDisc->SetQuantum (1514);
+  queueDisc->Initialize ();
+  Ipv4Header hdr;
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (7);
+  hdr.SetEcn (Ipv4Header::ECN_ECT1);
+
+  // Add 70 ECT1 (ECN capable) packets from the first flow
+  // Set delay = 0.5ms
+  double delay = 0.0005;
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscL4sMode::AddPacketWithDelay, this, queueDisc, hdr, delay, 70);
+
+  // Add 70 ECT0 (ECN capable) packets from second flow
+  hdr.SetEcn (Ipv4Header::ECN_ECT0);
+  hdr.SetDestination (Ipv4Address ("10.10.1.10"));
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscL4sMode::AddPacketWithDelay, this, queueDisc, hdr, delay, 70);
+
+  //Dequeue 140 packets with delay 1ms
+  delay = 0.001;
+  DequeueWithDelay (queueDisc, delay, 140);
+  Simulator::Run ();
+  Simulator::Stop (Seconds (8.0));
+  Ptr<CobaltQueueDisc> q0 = queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  Ptr<CobaltQueueDisc> q1 = queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK), 66, "There should be 66 marked packets"
+                        "4th packet is enqueued at 2ms and dequeued at 4ms hence the delay of 2ms which not greater than CE threshold"
+                        "5th packet is enqueued at 2.5ms and dequeued at 5ms hence the delay of 2.5ms and subsequent packet also do have delay"
+                        "greater than CE threshold so all the packets after 4th packet are marked");
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not be any dropped packets");
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK), 0, "There should not be any marked packets");
+  NS_TEST_EXPECT_MSG_EQ (q1->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK), 2, "There should be 2 marked packets. Packets are dequeued"
+                        "from q0 first, which leads to delay greater than 5ms for the first dequeue from q1. Because of inactivity (started with high queue delay)"
+                        "Cobalt keeps drop_next as now and the next packet is marked. With second dequeue count increases to 2, drop_next becomes now plus around"
+                        "70ms which is less than the running time(140), and as the queue delay is persistantly higher than 5ms, second packet is marked.");
+  NS_TEST_EXPECT_MSG_EQ (q1->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not be any dropped packets");
+
+  Simulator::Destroy ();
+
+  // Test case 2, With hash collisions
+  queueDisc = CreateObjectWithAttributes<FqCobaltQueueDisc> ("MaxSize", StringValue ("10240p"), "UseEcn", BooleanValue (true),
+                                                                                  "Perturbation", UintegerValue (0), "UseL4s", BooleanValue (true),
+                                                                                  "CeThreshold", TimeValue (MilliSeconds (2)));
+
+  queueDisc->SetQuantum (1514);
+  queueDisc->Initialize ();
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (7);
+  hdr.SetEcn (Ipv4Header::ECN_ECT1);
+
+  // Add 70 ECT1 (ECN capable) packets from the first flow
+  // Set delay = 1ms
+  delay = 0.001;
+  Simulator::Schedule (Time (Seconds (0.0005)), &FqCobaltQueueDiscL4sMode::AddPacket, this, queueDisc, hdr, 1);
+  Simulator::Schedule (Time (Seconds (0.0005)), &FqCobaltQueueDiscL4sMode::AddPacketWithDelay, this, queueDisc, hdr, delay, 69);
+
+  // Add 70 ECT0 (ECN capable) packets from first flow
+  hdr.SetEcn (Ipv4Header::ECN_ECT0);
+  Simulator::Schedule (Time (Seconds (0)), &FqCobaltQueueDiscL4sMode::AddPacketWithDelay, this, queueDisc, hdr, delay, 70);
+
+  //Dequeue 140 packets with delay 1ms
+  DequeueWithDelay (queueDisc, delay, 140);
+  Simulator::Run ();
+  Simulator::Stop (Seconds (8.0));
+  q0 = queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+  q0 = queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetObject <CobaltQueueDisc> ();
+
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK), 68, "There should be 68 marked packets"
+                        "2nd ECT1 packet is enqueued at 1.5ms and dequeued at 3ms hence the delay of 1.5ms which not greater than CE threshold"
+                        "3rd packet is enqueued at 2.5ms and dequeued at 5ms hence the delay of 2.5ms and subsequent packet also do have delay"
+                        "greater than CE threshold so all the packets after 2nd packet are marked");
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not be any dropped packets");
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK), 1, "There should be 1 marked packets");
+
+  Simulator::Destroy ();
+
+}
+
+class FqCobaltQueueDiscTestSuite : public TestSuite
+{
+public:
+  FqCobaltQueueDiscTestSuite ();
+};
+
+FqCobaltQueueDiscTestSuite::FqCobaltQueueDiscTestSuite ()
+  : TestSuite ("fq-cobalt-queue-disc", UNIT)
+{
+  AddTestCase (new FqCobaltQueueDiscNoSuitableFilter, TestCase::QUICK);
+  AddTestCase (new FqCobaltQueueDiscIPFlowsSeparationAndPacketLimit, TestCase::QUICK);
+  AddTestCase (new FqCobaltQueueDiscDeficit, TestCase::QUICK);
+  AddTestCase (new FqCobaltQueueDiscTCPFlowsSeparation, TestCase::QUICK);
+  AddTestCase (new FqCobaltQueueDiscUDPFlowsSeparation, TestCase::QUICK);
+  AddTestCase (new FqCobaltQueueDiscEcnMarking, TestCase::QUICK);
+  AddTestCase (new FqCobaltQueueDiscSetLinearProbing, TestCase::QUICK);
+  AddTestCase (new FqCobaltQueueDiscL4sMode, TestCase::QUICK);
+}
+
+static FqCobaltQueueDiscTestSuite fqCobaltQueueDiscTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/test/ns3tc/fq-pie-queue-disc-test-suite.cc ns-3.34/src/test/ns3tc/fq-pie-queue-disc-test-suite.cc
--- ns-3.33/src/test/ns3tc/fq-pie-queue-disc-test-suite.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/test/ns3tc/fq-pie-queue-disc-test-suite.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,823 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016 Universita' degli Studi di Napoli Federico II
+ * Copyright (c) 2020 NITK Surathkal (modified for FQ-PIE)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Pasquale Imputato <p.imputato@gmail.com>
+ *          Stefano Avallone <stefano.avallone@unina.it>
+ * Modified for FQ-PIE by: Bhaskar Kataria <bhaskar.k7920@gmail.com>
+ *                         Tom Henderson <tomhend@u.washington.edu>
+ *                         Mohit P. Tahiliani <tahiliani@nitk.edu.in>
+ *                         Vivek Jain <jain.vivek.anand@gmail.com>
+ *                         Ankit Deepak <adadeepak8@gmail.com>
+ *
+*/
+
+#include "ns3/test.h"
+#include "ns3/simulator.h"
+#include "ns3/fq-pie-queue-disc.h"
+#include "ns3/pie-queue-disc.h"
+#include "ns3/ipv4-header.h"
+#include "ns3/ipv4-packet-filter.h"
+#include "ns3/ipv4-queue-disc-item.h"
+#include "ns3/ipv4-address.h"
+#include "ns3/ipv6-header.h"
+#include "ns3/ipv6-packet-filter.h"
+#include "ns3/ipv6-queue-disc-item.h"
+#include "ns3/tcp-header.h"
+#include "ns3/udp-header.h"
+#include "ns3/string.h"
+#include "ns3/pointer.h"
+
+using namespace ns3;
+
+// Variable to assign g_hash to a new packet's flow
+int32_t g_hash;
+
+/**
+ * Simple test packet filter able to classify IPv4 packets
+ *
+ */
+class Ipv4FqPieTestPacketFilter : public Ipv4PacketFilter
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  Ipv4FqPieTestPacketFilter ();
+  virtual ~Ipv4FqPieTestPacketFilter ();
+
+private:
+  virtual int32_t DoClassify (Ptr<QueueDiscItem> item) const;
+  virtual bool CheckProtocol (Ptr<QueueDiscItem> item) const;
+};
+
+TypeId
+Ipv4FqPieTestPacketFilter::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::Ipv4FqPieTestPacketFilter")
+    .SetParent<Ipv4PacketFilter> ()
+    .SetGroupName ("Internet")
+    .AddConstructor<Ipv4FqPieTestPacketFilter> ()
+  ;
+  return tid;
+}
+
+Ipv4FqPieTestPacketFilter::Ipv4FqPieTestPacketFilter ()
+{}
+
+Ipv4FqPieTestPacketFilter::~Ipv4FqPieTestPacketFilter ()
+{}
+
+int32_t
+Ipv4FqPieTestPacketFilter::DoClassify (Ptr<QueueDiscItem> item) const
+{
+  return g_hash;
+}
+
+bool
+Ipv4FqPieTestPacketFilter::CheckProtocol (Ptr<QueueDiscItem> item) const
+{
+  return true;
+}
+
+/**
+ * This class tests packets for which there is no suitable filter
+ */
+class FqPieQueueDiscNoSuitableFilter : public TestCase
+{
+public:
+  FqPieQueueDiscNoSuitableFilter ();
+  virtual ~FqPieQueueDiscNoSuitableFilter ();
+
+private:
+  virtual void DoRun (void);
+};
+
+FqPieQueueDiscNoSuitableFilter::FqPieQueueDiscNoSuitableFilter ()
+  : TestCase ("Test packets that are not classified by any filter")
+{}
+
+FqPieQueueDiscNoSuitableFilter::~FqPieQueueDiscNoSuitableFilter ()
+{}
+
+void
+FqPieQueueDiscNoSuitableFilter::DoRun (void)
+{
+  // Packets that cannot be classified by the available filters should be dropped
+  Ptr<FqPieQueueDisc> queueDisc = CreateObjectWithAttributes<FqPieQueueDisc> ("MaxSize", StringValue ("4p"));
+  Ptr<Ipv4FqPieTestPacketFilter> filter = CreateObject<Ipv4FqPieTestPacketFilter> ();
+  queueDisc->AddPacketFilter (filter);
+
+  g_hash = -1;
+  queueDisc->SetQuantum (1500);
+  queueDisc->Initialize ();
+
+  Ptr<Packet> p;
+  p = Create<Packet> ();
+  Ptr<Ipv6QueueDiscItem> item;
+  Ipv6Header ipv6Header;
+  Address dest;
+  item = Create<Ipv6QueueDiscItem> (p, dest, 0, ipv6Header);
+  queueDisc->Enqueue (item);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetNQueueDiscClasses (), 0, "no flow queue should have been created");
+
+  p = Create<Packet> (reinterpret_cast<const uint8_t*> ("hello, world"), 12);
+  item = Create<Ipv6QueueDiscItem> (p, dest, 0, ipv6Header);
+  queueDisc->Enqueue (item);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetNQueueDiscClasses (), 0, "no flow queue should have been created");
+
+  Simulator::Destroy ();
+}
+
+/**
+ * This class tests the IP flows separation and the packet limit
+ */
+class FqPieQueueDiscIPFlowsSeparationAndPacketLimit : public TestCase
+{
+public:
+  FqPieQueueDiscIPFlowsSeparationAndPacketLimit ();
+  virtual ~FqPieQueueDiscIPFlowsSeparationAndPacketLimit ();
+
+private:
+  virtual void DoRun (void);
+  void AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header hdr);
+};
+
+FqPieQueueDiscIPFlowsSeparationAndPacketLimit::FqPieQueueDiscIPFlowsSeparationAndPacketLimit ()
+  : TestCase ("Test IP flows separation and packet limit")
+{}
+
+FqPieQueueDiscIPFlowsSeparationAndPacketLimit::~FqPieQueueDiscIPFlowsSeparationAndPacketLimit ()
+{}
+
+void
+FqPieQueueDiscIPFlowsSeparationAndPacketLimit::AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header hdr)
+{
+  Ptr<Packet> p = Create<Packet> (100);
+  Address dest;
+  Ptr<Ipv4QueueDiscItem> item = Create<Ipv4QueueDiscItem> (p, dest, 0, hdr);
+  queue->Enqueue (item);
+}
+
+void
+FqPieQueueDiscIPFlowsSeparationAndPacketLimit::DoRun (void)
+{
+  Ptr<FqPieQueueDisc> queueDisc = CreateObjectWithAttributes<FqPieQueueDisc> ("MaxSize", StringValue ("4p"));
+
+  queueDisc->SetQuantum (1500);
+  queueDisc->Initialize ();
+
+  Ipv4Header hdr;
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (7);
+
+  // Add three packets from the first flow
+  AddPacket (queueDisc, hdr);
+  AddPacket (queueDisc, hdr);
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 3, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the flow queue");
+
+  // Add two packets from the second flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.7"));
+  // Add the first packet
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 4, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the flow queue");
+  // Add the second packet that causes two packets to be dropped from the fat flow (max backlog = 300, threshold = 150)
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 3, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the flow queue");
+
+  Simulator::Destroy ();
+}
+
+/**
+ * This class tests the deficit per flow
+ */
+class FqPieQueueDiscDeficit : public TestCase
+{
+public:
+  FqPieQueueDiscDeficit ();
+  virtual ~FqPieQueueDiscDeficit ();
+
+private:
+  virtual void DoRun (void);
+  void AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header hdr);
+};
+
+FqPieQueueDiscDeficit::FqPieQueueDiscDeficit ()
+  : TestCase ("Test credits and flows status")
+{}
+
+FqPieQueueDiscDeficit::~FqPieQueueDiscDeficit ()
+{}
+
+void
+FqPieQueueDiscDeficit::AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header hdr)
+{
+  Ptr<Packet> p = Create<Packet> (100);
+  Address dest;
+  Ptr<Ipv4QueueDiscItem> item = Create<Ipv4QueueDiscItem> (p, dest, 0, hdr);
+  queue->Enqueue (item);
+}
+
+void
+FqPieQueueDiscDeficit::DoRun (void)
+{
+  Ptr<FqPieQueueDisc> queueDisc = CreateObject<FqPieQueueDisc> ();
+
+  queueDisc->SetQuantum (90);
+  queueDisc->Initialize ();
+
+  Ipv4Header hdr;
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (7);
+
+  // Add a packet from the first flow
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 1, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the first flow queue");
+  Ptr<FqPieFlow> flow1 = StaticCast<FqPieFlow> (queueDisc->GetQueueDiscClass (0));
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), static_cast<int32_t> (queueDisc->GetQuantum ()), "the deficit of the first flow must equal the quantum");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqPieFlow::NEW_FLOW, "the first flow must be in the list of new queues");
+  // Dequeue a packet
+  queueDisc->Dequeue ();
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 0, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 0, "unexpected number of packets in the first flow queue");
+  // the deficit for the first flow becomes 90 - (100+20) = -30
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), -30, "unexpected deficit for the first flow");
+
+  // Add two packets from the first flow
+  AddPacket (queueDisc, hdr);
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 2, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqPieFlow::NEW_FLOW, "the first flow must still be in the list of new queues");
+
+  // Add two packets from the second flow
+  hdr.SetDestination (Ipv4Address ("10.10.1.10"));
+  AddPacket (queueDisc, hdr);
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 4, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the second flow queue");
+  Ptr<FqPieFlow> flow2 = StaticCast<FqPieFlow> (queueDisc->GetQueueDiscClass (1));
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetDeficit (), static_cast<int32_t> (queueDisc->GetQuantum ()), "the deficit of the second flow must equal the quantum");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetStatus (), FqPieFlow::NEW_FLOW, "the second flow must be in the list of new queues");
+
+  // Dequeue a packet (from the second flow, as the first flow has a negative deficit)
+  queueDisc->Dequeue ();
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 3, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+  // the first flow got a quantum of deficit (-30+90=60) and has been moved to the end of the list of old queues
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), 60, "unexpected deficit for the first flow");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqPieFlow::OLD_FLOW, "the first flow must be in the list of old queues");
+  // the second flow has a negative deficit (-30) and is still in the list of new queues
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetDeficit (), -30, "unexpected deficit for the second flow");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetStatus (), FqPieFlow::NEW_FLOW, "the second flow must be in the list of new queues");
+
+  // Dequeue a packet (from the first flow, as the second flow has a negative deficit)
+  queueDisc->Dequeue ();
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 2, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+  // the first flow has a negative deficit (60-(100+20)= -60) and stays in the list of old queues
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), -60, "unexpected deficit for the first flow");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqPieFlow::OLD_FLOW, "the first flow must be in the list of old queues");
+  // the second flow got a quantum of deficit (-30+90=60) and has been moved to the end of the list of old queues
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetDeficit (), 60, "unexpected deficit for the second flow");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetStatus (), FqPieFlow::OLD_FLOW, "the second flow must be in the list of new queues");
+
+  // Dequeue a packet (from the second flow, as the first flow has a negative deficit)
+  queueDisc->Dequeue ();
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 1, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 0, "unexpected number of packets in the second flow queue");
+  // the first flow got a quantum of deficit (-60+90=30) and has been moved to the end of the list of old queues
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), 30, "unexpected deficit for the first flow");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqPieFlow::OLD_FLOW, "the first flow must be in the list of old queues");
+  // the second flow has a negative deficit (60-(100+20)= -60)
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetDeficit (), -60, "unexpected deficit for the second flow");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetStatus (), FqPieFlow::OLD_FLOW, "the second flow must be in the list of new queues");
+
+  // Dequeue a packet (from the first flow, as the second flow has a negative deficit)
+  queueDisc->Dequeue ();
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 0, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 0, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 0, "unexpected number of packets in the second flow queue");
+  // the first flow has a negative deficit (30-(100+20)= -90)
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), -90, "unexpected deficit for the first flow");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqPieFlow::OLD_FLOW, "the first flow must be in the list of old queues");
+  // the second flow got a quantum of deficit (-60+90=30) and has been moved to the end of the list of old queues
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetDeficit (), 30, "unexpected deficit for the second flow");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetStatus (), FqPieFlow::OLD_FLOW, "the second flow must be in the list of new queues");
+
+  // Dequeue a packet
+  queueDisc->Dequeue ();
+  // the first flow is at the head of the list of old queues but has a negative deficit, thus it gets a quantun
+  // of deficit (-90+90=0) and is moved to the end of the list of old queues. Then, the second flow (which has a
+  // positive deficit) is selected, but the second flow is empty and thus it is set to inactive. The first flow is
+  // reconsidered, but it has a null deficit, hence it gets another quantum of deficit (0+90=90). Then, the first
+  // flow is reconsidered again, now it has a positive deficit and hence it is selected. But, it is empty and
+  // therefore is set to inactive, too.
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetDeficit (), 90, "unexpected deficit for the first flow");
+  NS_TEST_ASSERT_MSG_EQ (flow1->GetStatus (), FqPieFlow::INACTIVE, "the first flow must be inactive");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetDeficit (), 30, "unexpected deficit for the second flow");
+  NS_TEST_ASSERT_MSG_EQ (flow2->GetStatus (), FqPieFlow::INACTIVE, "the second flow must be inactive");
+
+  Simulator::Destroy ();
+}
+
+/**
+ * This class tests the TCP flows separation
+ */
+class FqPieQueueDiscTCPFlowsSeparation : public TestCase
+{
+public:
+  FqPieQueueDiscTCPFlowsSeparation ();
+  virtual ~FqPieQueueDiscTCPFlowsSeparation ();
+
+private:
+  virtual void DoRun (void);
+  void AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header ipHdr, TcpHeader tcpHdr);
+};
+
+FqPieQueueDiscTCPFlowsSeparation::FqPieQueueDiscTCPFlowsSeparation ()
+  : TestCase ("Test TCP flows separation")
+{}
+
+FqPieQueueDiscTCPFlowsSeparation::~FqPieQueueDiscTCPFlowsSeparation ()
+{}
+
+void
+FqPieQueueDiscTCPFlowsSeparation::AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header ipHdr, TcpHeader tcpHdr)
+{
+  Ptr<Packet> p = Create<Packet> (100);
+  p->AddHeader (tcpHdr);
+  Address dest;
+  Ptr<Ipv4QueueDiscItem> item = Create<Ipv4QueueDiscItem> (p, dest, 0, ipHdr);
+  queue->Enqueue (item);
+}
+
+void
+FqPieQueueDiscTCPFlowsSeparation::DoRun (void)
+{
+  Ptr<FqPieQueueDisc> queueDisc = CreateObjectWithAttributes<FqPieQueueDisc> ("MaxSize", StringValue ("10p"));
+
+  queueDisc->SetQuantum (1500);
+  queueDisc->Initialize ();
+
+  Ipv4Header hdr;
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (6);
+
+  TcpHeader tcpHdr;
+  tcpHdr.SetSourcePort (7);
+  tcpHdr.SetDestinationPort (27);
+
+  // Add three packets from the first flow
+  AddPacket (queueDisc, hdr, tcpHdr);
+  AddPacket (queueDisc, hdr, tcpHdr);
+  AddPacket (queueDisc, hdr, tcpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 3, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+
+  // Add a packet from the second flow
+  tcpHdr.SetSourcePort (8);
+  AddPacket (queueDisc, hdr, tcpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 4, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+
+  // Add a packet from the third flow
+  tcpHdr.SetDestinationPort (28);
+  AddPacket (queueDisc, hdr, tcpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 5, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (2)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the third flow queue");
+
+  // Add two packets from the fourth flow
+  tcpHdr.SetSourcePort (7);
+  AddPacket (queueDisc, hdr, tcpHdr);
+  AddPacket (queueDisc, hdr, tcpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 7, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (2)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the third flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (3)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the third flow queue");
+
+  Simulator::Destroy ();
+}
+
+/**
+ * This class tests the UDP flows separation
+ */
+class FqPieQueueDiscUDPFlowsSeparation : public TestCase
+{
+public:
+  FqPieQueueDiscUDPFlowsSeparation ();
+  virtual ~FqPieQueueDiscUDPFlowsSeparation ();
+
+private:
+  virtual void DoRun (void);
+  void AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header ipHdr, UdpHeader udpHdr);
+};
+
+FqPieQueueDiscUDPFlowsSeparation::FqPieQueueDiscUDPFlowsSeparation ()
+  : TestCase ("Test UDP flows separation")
+{}
+
+FqPieQueueDiscUDPFlowsSeparation::~FqPieQueueDiscUDPFlowsSeparation ()
+{}
+
+void
+FqPieQueueDiscUDPFlowsSeparation::AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header ipHdr, UdpHeader udpHdr)
+{
+  Ptr<Packet> p = Create<Packet> (100);
+  p->AddHeader (udpHdr);
+  Address dest;
+  Ptr<Ipv4QueueDiscItem> item = Create<Ipv4QueueDiscItem> (p, dest, 0, ipHdr);
+  queue->Enqueue (item);
+}
+
+void
+FqPieQueueDiscUDPFlowsSeparation::DoRun (void)
+{
+  Ptr<FqPieQueueDisc> queueDisc = CreateObjectWithAttributes<FqPieQueueDisc> ("MaxSize", StringValue ("10p"));
+
+  queueDisc->SetQuantum (1500);
+  queueDisc->Initialize ();
+
+  Ipv4Header hdr;
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (17);
+
+  UdpHeader udpHdr;
+  udpHdr.SetSourcePort (7);
+  udpHdr.SetDestinationPort (27);
+
+  // Add three packets from the first flow
+  AddPacket (queueDisc, hdr, udpHdr);
+  AddPacket (queueDisc, hdr, udpHdr);
+  AddPacket (queueDisc, hdr, udpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 3, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+
+  // Add a packet from the second flow
+  udpHdr.SetSourcePort (8);
+  AddPacket (queueDisc, hdr, udpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 4, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+
+  // Add a packet from the third flow
+  udpHdr.SetDestinationPort (28);
+  AddPacket (queueDisc, hdr, udpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 5, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (2)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the third flow queue");
+
+  // Add two packets from the fourth flow
+  udpHdr.SetSourcePort (7);
+  AddPacket (queueDisc, hdr, udpHdr);
+  AddPacket (queueDisc, hdr, udpHdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 7, "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3, "unexpected number of packets in the first flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the second flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (2)->GetQueueDisc ()->GetNPackets (), 1, "unexpected number of packets in the third flow queue");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (3)->GetQueueDisc ()->GetNPackets (), 2, "unexpected number of packets in the third flow queue");
+
+  Simulator::Destroy ();
+}
+
+
+/*
+ * This class tests linear probing, collision response, and set
+ * creation capability of set associative hashing in FqPIE.
+ * We modified DoClassify () and CheckProtocol () so that we could control
+ * the hash returned for each packet. In the beginning, we use flow hashes
+ * ranging from 0 to 7. These must go into different queues in the same set.
+ * The set number for these is obtained using outerhash, which is 0.
+ * When a new packet arrives with flow hash 1024, outerhash = 0 is obtained
+ * and the first set is iteratively searched.
+ * The packet is eventually added to queue 0 since the tags of queues
+ * in the set do not match with the hash of the flow. The tag of queue 0 is
+ * updated as 1024. When a packet with hash 1025 arrives, outerhash = 0
+ * is obtained and the first set is iteratively searched.
+ * Since there is no match, it is added to queue 0 and the tag of queue 0 is
+ * updated to 1025.
+ *
+ * The variable outerhash stores the nearest multiple of 8 that is lesser than
+ * the hash. When a flow hash of 20 arrives, the value of outerhash
+ * is 16. Since m_flowIndices[16] wasn't previously allotted, a new flow
+ * is created, and the tag corresponding to this queue is set to 20.
+*/
+
+class FqPieQueueDiscSetLinearProbing : public TestCase
+{
+public:
+  FqPieQueueDiscSetLinearProbing ();
+  virtual ~FqPieQueueDiscSetLinearProbing ();
+
+private:
+  virtual void DoRun (void);
+  void AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header hdr);
+};
+
+FqPieQueueDiscSetLinearProbing::FqPieQueueDiscSetLinearProbing ()
+  : TestCase ("Test credits and flows status")
+{}
+
+FqPieQueueDiscSetLinearProbing::~FqPieQueueDiscSetLinearProbing ()
+{}
+
+void
+FqPieQueueDiscSetLinearProbing::AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header hdr)
+{
+  Ptr<Packet> p = Create<Packet> (100);
+  Address dest;
+  Ptr<Ipv4QueueDiscItem> item = Create<Ipv4QueueDiscItem> (p, dest, 0, hdr);
+  queue->Enqueue (item);
+}
+
+void
+FqPieQueueDiscSetLinearProbing::DoRun (void)
+{
+  Ptr<FqPieQueueDisc> queueDisc = CreateObjectWithAttributes<FqPieQueueDisc> ("EnableSetAssociativeHash", BooleanValue (true));
+  queueDisc->SetQuantum (90);
+  queueDisc->Initialize ();
+
+  Ptr<Ipv4FqPieTestPacketFilter> filter = CreateObject<Ipv4FqPieTestPacketFilter> ();
+  queueDisc->AddPacketFilter (filter);
+
+  Ipv4Header hdr;
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (7);
+
+  g_hash = 0;
+  AddPacket (queueDisc, hdr);
+  g_hash = 1;
+  AddPacket (queueDisc, hdr);
+  AddPacket (queueDisc, hdr);
+  g_hash = 2;
+  AddPacket (queueDisc, hdr);
+  g_hash = 3;
+  AddPacket (queueDisc, hdr);
+  g_hash = 4;
+  AddPacket (queueDisc, hdr);
+  AddPacket (queueDisc, hdr);
+  g_hash = 5;
+  AddPacket (queueDisc, hdr);
+  g_hash = 6;
+  AddPacket (queueDisc, hdr);
+  g_hash = 7;
+  AddPacket (queueDisc, hdr);
+  g_hash = 1024;
+  AddPacket (queueDisc, hdr);
+
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->QueueDisc::GetNPackets (), 11,
+                         "unexpected number of packets in the queue disc");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 2,
+                         "unexpected number of packets in the first flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetNPackets (), 2,
+                         "unexpected number of packets in the second flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (2)->GetQueueDisc ()->GetNPackets (), 1,
+                         "unexpected number of packets in the third flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (3)->GetQueueDisc ()->GetNPackets (), 1,
+                         "unexpected number of packets in the fourth flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (4)->GetQueueDisc ()->GetNPackets (), 2,
+                         "unexpected number of packets in the fifth flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (5)->GetQueueDisc ()->GetNPackets (), 1,
+                         "unexpected number of packets in the sixth flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (6)->GetQueueDisc ()->GetNPackets (), 1,
+                         "unexpected number of packets in the seventh flow queue of set one");
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (7)->GetQueueDisc ()->GetNPackets (), 1,
+                         "unexpected number of packets in the eighth flow queue of set one");
+  g_hash = 1025;
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetNPackets (), 3,
+                         "unexpected number of packets in the first flow of set one");
+  g_hash = 10;
+  AddPacket (queueDisc, hdr);
+  NS_TEST_ASSERT_MSG_EQ (queueDisc->GetQueueDiscClass (8)->GetQueueDisc ()->GetNPackets (), 1,
+                         "unexpected number of packets in the first flow of set two");
+  Simulator::Destroy ();
+}
+
+
+/**
+ * This class tests L4S mode. This test is divided to sub test one without hash collisions and so ECT0 and ECT1 flows are
+ * classified into different flows.
+ * Sub Test 1
+ * 70 packets are enqueued into both the flows with the delay of 0.5ms between two enqueues, and dequeued with the delay of
+ * 1ms between two dequeues.
+ * Sub Test 2
+ * 140(70 ECT0 + 70 ECT1) packets are enqueued such that ECT1 packets are enqueued at 0.5ms, 1.5ms, 2.5ms and so on, and ECT0 packets are
+ * enqueued are enqueued at 1ms, 2ms, 3ms and so on
+ * Any future classifier options (e.g. SetAssociativehash) should be disabled to prevent a hash collision on this test case.
+ */
+class FqPieQueueDiscL4sMode : public TestCase
+{
+public:
+  FqPieQueueDiscL4sMode ();
+  virtual ~FqPieQueueDiscL4sMode ();
+
+private:
+  virtual void DoRun (void);
+  void AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header hdr, u_int32_t nPkt);
+  void AddPacketWithDelay (Ptr<FqPieQueueDisc> queue,Ipv4Header hdr, double delay, uint32_t nPkt);
+  void Dequeue (Ptr<FqPieQueueDisc> queue, uint32_t nPkt);
+  void DequeueWithDelay (Ptr<FqPieQueueDisc> queue, double delay, uint32_t nPkt);
+};
+
+FqPieQueueDiscL4sMode::FqPieQueueDiscL4sMode ()
+  : TestCase ("Test L4S mode")
+{}
+
+FqPieQueueDiscL4sMode::~FqPieQueueDiscL4sMode ()
+{}
+
+void
+FqPieQueueDiscL4sMode::AddPacket (Ptr<FqPieQueueDisc> queue, Ipv4Header hdr, uint32_t nPkt)
+{
+  Address dest;
+  Ptr<Packet> p = Create<Packet> (100);
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Ptr<Ipv4QueueDiscItem> item = Create<Ipv4QueueDiscItem> (p, dest, 0, hdr);
+      queue->Enqueue (item);
+    }
+}
+
+void
+FqPieQueueDiscL4sMode::AddPacketWithDelay (Ptr<FqPieQueueDisc> queue,Ipv4Header hdr, double delay, uint32_t nPkt)
+{
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Simulator::Schedule (Time (Seconds ((i + 1) * delay)), &FqPieQueueDiscL4sMode::AddPacket, this, queue, hdr, 1);
+    }
+}
+
+void
+FqPieQueueDiscL4sMode::Dequeue (Ptr<FqPieQueueDisc> queue, uint32_t nPkt)
+{
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Ptr<QueueDiscItem> item = queue->Dequeue ();
+    }
+}
+
+void
+FqPieQueueDiscL4sMode::DequeueWithDelay (Ptr<FqPieQueueDisc> queue, double delay, uint32_t nPkt)
+{
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Simulator::Schedule (Time (Seconds ((i + 1) * delay)), &FqPieQueueDiscL4sMode::Dequeue, this, queue, 1);
+    }
+}
+
+void
+FqPieQueueDiscL4sMode::DoRun (void)
+{
+  // Test is divided into 2 sub test cases:
+  // 1) Without hash collisions
+  // 2) With hash collisions
+
+  // Test case 1, Without hash collisions
+  Ptr<FqPieQueueDisc> queueDisc = CreateObjectWithAttributes<FqPieQueueDisc> ("MaxSize", StringValue ("10240p"), 
+    "UseEcn", BooleanValue (true), "Perturbation", UintegerValue (0),
+    "UseL4s", BooleanValue (true), "CeThreshold", TimeValue (MilliSeconds (2)));
+
+  queueDisc->SetQuantum (1514);
+  queueDisc->Initialize ();
+  Ipv4Header hdr;
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (7);
+  hdr.SetEcn (Ipv4Header::ECN_ECT1);
+
+  // Add 70 ECT1 (ECN capable) packets from the first flow
+  // Set delay = 0.5ms
+  double delay = 0.0005;
+  Simulator::Schedule (Time (Seconds (0)), &FqPieQueueDiscL4sMode::AddPacketWithDelay, this, queueDisc, hdr, delay, 70);
+
+  // Add 70 ECT0 (ECN capable) packets from second flow
+  hdr.SetEcn (Ipv4Header::ECN_ECT0);
+  hdr.SetDestination (Ipv4Address ("10.10.1.10"));
+  Simulator::Schedule (Time (Seconds (0)), &FqPieQueueDiscL4sMode::AddPacketWithDelay, this, queueDisc, hdr, delay, 70);
+
+  //Dequeue 140 packets with delay 1ms
+  delay = 0.001;
+  DequeueWithDelay (queueDisc, delay, 140);
+  Simulator::Stop (Seconds (10.0));
+  Simulator::Run ();
+
+  Ptr<PieQueueDisc> q0 = queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetObject <PieQueueDisc> ();
+  Ptr<PieQueueDisc> q1 = queueDisc->GetQueueDiscClass (1)->GetQueueDisc ()->GetObject <PieQueueDisc> ();
+
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNMarkedPackets (PieQueueDisc::CE_THRESHOLD_EXCEEDED_MARK), 66, "There should be 66 marked packets"
+                         "4th packet is enqueued at 2ms and dequeued at 4ms hence the delay of 2ms which not greater than CE threshold"
+                         "5th packet is enqueued at 2.5ms and dequeued at 5ms hence the delay of 2.5ms and subsequent packet also do have delay"
+                         "greater than CE threshold so all the packets after 4th packet are marked");
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP), 0, "Queue delay is less than max burst allowance so"
+                         "There should not be any dropped packets");
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNMarkedPackets (PieQueueDisc::UNFORCED_MARK), 0, "There should not be any marked packets");
+  NS_TEST_EXPECT_MSG_EQ (q1->GetStats ().GetNMarkedPackets (PieQueueDisc::UNFORCED_MARK), 0, "There should not be marked packets.");
+  NS_TEST_EXPECT_MSG_EQ (q1->GetStats ().GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP), 0, "There should not be any dropped packets");
+
+  Simulator::Destroy ();
+
+  // Test case 2, With hash collisions
+  queueDisc = CreateObjectWithAttributes<FqPieQueueDisc> ("MaxSize", StringValue ("10240p"), 
+    "UseEcn", BooleanValue (true), "Perturbation", UintegerValue (0),
+    "UseL4s", BooleanValue (true), "CeThreshold", TimeValue (MilliSeconds (2)));
+
+  queueDisc->SetQuantum (1514);
+  queueDisc->Initialize ();
+  hdr.SetPayloadSize (100);
+  hdr.SetSource (Ipv4Address ("10.10.1.1"));
+  hdr.SetDestination (Ipv4Address ("10.10.1.2"));
+  hdr.SetProtocol (7);
+  hdr.SetEcn (Ipv4Header::ECN_ECT1);
+
+  // Add 70 ECT1 (ECN capable) packets from the first flow
+  // Set delay = 1ms
+  delay = 0.001;
+  Simulator::Schedule (Time (Seconds (0.0005)), &FqPieQueueDiscL4sMode::AddPacket, this, queueDisc, hdr, 1);
+  Simulator::Schedule (Time (Seconds (0.0005)), &FqPieQueueDiscL4sMode::AddPacketWithDelay, this, queueDisc, hdr, delay, 69);
+
+  // Add 70 ECT0 (ECN capable) packets from first flow
+  hdr.SetEcn (Ipv4Header::ECN_ECT0);
+  Simulator::Schedule (Time (Seconds (0)), &FqPieQueueDiscL4sMode::AddPacketWithDelay, this, queueDisc, hdr, delay, 70);
+
+  //Dequeue 140 packets with delay 1ms
+  DequeueWithDelay (queueDisc, delay, 140);
+  Simulator::Stop (Seconds (1.0));
+  Simulator::Run ();
+  q0 = queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetObject <PieQueueDisc> ();
+  q0 = queueDisc->GetQueueDiscClass (0)->GetQueueDisc ()->GetObject <PieQueueDisc> ();
+
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNMarkedPackets (PieQueueDisc::CE_THRESHOLD_EXCEEDED_MARK), 68, "There should be 68 marked packets"
+                         "2nd ECT1 packet is enqueued at 1.5ms and dequeued at 3ms hence the delay of 1.5ms which not greater than CE threshold"
+                         "3rd packet is enqueued at 2.5ms and dequeued at 5ms hence the delay of 2.5ms and subsequent packet also do have delay"
+                         "greater than CE threshold so all the packets after 2nd packet are marked");
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP), 0, "Queue delay is less than max burst allowance so"
+                         "There should not be any dropped packets");
+  NS_TEST_EXPECT_MSG_EQ (q0->GetStats ().GetNMarkedPackets (PieQueueDisc::UNFORCED_MARK), 0, "There should not be any marked packets");
+
+  Simulator::Destroy ();
+}
+
+class FqPieQueueDiscTestSuite : public TestSuite
+{
+public:
+  FqPieQueueDiscTestSuite ();
+};
+
+FqPieQueueDiscTestSuite::FqPieQueueDiscTestSuite ()
+  : TestSuite ("fq-pie-queue-disc", UNIT)
+{
+  AddTestCase (new FqPieQueueDiscNoSuitableFilter, TestCase::QUICK);
+  AddTestCase (new FqPieQueueDiscIPFlowsSeparationAndPacketLimit, TestCase::QUICK);
+  AddTestCase (new FqPieQueueDiscDeficit, TestCase::QUICK);
+  AddTestCase (new FqPieQueueDiscTCPFlowsSeparation, TestCase::QUICK);
+  AddTestCase (new FqPieQueueDiscUDPFlowsSeparation, TestCase::QUICK);
+  AddTestCase (new FqPieQueueDiscSetLinearProbing, TestCase::QUICK);
+  AddTestCase (new FqPieQueueDiscL4sMode, TestCase::QUICK);
+}
+
+static FqPieQueueDiscTestSuite FqPieQueueDiscTestSuite;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/test/ns3wifi/wifi-ac-mapping-test-suite.cc ns-3.34/src/test/ns3wifi/wifi-ac-mapping-test-suite.cc
--- ns-3.33/src/test/ns3wifi/wifi-ac-mapping-test-suite.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/test/ns3wifi/wifi-ac-mapping-test-suite.cc	2021-07-14 10:31:07.000000000 -0700
@@ -41,19 +41,47 @@
 
 NS_LOG_COMPONENT_DEFINE ("WifiAcMappingTest");
 
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief Test for User priority to Access Category mapping
+ */
 class WifiAcMappingTest : public TestCase
 {
 public:
+  /**
+   * Constructor for WifiAcMappingTest
+   *
+   * \param tos the type of service
+   * \param expectedQueue the expected queue disc index
+   */
   WifiAcMappingTest (uint8_t tos, uint8_t expectedQueue);
   virtual void DoRun (void);
 
 private:
+  /**
+   * Function called whenever a packet is enqueued in
+   * a queue disc.
+   *
+   * \param tos the type of service
+   * \param count the pointer to the packet counter
+   * \param item the enqueued item
+   */
   static void PacketEnqueuedInQueueDisc (uint8_t tos, uint16_t* count, Ptr<const QueueDiscItem> item);
+  /**
+   * Function called whenever a packet is enqueued in
+   * a Wi-Fi MAC queue.
+   *
+   * \param tos the type of service
+   * \param count the pointer to the packet counter
+   * \param item the enqueued item
+   */
   static void PacketEnqueuedInWifiMacQueue (uint8_t tos, uint16_t* count, Ptr<const WifiMacQueueItem> item);
-  uint8_t m_tos;
-  uint16_t m_expectedQueue;
-  uint16_t m_QueueDiscCount[4];
-  uint16_t m_WifiMacQueueCount[4];
+  uint8_t m_tos; //!< type of service
+  uint16_t m_expectedQueue; //!< expected queue disc index
+  uint16_t m_QueueDiscCount[4]; //!< packet counter per queue disc
+  uint16_t m_WifiMacQueueCount[4]; //!< packet counter per Wi-Fi MAC queue
 };
 
 WifiAcMappingTest::WifiAcMappingTest (uint8_t tos, uint8_t expectedQueue)
@@ -242,7 +270,12 @@
   Simulator::Destroy ();
 }
 
-
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief Access category mapping Test Suite
+ */
 class WifiAcMappingTestSuite : public TestSuite
 {
 public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/test/ns3wifi/wifi-issue-211-test-suite.cc ns-3.34/src/test/ns3wifi/wifi-issue-211-test-suite.cc
--- ns-3.33/src/test/ns3wifi/wifi-issue-211-test-suite.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/test/ns3wifi/wifi-issue-211-test-suite.cc	2021-07-14 10:31:07.000000000 -0700
@@ -125,7 +125,6 @@
   spectrumChannel->SetPropagationDelayModel (delayModel);
 
   SpectrumWifiPhyHelper phy;
-  phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
   phy.SetChannel (spectrumChannel);
 
   WifiHelper wifi;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/test/ns3wifi/wifi-msdu-aggregator-test-suite.cc ns-3.34/src/test/ns3wifi/wifi-msdu-aggregator-test-suite.cc
--- ns-3.33/src/test/ns3wifi/wifi-msdu-aggregator-test-suite.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/test/ns3wifi/wifi-msdu-aggregator-test-suite.cc	2021-07-14 10:31:07.000000000 -0700
@@ -34,6 +34,12 @@
 
 using namespace ns3;
 
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief Throughput test for MsduAggregator
+ */
 class WifiMsduAggregatorThroughputTest : public TestCase
 {
 public:
@@ -41,7 +47,7 @@
   virtual void DoRun (void);
 
 private:
-  bool m_writeResults;
+  bool m_writeResults; //!< flag whether to generate pcap
 };
 
 WifiMsduAggregatorThroughputTest::WifiMsduAggregatorThroughputTest ()
@@ -150,6 +156,7 @@
   // Enable tracing at the AP
   if (m_writeResults)
     {
+      wifiPhy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
       wifiPhy.EnablePcap ("wifi-amsdu-throughput", sta.Get (0)->GetId (), 0);
     }
 
@@ -181,9 +188,16 @@
 }
 
 
-// For now the MSDU Aggregator Test Suite contains only the one test
-// that is defined in this file, so it's class definition and
-// instantiation can live here.
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief MsduAggregator Test Suite
+ *
+ * For now the MSDU Aggregator Test Suite contains only the one test
+ * that is defined in this file, so it's class definition and
+ * instantiation can live here.
+ */
 class WifiMsduAggregatorTestSuite : public TestSuite
 {
 public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/test/wscript ns-3.34/src/test/wscript
--- ns-3.33/src/test/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/test/wscript	2021-07-14 10:31:07.000000000 -0700
@@ -31,6 +31,8 @@
     test_test.source = [
         'csma-system-test-suite.cc',
         'ns3tc/fq-codel-queue-disc-test-suite.cc',
+        'ns3tc/fq-cobalt-queue-disc-test-suite.cc',
+        'ns3tc/fq-pie-queue-disc-test-suite.cc',
         'ns3tc/pfifo-fast-queue-disc-test-suite.cc',
         'ns3tcp/ns3tcp-cwnd-test-suite.cc',
         'ns3tcp/ns3tcp-interop-test-suite.cc',
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/topology-read/bindings/modulegen__gcc_ILP32.py ns-3.34/src/topology-read/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/topology-read/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/topology-read/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -71,12 +71,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -356,8 +360,10 @@
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1173,6 +1179,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1386,6 +1404,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1461,6 +1484,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1481,6 +1516,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/topology-read/bindings/modulegen__gcc_LP64.py ns-3.34/src/topology-read/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/topology-read/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/topology-read/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -71,12 +71,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -356,8 +360,10 @@
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1173,6 +1179,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1386,6 +1404,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1461,6 +1484,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1481,6 +1516,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/topology-read/examples/topology-example-sim.cc ns-3.34/src/topology-read/examples/topology-example-sim.cc
--- ns-3.33/src/topology-read/examples/topology-example-sim.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/topology-read/examples/topology-example-sim.cc	2021-07-14 10:31:07.000000000 -0700
@@ -68,8 +68,11 @@
 
 NS_LOG_COMPONENT_DEFINE ("TopologyCreationExperiment");
 
-static std::list<unsigned int> data;
-
+/**
+ * Print the TTL of received packet
+ * \param p received packet
+ * \param ad sender address
+ */
 static void SinkRx (Ptr<const Packet> p, const Address &ad)
 {
   Ipv4Header ipv4;
@@ -130,7 +133,7 @@
   stack.SetRoutingHelper (nixRouting);  // has effect on the next Install ()
   stack.Install (nodes);
 
-  NS_LOG_INFO ("creating ip4 addresses");
+  NS_LOG_INFO ("creating IPv4 addresses");
   Ipv4AddressHelper address;
   address.SetBase ("10.0.0.0", "255.255.255.252");
 
@@ -157,7 +160,7 @@
     }
 
   // it crates little subnets, one for each couple of nodes.
-  NS_LOG_INFO ("creating ipv4 interfaces");
+  NS_LOG_INFO ("creating IPv4 interfaces");
   Ipv4InterfaceContainer* ipic = new Ipv4InterfaceContainer[totlinks];
   for (int i = 0; i < totlinks; i++)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/topology-read/model/rocketfuel-topology-reader.cc ns-3.34/src/topology-read/model/rocketfuel-topology-reader.cc
--- ns-3.33/src/topology-read/model/rocketfuel-topology-reader.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/topology-read/model/rocketfuel-topology-reader.cc	2021-07-14 10:31:07.000000000 -0700
@@ -65,13 +65,19 @@
 /* uid @loc [+] [bb] (num_neigh) [&ext] -> <nuid-1> <nuid-2> ... {-euid} ... =name[!] rn */
 
 
+/// Maximum nuber of matches in a regex query
 #define REGMATCH_MAX 16
 
+/// Start of a line
 #define START "^"
+/// End of a line
 #define END "$"
+/// One or more spaces
 #define SPACE "[ \t]+"
+/// Zero or more spaces
 #define MAYSPACE "[ \t]*"
 
+/// Regex expression matching a MAP line
 #define ROCKETFUEL_MAPS_LINE \
   START "(-*[0-9]+)" SPACE "(@[?A-Za-z0-9,+]+)" SPACE \
   "(\\+)*" MAYSPACE "(bb)*" MAYSPACE \
@@ -81,6 +87,7 @@
   "=([A-Za-z0-9.!-]+)" SPACE "r([0-9])" \
   MAYSPACE END
 
+/// Regex expression matching a WEIGHT line
 #define ROCKETFUEL_WEIGHTS_LINE \
   START "([^ \t]+)" SPACE "([^ \t]+)" SPACE "([0-9.]+)" MAYSPACE END
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/topology-read/model/rocketfuel-topology-reader.h ns-3.34/src/topology-read/model/rocketfuel-topology-reader.h
--- ns-3.33/src/topology-read/model/rocketfuel-topology-reader.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/topology-read/model/rocketfuel-topology-reader.h	2021-07-14 10:31:07.000000000 -0700
@@ -108,9 +108,10 @@
   /**
    * \brief Classifies the file type according to its content.
    *
+   * \param buf the first line of the file being read
    * \return The file type (RF_MAPS, RF_WEIGHTS, or RF_UNKNOWN)
    */
-  enum RF_FileType GetFileType (const char *);
+  enum RF_FileType GetFileType (const char *buf);
 
   int m_linksNumber; //!< Number of links.
   int m_nodesNumber; //!< Number of nodes.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/bindings/modulegen__gcc_ILP32.py ns-3.34/src/traffic-control/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/traffic-control/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/traffic-control/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -111,12 +111,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -366,6 +370,18 @@
     module.add_enum('FlowStatus', ['INACTIVE', 'NEW_FLOW', 'OLD_FLOW'], outer_class=root_module['ns3::FqCoDelFlow'])
     ## fq-codel-queue-disc.h (module 'traffic-control'): ns3::FqCoDelQueueDisc [class]
     module.add_class('FqCoDelQueueDisc', parent=root_module['ns3::QueueDisc'])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltFlow [class]
+    module.add_class('FqCobaltFlow', parent=root_module['ns3::QueueDiscClass'])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltFlow::FlowStatus [enumeration]
+    module.add_enum('FlowStatus', ['INACTIVE', 'NEW_FLOW', 'OLD_FLOW'], outer_class=root_module['ns3::FqCobaltFlow'])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltQueueDisc [class]
+    module.add_class('FqCobaltQueueDisc', parent=root_module['ns3::QueueDisc'])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieFlow [class]
+    module.add_class('FqPieFlow', parent=root_module['ns3::QueueDiscClass'])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieFlow::FlowStatus [enumeration]
+    module.add_enum('FlowStatus', ['INACTIVE', 'NEW_FLOW', 'OLD_FLOW'], outer_class=root_module['ns3::FqPieFlow'])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieQueueDisc [class]
+    module.add_class('FqPieQueueDisc', parent=root_module['ns3::QueueDisc'])
     ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable [class]
     module.add_class('GammaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## integer.h (module 'core'): ns3::IntegerValue [class]
@@ -670,8 +686,10 @@
     register_Ns3IntToType__5_methods(root_module, root_module['ns3::IntToType< 5 >'])
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -766,6 +784,10 @@
     register_Ns3FifoQueueDisc_methods(root_module, root_module['ns3::FifoQueueDisc'])
     register_Ns3FqCoDelFlow_methods(root_module, root_module['ns3::FqCoDelFlow'])
     register_Ns3FqCoDelQueueDisc_methods(root_module, root_module['ns3::FqCoDelQueueDisc'])
+    register_Ns3FqCobaltFlow_methods(root_module, root_module['ns3::FqCobaltFlow'])
+    register_Ns3FqCobaltQueueDisc_methods(root_module, root_module['ns3::FqCobaltQueueDisc'])
+    register_Ns3FqPieFlow_methods(root_module, root_module['ns3::FqPieFlow'])
+    register_Ns3FqPieQueueDisc_methods(root_module, root_module['ns3::FqPieQueueDisc'])
     register_Ns3GammaRandomVariable_methods(root_module, root_module['ns3::GammaRandomVariable'])
     register_Ns3IntegerValue_methods(root_module, root_module['ns3::IntegerValue'])
     register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
@@ -1316,6 +1338,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1717,6 +1747,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1930,6 +1972,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2005,6 +2052,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2025,6 +2084,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5142,36 +5206,43 @@
                    is_static=True)
     ## cobalt-queue-disc.h (module 'traffic-control'): ns3::CobaltQueueDisc::CobaltQueueDisc() [constructor]
     cls.add_constructor([])
-    ## cobalt-queue-disc.h (module 'traffic-control'): ns3::Time ns3::CobaltQueueDisc::GetTarget() [member function]
+    ## cobalt-queue-disc.h (module 'traffic-control'): ns3::Time ns3::CobaltQueueDisc::GetTarget() const [member function]
     cls.add_method('GetTarget', 
                    'ns3::Time', 
-                   [])
-    ## cobalt-queue-disc.h (module 'traffic-control'): ns3::Time ns3::CobaltQueueDisc::GetInterval() [member function]
+                   [], 
+                   is_const=True)
+    ## cobalt-queue-disc.h (module 'traffic-control'): ns3::Time ns3::CobaltQueueDisc::GetInterval() const [member function]
     cls.add_method('GetInterval', 
                    'ns3::Time', 
-                   [])
-    ## cobalt-queue-disc.h (module 'traffic-control'): int64_t ns3::CobaltQueueDisc::GetDropNext() [member function]
+                   [], 
+                   is_const=True)
+    ## cobalt-queue-disc.h (module 'traffic-control'): int64_t ns3::CobaltQueueDisc::GetDropNext() const [member function]
     cls.add_method('GetDropNext', 
                    'int64_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## cobalt-queue-disc.h (module 'traffic-control'): ns3::CobaltQueueDisc::TARGET_EXCEEDED_DROP [variable]
     cls.add_static_attribute('TARGET_EXCEEDED_DROP', 'char const * const', is_const=True)
     ## cobalt-queue-disc.h (module 'traffic-control'): ns3::CobaltQueueDisc::OVERLIMIT_DROP [variable]
     cls.add_static_attribute('OVERLIMIT_DROP', 'char const * const', is_const=True)
     ## cobalt-queue-disc.h (module 'traffic-control'): ns3::CobaltQueueDisc::FORCED_MARK [variable]
     cls.add_static_attribute('FORCED_MARK', 'char const * const', is_const=True)
-    ## cobalt-queue-disc.h (module 'traffic-control'): double ns3::CobaltQueueDisc::GetPdrop() [member function]
+    ## cobalt-queue-disc.h (module 'traffic-control'): ns3::CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK [variable]
+    cls.add_static_attribute('CE_THRESHOLD_EXCEEDED_MARK', 'char const * const', is_const=True)
+    ## cobalt-queue-disc.h (module 'traffic-control'): double ns3::CobaltQueueDisc::GetPdrop() const [member function]
     cls.add_method('GetPdrop', 
                    'double', 
-                   [])
+                   [], 
+                   is_const=True)
     ## cobalt-queue-disc.h (module 'traffic-control'): int64_t ns3::CobaltQueueDisc::AssignStreams(int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## cobalt-queue-disc.h (module 'traffic-control'): int64_t ns3::CobaltQueueDisc::Time2CoDel(ns3::Time t) [member function]
+    ## cobalt-queue-disc.h (module 'traffic-control'): int64_t ns3::CobaltQueueDisc::Time2CoDel(ns3::Time t) const [member function]
     cls.add_method('Time2CoDel', 
                    'int64_t', 
-                   [param('ns3::Time', 't')])
+                   [param('ns3::Time', 't')], 
+                   is_const=True)
     ## cobalt-queue-disc.h (module 'traffic-control'): void ns3::CobaltQueueDisc::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -5764,6 +5835,178 @@
                    is_virtual=True, visibility='private')
     return
 
+def register_Ns3FqCobaltFlow_methods(root_module, cls):
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltFlow::FqCobaltFlow(ns3::FqCobaltFlow const & arg0) [constructor]
+    cls.add_constructor([param('ns3::FqCobaltFlow const &', 'arg0')])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltFlow::FqCobaltFlow() [constructor]
+    cls.add_constructor([])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): int32_t ns3::FqCobaltFlow::GetDeficit() const [member function]
+    cls.add_method('GetDeficit', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): uint32_t ns3::FqCobaltFlow::GetIndex() const [member function]
+    cls.add_method('GetIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltFlow::FlowStatus ns3::FqCobaltFlow::GetStatus() const [member function]
+    cls.add_method('GetStatus', 
+                   'ns3::FqCobaltFlow::FlowStatus', 
+                   [], 
+                   is_const=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): static ns3::TypeId ns3::FqCobaltFlow::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): void ns3::FqCobaltFlow::IncreaseDeficit(int32_t deficit) [member function]
+    cls.add_method('IncreaseDeficit', 
+                   'void', 
+                   [param('int32_t', 'deficit')])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): void ns3::FqCobaltFlow::SetDeficit(uint32_t deficit) [member function]
+    cls.add_method('SetDeficit', 
+                   'void', 
+                   [param('uint32_t', 'deficit')])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): void ns3::FqCobaltFlow::SetIndex(uint32_t index) [member function]
+    cls.add_method('SetIndex', 
+                   'void', 
+                   [param('uint32_t', 'index')])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): void ns3::FqCobaltFlow::SetStatus(ns3::FqCobaltFlow::FlowStatus status) [member function]
+    cls.add_method('SetStatus', 
+                   'void', 
+                   [param('ns3::FqCobaltFlow::FlowStatus', 'status')])
+    return
+
+def register_Ns3FqCobaltQueueDisc_methods(root_module, cls):
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): static ns3::TypeId ns3::FqCobaltQueueDisc::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltQueueDisc::FqCobaltQueueDisc() [constructor]
+    cls.add_constructor([])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): void ns3::FqCobaltQueueDisc::SetQuantum(uint32_t quantum) [member function]
+    cls.add_method('SetQuantum', 
+                   'void', 
+                   [param('uint32_t', 'quantum')])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): uint32_t ns3::FqCobaltQueueDisc::GetQuantum() const [member function]
+    cls.add_method('GetQuantum', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltQueueDisc::UNCLASSIFIED_DROP [variable]
+    cls.add_static_attribute('UNCLASSIFIED_DROP', 'char const * const', is_const=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltQueueDisc::OVERLIMIT_DROP [variable]
+    cls.add_static_attribute('OVERLIMIT_DROP', 'char const * const', is_const=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): bool ns3::FqCobaltQueueDisc::DoEnqueue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
+                   is_virtual=True, visibility='private')
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::Ptr<ns3::QueueDiscItem> ns3::FqCobaltQueueDisc::DoDequeue() [member function]
+    cls.add_method('DoDequeue', 
+                   'ns3::Ptr< ns3::QueueDiscItem >', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): bool ns3::FqCobaltQueueDisc::CheckConfig() [member function]
+    cls.add_method('CheckConfig', 
+                   'bool', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): void ns3::FqCobaltQueueDisc::InitializeParams() [member function]
+    cls.add_method('InitializeParams', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3FqPieFlow_methods(root_module, cls):
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieFlow::FqPieFlow(ns3::FqPieFlow const & arg0) [constructor]
+    cls.add_constructor([param('ns3::FqPieFlow const &', 'arg0')])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieFlow::FqPieFlow() [constructor]
+    cls.add_constructor([])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): int32_t ns3::FqPieFlow::GetDeficit() const [member function]
+    cls.add_method('GetDeficit', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): uint32_t ns3::FqPieFlow::GetIndex() const [member function]
+    cls.add_method('GetIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieFlow::FlowStatus ns3::FqPieFlow::GetStatus() const [member function]
+    cls.add_method('GetStatus', 
+                   'ns3::FqPieFlow::FlowStatus', 
+                   [], 
+                   is_const=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): static ns3::TypeId ns3::FqPieFlow::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): void ns3::FqPieFlow::IncreaseDeficit(int32_t deficit) [member function]
+    cls.add_method('IncreaseDeficit', 
+                   'void', 
+                   [param('int32_t', 'deficit')])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): void ns3::FqPieFlow::SetDeficit(uint32_t deficit) [member function]
+    cls.add_method('SetDeficit', 
+                   'void', 
+                   [param('uint32_t', 'deficit')])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): void ns3::FqPieFlow::SetIndex(uint32_t index) [member function]
+    cls.add_method('SetIndex', 
+                   'void', 
+                   [param('uint32_t', 'index')])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): void ns3::FqPieFlow::SetStatus(ns3::FqPieFlow::FlowStatus status) [member function]
+    cls.add_method('SetStatus', 
+                   'void', 
+                   [param('ns3::FqPieFlow::FlowStatus', 'status')])
+    return
+
+def register_Ns3FqPieQueueDisc_methods(root_module, cls):
+    ## fq-pie-queue-disc.h (module 'traffic-control'): static ns3::TypeId ns3::FqPieQueueDisc::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieQueueDisc::FqPieQueueDisc() [constructor]
+    cls.add_constructor([])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): void ns3::FqPieQueueDisc::SetQuantum(uint32_t quantum) [member function]
+    cls.add_method('SetQuantum', 
+                   'void', 
+                   [param('uint32_t', 'quantum')])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): uint32_t ns3::FqPieQueueDisc::GetQuantum() const [member function]
+    cls.add_method('GetQuantum', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieQueueDisc::UNCLASSIFIED_DROP [variable]
+    cls.add_static_attribute('UNCLASSIFIED_DROP', 'char const * const', is_const=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieQueueDisc::OVERLIMIT_DROP [variable]
+    cls.add_static_attribute('OVERLIMIT_DROP', 'char const * const', is_const=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): bool ns3::FqPieQueueDisc::DoEnqueue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
+                   is_virtual=True, visibility='private')
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::Ptr<ns3::QueueDiscItem> ns3::FqPieQueueDisc::DoDequeue() [member function]
+    cls.add_method('DoDequeue', 
+                   'ns3::Ptr< ns3::QueueDiscItem >', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## fq-pie-queue-disc.h (module 'traffic-control'): bool ns3::FqPieQueueDisc::CheckConfig() [member function]
+    cls.add_method('CheckConfig', 
+                   'bool', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## fq-pie-queue-disc.h (module 'traffic-control'): void ns3::FqPieQueueDisc::InitializeParams() [member function]
+    cls.add_method('InitializeParams', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    return
+
 def register_Ns3GammaRandomVariable_methods(root_module, cls):
     ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::GammaRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -6763,6 +7006,8 @@
     cls.add_static_attribute('FORCED_DROP', 'char const * const', is_const=True)
     ## pie-queue-disc.h (module 'traffic-control'): ns3::PieQueueDisc::UNFORCED_MARK [variable]
     cls.add_static_attribute('UNFORCED_MARK', 'char const * const', is_const=True)
+    ## pie-queue-disc.h (module 'traffic-control'): ns3::PieQueueDisc::CE_THRESHOLD_EXCEEDED_MARK [variable]
+    cls.add_static_attribute('CE_THRESHOLD_EXCEEDED_MARK', 'char const * const', is_const=True)
     ## pie-queue-disc.h (module 'traffic-control'): void ns3::PieQueueDisc::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -6933,6 +7178,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -6958,6 +7208,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -7019,6 +7274,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -7044,6 +7304,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/bindings/modulegen__gcc_LP64.py ns-3.34/src/traffic-control/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/traffic-control/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/traffic-control/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -111,12 +111,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -366,6 +370,18 @@
     module.add_enum('FlowStatus', ['INACTIVE', 'NEW_FLOW', 'OLD_FLOW'], outer_class=root_module['ns3::FqCoDelFlow'])
     ## fq-codel-queue-disc.h (module 'traffic-control'): ns3::FqCoDelQueueDisc [class]
     module.add_class('FqCoDelQueueDisc', parent=root_module['ns3::QueueDisc'])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltFlow [class]
+    module.add_class('FqCobaltFlow', parent=root_module['ns3::QueueDiscClass'])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltFlow::FlowStatus [enumeration]
+    module.add_enum('FlowStatus', ['INACTIVE', 'NEW_FLOW', 'OLD_FLOW'], outer_class=root_module['ns3::FqCobaltFlow'])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltQueueDisc [class]
+    module.add_class('FqCobaltQueueDisc', parent=root_module['ns3::QueueDisc'])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieFlow [class]
+    module.add_class('FqPieFlow', parent=root_module['ns3::QueueDiscClass'])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieFlow::FlowStatus [enumeration]
+    module.add_enum('FlowStatus', ['INACTIVE', 'NEW_FLOW', 'OLD_FLOW'], outer_class=root_module['ns3::FqPieFlow'])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieQueueDisc [class]
+    module.add_class('FqPieQueueDisc', parent=root_module['ns3::QueueDisc'])
     ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable [class]
     module.add_class('GammaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## integer.h (module 'core'): ns3::IntegerValue [class]
@@ -670,8 +686,10 @@
     register_Ns3IntToType__5_methods(root_module, root_module['ns3::IntToType< 5 >'])
     register_Ns3IntToType__6_methods(root_module, root_module['ns3::IntToType< 6 >'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -766,6 +784,10 @@
     register_Ns3FifoQueueDisc_methods(root_module, root_module['ns3::FifoQueueDisc'])
     register_Ns3FqCoDelFlow_methods(root_module, root_module['ns3::FqCoDelFlow'])
     register_Ns3FqCoDelQueueDisc_methods(root_module, root_module['ns3::FqCoDelQueueDisc'])
+    register_Ns3FqCobaltFlow_methods(root_module, root_module['ns3::FqCobaltFlow'])
+    register_Ns3FqCobaltQueueDisc_methods(root_module, root_module['ns3::FqCobaltQueueDisc'])
+    register_Ns3FqPieFlow_methods(root_module, root_module['ns3::FqPieFlow'])
+    register_Ns3FqPieQueueDisc_methods(root_module, root_module['ns3::FqPieQueueDisc'])
     register_Ns3GammaRandomVariable_methods(root_module, root_module['ns3::GammaRandomVariable'])
     register_Ns3IntegerValue_methods(root_module, root_module['ns3::IntegerValue'])
     register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
@@ -1316,6 +1338,14 @@
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -1717,6 +1747,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1930,6 +1972,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2005,6 +2052,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2025,6 +2084,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -5142,36 +5206,43 @@
                    is_static=True)
     ## cobalt-queue-disc.h (module 'traffic-control'): ns3::CobaltQueueDisc::CobaltQueueDisc() [constructor]
     cls.add_constructor([])
-    ## cobalt-queue-disc.h (module 'traffic-control'): ns3::Time ns3::CobaltQueueDisc::GetTarget() [member function]
+    ## cobalt-queue-disc.h (module 'traffic-control'): ns3::Time ns3::CobaltQueueDisc::GetTarget() const [member function]
     cls.add_method('GetTarget', 
                    'ns3::Time', 
-                   [])
-    ## cobalt-queue-disc.h (module 'traffic-control'): ns3::Time ns3::CobaltQueueDisc::GetInterval() [member function]
+                   [], 
+                   is_const=True)
+    ## cobalt-queue-disc.h (module 'traffic-control'): ns3::Time ns3::CobaltQueueDisc::GetInterval() const [member function]
     cls.add_method('GetInterval', 
                    'ns3::Time', 
-                   [])
-    ## cobalt-queue-disc.h (module 'traffic-control'): int64_t ns3::CobaltQueueDisc::GetDropNext() [member function]
+                   [], 
+                   is_const=True)
+    ## cobalt-queue-disc.h (module 'traffic-control'): int64_t ns3::CobaltQueueDisc::GetDropNext() const [member function]
     cls.add_method('GetDropNext', 
                    'int64_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## cobalt-queue-disc.h (module 'traffic-control'): ns3::CobaltQueueDisc::TARGET_EXCEEDED_DROP [variable]
     cls.add_static_attribute('TARGET_EXCEEDED_DROP', 'char const * const', is_const=True)
     ## cobalt-queue-disc.h (module 'traffic-control'): ns3::CobaltQueueDisc::OVERLIMIT_DROP [variable]
     cls.add_static_attribute('OVERLIMIT_DROP', 'char const * const', is_const=True)
     ## cobalt-queue-disc.h (module 'traffic-control'): ns3::CobaltQueueDisc::FORCED_MARK [variable]
     cls.add_static_attribute('FORCED_MARK', 'char const * const', is_const=True)
-    ## cobalt-queue-disc.h (module 'traffic-control'): double ns3::CobaltQueueDisc::GetPdrop() [member function]
+    ## cobalt-queue-disc.h (module 'traffic-control'): ns3::CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK [variable]
+    cls.add_static_attribute('CE_THRESHOLD_EXCEEDED_MARK', 'char const * const', is_const=True)
+    ## cobalt-queue-disc.h (module 'traffic-control'): double ns3::CobaltQueueDisc::GetPdrop() const [member function]
     cls.add_method('GetPdrop', 
                    'double', 
-                   [])
+                   [], 
+                   is_const=True)
     ## cobalt-queue-disc.h (module 'traffic-control'): int64_t ns3::CobaltQueueDisc::AssignStreams(int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## cobalt-queue-disc.h (module 'traffic-control'): int64_t ns3::CobaltQueueDisc::Time2CoDel(ns3::Time t) [member function]
+    ## cobalt-queue-disc.h (module 'traffic-control'): int64_t ns3::CobaltQueueDisc::Time2CoDel(ns3::Time t) const [member function]
     cls.add_method('Time2CoDel', 
                    'int64_t', 
-                   [param('ns3::Time', 't')])
+                   [param('ns3::Time', 't')], 
+                   is_const=True)
     ## cobalt-queue-disc.h (module 'traffic-control'): void ns3::CobaltQueueDisc::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -5764,6 +5835,178 @@
                    is_virtual=True, visibility='private')
     return
 
+def register_Ns3FqCobaltFlow_methods(root_module, cls):
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltFlow::FqCobaltFlow(ns3::FqCobaltFlow const & arg0) [constructor]
+    cls.add_constructor([param('ns3::FqCobaltFlow const &', 'arg0')])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltFlow::FqCobaltFlow() [constructor]
+    cls.add_constructor([])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): int32_t ns3::FqCobaltFlow::GetDeficit() const [member function]
+    cls.add_method('GetDeficit', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): uint32_t ns3::FqCobaltFlow::GetIndex() const [member function]
+    cls.add_method('GetIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltFlow::FlowStatus ns3::FqCobaltFlow::GetStatus() const [member function]
+    cls.add_method('GetStatus', 
+                   'ns3::FqCobaltFlow::FlowStatus', 
+                   [], 
+                   is_const=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): static ns3::TypeId ns3::FqCobaltFlow::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): void ns3::FqCobaltFlow::IncreaseDeficit(int32_t deficit) [member function]
+    cls.add_method('IncreaseDeficit', 
+                   'void', 
+                   [param('int32_t', 'deficit')])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): void ns3::FqCobaltFlow::SetDeficit(uint32_t deficit) [member function]
+    cls.add_method('SetDeficit', 
+                   'void', 
+                   [param('uint32_t', 'deficit')])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): void ns3::FqCobaltFlow::SetIndex(uint32_t index) [member function]
+    cls.add_method('SetIndex', 
+                   'void', 
+                   [param('uint32_t', 'index')])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): void ns3::FqCobaltFlow::SetStatus(ns3::FqCobaltFlow::FlowStatus status) [member function]
+    cls.add_method('SetStatus', 
+                   'void', 
+                   [param('ns3::FqCobaltFlow::FlowStatus', 'status')])
+    return
+
+def register_Ns3FqCobaltQueueDisc_methods(root_module, cls):
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): static ns3::TypeId ns3::FqCobaltQueueDisc::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltQueueDisc::FqCobaltQueueDisc() [constructor]
+    cls.add_constructor([])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): void ns3::FqCobaltQueueDisc::SetQuantum(uint32_t quantum) [member function]
+    cls.add_method('SetQuantum', 
+                   'void', 
+                   [param('uint32_t', 'quantum')])
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): uint32_t ns3::FqCobaltQueueDisc::GetQuantum() const [member function]
+    cls.add_method('GetQuantum', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltQueueDisc::UNCLASSIFIED_DROP [variable]
+    cls.add_static_attribute('UNCLASSIFIED_DROP', 'char const * const', is_const=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::FqCobaltQueueDisc::OVERLIMIT_DROP [variable]
+    cls.add_static_attribute('OVERLIMIT_DROP', 'char const * const', is_const=True)
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): bool ns3::FqCobaltQueueDisc::DoEnqueue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
+                   is_virtual=True, visibility='private')
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): ns3::Ptr<ns3::QueueDiscItem> ns3::FqCobaltQueueDisc::DoDequeue() [member function]
+    cls.add_method('DoDequeue', 
+                   'ns3::Ptr< ns3::QueueDiscItem >', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): bool ns3::FqCobaltQueueDisc::CheckConfig() [member function]
+    cls.add_method('CheckConfig', 
+                   'bool', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## fq-cobalt-queue-disc.h (module 'traffic-control'): void ns3::FqCobaltQueueDisc::InitializeParams() [member function]
+    cls.add_method('InitializeParams', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3FqPieFlow_methods(root_module, cls):
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieFlow::FqPieFlow(ns3::FqPieFlow const & arg0) [constructor]
+    cls.add_constructor([param('ns3::FqPieFlow const &', 'arg0')])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieFlow::FqPieFlow() [constructor]
+    cls.add_constructor([])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): int32_t ns3::FqPieFlow::GetDeficit() const [member function]
+    cls.add_method('GetDeficit', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): uint32_t ns3::FqPieFlow::GetIndex() const [member function]
+    cls.add_method('GetIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieFlow::FlowStatus ns3::FqPieFlow::GetStatus() const [member function]
+    cls.add_method('GetStatus', 
+                   'ns3::FqPieFlow::FlowStatus', 
+                   [], 
+                   is_const=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): static ns3::TypeId ns3::FqPieFlow::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): void ns3::FqPieFlow::IncreaseDeficit(int32_t deficit) [member function]
+    cls.add_method('IncreaseDeficit', 
+                   'void', 
+                   [param('int32_t', 'deficit')])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): void ns3::FqPieFlow::SetDeficit(uint32_t deficit) [member function]
+    cls.add_method('SetDeficit', 
+                   'void', 
+                   [param('uint32_t', 'deficit')])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): void ns3::FqPieFlow::SetIndex(uint32_t index) [member function]
+    cls.add_method('SetIndex', 
+                   'void', 
+                   [param('uint32_t', 'index')])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): void ns3::FqPieFlow::SetStatus(ns3::FqPieFlow::FlowStatus status) [member function]
+    cls.add_method('SetStatus', 
+                   'void', 
+                   [param('ns3::FqPieFlow::FlowStatus', 'status')])
+    return
+
+def register_Ns3FqPieQueueDisc_methods(root_module, cls):
+    ## fq-pie-queue-disc.h (module 'traffic-control'): static ns3::TypeId ns3::FqPieQueueDisc::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieQueueDisc::FqPieQueueDisc() [constructor]
+    cls.add_constructor([])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): void ns3::FqPieQueueDisc::SetQuantum(uint32_t quantum) [member function]
+    cls.add_method('SetQuantum', 
+                   'void', 
+                   [param('uint32_t', 'quantum')])
+    ## fq-pie-queue-disc.h (module 'traffic-control'): uint32_t ns3::FqPieQueueDisc::GetQuantum() const [member function]
+    cls.add_method('GetQuantum', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieQueueDisc::UNCLASSIFIED_DROP [variable]
+    cls.add_static_attribute('UNCLASSIFIED_DROP', 'char const * const', is_const=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::FqPieQueueDisc::OVERLIMIT_DROP [variable]
+    cls.add_static_attribute('OVERLIMIT_DROP', 'char const * const', is_const=True)
+    ## fq-pie-queue-disc.h (module 'traffic-control'): bool ns3::FqPieQueueDisc::DoEnqueue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
+                   is_virtual=True, visibility='private')
+    ## fq-pie-queue-disc.h (module 'traffic-control'): ns3::Ptr<ns3::QueueDiscItem> ns3::FqPieQueueDisc::DoDequeue() [member function]
+    cls.add_method('DoDequeue', 
+                   'ns3::Ptr< ns3::QueueDiscItem >', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## fq-pie-queue-disc.h (module 'traffic-control'): bool ns3::FqPieQueueDisc::CheckConfig() [member function]
+    cls.add_method('CheckConfig', 
+                   'bool', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## fq-pie-queue-disc.h (module 'traffic-control'): void ns3::FqPieQueueDisc::InitializeParams() [member function]
+    cls.add_method('InitializeParams', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    return
+
 def register_Ns3GammaRandomVariable_methods(root_module, cls):
     ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::GammaRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -6763,6 +7006,8 @@
     cls.add_static_attribute('FORCED_DROP', 'char const * const', is_const=True)
     ## pie-queue-disc.h (module 'traffic-control'): ns3::PieQueueDisc::UNFORCED_MARK [variable]
     cls.add_static_attribute('UNFORCED_MARK', 'char const * const', is_const=True)
+    ## pie-queue-disc.h (module 'traffic-control'): ns3::PieQueueDisc::CE_THRESHOLD_EXCEEDED_MARK [variable]
+    cls.add_static_attribute('CE_THRESHOLD_EXCEEDED_MARK', 'char const * const', is_const=True)
     ## pie-queue-disc.h (module 'traffic-control'): void ns3::PieQueueDisc::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -6933,6 +7178,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -6958,6 +7208,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -7019,6 +7274,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -7044,6 +7304,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/doc/cobalt.rst ns-3.34/src/traffic-control/doc/cobalt.rst
--- ns-3.33/src/traffic-control/doc/cobalt.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/traffic-control/doc/cobalt.rst	2021-07-14 10:31:07.000000000 -0700
@@ -37,10 +37,14 @@
   `m_stats.qLimDrop`.
 * ``CobaltQueueDisc::ShouldDrop ()``: This routine is
   ``CobaltQueueDisc::DoDequeue()``'s helper routine that determines whether a
-  packet should be dropped or not based on its sojourn time.  If the sojourn
-  time goes above `m_target` and remains above continuously for at least
-  `m_interval`, the routine returns ``true`` indicating that it is OK
-  to drop the packet. ``Otherwise, it returns ``false``. This routine
+  packet should be dropped or not based on its sojourn time. If L4S mode is 
+  enabled then if the packet is ECT1 is checked and if delay is greater than
+  CE threshold then the packet is marked and returns ``false``.
+  If the sojourn time goes above `m_target` and remains above continuously
+  for at least `m_interval`, the routine returns ``true`` indicating that it
+  is OK to drop the packet. ``Otherwise, it returns ``false``.  If L4S mode
+  is turned off and CE threshold marking is enabled, then if the delay is
+  greater than CE threshold, packet is marked. This routine
   decides if a packet should be dropped based on the dropping state of
   CoDel and drop probability of BLUE.  The idea is to have both algorithms
   running in parallel and their effectiveness is decided by their respective
@@ -53,10 +57,6 @@
   Otherwise Cobalt will take the next packet from the queue and calculate
   its drop state by running CoDel and BLUE in parallel till there are none
   left to drop.
-* class :cpp:class:`CobaltTimestampTag`: This class implements the timestamp
-  tagging for a packet.  This tag is used to compute the packet's sojourn time
-  (the difference between the time the packet is dequeued and the time it is
-  pushed into the queue). 
 
 
 
@@ -94,6 +94,8 @@
 * ``Pdrop:`` Value of drop probability.
 * ``Increment:`` Increment value of drop probability. Default value is 1./256 .
 * ``Decrement:`` Decrement value of drop probability. Default value is 1./4096 .
+* ``CeThreshold:`` The CoDel CE threshold for marking packets.
+* ``UseL4s:`` True to use L4S (only ECT1 packets are marked at CE threshold).
 * ``Count:`` Cobalt count.
 * ``DropState:`` Dropping state of Cobalt. Default value is false.
 * ``Sojourn:`` Per packet time spent in the queue.
@@ -120,7 +122,8 @@
 * Test 1: Simple enqueue/dequeue with no drops.
 * Test 2: Change of BLUE's drop probability upon queue full
   (Activation of Blue).
-* Test 3: Test for ECN marking of packets
+* Test 3: This test verfies ECN marking.
+* Test 4: CE threshold marking test.
 
 The test suite can be run using the following commands:
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/doc/fq-cobalt.rst ns-3.34/src/traffic-control/doc/fq-cobalt.rst
--- ns-3.33/src/traffic-control/doc/fq-cobalt.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/traffic-control/doc/fq-cobalt.rst	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,83 @@
+.. include:: replace.txt
+.. highlight:: cpp
+.. highlight:: bash
+
+.. _sec-fq-cobalt:
+
+FqCobalt queue disc
+-------------------
+
+This chapter describes the FqCobalt ([Pal19]_) queue disc implementation in |ns3|.
+
+The FlowQueue-Cobalt (FQ-Cobalt) algorithm is similar to FlowQueue-CoDel (FQ-CoDel) algorithm available in ::ref:`sec-fq-codel`.
+The documentation for Cobalt is available in
+``ns-3-dev/src/traffic-control/doc/cobalt.rst``.
+
+FqCobalt is one of the key components of the CAKE smart queue management framework  ([Hoe18]_).  The COBALT AQM is preferred to the CoDel AQM for CAKE because
+it adds a heuristic called BLUE to cover cases in which the CoDel control
+law is too sluggish to respond to queue growth.
+
+Model Description
+*****************
+
+The source code for the FqCobalt queue disc is located in the directory
+``src/traffic-control/model`` and consists of 2 files `fq-cobalt-queue-disc.h`
+and `fq-cobalt-queue-disc.cc` defining a FqCobaltQueueDisc class and a helper
+FqCobaltFlow class. The code was ported to |ns3| based on Linux kernel code
+implemented by Jonathan Morton
+(https://github.com/torvalds/linux/blob/master/net/sched/sch_cake.c).
+
+The Model Description is similar to the FqCoDel documentation mentioned above.
+
+References
+==========
+
+.. [Pal19]  J. Palmei, S. Gupta, P. Imputato, J. Morton, M. Tahiliani, S. Avallone, and D. Taht, Design and Evaluation of COBALT Queue Discipline, 2019 IEEE International Symposium on Local and Metropolitan Area Networks (LANMAN), Paris, France, 2019.
+
+.. [Hoe18] T. Hoiland-Jørgensen, D. Taht and J. Morton, "Piece of CAKE: A Comprehensive Queue Management Solution for Home Gateways," 2018 IEEE International Symposium on Local and Metropolitan Area Networks (LANMAN), Washington, DC, USA, 2018.
+
+Attributes
+==========
+
+Most of the key attributes are similar to the FqCoDel implementation mentioned above.  One difference is the absence of the ``MinBytes`` parameter.
+
+Some additional parameters implemented as attributes are:
+
+* ``Pdrop:`` Value of drop probability.
+* ``Increment:`` Increment value of drop probability. Default value is 1./256 .
+* ``Decrement:`` Decrement value of drop probability. Default value is 1./4096 .
+* ``BlueThreshold:`` The threshold after which Blue is enabled. Default value is 400ms.
+
+Note that if the user wants to disable Blue Enhancement then the user can set
+it to a large value; for example, to `Time::Max ()`.
+
+Examples
+========
+
+A typical usage pattern is to create a traffic control helper and to configure
+the type
+and attributes of the queue disc and filters from the helper.
+For example, `FqCobalt` can be configured as follows:
+
+.. sourcecode:: cpp
+
+  TrafficControlHelper tch;
+  tch.SetRootQueueDisc ("ns3::FqCobaltQueueDisc", "DropBatchSize", UintegerValue (1)
+                                                 "Perturbation", UintegerValue (256));
+  QueueDiscContainer qdiscs = tch.Install (devices);
+
+Validation
+**********
+
+The FqCobalt model is tested using :cpp:class:`FqCobaltQueueDiscTestSuite` class defined in `src/test/ns3tc/codel-queue-test-suite.cc`.
+
+The tests are similar to the ones for FqCoDel queue disc mentioned in first section of this document.
+The test suite can be run using the following commands::
+
+  $ ./waf configure --enable-examples --enable-tests
+  $ ./waf build
+  $ ./test.py -s fq-cobalt-queue-disc
+
+or::
+
+  $ NS_LOG="FqCobaltQueueDisc" ./waf --run "test-runner --suite=fq-cobalt-queue-disc"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/doc/fq-codel.rst ns-3.34/src/traffic-control/doc/fq-codel.rst
--- ns-3.33/src/traffic-control/doc/fq-codel.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/traffic-control/doc/fq-codel.rst	2021-07-14 10:31:07.000000000 -0700
@@ -2,6 +2,8 @@
 .. highlight:: cpp
 .. highlight:: bash
 
+.. _sec-fq-codel:
+
 FqCoDel queue disc
 ------------------
 
@@ -119,16 +121,19 @@
 
 .. sourcecode:: cpp
 
-  TrafficControlHelper tch;
-  tch.SetRootQueueDisc ("ns3::FqCoDelQueueDisc", "DropBatchSize", UintegerValue (1)
+   TrafficControlHelper tch;
+   tch.SetRootQueueDisc ("ns3::FqCoDelQueueDisc", "DropBatchSize", UintegerValue (1)
                                                  "Perturbation", UintegerValue (256));
-  QueueDiscContainer qdiscs = tch.Install (devices);
+   QueueDiscContainer qdiscs = tch.Install (devices);
 
 The example for FqCoDel's L4S mode is `FqCoDel-L4S-example.cc` located in ``src/traffic-control/examples``.  To run the file (the first invocation below shows the available
 command-line options):
+
 .. sourcecode:: bash
+
    $ ./waf --run "FqCoDel-L4S-example --PrintHelp"
    $ ./waf --run "FqCoDel-L4S-example --scenarioNum=5" 
+
 The expected output from the previous command are .dat files.
 
 Validation
@@ -145,27 +150,33 @@
 * Test 7: The seventh test checks the working of set associative hashing and its linear probing capabilities by using TCP packets with different hashes enqueued into different sets and queues.
 * Test 8: The eighth test checks the L4S mode of FqCoDel where ECT1 packets are marked at CE threshold (target delay does not matter) while ECT0 packets continue to be marked at target delay (CE threshold does not matter).
 
-The test suite can be run using the following commands::
+The test suite can be run using the following commands:
+
+.. sourcecode:: bash
+
+   $ ./waf configure --enable-examples --enable-tests
+   $ ./waf build
+   $ ./test.py -s fq-codel-queue-disc
 
-  $ ./waf configure --enable-examples --enable-tests
-  $ ./waf build
-  $ ./test.py -s fq-codel-queue-disc
+or:
 
-or::
+.. sourcecode:: bash
 
-  $ NS_LOG="FqCoDelQueueDisc" ./waf --run "test-runner --suite=fq-codel-queue-disc"
+   $ NS_LOG="FqCoDelQueueDisc" ./waf --run "test-runner --suite=fq-codel-queue-disc"
 
 Set associative hashing is tested by generating a probability collision graph. 
 This graph is then overlapped with the theoretical graph provided in the original 
 CAKE paper (refer to Figure 1 from `CAKE <https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8475045>`_). 
 The generated graph is linked below:
 
-  .. image:: figures/collision_prob.jpeg
-  :alt: Generated Collision Probability Graph
-  
+.. image:: figures/collision_prob.jpeg
+   :alt: Generated Collision Probability Graph
+
+
 The overlapped graph is also linked below:
 
-  .. image:: figures/overlapped.jpeg
-  :alt: Overlapped Image with the graph from CAKE paper
-  
+.. image:: figures/overlapped.jpeg
+   :alt: Overlapped Image with the graph from CAKE paper
+
+
 The steps to replicate this graph are available on this `link <https://github.com/AB261/Set-Associative-Hash-fqCodel>`_.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/doc/fq-pie.rst ns-3.34/src/traffic-control/doc/fq-pie.rst
--- ns-3.33/src/traffic-control/doc/fq-pie.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/traffic-control/doc/fq-pie.rst	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,98 @@
+.. include:: replace.txt
+.. highlight:: cpp
+.. highlight:: bash
+
+FQ-PIE queue disc
+-----------------
+
+This chapter describes the FQ-PIE ([Ram19]_) queue disc implementation in |ns3|.
+
+The FQ-PIE queue disc combines the Proportional Integral Controller Enhanced
+(PIE) AQM algorithm with the FlowQueue scheduler that is part of FQ-CoDel
+(also available in |ns3|). FQ-PIE was introduced to Linux kernel version 5.6. 
+
+Model Description
+*****************
+
+The source code for the ``FqPieQueueDisc`` is located in the directory
+``src/traffic-control/model`` and consists of 2 files `fq-pie-queue-disc.h`
+and `fq-pie-queue-disc.cc` defining a FqPieQueueDisc class and a helper
+FqPieFlow class. The code was ported to |ns3| based on Linux kernel code
+implemented by Mohit P. Tahiliani.
+
+This model calculates drop probability independently in each flow queue.
+One difficulty, as pointed out by [CableLabs14]_, is that PIE calculates
+drop probability based on the departure rate of a (flow) queue, which may
+be more highly variable than the aggregate queue.  An alternative, which 
+CableLabs has called SFQ-PIE, is to calculate an overall drop probability
+for the entire queue structure, and then scale this drop probability based
+on the ratio of the queue depth of each flow queue compared with the depth
+of the current largest queue.  This ns-3 model does not implement the
+SFQ-PIE variant described by CableLabs.
+
+References
+==========
+
+.. [Ram19] G. Ramakrishnan, M. Bhasi, V. Saicharan, L. Monis, S. D. Patil and M. P. Tahiliani, "FQ-PIE Queue Discipline in the Linux Kernel: Design, Implementation and Challenges," 2019 IEEE 44th LCN Symposium on Emerging Topics in Networking (LCN Symposium), Osnabrueck, Germany, 2019, pp. 117-124,
+
+.. [CableLabs14] G. White, Active Queue Management in DOCSIS 3.X Cable Modems, CableLabs white paper, May 2014.
+
+Attributes
+==========
+
+The key attributes that the FqPieQueue class holds include the following.
+First, there are PIE-specific attributes that are copied into the individual
+PIE flow queues:
+
+* ``UseEcn:`` Whether to use ECN marking
+* ``MarkEcnThreshold:`` ECN marking threshold (RFC 8033 suggests 0.1 (i.e., 10%) default).
+* ``UseL4s:`` Whether to use L4S (only mark ECT1 packets at CE threshold)
+* ``MeanPktSize:`` Constant used to roughly convert bytes to packets
+* ``A:`` Alpha value in PIE algorithm drop probability calculation
+* ``B:`` Beta value in PIE algorithm drop probability calculation
+* ``Tupdate:`` Time period to calculate drop probability
+* ``Supdate:`` Start time of the update timer
+* ``DequeueThreshold:`` Minimum queue size in bytes before dequeue rate is measured
+* ``QueueDelayReference:`` AQM latency target
+* ``MaxBurstAllowance:`` AQM max burst allowance before random drop
+* ``UseDequeueRateEstimator:`` Enable/Disable usage of Dequeue Rate Estimator
+* ``UseCapDropAdjustment:`` Enable/Disable Cap Drop Adjustment feature mentioned in RFC 8033
+* ``UseDerandomization:`` Enable/Disable Derandomization feature mentioned in RFC 8033
+
+Second, there are QueueDisc level, or FQ-specific attributes::
+* ``MaxSize:`` Maximum number of packets in the queue disc
+* ``Flows:`` Maximum number of flow queues
+* ``DropBatchSize:`` Maximum number of packets dropped from the fat flow
+* ``Perturbation:`` Salt value used as hash input when classifying flows
+* ``EnableSetAssociativeHash:`` Enable or disable set associative hash
+* ``SetWays:`` Size of a set of queues in set associative hash
+
+Examples
+========
+
+A typical usage pattern is to create a traffic control helper and to configure 
+the type and attributes of queue disc and filters from the helper. For example, FqPIE
+can be configured as follows:
+
+.. sourcecode:: cpp
+
+  TrafficControlHelper tch;
+  tch.SetRootQueueDisc ("ns3::FqPieQueueDisc", "DropBatchSize", UintegerValue (1)
+                                                 "Perturbation", UintegerValue (256));
+  QueueDiscContainer qdiscs = tch.Install (devices);
+
+Validation
+**********
+
+The FqPie model is tested using :cpp:class:`FqPieQueueDiscTestSuite` class defined in `src/test/ns3tc/fq-pie-queue-test-suite.cc`.
+
+The tests are similar to the ones for FqCoDel queue disc mentioned in first section of this document.
+The test suite can be run using the following commands::
+
+  $ ./waf configure --enable-examples --enable-tests
+  $ ./waf build
+  $ ./test.py -s fq-pie-queue-disc
+
+or::
+
+  $ NS_LOG="FqPieQueueDisc" ./waf --run "test-runner --suite=fq-pie-queue-disc"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/examples/wscript ns-3.34/src/traffic-control/examples/wscript
--- ns-3.33/src/traffic-control/examples/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/traffic-control/examples/wscript	2021-07-14 10:31:07.000000000 -0700
@@ -18,7 +18,7 @@
     obj = bld.create_ns3_program('codel-vs-pfifo-basic-test', ['point-to-point','network', 'internet', 'applications', 'traffic-control'])
     obj.source = 'codel-vs-pfifo-basic-test.cc'
     
-    obj = bld.create_ns3_program('codel-vs-pfifo-asymmetric', ['point-to-point','network', 'internet', 'applications', 'traffic-control'])
+    obj = bld.create_ns3_program('codel-vs-pfifo-asymmetric', ['point-to-point','network', 'internet', 'applications', 'traffic-control', 'config-store'])
     obj.source = 'codel-vs-pfifo-asymmetric.cc'
 
     obj = bld.create_ns3_program('pie-example', ['point-to-point', 'internet', 'applications', 'flow-monitor', 'traffic-control'])
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/model/cobalt-queue-disc.cc ns-3.34/src/traffic-control/model/cobalt-queue-disc.cc
--- ns-3.33/src/traffic-control/model/cobalt-queue-disc.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/traffic-control/model/cobalt-queue-disc.cc	2021-07-14 10:31:07.000000000 -0700
@@ -72,7 +72,7 @@
     .AddAttribute ("Pdrop",
                    "Marking Probability",
                    DoubleValue (0),
-                   MakeDoubleAccessor (&CobaltQueueDisc::m_Pdrop),
+                   MakeDoubleAccessor (&CobaltQueueDisc::m_pDrop),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("Increment",
                    "Pdrop increment value",
@@ -84,6 +84,21 @@
                    DoubleValue (1. / 4096),
                    MakeDoubleAccessor (&CobaltQueueDisc::m_decrement),
                    MakeDoubleChecker<double> ())
+    .AddAttribute ("CeThreshold",
+                   "The CoDel CE threshold for marking packets",
+                   TimeValue (Time::Max ()),
+                   MakeTimeAccessor (&CobaltQueueDisc::m_ceThreshold),
+                   MakeTimeChecker ())
+    .AddAttribute ("UseL4s",
+                   "True to use L4S (only ECT1 packets are marked at CE threshold)",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&CobaltQueueDisc::m_useL4s),
+                   MakeBooleanChecker ())
+    .AddAttribute ("BlueThreshold",
+                   "The Threshold after which Blue is enabled",
+                   TimeValue (MilliSeconds (400)),
+                   MakeTimeAccessor (&CobaltQueueDisc::m_blueThreshold),
+                   MakeTimeChecker ())
     .AddTraceSource ("Count",
                      "Cobalt count",
                      MakeTraceSourceAccessor (&CobaltQueueDisc::m_count),
@@ -144,9 +159,9 @@
   m_uv = CreateObject<UniformRandomVariable> ();
 }
 
-double CobaltQueueDisc::GetPdrop ()
+double CobaltQueueDisc::GetPdrop () const
 {
-  return m_Pdrop;
+  return m_pDrop;
 }
 
 CobaltQueueDisc::~CobaltQueueDisc ()
@@ -189,25 +204,25 @@
 }
 
 int64_t
-CobaltQueueDisc::Time2CoDel (Time t)
+CobaltQueueDisc::Time2CoDel (Time t) const
 {
   return (t.GetNanoSeconds ());
 }
 
 Time
-CobaltQueueDisc::GetTarget (void)
+CobaltQueueDisc::GetTarget (void) const
 {
   return m_target;
 }
 
 Time
-CobaltQueueDisc::GetInterval (void)
+CobaltQueueDisc::GetInterval (void) const
 {
   return m_interval;
 }
 
 int64_t
-CobaltQueueDisc::GetDropNext (void)
+CobaltQueueDisc::GetDropNext (void) const
 {
   return m_dropNext;
 }
@@ -393,7 +408,7 @@
   if (CoDelTimeAfter ((now - m_lastUpdateTimeBlue), Time2CoDel (m_target)))
     {
       NS_LOG_LOGIC ("inside IF block");
-      m_Pdrop = min (m_Pdrop + m_increment, (double)1.0);
+      m_pDrop = min (m_pDrop + m_increment, (double)1.0);
       m_lastUpdateTimeBlue = now;
     }
   m_dropping = true;
@@ -408,9 +423,9 @@
 void CobaltQueueDisc::CobaltQueueEmpty (int64_t now)
 {
   NS_LOG_FUNCTION (this);
-  if (m_Pdrop && CoDelTimeAfter ((now - m_lastUpdateTimeBlue), Time2CoDel (m_target)))
+  if (m_pDrop && CoDelTimeAfter ((now - m_lastUpdateTimeBlue), Time2CoDel (m_target)))
     {
-      m_Pdrop = max (m_Pdrop - m_decrement, (double)0.0);
+      m_pDrop = max (m_pDrop - m_decrement, (double)0.0);
       m_lastUpdateTimeBlue = now;
     }
   m_dropping = false;
@@ -436,6 +451,31 @@
   int64_t schedule = now - m_dropNext;
   bool over_target = CoDelTimeAfter (sojournTime, Time2CoDel (m_target));
   bool next_due = m_count && schedule >= 0;
+  bool isMarked = false;
+
+  // If L4S mode is enabled then check if the packet is ECT1 or CE and
+  // if sojourn time is greater than CE threshold then the packet is marked.
+  // If packet is marked succesfully then the CoDel steps can be skipped.
+  if (item && m_useL4s)
+    {
+      uint8_t tosByte = 0;
+      if (item->GetUint8Value (QueueItem::IP_DSFIELD, tosByte) && (((tosByte & 0x3) == 1) || (tosByte & 0x3) == 3))
+        {
+          if ((tosByte & 0x3) == 1)
+            {
+              NS_LOG_DEBUG ("ECT1 packet " << static_cast<uint16_t> (tosByte & 0x3));
+            }
+          else
+            {
+              NS_LOG_DEBUG ("CE packet " << static_cast<uint16_t> (tosByte & 0x3));
+            }
+          if (CoDelTimeAfter (sojournTime, Time2CoDel (m_ceThreshold)) && Mark (item, CE_THRESHOLD_EXCEEDED_MARK))
+            {
+              NS_LOG_LOGIC ("Marking due to CeThreshold " << m_ceThreshold.GetSeconds ());
+            }
+          return false;
+        }
+    }
 
   if (over_target)
     {
@@ -458,7 +498,8 @@
     {
       /* Check for marking possibility only if BLUE decides NOT to drop. */
       /* Check if router and packet, both have ECN enabled. Only if this is true, mark the packet. */
-      drop = !(m_useEcn && Mark (item, FORCED_MARK));
+      isMarked = (m_useEcn && Mark (item, FORCED_MARK));
+      drop = !isMarked;
 
       m_count = max (m_count, m_count + 1);
 
@@ -477,11 +518,27 @@
           next_due = m_count && schedule >= 0;
         }
     }
+
+  // If CE threshold is enabled then isMarked flag is used to determine whether
+  // packet is marked and if the packet is marked then a second attempt at marking should be suppressed.
+  // If UseL4S attribute is enabled then ECT0 packets should not be marked.
+  if (!isMarked && !m_useL4s && m_useEcn && CoDelTimeAfter (sojournTime, Time2CoDel (m_ceThreshold)) && Mark (item, CE_THRESHOLD_EXCEEDED_MARK))
+    {
+      NS_LOG_LOGIC ("Marking due to CeThreshold " << m_ceThreshold.GetSeconds ());
+    }
+
+  // Enable Blue Enhancement if sojourn time is greater than blueThreshold and its been m_target time until the last time blue was updated
+  if (CoDelTimeAfter (sojournTime, Time2CoDel (m_blueThreshold)) && CoDelTimeAfter ((now - m_lastUpdateTimeBlue), Time2CoDel (m_target)))
+    {
+      m_pDrop = min (m_pDrop + m_increment, (double)1.0);
+      m_lastUpdateTimeBlue = now;
+    }
+
   /* Simple BLUE implementation. Lack of ECN is deliberate. */
-  if (m_Pdrop)
+  if (m_pDrop)
     {
       double u = m_uv->GetValue ();
-      drop = drop | (u < m_Pdrop);
+      drop = drop | (u < m_pDrop);
     }
 
   /* Overload the drop_next field as an activity timeout */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/model/cobalt-queue-disc.h ns-3.34/src/traffic-control/model/cobalt-queue-disc.h
--- ns-3.33/src/traffic-control/model/cobalt-queue-disc.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/traffic-control/model/cobalt-queue-disc.h	2021-07-14 10:31:07.000000000 -0700
@@ -84,32 +84,33 @@
    *
    * \returns The target queue delay
    */
-  Time GetTarget (void);
+  Time GetTarget (void) const;
 
   /**
    * \brief Get the interval
    *
    * \returns The interval
    */
-  Time GetInterval (void);
+  Time GetInterval (void) const;
 
   /**
    * \brief Get the time for next packet drop while in the dropping state
    *
-   * \returns The time for next packet drop
+   * \returns The time (in microseconds) for next packet drop
    */
-  int64_t GetDropNext (void);
+  int64_t GetDropNext (void) const;
 
   static constexpr const char* TARGET_EXCEEDED_DROP = "Target exceeded drop";  //!< Sojourn time above target
   static constexpr const char* OVERLIMIT_DROP = "Overlimit drop";  //!< Overlimit dropped packet
   static constexpr const char* FORCED_MARK = "forcedMark";  //!< forced marks by Codel on ECN-enabled
+  static constexpr const char* CE_THRESHOLD_EXCEEDED_MARK = "CE threshold exceeded mark";  //!< Sojourn time above CE threshold
 
   /**
    * \brief Get the drop probability of Blue
    *
    * \returns The current value of Blue's drop probability
    */
-  double GetPdrop ();
+  double GetPdrop () const;
 
   /**
    * Assign a fixed random variable stream number to the random variables
@@ -127,7 +128,7 @@
    * @param t the input Time Object
    * @return the unsigned 32-bit integer representation
    */
-  int64_t Time2CoDel (Time t);
+  int64_t Time2CoDel (Time t) const;
 
 protected:
   /**
@@ -197,17 +198,21 @@
 
   /**
    * Called when the queue becomes full to alter the drop probabilities of Blue
+   * \param now time in CoDel time units (microseconds)
    */
   void CobaltQueueFull (int64_t now);
 
   /**
    * Called when the queue becomes empty to alter the drop probabilities of Blue
+   * \param now time in CoDel time units (microseconds)
    */
   void CobaltQueueEmpty (int64_t now);
 
   /**
    * Called to decide whether the current packet should be dropped based on decisions taken by Blue and Codel working parallely
    * Returns true if the packet should be dropped, false otherwise
+   * \param item current packet
+   * \param now time in CoDel time units (microseconds)
    */
   bool CobaltShouldDrop (Ptr<QueueDiscItem> item, int64_t now);
 
@@ -224,9 +229,12 @@
   uint32_t m_recInvSqrtCache[REC_INV_SQRT_CACHE] = {0};   //!< Cache to maintain some initial values of InvSqrt
 
   // Supplied by user
-  Time m_interval;                        //!< 100 ms sliding minimum time window width
-  Time m_target;                          //!< 5 ms target queue delay
+  Time m_interval;                        //!< sliding minimum time window width
+  Time m_target;                          //!< target queue delay
   bool m_useEcn;                          //!< True if ECN is used (packets are marked instead of being dropped)
+  Time m_ceThreshold;                     //!< Threshold above which to CE mark
+  bool m_useL4s;                          //!< True if L4S is used (ECT1 packets are marked at CE threshold)
+  Time m_blueThreshold;                   //!< Threshold to enable blue enhancement
 
   // Blue parameters
   // Maintained by Cobalt
@@ -236,7 +244,7 @@
   // Supplied by user
   double m_increment;                     //!< increment value for marking probability
   double m_decrement;                     //!< decrement value for marking probability
-  double m_Pdrop;                         //!< Drop Probability
+  double m_pDrop;                         //!< Drop Probability
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/model/fq-cobalt-queue-disc.cc ns-3.34/src/traffic-control/model/fq-cobalt-queue-disc.cc
--- ns-3.33/src/traffic-control/model/fq-cobalt-queue-disc.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/traffic-control/model/fq-cobalt-queue-disc.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,531 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016 Universita' degli Studi di Napoli Federico II
+ * Copyright (c) 2020 NITK Surathkal (adapted for COBALT)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Pasquale Imputato <p.imputato@gmail.com>
+ *          Stefano Avallone <stefano.avallone@unina.it>
+ * Modified by: Bhaskar Kataria <bhaskar.k7920@gmail.com> (for COBALT)
+ *          Tom Henderson <tomhend@u.washington.edu>
+ *          Mohit P. Tahiliani <tahiliani@nitk.edu.in>
+ *          Vivek Jain <jain.vivek.anand@gmail.com>
+ *          Ankit Deepak <adadeepak8@gmail.com>
+ */
+
+#include "ns3/log.h"
+#include "ns3/string.h"
+#include "ns3/queue.h"
+#include "fq-cobalt-queue-disc.h"
+#include "cobalt-queue-disc.h"
+#include "ns3/net-device-queue-interface.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("FqCobaltQueueDisc");
+
+NS_OBJECT_ENSURE_REGISTERED (FqCobaltFlow);
+
+TypeId FqCobaltFlow::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::FqCobaltFlow")
+    .SetParent<QueueDiscClass> ()
+    .SetGroupName ("TrafficControl")
+    .AddConstructor<FqCobaltFlow> ()
+  ;
+  return tid;
+}
+
+FqCobaltFlow::FqCobaltFlow ()
+  : m_deficit (0),
+    m_status (INACTIVE),
+    m_index (0)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+FqCobaltFlow::~FqCobaltFlow ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+FqCobaltFlow::SetDeficit (uint32_t deficit)
+{
+  NS_LOG_FUNCTION (this << deficit);
+  m_deficit = deficit;
+}
+
+int32_t
+FqCobaltFlow::GetDeficit (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_deficit;
+}
+
+void
+FqCobaltFlow::IncreaseDeficit (int32_t deficit)
+{
+  NS_LOG_FUNCTION (this << deficit);
+  m_deficit += deficit;
+}
+
+void
+FqCobaltFlow::SetStatus (FlowStatus status)
+{
+  NS_LOG_FUNCTION (this);
+  m_status = status;
+}
+
+FqCobaltFlow::FlowStatus
+FqCobaltFlow::GetStatus (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_status;
+}
+
+void
+FqCobaltFlow::SetIndex (uint32_t index)
+{
+  NS_LOG_FUNCTION (this);
+  m_index = index;
+}
+
+uint32_t
+FqCobaltFlow::GetIndex (void) const
+{
+  return m_index;
+}
+
+
+NS_OBJECT_ENSURE_REGISTERED (FqCobaltQueueDisc);
+
+TypeId FqCobaltQueueDisc::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::FqCobaltQueueDisc")
+    .SetParent<QueueDisc> ()
+    .SetGroupName ("TrafficControl")
+    .AddConstructor<FqCobaltQueueDisc> ()
+    .AddAttribute ("UseEcn",
+                   "True to use ECN (packets are marked instead of being dropped)",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&FqCobaltQueueDisc::m_useEcn),
+                   MakeBooleanChecker ())
+    .AddAttribute ("Interval",
+                   "The CoDel algorithm interval for each FqCobalt queue",
+                   StringValue ("100ms"),
+                   MakeStringAccessor (&FqCobaltQueueDisc::m_interval),
+                   MakeStringChecker ())
+    .AddAttribute ("Target",
+                   "The CoDel algorithm target queue delay for each FqCobalt queue",
+                   StringValue ("5ms"),
+                   MakeStringAccessor (&FqCobaltQueueDisc::m_target),
+                   MakeStringChecker ())
+    .AddAttribute ("MaxSize",
+                   "The maximum number of packets accepted by this queue disc",
+                   QueueSizeValue (QueueSize ("10240p")),
+                   MakeQueueSizeAccessor (&QueueDisc::SetMaxSize,
+                                          &QueueDisc::GetMaxSize),
+                   MakeQueueSizeChecker ())
+    .AddAttribute ("Flows",
+                   "The number of queues into which the incoming packets are classified",
+                   UintegerValue (1024),
+                   MakeUintegerAccessor (&FqCobaltQueueDisc::m_flows),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("DropBatchSize",
+                   "The maximum number of packets dropped from the fat flow",
+                   UintegerValue (64),
+                   MakeUintegerAccessor (&FqCobaltQueueDisc::m_dropBatchSize),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("Perturbation",
+                   "The salt used as an additional input to the hash function used to classify packets",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&FqCobaltQueueDisc::m_perturbation),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("CeThreshold",
+                   "The FqCobalt CE threshold for marking packets",
+                   TimeValue (Time::Max ()),
+                   MakeTimeAccessor (&FqCobaltQueueDisc::m_ceThreshold),
+                   MakeTimeChecker ())
+    .AddAttribute ("EnableSetAssociativeHash",
+                   "Enable/Disable Set Associative Hash",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&FqCobaltQueueDisc::m_enableSetAssociativeHash),
+                   MakeBooleanChecker ())
+    .AddAttribute ("SetWays",
+                   "The size of a set of queues (used by set associative hash)",
+                   UintegerValue (8),
+                   MakeUintegerAccessor (&FqCobaltQueueDisc::m_setWays),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("UseL4s",
+                   "True to use L4S (only ECT1 packets are marked at CE threshold)",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&FqCobaltQueueDisc::m_useL4s),
+                   MakeBooleanChecker ())
+    .AddAttribute ("Pdrop",
+                   "Marking Probability",
+                   DoubleValue (0),
+                   MakeDoubleAccessor (&FqCobaltQueueDisc::m_Pdrop),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("Increment",
+                   "Pdrop increment value",
+                   DoubleValue (1. / 256),
+                   MakeDoubleAccessor (&FqCobaltQueueDisc::m_increment),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("Decrement",
+                   "Pdrop decrement Value",
+                   DoubleValue (1. / 4096),
+                   MakeDoubleAccessor (&FqCobaltQueueDisc::m_decrement),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("BlueThreshold",
+                   "The Threshold after which Blue is enabled",
+                   TimeValue (MilliSeconds (400)),
+                   MakeTimeAccessor (&FqCobaltQueueDisc::m_blueThreshold),
+                   MakeTimeChecker ())
+  ;
+  return tid;
+}
+
+FqCobaltQueueDisc::FqCobaltQueueDisc ()
+  : QueueDisc (QueueDiscSizePolicy::MULTIPLE_QUEUES, QueueSizeUnit::PACKETS),
+    m_quantum (0)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+FqCobaltQueueDisc::~FqCobaltQueueDisc ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+FqCobaltQueueDisc::SetQuantum (uint32_t quantum)
+{
+  NS_LOG_FUNCTION (this << quantum);
+  m_quantum = quantum;
+}
+
+uint32_t
+FqCobaltQueueDisc::GetQuantum (void) const
+{
+  return m_quantum;
+}
+
+uint32_t
+FqCobaltQueueDisc::SetAssociativeHash (uint32_t flowHash)
+{
+  NS_LOG_FUNCTION (this << flowHash);
+
+  uint32_t h = (flowHash % m_flows);
+  uint32_t innerHash = h % m_setWays;
+  uint32_t outerHash = h - innerHash;
+
+  for (uint32_t i = outerHash; i < outerHash + m_setWays; i++)
+    {
+      auto it = m_flowsIndices.find (i);
+
+      if (it == m_flowsIndices.end ()
+          || (m_tags.find (i) != m_tags.end () && m_tags[i] == flowHash)
+          || StaticCast<FqCobaltFlow> (GetQueueDiscClass (it->second))->GetStatus () == FqCobaltFlow::INACTIVE)
+        {
+          // this queue has not been created yet or is associated with this flow
+          // or is inactive, hence we can use it
+          m_tags[i] = flowHash;
+          return i;
+        }
+    }
+
+  // all the queues of the set are used. Use the first queue of the set
+  m_tags[outerHash] = flowHash;
+  return outerHash;
+}
+
+bool
+FqCobaltQueueDisc::DoEnqueue (Ptr<QueueDiscItem> item)
+{
+  NS_LOG_FUNCTION (this << item);
+
+  uint32_t flowHash, h;
+
+  if (GetNPacketFilters () == 0)
+    {
+      flowHash = item->Hash (m_perturbation);
+    }
+  else
+    {
+      int32_t ret = Classify (item);
+
+      if (ret != PacketFilter::PF_NO_MATCH)
+        {
+          flowHash = static_cast<uint32_t> (ret);
+        }
+      else
+        {
+          NS_LOG_ERROR ("No filter has been able to classify this packet, drop it.");
+          DropBeforeEnqueue (item, UNCLASSIFIED_DROP);
+          return false;
+        }
+    }
+
+  if (m_enableSetAssociativeHash)
+    {
+      h = SetAssociativeHash (flowHash);
+    }
+  else
+    {
+      h = flowHash % m_flows;
+    }
+
+  Ptr<FqCobaltFlow> flow;
+  if (m_flowsIndices.find (h) == m_flowsIndices.end ())
+    {
+      NS_LOG_DEBUG ("Creating a new flow queue with index " << h);
+      flow = m_flowFactory.Create<FqCobaltFlow> ();
+      Ptr<QueueDisc> qd = m_queueDiscFactory.Create<QueueDisc> ();
+      // If Cobalt, Set values of CobaltQueueDisc to match this QueueDisc
+      Ptr<CobaltQueueDisc> cobalt = qd->GetObject<CobaltQueueDisc> ();
+      if (cobalt)
+        {
+          cobalt->SetAttribute ("UseEcn", BooleanValue (m_useEcn));
+          cobalt->SetAttribute ("CeThreshold", TimeValue (m_ceThreshold));
+          cobalt->SetAttribute ("UseL4s", BooleanValue (m_useL4s));
+          cobalt->SetAttribute ("BlueThreshold", TimeValue (m_blueThreshold));
+        }
+      qd->Initialize ();
+      flow->SetQueueDisc (qd);
+      flow->SetIndex (h);
+      AddQueueDiscClass (flow);
+
+      m_flowsIndices[h] = GetNQueueDiscClasses () - 1;
+    }
+  else
+    {
+      flow = StaticCast<FqCobaltFlow> (GetQueueDiscClass (m_flowsIndices[h]));
+    }
+
+  if (flow->GetStatus () == FqCobaltFlow::INACTIVE)
+    {
+      flow->SetStatus (FqCobaltFlow::NEW_FLOW);
+      flow->SetDeficit (m_quantum);
+      m_newFlows.push_back (flow);
+    }
+
+  flow->GetQueueDisc ()->Enqueue (item);
+
+  NS_LOG_DEBUG ("Packet enqueued into flow " << h << "; flow index " << m_flowsIndices[h]);
+
+  if (GetCurrentSize () > GetMaxSize ())
+    {
+      NS_LOG_DEBUG ("Overload; enter FqCobaltDrop ()");
+      FqCobaltDrop ();
+    }
+
+  return true;
+}
+
+Ptr<QueueDiscItem>
+FqCobaltQueueDisc::DoDequeue (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  Ptr<FqCobaltFlow> flow;
+  Ptr<QueueDiscItem> item;
+
+  do
+    {
+      bool found = false;
+
+      while (!found && !m_newFlows.empty ())
+        {
+          flow = m_newFlows.front ();
+
+          if (flow->GetDeficit () <= 0)
+            {
+              NS_LOG_DEBUG ("Increase deficit for new flow index " << flow->GetIndex ());
+              flow->IncreaseDeficit (m_quantum);
+              flow->SetStatus (FqCobaltFlow::OLD_FLOW);
+              m_oldFlows.push_back (flow);
+              m_newFlows.pop_front ();
+            }
+          else
+            {
+              NS_LOG_DEBUG ("Found a new flow " << flow->GetIndex () << " with positive deficit");
+              found = true;
+            }
+        }
+
+      while (!found && !m_oldFlows.empty ())
+        {
+          flow = m_oldFlows.front ();
+
+          if (flow->GetDeficit () <= 0)
+            {
+              NS_LOG_DEBUG ("Increase deficit for old flow index " << flow->GetIndex ());
+              flow->IncreaseDeficit (m_quantum);
+              m_oldFlows.push_back (flow);
+              m_oldFlows.pop_front ();
+            }
+          else
+            {
+              NS_LOG_DEBUG ("Found an old flow " << flow->GetIndex () << " with positive deficit");
+              found = true;
+            }
+        }
+
+      if (!found)
+        {
+          NS_LOG_DEBUG ("No flow found to dequeue a packet");
+          return 0;
+        }
+
+      item = flow->GetQueueDisc ()->Dequeue ();
+
+      if (!item)
+        {
+          NS_LOG_DEBUG ("Could not get a packet from the selected flow queue");
+          if (!m_newFlows.empty ())
+            {
+              flow->SetStatus (FqCobaltFlow::OLD_FLOW);
+              m_oldFlows.push_back (flow);
+              m_newFlows.pop_front ();
+            }
+          else
+            {
+              flow->SetStatus (FqCobaltFlow::INACTIVE);
+              m_oldFlows.pop_front ();
+            }
+        }
+      else
+        {
+          NS_LOG_DEBUG ("Dequeued packet " << item->GetPacket ());
+        }
+    }
+  while (item == 0);
+
+  flow->IncreaseDeficit (item->GetSize () * -1);
+
+  return item;
+}
+
+bool
+FqCobaltQueueDisc::CheckConfig (void)
+{
+  NS_LOG_FUNCTION (this);
+  if (GetNQueueDiscClasses () > 0)
+    {
+      NS_LOG_ERROR ("FqCobaltQueueDisc cannot have classes");
+      return false;
+    }
+
+  if (GetNInternalQueues () > 0)
+    {
+      NS_LOG_ERROR ("FqCobaltQueueDisc cannot have internal queues");
+      return false;
+    }
+  // we are at initialization time. If the user has not set a quantum value,
+  // set the quantum to the MTU of the device (if any)
+  if (!m_quantum)
+    {
+      Ptr<NetDeviceQueueInterface> ndqi = GetNetDeviceQueueInterface ();
+      Ptr<NetDevice> dev;
+      // if the NetDeviceQueueInterface object is aggregated to a
+      // NetDevice, get the MTU of such NetDevice
+      if (ndqi && (dev = ndqi->GetObject<NetDevice> ()))
+        {
+          m_quantum = dev->GetMtu ();
+          NS_LOG_DEBUG ("Setting the quantum to the MTU of the device: " << m_quantum);
+        }
+
+      if (!m_quantum)
+        {
+          NS_LOG_ERROR ("The quantum parameter cannot be null");
+          return false;
+        }
+    }
+
+  if (m_enableSetAssociativeHash && (m_flows % m_setWays != 0))
+    {
+      NS_LOG_ERROR ("The number of queues must be an integer multiple of the size "
+                    "of the set of queues used by set associative hash");
+      return false;
+    }
+
+  // If UseL4S attribute is enabled then CE threshold must be set.
+  if (m_useL4s)
+    {
+      NS_ABORT_MSG_IF (m_ceThreshold == Time::Max (), "CE threshold not set");
+      if (m_useEcn == false)
+        {
+          NS_LOG_WARN ("Enabling ECN as L4S mode is enabled");
+        }
+    }
+  return true;
+}
+
+void
+FqCobaltQueueDisc::InitializeParams (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  m_flowFactory.SetTypeId ("ns3::FqCobaltFlow");
+
+  m_queueDiscFactory.SetTypeId ("ns3::CobaltQueueDisc");
+  m_queueDiscFactory.Set ("MaxSize", QueueSizeValue (GetMaxSize ()));
+  m_queueDiscFactory.Set ("Interval", StringValue (m_interval));
+  m_queueDiscFactory.Set ("Target", StringValue (m_target));
+  m_queueDiscFactory.Set ("Pdrop", DoubleValue (m_Pdrop));
+  m_queueDiscFactory.Set ("Increment", DoubleValue (m_increment));
+  m_queueDiscFactory.Set ("Decrement", DoubleValue (m_decrement));
+}
+
+uint32_t
+FqCobaltQueueDisc::FqCobaltDrop (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  uint32_t maxBacklog = 0, index = 0;
+  Ptr<QueueDisc> qd;
+
+  /* Queue is full! Find the fat flow and drop packet(s) from it */
+  for (uint32_t i = 0; i < GetNQueueDiscClasses (); i++)
+    {
+      qd = GetQueueDiscClass (i)->GetQueueDisc ();
+      uint32_t bytes = qd->GetNBytes ();
+      if (bytes > maxBacklog)
+        {
+          maxBacklog = bytes;
+          index = i;
+        }
+    }
+
+  /* Our goal is to drop half of this fat flow backlog */
+  uint32_t len = 0, count = 0, threshold = maxBacklog >> 1;
+  qd = GetQueueDiscClass (index)->GetQueueDisc ();
+  Ptr<QueueDiscItem> item;
+
+  do
+    {
+      NS_LOG_DEBUG ("Drop packet (overflow); count: " << count << " len: " << len << " threshold: " << threshold);
+      item = qd->GetInternalQueue (0)->Dequeue ();
+      DropAfterDequeue (item, OVERLIMIT_DROP);
+      len += item->GetSize ();
+    }
+  while (++count < m_dropBatchSize && len < threshold);
+
+  return index;
+}
+
+} // namespace ns3
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/model/fq-cobalt-queue-disc.h ns-3.34/src/traffic-control/model/fq-cobalt-queue-disc.h
--- ns-3.33/src/traffic-control/model/fq-cobalt-queue-disc.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/traffic-control/model/fq-cobalt-queue-disc.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,202 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016 Universita' degli Studi di Napoli Federico II
+ * Copyright (c) 2020 NITK Surathkal (adapted for COBALT)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Pasquale Imputato <p.imputato@gmail.com>
+ *          Stefano Avallone <stefano.avallone@unina.it>
+ * Modified by: Bhaskar Kataria <bhaskar.k7920@gmail.com> (for COBALT)
+ *          Tom Henderson <tomhend@u.washington.edu>
+ *          Mohit P. Tahiliani <tahiliani@nitk.edu.in>
+ *          Vivek Jain <jain.vivek.anand@gmail.com>
+ *          Ankit Deepak <adadeepak8@gmail.com>
+ */
+
+#ifndef FQ_COBALT_QUEUE_DISC
+#define FQ_COBALT_QUEUE_DISC
+
+#include "ns3/queue-disc.h"
+#include "ns3/object-factory.h"
+#include <list>
+#include <map>
+
+namespace ns3 {
+
+/**
+ * \ingroup traffic-control
+ *
+ * \brief A flow queue used by the FqCobalt queue disc
+ */
+
+class FqCobaltFlow : public QueueDiscClass
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  /**
+   * \brief FqCobaltFlow constructor
+   */
+  FqCobaltFlow ();
+
+  virtual ~FqCobaltFlow ();
+
+  /**
+   * \enum FlowStatus
+   * \brief Used to determine the status of this flow queue
+   */
+  enum FlowStatus
+  {
+    INACTIVE,
+    NEW_FLOW,
+    OLD_FLOW
+  };
+
+  /**
+   * \brief Set the deficit for this flow
+   * \param deficit the deficit for this flow
+   */
+  void SetDeficit (uint32_t deficit);
+  /**
+   * \brief Get the deficit for this flow
+   * \return the deficit for this flow
+   */
+  int32_t GetDeficit (void) const;
+  /**
+   * \brief Increase the deficit for this flow
+   * \param deficit the amount by which the deficit is to be increased
+   */
+  void IncreaseDeficit (int32_t deficit);
+  /**
+   * \brief Set the status for this flow
+   * \param status the status for this flow
+   */
+  void SetStatus (FlowStatus status);
+  /**
+   * \brief Get the status of this flow
+   * \return the status of this flow
+   */
+  FlowStatus GetStatus (void) const;
+  /**
+   * \brief Set the index for this flow
+   * \param index the index for this flow
+   */
+  void SetIndex (uint32_t index);
+  /**
+   * \brief Get the index of this flow
+   * \return the index of this flow
+   */
+  uint32_t GetIndex (void) const;
+
+private:
+  int32_t m_deficit;    //!< the deficit for this flow
+  FlowStatus m_status;  //!< the status of this flow
+  uint32_t m_index;     //!< the index for this flow
+};
+
+
+/**
+ * \ingroup traffic-control
+ *
+ * \brief A FqCobalt packet queue disc
+ */
+
+class FqCobaltQueueDisc : public QueueDisc
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  /**
+   * \brief FqCobaltQueueDisc constructor
+   */
+  FqCobaltQueueDisc ();
+
+  virtual ~FqCobaltQueueDisc ();
+
+  /**
+   * \brief Set the quantum value.
+   *
+   * \param quantum The number of bytes each queue gets to dequeue on each round of the scheduling algorithm
+   */
+  void SetQuantum (uint32_t quantum);
+
+  /**
+   * \brief Get the quantum value.
+   *
+   * \returns The number of bytes each queue gets to dequeue on each round of the scheduling algorithm
+   */
+  uint32_t GetQuantum (void) const;
+
+  // Reasons for dropping packets
+  static constexpr const char* UNCLASSIFIED_DROP = "Unclassified drop";  //!< No packet filter able to classify packet
+  static constexpr const char* OVERLIMIT_DROP = "Overlimit drop";        //!< Overlimit dropped packets
+
+private:
+  virtual bool DoEnqueue (Ptr<QueueDiscItem> item);
+  virtual Ptr<QueueDiscItem> DoDequeue (void);
+  virtual bool CheckConfig (void);
+  virtual void InitializeParams (void);
+
+  /**
+   * \brief Drop a packet from the head of the queue with the largest current byte count
+   * \return the index of the queue with the largest current byte count
+   */
+  uint32_t FqCobaltDrop (void);
+
+  /**
+   * Compute the index of the queue for the flow having the given flowHash,
+   * according to the set associative hash approach.
+   *
+   * \param flowHash the hash of the flow 5-tuple
+   * \return the index of the queue for the given flow
+   */
+  uint32_t SetAssociativeHash (uint32_t flowHash);
+
+  std::string m_interval;    //!< CoDel interval attribute
+  std::string m_target;      //!< CoDel target attribute
+  uint32_t m_quantum;        //!< Deficit assigned to flows at each round
+  uint32_t m_flows;          //!< Number of flow queues
+  uint32_t m_setWays;        //!< size of a set of queues (used by set associative hash)
+  uint32_t m_dropBatchSize;  //!< Max number of packets dropped from the fat flow
+  uint32_t m_perturbation;   //!< hash perturbation value
+  bool m_useEcn;             //!< True if ECN is used (packets are marked instead of being dropped)
+  Time m_ceThreshold;        //!< Threshold above which to CE mark
+  bool m_enableSetAssociativeHash; //!< whether to enable set associative hash
+  bool m_useL4s;             //!< True if L4S is used (ECT1 packets are marked at CE threshold)
+  double m_increment;        //!< increment value for marking probability
+  double m_decrement;        //!< decrement value for marking probability
+  double m_Pdrop;            //!< Drop Probability
+  Time m_blueThreshold;      //!< Threshold to enable blue enhancement
+
+  std::list<Ptr<FqCobaltFlow> > m_newFlows;    //!< The list of new flows
+  std::list<Ptr<FqCobaltFlow> > m_oldFlows;    //!< The list of old flows
+
+  std::map<uint32_t, uint32_t> m_flowsIndices;    //!< Map with the index of class for each flow
+  std::map<uint32_t, uint32_t> m_tags;            //!< Tags used by set associative hash
+
+  ObjectFactory m_flowFactory;         //!< Factory to create a new flow
+  ObjectFactory m_queueDiscFactory;    //!< Factory to create a new queue
+};
+
+} // namespace ns3
+
+#endif /* FQ_COBALT_QUEUE_DISC */
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/model/fq-pie-queue-disc.cc ns-3.34/src/traffic-control/model/fq-pie-queue-disc.cc
--- ns-3.33/src/traffic-control/model/fq-pie-queue-disc.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/traffic-control/model/fq-pie-queue-disc.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,566 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016 Universita' degli Studi di Napoli Federico II
+ * Copyright (c) 2018 NITK Surathkal (modified for FQ-PIE)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Pasquale Imputato <p.imputato@gmail.com>
+ *          Stefano Avallone <stefano.avallone@unina.it>
+ * Modified for FQ-PIE by:  Sumukha PK <sumukhapk46@gmail.com>
+ *                          Prajval M  <26prajval98@gmail.com>
+ *                          Ishaan R D <ishaanrd6@gmail.com>
+ *                          Mohit P. Tahiliani <tahiliani@nitk.edu.in>
+ */
+
+
+#include "ns3/log.h"
+#include "ns3/string.h"
+#include "ns3/queue.h"
+#include "fq-pie-queue-disc.h"
+#include "pie-queue-disc.h"
+#include "ns3/net-device-queue-interface.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("FqPieQueueDisc");
+
+NS_OBJECT_ENSURE_REGISTERED (FqPieFlow);
+
+TypeId FqPieFlow::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::FqPieFlow")
+    .SetParent<QueueDiscClass> ()
+    .SetGroupName ("TrafficControl")
+    .AddConstructor<FqPieFlow> ()
+  ;
+  return tid;
+}
+
+FqPieFlow::FqPieFlow ()
+  : m_deficit (0),
+    m_status (INACTIVE),
+    m_index (0)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+FqPieFlow::~FqPieFlow ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+FqPieFlow::SetDeficit (uint32_t deficit)
+{
+  NS_LOG_FUNCTION (this << deficit);
+  m_deficit = deficit;
+}
+
+int32_t
+FqPieFlow::GetDeficit (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_deficit;
+}
+
+void
+FqPieFlow::IncreaseDeficit (int32_t deficit)
+{
+  NS_LOG_FUNCTION (this << deficit);
+  m_deficit += deficit;
+}
+
+void
+FqPieFlow::SetStatus (FlowStatus status)
+{
+  NS_LOG_FUNCTION (this);
+  m_status = status;
+}
+
+FqPieFlow::FlowStatus
+FqPieFlow::GetStatus (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_status;
+}
+
+void
+FqPieFlow::SetIndex (uint32_t index)
+{
+  NS_LOG_FUNCTION (this);
+  m_index = index;
+}
+
+uint32_t
+FqPieFlow::GetIndex (void) const
+{
+  return m_index;
+}
+
+
+NS_OBJECT_ENSURE_REGISTERED (FqPieQueueDisc);
+
+TypeId FqPieQueueDisc::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::FqPieQueueDisc")
+    .SetParent<QueueDisc> ()
+    .SetGroupName ("TrafficControl")
+    .AddConstructor<FqPieQueueDisc> ()
+    .AddAttribute ("UseEcn",
+                   "True to use ECN (packets are marked instead of being dropped)",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&FqPieQueueDisc::m_useEcn),
+                   MakeBooleanChecker ())
+    .AddAttribute ("MarkEcnThreshold",
+                   "ECN marking threshold (RFC 8033 suggests 0.1 (i.e., 10%) default)",
+                   DoubleValue (0.1),
+                   MakeDoubleAccessor (&FqPieQueueDisc::m_markEcnTh),
+                   MakeDoubleChecker<double> (0, 1))
+    .AddAttribute ("CeThreshold",
+                   "The FqPie CE threshold for marking packets",
+                   TimeValue (Time::Max ()),
+                   MakeTimeAccessor (&FqPieQueueDisc::m_ceThreshold),
+                   MakeTimeChecker ())
+    .AddAttribute ("UseL4s",
+                   "True to use L4S (only ECT1 packets are marked at CE threshold)",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&FqPieQueueDisc::m_useL4s),
+                   MakeBooleanChecker ())
+    .AddAttribute ("MeanPktSize",
+                   "Average of packet size",
+                   UintegerValue (1000),
+                   MakeUintegerAccessor (&FqPieQueueDisc::m_meanPktSize),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("A",
+                   "Value of alpha",
+                   DoubleValue (0.125),
+                   MakeDoubleAccessor (&FqPieQueueDisc::m_a),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("B",
+                   "Value of beta",
+                   DoubleValue (1.25),
+                   MakeDoubleAccessor (&FqPieQueueDisc::m_b),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("Tupdate",
+                   "Time period to calculate drop probability",
+                   TimeValue (Seconds (0.015)),
+                   MakeTimeAccessor (&FqPieQueueDisc::m_tUpdate),
+                   MakeTimeChecker ())
+    .AddAttribute ("Supdate",
+                   "Start time of the update timer",
+                   TimeValue (Seconds (0)),
+                   MakeTimeAccessor (&FqPieQueueDisc::m_sUpdate),
+                   MakeTimeChecker ())
+    .AddAttribute ("MaxSize",
+                   "The maximum number of packets accepted by this queue disc",
+                   QueueSizeValue (QueueSize ("10240p")),
+                   MakeQueueSizeAccessor (&QueueDisc::SetMaxSize,
+                                          &QueueDisc::GetMaxSize),
+                   MakeQueueSizeChecker ())
+    .AddAttribute ("DequeueThreshold",
+                   "Minimum queue size in bytes before dequeue rate is measured",
+                   UintegerValue (16384),
+                   MakeUintegerAccessor (&FqPieQueueDisc::m_dqThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("QueueDelayReference",
+                   "Desired queue delay",
+                   TimeValue (Seconds (0.015)),
+                   MakeTimeAccessor (&FqPieQueueDisc::m_qDelayRef),
+                   MakeTimeChecker ())
+    .AddAttribute ("MaxBurstAllowance",
+                   "Current max burst allowance before random drop",
+                   TimeValue (Seconds (0.15)),
+                   MakeTimeAccessor (&FqPieQueueDisc::m_maxBurst),
+                   MakeTimeChecker ())
+    .AddAttribute ("UseDequeueRateEstimator",
+                   "Enable/Disable usage of Dequeue Rate Estimator",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&FqPieQueueDisc::m_useDqRateEstimator),
+                   MakeBooleanChecker ())
+    .AddAttribute ("UseCapDropAdjustment",
+                   "Enable/Disable Cap Drop Adjustment feature mentioned in RFC 8033",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&FqPieQueueDisc::m_isCapDropAdjustment),
+                   MakeBooleanChecker ())
+    .AddAttribute ("UseDerandomization",
+                   "Enable/Disable Derandomization feature mentioned in RFC 8033",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&FqPieQueueDisc::m_useDerandomization),
+                   MakeBooleanChecker ())
+    .AddAttribute ("Flows",
+                   "The number of queues into which the incoming packets are classified",
+                   UintegerValue (1024),
+                   MakeUintegerAccessor (&FqPieQueueDisc::m_flows),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("DropBatchSize",
+                   "The maximum number of packets dropped from the fat flow",
+                   UintegerValue (64),
+                   MakeUintegerAccessor (&FqPieQueueDisc::m_dropBatchSize),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("Perturbation",
+                   "The salt used as an additional input to the hash function used to classify packets",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&FqPieQueueDisc::m_perturbation),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("EnableSetAssociativeHash",
+                   "Enable/Disable Set Associative Hash",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&FqPieQueueDisc::m_enableSetAssociativeHash),
+                   MakeBooleanChecker ())
+    .AddAttribute ("SetWays",
+                   "The size of a set of queues (used by set associative hash)",
+                   UintegerValue (8),
+                   MakeUintegerAccessor (&FqPieQueueDisc::m_setWays),
+                   MakeUintegerChecker<uint32_t> ())
+  ;
+  return tid;
+}
+
+FqPieQueueDisc::FqPieQueueDisc ()
+  : QueueDisc (QueueDiscSizePolicy::MULTIPLE_QUEUES, QueueSizeUnit::PACKETS),
+    m_quantum (0)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+FqPieQueueDisc::~FqPieQueueDisc ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+FqPieQueueDisc::SetQuantum (uint32_t quantum)
+{
+  NS_LOG_FUNCTION (this << quantum);
+  m_quantum = quantum;
+}
+
+uint32_t
+FqPieQueueDisc::GetQuantum (void) const
+{
+  return m_quantum;
+}
+
+uint32_t
+FqPieQueueDisc::SetAssociativeHash (uint32_t flowHash)
+{
+  NS_LOG_FUNCTION (this << flowHash);
+
+  uint32_t h = (flowHash % m_flows);
+  uint32_t innerHash = h % m_setWays;
+  uint32_t outerHash = h - innerHash;
+
+  for (uint32_t i = outerHash; i < outerHash + m_setWays; i++)
+    {
+      auto it = m_flowsIndices.find (i);
+
+      if (it == m_flowsIndices.end ()
+          || (m_tags.find (i) != m_tags.end () && m_tags[i] == flowHash)
+          || StaticCast<FqPieFlow> (GetQueueDiscClass (it->second))->GetStatus () == FqPieFlow::INACTIVE)
+        {
+          // this queue has not been created yet or is associated with this flow
+          // or is inactive, hence we can use it
+          m_tags[i] = flowHash;
+          return i;
+        }
+    }
+
+  // all the queues of the set are used. Use the first queue of the set
+  m_tags[outerHash] = flowHash;
+  return outerHash;
+}
+
+bool
+FqPieQueueDisc::DoEnqueue (Ptr<QueueDiscItem> item)
+{
+  NS_LOG_FUNCTION (this << item);
+
+  uint32_t flowHash, h;
+
+  if (GetNPacketFilters () == 0)
+    {
+      flowHash = item->Hash (m_perturbation);
+    }
+  else
+    {
+      int32_t ret = Classify (item);
+
+      if (ret != PacketFilter::PF_NO_MATCH)
+        {
+          flowHash = static_cast<uint32_t> (ret);
+        }
+      else
+        {
+          NS_LOG_ERROR ("No filter has been able to classify this packet, drop it.");
+          DropBeforeEnqueue (item, UNCLASSIFIED_DROP);
+          return false;
+        }
+    }
+
+  if (m_enableSetAssociativeHash)
+    {
+      h = SetAssociativeHash (flowHash);
+    }
+  else
+    {
+      h = flowHash % m_flows;
+    }
+
+  Ptr<FqPieFlow> flow;
+  if (m_flowsIndices.find (h) == m_flowsIndices.end ())
+    {
+      NS_LOG_DEBUG ("Creating a new flow queue with index " << h);
+      flow = m_flowFactory.Create<FqPieFlow> ();
+      Ptr<QueueDisc> qd = m_queueDiscFactory.Create<QueueDisc> ();
+      // If Pie, Set values of PieQueueDisc to match this QueueDisc
+      Ptr<PieQueueDisc> pie = qd->GetObject<PieQueueDisc> ();
+      if (pie)
+        {
+          pie->SetAttribute ("UseEcn", BooleanValue (m_useEcn));
+          pie->SetAttribute ("CeThreshold", TimeValue (m_ceThreshold));
+          pie->SetAttribute ("UseL4s", BooleanValue (m_useL4s));
+        }
+      qd->Initialize ();
+      flow->SetQueueDisc (qd);
+      flow->SetIndex (h);
+      AddQueueDiscClass (flow);
+
+      m_flowsIndices[h] = GetNQueueDiscClasses () - 1;
+    }
+  else
+    {
+      flow = StaticCast<FqPieFlow> (GetQueueDiscClass (m_flowsIndices[h]));
+    }
+
+  if (flow->GetStatus () == FqPieFlow::INACTIVE)
+    {
+      flow->SetStatus (FqPieFlow::NEW_FLOW);
+      flow->SetDeficit (m_quantum);
+      m_newFlows.push_back (flow);
+    }
+
+  flow->GetQueueDisc ()->Enqueue (item);
+
+  NS_LOG_DEBUG ("Packet enqueued into flow " << h << "; flow index " << m_flowsIndices[h]);
+
+  if (GetCurrentSize () > GetMaxSize ())
+    {
+      NS_LOG_DEBUG ("Overload; enter FqPieDrop ()");
+      FqPieDrop ();
+    }
+
+  return true;
+}
+
+Ptr<QueueDiscItem>
+FqPieQueueDisc::DoDequeue (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  Ptr<FqPieFlow> flow;
+  Ptr<QueueDiscItem> item;
+
+  do
+    {
+      bool found = false;
+
+      while (!found && !m_newFlows.empty ())
+        {
+          flow = m_newFlows.front ();
+
+          if (flow->GetDeficit () <= 0)
+            {
+              NS_LOG_DEBUG ("Increase deficit for new flow index " << flow->GetIndex ());
+              flow->IncreaseDeficit (m_quantum);
+              flow->SetStatus (FqPieFlow::OLD_FLOW);
+              m_oldFlows.push_back (flow);
+              m_newFlows.pop_front ();
+            }
+          else
+            {
+              NS_LOG_DEBUG ("Found a new flow " << flow->GetIndex () << " with positive deficit");
+              found = true;
+            }
+        }
+
+      while (!found && !m_oldFlows.empty ())
+        {
+          flow = m_oldFlows.front ();
+
+          if (flow->GetDeficit () <= 0)
+            {
+              NS_LOG_DEBUG ("Increase deficit for old flow index " << flow->GetIndex ());
+              flow->IncreaseDeficit (m_quantum);
+              m_oldFlows.push_back (flow);
+              m_oldFlows.pop_front ();
+            }
+          else
+            {
+              NS_LOG_DEBUG ("Found an old flow " << flow->GetIndex () << " with positive deficit");
+              found = true;
+            }
+        }
+
+      if (!found)
+        {
+          NS_LOG_DEBUG ("No flow found to dequeue a packet");
+          return 0;
+        }
+
+      item = flow->GetQueueDisc ()->Dequeue ();
+
+      if (!item)
+        {
+          NS_LOG_DEBUG ("Could not get a packet from the selected flow queue");
+          if (!m_newFlows.empty ())
+            {
+              flow->SetStatus (FqPieFlow::OLD_FLOW);
+              m_oldFlows.push_back (flow);
+              m_newFlows.pop_front ();
+            }
+          else
+            {
+              flow->SetStatus (FqPieFlow::INACTIVE);
+              m_oldFlows.pop_front ();
+            }
+        }
+      else
+        {
+          NS_LOG_DEBUG ("Dequeued packet " << item->GetPacket ());
+        }
+    }
+  while (item == 0);
+
+  flow->IncreaseDeficit (item->GetSize () * -1);
+
+  return item;
+}
+
+bool
+FqPieQueueDisc::CheckConfig (void)
+{
+  NS_LOG_FUNCTION (this);
+  if (GetNQueueDiscClasses () > 0)
+    {
+      NS_LOG_ERROR ("FqPieQueueDisc cannot have classes");
+      return false;
+    }
+
+  if (GetNInternalQueues () > 0)
+    {
+      NS_LOG_ERROR ("FqPieQueueDisc cannot have internal queues");
+      return false;
+    }
+  // we are at initialization time. If the user has not set a quantum value,
+  // set the quantum to the MTU of the device (if any)
+  if (!m_quantum)
+    {
+      Ptr<NetDeviceQueueInterface> ndqi = GetNetDeviceQueueInterface ();
+      Ptr<NetDevice> dev;
+      // if the NetDeviceQueueInterface object is aggregated to a
+      // NetDevice, get the MTU of such NetDevice
+      if (ndqi && (dev = ndqi->GetObject<NetDevice> ()))
+        {
+          m_quantum = dev->GetMtu ();
+          NS_LOG_DEBUG ("Setting the quantum to the MTU of the device: " << m_quantum);
+        }
+
+      if (!m_quantum)
+        {
+          NS_LOG_ERROR ("The quantum parameter cannot be null");
+          return false;
+        }
+    }
+
+  if (m_enableSetAssociativeHash && (m_flows % m_setWays != 0))
+    {
+      NS_LOG_ERROR ("The number of queues must be an integer multiple of the size "
+                    "of the set of queues used by set associative hash");
+      return false;
+    }
+
+  // If UseL4S attribute is enabled then CE threshold must be set.
+  if (m_useL4s)
+    {
+      NS_ABORT_MSG_IF (m_ceThreshold == Time::Max (), "CE threshold not set");
+      if (m_useEcn == false)
+        {
+          NS_LOG_WARN ("Enabling ECN as L4S mode is enabled");
+        }
+    }
+  return true;
+}
+
+void
+FqPieQueueDisc::InitializeParams (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  m_flowFactory.SetTypeId ("ns3::FqPieFlow");
+
+  m_queueDiscFactory.SetTypeId ("ns3::PieQueueDisc");
+  m_queueDiscFactory.Set ("MaxSize", QueueSizeValue (GetMaxSize ()));
+  m_queueDiscFactory.Set ("MeanPktSize", UintegerValue (1000));
+  m_queueDiscFactory.Set ("A", DoubleValue (0.125));
+  m_queueDiscFactory.Set ("B", DoubleValue (1.25));
+  m_queueDiscFactory.Set ("Tupdate", TimeValue (Seconds (0.015)));
+  m_queueDiscFactory.Set ("Supdate", TimeValue (Seconds (0)));
+  m_queueDiscFactory.Set ("DequeueThreshold", UintegerValue (16384));
+  m_queueDiscFactory.Set ("QueueDelayReference", TimeValue (Seconds (0.015)));
+  m_queueDiscFactory.Set ("MaxBurstAllowance", TimeValue (Seconds (0.15)));
+  m_queueDiscFactory.Set ("UseDequeueRateEstimator", BooleanValue (false));
+  m_queueDiscFactory.Set ("UseCapDropAdjustment", BooleanValue (true));
+  m_queueDiscFactory.Set ("UseDerandomization", BooleanValue (false));
+}
+
+uint32_t
+FqPieQueueDisc::FqPieDrop (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  uint32_t maxBacklog = 0, index = 0;
+  Ptr<QueueDisc> qd;
+
+  /* Queue is full! Find the fat flow and drop packet(s) from it */
+  for (uint32_t i = 0; i < GetNQueueDiscClasses (); i++)
+    {
+      qd = GetQueueDiscClass (i)->GetQueueDisc ();
+      uint32_t bytes = qd->GetNBytes ();
+      if (bytes > maxBacklog)
+        {
+          maxBacklog = bytes;
+          index = i;
+        }
+    }
+
+  /* Our goal is to drop half of this fat flow backlog */
+  uint32_t len = 0, count = 0, threshold = maxBacklog >> 1;
+  qd = GetQueueDiscClass (index)->GetQueueDisc ();
+  Ptr<QueueDiscItem> item;
+
+  do
+    {
+      NS_LOG_DEBUG ("Drop packet (overflow); count: " << count << " len: " << len << " threshold: " << threshold);
+      item = qd->GetInternalQueue (0)->Dequeue ();
+      DropAfterDequeue (item, OVERLIMIT_DROP);
+      len += item->GetSize ();
+    }
+  while (++count < m_dropBatchSize && len < threshold);
+
+  return index;
+}
+
+} // namespace ns3
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/model/fq-pie-queue-disc.h ns-3.34/src/traffic-control/model/fq-pie-queue-disc.h
--- ns-3.33/src/traffic-control/model/fq-pie-queue-disc.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/traffic-control/model/fq-pie-queue-disc.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,209 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016 Universita' degli Studi di Napoli Federico II
+ * Copyright (c) 2018 NITK Surathkal (modified for FQ-PIE)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Pasquale Imputato <p.imputato@gmail.com>
+ *          Stefano Avallone <stefano.avallone@unina.it>
+ * Modified for FQ-PIE by:  Sumukha PK <sumukhapk46@gmail.com>
+ *                          Prajval M  <26prajval98@gmail.com>
+ *                          Ishaan R D <ishaanrd6@gmail.com>
+ *                          Mohit P. Tahiliani <tahiliani@nitk.edu.in>
+ */
+
+#ifndef FQ_PIE_QUEUE_DISC
+#define FQ_PIE_QUEUE_DISC
+
+#include "ns3/queue-disc.h"
+#include "ns3/object-factory.h"
+#include <list>
+#include <map>
+
+namespace ns3 {
+
+/**
+ * \ingroup traffic-control
+ *
+ * \brief A flow queue used by the FqPie queue disc
+ */
+
+class FqPieFlow : public QueueDiscClass
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  /**
+   * \brief FqPieFlow constructor
+   */
+  FqPieFlow ();
+
+  virtual ~FqPieFlow ();
+
+  /**
+   * \enum FlowStatus
+   * \brief Used to determine the status of this flow queue
+   */
+  enum FlowStatus
+  {
+    INACTIVE,
+    NEW_FLOW,
+    OLD_FLOW
+  };
+
+  /**
+   * \brief Set the deficit for this flow
+   * \param deficit the deficit for this flow
+   */
+  void SetDeficit (uint32_t deficit);
+  /**
+   * \brief Get the deficit for this flow
+   * \return the deficit for this flow
+   */
+  int32_t GetDeficit (void) const;
+  /**
+   * \brief Increase the deficit for this flow
+   * \param deficit the amount by which the deficit is to be increased
+   */
+  void IncreaseDeficit (int32_t deficit);
+  /**
+   * \brief Set the status for this flow
+   * \param status the status for this flow
+   */
+  void SetStatus (FlowStatus status);
+  /**
+   * \brief Get the status of this flow
+   * \return the status of this flow
+   */
+  FlowStatus GetStatus (void) const;
+  /**
+   * \brief Set the index for this flow
+   * \param index the index for this flow
+   */
+  void SetIndex (uint32_t index);
+  /**
+   * \brief Get the index of this flow
+   * \return the index of this flow
+   */
+  uint32_t GetIndex (void) const;
+
+private:
+  int32_t m_deficit;    //!< the deficit for this flow
+  FlowStatus m_status;  //!< the status of this flow
+  uint32_t m_index;     //!< the index for this flow
+};
+
+
+/**
+ * \ingroup traffic-control
+ *
+ * \brief A FqPie packet queue disc
+ */
+
+class FqPieQueueDisc : public QueueDisc
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  /**
+   * \brief FqPieQueueDisc constructor
+   */
+  FqPieQueueDisc ();
+
+  virtual ~FqPieQueueDisc ();
+
+  /**
+   * \brief Set the quantum value.
+   *
+   * \param quantum The number of bytes each queue gets to dequeue on each round of the scheduling algorithm
+   */
+  void SetQuantum (uint32_t quantum);
+
+  /**
+   * \brief Get the quantum value.
+   *
+   * \returns The number of bytes each queue gets to dequeue on each round of the scheduling algorithm
+   */
+  uint32_t GetQuantum (void) const;
+
+  // Reasons for dropping packets
+  static constexpr const char* UNCLASSIFIED_DROP = "Unclassified drop";  //!< No packet filter able to classify packet
+  static constexpr const char* OVERLIMIT_DROP = "Overlimit drop";        //!< Overlimit dropped packets
+
+private:
+  virtual bool DoEnqueue (Ptr<QueueDiscItem> item);
+  virtual Ptr<QueueDiscItem> DoDequeue (void);
+  virtual bool CheckConfig (void);
+  virtual void InitializeParams (void);
+
+  /**
+   * \brief Drop a packet from the head of the queue with the largest current byte count
+   * \return the index of the queue with the largest current byte count
+   */
+  uint32_t FqPieDrop (void);
+
+  /**
+   * Compute the index of the queue for the flow having the given flowHash,
+   * according to the set associative hash approach.
+   *
+   * \param flowHash the hash of the flow 5-tuple
+   * \return the index of the queue for the given flow
+   */
+  uint32_t SetAssociativeHash (uint32_t flowHash);
+
+  // PIE queue disc parameter
+  bool m_useEcn;             //!< True if ECN is used (packets are marked instead of being dropped)
+  double m_markEcnTh;        //!< ECN marking threshold (default 10% as suggested in RFC 8033)
+  Time m_ceThreshold;        //!< Threshold above which to CE mark
+  bool m_useL4s;             //!< True if L4S is used (ECT1 packets are marked at CE threshold)
+  Time m_sUpdate;            //!< Start time of the update timer
+  Time m_tUpdate;            //!< Time period after which CalculateP () is called
+  Time m_qDelayRef;          //!< Desired queue delay
+  uint32_t m_meanPktSize;    //!< Average packet size in bytes
+  Time m_maxBurst;           //!< Maximum burst allowed before random early dropping kicks in
+  double m_a;                //!< Parameter to pie controller
+  double m_b;                //!< Parameter to pie controller
+  uint32_t m_dqThreshold;    //!< Minimum queue size in bytes before dequeue rate is measured
+  bool m_useDqRateEstimator; //!< Enable/Disable usage of dequeue rate estimator for queue delay calculation
+  bool  m_isCapDropAdjustment; //!< Enable/Disable Cap Drop Adjustment feature mentioned in RFC 8033
+  bool m_useDerandomization; //!< Enable Derandomization feature mentioned in RFC 8033
+
+  // Fq parameters
+  uint32_t m_quantum;        //!< Deficit assigned to flows at each round
+  uint32_t m_flows;          //!< Number of flow queues
+  uint32_t m_setWays;        //!< size of a set of queues (used by set associative hash)
+  uint32_t m_dropBatchSize;  //!< Max number of packets dropped from the fat flow
+  uint32_t m_perturbation;   //!< hash perturbation value
+  bool m_enableSetAssociativeHash; //!< whether to enable set associative hash
+
+  std::list<Ptr<FqPieFlow> > m_newFlows;    //!< The list of new flows
+  std::list<Ptr<FqPieFlow> > m_oldFlows;    //!< The list of old flows
+
+  std::map<uint32_t, uint32_t> m_flowsIndices;    //!< Map with the index of class for each flow
+  std::map<uint32_t, uint32_t> m_tags;            //!< Tags used by set associative hash
+
+  ObjectFactory m_flowFactory;         //!< Factory to create a new flow
+  ObjectFactory m_queueDiscFactory;    //!< Factory to create a new queue
+};
+
+} // namespace ns3
+
+#endif /* FQ_PIE_QUEUE_DISC */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/model/pie-queue-disc.cc ns-3.34/src/traffic-control/model/pie-queue-disc.cc
--- ns-3.33/src/traffic-control/model/pie-queue-disc.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/traffic-control/model/pie-queue-disc.cc	2021-07-14 10:31:07.000000000 -0700
@@ -50,7 +50,7 @@
                    "Average of packet size",
                    UintegerValue (1000),
                    MakeUintegerAccessor (&PieQueueDisc::m_meanPktSize),
-                   MakeUintegerChecker<uint32_t> ())
+                   MakeUintegerChecker<uint32_t> ()) 
     .AddAttribute ("A",
                    "Value of alpha",
                    DoubleValue (0.125),
@@ -122,6 +122,16 @@
                    TimeValue (Time::Max ()),
                    MakeTimeAccessor (&PieQueueDisc::m_activeThreshold),
                    MakeTimeChecker ())
+    .AddAttribute ("CeThreshold",
+                   "The FqPie CE threshold for marking packets",
+                   TimeValue (Time::Max ()),
+                   MakeTimeAccessor (&PieQueueDisc::m_ceThreshold),
+                   MakeTimeChecker ())
+    .AddAttribute ("UseL4s",
+                   "True to use L4S (only ECT1 packets are marked at CE threshold)",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&PieQueueDisc::m_useL4s),
+                   MakeBooleanChecker ())
   ;
 
   return tid;
@@ -169,6 +179,24 @@
   NS_LOG_FUNCTION (this << item);
 
   QueueSize nQueued = GetCurrentSize ();
+  // If L4S is enabled, then check if the packet is ECT1, and if it is then set isEct true
+  bool isEct1 = false;
+  if (item && m_useL4s)
+    {
+      uint8_t tosByte = 0;
+      if (item->GetUint8Value (QueueItem::IP_DSFIELD, tosByte) && (((tosByte & 0x3) == 1) || (tosByte & 0x3) == 3))
+        {
+          if ((tosByte & 0x3) == 1)
+            {
+              NS_LOG_DEBUG ("Enqueueing ECT1 packet " << static_cast<uint16_t> (tosByte & 0x3));
+            }
+          else 
+            {
+              NS_LOG_DEBUG ("Enqueueing CE packet " << static_cast<uint16_t> (tosByte & 0x3));
+            }
+          isEct1 = true; 
+        }
+    }
 
   if (nQueued + item > GetMaxSize ())
     {
@@ -177,7 +205,9 @@
       m_accuProb = 0;
       return false;
     }
-  else if ((m_activeThreshold == Time::Max () || m_active) && DropEarly (item, nQueued.GetValue ()))
+  // isEct1 will be true only if L4S enabled as well as the packet is ECT1.
+  // If L4S is enabled and packet is ECT1 then directly enqueue the packet.
+  else if ((m_activeThreshold == Time::Max () || m_active) && !isEct1 && DropEarly (item, nQueued.GetValue ()))
     {
       if (!m_useEcn || m_dropProb >= m_markEcnTh || !Mark (item, UNFORCED_MARK))
         {
@@ -195,14 +225,14 @@
   if (m_activeThreshold != Time::Max () && !m_active && m_qDelay >= m_activeThreshold)
     {
       m_active = true;
-      m_qDelayOld = Time (Seconds (0));
+      m_qDelayOld = Seconds (0);
       m_dropProb = 0;
       m_inMeasurement = true;
       m_dqCount = 0;
       m_avgDqRate = 0;
       m_burstAllowance = m_maxBurst;
       m_accuProb = 0;
-      m_dqStart = Simulator::Now ().GetSeconds ();
+      m_dqStart = Now ();
     }
 
   // If queue has been Idle for a while, Turn OFF PIE
@@ -230,9 +260,9 @@
   m_dqCount = DQCOUNT_INVALID;
   m_dropProb = 0;
   m_avgDqRate = 0.0;
-  m_dqStart = 0;
+  m_dqStart = Seconds (0);
   m_burstState = NO_BURST;
-  m_qDelayOld = Time (Seconds (0));
+  m_qDelayOld = Seconds (0);
   m_accuProb = 0.0;
   m_active = false;
 }
@@ -312,11 +342,11 @@
     {
       if (m_avgDqRate > 0)
         {
-          qDelay = Time (Seconds (GetInternalQueue (0)->GetNBytes () / m_avgDqRate));
+          qDelay = Seconds (GetInternalQueue (0)->GetNBytes () / m_avgDqRate);
         }
       else
         {
-          qDelay = Time (Seconds (0));
+          qDelay = Seconds (0);
           missingInitFlag = true;
         }
       m_qDelay = qDelay;
@@ -398,7 +428,7 @@
   // Section 4.4 #2
   if (m_burstAllowance < m_tUpdate)
     {
-      m_burstAllowance =  Time (Seconds (0));
+      m_burstAllowance =  Seconds (0);
     }
   else
     {
@@ -449,8 +479,31 @@
     }
 
   Ptr<QueueDiscItem> item = GetInternalQueue (0)->Dequeue ();
-  double now = Simulator::Now ().GetSeconds ();
-  uint32_t pktSize = item->GetSize ();
+  NS_ASSERT_MSG (item != nullptr, "Dequeue null, but internal queue not empty");
+
+  // If L4S is enabled and packet is ECT1, then check if delay is greater
+  // than CE threshold and if it is then mark the packet,
+  // skip PIE steps, and return the item.
+  if (m_useL4s)
+    {
+      uint8_t tosByte = 0;
+      if (item->GetUint8Value (QueueItem::IP_DSFIELD, tosByte) && (((tosByte & 0x3) == 1) || (tosByte & 0x3) == 3))
+        {
+          if ((tosByte & 0x3) == 1)
+            {
+              NS_LOG_DEBUG ("ECT1 packet " << static_cast<uint16_t> (tosByte & 0x3));
+            }
+          else 
+            {
+              NS_LOG_DEBUG ("CE packet " << static_cast<uint16_t> (tosByte & 0x3));
+            }
+          if ((Now () - item->GetTimeStamp () > m_ceThreshold) && Mark (item, CE_THRESHOLD_EXCEEDED_MARK))
+            {
+              NS_LOG_LOGIC ("Marking due to CeThreshold " << m_ceThreshold.GetSeconds ());
+            }
+          return item;
+        }
+    }  
 
   // if not in a measurement cycle and the queue has built up to dq_threshold,
   // start the measurement cycle
@@ -458,30 +511,28 @@
     {
       if ( (GetInternalQueue (0)->GetNBytes () >= m_dqThreshold) && (!m_inMeasurement) )
         {
-          m_dqStart = now;
+          m_dqStart = Now ();
           m_dqCount = 0;
           m_inMeasurement = true;
         }
 
       if (m_inMeasurement)
         {
-          m_dqCount += pktSize;
+          m_dqCount += item->GetSize ();
 
           // done with a measurement cycle
           if (m_dqCount >= m_dqThreshold)
             {
-
-              double tmp = now - m_dqStart;
-
-              if (tmp > 0)
+              Time dqTime = Now () - m_dqStart;
+              if (dqTime > Seconds (0))
                 {
                   if (m_avgDqRate == 0)
                     {
-                      m_avgDqRate = m_dqCount / tmp;
+                      m_avgDqRate = m_dqCount / dqTime.GetSeconds ();
                     }
                   else
                     {
-                      m_avgDqRate = (0.5 * m_avgDqRate) + (0.5 * (m_dqCount / tmp));
+                      m_avgDqRate = (0.5 * m_avgDqRate) + (0.5 * (m_dqCount / dqTime.GetSeconds ()));
                     }
                 }
               NS_LOG_DEBUG ("Average Dequeue Rate after Dequeue: " << m_avgDqRate);
@@ -489,7 +540,7 @@
               // restart a measurement cycle if there is enough data
               if (GetInternalQueue (0)->GetNBytes () > m_dqThreshold)
                 {
-                  m_dqStart = now;
+                  m_dqStart = Now ();
                   m_dqCount = 0;
                   m_inMeasurement = true;
                 }
@@ -503,11 +554,11 @@
     }
   else
     {
-      m_qDelay = Time (Seconds (now - item->GetTimeStamp ().GetSeconds ()));
+      m_qDelay = Now () - item->GetTimeStamp ();
 
       if (GetInternalQueue (0)->GetNBytes () == 0)
         {
-          m_qDelay = Time (Seconds (0));
+          m_qDelay = Seconds (0);
         }
     }
   return item;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/model/pie-queue-disc.h ns-3.34/src/traffic-control/model/pie-queue-disc.h
--- ns-3.33/src/traffic-control/model/pie-queue-disc.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/traffic-control/model/pie-queue-disc.h	2021-07-14 10:31:07.000000000 -0700
@@ -98,6 +98,7 @@
   static constexpr const char* UNFORCED_DROP = "Unforced drop";  //!< Early probability drops: proactive
   static constexpr const char* FORCED_DROP = "Forced drop";      //!< Drops due to queue limit: reactive
   static constexpr const char* UNFORCED_MARK = "Unforced mark";  //!< Early probability marks: proactive
+  static constexpr const char* CE_THRESHOLD_EXCEEDED_MARK = "CE threshold exceeded mark";  //!< Early probability marks: proactive
 
 protected:
   /**
@@ -131,6 +132,7 @@
    */
   void CalculateP ();
 
+
   static const uint64_t DQCOUNT_INVALID = std::numeric_limits<uint64_t>::max();  //!< Invalid dqCount value
 
   // ** Variables supplied by user
@@ -148,6 +150,8 @@
   bool m_useDerandomization;                    //!< Enable Derandomization feature mentioned in RFC 8033
   double m_markEcnTh;                           //!< ECN marking threshold (default 10% as suggested in RFC 8033)
   Time m_activeThreshold;                       //!< Threshold for activating PIE (disabled by default)
+  Time m_ceThreshold;                           //!< Threshold above which to CE mark
+  bool m_useL4s;                                //!< True if L4S is used (ECT1 packets are marked at CE threshold)
 
   // ** Variables maintained by PIE
   double m_dropProb;                            //!< Variable used in calculation of drop probability
@@ -158,7 +162,7 @@
   BurstStateT m_burstState;                     //!< Used to determine the current state of burst
   bool m_inMeasurement;                         //!< Indicates whether we are in a measurement cycle
   double m_avgDqRate;                           //!< Time averaged dequeue rate
-  double m_dqStart;                             //!< Start timestamp of current measurement cycle
+  Time m_dqStart;                               //!< Start timestamp of current measurement cycle
   uint64_t m_dqCount;                           //!< Number of bytes departed since current measurement cycle starts
   EventId m_rtrsEvent;                          //!< Event used to decide the decision of interval of drop probability calculation
   Ptr<UniformRandomVariable> m_uv;              //!< Rng stream
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/test/cobalt-queue-disc-test-suite.cc ns-3.34/src/traffic-control/test/cobalt-queue-disc-test-suite.cc
--- ns-3.33/src/traffic-control/test/cobalt-queue-disc-test-suite.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/traffic-control/test/cobalt-queue-disc-test-suite.cc	2021-07-14 10:31:07.000000000 -0700
@@ -144,6 +144,8 @@
                          "Verify that we can actually set the attribute Interval");
   NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("Target", StringValue ("4ms")), true,
                          "Verify that we can actually set the attribute Target");
+  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+                         "Disable Blue enhancement");
 
   if (m_mode == QueueSizeUnit::BYTES)
     {
@@ -272,7 +274,8 @@
   queue = CreateObject<CobaltQueueDisc> ();
   NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("MaxSize", QueueSizeValue (QueueSize (mode, modeSize * 100))),
                          true, "Verify that we can actually set the attribute MaxSize");
-
+  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+                         "Disable Blue enhancement");
   queue->Initialize ();
 
   if (mode == QueueSizeUnit::BYTES)
@@ -411,7 +414,8 @@
                          true, "Verify that we can actually set the attribute MaxSize");
   NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (false)),
                          true, "Verify that we can actually set the attribute UseEcn");
-
+  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+                         "Disable Blue enhancement");
   queue->Initialize ();
 
   // Not-ECT traffic to induce packet drop
@@ -436,7 +440,8 @@
                          true, "Verify that we can actually set the attribute MaxSize");
   NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
                          true, "Verify that we can actually set the attribute UseEcn");
-
+  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+                         "Disable Blue enhancement");
   queue->Initialize ();
 
   // ECN capable traffic
@@ -466,7 +471,8 @@
                          true, "Verify that we can actually set the attribute MaxSize");
   NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
                          true, "Verify that we can actually set the attribute UseEcn");
-
+  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+                         "Disable Blue enhancement");
   queue->Initialize ();
 
   // First 3 packets in the queue are ecnCapable
@@ -529,7 +535,7 @@
               nPacketsBeforeFirstDrop = initialQSize;
             }
         }
-      if (testCase == 2)
+       if (testCase == 2)
         {
           if (initialMarkCount == 0 && currentTime > queue->GetTarget ())
             {
@@ -540,8 +546,8 @@
                   NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be 1 packet dequeued.");
                   NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
                   NS_TEST_ASSERT_MSG_EQ (currentMarkCount, 0, "We are not in dropping state."
-                                         "Sojourn time has just gone above target from below."
-                                         "Hence, there should be no marked packets");
+                                        "Sojourn time has just gone above target from below."
+                                        "Hence, there should be no marked packets");
                 }
               else if (currentTime >= queue->GetInterval ())
                 {
@@ -549,9 +555,9 @@
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP);
                   currentMarkCount = queue->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK);
                   NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize,
-                                         "Sojourn time has been above target for at least interval."
-                                         "We enter the dropping state and perform initial packet marking"
-                                         "So there should be only 1 more packet dequeued.");
+                                        "Sojourn time has been above target for at least interval."
+                                        "We enter the dropping state and perform initial packet marking"
+                                        "So there should be only 1 more packet dequeued.");
                   NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
                   NS_TEST_EXPECT_MSG_EQ (currentMarkCount, 1, "There should be 1 marked packet");
                 }
@@ -563,23 +569,23 @@
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP);
                   currentMarkCount = queue->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK);
                   NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "We are in dropping state."
-                                         "Sojourn is still above target."
-                                         "There should be only 1 more packet dequeued");
+                                        "Sojourn is still above target."
+                                        "There should be only 1 more packet dequeued");
                   NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
                   NS_TEST_EXPECT_MSG_EQ (currentMarkCount, 2, "There should be 2 marked packet as."
-                                         "current dropnext is equal to current time.");
+                                                              "current dropnext is equal to current time.");
                 }
               else if (currentTime.GetNanoSeconds () > initialDropNext)
                 {
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP);
                   currentMarkCount = queue->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK);
                   NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "We are in dropping state."
-                                         "It's time for packet to be marked"
-                                         "So there should be only 1 more packet dequeued");
+                                        "It's time for packet to be marked"
+                                        "So there should be only 1 more packet dequeued");
                   NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
                   NS_TEST_EXPECT_MSG_EQ (currentMarkCount, 3, "There should be 3 marked packet");
                   NS_TEST_EXPECT_MSG_EQ (nPacketsBeforeFirstDrop, nPacketsBeforeFirstMark, "Number of packets in the queue before drop should be equal"
-                                         "to number of packets in the queue before first mark as the behavior until packet N should be the same.");
+                                        "to number of packets in the queue before first mark as the behavior until packet N should be the same.");
                 }
             }
         }
@@ -594,17 +600,17 @@
                   NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "There should be 1 packet dequeued.");
                   NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
                   NS_TEST_ASSERT_MSG_EQ (currentMarkCount, 0, "We are not in dropping state."
-                                         "Sojourn time has just gone above target from below."
-                                         "Hence, there should be no marked packets");
+                                        "Sojourn time has just gone above target from below."
+                                        "Hence, there should be no marked packets");
                 }
               else if (currentTime >= queue->GetInterval ())
                 {
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP);
                   currentMarkCount = queue->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK);
                   NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize,
-                                         "Sojourn time has been above target for at least interval."
-                                         "We enter the dropping state and perform initial packet marking"
-                                         "So there should be only 1 more packet dequeued.");
+                                        "Sojourn time has been above target for at least interval."
+                                        "We enter the dropping state and perform initial packet marking"
+                                        "So there should be only 1 more packet dequeued.");
                   NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
                   NS_TEST_EXPECT_MSG_EQ (currentMarkCount, 1, "There should be 1 marked packet");
                 }
@@ -616,19 +622,19 @@
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP);
                   currentMarkCount = queue->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK);
                   NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - modeSize, "We are in dropping state."
-                                         "Sojourn is still above target."
-                                         "So there should be only 1 more packet dequeued");
+                                        "Sojourn is still above target."
+                                        "So there should be only 1 more packet dequeued");
                   NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "There should not be any packet drops");
                   NS_TEST_EXPECT_MSG_EQ (currentMarkCount, 2, "There should be 2 marked packet"
-                                         "as dropnext is equal to current time");
+                                                              "as dropnext is equal to current time");
                 }
               else if (currentTime.GetNanoSeconds () > initialDropNext)
                 {
                   currentDropCount = queue->GetStats ().GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP);
                   currentMarkCount = queue->GetStats ().GetNMarkedPackets (CobaltQueueDisc::FORCED_MARK);
                   NS_TEST_EXPECT_MSG_EQ (queue->GetCurrentSize ().GetValue (), initialQSize - (m_dropNextCount + 1) * modeSize, "We are in dropping state."
-                                         "It's time for packet to be dropped as packets are not ecnCapable"
-                                         "The number of packets dequeued equals to the number of times m_dropNext is updated plus initial dequeue");
+                                        "It's time for packet to be dropped as packets are not ecnCapable"
+                                        "The number of packets dequeued equals to the number of times m_dropNext is updated plus initial dequeue");
                   NS_TEST_EXPECT_MSG_EQ (currentDropCount, m_dropNextCount, "The number of drops equals to the number of times m_dropNext is updated");
                   NS_TEST_EXPECT_MSG_EQ (currentMarkCount, 2, "There should still be only 2 marked packet");
                 }
@@ -637,6 +643,296 @@
     }
 }
 
+/**
+ * \ingroup traffic-control-test
+ * \ingroup tests
+ *
+ * \brief Test 4: Cobalt Queue Disc CE Threshold marking Test Item
+ */
+class CobaltQueueDiscCeThresholdTest : public TestCase
+{
+public:
+  CobaltQueueDiscCeThresholdTest (QueueSizeUnit mode);
+  virtual ~CobaltQueueDiscCeThresholdTest ();
+
+private:
+  virtual void DoRun (void);
+  /**
+   * \brief Enqueue function
+   * \param queue the queue disc
+   * \param size the size
+   * \param nPkt the number of packets
+   */
+  void Enqueue (Ptr<CobaltQueueDisc> queue, uint32_t size, uint32_t nPkt);
+  /**
+   * \brief Enqueue with delay function
+   * \param queue the queue disc
+   * \param size the size
+   * \param nPkt the number of packets
+   * \param delay the delay between the enqueueing of the packets
+   */
+  void EnqueueWithDelay (Ptr<CobaltQueueDisc> queue, uint32_t size, uint32_t nPkt, Time delay);
+  /**
+   * \brief Dequeue function
+   * \param queue the queue disc
+   * \param modeSize the mode size
+   */
+  void Dequeue (Ptr<CobaltQueueDisc> queue, uint32_t modeSize);
+  /**
+   * \brief Dequeue with delay function
+   * \param queue the queue disc
+   * \param modeSize the mode size
+   * \param nPkt the number of packets
+   * \param delay the delay between the enqueueing of the packets
+   */
+  void DequeueWithDelay (Ptr<CobaltQueueDisc> queue, uint32_t modeSize, uint32_t nPkt, Time delay);
+  QueueSizeUnit m_mode; ///< mode
+};
+
+CobaltQueueDiscCeThresholdTest::CobaltQueueDiscCeThresholdTest (QueueSizeUnit mode)
+  : TestCase ("Test CE Threshold marking")
+{
+  m_mode = mode;
+}
+
+CobaltQueueDiscCeThresholdTest::~CobaltQueueDiscCeThresholdTest ()
+{
+}
+
+void
+CobaltQueueDiscCeThresholdTest::Enqueue (Ptr<CobaltQueueDisc> queue, uint32_t size, uint32_t nPkt)
+{
+  Address dest;
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      queue->Enqueue (Create<CobaltQueueDiscTestItem> (Create<Packet> (size), dest, 0, true));
+    }
+}
+
+void
+CobaltQueueDiscCeThresholdTest::EnqueueWithDelay (Ptr<CobaltQueueDisc> queue, uint32_t size, uint32_t nPkt, Time delay)
+{
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Simulator::Schedule (Time (Seconds ((i + 1) * delay.GetSeconds ())), &CobaltQueueDiscCeThresholdTest::Enqueue, this, queue, size, 1);
+    }
+}
+
+void
+CobaltQueueDiscCeThresholdTest::Dequeue (Ptr<CobaltQueueDisc> queue,  uint32_t modeSize)
+{
+  Ptr<QueueDiscItem> item = queue->Dequeue ();
+
+  if (Simulator::Now () > MilliSeconds (11) && Simulator::Now () < MilliSeconds (28))
+    {
+      NS_TEST_EXPECT_MSG_EQ (queue->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK), 1, "There should be only 1 packet"
+                                                                 "mark, the delay between the enqueueing of the packets decreased after the"
+                                                                 "1st mark (packet enqueued at 11ms) and increased for the packet enqueued after 20.6ms."
+                                                                 "Queue delay remains below or equal to 1ms for the packet enqueued before 28ms");
+    }
+  if (Simulator::Now () > MilliSeconds (31) )
+    {
+      NS_TEST_EXPECT_MSG_EQ (queue->GetStats ().GetNMarkedPackets (CobaltQueueDisc::CE_THRESHOLD_EXCEEDED_MARK), 3, "There should be 3 packet"
+                                                                 "marks, the delay between the enqueueing of the packets decreased after 1st mark"
+                                                                 "(packet enqueued at 11ms) and increased for the packet enqueued after 20.6ms."
+                                                                 "Queue delay remains below 1ms for the packets enqueued before 28ms and increases"
+                                                                 "for the packets enqueued after 28ms.");
+    }
+}
+
+void
+CobaltQueueDiscCeThresholdTest::DequeueWithDelay (Ptr<CobaltQueueDisc> queue, uint32_t modeSize, uint32_t nPkt, Time delay)
+{
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Simulator::Schedule (Time (Seconds ((i + 1) * delay.GetSeconds ())), &CobaltQueueDiscCeThresholdTest::Dequeue, this, queue, modeSize);
+    }
+}
+
+void
+CobaltQueueDiscCeThresholdTest::DoRun (void)
+{
+  Ptr<CobaltQueueDisc> queue = CreateObject<CobaltQueueDisc> ();
+  uint32_t pktSize = 1000;
+  uint32_t modeSize = 0;
+
+  if (m_mode == QueueSizeUnit::BYTES)
+    {
+      modeSize = pktSize;
+    }
+  else if (m_mode == QueueSizeUnit::PACKETS)
+    {
+      modeSize = 1;
+    }
+
+  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
+                         true, "Verify that we can actually set the attribute UseEcn");
+  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("CeThreshold", TimeValue (MilliSeconds (1))),
+                         true, "Verify that we can actually set the attribute UseEcn");
+  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+                         "Disable Blue enhancement");
+  queue->Initialize ();
+
+  // Enqueue 11 packets every 1ms
+  EnqueueWithDelay (queue, pktSize, 11, MilliSeconds (1));
+
+  // With every dequeue, queue delay increases by 0.1ms as packet enqueues every 1ms while dequeues at 1.1ms
+  // so at 11th dequeue, the dequeued packet should be marked.
+  Time dequeueInterval =  MicroSeconds (1100);
+  DequeueWithDelay (queue, modeSize, 11, dequeueInterval);
+
+  // First mark occured for the packet enqueued at 11ms, ideally TCP would decrease sending rate
+  // which can be simulated by increasing interval between subsequent enqueues, so packets are now enqueued with a delay 1.2ms.
+  Time waitUntilFirstMark = MilliSeconds(11);
+  Simulator::Schedule (waitUntilFirstMark, &CobaltQueueDiscCeThresholdTest::EnqueueWithDelay, this, queue, pktSize, 9, MicroSeconds (1200));
+
+  // Keep dequeueing with the same delay
+  Simulator::Schedule (waitUntilFirstMark, &CobaltQueueDiscCeThresholdTest::DequeueWithDelay, this, queue, modeSize, 9, dequeueInterval);
+
+  // Queue delay becomes 0.2ms for the packet enqueued at 20.6ms, time to decrease interval between subsequent enqueues,
+  // as ideally TCP would again start increasing sending rate
+  Time waitUntilDecreasingEnqueueDelay = waitUntilFirstMark + MilliSeconds(9);
+  Simulator::Schedule (waitUntilDecreasingEnqueueDelay, &CobaltQueueDiscCeThresholdTest::EnqueueWithDelay, this, queue, pktSize, 10, MilliSeconds (1));
+
+  // Keep dequeueing with the same delay
+  Simulator::Schedule (waitUntilFirstMark, &CobaltQueueDiscCeThresholdTest::DequeueWithDelay, this, queue, modeSize, 10, dequeueInterval);
+
+  Simulator::Run ();
+  Simulator::Destroy ();
+}
+
+
+/**
+ * \ingroup traffic-control-test
+ * \ingroup tests
+ *
+ * \brief Test 5: Cobalt Queue Disc Enhanced Blue Test Item
+ * This test checks that the Blue Enhancement is working correctly. This test checks that Pdrop should increase as expected with
+ * a certain number of dropped packets which is fixed by assigning a stream to the uniform random variable.
+ * This test case is divided into 2 sub test cases
+ * 1) With Blue Enhancement enabled, the test checks that Pdrop should increase as expected with
+ *    a certain number of dropped packets which is fixed by assigning a stream to the uniform random variable.
+ * 2) Without Blue Enhancement, Pdrop should remain zero and there should not be any dropped packets as ECN is enabled.
+ */
+class CobaltQueueDiscEnhancedBlueTest : public TestCase
+{
+public:
+  CobaltQueueDiscEnhancedBlueTest (QueueSizeUnit mode);
+  virtual ~CobaltQueueDiscEnhancedBlueTest ();
+
+private:
+  virtual void DoRun (void);
+  /**
+   * Enqueue function
+   * \param queue the queue disc
+   * \param size the size
+   * \param nPkt the number of packets
+   */
+  void Enqueue (Ptr<CobaltQueueDisc> queue, uint32_t size, uint32_t nPkt);
+  /**
+   * \brief Dequeue function
+   * \param queue the queue disc
+   */
+  void Dequeue (Ptr<CobaltQueueDisc> queue);
+  /**
+   * \brief Dequeue with delay function
+   * \param queue the queue disc
+   * \param nPkt the number of packets
+   * \param delay the delay between the enqueueing of the packets
+   */
+  void DequeueWithDelay (Ptr<CobaltQueueDisc> queue, uint32_t nPkt, Time delay);
+  QueueSizeUnit m_mode; ///< mode
+};
+
+CobaltQueueDiscEnhancedBlueTest::CobaltQueueDiscEnhancedBlueTest (QueueSizeUnit mode)
+  : TestCase ("Enhanced Blue tests verification for both packets and bytes mode")
+{
+  m_mode = mode;
+}
+
+CobaltQueueDiscEnhancedBlueTest::~CobaltQueueDiscEnhancedBlueTest ()
+{
+}
+
+void
+CobaltQueueDiscEnhancedBlueTest::DoRun (void)
+
+{
+  uint32_t pktSize = 1500;
+  uint32_t modeSize = 0;
+  Ptr<CobaltQueueDisc> queue = CreateObject<CobaltQueueDisc> ();
+
+  if (m_mode == QueueSizeUnit::BYTES)
+    {
+      modeSize = pktSize;
+    }
+  else if (m_mode == QueueSizeUnit::PACKETS)
+    {
+      modeSize = 1;
+    }
+  queue->Initialize ();
+  queue->AssignStreams (1);
+  Enqueue (queue, modeSize, 200);
+  DequeueWithDelay (queue, 100, MilliSeconds (10));
+
+  Simulator::Stop (Seconds (8.0));
+  Simulator::Run ();
+
+  QueueDisc::Stats st = queue->GetStats ();
+
+  // The Pdrop value should increase, from it's default value of zero
+  NS_TEST_EXPECT_MSG_EQ (queue->GetPdrop (), 0.234375, "Pdrop should be increased by 1/256 for every packet whose sojourn time is above 400ms."
+                        " From the 41st dequeue until the last one, sojourn time is above 400ms, so 60 packets have sojourn time above 400ms"
+                        "hence Pdrop should be increased 60*(1/256) which is 0.234375");
+  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 49, "There should a fixed number of drops (49 here)");
+  Simulator::Destroy ();
+
+
+  queue = CreateObject<CobaltQueueDisc> ();
+  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("UseEcn", BooleanValue (true)),
+                         true, "Verify that we can actually set the attribute UseEcn");
+  NS_TEST_EXPECT_MSG_EQ (queue->SetAttributeFailSafe ("BlueThreshold", TimeValue (Time::Max ())), true,
+                         "Disable Blue enhancement");
+  queue->Initialize ();
+  Enqueue (queue, modeSize, 200);
+  DequeueWithDelay (queue, 100, MilliSeconds (10));
+
+  Simulator::Stop (Seconds (8.0));
+  Simulator::Run ();
+
+  st = queue->GetStats ();
+
+  NS_TEST_EXPECT_MSG_EQ (queue->GetPdrop (), 0, "Pdrop should be zero");
+  NS_TEST_EXPECT_MSG_EQ (st.GetNDroppedPackets (CobaltQueueDisc::TARGET_EXCEEDED_DROP), 0, "There should not any dropped packets");
+  Simulator::Destroy ();
+}
+
+void
+CobaltQueueDiscEnhancedBlueTest::Enqueue (Ptr<CobaltQueueDisc> queue, uint32_t size, uint32_t nPkt)
+{
+  Address dest;
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      queue->Enqueue (Create<CobaltQueueDiscTestItem> (Create<Packet> (size), dest, 0, true));
+    }
+}
+
+void
+CobaltQueueDiscEnhancedBlueTest::Dequeue (Ptr<CobaltQueueDisc> queue)
+{
+  Ptr<QueueDiscItem> item = queue->Dequeue ();
+}
+
+void
+CobaltQueueDiscEnhancedBlueTest::DequeueWithDelay (Ptr<CobaltQueueDisc> queue, uint32_t nPkt, Time delay)
+{
+  for (uint32_t i = 0; i < nPkt; i++)
+    {
+      Simulator::Schedule (Time (Seconds ((i + 1) * delay.GetSeconds ())), &CobaltQueueDiscEnhancedBlueTest::Dequeue, this, queue);
+    }
+}
+
+
 static class CobaltQueueDiscTestSuite : public TestSuite
 {
 public:
@@ -651,5 +947,11 @@
     // Test 3: Mark test
     AddTestCase (new CobaltQueueDiscMarkTest (PACKETS), TestCase::QUICK);
     AddTestCase (new CobaltQueueDiscMarkTest (BYTES), TestCase::QUICK);
+    // Test 4: CE threshold marking test
+    AddTestCase (new CobaltQueueDiscCeThresholdTest (PACKETS), TestCase::QUICK);
+    AddTestCase (new CobaltQueueDiscCeThresholdTest (BYTES), TestCase::QUICK);
+    // Test 4: Blue enhancement test
+    AddTestCase (new CobaltQueueDiscEnhancedBlueTest (PACKETS), TestCase::QUICK);
+    AddTestCase (new CobaltQueueDiscEnhancedBlueTest (BYTES), TestCase::QUICK);
   }
 } g_cobaltQueueTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/traffic-control/wscript ns-3.34/src/traffic-control/wscript
--- ns-3.33/src/traffic-control/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/traffic-control/wscript	2021-07-14 10:31:07.000000000 -0700
@@ -18,10 +18,12 @@
       'model/codel-queue-disc.cc',
       'model/fq-codel-queue-disc.cc',
       'model/pie-queue-disc.cc',
+      'model/fq-pie-queue-disc.cc',
       'model/prio-queue-disc.cc',
       'model/mq-queue-disc.cc',
       'model/tbf-queue-disc.cc',
       'model/cobalt-queue-disc.cc',
+      'model/fq-cobalt-queue-disc.cc',
       'helper/traffic-control-helper.cc',
       'helper/queue-disc-container.cc'
         ]
@@ -58,10 +60,12 @@
       'model/codel-queue-disc.h',
       'model/fq-codel-queue-disc.h',
       'model/pie-queue-disc.h',
+      'model/fq-pie-queue-disc.h',
       'model/prio-queue-disc.h',
       'model/mq-queue-disc.h',
       'model/tbf-queue-disc.h',
       'model/cobalt-queue-disc.h',
+      'model/fq-cobalt-queue-disc.h',
       'helper/traffic-control-helper.h',
       'helper/queue-disc-container.h'
         ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/uan/bindings/modulegen__gcc_ILP32.py ns-3.34/src/uan/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/uan/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/uan/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -84,12 +84,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -735,8 +739,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1831,6 +1837,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2044,6 +2062,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2119,6 +2142,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2139,6 +2174,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -3751,6 +3791,11 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
+    ## uan-phy.h (module 'uan'): void ns3::UanPhyListener::NotifyTxEnd() [member function]
+    cls.add_method('NotifyTxEnd', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
     ## uan-phy.h (module 'uan'): void ns3::UanPhyListener::NotifyTxStart(ns3::Time duration) [member function]
     cls.add_method('NotifyTxStart', 
                    'void', 
@@ -5018,6 +5063,11 @@
                    'void', 
                    [], 
                    is_virtual=True)
+    ## uan-mac-cw.h (module 'uan'): void ns3::UanMacCw::NotifyTxEnd() [member function]
+    cls.add_method('NotifyTxEnd', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
     ## uan-mac-cw.h (module 'uan'): void ns3::UanMacCw::NotifyTxStart(ns3::Time duration) [member function]
     cls.add_method('NotifyTxStart', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/uan/bindings/modulegen__gcc_LP64.py ns-3.34/src/uan/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/uan/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/uan/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -84,12 +84,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -735,8 +739,10 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1831,6 +1837,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2044,6 +2062,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2119,6 +2142,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2139,6 +2174,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -3751,6 +3791,11 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
+    ## uan-phy.h (module 'uan'): void ns3::UanPhyListener::NotifyTxEnd() [member function]
+    cls.add_method('NotifyTxEnd', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
     ## uan-phy.h (module 'uan'): void ns3::UanPhyListener::NotifyTxStart(ns3::Time duration) [member function]
     cls.add_method('NotifyTxStart', 
                    'void', 
@@ -5018,6 +5063,11 @@
                    'void', 
                    [], 
                    is_virtual=True)
+    ## uan-mac-cw.h (module 'uan'): void ns3::UanMacCw::NotifyTxEnd() [member function]
+    cls.add_method('NotifyTxEnd', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
     ## uan-mac-cw.h (module 'uan'): void ns3::UanMacCw::NotifyTxStart(ns3::Time duration) [member function]
     cls.add_method('NotifyTxStart', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/uan/model/uan-header-common.h ns-3.34/src/uan/model/uan-header-common.h
--- ns-3.33/src/uan/model/uan-header-common.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/uan/model/uan-header-common.h	2021-07-14 10:31:07.000000000 -0700
@@ -28,10 +28,15 @@
 
 namespace ns3 {
 
+/**
+ * \ingroup uan
+ *
+ *  UAN protocol descriptor
+ */
 struct UanProtocolBits
 {
-  uint8_t  m_type : 4;
-  uint8_t  m_protocolNumber : 4;
+  uint8_t  m_type : 4;            //!< type (4 bits)
+  uint8_t  m_protocolNumber : 4;  //!< protocol number (4 bits)
 };
 
 /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/uan/model/uan-mac-cw.cc ns-3.34/src/uan/model/uan-mac-cw.cc
--- ns-3.33/src/uan/model/uan-mac-cw.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/uan/model/uan-mac-cw.cc	2021-07-14 10:31:07.000000000 -0700
@@ -35,10 +35,11 @@
 
 UanMacCw::UanMacCw ()
   : UanMac (),
-    m_phy (0),
-    m_pktTx (0),
-    m_state (IDLE),
-    m_cleared (false)
+  m_phy (0),
+  m_pktTx (0),
+  m_txOngoing (false),
+  m_state (IDLE),
+  m_cleared (false)
 
 {
   m_rv = CreateObject<UniformRandomVariable> ();
@@ -63,7 +64,7 @@
       m_phy = 0;
     }
   m_sendEvent.Cancel ();
-  m_txEndEvent.Cancel ();
+  m_txOngoing = false;
 }
 
 void
@@ -115,7 +116,7 @@
     {
     case CCABUSY:
       NS_LOG_DEBUG ("Time " << Now ().As (Time::S) << " MAC " << GetAddress () << " Starting enqueue CCABUSY");
-      if (m_txEndEvent.IsRunning ())
+      if (m_txOngoing == true)
         {
           NS_LOG_DEBUG ("State is TX");
         }
@@ -254,22 +255,24 @@
 void
 UanMacCw::NotifyTxStart (Time duration)
 {
+  m_txOngoing = true;
 
-  if (m_txEndEvent.IsRunning ())
-    {
-      Simulator::Cancel (m_txEndEvent);
-    }
+  NS_LOG_DEBUG ("Time " << Now ().As (Time::S) << " Tx Start Notified");
 
-  m_txEndEvent = Simulator::Schedule (duration, &UanMacCw::EndTx, this);
-  NS_LOG_DEBUG ("Time " << Now ().As (Time::S) << " scheduling TxEndEvent with delay " << duration.As (Time::S));
   if (m_state == RUNNING)
     {
       NS_ASSERT (0);
       m_state = CCABUSY;
       SaveTimer ();
-
     }
+}
+
+void
+UanMacCw::NotifyTxEnd (void)
+{
+  m_txOngoing = false;
 
+  EndTx ();
 }
 
 int64_t
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/uan/model/uan-mac-cw.h ns-3.34/src/uan/model/uan-mac-cw.h
--- ns-3.33/src/uan/model/uan-mac-cw.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/uan/model/uan-mac-cw.h	2021-07-14 10:31:07.000000000 -0700
@@ -59,7 +59,7 @@
 
   /**
    * Set the contention window size.
-   *   
+   *
    * \param cw Contention window size.
    */
   virtual void SetCw (uint32_t cw);
@@ -96,6 +96,7 @@
   virtual void NotifyCcaStart (void);
   virtual void NotifyCcaEnd (void);
   virtual void NotifyTxStart (Time duration);
+  virtual void NotifyTxEnd (void);
 
   /**
    *  TracedCallback signature for enqueue/dequeue of a packet.
@@ -103,12 +104,12 @@
    * \param [in] packet The Packet being received.
    * \param [in] proto The protocol number.
    */
-  typedef void (* QueueTracedCallback)
-    (Ptr<const Packet> packet, uint16_t proto);
+  typedef void (* QueueTracedCallback)(Ptr<const Packet> packet, uint16_t proto);
 
 private:
   /** Enum defining possible Phy states. */
-  typedef enum {
+  typedef enum
+  {
     IDLE,     //!< Idle state.
     CCABUSY,  //!< Channel busy.
     RUNNING,  //!< Delay timer running.
@@ -141,8 +142,8 @@
   uint16_t m_pktTxProt;
   /** Scheduled SendPacket event. */
   EventId m_sendEvent;
-  /** Scheduled EndTx event. */
-  EventId m_txEndEvent;
+  /** Tx is ongoing */
+  bool m_txOngoing;
   /** Current state. */
   State m_state;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/uan/model/uan-mac.h ns-3.34/src/uan/model/uan-mac.h
--- ns-3.33/src/uan/model/uan-mac.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/uan/model/uan-mac.h	2021-07-14 10:31:07.000000000 -0700
@@ -128,7 +128,16 @@
   typedef void (* PacketModeTracedCallback)
     (Ptr<const Packet> packet, UanTxMode mode);
 
+  /**
+   * Get the Tx mode index (Modulation type).
+   * \return the Tx mode index
+   */
   uint32_t GetTxModeIndex ();
+
+  /**
+   * Set the Tx mode index (Modulation type).
+   * \param txModeIndex the Tx mode index
+   */
   void SetTxModeIndex (uint32_t txModeIndex);
 
 private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/uan/model/uan-mac-rc-gw.cc ns-3.34/src/uan/model/uan-mac-rc-gw.cc
--- ns-3.33/src/uan/model/uan-mac-rc-gw.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/uan/model/uan-mac-rc-gw.cc	2021-07-14 10:31:07.000000000 -0700
@@ -358,7 +358,7 @@
     {
       winSize = Seconds ((optA * std::exp (1.0) + 0.5) * 2.0 * 8.0 * m_rtsSize / (thAlpha * m_totalRate)) + (2 * m_maxDelta); 
     }
-  Time effWinSize = winSize - Seconds (m_rtsSize * 8 / ctlRate)  - (2 * m_maxDelta);
+  Time effWinSize = winSize - Seconds (m_rtsSize * 8.0 / ctlRate)  - (2 * m_maxDelta);
 
   // Before fast CTS/ACK(below)
   Time ctsTxTimeG = Seconds (m_ctsSizeG * 8.0 / dataRate);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/uan/model/uan-net-device.h ns-3.34/src/uan/model/uan-net-device.h
--- ns-3.33/src/uan/model/uan-net-device.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/uan/model/uan-net-device.h	2021-07-14 10:31:07.000000000 -0700
@@ -146,7 +146,17 @@
   virtual bool SupportsSendFrom (void) const;
   virtual void AddLinkChangeCallback (Callback<void> callback);
   virtual void SetAddress (Address address);
+
+  /**
+   * Get the Tx mode index (Modulation type).
+   * \return the Tx mode index
+   */
   uint32_t GetTxModeIndex ();
+
+  /**
+   * Set the Tx mode index (Modulation type).
+   * \param txModeIndex the Tx mode index
+   */
   void SetTxModeIndex (uint32_t txModeIndex);
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/uan/model/uan-phy-gen.cc ns-3.34/src/uan/model/uan-phy-gen.cc
--- ns-3.33/src/uan/model/uan-phy-gen.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/uan/model/uan-phy-gen.cc	2021-07-14 10:31:07.000000000 -0700
@@ -149,7 +149,7 @@
       if (std::abs (pit->GetAmp ()) > maxAmp)
         {
           maxAmp = std::abs (pit->GetAmp ());
-          // Modified in order to subtract delay of first tap (maxTapDelay appears to be used later in code 
+          // Modified in order to subtract delay of first tap (maxTapDelay appears to be used later in code
           // as delay from first reception, not from TX time)
           maxTapDelay = pit->GetDelay () - pdp.GetTap(0).GetDelay();
         }
@@ -157,7 +157,7 @@
 
 
   double effRxPowerDb = rxPowerDb + KpToDb (csp);
-  //It appears to be just the first elements of the sum in Parrish paper, 
+  //It appears to be just the first elements of the sum in Parrish paper,
   // "System Design Considerations for Undersea Networks: Link and Multiple Access Protocols", eq. 14
   double isiUpa = DbToKp(rxPowerDb) * pdp.SumTapsFromMaxNc (ts + clearingTime, ts); // added DpToKp()
   UanTransducer::ArrivalList::const_iterator it = arrivalList.begin ();
@@ -493,17 +493,17 @@
 /*************** UanPhyGen definition *****************/
 UanPhyGen::UanPhyGen ()
   : UanPhy (),
-    m_state (IDLE),
-    m_channel (0),
-    m_transducer (0),
-    m_device (0),
-    m_mac (0),
-    m_txPwrDb (0),
-    m_rxThreshDb (0),
-    m_ccaThreshDb (0),
-    m_pktRx (0),
-    m_pktTx (0),
-    m_cleared (false)
+  m_state (IDLE),
+  m_channel (0),
+  m_transducer (0),
+  m_device (0),
+  m_mac (0),
+  m_txPwrDb (0),
+  m_rxThreshDb (0),
+  m_ccaThreshDb (0),
+  m_pktRx (0),
+  m_pktTx (0),
+  m_cleared (false)
 {
   m_pg = CreateObject<UniformRandomVariable> ();
 
@@ -741,6 +741,8 @@
       m_state = IDLE;
     }
   UpdatePowerConsumption (IDLE);
+
+  NotifyListenersTxEnd ();
 }
 
 void
@@ -1004,13 +1006,13 @@
 UanPhyGen::SetSleepMode (bool sleep )
 {
   if (sleep )
-  {
-    m_state = SLEEP;
-    if (!m_energyCallback.IsNull ())
-      {
-        m_energyCallback (SLEEP);
-      }
-  }
+    {
+      m_state = SLEEP;
+      if (!m_energyCallback.IsNull ())
+        {
+          m_energyCallback (SLEEP);
+        }
+    }
   else if (m_state == SLEEP)
     {
       if (GetInterferenceDb ((Ptr<Packet>) 0) > m_ccaThreshDb)
@@ -1155,6 +1157,16 @@
     }
 }
 
+void
+UanPhyGen::NotifyListenersTxEnd (void)
+{
+  ListenerList::const_iterator it = m_listeners.begin ();
+  for (; it != m_listeners.end (); it++)
+    {
+      (*it)->NotifyTxEnd ();
+    }
+}
+
 uint32_t
 UanPhyGen::GetNModes (void)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/uan/model/uan-phy-gen.h ns-3.34/src/uan/model/uan-phy-gen.h
--- ns-3.33/src/uan/model/uan-phy-gen.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/uan/model/uan-phy-gen.h	2021-07-14 10:31:07.000000000 -0700
@@ -215,10 +215,10 @@
  * clearing time between symbols transmitted on the same frequency.
  * This clearing time combats ISI from channel delay spread and also has
  * a byproduct of possibly reducing interference from other transmitted packets.
- * 
- * Thanks to Randall Plate for the latest model revision based on the following 
+ *
+ * Thanks to Randall Plate for the latest model revision based on the following
  * papers:
- * <ul> 
+ * <ul>
  * <li>Parrish, "System Design Considerations for Undersea Networks: Link and Multiple Access Protocols"
  * <li>Siderius, "Effects of Ocean Thermocline Variability on Noncoherent Underwater Acoustic Communications"
  * <li>Rao, "Channel Coding Techniques for Wireless Communications", ch 2
@@ -442,6 +442,10 @@
    * \param duration Duration of transmission.
    */
   void NotifyListenersTxStart (Time duration);
+  /**
+   * Call UanListener::NotifyTxEnd on all listeners.
+   */
+  void NotifyListenersTxEnd (void);
 
 protected:
   virtual void DoDispose ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/uan/model/uan-phy.h ns-3.34/src/uan/model/uan-phy.h
--- ns-3.33/src/uan/model/uan-phy.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/uan/model/uan-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -96,7 +96,7 @@
 
 protected:
   virtual void DoDispose (void);
-  
+
 };  // class UanPhyCalcSinr
 
 /**
@@ -147,7 +147,9 @@
 {
 public:
   /** Default destructor */
-  virtual ~UanPhyListener () { }
+  virtual ~UanPhyListener ()
+  {
+  }
   /** Called when UanPhy begins receiving packet. */
   virtual void NotifyRxStart (void) = 0;
   /** Called when UanPhy finishes receiving packet without error. */
@@ -164,7 +166,8 @@
    * \param duration Duration of transmission.
    */
   virtual void NotifyTxStart (Time duration) = 0;
-
+  /** Function called when Phy object finishes transmitting packet */
+  virtual void NotifyTxEnd (void) = 0;
 };  // class UanPhyListener
 
 /**
@@ -210,13 +213,12 @@
    * \param [in] sinr The SINR.
    * \param [in] mode The channel mode.
    */
-  typedef void (* TracedCallback)
-    (Ptr<const Packet> pkt, double sinr, UanTxMode mode);
+  typedef void (* TracedCallback)(Ptr<const Packet> pkt, double sinr, UanTxMode mode);
+
 
-  
   /**
-   * Set the DeviceEnergyModel callback for UanPhy device. 
-   * 
+   * Set the DeviceEnergyModel callback for UanPhy device.
+   *
    * \param callback The DeviceEnergyModel change state callback.
    */
   virtual void SetEnergyModelCallback (DeviceEnergyModel::ChangeStateCallback callback) = 0;
@@ -487,14 +489,14 @@
    */
   void NotifyRxDrop (Ptr<const Packet> packet);
 
- /**
-  * Assign a fixed random variable stream number to the random variables
-  * used by this model.  Return the number of streams (possibly zero) that
-  * have been assigned.
-  *
-  * \param stream First stream index to use.
-  * \return The number of stream indices assigned by this model.
-  */
+  /**
+   * Assign a fixed random variable stream number to the random variables
+   * used by this model.  Return the number of streams (possibly zero) that
+   * have been assigned.
+   *
+   * \param stream First stream index to use.
+   * \return The number of stream indices assigned by this model.
+   */
   virtual int64_t AssignStreams (int64_t stream) = 0;
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py ns-3.34/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -71,12 +71,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -350,8 +354,10 @@
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1166,6 +1172,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1379,6 +1397,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1454,6 +1477,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1474,6 +1509,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/virtual-net-device/bindings/modulegen__gcc_LP64.py ns-3.34/src/virtual-net-device/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/virtual-net-device/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/virtual-net-device/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -71,12 +71,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -350,8 +354,10 @@
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -1166,6 +1172,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1379,6 +1397,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1454,6 +1477,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1474,6 +1509,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/visualizer/bindings/modulegen__gcc_ILP32.py ns-3.34/src/visualizer/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/visualizer/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/visualizer/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -20,6 +20,8 @@
 def register_types(module):
     root_module = module.get_root()
     
+    ## log.h (module 'core'): ns3::LogLevel [enumeration]
+    module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
     module.add_class('Address', import_from_module='ns.network')
     ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
@@ -81,6 +83,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -91,8 +95,15 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## log.h (module 'core'): ns3::LogComponent [class]
+    module.add_class('LogComponent', import_from_module='ns.core')
+    typehandlers.add_type_alias('std::map< std::string, ns3::LogComponent * >', 'ns3::LogComponent::ComponentList')
+    typehandlers.add_type_alias('std::map< std::string, ns3::LogComponent * >*', 'ns3::LogComponent::ComponentList*')
+    typehandlers.add_type_alias('std::map< std::string, ns3::LogComponent * >&', 'ns3::LogComponent::ComponentList&')
     ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
     module.add_class('Mac48Address', import_from_module='ns.network')
     typehandlers.add_type_alias('void ( * ) ( ns3::Mac48Address )', 'ns3::Mac48Address::TracedCallback')
@@ -105,7 +116,7 @@
     ## mac8-address.h (module 'network'): ns3::Mac8Address [class]
     root_module['ns3::Mac8Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
-    module.add_class('ObjectBase', import_from_module='ns.core', allow_subclassing=True)
+    module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
     module.add_class('ObjectDeleter', import_from_module='ns.core')
     ## object-factory.h (module 'core'): ns3::ObjectFactory [class]
@@ -126,6 +137,8 @@
     module.add_class('PacketTagList', import_from_module='ns.network')
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData [struct]
     module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
+    ## log.h (module 'core'): ns3::ParameterLogger [class]
+    module.add_class('ParameterLogger', import_from_module='ns.core')
     ## pyviz.h (module 'visualizer'): ns3::PyViz [class]
     module.add_class('PyViz')
     ## pyviz.h (module 'visualizer'): ns3::PyViz::PacketCaptureMode [enumeration]
@@ -143,11 +156,11 @@
     ## pyviz.h (module 'visualizer'): ns3::PyViz::PacketSample [struct]
     module.add_class('PacketSample', outer_class=root_module['ns3::PyViz'])
     ## pyviz.h (module 'visualizer'): ns3::PyViz::RxPacketSample [struct]
-    module.add_class('RxPacketSample', parent=root_module['ns3::PyViz::PacketSample'], outer_class=root_module['ns3::PyViz'])
+    module.add_class('RxPacketSample', outer_class=root_module['ns3::PyViz'], parent=root_module['ns3::PyViz::PacketSample'])
     ## pyviz.h (module 'visualizer'): ns3::PyViz::TransmissionSample [struct]
     module.add_class('TransmissionSample', outer_class=root_module['ns3::PyViz'])
     ## pyviz.h (module 'visualizer'): ns3::PyViz::TxPacketSample [struct]
-    module.add_class('TxPacketSample', parent=root_module['ns3::PyViz::PacketSample'], outer_class=root_module['ns3::PyViz'])
+    module.add_class('TxPacketSample', outer_class=root_module['ns3::PyViz'], parent=root_module['ns3::PyViz::PacketSample'])
     typehandlers.add_type_alias('std::vector< ns3::PyViz::TransmissionSample >', 'ns3::PyViz::TransmissionSampleList')
     typehandlers.add_type_alias('std::vector< ns3::PyViz::TransmissionSample >*', 'ns3::PyViz::TransmissionSampleList*')
     typehandlers.add_type_alias('std::vector< ns3::PyViz::TransmissionSample >&', 'ns3::PyViz::TransmissionSampleList&')
@@ -155,15 +168,22 @@
     typehandlers.add_type_alias('std::vector< ns3::PyViz::PacketDropSample >*', 'ns3::PyViz::PacketDropSampleList*')
     typehandlers.add_type_alias('std::vector< ns3::PyViz::PacketDropSample >&', 'ns3::PyViz::PacketDropSampleList&')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::ObjectBase'], template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::ObjectBase'], template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'])
     ## simulator.h (module 'core'): ns3::Simulator [class]
-    module.add_class('Simulator', import_from_module='ns.core', destructor_visibility='private')
+    module.add_class('Simulator', destructor_visibility='private', import_from_module='ns.core')
     ## simulator.h (module 'core'): ns3::Simulator [enumeration]
     module.add_enum('', ['NO_CONTEXT'], outer_class=root_module['ns3::Simulator'], import_from_module='ns.core')
     ## tag.h (module 'network'): ns3::Tag [class]
     module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
     module.add_class('TagBuffer', import_from_module='ns.network')
+    ## nstime.h (module 'core'): ns3::Time [class]
+    module.add_class('Time', import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST', 'AUTO'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time )', 'ns3::Time::TracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time )*', 'ns3::Time::TracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time )&', 'ns3::Time::TracedCallback&')
     ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
     module.add_class('TimeWithUnit', import_from_module='ns.core')
     ## type-id.h (module 'core'): ns3::TypeId [class]
@@ -200,29 +220,29 @@
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## socket.h (module 'network'): ns3::Socket::SocketErrno [enumeration]
@@ -245,15 +265,6 @@
     module.add_class('SocketPriorityTag', import_from_module='ns.network', parent=root_module['ns3::Tag'])
     ## socket.h (module 'network'): ns3::SocketSetDontFragmentTag [class]
     module.add_class('SocketSetDontFragmentTag', import_from_module='ns.network', parent=root_module['ns3::Tag'])
-    ## nstime.h (module 'core'): ns3::Time [class]
-    module.add_class('Time', import_from_module='ns.core')
-    ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time )', 'ns3::Time::TracedCallback')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time )*', 'ns3::Time::TracedCallback*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time )&', 'ns3::Time::TracedCallback&')
-    ## nstime.h (module 'core'): ns3::Time [class]
-    root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
     ## trailer.h (module 'network'): ns3::Trailer [class]
@@ -261,9 +272,9 @@
     ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
     module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     ## attribute.h (module 'core'): ns3::AttributeChecker [class]
-    module.add_class('AttributeChecker', import_from_module='ns.core', automatic_type_narrowing=True, allow_subclassing=False, parent=root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    module.add_class('AttributeChecker', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
     ## attribute.h (module 'core'): ns3::AttributeValue [class]
-    module.add_class('AttributeValue', import_from_module='ns.core', automatic_type_narrowing=True, allow_subclassing=False, parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     ## callback.h (module 'core'): ns3::CallbackChecker [class]
     module.add_class('CallbackChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## callback.h (module 'core'): ns3::CallbackImplBase [class]
@@ -412,20 +423,27 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::set< ns3::TypeId >', 'ns3::TypeId', container_type='set')
+    module.add_container('std::vector< ns3::PyViz::RxPacketSample >', 'ns3::PyViz::RxPacketSample', container_type='vector')
+    module.add_container('std::vector< ns3::PyViz::TxPacketSample >', 'ns3::PyViz::TxPacketSample', container_type='vector')
+    module.add_container('std::vector< ns3::PyViz::PacketSample >', 'ns3::PyViz::PacketSample', container_type='vector')
     module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
     module.add_container('std::vector< ns3::PyViz::TransmissionSample >', 'ns3::PyViz::TransmissionSample', container_type='vector')
     module.add_container('ns3::PyViz::TransmissionSampleList', 'ns3::PyViz::TransmissionSample', container_type='vector')
     module.add_container('std::vector< ns3::PyViz::PacketDropSample >', 'ns3::PyViz::PacketDropSample', container_type='vector')
     module.add_container('ns3::PyViz::PacketDropSampleList', 'ns3::PyViz::PacketDropSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::RxPacketSample >', 'ns3::PyViz::RxPacketSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::TxPacketSample >', 'ns3::PyViz::TxPacketSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::PacketSample >', 'ns3::PyViz::PacketSample', container_type='vector')
     module.add_container('std::set< unsigned int >', 'unsigned int', container_type='set')
     module.add_container('std::vector< ns3::PyViz::NetDeviceStatistics >', 'ns3::PyViz::NetDeviceStatistics', container_type='vector')
     module.add_container('std::vector< ns3::PyViz::NodeStatistics >', 'ns3::PyViz::NodeStatistics', container_type='vector')
-    module.add_container('std::set< ns3::TypeId >', 'ns3::TypeId', container_type='set')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::NodePrinter')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::NodePrinter*')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::NodePrinter&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -512,10 +530,13 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -528,6 +549,7 @@
     register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
     register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
     register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
+    register_Ns3ParameterLogger_methods(root_module, root_module['ns3::ParameterLogger'])
     register_Ns3PyViz_methods(root_module, root_module['ns3::PyViz'])
     register_Ns3PyVizLastPacketsSample_methods(root_module, root_module['ns3::PyViz::LastPacketsSample'])
     register_Ns3PyVizNetDeviceStatistics_methods(root_module, root_module['ns3::PyViz::NetDeviceStatistics'])
@@ -542,6 +564,7 @@
     register_Ns3Simulator_methods(root_module, root_module['ns3::Simulator'])
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
+    register_Ns3Time_methods(root_module, root_module['ns3::Time'])
     register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
@@ -572,7 +595,6 @@
     register_Ns3SocketIpv6TclassTag_methods(root_module, root_module['ns3::SocketIpv6TclassTag'])
     register_Ns3SocketPriorityTag_methods(root_module, root_module['ns3::SocketPriorityTag'])
     register_Ns3SocketSetDontFragmentTag_methods(root_module, root_module['ns3::SocketSetDontFragmentTag'])
-    register_Ns3Time_methods(root_module, root_module['ns3::Time'])
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
     register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
@@ -1048,10 +1070,24 @@
                    'ns3::ByteTagList::Iterator', 
                    [param('int32_t', 'offsetStart'), param('int32_t', 'offsetEnd')], 
                    is_const=True)
+    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::RemoveAll() [member function]
     cls.add_method('RemoveAll', 
                    'void', 
                    [])
+    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
     return
 
 def register_Ns3ByteTagListIterator_methods(root_module, cls):
@@ -1257,6 +1293,10 @@
                    'ns3::EventImpl *', 
                    [], 
                    is_const=True)
+    ## event-id.h (module 'core'): void ns3::EventId::Remove() [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [])
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -1455,7 +1495,12 @@
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ipv4Address const &', 'other')], 
-                   is_const=True, deprecated=True)
+                   deprecated=True, is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
+    cls.add_method('IsInitialized', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsLocalMulticast() const [member function]
     cls.add_method('IsLocalMulticast', 
                    'bool', 
@@ -1501,6 +1546,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1608,7 +1665,7 @@
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ipv4Mask', 'other')], 
-                   is_const=True, deprecated=True)
+                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsMatch(ns3::Ipv4Address a, ns3::Ipv4Address b) const [member function]
     cls.add_method('IsMatch', 
                    'bool', 
@@ -1729,7 +1786,12 @@
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
-                   is_const=True, deprecated=True)
+                   deprecated=True, is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
+    cls.add_method('IsInitialized', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
@@ -1770,6 +1832,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1845,6 +1912,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1865,6 +1944,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -1899,7 +1983,7 @@
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ipv6Prefix const &', 'other')], 
-                   is_const=True, deprecated=True)
+                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsMatch(ns3::Ipv6Address a, ns3::Ipv6Address b) const [member function]
     cls.add_method('IsMatch', 
                    'bool', 
@@ -1916,6 +2000,55 @@
                    [param('uint8_t', 'prefixLength')])
     return
 
+def register_Ns3LogComponent_methods(root_module, cls):
+    ## log.h (module 'core'): ns3::LogComponent::LogComponent(ns3::LogComponent const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LogComponent const &', 'arg0')])
+    ## log.h (module 'core'): ns3::LogComponent::LogComponent(std::string const & name, std::string const & file, ns3::LogLevel const mask=::ns3::LogLevel::LOG_NONE) [constructor]
+    cls.add_constructor([param('std::string const &', 'name'), param('std::string const &', 'file'), param('ns3::LogLevel const', 'mask', default_value='::ns3::LogLevel::LOG_NONE')])
+    ## log.h (module 'core'): void ns3::LogComponent::Disable(ns3::LogLevel const level) [member function]
+    cls.add_method('Disable', 
+                   'void', 
+                   [param('ns3::LogLevel const', 'level')])
+    ## log.h (module 'core'): void ns3::LogComponent::Enable(ns3::LogLevel const level) [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [param('ns3::LogLevel const', 'level')])
+    ## log.h (module 'core'): std::string ns3::LogComponent::File() const [member function]
+    cls.add_method('File', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## log.h (module 'core'): static ns3::LogComponent::ComponentList * ns3::LogComponent::GetComponentList() [member function]
+    cls.add_method('GetComponentList', 
+                   'ns3::LogComponent::ComponentList *', 
+                   [], 
+                   is_static=True)
+    ## log.h (module 'core'): static std::string ns3::LogComponent::GetLevelLabel(ns3::LogLevel const level) [member function]
+    cls.add_method('GetLevelLabel', 
+                   'std::string', 
+                   [param('ns3::LogLevel const', 'level')], 
+                   is_static=True)
+    ## log.h (module 'core'): bool ns3::LogComponent::IsEnabled(ns3::LogLevel const level) const [member function]
+    cls.add_method('IsEnabled', 
+                   'bool', 
+                   [param('ns3::LogLevel const', 'level')], 
+                   is_const=True)
+    ## log.h (module 'core'): bool ns3::LogComponent::IsNoneEnabled() const [member function]
+    cls.add_method('IsNoneEnabled', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## log.h (module 'core'): char const * ns3::LogComponent::Name() const [member function]
+    cls.add_method('Name', 
+                   'char const *', 
+                   [], 
+                   is_const=True)
+    ## log.h (module 'core'): void ns3::LogComponent::SetMask(ns3::LogLevel const level) [member function]
+    cls.add_method('SetMask', 
+                   'void', 
+                   [param('ns3::LogLevel const', 'level')])
+    return
+
 def register_Ns3Mac48Address_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('!=')
@@ -2049,7 +2182,7 @@
     cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## object-base.h (module 'core'): static ns3::TypeId ns3::ObjectBase::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -2109,8 +2242,6 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
-    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string typeId) [constructor]
-    cls.add_constructor([param('std::string', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -2126,10 +2257,10 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## object-factory.h (module 'core'): void ns3::ObjectFactory::Set(std::string name, ns3::AttributeValue const & value) [member function]
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::Set() [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+                   [])
     ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(ns3::TypeId tid) [member function]
     cls.add_method('SetTypeId', 
                    'void', 
@@ -2298,6 +2429,15 @@
                    'void', 
                    [param('ns3::Tag const &', 'tag')], 
                    is_const=True)
+    ## packet-tag-list.h (module 'network'): uint32_t ns3::PacketTagList::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet-tag-list.h (module 'network'): uint32_t ns3::PacketTagList::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData const * ns3::PacketTagList::Head() const [member function]
     cls.add_method('Head', 
                    'ns3::PacketTagList::TagData const *', 
@@ -2320,6 +2460,11 @@
     cls.add_method('Replace', 
                    'bool', 
                    [param('ns3::Tag &', 'tag')])
+    ## packet-tag-list.h (module 'network'): uint32_t ns3::PacketTagList::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
     return
 
 def register_Ns3PacketTagListTagData_methods(root_module, cls):
@@ -2339,6 +2484,13 @@
     cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
     return
 
+def register_Ns3ParameterLogger_methods(root_module, cls):
+    ## log.h (module 'core'): ns3::ParameterLogger::ParameterLogger(ns3::ParameterLogger const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ParameterLogger const &', 'arg0')])
+    ## log.h (module 'core'): ns3::ParameterLogger::ParameterLogger(std::ostream & os) [constructor]
+    cls.add_constructor([param('std::ostream &', 'os')])
+    return
+
 def register_Ns3PyViz_methods(root_module, cls):
     ## pyviz.h (module 'visualizer'): ns3::PyViz::PyViz(ns3::PyViz const & arg0) [constructor]
     cls.add_constructor([param('ns3::PyViz const &', 'arg0')])
@@ -2619,12 +2771,12 @@
     cls.add_method('Deserialize', 
                    'void', 
                    [param('ns3::TagBuffer', 'i')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## tag.h (module 'network'): uint32_t ns3::Tag::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## tag.h (module 'network'): static ns3::TypeId ns3::Tag::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -2634,12 +2786,12 @@
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## tag.h (module 'network'): void ns3::Tag::Serialize(ns3::TagBuffer i) const [member function]
     cls.add_method('Serialize', 
                    'void', 
                    [param('ns3::TagBuffer', 'i')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3TagBuffer_methods(root_module, cls):
@@ -2705,6 +2857,210 @@
                    [param('uint8_t', 'v')])
     return
 
+def register_Ns3Time_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('>=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
+    cls.add_output_stream_operator()
+    ## nstime.h (module 'core'): ns3::Time::Time() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::Time const & o) [constructor]
+    cls.add_constructor([param('ns3::Time const &', 'o')])
+    ## nstime.h (module 'core'): ns3::Time::Time(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & v) [constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(std::string const & s) [constructor]
+    cls.add_constructor([param('std::string const &', 's')])
+    ## nstime.h (module 'core'): ns3::TimeWithUnit ns3::Time::As(ns3::Time::Unit const unit=::ns3::Time::Unit::AUTO) const [member function]
+    cls.add_method('As', 
+                   'ns3::TimeWithUnit', 
+                   [param('ns3::Time::Unit const', 'unit', default_value='::ns3::Time::Unit::AUTO')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int ns3::Time::Compare(ns3::Time const & o) const [member function]
+    cls.add_method('Compare', 
+                   'int', 
+                   [param('ns3::Time const &', 'o')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'value')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value, ns3::Time::Unit unit) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'value'), param('ns3::Time::Unit', 'unit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit unit) [member function]
+    cls.add_method('FromDouble', 
+                   'ns3::Time', 
+                   [param('double', 'value'), param('ns3::Time::Unit', 'unit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit unit) [member function]
+    cls.add_method('FromInteger', 
+                   'ns3::Time', 
+                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'unit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetFemtoSeconds() const [member function]
+    cls.add_method('GetFemtoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
+    cls.add_method('GetInteger', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMicroSeconds() const [member function]
+    cls.add_method('GetMicroSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMilliSeconds() const [member function]
+    cls.add_method('GetMilliSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
+    cls.add_method('GetNanoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetPicoSeconds() const [member function]
+    cls.add_method('GetPicoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time::Unit ns3::Time::GetResolution() [member function]
+    cls.add_method('GetResolution', 
+                   'ns3::Time::Unit', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetSeconds() const [member function]
+    cls.add_method('GetSeconds', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetTimeStep() const [member function]
+    cls.add_method('GetTimeStep', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
+    cls.add_method('IsNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsPositive() const [member function]
+    cls.add_method('IsPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyNegative() const [member function]
+    cls.add_method('IsStrictlyNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyPositive() const [member function]
+    cls.add_method('IsStrictlyPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsZero() const [member function]
+    cls.add_method('IsZero', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Max() [member function]
+    cls.add_method('Max', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Min() [member function]
+    cls.add_method('Min', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): ns3::Time ns3::Time::RoundTo(ns3::Time::Unit unit) const [member function]
+    cls.add_method('RoundTo', 
+                   'ns3::Time', 
+                   [param('ns3::Time::Unit', 'unit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static void ns3::Time::SetResolution(ns3::Time::Unit resolution) [member function]
+    cls.add_method('SetResolution', 
+                   'void', 
+                   [param('ns3::Time::Unit', 'resolution')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static bool ns3::Time::StaticInit() [member function]
+    cls.add_method('StaticInit', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit unit) const [member function]
+    cls.add_method('To', 
+                   'ns3::int64x64_t', 
+                   [param('ns3::Time::Unit', 'unit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit unit) const [member function]
+    cls.add_method('ToDouble', 
+                   'double', 
+                   [param('ns3::Time::Unit', 'unit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit unit) const [member function]
+    cls.add_method('ToInteger', 
+                   'int64_t', 
+                   [param('ns3::Time::Unit', 'unit')], 
+                   is_const=True)
+    return
+
 def register_Ns3TimeWithUnit_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## nstime.h (module 'core'): ns3::TimeWithUnit::TimeWithUnit(ns3::TimeWithUnit const & arg0) [constructor]
@@ -2982,6 +3338,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## int64x64-128.h (module 'core'): int64_t ns3::int64x64_t::GetInt() const [member function]
+    cls.add_method('GetInt', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
     ## int64x64-128.h (module 'core'): uint64_t ns3::int64x64_t::GetLow() const [member function]
     cls.add_method('GetLow', 
                    'uint64_t', 
@@ -2996,6 +3357,11 @@
     cls.add_method('MulByInvert', 
                    'void', 
                    [param('ns3::int64x64_t const &', 'o')])
+    ## int64x64-128.h (module 'core'): int64_t ns3::int64x64_t::Round() const [member function]
+    cls.add_method('Round', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::implementation [variable]
     cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
     return
@@ -3009,7 +3375,7 @@
     cls.add_method('Deserialize', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## chunk.h (module 'network'): uint32_t ns3::Chunk::Deserialize(ns3::Buffer::Iterator start, ns3::Buffer::Iterator end) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -3024,7 +3390,7 @@
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3Header_methods(root_module, cls):
@@ -3037,12 +3403,12 @@
     cls.add_method('Deserialize', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## header.h (module 'network'): uint32_t ns3::Header::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## header.h (module 'network'): static ns3::TypeId ns3::Header::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -3052,12 +3418,12 @@
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## header.h (module 'network'): void ns3::Header::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3Ipv4Header_methods(root_module, cls):
@@ -3257,12 +3623,12 @@
     cls.add_method('GetObject', 
                    'ns3::Ptr< ns3::Object >', 
                    [], 
-                   is_const=True, template_parameters=['ns3::Object'], custom_template_method_name='GetObject')
+                   custom_template_method_name='GetObject', is_const=True, template_parameters=['ns3::Object'])
     ## object.h (module 'core'): ns3::Ptr<ns3::Object> ns3::Object::GetObject(ns3::TypeId tid) const [member function]
     cls.add_method('GetObject', 
                    'ns3::Ptr< ns3::Object >', 
                    [param('ns3::TypeId', 'tid')], 
-                   is_const=True, template_parameters=['ns3::Object'], custom_template_method_name='GetObject')
+                   custom_template_method_name='GetObject', is_const=True, template_parameters=['ns3::Object'])
     ## object.h (module 'core'): static ns3::TypeId ns3::Object::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -3406,17 +3772,17 @@
     cls.add_method('Bind', 
                    'int', 
                    [param('ns3::Address const &', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::Bind() [member function]
     cls.add_method('Bind', 
                    'int', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::Bind6() [member function]
     cls.add_method('Bind6', 
                    'int', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): void ns3::Socket::BindToNetDevice(ns3::Ptr<ns3::NetDevice> netdevice) [member function]
     cls.add_method('BindToNetDevice', 
                    'void', 
@@ -3426,12 +3792,12 @@
     cls.add_method('Close', 
                    'int', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::Connect(ns3::Address const & address) [member function]
     cls.add_method('Connect', 
                    'int', 
                    [param('ns3::Address const &', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): static ns3::Ptr<ns3::Socket> ns3::Socket::CreateSocket(ns3::Ptr<ns3::Node> node, ns3::TypeId tid) [member function]
     cls.add_method('CreateSocket', 
                    'ns3::Ptr< ns3::Socket >', 
@@ -3441,7 +3807,7 @@
     cls.add_method('GetAllowBroadcast', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Socket::GetBoundNetDevice() [member function]
     cls.add_method('GetBoundNetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -3450,7 +3816,7 @@
     cls.add_method('GetErrno', 
                    'ns3::Socket::SocketErrno', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): uint8_t ns3::Socket::GetIpTos() const [member function]
     cls.add_method('GetIpTos', 
                    'uint8_t', 
@@ -3475,12 +3841,12 @@
     cls.add_method('GetNode', 
                    'ns3::Ptr< ns3::Node >', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::GetPeerName(ns3::Address & address) const [member function]
     cls.add_method('GetPeerName', 
                    'int', 
                    [param('ns3::Address &', 'address')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): uint8_t ns3::Socket::GetPriority() const [member function]
     cls.add_method('GetPriority', 
                    'uint8_t', 
@@ -3490,22 +3856,22 @@
     cls.add_method('GetRxAvailable', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::GetSockName(ns3::Address & address) const [member function]
     cls.add_method('GetSockName', 
                    'int', 
                    [param('ns3::Address &', 'address')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): ns3::Socket::SocketType ns3::Socket::GetSocketType() const [member function]
     cls.add_method('GetSocketType', 
                    'ns3::Socket::SocketType', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): uint32_t ns3::Socket::GetTxAvailable() const [member function]
     cls.add_method('GetTxAvailable', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): static ns3::TypeId ns3::Socket::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -3560,12 +3926,12 @@
     cls.add_method('Listen', 
                    'int', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Socket::Recv(uint32_t maxSize, uint32_t flags) [member function]
     cls.add_method('Recv', 
                    'ns3::Ptr< ns3::Packet >', 
                    [param('uint32_t', 'maxSize'), param('uint32_t', 'flags')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Socket::Recv() [member function]
     cls.add_method('Recv', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -3578,7 +3944,7 @@
     cls.add_method('RecvFrom', 
                    'ns3::Ptr< ns3::Packet >', 
                    [param('uint32_t', 'maxSize'), param('uint32_t', 'flags'), param('ns3::Address &', 'fromAddress')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Socket::RecvFrom(ns3::Address & fromAddress) [member function]
     cls.add_method('RecvFrom', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -3591,7 +3957,7 @@
     cls.add_method('Send', 
                    'int', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint32_t', 'flags')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::Send(ns3::Ptr<ns3::Packet> p) [member function]
     cls.add_method('Send', 
                    'int', 
@@ -3604,7 +3970,7 @@
     cls.add_method('SendTo', 
                    'int', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint32_t', 'flags'), param('ns3::Address const &', 'toAddress')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::SendTo(uint8_t const * buf, uint32_t size, uint32_t flags, ns3::Address const & address) [member function]
     cls.add_method('SendTo', 
                    'int', 
@@ -3617,7 +3983,7 @@
     cls.add_method('SetAllowBroadcast', 
                    'bool', 
                    [param('bool', 'allowBroadcast')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): void ns3::Socket::SetCloseCallbacks(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> normalClose, ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> errorClose) [member function]
     cls.add_method('SetCloseCallbacks', 
                    'void', 
@@ -3668,10 +4034,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -3684,12 +4050,12 @@
     cls.add_method('ShutdownRecv', 
                    'int', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::ShutdownSend() [member function]
     cls.add_method('ShutdownSend', 
                    'int', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): void ns3::Socket::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -4037,207 +4403,6 @@
                    is_const=True, is_virtual=True)
     return
 
-def register_Ns3Time_methods(root_module, cls):
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('!=')
-    cls.add_binary_comparison_operator('<=')
-    cls.add_binary_comparison_operator('>=')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::Time'], root_module['ns3::Time'], param('int64_t const &', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::int64x64_t const &', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::Time'], root_module['ns3::Time'], param('int64_t const &', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
-    cls.add_output_stream_operator()
-    ## nstime.h (module 'core'): ns3::Time::Time() [constructor]
-    cls.add_constructor([])
-    ## nstime.h (module 'core'): ns3::Time::Time(ns3::Time const & o) [constructor]
-    cls.add_constructor([param('ns3::Time const &', 'o')])
-    ## nstime.h (module 'core'): ns3::Time::Time(double v) [constructor]
-    cls.add_constructor([param('double', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(int v) [constructor]
-    cls.add_constructor([param('int', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(long int v) [constructor]
-    cls.add_constructor([param('long int', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(long long int v) [constructor]
-    cls.add_constructor([param('long long int', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(unsigned int v) [constructor]
-    cls.add_constructor([param('unsigned int', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(long unsigned int v) [constructor]
-    cls.add_constructor([param('long unsigned int', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(long long unsigned int v) [constructor]
-    cls.add_constructor([param('long long unsigned int', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & v) [constructor]
-    cls.add_constructor([param('ns3::int64x64_t const &', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(std::string const & s) [constructor]
-    cls.add_constructor([param('std::string const &', 's')])
-    ## nstime.h (module 'core'): ns3::TimeWithUnit ns3::Time::As(ns3::Time::Unit const unit) const [member function]
-    cls.add_method('As', 
-                   'ns3::TimeWithUnit', 
-                   [param('ns3::Time::Unit const', 'unit')], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int ns3::Time::Compare(ns3::Time const & o) const [member function]
-    cls.add_method('Compare', 
-                   'int', 
-                   [param('ns3::Time const &', 'o')], 
-                   is_const=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
-    cls.add_method('From', 
-                   'ns3::Time', 
-                   [param('ns3::int64x64_t const &', 'value')], 
-                   is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value, ns3::Time::Unit unit) [member function]
-    cls.add_method('From', 
-                   'ns3::Time', 
-                   [param('ns3::int64x64_t const &', 'value'), param('ns3::Time::Unit', 'unit')], 
-                   is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit unit) [member function]
-    cls.add_method('FromDouble', 
-                   'ns3::Time', 
-                   [param('double', 'value'), param('ns3::Time::Unit', 'unit')], 
-                   is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit unit) [member function]
-    cls.add_method('FromInteger', 
-                   'ns3::Time', 
-                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'unit')], 
-                   is_static=True)
-    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
-    cls.add_method('GetDays', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
-    cls.add_method('GetDouble', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetFemtoSeconds() const [member function]
-    cls.add_method('GetFemtoSeconds', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
-    cls.add_method('GetHours', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
-    cls.add_method('GetInteger', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetMicroSeconds() const [member function]
-    cls.add_method('GetMicroSeconds', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetMilliSeconds() const [member function]
-    cls.add_method('GetMilliSeconds', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
-    cls.add_method('GetMinutes', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
-    cls.add_method('GetNanoSeconds', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetPicoSeconds() const [member function]
-    cls.add_method('GetPicoSeconds', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): static ns3::Time::Unit ns3::Time::GetResolution() [member function]
-    cls.add_method('GetResolution', 
-                   'ns3::Time::Unit', 
-                   [], 
-                   is_static=True)
-    ## nstime.h (module 'core'): double ns3::Time::GetSeconds() const [member function]
-    cls.add_method('GetSeconds', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetTimeStep() const [member function]
-    cls.add_method('GetTimeStep', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
-    cls.add_method('GetYears', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
-    cls.add_method('IsNegative', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): bool ns3::Time::IsPositive() const [member function]
-    cls.add_method('IsPositive', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyNegative() const [member function]
-    cls.add_method('IsStrictlyNegative', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyPositive() const [member function]
-    cls.add_method('IsStrictlyPositive', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): bool ns3::Time::IsZero() const [member function]
-    cls.add_method('IsZero', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Max() [member function]
-    cls.add_method('Max', 
-                   'ns3::Time', 
-                   [], 
-                   is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Min() [member function]
-    cls.add_method('Min', 
-                   'ns3::Time', 
-                   [], 
-                   is_static=True)
-    ## nstime.h (module 'core'): static void ns3::Time::SetResolution(ns3::Time::Unit resolution) [member function]
-    cls.add_method('SetResolution', 
-                   'void', 
-                   [param('ns3::Time::Unit', 'resolution')], 
-                   is_static=True)
-    ## nstime.h (module 'core'): static bool ns3::Time::StaticInit() [member function]
-    cls.add_method('StaticInit', 
-                   'bool', 
-                   [], 
-                   is_static=True)
-    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit unit) const [member function]
-    cls.add_method('To', 
-                   'ns3::int64x64_t', 
-                   [param('ns3::Time::Unit', 'unit')], 
-                   is_const=True)
-    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit unit) const [member function]
-    cls.add_method('ToDouble', 
-                   'double', 
-                   [param('ns3::Time::Unit', 'unit')], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit unit) const [member function]
-    cls.add_method('ToInteger', 
-                   'int64_t', 
-                   [param('ns3::Time::Unit', 'unit')], 
-                   is_const=True)
-    return
-
 def register_Ns3TraceSourceAccessor_methods(root_module, cls):
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor(ns3::TraceSourceAccessor const & arg0) [constructor]
     cls.add_constructor([param('ns3::TraceSourceAccessor const &', 'arg0')])
@@ -4247,22 +4412,22 @@
     cls.add_method('Connect', 
                    'bool', 
                    [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::ConnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
     cls.add_method('ConnectWithoutContext', 
                    'bool', 
                    [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Disconnect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
     cls.add_method('Disconnect', 
                    'bool', 
                    [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::DisconnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
     cls.add_method('DisconnectWithoutContext', 
                    'bool', 
                    [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3Trailer_methods(root_module, cls):
@@ -4275,7 +4440,7 @@
     cls.add_method('Deserialize', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'end')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## trailer.h (module 'network'): uint32_t ns3::Trailer::Deserialize(ns3::Buffer::Iterator start, ns3::Buffer::Iterator end) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -4285,7 +4450,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## trailer.h (module 'network'): static ns3::TypeId ns3::Trailer::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -4295,12 +4460,12 @@
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## trailer.h (module 'network'): void ns3::Trailer::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3AttributeAccessor_methods(root_module, cls):
@@ -4312,22 +4477,22 @@
     cls.add_method('Get', 
                    'bool', 
                    [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasGetter() const [member function]
     cls.add_method('HasGetter', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasSetter() const [member function]
     cls.add_method('HasSetter', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
     cls.add_method('Set', 
                    'bool', 
                    [param('ns3::ObjectBase *', 'object', transfer_ownership=False), param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3AttributeChecker_methods(root_module, cls):
@@ -4339,17 +4504,17 @@
     cls.add_method('Check', 
                    'bool', 
                    [param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): bool ns3::AttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
     cls.add_method('Copy', 
                    'bool', 
                    [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::CreateValidValue(ns3::AttributeValue const & value) const [member function]
     cls.add_method('CreateValidValue', 
                    'ns3::Ptr< ns3::AttributeValue >', 
@@ -4359,17 +4524,17 @@
     cls.add_method('GetUnderlyingTypeInformation', 
                    'std::string', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetValueTypeName() const [member function]
     cls.add_method('GetValueTypeName', 
                    'std::string', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): bool ns3::AttributeChecker::HasUnderlyingTypeInformation() const [member function]
     cls.add_method('HasUnderlyingTypeInformation', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3AttributeValue_methods(root_module, cls):
@@ -4381,17 +4546,17 @@
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackChecker_methods(root_module, cls):
@@ -4410,12 +4575,12 @@
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<const ns3::CallbackImplBase> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
     cls.add_method('Demangle', 
                    'std::string', 
@@ -4525,7 +4690,7 @@
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [param('std::size_t', 'i')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## channel.h (module 'network'): uint32_t ns3::Channel::GetId() const [member function]
     cls.add_method('GetId', 
                    'uint32_t', 
@@ -4535,7 +4700,7 @@
     cls.add_method('GetNDevices', 
                    'std::size_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## channel.h (module 'network'): static ns3::TypeId ns3::Channel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -4650,7 +4815,7 @@
     cls.add_method('Notify', 
                    'void', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True, visibility='protected')
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Ipv4_methods(root_module, cls):
@@ -4662,82 +4827,82 @@
     cls.add_method('AddAddress', 
                    'bool', 
                    [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): uint32_t ns3::Ipv4::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
                    'uint32_t', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'device')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ptr<ns3::Socket> ns3::Ipv4::CreateRawSocket() [member function]
     cls.add_method('CreateRawSocket', 
                    'ns3::Ptr< ns3::Socket >', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::DeleteRawSocket(ns3::Ptr<ns3::Socket> socket) [member function]
     cls.add_method('DeleteRawSocket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Socket >', 'socket')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ipv4InterfaceAddress ns3::Ipv4::GetAddress(uint32_t interface, uint32_t addressIndex) const [member function]
     cls.add_method('GetAddress', 
                    'ns3::Ipv4InterfaceAddress', 
                    [param('uint32_t', 'interface'), param('uint32_t', 'addressIndex')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): int32_t ns3::Ipv4::GetInterfaceForAddress(ns3::Ipv4Address address) const [member function]
     cls.add_method('GetInterfaceForAddress', 
                    'int32_t', 
                    [param('ns3::Ipv4Address', 'address')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): int32_t ns3::Ipv4::GetInterfaceForDevice(ns3::Ptr<const ns3::NetDevice> device) const [member function]
     cls.add_method('GetInterfaceForDevice', 
                    'int32_t', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): int32_t ns3::Ipv4::GetInterfaceForPrefix(ns3::Ipv4Address address, ns3::Ipv4Mask mask) const [member function]
     cls.add_method('GetInterfaceForPrefix', 
                    'int32_t', 
                    [param('ns3::Ipv4Address', 'address'), param('ns3::Ipv4Mask', 'mask')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): uint16_t ns3::Ipv4::GetMetric(uint32_t interface) const [member function]
     cls.add_method('GetMetric', 
                    'uint16_t', 
                    [param('uint32_t', 'interface')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): uint16_t ns3::Ipv4::GetMtu(uint32_t interface) const [member function]
     cls.add_method('GetMtu', 
                    'uint16_t', 
                    [param('uint32_t', 'interface')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): uint32_t ns3::Ipv4::GetNAddresses(uint32_t interface) const [member function]
     cls.add_method('GetNAddresses', 
                    'uint32_t', 
                    [param('uint32_t', 'interface')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): uint32_t ns3::Ipv4::GetNInterfaces() const [member function]
     cls.add_method('GetNInterfaces', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv4::GetNetDevice(uint32_t interface) [member function]
     cls.add_method('GetNetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv4::GetProtocol(int protocolNumber) const [member function]
     cls.add_method('GetProtocol', 
                    'ns3::Ptr< ns3::IpL4Protocol >', 
                    [param('int', 'protocolNumber')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv4::GetProtocol(int protocolNumber, int32_t interfaceIndex) const [member function]
     cls.add_method('GetProtocol', 
                    'ns3::Ptr< ns3::IpL4Protocol >', 
                    [param('int', 'protocolNumber'), param('int32_t', 'interfaceIndex')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ptr<ns3::Ipv4RoutingProtocol> ns3::Ipv4::GetRoutingProtocol() const [member function]
     cls.add_method('GetRoutingProtocol', 
                    'ns3::Ptr< ns3::Ipv4RoutingProtocol >', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): static ns3::TypeId ns3::Ipv4::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -4747,114 +4912,114 @@
     cls.add_method('Insert', 
                    'void', 
                    [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::Insert(ns3::Ptr<ns3::IpL4Protocol> protocol, uint32_t interfaceIndex) [member function]
     cls.add_method('Insert', 
                    'void', 
                    [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol'), param('uint32_t', 'interfaceIndex')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::IsDestinationAddress(ns3::Ipv4Address address, uint32_t iif) const [member function]
     cls.add_method('IsDestinationAddress', 
                    'bool', 
                    [param('ns3::Ipv4Address', 'address'), param('uint32_t', 'iif')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::IsForwarding(uint32_t interface) const [member function]
     cls.add_method('IsForwarding', 
                    'bool', 
                    [param('uint32_t', 'interface')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::IsUp(uint32_t interface) const [member function]
     cls.add_method('IsUp', 
                    'bool', 
                    [param('uint32_t', 'interface')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
     cls.add_method('Remove', 
                    'void', 
                    [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol, uint32_t interfaceIndex) [member function]
     cls.add_method('Remove', 
                    'void', 
                    [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol'), param('uint32_t', 'interfaceIndex')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::RemoveAddress(uint32_t interface, uint32_t addressIndex) [member function]
     cls.add_method('RemoveAddress', 
                    'bool', 
                    [param('uint32_t', 'interface'), param('uint32_t', 'addressIndex')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::RemoveAddress(uint32_t interface, ns3::Ipv4Address address) [member function]
     cls.add_method('RemoveAddress', 
                    'bool', 
                    [param('uint32_t', 'interface'), param('ns3::Ipv4Address', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4::SelectSourceAddress(ns3::Ptr<const ns3::NetDevice> device, ns3::Ipv4Address dst, ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e scope) [member function]
     cls.add_method('SelectSourceAddress', 
                    'ns3::Ipv4Address', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device'), param('ns3::Ipv4Address', 'dst'), param('ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 'scope')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv4Address source, ns3::Ipv4Address destination, uint8_t protocol, ns3::Ptr<ns3::Ipv4Route> route) [member function]
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv4Address', 'source'), param('ns3::Ipv4Address', 'destination'), param('uint8_t', 'protocol'), param('ns3::Ptr< ns3::Ipv4Route >', 'route')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SendWithHeader(ns3::Ptr<ns3::Packet> packet, ns3::Ipv4Header ipHeader, ns3::Ptr<ns3::Ipv4Route> route) [member function]
     cls.add_method('SendWithHeader', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv4Header', 'ipHeader'), param('ns3::Ptr< ns3::Ipv4Route >', 'route')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetDown(uint32_t interface) [member function]
     cls.add_method('SetDown', 
                    'void', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetForwarding(uint32_t interface, bool val) [member function]
     cls.add_method('SetForwarding', 
                    'void', 
                    [param('uint32_t', 'interface'), param('bool', 'val')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetMetric(uint32_t interface, uint16_t metric) [member function]
     cls.add_method('SetMetric', 
                    'void', 
                    [param('uint32_t', 'interface'), param('uint16_t', 'metric')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetRoutingProtocol(ns3::Ptr<ns3::Ipv4RoutingProtocol> routingProtocol) [member function]
     cls.add_method('SetRoutingProtocol', 
                    'void', 
                    [param('ns3::Ptr< ns3::Ipv4RoutingProtocol >', 'routingProtocol')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetUp(uint32_t interface) [member function]
     cls.add_method('SetUp', 
                    'void', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4::SourceAddressSelection(uint32_t interface, ns3::Ipv4Address dest) [member function]
     cls.add_method('SourceAddressSelection', 
                    'ns3::Ipv4Address', 
                    [param('uint32_t', 'interface'), param('ns3::Ipv4Address', 'dest')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ipv4::IF_ANY [variable]
     cls.add_static_attribute('IF_ANY', 'uint32_t const', is_const=True)
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::GetIpForward() const [member function]
     cls.add_method('GetIpForward', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True, visibility='private')
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::GetWeakEsModel() const [member function]
     cls.add_method('GetWeakEsModel', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True, visibility='private')
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetIpForward(bool forward) [member function]
     cls.add_method('SetIpForward', 
                    'void', 
                    [param('bool', 'forward')], 
-                   is_virtual=True, is_pure_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetWeakEsModel(bool model) [member function]
     cls.add_method('SetWeakEsModel', 
                    'void', 
                    [param('bool', 'model')], 
-                   is_virtual=True, is_pure_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
@@ -5276,42 +5441,42 @@
     cls.add_method('NotifyAddAddress', 
                    'void', 
                    [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyInterfaceDown(uint32_t interface) [member function]
     cls.add_method('NotifyInterfaceDown', 
                    'void', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyInterfaceUp(uint32_t interface) [member function]
     cls.add_method('NotifyInterfaceUp', 
                    'void', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyRemoveAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function]
     cls.add_method('NotifyRemoveAddress', 
                    'void', 
                    [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::PrintRoutingTable(ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) const [member function]
     cls.add_method('PrintRoutingTable', 
                    'void', 
                    [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): bool ns3::Ipv4RoutingProtocol::RouteInput(ns3::Ptr<const ns3::Packet> p, ns3::Ipv4Header const & header, ns3::Ptr<const ns3::NetDevice> idev, ns3::Ipv4RoutingProtocol::UnicastForwardCallback ucb, ns3::Ipv4RoutingProtocol::MulticastForwardCallback mcb, ns3::Ipv4RoutingProtocol::LocalDeliverCallback lcb, ns3::Ipv4RoutingProtocol::ErrorCallback ecb) [member function]
     cls.add_method('RouteInput', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice const >', 'idev'), param('ns3::Callback< void, ns3::Ptr< ns3::Ipv4Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ucb'), param('ns3::Callback< void, ns3::Ptr< ns3::Ipv4MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'mcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'lcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::Socket::SocketErrno, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ecb')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): ns3::Ptr<ns3::Ipv4Route> ns3::Ipv4RoutingProtocol::RouteOutput(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & header, ns3::Ptr<ns3::NetDevice> oif, ns3::Socket::SocketErrno & sockerr) [member function]
     cls.add_method('RouteOutput', 
                    'ns3::Ptr< ns3::Ipv4Route >', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice >', 'oif'), param('ns3::Socket::SocketErrno &', 'sockerr')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::SetIpv4(ns3::Ptr<ns3::Ipv4> ipv4) [member function]
     cls.add_method('SetIpv4', 
                    'void', 
                    [param('ns3::Ptr< ns3::Ipv4 >', 'ipv4')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
@@ -5443,47 +5608,47 @@
     cls.add_method('AddLinkChangeCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetAddress() const [member function]
     cls.add_method('GetAddress', 
                    'ns3::Address', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Address', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): ns3::Ptr<ns3::Channel> ns3::NetDevice::GetChannel() const [member function]
     cls.add_method('GetChannel', 
                    'ns3::Ptr< ns3::Channel >', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): uint32_t ns3::NetDevice::GetIfIndex() const [member function]
     cls.add_method('GetIfIndex', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): uint16_t ns3::NetDevice::GetMtu() const [member function]
     cls.add_method('GetMtu', 
                    'uint16_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
     cls.add_method('GetMulticast', 
                    'ns3::Address', 
                    [param('ns3::Ipv4Address', 'multicastGroup')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
     cls.add_method('GetMulticast', 
                    'ns3::Address', 
                    [param('ns3::Ipv6Address', 'addr')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NetDevice::GetNode() const [member function]
     cls.add_method('GetNode', 
                    'ns3::Ptr< ns3::Node >', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): static ns3::TypeId ns3::NetDevice::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -5493,77 +5658,77 @@
     cls.add_method('IsBridge', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::IsBroadcast() const [member function]
     cls.add_method('IsBroadcast', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::IsLinkUp() const [member function]
     cls.add_method('IsLinkUp', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::IsMulticast() const [member function]
     cls.add_method('IsMulticast', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::IsPointToPoint() const [member function]
     cls.add_method('IsPointToPoint', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::NeedsArp() const [member function]
     cls.add_method('NeedsArp', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
     cls.add_method('Send', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
     cls.add_method('SendFrom', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): void ns3::NetDevice::SetAddress(ns3::Address address) [member function]
     cls.add_method('SetAddress', 
                    'void', 
                    [param('ns3::Address', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): void ns3::NetDevice::SetIfIndex(uint32_t const index) [member function]
     cls.add_method('SetIfIndex', 
                    'void', 
                    [param('uint32_t const', 'index')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::SetMtu(uint16_t const mtu) [member function]
     cls.add_method('SetMtu', 
                    'bool', 
                    [param('uint16_t const', 'mtu')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): void ns3::NetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
     cls.add_method('SetNode', 
                    'void', 
                    [param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): void ns3::NetDevice::SetPromiscReceiveCallback(ns3::NetDevice::PromiscReceiveCallback cb) [member function]
     cls.add_method('SetPromiscReceiveCallback', 
                    'void', 
                    [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): void ns3::NetDevice::SetReceiveCallback(ns3::NetDevice::ReceiveCallback cb) [member function]
     cls.add_method('SetReceiveCallback', 
                    'void', 
                    [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::SupportsSendFrom() const [member function]
     cls.add_method('SupportsSendFrom', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3NixVector_methods(root_module, cls):
@@ -6082,7 +6247,7 @@
     cls.add_method('operator()', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('ns3::Address const &', 'arg1')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6104,7 +6269,7 @@
     cls.add_method('operator()', 
                    'ns3::ObjectBase *', 
                    [], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6126,7 +6291,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ipv4Header const &', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('ns3::Ipv4L3Protocol::DropReason', 'arg2'), param('ns3::Ptr< ns3::Ipv4 >', 'arg3'), param('unsigned int', 'arg4')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6148,7 +6313,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ipv4Header const &', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('unsigned int', 'arg2')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6170,7 +6335,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::Ptr< ns3::Ipv4 >', 'arg1'), param('unsigned int', 'arg2')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6192,7 +6357,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('short unsigned int', 'arg2'), param('ns3::Address const &', 'arg3'), param('ns3::Address const &', 'arg4'), param('ns3::NetDevice::PacketType', 'arg5')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6214,7 +6379,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'arg0')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6236,7 +6401,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('ns3::Address const &', 'arg1')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6258,7 +6423,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Socket >', 'arg0')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6280,7 +6445,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('unsigned int', 'arg1')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3HashImplementation_methods(root_module, cls):
@@ -6292,7 +6457,7 @@
     cls.add_method('GetHash32', 
                    'uint32_t', 
                    [param('char const *', 'buffer'), param('std::size_t const', 'size')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## hash-function.h (module 'core'): uint64_t ns3::Hash::Implementation::GetHash64(char const * buffer, std::size_t const size) [member function]
     cls.add_method('GetHash64', 
                    'uint64_t', 
@@ -6302,7 +6467,7 @@
     cls.add_method('clear', 
                    'void', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3HashFunctionFnv1a_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/visualizer/bindings/modulegen__gcc_LP64.py ns-3.34/src/visualizer/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/visualizer/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/visualizer/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -20,6 +20,8 @@
 def register_types(module):
     root_module = module.get_root()
     
+    ## log.h (module 'core'): ns3::LogLevel [enumeration]
+    module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
     module.add_class('Address', import_from_module='ns.network')
     ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
@@ -81,6 +83,8 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -91,8 +95,15 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## log.h (module 'core'): ns3::LogComponent [class]
+    module.add_class('LogComponent', import_from_module='ns.core')
+    typehandlers.add_type_alias('std::map< std::string, ns3::LogComponent * >', 'ns3::LogComponent::ComponentList')
+    typehandlers.add_type_alias('std::map< std::string, ns3::LogComponent * >*', 'ns3::LogComponent::ComponentList*')
+    typehandlers.add_type_alias('std::map< std::string, ns3::LogComponent * >&', 'ns3::LogComponent::ComponentList&')
     ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
     module.add_class('Mac48Address', import_from_module='ns.network')
     typehandlers.add_type_alias('void ( * ) ( ns3::Mac48Address )', 'ns3::Mac48Address::TracedCallback')
@@ -105,7 +116,7 @@
     ## mac8-address.h (module 'network'): ns3::Mac8Address [class]
     root_module['ns3::Mac8Address'].implicitly_converts_to(root_module['ns3::Address'])
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
-    module.add_class('ObjectBase', import_from_module='ns.core', allow_subclassing=True)
+    module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
     module.add_class('ObjectDeleter', import_from_module='ns.core')
     ## object-factory.h (module 'core'): ns3::ObjectFactory [class]
@@ -126,6 +137,8 @@
     module.add_class('PacketTagList', import_from_module='ns.network')
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData [struct]
     module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
+    ## log.h (module 'core'): ns3::ParameterLogger [class]
+    module.add_class('ParameterLogger', import_from_module='ns.core')
     ## pyviz.h (module 'visualizer'): ns3::PyViz [class]
     module.add_class('PyViz')
     ## pyviz.h (module 'visualizer'): ns3::PyViz::PacketCaptureMode [enumeration]
@@ -143,11 +156,11 @@
     ## pyviz.h (module 'visualizer'): ns3::PyViz::PacketSample [struct]
     module.add_class('PacketSample', outer_class=root_module['ns3::PyViz'])
     ## pyviz.h (module 'visualizer'): ns3::PyViz::RxPacketSample [struct]
-    module.add_class('RxPacketSample', parent=root_module['ns3::PyViz::PacketSample'], outer_class=root_module['ns3::PyViz'])
+    module.add_class('RxPacketSample', outer_class=root_module['ns3::PyViz'], parent=root_module['ns3::PyViz::PacketSample'])
     ## pyviz.h (module 'visualizer'): ns3::PyViz::TransmissionSample [struct]
     module.add_class('TransmissionSample', outer_class=root_module['ns3::PyViz'])
     ## pyviz.h (module 'visualizer'): ns3::PyViz::TxPacketSample [struct]
-    module.add_class('TxPacketSample', parent=root_module['ns3::PyViz::PacketSample'], outer_class=root_module['ns3::PyViz'])
+    module.add_class('TxPacketSample', outer_class=root_module['ns3::PyViz'], parent=root_module['ns3::PyViz::PacketSample'])
     typehandlers.add_type_alias('std::vector< ns3::PyViz::TransmissionSample >', 'ns3::PyViz::TransmissionSampleList')
     typehandlers.add_type_alias('std::vector< ns3::PyViz::TransmissionSample >*', 'ns3::PyViz::TransmissionSampleList*')
     typehandlers.add_type_alias('std::vector< ns3::PyViz::TransmissionSample >&', 'ns3::PyViz::TransmissionSampleList&')
@@ -155,15 +168,22 @@
     typehandlers.add_type_alias('std::vector< ns3::PyViz::PacketDropSample >*', 'ns3::PyViz::PacketDropSampleList*')
     typehandlers.add_type_alias('std::vector< ns3::PyViz::PacketDropSample >&', 'ns3::PyViz::PacketDropSampleList&')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::ObjectBase'], template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::ObjectBase'], template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'])
     ## simulator.h (module 'core'): ns3::Simulator [class]
-    module.add_class('Simulator', import_from_module='ns.core', destructor_visibility='private')
+    module.add_class('Simulator', destructor_visibility='private', import_from_module='ns.core')
     ## simulator.h (module 'core'): ns3::Simulator [enumeration]
     module.add_enum('', ['NO_CONTEXT'], outer_class=root_module['ns3::Simulator'], import_from_module='ns.core')
     ## tag.h (module 'network'): ns3::Tag [class]
     module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
     module.add_class('TagBuffer', import_from_module='ns.network')
+    ## nstime.h (module 'core'): ns3::Time [class]
+    module.add_class('Time', import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST', 'AUTO'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time )', 'ns3::Time::TracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time )*', 'ns3::Time::TracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Time )&', 'ns3::Time::TracedCallback&')
     ## nstime.h (module 'core'): ns3::TimeWithUnit [class]
     module.add_class('TimeWithUnit', import_from_module='ns.core')
     ## type-id.h (module 'core'): ns3::TypeId [class]
@@ -200,29 +220,29 @@
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
-    module.add_class('SimpleRefCount', import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), automatic_type_narrowing=True, parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'])
     ## socket.h (module 'network'): ns3::Socket [class]
     module.add_class('Socket', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## socket.h (module 'network'): ns3::Socket::SocketErrno [enumeration]
@@ -245,15 +265,6 @@
     module.add_class('SocketPriorityTag', import_from_module='ns.network', parent=root_module['ns3::Tag'])
     ## socket.h (module 'network'): ns3::SocketSetDontFragmentTag [class]
     module.add_class('SocketSetDontFragmentTag', import_from_module='ns.network', parent=root_module['ns3::Tag'])
-    ## nstime.h (module 'core'): ns3::Time [class]
-    module.add_class('Time', import_from_module='ns.core')
-    ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time )', 'ns3::Time::TracedCallback')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time )*', 'ns3::Time::TracedCallback*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::Time )&', 'ns3::Time::TracedCallback&')
-    ## nstime.h (module 'core'): ns3::Time [class]
-    root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
     module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
     ## trailer.h (module 'network'): ns3::Trailer [class]
@@ -261,9 +272,9 @@
     ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
     module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     ## attribute.h (module 'core'): ns3::AttributeChecker [class]
-    module.add_class('AttributeChecker', import_from_module='ns.core', automatic_type_narrowing=True, allow_subclassing=False, parent=root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    module.add_class('AttributeChecker', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
     ## attribute.h (module 'core'): ns3::AttributeValue [class]
-    module.add_class('AttributeValue', import_from_module='ns.core', automatic_type_narrowing=True, allow_subclassing=False, parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     ## callback.h (module 'core'): ns3::CallbackChecker [class]
     module.add_class('CallbackChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## callback.h (module 'core'): ns3::CallbackImplBase [class]
@@ -412,20 +423,27 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
+    module.add_container('std::set< ns3::TypeId >', 'ns3::TypeId', container_type='set')
+    module.add_container('std::vector< ns3::PyViz::RxPacketSample >', 'ns3::PyViz::RxPacketSample', container_type='vector')
+    module.add_container('std::vector< ns3::PyViz::TxPacketSample >', 'ns3::PyViz::TxPacketSample', container_type='vector')
+    module.add_container('std::vector< ns3::PyViz::PacketSample >', 'ns3::PyViz::PacketSample', container_type='vector')
     module.add_container('std::vector< std::string >', 'std::string', container_type='vector')
     module.add_container('std::vector< ns3::PyViz::TransmissionSample >', 'ns3::PyViz::TransmissionSample', container_type='vector')
     module.add_container('ns3::PyViz::TransmissionSampleList', 'ns3::PyViz::TransmissionSample', container_type='vector')
     module.add_container('std::vector< ns3::PyViz::PacketDropSample >', 'ns3::PyViz::PacketDropSample', container_type='vector')
     module.add_container('ns3::PyViz::PacketDropSampleList', 'ns3::PyViz::PacketDropSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::RxPacketSample >', 'ns3::PyViz::RxPacketSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::TxPacketSample >', 'ns3::PyViz::TxPacketSample', container_type='vector')
-    module.add_container('std::vector< ns3::PyViz::PacketSample >', 'ns3::PyViz::PacketSample', container_type='vector')
     module.add_container('std::set< unsigned int >', 'unsigned int', container_type='set')
     module.add_container('std::vector< ns3::PyViz::NetDeviceStatistics >', 'ns3::PyViz::NetDeviceStatistics', container_type='vector')
     module.add_container('std::vector< ns3::PyViz::NodeStatistics >', 'ns3::PyViz::NodeStatistics', container_type='vector')
-    module.add_container('std::set< ns3::TypeId >', 'ns3::TypeId', container_type='set')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::NodePrinter')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::NodePrinter*')
+    typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::NodePrinter&')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -512,10 +530,13 @@
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
@@ -528,6 +549,7 @@
     register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
     register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
     register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
+    register_Ns3ParameterLogger_methods(root_module, root_module['ns3::ParameterLogger'])
     register_Ns3PyViz_methods(root_module, root_module['ns3::PyViz'])
     register_Ns3PyVizLastPacketsSample_methods(root_module, root_module['ns3::PyViz::LastPacketsSample'])
     register_Ns3PyVizNetDeviceStatistics_methods(root_module, root_module['ns3::PyViz::NetDeviceStatistics'])
@@ -542,6 +564,7 @@
     register_Ns3Simulator_methods(root_module, root_module['ns3::Simulator'])
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
+    register_Ns3Time_methods(root_module, root_module['ns3::Time'])
     register_Ns3TimeWithUnit_methods(root_module, root_module['ns3::TimeWithUnit'])
     register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
@@ -572,7 +595,6 @@
     register_Ns3SocketIpv6TclassTag_methods(root_module, root_module['ns3::SocketIpv6TclassTag'])
     register_Ns3SocketPriorityTag_methods(root_module, root_module['ns3::SocketPriorityTag'])
     register_Ns3SocketSetDontFragmentTag_methods(root_module, root_module['ns3::SocketSetDontFragmentTag'])
-    register_Ns3Time_methods(root_module, root_module['ns3::Time'])
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
     register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
     register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
@@ -1048,10 +1070,24 @@
                    'ns3::ByteTagList::Iterator', 
                    [param('int32_t', 'offsetStart'), param('int32_t', 'offsetEnd')], 
                    is_const=True)
+    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::RemoveAll() [member function]
     cls.add_method('RemoveAll', 
                    'void', 
                    [])
+    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
     return
 
 def register_Ns3ByteTagListIterator_methods(root_module, cls):
@@ -1257,6 +1293,10 @@
                    'ns3::EventImpl *', 
                    [], 
                    is_const=True)
+    ## event-id.h (module 'core'): void ns3::EventId::Remove() [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [])
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -1455,7 +1495,12 @@
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ipv4Address const &', 'other')], 
-                   is_const=True, deprecated=True)
+                   deprecated=True, is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
+    cls.add_method('IsInitialized', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsLocalMulticast() const [member function]
     cls.add_method('IsLocalMulticast', 
                    'bool', 
@@ -1501,6 +1546,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1608,7 +1665,7 @@
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ipv4Mask', 'other')], 
-                   is_const=True, deprecated=True)
+                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsMatch(ns3::Ipv4Address a, ns3::Ipv4Address b) const [member function]
     cls.add_method('IsMatch', 
                    'bool', 
@@ -1729,7 +1786,12 @@
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
-                   is_const=True, deprecated=True)
+                   deprecated=True, is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
+    cls.add_method('IsInitialized', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
@@ -1770,6 +1832,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -1845,6 +1912,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -1865,6 +1944,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -1899,7 +1983,7 @@
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ipv6Prefix const &', 'other')], 
-                   is_const=True, deprecated=True)
+                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsMatch(ns3::Ipv6Address a, ns3::Ipv6Address b) const [member function]
     cls.add_method('IsMatch', 
                    'bool', 
@@ -1916,6 +2000,55 @@
                    [param('uint8_t', 'prefixLength')])
     return
 
+def register_Ns3LogComponent_methods(root_module, cls):
+    ## log.h (module 'core'): ns3::LogComponent::LogComponent(ns3::LogComponent const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LogComponent const &', 'arg0')])
+    ## log.h (module 'core'): ns3::LogComponent::LogComponent(std::string const & name, std::string const & file, ns3::LogLevel const mask=::ns3::LogLevel::LOG_NONE) [constructor]
+    cls.add_constructor([param('std::string const &', 'name'), param('std::string const &', 'file'), param('ns3::LogLevel const', 'mask', default_value='::ns3::LogLevel::LOG_NONE')])
+    ## log.h (module 'core'): void ns3::LogComponent::Disable(ns3::LogLevel const level) [member function]
+    cls.add_method('Disable', 
+                   'void', 
+                   [param('ns3::LogLevel const', 'level')])
+    ## log.h (module 'core'): void ns3::LogComponent::Enable(ns3::LogLevel const level) [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [param('ns3::LogLevel const', 'level')])
+    ## log.h (module 'core'): std::string ns3::LogComponent::File() const [member function]
+    cls.add_method('File', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## log.h (module 'core'): static ns3::LogComponent::ComponentList * ns3::LogComponent::GetComponentList() [member function]
+    cls.add_method('GetComponentList', 
+                   'ns3::LogComponent::ComponentList *', 
+                   [], 
+                   is_static=True)
+    ## log.h (module 'core'): static std::string ns3::LogComponent::GetLevelLabel(ns3::LogLevel const level) [member function]
+    cls.add_method('GetLevelLabel', 
+                   'std::string', 
+                   [param('ns3::LogLevel const', 'level')], 
+                   is_static=True)
+    ## log.h (module 'core'): bool ns3::LogComponent::IsEnabled(ns3::LogLevel const level) const [member function]
+    cls.add_method('IsEnabled', 
+                   'bool', 
+                   [param('ns3::LogLevel const', 'level')], 
+                   is_const=True)
+    ## log.h (module 'core'): bool ns3::LogComponent::IsNoneEnabled() const [member function]
+    cls.add_method('IsNoneEnabled', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## log.h (module 'core'): char const * ns3::LogComponent::Name() const [member function]
+    cls.add_method('Name', 
+                   'char const *', 
+                   [], 
+                   is_const=True)
+    ## log.h (module 'core'): void ns3::LogComponent::SetMask(ns3::LogLevel const level) [member function]
+    cls.add_method('SetMask', 
+                   'void', 
+                   [param('ns3::LogLevel const', 'level')])
+    return
+
 def register_Ns3Mac48Address_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('!=')
@@ -2049,7 +2182,7 @@
     cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## object-base.h (module 'core'): static ns3::TypeId ns3::ObjectBase::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -2109,8 +2242,6 @@
     cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
     ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
     cls.add_constructor([])
-    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string typeId) [constructor]
-    cls.add_constructor([param('std::string', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -2126,10 +2257,10 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## object-factory.h (module 'core'): void ns3::ObjectFactory::Set(std::string name, ns3::AttributeValue const & value) [member function]
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::Set() [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+                   [])
     ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(ns3::TypeId tid) [member function]
     cls.add_method('SetTypeId', 
                    'void', 
@@ -2298,6 +2429,15 @@
                    'void', 
                    [param('ns3::Tag const &', 'tag')], 
                    is_const=True)
+    ## packet-tag-list.h (module 'network'): uint32_t ns3::PacketTagList::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet-tag-list.h (module 'network'): uint32_t ns3::PacketTagList::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData const * ns3::PacketTagList::Head() const [member function]
     cls.add_method('Head', 
                    'ns3::PacketTagList::TagData const *', 
@@ -2320,6 +2460,11 @@
     cls.add_method('Replace', 
                    'bool', 
                    [param('ns3::Tag &', 'tag')])
+    ## packet-tag-list.h (module 'network'): uint32_t ns3::PacketTagList::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
     return
 
 def register_Ns3PacketTagListTagData_methods(root_module, cls):
@@ -2339,6 +2484,13 @@
     cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
     return
 
+def register_Ns3ParameterLogger_methods(root_module, cls):
+    ## log.h (module 'core'): ns3::ParameterLogger::ParameterLogger(ns3::ParameterLogger const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ParameterLogger const &', 'arg0')])
+    ## log.h (module 'core'): ns3::ParameterLogger::ParameterLogger(std::ostream & os) [constructor]
+    cls.add_constructor([param('std::ostream &', 'os')])
+    return
+
 def register_Ns3PyViz_methods(root_module, cls):
     ## pyviz.h (module 'visualizer'): ns3::PyViz::PyViz(ns3::PyViz const & arg0) [constructor]
     cls.add_constructor([param('ns3::PyViz const &', 'arg0')])
@@ -2619,12 +2771,12 @@
     cls.add_method('Deserialize', 
                    'void', 
                    [param('ns3::TagBuffer', 'i')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## tag.h (module 'network'): uint32_t ns3::Tag::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## tag.h (module 'network'): static ns3::TypeId ns3::Tag::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -2634,12 +2786,12 @@
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## tag.h (module 'network'): void ns3::Tag::Serialize(ns3::TagBuffer i) const [member function]
     cls.add_method('Serialize', 
                    'void', 
                    [param('ns3::TagBuffer', 'i')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3TagBuffer_methods(root_module, cls):
@@ -2705,6 +2857,210 @@
                    [param('uint8_t', 'v')])
     return
 
+def register_Ns3Time_methods(root_module, cls):
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('>=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
+    cls.add_output_stream_operator()
+    ## nstime.h (module 'core'): ns3::Time::Time() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::Time const & o) [constructor]
+    cls.add_constructor([param('ns3::Time const &', 'o')])
+    ## nstime.h (module 'core'): ns3::Time::Time(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & v) [constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(std::string const & s) [constructor]
+    cls.add_constructor([param('std::string const &', 's')])
+    ## nstime.h (module 'core'): ns3::TimeWithUnit ns3::Time::As(ns3::Time::Unit const unit=::ns3::Time::Unit::AUTO) const [member function]
+    cls.add_method('As', 
+                   'ns3::TimeWithUnit', 
+                   [param('ns3::Time::Unit const', 'unit', default_value='::ns3::Time::Unit::AUTO')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int ns3::Time::Compare(ns3::Time const & o) const [member function]
+    cls.add_method('Compare', 
+                   'int', 
+                   [param('ns3::Time const &', 'o')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'value')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value, ns3::Time::Unit unit) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'value'), param('ns3::Time::Unit', 'unit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit unit) [member function]
+    cls.add_method('FromDouble', 
+                   'ns3::Time', 
+                   [param('double', 'value'), param('ns3::Time::Unit', 'unit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit unit) [member function]
+    cls.add_method('FromInteger', 
+                   'ns3::Time', 
+                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'unit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetFemtoSeconds() const [member function]
+    cls.add_method('GetFemtoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
+    cls.add_method('GetInteger', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMicroSeconds() const [member function]
+    cls.add_method('GetMicroSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMilliSeconds() const [member function]
+    cls.add_method('GetMilliSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
+    cls.add_method('GetNanoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetPicoSeconds() const [member function]
+    cls.add_method('GetPicoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time::Unit ns3::Time::GetResolution() [member function]
+    cls.add_method('GetResolution', 
+                   'ns3::Time::Unit', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetSeconds() const [member function]
+    cls.add_method('GetSeconds', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetTimeStep() const [member function]
+    cls.add_method('GetTimeStep', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
+    cls.add_method('IsNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsPositive() const [member function]
+    cls.add_method('IsPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyNegative() const [member function]
+    cls.add_method('IsStrictlyNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyPositive() const [member function]
+    cls.add_method('IsStrictlyPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsZero() const [member function]
+    cls.add_method('IsZero', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Max() [member function]
+    cls.add_method('Max', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Min() [member function]
+    cls.add_method('Min', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): ns3::Time ns3::Time::RoundTo(ns3::Time::Unit unit) const [member function]
+    cls.add_method('RoundTo', 
+                   'ns3::Time', 
+                   [param('ns3::Time::Unit', 'unit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static void ns3::Time::SetResolution(ns3::Time::Unit resolution) [member function]
+    cls.add_method('SetResolution', 
+                   'void', 
+                   [param('ns3::Time::Unit', 'resolution')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static bool ns3::Time::StaticInit() [member function]
+    cls.add_method('StaticInit', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit unit) const [member function]
+    cls.add_method('To', 
+                   'ns3::int64x64_t', 
+                   [param('ns3::Time::Unit', 'unit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit unit) const [member function]
+    cls.add_method('ToDouble', 
+                   'double', 
+                   [param('ns3::Time::Unit', 'unit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit unit) const [member function]
+    cls.add_method('ToInteger', 
+                   'int64_t', 
+                   [param('ns3::Time::Unit', 'unit')], 
+                   is_const=True)
+    return
+
 def register_Ns3TimeWithUnit_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## nstime.h (module 'core'): ns3::TimeWithUnit::TimeWithUnit(ns3::TimeWithUnit const & arg0) [constructor]
@@ -2982,6 +3338,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## int64x64-128.h (module 'core'): int64_t ns3::int64x64_t::GetInt() const [member function]
+    cls.add_method('GetInt', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
     ## int64x64-128.h (module 'core'): uint64_t ns3::int64x64_t::GetLow() const [member function]
     cls.add_method('GetLow', 
                    'uint64_t', 
@@ -2996,6 +3357,11 @@
     cls.add_method('MulByInvert', 
                    'void', 
                    [param('ns3::int64x64_t const &', 'o')])
+    ## int64x64-128.h (module 'core'): int64_t ns3::int64x64_t::Round() const [member function]
+    cls.add_method('Round', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
     ## int64x64-128.h (module 'core'): ns3::int64x64_t::implementation [variable]
     cls.add_static_attribute('implementation', 'ns3::int64x64_t::impl_type const', is_const=True)
     return
@@ -3009,7 +3375,7 @@
     cls.add_method('Deserialize', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## chunk.h (module 'network'): uint32_t ns3::Chunk::Deserialize(ns3::Buffer::Iterator start, ns3::Buffer::Iterator end) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -3024,7 +3390,7 @@
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3Header_methods(root_module, cls):
@@ -3037,12 +3403,12 @@
     cls.add_method('Deserialize', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## header.h (module 'network'): uint32_t ns3::Header::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## header.h (module 'network'): static ns3::TypeId ns3::Header::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -3052,12 +3418,12 @@
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## header.h (module 'network'): void ns3::Header::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3Ipv4Header_methods(root_module, cls):
@@ -3257,12 +3623,12 @@
     cls.add_method('GetObject', 
                    'ns3::Ptr< ns3::Object >', 
                    [], 
-                   is_const=True, template_parameters=['ns3::Object'], custom_template_method_name='GetObject')
+                   custom_template_method_name='GetObject', is_const=True, template_parameters=['ns3::Object'])
     ## object.h (module 'core'): ns3::Ptr<ns3::Object> ns3::Object::GetObject(ns3::TypeId tid) const [member function]
     cls.add_method('GetObject', 
                    'ns3::Ptr< ns3::Object >', 
                    [param('ns3::TypeId', 'tid')], 
-                   is_const=True, template_parameters=['ns3::Object'], custom_template_method_name='GetObject')
+                   custom_template_method_name='GetObject', is_const=True, template_parameters=['ns3::Object'])
     ## object.h (module 'core'): static ns3::TypeId ns3::Object::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -3406,17 +3772,17 @@
     cls.add_method('Bind', 
                    'int', 
                    [param('ns3::Address const &', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::Bind() [member function]
     cls.add_method('Bind', 
                    'int', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::Bind6() [member function]
     cls.add_method('Bind6', 
                    'int', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): void ns3::Socket::BindToNetDevice(ns3::Ptr<ns3::NetDevice> netdevice) [member function]
     cls.add_method('BindToNetDevice', 
                    'void', 
@@ -3426,12 +3792,12 @@
     cls.add_method('Close', 
                    'int', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::Connect(ns3::Address const & address) [member function]
     cls.add_method('Connect', 
                    'int', 
                    [param('ns3::Address const &', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): static ns3::Ptr<ns3::Socket> ns3::Socket::CreateSocket(ns3::Ptr<ns3::Node> node, ns3::TypeId tid) [member function]
     cls.add_method('CreateSocket', 
                    'ns3::Ptr< ns3::Socket >', 
@@ -3441,7 +3807,7 @@
     cls.add_method('GetAllowBroadcast', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Socket::GetBoundNetDevice() [member function]
     cls.add_method('GetBoundNetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -3450,7 +3816,7 @@
     cls.add_method('GetErrno', 
                    'ns3::Socket::SocketErrno', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): uint8_t ns3::Socket::GetIpTos() const [member function]
     cls.add_method('GetIpTos', 
                    'uint8_t', 
@@ -3475,12 +3841,12 @@
     cls.add_method('GetNode', 
                    'ns3::Ptr< ns3::Node >', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::GetPeerName(ns3::Address & address) const [member function]
     cls.add_method('GetPeerName', 
                    'int', 
                    [param('ns3::Address &', 'address')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): uint8_t ns3::Socket::GetPriority() const [member function]
     cls.add_method('GetPriority', 
                    'uint8_t', 
@@ -3490,22 +3856,22 @@
     cls.add_method('GetRxAvailable', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::GetSockName(ns3::Address & address) const [member function]
     cls.add_method('GetSockName', 
                    'int', 
                    [param('ns3::Address &', 'address')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): ns3::Socket::SocketType ns3::Socket::GetSocketType() const [member function]
     cls.add_method('GetSocketType', 
                    'ns3::Socket::SocketType', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): uint32_t ns3::Socket::GetTxAvailable() const [member function]
     cls.add_method('GetTxAvailable', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): static ns3::TypeId ns3::Socket::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -3560,12 +3926,12 @@
     cls.add_method('Listen', 
                    'int', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Socket::Recv(uint32_t maxSize, uint32_t flags) [member function]
     cls.add_method('Recv', 
                    'ns3::Ptr< ns3::Packet >', 
                    [param('uint32_t', 'maxSize'), param('uint32_t', 'flags')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Socket::Recv() [member function]
     cls.add_method('Recv', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -3578,7 +3944,7 @@
     cls.add_method('RecvFrom', 
                    'ns3::Ptr< ns3::Packet >', 
                    [param('uint32_t', 'maxSize'), param('uint32_t', 'flags'), param('ns3::Address &', 'fromAddress')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Socket::RecvFrom(ns3::Address & fromAddress) [member function]
     cls.add_method('RecvFrom', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -3591,7 +3957,7 @@
     cls.add_method('Send', 
                    'int', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint32_t', 'flags')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::Send(ns3::Ptr<ns3::Packet> p) [member function]
     cls.add_method('Send', 
                    'int', 
@@ -3604,7 +3970,7 @@
     cls.add_method('SendTo', 
                    'int', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint32_t', 'flags'), param('ns3::Address const &', 'toAddress')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::SendTo(uint8_t const * buf, uint32_t size, uint32_t flags, ns3::Address const & address) [member function]
     cls.add_method('SendTo', 
                    'int', 
@@ -3617,7 +3983,7 @@
     cls.add_method('SetAllowBroadcast', 
                    'bool', 
                    [param('bool', 'allowBroadcast')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): void ns3::Socket::SetCloseCallbacks(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> normalClose, ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> errorClose) [member function]
     cls.add_method('SetCloseCallbacks', 
                    'void', 
@@ -3668,10 +4034,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -3684,12 +4050,12 @@
     cls.add_method('ShutdownRecv', 
                    'int', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): int ns3::Socket::ShutdownSend() [member function]
     cls.add_method('ShutdownSend', 
                    'int', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## socket.h (module 'network'): void ns3::Socket::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -4037,207 +4403,6 @@
                    is_const=True, is_virtual=True)
     return
 
-def register_Ns3Time_methods(root_module, cls):
-    cls.add_binary_comparison_operator('==')
-    cls.add_binary_comparison_operator('!=')
-    cls.add_binary_comparison_operator('<=')
-    cls.add_binary_comparison_operator('>=')
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
-    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::Time'], root_module['ns3::Time'], param('int64_t const &', 'right'))
-    cls.add_binary_numeric_operator('*', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::int64x64_t const &', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::Time'], root_module['ns3::Time'], param('int64_t const &', 'right'))
-    cls.add_binary_numeric_operator('/', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::int64x64_t const &', 'right'))
-    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
-    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
-    cls.add_output_stream_operator()
-    ## nstime.h (module 'core'): ns3::Time::Time() [constructor]
-    cls.add_constructor([])
-    ## nstime.h (module 'core'): ns3::Time::Time(ns3::Time const & o) [constructor]
-    cls.add_constructor([param('ns3::Time const &', 'o')])
-    ## nstime.h (module 'core'): ns3::Time::Time(double v) [constructor]
-    cls.add_constructor([param('double', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(int v) [constructor]
-    cls.add_constructor([param('int', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(long int v) [constructor]
-    cls.add_constructor([param('long int', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(long long int v) [constructor]
-    cls.add_constructor([param('long long int', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(unsigned int v) [constructor]
-    cls.add_constructor([param('unsigned int', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(long unsigned int v) [constructor]
-    cls.add_constructor([param('long unsigned int', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(long long unsigned int v) [constructor]
-    cls.add_constructor([param('long long unsigned int', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & v) [constructor]
-    cls.add_constructor([param('ns3::int64x64_t const &', 'v')])
-    ## nstime.h (module 'core'): ns3::Time::Time(std::string const & s) [constructor]
-    cls.add_constructor([param('std::string const &', 's')])
-    ## nstime.h (module 'core'): ns3::TimeWithUnit ns3::Time::As(ns3::Time::Unit const unit) const [member function]
-    cls.add_method('As', 
-                   'ns3::TimeWithUnit', 
-                   [param('ns3::Time::Unit const', 'unit')], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int ns3::Time::Compare(ns3::Time const & o) const [member function]
-    cls.add_method('Compare', 
-                   'int', 
-                   [param('ns3::Time const &', 'o')], 
-                   is_const=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
-    cls.add_method('From', 
-                   'ns3::Time', 
-                   [param('ns3::int64x64_t const &', 'value')], 
-                   is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value, ns3::Time::Unit unit) [member function]
-    cls.add_method('From', 
-                   'ns3::Time', 
-                   [param('ns3::int64x64_t const &', 'value'), param('ns3::Time::Unit', 'unit')], 
-                   is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit unit) [member function]
-    cls.add_method('FromDouble', 
-                   'ns3::Time', 
-                   [param('double', 'value'), param('ns3::Time::Unit', 'unit')], 
-                   is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit unit) [member function]
-    cls.add_method('FromInteger', 
-                   'ns3::Time', 
-                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'unit')], 
-                   is_static=True)
-    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
-    cls.add_method('GetDays', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
-    cls.add_method('GetDouble', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetFemtoSeconds() const [member function]
-    cls.add_method('GetFemtoSeconds', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
-    cls.add_method('GetHours', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
-    cls.add_method('GetInteger', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetMicroSeconds() const [member function]
-    cls.add_method('GetMicroSeconds', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetMilliSeconds() const [member function]
-    cls.add_method('GetMilliSeconds', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
-    cls.add_method('GetMinutes', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
-    cls.add_method('GetNanoSeconds', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetPicoSeconds() const [member function]
-    cls.add_method('GetPicoSeconds', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): static ns3::Time::Unit ns3::Time::GetResolution() [member function]
-    cls.add_method('GetResolution', 
-                   'ns3::Time::Unit', 
-                   [], 
-                   is_static=True)
-    ## nstime.h (module 'core'): double ns3::Time::GetSeconds() const [member function]
-    cls.add_method('GetSeconds', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::GetTimeStep() const [member function]
-    cls.add_method('GetTimeStep', 
-                   'int64_t', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
-    cls.add_method('GetYears', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
-    cls.add_method('IsNegative', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): bool ns3::Time::IsPositive() const [member function]
-    cls.add_method('IsPositive', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyNegative() const [member function]
-    cls.add_method('IsStrictlyNegative', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyPositive() const [member function]
-    cls.add_method('IsStrictlyPositive', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): bool ns3::Time::IsZero() const [member function]
-    cls.add_method('IsZero', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Max() [member function]
-    cls.add_method('Max', 
-                   'ns3::Time', 
-                   [], 
-                   is_static=True)
-    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Min() [member function]
-    cls.add_method('Min', 
-                   'ns3::Time', 
-                   [], 
-                   is_static=True)
-    ## nstime.h (module 'core'): static void ns3::Time::SetResolution(ns3::Time::Unit resolution) [member function]
-    cls.add_method('SetResolution', 
-                   'void', 
-                   [param('ns3::Time::Unit', 'resolution')], 
-                   is_static=True)
-    ## nstime.h (module 'core'): static bool ns3::Time::StaticInit() [member function]
-    cls.add_method('StaticInit', 
-                   'bool', 
-                   [], 
-                   is_static=True)
-    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit unit) const [member function]
-    cls.add_method('To', 
-                   'ns3::int64x64_t', 
-                   [param('ns3::Time::Unit', 'unit')], 
-                   is_const=True)
-    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit unit) const [member function]
-    cls.add_method('ToDouble', 
-                   'double', 
-                   [param('ns3::Time::Unit', 'unit')], 
-                   is_const=True)
-    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit unit) const [member function]
-    cls.add_method('ToInteger', 
-                   'int64_t', 
-                   [param('ns3::Time::Unit', 'unit')], 
-                   is_const=True)
-    return
-
 def register_Ns3TraceSourceAccessor_methods(root_module, cls):
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor(ns3::TraceSourceAccessor const & arg0) [constructor]
     cls.add_constructor([param('ns3::TraceSourceAccessor const &', 'arg0')])
@@ -4247,22 +4412,22 @@
     cls.add_method('Connect', 
                    'bool', 
                    [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::ConnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
     cls.add_method('ConnectWithoutContext', 
                    'bool', 
                    [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Disconnect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
     cls.add_method('Disconnect', 
                    'bool', 
                    [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::DisconnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
     cls.add_method('DisconnectWithoutContext', 
                    'bool', 
                    [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3Trailer_methods(root_module, cls):
@@ -4275,7 +4440,7 @@
     cls.add_method('Deserialize', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'end')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## trailer.h (module 'network'): uint32_t ns3::Trailer::Deserialize(ns3::Buffer::Iterator start, ns3::Buffer::Iterator end) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -4285,7 +4450,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## trailer.h (module 'network'): static ns3::TypeId ns3::Trailer::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -4295,12 +4460,12 @@
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## trailer.h (module 'network'): void ns3::Trailer::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3AttributeAccessor_methods(root_module, cls):
@@ -4312,22 +4477,22 @@
     cls.add_method('Get', 
                    'bool', 
                    [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasGetter() const [member function]
     cls.add_method('HasGetter', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasSetter() const [member function]
     cls.add_method('HasSetter', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
     cls.add_method('Set', 
                    'bool', 
                    [param('ns3::ObjectBase *', 'object', transfer_ownership=False), param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3AttributeChecker_methods(root_module, cls):
@@ -4339,17 +4504,17 @@
     cls.add_method('Check', 
                    'bool', 
                    [param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): bool ns3::AttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
     cls.add_method('Copy', 
                    'bool', 
                    [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::CreateValidValue(ns3::AttributeValue const & value) const [member function]
     cls.add_method('CreateValidValue', 
                    'ns3::Ptr< ns3::AttributeValue >', 
@@ -4359,17 +4524,17 @@
     cls.add_method('GetUnderlyingTypeInformation', 
                    'std::string', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetValueTypeName() const [member function]
     cls.add_method('GetValueTypeName', 
                    'std::string', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): bool ns3::AttributeChecker::HasUnderlyingTypeInformation() const [member function]
     cls.add_method('HasUnderlyingTypeInformation', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3AttributeValue_methods(root_module, cls):
@@ -4381,17 +4546,17 @@
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackChecker_methods(root_module, cls):
@@ -4410,12 +4575,12 @@
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<const ns3::CallbackImplBase> other) const [member function]
     cls.add_method('IsEqual', 
                    'bool', 
                    [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
     cls.add_method('Demangle', 
                    'std::string', 
@@ -4525,7 +4690,7 @@
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [param('std::size_t', 'i')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## channel.h (module 'network'): uint32_t ns3::Channel::GetId() const [member function]
     cls.add_method('GetId', 
                    'uint32_t', 
@@ -4535,7 +4700,7 @@
     cls.add_method('GetNDevices', 
                    'std::size_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## channel.h (module 'network'): static ns3::TypeId ns3::Channel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -4650,7 +4815,7 @@
     cls.add_method('Notify', 
                    'void', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True, visibility='protected')
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Ipv4_methods(root_module, cls):
@@ -4662,82 +4827,82 @@
     cls.add_method('AddAddress', 
                    'bool', 
                    [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): uint32_t ns3::Ipv4::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
                    'uint32_t', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'device')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ptr<ns3::Socket> ns3::Ipv4::CreateRawSocket() [member function]
     cls.add_method('CreateRawSocket', 
                    'ns3::Ptr< ns3::Socket >', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::DeleteRawSocket(ns3::Ptr<ns3::Socket> socket) [member function]
     cls.add_method('DeleteRawSocket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Socket >', 'socket')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ipv4InterfaceAddress ns3::Ipv4::GetAddress(uint32_t interface, uint32_t addressIndex) const [member function]
     cls.add_method('GetAddress', 
                    'ns3::Ipv4InterfaceAddress', 
                    [param('uint32_t', 'interface'), param('uint32_t', 'addressIndex')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): int32_t ns3::Ipv4::GetInterfaceForAddress(ns3::Ipv4Address address) const [member function]
     cls.add_method('GetInterfaceForAddress', 
                    'int32_t', 
                    [param('ns3::Ipv4Address', 'address')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): int32_t ns3::Ipv4::GetInterfaceForDevice(ns3::Ptr<const ns3::NetDevice> device) const [member function]
     cls.add_method('GetInterfaceForDevice', 
                    'int32_t', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): int32_t ns3::Ipv4::GetInterfaceForPrefix(ns3::Ipv4Address address, ns3::Ipv4Mask mask) const [member function]
     cls.add_method('GetInterfaceForPrefix', 
                    'int32_t', 
                    [param('ns3::Ipv4Address', 'address'), param('ns3::Ipv4Mask', 'mask')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): uint16_t ns3::Ipv4::GetMetric(uint32_t interface) const [member function]
     cls.add_method('GetMetric', 
                    'uint16_t', 
                    [param('uint32_t', 'interface')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): uint16_t ns3::Ipv4::GetMtu(uint32_t interface) const [member function]
     cls.add_method('GetMtu', 
                    'uint16_t', 
                    [param('uint32_t', 'interface')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): uint32_t ns3::Ipv4::GetNAddresses(uint32_t interface) const [member function]
     cls.add_method('GetNAddresses', 
                    'uint32_t', 
                    [param('uint32_t', 'interface')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): uint32_t ns3::Ipv4::GetNInterfaces() const [member function]
     cls.add_method('GetNInterfaces', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv4::GetNetDevice(uint32_t interface) [member function]
     cls.add_method('GetNetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv4::GetProtocol(int protocolNumber) const [member function]
     cls.add_method('GetProtocol', 
                    'ns3::Ptr< ns3::IpL4Protocol >', 
                    [param('int', 'protocolNumber')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv4::GetProtocol(int protocolNumber, int32_t interfaceIndex) const [member function]
     cls.add_method('GetProtocol', 
                    'ns3::Ptr< ns3::IpL4Protocol >', 
                    [param('int', 'protocolNumber'), param('int32_t', 'interfaceIndex')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ptr<ns3::Ipv4RoutingProtocol> ns3::Ipv4::GetRoutingProtocol() const [member function]
     cls.add_method('GetRoutingProtocol', 
                    'ns3::Ptr< ns3::Ipv4RoutingProtocol >', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): static ns3::TypeId ns3::Ipv4::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -4747,114 +4912,114 @@
     cls.add_method('Insert', 
                    'void', 
                    [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::Insert(ns3::Ptr<ns3::IpL4Protocol> protocol, uint32_t interfaceIndex) [member function]
     cls.add_method('Insert', 
                    'void', 
                    [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol'), param('uint32_t', 'interfaceIndex')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::IsDestinationAddress(ns3::Ipv4Address address, uint32_t iif) const [member function]
     cls.add_method('IsDestinationAddress', 
                    'bool', 
                    [param('ns3::Ipv4Address', 'address'), param('uint32_t', 'iif')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::IsForwarding(uint32_t interface) const [member function]
     cls.add_method('IsForwarding', 
                    'bool', 
                    [param('uint32_t', 'interface')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::IsUp(uint32_t interface) const [member function]
     cls.add_method('IsUp', 
                    'bool', 
                    [param('uint32_t', 'interface')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
     cls.add_method('Remove', 
                    'void', 
                    [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol, uint32_t interfaceIndex) [member function]
     cls.add_method('Remove', 
                    'void', 
                    [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol'), param('uint32_t', 'interfaceIndex')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::RemoveAddress(uint32_t interface, uint32_t addressIndex) [member function]
     cls.add_method('RemoveAddress', 
                    'bool', 
                    [param('uint32_t', 'interface'), param('uint32_t', 'addressIndex')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::RemoveAddress(uint32_t interface, ns3::Ipv4Address address) [member function]
     cls.add_method('RemoveAddress', 
                    'bool', 
                    [param('uint32_t', 'interface'), param('ns3::Ipv4Address', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4::SelectSourceAddress(ns3::Ptr<const ns3::NetDevice> device, ns3::Ipv4Address dst, ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e scope) [member function]
     cls.add_method('SelectSourceAddress', 
                    'ns3::Ipv4Address', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device'), param('ns3::Ipv4Address', 'dst'), param('ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 'scope')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::Send(ns3::Ptr<ns3::Packet> packet, ns3::Ipv4Address source, ns3::Ipv4Address destination, uint8_t protocol, ns3::Ptr<ns3::Ipv4Route> route) [member function]
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv4Address', 'source'), param('ns3::Ipv4Address', 'destination'), param('uint8_t', 'protocol'), param('ns3::Ptr< ns3::Ipv4Route >', 'route')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SendWithHeader(ns3::Ptr<ns3::Packet> packet, ns3::Ipv4Header ipHeader, ns3::Ptr<ns3::Ipv4Route> route) [member function]
     cls.add_method('SendWithHeader', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv4Header', 'ipHeader'), param('ns3::Ptr< ns3::Ipv4Route >', 'route')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetDown(uint32_t interface) [member function]
     cls.add_method('SetDown', 
                    'void', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetForwarding(uint32_t interface, bool val) [member function]
     cls.add_method('SetForwarding', 
                    'void', 
                    [param('uint32_t', 'interface'), param('bool', 'val')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetMetric(uint32_t interface, uint16_t metric) [member function]
     cls.add_method('SetMetric', 
                    'void', 
                    [param('uint32_t', 'interface'), param('uint16_t', 'metric')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetRoutingProtocol(ns3::Ptr<ns3::Ipv4RoutingProtocol> routingProtocol) [member function]
     cls.add_method('SetRoutingProtocol', 
                    'void', 
                    [param('ns3::Ptr< ns3::Ipv4RoutingProtocol >', 'routingProtocol')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetUp(uint32_t interface) [member function]
     cls.add_method('SetUp', 
                    'void', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4::SourceAddressSelection(uint32_t interface, ns3::Ipv4Address dest) [member function]
     cls.add_method('SourceAddressSelection', 
                    'ns3::Ipv4Address', 
                    [param('uint32_t', 'interface'), param('ns3::Ipv4Address', 'dest')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4.h (module 'internet'): ns3::Ipv4::IF_ANY [variable]
     cls.add_static_attribute('IF_ANY', 'uint32_t const', is_const=True)
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::GetIpForward() const [member function]
     cls.add_method('GetIpForward', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True, visibility='private')
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
     ## ipv4.h (module 'internet'): bool ns3::Ipv4::GetWeakEsModel() const [member function]
     cls.add_method('GetWeakEsModel', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True, visibility='private')
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetIpForward(bool forward) [member function]
     cls.add_method('SetIpForward', 
                    'void', 
                    [param('bool', 'forward')], 
-                   is_virtual=True, is_pure_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
     ## ipv4.h (module 'internet'): void ns3::Ipv4::SetWeakEsModel(bool model) [member function]
     cls.add_method('SetWeakEsModel', 
                    'void', 
                    [param('bool', 'model')], 
-                   is_virtual=True, is_pure_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
@@ -5276,42 +5441,42 @@
     cls.add_method('NotifyAddAddress', 
                    'void', 
                    [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyInterfaceDown(uint32_t interface) [member function]
     cls.add_method('NotifyInterfaceDown', 
                    'void', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyInterfaceUp(uint32_t interface) [member function]
     cls.add_method('NotifyInterfaceUp', 
                    'void', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyRemoveAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function]
     cls.add_method('NotifyRemoveAddress', 
                    'void', 
                    [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::PrintRoutingTable(ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) const [member function]
     cls.add_method('PrintRoutingTable', 
                    'void', 
                    [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): bool ns3::Ipv4RoutingProtocol::RouteInput(ns3::Ptr<const ns3::Packet> p, ns3::Ipv4Header const & header, ns3::Ptr<const ns3::NetDevice> idev, ns3::Ipv4RoutingProtocol::UnicastForwardCallback ucb, ns3::Ipv4RoutingProtocol::MulticastForwardCallback mcb, ns3::Ipv4RoutingProtocol::LocalDeliverCallback lcb, ns3::Ipv4RoutingProtocol::ErrorCallback ecb) [member function]
     cls.add_method('RouteInput', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice const >', 'idev'), param('ns3::Callback< void, ns3::Ptr< ns3::Ipv4Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ucb'), param('ns3::Callback< void, ns3::Ptr< ns3::Ipv4MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'mcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'lcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv4Header const &, ns3::Socket::SocketErrno, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ecb')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): ns3::Ptr<ns3::Ipv4Route> ns3::Ipv4RoutingProtocol::RouteOutput(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & header, ns3::Ptr<ns3::NetDevice> oif, ns3::Socket::SocketErrno & sockerr) [member function]
     cls.add_method('RouteOutput', 
                    'ns3::Ptr< ns3::Ipv4Route >', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice >', 'oif'), param('ns3::Socket::SocketErrno &', 'sockerr')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::SetIpv4(ns3::Ptr<ns3::Ipv4> ipv4) [member function]
     cls.add_method('SetIpv4', 
                    'void', 
                    [param('ns3::Ptr< ns3::Ipv4 >', 'ipv4')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
@@ -5443,47 +5608,47 @@
     cls.add_method('AddLinkChangeCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetAddress() const [member function]
     cls.add_method('GetAddress', 
                    'ns3::Address', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Address', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): ns3::Ptr<ns3::Channel> ns3::NetDevice::GetChannel() const [member function]
     cls.add_method('GetChannel', 
                    'ns3::Ptr< ns3::Channel >', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): uint32_t ns3::NetDevice::GetIfIndex() const [member function]
     cls.add_method('GetIfIndex', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): uint16_t ns3::NetDevice::GetMtu() const [member function]
     cls.add_method('GetMtu', 
                    'uint16_t', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
     cls.add_method('GetMulticast', 
                    'ns3::Address', 
                    [param('ns3::Ipv4Address', 'multicastGroup')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
     cls.add_method('GetMulticast', 
                    'ns3::Address', 
                    [param('ns3::Ipv6Address', 'addr')], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NetDevice::GetNode() const [member function]
     cls.add_method('GetNode', 
                    'ns3::Ptr< ns3::Node >', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): static ns3::TypeId ns3::NetDevice::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -5493,77 +5658,77 @@
     cls.add_method('IsBridge', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::IsBroadcast() const [member function]
     cls.add_method('IsBroadcast', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::IsLinkUp() const [member function]
     cls.add_method('IsLinkUp', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::IsMulticast() const [member function]
     cls.add_method('IsMulticast', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::IsPointToPoint() const [member function]
     cls.add_method('IsPointToPoint', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::NeedsArp() const [member function]
     cls.add_method('NeedsArp', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
     cls.add_method('Send', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
     cls.add_method('SendFrom', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): void ns3::NetDevice::SetAddress(ns3::Address address) [member function]
     cls.add_method('SetAddress', 
                    'void', 
                    [param('ns3::Address', 'address')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): void ns3::NetDevice::SetIfIndex(uint32_t const index) [member function]
     cls.add_method('SetIfIndex', 
                    'void', 
                    [param('uint32_t const', 'index')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::SetMtu(uint16_t const mtu) [member function]
     cls.add_method('SetMtu', 
                    'bool', 
                    [param('uint16_t const', 'mtu')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): void ns3::NetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
     cls.add_method('SetNode', 
                    'void', 
                    [param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): void ns3::NetDevice::SetPromiscReceiveCallback(ns3::NetDevice::PromiscReceiveCallback cb) [member function]
     cls.add_method('SetPromiscReceiveCallback', 
                    'void', 
                    [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): void ns3::NetDevice::SetReceiveCallback(ns3::NetDevice::ReceiveCallback cb) [member function]
     cls.add_method('SetReceiveCallback', 
                    'void', 
                    [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## net-device.h (module 'network'): bool ns3::NetDevice::SupportsSendFrom() const [member function]
     cls.add_method('SupportsSendFrom', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True, is_pure_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3NixVector_methods(root_module, cls):
@@ -6082,7 +6247,7 @@
     cls.add_method('operator()', 
                    'bool', 
                    [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('ns3::Address const &', 'arg1')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6104,7 +6269,7 @@
     cls.add_method('operator()', 
                    'ns3::ObjectBase *', 
                    [], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6126,7 +6291,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ipv4Header const &', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('ns3::Ipv4L3Protocol::DropReason', 'arg2'), param('ns3::Ptr< ns3::Ipv4 >', 'arg3'), param('unsigned int', 'arg4')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6148,7 +6313,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ipv4Header const &', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('unsigned int', 'arg2')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6170,7 +6335,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::Ptr< ns3::Ipv4 >', 'arg1'), param('unsigned int', 'arg2')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6192,7 +6357,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('short unsigned int', 'arg2'), param('ns3::Address const &', 'arg3'), param('ns3::Address const &', 'arg4'), param('ns3::NetDevice::PacketType', 'arg5')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6214,7 +6379,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'arg0')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6236,7 +6401,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('ns3::Address const &', 'arg1')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6258,7 +6423,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Socket >', 'arg0')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
@@ -6280,7 +6445,7 @@
     cls.add_method('operator()', 
                    'void', 
                    [param('ns3::Ptr< ns3::Socket >', 'arg0'), param('unsigned int', 'arg1')], 
-                   custom_name='__call__', is_virtual=True, is_pure_virtual=True)
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3HashImplementation_methods(root_module, cls):
@@ -6292,7 +6457,7 @@
     cls.add_method('GetHash32', 
                    'uint32_t', 
                    [param('char const *', 'buffer'), param('std::size_t const', 'size')], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     ## hash-function.h (module 'core'): uint64_t ns3::Hash::Implementation::GetHash64(char const * buffer, std::size_t const size) [member function]
     cls.add_method('GetHash64', 
                    'uint64_t', 
@@ -6302,7 +6467,7 @@
     cls.add_method('clear', 
                    'void', 
                    [], 
-                   is_virtual=True, is_pure_virtual=True)
+                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3HashFunctionFnv1a_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/bindings/callbacks_list.py ns-3.34/src/wave/bindings/callbacks_list.py
--- ns-3.33/src/wave/bindings/callbacks_list.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/bindings/callbacks_list.py	2021-07-14 10:31:07.000000000 -0700
@@ -18,22 +18,32 @@
     ['void', 'const ns3::Ipv6Header &', 'ns3::Ptr<const ns3::Packet>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'unsigned char', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'const ns3::WifiMacHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::Mac48Address', 'unsigned char', 'ns3::OriginatorBlockAckAgreement::State', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'const ns3::WifiMacHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::QueueDiscItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::WifiMac>', 'const ns3::OrganizationIdentifier &', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Address', 'ns3::Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'double', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::Time', 'WifiPhyState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::WifiMode', 'ns3::WifiPreamble', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
@@ -45,6 +55,4 @@
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiPhyRxfailureReason', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'ns3::SignalNoiseDbm', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::HePreambleParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/bindings/modulegen__gcc_ILP32.py ns-3.34/src/wave/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/wave/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -20,8 +20,10 @@
 def register_types(module):
     root_module = module.get_root()
     
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'SIG_A_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'FILTERED'], import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'], import_from_module='ns.wifi')
+    ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType [enumeration]
+    module.add_enum('TriggerFrameType', ['BASIC_TRIGGER', 'BFRP_TRIGGER', 'MU_BAR_TRIGGER', 'MU_RTS_TRIGGER', 'BSRP_TRIGGER', 'GCR_MU_BAR_TRIGGER', 'BQRP_TRIGGER', 'NFRP_TRIGGER'], import_from_module='ns.wifi')
     ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
     module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'], import_from_module='ns.wifi')
     ## channel-scheduler.h (module 'wave'): ns3::ChannelAccess [enumeration]
@@ -30,28 +32,34 @@
     module.add_enum('VsaTransmitInterval', ['VSA_TRANSMIT_IN_CCHI', 'VSA_TRANSMIT_IN_SCHI', 'VSA_TRANSMIT_IN_BOTHI'])
     ## queue-size.h (module 'network'): ns3::QueueSizeUnit [enumeration]
     module.add_enum('QueueSizeUnit', ['PACKETS', 'BYTES'], import_from_module='ns.network')
-    ## qos-txop.h (module 'wifi'): ns3::TypeOfStation [enumeration]
-    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA', 'OCB'], import_from_module='ns.wifi')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::WifiTxTimerReason [enumeration]
+    module.add_enum('WifiTxTimerReason', [], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT'], import_from_module='ns.wifi')
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
-    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
-    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
-    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'], import_from_module='ns.wifi')
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [enumeration]
-    module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'EXTENDED_COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'], import_from_module='ns.wifi')
+    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_TRIGGER', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
     module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_holland', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
+    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
     module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
-    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduField [enumeration]
+    module.add_enum('WifiPpduField', ['WIFI_PPDU_FIELD_PREAMBLE', 'WIFI_PPDU_FIELD_NON_HT_HEADER', 'WIFI_PPDU_FIELD_HT_SIG', 'WIFI_PPDU_FIELD_TRAINING', 'WIFI_PPDU_FIELD_SIG_A', 'WIFI_PPDU_FIELD_SIG_B', 'WIFI_PPDU_FIELD_DATA'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
+    module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
@@ -83,9 +91,15 @@
     ## block-ack-manager.h (module 'wifi'): ns3::Bar [struct]
     module.add_class('Bar', import_from_module='ns.wifi')
     ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement [class]
-    module.add_class('BlockAckAgreement', import_from_module='ns.wifi')
-    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache [class]
-    module.add_class('BlockAckCache', import_from_module='ns.wifi')
+    module.add_class('BlockAckAgreement', allow_subclassing=True, import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType [struct]
+    module.add_class('BlockAckReqType', import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID'], outer_class=root_module['ns3::BlockAckReqType'], import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [struct]
+    module.add_class('BlockAckType', import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID', 'MULTI_STA'], outer_class=root_module['ns3::BlockAckType'], import_from_module='ns.wifi')
     ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow [class]
     module.add_class('BlockAckWindow', import_from_module='ns.wifi')
     ## buffer.h (module 'network'): ns3::Buffer [class]
@@ -104,6 +118,8 @@
     module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
     ## callback.h (module 'core'): ns3::CallbackBase [class]
     module.add_class('CallbackBase', import_from_module='ns.core')
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField [class]
+    module.add_class('CtrlTriggerUserInfoField', import_from_module='ns.wifi')
     ## data-rate.h (module 'network'): ns3::DataRate [class]
     module.add_class('DataRate', import_from_module='ns.network')
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::AttributeAccessor> [struct]
@@ -122,12 +138,18 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::EventImpl'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Hash::Implementation> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation'])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MacRxMiddle> [struct]
+    module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::MacRxMiddle'])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MacTxMiddle> [struct]
+    module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::MacTxMiddle'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::NixVector> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::NixVector'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::OutputStreamWrapper> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::OutputStreamWrapper'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Packet> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Packet'])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity> [struct]
+    module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::PhyEntity'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::QueueItem> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::QueueItem'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SpectrumModel> [struct]
@@ -150,13 +172,11 @@
     module.add_class('Hasher', import_from_module='ns.core')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo [struct]
     module.add_class('HeMuUserInfo', import_from_module='ns.wifi')
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters [struct]
-    module.add_class('HePreambleParameters', import_from_module='ns.wifi')
     ## he-ru.h (module 'wifi'): ns3::HeRu [class]
     module.add_class('HeRu', import_from_module='ns.wifi')
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuType [enumeration]
     module.add_enum('RuType', ['RU_26_TONE', 'RU_52_TONE', 'RU_106_TONE', 'RU_242_TONE', 'RU_484_TONE', 'RU_996_TONE', 'RU_2x996_TONE'], outer_class=root_module['ns3::HeRu'], import_from_module='ns.wifi')
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [struct]
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [class]
     module.add_class('RuSpec', import_from_module='ns.wifi', outer_class=root_module['ns3::HeRu'])
     typehandlers.add_type_alias('std::pair< short, short >', 'ns3::HeRu::SubcarrierRange')
     typehandlers.add_type_alias('std::pair< short, short >*', 'ns3::HeRu::SubcarrierRange*')
@@ -164,10 +184,6 @@
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >', 'ns3::HeRu::SubcarrierGroup')
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >*', 'ns3::HeRu::SubcarrierGroup*')
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >&', 'ns3::HeRu::SubcarrierGroup&')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec', 'ns3::HeRu::RuSpec')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec*', 'ns3::HeRu::RuSpec*')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec&', 'ns3::HeRu::RuSpec&')
-    module.add_typedef(root_module['ns3::HeRu::RuSpec'], 'RuSpec')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >', 'ns3::HeRu::BwTonesPair')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >*', 'ns3::HeRu::BwTonesPair*')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >&', 'ns3::HeRu::BwTonesPair&')
@@ -184,12 +200,12 @@
     root_module['ns3::InetSocketAddress'].implicitly_converts_to(root_module['ns3::Address'])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper [class]
     module.add_class('InterferenceHelper', import_from_module='ns.wifi')
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer [struct]
-    module.add_class('SnrPer', import_from_module='ns.wifi', outer_class=root_module['ns3::InterferenceHelper'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -205,6 +221,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress [class]
     module.add_class('Ipv6InterfaceAddress', import_from_module='ns.internet')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::State_e [enumeration]
@@ -234,9 +252,7 @@
     module.add_class('Mac8Address', import_from_module='ns.network')
     ## mac8-address.h (module 'network'): ns3::Mac8Address [class]
     root_module['ns3::Mac8Address'].implicitly_converts_to(root_module['ns3::Address'])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters [class]
-    module.add_class('MacLowTransmissionParameters', import_from_module='ns.wifi')
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo [struct]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo [struct]
     module.add_class('MpduInfo', import_from_module='ns.wifi')
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
@@ -285,7 +301,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -294,9 +310,11 @@
     module.add_class('PcapHelperForIpv6', allow_subclassing=True, import_from_module='ns.internet')
     ## queue-size.h (module 'network'): ns3::QueueSize [class]
     module.add_class('QueueSize', import_from_module='ns.network')
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo [struct]
+    module.add_class('RxSignalInfo', import_from_module='ns.wifi')
     ## channel-scheduler.h (module 'wave'): ns3::SchInfo [struct]
     module.add_class('SchInfo')
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm [struct]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm [struct]
     module.add_class('SignalNoiseDbm', import_from_module='ns.wifi')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::ObjectBase'], template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'])
@@ -348,6 +366,36 @@
     module.add_class('WaveBsmHelper')
     ## wave-helper.h (module 'wave'): ns3::WaveHelper [class]
     module.add_class('WaveHelper', allow_subclassing=True)
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc [class]
+    module.add_class('WifiAc', import_from_module='ns.wifi')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment [struct]
+    module.add_class('WifiAcknowledgment', allow_subclassing=True, import_from_module='ns.wifi')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::Method [enumeration]
+    module.add_enum('Method', ['NONE', 'NORMAL_ACK', 'BLOCK_ACK', 'BAR_BLOCK_ACK', 'DL_MU_BAR_BA_SEQUENCE', 'DL_MU_TF_MU_BAR', 'DL_MU_AGGREGATE_TF', 'UL_MU_MULTI_STA_BA', 'ACK_AFTER_TB_PPDU'], outer_class=root_module['ns3::WifiAcknowledgment'], import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash [struct]
+    module.add_class('WifiAddressHash', import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash [struct]
+    module.add_class('WifiAddressTidHash', import_from_module='ns.wifi')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck [struct]
+    module.add_class('WifiBarBlockAck', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck [struct]
+    module.add_class('WifiBlockAck', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf [struct]
+    module.add_class('WifiDlMuAggregateTf', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo [struct]
+    module.add_class('BlockAckInfo', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiDlMuAggregateTf'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence [struct]
+    module.add_class('WifiDlMuBarBaSequence', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo [struct]
+    module.add_class('AckInfo', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiDlMuBarBaSequence'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo [struct]
+    module.add_class('BlockAckInfo', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiDlMuBarBaSequence'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo [struct]
+    module.add_class('BlockAckReqInfo', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiDlMuBarBaSequence'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar [struct]
+    module.add_class('WifiDlMuTfMuBar', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo [struct]
+    module.add_class('BlockAckInfo', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiDlMuTfMuBar'])
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper [class]
     module.add_class('WifiHelper', allow_subclassing=True, import_from_module='ns.wifi')
     typehandlers.add_type_alias('std::function< unsigned long long ( ns3::Ptr< ns3::QueueItem > ) >', 'ns3::WifiHelper::SelectQueueCallback')
@@ -359,10 +407,44 @@
     module.add_class('WifiMode', import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
     module.add_class('WifiModeFactory', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::CodeRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::CodeRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::CodeRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck [struct]
+    module.add_class('WifiNoAck', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck [struct]
+    module.add_class('WifiNormalAck', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper [class]
     module.add_class('WifiPhyHelper', import_from_module='ns.wifi', parent=[root_module['ns3::PcapHelperForDevice'], root_module['ns3::AsciiTraceHelperForDevice']])
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::SupportedPcapDataLinkTypes [enumeration]
     module.add_enum('SupportedPcapDataLinkTypes', ['DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO'], outer_class=root_module['ns3::WifiPhyHelper'], import_from_module='ns.wifi')
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel [class]
+    module.add_class('WifiPhyOperatingChannel', import_from_module='ns.wifi')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection [struct]
+    module.add_class('WifiProtection', allow_subclassing=True, import_from_module='ns.wifi')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::Method [enumeration]
+    module.add_enum('Method', ['NONE', 'RTS_CTS', 'CTS_TO_SELF'], outer_class=root_module['ns3::WifiProtection'], import_from_module='ns.wifi')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
     module.add_class('WifiRemoteStation', import_from_module='ns.wifi')
     ## wifi-remote-station-info.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
@@ -371,17 +453,41 @@
     module.add_class('WifiRemoteStationState', import_from_module='ns.wifi')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState [enumeration]
     module.add_enum('', ['BRAND_NEW', 'DISASSOC', 'WAIT_ASSOC_TX_OK', 'GOT_ASSOC_TX_OK'], outer_class=root_module['ns3::WifiRemoteStationState'], import_from_module='ns.wifi')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection [struct]
+    module.add_class('WifiRtsCtsProtection', import_from_module='ns.wifi', parent=root_module['ns3::WifiProtection'])
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory [class]
     module.add_class('WifiSpectrumValue5MhzFactory', allow_subclassing=True, import_from_module='ns.spectrum')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValueHelper [class]
     module.add_class('WifiSpectrumValueHelper', import_from_module='ns.spectrum')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
     module.add_class('WifiStandardInfo', import_from_module='ns.wifi')
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters [class]
+    module.add_class('WifiTxParameters', import_from_module='ns.wifi')
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo [struct]
+    module.add_class('PsduInfo', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiTxParameters'])
+    typehandlers.add_type_alias('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >', 'ns3::WifiTxParameters::PsduInfoMap')
+    typehandlers.add_type_alias('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >*', 'ns3::WifiTxParameters::PsduInfoMap*')
+    typehandlers.add_type_alias('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >&', 'ns3::WifiTxParameters::PsduInfoMap&')
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer [class]
+    module.add_class('WifiTxTimer', import_from_module='ns.wifi')
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::Reason [enumeration]
+    module.add_enum('Reason', ['NOT_RUNNING', 'WAIT_CTS', 'WAIT_NORMAL_ACK', 'WAIT_BLOCK_ACK', 'WAIT_NORMAL_ACK_AFTER_DL_MU_PPDU', 'WAIT_BLOCK_ACKS_IN_TB_PPDU', 'WAIT_TB_PPDU_AFTER_BASIC_TF', 'WAIT_QOS_NULL_AFTER_BSRP_TF', 'WAIT_BLOCK_ACK_AFTER_TB_PPDU'], outer_class=root_module['ns3::WifiTxTimer'], import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiTxTimer::MpduResponseTimeout')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiTxTimer::MpduResponseTimeout*')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiTxTimer::MpduResponseTimeout&')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiTxTimer::PsduResponseTimeout')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiTxTimer::PsduResponseTimeout*')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiTxTimer::PsduResponseTimeout&')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiTxTimer::PsduMapResponseTimeout')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiTxTimer::PsduMapResponseTimeout*')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiTxTimer::PsduMapResponseTimeout&')
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
     module.add_class('WifiTxVector', import_from_module='ns.wifi')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >', 'ns3::WifiTxVector::HeMuUserInfoMap')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >*', 'ns3::WifiTxVector::HeMuUserInfoMap*')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >&', 'ns3::WifiTxVector::HeMuUserInfoMap&')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa [struct]
+    module.add_class('WifiUlMuMultiStaBa', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
     ## yans-wifi-helper.h (module 'wifi'): ns3::YansWifiChannelHelper [class]
     module.add_class('YansWifiChannelHelper', import_from_module='ns.wifi')
     ## yans-wifi-helper.h (module 'wifi'): ns3::YansWifiPhyHelper [class]
@@ -398,8 +504,6 @@
     module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
     ## higher-tx-tag.h (module 'wave'): ns3::HigherLayerTxVectorTag [class]
     module.add_class('HigherLayerTxVectorTag', parent=root_module['ns3::Tag'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader [class]
-    module.add_class('HtSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## internet-stack-helper.h (module 'internet'): ns3::InternetStackHelper [class]
     module.add_class('InternetStackHelper', import_from_module='ns.internet', parent=[root_module['ns3::PcapHelperForIpv4'], root_module['ns3::PcapHelperForIpv6'], root_module['ns3::AsciiTraceHelperForIpv4'], root_module['ns3::AsciiTraceHelperForIpv6']])
     ## ipv4-header.h (module 'internet'): ns3::Ipv4Header [class]
@@ -416,8 +520,6 @@
     module.add_enum('NextHeader_e', ['IPV6_EXT_HOP_BY_HOP', 'IPV6_IPV4', 'IPV6_TCP', 'IPV6_UDP', 'IPV6_IPV6', 'IPV6_EXT_ROUTING', 'IPV6_EXT_FRAGMENTATION', 'IPV6_EXT_CONFIDENTIALITY', 'IPV6_EXT_AUTHENTIFICATION', 'IPV6_ICMPV6', 'IPV6_EXT_END', 'IPV6_EXT_DESTINATION', 'IPV6_SCTP', 'IPV6_EXT_MOBILITY', 'IPV6_UDP_LITE'], outer_class=root_module['ns3::Ipv6Header'], import_from_module='ns.internet')
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::EcnType [enumeration]
     module.add_enum('EcnType', ['ECN_NotECT', 'ECN_ECT1', 'ECN_ECT0', 'ECN_CE'], outer_class=root_module['ns3::Ipv6Header'], import_from_module='ns.internet')
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader [class]
-    module.add_class('LSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## wave-mac-helper.h (module 'wave'): ns3::NqosWaveMacHelper [class]
     module.add_class('NqosWaveMacHelper', parent=root_module['ns3::WifiMacHelper'])
     ## object.h (module 'core'): ns3::Object [class]
@@ -454,12 +556,18 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MacRxMiddle', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MacRxMiddle>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MacTxMiddle', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MacTxMiddle>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PhyEntity', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PhyEntity>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
@@ -513,21 +621,15 @@
     module.add_class('TriangularRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## txop.h (module 'wifi'): ns3::Txop [class]
     module.add_class('Txop', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxFailed&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxDropped')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxDropped*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxDropped&')
+    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus [enumeration]
+    module.add_enum('ChannelAccessStatus', ['NOT_REQUESTED', 'REQUESTED', 'GRANTED'], outer_class=root_module['ns3::Txop'], import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::DroppedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::DroppedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::DroppedMpdu&')
     ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
     module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificActionHeader [class]
     module.add_class('VendorSpecificActionHeader', parent=root_module['ns3::Header'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader [class]
-    module.add_class('VhtSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## vsa-manager.h (module 'wave'): ns3::VsaManager [class]
     module.add_class('VsaManager', parent=root_module['ns3::Object'])
     ## wave-bsm-stats.h (module 'wave'): ns3::WaveBsmStats [class]
@@ -536,10 +638,19 @@
     module.add_class('WeibullRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## wifi-80211p-helper.h (module 'wave'): ns3::Wifi80211pHelper [class]
     module.add_class('Wifi80211pHelper', parent=root_module['ns3::WifiHelper'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu [struct]
+    module.add_class('WifiAckAfterTbPpdu', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-ack-manager.h (module 'wifi'): ns3::WifiAckManager [class]
+    module.add_class('WifiAckManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection [struct]
+    module.add_class('WifiCtsToSelfProtection', import_from_module='ns.wifi', parent=root_module['ns3::WifiProtection'])
     ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement [class]
     module.add_class('WifiInformationElement', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >'])
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac [class]
     module.add_class('WifiMac', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiMac::ForwardUpCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiMac::ForwardUpCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiMac::ForwardUpCallback&')
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader [class]
     module.add_class('WifiMacHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy [enumeration]
@@ -551,17 +662,21 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiMacHeader const & )&', 'ns3::WifiMacHeader::TracedCallback&')
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem [class]
     module.add_class('WifiMacQueueItem', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >'])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair [struct]
+    module.add_class('QueueIteratorPair', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiMacQueueItem'])
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::WifiMacQueueItem::DeaggregatedMsdus')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::WifiMacQueueItem::DeaggregatedMsdus*')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::WifiMacQueueItem::DeaggregatedMsdus&')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI*')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI&')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'ns3::WifiMacQueueItem::ConstIterator')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator*', 'ns3::WifiMacQueueItem::ConstIterator*')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator&', 'ns3::WifiMacQueueItem::ConstIterator&')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection [struct]
+    module.add_class('WifiNoProtection', import_from_module='ns.wifi', parent=root_module['ns3::WifiProtection'])
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy [class]
     module.add_class('WifiPhy', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >', 'ns3::WifiPhy::ChannelNumberBandPair')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >*', 'ns3::WifiPhy::ChannelNumberBandPair*')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >&', 'ns3::WifiPhy::ChannelNumberBandPair&')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >', 'ns3::WifiPhy::ChannelNumberStandardPair')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >*', 'ns3::WifiPhy::ChannelNumberStandardPair*')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >&', 'ns3::WifiPhy::ChannelNumberStandardPair&')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >', 'ns3::WifiPhy::FrequencyWidthPair')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >*', 'ns3::WifiPhy::FrequencyWidthPair*')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >&', 'ns3::WifiPhy::FrequencyWidthPair&')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )', 'ns3::WifiPhy::MonitorSnifferRxCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )*', 'ns3::WifiPhy::MonitorSnifferRxCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )&', 'ns3::WifiPhy::MonitorSnifferRxCallback&')
@@ -571,9 +686,6 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )', 'ns3::WifiPhy::PsduTxBeginCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )*', 'ns3::WifiPhy::PsduTxBeginCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )&', 'ns3::WifiPhy::PsduTxBeginCallback&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )', 'ns3::WifiPhy::EndOfHePreambleCallback')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )*', 'ns3::WifiPhy::EndOfHePreambleCallback*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )&', 'ns3::WifiPhy::EndOfHePreambleCallback&')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )*', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )&', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback&')
@@ -593,6 +705,8 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::WifiMode, ns3::WifiPreamble, uint8_t )&', 'ns3::WifiPhyStateHelper::TxTracedCallback&')
     ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu [class]
     module.add_class('WifiPpdu', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >'])
+    ## wifi-protection-manager.h (module 'wifi'): ns3::WifiProtectionManager [class]
+    module.add_class('WifiProtectionManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu [class]
     module.add_class('WifiPsdu', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> >'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
@@ -635,12 +749,12 @@
     module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager [class]
     module.add_class('BlockAckManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )', 'ns3::BlockAckManager::AgreementStateTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )*', 'ns3::BlockAckManager::AgreementStateTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )&', 'ns3::BlockAckManager::AgreementStateTracedCallback&')
@@ -670,6 +784,18 @@
     module.add_class('ChannelScheduler', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable [class]
     module.add_class('ConstantRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader [class]
+    module.add_class('CtrlBAckRequestHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader [class]
+    module.add_class('CtrlBAckResponseHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader [class]
+    module.add_class('CtrlTriggerHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'ns3::CtrlTriggerHeader::ConstIterator')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > const_iterator*', 'ns3::CtrlTriggerHeader::ConstIterator*')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > const_iterator&', 'ns3::CtrlTriggerHeader::ConstIterator&')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > iterator', 'ns3::CtrlTriggerHeader::Iterator')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > iterator*', 'ns3::CtrlTriggerHeader::Iterator*')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > iterator&', 'ns3::CtrlTriggerHeader::Iterator&')
     ## data-rate.h (module 'network'): ns3::DataRateChecker [class]
     module.add_class('DataRateChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## data-rate.h (module 'network'): ns3::DataRateValue [class]
@@ -680,8 +806,6 @@
     module.add_class('DeterministicRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## double.h (module 'core'): ns3::DoubleValue [class]
     module.add_class('DoubleValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader [class]
-    module.add_class('DsssSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable [class]
     module.add_class('EmpiricalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor [class]
@@ -704,12 +828,18 @@
     module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
     ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable [class]
     module.add_class('ExponentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## frame-exchange-manager.h (module 'wifi'): ns3::FrameExchangeManager [class]
+    module.add_class('FrameExchangeManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::FrameExchangeManager::DroppedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::FrameExchangeManager::DroppedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::FrameExchangeManager::DroppedMpdu&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::FrameExchangeManager::AckedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::FrameExchangeManager::AckedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::FrameExchangeManager::AckedMpdu&')
     ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable [class]
     module.add_class('GammaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities [class]
     module.add_class('HeCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader [class]
-    module.add_class('HeSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities [class]
     module.add_class('HtCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## integer.h (module 'core'): ns3::IntegerValue [class]
@@ -788,32 +918,18 @@
     module.add_class('Mac48AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## mac48-address.h (module 'network'): ns3::Mac48AddressValue [class]
     module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
-    ## mac-low.h (module 'wifi'): ns3::MacLow [class]
-    module.add_class('MacLow', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::MacLow::MacLowRxCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::MacLow::MacLowRxCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::MacLow::MacLowRxCallback&')
+    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle [class]
+    module.add_class('MacRxMiddle', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::MacRxMiddle::ForwardUpCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::MacRxMiddle::ForwardUpCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::MacRxMiddle::ForwardUpCallback&')
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle [class]
+    module.add_class('MacTxMiddle', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >'])
     ## mobility-model.h (module 'mobility'): ns3::MobilityModel [class]
     module.add_class('MobilityModel', import_from_module='ns.mobility', parent=root_module['ns3::Object'])
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::MobilityModel const > )', 'ns3::MobilityModel::TracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::MobilityModel const > )*', 'ns3::MobilityModel::TracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::MobilityModel const > )&', 'ns3::MobilityModel::TracedCallback&')
-    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator [class]
-    module.add_class('MpduAggregator', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'ns3::MpduAggregator::EdcaQueues')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >*', 'ns3::MpduAggregator::EdcaQueues*')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >&', 'ns3::MpduAggregator::EdcaQueues&')
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator [class]
-    module.add_class('MsduAggregator', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::MsduAggregator::DeaggregatedMsdus')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::MsduAggregator::DeaggregatedMsdus*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::MsduAggregator::DeaggregatedMsdus&')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::MsduAggregator::DeaggregatedMsdusCI')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::MsduAggregator::DeaggregatedMsdusCI*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::MsduAggregator::DeaggregatedMsdusCI&')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'ns3::MsduAggregator::EdcaQueues')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >*', 'ns3::MsduAggregator::EdcaQueues*')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >&', 'ns3::MsduAggregator::EdcaQueues&')
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -871,10 +987,26 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::Packet::SinrTracedCallback&')
     ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable [class]
     module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity [class]
+    module.add_class('PhyEntity', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyRxFailureAction [enumeration]
+    module.add_enum('PhyRxFailureAction', ['DROP', 'ABORT', 'IGNORE'], outer_class=root_module['ns3::PhyEntity'], import_from_module='ns.wifi')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus [struct]
+    module.add_class('PhyFieldRxStatus', import_from_module='ns.wifi', outer_class=root_module['ns3::PhyEntity'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer [struct]
+    module.add_class('SnrPer', import_from_module='ns.wifi', outer_class=root_module['ns3::PhyEntity'])
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >', 'ns3::PhyEntity::PhyHeaderChunkInfo')
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >*', 'ns3::PhyEntity::PhyHeaderChunkInfo*')
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >&', 'ns3::PhyEntity::PhyHeaderChunkInfo&')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', 'ns3::PhyEntity::PhyHeaderSections')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >*', 'ns3::PhyEntity::PhyHeaderSections*')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >&', 'ns3::PhyEntity::PhyHeaderSections&')
     ## pointer.h (module 'core'): ns3::PointerChecker [class]
     module.add_class('PointerChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## pointer.h (module 'core'): ns3::PointerValue [class]
     module.add_class('PointerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::QosFrameExchangeManager [class]
+    module.add_class('QosFrameExchangeManager', import_from_module='ns.wifi', parent=root_module['ns3::FrameExchangeManager'])
     ## qos-txop.h (module 'wifi'): ns3::QosTxop [class]
     module.add_class('QosTxop', import_from_module='ns.wifi', parent=root_module['ns3::Txop'])
     ## queue.h (module 'network'): ns3::Queue<ns3::Packet> [class]
@@ -913,9 +1045,6 @@
     module.add_class('ReceiveListErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
     ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
     module.add_class('RegularWifiMac', import_from_module='ns.wifi', parent=root_module['ns3::WifiMac'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RegularWifiMac::ForwardUpCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RegularWifiMac::ForwardUpCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RegularWifiMac::ForwardUpCallback&')
     ## ssid.h (module 'wifi'): ns3::Ssid [class]
     module.add_class('Ssid', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## ssid.h (module 'wifi'): ns3::SsidChecker [class]
@@ -940,8 +1069,8 @@
     module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities [class]
     module.add_class('VhtCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
-    ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow [class]
-    module.add_class('WaveMacLow', parent=root_module['ns3::MacLow'])
+    ## wave-frame-exchange-manager.h (module 'wave'): ns3::WaveFrameExchangeManager [class]
+    module.add_class('WaveFrameExchangeManager', parent=root_module['ns3::QosFrameExchangeManager'])
     ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue [class]
     module.add_class('WifiMacQueue', import_from_module='ns.wifi', parent=root_module['ns3::Queue< ns3::WifiMacQueueItem >'])
     ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::DropPolicy [enumeration]
@@ -968,8 +1097,18 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::WifiMac>, const ns3::OrganizationIdentifier &, ns3::Ptr<const ns3::Packet>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::WifiMac>', 'const ns3::OrganizationIdentifier &', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv4Header &', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ipv4L3Protocol::DropReason', 'ns3::Ptr<ns3::Ipv4>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -982,8 +1121,6 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::WifiMacHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Address, ns3::Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Address', 'ns3::Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::HePreambleParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1026,8 +1163,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'double', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1036,12 +1173,20 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'WifiPhyState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1055,7 +1200,10 @@
     typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet const >, ns3::Address const &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WaveNetDevice::WaveVsaCallback')
     typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet const >, ns3::Address const &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WaveNetDevice::WaveVsaCallback*')
     typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet const >, ns3::Address const &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WaveNetDevice::WaveVsaCallback&')
+    module.add_container('std::list< ns3::BlockAckReqType >', 'ns3::BlockAckReqType', container_type='list')
+    module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
     module.add_container('std::vector< std::pair< short, short > >', 'std::pair< short, short >', container_type='vector')
+    module.add_container('std::vector< ns3::HeRu::RuSpec >', 'ns3::HeRu::RuSpec', container_type='vector')
     module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
     module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('ns3::RxPowerWattPerChannelBand', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
@@ -1064,12 +1212,25 @@
     module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::vector< int >', 'int', container_type='vector')
     module.add_container('std::vector< unsigned int >', 'unsigned int', container_type='vector')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuAggregateTf::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuAggregateTf::BlockAckInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::AckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::AckInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckReqInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckReqInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuTfMuBar::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuTfMuBar::BlockAckInfo'), container_type='map')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
+    module.add_container('std::map< unsigned char, std::set< unsigned short > >', ('unsigned char', 'std::set< unsigned short >'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >', ('ns3::Mac48Address', 'ns3::WifiTxParameters::PsduInfo'), container_type='map')
     module.add_container('std::map< unsigned short, ns3::HeMuUserInfo >', ('short unsigned int', 'ns3::HeMuUserInfo'), container_type='map')
+    module.add_container('std::map< std::pair< ns3::Mac48Address, unsigned char >, unsigned long long >', ('std::pair< ns3::Mac48Address, unsigned char >', 'long unsigned int'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('ns3::Bands', 'ns3::BandInfo', container_type='vector')
+    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
+    module.add_container('std::list< ns3::WifiMacQueueItem::QueueIteratorPair >', 'ns3::WifiMacQueueItem::QueueIteratorPair', container_type='list')
+    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiConstPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
+    module.add_container('std::list< ns3::WifiMode >', 'ns3::WifiMode', container_type='list')
+    module.add_container('std::list< unsigned char >', 'unsigned char', container_type='list')
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
     module.add_container('std::vector< unsigned short >', 'short unsigned int', container_type='vector')
     module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
@@ -1079,25 +1240,25 @@
     module.add_container('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationState *', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
-    module.add_container('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('ns3::MpduAggregator::EdcaQueues', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('ns3::MsduAggregator::DeaggregatedMsdus', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('ns3::MsduAggregator::EdcaQueues', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('std::map< ns3::Mac48Address, bool >', ('ns3::Mac48Address', 'bool'), container_type='map')
-    module.add_container('std::list< ns3::Ptr< ns3::WifiMacQueueItem > >', 'ns3::Ptr< ns3::WifiMacQueueItem >', container_type='list')
+    module.add_container('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
+    module.add_container('ns3::PhyEntity::PhyHeaderSections', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
     module.add_container('std::map< std::pair< unsigned int, unsigned int >, double >', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
+    module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
+    module.add_container('std::set< ns3::Mac48Address >', 'ns3::Mac48Address', container_type='set')
     module.add_container('std::map< unsigned int, ns3::Ptr< ns3::OcbWifiMac > >', ('unsigned int', 'ns3::Ptr< ns3::OcbWifiMac >'), container_type='map')
     module.add_container('std::vector< ns3::Ptr< ns3::WifiPhy > >', 'ns3::Ptr< ns3::WifiPhy >', container_type='vector')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxOkCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxOkCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxOkCallback&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', 'ns3::FrequencyChannelInfo')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >*', 'ns3::FrequencyChannelInfo*')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >&', 'ns3::FrequencyChannelInfo&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxOkCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxOkCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxOkCallback&')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxErrorCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxErrorCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxErrorCallback&')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >', 'ns3::RxPowerWattPerChannelBand')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >*', 'ns3::RxPowerWattPerChannelBand*')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >&', 'ns3::RxPowerWattPerChannelBand&')
@@ -1113,6 +1274,9 @@
     typehandlers.add_type_alias('uint32_t', 'ns3::SpectrumModelUid_t')
     typehandlers.add_type_alias('uint32_t*', 'ns3::SpectrumModelUid_t*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::SpectrumModelUid_t&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -1137,12 +1301,18 @@
     typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
     typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
+    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
+    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -1267,7 +1437,8 @@
     register_Ns3BandInfo_methods(root_module, root_module['ns3::BandInfo'])
     register_Ns3Bar_methods(root_module, root_module['ns3::Bar'])
     register_Ns3BlockAckAgreement_methods(root_module, root_module['ns3::BlockAckAgreement'])
-    register_Ns3BlockAckCache_methods(root_module, root_module['ns3::BlockAckCache'])
+    register_Ns3BlockAckReqType_methods(root_module, root_module['ns3::BlockAckReqType'])
+    register_Ns3BlockAckType_methods(root_module, root_module['ns3::BlockAckType'])
     register_Ns3BlockAckWindow_methods(root_module, root_module['ns3::BlockAckWindow'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
@@ -1277,6 +1448,7 @@
     register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
     register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
+    register_Ns3CtrlTriggerUserInfoField_methods(root_module, root_module['ns3::CtrlTriggerUserInfoField'])
     register_Ns3DataRate_methods(root_module, root_module['ns3::DataRate'])
     register_Ns3DefaultDeleter__Ns3AttributeAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::AttributeAccessor >'])
     register_Ns3DefaultDeleter__Ns3AttributeChecker_methods(root_module, root_module['ns3::DefaultDeleter< ns3::AttributeChecker >'])
@@ -1286,9 +1458,12 @@
     register_Ns3DefaultDeleter__Ns3Event_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Event >'])
     register_Ns3DefaultDeleter__Ns3EventImpl_methods(root_module, root_module['ns3::DefaultDeleter< ns3::EventImpl >'])
     register_Ns3DefaultDeleter__Ns3HashImplementation_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Hash::Implementation >'])
+    register_Ns3DefaultDeleter__Ns3MacRxMiddle_methods(root_module, root_module['ns3::DefaultDeleter< ns3::MacRxMiddle >'])
+    register_Ns3DefaultDeleter__Ns3MacTxMiddle_methods(root_module, root_module['ns3::DefaultDeleter< ns3::MacTxMiddle >'])
     register_Ns3DefaultDeleter__Ns3NixVector_methods(root_module, root_module['ns3::DefaultDeleter< ns3::NixVector >'])
     register_Ns3DefaultDeleter__Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::DefaultDeleter< ns3::OutputStreamWrapper >'])
     register_Ns3DefaultDeleter__Ns3Packet_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Packet >'])
+    register_Ns3DefaultDeleter__Ns3PhyEntity_methods(root_module, root_module['ns3::DefaultDeleter< ns3::PhyEntity >'])
     register_Ns3DefaultDeleter__Ns3QueueItem_methods(root_module, root_module['ns3::DefaultDeleter< ns3::QueueItem >'])
     register_Ns3DefaultDeleter__Ns3SpectrumModel_methods(root_module, root_module['ns3::DefaultDeleter< ns3::SpectrumModel >'])
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
@@ -1300,25 +1475,24 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3HeMuUserInfo_methods(root_module, root_module['ns3::HeMuUserInfo'])
-    register_Ns3HePreambleParameters_methods(root_module, root_module['ns3::HePreambleParameters'])
     register_Ns3HeRu_methods(root_module, root_module['ns3::HeRu'])
     register_Ns3HeRuRuSpec_methods(root_module, root_module['ns3::HeRu::RuSpec'])
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3InterferenceHelper_methods(root_module, root_module['ns3::InterferenceHelper'])
-    register_Ns3InterferenceHelperSnrPer_methods(root_module, root_module['ns3::InterferenceHelper::SnrPer'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6InterfaceContainer_methods(root_module, root_module['ns3::Ipv6InterfaceContainer'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
-    register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
     register_Ns3MpduInfo_methods(root_module, root_module['ns3::MpduInfo'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
@@ -1341,6 +1515,7 @@
     register_Ns3PcapHelperForIpv4_methods(root_module, root_module['ns3::PcapHelperForIpv4'])
     register_Ns3PcapHelperForIpv6_methods(root_module, root_module['ns3::PcapHelperForIpv6'])
     register_Ns3QueueSize_methods(root_module, root_module['ns3::QueueSize'])
+    register_Ns3RxSignalInfo_methods(root_module, root_module['ns3::RxSignalInfo'])
     register_Ns3SchInfo_methods(root_module, root_module['ns3::SchInfo'])
     register_Ns3SignalNoiseDbm_methods(root_module, root_module['ns3::SignalNoiseDbm'])
     register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
@@ -1361,18 +1536,41 @@
     register_Ns3VsaInfo_methods(root_module, root_module['ns3::VsaInfo'])
     register_Ns3WaveBsmHelper_methods(root_module, root_module['ns3::WaveBsmHelper'])
     register_Ns3WaveHelper_methods(root_module, root_module['ns3::WaveHelper'])
+    register_Ns3WifiAc_methods(root_module, root_module['ns3::WifiAc'])
+    register_Ns3WifiAcknowledgment_methods(root_module, root_module['ns3::WifiAcknowledgment'])
+    register_Ns3WifiAddressHash_methods(root_module, root_module['ns3::WifiAddressHash'])
+    register_Ns3WifiAddressTidHash_methods(root_module, root_module['ns3::WifiAddressTidHash'])
+    register_Ns3WifiBarBlockAck_methods(root_module, root_module['ns3::WifiBarBlockAck'])
+    register_Ns3WifiBlockAck_methods(root_module, root_module['ns3::WifiBlockAck'])
+    register_Ns3WifiDlMuAggregateTf_methods(root_module, root_module['ns3::WifiDlMuAggregateTf'])
+    register_Ns3WifiDlMuAggregateTfBlockAckInfo_methods(root_module, root_module['ns3::WifiDlMuAggregateTf::BlockAckInfo'])
+    register_Ns3WifiDlMuBarBaSequence_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence'])
+    register_Ns3WifiDlMuBarBaSequenceAckInfo_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence::AckInfo'])
+    register_Ns3WifiDlMuBarBaSequenceBlockAckInfo_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence::BlockAckInfo'])
+    register_Ns3WifiDlMuBarBaSequenceBlockAckReqInfo_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence::BlockAckReqInfo'])
+    register_Ns3WifiDlMuTfMuBar_methods(root_module, root_module['ns3::WifiDlMuTfMuBar'])
+    register_Ns3WifiDlMuTfMuBarBlockAckInfo_methods(root_module, root_module['ns3::WifiDlMuTfMuBar::BlockAckInfo'])
     register_Ns3WifiHelper_methods(root_module, root_module['ns3::WifiHelper'])
     register_Ns3WifiMacHelper_methods(root_module, root_module['ns3::WifiMacHelper'])
     register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
     register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
+    register_Ns3WifiNoAck_methods(root_module, root_module['ns3::WifiNoAck'])
+    register_Ns3WifiNormalAck_methods(root_module, root_module['ns3::WifiNormalAck'])
     register_Ns3WifiPhyHelper_methods(root_module, root_module['ns3::WifiPhyHelper'])
+    register_Ns3WifiPhyOperatingChannel_methods(root_module, root_module['ns3::WifiPhyOperatingChannel'])
+    register_Ns3WifiProtection_methods(root_module, root_module['ns3::WifiProtection'])
     register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
     register_Ns3WifiRemoteStationInfo_methods(root_module, root_module['ns3::WifiRemoteStationInfo'])
     register_Ns3WifiRemoteStationState_methods(root_module, root_module['ns3::WifiRemoteStationState'])
+    register_Ns3WifiRtsCtsProtection_methods(root_module, root_module['ns3::WifiRtsCtsProtection'])
     register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, root_module['ns3::WifiSpectrumValue5MhzFactory'])
     register_Ns3WifiSpectrumValueHelper_methods(root_module, root_module['ns3::WifiSpectrumValueHelper'])
     register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
+    register_Ns3WifiTxParameters_methods(root_module, root_module['ns3::WifiTxParameters'])
+    register_Ns3WifiTxParametersPsduInfo_methods(root_module, root_module['ns3::WifiTxParameters::PsduInfo'])
+    register_Ns3WifiTxTimer_methods(root_module, root_module['ns3::WifiTxTimer'])
     register_Ns3WifiTxVector_methods(root_module, root_module['ns3::WifiTxVector'])
+    register_Ns3WifiUlMuMultiStaBa_methods(root_module, root_module['ns3::WifiUlMuMultiStaBa'])
     register_Ns3YansWifiChannelHelper_methods(root_module, root_module['ns3::YansWifiChannelHelper'])
     register_Ns3YansWifiPhyHelper_methods(root_module, root_module['ns3::YansWifiPhyHelper'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
@@ -1380,11 +1578,9 @@
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3HigherLayerTxVectorTag_methods(root_module, root_module['ns3::HigherLayerTxVectorTag'])
-    register_Ns3HtSigHeader_methods(root_module, root_module['ns3::HtSigHeader'])
     register_Ns3InternetStackHelper_methods(root_module, root_module['ns3::InternetStackHelper'])
     register_Ns3Ipv4Header_methods(root_module, root_module['ns3::Ipv4Header'])
     register_Ns3Ipv6Header_methods(root_module, root_module['ns3::Ipv6Header'])
-    register_Ns3LSigHeader_methods(root_module, root_module['ns3::LSigHeader'])
     register_Ns3NqosWaveMacHelper_methods(root_module, root_module['ns3::NqosWaveMacHelper'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
@@ -1403,9 +1599,12 @@
     register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
     register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >'])
     register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >'])
+    register_Ns3SimpleRefCount__Ns3MacRxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacRxMiddle__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >'])
+    register_Ns3SimpleRefCount__Ns3MacTxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacTxMiddle__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >'])
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >'])
     register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >'])
     register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >'])
     register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >'])
     register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >'])
@@ -1429,18 +1628,23 @@
     register_Ns3Txop_methods(root_module, root_module['ns3::Txop'])
     register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
     register_Ns3VendorSpecificActionHeader_methods(root_module, root_module['ns3::VendorSpecificActionHeader'])
-    register_Ns3VhtSigHeader_methods(root_module, root_module['ns3::VhtSigHeader'])
     register_Ns3VsaManager_methods(root_module, root_module['ns3::VsaManager'])
     register_Ns3WaveBsmStats_methods(root_module, root_module['ns3::WaveBsmStats'])
     register_Ns3WeibullRandomVariable_methods(root_module, root_module['ns3::WeibullRandomVariable'])
     register_Ns3Wifi80211pHelper_methods(root_module, root_module['ns3::Wifi80211pHelper'])
+    register_Ns3WifiAckAfterTbPpdu_methods(root_module, root_module['ns3::WifiAckAfterTbPpdu'])
+    register_Ns3WifiAckManager_methods(root_module, root_module['ns3::WifiAckManager'])
+    register_Ns3WifiCtsToSelfProtection_methods(root_module, root_module['ns3::WifiCtsToSelfProtection'])
     register_Ns3WifiInformationElement_methods(root_module, root_module['ns3::WifiInformationElement'])
     register_Ns3WifiMac_methods(root_module, root_module['ns3::WifiMac'])
     register_Ns3WifiMacHeader_methods(root_module, root_module['ns3::WifiMacHeader'])
     register_Ns3WifiMacQueueItem_methods(root_module, root_module['ns3::WifiMacQueueItem'])
+    register_Ns3WifiMacQueueItemQueueIteratorPair_methods(root_module, root_module['ns3::WifiMacQueueItem::QueueIteratorPair'])
+    register_Ns3WifiNoProtection_methods(root_module, root_module['ns3::WifiNoProtection'])
     register_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
     register_Ns3WifiPhyStateHelper_methods(root_module, root_module['ns3::WifiPhyStateHelper'])
     register_Ns3WifiPpdu_methods(root_module, root_module['ns3::WifiPpdu'])
+    register_Ns3WifiProtectionManager_methods(root_module, root_module['ns3::WifiProtectionManager'])
     register_Ns3WifiPsdu_methods(root_module, root_module['ns3::WifiPsdu'])
     register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
     register_Ns3YansWavePhyHelper_methods(root_module, root_module['ns3::YansWavePhyHelper'])
@@ -1465,12 +1669,14 @@
     register_Ns3ChannelManager_methods(root_module, root_module['ns3::ChannelManager'])
     register_Ns3ChannelScheduler_methods(root_module, root_module['ns3::ChannelScheduler'])
     register_Ns3ConstantRandomVariable_methods(root_module, root_module['ns3::ConstantRandomVariable'])
+    register_Ns3CtrlBAckRequestHeader_methods(root_module, root_module['ns3::CtrlBAckRequestHeader'])
+    register_Ns3CtrlBAckResponseHeader_methods(root_module, root_module['ns3::CtrlBAckResponseHeader'])
+    register_Ns3CtrlTriggerHeader_methods(root_module, root_module['ns3::CtrlTriggerHeader'])
     register_Ns3DataRateChecker_methods(root_module, root_module['ns3::DataRateChecker'])
     register_Ns3DataRateValue_methods(root_module, root_module['ns3::DataRateValue'])
     register_Ns3DefaultChannelScheduler_methods(root_module, root_module['ns3::DefaultChannelScheduler'])
     register_Ns3DeterministicRandomVariable_methods(root_module, root_module['ns3::DeterministicRandomVariable'])
     register_Ns3DoubleValue_methods(root_module, root_module['ns3::DoubleValue'])
-    register_Ns3DsssSigHeader_methods(root_module, root_module['ns3::DsssSigHeader'])
     register_Ns3EmpiricalRandomVariable_methods(root_module, root_module['ns3::EmpiricalRandomVariable'])
     register_Ns3EmptyAttributeAccessor_methods(root_module, root_module['ns3::EmptyAttributeAccessor'])
     register_Ns3EmptyAttributeChecker_methods(root_module, root_module['ns3::EmptyAttributeChecker'])
@@ -1482,9 +1688,9 @@
     register_Ns3Event_methods(root_module, root_module['ns3::Event'])
     register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
     register_Ns3ExponentialRandomVariable_methods(root_module, root_module['ns3::ExponentialRandomVariable'])
+    register_Ns3FrameExchangeManager_methods(root_module, root_module['ns3::FrameExchangeManager'])
     register_Ns3GammaRandomVariable_methods(root_module, root_module['ns3::GammaRandomVariable'])
     register_Ns3HeCapabilities_methods(root_module, root_module['ns3::HeCapabilities'])
-    register_Ns3HeSigHeader_methods(root_module, root_module['ns3::HeSigHeader'])
     register_Ns3HtCapabilities_methods(root_module, root_module['ns3::HtCapabilities'])
     register_Ns3IntegerValue_methods(root_module, root_module['ns3::IntegerValue'])
     register_Ns3Ipv4_methods(root_module, root_module['ns3::Ipv4'])
@@ -1507,10 +1713,9 @@
     register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
     register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
     register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
-    register_Ns3MacLow_methods(root_module, root_module['ns3::MacLow'])
+    register_Ns3MacRxMiddle_methods(root_module, root_module['ns3::MacRxMiddle'])
+    register_Ns3MacTxMiddle_methods(root_module, root_module['ns3::MacTxMiddle'])
     register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
-    register_Ns3MpduAggregator_methods(root_module, root_module['ns3::MpduAggregator'])
-    register_Ns3MsduAggregator_methods(root_module, root_module['ns3::MsduAggregator'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3Node_methods(root_module, root_module['ns3::Node'])
@@ -1522,8 +1727,12 @@
     register_Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::OutputStreamWrapper'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
     register_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
+    register_Ns3PhyEntity_methods(root_module, root_module['ns3::PhyEntity'])
+    register_Ns3PhyEntityPhyFieldRxStatus_methods(root_module, root_module['ns3::PhyEntity::PhyFieldRxStatus'])
+    register_Ns3PhyEntitySnrPer_methods(root_module, root_module['ns3::PhyEntity::SnrPer'])
     register_Ns3PointerChecker_methods(root_module, root_module['ns3::PointerChecker'])
     register_Ns3PointerValue_methods(root_module, root_module['ns3::PointerValue'])
+    register_Ns3QosFrameExchangeManager_methods(root_module, root_module['ns3::QosFrameExchangeManager'])
     register_Ns3QosTxop_methods(root_module, root_module['ns3::QosTxop'])
     register_Ns3Queue__Ns3Packet_methods(root_module, root_module['ns3::Queue< ns3::Packet >'])
     register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, root_module['ns3::Queue< ns3::QueueDiscItem >'])
@@ -1546,7 +1755,7 @@
     register_Ns3Vector3DChecker_methods(root_module, root_module['ns3::Vector3DChecker'])
     register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
     register_Ns3VhtCapabilities_methods(root_module, root_module['ns3::VhtCapabilities'])
-    register_Ns3WaveMacLow_methods(root_module, root_module['ns3::WaveMacLow'])
+    register_Ns3WaveFrameExchangeManager_methods(root_module, root_module['ns3::WaveFrameExchangeManager'])
     register_Ns3WifiMacQueue_methods(root_module, root_module['ns3::WifiMacQueue'])
     register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
     register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
@@ -1559,14 +1768,18 @@
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__const_ns3Packet__gt___Const_ns3Address___amp___Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<const ns3::Packet>, const ns3::Address &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3WifiMac__gt___Const_ns3OrganizationIdentifier___amp___Ns3Ptr__lt__const_ns3Packet__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::WifiMac>, const ns3::OrganizationIdentifier &, ns3::Ptr<const ns3::Packet>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv6Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv6L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv6__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv6Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Address_Ns3Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Address, ns3::Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3HePreambleParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Double_Ns3WifiMode_Ns3WifiPreamble_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1588,14 +1801,18 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Double_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3OcbWifiMac_methods(root_module, root_module['ns3::OcbWifiMac'])
@@ -2044,11 +2261,26 @@
     cls.add_constructor([param('ns3::BlockAckAgreement const &', 'arg0')])
     ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::Mac48Address peer, uint8_t tid) [constructor]
     cls.add_constructor([param('ns3::Mac48Address', 'peer'), param('uint8_t', 'tid')])
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckAgreement::GetBlockAckReqType() const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckAgreement::GetBlockAckType() const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [], 
+                   is_const=True)
     ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetBufferSize() const [member function]
     cls.add_method('GetBufferSize', 
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): static std::size_t ns3::BlockAckAgreement::GetDistance(uint16_t seqNumber, uint16_t startingSeqNumber) [member function]
+    cls.add_method('GetDistance', 
+                   'std::size_t', 
+                   [param('uint16_t', 'seqNumber'), param('uint16_t', 'startingSeqNumber')], 
+                   is_static=True)
     ## block-ack-agreement.h (module 'wifi'): ns3::Mac48Address ns3::BlockAckAgreement::GetPeer() const [member function]
     cls.add_method('GetPeer', 
                    'ns3::Mac48Address', 
@@ -2058,7 +2290,7 @@
     cls.add_method('GetStartingSequence', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequenceControl() const [member function]
     cls.add_method('GetStartingSequenceControl', 
                    'uint16_t', 
@@ -2128,32 +2360,36 @@
                    [param('uint16_t', 'timeout')])
     return
 
-def register_Ns3BlockAckCache_methods(root_module, cls):
-    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache::BlockAckCache() [constructor]
-    cls.add_constructor([])
-    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache::BlockAckCache(ns3::BlockAckCache const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BlockAckCache const &', 'arg0')])
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::FillBlockAckBitmap(ns3::CtrlBAckResponseHeader * blockAckHeader) [member function]
-    cls.add_method('FillBlockAckBitmap', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader *', 'blockAckHeader')])
-    ## block-ack-cache.h (module 'wifi'): uint16_t ns3::BlockAckCache::GetWinStart() const [member function]
-    cls.add_method('GetWinStart', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::Init(uint16_t winStart, uint16_t winSize) [member function]
-    cls.add_method('Init', 
-                   'void', 
-                   [param('uint16_t', 'winStart'), param('uint16_t', 'winSize')])
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::UpdateWithBlockAckReq(uint16_t startingSeq) [member function]
-    cls.add_method('UpdateWithBlockAckReq', 
-                   'void', 
-                   [param('uint16_t', 'startingSeq')])
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::UpdateWithMpdu(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('UpdateWithMpdu', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
+def register_Ns3BlockAckReqType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v, uint8_t nSeqControls) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v'), param('uint8_t', 'nSeqControls')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_nSeqControls [variable]
+    cls.add_instance_attribute('m_nSeqControls', 'uint8_t', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckReqType::Variant', is_const=False)
+    return
+
+def register_Ns3BlockAckType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
+    cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckType::Variant', is_const=False)
     return
 
 def register_Ns3BlockAckWindow_methods(root_module, cls):
@@ -2169,6 +2405,11 @@
     cls.add_method('At', 
                    'std::vector< bool > reference', 
                    [param('std::size_t', 'distance')])
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
+    cls.add_method('At', 
+                   'std::vector< bool > const_reference', 
+                   [param('std::size_t', 'distance')], 
+                   is_const=True)
     ## block-ack-window.h (module 'wifi'): uint16_t ns3::BlockAckWindow::GetWinEnd() const [member function]
     cls.add_method('GetWinEnd', 
                    'uint16_t', 
@@ -2574,9 +2815,177 @@
                         visibility='protected')
     return
 
+def register_Ns3CtrlTriggerUserInfoField_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField::CtrlTriggerUserInfoField(ns3::CtrlTriggerUserInfoField const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlTriggerUserInfoField const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField::CtrlTriggerUserInfoField(uint8_t triggerType) [constructor]
+    cls.add_constructor([param('uint8_t', 'triggerType')])
+    ## ctrl-headers.h (module 'wifi'): ns3::Buffer::Iterator ns3::CtrlTriggerUserInfoField::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')])
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerUserInfoField::GetAid12() const [member function]
+    cls.add_method('GetAid12', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::GetMoreRaRu() const [member function]
+    cls.add_method('GetMoreRaRu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetMpduMuSpacingFactor() const [member function]
+    cls.add_method('GetMpduMuSpacingFactor', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader const & ns3::CtrlTriggerUserInfoField::GetMuBarTriggerDepUserInfo() const [member function]
+    cls.add_method('GetMuBarTriggerDepUserInfo', 
+                   'ns3::CtrlBAckRequestHeader const &', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetNRaRus() const [member function]
+    cls.add_method('GetNRaRus', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetNss() const [member function]
+    cls.add_method('GetNss', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::AcIndex ns3::CtrlTriggerUserInfoField::GetPreferredAc() const [member function]
+    cls.add_method('GetPreferredAc', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::HeRu::RuSpec ns3::CtrlTriggerUserInfoField::GetRuAllocation() const [member function]
+    cls.add_method('GetRuAllocation', 
+                   'ns3::HeRu::RuSpec', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlTriggerUserInfoField::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetStartingSs() const [member function]
+    cls.add_method('GetStartingSs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetTidAggregationLimit() const [member function]
+    cls.add_method('GetTidAggregationLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType ns3::CtrlTriggerUserInfoField::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::TriggerFrameType', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::GetUlDcm() const [member function]
+    cls.add_method('GetUlDcm', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::GetUlFecCodingType() const [member function]
+    cls.add_method('GetUlFecCodingType', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetUlMcs() const [member function]
+    cls.add_method('GetUlMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): int8_t ns3::CtrlTriggerUserInfoField::GetUlTargetRssi() const [member function]
+    cls.add_method('GetUlTargetRssi', 
+                   'int8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::HasRaRuForAssociatedSta() const [member function]
+    cls.add_method('HasRaRuForAssociatedSta', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::HasRaRuForUnassociatedSta() const [member function]
+    cls.add_method('HasRaRuForUnassociatedSta', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::IsUlTargetRssiMaxTxPower() const [member function]
+    cls.add_method('IsUlTargetRssiMaxTxPower', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::Buffer::Iterator ns3::CtrlTriggerUserInfoField::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetAid12(uint16_t aid) [member function]
+    cls.add_method('SetAid12', 
+                   'void', 
+                   [param('uint16_t', 'aid')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetBasicTriggerDepUserInfo(uint8_t spacingFactor, uint8_t tidLimit, ns3::AcIndex prefAc) [member function]
+    cls.add_method('SetBasicTriggerDepUserInfo', 
+                   'void', 
+                   [param('uint8_t', 'spacingFactor'), param('uint8_t', 'tidLimit'), param('ns3::AcIndex', 'prefAc')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetMuBarTriggerDepUserInfo(ns3::CtrlBAckRequestHeader const & bar) [member function]
+    cls.add_method('SetMuBarTriggerDepUserInfo', 
+                   'void', 
+                   [param('ns3::CtrlBAckRequestHeader const &', 'bar')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetRaRuInformation(uint8_t nRaRu, bool moreRaRu) [member function]
+    cls.add_method('SetRaRuInformation', 
+                   'void', 
+                   [param('uint8_t', 'nRaRu'), param('bool', 'moreRaRu')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetRuAllocation(ns3::HeRu::RuSpec ru) [member function]
+    cls.add_method('SetRuAllocation', 
+                   'void', 
+                   [param('ns3::HeRu::RuSpec', 'ru')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetSsAllocation(uint8_t startingSs, uint8_t nSs) [member function]
+    cls.add_method('SetSsAllocation', 
+                   'void', 
+                   [param('uint8_t', 'startingSs'), param('uint8_t', 'nSs')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlDcm(bool dcm) [member function]
+    cls.add_method('SetUlDcm', 
+                   'void', 
+                   [param('bool', 'dcm')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlFecCodingType(bool ldpc) [member function]
+    cls.add_method('SetUlFecCodingType', 
+                   'void', 
+                   [param('bool', 'ldpc')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlMcs(uint8_t mcs) [member function]
+    cls.add_method('SetUlMcs', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlTargetRssi(int8_t dBm) [member function]
+    cls.add_method('SetUlTargetRssi', 
+                   'void', 
+                   [param('int8_t', 'dBm')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlTargetRssiMaxTxPower() [member function]
+    cls.add_method('SetUlTargetRssiMaxTxPower', 
+                   'void', 
+                   [])
+    return
+
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2703,6 +3112,30 @@
                    is_static=True)
     return
 
+def register_Ns3DefaultDeleter__Ns3MacRxMiddle_methods(root_module, cls):
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MacRxMiddle>::DefaultDeleter() [constructor]
+    cls.add_constructor([])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MacRxMiddle>::DefaultDeleter(ns3::DefaultDeleter<ns3::MacRxMiddle> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DefaultDeleter< ns3::MacRxMiddle > const &', 'arg0')])
+    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::MacRxMiddle>::Delete(ns3::MacRxMiddle * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::MacRxMiddle *', 'object')], 
+                   is_static=True)
+    return
+
+def register_Ns3DefaultDeleter__Ns3MacTxMiddle_methods(root_module, cls):
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MacTxMiddle>::DefaultDeleter() [constructor]
+    cls.add_constructor([])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MacTxMiddle>::DefaultDeleter(ns3::DefaultDeleter<ns3::MacTxMiddle> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DefaultDeleter< ns3::MacTxMiddle > const &', 'arg0')])
+    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::MacTxMiddle>::Delete(ns3::MacTxMiddle * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::MacTxMiddle *', 'object')], 
+                   is_static=True)
+    return
+
 def register_Ns3DefaultDeleter__Ns3NixVector_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::NixVector>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -2739,6 +3172,18 @@
                    is_static=True)
     return
 
+def register_Ns3DefaultDeleter__Ns3PhyEntity_methods(root_module, cls):
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity>::DefaultDeleter() [constructor]
+    cls.add_constructor([])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity>::DefaultDeleter(ns3::DefaultDeleter<ns3::PhyEntity> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DefaultDeleter< ns3::PhyEntity > const &', 'arg0')])
+    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::PhyEntity>::Delete(ns3::PhyEntity * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::PhyEntity *', 'object')], 
+                   is_static=True)
+    return
+
 def register_Ns3DefaultDeleter__Ns3QueueItem_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::QueueItem>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -2928,41 +3373,60 @@
     cls.add_instance_attribute('ru', 'ns3::HeRu::RuSpec', is_const=False)
     return
 
-def register_Ns3HePreambleParameters_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::HePreambleParameters() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::HePreambleParameters(ns3::HePreambleParameters const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HePreambleParameters const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::bssColor [variable]
-    cls.add_instance_attribute('bssColor', 'uint8_t', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::rssiW [variable]
-    cls.add_instance_attribute('rssiW', 'double', is_const=False)
-    return
-
 def register_Ns3HeRu_methods(root_module, cls):
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu() [constructor]
     cls.add_constructor([])
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, ns3::HeRu::SubcarrierGroup const & toneRanges) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('ns3::HeRu::SubcarrierGroup const &', 'toneRanges')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuSpec ns3::HeRu::FindOverlappingRu(uint16_t bw, ns3::HeRu::RuSpec referenceRu, ns3::HeRu::RuType searchedRuType) [member function]
+    cls.add_method('FindOverlappingRu', 
+                   'ns3::HeRu::RuSpec', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'referenceRu'), param('ns3::HeRu::RuType', 'searchedRuType')], 
+                   is_static=True)
     ## he-ru.h (module 'wifi'): static uint16_t ns3::HeRu::GetBandwidth(ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetBandwidth', 
                    'uint16_t', 
                    [param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetCentral26TonesRus', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations, std::size_t & nCentral26TonesRus) [member function]
     cls.add_method('GetEqualSizedRusForStations', 
                    'ns3::HeRu::RuType', 
-                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations')], 
+                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations'), param('std::size_t &', 'nCentral26TonesRus')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint8_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetNRus', 
                    'std::size_t', 
-                   [param('uint8_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetRuType(uint16_t bandwidth) [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [param('uint16_t', 'bandwidth')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetRusOfType', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint8_t bw, ns3::HeRu::RuType ruType, std::size_t index) [member function]
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint16_t bw, ns3::HeRu::RuType ruType, std::size_t phyIndex) [member function]
     cls.add_method('GetSubcarrierGroup', 
                    'ns3::HeRu::SubcarrierGroup', 
-                   [param('uint8_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index')], 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'phyIndex')], 
                    is_static=True)
     ## he-ru.h (module 'wifi'): ns3::HeRu::m_heRuSubcarrierGroups [variable]
     cls.add_static_attribute('m_heRuSubcarrierGroups', 'ns3::HeRu::SubcarrierGroups const', is_const=True)
@@ -2970,16 +3434,41 @@
 
 def register_Ns3HeRuRuSpec_methods(root_module, cls):
     cls.add_output_stream_operator()
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec() [constructor]
-    cls.add_constructor([])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::index [variable]
-    cls.add_instance_attribute('index', 'std::size_t', is_const=False)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::primary80MHz [variable]
-    cls.add_instance_attribute('primary80MHz', 'bool', is_const=False)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::ruType [variable]
-    cls.add_instance_attribute('ruType', 'ns3::HeRu::RuType', is_const=False)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
+    cls.add_constructor([])
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuType ruType, std::size_t index, bool primary80MHz) [constructor]
+    cls.add_constructor([param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index'), param('bool', 'primary80MHz')])
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetIndex() const [member function]
+    cls.add_method('GetIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetPhyIndex() const [member function]
+    cls.add_method('GetPhyIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::GetPrimary80MHz() const [member function]
+    cls.add_method('GetPrimary80MHz', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType ns3::HeRu::RuSpec::GetRuType() const [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::IsPhyIndexSet() const [member function]
+    cls.add_method('IsPhyIndexSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): void ns3::HeRu::RuSpec::SetPhyIndex(uint16_t bw, uint8_t p20Index) [member function]
+    cls.add_method('SetPhyIndex', 
+                   'void', 
+                   [param('uint16_t', 'bw'), param('uint8_t', 'p20Index')])
     return
 
 def register_Ns3Inet6SocketAddress_methods(root_module, cls):
@@ -3082,10 +3571,10 @@
     cls.add_constructor([param('ns3::InterferenceHelper const &', 'arg0')])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper() [constructor]
     cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::InterferenceHelper::Add(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::InterferenceHelper::Add(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [member function]
     cls.add_method('Add', 
                    'ns3::Ptr< ns3::Event >', 
-                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')])
     ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddBand(ns3::WifiSpectrumBand band) [member function]
     cls.add_method('AddBand', 
                    'void', 
@@ -3094,21 +3583,16 @@
     cls.add_method('AddForeignSignal', 
                    'void', 
                    [param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateHtPhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('CalculateHtPhyHeaderSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
-                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateNonHtPhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('CalculateNonHtPhyHeaderSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
-                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculatePayloadSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, uint16_t staId, std::pair<ns3::Time, ns3::Time> relativeMpduStartStop) const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::InterferenceHelper::CalculatePayloadSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, uint16_t staId, std::pair<ns3::Time, ns3::Time> relativeMpduStartStop) const [member function]
     cls.add_method('CalculatePayloadSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
                    [param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'channelWidth'), param('std::pair< unsigned int, unsigned int >', 'band'), param('uint16_t', 'staId'), param('std::pair< ns3::Time, ns3::Time >', 'relativeMpduStartStop')], 
                    is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::InterferenceHelper::CalculatePhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, ns3::WifiPpduField header) const [member function]
+    cls.add_method('CalculatePhyHeaderSnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'channelWidth'), param('std::pair< unsigned int, unsigned int >', 'band'), param('ns3::WifiPpduField', 'header')], 
+                   is_const=True)
     ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateSnr(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, uint8_t nss, ns3::WifiSpectrumBand band) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
@@ -3118,20 +3602,19 @@
     cls.add_method('EraseEvents', 
                    'void', 
                    [])
-    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW, ns3::WifiSpectrumBand band) const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW, ns3::WifiSpectrumBand band) [member function]
     cls.add_method('GetEnergyDuration', 
                    'ns3::Time', 
-                   [param('double', 'energyW'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
+                   [param('double', 'energyW'), param('std::pair< unsigned int, unsigned int >', 'band')])
     ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::ErrorRateModel> ns3::InterferenceHelper::GetErrorRateModel() const [member function]
     cls.add_method('GetErrorRateModel', 
                    'ns3::Ptr< ns3::ErrorRateModel >', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd() [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd(ns3::Time endTime) [member function]
     cls.add_method('NotifyRxEnd', 
                    'void', 
-                   [])
+                   [param('ns3::Time', 'endTime')])
     ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxStart() [member function]
     cls.add_method('NotifyRxStart', 
                    'void', 
@@ -3152,10 +3635,19 @@
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint8_t', 'rx')])
-    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiMode mode, ns3::WifiTxVector txVector) const [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiMode mode, ns3::WifiTxVector const & txVector, ns3::WifiPpduField field) const [member function]
     cls.add_method('CalculateChunkSuccessRate', 
                    'double', 
-                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector')], 
+                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPpduField', 'field')], 
+                   is_const=True, visibility='protected')
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculatePayloadChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
+    cls.add_method('CalculatePayloadChunkSuccessRate', 
+                   'double', 
+                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True, visibility='protected')
     ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateSnr(double signal, double noiseInterference, uint16_t channelWidth, uint8_t nss) const [member function]
     cls.add_method('CalculateSnr', 
@@ -3164,17 +3656,6 @@
                    is_const=True, visibility='protected')
     return
 
-def register_Ns3InterferenceHelperSnrPer_methods(root_module, cls):
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer() [constructor]
-    cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer(ns3::InterferenceHelper::SnrPer const & arg0) [constructor]
-    cls.add_constructor([param('ns3::InterferenceHelper::SnrPer const &', 'arg0')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::per [variable]
-    cls.add_instance_attribute('per', 'double', is_const=False)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::snr [variable]
-    cls.add_instance_attribute('snr', 'double', is_const=False)
-    return
-
 def register_Ns3Ipv4Address_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3298,6 +3779,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3624,6 +4117,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -3699,6 +4197,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3709,6 +4219,8 @@
     cls.add_constructor([param('ns3::Ipv6Address', 'address')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
@@ -3721,6 +4233,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
     cls.add_method('GetPrefix', 
                    'ns3::Ipv6Prefix', 
@@ -3749,6 +4266,10 @@
     cls.add_method('SetNsDadUid', 
                    'void', 
                    [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
     cls.add_method('SetScope', 
                    'void', 
@@ -3851,6 +4372,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4065,98 +4591,14 @@
                    is_static=True)
     return
 
-def register_Ns3MacLowTransmissionParameters_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters(ns3::MacLowTransmissionParameters const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacLowTransmissionParameters const &', 'arg0')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters() [constructor]
-    cls.add_constructor([])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableAck() [member function]
-    cls.add_method('DisableAck', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableBlockAckRequest() [member function]
-    cls.add_method('DisableBlockAckRequest', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableNextData() [member function]
-    cls.add_method('DisableNextData', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableRts() [member function]
-    cls.add_method('DisableRts', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableAck() [member function]
-    cls.add_method('EnableAck', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBlockAck(ns3::BlockAckType type) [member function]
-    cls.add_method('EnableBlockAck', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBlockAckRequest(ns3::BlockAckType type) [member function]
-    cls.add_method('EnableBlockAckRequest', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableNextData(uint32_t size) [member function]
-    cls.add_method('EnableNextData', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableRts() [member function]
-    cls.add_method('EnableRts', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::BlockAckType ns3::MacLowTransmissionParameters::GetBlockAckRequestType() const [member function]
-    cls.add_method('GetBlockAckRequestType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::BlockAckType ns3::MacLowTransmissionParameters::GetBlockAckType() const [member function]
-    cls.add_method('GetBlockAckType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): uint32_t ns3::MacLowTransmissionParameters::GetNextPacketSize() const [member function]
-    cls.add_method('GetNextPacketSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::HasNextPacket() const [member function]
-    cls.add_method('HasNextPacket', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendBlockAckRequest() const [member function]
-    cls.add_method('MustSendBlockAckRequest', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendRts() const [member function]
-    cls.add_method('MustSendRts', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitBlockAck() const [member function]
-    cls.add_method('MustWaitBlockAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitNormalAck() const [member function]
-    cls.add_method('MustWaitNormalAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    return
-
 def register_Ns3MpduInfo_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::MpduInfo() [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::MpduInfo() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::MpduInfo(ns3::MpduInfo const & arg0) [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::MpduInfo(ns3::MpduInfo const & arg0) [constructor]
     cls.add_constructor([param('ns3::MpduInfo const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::mpduRefNumber [variable]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::mpduRefNumber [variable]
     cls.add_instance_attribute('mpduRefNumber', 'uint32_t', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::type [variable]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::type [variable]
     cls.add_instance_attribute('type', 'ns3::MpduType', is_const=False)
     return
 
@@ -4450,7 +4892,7 @@
     cls.add_method('GetStartingSequence', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::InitTxWindow() [member function]
     cls.add_method('InitTxWindow', 
                    'void', 
@@ -4961,6 +5403,18 @@
                    is_const=True)
     return
 
+def register_Ns3RxSignalInfo_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::RxSignalInfo() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::RxSignalInfo(ns3::RxSignalInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RxSignalInfo const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::rssi [variable]
+    cls.add_instance_attribute('rssi', 'double', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
+    return
+
 def register_Ns3SchInfo_methods(root_module, cls):
     ## channel-scheduler.h (module 'wave'): ns3::SchInfo::SchInfo(ns3::SchInfo const & arg0) [constructor]
     cls.add_constructor([param('ns3::SchInfo const &', 'arg0')])
@@ -4981,13 +5435,13 @@
     return
 
 def register_Ns3SignalNoiseDbm_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm() [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm(ns3::SignalNoiseDbm const & arg0) [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm(ns3::SignalNoiseDbm const & arg0) [constructor]
     cls.add_constructor([param('ns3::SignalNoiseDbm const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::noise [variable]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::noise [variable]
     cls.add_instance_attribute('noise', 'double', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::signal [variable]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::signal [variable]
     cls.add_instance_attribute('signal', 'double', is_const=False)
     return
 
@@ -5863,10 +6317,6 @@
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('std::string', 'nodeName')], 
                    is_const=True, is_virtual=True)
-    ## wave-helper.h (module 'wave'): void ns3::WaveHelper::SetAckPolicySelectorForAc(ns3::AcIndex ac, std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetAckPolicySelectorForAc', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac'), param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
     ## wave-helper.h (module 'wave'): void ns3::WaveHelper::SetChannelScheduler(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetChannelScheduler', 
                    'void', 
@@ -5877,7 +6327,291 @@
                    [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
     return
 
-def register_Ns3WifiHelper_methods(root_module, cls):
+def register_Ns3WifiAc_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(ns3::WifiAc const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAc const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(uint8_t lowTid, uint8_t highTid) [constructor]
+    cls.add_constructor([param('uint8_t', 'lowTid'), param('uint8_t', 'highTid')])
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetHighTid() const [member function]
+    cls.add_method('GetHighTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetLowTid() const [member function]
+    cls.add_method('GetLowTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetOtherTid(uint8_t tid) const [member function]
+    cls.add_method('GetOtherTid', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    return
+
+def register_Ns3WifiAcknowledgment_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::WifiAcknowledgment(ns3::WifiAcknowledgment::Method m) [constructor]
+    cls.add_constructor([param('ns3::WifiAcknowledgment::Method', 'm')])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAcknowledgment::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiAcknowledgment::GetQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid) const [member function]
+    cls.add_method('GetQosAckPolicy', 
+                   'ns3::WifiMacHeader::QosAckPolicy', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiAcknowledgment::SetQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) [member function]
+    cls.add_method('SetQosAckPolicy', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')])
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiAcknowledgment::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::method [variable]
+    cls.add_instance_attribute('method', 'ns3::WifiAcknowledgment::Method const', is_const=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::acknowledgmentTime [variable]
+    cls.add_instance_attribute('acknowledgmentTime', 'ns3::Time', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::WifiAcknowledgment(ns3::WifiAcknowledgment const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAcknowledgment const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiAcknowledgment::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3WifiAddressHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash(ns3::WifiAddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressHash::operator()(ns3::Mac48Address const & address) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3WifiAddressTidHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash(ns3::WifiAddressTidHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressTidHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressTidHash::operator()(ns3::WifiAddressTidPair const & addressTidPair) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::WifiAddressTidPair const &', 'addressTidPair')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3WifiBarBlockAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::WifiBarBlockAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBarBlockAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiBarBlockAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiBarBlockAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::blockAckReqTxVector [variable]
+    cls.add_instance_attribute('blockAckReqTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::barType [variable]
+    cls.add_instance_attribute('barType', 'ns3::BlockAckReqType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::WifiBarBlockAck(ns3::WifiBarBlockAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiBarBlockAck const &', 'arg0')])
+    return
+
+def register_Ns3WifiBlockAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::WifiBlockAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBlockAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiBlockAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiBlockAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::WifiBlockAck(ns3::WifiBlockAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiBlockAck const &', 'arg0')])
+    return
+
+def register_Ns3WifiDlMuAggregateTf_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::WifiDlMuAggregateTf(ns3::WifiDlMuAggregateTf const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuAggregateTf const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::WifiDlMuAggregateTf() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiDlMuAggregateTf::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuAggregateTf::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiDlMuAggregateTf::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::stationsReplyingWithBlockAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithBlockAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuAggregateTf::BlockAckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::ulLength [variable]
+    cls.add_instance_attribute('ulLength', 'uint16_t', is_const=False)
+    return
+
+def register_Ns3WifiDlMuAggregateTfBlockAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::BlockAckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::BlockAckInfo(ns3::WifiDlMuAggregateTf::BlockAckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuAggregateTf::BlockAckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::barHeader [variable]
+    cls.add_instance_attribute('barHeader', 'ns3::CtrlBAckRequestHeader', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::muBarSize [variable]
+    cls.add_instance_attribute('muBarSize', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequence_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::WifiDlMuBarBaSequence(ns3::WifiDlMuBarBaSequence const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::WifiDlMuBarBaSequence() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiDlMuBarBaSequence::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuBarBaSequence::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiDlMuBarBaSequence::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::stationsReplyingWithBlockAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithBlockAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::stationsReplyingWithNormalAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithNormalAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::AckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::stationsSendBlockAckReqTo [variable]
+    cls.add_instance_attribute('stationsSendBlockAckReqTo', 'std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckReqInfo >', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequenceAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo::AckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo::AckInfo(ns3::WifiDlMuBarBaSequence::AckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence::AckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo::ackTxVector [variable]
+    cls.add_instance_attribute('ackTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequenceBlockAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::BlockAckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::BlockAckInfo(ns3::WifiDlMuBarBaSequence::BlockAckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence::BlockAckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequenceBlockAckReqInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::BlockAckReqInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::BlockAckReqInfo(ns3::WifiDlMuBarBaSequence::BlockAckReqInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence::BlockAckReqInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::barType [variable]
+    cls.add_instance_attribute('barType', 'ns3::BlockAckReqType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::blockAckReqTxVector [variable]
+    cls.add_instance_attribute('blockAckReqTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiDlMuTfMuBar_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::WifiDlMuTfMuBar(ns3::WifiDlMuTfMuBar const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuTfMuBar const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::WifiDlMuTfMuBar() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiDlMuTfMuBar::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuTfMuBar::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiDlMuTfMuBar::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::barTypes [variable]
+    cls.add_instance_attribute('barTypes', 'std::list< ns3::BlockAckReqType >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::muBarTxVector [variable]
+    cls.add_instance_attribute('muBarTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::stationsReplyingWithBlockAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithBlockAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuTfMuBar::BlockAckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::ulLength [variable]
+    cls.add_instance_attribute('ulLength', 'uint16_t', is_const=False)
+    return
+
+def register_Ns3WifiDlMuTfMuBarBlockAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::BlockAckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::BlockAckInfo(ns3::WifiDlMuTfMuBar::BlockAckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuTfMuBar::BlockAckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::barHeader [variable]
+    cls.add_instance_attribute('barHeader', 'ns3::CtrlBAckRequestHeader', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiHelper_methods(root_module, cls):
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper::WifiHelper(ns3::WifiHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiHelper const &', 'arg0')])
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper::WifiHelper() [constructor]
@@ -5911,10 +6645,6 @@
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('std::string', 'nodeName')], 
                    is_const=True, is_virtual=True)
-    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetAckPolicySelectorForAc(ns3::AcIndex ac, std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetAckPolicySelectorForAc', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac'), param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
     ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetObssPdAlgorithm(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetObssPdAlgorithm', 
                    'void', 
@@ -5944,20 +6674,16 @@
     cls.add_constructor([param('ns3::WifiMacHelper const &', 'arg0')])
     ## wifi-mac-helper.h (module 'wifi'): ns3::WifiMacHelper::WifiMacHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::NetDevice> device, ns3::WifiStandard standard) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::WifiStandard', 'standard')], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-helper.h (module 'wifi'): void ns3::WifiMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue(), std::string n8="", ns3::AttributeValue const & v8=ns3::EmptyAttributeValue(), std::string n9="", ns3::AttributeValue const & v9=ns3::EmptyAttributeValue(), std::string n10="", ns3::AttributeValue const & v10=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetType', 
-                   'void', 
-                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n8', default_value='""'), param('ns3::AttributeValue const &', 'v8', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n9', default_value='""'), param('ns3::AttributeValue const &', 'v9', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n10', default_value='""'), param('ns3::AttributeValue const &', 'v10', default_value='ns3::EmptyAttributeValue()')], 
-                   is_virtual=True)
     return
 
 def register_Ns3WifiMode_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
     cls.add_output_stream_operator()
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [constructor]
@@ -5981,10 +6707,10 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector txVector, uint16_t staId=65535) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetDataRate', 
@@ -6011,10 +6737,15 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector txVector) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint16_t channelWidth) const [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'channelWidth')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -6051,18 +6782,64 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
     return
 
+def register_Ns3WifiNoAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck::WifiNoAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNoAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiNoAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiNoAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck::WifiNoAck(ns3::WifiNoAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiNoAck const &', 'arg0')])
+    return
+
+def register_Ns3WifiNormalAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::WifiNormalAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNormalAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiNormalAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiNormalAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::ackTxVector [variable]
+    cls.add_instance_attribute('ackTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::WifiNormalAck(ns3::WifiNormalAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiNormalAck const &', 'arg0')])
+    return
+
 def register_Ns3WifiPhyHelper_methods(root_module, cls):
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::WifiPhyHelper(ns3::WifiPhyHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiPhyHelper const &', 'arg0')])
@@ -6124,11 +6901,83 @@
                    is_virtual=True, visibility='private')
     return
 
+def register_Ns3WifiPhyOperatingChannel_methods(root_module, cls):
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel(ns3::WifiPhyOperatingChannel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhyOperatingChannel const &', 'arg0')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetNumber() const [member function]
+    cls.add_method('GetNumber', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelCenterFrequency(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelCenterFrequency', 
+                   'uint16_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelIndex(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelIndex', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetWidth() const [member function]
+    cls.add_method('GetWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): bool ns3::WifiPhyOperatingChannel::IsSet() const [member function]
+    cls.add_method('IsSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('SetDefault', 
+                   'void', 
+                   [param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetPrimary20Index(uint8_t index) [member function]
+    cls.add_method('SetPrimary20Index', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    return
+
+def register_Ns3WifiProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::WifiProtection(ns3::WifiProtection::Method m) [constructor]
+    cls.add_constructor([param('ns3::WifiProtection::Method', 'm')])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::method [variable]
+    cls.add_instance_attribute('method', 'ns3::WifiProtection::Method const', is_const=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::protectionTime [variable]
+    cls.add_instance_attribute('protectionTime', 'ns3::Time', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::WifiProtection(ns3::WifiProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiRemoteStation_methods(root_module, cls):
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation() [constructor]
     cls.add_constructor([])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation(ns3::WifiRemoteStation const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRemoteStation const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_rssiAndUpdateTimePair [variable]
+    cls.add_instance_attribute('m_rssiAndUpdateTimePair', 'std::pair< double, ns3::Time >', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_state [variable]
     cls.add_instance_attribute('m_state', 'ns3::WifiRemoteStationState *', is_const=False)
     return
@@ -6164,6 +7013,10 @@
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
     cls.add_instance_attribute('m_channelWidth', 'uint16_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_dsssSupported [variable]
+    cls.add_instance_attribute('m_dsssSupported', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_erpOfdmSupported [variable]
+    cls.add_instance_attribute('m_erpOfdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_guardInterval [variable]
     cls.add_instance_attribute('m_guardInterval', 'uint16_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_heCapabilities [variable]
@@ -6174,6 +7027,8 @@
     cls.add_instance_attribute('m_info', 'ns3::WifiRemoteStationInfo', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint8_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ofdmSupported [variable]
+    cls.add_instance_attribute('m_ofdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
     cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
@@ -6188,6 +7043,27 @@
     cls.add_instance_attribute('m_vhtCapabilities', 'ns3::Ptr< ns3::VhtCapabilities const >', is_const=False)
     return
 
+def register_Ns3WifiRtsCtsProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::WifiRtsCtsProtection() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiRtsCtsProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiRtsCtsProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::rtsTxVector [variable]
+    cls.add_instance_attribute('rtsTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::ctsTxVector [variable]
+    cls.add_instance_attribute('ctsTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::WifiRtsCtsProtection(ns3::WifiRtsCtsProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiRtsCtsProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, cls):
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory::WifiSpectrumValue5MhzFactory() [constructor]
     cls.add_constructor([])
@@ -6220,6 +7096,11 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeMuOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, ns3::WifiSpectrumBand ru) [member function]
+    cls.add_method('CreateHeMuOfdmTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('uint32_t', 'centerFrequency'), param('uint16_t', 'channelWidth'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'ru')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40) [member function]
     cls.add_method('CreateHeOfdmTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
@@ -6285,12 +7166,134 @@
     cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
     return
 
+def register_Ns3WifiTxParameters_methods(root_module, cls):
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::WifiTxParameters() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::WifiTxParameters(ns3::WifiTxParameters const & txParams) [constructor]
+    cls.add_constructor([param('ns3::WifiTxParameters const &', 'txParams')])
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::AddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('AddMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::AggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu) [member function]
+    cls.add_method('AggregateMsdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu')])
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::Clear() [member function]
+    cls.add_method('Clear', 
+                   'void', 
+                   [])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo const * ns3::WifiTxParameters::GetPsduInfo(ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetPsduInfo', 
+                   'ns3::WifiTxParameters::PsduInfo const *', 
+                   [param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfoMap const & ns3::WifiTxParameters::GetPsduInfoMap() const [member function]
+    cls.add_method('GetPsduInfoMap', 
+                   'ns3::WifiTxParameters::PsduInfoMap const &', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): uint32_t ns3::WifiTxParameters::GetSize(ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): uint32_t ns3::WifiTxParameters::GetSizeIfAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('GetSizeIfAddMpdu', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): std::pair<unsigned int, unsigned int> ns3::WifiTxParameters::GetSizeIfAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu) const [member function]
+    cls.add_method('GetSizeIfAggregateMsdu', 
+                   'std::pair< unsigned int, unsigned int >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_acknowledgment [variable]
+    cls.add_instance_attribute('m_acknowledgment', 'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_protection [variable]
+    cls.add_instance_attribute('m_protection', 'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_txDuration [variable]
+    cls.add_instance_attribute('m_txDuration', 'ns3::Time', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_txVector [variable]
+    cls.add_instance_attribute('m_txVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiTxParametersPsduInfo_methods(root_module, cls):
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::PsduInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::PsduInfo(ns3::WifiTxParameters::PsduInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiTxParameters::PsduInfo const &', 'arg0')])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::ampduSize [variable]
+    cls.add_instance_attribute('ampduSize', 'uint32_t', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::amsduSize [variable]
+    cls.add_instance_attribute('amsduSize', 'uint32_t', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::header [variable]
+    cls.add_instance_attribute('header', 'ns3::WifiMacHeader', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::seqNumbers [variable]
+    cls.add_instance_attribute('seqNumbers', 'std::map< unsigned char, std::set< unsigned short > >', is_const=False)
+    return
+
+def register_Ns3WifiTxTimer_methods(root_module, cls):
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::WifiTxTimer(ns3::WifiTxTimer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiTxTimer const &', 'arg0')])
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::WifiTxTimer() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## wifi-tx-timer.h (module 'wifi'): ns3::Time ns3::WifiTxTimer::GetDelayLeft() const [member function]
+    cls.add_method('GetDelayLeft', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::Reason ns3::WifiTxTimer::GetReason() const [member function]
+    cls.add_method('GetReason', 
+                   'ns3::WifiTxTimer::Reason', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): std::string ns3::WifiTxTimer::GetReasonString(ns3::WifiTxTimer::Reason reason) const [member function]
+    cls.add_method('GetReasonString', 
+                   'std::string', 
+                   [param('ns3::WifiTxTimer::Reason', 'reason')], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): bool ns3::WifiTxTimer::IsRunning() const [member function]
+    cls.add_method('IsRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::Reschedule(ns3::Time const & delay) [member function]
+    cls.add_method('Reschedule', 
+                   'void', 
+                   [param('ns3::Time const &', 'delay')])
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::SetMpduResponseTimeoutCallback(ns3::WifiTxTimer::MpduResponseTimeout callback) const [member function]
+    cls.add_method('SetMpduResponseTimeoutCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::SetPsduMapResponseTimeoutCallback(ns3::WifiTxTimer::PsduMapResponseTimeout callback) const [member function]
+    cls.add_method('SetPsduMapResponseTimeoutCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::SetPsduResponseTimeoutCallback(ns3::WifiTxTimer::PsduResponseTimeout callback) const [member function]
+    cls.add_method('SetPsduResponseTimeoutCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_const=True)
+    return
+
 def register_Ns3WifiTxVector_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0, uint16_t length=0) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0'), param('uint16_t', 'length', default_value='0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & txVector) [constructor]
     cls.add_constructor([param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetBssColor() const [member function]
@@ -6318,6 +7321,15 @@
                    'ns3::WifiTxVector::HeMuUserInfoMap const &', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap & ns3::WifiTxVector::GetHeMuUserInfoMap() [member function]
+    cls.add_method('GetHeMuUserInfoMap', 
+                   'ns3::WifiTxVector::HeMuUserInfoMap &', 
+                   [])
+    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode(uint16_t staId=65535) const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -6328,6 +7340,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiTxVector::GetModulationClass() const [member function]
+    cls.add_method('GetModulationClass', 
+                   'ns3::WifiModulationClass', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNTx() const [member function]
     cls.add_method('GetNTx', 
                    'uint8_t', 
@@ -6348,6 +7365,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): std::pair<unsigned long long, unsigned long long> ns3::WifiTxVector::GetNumRusPerHeSigBContentChannel() const [member function]
+    cls.add_method('GetNumRusPerHeSigBContentChannel', 
+                   'std::pair< unsigned long long, unsigned long long >', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiPreamble ns3::WifiTxVector::GetPreambleType() const [member function]
     cls.add_method('GetPreambleType', 
                    'ns3::WifiPreamble', 
@@ -6368,16 +7390,31 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsDlMu() const [member function]
+    cls.add_method('IsDlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsLdpc() const [member function]
     cls.add_method('IsLdpc', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsMu() const [member function]
+    cls.add_method('IsMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsStbc() const [member function]
     cls.add_method('IsStbc', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsUlMu() const [member function]
+    cls.add_method('IsUlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsValid() const [member function]
     cls.add_method('IsValid', 
                    'bool', 
@@ -6407,6 +7444,10 @@
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('bool', 'ldpc')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -6449,6 +7490,36 @@
                    [param('uint8_t', 'powerlevel')])
     return
 
+def register_Ns3WifiUlMuMultiStaBa_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::WifiUlMuMultiStaBa() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiUlMuMultiStaBa::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiUlMuMultiStaBa::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiUlMuMultiStaBa::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::stationsReceivingMultiStaBa [variable]
+    cls.add_instance_attribute('stationsReceivingMultiStaBa', 'std::map< std::pair< ns3::Mac48Address, unsigned char >, unsigned long long >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::tbPpduTxVector [variable]
+    cls.add_instance_attribute('tbPpduTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::multiStaBaTxVector [variable]
+    cls.add_instance_attribute('multiStaBaTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::WifiUlMuMultiStaBa(ns3::WifiUlMuMultiStaBa const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiUlMuMultiStaBa const &', 'arg0')])
+    return
+
 def register_Ns3YansWifiChannelHelper_methods(root_module, cls):
     ## yans-wifi-helper.h (module 'wifi'): ns3::YansWifiChannelHelper::YansWifiChannelHelper(ns3::YansWifiChannelHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::YansWifiChannelHelper const &', 'arg0')])
@@ -6692,97 +7763,6 @@
                    is_const=True, is_virtual=True)
     return
 
-def register_Ns3HtSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader::HtSigHeader(ns3::HtSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader::HtSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::GetAggregation() const [member function]
-    cls.add_method('GetAggregation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HtSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HtSigHeader::GetHtLength() const [member function]
-    cls.add_method('GetHtLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::HtSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HtSigHeader::GetMcs() const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HtSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::GetShortGuardInterval() const [member function]
-    cls.add_method('GetShortGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::HtSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::IsLdpcFecCoding() const [member function]
-    cls.add_method('IsLdpcFecCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetAggregation(bool aggregation) [member function]
-    cls.add_method('SetAggregation', 
-                   'void', 
-                   [param('bool', 'aggregation')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetFecCoding(bool ldpc) [member function]
-    cls.add_method('SetFecCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetHtLength(uint16_t length) [member function]
-    cls.add_method('SetHtLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetMcs(uint8_t mcs) [member function]
-    cls.add_method('SetMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetShortGuardInterval(bool sgi) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'sgi')])
-    return
-
 def register_Ns3InternetStackHelper_methods(root_module, cls):
     ## internet-stack-helper.h (module 'internet'): ns3::InternetStackHelper::InternetStackHelper() [constructor]
     cls.add_constructor([])
@@ -7170,61 +8150,6 @@
                    [param('uint8_t', 'traffic')])
     return
 
-def register_Ns3LSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader::LSigHeader(ns3::LSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader::LSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::LSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::LSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::LSigHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint64_t ns3::LSigHeader::GetRate(uint16_t channelWidth=20) const [member function]
-    cls.add_method('GetRate', 
-                   'uint64_t', 
-                   [param('uint16_t', 'channelWidth', default_value='20')], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::LSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::LSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::SetRate(uint64_t rate, uint16_t channelWidth=20) [member function]
-    cls.add_method('SetRate', 
-                   'void', 
-                   [param('uint64_t', 'rate'), param('uint16_t', 'channelWidth', default_value='20')])
-    return
-
 def register_Ns3NqosWaveMacHelper_methods(root_module, cls):
     ## wave-mac-helper.h (module 'wave'): ns3::NqosWaveMacHelper::NqosWaveMacHelper(ns3::NqosWaveMacHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::NqosWaveMacHelper const &', 'arg0')])
@@ -7663,6 +8588,20 @@
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
+def register_Ns3SimpleRefCount__Ns3MacRxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacRxMiddle__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter< ns3::MacRxMiddle > > const &', 'o')])
+    return
+
+def register_Ns3SimpleRefCount__Ns3MacTxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacTxMiddle__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter< ns3::MacTxMiddle > > const &', 'o')])
+    return
+
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -7684,6 +8623,13 @@
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
+def register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter< ns3::PhyEntity > > const &', 'o')])
+    return
+
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -8011,10 +8957,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -8604,76 +9550,27 @@
     return
 
 def register_Ns3Txop_methods(root_module, cls):
+    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Txop const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Txop const &', 'arg0')])
     ## txop.h (module 'wifi'): ns3::Txop::Txop() [constructor]
     cls.add_constructor([])
-    ## txop.h (module 'wifi'): static ns3::TypeId ns3::Txop::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsQosTxop() const [member function]
-    cls.add_method('IsQosTxop', 
-                   'bool', 
+    ## txop.h (module 'wifi'): int64_t ns3::Txop::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## txop.h (module 'wifi'): ns3::AcIndex ns3::Txop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMacLow(ns3::Ptr<ns3::MacLow> const low) [member function]
-    cls.add_method('SetMacLow', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacLow > const', 'low')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> const manager) [member function]
-    cls.add_method('SetChannelAccessManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ChannelAccessManager > const', 'manager')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
-    cls.add_method('SetTxMiddle', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxOkCallback(ns3::Txop::TxOk callback) [member function]
-    cls.add_method('SetTxOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxFailedCallback(ns3::Txop::TxFailed callback) [member function]
-    cls.add_method('SetTxFailedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxDroppedCallback(ns3::Txop::TxDropped callback) [member function]
-    cls.add_method('SetTxDroppedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::MacLow> ns3::Txop::GetLow() const [member function]
-    cls.add_method('GetLow', 
-                   'ns3::Ptr< ns3::MacLow >', 
-                   [], 
-                   is_const=True)
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::Txop::GetWifiMacQueue() const [member function]
-    cls.add_method('GetWifiMacQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
+    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus ns3::Txop::GetAccessStatus() const [member function]
+    cls.add_method('GetAccessStatus', 
+                   'ns3::Txop::ChannelAccessStatus', 
                    [], 
-                   is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMinCw(uint32_t minCw) [member function]
-    cls.add_method('SetMinCw', 
-                   'void', 
-                   [param('uint32_t', 'minCw')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMaxCw(uint32_t maxCw) [member function]
-    cls.add_method('SetMaxCw', 
-                   'void', 
-                   [param('uint32_t', 'maxCw')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetAifsn', 
-                   'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxopLimit(ns3::Time txopLimit) [member function]
-    cls.add_method('SetTxopLimit', 
-                   'void', 
-                   [param('ns3::Time', 'txopLimit')])
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMinCw() const [member function]
-    cls.add_method('GetMinCw', 
-                   'uint32_t', 
+                   is_const=True, is_virtual=True)
+    ## txop.h (module 'wifi'): uint8_t ns3::Txop::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMaxCw() const [member function]
@@ -8681,9 +9578,9 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): uint8_t ns3::Txop::GetAifsn() const [member function]
-    cls.add_method('GetAifsn', 
-                   'uint8_t', 
+    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
     ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopLimit() const [member function]
@@ -8691,23 +9588,38 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
-    cls.add_method('NotifyChannelSwitching', 
-                   'void', 
+    ## txop.h (module 'wifi'): static ns3::TypeId ns3::Txop::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::Txop::GetWifiMacQueue() const [member function]
+    cls.add_method('GetWifiMacQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [], 
+                   is_const=True)
+    ## txop.h (module 'wifi'): bool ns3::Txop::IsQosTxop() const [member function]
+    cls.add_method('IsQosTxop', 
+                   'bool', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelAccessed(ns3::Time txopDuration=ns3::Seconds(0)) [member function]
+    cls.add_method('NotifyChannelAccessed', 
+                   'void', 
+                   [param('ns3::Time', 'txopDuration', default_value='ns3::Seconds(0)')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifySleep() [member function]
-    cls.add_method('NotifySleep', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelReleased() [member function]
+    cls.add_method('NotifyChannelReleased', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyOff() [member function]
-    cls.add_method('NotifyOff', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyWakeUp() [member function]
-    cls.add_method('NotifyWakeUp', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyOff() [member function]
+    cls.add_method('NotifyOff', 
                    'void', 
                    [], 
                    is_virtual=True)
@@ -8716,98 +9628,67 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::Queue(ns3::Ptr<ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('Queue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SendCfFrame(ns3::WifiMacType frameType, ns3::Mac48Address addr) [member function]
-    cls.add_method('SendCfFrame', 
-                   'void', 
-                   [param('ns3::WifiMacType', 'frameType'), param('ns3::Mac48Address', 'addr')])
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedCts() [member function]
-    cls.add_method('MissedCts', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifySleep() [member function]
+    cls.add_method('NotifySleep', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotAck() [member function]
-    cls.add_method('GotAck', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyWakeUp() [member function]
+    cls.add_method('NotifyWakeUp', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedAck() [member function]
-    cls.add_method('MissedAck', 
+    ## txop.h (module 'wifi'): void ns3::Txop::Queue(ns3::Ptr<ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('Queue', 
                    'void', 
-                   [], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotCfEnd() [member function]
-    cls.add_method('GotCfEnd', 
+    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
+    cls.add_method('ResetCw', 
                    'void', 
                    [])
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedCfPollResponse(bool expectedCfAck) [member function]
-    cls.add_method('MissedCfPollResponse', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetAifsn', 
                    'void', 
-                   [param('bool', 'expectedCfAck')])
-    ## txop.h (module 'wifi'): void ns3::Txop::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('GotBlockAck', 
+                   [param('uint8_t', 'aifsn')])
+    ## txop.h (module 'wifi'): void ns3::Txop::SetChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> const manager) [member function]
+    cls.add_method('SetChannelAccessManager', 
                    'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedBlockAck(uint8_t nMpdus) [member function]
-    cls.add_method('MissedBlockAck', 
+                   [param('ns3::Ptr< ns3::ChannelAccessManager > const', 'manager')])
+    ## txop.h (module 'wifi'): void ns3::Txop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
                    'void', 
-                   [param('uint8_t', 'nMpdus')], 
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::StartNextFragment() [member function]
-    cls.add_method('StartNextFragment', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetMaxCw(uint32_t maxCw) [member function]
+    cls.add_method('SetMaxCw', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::Cancel() [member function]
-    cls.add_method('Cancel', 
+                   [param('uint32_t', 'maxCw')])
+    ## txop.h (module 'wifi'): void ns3::Txop::SetMinCw(uint32_t minCw) [member function]
+    cls.add_method('SetMinCw', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::StartNextPacket() [member function]
-    cls.add_method('StartNextPacket', 
+                   [param('uint32_t', 'minCw')])
+    ## txop.h (module 'wifi'): void ns3::Txop::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
+    cls.add_method('SetTxMiddle', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::EndTxNoAck() [member function]
-    cls.add_method('EndTxNoAck', 
+                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
+    ## txop.h (module 'wifi'): void ns3::Txop::SetTxopLimit(ns3::Time txopLimit) [member function]
+    cls.add_method('SetTxopLimit', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopRemaining() const [member function]
-    cls.add_method('GetTxopRemaining', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::TerminateTxop() [member function]
-    cls.add_method('TerminateTxop', 
+                   [param('ns3::Time', 'txopLimit')])
+    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
                    'void', 
-                   [], 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): bool ns3::Txop::CanStartNextPolling() const [member function]
-    cls.add_method('CanStartNextPolling', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## txop.h (module 'wifi'): int64_t ns3::Txop::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsAccessRequested() const [member function]
-    cls.add_method('IsAccessRequested', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
     cls.add_method('StartBackoffNow', 
                    'void', 
                    [param('uint32_t', 'nSlots')])
-    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Txop const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Txop const &', 'arg0')])
+    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
+    cls.add_method('UpdateFailedCw', 
+                   'void', 
+                   [])
     ## txop.h (module 'wifi'): void ns3::Txop::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -8818,121 +9699,56 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessRequested() [member function]
-    cls.add_method('NotifyAccessRequested', 
+    ## txop.h (module 'wifi'): void ns3::Txop::GenerateBackoff() [member function]
+    cls.add_method('GenerateBackoff', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessGranted() [member function]
-    cls.add_method('NotifyAccessGranted', 
-                   'void', 
+    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetBackoffSlots() const [member function]
+    cls.add_method('GetBackoffSlots', 
+                   'uint32_t', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyInternalCollision() [member function]
-    cls.add_method('NotifyInternalCollision', 
-                   'void', 
+                   is_const=True, visibility='protected')
+    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetBackoffStart() const [member function]
+    cls.add_method('GetBackoffStart', 
+                   'ns3::Time', 
                    [], 
-                   is_virtual=True, visibility='protected')
+                   is_const=True, visibility='protected')
+    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetCw() const [member function]
+    cls.add_method('GetCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, visibility='protected')
     ## txop.h (module 'wifi'): bool ns3::Txop::HasFramesToTransmit() [member function]
     cls.add_method('HasFramesToTransmit', 
                    'bool', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::GenerateBackoff() [member function]
-    cls.add_method('GenerateBackoff', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::RestartAccessIfNeeded() [member function]
-    cls.add_method('RestartAccessIfNeeded', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessRequested() [member function]
+    cls.add_method('NotifyAccessRequested', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::StartAccessIfNeeded() [member function]
-    cls.add_method('StartAccessIfNeeded', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyInternalCollision() [member function]
+    cls.add_method('NotifyInternalCollision', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetCw() const [member function]
-    cls.add_method('GetCw', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
-    cls.add_method('ResetCw', 
+    ## txop.h (module 'wifi'): void ns3::Txop::RequestAccess() [member function]
+    cls.add_method('RequestAccess', 
                    'void', 
                    [], 
                    visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
-    cls.add_method('UpdateFailedCw', 
+    ## txop.h (module 'wifi'): void ns3::Txop::StartAccessIfNeeded() [member function]
+    cls.add_method('StartAccessIfNeeded', 
                    'void', 
                    [], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetBackoffSlots() const [member function]
-    cls.add_method('GetBackoffSlots', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetBackoffStart() const [member function]
-    cls.add_method('GetBackoffStart', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, visibility='protected')
+                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::UpdateBackoffSlotsNow(uint32_t nSlots, ns3::Time backoffUpdateBound) [member function]
     cls.add_method('UpdateBackoffSlotsNow', 
                    'void', 
                    [param('uint32_t', 'nSlots'), param('ns3::Time', 'backoffUpdateBound')], 
                    visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedRtsRetransmission(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('NeedRtsRetransmission', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedDataRetransmission(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('NeedDataRetransmission', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedFragmentation() const [member function]
-    cls.add_method('NeedFragmentation', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NextFragment() [member function]
-    cls.add_method('NextFragment', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::Txop::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
-    cls.add_method('GetFragmentPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('ns3::WifiMacHeader *', 'hdr')], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetNextFragmentSize() const [member function]
-    cls.add_method('GetNextFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetFragmentSize() const [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetFragmentOffset() const [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsLastFragment() const [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::TxDroppedPacket(ns3::Ptr<const ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('TxDroppedPacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item')], 
-                   visibility='protected')
     return
 
 def register_Ns3UniformRandomVariable_methods(root_module, cls):
@@ -9024,101 +9840,6 @@
                    [param('ns3::OrganizationIdentifier', 'oi')])
     return
 
-def register_Ns3VhtSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader::VhtSigHeader(ns3::VhtSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::VhtSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader::VhtSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::VhtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::VhtSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::VhtSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::VhtSigHeader::GetNStreams() const [member function]
-    cls.add_method('GetNStreams', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::VhtSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::GetShortGuardInterval() const [member function]
-    cls.add_method('GetShortGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::GetShortGuardIntervalDisambiguation() const [member function]
-    cls.add_method('GetShortGuardIntervalDisambiguation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::VhtSigHeader::GetSuMcs() const [member function]
-    cls.add_method('GetSuMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::VhtSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::IsLdpcCoding() const [member function]
-    cls.add_method('IsLdpcCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetCoding(bool ldpc) [member function]
-    cls.add_method('SetCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetMuFlag(bool mu) [member function]
-    cls.add_method('SetMuFlag', 
-                   'void', 
-                   [param('bool', 'mu')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetNStreams(uint8_t nStreams) [member function]
-    cls.add_method('SetNStreams', 
-                   'void', 
-                   [param('uint8_t', 'nStreams')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetShortGuardInterval(bool sgi) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'sgi')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetShortGuardIntervalDisambiguation(bool disambiguation) [member function]
-    cls.add_method('SetShortGuardIntervalDisambiguation', 
-                   'void', 
-                   [param('bool', 'disambiguation')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetSuMcs(uint8_t mcs) [member function]
-    cls.add_method('SetSuMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    return
-
 def register_Ns3VsaManager_methods(root_module, cls):
     ## vsa-manager.h (module 'wave'): ns3::VsaManager::VsaManager(ns3::VsaManager const & arg0) [constructor]
     cls.add_constructor([param('ns3::VsaManager const &', 'arg0')])
@@ -9328,6 +10049,88 @@
                    deprecated=True, is_virtual=True)
     return
 
+def register_Ns3WifiAckAfterTbPpdu_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu::WifiAckAfterTbPpdu() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckAfterTbPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiAckAfterTbPpdu::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiAckAfterTbPpdu::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu::WifiAckAfterTbPpdu(ns3::WifiAckAfterTbPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAckAfterTbPpdu const &', 'arg0')])
+    return
+
+def register_Ns3WifiAckManager_methods(root_module, cls):
+    ## wifi-ack-manager.h (module 'wifi'): ns3::WifiAckManager::WifiAckManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-ack-manager.h (module 'wifi'): ns3::WifiAckManager::WifiAckManager(ns3::WifiAckManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAckManager const &', 'arg0')])
+    ## wifi-ack-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiAckManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-ack-manager.h (module 'wifi'): static void ns3::WifiAckManager::SetQosAckPolicy(ns3::Ptr<ns3::WifiMacQueueItem> item, ns3::WifiAcknowledgment const * acknowledgment) [member function]
+    cls.add_method('SetQosAckPolicy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item'), param('ns3::WifiAcknowledgment const *', 'acknowledgment')], 
+                   is_static=True)
+    ## wifi-ack-manager.h (module 'wifi'): static void ns3::WifiAckManager::SetQosAckPolicy(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiAcknowledgment const * acknowledgment) [member function]
+    cls.add_method('SetQosAckPolicy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiAcknowledgment const *', 'acknowledgment')], 
+                   is_static=True)
+    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    cls.add_method('SetWifiMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAddMpdu', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3WifiCtsToSelfProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::WifiCtsToSelfProtection() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiCtsToSelfProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiCtsToSelfProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::ctsTxVector [variable]
+    cls.add_instance_attribute('ctsTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::WifiCtsToSelfProtection(ns3::WifiCtsToSelfProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiCtsToSelfProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiInformationElement_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement::WifiInformationElement() [constructor]
@@ -9366,7 +10169,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -9376,7 +10179,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'i')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -9449,6 +10252,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
     cls.add_method('GetVhtConfiguration', 
                    'ns3::Ptr< ns3::VhtConfiguration >', 
@@ -9498,7 +10306,7 @@
     cls.add_method('SetDevice', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::Callback<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function]
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
@@ -9528,6 +10336,11 @@
                    'void', 
                    [param('ns3::Ssid', 'ssid')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
     cls.add_method('SetWifiPhy', 
                    'void', 
@@ -9555,6 +10368,8 @@
     cls.add_constructor([param('ns3::WifiMacHeader const &', 'arg0')])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader() [constructor]
     cls.add_constructor([])
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader(ns3::WifiMacType type) [constructor]
+    cls.add_constructor([param('ns3::WifiMacType', 'type')])
     ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -9600,6 +10415,11 @@
                    'ns3::WifiMacHeader::QosAckPolicy', 
                    [], 
                    is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosQueueSize() const [member function]
+    cls.add_method('GetQosQueueSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosTid() const [member function]
     cls.add_method('GetQosTid', 
                    'uint8_t', 
@@ -9815,6 +10635,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsTrigger() const [member function]
+    cls.add_method('IsTrigger', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -9917,6 +10742,10 @@
     cls.add_method('SetQosNoMeshControlPresent', 
                    'void', 
                    [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosQueueSize(uint8_t size) [member function]
+    cls.add_method('SetQosQueueSize', 
+                   'void', 
+                   [param('uint8_t', 'size')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTid(uint8_t tid) [member function]
     cls.add_method('SetQosTid', 
                    'void', 
@@ -9974,11 +10803,21 @@
                    'ns3::Ptr< ns3::Packet const >', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetPacketSize() const [member function]
+    cls.add_method('GetPacketSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiMacQueueItem::GetProtocolDataUnit() const [member function]
     cls.add_method('GetProtocolDataUnit', 
                    'ns3::Ptr< ns3::Packet >', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): std::list<ns3::WifiMacQueueItem::QueueIteratorPair, std::allocator<ns3::WifiMacQueueItem::QueueIteratorPair> > const & ns3::WifiMacQueueItem::GetQueueIteratorPairs() const [member function]
+    cls.add_method('GetQueueIteratorPairs', 
+                   'std::list< ns3::WifiMacQueueItem::QueueIteratorPair > const &', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
     cls.add_method('GetSize', 
                    'uint32_t', 
@@ -9989,21 +10828,59 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsFragment() const [member function]
+    cls.add_method('IsFragment', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
+    cls.add_method('IsQueued', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::MsduAggregator::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
     cls.add_method('begin', 
-                   'ns3::MsduAggregator::DeaggregatedMsdusCI', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
                    [])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::MsduAggregator::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
     cls.add_method('end', 
-                   'ns3::MsduAggregator::DeaggregatedMsdusCI', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
                    [])
     return
 
+def register_Ns3WifiMacQueueItemQueueIteratorPair_methods(root_module, cls):
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::QueueIteratorPair() [constructor]
+    cls.add_constructor([])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::QueueIteratorPair(ns3::WifiMacQueueItem::QueueIteratorPair const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiMacQueueItem::QueueIteratorPair const &', 'arg0')])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::it [variable]
+    cls.add_instance_attribute('it', 'ns3::WifiMacQueueItem::ConstIterator', is_const=False)
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::queue [variable]
+    cls.add_instance_attribute('queue', 'ns3::WifiMacQueue *', is_const=False)
+    return
+
+def register_Ns3WifiNoProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection::WifiNoProtection() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiNoProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiNoProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection::WifiNoProtection(ns3::WifiNoProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiNoProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiPhy_methods(root_module, cls):
     ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -10012,6 +10889,8 @@
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
     cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::m_frequencyChannels [variable]
+    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPhyStateHelper> ns3::WifiPhy::GetState() const [member function]
     cls.add_method('GetState', 
                    'ns3::Ptr< ns3::WifiPhyStateHelper >', 
@@ -10020,7 +10899,7 @@
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
     cls.add_method('SetReceiveOkCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
     cls.add_method('SetReceiveErrorCallback', 
                    'void', 
@@ -10037,26 +10916,10 @@
     cls.add_method('SetCapabilitiesChangedCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
     cls.add_method('StartReceivePreamble', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('StartReceiveHeader', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ContinueReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('ContinueReceiveHeader', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('StartReceivePayload', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::EndReceive(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('EndReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
     cls.add_method('ResetReceive', 
                    'void', 
@@ -10065,10 +10928,15 @@
     cls.add_method('EndReceiveInterBss', 
                    'void', 
                    [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiConstPsduMap ns3::WifiPhy::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector', 'txVector')])
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
     cls.add_method('Send', 
                    'void', 
@@ -10143,125 +11011,75 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, uint16_t staId=65535) [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector txVector, ns3::WifiPhyBand band) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('CalculatePhyPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPreambleDetectionDuration() [member function]
     cls.add_method('GetPreambleDetectionDuration', 
                    'ns3::Time', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyTrainingSymbolDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyTrainingSymbolDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPhyHeaderMode() [member function]
-    cls.add_method('GetHtPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPhyHeaderMode() [member function]
-    cls.add_method('GetVhtPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHePhyHeaderMode() [member function]
-    cls.add_method('GetHePhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhyHtSigHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigA1Duration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigA1Duration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigA2Duration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigA2Duration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigBDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigBDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPhyHeaderMode(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyHeaderDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyPreambleDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyPreambleDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype=::ns3::MpduType::NORMAL_MPDU, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype=::ns3::MpduType::NORMAL_MPDU, uint16_t staId=65535) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype', default_value='::ns3::MpduType::NORMAL_MPDU'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype', default_value='::ns3::MpduType::NORMAL_MPDU'), param('uint16_t', 'staId', default_value='65535')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('GetStartOfPacketDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint8_t', 
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList() const [member function]
+    cls.add_method('GetModeList', 
+                   'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint8_t mode) const [member function]
-    cls.add_method('GetMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mode')], 
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetModeList', 
+                   'std::list< ns3::WifiMode >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
                    'bool', 
                    [param('ns3::WifiMode', 'mode')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiMode mcs) const [member function]
-    cls.add_method('IsMcsSupported', 
-                   'bool', 
-                   [param('ns3::WifiMode', 'mcs')], 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetDefaultMode() const [member function]
+    cls.add_method('GetDefaultMode', 
+                   'ns3::WifiMode', 
+                   [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiModulationClass mc, uint8_t mcs) const [member function]
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
     cls.add_method('IsMcsSupported', 
                    'bool', 
-                   [param('ns3::WifiModulationClass', 'mc'), param('uint8_t', 'mcs')], 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiTxVector txVector, double ber) const [member function]
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiTxVector const & txVector, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('double', 'ber')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('double', 'ber')], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSifs(ns3::Time sifs) [member function]
     cls.add_method('SetSifs', 
@@ -10300,46 +11118,36 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint8_t', 
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetMaxPsduSize(ns3::WifiModulationClass modulation) [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char> > ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
+    cls.add_method('GetBssMembershipSelectorList', 
+                   'std::list< unsigned char >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetBssMembershipSelector(uint8_t selector) const [member function]
-    cls.add_method('GetBssMembershipSelector', 
-                   'uint8_t', 
-                   [param('uint8_t', 'selector')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetNMcs() const [member function]
     cls.add_method('GetNMcs', 
-                   'uint8_t', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList() const [member function]
+    cls.add_method('GetMcsList', 
+                   'std::list< ns3::WifiMode >', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetMcsList', 
+                   'std::list< ns3::WifiMode >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
     cls.add_method('GetMcs', 
                    'ns3::WifiMode', 
                    [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs(uint8_t mcs) [member function]
-    cls.add_method('GetHtMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs(uint8_t mcs) [member function]
-    cls.add_method('GetVhtMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs(uint8_t mcs) [member function]
-    cls.add_method('GetHeMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
     cls.add_method('SetChannelNumber', 
                    'void', 
@@ -10370,1497 +11178,1165 @@
                    'ns3::WifiPhyBand', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DefineChannelNumber(uint8_t channelNumber, ns3::WifiPhyBand band, ns3::WifiPhyStandard standard, uint16_t frequency, uint16_t channelWidth) [member function]
-    cls.add_method('DefineChannelNumber', 
-                   'bool', 
-                   [param('uint8_t', 'channelNumber'), param('ns3::WifiPhyBand', 'band'), param('ns3::WifiPhyStandard', 'standard'), param('uint16_t', 'frequency'), param('uint16_t', 'channelWidth')])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyOperatingChannel const & ns3::WifiPhy::GetOperatingChannel() const [member function]
+    cls.add_method('GetOperatingChannel', 
+                   'ns3::WifiPhyOperatingChannel const &', 
+                   [], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::WifiPhy::GetChannel() const [member function]
     cls.add_method('GetChannel', 
                    'ns3::Ptr< ns3::Channel >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate1Mbps() [member function]
-    cls.add_method('GetDsssRate1Mbps', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::WifiConstPsduMap psdus, double txPowerW) [member function]
+    cls.add_method('NotifyTxBegin', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerW')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxEnd(ns3::WifiConstPsduMap psdus) [member function]
+    cls.add_method('NotifyTxEnd', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('NotifyTxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    cls.add_method('NotifyRxBegin', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('NotifyRxEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('NotifyRxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiPhyRxfailureReason', 'reason')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
+    cls.add_method('NotifyMonitorSniffRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, uint16_t staId=65535) [member function]
+    cls.add_method('NotifyMonitorSniffTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')])
+    ## wifi-phy.h (module 'wifi'): int64_t ns3::WifiPhy::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxSensitivity(double threshold) [member function]
+    cls.add_method('SetRxSensitivity', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxSensitivity() const [member function]
+    cls.add_method('GetRxSensitivity', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate2Mbps() [member function]
-    cls.add_method('GetDsssRate2Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCcaEdThreshold(double threshold) [member function]
+    cls.add_method('SetCcaEdThreshold', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetCcaEdThreshold() const [member function]
+    cls.add_method('GetCcaEdThreshold', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate5_5Mbps() [member function]
-    cls.add_method('GetDsssRate5_5Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
+    cls.add_method('SetRxNoiseFigure', 
+                   'void', 
+                   [param('double', 'noiseFigureDb')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerStart(double start) [member function]
+    cls.add_method('SetTxPowerStart', 
+                   'void', 
+                   [param('double', 'start')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerStart() const [member function]
+    cls.add_method('GetTxPowerStart', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate11Mbps() [member function]
-    cls.add_method('GetDsssRate11Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerEnd(double end) [member function]
+    cls.add_method('SetTxPowerEnd', 
+                   'void', 
+                   [param('double', 'end')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerEnd() const [member function]
+    cls.add_method('GetTxPowerEnd', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate6Mbps() [member function]
-    cls.add_method('GetErpOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNTxPower(uint8_t n) [member function]
+    cls.add_method('SetNTxPower', 
+                   'void', 
+                   [param('uint8_t', 'n')])
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate9Mbps() [member function]
-    cls.add_method('GetErpOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxGain(double gain) [member function]
+    cls.add_method('SetTxGain', 
+                   'void', 
+                   [param('double', 'gain')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxGain() const [member function]
+    cls.add_method('GetTxGain', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate12Mbps() [member function]
-    cls.add_method('GetErpOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxGain(double gain) [member function]
+    cls.add_method('SetRxGain', 
+                   'void', 
+                   [param('double', 'gain')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxGain() const [member function]
+    cls.add_method('GetRxGain', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate18Mbps() [member function]
-    cls.add_method('GetErpOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiPhy::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate24Mbps() [member function]
-    cls.add_method('GetErpOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> const mobility) [member function]
+    cls.add_method('SetMobility', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel > const', 'mobility')])
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::WifiPhy::GetMobility() const [member function]
+    cls.add_method('GetMobility', 
+                   'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate36Mbps() [member function]
-    cls.add_method('GetErpOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(uint8_t number, uint16_t frequency, uint16_t width) [member function]
+    cls.add_method('SetOperatingChannel', 
+                   'void', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('uint16_t', 'freq')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate48Mbps() [member function]
-    cls.add_method('GetErpOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPrimary20Index(uint8_t index) [member function]
+    cls.add_method('SetPrimary20Index', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
+    cls.add_method('SetNumberOfAntennas', 
+                   'void', 
+                   [param('uint8_t', 'antennas')])
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNumberOfAntennas() const [member function]
+    cls.add_method('GetNumberOfAntennas', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate54Mbps() [member function]
-    cls.add_method('GetErpOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedTxSpatialStreams(uint8_t streams) [member function]
+    cls.add_method('SetMaxSupportedTxSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'streams')])
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedTxSpatialStreams() const [member function]
+    cls.add_method('GetMaxSupportedTxSpatialStreams', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedRxSpatialStreams(uint8_t streams) [member function]
+    cls.add_method('SetMaxSupportedRxSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'streams')])
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedRxSpatialStreams() const [member function]
+    cls.add_method('GetMaxSupportedRxSpatialStreams', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
-    cls.add_method('GetOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetShortPhyPreambleSupported(bool preamble) [member function]
+    cls.add_method('SetShortPhyPreambleSupported', 
+                   'void', 
+                   [param('bool', 'preamble')])
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetShortPhyPreambleSupported() const [member function]
+    cls.add_method('GetShortPhyPreambleSupported', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> const rate) [member function]
+    cls.add_method('SetErrorRateModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorRateModel > const', 'rate')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPostReceptionErrorModel(ns3::Ptr<ns3::ErrorModel> const em) [member function]
+    cls.add_method('SetPostReceptionErrorModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorModel > const', 'em')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrameCaptureModel(ns3::Ptr<ns3::FrameCaptureModel> const frameCaptureModel) [member function]
+    cls.add_method('SetFrameCaptureModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::FrameCaptureModel > const', 'frameCaptureModel')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPreambleDetectionModel(ns3::Ptr<ns3::PreambleDetectionModel> const preambleDetectionModel) [member function]
+    cls.add_method('SetPreambleDetectionModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PreambleDetectionModel > const', 'preambleDetectionModel')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetWifiRadioEnergyModel(ns3::Ptr<ns3::WifiRadioEnergyModel> const wifiRadioEnergyModel) [member function]
+    cls.add_method('SetWifiRadioEnergyModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRadioEnergyModel > const', 'wifiRadioEnergyModel')])
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddSupportedChannelWidth(uint16_t width) [member function]
+    cls.add_method('AddSupportedChannelWidth', 
+                   'void', 
+                   [param('uint16_t', 'width')])
+    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'std::vector< unsigned short >', 
                    [], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetPowerDbm(uint8_t power) const [member function]
+    cls.add_method('GetPowerDbm', 
+                   'double', 
+                   [param('uint8_t', 'power')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetCca(bool powerRestricted, double txPowerMaxSiso=0, double txPowerMaxMimo=0) [member function]
+    cls.add_method('ResetCca', 
+                   'void', 
+                   [param('bool', 'powerRestricted'), param('double', 'txPowerMaxSiso', default_value='0'), param('double', 'txPowerMaxMimo', default_value='0')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerForTransmission(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerForTransmission', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyChannelAccessRequested() [member function]
+    cls.add_method('NotifyChannelAccessRequested', 
+                   'void', 
+                   [])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t bandWidth, uint16_t guardBandwidth, ns3::HeRu::SubcarrierRange range, uint8_t bandIndex=0) const [member function]
+    cls.add_method('ConvertHeRuSubcarriers', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< short, short >', 'range'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static void ns3::WifiPhy::AddStaticPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
+    cls.add_method('AddStaticPhyEntity', 
+                   'void', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
+    ## wifi-phy.h (module 'wifi'): static ns3::Ptr<const ns3::PhyEntity> const ns3::WifiPhy::GetStaticPhyEntity(ns3::WifiModulationClass modulation) [member function]
+    cls.add_method('GetStaticPhyEntity', 
+                   'ns3::Ptr< ns3::PhyEntity const > const', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::PhyEntity> ns3::WifiPhy::GetPhyEntity(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetPhyEntity', 
+                   'ns3::Ptr< ns3::PhyEntity >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint64_t ns3::WifiPhy::GetPreviouslyRxPpduUid() const [member function]
+    cls.add_method('GetPreviouslyRxPpduUid', 
+                   'uint64_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): std::tuple<double, double, double> ns3::WifiPhy::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_virtual=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::DoChannelSwitch() [member function]
+    cls.add_method('DoChannelSwitch', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy(uint16_t channelWidth) [member function]
+    cls.add_method('SwitchMaybeToCcaBusy', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')], 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
+    cls.add_method('GetBand', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetPrimaryBand(uint16_t bandWidth) [member function]
+    cls.add_method('GetPrimaryBand', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth')], 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
+    cls.add_method('AddPhyEntity', 
+                   'void', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
+                   visibility='protected')
+    return
+
+def register_Ns3WifiPhyStateHelper_methods(root_module, cls):
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper(ns3::WifiPhyStateHelper const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhyStateHelper const &', 'arg0')])
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::ContinueRxNextMpdu(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('ContinueRxNextMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetDelayUntilIdle() const [member function]
+    cls.add_method('GetDelayUntilIdle', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxEndTime() const [member function]
+    cls.add_method('GetLastRxEndTime', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): WifiPhyState ns3::WifiPhyStateHelper::GetState() const [member function]
+    cls.add_method('GetState', 
+                   'WifiPhyState', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): static ns3::TypeId ns3::WifiPhyStateHelper::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateCcaBusy() const [member function]
+    cls.add_method('IsStateCcaBusy', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateIdle() const [member function]
+    cls.add_method('IsStateIdle', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateOff() const [member function]
+    cls.add_method('IsStateOff', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateRx() const [member function]
+    cls.add_method('IsStateRx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSleep() const [member function]
+    cls.add_method('IsStateSleep', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSwitching() const [member function]
+    cls.add_method('IsStateSwitching', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateTx() const [member function]
+    cls.add_method('IsStateTx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::RegisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('RegisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
+    cls.add_method('SetReceiveErrorCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
+    cls.add_method('SetReceiveOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromOff(ns3::Time duration) [member function]
+    cls.add_method('SwitchFromOff', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxAbort() [member function]
+    cls.add_method('SwitchFromRxAbort', 
+                   'void', 
+                   [])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndError(ns3::Ptr<ns3::WifiPsdu> psdu, double snr) [member function]
+    cls.add_method('SwitchFromRxEndError', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
+    cls.add_method('SwitchFromRxEndOk', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromSleep(ns3::Time duration) [member function]
+    cls.add_method('SwitchFromSleep', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchMaybeToCcaBusy(ns3::Time duration) [member function]
+    cls.add_method('SwitchMaybeToCcaBusy', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToChannelSwitching(ns3::Time switchingDuration) [member function]
+    cls.add_method('SwitchToChannelSwitching', 
+                   'void', 
+                   [param('ns3::Time', 'switchingDuration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToOff() [member function]
+    cls.add_method('SwitchToOff', 
+                   'void', 
+                   [])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToRx(ns3::Time rxDuration) [member function]
+    cls.add_method('SwitchToRx', 
+                   'void', 
+                   [param('ns3::Time', 'rxDuration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToSleep() [member function]
+    cls.add_method('SwitchToSleep', 
+                   'void', 
+                   [])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToTx(ns3::Time txDuration, ns3::WifiConstPsduMap psdus, double txPowerDbm, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('SwitchToTx', 
+                   'void', 
+                   [param('ns3::Time', 'txDuration'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('UnregisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')])
+    return
+
+def register_Ns3WifiPpdu_methods(root_module, cls):
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPpdu const &', 'arg0')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, uint64_t uid=(18446744073709551615UL)) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('uint64_t', 'uid', default_value='(18446744073709551615UL)')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('uint64_t', 'uid')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::WifiPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiPpdu::GetModulation() const [member function]
+    cls.add_method('GetModulation', 
+                   'ns3::WifiModulationClass', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
-    cls.add_method('GetHtMcs0', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
-    cls.add_method('GetHtMcs1', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
-    cls.add_method('GetHtMcs2', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
-    cls.add_method('GetHtMcs3', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
-    cls.add_method('GetHtMcs4', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
-    cls.add_method('GetHtMcs5', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
-    cls.add_method('GetHtMcs6', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
-    cls.add_method('GetHtMcs7', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
-    cls.add_method('GetHtMcs8', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
-    cls.add_method('GetHtMcs9', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
-    cls.add_method('GetHtMcs10', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
-    cls.add_method('GetHtMcs11', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
-    cls.add_method('GetHtMcs12', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
-    cls.add_method('GetHtMcs13', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
-    cls.add_method('GetHtMcs14', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
-    cls.add_method('GetHtMcs15', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
-    cls.add_method('GetHtMcs16', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPreamble ns3::WifiPpdu::GetPreamble() const [member function]
+    cls.add_method('GetPreamble', 
+                   'ns3::WifiPreamble', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
-    cls.add_method('GetHtMcs17', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::WifiPpdu::GetPsdu() const [member function]
+    cls.add_method('GetPsdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
-    cls.add_method('GetHtMcs18', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): uint16_t ns3::WifiPpdu::GetStaId() const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
-    cls.add_method('GetHtMcs19', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
-    cls.add_method('GetHtMcs20', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::GetTxVector() const [member function]
+    cls.add_method('GetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
-    cls.add_method('GetHtMcs21', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpduType ns3::WifiPpdu::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::WifiPpduType', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
-    cls.add_method('GetHtMcs22', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): uint64_t ns3::WifiPpdu::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
-    cls.add_method('GetHtMcs23', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsTruncatedTx() const [member function]
+    cls.add_method('IsTruncatedTx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
-    cls.add_method('GetHtMcs24', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::SetTruncatedTx() [member function]
+    cls.add_method('SetTruncatedTx', 
+                   'void', 
+                   [])
+    ## wifi-ppdu.h (module 'wifi'): std::string ns3::WifiPpdu::PrintPayload() const [member function]
+    cls.add_method('PrintPayload', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
-    cls.add_method('GetHtMcs25', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
-    cls.add_method('GetHtMcs26', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3WifiProtectionManager_methods(root_module, cls):
+    ## wifi-protection-manager.h (module 'wifi'): ns3::WifiProtectionManager::WifiProtectionManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection-manager.h (module 'wifi'): ns3::WifiProtectionManager::WifiProtectionManager(ns3::WifiProtectionManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiProtectionManager const &', 'arg0')])
+    ## wifi-protection-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiProtectionManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
-    cls.add_method('GetHtMcs27', 
-                   'ns3::WifiMode', 
+    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    cls.add_method('SetWifiMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAddMpdu', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
-    cls.add_method('GetHtMcs28', 
-                   'ns3::WifiMode', 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3WifiPsdu_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::WifiPsdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPsdu const &', 'arg0')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::Packet> p, ns3::WifiMacHeader const & header) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('bool', 'isSingle')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('bool', 'isSingle')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [constructor]
+    cls.add_constructor([param('std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiPsdu::GetAckPolicyForTid(uint8_t tid) const [member function]
+    cls.add_method('GetAckPolicyForTid', 
+                   'ns3::WifiMacHeader::QosAckPolicy', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr1() const [member function]
+    cls.add_method('GetAddr1', 
+                   'ns3::Mac48Address', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
-    cls.add_method('GetHtMcs29', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr2() const [member function]
+    cls.add_method('GetAddr2', 
+                   'ns3::Mac48Address', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
-    cls.add_method('GetHtMcs30', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiPsdu::GetAmpduSubframe(std::size_t i) const [member function]
+    cls.add_method('GetAmpduSubframe', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetAmpduSubframeSize(std::size_t i) const [member function]
+    cls.add_method('GetAmpduSubframeSize', 
+                   'std::size_t', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetDuration() const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
-    cls.add_method('GetHtMcs31', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader const & ns3::WifiPsdu::GetHeader(std::size_t i) const [member function]
+    cls.add_method('GetHeader', 
+                   'ns3::WifiMacHeader const &', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader & ns3::WifiPsdu::GetHeader(std::size_t i) [member function]
+    cls.add_method('GetHeader', 
+                   'ns3::WifiMacHeader &', 
+                   [param('std::size_t', 'i')])
+    ## wifi-psdu.h (module 'wifi'): uint16_t ns3::WifiPsdu::GetMaxDistFromStartingSeq(uint16_t startingSeq) const [member function]
+    cls.add_method('GetMaxDistFromStartingSeq', 
+                   'uint16_t', 
+                   [param('uint16_t', 'startingSeq')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetNMpdus() const [member function]
+    cls.add_method('GetNMpdus', 
+                   'std::size_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
-    cls.add_method('GetVhtMcs0', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPacket() const [member function]
+    cls.add_method('GetPacket', 
+                   'ns3::Ptr< ns3::Packet const >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
-    cls.add_method('GetVhtMcs1', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPayload(std::size_t i) const [member function]
+    cls.add_method('GetPayload', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): uint32_t ns3::WifiPsdu::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
-    cls.add_method('GetVhtMcs2', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > ns3::WifiPsdu::GetTids() const [member function]
+    cls.add_method('GetTids', 
+                   'std::set< unsigned char >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
-    cls.add_method('GetVhtMcs3', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetTimeStamp(std::size_t i) const [member function]
+    cls.add_method('GetTimeStamp', 
+                   'ns3::Time', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsAggregate() const [member function]
+    cls.add_method('IsAggregate', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
-    cls.add_method('GetVhtMcs4', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsSingle() const [member function]
+    cls.add_method('IsSingle', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
-    cls.add_method('GetVhtMcs5', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetAckPolicyForTid(uint8_t tid, ns3::WifiMacHeader::QosAckPolicy policy) [member function]
+    cls.add_method('SetAckPolicyForTid', 
+                   'void', 
+                   [param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
+    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetDuration(ns3::Time duration) [member function]
+    cls.add_method('SetDuration', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::begin() const [member function]
+    cls.add_method('begin', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
-    cls.add_method('GetVhtMcs6', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::begin() [member function]
+    cls.add_method('begin', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
+                   [])
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::end() const [member function]
+    cls.add_method('end', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
-    cls.add_method('GetVhtMcs7', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
-    cls.add_method('GetVhtMcs8', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
-    cls.add_method('GetVhtMcs9', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs0() [member function]
-    cls.add_method('GetHeMcs0', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs1() [member function]
-    cls.add_method('GetHeMcs1', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs2() [member function]
-    cls.add_method('GetHeMcs2', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs3() [member function]
-    cls.add_method('GetHeMcs3', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs4() [member function]
-    cls.add_method('GetHeMcs4', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs5() [member function]
-    cls.add_method('GetHeMcs5', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs6() [member function]
-    cls.add_method('GetHeMcs6', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs7() [member function]
-    cls.add_method('GetHeMcs7', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs8() [member function]
-    cls.add_method('GetHeMcs8', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs9() [member function]
-    cls.add_method('GetHeMcs9', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs10() [member function]
-    cls.add_method('GetHeMcs10', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs11() [member function]
-    cls.add_method('GetHeMcs11', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::WifiConstPsduMap psdus, double txPowerW) [member function]
-    cls.add_method('NotifyTxBegin', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::end() [member function]
+    cls.add_method('end', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
+                   [])
+    return
+
+def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedMcs(ns3::Mac48Address address) [member function]
+    cls.add_method('AddAllSupportedMcs', 
                    'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxEnd(ns3::WifiConstPsduMap psdus) [member function]
-    cls.add_method('NotifyTxEnd', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedModes(ns3::Mac48Address address) [member function]
+    cls.add_method('AddAllSupportedModes', 
                    'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
-    cls.add_method('NotifyTxDrop', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
+    cls.add_method('AddBasicMcs', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
-    cls.add_method('NotifyRxBegin', 
+                   [param('ns3::WifiMode', 'mcs')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
+    cls.add_method('AddBasicMode', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
-    cls.add_method('NotifyRxEnd', 
+                   [param('ns3::WifiMode', 'mode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHeCapabilities(ns3::Mac48Address from, ns3::HeCapabilities heCapabilities) [member function]
+    cls.add_method('AddStationHeCapabilities', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiPhyRxfailureReason reason) [member function]
-    cls.add_method('NotifyRxDrop', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::HeCapabilities', 'heCapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHtCapabilities(ns3::Mac48Address from, ns3::HtCapabilities htCapabilities) [member function]
+    cls.add_method('AddStationHtCapabilities', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiPhyRxfailureReason', 'reason')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
-    cls.add_method('NotifyMonitorSniffRx', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htCapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtCapabilities) [member function]
+    cls.add_method('AddStationVhtCapabilities', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, uint16_t staId=65535) [member function]
-    cls.add_method('NotifyMonitorSniffTx', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtCapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedErpSlotTime(ns3::Mac48Address address, bool isShortSlotTimeSupported) [member function]
+    cls.add_method('AddSupportedErpSlotTime', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyEndOfHePreamble(ns3::HePreambleParameters params) [member function]
-    cls.add_method('NotifyEndOfHePreamble', 
+                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortSlotTimeSupported')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
+    cls.add_method('AddSupportedMcs', 
                    'void', 
-                   [param('ns3::HePreambleParameters', 'params')])
-    ## wifi-phy.h (module 'wifi'): int64_t ns3::WifiPhy::AssignStreams(int64_t stream) [member function]
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
+    cls.add_method('AddSupportedMode', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedPhyPreamble(ns3::Mac48Address address, bool isShortPreambleSupported) [member function]
+    cls.add_method('AddSupportedPhyPreamble', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortPreambleSupported')])
+    ## wifi-remote-station-manager.h (module 'wifi'): int64_t ns3::WifiRemoteStationManager::AssignStreams(int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxSensitivity(double threshold) [member function]
-    cls.add_method('SetRxSensitivity', 
-                   'void', 
-                   [param('double', 'threshold')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxSensitivity() const [member function]
-    cls.add_method('GetRxSensitivity', 
-                   'double', 
-                   [], 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCcaEdThreshold(double threshold) [member function]
-    cls.add_method('SetCcaEdThreshold', 
-                   'void', 
-                   [param('double', 'threshold')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetCcaEdThreshold() const [member function]
-    cls.add_method('GetCcaEdThreshold', 
-                   'double', 
-                   [], 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint8_t i) const [member function]
+    cls.add_method('GetBasicMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'i')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
-    cls.add_method('SetRxNoiseFigure', 
-                   'void', 
-                   [param('double', 'noiseFigureDb')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerStart(double start) [member function]
-    cls.add_method('SetTxPowerStart', 
-                   'void', 
-                   [param('double', 'start')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerStart() const [member function]
-    cls.add_method('GetTxPowerStart', 
-                   'double', 
-                   [], 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint8_t i) const [member function]
+    cls.add_method('GetBasicMode', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'i')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerEnd(double end) [member function]
-    cls.add_method('SetTxPowerEnd', 
-                   'void', 
-                   [param('double', 'end')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerEnd() const [member function]
-    cls.add_method('GetTxPowerEnd', 
-                   'double', 
-                   [], 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetBlockAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetBlockAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNTxPower(uint8_t n) [member function]
-    cls.add_method('SetNTxPower', 
-                   'void', 
-                   [param('uint8_t', 'n')])
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNTxPower() const [member function]
-    cls.add_method('GetNTxPower', 
-                   'uint8_t', 
-                   [], 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetChannelWidthSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetChannelWidthSupported', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxGain(double gain) [member function]
-    cls.add_method('SetTxGain', 
-                   'void', 
-                   [param('double', 'gain')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxGain() const [member function]
-    cls.add_method('GetTxGain', 
-                   'double', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetControlAnswerMode(ns3::WifiMode reqMode) const [member function]
+    cls.add_method('GetControlAnswerMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'reqMode')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector() [member function]
+    cls.add_method('GetCtsToSelfTxVector', 
+                   'ns3::WifiTxVector', 
+                   [])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsTxVector(ns3::Mac48Address to, ns3::WifiMode rtsTxMode) const [member function]
+    cls.add_method('GetCtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiMode', 'rtsTxMode')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetDataTxVector(ns3::WifiMacHeader const & header) [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    cls.add_method('GetDefaultMcs', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxGain(double gain) [member function]
-    cls.add_method('SetRxGain', 
-                   'void', 
-                   [param('double', 'gain')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxGain() const [member function]
-    cls.add_method('GetRxGain', 
-                   'double', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
+    cls.add_method('GetDefaultMode', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
-    cls.add_method('SetDevice', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiPhy::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
+    cls.add_method('GetDefaultTxPowerLevel', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> const mobility) [member function]
-    cls.add_method('SetMobility', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel > const', 'mobility')])
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::WifiPhy::GetMobility() const [member function]
-    cls.add_method('GetMobility', 
-                   'ns3::Ptr< ns3::MobilityModel >', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetDsssSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetErpOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetErpOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
+    cls.add_method('GetFragmentOffset', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
+    cls.add_method('GetFragmentSize', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentationThreshold() const [member function]
+    cls.add_method('GetFragmentationThreshold', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('uint16_t', 'freq')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
-    cls.add_method('GetFrequency', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
-    cls.add_method('SetNumberOfAntennas', 
-                   'void', 
-                   [param('uint8_t', 'antennas')])
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNumberOfAntennas() const [member function]
-    cls.add_method('GetNumberOfAntennas', 
-                   'uint8_t', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedTxSpatialStreams(uint8_t streams) [member function]
-    cls.add_method('SetMaxSupportedTxSpatialStreams', 
-                   'void', 
-                   [param('uint8_t', 'streams')])
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedTxSpatialStreams() const [member function]
-    cls.add_method('GetMaxSupportedTxSpatialStreams', 
-                   'uint8_t', 
-                   [], 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedRxSpatialStreams(uint8_t streams) [member function]
-    cls.add_method('SetMaxSupportedRxSpatialStreams', 
-                   'void', 
-                   [param('uint8_t', 'streams')])
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedRxSpatialStreams() const [member function]
-    cls.add_method('GetMaxSupportedRxSpatialStreams', 
-                   'uint8_t', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetShortPhyPreambleSupported(bool preamble) [member function]
-    cls.add_method('SetShortPhyPreambleSupported', 
-                   'void', 
-                   [param('bool', 'preamble')])
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetShortPhyPreambleSupported() const [member function]
-    cls.add_method('GetShortPhyPreambleSupported', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetHtSupported', 
                    'bool', 
-                   [], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> const rate) [member function]
-    cls.add_method('SetErrorRateModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ErrorRateModel > const', 'rate')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPostReceptionErrorModel(ns3::Ptr<ns3::ErrorModel> const em) [member function]
-    cls.add_method('SetPostReceptionErrorModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ErrorModel > const', 'em')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrameCaptureModel(ns3::Ptr<ns3::FrameCaptureModel> const frameCaptureModel) [member function]
-    cls.add_method('SetFrameCaptureModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::FrameCaptureModel > const', 'frameCaptureModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPreambleDetectionModel(ns3::Ptr<ns3::PreambleDetectionModel> const preambleDetectionModel) [member function]
-    cls.add_method('SetPreambleDetectionModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::PreambleDetectionModel > const', 'preambleDetectionModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetWifiRadioEnergyModel(ns3::Ptr<ns3::WifiRadioEnergyModel> const wifiRadioEnergyModel) [member function]
-    cls.add_method('SetWifiRadioEnergyModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRadioEnergyModel > const', 'wifiRadioEnergyModel')])
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo ns3::WifiRemoteStationManager::GetInfo(ns3::Mac48Address address) [member function]
+    cls.add_method('GetInfo', 
+                   'ns3::WifiRemoteStationInfo', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported() const [member function]
+    cls.add_method('GetLdpcSupported', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddSupportedChannelWidth(uint16_t width) [member function]
-    cls.add_method('AddSupportedChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'width')])
-    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
-    cls.add_method('GetSupportedChannelWidthSet', 
-                   'std::vector< unsigned short >', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetLdpcSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
+    cls.add_method('GetMac', 
+                   'ns3::Ptr< ns3::WifiMac >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetPowerDbm(uint8_t power) const [member function]
-    cls.add_method('GetPowerDbm', 
-                   'double', 
-                   [param('uint8_t', 'power')], 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMaxNumberOfTransmitStreams() const [member function]
+    cls.add_method('GetMaxNumberOfTransmitStreams', 
+                   'uint8_t', 
+                   [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetCca(bool powerRestricted, double txPowerMaxSiso=0, double txPowerMaxMimo=0) [member function]
-    cls.add_method('ResetCca', 
-                   'void', 
-                   [param('bool', 'powerRestricted'), param('double', 'txPowerMaxSiso', default_value='0'), param('double', 'txPowerMaxMimo', default_value='0')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerForTransmission(ns3::WifiTxVector txVector) const [member function]
-    cls.add_method('GetTxPowerForTransmission', 
+    ## wifi-remote-station-manager.h (module 'wifi'): double ns3::WifiRemoteStationManager::GetMostRecentRssi(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetMostRecentRssi', 
                    'double', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyChannelAccessRequested() [member function]
-    cls.add_method('NotifyChannelAccessRequested', 
-                   'void', 
-                   [])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DoChannelSwitch(uint8_t id) [member function]
-    cls.add_method('DoChannelSwitch', 
-                   'bool', 
-                   [param('uint8_t', 'id')], 
-                   visibility='protected')
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DoFrequencySwitch(uint16_t frequency) [member function]
-    cls.add_method('DoFrequencySwitch', 
-                   'bool', 
-                   [param('uint16_t', 'frequency')], 
-                   visibility='protected')
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy() [member function]
-    cls.add_method('SwitchMaybeToCcaBusy', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetStaId() const [member function]
-    cls.add_method('GetStaId', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
-    cls.add_method('GetBand', 
-                   'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t channelWidth, ns3::HeRu::SubcarrierRange range) const [member function]
-    cls.add_method('ConvertHeRuSubcarriers', 
-                   'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'channelWidth'), param('std::pair< short, short >', 'range')], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    return
-
-def register_Ns3WifiPhyStateHelper_methods(root_module, cls):
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper(ns3::WifiPhyStateHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPhyStateHelper const &', 'arg0')])
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::ContinueRxNextMpdu(ns3::Ptr<ns3::WifiPsdu> psdu, double snr, ns3::WifiTxVector txVector) [member function]
-    cls.add_method('ContinueRxNextMpdu', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetDelayUntilIdle() const [member function]
-    cls.add_method('GetDelayUntilIdle', 
-                   'ns3::Time', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicMcs() const [member function]
+    cls.add_method('GetNBasicMcs', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxEndTime() const [member function]
-    cls.add_method('GetLastRxEndTime', 
-                   'ns3::Time', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicModes() const [member function]
+    cls.add_method('GetNBasicModes', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetNMcsSupported', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNNonErpBasicModes() const [member function]
+    cls.add_method('GetNNonErpBasicModes', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): WifiPhyState ns3::WifiPhyStateHelper::GetState() const [member function]
-    cls.add_method('GetState', 
-                   'WifiPhyState', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonErpBasicMode(uint8_t i) const [member function]
+    cls.add_method('GetNonErpBasicMode', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'i')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonUnicastMode() const [member function]
+    cls.add_method('GetNonUnicastMode', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): static ns3::TypeId ns3::WifiPhyStateHelper::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfAntennas() const [member function]
+    cls.add_method('GetNumberOfAntennas', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateCcaBusy() const [member function]
-    cls.add_method('IsStateCcaBusy', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetNumberOfSupportedStreams', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetOfdmSupported', 
                    'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
+    cls.add_method('GetPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateIdle() const [member function]
-    cls.add_method('IsStateIdle', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetQosSupported', 
                    'bool', 
-                   [], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateOff() const [member function]
-    cls.add_method('IsStateOff', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetRtsTxVector(ns3::Mac48Address address) [member function]
+    cls.add_method('GetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported() const [member function]
+    cls.add_method('GetShortGuardIntervalSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateRx() const [member function]
-    cls.add_method('IsStateRx', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetShortGuardIntervalSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleEnabled() const [member function]
+    cls.add_method('GetShortPreambleEnabled', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSleep() const [member function]
-    cls.add_method('IsStateSleep', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetShortPreambleSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeEnabled() const [member function]
+    cls.add_method('GetShortSlotTimeEnabled', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSwitching() const [member function]
-    cls.add_method('IsStateSwitching', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HeCapabilities> ns3::WifiRemoteStationManager::GetStationHeCapabilities(ns3::Mac48Address from) [member function]
+    cls.add_method('GetStationHeCapabilities', 
+                   'ns3::Ptr< ns3::HeCapabilities const >', 
+                   [param('ns3::Mac48Address', 'from')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HtCapabilities> ns3::WifiRemoteStationManager::GetStationHtCapabilities(ns3::Mac48Address from) [member function]
+    cls.add_method('GetStationHtCapabilities', 
+                   'ns3::Ptr< ns3::HtCapabilities const >', 
+                   [param('ns3::Mac48Address', 'from')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::VhtCapabilities> ns3::WifiRemoteStationManager::GetStationVhtCapabilities(ns3::Mac48Address from) [member function]
+    cls.add_method('GetStationVhtCapabilities', 
+                   'ns3::Ptr< ns3::VhtCapabilities const >', 
+                   [param('ns3::Mac48Address', 'from')])
+    ## wifi-remote-station-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiRemoteStationManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonErpProtection() const [member function]
+    cls.add_method('GetUseNonErpProtection', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateTx() const [member function]
-    cls.add_method('IsStateTx', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonHtProtection() const [member function]
+    cls.add_method('GetUseNonHtProtection', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::RegisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('RegisterListener', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsAssociated', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsBrandNew(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsBrandNew', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
+    cls.add_method('IsLastFragment', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsWaitAssocTxOk(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsWaitAssocTxOk', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedCtsToSelf(ns3::WifiTxVector txVector) [member function]
+    cls.add_method('NeedCtsToSelf', 
+                   'bool', 
+                   [param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NeedFragmentation', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NeedRetransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::WifiMacHeader const & header, uint32_t size) [member function]
+    cls.add_method('NeedRts', 
+                   'bool', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordDisassociated(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordDisassociated', 
                    'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
-    cls.add_method('SetReceiveErrorCallback', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxFailed(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordGotAssocTxFailed', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
-    cls.add_method('SetReceiveOkCallback', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxOk(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordGotAssocTxOk', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromOff(ns3::Time duration) [member function]
-    cls.add_method('SwitchFromOff', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordWaitAssocTxOk(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordWaitAssocTxOk', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxAbort() [member function]
-    cls.add_method('SwitchFromRxAbort', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RemoveAllSupportedMcs(ns3::Mac48Address address) [member function]
+    cls.add_method('RemoveAllSupportedMcs', 
                    'void', 
-                   [])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndError(ns3::Ptr<ns3::WifiPsdu> psdu, double snr) [member function]
-    cls.add_method('SwitchFromRxEndError', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+    cls.add_method('ReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, double snr, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
-    cls.add_method('SwitchFromRxEndOk', 
+                   [param('ns3::Mac48Address', 'address'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('ReportDataFailed', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromSleep(ns3::Time duration) [member function]
-    cls.add_method('SwitchFromSleep', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+    cls.add_method('ReportDataOk', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchMaybeToCcaBusy(ns3::Time duration) [member function]
-    cls.add_method('SwitchMaybeToCcaBusy', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('ReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToChannelSwitching(ns3::Time switchingDuration) [member function]
-    cls.add_method('SwitchToChannelSwitching', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::WifiMacHeader const & header) [member function]
+    cls.add_method('ReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Time', 'switchingDuration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToOff() [member function]
-    cls.add_method('SwitchToOff', 
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::WifiMacHeader const & header) [member function]
+    cls.add_method('ReportRtsFailed', 
                    'void', 
-                   [])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToRx(ns3::Time rxDuration) [member function]
-    cls.add_method('SwitchToRx', 
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::WifiMacHeader const & header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('ReportRtsOk', 
                    'void', 
-                   [param('ns3::Time', 'rxDuration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToSleep() [member function]
-    cls.add_method('SwitchToSleep', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('ReportRxOk', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::Reset() [member function]
+    cls.add_method('Reset', 
                    'void', 
                    [])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToTx(ns3::Time txDuration, ns3::WifiConstPsduMap psdus, double txPowerDbm, ns3::WifiTxVector txVector) [member function]
-    cls.add_method('SwitchToTx', 
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
+    cls.add_method('SetDefaultTxPowerLevel', 
                    'void', 
-                   [param('ns3::Time', 'txDuration'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('UnregisterListener', 
+                   [param('uint8_t', 'txPower')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetFragmentationThreshold(uint32_t threshold) [member function]
+    cls.add_method('SetFragmentationThreshold', 
                    'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')])
-    return
-
-def register_Ns3WifiPpdu_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiPpdu const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPpdu const &', 'arg0')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band) [constructor]
-    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiPpdu::GetModulation() const [member function]
-    cls.add_method('GetModulation', 
-                   'ns3::WifiModulationClass', 
-                   [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::WifiPpdu::GetPsdu(uint8_t bssColor=64, uint16_t staId=65535) const [member function]
-    cls.add_method('GetPsdu', 
-                   'ns3::Ptr< ns3::WifiPsdu const >', 
-                   [param('uint8_t', 'bssColor', default_value='64'), param('uint16_t', 'staId', default_value='65535')], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
-    cls.add_method('GetTxDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::GetTxVector() const [member function]
-    cls.add_method('GetTxVector', 
-                   'ns3::WifiTxVector', 
-                   [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsMu() const [member function]
-    cls.add_method('IsMu', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsTruncatedTx() const [member function]
-    cls.add_method('IsTruncatedTx', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
+                   [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSlrc(uint32_t maxSlrc) [member function]
+    cls.add_method('SetMaxSlrc', 
                    'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::SetTruncatedTx() [member function]
-    cls.add_method('SetTruncatedTx', 
+                   [param('uint32_t', 'maxSlrc')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
+    cls.add_method('SetMaxSsrc', 
                    'void', 
-                   [])
-    return
-
-def register_Ns3WifiPsdu_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::WifiPsdu const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPsdu const &', 'arg0')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::Packet> p, ns3::WifiMacHeader const & header) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::WifiMacHeader const &', 'header')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('bool', 'isSingle')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('bool', 'isSingle')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [constructor]
-    cls.add_constructor([param('std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiPsdu::GetAckPolicyForTid(uint8_t tid) const [member function]
-    cls.add_method('GetAckPolicyForTid', 
-                   'ns3::WifiMacHeader::QosAckPolicy', 
-                   [param('uint8_t', 'tid')], 
+                   [param('uint32_t', 'maxSsrc')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
+    cls.add_method('SetQosSupport', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('bool', 'qosSupported')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetRtsCtsThreshold(uint32_t threshold) [member function]
+    cls.add_method('SetRtsCtsThreshold', 
+                   'void', 
+                   [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortPreambleEnabled(bool enable) [member function]
+    cls.add_method('SetShortPreambleEnabled', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortSlotTimeEnabled(bool enable) [member function]
+    cls.add_method('SetShortSlotTimeEnabled', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonErpProtection(bool enable) [member function]
+    cls.add_method('SetUseNonErpProtection', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonHtProtection(bool enable) [member function]
+    cls.add_method('SetUseNonHtProtection', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetupMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseLdpcForDestination(ns3::Mac48Address dest) const [member function]
+    cls.add_method('UseLdpcForDestination', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'dest')], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr1() const [member function]
-    cls.add_method('GetAddr1', 
-                   'ns3::Mac48Address', 
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr2() const [member function]
-    cls.add_method('GetAddr2', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiPsdu::GetAmpduSubframe(std::size_t i) const [member function]
-    cls.add_method('GetAmpduSubframe', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetAmpduSubframeSize(std::size_t i) const [member function]
-    cls.add_method('GetAmpduSubframeSize', 
-                   'std::size_t', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetDuration() const [member function]
-    cls.add_method('GetDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader const & ns3::WifiPsdu::GetHeader(std::size_t i) const [member function]
-    cls.add_method('GetHeader', 
-                   'ns3::WifiMacHeader const &', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader & ns3::WifiPsdu::GetHeader(std::size_t i) [member function]
-    cls.add_method('GetHeader', 
-                   'ns3::WifiMacHeader &', 
-                   [param('std::size_t', 'i')])
-    ## wifi-psdu.h (module 'wifi'): uint16_t ns3::WifiPsdu::GetMaxDistFromStartingSeq(uint16_t startingSeq) const [member function]
-    cls.add_method('GetMaxDistFromStartingSeq', 
-                   'uint16_t', 
-                   [param('uint16_t', 'startingSeq')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetNMpdus() const [member function]
-    cls.add_method('GetNMpdus', 
-                   'std::size_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet const >', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPayload(std::size_t i) const [member function]
-    cls.add_method('GetPayload', 
-                   'ns3::Ptr< ns3::Packet const >', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): uint32_t ns3::WifiPsdu::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > ns3::WifiPsdu::GetTids() const [member function]
-    cls.add_method('GetTids', 
-                   'std::set< unsigned char >', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetTimeStamp(std::size_t i) const [member function]
-    cls.add_method('GetTimeStamp', 
-                   'ns3::Time', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsAggregate() const [member function]
-    cls.add_method('IsAggregate', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsSingle() const [member function]
-    cls.add_method('IsSingle', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetAckPolicyForTid(uint8_t tid, ns3::WifiMacHeader::QosAckPolicy policy) [member function]
-    cls.add_method('SetAckPolicyForTid', 
-                   'void', 
-                   [param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
-    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetDuration(ns3::Time duration) [member function]
-    cls.add_method('SetDuration', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::begin() const [member function]
-    cls.add_method('begin', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::begin() [member function]
-    cls.add_method('begin', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
-                   [])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::end() const [member function]
-    cls.add_method('end', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::end() [member function]
-    cls.add_method('end', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
-                   [])
-    return
-
-def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager() [constructor]
-    cls.add_constructor([])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedMcs(ns3::Mac48Address address) [member function]
-    cls.add_method('AddAllSupportedMcs', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedModes(ns3::Mac48Address address) [member function]
-    cls.add_method('AddAllSupportedModes', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
-    cls.add_method('AddBasicMcs', 
-                   'void', 
-                   [param('ns3::WifiMode', 'mcs')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
-    cls.add_method('AddBasicMode', 
-                   'void', 
-                   [param('ns3::WifiMode', 'mode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHeCapabilities(ns3::Mac48Address from, ns3::HeCapabilities heCapabilities) [member function]
-    cls.add_method('AddStationHeCapabilities', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'from'), param('ns3::HeCapabilities', 'heCapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHtCapabilities(ns3::Mac48Address from, ns3::HtCapabilities htCapabilities) [member function]
-    cls.add_method('AddStationHtCapabilities', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htCapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtCapabilities) [member function]
-    cls.add_method('AddStationVhtCapabilities', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtCapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedErpSlotTime(ns3::Mac48Address address, bool isShortSlotTimeSupported) [member function]
-    cls.add_method('AddSupportedErpSlotTime', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortSlotTimeSupported')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
-    cls.add_method('AddSupportedMcs', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
-    cls.add_method('AddSupportedMode', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedPhyPreamble(ns3::Mac48Address address, bool isShortPreambleSupported) [member function]
-    cls.add_method('AddSupportedPhyPreamble', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortPreambleSupported')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint8_t i) const [member function]
-    cls.add_method('GetBasicMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint8_t i) const [member function]
-    cls.add_method('GetBasicMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetChannelWidthSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetChannelWidthSupported', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector() [member function]
-    cls.add_method('GetCtsToSelfTxVector', 
-                   'ns3::WifiTxVector', 
-                   [])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetDataTxVector(ns3::WifiMacHeader const & header) [member function]
-    cls.add_method('GetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiMacHeader const &', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
-    cls.add_method('GetDefaultMcs', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
-    cls.add_method('GetDefaultMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
-    cls.add_method('GetDefaultTxPowerLevel', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentationThreshold() const [member function]
-    cls.add_method('GetFragmentationThreshold', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported() const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported() const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported() const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo ns3::WifiRemoteStationManager::GetInfo(ns3::Mac48Address address) [member function]
-    cls.add_method('GetInfo', 
-                   'ns3::WifiRemoteStationInfo', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported() const [member function]
-    cls.add_method('GetLdpcSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetLdpcSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMaxNumberOfTransmitStreams() const [member function]
-    cls.add_method('GetMaxNumberOfTransmitStreams', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicMcs() const [member function]
-    cls.add_method('GetNBasicMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicModes() const [member function]
-    cls.add_method('GetNBasicModes', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetNMcsSupported', 
-                   'uint8_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNNonErpBasicModes() const [member function]
-    cls.add_method('GetNNonErpBasicModes', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonErpBasicMode(uint8_t i) const [member function]
-    cls.add_method('GetNonErpBasicMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonUnicastMode() const [member function]
-    cls.add_method('GetNonUnicastMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfAntennas() const [member function]
-    cls.add_method('GetNumberOfAntennas', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetNumberOfSupportedStreams', 
-                   'uint8_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetPcfSupported() const [member function]
-    cls.add_method('GetPcfSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetRtsTxVector(ns3::Mac48Address address) [member function]
-    cls.add_method('GetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported() const [member function]
-    cls.add_method('GetShortGuardIntervalSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetShortGuardIntervalSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleEnabled() const [member function]
-    cls.add_method('GetShortPreambleEnabled', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetShortPreambleSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeEnabled() const [member function]
-    cls.add_method('GetShortSlotTimeEnabled', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HeCapabilities> ns3::WifiRemoteStationManager::GetStationHeCapabilities(ns3::Mac48Address from) [member function]
-    cls.add_method('GetStationHeCapabilities', 
-                   'ns3::Ptr< ns3::HeCapabilities const >', 
-                   [param('ns3::Mac48Address', 'from')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HtCapabilities> ns3::WifiRemoteStationManager::GetStationHtCapabilities(ns3::Mac48Address from) [member function]
-    cls.add_method('GetStationHtCapabilities', 
-                   'ns3::Ptr< ns3::HtCapabilities const >', 
-                   [param('ns3::Mac48Address', 'from')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::VhtCapabilities> ns3::WifiRemoteStationManager::GetStationVhtCapabilities(ns3::Mac48Address from) [member function]
-    cls.add_method('GetStationVhtCapabilities', 
-                   'ns3::Ptr< ns3::VhtCapabilities const >', 
-                   [param('ns3::Mac48Address', 'from')])
-    ## wifi-remote-station-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiRemoteStationManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseGreenfieldProtection() const [member function]
-    cls.add_method('GetUseGreenfieldProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonErpProtection() const [member function]
-    cls.add_method('GetUseNonErpProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonHtProtection() const [member function]
-    cls.add_method('GetUseNonHtProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported() const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
-    cls.add_method('IsAssociated', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsBrandNew(ns3::Mac48Address address) const [member function]
-    cls.add_method('IsBrandNew', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsWaitAssocTxOk(ns3::Mac48Address address) const [member function]
-    cls.add_method('IsWaitAssocTxOk', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedCtsToSelf(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('NeedCtsToSelf', 
-                   'bool', 
-                   [param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NeedFragmentation', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NeedRetransmission', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::WifiMacHeader const & header, uint32_t size) [member function]
-    cls.add_method('NeedRts', 
-                   'bool', 
-                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordDisassociated(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordDisassociated', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxFailed(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordGotAssocTxFailed', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxOk(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordGotAssocTxOk', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordWaitAssocTxOk(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordWaitAssocTxOk', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RemoveAllSupportedMcs(ns3::Mac48Address address) [member function]
-    cls.add_method('RemoveAllSupportedMcs', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('ReportAmpduTxStatus', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
-    cls.add_method('ReportDataFailed', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector, uint32_t packetSize) [member function]
-    cls.add_method('ReportDataOk', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
-    cls.add_method('ReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
-    cls.add_method('ReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
-    cls.add_method('ReportRtsFailed', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('ReportRtsOk', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('ReportRxOk', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::Reset() [member function]
-    cls.add_method('Reset', 
-                   'void', 
-                   [])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
-    cls.add_method('SetDefaultTxPowerLevel', 
-                   'void', 
-                   [param('uint8_t', 'txPower')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetFragmentationThreshold(uint32_t threshold) [member function]
-    cls.add_method('SetFragmentationThreshold', 
-                   'void', 
-                   [param('uint32_t', 'threshold')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSlrc(uint32_t maxSlrc) [member function]
-    cls.add_method('SetMaxSlrc', 
-                   'void', 
-                   [param('uint32_t', 'maxSlrc')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
-    cls.add_method('SetMaxSsrc', 
-                   'void', 
-                   [param('uint32_t', 'maxSsrc')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetPcfSupported(bool enable) [member function]
-    cls.add_method('SetPcfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
-    cls.add_method('SetQosSupport', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'from'), param('bool', 'qosSupported')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetRtsCtsThreshold(uint32_t threshold) [member function]
-    cls.add_method('SetRtsCtsThreshold', 
-                   'void', 
-                   [param('uint32_t', 'threshold')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortPreambleEnabled(bool enable) [member function]
-    cls.add_method('SetShortPreambleEnabled', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortSlotTimeEnabled(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeEnabled', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseGreenfieldProtection(bool enable) [member function]
-    cls.add_method('SetUseGreenfieldProtection', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonErpProtection(bool enable) [member function]
-    cls.add_method('SetUseNonErpProtection', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonHtProtection(bool enable) [member function]
-    cls.add_method('SetUseNonHtProtection', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetupMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
-                   is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
-    cls.add_method('UpdateFragmentationThreshold', 
-                   'void', 
-                   [])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseGreenfieldForDestination(ns3::Mac48Address dest) const [member function]
-    cls.add_method('UseGreenfieldForDestination', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseLdpcForDestination(ns3::Mac48Address dest) const [member function]
-    cls.add_method('UseLdpcForDestination', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Mac48Address ns3::WifiRemoteStationManager::GetAddress(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetAddress', 
+                   is_virtual=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Mac48Address ns3::WifiRemoteStationManager::GetAddress(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAddress', 
                    'ns3::Mac48Address', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
@@ -11874,11 +12350,6 @@
                    'uint16_t', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetGreenfield', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetGuardInterval', 
                    'uint16_t', 
@@ -11894,11 +12365,6 @@
                    'bool', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
-    cls.add_method('GetMac', 
-                   'ns3::Ptr< ns3::WifiMac >', 
-                   [], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
     cls.add_method('GetMcsSupported', 
                    'ns3::WifiMode', 
@@ -11934,11 +12400,6 @@
                    'uint8_t', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetQosSupported', 
                    'bool', 
@@ -11989,10 +12450,10 @@
                    'bool', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
                    is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
     cls.add_method('DoReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
                    is_virtual=True, visibility='private')
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportDataFailed', 
@@ -12358,18 +12819,18 @@
     cls.add_method('DestroyAgreement', 
                    'void', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient, uint16_t startingSeq) [member function]
     cls.add_method('UpdateAgreement', 
                    'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient'), param('uint16_t', 'startingSeq')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::StorePacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('StorePacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true) [member function]
+    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
     cls.add_method('GetBar', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('bool', 'remove', default_value='true')])
+                   [param('bool', 'remove', default_value='true'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
     ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasPackets() [member function]
     cls.add_method('HasPackets', 
                    'bool', 
@@ -12382,10 +12843,10 @@
     cls.add_method('NotifyMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, double rxSnr, double dataSnr, ns3::WifiTxVector const & dataTxVector, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
                    'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector const &', 'dataTxVector'), param('size_t', 'index', default_value='0')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('NotifyMissedBlockAck', 
                    'void', 
@@ -12427,14 +12888,6 @@
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueue > const', 'queue')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
-    cls.add_method('SetTxMiddle', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckType(ns3::BlockAckType bAckType) [member function]
-    cls.add_method('SetBlockAckType', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'bAckType')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckInactivityCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
     cls.add_method('SetBlockAckInactivityCallback', 
                    'void', 
@@ -12460,6 +12913,16 @@
                    'uint16_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
                    is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckManager::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckManager::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
     ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetOriginatorStartingSequence(ns3::Mac48Address recipient, uint8_t tid) const [member function]
     cls.add_method('GetOriginatorStartingSequence', 
                    'uint16_t', 
@@ -12468,11 +12931,11 @@
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxOkCallback(ns3::BlockAckManager::TxOk callback) [member function]
     cls.add_method('SetTxOkCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxFailedCallback(ns3::BlockAckManager::TxFailed callback) [member function]
     cls.add_method('SetTxFailedCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyDiscardedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NotifyDiscardedMpdu', 
                    'void', 
@@ -12507,820 +12970,1376 @@
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('bool', 'value')])
+    return
+
+def register_Ns3BsmApplication_methods(root_module, cls):
+    ## bsm-application.h (module 'wave'): ns3::BsmApplication::BsmApplication(ns3::BsmApplication const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BsmApplication const &', 'arg0')])
+    ## bsm-application.h (module 'wave'): ns3::BsmApplication::BsmApplication() [constructor]
+    cls.add_constructor([])
+    ## bsm-application.h (module 'wave'): int64_t ns3::BsmApplication::AssignStreams(int64_t streamIndex) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'streamIndex')])
+    ## bsm-application.h (module 'wave'): static ns3::TypeId ns3::BsmApplication::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::Setup(ns3::Ipv4InterfaceContainer & i, int nodeId, ns3::Time totalTime, uint32_t wavePacketSize, ns3::Time waveInterval, double gpsAccuracyNs, std::vector<double, std::allocator<double> > rangesSq, ns3::Ptr<ns3::WaveBsmStats> waveBsmStats, std::vector<int, std::allocator<int> > * nodesMoving, int mode, ns3::Time txDelay) [member function]
+    cls.add_method('Setup', 
+                   'void', 
+                   [param('ns3::Ipv4InterfaceContainer &', 'i'), param('int', 'nodeId'), param('ns3::Time', 'totalTime'), param('uint32_t', 'wavePacketSize'), param('ns3::Time', 'waveInterval'), param('double', 'gpsAccuracyNs'), param('std::vector< double >', 'rangesSq'), param('ns3::Ptr< ns3::WaveBsmStats >', 'waveBsmStats'), param('std::vector< int > *', 'nodesMoving'), param('int', 'mode'), param('ns3::Time', 'txDelay')])
+    ## bsm-application.h (module 'wave'): ns3::BsmApplication::wavePort [variable]
+    cls.add_static_attribute('wavePort', 'int', is_const=False)
+    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::StartApplication() [member function]
+    cls.add_method('StartApplication', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::StopApplication() [member function]
+    cls.add_method('StopApplication', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3CallbackChecker_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
+    return
+
+def register_Ns3CallbackImplBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<const ns3::CallbackImplBase> other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['void'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['bool'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ipv4Header const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv4> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ipv4L3Protocol::DropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ipv6Header const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ipv6L3Protocol::DropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned long long'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('bool', 'value')])
-    return
-
-def register_Ns3BsmApplication_methods(root_module, cls):
-    ## bsm-application.h (module 'wave'): ns3::BsmApplication::BsmApplication(ns3::BsmApplication const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BsmApplication const &', 'arg0')])
-    ## bsm-application.h (module 'wave'): ns3::BsmApplication::BsmApplication() [constructor]
-    cls.add_constructor([])
-    ## bsm-application.h (module 'wave'): int64_t ns3::BsmApplication::AssignStreams(int64_t streamIndex) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'streamIndex')])
-    ## bsm-application.h (module 'wave'): static ns3::TypeId ns3::BsmApplication::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::Setup(ns3::Ipv4InterfaceContainer & i, int nodeId, ns3::Time totalTime, uint32_t wavePacketSize, ns3::Time waveInterval, double gpsAccuracyNs, std::vector<double, std::allocator<double> > rangesSq, ns3::Ptr<ns3::WaveBsmStats> waveBsmStats, std::vector<int, std::allocator<int> > * nodesMoving, int mode, ns3::Time txDelay) [member function]
-    cls.add_method('Setup', 
-                   'void', 
-                   [param('ns3::Ipv4InterfaceContainer &', 'i'), param('int', 'nodeId'), param('ns3::Time', 'totalTime'), param('uint32_t', 'wavePacketSize'), param('ns3::Time', 'waveInterval'), param('double', 'gpsAccuracyNs'), param('std::vector< double >', 'rangesSq'), param('ns3::Ptr< ns3::WaveBsmStats >', 'waveBsmStats'), param('std::vector< int > *', 'nodesMoving'), param('int', 'mode'), param('ns3::Time', 'txDelay')])
-    ## bsm-application.h (module 'wave'): ns3::BsmApplication::wavePort [variable]
-    cls.add_static_attribute('wavePort', 'int', is_const=False)
-    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
+                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::StartApplication() [member function]
-    cls.add_method('StartApplication', 
-                   'void', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::StopApplication() [member function]
-    cls.add_method('StopApplication', 
-                   'void', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMac> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3CallbackChecker_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
-    return
-
-def register_Ns3CallbackImplBase_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
-    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
+                   is_static=True, template_parameters=['ns3::OrganizationIdentifier const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<const ns3::CallbackImplBase> other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
+                   is_static=True, template_parameters=['ns3::Address'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
                    'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['void'], visibility='protected')
+                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+                   is_static=True, template_parameters=['double'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv4Header const&'], visibility='protected')
+                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv4> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv4L3Protocol::DropReason'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
+    return
+
+def register_Ns3CallbackValue_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::CallbackBase', 'base')])
+    return
+
+def register_Ns3Channel_methods(root_module, cls):
+    ## channel.h (module 'network'): ns3::Channel::Channel(ns3::Channel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Channel const &', 'arg0')])
+    ## channel.h (module 'network'): ns3::Channel::Channel() [constructor]
+    cls.add_constructor([])
+    ## channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Channel::GetDevice(std::size_t i) const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## channel.h (module 'network'): uint32_t ns3::Channel::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## channel.h (module 'network'): std::size_t ns3::Channel::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## channel.h (module 'network'): static ns3::TypeId ns3::Channel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3ChannelAccessManager_methods(root_module, cls):
+    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager(ns3::ChannelAccessManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelAccessManager const &', 'arg0')])
+    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager() [constructor]
+    cls.add_constructor([])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::Add(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetAccessGrantStart(bool ignoreNav=false) const [member function]
+    cls.add_method('GetAccessGrantStart', 
+                   'ns3::Time', 
+                   [param('bool', 'ignoreNav', default_value='false')], 
+                   is_const=True)
+    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::IsBusy() const [member function]
+    cls.add_method('IsBusy', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::NeedBackoffUponAccess(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('NeedBackoffUponAccess', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutResetNow() [member function]
+    cls.add_method('NotifyAckTimeoutResetNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyAckTimeoutStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutResetNow() [member function]
+    cls.add_method('NotifyCtsTimeoutResetNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyCtsTimeoutStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyMaybeCcaBusyStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyMaybeCcaBusyStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavResetNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyNavResetNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyNavStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOffNow() [member function]
+    cls.add_method('NotifyOffNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOnNow() [member function]
+    cls.add_method('NotifyOnNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndErrorNow() [member function]
+    cls.add_method('NotifyRxEndErrorNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndOkNow() [member function]
+    cls.add_method('NotifyRxEndOkNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyRxStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySleepNow() [member function]
+    cls.add_method('NotifySleepNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyTxStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyTxStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyWakeupNow() [member function]
+    cls.add_method('NotifyWakeupNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RemovePhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('RemovePhyListener', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RequestAccess(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('RequestAccess', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupFrameExchangeManager(ns3::Ptr<ns3::FrameExchangeManager> feManager) [member function]
+    cls.add_method('SetupFrameExchangeManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::FrameExchangeManager >', 'feManager')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupPhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetupPhyListener', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetEifsNoDifs() const [member function]
+    cls.add_method('GetEifsNoDifs', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSifs() const [member function]
+    cls.add_method('GetSifs', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv6Header const&'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSlot() const [member function]
+    cls.add_method('GetSlot', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv6L3Protocol::DropReason'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ChannelCoordinationListener_methods(root_module, cls):
+    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinationListener::ChannelCoordinationListener() [constructor]
+    cls.add_constructor([])
+    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinationListener::ChannelCoordinationListener(ns3::ChannelCoordinationListener const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelCoordinationListener const &', 'arg0')])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinationListener::NotifyCchSlotStart(ns3::Time duration) [member function]
+    cls.add_method('NotifyCchSlotStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinationListener::NotifyGuardSlotStart(ns3::Time duration, bool cchi) [member function]
+    cls.add_method('NotifyGuardSlotStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration'), param('bool', 'cchi')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinationListener::NotifySchSlotStart(ns3::Time duration) [member function]
+    cls.add_method('NotifySchSlotStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3ChannelCoordinator_methods(root_module, cls):
+    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinator::ChannelCoordinator(ns3::ChannelCoordinator const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelCoordinator const &', 'arg0')])
+    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinator::ChannelCoordinator() [constructor]
+    cls.add_constructor([])
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetCchInterval() const [member function]
+    cls.add_method('GetCchInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultCchInterval() [member function]
+    cls.add_method('GetDefaultCchInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultGuardInterval() [member function]
+    cls.add_method('GetDefaultGuardInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultSchInterval() [member function]
+    cls.add_method('GetDefaultSchInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultSyncInterval() [member function]
+    cls.add_method('GetDefaultSyncInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetIntervalTime(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('GetIntervalTime', 
+                   'ns3::Time', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetRemainTime(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('GetRemainTime', 
+                   'ns3::Time', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetSchInterval() const [member function]
+    cls.add_method('GetSchInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetSyncInterval() const [member function]
+    cls.add_method('GetSyncInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMac> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): static ns3::TypeId ns3::ChannelCoordinator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OrganizationIdentifier const&'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsCchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('IsCchInterval', 
+                   'bool', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsGuardInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('IsGuardInterval', 
+                   'bool', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsSchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('IsSchInterval', 
+                   'bool', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsValidConfig() const [member function]
+    cls.add_method('IsValidConfig', 
+                   'bool', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::NeedTimeToCchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('NeedTimeToCchInterval', 
+                   'ns3::Time', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::NeedTimeToGuardInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('NeedTimeToGuardInterval', 
+                   'ns3::Time', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::NeedTimeToSchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('NeedTimeToSchInterval', 
+                   'ns3::Time', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::RegisterListener(ns3::Ptr<ns3::ChannelCoordinationListener> listener) [member function]
+    cls.add_method('RegisterListener', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ChannelCoordinationListener >', 'listener')])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::SetCchInterval(ns3::Time cchi) [member function]
+    cls.add_method('SetCchInterval', 
+                   'void', 
+                   [param('ns3::Time', 'cchi')])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::SetGuardInterval(ns3::Time guardi) [member function]
+    cls.add_method('SetGuardInterval', 
+                   'void', 
+                   [param('ns3::Time', 'guardi')])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::SetSchInterval(ns3::Time schi) [member function]
+    cls.add_method('SetSchInterval', 
+                   'void', 
+                   [param('ns3::Time', 'schi')])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::UnregisterAllListeners() [member function]
+    cls.add_method('UnregisterAllListeners', 
+                   'void', 
+                   [])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::UnregisterListener(ns3::Ptr<ns3::ChannelCoordinationListener> listener) [member function]
+    cls.add_method('UnregisterListener', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ChannelCoordinationListener >', 'listener')])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_virtual=True, visibility='private')
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ChannelManager_methods(root_module, cls):
+    ## channel-manager.h (module 'wave'): ns3::ChannelManager::ChannelManager(ns3::ChannelManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelManager const &', 'arg0')])
+    ## channel-manager.h (module 'wave'): ns3::ChannelManager::ChannelManager() [constructor]
+    cls.add_constructor([])
+    ## channel-manager.h (module 'wave'): static uint32_t ns3::ChannelManager::GetCch() [member function]
+    cls.add_method('GetCch', 
+                   'uint32_t', 
                    [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): bool ns3::ChannelManager::GetManagementAdaptable(uint32_t channelNumber) [member function]
+    cls.add_method('GetManagementAdaptable', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')])
+    ## channel-manager.h (module 'wave'): ns3::WifiMode ns3::ChannelManager::GetManagementDataRate(uint32_t channelNumber) [member function]
+    cls.add_method('GetManagementDataRate', 
+                   'ns3::WifiMode', 
+                   [param('uint32_t', 'channelNumber')])
+    ## channel-manager.h (module 'wave'): uint32_t ns3::ChannelManager::GetManagementPowerLevel(uint32_t channelNumber) [member function]
+    cls.add_method('GetManagementPowerLevel', 
+                   'uint32_t', 
+                   [param('uint32_t', 'channelNumber')])
+    ## channel-manager.h (module 'wave'): ns3::WifiPreamble ns3::ChannelManager::GetManagementPreamble(uint32_t channelNumber) [member function]
+    cls.add_method('GetManagementPreamble', 
+                   'ns3::WifiPreamble', 
+                   [param('uint32_t', 'channelNumber')])
+    ## channel-manager.h (module 'wave'): static uint32_t ns3::ChannelManager::GetNumberOfWaveChannels() [member function]
+    cls.add_method('GetNumberOfWaveChannels', 
+                   'uint32_t', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): uint32_t ns3::ChannelManager::GetOperatingClass(uint32_t channelNumber) [member function]
+    cls.add_method('GetOperatingClass', 
+                   'uint32_t', 
+                   [param('uint32_t', 'channelNumber')])
+    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int> > ns3::ChannelManager::GetSchs() [member function]
+    cls.add_method('GetSchs', 
+                   'std::vector< unsigned int >', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): static ns3::TypeId ns3::ChannelManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int> > ns3::ChannelManager::GetWaveChannels() [member function]
+    cls.add_method('GetWaveChannels', 
+                   'std::vector< unsigned int >', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): static bool ns3::ChannelManager::IsCch(uint32_t channelNumber) [member function]
+    cls.add_method('IsCch', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): static bool ns3::ChannelManager::IsSch(uint32_t channelNumber) [member function]
+    cls.add_method('IsSch', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): static bool ns3::ChannelManager::IsWaveChannel(uint32_t channelNumber) [member function]
+    cls.add_method('IsWaveChannel', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): void ns3::ChannelManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3ChannelScheduler_methods(root_module, cls):
+    ## channel-scheduler.h (module 'wave'): ns3::ChannelScheduler::ChannelScheduler(ns3::ChannelScheduler const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelScheduler const &', 'arg0')])
+    ## channel-scheduler.h (module 'wave'): ns3::ChannelScheduler::ChannelScheduler() [constructor]
+    cls.add_constructor([])
+    ## channel-scheduler.h (module 'wave'): ns3::ChannelAccess ns3::ChannelScheduler::GetAssignedAccessType(uint32_t channelNumber) const [member function]
+    cls.add_method('GetAssignedAccessType', 
+                   'ns3::ChannelAccess', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## channel-scheduler.h (module 'wave'): static ns3::TypeId ns3::ChannelScheduler::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsAlternatingAccessAssigned(uint32_t channelNumber) const [member function]
+    cls.add_method('IsAlternatingAccessAssigned', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsCchAccessAssigned() const [member function]
+    cls.add_method('IsCchAccessAssigned', 
+                   'bool', 
                    [], 
-                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsChannelAccessAssigned(uint32_t channelNumber) const [member function]
+    cls.add_method('IsChannelAccessAssigned', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsContinuousAccessAssigned(uint32_t channelNumber) const [member function]
+    cls.add_method('IsContinuousAccessAssigned', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsDefaultCchAccessAssigned() const [member function]
+    cls.add_method('IsDefaultCchAccessAssigned', 
+                   'bool', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsExtendedAccessAssigned(uint32_t channelNumber) const [member function]
+    cls.add_method('IsExtendedAccessAssigned', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsSchAccessAssigned() const [member function]
+    cls.add_method('IsSchAccessAssigned', 
+                   'bool', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): void ns3::ChannelScheduler::SetWaveNetDevice(ns3::Ptr<ns3::WaveNetDevice> device) [member function]
+    cls.add_method('SetWaveNetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WaveNetDevice >', 'device')], 
+                   is_virtual=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::StartSch(ns3::SchInfo const & schInfo) [member function]
+    cls.add_method('StartSch', 
+                   'bool', 
+                   [param('ns3::SchInfo const &', 'schInfo')])
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::StopSch(uint32_t channelNumber) [member function]
+    cls.add_method('StopSch', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')])
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignAlternatingAccess(uint32_t channelNumber, bool immediate) [member function]
+    cls.add_method('AssignAlternatingAccess', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber'), param('bool', 'immediate')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignContinuousAccess(uint32_t channelNumber, bool immediate) [member function]
+    cls.add_method('AssignContinuousAccess', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber'), param('bool', 'immediate')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignDefaultCchAccess() [member function]
+    cls.add_method('AssignDefaultCchAccess', 
+                   'bool', 
                    [], 
-                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignExtendedAccess(uint32_t channelNumber, uint32_t extends, bool immediate) [member function]
+    cls.add_method('AssignExtendedAccess', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber'), param('uint32_t', 'extends'), param('bool', 'immediate')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## channel-scheduler.h (module 'wave'): void ns3::ChannelScheduler::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['ns3::HePreambleParameters'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_virtual=True, visibility='protected')
+    ## channel-scheduler.h (module 'wave'): void ns3::ChannelScheduler::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
+                   is_virtual=True, visibility='protected')
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::ReleaseAccess(uint32_t channelNumber) [member function]
+    cls.add_method('ReleaseAccess', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
-def register_Ns3CallbackValue_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
-    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
+def register_Ns3ConstantRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ConstantRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable::ConstantRandomVariable() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
-    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
-    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetConstant() const [member function]
+    cls.add_method('GetConstant', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue(double constant) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'constant')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger(uint32_t constant) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'constant')])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::CallbackBase', 'base')])
     return
 
-def register_Ns3Channel_methods(root_module, cls):
-    ## channel.h (module 'network'): ns3::Channel::Channel(ns3::Channel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Channel const &', 'arg0')])
-    ## channel.h (module 'network'): ns3::Channel::Channel() [constructor]
+def register_Ns3CtrlBAckRequestHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader(ns3::CtrlBAckRequestHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlBAckRequestHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader() [constructor]
     cls.add_constructor([])
-    ## channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Channel::GetDevice(std::size_t i) const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## channel.h (module 'network'): uint32_t ns3::Channel::GetId() const [member function]
-    cls.add_method('GetId', 
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckRequestHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
                    'uint32_t', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequence() const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [], 
                    is_const=True)
-    ## channel.h (module 'network'): std::size_t ns3::Channel::GetNDevices() const [member function]
-    cls.add_method('GetNDevices', 
-                   'std::size_t', 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequenceControl() const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## channel.h (module 'network'): static ns3::TypeId ns3::Channel::GetTypeId() [member function]
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckRequestHeader::GetTidInfo() const [member function]
+    cls.add_method('GetTidInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckReqType ns3::CtrlBAckRequestHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::BlockAckReqType', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckRequestHeader::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    return
-
-def register_Ns3ChannelAccessManager_methods(root_module, cls):
-    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager(ns3::ChannelAccessManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelAccessManager const &', 'arg0')])
-    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager() [constructor]
-    cls.add_constructor([])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::Add(ns3::Ptr<ns3::Txop> txop) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
-    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::IsBusy() const [member function]
-    cls.add_method('IsBusy', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::NeedBackoffUponAccess(ns3::Ptr<ns3::Txop> txop) [member function]
-    cls.add_method('NeedBackoffUponAccess', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsCompressed() const [member function]
+    cls.add_method('IsCompressed', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutResetNow() [member function]
-    cls.add_method('NotifyAckTimeoutResetNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyAckTimeoutStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutResetNow() [member function]
-    cls.add_method('NotifyCtsTimeoutResetNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyCtsTimeoutStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyMaybeCcaBusyStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyMaybeCcaBusyStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavResetNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyNavResetNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyNavStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOffNow() [member function]
-    cls.add_method('NotifyOffNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOnNow() [member function]
-    cls.add_method('NotifyOnNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndErrorNow() [member function]
-    cls.add_method('NotifyRxEndErrorNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndOkNow() [member function]
-    cls.add_method('NotifyRxEndOkNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyRxStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySleepNow() [member function]
-    cls.add_method('NotifySleepNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifySwitchingStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyTxStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyTxStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyWakeupNow() [member function]
-    cls.add_method('NotifyWakeupNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RemovePhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('RemovePhyListener', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RequestAccess(ns3::Ptr<ns3::Txop> txop, bool isCfPeriod=false) [member function]
-    cls.add_method('RequestAccess', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'txop'), param('bool', 'isCfPeriod', default_value='false')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupLow(ns3::Ptr<ns3::MacLow> low) [member function]
-    cls.add_method('SetupLow', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacLow >', 'low')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupPhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('SetupPhyListener', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetEifsNoDifs() const [member function]
-    cls.add_method('GetEifsNoDifs', 
-                   'ns3::Time', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsExtendedCompressed() const [member function]
+    cls.add_method('IsExtendedCompressed', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSifs() const [member function]
-    cls.add_method('GetSifs', 
-                   'ns3::Time', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsMultiTid() const [member function]
+    cls.add_method('IsMultiTid', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSlot() const [member function]
-    cls.add_method('GetSlot', 
-                   'ns3::Time', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::MustSendHtImmediateAck() const [member function]
+    cls.add_method('MustSendHtImmediateAck', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3ChannelCoordinationListener_methods(root_module, cls):
-    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinationListener::ChannelCoordinationListener() [constructor]
-    cls.add_constructor([])
-    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinationListener::ChannelCoordinationListener(ns3::ChannelCoordinationListener const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelCoordinationListener const &', 'arg0')])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinationListener::NotifyCchSlotStart(ns3::Time duration) [member function]
-    cls.add_method('NotifyCchSlotStart', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinationListener::NotifyGuardSlotStart(ns3::Time duration, bool cchi) [member function]
-    cls.add_method('NotifyGuardSlotStart', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Time', 'duration'), param('bool', 'cchi')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinationListener::NotifySchSlotStart(ns3::Time duration) [member function]
-    cls.add_method('NotifySchSlotStart', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetHtImmediateAck(bool immediateAck) [member function]
+    cls.add_method('SetHtImmediateAck', 
                    'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [param('bool', 'immediateAck')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetStartingSequence(uint16_t seq) [member function]
+    cls.add_method('SetStartingSequence', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetTidInfo(uint8_t tid) [member function]
+    cls.add_method('SetTidInfo', 
+                   'void', 
+                   [param('uint8_t', 'tid')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetType(ns3::BlockAckReqType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::BlockAckReqType', 'type')])
     return
 
-def register_Ns3ChannelCoordinator_methods(root_module, cls):
-    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinator::ChannelCoordinator(ns3::ChannelCoordinator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelCoordinator const &', 'arg0')])
-    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinator::ChannelCoordinator() [constructor]
+def register_Ns3CtrlBAckResponseHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader(ns3::CtrlBAckResponseHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlBAckResponseHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader() [constructor]
     cls.add_constructor([])
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetCchInterval() const [member function]
-    cls.add_method('GetCchInterval', 
-                   'ns3::Time', 
-                   [], 
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned int, std::allocator<unsigned int> > ns3::CtrlBAckResponseHeader::FindPerAidTidInfoWithAid(uint16_t aid) const [member function]
+    cls.add_method('FindPerAidTidInfoWithAid', 
+                   'std::vector< unsigned int >', 
+                   [param('uint16_t', 'aid')], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultCchInterval() [member function]
-    cls.add_method('GetDefaultCchInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_static=True)
-    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultGuardInterval() [member function]
-    cls.add_method('GetDefaultGuardInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_static=True)
-    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultSchInterval() [member function]
-    cls.add_method('GetDefaultSchInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_static=True)
-    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultSyncInterval() [member function]
-    cls.add_method('GetDefaultSyncInterval', 
-                   'ns3::Time', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::GetAckType(std::size_t index) const [member function]
+    cls.add_method('GetAckType', 
+                   'bool', 
+                   [param('std::size_t', 'index')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetAid11(std::size_t index) const [member function]
+    cls.add_method('GetAid11', 
+                   'uint16_t', 
+                   [param('std::size_t', 'index')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned char, std::allocator<unsigned char> > const & ns3::CtrlBAckResponseHeader::GetBitmap(std::size_t index=0) const [member function]
+    cls.add_method('GetBitmap', 
+                   'std::vector< unsigned char > const &', 
+                   [param('std::size_t', 'index', default_value='0')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckResponseHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'ns3::Time', 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): std::size_t ns3::CtrlBAckResponseHeader::GetNPerAidTidInfoSubfields() const [member function]
+    cls.add_method('GetNPerAidTidInfoSubfields', 
+                   'std::size_t', 
                    [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetIntervalTime(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('GetIntervalTime', 
-                   'ns3::Time', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequence(std::size_t index=0) const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [param('std::size_t', 'index', default_value='0')], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetRemainTime(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('GetRemainTime', 
-                   'ns3::Time', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequenceControl(std::size_t index=0) const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
+                   [param('std::size_t', 'index', default_value='0')], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetSchInterval() const [member function]
-    cls.add_method('GetSchInterval', 
-                   'ns3::Time', 
-                   [], 
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckResponseHeader::GetTidInfo(std::size_t index=0) const [member function]
+    cls.add_method('GetTidInfo', 
+                   'uint8_t', 
+                   [param('std::size_t', 'index', default_value='0')], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetSyncInterval() const [member function]
-    cls.add_method('GetSyncInterval', 
-                   'ns3::Time', 
+    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType ns3::CtrlBAckResponseHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::BlockAckType', 
                    [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): static ns3::TypeId ns3::ChannelCoordinator::GetTypeId() [member function]
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckResponseHeader::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsCchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('IsCchInterval', 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::Mac48Address ns3::CtrlBAckResponseHeader::GetUnassociatedStaAddress(std::size_t index) const [member function]
+    cls.add_method('GetUnassociatedStaAddress', 
+                   'ns3::Mac48Address', 
+                   [param('std::size_t', 'index')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsCompressed() const [member function]
+    cls.add_method('IsCompressed', 
                    'bool', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsGuardInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('IsGuardInterval', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsExtendedCompressed() const [member function]
+    cls.add_method('IsExtendedCompressed', 
                    'bool', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsSchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('IsSchInterval', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsFragmentReceived(uint16_t seq, uint8_t frag) const [member function]
+    cls.add_method('IsFragmentReceived', 
                    'bool', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsValidConfig() const [member function]
-    cls.add_method('IsValidConfig', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsMultiSta() const [member function]
+    cls.add_method('IsMultiSta', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::NeedTimeToCchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('NeedTimeToCchInterval', 
-                   'ns3::Time', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsMultiTid() const [member function]
+    cls.add_method('IsMultiTid', 
+                   'bool', 
+                   [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::NeedTimeToGuardInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('NeedTimeToGuardInterval', 
-                   'ns3::Time', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsPacketReceived(uint16_t seq, std::size_t index=0) const [member function]
+    cls.add_method('IsPacketReceived', 
+                   'bool', 
+                   [param('uint16_t', 'seq'), param('std::size_t', 'index', default_value='0')], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::NeedTimeToSchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('NeedTimeToSchInterval', 
-                   'ns3::Time', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::MustSendHtImmediateAck() const [member function]
+    cls.add_method('MustSendHtImmediateAck', 
+                   'bool', 
+                   [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::RegisterListener(ns3::Ptr<ns3::ChannelCoordinationListener> listener) [member function]
-    cls.add_method('RegisterListener', 
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ChannelCoordinationListener >', 'listener')])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::SetCchInterval(ns3::Time cchi) [member function]
-    cls.add_method('SetCchInterval', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::ResetBitmap(std::size_t index=0) [member function]
+    cls.add_method('ResetBitmap', 
                    'void', 
-                   [param('ns3::Time', 'cchi')])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::SetGuardInterval(ns3::Time guardi) [member function]
-    cls.add_method('SetGuardInterval', 
+                   [param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Time', 'guardi')])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::SetSchInterval(ns3::Time schi) [member function]
-    cls.add_method('SetSchInterval', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetAckType(bool type, std::size_t index) [member function]
+    cls.add_method('SetAckType', 
                    'void', 
-                   [param('ns3::Time', 'schi')])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::UnregisterAllListeners() [member function]
-    cls.add_method('UnregisterAllListeners', 
+                   [param('bool', 'type'), param('std::size_t', 'index')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetAid11(uint16_t aid, std::size_t index) [member function]
+    cls.add_method('SetAid11', 
+                   'void', 
+                   [param('uint16_t', 'aid'), param('std::size_t', 'index')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immediateAck) [member function]
+    cls.add_method('SetHtImmediateAck', 
+                   'void', 
+                   [param('bool', 'immediateAck')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedFragment(uint16_t seq, uint8_t frag) [member function]
+    cls.add_method('SetReceivedFragment', 
+                   'void', 
+                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedPacket(uint16_t seq, std::size_t index=0) [member function]
+    cls.add_method('SetReceivedPacket', 
                    'void', 
-                   [])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::UnregisterListener(ns3::Ptr<ns3::ChannelCoordinationListener> listener) [member function]
-    cls.add_method('UnregisterListener', 
+                   [param('uint16_t', 'seq'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequence(uint16_t seq, std::size_t index=0) [member function]
+    cls.add_method('SetStartingSequence', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ChannelCoordinationListener >', 'listener')])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('uint16_t', 'seq'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequenceControl(uint16_t seqControl, std::size_t index=0) [member function]
+    cls.add_method('SetStartingSequenceControl', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   [param('uint16_t', 'seqControl'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetTidInfo(uint8_t tid, std::size_t index=0) [member function]
+    cls.add_method('SetTidInfo', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
+                   [param('uint8_t', 'tid'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetType(ns3::BlockAckType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::BlockAckType', 'type')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetUnassociatedStaAddress(ns3::Mac48Address const & ra, std::size_t index) [member function]
+    cls.add_method('SetUnassociatedStaAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'ra'), param('std::size_t', 'index')])
     return
 
-def register_Ns3ChannelManager_methods(root_module, cls):
-    ## channel-manager.h (module 'wave'): ns3::ChannelManager::ChannelManager(ns3::ChannelManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelManager const &', 'arg0')])
-    ## channel-manager.h (module 'wave'): ns3::ChannelManager::ChannelManager() [constructor]
-    cls.add_constructor([])
-    ## channel-manager.h (module 'wave'): static uint32_t ns3::ChannelManager::GetCch() [member function]
-    cls.add_method('GetCch', 
+def register_Ns3CtrlTriggerHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::CtrlTriggerHeader(ns3::CtrlTriggerHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlTriggerHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::CtrlTriggerHeader() [constructor]
+    cls.add_constructor([])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::CtrlTriggerHeader(ns3::TriggerFrameType type, ns3::WifiTxVector const & txVector) [constructor]
+    cls.add_constructor([param('ns3::TriggerFrameType', 'type'), param('ns3::WifiTxVector const &', 'txVector')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField & ns3::CtrlTriggerHeader::AddUserInfoField() [member function]
+    cls.add_method('AddUserInfoField', 
+                   'ns3::CtrlTriggerUserInfoField &', 
+                   [])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField & ns3::CtrlTriggerHeader::AddUserInfoField(ns3::CtrlTriggerUserInfoField const & userInfo) [member function]
+    cls.add_method('AddUserInfoField', 
+                   'ns3::CtrlTriggerUserInfoField &', 
+                   [param('ns3::CtrlTriggerUserInfoField const &', 'userInfo')])
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlTriggerHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
                    'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithAid(ns3::CtrlTriggerHeader::ConstIterator start, uint16_t aid12) const [member function]
+    cls.add_method('FindUserInfoWithAid', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'start'), param('uint16_t', 'aid12')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithAid(uint16_t aid12) const [member function]
+    cls.add_method('FindUserInfoWithAid', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('uint16_t', 'aid12')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuAssociated(ns3::CtrlTriggerHeader::ConstIterator start) const [member function]
+    cls.add_method('FindUserInfoWithRaRuAssociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'start')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuAssociated() const [member function]
+    cls.add_method('FindUserInfoWithRaRuAssociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
                    [], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): bool ns3::ChannelManager::GetManagementAdaptable(uint32_t channelNumber) [member function]
-    cls.add_method('GetManagementAdaptable', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuUnassociated(ns3::CtrlTriggerHeader::ConstIterator start) const [member function]
+    cls.add_method('FindUserInfoWithRaRuUnassociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'start')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuUnassociated() const [member function]
+    cls.add_method('FindUserInfoWithRaRuUnassociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): int8_t ns3::CtrlTriggerHeader::GetApTxPower() const [member function]
+    cls.add_method('GetApTxPower', 
+                   'int8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader ns3::CtrlTriggerHeader::GetCommonInfoField() const [member function]
+    cls.add_method('GetCommonInfoField', 
+                   'ns3::CtrlTriggerHeader', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::GetCsRequired() const [member function]
+    cls.add_method('GetCsRequired', 
                    'bool', 
-                   [param('uint32_t', 'channelNumber')])
-    ## channel-manager.h (module 'wave'): ns3::WifiMode ns3::ChannelManager::GetManagementDataRate(uint32_t channelNumber) [member function]
-    cls.add_method('GetManagementDataRate', 
-                   'ns3::WifiMode', 
-                   [param('uint32_t', 'channelNumber')])
-    ## channel-manager.h (module 'wave'): uint32_t ns3::ChannelManager::GetManagementPowerLevel(uint32_t channelNumber) [member function]
-    cls.add_method('GetManagementPowerLevel', 
-                   'uint32_t', 
-                   [param('uint32_t', 'channelNumber')])
-    ## channel-manager.h (module 'wave'): ns3::WifiPreamble ns3::ChannelManager::GetManagementPreamble(uint32_t channelNumber) [member function]
-    cls.add_method('GetManagementPreamble', 
-                   'ns3::WifiPreamble', 
-                   [param('uint32_t', 'channelNumber')])
-    ## channel-manager.h (module 'wave'): static uint32_t ns3::ChannelManager::GetNumberOfWaveChannels() [member function]
-    cls.add_method('GetNumberOfWaveChannels', 
-                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): uint32_t ns3::ChannelManager::GetOperatingClass(uint32_t channelNumber) [member function]
-    cls.add_method('GetOperatingClass', 
-                   'uint32_t', 
-                   [param('uint32_t', 'channelNumber')])
-    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int> > ns3::ChannelManager::GetSchs() [member function]
-    cls.add_method('GetSchs', 
-                   'std::vector< unsigned int >', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): static ns3::TypeId ns3::ChannelManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::WifiTxVector ns3::CtrlTriggerHeader::GetHeTbTxVector(uint16_t staId) const [member function]
+    cls.add_method('GetHeTbTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlTriggerHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int> > ns3::ChannelManager::GetWaveChannels() [member function]
-    cls.add_method('GetWaveChannels', 
-                   'std::vector< unsigned int >', 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerHeader::GetLtfType() const [member function]
+    cls.add_method('GetLtfType', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): static bool ns3::ChannelManager::IsCch(uint32_t channelNumber) [member function]
-    cls.add_method('IsCch', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber')], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): static bool ns3::ChannelManager::IsSch(uint32_t channelNumber) [member function]
-    cls.add_method('IsSch', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber')], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): static bool ns3::ChannelManager::IsWaveChannel(uint32_t channelNumber) [member function]
-    cls.add_method('IsWaveChannel', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::GetMoreTF() const [member function]
+    cls.add_method('GetMoreTF', 
                    'bool', 
-                   [param('uint32_t', 'channelNumber')], 
-                   is_static=True)
-    return
-
-def register_Ns3ChannelScheduler_methods(root_module, cls):
-    ## channel-scheduler.h (module 'wave'): ns3::ChannelScheduler::ChannelScheduler(ns3::ChannelScheduler const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelScheduler const &', 'arg0')])
-    ## channel-scheduler.h (module 'wave'): ns3::ChannelScheduler::ChannelScheduler() [constructor]
-    cls.add_constructor([])
-    ## channel-scheduler.h (module 'wave'): ns3::ChannelAccess ns3::ChannelScheduler::GetAssignedAccessType(uint32_t channelNumber) const [member function]
-    cls.add_method('GetAssignedAccessType', 
-                   'ns3::ChannelAccess', 
-                   [param('uint32_t', 'channelNumber')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## channel-scheduler.h (module 'wave'): static ns3::TypeId ns3::ChannelScheduler::GetTypeId() [member function]
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): std::size_t ns3::CtrlTriggerHeader::GetNUserInfoFields() const [member function]
+    cls.add_method('GetNUserInfoFields', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlTriggerHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType ns3::CtrlTriggerHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::TriggerFrameType', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlTriggerHeader::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsAlternatingAccessAssigned(uint32_t channelNumber) const [member function]
-    cls.add_method('IsAlternatingAccessAssigned', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber')], 
+    ## ctrl-headers.h (module 'wifi'): char const * ns3::CtrlTriggerHeader::GetTypeString() const [member function]
+    cls.add_method('GetTypeString', 
+                   'char const *', 
+                   [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsCchAccessAssigned() const [member function]
-    cls.add_method('IsCchAccessAssigned', 
-                   'bool', 
+    ## ctrl-headers.h (module 'wifi'): static char const * ns3::CtrlTriggerHeader::GetTypeString(ns3::TriggerFrameType type) [member function]
+    cls.add_method('GetTypeString', 
+                   'char const *', 
+                   [param('ns3::TriggerFrameType', 'type')], 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetUlBandwidth() const [member function]
+    cls.add_method('GetUlBandwidth', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsChannelAccessAssigned(uint32_t channelNumber) const [member function]
-    cls.add_method('IsChannelAccessAssigned', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber')], 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetUlLength() const [member function]
+    cls.add_method('GetUlLength', 
+                   'uint16_t', 
+                   [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsContinuousAccessAssigned(uint32_t channelNumber) const [member function]
-    cls.add_method('IsContinuousAccessAssigned', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber')], 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetUlSpatialReuse() const [member function]
+    cls.add_method('GetUlSpatialReuse', 
+                   'uint16_t', 
+                   [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsDefaultCchAccessAssigned() const [member function]
-    cls.add_method('IsDefaultCchAccessAssigned', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsExtendedAccessAssigned(uint32_t channelNumber) const [member function]
-    cls.add_method('IsExtendedAccessAssigned', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBfrp() const [member function]
+    cls.add_method('IsBfrp', 
                    'bool', 
-                   [param('uint32_t', 'channelNumber')], 
+                   [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsSchAccessAssigned() const [member function]
-    cls.add_method('IsSchAccessAssigned', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBqrp() const [member function]
+    cls.add_method('IsBqrp', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): void ns3::ChannelScheduler::SetWaveNetDevice(ns3::Ptr<ns3::WaveNetDevice> device) [member function]
-    cls.add_method('SetWaveNetDevice', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WaveNetDevice >', 'device')], 
-                   is_virtual=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::StartSch(ns3::SchInfo const & schInfo) [member function]
-    cls.add_method('StartSch', 
-                   'bool', 
-                   [param('ns3::SchInfo const &', 'schInfo')])
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::StopSch(uint32_t channelNumber) [member function]
-    cls.add_method('StopSch', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber')])
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignAlternatingAccess(uint32_t channelNumber, bool immediate) [member function]
-    cls.add_method('AssignAlternatingAccess', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber'), param('bool', 'immediate')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignContinuousAccess(uint32_t channelNumber, bool immediate) [member function]
-    cls.add_method('AssignContinuousAccess', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber'), param('bool', 'immediate')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignDefaultCchAccess() [member function]
-    cls.add_method('AssignDefaultCchAccess', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBsrp() const [member function]
+    cls.add_method('IsBsrp', 
                    'bool', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignExtendedAccess(uint32_t channelNumber, uint32_t extends, bool immediate) [member function]
-    cls.add_method('AssignExtendedAccess', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsGcrMuBar() const [member function]
+    cls.add_method('IsGcrMuBar', 
                    'bool', 
-                   [param('uint32_t', 'channelNumber'), param('uint32_t', 'extends'), param('bool', 'immediate')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## channel-scheduler.h (module 'wave'): void ns3::ChannelScheduler::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::ReleaseAccess(uint32_t channelNumber) [member function]
-    cls.add_method('ReleaseAccess', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsMuBar() const [member function]
+    cls.add_method('IsMuBar', 
                    'bool', 
-                   [param('uint32_t', 'channelNumber')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
-    return
-
-def register_Ns3ConstantRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ConstantRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable::ConstantRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetConstant() const [member function]
-    cls.add_method('GetConstant', 
-                   'double', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsMuRts() const [member function]
+    cls.add_method('IsMuRts', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue(double constant) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'constant')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger(uint32_t constant) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'constant')])
-    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsNfrp() const [member function]
+    cls.add_method('IsNfrp', 
+                   'bool', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsValid() const [member function]
+    cls.add_method('IsValid', 
+                   'bool', 
                    [], 
-                   is_virtual=True)
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetApTxPower(int8_t power) [member function]
+    cls.add_method('SetApTxPower', 
+                   'void', 
+                   [param('int8_t', 'power')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetCsRequired(bool cs) [member function]
+    cls.add_method('SetCsRequired', 
+                   'void', 
+                   [param('bool', 'cs')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetGiAndLtfType(uint16_t guardInterval, uint8_t ltfType) [member function]
+    cls.add_method('SetGiAndLtfType', 
+                   'void', 
+                   [param('uint16_t', 'guardInterval'), param('uint8_t', 'ltfType')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetMoreTF(bool more) [member function]
+    cls.add_method('SetMoreTF', 
+                   'void', 
+                   [param('bool', 'more')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetType(ns3::TriggerFrameType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::TriggerFrameType', 'type')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetUlBandwidth(uint16_t bw) [member function]
+    cls.add_method('SetUlBandwidth', 
+                   'void', 
+                   [param('uint16_t', 'bw')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetUlLength(uint16_t len) [member function]
+    cls.add_method('SetUlLength', 
+                   'void', 
+                   [param('uint16_t', 'len')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetUlSpatialReuse(uint16_t sr) [member function]
+    cls.add_method('SetUlSpatialReuse', 
+                   'void', 
+                   [param('uint16_t', 'sr')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::Iterator ns3::CtrlTriggerHeader::begin() [member function]
+    cls.add_method('begin', 
+                   'ns3::CtrlTriggerHeader::Iterator', 
+                   [])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::Iterator ns3::CtrlTriggerHeader::end() [member function]
+    cls.add_method('end', 
+                   'ns3::CtrlTriggerHeader::Iterator', 
+                   [])
     return
 
 def register_Ns3DataRateChecker_methods(root_module, cls):
@@ -13489,61 +14508,6 @@
                    [param('double const &', 'value')])
     return
 
-def register_Ns3DsssSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader::DsssSigHeader(ns3::DsssSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DsssSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader::DsssSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::DsssSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::DsssSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::DsssSigHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint64_t ns3::DsssSigHeader::GetRate() const [member function]
-    cls.add_method('GetRate', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::DsssSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::DsssSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::SetRate(uint64_t rate) [member function]
-    cls.add_method('SetRate', 
-                   'void', 
-                   [param('uint64_t', 'rate')])
-    return
-
 def register_Ns3EmpiricalRandomVariable_methods(root_module, cls):
     ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable::EmpiricalRandomVariable() [constructor]
     cls.add_constructor([])
@@ -13836,8 +14800,8 @@
     cls.add_output_stream_operator()
     ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Event const & arg0) [constructor]
     cls.add_constructor([param('ns3::Event const &', 'arg0')])
-    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand', 'rxPower')])
     ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetDuration() const [member function]
     cls.add_method('GetDuration', 
                    'ns3::Time', 
@@ -13873,11 +14837,15 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::WifiTxVector ns3::Event::GetTxVector() const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::WifiTxVector const & ns3::Event::GetTxVector() const [member function]
     cls.add_method('GetTxVector', 
-                   'ns3::WifiTxVector', 
+                   'ns3::WifiTxVector const &', 
                    [], 
                    is_const=True)
+    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateRxPowerW', 
+                   'void', 
+                   [param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
     return
 
 def register_Ns3EventImpl_methods(root_module, cls):
@@ -13888,58 +14856,339 @@
     ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
     cls.add_method('Cancel', 
                    'void', 
-                   [])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
-    cls.add_method('Invoke', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
+    cls.add_method('Invoke', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
+    cls.add_method('IsCancelled', 
+                   'bool', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
+    cls.add_method('Notify', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3ExponentialRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ExponentialRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable::ExponentialRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue(double mean, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger(uint32_t mean, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3FrameExchangeManager_methods(root_module, cls):
+    ## frame-exchange-manager.h (module 'wifi'): ns3::FrameExchangeManager::FrameExchangeManager(ns3::FrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::FrameExchangeManager const &', 'arg0')])
+    ## frame-exchange-manager.h (module 'wifi'): ns3::FrameExchangeManager::FrameExchangeManager() [constructor]
+    cls.add_constructor([])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::CalculateAcknowledgmentTime(ns3::WifiAcknowledgment * acknowledgment) const [member function]
+    cls.add_method('CalculateAcknowledgmentTime', 
+                   'void', 
+                   [param('ns3::WifiAcknowledgment *', 'acknowledgment')], 
+                   is_const=True, is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::CalculateProtectionTime(ns3::WifiProtection * protection) const [member function]
+    cls.add_method('CalculateProtectionTime', 
+                   'void', 
+                   [param('ns3::WifiProtection *', 'protection')], 
+                   is_const=True, is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiAckManager> ns3::FrameExchangeManager::GetAckManager() const [member function]
+    cls.add_method('GetAckManager', 
+                   'ns3::Ptr< ns3::WifiAckManager >', 
+                   [], 
+                   is_const=True)
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiProtectionManager> ns3::FrameExchangeManager::GetProtectionManager() const [member function]
+    cls.add_method('GetProtectionManager', 
+                   'ns3::Ptr< ns3::WifiProtectionManager >', 
+                   [], 
+                   is_const=True)
+    ## frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::FrameExchangeManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## frame-exchange-manager.h (module 'wifi'): ns3::WifiTxTimer const & ns3::FrameExchangeManager::GetWifiTxTimer() const [member function]
+    cls.add_method('GetWifiTxTimer', 
+                   'ns3::WifiTxTimer const &', 
+                   [], 
+                   is_const=True)
+    ## frame-exchange-manager.h (module 'wifi'): bool ns3::FrameExchangeManager::IsPromisc() const [member function]
+    cls.add_method('IsPromisc', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyOffNow() [member function]
+    cls.add_method('NotifyOffNow', 
+                   'void', 
+                   [])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifySleepNow() [member function]
+    cls.add_method('NotifySleepNow', 
+                   'void', 
+                   [])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Receive(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool> > perMpduStatus) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('std::vector< bool >', 'perMpduStatus')])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ResetPhy() [member function]
+    cls.add_method('ResetPhy', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetAckManager(ns3::Ptr<ns3::WifiAckManager> ackManager) [member function]
+    cls.add_method('SetAckManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiAckManager >', 'ackManager')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetAckedMpduCallback(ns3::FrameExchangeManager::AckedMpdu callback) [member function]
+    cls.add_method('SetAckedMpduCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> const channelAccessManager) [member function]
+    cls.add_method('SetChannelAccessManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ChannelAccessManager > const', 'channelAccessManager')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetDroppedMpduCallback(ns3::FrameExchangeManager::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetMacRxMiddle(ns3::Ptr<ns3::MacRxMiddle> const rxMiddle) [member function]
+    cls.add_method('SetMacRxMiddle', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MacRxMiddle > const', 'rxMiddle')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetMacTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
+    cls.add_method('SetMacTxMiddle', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
+                   'void', 
+                   [])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetProtectionManager(ns3::Ptr<ns3::WifiProtectionManager> protectionManager) [member function]
+    cls.add_method('SetProtectionManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiProtectionManager >', 'protectionManager')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): bool ns3::FrameExchangeManager::StartTransmission(ns3::Ptr<ns3::Txop> dcf) [member function]
+    cls.add_method('StartTransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'dcf')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::CtsTimeout(ns3::Ptr<ns3::WifiMacQueueItem> rts, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('CtsTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'rts'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DequeueMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DequeueMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoSendCtsAfterRts(ns3::WifiMacHeader const & rtsHdr, ns3::WifiTxVector & ctsTxVector, double rtsSnr) [member function]
+    cls.add_method('DoSendCtsAfterRts', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'rtsHdr'), param('ns3::WifiTxVector &', 'ctsTxVector'), param('double', 'rtsSnr')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    cls.add_method('EndReceiveAmpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ForwardMpduDown(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector & txVector) [member function]
+    cls.add_method('ForwardMpduDown', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetCtsToSelfDurationId(ns3::WifiTxVector const & ctsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetCtsToSelfDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'ctsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::FrameExchangeManager::GetFirstFragmentIfNeeded(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('GetFirstFragmentIfNeeded', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetFrameDurationId(ns3::WifiMacHeader const & header, uint32_t size, ns3::WifiTxParameters const & txParams, ns3::Ptr<ns3::Packet> fragmentedPacket) const [member function]
+    cls.add_method('GetFrameDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Ptr< ns3::Packet >', 'fragmentedPacket')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::FrameExchangeManager::GetNextFragment() [member function]
+    cls.add_method('GetNextFragment', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetRtsDurationId(ns3::WifiTxVector const & rtsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetRtsDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'rtsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetTxDuration(uint32_t ppduPayloadSize, ns3::Mac48Address receiver, ns3::WifiTxParameters const & txParams) const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'ppduPayloadSize'), param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NavResetTimeout() [member function]
+    cls.add_method('NavResetTimeout', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NormalAckTimeout(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('NormalAckTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyPacketDiscarded(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyPacketDiscarded', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyReceivedNormalAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyReceivedNormalAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::PreProcessFrame(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('PreProcessFrame', 
                    'void', 
-                   [])
-    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
-    cls.add_method('IsCancelled', 
-                   'bool', 
-                   [])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
-    cls.add_method('Notify', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ReceiveMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector const & txVector, bool inAmpdu) [member function]
+    cls.add_method('ReceiveMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ReceivedNormalAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector, ns3::WifiTxVector const & ackTxVector, ns3::RxSignalInfo const & rxInfo, double snr) [member function]
+    cls.add_method('ReceivedNormalAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiTxVector const &', 'ackTxVector'), param('ns3::RxSignalInfo const &', 'rxInfo'), param('double', 'snr')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedCts(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedCts', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendCtsAfterRts(ns3::WifiMacHeader const & rtsHdr, ns3::WifiMode rtsTxMode, double rtsSnr) [member function]
+    cls.add_method('SendCtsAfterRts', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'rtsHdr'), param('ns3::WifiMode', 'rtsTxMode'), param('double', 'rtsSnr')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendCtsToSelf(ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('SendCtsToSelf', 
+                   'void', 
+                   [param('ns3::WifiTxParameters const &', 'txParams')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendMpduWithProtection(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams) [member function]
+    cls.add_method('SendMpduWithProtection', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendNormalAck(ns3::WifiMacHeader const & hdr, ns3::WifiTxVector const & dataTxVector, double dataSnr) [member function]
+    cls.add_method('SendNormalAck', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'hdr'), param('ns3::WifiTxVector const &', 'dataTxVector'), param('double', 'dataSnr')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendRts(ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('SendRts', 
+                   'void', 
+                   [param('ns3::WifiTxParameters const &', 'txParams')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::TransmissionFailed() [member function]
+    cls.add_method('TransmissionFailed', 
                    'void', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
-    return
-
-def register_Ns3ExponentialRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ExponentialRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable::ExponentialRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetMean() const [member function]
-    cls.add_method('GetMean', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetBound() const [member function]
-    cls.add_method('GetBound', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue(double mean, double bound) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'mean'), param('double', 'bound')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger(uint32_t mean, uint32_t bound) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'mean'), param('uint32_t', 'bound')])
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::TransmissionSucceeded() [member function]
+    cls.add_method('TransmissionSucceeded', 
+                   'void', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::UpdateNav(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('UpdateNav', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::UpdateTxDuration(ns3::Mac48Address receiver, ns3::WifiTxParameters & txParams) const [member function]
+    cls.add_method('UpdateTxDuration', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters &', 'txParams')], 
+                   is_const=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
                    [], 
-                   is_virtual=True)
+                   is_virtual=True, visibility='private')
     return
 
 def register_Ns3GammaRandomVariable_methods(root_module, cls):
@@ -14060,7 +15309,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSupportedMcsAndNss() const [member function]
     cls.add_method('GetSupportedMcsAndNss', 
                    'uint16_t', 
@@ -14080,7 +15329,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -14128,101 +15377,6 @@
                    [param('uint16_t', 'ctrl')])
     return
 
-def register_Ns3HeSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader::HeSigHeader(ns3::HeSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader::HeSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HeSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetBssColor() const [member function]
-    cls.add_method('GetBssColor', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HeSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HeSigHeader::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::HeSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetMcs() const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetNStreams() const [member function]
-    cls.add_method('GetNStreams', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HeSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::HeSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HeSigHeader::IsLdpcCoding() const [member function]
-    cls.add_method('IsLdpcCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetBssColor(uint8_t bssColor) [member function]
-    cls.add_method('SetBssColor', 
-                   'void', 
-                   [param('uint8_t', 'bssColor')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetCoding(bool ldpc) [member function]
-    cls.add_method('SetCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetGuardIntervalAndLtfSize(uint16_t gi, uint8_t ltf) [member function]
-    cls.add_method('SetGuardIntervalAndLtfSize', 
-                   'void', 
-                   [param('uint16_t', 'gi'), param('uint8_t', 'ltf')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetMcs(uint8_t mcs) [member function]
-    cls.add_method('SetMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetMuFlag(bool mu) [member function]
-    cls.add_method('SetMuFlag', 
-                   'void', 
-                   [param('bool', 'mu')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetNStreams(uint8_t nStreams) [member function]
-    cls.add_method('SetNStreams', 
-                   'void', 
-                   [param('uint8_t', 'nStreams')])
-    return
-
 def register_Ns3HtCapabilities_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities(ns3::HtCapabilities const & arg0) [constructor]
@@ -14254,11 +15408,6 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
-    cls.add_method('GetGreenfield', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetHtCapabilitiesInfo() const [member function]
     cls.add_method('GetHtCapabilitiesInfo', 
                    'uint16_t', 
@@ -14293,7 +15442,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval20() const [member function]
     cls.add_method('GetShortGuardInterval20', 
                    'uint8_t', 
@@ -14328,7 +15477,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -14346,10 +15495,6 @@
     cls.add_method('SetExtendedHtCapabilities', 
                    'void', 
                    [param('uint16_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
-    cls.add_method('SetGreenfield', 
-                   'void', 
-                   [param('uint8_t', 'greenfield')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtCapabilitiesInfo(uint16_t ctrl) [member function]
     cls.add_method('SetHtCapabilitiesInfo', 
                    'void', 
@@ -15119,10 +16264,10 @@
     cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
     ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
     cls.add_constructor([])
-    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_pure_virtual=True, is_virtual=True)
     ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
@@ -15457,10 +16602,10 @@
                    'int32_t', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
                    is_const=True, is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
     cls.add_method('GetAddress', 
@@ -15591,6 +16736,10 @@
                    'bool', 
                    [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')], 
                    is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::ReachabilityHint(uint32_t ipInterfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('ReachabilityHint', 
+                   'bool', 
+                   [param('uint32_t', 'ipInterfaceIndex'), param('ns3::Ipv6Address', 'address')])
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -15780,270 +16929,79 @@
     ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
     cls.add_constructor([])
     ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
-    return
-
-def register_Ns3Mac48AddressValue_methods(root_module, cls):
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
-    cls.add_constructor([])
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
-    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
-    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::Mac48Address const &', 'value')])
-    return
-
-def register_Ns3MacLow_methods(root_module, cls):
-    ## mac-low.h (module 'wifi'): ns3::MacLow::MacLow(ns3::MacLow const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacLow const &', 'arg0')])
-    ## mac-low.h (module 'wifi'): ns3::MacLow::MacLow() [constructor]
-    cls.add_constructor([])
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateOverallTxTime(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const * hdr, ns3::MacLowTransmissionParameters const & params, uint32_t fragmentSize=0) const [member function]
-    cls.add_method('CalculateOverallTxTime', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters const &', 'params'), param('uint32_t', 'fragmentSize', default_value='0')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateOverheadTxTime(ns3::Ptr<const ns3::WifiMacQueueItem> item, ns3::MacLowTransmissionParameters const & params) const [member function]
-    cls.add_method('CalculateOverheadTxTime', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item'), param('ns3::MacLowTransmissionParameters const &', 'params')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateTransmissionTime(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const * hdr, ns3::MacLowTransmissionParameters const & parameters) const [member function]
-    cls.add_method('CalculateTransmissionTime', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters const &', 'parameters')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::CanTransmitNextCfFrame() const [member function]
-    cls.add_method('CanTransmitNextCfFrame', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::CreateBlockAckAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address originator, uint16_t startingSeq) [member function]
-    cls.add_method('CreateBlockAckAgreement', 
-                   'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'originator'), param('uint16_t', 'startingSeq')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DeaggregateAmpduAndReceive(ns3::Ptr<ns3::WifiPsdu> aggregatedPacket, double rxSnr, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
-    cls.add_method('DeaggregateAmpduAndReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'aggregatedPacket'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('std::vector< bool >', 'statusPerMpdu')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DestroyBlockAckAgreement(ns3::Mac48Address originator, uint8_t tid) [member function]
-    cls.add_method('DestroyBlockAckAgreement', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')])
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::DoNavStartNow(ns3::Time duration) [member function]
-    cls.add_method('DoNavStartNow', 
-                   'bool', 
-                   [param('ns3::Time', 'duration')])
-    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLow::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetBeaconInterval() const [member function]
-    cls.add_method('GetBeaconInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLow::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetCfpMaxDuration() const [member function]
-    cls.add_method('GetCfpMaxDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::GetCtsToSelfSupported() const [member function]
-    cls.add_method('GetCtsToSelfSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::WifiTxVector ns3::MacLow::GetDataTxVector(ns3::Ptr<const ns3::WifiMacQueueItem> item) const [member function]
-    cls.add_method('GetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item')], 
-                   is_const=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::MacLow::GetEdca(uint8_t tid) const [member function]
-    cls.add_method('GetEdca', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MpduAggregator> ns3::MacLow::GetMpduAggregator() const [member function]
-    cls.add_method('GetMpduAggregator', 
-                   'ns3::Ptr< ns3::MpduAggregator >', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MsduAggregator> ns3::MacLow::GetMsduAggregator() const [member function]
-    cls.add_method('GetMsduAggregator', 
-                   'ns3::Ptr< ns3::MsduAggregator >', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::MacLow::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetPifs() const [member function]
-    cls.add_method('GetPifs', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetRemainingCfpDuration() const [member function]
-    cls.add_method('GetRemainingCfpDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetSifs() const [member function]
-    cls.add_method('GetSifs', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetSlotTime() const [member function]
-    cls.add_method('GetSlotTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): static ns3::TypeId ns3::MacLow::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsCfPeriod() const [member function]
-    cls.add_method('IsCfPeriod', 
-                   'bool', 
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsPromisc() const [member function]
-    cls.add_method('IsPromisc', 
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
                    'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
                    [], 
                    is_const=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsWithinSizeAndTimeLimits(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector txVector, uint32_t ampduSize, ns3::Time ppduDurationLimit) [member function]
-    cls.add_method('IsWithinSizeAndTimeLimits', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize'), param('ns3::Time', 'ppduDurationLimit')])
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsWithinSizeAndTimeLimits(uint32_t mpduSize, ns3::Mac48Address receiver, uint8_t tid, ns3::WifiTxVector txVector, uint32_t ampduSize, ns3::Time ppduDurationLimit) [member function]
-    cls.add_method('IsWithinSizeAndTimeLimits', 
-                   'bool', 
-                   [param('uint32_t', 'mpduSize'), param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize'), param('ns3::Time', 'ppduDurationLimit')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifyOffNow() [member function]
-    cls.add_method('NotifyOffNow', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifySleepNow() [member function]
-    cls.add_method('NotifySleepNow', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifySwitchingStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifySwitchingStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveError(ns3::Ptr<ns3::WifiPsdu> psdu) [member function]
-    cls.add_method('ReceiveError', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, double rxSnr, ns3::WifiTxVector txVector, bool ampduSubframe) [member function]
-    cls.add_method('ReceiveOk', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('bool', 'ampduSubframe')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> channelAccessManager) [member function]
-    cls.add_method('RegisterChannelAccessManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ChannelAccessManager >', 'channelAccessManager')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterEdcaForAc(ns3::AcIndex ac, ns3::Ptr<ns3::QosTxop> edca) [member function]
-    cls.add_method('RegisterEdcaForAc', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac'), param('ns3::Ptr< ns3::QosTxop >', 'edca')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ResetPhy() [member function]
-    cls.add_method('ResetPhy', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RxStartIndication(ns3::WifiTxVector txVector, ns3::Time psduDuration) [member function]
-    cls.add_method('RxStartIndication', 
-                   'void', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'psduDuration')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetAddress(ns3::Mac48Address ad) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'ad')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetBeaconInterval(ns3::Time interval) [member function]
-    cls.add_method('SetBeaconInterval', 
-                   'void', 
-                   [param('ns3::Time', 'interval')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetBssid(ns3::Mac48Address ad) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'ad')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCfpMaxDuration(ns3::Time duration) [member function]
-    cls.add_method('SetCfpMaxDuration', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCtsToSelfSupported(bool enable) [member function]
-    cls.add_method('SetCtsToSelfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetMpduAggregator(ns3::Ptr<ns3::MpduAggregator> const aggr) [member function]
-    cls.add_method('SetMpduAggregator', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MpduAggregator > const', 'aggr')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetMsduAggregator(ns3::Ptr<ns3::MsduAggregator> const aggr) [member function]
-    cls.add_method('SetMsduAggregator', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MsduAggregator > const', 'aggr')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetPhy', 
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
+def register_Ns3MacRxMiddle_methods(root_module, cls):
+    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle::MacRxMiddle(ns3::MacRxMiddle const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MacRxMiddle const &', 'arg0')])
+    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle::MacRxMiddle() [constructor]
+    cls.add_constructor([])
+    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
                    'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetRxCallback(ns3::Callback<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetRxCallback', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::SetForwardCallback(ns3::MacRxMiddle::ForwardUpCallback callback) [member function]
+    cls.add_method('SetForwardCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const manager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'manager')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::StartTransmission(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::MacLowTransmissionParameters parameters, ns3::Ptr<ns3::Txop> txop) [member function]
-    cls.add_method('StartTransmission', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::Ptr< ns3::Txop >', 'txop')], 
-                   is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+    return
+
+def register_Ns3MacTxMiddle_methods(root_module, cls):
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle(ns3::MacTxMiddle const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MacTxMiddle const &', 'arg0')])
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle() [constructor]
+    cls.add_constructor([])
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSeqNumberByTidAndAddress(uint8_t tid, ns3::Mac48Address addr) const [member function]
+    cls.add_method('GetNextSeqNumberByTidAndAddress', 
+                   'uint16_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'addr')], 
+                   is_const=True)
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('GetNextSequenceNumberFor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('PeekNextSequenceNumberFor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## mac-tx-middle.h (module 'wifi'): void ns3::MacTxMiddle::SetSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('SetSequenceNumberFor', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
     return
 
 def register_Ns3MobilityModel_methods(root_module, cls):
@@ -16111,93 +17069,6 @@
                    is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3MpduAggregator_methods(root_module, cls):
-    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator(ns3::MpduAggregator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MpduAggregator const &', 'arg0')])
-    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator() [constructor]
-    cls.add_constructor([])
-    ## mpdu-aggregator.h (module 'wifi'): static void ns3::MpduAggregator::Aggregate(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::Ptr<ns3::Packet> ampdu, bool isSingle) [member function]
-    cls.add_method('Aggregate', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::Ptr< ns3::Packet >', 'ampdu'), param('bool', 'isSingle')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): static uint8_t ns3::MpduAggregator::CalculatePadding(uint32_t ampduSize) [member function]
-    cls.add_method('CalculatePadding', 
-                   'uint8_t', 
-                   [param('uint32_t', 'ampduSize')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): static ns3::AmpduSubframeHeader ns3::MpduAggregator::GetAmpduSubframeHeader(uint16_t mpduSize, bool isSingle) [member function]
-    cls.add_method('GetAmpduSubframeHeader', 
-                   'ns3::AmpduSubframeHeader', 
-                   [param('uint16_t', 'mpduSize'), param('bool', 'isSingle')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): uint32_t ns3::MpduAggregator::GetMaxAmpduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
-    cls.add_method('GetMaxAmpduSize', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
-                   is_const=True)
-    ## mpdu-aggregator.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > ns3::MpduAggregator::GetNextAmpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector txVector, ns3::Time ppduDurationLimit=ns3::Time::Min()) const [member function]
-    cls.add_method('GetNextAmpdu', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')], 
-                   is_const=True)
-    ## mpdu-aggregator.h (module 'wifi'): static uint32_t ns3::MpduAggregator::GetSizeIfAggregated(uint32_t mpduSize, uint32_t ampduSize) [member function]
-    cls.add_method('GetSizeIfAggregated', 
-                   'uint32_t', 
-                   [param('uint32_t', 'mpduSize'), param('uint32_t', 'ampduSize')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MpduAggregator::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::SetEdcaQueues(ns3::MpduAggregator::EdcaQueues edcaQueues) [member function]
-    cls.add_method('SetEdcaQueues', 
-                   'void', 
-                   [param('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'edcaQueues')])
-    return
-
-def register_Ns3MsduAggregator_methods(root_module, cls):
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator(ns3::MsduAggregator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MsduAggregator const &', 'arg0')])
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator() [constructor]
-    cls.add_constructor([])
-    ## msdu-aggregator.h (module 'wifi'): static uint8_t ns3::MsduAggregator::CalculatePadding(uint16_t amsduSize) [member function]
-    cls.add_method('CalculatePadding', 
-                   'uint8_t', 
-                   [param('uint16_t', 'amsduSize')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): static ns3::MsduAggregator::DeaggregatedMsdus ns3::MsduAggregator::Deaggregate(ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
-    cls.add_method('Deaggregate', 
-                   'ns3::MsduAggregator::DeaggregatedMsdus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): uint16_t ns3::MsduAggregator::GetMaxAmsduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
-    cls.add_method('GetMaxAmsduSize', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
-                   is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::MsduAggregator::GetNextAmsdu(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiTxVector txVector, uint32_t ampduSize=0, ns3::Time ppduDurationLimit=ns3::Time::Min()) const [member function]
-    cls.add_method('GetNextAmsdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize', default_value='0'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')], 
-                   is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): static uint16_t ns3::MsduAggregator::GetSizeIfAggregated(uint16_t msduSize, uint16_t amsduSize) [member function]
-    cls.add_method('GetSizeIfAggregated', 
-                   'uint16_t', 
-                   [param('uint16_t', 'msduSize'), param('uint16_t', 'amsduSize')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MsduAggregator::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::SetEdcaQueues(ns3::MsduAggregator::EdcaQueues map) [member function]
-    cls.add_method('SetEdcaQueues', 
-                   'void', 
-                   [param('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'map')])
-    return
-
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -16774,72 +17645,451 @@
     ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
     cls.add_method('RemovePacketTag', 
                    'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
-    cls.add_method('RemoveTrailer', 
-                   'uint32_t', 
-                   [param('ns3::Trailer &', 'trailer')])
-    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
-    cls.add_method('ReplacePacketTag', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('ReplacePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    cls.add_method('SetNixVector', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+    ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
+    cls.add_method('ToString', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ParetoRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ParetoRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable::ParetoRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetScale() const [member function]
+    cls.add_method('GetScale', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue(double scale, double shape, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3PhyEntity_methods(root_module, cls):
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyEntity() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyEntity(ns3::PhyEntity const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::PhyEntity::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('CalculatePhyPreambleAndHeaderDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) const [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::CanReceivePpdu(ns3::Ptr<ns3::WifiPpdu> ppdu, uint16_t txCenterFreq) const [member function]
+    cls.add_method('CanReceivePpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('uint16_t', 'txCenterFreq')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::CancelAllEvents() [member function]
+    cls.add_method('CancelAllEvents', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::CancelRunningEndPreambleDetectionEvents(bool clear=false) [member function]
+    cls.add_method('CancelRunningEndPreambleDetectionEvents', 
+                   'void', 
+                   [param('bool', 'clear', default_value='false')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceiveField', 
+                   'void', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::PhyEntity::GetAddressedPsduInPpdu(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetAddressedPsduInPpdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetDurationUpToField(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDurationUpToField', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint32_t ns3::PhyEntity::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiMode ns3::PhyEntity::GetMcs(uint8_t index) const [member function]
+    cls.add_method('GetMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiPpduField ns3::PhyEntity::GetNextField(ns3::WifiPpduField currentField, ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetNextField', 
+                   'ns3::WifiPpduField', 
+                   [param('ns3::WifiPpduField', 'currentField'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint8_t ns3::PhyEntity::GetNumModes() const [member function]
+    cls.add_method('GetNumModes', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) const [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyHeaderSections ns3::PhyEntity::GetPhyHeaderSections(ns3::WifiTxVector const & txVector, ns3::Time ppduStart) const [member function]
+    cls.add_method('GetPhyHeaderSections', 
+                   'ns3::PhyEntity::PhyHeaderSections', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduStart')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetRemainingDurationAfterField(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiPpduField field) const [member function]
+    cls.add_method('GetRemainingDurationAfterField', 
+                   'ns3::Time', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiPpduField', 'field')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetRxChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetRxChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiMode ns3::PhyEntity::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetStaId(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetTransmissionChannelWidth(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTransmissionChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiConstPsduMap ns3::PhyEntity::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::HandlesMcsModes() const [member function]
+    cls.add_method('HandlesMcsModes', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsMcsSupported(uint8_t index) const [member function]
+    cls.add_method('IsMcsSupported', 
+                   'bool', 
+                   [param('uint8_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsModeSupported(ns3::WifiMode mode) const [member function]
+    cls.add_method('IsModeSupported', 
+                   'bool', 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::NoEndPreambleDetectionEvents() const [member function]
+    cls.add_method('NoEndPreambleDetectionEvents', 
                    'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   [], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
-    cls.add_method('SetNixVector', 
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ResetReceive', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
-    ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
-    cls.add_method('ToString', 
-                   'std::string', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::SetOwner(ns3::Ptr<ns3::WifiPhy> wifiPhy) [member function]
+    cls.add_method('SetOwner', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'wifiPhy')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceiveField', 
+                   'void', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreamble', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::Transmit(ns3::Time txDuration, ns3::Ptr<ns3::WifiPpdu> ppdu, std::string type) [member function]
+    cls.add_method('Transmit', 
+                   'void', 
+                   [param('ns3::Time', 'txDuration'), param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::string', 'type')])
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::begin() const [member function]
+    cls.add_method('begin', 
+                   'std::list< ns3::WifiMode > const_iterator', 
                    [], 
                    is_const=True)
-    return
-
-def register_Ns3ParetoRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ParetoRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable::ParetoRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetScale() const [member function]
-    cls.add_method('GetScale', 
-                   'double', 
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::end() const [member function]
+    cls.add_method('end', 
+                   'std::list< ns3::WifiMode > const_iterator', 
                    [], 
                    is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetShape() const [member function]
-    cls.add_method('GetShape', 
-                   'double', 
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::AbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('AbortCurrentReception', 
+                   'void', 
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::AddPreambleEvent(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('AddPreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::PhyEntity::CreateInterferenceEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [member function]
+    cls.add_method('CreateInterferenceEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoAbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('DoAbortCurrentReception', 
+                   'void', 
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::PhyEntity::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoEndReceivePayload(ns3::Ptr<const ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('DoEndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::PhyEntity::DoEndReceivePreamble(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceivePreamble', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::PhyEntity::DoGetEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    cls.add_method('DoGetEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::DoStartReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceiveField', 
+                   'bool', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoStartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DropPreambleEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiPhyRxfailureReason reason, ns3::Time endRx, uint16_t measurementChannelWidth) [member function]
+    cls.add_method('DropPreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiPhyRxfailureReason', 'reason'), param('ns3::Time', 'endRx'), param('uint16_t', 'measurementChannelWidth')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndOfMpdu(ns3::Ptr<ns3::Event> event, ns3::Ptr<const ns3::WifiPsdu> psdu, size_t mpduIndex, ns3::Time relativeStart, ns3::Time mpduDuration) [member function]
+    cls.add_method('EndOfMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('size_t', 'mpduIndex'), param('ns3::Time', 'relativeStart'), param('ns3::Time', 'mpduDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndPreambleDetectionPeriod(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndPreambleDetectionPeriod', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ErasePreambleEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::Time rxDuration) [member function]
+    cls.add_method('ErasePreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::Time', 'rxDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetCenterFrequencyForChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetCenterFrequencyForChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetChannelWidthAndBand', 
+                   'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<const ns3::Event> ns3::PhyEntity::GetCurrentEvent() const [member function]
+    cls.add_method('GetCurrentEvent', 
+                   'ns3::Ptr< ns3::Event const >', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetBound() const [member function]
-    cls.add_method('GetBound', 
-                   'double', 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long long, ns3::WifiPreamble> >, std::allocator<std::pair<const std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event> > > > const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
+    cls.add_method('GetCurrentPreambleEvents', 
+                   'std::map< std::pair< unsigned long long, ns3::WifiPreamble >, ns3::Ptr< ns3::Event > > const &', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue(double scale, double shape, double bound) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::PhyEntity::GetPhyHeaderSnrPer(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) const [member function]
+    cls.add_method('GetPhyHeaderSnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::PhyEntity::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): double ns3::PhyEntity::GetRandomValue() const [member function]
+    cls.add_method('GetRandomValue', 
                    'double', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::pair<bool, ns3::SignalNoiseDbm> ns3::PhyEntity::GetReceptionStatus(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::Ptr<ns3::Event> event, uint16_t staId, ns3::Time relativeMpduStart, ns3::Time mpduDuration) [member function]
+    cls.add_method('GetReceptionStatus', 
+                   'std::pair< bool, ns3::SignalNoiseDbm >', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'staId'), param('ns3::Time', 'relativeMpduStart'), param('ns3::Time', 'mpduDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): double ns3::PhyEntity::GetRxPowerWForPpdu(ns3::Ptr<ns3::Event> event) const [member function]
+    cls.add_method('GetRxPowerWForPpdu', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::tuple<double, double, double> ns3::PhyEntity::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::PhyEntity::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsConfigSupported(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsConfigSupported', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::NotifyInterferenceRxEndAndClear(bool reset) [member function]
+    cls.add_method('NotifyInterferenceRxEndAndClear', 
+                   'void', 
+                   [param('bool', 'reset')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint64_t ns3::PhyEntity::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('ObtainNextUid', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ScheduleEndOfMpdus(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ScheduleEndOfMpdus', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartPreambleDetectionPeriod(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartPreambleDetectionPeriod', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::UpdateInterferenceEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateInterferenceEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')], 
+                   visibility='protected')
+    return
+
+def register_Ns3PhyEntityPhyFieldRxStatus_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(ns3::PhyEntity::PhyFieldRxStatus const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity::PhyFieldRxStatus const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(bool s) [constructor]
+    cls.add_constructor([param('bool', 's')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(bool s, ns3::WifiPhyRxfailureReason r, ns3::PhyEntity::PhyRxFailureAction a) [constructor]
+    cls.add_constructor([param('bool', 's'), param('ns3::WifiPhyRxfailureReason', 'r'), param('ns3::PhyEntity::PhyRxFailureAction', 'a')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::actionIfFailure [variable]
+    cls.add_instance_attribute('actionIfFailure', 'ns3::PhyEntity::PhyRxFailureAction', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::isSuccess [variable]
+    cls.add_instance_attribute('isSuccess', 'bool', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::reason [variable]
+    cls.add_instance_attribute('reason', 'ns3::WifiPhyRxfailureReason', is_const=False)
+    return
+
+def register_Ns3PhyEntitySnrPer_methods(root_module, cls):
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer(ns3::PhyEntity::SnrPer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity::SnrPer const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer(double s, double p) [constructor]
+    cls.add_constructor([param('double', 's'), param('double', 'p')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::per [variable]
+    cls.add_instance_attribute('per', 'double', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
     return
 
 def register_Ns3PointerChecker_methods(root_module, cls):
@@ -16887,9 +18137,104 @@
                    [param('ns3::Ptr< ns3::Object >', 'object')])
     return
 
+def register_Ns3QosFrameExchangeManager_methods(root_module, cls):
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::QosFrameExchangeManager::QosFrameExchangeManager(ns3::QosFrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::QosFrameExchangeManager const &', 'arg0')])
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::QosFrameExchangeManager::QosFrameExchangeManager() [constructor]
+    cls.add_constructor([])
+    ## qos-frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::QosFrameExchangeManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::IsWithinLimitsIfAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams, ns3::Time ppduDurationLimit) const [member function]
+    cls.add_method('IsWithinLimitsIfAddMpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Time', 'ppduDurationLimit')], 
+                   is_const=True, is_virtual=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::IsWithinSizeAndTimeLimits(uint32_t ppduPayloadSize, ns3::Mac48Address receiver, ns3::WifiTxParameters const & txParams, ns3::Time ppduDurationLimit) const [member function]
+    cls.add_method('IsWithinSizeAndTimeLimits', 
+                   'bool', 
+                   [param('uint32_t', 'ppduPayloadSize'), param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Time', 'ppduDurationLimit')], 
+                   is_const=True, is_virtual=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::StartTransmission(ns3::Ptr<ns3::Txop> edca) [member function]
+    cls.add_method('StartTransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'edca')], 
+                   is_virtual=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime) const [member function]
+    cls.add_method('TryAddMpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime')], 
+                   is_const=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::QosFrameExchangeManager::GetCtsToSelfDurationId(ns3::WifiTxVector const & ctsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetCtsToSelfDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'ctsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::QosFrameExchangeManager::GetFrameDurationId(ns3::WifiMacHeader const & header, uint32_t size, ns3::WifiTxParameters const & txParams, ns3::Ptr<ns3::Packet> fragmentedPacket) const [member function]
+    cls.add_method('GetFrameDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Ptr< ns3::Packet >', 'fragmentedPacket')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::QosFrameExchangeManager::GetRtsDurationId(ns3::WifiTxVector const & rtsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetRtsDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'rtsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::PifsRecovery() [member function]
+    cls.add_method('PifsRecovery', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::PreProcessFrame(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('PreProcessFrame', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::ReceiveMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector const & txVector, bool inAmpdu) [member function]
+    cls.add_method('ReceiveMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::SendCfEndIfNeeded() [member function]
+    cls.add_method('SendCfEndIfNeeded', 
+                   'bool', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::SetTxopHolder(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('SetTxopHolder', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::StartFrameExchange(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('StartFrameExchange', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::StartTransmission(ns3::Ptr<ns3::QosTxop> edca, ns3::Time txopDuration) [member function]
+    cls.add_method('StartTransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'txopDuration')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::TransmissionFailed() [member function]
+    cls.add_method('TransmissionFailed', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::TransmissionSucceeded() [member function]
+    cls.add_method('TransmissionSucceeded', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    return
+
 def register_Ns3QosTxop_methods(root_module, cls):
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::m_aMpduEnabled [variable]
-    cls.add_instance_attribute('m_aMpduEnabled', 'std::map< ns3::Mac48Address, bool >', is_const=False)
     ## qos-txop.h (module 'wifi'): static ns3::TypeId ns3::QosTxop::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -16902,6 +18247,11 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): ns3::AcIndex ns3::QosTxop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
     cls.add_method('SetWifiRemoteStationManager', 
                    'void', 
@@ -16912,89 +18262,39 @@
                    'bool', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyAccessGranted() [member function]
-    cls.add_method('NotifyAccessGranted', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyInternalCollision() [member function]
     cls.add_method('NotifyInternalCollision', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAck() [member function]
-    cls.add_method('GotAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('GotBlockAck', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
+    cls.add_method('NotifyChannelAccessed', 
                    'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')], 
+                   [param('ns3::Time', 'txopDuration')], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::MissedBlockAck(uint8_t nMpdus) [member function]
-    cls.add_method('MissedBlockAck', 
-                   'void', 
-                   [param('uint8_t', 'nMpdus')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::MissedAck() [member function]
-    cls.add_method('MissedAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartNextPacket() [member function]
-    cls.add_method('StartNextPacket', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::EndTxNoAck() [member function]
-    cls.add_method('EndTxNoAck', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelReleased() [member function]
+    cls.add_method('NotifyChannelReleased', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::RestartAccessIfNeeded() [member function]
-    cls.add_method('RestartAccessIfNeeded', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
                    'void', 
-                   [], 
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartAccessIfNeeded() [member function]
-    cls.add_method('StartAccessIfNeeded', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosFrameExchangeManager(ns3::Ptr<ns3::QosFrameExchangeManager> const qosFem) [member function]
+    cls.add_method('SetQosFrameExchangeManager', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetTxopRemaining() const [member function]
-    cls.add_method('GetTxopRemaining', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::NeedFragmentation() const [member function]
-    cls.add_method('NeedFragmentation', 
+                   [param('ns3::Ptr< ns3::QosFrameExchangeManager > const', 'qosFem')])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::UseExplicitBarAfterMissedBlockAck() const [member function]
+    cls.add_method('UseExplicitBarAfterMissedBlockAck', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::QosTxop::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
-    cls.add_method('GetFragmentPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('ns3::WifiMacHeader *', 'hdr')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAckPolicySelector(ns3::Ptr<ns3::WifiAckPolicySelector> ackSelector) [member function]
-    cls.add_method('SetAckPolicySelector', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiAckPolicySelector >', 'ackSelector')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiAckPolicySelector> ns3::QosTxop::GetAckPolicySelector() const [member function]
-    cls.add_method('GetAckPolicySelector', 
-                   'ns3::Ptr< ns3::WifiAckPolicySelector >', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')])
-    ## qos-txop.h (module 'wifi'): ns3::TypeOfStation ns3::QosTxop::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
-                   [], 
                    is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::BlockAckManager> ns3::QosTxop::GetBaManager() [member function]
+    cls.add_method('GetBaManager', 
+                   'ns3::Ptr< ns3::BlockAckManager >', 
+                   [])
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetBaAgreementEstablished(ns3::Mac48Address address, uint8_t tid) const [member function]
     cls.add_method('GetBaAgreementEstablished', 
                    'bool', 
@@ -17010,6 +18310,16 @@
                    'uint16_t', 
                    [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
                    is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::BlockAckReqType ns3::QosTxop::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::BlockAckType ns3::QosTxop::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PrepareBlockAckRequest(ns3::Mac48Address recipient, uint8_t tid) const [member function]
     cls.add_method('PrepareBlockAckRequest', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
@@ -17019,10 +18329,6 @@
     cls.add_method('ScheduleBar', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyMissedCts(std::list<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [member function]
-    cls.add_method('NotifyMissedCts', 
-                   'void', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAddBaResponse(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
     cls.add_method('GotAddBaResponse', 
                    'void', 
@@ -17031,10 +18337,14 @@
     cls.add_method('GotDelBaFrame', 
                    'void', 
                    [param('ns3::MgtDelBaHeader const *', 'delBaHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::NeedBarRetransmission() [member function]
-    cls.add_method('NeedBarRetransmission', 
-                   'bool', 
-                   [])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AddBaResponseTimeout(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('AddBaResponseTimeout', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ResetBa(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('ResetBa', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAccessCategory(ns3::AcIndex ac) [member function]
     cls.add_method('SetAccessCategory', 
                    'void', 
@@ -17043,10 +18353,6 @@
     cls.add_method('PushFront', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteConfig() [member function]
-    cls.add_method('CompleteConfig', 
-                   'void', 
-                   [])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckThreshold(uint8_t threshold) [member function]
     cls.add_method('SetBlockAckThreshold', 
                    'void', 
@@ -17060,23 +18366,15 @@
     cls.add_method('SetBlockAckInactivityTimeout', 
                    'void', 
                    [param('uint16_t', 'timeout')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
-    cls.add_method('SendDelbaFrame', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')])
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBlockAckInactivityTimeout() const [member function]
+    cls.add_method('GetBlockAckInactivityTimeout', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteMpduTx(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('CompleteMpduTx', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetAmpduExist(ns3::Mac48Address dest) const [member function]
-    cls.add_method('GetAmpduExist', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAmpduExist(ns3::Mac48Address dest, bool enableAmpdu) [member function]
-    cls.add_method('SetAmpduExist', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'dest'), param('bool', 'enableAmpdu')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAddBaResponseTimeout(ns3::Time addBaResponseTimeout) [member function]
     cls.add_method('SetAddBaResponseTimeout', 
                    'void', 
@@ -17103,76 +18401,49 @@
     cls.add_method('PeekNextSequenceNumberFor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextFrame(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextFrame', 
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('PeekNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
                    [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::DequeuePeekedFrame(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxVector txVector, bool aggregate=true, uint32_t ampduSize=0, ns3::Time ppduDurationLimit=ns3::Time::Min()) [member function]
-    cls.add_method('DequeuePeekedFrame', 
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::QueueIteratorPair queueIt, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('PeekNextMpdu', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::WifiMacQueueItem::QueueIteratorPair', 'queueIt'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame, ns3::WifiMacQueueItem::QueueIteratorPair & queueIt) [member function]
+    cls.add_method('GetNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxVector', 'txVector'), param('bool', 'aggregate', default_value='true'), param('uint32_t', 'ampduSize', default_value='0'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')])
-    ## qos-txop.h (module 'wifi'): ns3::MacLowTransmissionParameters ns3::QosTxop::GetTransmissionParameters(ns3::Ptr<const ns3::WifiMacQueueItem> frame) const [member function]
-    cls.add_method('GetTransmissionParameters', 
-                   'ns3::MacLowTransmissionParameters', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'frame')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::QueueIteratorPair &', 'queueIt')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AssignSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('AssignSequenceNumber', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::UpdateCurrentPacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('UpdateCurrentPacket', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosQueueSize(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('SetQosQueueSize', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::BaTxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('BaTxOk', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::BaTxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('BaTxFailed', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Mac48Address ns3::QosTxop::MapSrcAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('MapSrcAddressForAggregation', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Mac48Address ns3::QosTxop::MapDestAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('MapDestAddressForAggregation', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsTxopStarted() const [member function]
+    cls.add_method('IsTxopStarted', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetRemainingTxop() const [member function]
+    cls.add_method('GetRemainingTxop', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::QosTxop const & arg0) [constructor]
     cls.add_constructor([param('ns3::QosTxop const &', 'arg0')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='private')
+                   is_virtual=True, visibility='protected')
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::TerminateTxop() [member function]
-    cls.add_method('TerminateTxop', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetNextFragmentSize() const [member function]
-    cls.add_method('GetNextFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetFragmentSize() const [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetFragmentOffset() const [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsLastFragment() const [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3Queue__Ns3Packet_methods(root_module, cls):
@@ -17234,6 +18505,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -17259,6 +18535,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -17320,6 +18601,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -17345,6 +18631,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3WifiMacQueueItem_methods(root_module, cls):
@@ -17406,6 +18697,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::WifiMacQueueItem>::DoEnqueue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item, ns3::Queue<ns3::WifiMacQueueItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item'), param('ns3::Queue< ns3::WifiMacQueueItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoDequeue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
@@ -17431,6 +18727,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
@@ -17676,7 +18977,12 @@
                    'void', 
                    [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::RegularWifiMac::ForwardUpCallback upCallback) [member function]
+    ## regular-wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::RegularWifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
@@ -17691,11 +18997,21 @@
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
                    is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
+    cls.add_method('GetWifiRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
     cls.add_method('Enqueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::RegularWifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
     cls.add_method('SetCtsToSelfSupported', 
                    'void', 
@@ -17704,11 +19020,21 @@
     cls.add_method('SetBssid', 
                    'void', 
                    [param('ns3::Mac48Address', 'bssid')])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
                    [], 
-                   is_const=True, is_virtual=True)
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
     cls.add_method('GetExtendedCapabilities', 
                    'ns3::ExtendedCapabilities', 
@@ -17739,11 +19065,11 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
-    cls.add_method('GetTxop', 
-                   'ns3::Ptr< ns3::Txop >', 
-                   [], 
-                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_virtual=True, visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
     cls.add_method('GetVOQueue', 
                    'ns3::Ptr< ns3::QosTxop >', 
@@ -17769,26 +19095,11 @@
                    'void', 
                    [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
                    visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('Receive', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxOk', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxFailed', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
     cls.add_method('ForwardUp', 
                    'void', 
@@ -17799,11 +19110,6 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SendAddBaResponse(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address originator) [member function]
-    cls.add_method('SendAddBaResponse', 
-                   'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'originator')], 
-                   visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
     cls.add_method('SetQosSupported', 
                    'void', 
@@ -17814,6 +19120,11 @@
                    'bool', 
                    [], 
                    is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetupFrameExchangeManager() [member function]
+    cls.add_method('SetupFrameExchangeManager', 
+                   'void', 
+                   [], 
+                   visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
     cls.add_method('GetHtSupported', 
                    'bool', 
@@ -18172,7 +19483,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
     cls.add_method('GetSupportedChannelWidthSet', 
                    'uint8_t', 
@@ -18212,7 +19523,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -18280,26 +19591,31 @@
                    [param('uint8_t', 'vhtSupported')])
     return
 
-def register_Ns3WaveMacLow_methods(root_module, cls):
-    ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow::WaveMacLow(ns3::WaveMacLow const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WaveMacLow const &', 'arg0')])
-    ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow::WaveMacLow() [constructor]
+def register_Ns3WaveFrameExchangeManager_methods(root_module, cls):
+    ## wave-frame-exchange-manager.h (module 'wave'): ns3::WaveFrameExchangeManager::WaveFrameExchangeManager(ns3::WaveFrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WaveFrameExchangeManager const &', 'arg0')])
+    ## wave-frame-exchange-manager.h (module 'wave'): ns3::WaveFrameExchangeManager::WaveFrameExchangeManager() [constructor]
     cls.add_constructor([])
-    ## wave-mac-low.h (module 'wave'): static ns3::TypeId ns3::WaveMacLow::GetTypeId() [member function]
+    ## wave-frame-exchange-manager.h (module 'wave'): static ns3::TypeId ns3::WaveFrameExchangeManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wave-mac-low.h (module 'wave'): void ns3::WaveMacLow::SetWaveNetDevice(ns3::Ptr<ns3::WaveNetDevice> device) [member function]
+    ## wave-frame-exchange-manager.h (module 'wave'): void ns3::WaveFrameExchangeManager::SetWaveNetDevice(ns3::Ptr<ns3::WaveNetDevice> device) [member function]
     cls.add_method('SetWaveNetDevice', 
                    'void', 
                    [param('ns3::Ptr< ns3::WaveNetDevice >', 'device')])
-    ## wave-mac-low.h (module 'wave'): void ns3::WaveMacLow::StartTransmission(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::MacLowTransmissionParameters parameters, ns3::Ptr<ns3::Txop> txop) [member function]
+    ## wave-frame-exchange-manager.h (module 'wave'): bool ns3::WaveFrameExchangeManager::StartTransmission(ns3::Ptr<ns3::Txop> dcf) [member function]
     cls.add_method('StartTransmission', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::Ptr< ns3::Txop >', 'txop')], 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'dcf')], 
                    is_virtual=True)
-    ## wave-mac-low.h (module 'wave'): ns3::WifiTxVector ns3::WaveMacLow::GetDataTxVector(ns3::Ptr<const ns3::WifiMacQueueItem> item) const [member function]
+    ## wave-frame-exchange-manager.h (module 'wave'): void ns3::WaveFrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## wave-frame-exchange-manager.h (module 'wave'): ns3::WifiTxVector ns3::WaveFrameExchangeManager::GetDataTxVector(ns3::Ptr<const ns3::WifiMacQueueItem> item) const [member function]
     cls.add_method('GetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item')], 
@@ -18407,6 +19723,16 @@
     cls.add_method('GetNPacketsByTidAndAddress', 
                    'uint32_t', 
                    [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPackets(uint8_t tid, ns3::Mac48Address dest) const [member function]
+    cls.add_method('GetNPackets', 
+                   'uint32_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNBytes(uint8_t tid, ns3::Mac48Address dest) const [member function]
+    cls.add_method('GetNBytes', 
+                   'uint32_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')], 
+                   is_const=True)
     ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::IsEmpty() [member function]
     cls.add_method('IsEmpty', 
                    'bool', 
@@ -18878,6 +20204,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -18900,6 +20248,94 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0, short unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('ns3::WifiTxVector const &', 'arg0'), param('short unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): short unsigned int ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'short unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -19032,28 +20468,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3HePreambleParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::HePreambleParameters arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::HePreambleParameters', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -19517,25 +20931,25 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Double_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, double arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('double', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('ns3::RxSignalInfo', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     cls.add_copy_constructor()
     return
@@ -19628,6 +21042,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiMacDropReason arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::WifiMacDropReason', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -19695,6 +21131,73 @@
     cls.add_copy_constructor()
     return
 
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiPsdu> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiPsdu const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * arg2, long unsigned int arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
+    return
+
 def register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -19827,6 +21330,11 @@
                    'void', 
                    [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('Receive', 
                    'void', 
@@ -20079,16 +21587,6 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wave-net-device.h (module 'wave'): ns3::Ptr<ns3::Node> ns3::WaveNetDevice::GetNode() const [member function]
-    cls.add_method('GetNode', 
-                   'ns3::Ptr< ns3::Node >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wave-net-device.h (module 'wave'): void ns3::WaveNetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('SetNode', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_virtual=True)
     ## wave-net-device.h (module 'wave'): bool ns3::WaveNetDevice::NeedsArp() const [member function]
     cls.add_method('NeedsArp', 
                    'bool', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/bindings/modulegen__gcc_LP64.py ns-3.34/src/wave/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/wave/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -20,8 +20,10 @@
 def register_types(module):
     root_module = module.get_root()
     
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'SIG_A_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'FILTERED'], import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'], import_from_module='ns.wifi')
+    ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType [enumeration]
+    module.add_enum('TriggerFrameType', ['BASIC_TRIGGER', 'BFRP_TRIGGER', 'MU_BAR_TRIGGER', 'MU_RTS_TRIGGER', 'BSRP_TRIGGER', 'GCR_MU_BAR_TRIGGER', 'BQRP_TRIGGER', 'NFRP_TRIGGER'], import_from_module='ns.wifi')
     ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
     module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'], import_from_module='ns.wifi')
     ## channel-scheduler.h (module 'wave'): ns3::ChannelAccess [enumeration]
@@ -30,28 +32,34 @@
     module.add_enum('VsaTransmitInterval', ['VSA_TRANSMIT_IN_CCHI', 'VSA_TRANSMIT_IN_SCHI', 'VSA_TRANSMIT_IN_BOTHI'])
     ## queue-size.h (module 'network'): ns3::QueueSizeUnit [enumeration]
     module.add_enum('QueueSizeUnit', ['PACKETS', 'BYTES'], import_from_module='ns.network')
-    ## qos-txop.h (module 'wifi'): ns3::TypeOfStation [enumeration]
-    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA', 'OCB'], import_from_module='ns.wifi')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::WifiTxTimerReason [enumeration]
+    module.add_enum('WifiTxTimerReason', [], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT'], import_from_module='ns.wifi')
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
-    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
-    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
-    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'], import_from_module='ns.wifi')
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [enumeration]
-    module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'EXTENDED_COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'], import_from_module='ns.wifi')
+    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_TRIGGER', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
     module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'], import_from_module='ns.wifi')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_holland', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'], import_from_module='ns.wifi')
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
+    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'], import_from_module='ns.wifi')
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
     module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'], import_from_module='ns.wifi')
-    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
-    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduField [enumeration]
+    module.add_enum('WifiPpduField', ['WIFI_PPDU_FIELD_PREAMBLE', 'WIFI_PPDU_FIELD_NON_HT_HEADER', 'WIFI_PPDU_FIELD_HT_SIG', 'WIFI_PPDU_FIELD_TRAINING', 'WIFI_PPDU_FIELD_SIG_A', 'WIFI_PPDU_FIELD_SIG_B', 'WIFI_PPDU_FIELD_DATA'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
+    module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'], import_from_module='ns.wifi')
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'], import_from_module='ns.wifi')
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
@@ -83,9 +91,15 @@
     ## block-ack-manager.h (module 'wifi'): ns3::Bar [struct]
     module.add_class('Bar', import_from_module='ns.wifi')
     ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement [class]
-    module.add_class('BlockAckAgreement', import_from_module='ns.wifi')
-    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache [class]
-    module.add_class('BlockAckCache', import_from_module='ns.wifi')
+    module.add_class('BlockAckAgreement', allow_subclassing=True, import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType [struct]
+    module.add_class('BlockAckReqType', import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID'], outer_class=root_module['ns3::BlockAckReqType'], import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [struct]
+    module.add_class('BlockAckType', import_from_module='ns.wifi')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID', 'MULTI_STA'], outer_class=root_module['ns3::BlockAckType'], import_from_module='ns.wifi')
     ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow [class]
     module.add_class('BlockAckWindow', import_from_module='ns.wifi')
     ## buffer.h (module 'network'): ns3::Buffer [class]
@@ -104,6 +118,8 @@
     module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
     ## callback.h (module 'core'): ns3::CallbackBase [class]
     module.add_class('CallbackBase', import_from_module='ns.core')
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField [class]
+    module.add_class('CtrlTriggerUserInfoField', import_from_module='ns.wifi')
     ## data-rate.h (module 'network'): ns3::DataRate [class]
     module.add_class('DataRate', import_from_module='ns.network')
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::AttributeAccessor> [struct]
@@ -122,12 +138,18 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::EventImpl'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Hash::Implementation> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation'])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MacRxMiddle> [struct]
+    module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::MacRxMiddle'])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MacTxMiddle> [struct]
+    module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::MacTxMiddle'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::NixVector> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::NixVector'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::OutputStreamWrapper> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::OutputStreamWrapper'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Packet> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Packet'])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity> [struct]
+    module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::PhyEntity'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::QueueItem> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::QueueItem'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::SpectrumModel> [struct]
@@ -150,13 +172,11 @@
     module.add_class('Hasher', import_from_module='ns.core')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo [struct]
     module.add_class('HeMuUserInfo', import_from_module='ns.wifi')
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters [struct]
-    module.add_class('HePreambleParameters', import_from_module='ns.wifi')
     ## he-ru.h (module 'wifi'): ns3::HeRu [class]
     module.add_class('HeRu', import_from_module='ns.wifi')
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuType [enumeration]
     module.add_enum('RuType', ['RU_26_TONE', 'RU_52_TONE', 'RU_106_TONE', 'RU_242_TONE', 'RU_484_TONE', 'RU_996_TONE', 'RU_2x996_TONE'], outer_class=root_module['ns3::HeRu'], import_from_module='ns.wifi')
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [struct]
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [class]
     module.add_class('RuSpec', import_from_module='ns.wifi', outer_class=root_module['ns3::HeRu'])
     typehandlers.add_type_alias('std::pair< short, short >', 'ns3::HeRu::SubcarrierRange')
     typehandlers.add_type_alias('std::pair< short, short >*', 'ns3::HeRu::SubcarrierRange*')
@@ -164,10 +184,6 @@
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >', 'ns3::HeRu::SubcarrierGroup')
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >*', 'ns3::HeRu::SubcarrierGroup*')
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >&', 'ns3::HeRu::SubcarrierGroup&')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec', 'ns3::HeRu::RuSpec')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec*', 'ns3::HeRu::RuSpec*')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec&', 'ns3::HeRu::RuSpec&')
-    module.add_typedef(root_module['ns3::HeRu::RuSpec'], 'RuSpec')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >', 'ns3::HeRu::BwTonesPair')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >*', 'ns3::HeRu::BwTonesPair*')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >&', 'ns3::HeRu::BwTonesPair&')
@@ -184,12 +200,12 @@
     root_module['ns3::InetSocketAddress'].implicitly_converts_to(root_module['ns3::Address'])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper [class]
     module.add_class('InterferenceHelper', import_from_module='ns.wifi')
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer [struct]
-    module.add_class('SnrPer', import_from_module='ns.wifi', outer_class=root_module['ns3::InterferenceHelper'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress [class]
     module.add_class('Ipv4InterfaceAddress', import_from_module='ns.internet')
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e [enumeration]
@@ -205,6 +221,8 @@
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress [class]
     module.add_class('Ipv6InterfaceAddress', import_from_module='ns.internet')
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::State_e [enumeration]
@@ -234,9 +252,7 @@
     module.add_class('Mac8Address', import_from_module='ns.network')
     ## mac8-address.h (module 'network'): ns3::Mac8Address [class]
     root_module['ns3::Mac8Address'].implicitly_converts_to(root_module['ns3::Address'])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters [class]
-    module.add_class('MacLowTransmissionParameters', import_from_module='ns.wifi')
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo [struct]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo [struct]
     module.add_class('MpduInfo', import_from_module='ns.wifi')
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
@@ -285,7 +301,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## internet-trace-helper.h (module 'internet'): ns3::PcapHelperForIpv4 [class]
@@ -294,9 +310,11 @@
     module.add_class('PcapHelperForIpv6', allow_subclassing=True, import_from_module='ns.internet')
     ## queue-size.h (module 'network'): ns3::QueueSize [class]
     module.add_class('QueueSize', import_from_module='ns.network')
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo [struct]
+    module.add_class('RxSignalInfo', import_from_module='ns.wifi')
     ## channel-scheduler.h (module 'wave'): ns3::SchInfo [struct]
     module.add_class('SchInfo')
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm [struct]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm [struct]
     module.add_class('SignalNoiseDbm', import_from_module='ns.wifi')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::ObjectBase'], template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'])
@@ -348,6 +366,36 @@
     module.add_class('WaveBsmHelper')
     ## wave-helper.h (module 'wave'): ns3::WaveHelper [class]
     module.add_class('WaveHelper', allow_subclassing=True)
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc [class]
+    module.add_class('WifiAc', import_from_module='ns.wifi')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment [struct]
+    module.add_class('WifiAcknowledgment', allow_subclassing=True, import_from_module='ns.wifi')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::Method [enumeration]
+    module.add_enum('Method', ['NONE', 'NORMAL_ACK', 'BLOCK_ACK', 'BAR_BLOCK_ACK', 'DL_MU_BAR_BA_SEQUENCE', 'DL_MU_TF_MU_BAR', 'DL_MU_AGGREGATE_TF', 'UL_MU_MULTI_STA_BA', 'ACK_AFTER_TB_PPDU'], outer_class=root_module['ns3::WifiAcknowledgment'], import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash [struct]
+    module.add_class('WifiAddressHash', import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash [struct]
+    module.add_class('WifiAddressTidHash', import_from_module='ns.wifi')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck [struct]
+    module.add_class('WifiBarBlockAck', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck [struct]
+    module.add_class('WifiBlockAck', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf [struct]
+    module.add_class('WifiDlMuAggregateTf', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo [struct]
+    module.add_class('BlockAckInfo', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiDlMuAggregateTf'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence [struct]
+    module.add_class('WifiDlMuBarBaSequence', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo [struct]
+    module.add_class('AckInfo', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiDlMuBarBaSequence'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo [struct]
+    module.add_class('BlockAckInfo', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiDlMuBarBaSequence'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo [struct]
+    module.add_class('BlockAckReqInfo', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiDlMuBarBaSequence'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar [struct]
+    module.add_class('WifiDlMuTfMuBar', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo [struct]
+    module.add_class('BlockAckInfo', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiDlMuTfMuBar'])
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper [class]
     module.add_class('WifiHelper', allow_subclassing=True, import_from_module='ns.wifi')
     typehandlers.add_type_alias('std::function< unsigned long ( ns3::Ptr< ns3::QueueItem > ) >', 'ns3::WifiHelper::SelectQueueCallback')
@@ -359,10 +407,44 @@
     module.add_class('WifiMode', import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
     module.add_class('WifiModeFactory', import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::CodeRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::CodeRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::CodeRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck [struct]
+    module.add_class('WifiNoAck', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck [struct]
+    module.add_class('WifiNormalAck', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper [class]
     module.add_class('WifiPhyHelper', import_from_module='ns.wifi', parent=[root_module['ns3::PcapHelperForDevice'], root_module['ns3::AsciiTraceHelperForDevice']])
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::SupportedPcapDataLinkTypes [enumeration]
     module.add_enum('SupportedPcapDataLinkTypes', ['DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO'], outer_class=root_module['ns3::WifiPhyHelper'], import_from_module='ns.wifi')
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel [class]
+    module.add_class('WifiPhyOperatingChannel', import_from_module='ns.wifi')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection [struct]
+    module.add_class('WifiProtection', allow_subclassing=True, import_from_module='ns.wifi')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::Method [enumeration]
+    module.add_enum('Method', ['NONE', 'RTS_CTS', 'CTS_TO_SELF'], outer_class=root_module['ns3::WifiProtection'], import_from_module='ns.wifi')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
     module.add_class('WifiRemoteStation', import_from_module='ns.wifi')
     ## wifi-remote-station-info.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
@@ -371,17 +453,41 @@
     module.add_class('WifiRemoteStationState', import_from_module='ns.wifi')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState [enumeration]
     module.add_enum('', ['BRAND_NEW', 'DISASSOC', 'WAIT_ASSOC_TX_OK', 'GOT_ASSOC_TX_OK'], outer_class=root_module['ns3::WifiRemoteStationState'], import_from_module='ns.wifi')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection [struct]
+    module.add_class('WifiRtsCtsProtection', import_from_module='ns.wifi', parent=root_module['ns3::WifiProtection'])
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory [class]
     module.add_class('WifiSpectrumValue5MhzFactory', allow_subclassing=True, import_from_module='ns.spectrum')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValueHelper [class]
     module.add_class('WifiSpectrumValueHelper', import_from_module='ns.spectrum')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
     module.add_class('WifiStandardInfo', import_from_module='ns.wifi')
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters [class]
+    module.add_class('WifiTxParameters', import_from_module='ns.wifi')
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo [struct]
+    module.add_class('PsduInfo', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiTxParameters'])
+    typehandlers.add_type_alias('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >', 'ns3::WifiTxParameters::PsduInfoMap')
+    typehandlers.add_type_alias('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >*', 'ns3::WifiTxParameters::PsduInfoMap*')
+    typehandlers.add_type_alias('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >&', 'ns3::WifiTxParameters::PsduInfoMap&')
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer [class]
+    module.add_class('WifiTxTimer', import_from_module='ns.wifi')
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::Reason [enumeration]
+    module.add_enum('Reason', ['NOT_RUNNING', 'WAIT_CTS', 'WAIT_NORMAL_ACK', 'WAIT_BLOCK_ACK', 'WAIT_NORMAL_ACK_AFTER_DL_MU_PPDU', 'WAIT_BLOCK_ACKS_IN_TB_PPDU', 'WAIT_TB_PPDU_AFTER_BASIC_TF', 'WAIT_QOS_NULL_AFTER_BSRP_TF', 'WAIT_BLOCK_ACK_AFTER_TB_PPDU'], outer_class=root_module['ns3::WifiTxTimer'], import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiTxTimer::MpduResponseTimeout')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiTxTimer::MpduResponseTimeout*')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiTxTimer::MpduResponseTimeout&')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiTxTimer::PsduResponseTimeout')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiTxTimer::PsduResponseTimeout*')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiTxTimer::PsduResponseTimeout&')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiTxTimer::PsduMapResponseTimeout')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiTxTimer::PsduMapResponseTimeout*')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiTxTimer::PsduMapResponseTimeout&')
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
     module.add_class('WifiTxVector', import_from_module='ns.wifi')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >', 'ns3::WifiTxVector::HeMuUserInfoMap')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >*', 'ns3::WifiTxVector::HeMuUserInfoMap*')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >&', 'ns3::WifiTxVector::HeMuUserInfoMap&')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa [struct]
+    module.add_class('WifiUlMuMultiStaBa', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
     ## yans-wifi-helper.h (module 'wifi'): ns3::YansWifiChannelHelper [class]
     module.add_class('YansWifiChannelHelper', import_from_module='ns.wifi')
     ## yans-wifi-helper.h (module 'wifi'): ns3::YansWifiPhyHelper [class]
@@ -398,8 +504,6 @@
     module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
     ## higher-tx-tag.h (module 'wave'): ns3::HigherLayerTxVectorTag [class]
     module.add_class('HigherLayerTxVectorTag', parent=root_module['ns3::Tag'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader [class]
-    module.add_class('HtSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## internet-stack-helper.h (module 'internet'): ns3::InternetStackHelper [class]
     module.add_class('InternetStackHelper', import_from_module='ns.internet', parent=[root_module['ns3::PcapHelperForIpv4'], root_module['ns3::PcapHelperForIpv6'], root_module['ns3::AsciiTraceHelperForIpv4'], root_module['ns3::AsciiTraceHelperForIpv6']])
     ## ipv4-header.h (module 'internet'): ns3::Ipv4Header [class]
@@ -416,8 +520,6 @@
     module.add_enum('NextHeader_e', ['IPV6_EXT_HOP_BY_HOP', 'IPV6_IPV4', 'IPV6_TCP', 'IPV6_UDP', 'IPV6_IPV6', 'IPV6_EXT_ROUTING', 'IPV6_EXT_FRAGMENTATION', 'IPV6_EXT_CONFIDENTIALITY', 'IPV6_EXT_AUTHENTIFICATION', 'IPV6_ICMPV6', 'IPV6_EXT_END', 'IPV6_EXT_DESTINATION', 'IPV6_SCTP', 'IPV6_EXT_MOBILITY', 'IPV6_UDP_LITE'], outer_class=root_module['ns3::Ipv6Header'], import_from_module='ns.internet')
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::EcnType [enumeration]
     module.add_enum('EcnType', ['ECN_NotECT', 'ECN_ECT1', 'ECN_ECT0', 'ECN_CE'], outer_class=root_module['ns3::Ipv6Header'], import_from_module='ns.internet')
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader [class]
-    module.add_class('LSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## wave-mac-helper.h (module 'wave'): ns3::NqosWaveMacHelper [class]
     module.add_class('NqosWaveMacHelper', parent=root_module['ns3::WifiMacHelper'])
     ## object.h (module 'core'): ns3::Object [class]
@@ -454,12 +556,18 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4MulticastRoute>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Ipv4Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv4Route>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MacRxMiddle', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MacRxMiddle>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::MacTxMiddle', 'ns3::empty', 'ns3::DefaultDeleter<ns3::MacTxMiddle>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PhyEntity', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PhyEntity>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QueueItem', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QueueItem>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> > [class]
@@ -513,21 +621,15 @@
     module.add_class('TriangularRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## txop.h (module 'wifi'): ns3::Txop [class]
     module.add_class('Txop', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxFailed&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxDropped')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxDropped*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxDropped&')
+    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus [enumeration]
+    module.add_enum('ChannelAccessStatus', ['NOT_REQUESTED', 'REQUESTED', 'GRANTED'], outer_class=root_module['ns3::Txop'], import_from_module='ns.wifi')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::DroppedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::DroppedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::DroppedMpdu&')
     ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
     module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificActionHeader [class]
     module.add_class('VendorSpecificActionHeader', parent=root_module['ns3::Header'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader [class]
-    module.add_class('VhtSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## vsa-manager.h (module 'wave'): ns3::VsaManager [class]
     module.add_class('VsaManager', parent=root_module['ns3::Object'])
     ## wave-bsm-stats.h (module 'wave'): ns3::WaveBsmStats [class]
@@ -536,10 +638,19 @@
     module.add_class('WeibullRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## wifi-80211p-helper.h (module 'wave'): ns3::Wifi80211pHelper [class]
     module.add_class('Wifi80211pHelper', parent=root_module['ns3::WifiHelper'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu [struct]
+    module.add_class('WifiAckAfterTbPpdu', import_from_module='ns.wifi', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-ack-manager.h (module 'wifi'): ns3::WifiAckManager [class]
+    module.add_class('WifiAckManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection [struct]
+    module.add_class('WifiCtsToSelfProtection', import_from_module='ns.wifi', parent=root_module['ns3::WifiProtection'])
     ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement [class]
     module.add_class('WifiInformationElement', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >'])
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac [class]
     module.add_class('WifiMac', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiMac::ForwardUpCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiMac::ForwardUpCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiMac::ForwardUpCallback&')
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader [class]
     module.add_class('WifiMacHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy [enumeration]
@@ -551,17 +662,21 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiMacHeader const & )&', 'ns3::WifiMacHeader::TracedCallback&')
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem [class]
     module.add_class('WifiMacQueueItem', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >'])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair [struct]
+    module.add_class('QueueIteratorPair', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiMacQueueItem'])
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::WifiMacQueueItem::DeaggregatedMsdus')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::WifiMacQueueItem::DeaggregatedMsdus*')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::WifiMacQueueItem::DeaggregatedMsdus&')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI*')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI&')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'ns3::WifiMacQueueItem::ConstIterator')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator*', 'ns3::WifiMacQueueItem::ConstIterator*')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator&', 'ns3::WifiMacQueueItem::ConstIterator&')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection [struct]
+    module.add_class('WifiNoProtection', import_from_module='ns.wifi', parent=root_module['ns3::WifiProtection'])
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy [class]
     module.add_class('WifiPhy', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >', 'ns3::WifiPhy::ChannelNumberBandPair')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >*', 'ns3::WifiPhy::ChannelNumberBandPair*')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >&', 'ns3::WifiPhy::ChannelNumberBandPair&')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >', 'ns3::WifiPhy::ChannelNumberStandardPair')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >*', 'ns3::WifiPhy::ChannelNumberStandardPair*')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >&', 'ns3::WifiPhy::ChannelNumberStandardPair&')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >', 'ns3::WifiPhy::FrequencyWidthPair')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >*', 'ns3::WifiPhy::FrequencyWidthPair*')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >&', 'ns3::WifiPhy::FrequencyWidthPair&')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )', 'ns3::WifiPhy::MonitorSnifferRxCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )*', 'ns3::WifiPhy::MonitorSnifferRxCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )&', 'ns3::WifiPhy::MonitorSnifferRxCallback&')
@@ -571,9 +686,6 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )', 'ns3::WifiPhy::PsduTxBeginCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )*', 'ns3::WifiPhy::PsduTxBeginCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )&', 'ns3::WifiPhy::PsduTxBeginCallback&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )', 'ns3::WifiPhy::EndOfHePreambleCallback')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )*', 'ns3::WifiPhy::EndOfHePreambleCallback*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )&', 'ns3::WifiPhy::EndOfHePreambleCallback&')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )*', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )&', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback&')
@@ -593,6 +705,8 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::WifiMode, ns3::WifiPreamble, uint8_t )&', 'ns3::WifiPhyStateHelper::TxTracedCallback&')
     ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu [class]
     module.add_class('WifiPpdu', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >'])
+    ## wifi-protection-manager.h (module 'wifi'): ns3::WifiProtectionManager [class]
+    module.add_class('WifiProtectionManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
     ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu [class]
     module.add_class('WifiPsdu', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> >'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
@@ -635,12 +749,12 @@
     module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager [class]
     module.add_class('BlockAckManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )', 'ns3::BlockAckManager::AgreementStateTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )*', 'ns3::BlockAckManager::AgreementStateTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )&', 'ns3::BlockAckManager::AgreementStateTracedCallback&')
@@ -670,6 +784,18 @@
     module.add_class('ChannelScheduler', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable [class]
     module.add_class('ConstantRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader [class]
+    module.add_class('CtrlBAckRequestHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader [class]
+    module.add_class('CtrlBAckResponseHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader [class]
+    module.add_class('CtrlTriggerHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'ns3::CtrlTriggerHeader::ConstIterator')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > const_iterator*', 'ns3::CtrlTriggerHeader::ConstIterator*')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > const_iterator&', 'ns3::CtrlTriggerHeader::ConstIterator&')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > iterator', 'ns3::CtrlTriggerHeader::Iterator')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > iterator*', 'ns3::CtrlTriggerHeader::Iterator*')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > iterator&', 'ns3::CtrlTriggerHeader::Iterator&')
     ## data-rate.h (module 'network'): ns3::DataRateChecker [class]
     module.add_class('DataRateChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## data-rate.h (module 'network'): ns3::DataRateValue [class]
@@ -680,8 +806,6 @@
     module.add_class('DeterministicRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## double.h (module 'core'): ns3::DoubleValue [class]
     module.add_class('DoubleValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader [class]
-    module.add_class('DsssSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable [class]
     module.add_class('EmpiricalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor [class]
@@ -704,12 +828,18 @@
     module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
     ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable [class]
     module.add_class('ExponentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## frame-exchange-manager.h (module 'wifi'): ns3::FrameExchangeManager [class]
+    module.add_class('FrameExchangeManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::FrameExchangeManager::DroppedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::FrameExchangeManager::DroppedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::FrameExchangeManager::DroppedMpdu&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::FrameExchangeManager::AckedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::FrameExchangeManager::AckedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::FrameExchangeManager::AckedMpdu&')
     ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable [class]
     module.add_class('GammaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities [class]
     module.add_class('HeCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader [class]
-    module.add_class('HeSigHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities [class]
     module.add_class('HtCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## integer.h (module 'core'): ns3::IntegerValue [class]
@@ -788,32 +918,18 @@
     module.add_class('Mac48AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## mac48-address.h (module 'network'): ns3::Mac48AddressValue [class]
     module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
-    ## mac-low.h (module 'wifi'): ns3::MacLow [class]
-    module.add_class('MacLow', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::MacLow::MacLowRxCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::MacLow::MacLowRxCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::MacLow::MacLowRxCallback&')
+    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle [class]
+    module.add_class('MacRxMiddle', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::MacRxMiddle::ForwardUpCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::MacRxMiddle::ForwardUpCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::MacRxMiddle::ForwardUpCallback&')
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle [class]
+    module.add_class('MacTxMiddle', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >'])
     ## mobility-model.h (module 'mobility'): ns3::MobilityModel [class]
     module.add_class('MobilityModel', import_from_module='ns.mobility', parent=root_module['ns3::Object'])
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::MobilityModel const > )', 'ns3::MobilityModel::TracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::MobilityModel const > )*', 'ns3::MobilityModel::TracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::MobilityModel const > )&', 'ns3::MobilityModel::TracedCallback&')
-    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator [class]
-    module.add_class('MpduAggregator', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'ns3::MpduAggregator::EdcaQueues')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >*', 'ns3::MpduAggregator::EdcaQueues*')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >&', 'ns3::MpduAggregator::EdcaQueues&')
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator [class]
-    module.add_class('MsduAggregator', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::MsduAggregator::DeaggregatedMsdus')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::MsduAggregator::DeaggregatedMsdus*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::MsduAggregator::DeaggregatedMsdus&')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::MsduAggregator::DeaggregatedMsdusCI')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::MsduAggregator::DeaggregatedMsdusCI*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::MsduAggregator::DeaggregatedMsdusCI&')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'ns3::MsduAggregator::EdcaQueues')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >*', 'ns3::MsduAggregator::EdcaQueues*')
-    typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >&', 'ns3::MsduAggregator::EdcaQueues&')
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -871,10 +987,26 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::Packet::SinrTracedCallback&')
     ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable [class]
     module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity [class]
+    module.add_class('PhyEntity', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyRxFailureAction [enumeration]
+    module.add_enum('PhyRxFailureAction', ['DROP', 'ABORT', 'IGNORE'], outer_class=root_module['ns3::PhyEntity'], import_from_module='ns.wifi')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus [struct]
+    module.add_class('PhyFieldRxStatus', import_from_module='ns.wifi', outer_class=root_module['ns3::PhyEntity'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer [struct]
+    module.add_class('SnrPer', import_from_module='ns.wifi', outer_class=root_module['ns3::PhyEntity'])
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >', 'ns3::PhyEntity::PhyHeaderChunkInfo')
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >*', 'ns3::PhyEntity::PhyHeaderChunkInfo*')
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >&', 'ns3::PhyEntity::PhyHeaderChunkInfo&')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', 'ns3::PhyEntity::PhyHeaderSections')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >*', 'ns3::PhyEntity::PhyHeaderSections*')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >&', 'ns3::PhyEntity::PhyHeaderSections&')
     ## pointer.h (module 'core'): ns3::PointerChecker [class]
     module.add_class('PointerChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## pointer.h (module 'core'): ns3::PointerValue [class]
     module.add_class('PointerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::QosFrameExchangeManager [class]
+    module.add_class('QosFrameExchangeManager', import_from_module='ns.wifi', parent=root_module['ns3::FrameExchangeManager'])
     ## qos-txop.h (module 'wifi'): ns3::QosTxop [class]
     module.add_class('QosTxop', import_from_module='ns.wifi', parent=root_module['ns3::Txop'])
     ## queue.h (module 'network'): ns3::Queue<ns3::Packet> [class]
@@ -913,9 +1045,6 @@
     module.add_class('ReceiveListErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
     ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
     module.add_class('RegularWifiMac', import_from_module='ns.wifi', parent=root_module['ns3::WifiMac'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RegularWifiMac::ForwardUpCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RegularWifiMac::ForwardUpCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RegularWifiMac::ForwardUpCallback&')
     ## ssid.h (module 'wifi'): ns3::Ssid [class]
     module.add_class('Ssid', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## ssid.h (module 'wifi'): ns3::SsidChecker [class]
@@ -940,8 +1069,8 @@
     module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities [class]
     module.add_class('VhtCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
-    ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow [class]
-    module.add_class('WaveMacLow', parent=root_module['ns3::MacLow'])
+    ## wave-frame-exchange-manager.h (module 'wave'): ns3::WaveFrameExchangeManager [class]
+    module.add_class('WaveFrameExchangeManager', parent=root_module['ns3::QosFrameExchangeManager'])
     ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue [class]
     module.add_class('WifiMacQueue', import_from_module='ns.wifi', parent=root_module['ns3::Queue< ns3::WifiMacQueueItem >'])
     ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::DropPolicy [enumeration]
@@ -968,8 +1097,18 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::Socket>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<bool, ns3::Ptr<ns3::WifiMac>, const ns3::OrganizationIdentifier &, ns3::Ptr<const ns3::Packet>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'ns3::Ptr<ns3::WifiMac>', 'const ns3::OrganizationIdentifier &', 'ns3::Ptr<const ns3::Packet>', 'const ns3::Address &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::Ipv4Header &', 'ns3::Ptr<const ns3::Packet>', 'ns3::Ipv4L3Protocol::DropReason', 'ns3::Ptr<ns3::Ipv4>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -982,8 +1121,6 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'const ns3::WifiMacHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Address, ns3::Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Address', 'ns3::Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::HePreambleParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1026,8 +1163,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'double', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1036,12 +1173,20 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'WifiPhyState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1055,7 +1200,10 @@
     typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet const >, ns3::Address const &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WaveNetDevice::WaveVsaCallback')
     typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet const >, ns3::Address const &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WaveNetDevice::WaveVsaCallback*')
     typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::Packet const >, ns3::Address const &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WaveNetDevice::WaveVsaCallback&')
+    module.add_container('std::list< ns3::BlockAckReqType >', 'ns3::BlockAckReqType', container_type='list')
+    module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
     module.add_container('std::vector< std::pair< short, short > >', 'std::pair< short, short >', container_type='vector')
+    module.add_container('std::vector< ns3::HeRu::RuSpec >', 'ns3::HeRu::RuSpec', container_type='vector')
     module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
     module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('ns3::RxPowerWattPerChannelBand', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
@@ -1064,12 +1212,25 @@
     module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('std::vector< int >', 'int', container_type='vector')
     module.add_container('std::vector< unsigned int >', 'unsigned int', container_type='vector')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuAggregateTf::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuAggregateTf::BlockAckInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::AckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::AckInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckReqInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckReqInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuTfMuBar::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuTfMuBar::BlockAckInfo'), container_type='map')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
+    module.add_container('std::map< unsigned char, std::set< unsigned short > >', ('unsigned char', 'std::set< unsigned short >'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >', ('ns3::Mac48Address', 'ns3::WifiTxParameters::PsduInfo'), container_type='map')
     module.add_container('std::map< unsigned short, ns3::HeMuUserInfo >', ('short unsigned int', 'ns3::HeMuUserInfo'), container_type='map')
+    module.add_container('std::map< std::pair< ns3::Mac48Address, unsigned char >, unsigned long >', ('std::pair< ns3::Mac48Address, unsigned char >', 'long unsigned int'), container_type='map')
     module.add_container('std::vector< ns3::Ipv6Address >', 'ns3::Ipv6Address', container_type='vector')
     module.add_container('ns3::Bands', 'ns3::BandInfo', container_type='vector')
+    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
+    module.add_container('std::list< ns3::WifiMacQueueItem::QueueIteratorPair >', 'ns3::WifiMacQueueItem::QueueIteratorPair', container_type='list')
+    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiConstPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
+    module.add_container('std::list< ns3::WifiMode >', 'ns3::WifiMode', container_type='list')
+    module.add_container('std::list< unsigned char >', 'unsigned char', container_type='list')
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
     module.add_container('std::vector< unsigned short >', 'short unsigned int', container_type='vector')
     module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
@@ -1079,25 +1240,25 @@
     module.add_container('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationState *', container_type='vector')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
-    module.add_container('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('ns3::MpduAggregator::EdcaQueues', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('ns3::MsduAggregator::DeaggregatedMsdus', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('ns3::MsduAggregator::EdcaQueues', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('std::map< ns3::Mac48Address, bool >', ('ns3::Mac48Address', 'bool'), container_type='map')
-    module.add_container('std::list< ns3::Ptr< ns3::WifiMacQueueItem > >', 'ns3::Ptr< ns3::WifiMacQueueItem >', container_type='list')
+    module.add_container('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
+    module.add_container('ns3::PhyEntity::PhyHeaderSections', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
     module.add_container('std::map< std::pair< unsigned int, unsigned int >, double >', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
+    module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
+    module.add_container('std::set< ns3::Mac48Address >', 'ns3::Mac48Address', container_type='set')
     module.add_container('std::map< unsigned int, ns3::Ptr< ns3::OcbWifiMac > >', ('unsigned int', 'ns3::Ptr< ns3::OcbWifiMac >'), container_type='map')
     module.add_container('std::vector< ns3::Ptr< ns3::WifiPhy > >', 'ns3::Ptr< ns3::WifiPhy >', container_type='vector')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxOkCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxOkCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxOkCallback&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', 'ns3::FrequencyChannelInfo')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >*', 'ns3::FrequencyChannelInfo*')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >&', 'ns3::FrequencyChannelInfo&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxOkCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxOkCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxOkCallback&')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxErrorCallback')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxErrorCallback*')
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxErrorCallback&')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >', 'ns3::RxPowerWattPerChannelBand')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >*', 'ns3::RxPowerWattPerChannelBand*')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >&', 'ns3::RxPowerWattPerChannelBand&')
@@ -1113,6 +1274,9 @@
     typehandlers.add_type_alias('uint32_t', 'ns3::SpectrumModelUid_t')
     typehandlers.add_type_alias('uint32_t*', 'ns3::SpectrumModelUid_t*')
     typehandlers.add_type_alias('uint32_t&', 'ns3::SpectrumModelUid_t&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -1137,12 +1301,18 @@
     typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
     typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
+    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
+    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -1267,7 +1437,8 @@
     register_Ns3BandInfo_methods(root_module, root_module['ns3::BandInfo'])
     register_Ns3Bar_methods(root_module, root_module['ns3::Bar'])
     register_Ns3BlockAckAgreement_methods(root_module, root_module['ns3::BlockAckAgreement'])
-    register_Ns3BlockAckCache_methods(root_module, root_module['ns3::BlockAckCache'])
+    register_Ns3BlockAckReqType_methods(root_module, root_module['ns3::BlockAckReqType'])
+    register_Ns3BlockAckType_methods(root_module, root_module['ns3::BlockAckType'])
     register_Ns3BlockAckWindow_methods(root_module, root_module['ns3::BlockAckWindow'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
@@ -1277,6 +1448,7 @@
     register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
     register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
+    register_Ns3CtrlTriggerUserInfoField_methods(root_module, root_module['ns3::CtrlTriggerUserInfoField'])
     register_Ns3DataRate_methods(root_module, root_module['ns3::DataRate'])
     register_Ns3DefaultDeleter__Ns3AttributeAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::AttributeAccessor >'])
     register_Ns3DefaultDeleter__Ns3AttributeChecker_methods(root_module, root_module['ns3::DefaultDeleter< ns3::AttributeChecker >'])
@@ -1286,9 +1458,12 @@
     register_Ns3DefaultDeleter__Ns3Event_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Event >'])
     register_Ns3DefaultDeleter__Ns3EventImpl_methods(root_module, root_module['ns3::DefaultDeleter< ns3::EventImpl >'])
     register_Ns3DefaultDeleter__Ns3HashImplementation_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Hash::Implementation >'])
+    register_Ns3DefaultDeleter__Ns3MacRxMiddle_methods(root_module, root_module['ns3::DefaultDeleter< ns3::MacRxMiddle >'])
+    register_Ns3DefaultDeleter__Ns3MacTxMiddle_methods(root_module, root_module['ns3::DefaultDeleter< ns3::MacTxMiddle >'])
     register_Ns3DefaultDeleter__Ns3NixVector_methods(root_module, root_module['ns3::DefaultDeleter< ns3::NixVector >'])
     register_Ns3DefaultDeleter__Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::DefaultDeleter< ns3::OutputStreamWrapper >'])
     register_Ns3DefaultDeleter__Ns3Packet_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Packet >'])
+    register_Ns3DefaultDeleter__Ns3PhyEntity_methods(root_module, root_module['ns3::DefaultDeleter< ns3::PhyEntity >'])
     register_Ns3DefaultDeleter__Ns3QueueItem_methods(root_module, root_module['ns3::DefaultDeleter< ns3::QueueItem >'])
     register_Ns3DefaultDeleter__Ns3SpectrumModel_methods(root_module, root_module['ns3::DefaultDeleter< ns3::SpectrumModel >'])
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
@@ -1300,25 +1475,24 @@
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3HeMuUserInfo_methods(root_module, root_module['ns3::HeMuUserInfo'])
-    register_Ns3HePreambleParameters_methods(root_module, root_module['ns3::HePreambleParameters'])
     register_Ns3HeRu_methods(root_module, root_module['ns3::HeRu'])
     register_Ns3HeRuRuSpec_methods(root_module, root_module['ns3::HeRu::RuSpec'])
     register_Ns3Inet6SocketAddress_methods(root_module, root_module['ns3::Inet6SocketAddress'])
     register_Ns3InetSocketAddress_methods(root_module, root_module['ns3::InetSocketAddress'])
     register_Ns3InterferenceHelper_methods(root_module, root_module['ns3::InterferenceHelper'])
-    register_Ns3InterferenceHelperSnrPer_methods(root_module, root_module['ns3::InterferenceHelper::SnrPer'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4InterfaceAddress_methods(root_module, root_module['ns3::Ipv4InterfaceAddress'])
     register_Ns3Ipv4InterfaceContainer_methods(root_module, root_module['ns3::Ipv4InterfaceContainer'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6InterfaceContainer_methods(root_module, root_module['ns3::Ipv6InterfaceContainer'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
-    register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
     register_Ns3MpduInfo_methods(root_module, root_module['ns3::MpduInfo'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
@@ -1341,6 +1515,7 @@
     register_Ns3PcapHelperForIpv4_methods(root_module, root_module['ns3::PcapHelperForIpv4'])
     register_Ns3PcapHelperForIpv6_methods(root_module, root_module['ns3::PcapHelperForIpv6'])
     register_Ns3QueueSize_methods(root_module, root_module['ns3::QueueSize'])
+    register_Ns3RxSignalInfo_methods(root_module, root_module['ns3::RxSignalInfo'])
     register_Ns3SchInfo_methods(root_module, root_module['ns3::SchInfo'])
     register_Ns3SignalNoiseDbm_methods(root_module, root_module['ns3::SignalNoiseDbm'])
     register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
@@ -1361,18 +1536,41 @@
     register_Ns3VsaInfo_methods(root_module, root_module['ns3::VsaInfo'])
     register_Ns3WaveBsmHelper_methods(root_module, root_module['ns3::WaveBsmHelper'])
     register_Ns3WaveHelper_methods(root_module, root_module['ns3::WaveHelper'])
+    register_Ns3WifiAc_methods(root_module, root_module['ns3::WifiAc'])
+    register_Ns3WifiAcknowledgment_methods(root_module, root_module['ns3::WifiAcknowledgment'])
+    register_Ns3WifiAddressHash_methods(root_module, root_module['ns3::WifiAddressHash'])
+    register_Ns3WifiAddressTidHash_methods(root_module, root_module['ns3::WifiAddressTidHash'])
+    register_Ns3WifiBarBlockAck_methods(root_module, root_module['ns3::WifiBarBlockAck'])
+    register_Ns3WifiBlockAck_methods(root_module, root_module['ns3::WifiBlockAck'])
+    register_Ns3WifiDlMuAggregateTf_methods(root_module, root_module['ns3::WifiDlMuAggregateTf'])
+    register_Ns3WifiDlMuAggregateTfBlockAckInfo_methods(root_module, root_module['ns3::WifiDlMuAggregateTf::BlockAckInfo'])
+    register_Ns3WifiDlMuBarBaSequence_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence'])
+    register_Ns3WifiDlMuBarBaSequenceAckInfo_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence::AckInfo'])
+    register_Ns3WifiDlMuBarBaSequenceBlockAckInfo_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence::BlockAckInfo'])
+    register_Ns3WifiDlMuBarBaSequenceBlockAckReqInfo_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence::BlockAckReqInfo'])
+    register_Ns3WifiDlMuTfMuBar_methods(root_module, root_module['ns3::WifiDlMuTfMuBar'])
+    register_Ns3WifiDlMuTfMuBarBlockAckInfo_methods(root_module, root_module['ns3::WifiDlMuTfMuBar::BlockAckInfo'])
     register_Ns3WifiHelper_methods(root_module, root_module['ns3::WifiHelper'])
     register_Ns3WifiMacHelper_methods(root_module, root_module['ns3::WifiMacHelper'])
     register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
     register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
+    register_Ns3WifiNoAck_methods(root_module, root_module['ns3::WifiNoAck'])
+    register_Ns3WifiNormalAck_methods(root_module, root_module['ns3::WifiNormalAck'])
     register_Ns3WifiPhyHelper_methods(root_module, root_module['ns3::WifiPhyHelper'])
+    register_Ns3WifiPhyOperatingChannel_methods(root_module, root_module['ns3::WifiPhyOperatingChannel'])
+    register_Ns3WifiProtection_methods(root_module, root_module['ns3::WifiProtection'])
     register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
     register_Ns3WifiRemoteStationInfo_methods(root_module, root_module['ns3::WifiRemoteStationInfo'])
     register_Ns3WifiRemoteStationState_methods(root_module, root_module['ns3::WifiRemoteStationState'])
+    register_Ns3WifiRtsCtsProtection_methods(root_module, root_module['ns3::WifiRtsCtsProtection'])
     register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, root_module['ns3::WifiSpectrumValue5MhzFactory'])
     register_Ns3WifiSpectrumValueHelper_methods(root_module, root_module['ns3::WifiSpectrumValueHelper'])
     register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
+    register_Ns3WifiTxParameters_methods(root_module, root_module['ns3::WifiTxParameters'])
+    register_Ns3WifiTxParametersPsduInfo_methods(root_module, root_module['ns3::WifiTxParameters::PsduInfo'])
+    register_Ns3WifiTxTimer_methods(root_module, root_module['ns3::WifiTxTimer'])
     register_Ns3WifiTxVector_methods(root_module, root_module['ns3::WifiTxVector'])
+    register_Ns3WifiUlMuMultiStaBa_methods(root_module, root_module['ns3::WifiUlMuMultiStaBa'])
     register_Ns3YansWifiChannelHelper_methods(root_module, root_module['ns3::YansWifiChannelHelper'])
     register_Ns3YansWifiPhyHelper_methods(root_module, root_module['ns3::YansWifiPhyHelper'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
@@ -1380,11 +1578,9 @@
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3HigherLayerTxVectorTag_methods(root_module, root_module['ns3::HigherLayerTxVectorTag'])
-    register_Ns3HtSigHeader_methods(root_module, root_module['ns3::HtSigHeader'])
     register_Ns3InternetStackHelper_methods(root_module, root_module['ns3::InternetStackHelper'])
     register_Ns3Ipv4Header_methods(root_module, root_module['ns3::Ipv4Header'])
     register_Ns3Ipv6Header_methods(root_module, root_module['ns3::Ipv6Header'])
-    register_Ns3LSigHeader_methods(root_module, root_module['ns3::LSigHeader'])
     register_Ns3NqosWaveMacHelper_methods(root_module, root_module['ns3::NqosWaveMacHelper'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
@@ -1403,9 +1599,12 @@
     register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
     register_Ns3SimpleRefCount__Ns3Ipv4MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4MulticastRoute__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Ipv4MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4MulticastRoute> >'])
     register_Ns3SimpleRefCount__Ns3Ipv4Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv4Route__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv4Route> >'])
+    register_Ns3SimpleRefCount__Ns3MacRxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacRxMiddle__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >'])
+    register_Ns3SimpleRefCount__Ns3MacTxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacTxMiddle__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >'])
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >'])
     register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >'])
     register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >'])
     register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >'])
     register_Ns3SimpleRefCount__Ns3SpectrumValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SpectrumValue, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumValue> >'])
@@ -1429,18 +1628,23 @@
     register_Ns3Txop_methods(root_module, root_module['ns3::Txop'])
     register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
     register_Ns3VendorSpecificActionHeader_methods(root_module, root_module['ns3::VendorSpecificActionHeader'])
-    register_Ns3VhtSigHeader_methods(root_module, root_module['ns3::VhtSigHeader'])
     register_Ns3VsaManager_methods(root_module, root_module['ns3::VsaManager'])
     register_Ns3WaveBsmStats_methods(root_module, root_module['ns3::WaveBsmStats'])
     register_Ns3WeibullRandomVariable_methods(root_module, root_module['ns3::WeibullRandomVariable'])
     register_Ns3Wifi80211pHelper_methods(root_module, root_module['ns3::Wifi80211pHelper'])
+    register_Ns3WifiAckAfterTbPpdu_methods(root_module, root_module['ns3::WifiAckAfterTbPpdu'])
+    register_Ns3WifiAckManager_methods(root_module, root_module['ns3::WifiAckManager'])
+    register_Ns3WifiCtsToSelfProtection_methods(root_module, root_module['ns3::WifiCtsToSelfProtection'])
     register_Ns3WifiInformationElement_methods(root_module, root_module['ns3::WifiInformationElement'])
     register_Ns3WifiMac_methods(root_module, root_module['ns3::WifiMac'])
     register_Ns3WifiMacHeader_methods(root_module, root_module['ns3::WifiMacHeader'])
     register_Ns3WifiMacQueueItem_methods(root_module, root_module['ns3::WifiMacQueueItem'])
+    register_Ns3WifiMacQueueItemQueueIteratorPair_methods(root_module, root_module['ns3::WifiMacQueueItem::QueueIteratorPair'])
+    register_Ns3WifiNoProtection_methods(root_module, root_module['ns3::WifiNoProtection'])
     register_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
     register_Ns3WifiPhyStateHelper_methods(root_module, root_module['ns3::WifiPhyStateHelper'])
     register_Ns3WifiPpdu_methods(root_module, root_module['ns3::WifiPpdu'])
+    register_Ns3WifiProtectionManager_methods(root_module, root_module['ns3::WifiProtectionManager'])
     register_Ns3WifiPsdu_methods(root_module, root_module['ns3::WifiPsdu'])
     register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
     register_Ns3YansWavePhyHelper_methods(root_module, root_module['ns3::YansWavePhyHelper'])
@@ -1465,12 +1669,14 @@
     register_Ns3ChannelManager_methods(root_module, root_module['ns3::ChannelManager'])
     register_Ns3ChannelScheduler_methods(root_module, root_module['ns3::ChannelScheduler'])
     register_Ns3ConstantRandomVariable_methods(root_module, root_module['ns3::ConstantRandomVariable'])
+    register_Ns3CtrlBAckRequestHeader_methods(root_module, root_module['ns3::CtrlBAckRequestHeader'])
+    register_Ns3CtrlBAckResponseHeader_methods(root_module, root_module['ns3::CtrlBAckResponseHeader'])
+    register_Ns3CtrlTriggerHeader_methods(root_module, root_module['ns3::CtrlTriggerHeader'])
     register_Ns3DataRateChecker_methods(root_module, root_module['ns3::DataRateChecker'])
     register_Ns3DataRateValue_methods(root_module, root_module['ns3::DataRateValue'])
     register_Ns3DefaultChannelScheduler_methods(root_module, root_module['ns3::DefaultChannelScheduler'])
     register_Ns3DeterministicRandomVariable_methods(root_module, root_module['ns3::DeterministicRandomVariable'])
     register_Ns3DoubleValue_methods(root_module, root_module['ns3::DoubleValue'])
-    register_Ns3DsssSigHeader_methods(root_module, root_module['ns3::DsssSigHeader'])
     register_Ns3EmpiricalRandomVariable_methods(root_module, root_module['ns3::EmpiricalRandomVariable'])
     register_Ns3EmptyAttributeAccessor_methods(root_module, root_module['ns3::EmptyAttributeAccessor'])
     register_Ns3EmptyAttributeChecker_methods(root_module, root_module['ns3::EmptyAttributeChecker'])
@@ -1482,9 +1688,9 @@
     register_Ns3Event_methods(root_module, root_module['ns3::Event'])
     register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
     register_Ns3ExponentialRandomVariable_methods(root_module, root_module['ns3::ExponentialRandomVariable'])
+    register_Ns3FrameExchangeManager_methods(root_module, root_module['ns3::FrameExchangeManager'])
     register_Ns3GammaRandomVariable_methods(root_module, root_module['ns3::GammaRandomVariable'])
     register_Ns3HeCapabilities_methods(root_module, root_module['ns3::HeCapabilities'])
-    register_Ns3HeSigHeader_methods(root_module, root_module['ns3::HeSigHeader'])
     register_Ns3HtCapabilities_methods(root_module, root_module['ns3::HtCapabilities'])
     register_Ns3IntegerValue_methods(root_module, root_module['ns3::IntegerValue'])
     register_Ns3Ipv4_methods(root_module, root_module['ns3::Ipv4'])
@@ -1507,10 +1713,9 @@
     register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
     register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
     register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
-    register_Ns3MacLow_methods(root_module, root_module['ns3::MacLow'])
+    register_Ns3MacRxMiddle_methods(root_module, root_module['ns3::MacRxMiddle'])
+    register_Ns3MacTxMiddle_methods(root_module, root_module['ns3::MacTxMiddle'])
     register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
-    register_Ns3MpduAggregator_methods(root_module, root_module['ns3::MpduAggregator'])
-    register_Ns3MsduAggregator_methods(root_module, root_module['ns3::MsduAggregator'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3Node_methods(root_module, root_module['ns3::Node'])
@@ -1522,8 +1727,12 @@
     register_Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::OutputStreamWrapper'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
     register_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
+    register_Ns3PhyEntity_methods(root_module, root_module['ns3::PhyEntity'])
+    register_Ns3PhyEntityPhyFieldRxStatus_methods(root_module, root_module['ns3::PhyEntity::PhyFieldRxStatus'])
+    register_Ns3PhyEntitySnrPer_methods(root_module, root_module['ns3::PhyEntity::SnrPer'])
     register_Ns3PointerChecker_methods(root_module, root_module['ns3::PointerChecker'])
     register_Ns3PointerValue_methods(root_module, root_module['ns3::PointerValue'])
+    register_Ns3QosFrameExchangeManager_methods(root_module, root_module['ns3::QosFrameExchangeManager'])
     register_Ns3QosTxop_methods(root_module, root_module['ns3::QosTxop'])
     register_Ns3Queue__Ns3Packet_methods(root_module, root_module['ns3::Queue< ns3::Packet >'])
     register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, root_module['ns3::Queue< ns3::QueueDiscItem >'])
@@ -1546,7 +1755,7 @@
     register_Ns3Vector3DChecker_methods(root_module, root_module['ns3::Vector3DChecker'])
     register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
     register_Ns3VhtCapabilities_methods(root_module, root_module['ns3::VhtCapabilities'])
-    register_Ns3WaveMacLow_methods(root_module, root_module['ns3::WaveMacLow'])
+    register_Ns3WaveFrameExchangeManager_methods(root_module, root_module['ns3::WaveFrameExchangeManager'])
     register_Ns3WifiMacQueue_methods(root_module, root_module['ns3::WifiMacQueue'])
     register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
     register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
@@ -1559,14 +1768,18 @@
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__const_ns3Packet__gt___Const_ns3Address___amp___Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<const ns3::Packet>, const ns3::Address &, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3Socket__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::Socket>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Bool_Ns3Ptr__lt__ns3WifiMac__gt___Const_ns3OrganizationIdentifier___amp___Ns3Ptr__lt__const_ns3Packet__gt___Const_ns3Address___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, ns3::Ptr<ns3::WifiMac>, const ns3::OrganizationIdentifier &, ns3::Ptr<const ns3::Packet>, const ns3::Address &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv6Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv6L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv6__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv6L3Protocol::DropReason, ns3::Ptr<ns3::Ipv6>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3Ipv6Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::Ipv6Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Address_Ns3Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Address, ns3::Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3HePreambleParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Double_Ns3WifiMode_Ns3WifiPreamble_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1588,14 +1801,18 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3Socket__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::Socket>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Double_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3OcbWifiMac_methods(root_module, root_module['ns3::OcbWifiMac'])
@@ -2044,11 +2261,26 @@
     cls.add_constructor([param('ns3::BlockAckAgreement const &', 'arg0')])
     ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::Mac48Address peer, uint8_t tid) [constructor]
     cls.add_constructor([param('ns3::Mac48Address', 'peer'), param('uint8_t', 'tid')])
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckAgreement::GetBlockAckReqType() const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckAgreement::GetBlockAckType() const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [], 
+                   is_const=True)
     ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetBufferSize() const [member function]
     cls.add_method('GetBufferSize', 
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): static std::size_t ns3::BlockAckAgreement::GetDistance(uint16_t seqNumber, uint16_t startingSeqNumber) [member function]
+    cls.add_method('GetDistance', 
+                   'std::size_t', 
+                   [param('uint16_t', 'seqNumber'), param('uint16_t', 'startingSeqNumber')], 
+                   is_static=True)
     ## block-ack-agreement.h (module 'wifi'): ns3::Mac48Address ns3::BlockAckAgreement::GetPeer() const [member function]
     cls.add_method('GetPeer', 
                    'ns3::Mac48Address', 
@@ -2058,7 +2290,7 @@
     cls.add_method('GetStartingSequence', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequenceControl() const [member function]
     cls.add_method('GetStartingSequenceControl', 
                    'uint16_t', 
@@ -2128,32 +2360,36 @@
                    [param('uint16_t', 'timeout')])
     return
 
-def register_Ns3BlockAckCache_methods(root_module, cls):
-    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache::BlockAckCache() [constructor]
-    cls.add_constructor([])
-    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache::BlockAckCache(ns3::BlockAckCache const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BlockAckCache const &', 'arg0')])
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::FillBlockAckBitmap(ns3::CtrlBAckResponseHeader * blockAckHeader) [member function]
-    cls.add_method('FillBlockAckBitmap', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader *', 'blockAckHeader')])
-    ## block-ack-cache.h (module 'wifi'): uint16_t ns3::BlockAckCache::GetWinStart() const [member function]
-    cls.add_method('GetWinStart', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::Init(uint16_t winStart, uint16_t winSize) [member function]
-    cls.add_method('Init', 
-                   'void', 
-                   [param('uint16_t', 'winStart'), param('uint16_t', 'winSize')])
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::UpdateWithBlockAckReq(uint16_t startingSeq) [member function]
-    cls.add_method('UpdateWithBlockAckReq', 
-                   'void', 
-                   [param('uint16_t', 'startingSeq')])
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::UpdateWithMpdu(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('UpdateWithMpdu', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
+def register_Ns3BlockAckReqType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v, uint8_t nSeqControls) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v'), param('uint8_t', 'nSeqControls')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_nSeqControls [variable]
+    cls.add_instance_attribute('m_nSeqControls', 'uint8_t', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckReqType::Variant', is_const=False)
+    return
+
+def register_Ns3BlockAckType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
+    cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckType::Variant', is_const=False)
     return
 
 def register_Ns3BlockAckWindow_methods(root_module, cls):
@@ -2169,6 +2405,11 @@
     cls.add_method('At', 
                    'std::vector< bool > reference', 
                    [param('std::size_t', 'distance')])
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
+    cls.add_method('At', 
+                   'std::vector< bool > const_reference', 
+                   [param('std::size_t', 'distance')], 
+                   is_const=True)
     ## block-ack-window.h (module 'wifi'): uint16_t ns3::BlockAckWindow::GetWinEnd() const [member function]
     cls.add_method('GetWinEnd', 
                    'uint16_t', 
@@ -2574,9 +2815,177 @@
                         visibility='protected')
     return
 
+def register_Ns3CtrlTriggerUserInfoField_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField::CtrlTriggerUserInfoField(ns3::CtrlTriggerUserInfoField const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlTriggerUserInfoField const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField::CtrlTriggerUserInfoField(uint8_t triggerType) [constructor]
+    cls.add_constructor([param('uint8_t', 'triggerType')])
+    ## ctrl-headers.h (module 'wifi'): ns3::Buffer::Iterator ns3::CtrlTriggerUserInfoField::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')])
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerUserInfoField::GetAid12() const [member function]
+    cls.add_method('GetAid12', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::GetMoreRaRu() const [member function]
+    cls.add_method('GetMoreRaRu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetMpduMuSpacingFactor() const [member function]
+    cls.add_method('GetMpduMuSpacingFactor', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader const & ns3::CtrlTriggerUserInfoField::GetMuBarTriggerDepUserInfo() const [member function]
+    cls.add_method('GetMuBarTriggerDepUserInfo', 
+                   'ns3::CtrlBAckRequestHeader const &', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetNRaRus() const [member function]
+    cls.add_method('GetNRaRus', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetNss() const [member function]
+    cls.add_method('GetNss', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::AcIndex ns3::CtrlTriggerUserInfoField::GetPreferredAc() const [member function]
+    cls.add_method('GetPreferredAc', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::HeRu::RuSpec ns3::CtrlTriggerUserInfoField::GetRuAllocation() const [member function]
+    cls.add_method('GetRuAllocation', 
+                   'ns3::HeRu::RuSpec', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlTriggerUserInfoField::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetStartingSs() const [member function]
+    cls.add_method('GetStartingSs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetTidAggregationLimit() const [member function]
+    cls.add_method('GetTidAggregationLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType ns3::CtrlTriggerUserInfoField::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::TriggerFrameType', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::GetUlDcm() const [member function]
+    cls.add_method('GetUlDcm', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::GetUlFecCodingType() const [member function]
+    cls.add_method('GetUlFecCodingType', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetUlMcs() const [member function]
+    cls.add_method('GetUlMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): int8_t ns3::CtrlTriggerUserInfoField::GetUlTargetRssi() const [member function]
+    cls.add_method('GetUlTargetRssi', 
+                   'int8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::HasRaRuForAssociatedSta() const [member function]
+    cls.add_method('HasRaRuForAssociatedSta', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::HasRaRuForUnassociatedSta() const [member function]
+    cls.add_method('HasRaRuForUnassociatedSta', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::IsUlTargetRssiMaxTxPower() const [member function]
+    cls.add_method('IsUlTargetRssiMaxTxPower', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::Buffer::Iterator ns3::CtrlTriggerUserInfoField::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetAid12(uint16_t aid) [member function]
+    cls.add_method('SetAid12', 
+                   'void', 
+                   [param('uint16_t', 'aid')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetBasicTriggerDepUserInfo(uint8_t spacingFactor, uint8_t tidLimit, ns3::AcIndex prefAc) [member function]
+    cls.add_method('SetBasicTriggerDepUserInfo', 
+                   'void', 
+                   [param('uint8_t', 'spacingFactor'), param('uint8_t', 'tidLimit'), param('ns3::AcIndex', 'prefAc')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetMuBarTriggerDepUserInfo(ns3::CtrlBAckRequestHeader const & bar) [member function]
+    cls.add_method('SetMuBarTriggerDepUserInfo', 
+                   'void', 
+                   [param('ns3::CtrlBAckRequestHeader const &', 'bar')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetRaRuInformation(uint8_t nRaRu, bool moreRaRu) [member function]
+    cls.add_method('SetRaRuInformation', 
+                   'void', 
+                   [param('uint8_t', 'nRaRu'), param('bool', 'moreRaRu')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetRuAllocation(ns3::HeRu::RuSpec ru) [member function]
+    cls.add_method('SetRuAllocation', 
+                   'void', 
+                   [param('ns3::HeRu::RuSpec', 'ru')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetSsAllocation(uint8_t startingSs, uint8_t nSs) [member function]
+    cls.add_method('SetSsAllocation', 
+                   'void', 
+                   [param('uint8_t', 'startingSs'), param('uint8_t', 'nSs')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlDcm(bool dcm) [member function]
+    cls.add_method('SetUlDcm', 
+                   'void', 
+                   [param('bool', 'dcm')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlFecCodingType(bool ldpc) [member function]
+    cls.add_method('SetUlFecCodingType', 
+                   'void', 
+                   [param('bool', 'ldpc')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlMcs(uint8_t mcs) [member function]
+    cls.add_method('SetUlMcs', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlTargetRssi(int8_t dBm) [member function]
+    cls.add_method('SetUlTargetRssi', 
+                   'void', 
+                   [param('int8_t', 'dBm')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlTargetRssiMaxTxPower() [member function]
+    cls.add_method('SetUlTargetRssiMaxTxPower', 
+                   'void', 
+                   [])
+    return
+
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2703,6 +3112,30 @@
                    is_static=True)
     return
 
+def register_Ns3DefaultDeleter__Ns3MacRxMiddle_methods(root_module, cls):
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MacRxMiddle>::DefaultDeleter() [constructor]
+    cls.add_constructor([])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MacRxMiddle>::DefaultDeleter(ns3::DefaultDeleter<ns3::MacRxMiddle> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DefaultDeleter< ns3::MacRxMiddle > const &', 'arg0')])
+    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::MacRxMiddle>::Delete(ns3::MacRxMiddle * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::MacRxMiddle *', 'object')], 
+                   is_static=True)
+    return
+
+def register_Ns3DefaultDeleter__Ns3MacTxMiddle_methods(root_module, cls):
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MacTxMiddle>::DefaultDeleter() [constructor]
+    cls.add_constructor([])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::MacTxMiddle>::DefaultDeleter(ns3::DefaultDeleter<ns3::MacTxMiddle> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DefaultDeleter< ns3::MacTxMiddle > const &', 'arg0')])
+    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::MacTxMiddle>::Delete(ns3::MacTxMiddle * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::MacTxMiddle *', 'object')], 
+                   is_static=True)
+    return
+
 def register_Ns3DefaultDeleter__Ns3NixVector_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::NixVector>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -2739,6 +3172,18 @@
                    is_static=True)
     return
 
+def register_Ns3DefaultDeleter__Ns3PhyEntity_methods(root_module, cls):
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity>::DefaultDeleter() [constructor]
+    cls.add_constructor([])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity>::DefaultDeleter(ns3::DefaultDeleter<ns3::PhyEntity> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DefaultDeleter< ns3::PhyEntity > const &', 'arg0')])
+    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::PhyEntity>::Delete(ns3::PhyEntity * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::PhyEntity *', 'object')], 
+                   is_static=True)
+    return
+
 def register_Ns3DefaultDeleter__Ns3QueueItem_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::QueueItem>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -2928,41 +3373,60 @@
     cls.add_instance_attribute('ru', 'ns3::HeRu::RuSpec', is_const=False)
     return
 
-def register_Ns3HePreambleParameters_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::HePreambleParameters() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::HePreambleParameters(ns3::HePreambleParameters const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HePreambleParameters const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::bssColor [variable]
-    cls.add_instance_attribute('bssColor', 'uint8_t', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::rssiW [variable]
-    cls.add_instance_attribute('rssiW', 'double', is_const=False)
-    return
-
 def register_Ns3HeRu_methods(root_module, cls):
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu() [constructor]
     cls.add_constructor([])
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, ns3::HeRu::SubcarrierGroup const & toneRanges) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('ns3::HeRu::SubcarrierGroup const &', 'toneRanges')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuSpec ns3::HeRu::FindOverlappingRu(uint16_t bw, ns3::HeRu::RuSpec referenceRu, ns3::HeRu::RuType searchedRuType) [member function]
+    cls.add_method('FindOverlappingRu', 
+                   'ns3::HeRu::RuSpec', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'referenceRu'), param('ns3::HeRu::RuType', 'searchedRuType')], 
+                   is_static=True)
     ## he-ru.h (module 'wifi'): static uint16_t ns3::HeRu::GetBandwidth(ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetBandwidth', 
                    'uint16_t', 
                    [param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetCentral26TonesRus', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations, std::size_t & nCentral26TonesRus) [member function]
     cls.add_method('GetEqualSizedRusForStations', 
                    'ns3::HeRu::RuType', 
-                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations')], 
+                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations'), param('std::size_t &', 'nCentral26TonesRus')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint8_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetNRus', 
                    'std::size_t', 
-                   [param('uint8_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetRuType(uint16_t bandwidth) [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [param('uint16_t', 'bandwidth')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetRusOfType', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint8_t bw, ns3::HeRu::RuType ruType, std::size_t index) [member function]
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint16_t bw, ns3::HeRu::RuType ruType, std::size_t phyIndex) [member function]
     cls.add_method('GetSubcarrierGroup', 
                    'ns3::HeRu::SubcarrierGroup', 
-                   [param('uint8_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index')], 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'phyIndex')], 
                    is_static=True)
     ## he-ru.h (module 'wifi'): ns3::HeRu::m_heRuSubcarrierGroups [variable]
     cls.add_static_attribute('m_heRuSubcarrierGroups', 'ns3::HeRu::SubcarrierGroups const', is_const=True)
@@ -2970,16 +3434,41 @@
 
 def register_Ns3HeRuRuSpec_methods(root_module, cls):
     cls.add_output_stream_operator()
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec() [constructor]
-    cls.add_constructor([])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::index [variable]
-    cls.add_instance_attribute('index', 'std::size_t', is_const=False)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::primary80MHz [variable]
-    cls.add_instance_attribute('primary80MHz', 'bool', is_const=False)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::ruType [variable]
-    cls.add_instance_attribute('ruType', 'ns3::HeRu::RuType', is_const=False)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
+    cls.add_constructor([])
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuType ruType, std::size_t index, bool primary80MHz) [constructor]
+    cls.add_constructor([param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index'), param('bool', 'primary80MHz')])
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetIndex() const [member function]
+    cls.add_method('GetIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetPhyIndex() const [member function]
+    cls.add_method('GetPhyIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::GetPrimary80MHz() const [member function]
+    cls.add_method('GetPrimary80MHz', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType ns3::HeRu::RuSpec::GetRuType() const [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::IsPhyIndexSet() const [member function]
+    cls.add_method('IsPhyIndexSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): void ns3::HeRu::RuSpec::SetPhyIndex(uint16_t bw, uint8_t p20Index) [member function]
+    cls.add_method('SetPhyIndex', 
+                   'void', 
+                   [param('uint16_t', 'bw'), param('uint8_t', 'p20Index')])
     return
 
 def register_Ns3Inet6SocketAddress_methods(root_module, cls):
@@ -3082,10 +3571,10 @@
     cls.add_constructor([param('ns3::InterferenceHelper const &', 'arg0')])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper() [constructor]
     cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::InterferenceHelper::Add(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::InterferenceHelper::Add(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [member function]
     cls.add_method('Add', 
                    'ns3::Ptr< ns3::Event >', 
-                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')])
     ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddBand(ns3::WifiSpectrumBand band) [member function]
     cls.add_method('AddBand', 
                    'void', 
@@ -3094,21 +3583,16 @@
     cls.add_method('AddForeignSignal', 
                    'void', 
                    [param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateHtPhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('CalculateHtPhyHeaderSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
-                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateNonHtPhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('CalculateNonHtPhyHeaderSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
-                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculatePayloadSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, uint16_t staId, std::pair<ns3::Time, ns3::Time> relativeMpduStartStop) const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::InterferenceHelper::CalculatePayloadSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, uint16_t staId, std::pair<ns3::Time, ns3::Time> relativeMpduStartStop) const [member function]
     cls.add_method('CalculatePayloadSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
                    [param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'channelWidth'), param('std::pair< unsigned int, unsigned int >', 'band'), param('uint16_t', 'staId'), param('std::pair< ns3::Time, ns3::Time >', 'relativeMpduStartStop')], 
                    is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::InterferenceHelper::CalculatePhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, ns3::WifiPpduField header) const [member function]
+    cls.add_method('CalculatePhyHeaderSnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'channelWidth'), param('std::pair< unsigned int, unsigned int >', 'band'), param('ns3::WifiPpduField', 'header')], 
+                   is_const=True)
     ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateSnr(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, uint8_t nss, ns3::WifiSpectrumBand band) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
@@ -3118,20 +3602,19 @@
     cls.add_method('EraseEvents', 
                    'void', 
                    [])
-    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW, ns3::WifiSpectrumBand band) const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW, ns3::WifiSpectrumBand band) [member function]
     cls.add_method('GetEnergyDuration', 
                    'ns3::Time', 
-                   [param('double', 'energyW'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
+                   [param('double', 'energyW'), param('std::pair< unsigned int, unsigned int >', 'band')])
     ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::ErrorRateModel> ns3::InterferenceHelper::GetErrorRateModel() const [member function]
     cls.add_method('GetErrorRateModel', 
                    'ns3::Ptr< ns3::ErrorRateModel >', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd() [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd(ns3::Time endTime) [member function]
     cls.add_method('NotifyRxEnd', 
                    'void', 
-                   [])
+                   [param('ns3::Time', 'endTime')])
     ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxStart() [member function]
     cls.add_method('NotifyRxStart', 
                    'void', 
@@ -3152,10 +3635,19 @@
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint8_t', 'rx')])
-    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiMode mode, ns3::WifiTxVector txVector) const [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiMode mode, ns3::WifiTxVector const & txVector, ns3::WifiPpduField field) const [member function]
     cls.add_method('CalculateChunkSuccessRate', 
                    'double', 
-                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector')], 
+                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPpduField', 'field')], 
+                   is_const=True, visibility='protected')
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculatePayloadChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
+    cls.add_method('CalculatePayloadChunkSuccessRate', 
+                   'double', 
+                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True, visibility='protected')
     ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateSnr(double signal, double noiseInterference, uint16_t channelWidth, uint8_t nss) const [member function]
     cls.add_method('CalculateSnr', 
@@ -3164,17 +3656,6 @@
                    is_const=True, visibility='protected')
     return
 
-def register_Ns3InterferenceHelperSnrPer_methods(root_module, cls):
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer() [constructor]
-    cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer(ns3::InterferenceHelper::SnrPer const & arg0) [constructor]
-    cls.add_constructor([param('ns3::InterferenceHelper::SnrPer const &', 'arg0')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::per [variable]
-    cls.add_instance_attribute('per', 'double', is_const=False)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::snr [variable]
-    cls.add_instance_attribute('snr', 'double', is_const=False)
-    return
-
 def register_Ns3Ipv4Address_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3298,6 +3779,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3624,6 +4117,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -3699,6 +4197,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6InterfaceAddress_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3709,6 +4219,8 @@
     cls.add_constructor([param('ns3::Ipv6Address', 'address')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix')])
+    ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6Address address, ns3::Ipv6Prefix prefix, bool onLink) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6Prefix', 'prefix'), param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6InterfaceAddress::Ipv6InterfaceAddress(ns3::Ipv6InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv6InterfaceAddress const &', 'o')])
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6InterfaceAddress::GetAddress() const [member function]
@@ -3721,6 +4233,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## ipv6-interface-address.h (module 'internet'): bool ns3::Ipv6InterfaceAddress::GetOnLink() const [member function]
+    cls.add_method('GetOnLink', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## ipv6-interface-address.h (module 'internet'): ns3::Ipv6Prefix ns3::Ipv6InterfaceAddress::GetPrefix() const [member function]
     cls.add_method('GetPrefix', 
                    'ns3::Ipv6Prefix', 
@@ -3749,6 +4266,10 @@
     cls.add_method('SetNsDadUid', 
                    'void', 
                    [param('uint32_t', 'uid')])
+    ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetOnLink(bool onLink) [member function]
+    cls.add_method('SetOnLink', 
+                   'void', 
+                   [param('bool', 'onLink')])
     ## ipv6-interface-address.h (module 'internet'): void ns3::Ipv6InterfaceAddress::SetScope(ns3::Ipv6InterfaceAddress::Scope_e scope) [member function]
     cls.add_method('SetScope', 
                    'void', 
@@ -3851,6 +4372,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4065,98 +4591,14 @@
                    is_static=True)
     return
 
-def register_Ns3MacLowTransmissionParameters_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters(ns3::MacLowTransmissionParameters const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacLowTransmissionParameters const &', 'arg0')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters() [constructor]
-    cls.add_constructor([])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableAck() [member function]
-    cls.add_method('DisableAck', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableBlockAckRequest() [member function]
-    cls.add_method('DisableBlockAckRequest', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableNextData() [member function]
-    cls.add_method('DisableNextData', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableRts() [member function]
-    cls.add_method('DisableRts', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableAck() [member function]
-    cls.add_method('EnableAck', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBlockAck(ns3::BlockAckType type) [member function]
-    cls.add_method('EnableBlockAck', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBlockAckRequest(ns3::BlockAckType type) [member function]
-    cls.add_method('EnableBlockAckRequest', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableNextData(uint32_t size) [member function]
-    cls.add_method('EnableNextData', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableRts() [member function]
-    cls.add_method('EnableRts', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::BlockAckType ns3::MacLowTransmissionParameters::GetBlockAckRequestType() const [member function]
-    cls.add_method('GetBlockAckRequestType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::BlockAckType ns3::MacLowTransmissionParameters::GetBlockAckType() const [member function]
-    cls.add_method('GetBlockAckType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): uint32_t ns3::MacLowTransmissionParameters::GetNextPacketSize() const [member function]
-    cls.add_method('GetNextPacketSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::HasNextPacket() const [member function]
-    cls.add_method('HasNextPacket', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendBlockAckRequest() const [member function]
-    cls.add_method('MustSendBlockAckRequest', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendRts() const [member function]
-    cls.add_method('MustSendRts', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitBlockAck() const [member function]
-    cls.add_method('MustWaitBlockAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitNormalAck() const [member function]
-    cls.add_method('MustWaitNormalAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    return
-
 def register_Ns3MpduInfo_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::MpduInfo() [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::MpduInfo() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::MpduInfo(ns3::MpduInfo const & arg0) [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::MpduInfo(ns3::MpduInfo const & arg0) [constructor]
     cls.add_constructor([param('ns3::MpduInfo const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::mpduRefNumber [variable]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::mpduRefNumber [variable]
     cls.add_instance_attribute('mpduRefNumber', 'uint32_t', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::type [variable]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::type [variable]
     cls.add_instance_attribute('type', 'ns3::MpduType', is_const=False)
     return
 
@@ -4450,7 +4892,7 @@
     cls.add_method('GetStartingSequence', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::InitTxWindow() [member function]
     cls.add_method('InitTxWindow', 
                    'void', 
@@ -4961,6 +5403,18 @@
                    is_const=True)
     return
 
+def register_Ns3RxSignalInfo_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::RxSignalInfo() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::RxSignalInfo(ns3::RxSignalInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RxSignalInfo const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::rssi [variable]
+    cls.add_instance_attribute('rssi', 'double', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
+    return
+
 def register_Ns3SchInfo_methods(root_module, cls):
     ## channel-scheduler.h (module 'wave'): ns3::SchInfo::SchInfo(ns3::SchInfo const & arg0) [constructor]
     cls.add_constructor([param('ns3::SchInfo const &', 'arg0')])
@@ -4981,13 +5435,13 @@
     return
 
 def register_Ns3SignalNoiseDbm_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm() [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm(ns3::SignalNoiseDbm const & arg0) [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm(ns3::SignalNoiseDbm const & arg0) [constructor]
     cls.add_constructor([param('ns3::SignalNoiseDbm const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::noise [variable]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::noise [variable]
     cls.add_instance_attribute('noise', 'double', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::signal [variable]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::signal [variable]
     cls.add_instance_attribute('signal', 'double', is_const=False)
     return
 
@@ -5863,10 +6317,6 @@
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('std::string', 'nodeName')], 
                    is_const=True, is_virtual=True)
-    ## wave-helper.h (module 'wave'): void ns3::WaveHelper::SetAckPolicySelectorForAc(ns3::AcIndex ac, std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetAckPolicySelectorForAc', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac'), param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
     ## wave-helper.h (module 'wave'): void ns3::WaveHelper::SetChannelScheduler(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetChannelScheduler', 
                    'void', 
@@ -5877,7 +6327,291 @@
                    [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
     return
 
-def register_Ns3WifiHelper_methods(root_module, cls):
+def register_Ns3WifiAc_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(ns3::WifiAc const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAc const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(uint8_t lowTid, uint8_t highTid) [constructor]
+    cls.add_constructor([param('uint8_t', 'lowTid'), param('uint8_t', 'highTid')])
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetHighTid() const [member function]
+    cls.add_method('GetHighTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetLowTid() const [member function]
+    cls.add_method('GetLowTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetOtherTid(uint8_t tid) const [member function]
+    cls.add_method('GetOtherTid', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    return
+
+def register_Ns3WifiAcknowledgment_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::WifiAcknowledgment(ns3::WifiAcknowledgment::Method m) [constructor]
+    cls.add_constructor([param('ns3::WifiAcknowledgment::Method', 'm')])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAcknowledgment::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiAcknowledgment::GetQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid) const [member function]
+    cls.add_method('GetQosAckPolicy', 
+                   'ns3::WifiMacHeader::QosAckPolicy', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiAcknowledgment::SetQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) [member function]
+    cls.add_method('SetQosAckPolicy', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')])
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiAcknowledgment::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::method [variable]
+    cls.add_instance_attribute('method', 'ns3::WifiAcknowledgment::Method const', is_const=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::acknowledgmentTime [variable]
+    cls.add_instance_attribute('acknowledgmentTime', 'ns3::Time', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::WifiAcknowledgment(ns3::WifiAcknowledgment const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAcknowledgment const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiAcknowledgment::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3WifiAddressHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash(ns3::WifiAddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressHash::operator()(ns3::Mac48Address const & address) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3WifiAddressTidHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash(ns3::WifiAddressTidHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressTidHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressTidHash::operator()(ns3::WifiAddressTidPair const & addressTidPair) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::WifiAddressTidPair const &', 'addressTidPair')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3WifiBarBlockAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::WifiBarBlockAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBarBlockAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiBarBlockAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiBarBlockAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::blockAckReqTxVector [variable]
+    cls.add_instance_attribute('blockAckReqTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::barType [variable]
+    cls.add_instance_attribute('barType', 'ns3::BlockAckReqType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::WifiBarBlockAck(ns3::WifiBarBlockAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiBarBlockAck const &', 'arg0')])
+    return
+
+def register_Ns3WifiBlockAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::WifiBlockAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBlockAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiBlockAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiBlockAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::WifiBlockAck(ns3::WifiBlockAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiBlockAck const &', 'arg0')])
+    return
+
+def register_Ns3WifiDlMuAggregateTf_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::WifiDlMuAggregateTf(ns3::WifiDlMuAggregateTf const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuAggregateTf const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::WifiDlMuAggregateTf() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiDlMuAggregateTf::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuAggregateTf::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiDlMuAggregateTf::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::stationsReplyingWithBlockAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithBlockAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuAggregateTf::BlockAckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::ulLength [variable]
+    cls.add_instance_attribute('ulLength', 'uint16_t', is_const=False)
+    return
+
+def register_Ns3WifiDlMuAggregateTfBlockAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::BlockAckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::BlockAckInfo(ns3::WifiDlMuAggregateTf::BlockAckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuAggregateTf::BlockAckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::barHeader [variable]
+    cls.add_instance_attribute('barHeader', 'ns3::CtrlBAckRequestHeader', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::muBarSize [variable]
+    cls.add_instance_attribute('muBarSize', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequence_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::WifiDlMuBarBaSequence(ns3::WifiDlMuBarBaSequence const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::WifiDlMuBarBaSequence() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiDlMuBarBaSequence::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuBarBaSequence::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiDlMuBarBaSequence::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::stationsReplyingWithBlockAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithBlockAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::stationsReplyingWithNormalAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithNormalAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::AckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::stationsSendBlockAckReqTo [variable]
+    cls.add_instance_attribute('stationsSendBlockAckReqTo', 'std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckReqInfo >', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequenceAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo::AckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo::AckInfo(ns3::WifiDlMuBarBaSequence::AckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence::AckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo::ackTxVector [variable]
+    cls.add_instance_attribute('ackTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequenceBlockAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::BlockAckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::BlockAckInfo(ns3::WifiDlMuBarBaSequence::BlockAckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence::BlockAckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequenceBlockAckReqInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::BlockAckReqInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::BlockAckReqInfo(ns3::WifiDlMuBarBaSequence::BlockAckReqInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence::BlockAckReqInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::barType [variable]
+    cls.add_instance_attribute('barType', 'ns3::BlockAckReqType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::blockAckReqTxVector [variable]
+    cls.add_instance_attribute('blockAckReqTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiDlMuTfMuBar_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::WifiDlMuTfMuBar(ns3::WifiDlMuTfMuBar const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuTfMuBar const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::WifiDlMuTfMuBar() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiDlMuTfMuBar::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuTfMuBar::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiDlMuTfMuBar::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::barTypes [variable]
+    cls.add_instance_attribute('barTypes', 'std::list< ns3::BlockAckReqType >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::muBarTxVector [variable]
+    cls.add_instance_attribute('muBarTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::stationsReplyingWithBlockAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithBlockAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuTfMuBar::BlockAckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::ulLength [variable]
+    cls.add_instance_attribute('ulLength', 'uint16_t', is_const=False)
+    return
+
+def register_Ns3WifiDlMuTfMuBarBlockAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::BlockAckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::BlockAckInfo(ns3::WifiDlMuTfMuBar::BlockAckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuTfMuBar::BlockAckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::barHeader [variable]
+    cls.add_instance_attribute('barHeader', 'ns3::CtrlBAckRequestHeader', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiHelper_methods(root_module, cls):
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper::WifiHelper(ns3::WifiHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiHelper const &', 'arg0')])
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper::WifiHelper() [constructor]
@@ -5911,10 +6645,6 @@
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('std::string', 'nodeName')], 
                    is_const=True, is_virtual=True)
-    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetAckPolicySelectorForAc(ns3::AcIndex ac, std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetAckPolicySelectorForAc', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac'), param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
     ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetObssPdAlgorithm(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetObssPdAlgorithm', 
                    'void', 
@@ -5944,20 +6674,16 @@
     cls.add_constructor([param('ns3::WifiMacHelper const &', 'arg0')])
     ## wifi-mac-helper.h (module 'wifi'): ns3::WifiMacHelper::WifiMacHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::NetDevice> device, ns3::WifiStandard standard) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::WifiStandard', 'standard')], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-helper.h (module 'wifi'): void ns3::WifiMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue(), std::string n8="", ns3::AttributeValue const & v8=ns3::EmptyAttributeValue(), std::string n9="", ns3::AttributeValue const & v9=ns3::EmptyAttributeValue(), std::string n10="", ns3::AttributeValue const & v10=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetType', 
-                   'void', 
-                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n8', default_value='""'), param('ns3::AttributeValue const &', 'v8', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n9', default_value='""'), param('ns3::AttributeValue const &', 'v9', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n10', default_value='""'), param('ns3::AttributeValue const &', 'v10', default_value='ns3::EmptyAttributeValue()')], 
-                   is_virtual=True)
     return
 
 def register_Ns3WifiMode_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
     cls.add_output_stream_operator()
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [constructor]
@@ -5981,10 +6707,10 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector txVector, uint16_t staId=65535) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetDataRate', 
@@ -6011,10 +6737,15 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector txVector) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint16_t channelWidth) const [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'channelWidth')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -6051,18 +6782,64 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
     return
 
+def register_Ns3WifiNoAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck::WifiNoAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNoAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiNoAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiNoAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck::WifiNoAck(ns3::WifiNoAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiNoAck const &', 'arg0')])
+    return
+
+def register_Ns3WifiNormalAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::WifiNormalAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNormalAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiNormalAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiNormalAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::ackTxVector [variable]
+    cls.add_instance_attribute('ackTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::WifiNormalAck(ns3::WifiNormalAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiNormalAck const &', 'arg0')])
+    return
+
 def register_Ns3WifiPhyHelper_methods(root_module, cls):
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::WifiPhyHelper(ns3::WifiPhyHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiPhyHelper const &', 'arg0')])
@@ -6124,11 +6901,83 @@
                    is_virtual=True, visibility='private')
     return
 
+def register_Ns3WifiPhyOperatingChannel_methods(root_module, cls):
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel(ns3::WifiPhyOperatingChannel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhyOperatingChannel const &', 'arg0')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetNumber() const [member function]
+    cls.add_method('GetNumber', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelCenterFrequency(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelCenterFrequency', 
+                   'uint16_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelIndex(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelIndex', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetWidth() const [member function]
+    cls.add_method('GetWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): bool ns3::WifiPhyOperatingChannel::IsSet() const [member function]
+    cls.add_method('IsSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('SetDefault', 
+                   'void', 
+                   [param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetPrimary20Index(uint8_t index) [member function]
+    cls.add_method('SetPrimary20Index', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    return
+
+def register_Ns3WifiProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::WifiProtection(ns3::WifiProtection::Method m) [constructor]
+    cls.add_constructor([param('ns3::WifiProtection::Method', 'm')])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::method [variable]
+    cls.add_instance_attribute('method', 'ns3::WifiProtection::Method const', is_const=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::protectionTime [variable]
+    cls.add_instance_attribute('protectionTime', 'ns3::Time', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::WifiProtection(ns3::WifiProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiRemoteStation_methods(root_module, cls):
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation() [constructor]
     cls.add_constructor([])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation(ns3::WifiRemoteStation const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRemoteStation const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_rssiAndUpdateTimePair [variable]
+    cls.add_instance_attribute('m_rssiAndUpdateTimePair', 'std::pair< double, ns3::Time >', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_state [variable]
     cls.add_instance_attribute('m_state', 'ns3::WifiRemoteStationState *', is_const=False)
     return
@@ -6164,6 +7013,10 @@
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
     cls.add_instance_attribute('m_channelWidth', 'uint16_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_dsssSupported [variable]
+    cls.add_instance_attribute('m_dsssSupported', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_erpOfdmSupported [variable]
+    cls.add_instance_attribute('m_erpOfdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_guardInterval [variable]
     cls.add_instance_attribute('m_guardInterval', 'uint16_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_heCapabilities [variable]
@@ -6174,6 +7027,8 @@
     cls.add_instance_attribute('m_info', 'ns3::WifiRemoteStationInfo', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint8_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ofdmSupported [variable]
+    cls.add_instance_attribute('m_ofdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
     cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
@@ -6188,6 +7043,27 @@
     cls.add_instance_attribute('m_vhtCapabilities', 'ns3::Ptr< ns3::VhtCapabilities const >', is_const=False)
     return
 
+def register_Ns3WifiRtsCtsProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::WifiRtsCtsProtection() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiRtsCtsProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiRtsCtsProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::rtsTxVector [variable]
+    cls.add_instance_attribute('rtsTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::ctsTxVector [variable]
+    cls.add_instance_attribute('ctsTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::WifiRtsCtsProtection(ns3::WifiRtsCtsProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiRtsCtsProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, cls):
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory::WifiSpectrumValue5MhzFactory() [constructor]
     cls.add_constructor([])
@@ -6220,6 +7096,11 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeMuOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, ns3::WifiSpectrumBand ru) [member function]
+    cls.add_method('CreateHeMuOfdmTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('uint32_t', 'centerFrequency'), param('uint16_t', 'channelWidth'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'ru')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40) [member function]
     cls.add_method('CreateHeOfdmTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
@@ -6285,12 +7166,134 @@
     cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
     return
 
+def register_Ns3WifiTxParameters_methods(root_module, cls):
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::WifiTxParameters() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::WifiTxParameters(ns3::WifiTxParameters const & txParams) [constructor]
+    cls.add_constructor([param('ns3::WifiTxParameters const &', 'txParams')])
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::AddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('AddMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::AggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu) [member function]
+    cls.add_method('AggregateMsdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu')])
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::Clear() [member function]
+    cls.add_method('Clear', 
+                   'void', 
+                   [])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo const * ns3::WifiTxParameters::GetPsduInfo(ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetPsduInfo', 
+                   'ns3::WifiTxParameters::PsduInfo const *', 
+                   [param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfoMap const & ns3::WifiTxParameters::GetPsduInfoMap() const [member function]
+    cls.add_method('GetPsduInfoMap', 
+                   'ns3::WifiTxParameters::PsduInfoMap const &', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): uint32_t ns3::WifiTxParameters::GetSize(ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): uint32_t ns3::WifiTxParameters::GetSizeIfAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('GetSizeIfAddMpdu', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): std::pair<unsigned int, unsigned int> ns3::WifiTxParameters::GetSizeIfAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu) const [member function]
+    cls.add_method('GetSizeIfAggregateMsdu', 
+                   'std::pair< unsigned int, unsigned int >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_acknowledgment [variable]
+    cls.add_instance_attribute('m_acknowledgment', 'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_protection [variable]
+    cls.add_instance_attribute('m_protection', 'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_txDuration [variable]
+    cls.add_instance_attribute('m_txDuration', 'ns3::Time', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_txVector [variable]
+    cls.add_instance_attribute('m_txVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiTxParametersPsduInfo_methods(root_module, cls):
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::PsduInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::PsduInfo(ns3::WifiTxParameters::PsduInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiTxParameters::PsduInfo const &', 'arg0')])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::ampduSize [variable]
+    cls.add_instance_attribute('ampduSize', 'uint32_t', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::amsduSize [variable]
+    cls.add_instance_attribute('amsduSize', 'uint32_t', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::header [variable]
+    cls.add_instance_attribute('header', 'ns3::WifiMacHeader', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::seqNumbers [variable]
+    cls.add_instance_attribute('seqNumbers', 'std::map< unsigned char, std::set< unsigned short > >', is_const=False)
+    return
+
+def register_Ns3WifiTxTimer_methods(root_module, cls):
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::WifiTxTimer(ns3::WifiTxTimer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiTxTimer const &', 'arg0')])
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::WifiTxTimer() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## wifi-tx-timer.h (module 'wifi'): ns3::Time ns3::WifiTxTimer::GetDelayLeft() const [member function]
+    cls.add_method('GetDelayLeft', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::Reason ns3::WifiTxTimer::GetReason() const [member function]
+    cls.add_method('GetReason', 
+                   'ns3::WifiTxTimer::Reason', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): std::string ns3::WifiTxTimer::GetReasonString(ns3::WifiTxTimer::Reason reason) const [member function]
+    cls.add_method('GetReasonString', 
+                   'std::string', 
+                   [param('ns3::WifiTxTimer::Reason', 'reason')], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): bool ns3::WifiTxTimer::IsRunning() const [member function]
+    cls.add_method('IsRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::Reschedule(ns3::Time const & delay) [member function]
+    cls.add_method('Reschedule', 
+                   'void', 
+                   [param('ns3::Time const &', 'delay')])
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::SetMpduResponseTimeoutCallback(ns3::WifiTxTimer::MpduResponseTimeout callback) const [member function]
+    cls.add_method('SetMpduResponseTimeoutCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::SetPsduMapResponseTimeoutCallback(ns3::WifiTxTimer::PsduMapResponseTimeout callback) const [member function]
+    cls.add_method('SetPsduMapResponseTimeoutCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::SetPsduResponseTimeoutCallback(ns3::WifiTxTimer::PsduResponseTimeout callback) const [member function]
+    cls.add_method('SetPsduResponseTimeoutCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_const=True)
+    return
+
 def register_Ns3WifiTxVector_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0, uint16_t length=0) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0'), param('uint16_t', 'length', default_value='0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & txVector) [constructor]
     cls.add_constructor([param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetBssColor() const [member function]
@@ -6318,6 +7321,15 @@
                    'ns3::WifiTxVector::HeMuUserInfoMap const &', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap & ns3::WifiTxVector::GetHeMuUserInfoMap() [member function]
+    cls.add_method('GetHeMuUserInfoMap', 
+                   'ns3::WifiTxVector::HeMuUserInfoMap &', 
+                   [])
+    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode(uint16_t staId=65535) const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -6328,6 +7340,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiTxVector::GetModulationClass() const [member function]
+    cls.add_method('GetModulationClass', 
+                   'ns3::WifiModulationClass', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNTx() const [member function]
     cls.add_method('GetNTx', 
                    'uint8_t', 
@@ -6348,6 +7365,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): std::pair<unsigned long, unsigned long> ns3::WifiTxVector::GetNumRusPerHeSigBContentChannel() const [member function]
+    cls.add_method('GetNumRusPerHeSigBContentChannel', 
+                   'std::pair< unsigned long, unsigned long >', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiPreamble ns3::WifiTxVector::GetPreambleType() const [member function]
     cls.add_method('GetPreambleType', 
                    'ns3::WifiPreamble', 
@@ -6368,16 +7390,31 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsDlMu() const [member function]
+    cls.add_method('IsDlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsLdpc() const [member function]
     cls.add_method('IsLdpc', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsMu() const [member function]
+    cls.add_method('IsMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsStbc() const [member function]
     cls.add_method('IsStbc', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsUlMu() const [member function]
+    cls.add_method('IsUlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsValid() const [member function]
     cls.add_method('IsValid', 
                    'bool', 
@@ -6407,6 +7444,10 @@
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('bool', 'ldpc')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -6449,6 +7490,36 @@
                    [param('uint8_t', 'powerlevel')])
     return
 
+def register_Ns3WifiUlMuMultiStaBa_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::WifiUlMuMultiStaBa() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiUlMuMultiStaBa::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiUlMuMultiStaBa::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiUlMuMultiStaBa::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::stationsReceivingMultiStaBa [variable]
+    cls.add_instance_attribute('stationsReceivingMultiStaBa', 'std::map< std::pair< ns3::Mac48Address, unsigned char >, unsigned long >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::tbPpduTxVector [variable]
+    cls.add_instance_attribute('tbPpduTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::multiStaBaTxVector [variable]
+    cls.add_instance_attribute('multiStaBaTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::WifiUlMuMultiStaBa(ns3::WifiUlMuMultiStaBa const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiUlMuMultiStaBa const &', 'arg0')])
+    return
+
 def register_Ns3YansWifiChannelHelper_methods(root_module, cls):
     ## yans-wifi-helper.h (module 'wifi'): ns3::YansWifiChannelHelper::YansWifiChannelHelper(ns3::YansWifiChannelHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::YansWifiChannelHelper const &', 'arg0')])
@@ -6692,97 +7763,6 @@
                    is_const=True, is_virtual=True)
     return
 
-def register_Ns3HtSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader::HtSigHeader(ns3::HtSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader::HtSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::GetAggregation() const [member function]
-    cls.add_method('GetAggregation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HtSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HtSigHeader::GetHtLength() const [member function]
-    cls.add_method('GetHtLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::HtSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HtSigHeader::GetMcs() const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HtSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::GetShortGuardInterval() const [member function]
-    cls.add_method('GetShortGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::HtSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::IsLdpcFecCoding() const [member function]
-    cls.add_method('IsLdpcFecCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetAggregation(bool aggregation) [member function]
-    cls.add_method('SetAggregation', 
-                   'void', 
-                   [param('bool', 'aggregation')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetFecCoding(bool ldpc) [member function]
-    cls.add_method('SetFecCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetHtLength(uint16_t length) [member function]
-    cls.add_method('SetHtLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetMcs(uint8_t mcs) [member function]
-    cls.add_method('SetMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetShortGuardInterval(bool sgi) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'sgi')])
-    return
-
 def register_Ns3InternetStackHelper_methods(root_module, cls):
     ## internet-stack-helper.h (module 'internet'): ns3::InternetStackHelper::InternetStackHelper() [constructor]
     cls.add_constructor([])
@@ -7170,61 +8150,6 @@
                    [param('uint8_t', 'traffic')])
     return
 
-def register_Ns3LSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader::LSigHeader(ns3::LSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader::LSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::LSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::LSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::LSigHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint64_t ns3::LSigHeader::GetRate(uint16_t channelWidth=20) const [member function]
-    cls.add_method('GetRate', 
-                   'uint64_t', 
-                   [param('uint16_t', 'channelWidth', default_value='20')], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::LSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::LSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::SetRate(uint64_t rate, uint16_t channelWidth=20) [member function]
-    cls.add_method('SetRate', 
-                   'void', 
-                   [param('uint64_t', 'rate'), param('uint16_t', 'channelWidth', default_value='20')])
-    return
-
 def register_Ns3NqosWaveMacHelper_methods(root_module, cls):
     ## wave-mac-helper.h (module 'wave'): ns3::NqosWaveMacHelper::NqosWaveMacHelper(ns3::NqosWaveMacHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::NqosWaveMacHelper const &', 'arg0')])
@@ -7663,6 +8588,20 @@
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
+def register_Ns3SimpleRefCount__Ns3MacRxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacRxMiddle__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter< ns3::MacRxMiddle > > const &', 'o')])
+    return
+
+def register_Ns3SimpleRefCount__Ns3MacTxMiddle_Ns3Empty_Ns3DefaultDeleter__lt__ns3MacTxMiddle__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> >::SimpleRefCount(ns3::SimpleRefCount<ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacTxMiddle> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::MacTxMiddle, ns3::empty, ns3::DefaultDeleter< ns3::MacTxMiddle > > const &', 'o')])
+    return
+
 def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -7684,6 +8623,13 @@
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
+def register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter< ns3::PhyEntity > > const &', 'o')])
+    return
+
 def register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -8011,10 +8957,10 @@
     cls.add_method('SetPriority', 
                    'void', 
                    [param('uint8_t', 'priority')])
-    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> arg0) [member function]
+    ## socket.h (module 'network'): void ns3::Socket::SetRecvCallback(ns3::Callback<void, ns3::Ptr<ns3::Socket>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> receivedData) [member function]
     cls.add_method('SetRecvCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'arg0')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Socket >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'receivedData')])
     ## socket.h (module 'network'): void ns3::Socket::SetRecvPktInfo(bool flag) [member function]
     cls.add_method('SetRecvPktInfo', 
                    'void', 
@@ -8604,76 +9550,27 @@
     return
 
 def register_Ns3Txop_methods(root_module, cls):
+    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Txop const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Txop const &', 'arg0')])
     ## txop.h (module 'wifi'): ns3::Txop::Txop() [constructor]
     cls.add_constructor([])
-    ## txop.h (module 'wifi'): static ns3::TypeId ns3::Txop::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsQosTxop() const [member function]
-    cls.add_method('IsQosTxop', 
-                   'bool', 
+    ## txop.h (module 'wifi'): int64_t ns3::Txop::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## txop.h (module 'wifi'): ns3::AcIndex ns3::Txop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMacLow(ns3::Ptr<ns3::MacLow> const low) [member function]
-    cls.add_method('SetMacLow', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacLow > const', 'low')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> const manager) [member function]
-    cls.add_method('SetChannelAccessManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ChannelAccessManager > const', 'manager')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
-    cls.add_method('SetTxMiddle', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxOkCallback(ns3::Txop::TxOk callback) [member function]
-    cls.add_method('SetTxOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxFailedCallback(ns3::Txop::TxFailed callback) [member function]
-    cls.add_method('SetTxFailedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxDroppedCallback(ns3::Txop::TxDropped callback) [member function]
-    cls.add_method('SetTxDroppedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::MacLow> ns3::Txop::GetLow() const [member function]
-    cls.add_method('GetLow', 
-                   'ns3::Ptr< ns3::MacLow >', 
-                   [], 
-                   is_const=True)
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::Txop::GetWifiMacQueue() const [member function]
-    cls.add_method('GetWifiMacQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
+    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus ns3::Txop::GetAccessStatus() const [member function]
+    cls.add_method('GetAccessStatus', 
+                   'ns3::Txop::ChannelAccessStatus', 
                    [], 
-                   is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMinCw(uint32_t minCw) [member function]
-    cls.add_method('SetMinCw', 
-                   'void', 
-                   [param('uint32_t', 'minCw')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMaxCw(uint32_t maxCw) [member function]
-    cls.add_method('SetMaxCw', 
-                   'void', 
-                   [param('uint32_t', 'maxCw')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetAifsn', 
-                   'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxopLimit(ns3::Time txopLimit) [member function]
-    cls.add_method('SetTxopLimit', 
-                   'void', 
-                   [param('ns3::Time', 'txopLimit')])
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMinCw() const [member function]
-    cls.add_method('GetMinCw', 
-                   'uint32_t', 
+                   is_const=True, is_virtual=True)
+    ## txop.h (module 'wifi'): uint8_t ns3::Txop::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMaxCw() const [member function]
@@ -8681,9 +9578,9 @@
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): uint8_t ns3::Txop::GetAifsn() const [member function]
-    cls.add_method('GetAifsn', 
-                   'uint8_t', 
+    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
     ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopLimit() const [member function]
@@ -8691,23 +9588,38 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
-    cls.add_method('NotifyChannelSwitching', 
-                   'void', 
+    ## txop.h (module 'wifi'): static ns3::TypeId ns3::Txop::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::Txop::GetWifiMacQueue() const [member function]
+    cls.add_method('GetWifiMacQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [], 
+                   is_const=True)
+    ## txop.h (module 'wifi'): bool ns3::Txop::IsQosTxop() const [member function]
+    cls.add_method('IsQosTxop', 
+                   'bool', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelAccessed(ns3::Time txopDuration=ns3::Seconds(0)) [member function]
+    cls.add_method('NotifyChannelAccessed', 
+                   'void', 
+                   [param('ns3::Time', 'txopDuration', default_value='ns3::Seconds(0)')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifySleep() [member function]
-    cls.add_method('NotifySleep', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelReleased() [member function]
+    cls.add_method('NotifyChannelReleased', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyOff() [member function]
-    cls.add_method('NotifyOff', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyWakeUp() [member function]
-    cls.add_method('NotifyWakeUp', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyOff() [member function]
+    cls.add_method('NotifyOff', 
                    'void', 
                    [], 
                    is_virtual=True)
@@ -8716,98 +9628,67 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::Queue(ns3::Ptr<ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('Queue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SendCfFrame(ns3::WifiMacType frameType, ns3::Mac48Address addr) [member function]
-    cls.add_method('SendCfFrame', 
-                   'void', 
-                   [param('ns3::WifiMacType', 'frameType'), param('ns3::Mac48Address', 'addr')])
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedCts() [member function]
-    cls.add_method('MissedCts', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifySleep() [member function]
+    cls.add_method('NotifySleep', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotAck() [member function]
-    cls.add_method('GotAck', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyWakeUp() [member function]
+    cls.add_method('NotifyWakeUp', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedAck() [member function]
-    cls.add_method('MissedAck', 
+    ## txop.h (module 'wifi'): void ns3::Txop::Queue(ns3::Ptr<ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('Queue', 
                    'void', 
-                   [], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotCfEnd() [member function]
-    cls.add_method('GotCfEnd', 
+    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
+    cls.add_method('ResetCw', 
                    'void', 
                    [])
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedCfPollResponse(bool expectedCfAck) [member function]
-    cls.add_method('MissedCfPollResponse', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetAifsn', 
                    'void', 
-                   [param('bool', 'expectedCfAck')])
-    ## txop.h (module 'wifi'): void ns3::Txop::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('GotBlockAck', 
+                   [param('uint8_t', 'aifsn')])
+    ## txop.h (module 'wifi'): void ns3::Txop::SetChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> const manager) [member function]
+    cls.add_method('SetChannelAccessManager', 
                    'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedBlockAck(uint8_t nMpdus) [member function]
-    cls.add_method('MissedBlockAck', 
+                   [param('ns3::Ptr< ns3::ChannelAccessManager > const', 'manager')])
+    ## txop.h (module 'wifi'): void ns3::Txop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
                    'void', 
-                   [param('uint8_t', 'nMpdus')], 
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::StartNextFragment() [member function]
-    cls.add_method('StartNextFragment', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetMaxCw(uint32_t maxCw) [member function]
+    cls.add_method('SetMaxCw', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::Cancel() [member function]
-    cls.add_method('Cancel', 
+                   [param('uint32_t', 'maxCw')])
+    ## txop.h (module 'wifi'): void ns3::Txop::SetMinCw(uint32_t minCw) [member function]
+    cls.add_method('SetMinCw', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::StartNextPacket() [member function]
-    cls.add_method('StartNextPacket', 
+                   [param('uint32_t', 'minCw')])
+    ## txop.h (module 'wifi'): void ns3::Txop::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
+    cls.add_method('SetTxMiddle', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::EndTxNoAck() [member function]
-    cls.add_method('EndTxNoAck', 
+                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
+    ## txop.h (module 'wifi'): void ns3::Txop::SetTxopLimit(ns3::Time txopLimit) [member function]
+    cls.add_method('SetTxopLimit', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopRemaining() const [member function]
-    cls.add_method('GetTxopRemaining', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::TerminateTxop() [member function]
-    cls.add_method('TerminateTxop', 
+                   [param('ns3::Time', 'txopLimit')])
+    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
                    'void', 
-                   [], 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): bool ns3::Txop::CanStartNextPolling() const [member function]
-    cls.add_method('CanStartNextPolling', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## txop.h (module 'wifi'): int64_t ns3::Txop::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsAccessRequested() const [member function]
-    cls.add_method('IsAccessRequested', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
     cls.add_method('StartBackoffNow', 
                    'void', 
                    [param('uint32_t', 'nSlots')])
-    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Txop const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Txop const &', 'arg0')])
+    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
+    cls.add_method('UpdateFailedCw', 
+                   'void', 
+                   [])
     ## txop.h (module 'wifi'): void ns3::Txop::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -8818,121 +9699,56 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessRequested() [member function]
-    cls.add_method('NotifyAccessRequested', 
+    ## txop.h (module 'wifi'): void ns3::Txop::GenerateBackoff() [member function]
+    cls.add_method('GenerateBackoff', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessGranted() [member function]
-    cls.add_method('NotifyAccessGranted', 
-                   'void', 
+    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetBackoffSlots() const [member function]
+    cls.add_method('GetBackoffSlots', 
+                   'uint32_t', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyInternalCollision() [member function]
-    cls.add_method('NotifyInternalCollision', 
-                   'void', 
+                   is_const=True, visibility='protected')
+    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetBackoffStart() const [member function]
+    cls.add_method('GetBackoffStart', 
+                   'ns3::Time', 
                    [], 
-                   is_virtual=True, visibility='protected')
+                   is_const=True, visibility='protected')
+    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetCw() const [member function]
+    cls.add_method('GetCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, visibility='protected')
     ## txop.h (module 'wifi'): bool ns3::Txop::HasFramesToTransmit() [member function]
     cls.add_method('HasFramesToTransmit', 
                    'bool', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::GenerateBackoff() [member function]
-    cls.add_method('GenerateBackoff', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::RestartAccessIfNeeded() [member function]
-    cls.add_method('RestartAccessIfNeeded', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessRequested() [member function]
+    cls.add_method('NotifyAccessRequested', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::StartAccessIfNeeded() [member function]
-    cls.add_method('StartAccessIfNeeded', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyInternalCollision() [member function]
+    cls.add_method('NotifyInternalCollision', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetCw() const [member function]
-    cls.add_method('GetCw', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
-    cls.add_method('ResetCw', 
+    ## txop.h (module 'wifi'): void ns3::Txop::RequestAccess() [member function]
+    cls.add_method('RequestAccess', 
                    'void', 
                    [], 
                    visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
-    cls.add_method('UpdateFailedCw', 
+    ## txop.h (module 'wifi'): void ns3::Txop::StartAccessIfNeeded() [member function]
+    cls.add_method('StartAccessIfNeeded', 
                    'void', 
                    [], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetBackoffSlots() const [member function]
-    cls.add_method('GetBackoffSlots', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetBackoffStart() const [member function]
-    cls.add_method('GetBackoffStart', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, visibility='protected')
+                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::UpdateBackoffSlotsNow(uint32_t nSlots, ns3::Time backoffUpdateBound) [member function]
     cls.add_method('UpdateBackoffSlotsNow', 
                    'void', 
                    [param('uint32_t', 'nSlots'), param('ns3::Time', 'backoffUpdateBound')], 
                    visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedRtsRetransmission(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('NeedRtsRetransmission', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedDataRetransmission(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('NeedDataRetransmission', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedFragmentation() const [member function]
-    cls.add_method('NeedFragmentation', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NextFragment() [member function]
-    cls.add_method('NextFragment', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::Txop::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
-    cls.add_method('GetFragmentPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('ns3::WifiMacHeader *', 'hdr')], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetNextFragmentSize() const [member function]
-    cls.add_method('GetNextFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetFragmentSize() const [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetFragmentOffset() const [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsLastFragment() const [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::TxDroppedPacket(ns3::Ptr<const ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('TxDroppedPacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item')], 
-                   visibility='protected')
     return
 
 def register_Ns3UniformRandomVariable_methods(root_module, cls):
@@ -9024,101 +9840,6 @@
                    [param('ns3::OrganizationIdentifier', 'oi')])
     return
 
-def register_Ns3VhtSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader::VhtSigHeader(ns3::VhtSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::VhtSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader::VhtSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::VhtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::VhtSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::VhtSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::VhtSigHeader::GetNStreams() const [member function]
-    cls.add_method('GetNStreams', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::VhtSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::GetShortGuardInterval() const [member function]
-    cls.add_method('GetShortGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::GetShortGuardIntervalDisambiguation() const [member function]
-    cls.add_method('GetShortGuardIntervalDisambiguation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::VhtSigHeader::GetSuMcs() const [member function]
-    cls.add_method('GetSuMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::VhtSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::IsLdpcCoding() const [member function]
-    cls.add_method('IsLdpcCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetCoding(bool ldpc) [member function]
-    cls.add_method('SetCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetMuFlag(bool mu) [member function]
-    cls.add_method('SetMuFlag', 
-                   'void', 
-                   [param('bool', 'mu')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetNStreams(uint8_t nStreams) [member function]
-    cls.add_method('SetNStreams', 
-                   'void', 
-                   [param('uint8_t', 'nStreams')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetShortGuardInterval(bool sgi) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'sgi')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetShortGuardIntervalDisambiguation(bool disambiguation) [member function]
-    cls.add_method('SetShortGuardIntervalDisambiguation', 
-                   'void', 
-                   [param('bool', 'disambiguation')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetSuMcs(uint8_t mcs) [member function]
-    cls.add_method('SetSuMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    return
-
 def register_Ns3VsaManager_methods(root_module, cls):
     ## vsa-manager.h (module 'wave'): ns3::VsaManager::VsaManager(ns3::VsaManager const & arg0) [constructor]
     cls.add_constructor([param('ns3::VsaManager const &', 'arg0')])
@@ -9328,6 +10049,88 @@
                    deprecated=True, is_virtual=True)
     return
 
+def register_Ns3WifiAckAfterTbPpdu_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu::WifiAckAfterTbPpdu() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckAfterTbPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiAckAfterTbPpdu::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiAckAfterTbPpdu::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu::WifiAckAfterTbPpdu(ns3::WifiAckAfterTbPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAckAfterTbPpdu const &', 'arg0')])
+    return
+
+def register_Ns3WifiAckManager_methods(root_module, cls):
+    ## wifi-ack-manager.h (module 'wifi'): ns3::WifiAckManager::WifiAckManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-ack-manager.h (module 'wifi'): ns3::WifiAckManager::WifiAckManager(ns3::WifiAckManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAckManager const &', 'arg0')])
+    ## wifi-ack-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiAckManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-ack-manager.h (module 'wifi'): static void ns3::WifiAckManager::SetQosAckPolicy(ns3::Ptr<ns3::WifiMacQueueItem> item, ns3::WifiAcknowledgment const * acknowledgment) [member function]
+    cls.add_method('SetQosAckPolicy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item'), param('ns3::WifiAcknowledgment const *', 'acknowledgment')], 
+                   is_static=True)
+    ## wifi-ack-manager.h (module 'wifi'): static void ns3::WifiAckManager::SetQosAckPolicy(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiAcknowledgment const * acknowledgment) [member function]
+    cls.add_method('SetQosAckPolicy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiAcknowledgment const *', 'acknowledgment')], 
+                   is_static=True)
+    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    cls.add_method('SetWifiMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAddMpdu', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3WifiCtsToSelfProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::WifiCtsToSelfProtection() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiCtsToSelfProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiCtsToSelfProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::ctsTxVector [variable]
+    cls.add_instance_attribute('ctsTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::WifiCtsToSelfProtection(ns3::WifiCtsToSelfProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiCtsToSelfProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiInformationElement_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement::WifiInformationElement() [constructor]
@@ -9366,7 +10169,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -9376,7 +10179,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'i')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -9449,6 +10252,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
     cls.add_method('GetVhtConfiguration', 
                    'ns3::Ptr< ns3::VhtConfiguration >', 
@@ -9498,7 +10306,7 @@
     cls.add_method('SetDevice', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::Callback<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function]
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
@@ -9528,6 +10336,11 @@
                    'void', 
                    [param('ns3::Ssid', 'ssid')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
     cls.add_method('SetWifiPhy', 
                    'void', 
@@ -9555,6 +10368,8 @@
     cls.add_constructor([param('ns3::WifiMacHeader const &', 'arg0')])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader() [constructor]
     cls.add_constructor([])
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader(ns3::WifiMacType type) [constructor]
+    cls.add_constructor([param('ns3::WifiMacType', 'type')])
     ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -9600,6 +10415,11 @@
                    'ns3::WifiMacHeader::QosAckPolicy', 
                    [], 
                    is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosQueueSize() const [member function]
+    cls.add_method('GetQosQueueSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosTid() const [member function]
     cls.add_method('GetQosTid', 
                    'uint8_t', 
@@ -9815,6 +10635,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsTrigger() const [member function]
+    cls.add_method('IsTrigger', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -9917,6 +10742,10 @@
     cls.add_method('SetQosNoMeshControlPresent', 
                    'void', 
                    [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosQueueSize(uint8_t size) [member function]
+    cls.add_method('SetQosQueueSize', 
+                   'void', 
+                   [param('uint8_t', 'size')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTid(uint8_t tid) [member function]
     cls.add_method('SetQosTid', 
                    'void', 
@@ -9974,11 +10803,21 @@
                    'ns3::Ptr< ns3::Packet const >', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetPacketSize() const [member function]
+    cls.add_method('GetPacketSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiMacQueueItem::GetProtocolDataUnit() const [member function]
     cls.add_method('GetProtocolDataUnit', 
                    'ns3::Ptr< ns3::Packet >', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): std::list<ns3::WifiMacQueueItem::QueueIteratorPair, std::allocator<ns3::WifiMacQueueItem::QueueIteratorPair> > const & ns3::WifiMacQueueItem::GetQueueIteratorPairs() const [member function]
+    cls.add_method('GetQueueIteratorPairs', 
+                   'std::list< ns3::WifiMacQueueItem::QueueIteratorPair > const &', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
     cls.add_method('GetSize', 
                    'uint32_t', 
@@ -9989,21 +10828,59 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsFragment() const [member function]
+    cls.add_method('IsFragment', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
+    cls.add_method('IsQueued', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::MsduAggregator::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
     cls.add_method('begin', 
-                   'ns3::MsduAggregator::DeaggregatedMsdusCI', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
                    [])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::MsduAggregator::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
     cls.add_method('end', 
-                   'ns3::MsduAggregator::DeaggregatedMsdusCI', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
                    [])
     return
 
+def register_Ns3WifiMacQueueItemQueueIteratorPair_methods(root_module, cls):
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::QueueIteratorPair() [constructor]
+    cls.add_constructor([])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::QueueIteratorPair(ns3::WifiMacQueueItem::QueueIteratorPair const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiMacQueueItem::QueueIteratorPair const &', 'arg0')])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::it [variable]
+    cls.add_instance_attribute('it', 'ns3::WifiMacQueueItem::ConstIterator', is_const=False)
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::queue [variable]
+    cls.add_instance_attribute('queue', 'ns3::WifiMacQueue *', is_const=False)
+    return
+
+def register_Ns3WifiNoProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection::WifiNoProtection() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiNoProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiNoProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection::WifiNoProtection(ns3::WifiNoProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiNoProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiPhy_methods(root_module, cls):
     ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -10012,6 +10889,8 @@
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
     cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::m_frequencyChannels [variable]
+    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPhyStateHelper> ns3::WifiPhy::GetState() const [member function]
     cls.add_method('GetState', 
                    'ns3::Ptr< ns3::WifiPhyStateHelper >', 
@@ -10020,7 +10899,7 @@
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
     cls.add_method('SetReceiveOkCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
     cls.add_method('SetReceiveErrorCallback', 
                    'void', 
@@ -10037,26 +10916,10 @@
     cls.add_method('SetCapabilitiesChangedCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
     cls.add_method('StartReceivePreamble', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('StartReceiveHeader', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ContinueReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('ContinueReceiveHeader', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('StartReceivePayload', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::EndReceive(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('EndReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
     cls.add_method('ResetReceive', 
                    'void', 
@@ -10065,10 +10928,15 @@
     cls.add_method('EndReceiveInterBss', 
                    'void', 
                    [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiConstPsduMap ns3::WifiPhy::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector', 'txVector')])
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
     cls.add_method('Send', 
                    'void', 
@@ -10143,125 +11011,75 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, uint16_t staId=65535) [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector txVector, ns3::WifiPhyBand band) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('CalculatePhyPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPreambleDetectionDuration() [member function]
     cls.add_method('GetPreambleDetectionDuration', 
                    'ns3::Time', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyTrainingSymbolDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyTrainingSymbolDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPhyHeaderMode() [member function]
-    cls.add_method('GetHtPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPhyHeaderMode() [member function]
-    cls.add_method('GetVhtPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHePhyHeaderMode() [member function]
-    cls.add_method('GetHePhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhyHtSigHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigA1Duration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigA1Duration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigA2Duration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigA2Duration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigBDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigBDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPhyHeaderMode(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyHeaderDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyPreambleDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyPreambleDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype=::ns3::MpduType::NORMAL_MPDU, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype=::ns3::MpduType::NORMAL_MPDU, uint16_t staId=65535) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype', default_value='::ns3::MpduType::NORMAL_MPDU'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype', default_value='::ns3::MpduType::NORMAL_MPDU'), param('uint16_t', 'staId', default_value='65535')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) [member function]
     cls.add_method('GetPayloadDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('GetStartOfPacketDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint8_t', 
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList() const [member function]
+    cls.add_method('GetModeList', 
+                   'std::list< ns3::WifiMode >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint8_t mode) const [member function]
-    cls.add_method('GetMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mode')], 
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetModeList', 
+                   'std::list< ns3::WifiMode >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
     cls.add_method('IsModeSupported', 
                    'bool', 
                    [param('ns3::WifiMode', 'mode')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiMode mcs) const [member function]
-    cls.add_method('IsMcsSupported', 
-                   'bool', 
-                   [param('ns3::WifiMode', 'mcs')], 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetDefaultMode() const [member function]
+    cls.add_method('GetDefaultMode', 
+                   'ns3::WifiMode', 
+                   [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiModulationClass mc, uint8_t mcs) const [member function]
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
     cls.add_method('IsMcsSupported', 
                    'bool', 
-                   [param('ns3::WifiModulationClass', 'mc'), param('uint8_t', 'mcs')], 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiTxVector txVector, double ber) const [member function]
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiTxVector const & txVector, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('double', 'ber')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('double', 'ber')], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSifs(ns3::Time sifs) [member function]
     cls.add_method('SetSifs', 
@@ -10300,46 +11118,36 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint8_t', 
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetMaxPsduSize(ns3::WifiModulationClass modulation) [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char> > ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
+    cls.add_method('GetBssMembershipSelectorList', 
+                   'std::list< unsigned char >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetBssMembershipSelector(uint8_t selector) const [member function]
-    cls.add_method('GetBssMembershipSelector', 
-                   'uint8_t', 
-                   [param('uint8_t', 'selector')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetNMcs() const [member function]
     cls.add_method('GetNMcs', 
-                   'uint8_t', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList() const [member function]
+    cls.add_method('GetMcsList', 
+                   'std::list< ns3::WifiMode >', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetMcsList', 
+                   'std::list< ns3::WifiMode >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
     cls.add_method('GetMcs', 
                    'ns3::WifiMode', 
                    [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs(uint8_t mcs) [member function]
-    cls.add_method('GetHtMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs(uint8_t mcs) [member function]
-    cls.add_method('GetVhtMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs(uint8_t mcs) [member function]
-    cls.add_method('GetHeMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
     cls.add_method('SetChannelNumber', 
                    'void', 
@@ -10370,1497 +11178,1165 @@
                    'ns3::WifiPhyBand', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DefineChannelNumber(uint8_t channelNumber, ns3::WifiPhyBand band, ns3::WifiPhyStandard standard, uint16_t frequency, uint16_t channelWidth) [member function]
-    cls.add_method('DefineChannelNumber', 
-                   'bool', 
-                   [param('uint8_t', 'channelNumber'), param('ns3::WifiPhyBand', 'band'), param('ns3::WifiPhyStandard', 'standard'), param('uint16_t', 'frequency'), param('uint16_t', 'channelWidth')])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyOperatingChannel const & ns3::WifiPhy::GetOperatingChannel() const [member function]
+    cls.add_method('GetOperatingChannel', 
+                   'ns3::WifiPhyOperatingChannel const &', 
+                   [], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::WifiPhy::GetChannel() const [member function]
     cls.add_method('GetChannel', 
                    'ns3::Ptr< ns3::Channel >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate1Mbps() [member function]
-    cls.add_method('GetDsssRate1Mbps', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::WifiConstPsduMap psdus, double txPowerW) [member function]
+    cls.add_method('NotifyTxBegin', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerW')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxEnd(ns3::WifiConstPsduMap psdus) [member function]
+    cls.add_method('NotifyTxEnd', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('NotifyTxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    cls.add_method('NotifyRxBegin', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('NotifyRxEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('NotifyRxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiPhyRxfailureReason', 'reason')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
+    cls.add_method('NotifyMonitorSniffRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, uint16_t staId=65535) [member function]
+    cls.add_method('NotifyMonitorSniffTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')])
+    ## wifi-phy.h (module 'wifi'): int64_t ns3::WifiPhy::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxSensitivity(double threshold) [member function]
+    cls.add_method('SetRxSensitivity', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxSensitivity() const [member function]
+    cls.add_method('GetRxSensitivity', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate2Mbps() [member function]
-    cls.add_method('GetDsssRate2Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCcaEdThreshold(double threshold) [member function]
+    cls.add_method('SetCcaEdThreshold', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetCcaEdThreshold() const [member function]
+    cls.add_method('GetCcaEdThreshold', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate5_5Mbps() [member function]
-    cls.add_method('GetDsssRate5_5Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
+    cls.add_method('SetRxNoiseFigure', 
+                   'void', 
+                   [param('double', 'noiseFigureDb')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerStart(double start) [member function]
+    cls.add_method('SetTxPowerStart', 
+                   'void', 
+                   [param('double', 'start')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerStart() const [member function]
+    cls.add_method('GetTxPowerStart', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate11Mbps() [member function]
-    cls.add_method('GetDsssRate11Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerEnd(double end) [member function]
+    cls.add_method('SetTxPowerEnd', 
+                   'void', 
+                   [param('double', 'end')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerEnd() const [member function]
+    cls.add_method('GetTxPowerEnd', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate6Mbps() [member function]
-    cls.add_method('GetErpOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNTxPower(uint8_t n) [member function]
+    cls.add_method('SetNTxPower', 
+                   'void', 
+                   [param('uint8_t', 'n')])
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate9Mbps() [member function]
-    cls.add_method('GetErpOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxGain(double gain) [member function]
+    cls.add_method('SetTxGain', 
+                   'void', 
+                   [param('double', 'gain')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxGain() const [member function]
+    cls.add_method('GetTxGain', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate12Mbps() [member function]
-    cls.add_method('GetErpOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxGain(double gain) [member function]
+    cls.add_method('SetRxGain', 
+                   'void', 
+                   [param('double', 'gain')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxGain() const [member function]
+    cls.add_method('GetRxGain', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate18Mbps() [member function]
-    cls.add_method('GetErpOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiPhy::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate24Mbps() [member function]
-    cls.add_method('GetErpOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> const mobility) [member function]
+    cls.add_method('SetMobility', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel > const', 'mobility')])
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::WifiPhy::GetMobility() const [member function]
+    cls.add_method('GetMobility', 
+                   'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate36Mbps() [member function]
-    cls.add_method('GetErpOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(uint8_t number, uint16_t frequency, uint16_t width) [member function]
+    cls.add_method('SetOperatingChannel', 
+                   'void', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('uint16_t', 'freq')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate48Mbps() [member function]
-    cls.add_method('GetErpOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPrimary20Index(uint8_t index) [member function]
+    cls.add_method('SetPrimary20Index', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
+    cls.add_method('SetNumberOfAntennas', 
+                   'void', 
+                   [param('uint8_t', 'antennas')])
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNumberOfAntennas() const [member function]
+    cls.add_method('GetNumberOfAntennas', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate54Mbps() [member function]
-    cls.add_method('GetErpOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedTxSpatialStreams(uint8_t streams) [member function]
+    cls.add_method('SetMaxSupportedTxSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'streams')])
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedTxSpatialStreams() const [member function]
+    cls.add_method('GetMaxSupportedTxSpatialStreams', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedRxSpatialStreams(uint8_t streams) [member function]
+    cls.add_method('SetMaxSupportedRxSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'streams')])
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedRxSpatialStreams() const [member function]
+    cls.add_method('GetMaxSupportedRxSpatialStreams', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
-    cls.add_method('GetOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetShortPhyPreambleSupported(bool preamble) [member function]
+    cls.add_method('SetShortPhyPreambleSupported', 
+                   'void', 
+                   [param('bool', 'preamble')])
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetShortPhyPreambleSupported() const [member function]
+    cls.add_method('GetShortPhyPreambleSupported', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> const rate) [member function]
+    cls.add_method('SetErrorRateModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorRateModel > const', 'rate')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPostReceptionErrorModel(ns3::Ptr<ns3::ErrorModel> const em) [member function]
+    cls.add_method('SetPostReceptionErrorModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorModel > const', 'em')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrameCaptureModel(ns3::Ptr<ns3::FrameCaptureModel> const frameCaptureModel) [member function]
+    cls.add_method('SetFrameCaptureModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::FrameCaptureModel > const', 'frameCaptureModel')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPreambleDetectionModel(ns3::Ptr<ns3::PreambleDetectionModel> const preambleDetectionModel) [member function]
+    cls.add_method('SetPreambleDetectionModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PreambleDetectionModel > const', 'preambleDetectionModel')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetWifiRadioEnergyModel(ns3::Ptr<ns3::WifiRadioEnergyModel> const wifiRadioEnergyModel) [member function]
+    cls.add_method('SetWifiRadioEnergyModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRadioEnergyModel > const', 'wifiRadioEnergyModel')])
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddSupportedChannelWidth(uint16_t width) [member function]
+    cls.add_method('AddSupportedChannelWidth', 
+                   'void', 
+                   [param('uint16_t', 'width')])
+    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'std::vector< unsigned short >', 
                    [], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetPowerDbm(uint8_t power) const [member function]
+    cls.add_method('GetPowerDbm', 
+                   'double', 
+                   [param('uint8_t', 'power')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetCca(bool powerRestricted, double txPowerMaxSiso=0, double txPowerMaxMimo=0) [member function]
+    cls.add_method('ResetCca', 
+                   'void', 
+                   [param('bool', 'powerRestricted'), param('double', 'txPowerMaxSiso', default_value='0'), param('double', 'txPowerMaxMimo', default_value='0')])
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerForTransmission(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerForTransmission', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyChannelAccessRequested() [member function]
+    cls.add_method('NotifyChannelAccessRequested', 
+                   'void', 
+                   [])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t bandWidth, uint16_t guardBandwidth, ns3::HeRu::SubcarrierRange range, uint8_t bandIndex=0) const [member function]
+    cls.add_method('ConvertHeRuSubcarriers', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< short, short >', 'range'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static void ns3::WifiPhy::AddStaticPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
+    cls.add_method('AddStaticPhyEntity', 
+                   'void', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
+    ## wifi-phy.h (module 'wifi'): static ns3::Ptr<const ns3::PhyEntity> const ns3::WifiPhy::GetStaticPhyEntity(ns3::WifiModulationClass modulation) [member function]
+    cls.add_method('GetStaticPhyEntity', 
+                   'ns3::Ptr< ns3::PhyEntity const > const', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::PhyEntity> ns3::WifiPhy::GetPhyEntity(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetPhyEntity', 
+                   'ns3::Ptr< ns3::PhyEntity >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint64_t ns3::WifiPhy::GetPreviouslyRxPpduUid() const [member function]
+    cls.add_method('GetPreviouslyRxPpduUid', 
+                   'uint64_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): std::tuple<double, double, double> ns3::WifiPhy::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_virtual=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::DoChannelSwitch() [member function]
+    cls.add_method('DoChannelSwitch', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy(uint16_t channelWidth) [member function]
+    cls.add_method('SwitchMaybeToCcaBusy', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')], 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
+    cls.add_method('GetBand', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetPrimaryBand(uint16_t bandWidth) [member function]
+    cls.add_method('GetPrimaryBand', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth')], 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
+    cls.add_method('AddPhyEntity', 
+                   'void', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
+                   visibility='protected')
+    return
+
+def register_Ns3WifiPhyStateHelper_methods(root_module, cls):
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper(ns3::WifiPhyStateHelper const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhyStateHelper const &', 'arg0')])
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::ContinueRxNextMpdu(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('ContinueRxNextMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetDelayUntilIdle() const [member function]
+    cls.add_method('GetDelayUntilIdle', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxEndTime() const [member function]
+    cls.add_method('GetLastRxEndTime', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): WifiPhyState ns3::WifiPhyStateHelper::GetState() const [member function]
+    cls.add_method('GetState', 
+                   'WifiPhyState', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): static ns3::TypeId ns3::WifiPhyStateHelper::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateCcaBusy() const [member function]
+    cls.add_method('IsStateCcaBusy', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateIdle() const [member function]
+    cls.add_method('IsStateIdle', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateOff() const [member function]
+    cls.add_method('IsStateOff', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateRx() const [member function]
+    cls.add_method('IsStateRx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSleep() const [member function]
+    cls.add_method('IsStateSleep', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSwitching() const [member function]
+    cls.add_method('IsStateSwitching', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateTx() const [member function]
+    cls.add_method('IsStateTx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::RegisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('RegisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
+    cls.add_method('SetReceiveErrorCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
+    cls.add_method('SetReceiveOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromOff(ns3::Time duration) [member function]
+    cls.add_method('SwitchFromOff', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxAbort() [member function]
+    cls.add_method('SwitchFromRxAbort', 
+                   'void', 
+                   [])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndError(ns3::Ptr<ns3::WifiPsdu> psdu, double snr) [member function]
+    cls.add_method('SwitchFromRxEndError', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
+    cls.add_method('SwitchFromRxEndOk', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromSleep(ns3::Time duration) [member function]
+    cls.add_method('SwitchFromSleep', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchMaybeToCcaBusy(ns3::Time duration) [member function]
+    cls.add_method('SwitchMaybeToCcaBusy', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToChannelSwitching(ns3::Time switchingDuration) [member function]
+    cls.add_method('SwitchToChannelSwitching', 
+                   'void', 
+                   [param('ns3::Time', 'switchingDuration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToOff() [member function]
+    cls.add_method('SwitchToOff', 
+                   'void', 
+                   [])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToRx(ns3::Time rxDuration) [member function]
+    cls.add_method('SwitchToRx', 
+                   'void', 
+                   [param('ns3::Time', 'rxDuration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToSleep() [member function]
+    cls.add_method('SwitchToSleep', 
+                   'void', 
+                   [])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToTx(ns3::Time txDuration, ns3::WifiConstPsduMap psdus, double txPowerDbm, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('SwitchToTx', 
+                   'void', 
+                   [param('ns3::Time', 'txDuration'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('UnregisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')])
+    return
+
+def register_Ns3WifiPpdu_methods(root_module, cls):
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPpdu const &', 'arg0')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, uint64_t uid=(18446744073709551615UL)) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('uint64_t', 'uid', default_value='(18446744073709551615UL)')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('uint64_t', 'uid')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::WifiPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiPpdu::GetModulation() const [member function]
+    cls.add_method('GetModulation', 
+                   'ns3::WifiModulationClass', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
-    cls.add_method('GetHtMcs0', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
-    cls.add_method('GetHtMcs1', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
-    cls.add_method('GetHtMcs2', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
-    cls.add_method('GetHtMcs3', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
-    cls.add_method('GetHtMcs4', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
-    cls.add_method('GetHtMcs5', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
-    cls.add_method('GetHtMcs6', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
-    cls.add_method('GetHtMcs7', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
-    cls.add_method('GetHtMcs8', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
-    cls.add_method('GetHtMcs9', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
-    cls.add_method('GetHtMcs10', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
-    cls.add_method('GetHtMcs11', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
-    cls.add_method('GetHtMcs12', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
-    cls.add_method('GetHtMcs13', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
-    cls.add_method('GetHtMcs14', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
-    cls.add_method('GetHtMcs15', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
-    cls.add_method('GetHtMcs16', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPreamble ns3::WifiPpdu::GetPreamble() const [member function]
+    cls.add_method('GetPreamble', 
+                   'ns3::WifiPreamble', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
-    cls.add_method('GetHtMcs17', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::WifiPpdu::GetPsdu() const [member function]
+    cls.add_method('GetPsdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
-    cls.add_method('GetHtMcs18', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): uint16_t ns3::WifiPpdu::GetStaId() const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
-    cls.add_method('GetHtMcs19', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
-    cls.add_method('GetHtMcs20', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::GetTxVector() const [member function]
+    cls.add_method('GetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
-    cls.add_method('GetHtMcs21', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpduType ns3::WifiPpdu::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::WifiPpduType', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
-    cls.add_method('GetHtMcs22', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): uint64_t ns3::WifiPpdu::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
-    cls.add_method('GetHtMcs23', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsTruncatedTx() const [member function]
+    cls.add_method('IsTruncatedTx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
-    cls.add_method('GetHtMcs24', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::SetTruncatedTx() [member function]
+    cls.add_method('SetTruncatedTx', 
+                   'void', 
+                   [])
+    ## wifi-ppdu.h (module 'wifi'): std::string ns3::WifiPpdu::PrintPayload() const [member function]
+    cls.add_method('PrintPayload', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
-    cls.add_method('GetHtMcs25', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
-    cls.add_method('GetHtMcs26', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3WifiProtectionManager_methods(root_module, cls):
+    ## wifi-protection-manager.h (module 'wifi'): ns3::WifiProtectionManager::WifiProtectionManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection-manager.h (module 'wifi'): ns3::WifiProtectionManager::WifiProtectionManager(ns3::WifiProtectionManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiProtectionManager const &', 'arg0')])
+    ## wifi-protection-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiProtectionManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
-    cls.add_method('GetHtMcs27', 
-                   'ns3::WifiMode', 
+    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    cls.add_method('SetWifiMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAddMpdu', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
-    cls.add_method('GetHtMcs28', 
-                   'ns3::WifiMode', 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3WifiPsdu_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::WifiPsdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPsdu const &', 'arg0')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::Packet> p, ns3::WifiMacHeader const & header) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('bool', 'isSingle')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('bool', 'isSingle')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [constructor]
+    cls.add_constructor([param('std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiPsdu::GetAckPolicyForTid(uint8_t tid) const [member function]
+    cls.add_method('GetAckPolicyForTid', 
+                   'ns3::WifiMacHeader::QosAckPolicy', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr1() const [member function]
+    cls.add_method('GetAddr1', 
+                   'ns3::Mac48Address', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
-    cls.add_method('GetHtMcs29', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr2() const [member function]
+    cls.add_method('GetAddr2', 
+                   'ns3::Mac48Address', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
-    cls.add_method('GetHtMcs30', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiPsdu::GetAmpduSubframe(std::size_t i) const [member function]
+    cls.add_method('GetAmpduSubframe', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetAmpduSubframeSize(std::size_t i) const [member function]
+    cls.add_method('GetAmpduSubframeSize', 
+                   'std::size_t', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetDuration() const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
-    cls.add_method('GetHtMcs31', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader const & ns3::WifiPsdu::GetHeader(std::size_t i) const [member function]
+    cls.add_method('GetHeader', 
+                   'ns3::WifiMacHeader const &', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader & ns3::WifiPsdu::GetHeader(std::size_t i) [member function]
+    cls.add_method('GetHeader', 
+                   'ns3::WifiMacHeader &', 
+                   [param('std::size_t', 'i')])
+    ## wifi-psdu.h (module 'wifi'): uint16_t ns3::WifiPsdu::GetMaxDistFromStartingSeq(uint16_t startingSeq) const [member function]
+    cls.add_method('GetMaxDistFromStartingSeq', 
+                   'uint16_t', 
+                   [param('uint16_t', 'startingSeq')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetNMpdus() const [member function]
+    cls.add_method('GetNMpdus', 
+                   'std::size_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
-    cls.add_method('GetVhtMcs0', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPacket() const [member function]
+    cls.add_method('GetPacket', 
+                   'ns3::Ptr< ns3::Packet const >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
-    cls.add_method('GetVhtMcs1', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPayload(std::size_t i) const [member function]
+    cls.add_method('GetPayload', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): uint32_t ns3::WifiPsdu::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
-    cls.add_method('GetVhtMcs2', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > ns3::WifiPsdu::GetTids() const [member function]
+    cls.add_method('GetTids', 
+                   'std::set< unsigned char >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
-    cls.add_method('GetVhtMcs3', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetTimeStamp(std::size_t i) const [member function]
+    cls.add_method('GetTimeStamp', 
+                   'ns3::Time', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsAggregate() const [member function]
+    cls.add_method('IsAggregate', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
-    cls.add_method('GetVhtMcs4', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsSingle() const [member function]
+    cls.add_method('IsSingle', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
-    cls.add_method('GetVhtMcs5', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetAckPolicyForTid(uint8_t tid, ns3::WifiMacHeader::QosAckPolicy policy) [member function]
+    cls.add_method('SetAckPolicyForTid', 
+                   'void', 
+                   [param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
+    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetDuration(ns3::Time duration) [member function]
+    cls.add_method('SetDuration', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::begin() const [member function]
+    cls.add_method('begin', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
-    cls.add_method('GetVhtMcs6', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::begin() [member function]
+    cls.add_method('begin', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
+                   [])
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::end() const [member function]
+    cls.add_method('end', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
-    cls.add_method('GetVhtMcs7', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
-    cls.add_method('GetVhtMcs8', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
-    cls.add_method('GetVhtMcs9', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs0() [member function]
-    cls.add_method('GetHeMcs0', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs1() [member function]
-    cls.add_method('GetHeMcs1', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs2() [member function]
-    cls.add_method('GetHeMcs2', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs3() [member function]
-    cls.add_method('GetHeMcs3', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs4() [member function]
-    cls.add_method('GetHeMcs4', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs5() [member function]
-    cls.add_method('GetHeMcs5', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs6() [member function]
-    cls.add_method('GetHeMcs6', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs7() [member function]
-    cls.add_method('GetHeMcs7', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs8() [member function]
-    cls.add_method('GetHeMcs8', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs9() [member function]
-    cls.add_method('GetHeMcs9', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs10() [member function]
-    cls.add_method('GetHeMcs10', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs11() [member function]
-    cls.add_method('GetHeMcs11', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::WifiConstPsduMap psdus, double txPowerW) [member function]
-    cls.add_method('NotifyTxBegin', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::end() [member function]
+    cls.add_method('end', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
+                   [])
+    return
+
+def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedMcs(ns3::Mac48Address address) [member function]
+    cls.add_method('AddAllSupportedMcs', 
                    'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxEnd(ns3::WifiConstPsduMap psdus) [member function]
-    cls.add_method('NotifyTxEnd', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedModes(ns3::Mac48Address address) [member function]
+    cls.add_method('AddAllSupportedModes', 
                    'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
-    cls.add_method('NotifyTxDrop', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
+    cls.add_method('AddBasicMcs', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
-    cls.add_method('NotifyRxBegin', 
+                   [param('ns3::WifiMode', 'mcs')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
+    cls.add_method('AddBasicMode', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
-    cls.add_method('NotifyRxEnd', 
+                   [param('ns3::WifiMode', 'mode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHeCapabilities(ns3::Mac48Address from, ns3::HeCapabilities heCapabilities) [member function]
+    cls.add_method('AddStationHeCapabilities', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiPhyRxfailureReason reason) [member function]
-    cls.add_method('NotifyRxDrop', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::HeCapabilities', 'heCapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHtCapabilities(ns3::Mac48Address from, ns3::HtCapabilities htCapabilities) [member function]
+    cls.add_method('AddStationHtCapabilities', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiPhyRxfailureReason', 'reason')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
-    cls.add_method('NotifyMonitorSniffRx', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htCapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtCapabilities) [member function]
+    cls.add_method('AddStationVhtCapabilities', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, uint16_t staId=65535) [member function]
-    cls.add_method('NotifyMonitorSniffTx', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtCapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedErpSlotTime(ns3::Mac48Address address, bool isShortSlotTimeSupported) [member function]
+    cls.add_method('AddSupportedErpSlotTime', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyEndOfHePreamble(ns3::HePreambleParameters params) [member function]
-    cls.add_method('NotifyEndOfHePreamble', 
+                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortSlotTimeSupported')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
+    cls.add_method('AddSupportedMcs', 
                    'void', 
-                   [param('ns3::HePreambleParameters', 'params')])
-    ## wifi-phy.h (module 'wifi'): int64_t ns3::WifiPhy::AssignStreams(int64_t stream) [member function]
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
+    cls.add_method('AddSupportedMode', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedPhyPreamble(ns3::Mac48Address address, bool isShortPreambleSupported) [member function]
+    cls.add_method('AddSupportedPhyPreamble', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortPreambleSupported')])
+    ## wifi-remote-station-manager.h (module 'wifi'): int64_t ns3::WifiRemoteStationManager::AssignStreams(int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxSensitivity(double threshold) [member function]
-    cls.add_method('SetRxSensitivity', 
-                   'void', 
-                   [param('double', 'threshold')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxSensitivity() const [member function]
-    cls.add_method('GetRxSensitivity', 
-                   'double', 
-                   [], 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCcaEdThreshold(double threshold) [member function]
-    cls.add_method('SetCcaEdThreshold', 
-                   'void', 
-                   [param('double', 'threshold')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetCcaEdThreshold() const [member function]
-    cls.add_method('GetCcaEdThreshold', 
-                   'double', 
-                   [], 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint8_t i) const [member function]
+    cls.add_method('GetBasicMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'i')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
-    cls.add_method('SetRxNoiseFigure', 
-                   'void', 
-                   [param('double', 'noiseFigureDb')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerStart(double start) [member function]
-    cls.add_method('SetTxPowerStart', 
-                   'void', 
-                   [param('double', 'start')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerStart() const [member function]
-    cls.add_method('GetTxPowerStart', 
-                   'double', 
-                   [], 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint8_t i) const [member function]
+    cls.add_method('GetBasicMode', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'i')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerEnd(double end) [member function]
-    cls.add_method('SetTxPowerEnd', 
-                   'void', 
-                   [param('double', 'end')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerEnd() const [member function]
-    cls.add_method('GetTxPowerEnd', 
-                   'double', 
-                   [], 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetBlockAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetBlockAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNTxPower(uint8_t n) [member function]
-    cls.add_method('SetNTxPower', 
-                   'void', 
-                   [param('uint8_t', 'n')])
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNTxPower() const [member function]
-    cls.add_method('GetNTxPower', 
-                   'uint8_t', 
-                   [], 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetChannelWidthSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetChannelWidthSupported', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxGain(double gain) [member function]
-    cls.add_method('SetTxGain', 
-                   'void', 
-                   [param('double', 'gain')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxGain() const [member function]
-    cls.add_method('GetTxGain', 
-                   'double', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetControlAnswerMode(ns3::WifiMode reqMode) const [member function]
+    cls.add_method('GetControlAnswerMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'reqMode')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector() [member function]
+    cls.add_method('GetCtsToSelfTxVector', 
+                   'ns3::WifiTxVector', 
+                   [])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsTxVector(ns3::Mac48Address to, ns3::WifiMode rtsTxMode) const [member function]
+    cls.add_method('GetCtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiMode', 'rtsTxMode')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetDataTxVector(ns3::WifiMacHeader const & header) [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    cls.add_method('GetDefaultMcs', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxGain(double gain) [member function]
-    cls.add_method('SetRxGain', 
-                   'void', 
-                   [param('double', 'gain')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxGain() const [member function]
-    cls.add_method('GetRxGain', 
-                   'double', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
+    cls.add_method('GetDefaultMode', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
-    cls.add_method('SetDevice', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiPhy::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
+    cls.add_method('GetDefaultTxPowerLevel', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> const mobility) [member function]
-    cls.add_method('SetMobility', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel > const', 'mobility')])
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::WifiPhy::GetMobility() const [member function]
-    cls.add_method('GetMobility', 
-                   'ns3::Ptr< ns3::MobilityModel >', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetDsssSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetErpOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetErpOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
+    cls.add_method('GetFragmentOffset', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
+    cls.add_method('GetFragmentSize', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentationThreshold() const [member function]
+    cls.add_method('GetFragmentationThreshold', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('uint16_t', 'freq')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
-    cls.add_method('GetFrequency', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
-    cls.add_method('SetNumberOfAntennas', 
-                   'void', 
-                   [param('uint8_t', 'antennas')])
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNumberOfAntennas() const [member function]
-    cls.add_method('GetNumberOfAntennas', 
-                   'uint8_t', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedTxSpatialStreams(uint8_t streams) [member function]
-    cls.add_method('SetMaxSupportedTxSpatialStreams', 
-                   'void', 
-                   [param('uint8_t', 'streams')])
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedTxSpatialStreams() const [member function]
-    cls.add_method('GetMaxSupportedTxSpatialStreams', 
-                   'uint8_t', 
-                   [], 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedRxSpatialStreams(uint8_t streams) [member function]
-    cls.add_method('SetMaxSupportedRxSpatialStreams', 
-                   'void', 
-                   [param('uint8_t', 'streams')])
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedRxSpatialStreams() const [member function]
-    cls.add_method('GetMaxSupportedRxSpatialStreams', 
-                   'uint8_t', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetShortPhyPreambleSupported(bool preamble) [member function]
-    cls.add_method('SetShortPhyPreambleSupported', 
-                   'void', 
-                   [param('bool', 'preamble')])
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetShortPhyPreambleSupported() const [member function]
-    cls.add_method('GetShortPhyPreambleSupported', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetHtSupported', 
                    'bool', 
-                   [], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> const rate) [member function]
-    cls.add_method('SetErrorRateModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ErrorRateModel > const', 'rate')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPostReceptionErrorModel(ns3::Ptr<ns3::ErrorModel> const em) [member function]
-    cls.add_method('SetPostReceptionErrorModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ErrorModel > const', 'em')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrameCaptureModel(ns3::Ptr<ns3::FrameCaptureModel> const frameCaptureModel) [member function]
-    cls.add_method('SetFrameCaptureModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::FrameCaptureModel > const', 'frameCaptureModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPreambleDetectionModel(ns3::Ptr<ns3::PreambleDetectionModel> const preambleDetectionModel) [member function]
-    cls.add_method('SetPreambleDetectionModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::PreambleDetectionModel > const', 'preambleDetectionModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetWifiRadioEnergyModel(ns3::Ptr<ns3::WifiRadioEnergyModel> const wifiRadioEnergyModel) [member function]
-    cls.add_method('SetWifiRadioEnergyModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRadioEnergyModel > const', 'wifiRadioEnergyModel')])
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo ns3::WifiRemoteStationManager::GetInfo(ns3::Mac48Address address) [member function]
+    cls.add_method('GetInfo', 
+                   'ns3::WifiRemoteStationInfo', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported() const [member function]
+    cls.add_method('GetLdpcSupported', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddSupportedChannelWidth(uint16_t width) [member function]
-    cls.add_method('AddSupportedChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'width')])
-    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
-    cls.add_method('GetSupportedChannelWidthSet', 
-                   'std::vector< unsigned short >', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetLdpcSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
+    cls.add_method('GetMac', 
+                   'ns3::Ptr< ns3::WifiMac >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetPowerDbm(uint8_t power) const [member function]
-    cls.add_method('GetPowerDbm', 
-                   'double', 
-                   [param('uint8_t', 'power')], 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMaxNumberOfTransmitStreams() const [member function]
+    cls.add_method('GetMaxNumberOfTransmitStreams', 
+                   'uint8_t', 
+                   [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetCca(bool powerRestricted, double txPowerMaxSiso=0, double txPowerMaxMimo=0) [member function]
-    cls.add_method('ResetCca', 
-                   'void', 
-                   [param('bool', 'powerRestricted'), param('double', 'txPowerMaxSiso', default_value='0'), param('double', 'txPowerMaxMimo', default_value='0')])
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerForTransmission(ns3::WifiTxVector txVector) const [member function]
-    cls.add_method('GetTxPowerForTransmission', 
+    ## wifi-remote-station-manager.h (module 'wifi'): double ns3::WifiRemoteStationManager::GetMostRecentRssi(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetMostRecentRssi', 
                    'double', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyChannelAccessRequested() [member function]
-    cls.add_method('NotifyChannelAccessRequested', 
-                   'void', 
-                   [])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DoChannelSwitch(uint8_t id) [member function]
-    cls.add_method('DoChannelSwitch', 
-                   'bool', 
-                   [param('uint8_t', 'id')], 
-                   visibility='protected')
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DoFrequencySwitch(uint16_t frequency) [member function]
-    cls.add_method('DoFrequencySwitch', 
-                   'bool', 
-                   [param('uint16_t', 'frequency')], 
-                   visibility='protected')
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy() [member function]
-    cls.add_method('SwitchMaybeToCcaBusy', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetStaId() const [member function]
-    cls.add_method('GetStaId', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
-    cls.add_method('GetBand', 
-                   'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t channelWidth, ns3::HeRu::SubcarrierRange range) const [member function]
-    cls.add_method('ConvertHeRuSubcarriers', 
-                   'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'channelWidth'), param('std::pair< short, short >', 'range')], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    return
-
-def register_Ns3WifiPhyStateHelper_methods(root_module, cls):
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper(ns3::WifiPhyStateHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPhyStateHelper const &', 'arg0')])
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::ContinueRxNextMpdu(ns3::Ptr<ns3::WifiPsdu> psdu, double snr, ns3::WifiTxVector txVector) [member function]
-    cls.add_method('ContinueRxNextMpdu', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetDelayUntilIdle() const [member function]
-    cls.add_method('GetDelayUntilIdle', 
-                   'ns3::Time', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicMcs() const [member function]
+    cls.add_method('GetNBasicMcs', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxEndTime() const [member function]
-    cls.add_method('GetLastRxEndTime', 
-                   'ns3::Time', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicModes() const [member function]
+    cls.add_method('GetNBasicModes', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetNMcsSupported', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNNonErpBasicModes() const [member function]
+    cls.add_method('GetNNonErpBasicModes', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): WifiPhyState ns3::WifiPhyStateHelper::GetState() const [member function]
-    cls.add_method('GetState', 
-                   'WifiPhyState', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonErpBasicMode(uint8_t i) const [member function]
+    cls.add_method('GetNonErpBasicMode', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'i')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonUnicastMode() const [member function]
+    cls.add_method('GetNonUnicastMode', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): static ns3::TypeId ns3::WifiPhyStateHelper::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfAntennas() const [member function]
+    cls.add_method('GetNumberOfAntennas', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateCcaBusy() const [member function]
-    cls.add_method('IsStateCcaBusy', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetNumberOfSupportedStreams', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetOfdmSupported', 
                    'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
+    cls.add_method('GetPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateIdle() const [member function]
-    cls.add_method('IsStateIdle', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetQosSupported', 
                    'bool', 
-                   [], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateOff() const [member function]
-    cls.add_method('IsStateOff', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetRtsTxVector(ns3::Mac48Address address) [member function]
+    cls.add_method('GetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported() const [member function]
+    cls.add_method('GetShortGuardIntervalSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateRx() const [member function]
-    cls.add_method('IsStateRx', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetShortGuardIntervalSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleEnabled() const [member function]
+    cls.add_method('GetShortPreambleEnabled', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSleep() const [member function]
-    cls.add_method('IsStateSleep', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetShortPreambleSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeEnabled() const [member function]
+    cls.add_method('GetShortSlotTimeEnabled', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSwitching() const [member function]
-    cls.add_method('IsStateSwitching', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HeCapabilities> ns3::WifiRemoteStationManager::GetStationHeCapabilities(ns3::Mac48Address from) [member function]
+    cls.add_method('GetStationHeCapabilities', 
+                   'ns3::Ptr< ns3::HeCapabilities const >', 
+                   [param('ns3::Mac48Address', 'from')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HtCapabilities> ns3::WifiRemoteStationManager::GetStationHtCapabilities(ns3::Mac48Address from) [member function]
+    cls.add_method('GetStationHtCapabilities', 
+                   'ns3::Ptr< ns3::HtCapabilities const >', 
+                   [param('ns3::Mac48Address', 'from')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::VhtCapabilities> ns3::WifiRemoteStationManager::GetStationVhtCapabilities(ns3::Mac48Address from) [member function]
+    cls.add_method('GetStationVhtCapabilities', 
+                   'ns3::Ptr< ns3::VhtCapabilities const >', 
+                   [param('ns3::Mac48Address', 'from')])
+    ## wifi-remote-station-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiRemoteStationManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonErpProtection() const [member function]
+    cls.add_method('GetUseNonErpProtection', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateTx() const [member function]
-    cls.add_method('IsStateTx', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonHtProtection() const [member function]
+    cls.add_method('GetUseNonHtProtection', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::RegisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('RegisterListener', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsAssociated', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsBrandNew(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsBrandNew', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
+    cls.add_method('IsLastFragment', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsWaitAssocTxOk(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsWaitAssocTxOk', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedCtsToSelf(ns3::WifiTxVector txVector) [member function]
+    cls.add_method('NeedCtsToSelf', 
+                   'bool', 
+                   [param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NeedFragmentation', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NeedRetransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::WifiMacHeader const & header, uint32_t size) [member function]
+    cls.add_method('NeedRts', 
+                   'bool', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordDisassociated(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordDisassociated', 
                    'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
-    cls.add_method('SetReceiveErrorCallback', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxFailed(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordGotAssocTxFailed', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
-    cls.add_method('SetReceiveOkCallback', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxOk(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordGotAssocTxOk', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromOff(ns3::Time duration) [member function]
-    cls.add_method('SwitchFromOff', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordWaitAssocTxOk(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordWaitAssocTxOk', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxAbort() [member function]
-    cls.add_method('SwitchFromRxAbort', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RemoveAllSupportedMcs(ns3::Mac48Address address) [member function]
+    cls.add_method('RemoveAllSupportedMcs', 
                    'void', 
-                   [])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndError(ns3::Ptr<ns3::WifiPsdu> psdu, double snr) [member function]
-    cls.add_method('SwitchFromRxEndError', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+    cls.add_method('ReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, double snr, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
-    cls.add_method('SwitchFromRxEndOk', 
+                   [param('ns3::Mac48Address', 'address'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('ReportDataFailed', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromSleep(ns3::Time duration) [member function]
-    cls.add_method('SwitchFromSleep', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+    cls.add_method('ReportDataOk', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchMaybeToCcaBusy(ns3::Time duration) [member function]
-    cls.add_method('SwitchMaybeToCcaBusy', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('ReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToChannelSwitching(ns3::Time switchingDuration) [member function]
-    cls.add_method('SwitchToChannelSwitching', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::WifiMacHeader const & header) [member function]
+    cls.add_method('ReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Time', 'switchingDuration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToOff() [member function]
-    cls.add_method('SwitchToOff', 
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::WifiMacHeader const & header) [member function]
+    cls.add_method('ReportRtsFailed', 
                    'void', 
-                   [])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToRx(ns3::Time rxDuration) [member function]
-    cls.add_method('SwitchToRx', 
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::WifiMacHeader const & header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('ReportRtsOk', 
                    'void', 
-                   [param('ns3::Time', 'rxDuration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToSleep() [member function]
-    cls.add_method('SwitchToSleep', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('ReportRxOk', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::Reset() [member function]
+    cls.add_method('Reset', 
                    'void', 
                    [])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToTx(ns3::Time txDuration, ns3::WifiConstPsduMap psdus, double txPowerDbm, ns3::WifiTxVector txVector) [member function]
-    cls.add_method('SwitchToTx', 
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
+    cls.add_method('SetDefaultTxPowerLevel', 
                    'void', 
-                   [param('ns3::Time', 'txDuration'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('UnregisterListener', 
+                   [param('uint8_t', 'txPower')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetFragmentationThreshold(uint32_t threshold) [member function]
+    cls.add_method('SetFragmentationThreshold', 
                    'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')])
-    return
-
-def register_Ns3WifiPpdu_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiPpdu const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPpdu const &', 'arg0')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band) [constructor]
-    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiPpdu::GetModulation() const [member function]
-    cls.add_method('GetModulation', 
-                   'ns3::WifiModulationClass', 
-                   [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::WifiPpdu::GetPsdu(uint8_t bssColor=64, uint16_t staId=65535) const [member function]
-    cls.add_method('GetPsdu', 
-                   'ns3::Ptr< ns3::WifiPsdu const >', 
-                   [param('uint8_t', 'bssColor', default_value='64'), param('uint16_t', 'staId', default_value='65535')], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
-    cls.add_method('GetTxDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::GetTxVector() const [member function]
-    cls.add_method('GetTxVector', 
-                   'ns3::WifiTxVector', 
-                   [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsMu() const [member function]
-    cls.add_method('IsMu', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsTruncatedTx() const [member function]
-    cls.add_method('IsTruncatedTx', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
+                   [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSlrc(uint32_t maxSlrc) [member function]
+    cls.add_method('SetMaxSlrc', 
                    'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::SetTruncatedTx() [member function]
-    cls.add_method('SetTruncatedTx', 
+                   [param('uint32_t', 'maxSlrc')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
+    cls.add_method('SetMaxSsrc', 
                    'void', 
-                   [])
-    return
-
-def register_Ns3WifiPsdu_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::WifiPsdu const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPsdu const &', 'arg0')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::Packet> p, ns3::WifiMacHeader const & header) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::WifiMacHeader const &', 'header')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('bool', 'isSingle')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('bool', 'isSingle')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [constructor]
-    cls.add_constructor([param('std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiPsdu::GetAckPolicyForTid(uint8_t tid) const [member function]
-    cls.add_method('GetAckPolicyForTid', 
-                   'ns3::WifiMacHeader::QosAckPolicy', 
-                   [param('uint8_t', 'tid')], 
+                   [param('uint32_t', 'maxSsrc')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
+    cls.add_method('SetQosSupport', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('bool', 'qosSupported')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetRtsCtsThreshold(uint32_t threshold) [member function]
+    cls.add_method('SetRtsCtsThreshold', 
+                   'void', 
+                   [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortPreambleEnabled(bool enable) [member function]
+    cls.add_method('SetShortPreambleEnabled', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortSlotTimeEnabled(bool enable) [member function]
+    cls.add_method('SetShortSlotTimeEnabled', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonErpProtection(bool enable) [member function]
+    cls.add_method('SetUseNonErpProtection', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonHtProtection(bool enable) [member function]
+    cls.add_method('SetUseNonHtProtection', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetupMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseLdpcForDestination(ns3::Mac48Address dest) const [member function]
+    cls.add_method('UseLdpcForDestination', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'dest')], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr1() const [member function]
-    cls.add_method('GetAddr1', 
-                   'ns3::Mac48Address', 
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr2() const [member function]
-    cls.add_method('GetAddr2', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiPsdu::GetAmpduSubframe(std::size_t i) const [member function]
-    cls.add_method('GetAmpduSubframe', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetAmpduSubframeSize(std::size_t i) const [member function]
-    cls.add_method('GetAmpduSubframeSize', 
-                   'std::size_t', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetDuration() const [member function]
-    cls.add_method('GetDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader const & ns3::WifiPsdu::GetHeader(std::size_t i) const [member function]
-    cls.add_method('GetHeader', 
-                   'ns3::WifiMacHeader const &', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader & ns3::WifiPsdu::GetHeader(std::size_t i) [member function]
-    cls.add_method('GetHeader', 
-                   'ns3::WifiMacHeader &', 
-                   [param('std::size_t', 'i')])
-    ## wifi-psdu.h (module 'wifi'): uint16_t ns3::WifiPsdu::GetMaxDistFromStartingSeq(uint16_t startingSeq) const [member function]
-    cls.add_method('GetMaxDistFromStartingSeq', 
-                   'uint16_t', 
-                   [param('uint16_t', 'startingSeq')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetNMpdus() const [member function]
-    cls.add_method('GetNMpdus', 
-                   'std::size_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet const >', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPayload(std::size_t i) const [member function]
-    cls.add_method('GetPayload', 
-                   'ns3::Ptr< ns3::Packet const >', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): uint32_t ns3::WifiPsdu::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > ns3::WifiPsdu::GetTids() const [member function]
-    cls.add_method('GetTids', 
-                   'std::set< unsigned char >', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetTimeStamp(std::size_t i) const [member function]
-    cls.add_method('GetTimeStamp', 
-                   'ns3::Time', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsAggregate() const [member function]
-    cls.add_method('IsAggregate', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsSingle() const [member function]
-    cls.add_method('IsSingle', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetAckPolicyForTid(uint8_t tid, ns3::WifiMacHeader::QosAckPolicy policy) [member function]
-    cls.add_method('SetAckPolicyForTid', 
-                   'void', 
-                   [param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
-    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetDuration(ns3::Time duration) [member function]
-    cls.add_method('SetDuration', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::begin() const [member function]
-    cls.add_method('begin', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::begin() [member function]
-    cls.add_method('begin', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
-                   [])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::end() const [member function]
-    cls.add_method('end', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::end() [member function]
-    cls.add_method('end', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
-                   [])
-    return
-
-def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager() [constructor]
-    cls.add_constructor([])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedMcs(ns3::Mac48Address address) [member function]
-    cls.add_method('AddAllSupportedMcs', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedModes(ns3::Mac48Address address) [member function]
-    cls.add_method('AddAllSupportedModes', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
-    cls.add_method('AddBasicMcs', 
-                   'void', 
-                   [param('ns3::WifiMode', 'mcs')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
-    cls.add_method('AddBasicMode', 
-                   'void', 
-                   [param('ns3::WifiMode', 'mode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHeCapabilities(ns3::Mac48Address from, ns3::HeCapabilities heCapabilities) [member function]
-    cls.add_method('AddStationHeCapabilities', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'from'), param('ns3::HeCapabilities', 'heCapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHtCapabilities(ns3::Mac48Address from, ns3::HtCapabilities htCapabilities) [member function]
-    cls.add_method('AddStationHtCapabilities', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htCapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtCapabilities) [member function]
-    cls.add_method('AddStationVhtCapabilities', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtCapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedErpSlotTime(ns3::Mac48Address address, bool isShortSlotTimeSupported) [member function]
-    cls.add_method('AddSupportedErpSlotTime', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortSlotTimeSupported')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
-    cls.add_method('AddSupportedMcs', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
-    cls.add_method('AddSupportedMode', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedPhyPreamble(ns3::Mac48Address address, bool isShortPreambleSupported) [member function]
-    cls.add_method('AddSupportedPhyPreamble', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortPreambleSupported')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint8_t i) const [member function]
-    cls.add_method('GetBasicMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint8_t i) const [member function]
-    cls.add_method('GetBasicMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetChannelWidthSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetChannelWidthSupported', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector() [member function]
-    cls.add_method('GetCtsToSelfTxVector', 
-                   'ns3::WifiTxVector', 
-                   [])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetDataTxVector(ns3::WifiMacHeader const & header) [member function]
-    cls.add_method('GetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiMacHeader const &', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
-    cls.add_method('GetDefaultMcs', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
-    cls.add_method('GetDefaultMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
-    cls.add_method('GetDefaultTxPowerLevel', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentationThreshold() const [member function]
-    cls.add_method('GetFragmentationThreshold', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported() const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported() const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported() const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo ns3::WifiRemoteStationManager::GetInfo(ns3::Mac48Address address) [member function]
-    cls.add_method('GetInfo', 
-                   'ns3::WifiRemoteStationInfo', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported() const [member function]
-    cls.add_method('GetLdpcSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetLdpcSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMaxNumberOfTransmitStreams() const [member function]
-    cls.add_method('GetMaxNumberOfTransmitStreams', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicMcs() const [member function]
-    cls.add_method('GetNBasicMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicModes() const [member function]
-    cls.add_method('GetNBasicModes', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetNMcsSupported', 
-                   'uint8_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNNonErpBasicModes() const [member function]
-    cls.add_method('GetNNonErpBasicModes', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonErpBasicMode(uint8_t i) const [member function]
-    cls.add_method('GetNonErpBasicMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonUnicastMode() const [member function]
-    cls.add_method('GetNonUnicastMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfAntennas() const [member function]
-    cls.add_method('GetNumberOfAntennas', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetNumberOfSupportedStreams', 
-                   'uint8_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetPcfSupported() const [member function]
-    cls.add_method('GetPcfSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetRtsTxVector(ns3::Mac48Address address) [member function]
-    cls.add_method('GetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported() const [member function]
-    cls.add_method('GetShortGuardIntervalSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetShortGuardIntervalSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleEnabled() const [member function]
-    cls.add_method('GetShortPreambleEnabled', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetShortPreambleSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeEnabled() const [member function]
-    cls.add_method('GetShortSlotTimeEnabled', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HeCapabilities> ns3::WifiRemoteStationManager::GetStationHeCapabilities(ns3::Mac48Address from) [member function]
-    cls.add_method('GetStationHeCapabilities', 
-                   'ns3::Ptr< ns3::HeCapabilities const >', 
-                   [param('ns3::Mac48Address', 'from')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HtCapabilities> ns3::WifiRemoteStationManager::GetStationHtCapabilities(ns3::Mac48Address from) [member function]
-    cls.add_method('GetStationHtCapabilities', 
-                   'ns3::Ptr< ns3::HtCapabilities const >', 
-                   [param('ns3::Mac48Address', 'from')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::VhtCapabilities> ns3::WifiRemoteStationManager::GetStationVhtCapabilities(ns3::Mac48Address from) [member function]
-    cls.add_method('GetStationVhtCapabilities', 
-                   'ns3::Ptr< ns3::VhtCapabilities const >', 
-                   [param('ns3::Mac48Address', 'from')])
-    ## wifi-remote-station-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiRemoteStationManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseGreenfieldProtection() const [member function]
-    cls.add_method('GetUseGreenfieldProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonErpProtection() const [member function]
-    cls.add_method('GetUseNonErpProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonHtProtection() const [member function]
-    cls.add_method('GetUseNonHtProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported() const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
-    cls.add_method('IsAssociated', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsBrandNew(ns3::Mac48Address address) const [member function]
-    cls.add_method('IsBrandNew', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsWaitAssocTxOk(ns3::Mac48Address address) const [member function]
-    cls.add_method('IsWaitAssocTxOk', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedCtsToSelf(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('NeedCtsToSelf', 
-                   'bool', 
-                   [param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NeedFragmentation', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NeedRetransmission', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::WifiMacHeader const & header, uint32_t size) [member function]
-    cls.add_method('NeedRts', 
-                   'bool', 
-                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordDisassociated(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordDisassociated', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxFailed(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordGotAssocTxFailed', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxOk(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordGotAssocTxOk', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordWaitAssocTxOk(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordWaitAssocTxOk', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RemoveAllSupportedMcs(ns3::Mac48Address address) [member function]
-    cls.add_method('RemoveAllSupportedMcs', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('ReportAmpduTxStatus', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
-    cls.add_method('ReportDataFailed', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector, uint32_t packetSize) [member function]
-    cls.add_method('ReportDataOk', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
-    cls.add_method('ReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
-    cls.add_method('ReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
-    cls.add_method('ReportRtsFailed', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('ReportRtsOk', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('ReportRxOk', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::Reset() [member function]
-    cls.add_method('Reset', 
-                   'void', 
-                   [])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
-    cls.add_method('SetDefaultTxPowerLevel', 
-                   'void', 
-                   [param('uint8_t', 'txPower')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetFragmentationThreshold(uint32_t threshold) [member function]
-    cls.add_method('SetFragmentationThreshold', 
-                   'void', 
-                   [param('uint32_t', 'threshold')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSlrc(uint32_t maxSlrc) [member function]
-    cls.add_method('SetMaxSlrc', 
-                   'void', 
-                   [param('uint32_t', 'maxSlrc')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
-    cls.add_method('SetMaxSsrc', 
-                   'void', 
-                   [param('uint32_t', 'maxSsrc')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetPcfSupported(bool enable) [member function]
-    cls.add_method('SetPcfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
-    cls.add_method('SetQosSupport', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'from'), param('bool', 'qosSupported')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetRtsCtsThreshold(uint32_t threshold) [member function]
-    cls.add_method('SetRtsCtsThreshold', 
-                   'void', 
-                   [param('uint32_t', 'threshold')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortPreambleEnabled(bool enable) [member function]
-    cls.add_method('SetShortPreambleEnabled', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortSlotTimeEnabled(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeEnabled', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseGreenfieldProtection(bool enable) [member function]
-    cls.add_method('SetUseGreenfieldProtection', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonErpProtection(bool enable) [member function]
-    cls.add_method('SetUseNonErpProtection', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonHtProtection(bool enable) [member function]
-    cls.add_method('SetUseNonHtProtection', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetupMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
-                   is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
-    cls.add_method('UpdateFragmentationThreshold', 
-                   'void', 
-                   [])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseGreenfieldForDestination(ns3::Mac48Address dest) const [member function]
-    cls.add_method('UseGreenfieldForDestination', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseLdpcForDestination(ns3::Mac48Address dest) const [member function]
-    cls.add_method('UseLdpcForDestination', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Mac48Address ns3::WifiRemoteStationManager::GetAddress(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetAddress', 
+                   is_virtual=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Mac48Address ns3::WifiRemoteStationManager::GetAddress(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAddress', 
                    'ns3::Mac48Address', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
@@ -11874,11 +12350,6 @@
                    'uint16_t', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetGreenfield', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetGuardInterval', 
                    'uint16_t', 
@@ -11894,11 +12365,6 @@
                    'bool', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
-    cls.add_method('GetMac', 
-                   'ns3::Ptr< ns3::WifiMac >', 
-                   [], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
     cls.add_method('GetMcsSupported', 
                    'ns3::WifiMode', 
@@ -11934,11 +12400,6 @@
                    'uint8_t', 
                    [param('ns3::WifiRemoteStation const *', 'station')], 
                    is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True, visibility='protected')
     ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::WifiRemoteStation const * station) const [member function]
     cls.add_method('GetQosSupported', 
                    'bool', 
@@ -11989,10 +12450,10 @@
                    'bool', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
                    is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
     cls.add_method('DoReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
                    is_virtual=True, visibility='private')
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportDataFailed', 
@@ -12358,18 +12819,18 @@
     cls.add_method('DestroyAgreement', 
                    'void', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient, uint16_t startingSeq) [member function]
     cls.add_method('UpdateAgreement', 
                    'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient'), param('uint16_t', 'startingSeq')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::StorePacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('StorePacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true) [member function]
+    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
     cls.add_method('GetBar', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('bool', 'remove', default_value='true')])
+                   [param('bool', 'remove', default_value='true'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
     ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasPackets() [member function]
     cls.add_method('HasPackets', 
                    'bool', 
@@ -12382,10 +12843,10 @@
     cls.add_method('NotifyMissedAck', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, double rxSnr, double dataSnr, ns3::WifiTxVector const & dataTxVector, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
                    'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector const &', 'dataTxVector'), param('size_t', 'index', default_value='0')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('NotifyMissedBlockAck', 
                    'void', 
@@ -12427,14 +12888,6 @@
     cls.add_method('SetQueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueue > const', 'queue')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
-    cls.add_method('SetTxMiddle', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckType(ns3::BlockAckType bAckType) [member function]
-    cls.add_method('SetBlockAckType', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'bAckType')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckInactivityCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
     cls.add_method('SetBlockAckInactivityCallback', 
                    'void', 
@@ -12460,6 +12913,16 @@
                    'uint16_t', 
                    [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
                    is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckManager::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckManager::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
     ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetOriginatorStartingSequence(ns3::Mac48Address recipient, uint8_t tid) const [member function]
     cls.add_method('GetOriginatorStartingSequence', 
                    'uint16_t', 
@@ -12468,11 +12931,11 @@
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxOkCallback(ns3::BlockAckManager::TxOk callback) [member function]
     cls.add_method('SetTxOkCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxFailedCallback(ns3::BlockAckManager::TxFailed callback) [member function]
     cls.add_method('SetTxFailedCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyDiscardedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NotifyDiscardedMpdu', 
                    'void', 
@@ -12507,820 +12970,1376 @@
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('bool', 'value')])
+    return
+
+def register_Ns3BsmApplication_methods(root_module, cls):
+    ## bsm-application.h (module 'wave'): ns3::BsmApplication::BsmApplication(ns3::BsmApplication const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BsmApplication const &', 'arg0')])
+    ## bsm-application.h (module 'wave'): ns3::BsmApplication::BsmApplication() [constructor]
+    cls.add_constructor([])
+    ## bsm-application.h (module 'wave'): int64_t ns3::BsmApplication::AssignStreams(int64_t streamIndex) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'streamIndex')])
+    ## bsm-application.h (module 'wave'): static ns3::TypeId ns3::BsmApplication::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::Setup(ns3::Ipv4InterfaceContainer & i, int nodeId, ns3::Time totalTime, uint32_t wavePacketSize, ns3::Time waveInterval, double gpsAccuracyNs, std::vector<double, std::allocator<double> > rangesSq, ns3::Ptr<ns3::WaveBsmStats> waveBsmStats, std::vector<int, std::allocator<int> > * nodesMoving, int mode, ns3::Time txDelay) [member function]
+    cls.add_method('Setup', 
+                   'void', 
+                   [param('ns3::Ipv4InterfaceContainer &', 'i'), param('int', 'nodeId'), param('ns3::Time', 'totalTime'), param('uint32_t', 'wavePacketSize'), param('ns3::Time', 'waveInterval'), param('double', 'gpsAccuracyNs'), param('std::vector< double >', 'rangesSq'), param('ns3::Ptr< ns3::WaveBsmStats >', 'waveBsmStats'), param('std::vector< int > *', 'nodesMoving'), param('int', 'mode'), param('ns3::Time', 'txDelay')])
+    ## bsm-application.h (module 'wave'): ns3::BsmApplication::wavePort [variable]
+    cls.add_static_attribute('wavePort', 'int', is_const=False)
+    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::StartApplication() [member function]
+    cls.add_method('StartApplication', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::StopApplication() [member function]
+    cls.add_method('StopApplication', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3CallbackChecker_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
+    return
+
+def register_Ns3CallbackImplBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<const ns3::CallbackImplBase> other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['void'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['bool'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ipv4Header const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv4> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ipv4L3Protocol::DropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ipv6Header const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ipv6L3Protocol::DropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned long'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('bool', 'value')])
-    return
-
-def register_Ns3BsmApplication_methods(root_module, cls):
-    ## bsm-application.h (module 'wave'): ns3::BsmApplication::BsmApplication(ns3::BsmApplication const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BsmApplication const &', 'arg0')])
-    ## bsm-application.h (module 'wave'): ns3::BsmApplication::BsmApplication() [constructor]
-    cls.add_constructor([])
-    ## bsm-application.h (module 'wave'): int64_t ns3::BsmApplication::AssignStreams(int64_t streamIndex) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'streamIndex')])
-    ## bsm-application.h (module 'wave'): static ns3::TypeId ns3::BsmApplication::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::Setup(ns3::Ipv4InterfaceContainer & i, int nodeId, ns3::Time totalTime, uint32_t wavePacketSize, ns3::Time waveInterval, double gpsAccuracyNs, std::vector<double, std::allocator<double> > rangesSq, ns3::Ptr<ns3::WaveBsmStats> waveBsmStats, std::vector<int, std::allocator<int> > * nodesMoving, int mode, ns3::Time txDelay) [member function]
-    cls.add_method('Setup', 
-                   'void', 
-                   [param('ns3::Ipv4InterfaceContainer &', 'i'), param('int', 'nodeId'), param('ns3::Time', 'totalTime'), param('uint32_t', 'wavePacketSize'), param('ns3::Time', 'waveInterval'), param('double', 'gpsAccuracyNs'), param('std::vector< double >', 'rangesSq'), param('ns3::Ptr< ns3::WaveBsmStats >', 'waveBsmStats'), param('std::vector< int > *', 'nodesMoving'), param('int', 'mode'), param('ns3::Time', 'txDelay')])
-    ## bsm-application.h (module 'wave'): ns3::BsmApplication::wavePort [variable]
-    cls.add_static_attribute('wavePort', 'int', is_const=False)
-    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
+                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::StartApplication() [member function]
-    cls.add_method('StartApplication', 
-                   'void', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## bsm-application.h (module 'wave'): void ns3::BsmApplication::StopApplication() [member function]
-    cls.add_method('StopApplication', 
-                   'void', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMac> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3CallbackChecker_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
-    return
-
-def register_Ns3CallbackImplBase_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
-    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
+                   is_static=True, template_parameters=['ns3::OrganizationIdentifier const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<const ns3::CallbackImplBase> other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
+                   is_static=True, template_parameters=['ns3::Address'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
                    'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
+                   [], 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['void'], visibility='protected')
+                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+                   is_static=True, template_parameters=['double'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Socket> '], visibility='protected')
+                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv4Header const&'], visibility='protected')
+                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv4> '], visibility='protected')
+                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv4L3Protocol::DropReason'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
+    return
+
+def register_Ns3CallbackValue_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::CallbackBase', 'base')])
+    return
+
+def register_Ns3Channel_methods(root_module, cls):
+    ## channel.h (module 'network'): ns3::Channel::Channel(ns3::Channel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Channel const &', 'arg0')])
+    ## channel.h (module 'network'): ns3::Channel::Channel() [constructor]
+    cls.add_constructor([])
+    ## channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Channel::GetDevice(std::size_t i) const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## channel.h (module 'network'): uint32_t ns3::Channel::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## channel.h (module 'network'): std::size_t ns3::Channel::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## channel.h (module 'network'): static ns3::TypeId ns3::Channel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3ChannelAccessManager_methods(root_module, cls):
+    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager(ns3::ChannelAccessManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelAccessManager const &', 'arg0')])
+    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager() [constructor]
+    cls.add_constructor([])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::Add(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetAccessGrantStart(bool ignoreNav=false) const [member function]
+    cls.add_method('GetAccessGrantStart', 
+                   'ns3::Time', 
+                   [param('bool', 'ignoreNav', default_value='false')], 
+                   is_const=True)
+    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::IsBusy() const [member function]
+    cls.add_method('IsBusy', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::NeedBackoffUponAccess(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('NeedBackoffUponAccess', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutResetNow() [member function]
+    cls.add_method('NotifyAckTimeoutResetNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyAckTimeoutStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutResetNow() [member function]
+    cls.add_method('NotifyCtsTimeoutResetNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyCtsTimeoutStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyMaybeCcaBusyStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyMaybeCcaBusyStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavResetNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyNavResetNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyNavStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOffNow() [member function]
+    cls.add_method('NotifyOffNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOnNow() [member function]
+    cls.add_method('NotifyOnNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndErrorNow() [member function]
+    cls.add_method('NotifyRxEndErrorNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndOkNow() [member function]
+    cls.add_method('NotifyRxEndOkNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyRxStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySleepNow() [member function]
+    cls.add_method('NotifySleepNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyTxStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyTxStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyWakeupNow() [member function]
+    cls.add_method('NotifyWakeupNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RemovePhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('RemovePhyListener', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RequestAccess(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('RequestAccess', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupFrameExchangeManager(ns3::Ptr<ns3::FrameExchangeManager> feManager) [member function]
+    cls.add_method('SetupFrameExchangeManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::FrameExchangeManager >', 'feManager')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupPhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetupPhyListener', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetEifsNoDifs() const [member function]
+    cls.add_method('GetEifsNoDifs', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Ipv6> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSifs() const [member function]
+    cls.add_method('GetSifs', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv6Header const&'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSlot() const [member function]
+    cls.add_method('GetSlot', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ipv6L3Protocol::DropReason'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ChannelCoordinationListener_methods(root_module, cls):
+    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinationListener::ChannelCoordinationListener() [constructor]
+    cls.add_constructor([])
+    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinationListener::ChannelCoordinationListener(ns3::ChannelCoordinationListener const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelCoordinationListener const &', 'arg0')])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinationListener::NotifyCchSlotStart(ns3::Time duration) [member function]
+    cls.add_method('NotifyCchSlotStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinationListener::NotifyGuardSlotStart(ns3::Time duration, bool cchi) [member function]
+    cls.add_method('NotifyGuardSlotStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration'), param('bool', 'cchi')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinationListener::NotifySchSlotStart(ns3::Time duration) [member function]
+    cls.add_method('NotifySchSlotStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3ChannelCoordinator_methods(root_module, cls):
+    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinator::ChannelCoordinator(ns3::ChannelCoordinator const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelCoordinator const &', 'arg0')])
+    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinator::ChannelCoordinator() [constructor]
+    cls.add_constructor([])
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetCchInterval() const [member function]
+    cls.add_method('GetCchInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultCchInterval() [member function]
+    cls.add_method('GetDefaultCchInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultGuardInterval() [member function]
+    cls.add_method('GetDefaultGuardInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultSchInterval() [member function]
+    cls.add_method('GetDefaultSchInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultSyncInterval() [member function]
+    cls.add_method('GetDefaultSyncInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetIntervalTime(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('GetIntervalTime', 
+                   'ns3::Time', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetRemainTime(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('GetRemainTime', 
+                   'ns3::Time', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetSchInterval() const [member function]
+    cls.add_method('GetSchInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetSyncInterval() const [member function]
+    cls.add_method('GetSyncInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMac> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): static ns3::TypeId ns3::ChannelCoordinator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_static=True, template_parameters=['ns3::OrganizationIdentifier const&'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsCchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('IsCchInterval', 
+                   'bool', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsGuardInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('IsGuardInterval', 
+                   'bool', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsSchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('IsSchInterval', 
+                   'bool', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsValidConfig() const [member function]
+    cls.add_method('IsValidConfig', 
+                   'bool', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Address'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::NeedTimeToCchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('NeedTimeToCchInterval', 
+                   'ns3::Time', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::NeedTimeToGuardInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('NeedTimeToGuardInterval', 
+                   'ns3::Time', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::NeedTimeToSchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
+    cls.add_method('NeedTimeToSchInterval', 
+                   'ns3::Time', 
+                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   is_const=True)
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::RegisterListener(ns3::Ptr<ns3::ChannelCoordinationListener> listener) [member function]
+    cls.add_method('RegisterListener', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ChannelCoordinationListener >', 'listener')])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::SetCchInterval(ns3::Time cchi) [member function]
+    cls.add_method('SetCchInterval', 
+                   'void', 
+                   [param('ns3::Time', 'cchi')])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::SetGuardInterval(ns3::Time guardi) [member function]
+    cls.add_method('SetGuardInterval', 
+                   'void', 
+                   [param('ns3::Time', 'guardi')])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::SetSchInterval(ns3::Time schi) [member function]
+    cls.add_method('SetSchInterval', 
+                   'void', 
+                   [param('ns3::Time', 'schi')])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::UnregisterAllListeners() [member function]
+    cls.add_method('UnregisterAllListeners', 
+                   'void', 
+                   [])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::UnregisterListener(ns3::Ptr<ns3::ChannelCoordinationListener> listener) [member function]
+    cls.add_method('UnregisterListener', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ChannelCoordinationListener >', 'listener')])
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_virtual=True, visibility='private')
+    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ChannelManager_methods(root_module, cls):
+    ## channel-manager.h (module 'wave'): ns3::ChannelManager::ChannelManager(ns3::ChannelManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelManager const &', 'arg0')])
+    ## channel-manager.h (module 'wave'): ns3::ChannelManager::ChannelManager() [constructor]
+    cls.add_constructor([])
+    ## channel-manager.h (module 'wave'): static uint32_t ns3::ChannelManager::GetCch() [member function]
+    cls.add_method('GetCch', 
+                   'uint32_t', 
                    [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): bool ns3::ChannelManager::GetManagementAdaptable(uint32_t channelNumber) [member function]
+    cls.add_method('GetManagementAdaptable', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')])
+    ## channel-manager.h (module 'wave'): ns3::WifiMode ns3::ChannelManager::GetManagementDataRate(uint32_t channelNumber) [member function]
+    cls.add_method('GetManagementDataRate', 
+                   'ns3::WifiMode', 
+                   [param('uint32_t', 'channelNumber')])
+    ## channel-manager.h (module 'wave'): uint32_t ns3::ChannelManager::GetManagementPowerLevel(uint32_t channelNumber) [member function]
+    cls.add_method('GetManagementPowerLevel', 
+                   'uint32_t', 
+                   [param('uint32_t', 'channelNumber')])
+    ## channel-manager.h (module 'wave'): ns3::WifiPreamble ns3::ChannelManager::GetManagementPreamble(uint32_t channelNumber) [member function]
+    cls.add_method('GetManagementPreamble', 
+                   'ns3::WifiPreamble', 
+                   [param('uint32_t', 'channelNumber')])
+    ## channel-manager.h (module 'wave'): static uint32_t ns3::ChannelManager::GetNumberOfWaveChannels() [member function]
+    cls.add_method('GetNumberOfWaveChannels', 
+                   'uint32_t', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): uint32_t ns3::ChannelManager::GetOperatingClass(uint32_t channelNumber) [member function]
+    cls.add_method('GetOperatingClass', 
+                   'uint32_t', 
+                   [param('uint32_t', 'channelNumber')])
+    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int> > ns3::ChannelManager::GetSchs() [member function]
+    cls.add_method('GetSchs', 
+                   'std::vector< unsigned int >', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): static ns3::TypeId ns3::ChannelManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int> > ns3::ChannelManager::GetWaveChannels() [member function]
+    cls.add_method('GetWaveChannels', 
+                   'std::vector< unsigned int >', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): static bool ns3::ChannelManager::IsCch(uint32_t channelNumber) [member function]
+    cls.add_method('IsCch', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): static bool ns3::ChannelManager::IsSch(uint32_t channelNumber) [member function]
+    cls.add_method('IsSch', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): static bool ns3::ChannelManager::IsWaveChannel(uint32_t channelNumber) [member function]
+    cls.add_method('IsWaveChannel', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_static=True)
+    ## channel-manager.h (module 'wave'): void ns3::ChannelManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3ChannelScheduler_methods(root_module, cls):
+    ## channel-scheduler.h (module 'wave'): ns3::ChannelScheduler::ChannelScheduler(ns3::ChannelScheduler const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelScheduler const &', 'arg0')])
+    ## channel-scheduler.h (module 'wave'): ns3::ChannelScheduler::ChannelScheduler() [constructor]
+    cls.add_constructor([])
+    ## channel-scheduler.h (module 'wave'): ns3::ChannelAccess ns3::ChannelScheduler::GetAssignedAccessType(uint32_t channelNumber) const [member function]
+    cls.add_method('GetAssignedAccessType', 
+                   'ns3::ChannelAccess', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## channel-scheduler.h (module 'wave'): static ns3::TypeId ns3::ChannelScheduler::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsAlternatingAccessAssigned(uint32_t channelNumber) const [member function]
+    cls.add_method('IsAlternatingAccessAssigned', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsCchAccessAssigned() const [member function]
+    cls.add_method('IsCchAccessAssigned', 
+                   'bool', 
                    [], 
-                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsChannelAccessAssigned(uint32_t channelNumber) const [member function]
+    cls.add_method('IsChannelAccessAssigned', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsContinuousAccessAssigned(uint32_t channelNumber) const [member function]
+    cls.add_method('IsContinuousAccessAssigned', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsDefaultCchAccessAssigned() const [member function]
+    cls.add_method('IsDefaultCchAccessAssigned', 
+                   'bool', 
                    [], 
-                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsExtendedAccessAssigned(uint32_t channelNumber) const [member function]
+    cls.add_method('IsExtendedAccessAssigned', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsSchAccessAssigned() const [member function]
+    cls.add_method('IsSchAccessAssigned', 
+                   'bool', 
                    [], 
-                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## channel-scheduler.h (module 'wave'): void ns3::ChannelScheduler::SetWaveNetDevice(ns3::Ptr<ns3::WaveNetDevice> device) [member function]
+    cls.add_method('SetWaveNetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WaveNetDevice >', 'device')], 
+                   is_virtual=True)
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::StartSch(ns3::SchInfo const & schInfo) [member function]
+    cls.add_method('StartSch', 
+                   'bool', 
+                   [param('ns3::SchInfo const &', 'schInfo')])
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::StopSch(uint32_t channelNumber) [member function]
+    cls.add_method('StopSch', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')])
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignAlternatingAccess(uint32_t channelNumber, bool immediate) [member function]
+    cls.add_method('AssignAlternatingAccess', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber'), param('bool', 'immediate')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignContinuousAccess(uint32_t channelNumber, bool immediate) [member function]
+    cls.add_method('AssignContinuousAccess', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber'), param('bool', 'immediate')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignDefaultCchAccess() [member function]
+    cls.add_method('AssignDefaultCchAccess', 
+                   'bool', 
                    [], 
-                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignExtendedAccess(uint32_t channelNumber, uint32_t extends, bool immediate) [member function]
+    cls.add_method('AssignExtendedAccess', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber'), param('uint32_t', 'extends'), param('bool', 'immediate')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## channel-scheduler.h (module 'wave'): void ns3::ChannelScheduler::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['ns3::HePreambleParameters'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_virtual=True, visibility='protected')
+    ## channel-scheduler.h (module 'wave'): void ns3::ChannelScheduler::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
+                   is_virtual=True, visibility='protected')
+    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::ReleaseAccess(uint32_t channelNumber) [member function]
+    cls.add_method('ReleaseAccess', 
+                   'bool', 
+                   [param('uint32_t', 'channelNumber')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
-def register_Ns3CallbackValue_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
-    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
+def register_Ns3ConstantRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ConstantRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable::ConstantRandomVariable() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
-    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
-    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetConstant() const [member function]
+    cls.add_method('GetConstant', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue(double constant) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'constant')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger(uint32_t constant) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'constant')])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::CallbackBase', 'base')])
     return
 
-def register_Ns3Channel_methods(root_module, cls):
-    ## channel.h (module 'network'): ns3::Channel::Channel(ns3::Channel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Channel const &', 'arg0')])
-    ## channel.h (module 'network'): ns3::Channel::Channel() [constructor]
+def register_Ns3CtrlBAckRequestHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader(ns3::CtrlBAckRequestHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlBAckRequestHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader() [constructor]
     cls.add_constructor([])
-    ## channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Channel::GetDevice(std::size_t i) const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## channel.h (module 'network'): uint32_t ns3::Channel::GetId() const [member function]
-    cls.add_method('GetId', 
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckRequestHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
                    'uint32_t', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequence() const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [], 
                    is_const=True)
-    ## channel.h (module 'network'): std::size_t ns3::Channel::GetNDevices() const [member function]
-    cls.add_method('GetNDevices', 
-                   'std::size_t', 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequenceControl() const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## channel.h (module 'network'): static ns3::TypeId ns3::Channel::GetTypeId() [member function]
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckRequestHeader::GetTidInfo() const [member function]
+    cls.add_method('GetTidInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckReqType ns3::CtrlBAckRequestHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::BlockAckReqType', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckRequestHeader::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    return
-
-def register_Ns3ChannelAccessManager_methods(root_module, cls):
-    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager(ns3::ChannelAccessManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelAccessManager const &', 'arg0')])
-    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager() [constructor]
-    cls.add_constructor([])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::Add(ns3::Ptr<ns3::Txop> txop) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
-    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::IsBusy() const [member function]
-    cls.add_method('IsBusy', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::NeedBackoffUponAccess(ns3::Ptr<ns3::Txop> txop) [member function]
-    cls.add_method('NeedBackoffUponAccess', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsCompressed() const [member function]
+    cls.add_method('IsCompressed', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutResetNow() [member function]
-    cls.add_method('NotifyAckTimeoutResetNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyAckTimeoutStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutResetNow() [member function]
-    cls.add_method('NotifyCtsTimeoutResetNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyCtsTimeoutStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyMaybeCcaBusyStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyMaybeCcaBusyStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavResetNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyNavResetNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyNavStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOffNow() [member function]
-    cls.add_method('NotifyOffNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOnNow() [member function]
-    cls.add_method('NotifyOnNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndErrorNow() [member function]
-    cls.add_method('NotifyRxEndErrorNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndOkNow() [member function]
-    cls.add_method('NotifyRxEndOkNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyRxStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySleepNow() [member function]
-    cls.add_method('NotifySleepNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifySwitchingStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyTxStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyTxStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyWakeupNow() [member function]
-    cls.add_method('NotifyWakeupNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RemovePhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('RemovePhyListener', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RequestAccess(ns3::Ptr<ns3::Txop> txop, bool isCfPeriod=false) [member function]
-    cls.add_method('RequestAccess', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'txop'), param('bool', 'isCfPeriod', default_value='false')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupLow(ns3::Ptr<ns3::MacLow> low) [member function]
-    cls.add_method('SetupLow', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacLow >', 'low')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupPhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('SetupPhyListener', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetEifsNoDifs() const [member function]
-    cls.add_method('GetEifsNoDifs', 
-                   'ns3::Time', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsExtendedCompressed() const [member function]
+    cls.add_method('IsExtendedCompressed', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSifs() const [member function]
-    cls.add_method('GetSifs', 
-                   'ns3::Time', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsMultiTid() const [member function]
+    cls.add_method('IsMultiTid', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSlot() const [member function]
-    cls.add_method('GetSlot', 
-                   'ns3::Time', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::MustSendHtImmediateAck() const [member function]
+    cls.add_method('MustSendHtImmediateAck', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3ChannelCoordinationListener_methods(root_module, cls):
-    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinationListener::ChannelCoordinationListener() [constructor]
-    cls.add_constructor([])
-    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinationListener::ChannelCoordinationListener(ns3::ChannelCoordinationListener const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelCoordinationListener const &', 'arg0')])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinationListener::NotifyCchSlotStart(ns3::Time duration) [member function]
-    cls.add_method('NotifyCchSlotStart', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinationListener::NotifyGuardSlotStart(ns3::Time duration, bool cchi) [member function]
-    cls.add_method('NotifyGuardSlotStart', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Time', 'duration'), param('bool', 'cchi')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinationListener::NotifySchSlotStart(ns3::Time duration) [member function]
-    cls.add_method('NotifySchSlotStart', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetHtImmediateAck(bool immediateAck) [member function]
+    cls.add_method('SetHtImmediateAck', 
                    'void', 
-                   [param('ns3::Time', 'duration')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [param('bool', 'immediateAck')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetStartingSequence(uint16_t seq) [member function]
+    cls.add_method('SetStartingSequence', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetTidInfo(uint8_t tid) [member function]
+    cls.add_method('SetTidInfo', 
+                   'void', 
+                   [param('uint8_t', 'tid')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetType(ns3::BlockAckReqType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::BlockAckReqType', 'type')])
     return
 
-def register_Ns3ChannelCoordinator_methods(root_module, cls):
-    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinator::ChannelCoordinator(ns3::ChannelCoordinator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelCoordinator const &', 'arg0')])
-    ## channel-coordinator.h (module 'wave'): ns3::ChannelCoordinator::ChannelCoordinator() [constructor]
+def register_Ns3CtrlBAckResponseHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader(ns3::CtrlBAckResponseHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlBAckResponseHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader() [constructor]
     cls.add_constructor([])
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetCchInterval() const [member function]
-    cls.add_method('GetCchInterval', 
-                   'ns3::Time', 
-                   [], 
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned int, std::allocator<unsigned int> > ns3::CtrlBAckResponseHeader::FindPerAidTidInfoWithAid(uint16_t aid) const [member function]
+    cls.add_method('FindPerAidTidInfoWithAid', 
+                   'std::vector< unsigned int >', 
+                   [param('uint16_t', 'aid')], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultCchInterval() [member function]
-    cls.add_method('GetDefaultCchInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_static=True)
-    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultGuardInterval() [member function]
-    cls.add_method('GetDefaultGuardInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_static=True)
-    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultSchInterval() [member function]
-    cls.add_method('GetDefaultSchInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_static=True)
-    ## channel-coordinator.h (module 'wave'): static ns3::Time ns3::ChannelCoordinator::GetDefaultSyncInterval() [member function]
-    cls.add_method('GetDefaultSyncInterval', 
-                   'ns3::Time', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::GetAckType(std::size_t index) const [member function]
+    cls.add_method('GetAckType', 
+                   'bool', 
+                   [param('std::size_t', 'index')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetAid11(std::size_t index) const [member function]
+    cls.add_method('GetAid11', 
+                   'uint16_t', 
+                   [param('std::size_t', 'index')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned char, std::allocator<unsigned char> > const & ns3::CtrlBAckResponseHeader::GetBitmap(std::size_t index=0) const [member function]
+    cls.add_method('GetBitmap', 
+                   'std::vector< unsigned char > const &', 
+                   [param('std::size_t', 'index', default_value='0')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckResponseHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'ns3::Time', 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): std::size_t ns3::CtrlBAckResponseHeader::GetNPerAidTidInfoSubfields() const [member function]
+    cls.add_method('GetNPerAidTidInfoSubfields', 
+                   'std::size_t', 
                    [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetIntervalTime(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('GetIntervalTime', 
-                   'ns3::Time', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequence(std::size_t index=0) const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [param('std::size_t', 'index', default_value='0')], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetRemainTime(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('GetRemainTime', 
-                   'ns3::Time', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequenceControl(std::size_t index=0) const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
+                   [param('std::size_t', 'index', default_value='0')], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetSchInterval() const [member function]
-    cls.add_method('GetSchInterval', 
-                   'ns3::Time', 
-                   [], 
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckResponseHeader::GetTidInfo(std::size_t index=0) const [member function]
+    cls.add_method('GetTidInfo', 
+                   'uint8_t', 
+                   [param('std::size_t', 'index', default_value='0')], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::GetSyncInterval() const [member function]
-    cls.add_method('GetSyncInterval', 
-                   'ns3::Time', 
+    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType ns3::CtrlBAckResponseHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::BlockAckType', 
                    [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): static ns3::TypeId ns3::ChannelCoordinator::GetTypeId() [member function]
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckResponseHeader::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsCchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('IsCchInterval', 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::Mac48Address ns3::CtrlBAckResponseHeader::GetUnassociatedStaAddress(std::size_t index) const [member function]
+    cls.add_method('GetUnassociatedStaAddress', 
+                   'ns3::Mac48Address', 
+                   [param('std::size_t', 'index')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsCompressed() const [member function]
+    cls.add_method('IsCompressed', 
                    'bool', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsGuardInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('IsGuardInterval', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsExtendedCompressed() const [member function]
+    cls.add_method('IsExtendedCompressed', 
                    'bool', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsSchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('IsSchInterval', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsFragmentReceived(uint16_t seq, uint8_t frag) const [member function]
+    cls.add_method('IsFragmentReceived', 
                    'bool', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): bool ns3::ChannelCoordinator::IsValidConfig() const [member function]
-    cls.add_method('IsValidConfig', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsMultiSta() const [member function]
+    cls.add_method('IsMultiSta', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::NeedTimeToCchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('NeedTimeToCchInterval', 
-                   'ns3::Time', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsMultiTid() const [member function]
+    cls.add_method('IsMultiTid', 
+                   'bool', 
+                   [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::NeedTimeToGuardInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('NeedTimeToGuardInterval', 
-                   'ns3::Time', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsPacketReceived(uint16_t seq, std::size_t index=0) const [member function]
+    cls.add_method('IsPacketReceived', 
+                   'bool', 
+                   [param('uint16_t', 'seq'), param('std::size_t', 'index', default_value='0')], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): ns3::Time ns3::ChannelCoordinator::NeedTimeToSchInterval(ns3::Time duration=ns3::Seconds(0.)) const [member function]
-    cls.add_method('NeedTimeToSchInterval', 
-                   'ns3::Time', 
-                   [param('ns3::Time', 'duration', default_value='ns3::Seconds(0.)')], 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::MustSendHtImmediateAck() const [member function]
+    cls.add_method('MustSendHtImmediateAck', 
+                   'bool', 
+                   [], 
                    is_const=True)
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::RegisterListener(ns3::Ptr<ns3::ChannelCoordinationListener> listener) [member function]
-    cls.add_method('RegisterListener', 
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ChannelCoordinationListener >', 'listener')])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::SetCchInterval(ns3::Time cchi) [member function]
-    cls.add_method('SetCchInterval', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::ResetBitmap(std::size_t index=0) [member function]
+    cls.add_method('ResetBitmap', 
                    'void', 
-                   [param('ns3::Time', 'cchi')])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::SetGuardInterval(ns3::Time guardi) [member function]
-    cls.add_method('SetGuardInterval', 
+                   [param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Time', 'guardi')])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::SetSchInterval(ns3::Time schi) [member function]
-    cls.add_method('SetSchInterval', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetAckType(bool type, std::size_t index) [member function]
+    cls.add_method('SetAckType', 
                    'void', 
-                   [param('ns3::Time', 'schi')])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::UnregisterAllListeners() [member function]
-    cls.add_method('UnregisterAllListeners', 
+                   [param('bool', 'type'), param('std::size_t', 'index')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetAid11(uint16_t aid, std::size_t index) [member function]
+    cls.add_method('SetAid11', 
+                   'void', 
+                   [param('uint16_t', 'aid'), param('std::size_t', 'index')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immediateAck) [member function]
+    cls.add_method('SetHtImmediateAck', 
+                   'void', 
+                   [param('bool', 'immediateAck')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedFragment(uint16_t seq, uint8_t frag) [member function]
+    cls.add_method('SetReceivedFragment', 
+                   'void', 
+                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedPacket(uint16_t seq, std::size_t index=0) [member function]
+    cls.add_method('SetReceivedPacket', 
                    'void', 
-                   [])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::UnregisterListener(ns3::Ptr<ns3::ChannelCoordinationListener> listener) [member function]
-    cls.add_method('UnregisterListener', 
+                   [param('uint16_t', 'seq'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequence(uint16_t seq, std::size_t index=0) [member function]
+    cls.add_method('SetStartingSequence', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ChannelCoordinationListener >', 'listener')])
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('uint16_t', 'seq'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequenceControl(uint16_t seqControl, std::size_t index=0) [member function]
+    cls.add_method('SetStartingSequenceControl', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## channel-coordinator.h (module 'wave'): void ns3::ChannelCoordinator::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   [param('uint16_t', 'seqControl'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetTidInfo(uint8_t tid, std::size_t index=0) [member function]
+    cls.add_method('SetTidInfo', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
+                   [param('uint8_t', 'tid'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetType(ns3::BlockAckType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::BlockAckType', 'type')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetUnassociatedStaAddress(ns3::Mac48Address const & ra, std::size_t index) [member function]
+    cls.add_method('SetUnassociatedStaAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'ra'), param('std::size_t', 'index')])
     return
 
-def register_Ns3ChannelManager_methods(root_module, cls):
-    ## channel-manager.h (module 'wave'): ns3::ChannelManager::ChannelManager(ns3::ChannelManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelManager const &', 'arg0')])
-    ## channel-manager.h (module 'wave'): ns3::ChannelManager::ChannelManager() [constructor]
-    cls.add_constructor([])
-    ## channel-manager.h (module 'wave'): static uint32_t ns3::ChannelManager::GetCch() [member function]
-    cls.add_method('GetCch', 
+def register_Ns3CtrlTriggerHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::CtrlTriggerHeader(ns3::CtrlTriggerHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlTriggerHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::CtrlTriggerHeader() [constructor]
+    cls.add_constructor([])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::CtrlTriggerHeader(ns3::TriggerFrameType type, ns3::WifiTxVector const & txVector) [constructor]
+    cls.add_constructor([param('ns3::TriggerFrameType', 'type'), param('ns3::WifiTxVector const &', 'txVector')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField & ns3::CtrlTriggerHeader::AddUserInfoField() [member function]
+    cls.add_method('AddUserInfoField', 
+                   'ns3::CtrlTriggerUserInfoField &', 
+                   [])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField & ns3::CtrlTriggerHeader::AddUserInfoField(ns3::CtrlTriggerUserInfoField const & userInfo) [member function]
+    cls.add_method('AddUserInfoField', 
+                   'ns3::CtrlTriggerUserInfoField &', 
+                   [param('ns3::CtrlTriggerUserInfoField const &', 'userInfo')])
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlTriggerHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
                    'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithAid(ns3::CtrlTriggerHeader::ConstIterator start, uint16_t aid12) const [member function]
+    cls.add_method('FindUserInfoWithAid', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'start'), param('uint16_t', 'aid12')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithAid(uint16_t aid12) const [member function]
+    cls.add_method('FindUserInfoWithAid', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('uint16_t', 'aid12')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuAssociated(ns3::CtrlTriggerHeader::ConstIterator start) const [member function]
+    cls.add_method('FindUserInfoWithRaRuAssociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'start')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuAssociated() const [member function]
+    cls.add_method('FindUserInfoWithRaRuAssociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
                    [], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): bool ns3::ChannelManager::GetManagementAdaptable(uint32_t channelNumber) [member function]
-    cls.add_method('GetManagementAdaptable', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuUnassociated(ns3::CtrlTriggerHeader::ConstIterator start) const [member function]
+    cls.add_method('FindUserInfoWithRaRuUnassociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'start')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuUnassociated() const [member function]
+    cls.add_method('FindUserInfoWithRaRuUnassociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): int8_t ns3::CtrlTriggerHeader::GetApTxPower() const [member function]
+    cls.add_method('GetApTxPower', 
+                   'int8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader ns3::CtrlTriggerHeader::GetCommonInfoField() const [member function]
+    cls.add_method('GetCommonInfoField', 
+                   'ns3::CtrlTriggerHeader', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::GetCsRequired() const [member function]
+    cls.add_method('GetCsRequired', 
                    'bool', 
-                   [param('uint32_t', 'channelNumber')])
-    ## channel-manager.h (module 'wave'): ns3::WifiMode ns3::ChannelManager::GetManagementDataRate(uint32_t channelNumber) [member function]
-    cls.add_method('GetManagementDataRate', 
-                   'ns3::WifiMode', 
-                   [param('uint32_t', 'channelNumber')])
-    ## channel-manager.h (module 'wave'): uint32_t ns3::ChannelManager::GetManagementPowerLevel(uint32_t channelNumber) [member function]
-    cls.add_method('GetManagementPowerLevel', 
-                   'uint32_t', 
-                   [param('uint32_t', 'channelNumber')])
-    ## channel-manager.h (module 'wave'): ns3::WifiPreamble ns3::ChannelManager::GetManagementPreamble(uint32_t channelNumber) [member function]
-    cls.add_method('GetManagementPreamble', 
-                   'ns3::WifiPreamble', 
-                   [param('uint32_t', 'channelNumber')])
-    ## channel-manager.h (module 'wave'): static uint32_t ns3::ChannelManager::GetNumberOfWaveChannels() [member function]
-    cls.add_method('GetNumberOfWaveChannels', 
-                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): uint32_t ns3::ChannelManager::GetOperatingClass(uint32_t channelNumber) [member function]
-    cls.add_method('GetOperatingClass', 
-                   'uint32_t', 
-                   [param('uint32_t', 'channelNumber')])
-    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int> > ns3::ChannelManager::GetSchs() [member function]
-    cls.add_method('GetSchs', 
-                   'std::vector< unsigned int >', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): static ns3::TypeId ns3::ChannelManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::WifiTxVector ns3::CtrlTriggerHeader::GetHeTbTxVector(uint16_t staId) const [member function]
+    cls.add_method('GetHeTbTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlTriggerHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): static std::vector<unsigned int, std::allocator<unsigned int> > ns3::ChannelManager::GetWaveChannels() [member function]
-    cls.add_method('GetWaveChannels', 
-                   'std::vector< unsigned int >', 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerHeader::GetLtfType() const [member function]
+    cls.add_method('GetLtfType', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): static bool ns3::ChannelManager::IsCch(uint32_t channelNumber) [member function]
-    cls.add_method('IsCch', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber')], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): static bool ns3::ChannelManager::IsSch(uint32_t channelNumber) [member function]
-    cls.add_method('IsSch', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber')], 
-                   is_static=True)
-    ## channel-manager.h (module 'wave'): static bool ns3::ChannelManager::IsWaveChannel(uint32_t channelNumber) [member function]
-    cls.add_method('IsWaveChannel', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::GetMoreTF() const [member function]
+    cls.add_method('GetMoreTF', 
                    'bool', 
-                   [param('uint32_t', 'channelNumber')], 
-                   is_static=True)
-    return
-
-def register_Ns3ChannelScheduler_methods(root_module, cls):
-    ## channel-scheduler.h (module 'wave'): ns3::ChannelScheduler::ChannelScheduler(ns3::ChannelScheduler const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelScheduler const &', 'arg0')])
-    ## channel-scheduler.h (module 'wave'): ns3::ChannelScheduler::ChannelScheduler() [constructor]
-    cls.add_constructor([])
-    ## channel-scheduler.h (module 'wave'): ns3::ChannelAccess ns3::ChannelScheduler::GetAssignedAccessType(uint32_t channelNumber) const [member function]
-    cls.add_method('GetAssignedAccessType', 
-                   'ns3::ChannelAccess', 
-                   [param('uint32_t', 'channelNumber')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## channel-scheduler.h (module 'wave'): static ns3::TypeId ns3::ChannelScheduler::GetTypeId() [member function]
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): std::size_t ns3::CtrlTriggerHeader::GetNUserInfoFields() const [member function]
+    cls.add_method('GetNUserInfoFields', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlTriggerHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType ns3::CtrlTriggerHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::TriggerFrameType', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlTriggerHeader::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsAlternatingAccessAssigned(uint32_t channelNumber) const [member function]
-    cls.add_method('IsAlternatingAccessAssigned', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber')], 
+    ## ctrl-headers.h (module 'wifi'): char const * ns3::CtrlTriggerHeader::GetTypeString() const [member function]
+    cls.add_method('GetTypeString', 
+                   'char const *', 
+                   [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsCchAccessAssigned() const [member function]
-    cls.add_method('IsCchAccessAssigned', 
-                   'bool', 
+    ## ctrl-headers.h (module 'wifi'): static char const * ns3::CtrlTriggerHeader::GetTypeString(ns3::TriggerFrameType type) [member function]
+    cls.add_method('GetTypeString', 
+                   'char const *', 
+                   [param('ns3::TriggerFrameType', 'type')], 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetUlBandwidth() const [member function]
+    cls.add_method('GetUlBandwidth', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsChannelAccessAssigned(uint32_t channelNumber) const [member function]
-    cls.add_method('IsChannelAccessAssigned', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber')], 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetUlLength() const [member function]
+    cls.add_method('GetUlLength', 
+                   'uint16_t', 
+                   [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsContinuousAccessAssigned(uint32_t channelNumber) const [member function]
-    cls.add_method('IsContinuousAccessAssigned', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber')], 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetUlSpatialReuse() const [member function]
+    cls.add_method('GetUlSpatialReuse', 
+                   'uint16_t', 
+                   [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsDefaultCchAccessAssigned() const [member function]
-    cls.add_method('IsDefaultCchAccessAssigned', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsExtendedAccessAssigned(uint32_t channelNumber) const [member function]
-    cls.add_method('IsExtendedAccessAssigned', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBfrp() const [member function]
+    cls.add_method('IsBfrp', 
                    'bool', 
-                   [param('uint32_t', 'channelNumber')], 
+                   [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::IsSchAccessAssigned() const [member function]
-    cls.add_method('IsSchAccessAssigned', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBqrp() const [member function]
+    cls.add_method('IsBqrp', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## channel-scheduler.h (module 'wave'): void ns3::ChannelScheduler::SetWaveNetDevice(ns3::Ptr<ns3::WaveNetDevice> device) [member function]
-    cls.add_method('SetWaveNetDevice', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WaveNetDevice >', 'device')], 
-                   is_virtual=True)
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::StartSch(ns3::SchInfo const & schInfo) [member function]
-    cls.add_method('StartSch', 
-                   'bool', 
-                   [param('ns3::SchInfo const &', 'schInfo')])
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::StopSch(uint32_t channelNumber) [member function]
-    cls.add_method('StopSch', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber')])
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignAlternatingAccess(uint32_t channelNumber, bool immediate) [member function]
-    cls.add_method('AssignAlternatingAccess', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber'), param('bool', 'immediate')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignContinuousAccess(uint32_t channelNumber, bool immediate) [member function]
-    cls.add_method('AssignContinuousAccess', 
-                   'bool', 
-                   [param('uint32_t', 'channelNumber'), param('bool', 'immediate')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignDefaultCchAccess() [member function]
-    cls.add_method('AssignDefaultCchAccess', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBsrp() const [member function]
+    cls.add_method('IsBsrp', 
                    'bool', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::AssignExtendedAccess(uint32_t channelNumber, uint32_t extends, bool immediate) [member function]
-    cls.add_method('AssignExtendedAccess', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsGcrMuBar() const [member function]
+    cls.add_method('IsGcrMuBar', 
                    'bool', 
-                   [param('uint32_t', 'channelNumber'), param('uint32_t', 'extends'), param('bool', 'immediate')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
-    ## channel-scheduler.h (module 'wave'): void ns3::ChannelScheduler::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## channel-scheduler.h (module 'wave'): bool ns3::ChannelScheduler::ReleaseAccess(uint32_t channelNumber) [member function]
-    cls.add_method('ReleaseAccess', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsMuBar() const [member function]
+    cls.add_method('IsMuBar', 
                    'bool', 
-                   [param('uint32_t', 'channelNumber')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
-    return
-
-def register_Ns3ConstantRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ConstantRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable::ConstantRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetConstant() const [member function]
-    cls.add_method('GetConstant', 
-                   'double', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsMuRts() const [member function]
+    cls.add_method('IsMuRts', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue(double constant) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'constant')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger(uint32_t constant) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'constant')])
-    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsNfrp() const [member function]
+    cls.add_method('IsNfrp', 
+                   'bool', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsValid() const [member function]
+    cls.add_method('IsValid', 
+                   'bool', 
                    [], 
-                   is_virtual=True)
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetApTxPower(int8_t power) [member function]
+    cls.add_method('SetApTxPower', 
+                   'void', 
+                   [param('int8_t', 'power')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetCsRequired(bool cs) [member function]
+    cls.add_method('SetCsRequired', 
+                   'void', 
+                   [param('bool', 'cs')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetGiAndLtfType(uint16_t guardInterval, uint8_t ltfType) [member function]
+    cls.add_method('SetGiAndLtfType', 
+                   'void', 
+                   [param('uint16_t', 'guardInterval'), param('uint8_t', 'ltfType')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetMoreTF(bool more) [member function]
+    cls.add_method('SetMoreTF', 
+                   'void', 
+                   [param('bool', 'more')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetType(ns3::TriggerFrameType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::TriggerFrameType', 'type')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetUlBandwidth(uint16_t bw) [member function]
+    cls.add_method('SetUlBandwidth', 
+                   'void', 
+                   [param('uint16_t', 'bw')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetUlLength(uint16_t len) [member function]
+    cls.add_method('SetUlLength', 
+                   'void', 
+                   [param('uint16_t', 'len')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetUlSpatialReuse(uint16_t sr) [member function]
+    cls.add_method('SetUlSpatialReuse', 
+                   'void', 
+                   [param('uint16_t', 'sr')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::Iterator ns3::CtrlTriggerHeader::begin() [member function]
+    cls.add_method('begin', 
+                   'ns3::CtrlTriggerHeader::Iterator', 
+                   [])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::Iterator ns3::CtrlTriggerHeader::end() [member function]
+    cls.add_method('end', 
+                   'ns3::CtrlTriggerHeader::Iterator', 
+                   [])
     return
 
 def register_Ns3DataRateChecker_methods(root_module, cls):
@@ -13489,61 +14508,6 @@
                    [param('double const &', 'value')])
     return
 
-def register_Ns3DsssSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader::DsssSigHeader(ns3::DsssSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DsssSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader::DsssSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::DsssSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::DsssSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::DsssSigHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint64_t ns3::DsssSigHeader::GetRate() const [member function]
-    cls.add_method('GetRate', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::DsssSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::DsssSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::SetRate(uint64_t rate) [member function]
-    cls.add_method('SetRate', 
-                   'void', 
-                   [param('uint64_t', 'rate')])
-    return
-
 def register_Ns3EmpiricalRandomVariable_methods(root_module, cls):
     ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable::EmpiricalRandomVariable() [constructor]
     cls.add_constructor([])
@@ -13836,8 +14800,8 @@
     cls.add_output_stream_operator()
     ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Event const & arg0) [constructor]
     cls.add_constructor([param('ns3::Event const &', 'arg0')])
-    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand', 'rxPower')])
     ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetDuration() const [member function]
     cls.add_method('GetDuration', 
                    'ns3::Time', 
@@ -13873,11 +14837,15 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::WifiTxVector ns3::Event::GetTxVector() const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::WifiTxVector const & ns3::Event::GetTxVector() const [member function]
     cls.add_method('GetTxVector', 
-                   'ns3::WifiTxVector', 
+                   'ns3::WifiTxVector const &', 
                    [], 
                    is_const=True)
+    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateRxPowerW', 
+                   'void', 
+                   [param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
     return
 
 def register_Ns3EventImpl_methods(root_module, cls):
@@ -13888,58 +14856,339 @@
     ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
     cls.add_method('Cancel', 
                    'void', 
-                   [])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
-    cls.add_method('Invoke', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
+    cls.add_method('Invoke', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
+    cls.add_method('IsCancelled', 
+                   'bool', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
+    cls.add_method('Notify', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3ExponentialRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ExponentialRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable::ExponentialRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue(double mean, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger(uint32_t mean, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3FrameExchangeManager_methods(root_module, cls):
+    ## frame-exchange-manager.h (module 'wifi'): ns3::FrameExchangeManager::FrameExchangeManager(ns3::FrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::FrameExchangeManager const &', 'arg0')])
+    ## frame-exchange-manager.h (module 'wifi'): ns3::FrameExchangeManager::FrameExchangeManager() [constructor]
+    cls.add_constructor([])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::CalculateAcknowledgmentTime(ns3::WifiAcknowledgment * acknowledgment) const [member function]
+    cls.add_method('CalculateAcknowledgmentTime', 
+                   'void', 
+                   [param('ns3::WifiAcknowledgment *', 'acknowledgment')], 
+                   is_const=True, is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::CalculateProtectionTime(ns3::WifiProtection * protection) const [member function]
+    cls.add_method('CalculateProtectionTime', 
+                   'void', 
+                   [param('ns3::WifiProtection *', 'protection')], 
+                   is_const=True, is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiAckManager> ns3::FrameExchangeManager::GetAckManager() const [member function]
+    cls.add_method('GetAckManager', 
+                   'ns3::Ptr< ns3::WifiAckManager >', 
+                   [], 
+                   is_const=True)
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiProtectionManager> ns3::FrameExchangeManager::GetProtectionManager() const [member function]
+    cls.add_method('GetProtectionManager', 
+                   'ns3::Ptr< ns3::WifiProtectionManager >', 
+                   [], 
+                   is_const=True)
+    ## frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::FrameExchangeManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## frame-exchange-manager.h (module 'wifi'): ns3::WifiTxTimer const & ns3::FrameExchangeManager::GetWifiTxTimer() const [member function]
+    cls.add_method('GetWifiTxTimer', 
+                   'ns3::WifiTxTimer const &', 
+                   [], 
+                   is_const=True)
+    ## frame-exchange-manager.h (module 'wifi'): bool ns3::FrameExchangeManager::IsPromisc() const [member function]
+    cls.add_method('IsPromisc', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyOffNow() [member function]
+    cls.add_method('NotifyOffNow', 
+                   'void', 
+                   [])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifySleepNow() [member function]
+    cls.add_method('NotifySleepNow', 
+                   'void', 
+                   [])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Receive(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool> > perMpduStatus) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('std::vector< bool >', 'perMpduStatus')])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ResetPhy() [member function]
+    cls.add_method('ResetPhy', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetAckManager(ns3::Ptr<ns3::WifiAckManager> ackManager) [member function]
+    cls.add_method('SetAckManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiAckManager >', 'ackManager')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetAckedMpduCallback(ns3::FrameExchangeManager::AckedMpdu callback) [member function]
+    cls.add_method('SetAckedMpduCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> const channelAccessManager) [member function]
+    cls.add_method('SetChannelAccessManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ChannelAccessManager > const', 'channelAccessManager')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetDroppedMpduCallback(ns3::FrameExchangeManager::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetMacRxMiddle(ns3::Ptr<ns3::MacRxMiddle> const rxMiddle) [member function]
+    cls.add_method('SetMacRxMiddle', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MacRxMiddle > const', 'rxMiddle')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetMacTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
+    cls.add_method('SetMacTxMiddle', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
+                   'void', 
+                   [])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetProtectionManager(ns3::Ptr<ns3::WifiProtectionManager> protectionManager) [member function]
+    cls.add_method('SetProtectionManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiProtectionManager >', 'protectionManager')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): bool ns3::FrameExchangeManager::StartTransmission(ns3::Ptr<ns3::Txop> dcf) [member function]
+    cls.add_method('StartTransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'dcf')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::CtsTimeout(ns3::Ptr<ns3::WifiMacQueueItem> rts, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('CtsTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'rts'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DequeueMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DequeueMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoSendCtsAfterRts(ns3::WifiMacHeader const & rtsHdr, ns3::WifiTxVector & ctsTxVector, double rtsSnr) [member function]
+    cls.add_method('DoSendCtsAfterRts', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'rtsHdr'), param('ns3::WifiTxVector &', 'ctsTxVector'), param('double', 'rtsSnr')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    cls.add_method('EndReceiveAmpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ForwardMpduDown(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector & txVector) [member function]
+    cls.add_method('ForwardMpduDown', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetCtsToSelfDurationId(ns3::WifiTxVector const & ctsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetCtsToSelfDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'ctsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::FrameExchangeManager::GetFirstFragmentIfNeeded(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('GetFirstFragmentIfNeeded', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetFrameDurationId(ns3::WifiMacHeader const & header, uint32_t size, ns3::WifiTxParameters const & txParams, ns3::Ptr<ns3::Packet> fragmentedPacket) const [member function]
+    cls.add_method('GetFrameDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Ptr< ns3::Packet >', 'fragmentedPacket')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::FrameExchangeManager::GetNextFragment() [member function]
+    cls.add_method('GetNextFragment', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetRtsDurationId(ns3::WifiTxVector const & rtsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetRtsDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'rtsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetTxDuration(uint32_t ppduPayloadSize, ns3::Mac48Address receiver, ns3::WifiTxParameters const & txParams) const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'ppduPayloadSize'), param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NavResetTimeout() [member function]
+    cls.add_method('NavResetTimeout', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NormalAckTimeout(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('NormalAckTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyPacketDiscarded(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyPacketDiscarded', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyReceivedNormalAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyReceivedNormalAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::PreProcessFrame(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('PreProcessFrame', 
                    'void', 
-                   [])
-    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
-    cls.add_method('IsCancelled', 
-                   'bool', 
-                   [])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
-    cls.add_method('Notify', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ReceiveMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector const & txVector, bool inAmpdu) [member function]
+    cls.add_method('ReceiveMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ReceivedNormalAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector, ns3::WifiTxVector const & ackTxVector, ns3::RxSignalInfo const & rxInfo, double snr) [member function]
+    cls.add_method('ReceivedNormalAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiTxVector const &', 'ackTxVector'), param('ns3::RxSignalInfo const &', 'rxInfo'), param('double', 'snr')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedCts(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedCts', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendCtsAfterRts(ns3::WifiMacHeader const & rtsHdr, ns3::WifiMode rtsTxMode, double rtsSnr) [member function]
+    cls.add_method('SendCtsAfterRts', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'rtsHdr'), param('ns3::WifiMode', 'rtsTxMode'), param('double', 'rtsSnr')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendCtsToSelf(ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('SendCtsToSelf', 
+                   'void', 
+                   [param('ns3::WifiTxParameters const &', 'txParams')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendMpduWithProtection(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams) [member function]
+    cls.add_method('SendMpduWithProtection', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendNormalAck(ns3::WifiMacHeader const & hdr, ns3::WifiTxVector const & dataTxVector, double dataSnr) [member function]
+    cls.add_method('SendNormalAck', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'hdr'), param('ns3::WifiTxVector const &', 'dataTxVector'), param('double', 'dataSnr')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendRts(ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('SendRts', 
+                   'void', 
+                   [param('ns3::WifiTxParameters const &', 'txParams')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::TransmissionFailed() [member function]
+    cls.add_method('TransmissionFailed', 
                    'void', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
-    return
-
-def register_Ns3ExponentialRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ExponentialRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable::ExponentialRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetMean() const [member function]
-    cls.add_method('GetMean', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetBound() const [member function]
-    cls.add_method('GetBound', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue(double mean, double bound) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'mean'), param('double', 'bound')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger(uint32_t mean, uint32_t bound) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'mean'), param('uint32_t', 'bound')])
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::TransmissionSucceeded() [member function]
+    cls.add_method('TransmissionSucceeded', 
+                   'void', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::UpdateNav(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('UpdateNav', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::UpdateTxDuration(ns3::Mac48Address receiver, ns3::WifiTxParameters & txParams) const [member function]
+    cls.add_method('UpdateTxDuration', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters &', 'txParams')], 
+                   is_const=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
                    [], 
-                   is_virtual=True)
+                   is_virtual=True, visibility='private')
     return
 
 def register_Ns3GammaRandomVariable_methods(root_module, cls):
@@ -14060,7 +15309,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSupportedMcsAndNss() const [member function]
     cls.add_method('GetSupportedMcsAndNss', 
                    'uint16_t', 
@@ -14080,7 +15329,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -14128,101 +15377,6 @@
                    [param('uint16_t', 'ctrl')])
     return
 
-def register_Ns3HeSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader::HeSigHeader(ns3::HeSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader::HeSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HeSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetBssColor() const [member function]
-    cls.add_method('GetBssColor', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HeSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HeSigHeader::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::HeSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetMcs() const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetNStreams() const [member function]
-    cls.add_method('GetNStreams', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HeSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::HeSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HeSigHeader::IsLdpcCoding() const [member function]
-    cls.add_method('IsLdpcCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetBssColor(uint8_t bssColor) [member function]
-    cls.add_method('SetBssColor', 
-                   'void', 
-                   [param('uint8_t', 'bssColor')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetCoding(bool ldpc) [member function]
-    cls.add_method('SetCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetGuardIntervalAndLtfSize(uint16_t gi, uint8_t ltf) [member function]
-    cls.add_method('SetGuardIntervalAndLtfSize', 
-                   'void', 
-                   [param('uint16_t', 'gi'), param('uint8_t', 'ltf')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetMcs(uint8_t mcs) [member function]
-    cls.add_method('SetMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetMuFlag(bool mu) [member function]
-    cls.add_method('SetMuFlag', 
-                   'void', 
-                   [param('bool', 'mu')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetNStreams(uint8_t nStreams) [member function]
-    cls.add_method('SetNStreams', 
-                   'void', 
-                   [param('uint8_t', 'nStreams')])
-    return
-
 def register_Ns3HtCapabilities_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities(ns3::HtCapabilities const & arg0) [constructor]
@@ -14254,11 +15408,6 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
-    cls.add_method('GetGreenfield', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
     ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetHtCapabilitiesInfo() const [member function]
     cls.add_method('GetHtCapabilitiesInfo', 
                    'uint16_t', 
@@ -14293,7 +15442,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval20() const [member function]
     cls.add_method('GetShortGuardInterval20', 
                    'uint8_t', 
@@ -14328,7 +15477,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -14346,10 +15495,6 @@
     cls.add_method('SetExtendedHtCapabilities', 
                    'void', 
                    [param('uint16_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
-    cls.add_method('SetGreenfield', 
-                   'void', 
-                   [param('uint8_t', 'greenfield')])
     ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtCapabilitiesInfo(uint16_t ctrl) [member function]
     cls.add_method('SetHtCapabilitiesInfo', 
                    'void', 
@@ -15119,10 +16264,10 @@
     cls.add_constructor([param('ns3::Ipv6 const &', 'arg0')])
     ## ipv6.h (module 'internet'): ns3::Ipv6::Ipv6() [constructor]
     cls.add_constructor([])
-    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6.h (module 'internet'): bool ns3::Ipv6::AddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_pure_virtual=True, is_virtual=True)
     ## ipv6.h (module 'internet'): uint32_t ns3::Ipv6::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('AddInterface', 
@@ -15457,10 +16602,10 @@
                    'int32_t', 
                    [param('ns3::Ptr< ns3::NetDevice const >', 'device')], 
                    is_const=True, is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::AddAddress(uint32_t i, ns3::Ipv6InterfaceAddress address, bool addOnLinkRoute=true) [member function]
     cls.add_method('AddAddress', 
                    'bool', 
-                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'i'), param('ns3::Ipv6InterfaceAddress', 'address'), param('bool', 'addOnLinkRoute', default_value='true')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
     cls.add_method('GetAddress', 
@@ -15591,6 +16736,10 @@
                    'bool', 
                    [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'interface')], 
                    is_const=True)
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::ReachabilityHint(uint32_t ipInterfaceIndex, ns3::Ipv6Address address) [member function]
+    cls.add_method('ReachabilityHint', 
+                   'bool', 
+                   [param('uint32_t', 'ipInterfaceIndex'), param('ns3::Ipv6Address', 'address')])
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -15780,270 +16929,79 @@
     ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
     cls.add_constructor([])
     ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
-    return
-
-def register_Ns3Mac48AddressValue_methods(root_module, cls):
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
-    cls.add_constructor([])
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
-    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
-    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::Mac48Address const &', 'value')])
-    return
-
-def register_Ns3MacLow_methods(root_module, cls):
-    ## mac-low.h (module 'wifi'): ns3::MacLow::MacLow(ns3::MacLow const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacLow const &', 'arg0')])
-    ## mac-low.h (module 'wifi'): ns3::MacLow::MacLow() [constructor]
-    cls.add_constructor([])
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateOverallTxTime(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const * hdr, ns3::MacLowTransmissionParameters const & params, uint32_t fragmentSize=0) const [member function]
-    cls.add_method('CalculateOverallTxTime', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters const &', 'params'), param('uint32_t', 'fragmentSize', default_value='0')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateOverheadTxTime(ns3::Ptr<const ns3::WifiMacQueueItem> item, ns3::MacLowTransmissionParameters const & params) const [member function]
-    cls.add_method('CalculateOverheadTxTime', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item'), param('ns3::MacLowTransmissionParameters const &', 'params')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateTransmissionTime(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const * hdr, ns3::MacLowTransmissionParameters const & parameters) const [member function]
-    cls.add_method('CalculateTransmissionTime', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters const &', 'parameters')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::CanTransmitNextCfFrame() const [member function]
-    cls.add_method('CanTransmitNextCfFrame', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::CreateBlockAckAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address originator, uint16_t startingSeq) [member function]
-    cls.add_method('CreateBlockAckAgreement', 
-                   'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'originator'), param('uint16_t', 'startingSeq')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DeaggregateAmpduAndReceive(ns3::Ptr<ns3::WifiPsdu> aggregatedPacket, double rxSnr, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
-    cls.add_method('DeaggregateAmpduAndReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'aggregatedPacket'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('std::vector< bool >', 'statusPerMpdu')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DestroyBlockAckAgreement(ns3::Mac48Address originator, uint8_t tid) [member function]
-    cls.add_method('DestroyBlockAckAgreement', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')])
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::DoNavStartNow(ns3::Time duration) [member function]
-    cls.add_method('DoNavStartNow', 
-                   'bool', 
-                   [param('ns3::Time', 'duration')])
-    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLow::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetBeaconInterval() const [member function]
-    cls.add_method('GetBeaconInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLow::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetCfpMaxDuration() const [member function]
-    cls.add_method('GetCfpMaxDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::GetCtsToSelfSupported() const [member function]
-    cls.add_method('GetCtsToSelfSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::WifiTxVector ns3::MacLow::GetDataTxVector(ns3::Ptr<const ns3::WifiMacQueueItem> item) const [member function]
-    cls.add_method('GetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item')], 
-                   is_const=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::MacLow::GetEdca(uint8_t tid) const [member function]
-    cls.add_method('GetEdca', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MpduAggregator> ns3::MacLow::GetMpduAggregator() const [member function]
-    cls.add_method('GetMpduAggregator', 
-                   'ns3::Ptr< ns3::MpduAggregator >', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MsduAggregator> ns3::MacLow::GetMsduAggregator() const [member function]
-    cls.add_method('GetMsduAggregator', 
-                   'ns3::Ptr< ns3::MsduAggregator >', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::MacLow::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetPifs() const [member function]
-    cls.add_method('GetPifs', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetRemainingCfpDuration() const [member function]
-    cls.add_method('GetRemainingCfpDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetSifs() const [member function]
-    cls.add_method('GetSifs', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetSlotTime() const [member function]
-    cls.add_method('GetSlotTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): static ns3::TypeId ns3::MacLow::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsCfPeriod() const [member function]
-    cls.add_method('IsCfPeriod', 
-                   'bool', 
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsPromisc() const [member function]
-    cls.add_method('IsPromisc', 
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
                    'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
                    [], 
                    is_const=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsWithinSizeAndTimeLimits(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector txVector, uint32_t ampduSize, ns3::Time ppduDurationLimit) [member function]
-    cls.add_method('IsWithinSizeAndTimeLimits', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize'), param('ns3::Time', 'ppduDurationLimit')])
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsWithinSizeAndTimeLimits(uint32_t mpduSize, ns3::Mac48Address receiver, uint8_t tid, ns3::WifiTxVector txVector, uint32_t ampduSize, ns3::Time ppduDurationLimit) [member function]
-    cls.add_method('IsWithinSizeAndTimeLimits', 
-                   'bool', 
-                   [param('uint32_t', 'mpduSize'), param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize'), param('ns3::Time', 'ppduDurationLimit')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifyOffNow() [member function]
-    cls.add_method('NotifyOffNow', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifySleepNow() [member function]
-    cls.add_method('NotifySleepNow', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifySwitchingStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifySwitchingStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveError(ns3::Ptr<ns3::WifiPsdu> psdu) [member function]
-    cls.add_method('ReceiveError', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, double rxSnr, ns3::WifiTxVector txVector, bool ampduSubframe) [member function]
-    cls.add_method('ReceiveOk', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('bool', 'ampduSubframe')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> channelAccessManager) [member function]
-    cls.add_method('RegisterChannelAccessManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ChannelAccessManager >', 'channelAccessManager')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterEdcaForAc(ns3::AcIndex ac, ns3::Ptr<ns3::QosTxop> edca) [member function]
-    cls.add_method('RegisterEdcaForAc', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac'), param('ns3::Ptr< ns3::QosTxop >', 'edca')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ResetPhy() [member function]
-    cls.add_method('ResetPhy', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RxStartIndication(ns3::WifiTxVector txVector, ns3::Time psduDuration) [member function]
-    cls.add_method('RxStartIndication', 
-                   'void', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'psduDuration')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetAddress(ns3::Mac48Address ad) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'ad')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetBeaconInterval(ns3::Time interval) [member function]
-    cls.add_method('SetBeaconInterval', 
-                   'void', 
-                   [param('ns3::Time', 'interval')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetBssid(ns3::Mac48Address ad) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'ad')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCfpMaxDuration(ns3::Time duration) [member function]
-    cls.add_method('SetCfpMaxDuration', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCtsToSelfSupported(bool enable) [member function]
-    cls.add_method('SetCtsToSelfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetMpduAggregator(ns3::Ptr<ns3::MpduAggregator> const aggr) [member function]
-    cls.add_method('SetMpduAggregator', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MpduAggregator > const', 'aggr')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetMsduAggregator(ns3::Ptr<ns3::MsduAggregator> const aggr) [member function]
-    cls.add_method('SetMsduAggregator', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MsduAggregator > const', 'aggr')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetPhy', 
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
+def register_Ns3MacRxMiddle_methods(root_module, cls):
+    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle::MacRxMiddle(ns3::MacRxMiddle const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MacRxMiddle const &', 'arg0')])
+    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle::MacRxMiddle() [constructor]
+    cls.add_constructor([])
+    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
                    'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetRxCallback(ns3::Callback<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetRxCallback', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::SetForwardCallback(ns3::MacRxMiddle::ForwardUpCallback callback) [member function]
+    cls.add_method('SetForwardCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const manager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'manager')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::StartTransmission(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::MacLowTransmissionParameters parameters, ns3::Ptr<ns3::Txop> txop) [member function]
-    cls.add_method('StartTransmission', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::Ptr< ns3::Txop >', 'txop')], 
-                   is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+    return
+
+def register_Ns3MacTxMiddle_methods(root_module, cls):
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle(ns3::MacTxMiddle const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MacTxMiddle const &', 'arg0')])
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle() [constructor]
+    cls.add_constructor([])
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSeqNumberByTidAndAddress(uint8_t tid, ns3::Mac48Address addr) const [member function]
+    cls.add_method('GetNextSeqNumberByTidAndAddress', 
+                   'uint16_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'addr')], 
+                   is_const=True)
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('GetNextSequenceNumberFor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('PeekNextSequenceNumberFor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## mac-tx-middle.h (module 'wifi'): void ns3::MacTxMiddle::SetSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('SetSequenceNumberFor', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
     return
 
 def register_Ns3MobilityModel_methods(root_module, cls):
@@ -16111,93 +17069,6 @@
                    is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3MpduAggregator_methods(root_module, cls):
-    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator(ns3::MpduAggregator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MpduAggregator const &', 'arg0')])
-    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator() [constructor]
-    cls.add_constructor([])
-    ## mpdu-aggregator.h (module 'wifi'): static void ns3::MpduAggregator::Aggregate(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::Ptr<ns3::Packet> ampdu, bool isSingle) [member function]
-    cls.add_method('Aggregate', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::Ptr< ns3::Packet >', 'ampdu'), param('bool', 'isSingle')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): static uint8_t ns3::MpduAggregator::CalculatePadding(uint32_t ampduSize) [member function]
-    cls.add_method('CalculatePadding', 
-                   'uint8_t', 
-                   [param('uint32_t', 'ampduSize')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): static ns3::AmpduSubframeHeader ns3::MpduAggregator::GetAmpduSubframeHeader(uint16_t mpduSize, bool isSingle) [member function]
-    cls.add_method('GetAmpduSubframeHeader', 
-                   'ns3::AmpduSubframeHeader', 
-                   [param('uint16_t', 'mpduSize'), param('bool', 'isSingle')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): uint32_t ns3::MpduAggregator::GetMaxAmpduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
-    cls.add_method('GetMaxAmpduSize', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
-                   is_const=True)
-    ## mpdu-aggregator.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > ns3::MpduAggregator::GetNextAmpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector txVector, ns3::Time ppduDurationLimit=ns3::Time::Min()) const [member function]
-    cls.add_method('GetNextAmpdu', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')], 
-                   is_const=True)
-    ## mpdu-aggregator.h (module 'wifi'): static uint32_t ns3::MpduAggregator::GetSizeIfAggregated(uint32_t mpduSize, uint32_t ampduSize) [member function]
-    cls.add_method('GetSizeIfAggregated', 
-                   'uint32_t', 
-                   [param('uint32_t', 'mpduSize'), param('uint32_t', 'ampduSize')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MpduAggregator::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::SetEdcaQueues(ns3::MpduAggregator::EdcaQueues edcaQueues) [member function]
-    cls.add_method('SetEdcaQueues', 
-                   'void', 
-                   [param('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'edcaQueues')])
-    return
-
-def register_Ns3MsduAggregator_methods(root_module, cls):
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator(ns3::MsduAggregator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MsduAggregator const &', 'arg0')])
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator() [constructor]
-    cls.add_constructor([])
-    ## msdu-aggregator.h (module 'wifi'): static uint8_t ns3::MsduAggregator::CalculatePadding(uint16_t amsduSize) [member function]
-    cls.add_method('CalculatePadding', 
-                   'uint8_t', 
-                   [param('uint16_t', 'amsduSize')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): static ns3::MsduAggregator::DeaggregatedMsdus ns3::MsduAggregator::Deaggregate(ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
-    cls.add_method('Deaggregate', 
-                   'ns3::MsduAggregator::DeaggregatedMsdus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): uint16_t ns3::MsduAggregator::GetMaxAmsduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
-    cls.add_method('GetMaxAmsduSize', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
-                   is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::MsduAggregator::GetNextAmsdu(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiTxVector txVector, uint32_t ampduSize=0, ns3::Time ppduDurationLimit=ns3::Time::Min()) const [member function]
-    cls.add_method('GetNextAmsdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize', default_value='0'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')], 
-                   is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): static uint16_t ns3::MsduAggregator::GetSizeIfAggregated(uint16_t msduSize, uint16_t amsduSize) [member function]
-    cls.add_method('GetSizeIfAggregated', 
-                   'uint16_t', 
-                   [param('uint16_t', 'msduSize'), param('uint16_t', 'amsduSize')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MsduAggregator::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::SetEdcaQueues(ns3::MsduAggregator::EdcaQueues map) [member function]
-    cls.add_method('SetEdcaQueues', 
-                   'void', 
-                   [param('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'map')])
-    return
-
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -16774,72 +17645,451 @@
     ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
     cls.add_method('RemovePacketTag', 
                    'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
-    cls.add_method('RemoveTrailer', 
-                   'uint32_t', 
-                   [param('ns3::Trailer &', 'trailer')])
-    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
-    cls.add_method('ReplacePacketTag', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('ReplacePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    cls.add_method('SetNixVector', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+    ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
+    cls.add_method('ToString', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ParetoRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ParetoRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable::ParetoRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetScale() const [member function]
+    cls.add_method('GetScale', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue(double scale, double shape, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3PhyEntity_methods(root_module, cls):
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyEntity() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyEntity(ns3::PhyEntity const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::PhyEntity::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('CalculatePhyPreambleAndHeaderDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) const [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::CanReceivePpdu(ns3::Ptr<ns3::WifiPpdu> ppdu, uint16_t txCenterFreq) const [member function]
+    cls.add_method('CanReceivePpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('uint16_t', 'txCenterFreq')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::CancelAllEvents() [member function]
+    cls.add_method('CancelAllEvents', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::CancelRunningEndPreambleDetectionEvents(bool clear=false) [member function]
+    cls.add_method('CancelRunningEndPreambleDetectionEvents', 
+                   'void', 
+                   [param('bool', 'clear', default_value='false')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceiveField', 
+                   'void', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::PhyEntity::GetAddressedPsduInPpdu(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetAddressedPsduInPpdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetDurationUpToField(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDurationUpToField', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint32_t ns3::PhyEntity::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiMode ns3::PhyEntity::GetMcs(uint8_t index) const [member function]
+    cls.add_method('GetMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiPpduField ns3::PhyEntity::GetNextField(ns3::WifiPpduField currentField, ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetNextField', 
+                   'ns3::WifiPpduField', 
+                   [param('ns3::WifiPpduField', 'currentField'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint8_t ns3::PhyEntity::GetNumModes() const [member function]
+    cls.add_method('GetNumModes', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) const [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyHeaderSections ns3::PhyEntity::GetPhyHeaderSections(ns3::WifiTxVector const & txVector, ns3::Time ppduStart) const [member function]
+    cls.add_method('GetPhyHeaderSections', 
+                   'ns3::PhyEntity::PhyHeaderSections', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduStart')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetRemainingDurationAfterField(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiPpduField field) const [member function]
+    cls.add_method('GetRemainingDurationAfterField', 
+                   'ns3::Time', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiPpduField', 'field')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetRxChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetRxChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiMode ns3::PhyEntity::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetStaId(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetTransmissionChannelWidth(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTransmissionChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiConstPsduMap ns3::PhyEntity::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::HandlesMcsModes() const [member function]
+    cls.add_method('HandlesMcsModes', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsMcsSupported(uint8_t index) const [member function]
+    cls.add_method('IsMcsSupported', 
+                   'bool', 
+                   [param('uint8_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsModeSupported(ns3::WifiMode mode) const [member function]
+    cls.add_method('IsModeSupported', 
+                   'bool', 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::NoEndPreambleDetectionEvents() const [member function]
+    cls.add_method('NoEndPreambleDetectionEvents', 
                    'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   [], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
-    cls.add_method('SetNixVector', 
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ResetReceive', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
-    ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
-    cls.add_method('ToString', 
-                   'std::string', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::SetOwner(ns3::Ptr<ns3::WifiPhy> wifiPhy) [member function]
+    cls.add_method('SetOwner', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'wifiPhy')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceiveField', 
+                   'void', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreamble', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::Transmit(ns3::Time txDuration, ns3::Ptr<ns3::WifiPpdu> ppdu, std::string type) [member function]
+    cls.add_method('Transmit', 
+                   'void', 
+                   [param('ns3::Time', 'txDuration'), param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::string', 'type')])
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::begin() const [member function]
+    cls.add_method('begin', 
+                   'std::list< ns3::WifiMode > const_iterator', 
                    [], 
                    is_const=True)
-    return
-
-def register_Ns3ParetoRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ParetoRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable::ParetoRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetScale() const [member function]
-    cls.add_method('GetScale', 
-                   'double', 
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::end() const [member function]
+    cls.add_method('end', 
+                   'std::list< ns3::WifiMode > const_iterator', 
                    [], 
                    is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetShape() const [member function]
-    cls.add_method('GetShape', 
-                   'double', 
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::AbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('AbortCurrentReception', 
+                   'void', 
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::AddPreambleEvent(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('AddPreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::PhyEntity::CreateInterferenceEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [member function]
+    cls.add_method('CreateInterferenceEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoAbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('DoAbortCurrentReception', 
+                   'void', 
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::PhyEntity::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoEndReceivePayload(ns3::Ptr<const ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('DoEndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::PhyEntity::DoEndReceivePreamble(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceivePreamble', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::PhyEntity::DoGetEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    cls.add_method('DoGetEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::DoStartReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceiveField', 
+                   'bool', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoStartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DropPreambleEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiPhyRxfailureReason reason, ns3::Time endRx, uint16_t measurementChannelWidth) [member function]
+    cls.add_method('DropPreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiPhyRxfailureReason', 'reason'), param('ns3::Time', 'endRx'), param('uint16_t', 'measurementChannelWidth')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndOfMpdu(ns3::Ptr<ns3::Event> event, ns3::Ptr<const ns3::WifiPsdu> psdu, size_t mpduIndex, ns3::Time relativeStart, ns3::Time mpduDuration) [member function]
+    cls.add_method('EndOfMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('size_t', 'mpduIndex'), param('ns3::Time', 'relativeStart'), param('ns3::Time', 'mpduDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndPreambleDetectionPeriod(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndPreambleDetectionPeriod', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ErasePreambleEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::Time rxDuration) [member function]
+    cls.add_method('ErasePreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::Time', 'rxDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetCenterFrequencyForChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetCenterFrequencyForChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetChannelWidthAndBand', 
+                   'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<const ns3::Event> ns3::PhyEntity::GetCurrentEvent() const [member function]
+    cls.add_method('GetCurrentEvent', 
+                   'ns3::Ptr< ns3::Event const >', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetBound() const [member function]
-    cls.add_method('GetBound', 
-                   'double', 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long, ns3::WifiPreamble> >, std::allocator<std::pair<const std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event> > > > const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
+    cls.add_method('GetCurrentPreambleEvents', 
+                   'std::map< std::pair< unsigned long, ns3::WifiPreamble >, ns3::Ptr< ns3::Event > > const &', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue(double scale, double shape, double bound) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::PhyEntity::GetPhyHeaderSnrPer(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) const [member function]
+    cls.add_method('GetPhyHeaderSnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::PhyEntity::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): double ns3::PhyEntity::GetRandomValue() const [member function]
+    cls.add_method('GetRandomValue', 
                    'double', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::pair<bool, ns3::SignalNoiseDbm> ns3::PhyEntity::GetReceptionStatus(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::Ptr<ns3::Event> event, uint16_t staId, ns3::Time relativeMpduStart, ns3::Time mpduDuration) [member function]
+    cls.add_method('GetReceptionStatus', 
+                   'std::pair< bool, ns3::SignalNoiseDbm >', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'staId'), param('ns3::Time', 'relativeMpduStart'), param('ns3::Time', 'mpduDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): double ns3::PhyEntity::GetRxPowerWForPpdu(ns3::Ptr<ns3::Event> event) const [member function]
+    cls.add_method('GetRxPowerWForPpdu', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::tuple<double, double, double> ns3::PhyEntity::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::PhyEntity::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsConfigSupported(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsConfigSupported', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::NotifyInterferenceRxEndAndClear(bool reset) [member function]
+    cls.add_method('NotifyInterferenceRxEndAndClear', 
+                   'void', 
+                   [param('bool', 'reset')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint64_t ns3::PhyEntity::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('ObtainNextUid', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ScheduleEndOfMpdus(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ScheduleEndOfMpdus', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartPreambleDetectionPeriod(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartPreambleDetectionPeriod', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::UpdateInterferenceEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateInterferenceEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')], 
+                   visibility='protected')
+    return
+
+def register_Ns3PhyEntityPhyFieldRxStatus_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(ns3::PhyEntity::PhyFieldRxStatus const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity::PhyFieldRxStatus const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(bool s) [constructor]
+    cls.add_constructor([param('bool', 's')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(bool s, ns3::WifiPhyRxfailureReason r, ns3::PhyEntity::PhyRxFailureAction a) [constructor]
+    cls.add_constructor([param('bool', 's'), param('ns3::WifiPhyRxfailureReason', 'r'), param('ns3::PhyEntity::PhyRxFailureAction', 'a')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::actionIfFailure [variable]
+    cls.add_instance_attribute('actionIfFailure', 'ns3::PhyEntity::PhyRxFailureAction', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::isSuccess [variable]
+    cls.add_instance_attribute('isSuccess', 'bool', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::reason [variable]
+    cls.add_instance_attribute('reason', 'ns3::WifiPhyRxfailureReason', is_const=False)
+    return
+
+def register_Ns3PhyEntitySnrPer_methods(root_module, cls):
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer(ns3::PhyEntity::SnrPer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity::SnrPer const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer(double s, double p) [constructor]
+    cls.add_constructor([param('double', 's'), param('double', 'p')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::per [variable]
+    cls.add_instance_attribute('per', 'double', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
     return
 
 def register_Ns3PointerChecker_methods(root_module, cls):
@@ -16887,9 +18137,104 @@
                    [param('ns3::Ptr< ns3::Object >', 'object')])
     return
 
+def register_Ns3QosFrameExchangeManager_methods(root_module, cls):
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::QosFrameExchangeManager::QosFrameExchangeManager(ns3::QosFrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::QosFrameExchangeManager const &', 'arg0')])
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::QosFrameExchangeManager::QosFrameExchangeManager() [constructor]
+    cls.add_constructor([])
+    ## qos-frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::QosFrameExchangeManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::IsWithinLimitsIfAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams, ns3::Time ppduDurationLimit) const [member function]
+    cls.add_method('IsWithinLimitsIfAddMpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Time', 'ppduDurationLimit')], 
+                   is_const=True, is_virtual=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::IsWithinSizeAndTimeLimits(uint32_t ppduPayloadSize, ns3::Mac48Address receiver, ns3::WifiTxParameters const & txParams, ns3::Time ppduDurationLimit) const [member function]
+    cls.add_method('IsWithinSizeAndTimeLimits', 
+                   'bool', 
+                   [param('uint32_t', 'ppduPayloadSize'), param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Time', 'ppduDurationLimit')], 
+                   is_const=True, is_virtual=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::StartTransmission(ns3::Ptr<ns3::Txop> edca) [member function]
+    cls.add_method('StartTransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'edca')], 
+                   is_virtual=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime) const [member function]
+    cls.add_method('TryAddMpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime')], 
+                   is_const=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::QosFrameExchangeManager::GetCtsToSelfDurationId(ns3::WifiTxVector const & ctsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetCtsToSelfDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'ctsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::QosFrameExchangeManager::GetFrameDurationId(ns3::WifiMacHeader const & header, uint32_t size, ns3::WifiTxParameters const & txParams, ns3::Ptr<ns3::Packet> fragmentedPacket) const [member function]
+    cls.add_method('GetFrameDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Ptr< ns3::Packet >', 'fragmentedPacket')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::QosFrameExchangeManager::GetRtsDurationId(ns3::WifiTxVector const & rtsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetRtsDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'rtsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::PifsRecovery() [member function]
+    cls.add_method('PifsRecovery', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::PreProcessFrame(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('PreProcessFrame', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::ReceiveMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector const & txVector, bool inAmpdu) [member function]
+    cls.add_method('ReceiveMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::SendCfEndIfNeeded() [member function]
+    cls.add_method('SendCfEndIfNeeded', 
+                   'bool', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::SetTxopHolder(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('SetTxopHolder', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::StartFrameExchange(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('StartFrameExchange', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::StartTransmission(ns3::Ptr<ns3::QosTxop> edca, ns3::Time txopDuration) [member function]
+    cls.add_method('StartTransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'txopDuration')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::TransmissionFailed() [member function]
+    cls.add_method('TransmissionFailed', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::TransmissionSucceeded() [member function]
+    cls.add_method('TransmissionSucceeded', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    return
+
 def register_Ns3QosTxop_methods(root_module, cls):
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::m_aMpduEnabled [variable]
-    cls.add_instance_attribute('m_aMpduEnabled', 'std::map< ns3::Mac48Address, bool >', is_const=False)
     ## qos-txop.h (module 'wifi'): static ns3::TypeId ns3::QosTxop::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -16902,6 +18247,11 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): ns3::AcIndex ns3::QosTxop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
     cls.add_method('SetWifiRemoteStationManager', 
                    'void', 
@@ -16912,89 +18262,39 @@
                    'bool', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyAccessGranted() [member function]
-    cls.add_method('NotifyAccessGranted', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyInternalCollision() [member function]
     cls.add_method('NotifyInternalCollision', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAck() [member function]
-    cls.add_method('GotAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('GotBlockAck', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
+    cls.add_method('NotifyChannelAccessed', 
                    'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')], 
+                   [param('ns3::Time', 'txopDuration')], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::MissedBlockAck(uint8_t nMpdus) [member function]
-    cls.add_method('MissedBlockAck', 
-                   'void', 
-                   [param('uint8_t', 'nMpdus')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::MissedAck() [member function]
-    cls.add_method('MissedAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartNextPacket() [member function]
-    cls.add_method('StartNextPacket', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::EndTxNoAck() [member function]
-    cls.add_method('EndTxNoAck', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelReleased() [member function]
+    cls.add_method('NotifyChannelReleased', 
                    'void', 
                    [], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::RestartAccessIfNeeded() [member function]
-    cls.add_method('RestartAccessIfNeeded', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
                    'void', 
-                   [], 
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartAccessIfNeeded() [member function]
-    cls.add_method('StartAccessIfNeeded', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosFrameExchangeManager(ns3::Ptr<ns3::QosFrameExchangeManager> const qosFem) [member function]
+    cls.add_method('SetQosFrameExchangeManager', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetTxopRemaining() const [member function]
-    cls.add_method('GetTxopRemaining', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::NeedFragmentation() const [member function]
-    cls.add_method('NeedFragmentation', 
+                   [param('ns3::Ptr< ns3::QosFrameExchangeManager > const', 'qosFem')])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::UseExplicitBarAfterMissedBlockAck() const [member function]
+    cls.add_method('UseExplicitBarAfterMissedBlockAck', 
                    'bool', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::QosTxop::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
-    cls.add_method('GetFragmentPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('ns3::WifiMacHeader *', 'hdr')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAckPolicySelector(ns3::Ptr<ns3::WifiAckPolicySelector> ackSelector) [member function]
-    cls.add_method('SetAckPolicySelector', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiAckPolicySelector >', 'ackSelector')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiAckPolicySelector> ns3::QosTxop::GetAckPolicySelector() const [member function]
-    cls.add_method('GetAckPolicySelector', 
-                   'ns3::Ptr< ns3::WifiAckPolicySelector >', 
-                   [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')])
-    ## qos-txop.h (module 'wifi'): ns3::TypeOfStation ns3::QosTxop::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
-                   [], 
                    is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::BlockAckManager> ns3::QosTxop::GetBaManager() [member function]
+    cls.add_method('GetBaManager', 
+                   'ns3::Ptr< ns3::BlockAckManager >', 
+                   [])
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetBaAgreementEstablished(ns3::Mac48Address address, uint8_t tid) const [member function]
     cls.add_method('GetBaAgreementEstablished', 
                    'bool', 
@@ -17010,6 +18310,16 @@
                    'uint16_t', 
                    [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
                    is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::BlockAckReqType ns3::QosTxop::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::BlockAckType ns3::QosTxop::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PrepareBlockAckRequest(ns3::Mac48Address recipient, uint8_t tid) const [member function]
     cls.add_method('PrepareBlockAckRequest', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
@@ -17019,10 +18329,6 @@
     cls.add_method('ScheduleBar', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyMissedCts(std::list<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [member function]
-    cls.add_method('NotifyMissedCts', 
-                   'void', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAddBaResponse(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
     cls.add_method('GotAddBaResponse', 
                    'void', 
@@ -17031,10 +18337,14 @@
     cls.add_method('GotDelBaFrame', 
                    'void', 
                    [param('ns3::MgtDelBaHeader const *', 'delBaHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::NeedBarRetransmission() [member function]
-    cls.add_method('NeedBarRetransmission', 
-                   'bool', 
-                   [])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AddBaResponseTimeout(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('AddBaResponseTimeout', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ResetBa(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('ResetBa', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAccessCategory(ns3::AcIndex ac) [member function]
     cls.add_method('SetAccessCategory', 
                    'void', 
@@ -17043,10 +18353,6 @@
     cls.add_method('PushFront', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteConfig() [member function]
-    cls.add_method('CompleteConfig', 
-                   'void', 
-                   [])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckThreshold(uint8_t threshold) [member function]
     cls.add_method('SetBlockAckThreshold', 
                    'void', 
@@ -17060,23 +18366,15 @@
     cls.add_method('SetBlockAckInactivityTimeout', 
                    'void', 
                    [param('uint16_t', 'timeout')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
-    cls.add_method('SendDelbaFrame', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')])
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBlockAckInactivityTimeout() const [member function]
+    cls.add_method('GetBlockAckInactivityTimeout', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteMpduTx(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('CompleteMpduTx', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetAmpduExist(ns3::Mac48Address dest) const [member function]
-    cls.add_method('GetAmpduExist', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAmpduExist(ns3::Mac48Address dest, bool enableAmpdu) [member function]
-    cls.add_method('SetAmpduExist', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'dest'), param('bool', 'enableAmpdu')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAddBaResponseTimeout(ns3::Time addBaResponseTimeout) [member function]
     cls.add_method('SetAddBaResponseTimeout', 
                    'void', 
@@ -17103,76 +18401,49 @@
     cls.add_method('PeekNextSequenceNumberFor', 
                    'uint16_t', 
                    [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextFrame(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextFrame', 
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('PeekNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
                    [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::DequeuePeekedFrame(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxVector txVector, bool aggregate=true, uint32_t ampduSize=0, ns3::Time ppduDurationLimit=ns3::Time::Min()) [member function]
-    cls.add_method('DequeuePeekedFrame', 
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::QueueIteratorPair queueIt, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('PeekNextMpdu', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::WifiMacQueueItem::QueueIteratorPair', 'queueIt'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame, ns3::WifiMacQueueItem::QueueIteratorPair & queueIt) [member function]
+    cls.add_method('GetNextMpdu', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxVector', 'txVector'), param('bool', 'aggregate', default_value='true'), param('uint32_t', 'ampduSize', default_value='0'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')])
-    ## qos-txop.h (module 'wifi'): ns3::MacLowTransmissionParameters ns3::QosTxop::GetTransmissionParameters(ns3::Ptr<const ns3::WifiMacQueueItem> frame) const [member function]
-    cls.add_method('GetTransmissionParameters', 
-                   'ns3::MacLowTransmissionParameters', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'frame')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::QueueIteratorPair &', 'queueIt')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AssignSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('AssignSequenceNumber', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::UpdateCurrentPacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('UpdateCurrentPacket', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosQueueSize(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('SetQosQueueSize', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::BaTxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('BaTxOk', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::BaTxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('BaTxFailed', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Mac48Address ns3::QosTxop::MapSrcAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('MapSrcAddressForAggregation', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Mac48Address ns3::QosTxop::MapDestAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('MapDestAddressForAggregation', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsTxopStarted() const [member function]
+    cls.add_method('IsTxopStarted', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetRemainingTxop() const [member function]
+    cls.add_method('GetRemainingTxop', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::QosTxop const & arg0) [constructor]
     cls.add_constructor([param('ns3::QosTxop const &', 'arg0')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='private')
+                   is_virtual=True, visibility='protected')
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::TerminateTxop() [member function]
-    cls.add_method('TerminateTxop', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetNextFragmentSize() const [member function]
-    cls.add_method('GetNextFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetFragmentSize() const [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetFragmentOffset() const [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsLastFragment() const [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3Queue__Ns3Packet_methods(root_module, cls):
@@ -17234,6 +18505,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::Packet >', 
@@ -17259,6 +18535,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
@@ -17320,6 +18601,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::QueueDiscItem >', 
@@ -17345,6 +18631,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3Queue__Ns3WifiMacQueueItem_methods(root_module, cls):
@@ -17406,6 +18697,11 @@
                    'bool', 
                    [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::WifiMacQueueItem>::DoEnqueue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item, ns3::Queue<ns3::WifiMacQueueItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item'), param('ns3::Queue< ns3::WifiMacQueueItem > Iterator &', 'ret')], 
+                   visibility='protected')
     ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoDequeue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
     cls.add_method('DoDequeue', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
@@ -17431,6 +18727,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
                    visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3QueueItem_methods(root_module, cls):
@@ -17676,7 +18977,12 @@
                    'void', 
                    [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::RegularWifiMac::ForwardUpCallback upCallback) [member function]
+    ## regular-wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::RegularWifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
@@ -17691,11 +18997,21 @@
                    'void', 
                    [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
                    is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
+    cls.add_method('GetWifiRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
     cls.add_method('Enqueue', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::RegularWifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
     cls.add_method('SetCtsToSelfSupported', 
                    'void', 
@@ -17704,11 +19020,21 @@
     cls.add_method('SetBssid', 
                    'void', 
                    [param('ns3::Mac48Address', 'bssid')])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
                    [], 
-                   is_const=True, is_virtual=True)
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
     cls.add_method('GetExtendedCapabilities', 
                    'ns3::ExtendedCapabilities', 
@@ -17739,11 +19065,11 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
-    cls.add_method('GetTxop', 
-                   'ns3::Ptr< ns3::Txop >', 
-                   [], 
-                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_virtual=True, visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
     cls.add_method('GetVOQueue', 
                    'ns3::Ptr< ns3::QosTxop >', 
@@ -17769,26 +19095,11 @@
                    'void', 
                    [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
                    visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('Receive', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxOk', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxFailed', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
     cls.add_method('ForwardUp', 
                    'void', 
@@ -17799,11 +19110,6 @@
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SendAddBaResponse(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address originator) [member function]
-    cls.add_method('SendAddBaResponse', 
-                   'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'originator')], 
-                   visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
     cls.add_method('SetQosSupported', 
                    'void', 
@@ -17814,6 +19120,11 @@
                    'bool', 
                    [], 
                    is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetupFrameExchangeManager() [member function]
+    cls.add_method('SetupFrameExchangeManager', 
+                   'void', 
+                   [], 
+                   visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
     cls.add_method('GetHtSupported', 
                    'bool', 
@@ -18172,7 +19483,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
     cls.add_method('GetSupportedChannelWidthSet', 
                    'uint8_t', 
@@ -18212,7 +19523,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -18280,26 +19591,31 @@
                    [param('uint8_t', 'vhtSupported')])
     return
 
-def register_Ns3WaveMacLow_methods(root_module, cls):
-    ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow::WaveMacLow(ns3::WaveMacLow const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WaveMacLow const &', 'arg0')])
-    ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow::WaveMacLow() [constructor]
+def register_Ns3WaveFrameExchangeManager_methods(root_module, cls):
+    ## wave-frame-exchange-manager.h (module 'wave'): ns3::WaveFrameExchangeManager::WaveFrameExchangeManager(ns3::WaveFrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WaveFrameExchangeManager const &', 'arg0')])
+    ## wave-frame-exchange-manager.h (module 'wave'): ns3::WaveFrameExchangeManager::WaveFrameExchangeManager() [constructor]
     cls.add_constructor([])
-    ## wave-mac-low.h (module 'wave'): static ns3::TypeId ns3::WaveMacLow::GetTypeId() [member function]
+    ## wave-frame-exchange-manager.h (module 'wave'): static ns3::TypeId ns3::WaveFrameExchangeManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wave-mac-low.h (module 'wave'): void ns3::WaveMacLow::SetWaveNetDevice(ns3::Ptr<ns3::WaveNetDevice> device) [member function]
+    ## wave-frame-exchange-manager.h (module 'wave'): void ns3::WaveFrameExchangeManager::SetWaveNetDevice(ns3::Ptr<ns3::WaveNetDevice> device) [member function]
     cls.add_method('SetWaveNetDevice', 
                    'void', 
                    [param('ns3::Ptr< ns3::WaveNetDevice >', 'device')])
-    ## wave-mac-low.h (module 'wave'): void ns3::WaveMacLow::StartTransmission(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::MacLowTransmissionParameters parameters, ns3::Ptr<ns3::Txop> txop) [member function]
+    ## wave-frame-exchange-manager.h (module 'wave'): bool ns3::WaveFrameExchangeManager::StartTransmission(ns3::Ptr<ns3::Txop> dcf) [member function]
     cls.add_method('StartTransmission', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::Ptr< ns3::Txop >', 'txop')], 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'dcf')], 
                    is_virtual=True)
-    ## wave-mac-low.h (module 'wave'): ns3::WifiTxVector ns3::WaveMacLow::GetDataTxVector(ns3::Ptr<const ns3::WifiMacQueueItem> item) const [member function]
+    ## wave-frame-exchange-manager.h (module 'wave'): void ns3::WaveFrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## wave-frame-exchange-manager.h (module 'wave'): ns3::WifiTxVector ns3::WaveFrameExchangeManager::GetDataTxVector(ns3::Ptr<const ns3::WifiMacQueueItem> item) const [member function]
     cls.add_method('GetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item')], 
@@ -18407,6 +19723,16 @@
     cls.add_method('GetNPacketsByTidAndAddress', 
                    'uint32_t', 
                    [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPackets(uint8_t tid, ns3::Mac48Address dest) const [member function]
+    cls.add_method('GetNPackets', 
+                   'uint32_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNBytes(uint8_t tid, ns3::Mac48Address dest) const [member function]
+    cls.add_method('GetNBytes', 
+                   'uint32_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')], 
+                   is_const=True)
     ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::IsEmpty() [member function]
     cls.add_method('IsEmpty', 
                    'bool', 
@@ -18878,6 +20204,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -18900,6 +20248,94 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0, short unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('ns3::WifiTxVector const &', 'arg0'), param('short unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): short unsigned int ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'short unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Const_ns3Ipv4Header___amp___Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ipv4L3ProtocolDropReason_Ns3Ptr__lt__ns3Ipv4__gt___Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -19032,28 +20468,6 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3HePreambleParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::HePreambleParameters arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::HePreambleParameters', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -19517,25 +20931,25 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Double_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
     cls.add_method('DoGetTypeid', 
                    'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
     cls.add_method('GetTypeid', 
                    'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, double arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
     cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('double', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('ns3::RxSignalInfo', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     cls.add_copy_constructor()
     return
@@ -19628,6 +21042,28 @@
                    custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiMacDropReason arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::WifiMacDropReason', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -19695,6 +21131,73 @@
     cls.add_copy_constructor()
     return
 
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiPsdu> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiPsdu const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * arg2, long unsigned int arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
+    return
+
 def register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
@@ -19827,6 +21330,11 @@
                    'void', 
                    [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('Receive', 
                    'void', 
@@ -20079,16 +21587,6 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wave-net-device.h (module 'wave'): ns3::Ptr<ns3::Node> ns3::WaveNetDevice::GetNode() const [member function]
-    cls.add_method('GetNode', 
-                   'ns3::Ptr< ns3::Node >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wave-net-device.h (module 'wave'): void ns3::WaveNetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('SetNode', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_virtual=True)
     ## wave-net-device.h (module 'wave'): bool ns3::WaveNetDevice::NeedsArp() const [member function]
     cls.add_method('NeedsArp', 
                    'bool', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/examples/vanet-routing-compare.cc ns-3.34/src/wave/examples/vanet-routing-compare.cc
--- ns-3.33/src/wave/examples/vanet-routing-compare.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/examples/vanet-routing-compare.cc	2021-07-14 10:31:07.000000000 -0700
@@ -137,7 +137,6 @@
 public:
   /**
    * \brief Constructor
-   * \return none
    */
   RoutingStats ();
 
@@ -169,27 +168,23 @@
    * \brief Increments the number of (application-data)
    * bytes received, not including MAC/PHY overhead
    * \param rxBytes the number of bytes received
-   * \return none
    */
   void IncRxBytes (uint32_t rxBytes);
 
   /**
    * \brief Increments the count of packets received
-   * \return none
    */
   void IncRxPkts ();
 
   /**
    * \brief Sets the number of bytes received.
    * \param rxBytes the number of bytes received
-   * \return none
    */
   void SetRxBytes (uint32_t rxBytes);
 
   /**
    * \brief Sets the number of packets received
    * \param rxPkts the number of packets received
-   * \return none
    */
   void SetRxPkts (uint32_t rxPkts);
 
@@ -201,7 +196,7 @@
 
   /**
    * \brief Returns the cumulative number of bytes transmitted
-   * \return none
+   * \return the cumulative number of bytes transmitted
    */
   uint32_t GetCumulativeTxBytes ();
 
@@ -220,27 +215,23 @@
   /**
    * \brief Increment the number of bytes transmitted
    * \param txBytes the number of additional bytes transmitted
-   * \return none
    */
   void IncTxBytes (uint32_t txBytes);
 
   /**
    * \brief Increment the count of packets transmitted
-   * \return none
    */
   void IncTxPkts ();
 
   /**
    * \brief Sets the number of bytes transmitted
    * \param txBytes the number of bytes transmitted
-   * \return none
    */
   void SetTxBytes (uint32_t txBytes);
 
   /**
    * \brief Sets the number of packets transmitted
    * \param txPkts the number of packets transmitted
-   * \return none
    */
   void SetTxPkts (uint32_t txPkts);
 
@@ -388,13 +379,11 @@
 
   /**
    * \brief Constructor
-   * \return none
    */
   RoutingHelper ();
 
   /**
    * \brief Destructor
-   * \return none
    */
   virtual ~RoutingHelper ();
 
@@ -409,7 +398,6 @@
    * \param protocol the routing protocol (1=OLSR;2=AODV;3=DSDV;4=DSR)
    * \param nSinks the number of nodes which will act as data sinks
    * \param routingTables dump routing tables at t=5 seconds (0=no;1=yes)
-   * \return none
    */
   void Install (NodeContainer & c,
                 NetDeviceContainer & d,
@@ -423,7 +411,6 @@
    * \brief Trace the receipt of an on-off-application generated packet
    * \param context this object
    * \param packet a received packet
-   * \return none
    */
   void OnOffTrace (std::string context, Ptr<const Packet> packet);
 
@@ -436,7 +423,6 @@
   /**
    * \brief Enable/disable logging
    * \param log non-zero to enable logging
-   * \return none
    */
   void SetLogging (int log);
 
@@ -444,7 +430,6 @@
   /**
    * \brief Sets up the protocol protocol on the nodes
    * \param c node container
-   * \return none
    */
   void SetupRoutingProtocol (NodeContainer & c);
 
@@ -452,7 +437,6 @@
    * \brief Assigns IPv4 addresses to net devices and their interfaces
    * \param d net device container
    * \param adhocTxInterfaces IPv4 interface container
-   * \return none
    */
   void AssignIpAddresses (NetDeviceContainer & d,
                           Ipv4InterfaceContainer & adhocTxInterfaces);
@@ -461,7 +445,6 @@
    * \brief Sets up routing messages on the nodes and their interfaces
    * \param c node container
    * \param adhocTxInterfaces IPv4 interface container
-   * \return none
    */
   void SetupRoutingMessages (NodeContainer & c,
                              Ipv4InterfaceContainer & adhocTxInterfaces);
@@ -477,7 +460,6 @@
   /**
    * \brief Process a received routing packet
    * \param socket the receiving socket
-   * \return none
    */
   void ReceiveRoutingPacket (Ptr<Socket> socket);
 
@@ -659,6 +641,13 @@
     }
 }
 
+/**
+ * Print a received routing packet on a string
+ * \param socket Rx socket
+ * \param packet Rx packet
+ * \param srcAddress source address
+ * \return the built string
+ */
 static inline std::string
 PrintReceivedRoutingPacket (Ptr<Socket> socket, Ptr<Packet> packet, Address srcAddress)
 {
@@ -730,13 +719,11 @@
 
   /**
    * \brief Constructor
-   * \return none
    */
   WifiPhyStats ();
 
   /**
    * \brief Destructor
-   * \return none
    */
   virtual ~WifiPhyStats ();
 
@@ -754,7 +741,6 @@
    * \param mode wifi mode
    * \param preamble wifi preamble
    * \param txPower transmission power
-   * \return none
    */
   void PhyTxTrace (std::string context, Ptr<const Packet> packet, WifiMode mode, WifiPreamble preamble, uint8_t txPower);
 
@@ -762,7 +748,6 @@
    * \brief Callback signiture for Phy/TxDrop
    * \param context this object
    * \param packet the tx packet being dropped
-   * \return none
    */
   void PhyTxDrop (std::string context, Ptr<const Packet> packet);
 
@@ -770,9 +755,9 @@
    * \brief Callback signiture for Phy/RxDrop
    * \param context this object
    * \param packet the rx packet being dropped
-   * \return none
+   * \param reason the reason for the drop
    */
-  void PhyRxDrop (std::string context, Ptr<const Packet> packet);
+  void PhyRxDrop (std::string context, Ptr<const Packet> packet, WifiPhyRxfailureReason reason);
 
 private:
   uint32_t m_phyTxPkts; ///< phy transmit packets
@@ -818,7 +803,7 @@
 }
 
 void
-WifiPhyStats::PhyRxDrop (std::string context, Ptr<const Packet> packet)
+WifiPhyStats::PhyRxDrop (std::string context, Ptr<const Packet> packet, WifiPhyRxfailureReason reason)
 {
   NS_LOG_UNCOND ("PHY Rx Drop");
 }
@@ -838,13 +823,11 @@
 public:
   /**
    * \brief Constructor
-   * \return none
    */
   WifiApp ();
 
   /**
    * \brief Destructor
-   * \return none
    */
   virtual ~WifiApp ();
 
@@ -852,14 +835,12 @@
    * \brief Enacts simulation of an ns-3 wifi application
    * \param argc program arguments count
    * \param argv program arguments
-   * \return none
    */
   void Simulate (int argc, char **argv);
 
 protected:
   /**
    * \brief Sets default attribute values
-   * \return none
    */
   virtual void SetDefaultAttributeValues ();
 
@@ -867,55 +848,46 @@
    * \brief Process command line arguments
    * \param argc program arguments count
    * \param argv program arguments
-   * \return none
    */
   virtual void ParseCommandLineArguments (int argc, char **argv);
 
   /**
    * \brief Configure nodes
-   * \return none
    */
   virtual void ConfigureNodes ();
 
   /**
    * \brief Configure channels
-   * \return none
    */
   virtual void ConfigureChannels ();
 
   /**
    * \brief Configure devices
-   * \return none
    */
   virtual void ConfigureDevices ();
 
   /**
    * \brief Configure mobility
-   * \return none
    */
   virtual void ConfigureMobility ();
 
   /**
    * \brief Configure applications
-   * \return none
    */
   virtual void ConfigureApplications ();
 
   /**
    * \brief Configure tracing
-   * \return none
    */
   virtual void ConfigureTracing ();
 
   /**
    * \brief Run the simulation
-   * \return none
    */
   virtual void RunSimulation ();
 
   /**
    * \brief Process outputs
-   * \return none
    */
   virtual void ProcessOutputs ();
 };
@@ -1020,21 +992,18 @@
 public:
   /**
    * \brief Constructor
-   * \return none
    */
   ConfigStoreHelper ();
 
   /**
    * \brief Loads a saved config-store raw text configuration from a given named file
    * \param configFilename the name of the config-store raw text file
-   * \return none
    */
   void LoadConfig (std::string configFilename);
 
   /**
    * \brief Saves a configuration to a given named config-store raw text configuration file
    * \param configFilename the name of the config-store raw text file
-   * \return none
    */
   void SaveConfig (std::string configFilename);
 };
@@ -1081,14 +1050,12 @@
 public:
   /**
    * \brief Constructor
-   * \return none
    */
   VanetRoutingExperiment ();
 
 protected:
   /**
    * \brief Sets default attribute values
-   * \return none
    */
   virtual void SetDefaultAttributeValues ();
 
@@ -1096,62 +1063,52 @@
    * \brief Process command line arguments
    * \param argc program arguments count
    * \param argv program arguments
-   * \return none
    */
   virtual void ParseCommandLineArguments (int argc, char **argv);
 
   /**
    * \brief Configure nodes
-   * \return none
    */
   virtual void ConfigureNodes ();
 
   /**
    * \brief Configure channels
-   * \return none
    */
   virtual void ConfigureChannels ();
 
   /**
    * \brief Configure devices
-   * \return none
    */
   virtual void ConfigureDevices ();
 
   /**
    * \brief Configure mobility
-   * \return none
    */
   virtual void ConfigureMobility ();
 
   /**
    * \brief Configure applications
-   * \return none
    */
   virtual void ConfigureApplications ();
 
   /**
    * \brief Configure tracing
-   * \return none
    */
   virtual void ConfigureTracing ();
 
   /**
    * \brief Run the simulation
-   * \return none
    */
   virtual void RunSimulation ();
 
   /**
    * \brief Process outputs
-   * \return none
    */
   virtual void ProcessOutputs ();
 
 private:
   /**
    * \brief Run the simulation
-   * \return none
    */
   void Run ();
 
@@ -1159,44 +1116,37 @@
    * \brief Run the simulation
    * \param argc command line argument count
    * \param argv command line parameters
-   * \return none
    */
   void CommandSetup (int argc, char **argv);
 
   /**
    * \brief Checks the throughput and outputs summary to CSV file1.
    * This is scheduled and called once per second
-   * \return none
    */
   void CheckThroughput ();
 
   /**
    * \brief Set up log file
-   * \return none
    */
   void SetupLogFile ();
 
   /**
    * \brief Set up logging
-   * \return none
    */
   void SetupLogging ();
 
   /**
    * \brief Configure default attributes
-   * \return none
    */
   void ConfigureDefaults ();
 
   /**
    * \brief Set up the adhoc mobility nodes
-   * \return none
    */
   void SetupAdhocMobilityNodes ();
 
   /**
    * \brief Set up the adhoc devices
-   * \return none
    */
   void SetupAdhocDevices ();
 
@@ -1205,38 +1155,32 @@
    * as a Basic Safety Message (BSM).  The BSM is typically
    * a ~200-byte packets broadcast by all vehicles at a nominal
    * rate of 10 Hz
-   * \return none
    */
   void SetupWaveMessages ();
 
   /**
    * \brief Set up generation of packets to be routed
    * through the vehicular network
-   * \return none
    */
   void SetupRoutingMessages ();
 
   /**
    * \brief Set up a prescribed scenario
-   * \return none
    */
   void SetupScenario ();
 
   /**
    * \brief Write the header line to the CSV file1
-   * \return none
    */
   void WriteCsvHeader ();
 
   /**
    * \brief Set up configuration parameter from the global variables
-   * \return none
    */
   void SetConfigFromGlobals ();
 
   /**
    * \brief Set up the global variables from the configuration parameters
-   * \return none
    */
   void SetGlobalsFromConfig ();
 
@@ -1382,171 +1326,248 @@
 }
 
 // important configuration items stored in global values
+
+/// Port
 static ns3::GlobalValue g_port ("VRCport",
                                 "Port",
                                 ns3::UintegerValue (9),
                                 ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Number of sink nodes for routing non-BSM traffic
 static ns3::GlobalValue g_nSinks ("VRCnSinks",
                                   "Number of sink nodes for routing non-BSM traffic",
                                   ns3::UintegerValue (10),
                                   ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Trace mobility 1=yes;0=no
 static ns3::GlobalValue g_traceMobility ("VRCtraceMobility",
                                          "Trace mobility 1=yes;0=no",
                                          ns3::UintegerValue (0),
                                          ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Routing protocol
 static ns3::GlobalValue g_protocol ("VRCprotocol",
                                     "Routing protocol",
                                     ns3::UintegerValue (2),
                                     ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Propagation Loss Model
 static ns3::GlobalValue g_lossModel ("VRClossModel",
                                      "Propagation Loss Model",
                                      ns3::UintegerValue (3),
                                      ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Fast Fading Model
 static ns3::GlobalValue g_fading ("VRCfading",
                                   "Fast Fading Model",
                                   ns3::UintegerValue (0),
                                   ns3::MakeUintegerChecker<uint32_t> ());
+
+/// 802.11 mode (0=802.11a;1=802.11p)
 static ns3::GlobalValue g_80211mode ("VRC80211mode",
                                      "802.11 mode (0=802.11a;1=802.11p)",
                                      ns3::UintegerValue (1),
                                      ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Mobility mode 0=random waypoint;1=mobility trace file
 static ns3::GlobalValue g_mobility ("VRCmobility",
                                     "Mobility mode 0=random waypoint;1=mobility trace file",
                                     ns3::UintegerValue (1),
                                     ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Number of nodes (vehicles)
 static ns3::GlobalValue g_nNodes ("VRCnNodes",
                                   "Number of nodes (vehicles)",
                                   ns3::UintegerValue (156),
                                   ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Node speed (m/s) for RWP model
 static ns3::GlobalValue g_nodeSpeed ("VRCnodeSpeed",
                                      "Node speed (m/s) for RWP model",
                                      ns3::UintegerValue (20),
                                      ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Node pause time (s) for RWP model
 static ns3::GlobalValue g_nodePause ("VRCnodePause",
                                      "Node pause time (s) for RWP model",
                                      ns3::UintegerValue (0),
                                      ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Size in bytes of WAVE BSM
 static ns3::GlobalValue g_wavePacketSize ("VRCwavePacketSize",
                                           "Size in bytes of WAVE BSM",
                                           ns3::UintegerValue (200),
                                           ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Verbose 0=no;1=yes
 static ns3::GlobalValue g_verbose ("VRCverbose",
                                    "Verbose 0=no;1=yes",
                                    ns3::UintegerValue (0),
                                    ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Scenario
 static ns3::GlobalValue g_scenario ("VRCscenario",
                                     "Scenario",
                                     ns3::UintegerValue (1),
                                     ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Dump routing tables at t=5 seconds 0=no;1=yes
 static ns3::GlobalValue g_routingTables ("VRCroutingTables",
                                          "Dump routing tables at t=5 seconds 0=no;1=yes",
                                          ns3::UintegerValue (0),
                                          ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Dump ASCII trace 0=no;1=yes
 static ns3::GlobalValue g_asciiTrace ("VRCasciiTrace",
                                       "Dump ASCII trace 0=no;1=yes",
                                       ns3::UintegerValue (0),
                                       ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Generate PCAP files 0=no;1=yes
 static ns3::GlobalValue g_pcap ("VRCpcap",
                                 "Generate PCAP files 0=no;1=yes",
                                 ns3::UintegerValue (0),
                                 ns3::MakeUintegerChecker<uint32_t> ());
+
+/// Simulation start time for capturing cumulative BSM
 static ns3::GlobalValue g_cumulativeBsmCaptureStart ("VRCcumulativeBsmCaptureStart",
-                                                     "Simulation starte time for capturing cumulative BSM",
-                                                     ns3::UintegerValue (0),
-                                                     ns3::MakeUintegerChecker<uint32_t> ());
+                                                     "Simulation start time for capturing cumulative BSM",
+                                                     ns3::TimeValue (Seconds (0)),
+                                                     ns3::MakeTimeChecker ());
 
+/// BSM range for PDR inclusion
 static ns3::GlobalValue g_txSafetyRange1 ("VRCtxSafetyRange1",
                                           "BSM range for PDR inclusion",
                                           ns3::DoubleValue (50.0),
                                           ns3::MakeDoubleChecker<double> ());
 
+/// BSM range for PDR inclusion
 static ns3::GlobalValue g_txSafetyRange2 ("VRCtxSafetyRange2",
                                           "BSM range for PDR inclusion",
                                           ns3::DoubleValue (100.0),
                                           ns3::MakeDoubleChecker<double> ());
 
+/// BSM range for PDR inclusion
 static ns3::GlobalValue g_txSafetyRange3 ("VRCtxSafetyRange3",
                                           "BSM range for PDR inclusion",
                                           ns3::DoubleValue (150.0),
                                           ns3::MakeDoubleChecker<double> ());
 
+/// BSM range for PDR inclusion
 static ns3::GlobalValue g_txSafetyRange4 ("VRCtxSafetyRange4",
                                           "BSM range for PDR inclusion",
                                           ns3::DoubleValue (200.0),
                                           ns3::MakeDoubleChecker<double> ());
 
+/// BSM range for PDR inclusion
 static ns3::GlobalValue g_txSafetyRange5 ("VRCtxSafetyRange5",
                                           "BSM range for PDR inclusion",
                                           ns3::DoubleValue (250.0),
                                           ns3::MakeDoubleChecker<double> ());
+
+/// BSM range for PDR inclusion
 static ns3::GlobalValue g_txSafetyRange6 ("VRCtxSafetyRange6",
                                           "BSM range for PDR inclusion",
                                           ns3::DoubleValue (300.0),
                                           ns3::MakeDoubleChecker<double> ());
+
+/// BSM range for PDR inclusion
 static ns3::GlobalValue g_txSafetyRange7 ("VRCtxSafetyRange7",
                                           "BSM range for PDR inclusion",
                                           ns3::DoubleValue (350.0),
                                           ns3::MakeDoubleChecker<double> ());
+
+/// BSM range for PDR inclusion
 static ns3::GlobalValue g_txSafetyRange8 ("VRCtxSafetyRange8",
                                           "BSM range for PDR inclusion",
                                           ns3::DoubleValue (400.0),
                                           ns3::MakeDoubleChecker<double> ());
+
+/// BSM range for PDR inclusion
 static ns3::GlobalValue g_txSafetyRange9 ("VRCtxSafetyRange9",
                                           "BSM range for PDR inclusion",
                                           ns3::DoubleValue (450.0),
                                           ns3::MakeDoubleChecker<double> ());
+
+/// BSM range for PDR inclusion
 static ns3::GlobalValue g_txSafetyRange10 ("VRCtxSafetyRange10",
                                            "BSM range for PDR inclusion",
                                            ns3::DoubleValue (500.0),
                                            ns3::MakeDoubleChecker<double> ());
+
+/// Transmission power dBm
 static ns3::GlobalValue g_txp ("VRCtxp",
                                "Transmission power dBm",
                                ns3::DoubleValue (7.5),
                                ns3::MakeDoubleChecker<double> ());
+
+/// Total simulation time (s)
 static ns3::GlobalValue g_totalTime ("VRCtotalTime",
                                      "Total simulation time (s)",
                                      ns3::DoubleValue (300.01),
                                      ns3::MakeDoubleChecker<double> ());
+
+/// Interval (s) between WAVE BSMs
 static ns3::GlobalValue g_waveInterval ("VRCwaveInterval",
                                         "Interval (s) between WAVE BSMs",
                                         ns3::DoubleValue (0.1),
                                         ns3::MakeDoubleChecker<double> ());
+
+/// GPS sync accuracy (ns)
 static ns3::GlobalValue g_gpsAccuracyNs ("VRCgpsAccuracyNs",
                                          "GPS sync accuracy (ns)",
                                          ns3::DoubleValue (40),
                                          ns3::MakeDoubleChecker<double> ());
+
+/// Tx May Delay (ms)
 static ns3::GlobalValue g_txMaxDelayMs ("VRCtxMaxDelayMs",
                                         "Tx May Delay (ms)",
                                         ns3::DoubleValue (10),
                                         ns3::MakeDoubleChecker<double> ());
+
+/// CSV filename (for time series data)
 static ns3::GlobalValue g_CSVfileName ("VRCCSVfileName",
                                        "CSV filename (for time series data)",
                                        ns3::StringValue ("vanet-routing.output.csv"),
                                        ns3::MakeStringChecker ());
+
+/// CSV filename 2 (for overall simulation scenario results)
 static ns3::GlobalValue g_CSVfileName2 ("VRCCSVfileName2",
                                         "CSV filename 2 (for overall simulation scenario results)",
                                         ns3::StringValue ("vanet-routing.output2.csv"),
                                         ns3::MakeStringChecker ());
+
+/// PHY mode (802.11p)
 static ns3::GlobalValue g_phyMode ("VRCphyMode",
                                    "PHY mode (802.11p)",
                                    ns3::StringValue ("OfdmRate6MbpsBW10MHz"),
                                    ns3::MakeStringChecker ());
+
+/// Mobility trace filename
 static ns3::GlobalValue g_traceFile ("VRCtraceFile",
                                      "Mobility trace filename",
                                      ns3::StringValue ("./src/wave/examples/low99-ct-unterstrass-1day.filt.7.adj.mob"),
                                      ns3::MakeStringChecker ());
+
+/// Log filename
 static ns3::GlobalValue g_logFile ("VRClogFile",
                                    "Log filename",
                                    ns3::StringValue ("low99-ct-unterstrass-1day.filt.7.adj.log"),
                                    ns3::MakeStringChecker ());
+
+/// Data rate
 static ns3::GlobalValue g_rate ("VRCrate",
                                 "Data rate",
                                 ns3::StringValue ("2048bps"),
                                 ns3::MakeStringChecker ());
+
+/// PHY mode (802.11a)
 static ns3::GlobalValue g_phyModeB ("VRCphyModeB",
                                     "PHY mode (802.11a)",
                                     ns3::StringValue ("DsssRate11Mbps"),
                                     ns3::MakeStringChecker ());
+
+/// Trace name)
 static ns3::GlobalValue g_trName ("VRCtrName",
                                   "Trace name",
                                   ns3::StringValue ("vanet-routing-compare"),
@@ -1605,15 +1626,24 @@
   // devices are set up in SetupAdhocDevices(),
   // called by ConfigureChannels()
 
-  // every device will have PHY callback for tracing
-  // which is used to determine the total amount of
+  // use a PHY callback for tracing
+  // to determine the total amount of
   // data transmitted, and then used to calculate
   // the MAC/PHY overhead beyond the app-data
-  Config::Connect ("/NodeList/*/DeviceList/*/Phy/State/Tx", MakeCallback (&WifiPhyStats::PhyTxTrace, m_wifiPhyStats));
-  // TxDrop, RxDrop not working yet.  Not sure what I'm doing wrong.
-  Config::Connect ("/NodeList/*/DeviceList/*/ns3::WifiNetDevice/Phy/PhyTxDrop", MakeCallback (&WifiPhyStats::PhyTxDrop, m_wifiPhyStats));
-  Config::Connect ("/NodeList/*/DeviceList/*/ns3::WifiNetDevice/Phy/PhyRxDrop", MakeCallback (&WifiPhyStats::PhyRxDrop, m_wifiPhyStats));
+  if (m_80211mode == 3)
+    {
+      // WAVE
+      Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WaveNetDevice/PhyEntities/*/State/Tx", MakeCallback (&WifiPhyStats::PhyTxTrace, m_wifiPhyStats));
+      Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WaveNetDevice/PhyEntities/*/PhyTxDrop", MakeCallback (&WifiPhyStats::PhyTxDrop, m_wifiPhyStats));
+      Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WaveNetDevice/PhyEntities/*/PhyRxDrop", MakeCallback (&WifiPhyStats::PhyRxDrop, m_wifiPhyStats)); 
+    }
+  else
+    {
+      Config::Connect ("/NodeList/*/DeviceList/*/Phy/State/Tx", MakeCallback (&WifiPhyStats::PhyTxTrace, m_wifiPhyStats));
+      Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxDrop", MakeCallback (&WifiPhyStats::PhyTxDrop, m_wifiPhyStats));
+      Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyRxDrop", MakeCallback (&WifiPhyStats::PhyRxDrop, m_wifiPhyStats)); 
 }
+    }
 
 void
 VanetRoutingExperiment::ConfigureMobility ()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/examples/wave-simple-80211p.cc ns-3.34/src/wave/examples/wave-simple-80211p.cc
--- ns-3.33/src/wave/examples/wave-simple-80211p.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/examples/wave-simple-80211p.cc	2021-07-14 10:31:07.000000000 -0700
@@ -74,6 +74,10 @@
  * MAC class that enables OCB mode.
  */
 
+/**
+ * Receive a packet
+ * \param socket Rx socket
+ */
 void ReceivePacket (Ptr<Socket> socket)
 {
   while (socket->Recv ())
@@ -82,6 +86,13 @@
     }
 }
 
+/**
+ * Geerate traffic
+ * \param socket Tx socket
+ * \param pktSize packet size
+ * \param pktCount number of packets
+ * \param pktInterval interval between packet generation
+ */
 static void GenerateTraffic (Ptr<Socket> socket, uint32_t pktSize,
                              uint32_t pktCount, Time pktInterval )
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/helper/wave-bsm-helper.h ns-3.34/src/wave/helper/wave-bsm-helper.h
--- ns-3.33/src/wave/helper/wave-bsm-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/helper/wave-bsm-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -46,7 +46,6 @@
 public:
   /**
    * \brief Constructor
-   * \return none
    */
   WaveBsmHelper ();
 
@@ -92,7 +91,6 @@
    * \param ranges the expected transmission range, in m.
    * \param chAccessMode channel access mode (0=continuous; 1=switching)
    * \param txMaxDelay max delay prior to transmit
-   * \return none
    */
   void Install (Ipv4InterfaceContainer & i,
                 Time totalTime,          // seconds
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/helper/wave-bsm-stats.h ns-3.34/src/wave/helper/wave-bsm-stats.h
--- ns-3.33/src/wave/helper/wave-bsm-stats.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/helper/wave-bsm-stats.h	2021-07-14 10:31:07.000000000 -0700
@@ -51,7 +51,6 @@
 public:
   /**
    * \brief Constructor
-   * \return none
    */
   WaveBsmStats ();
 
@@ -63,7 +62,6 @@
   
   /**
    * \brief Increments the count of transmitted packets
-   * \return none
    */
   void IncTxPktCount ();
 
@@ -107,14 +105,12 @@
    * though they may not be physically received (due to collisions
    * or receiver power thresholds).
    * \param index index for statistics
-   * \return none
    */
   void IncExpectedRxPktCount (int index);
 
   /**
    * \brief Increments the count of actual packets received
    * (regardless of coverage area).
-   * \return none
    */
   void IncRxPktCount ();
 
@@ -125,7 +121,6 @@
    * delivery ratio (PDR), we need to count only those received packets
    * that are actually received within the (circular) coverage area.
    * \param index index for statistics
-   * \return none
    */
   void IncRxPktInRangeCount (int index);
 
@@ -153,7 +148,6 @@
    * \brief Sets the count of packets expected to received
    * \param index index for statistics
    * \param count the count of packets
-   * \return none
    */
   void SetExpectedRxPktCount (int index, int count);
 
@@ -161,7 +155,6 @@
    * \brief Sets the count of packets within range that are received
    * \param index index for statistics
    * \param count the count of packets
-   * \return none
    */
   void SetRxPktInRangeCount (int index, int count);
 
@@ -169,21 +162,18 @@
    * \brief Resets the count of total packets
    * expected and/or within range(index) that are received
    * \param index index for statistics
-   * \return none
    */
   void ResetTotalRxPktCounts (int index);
 
   /**
    * \brief Sets the count of packets transmitted
    * \param count the count of packets transmitted
-   * \return none
    */
   void SetTxPktCount (int count);
 
   /**
    * \brief Sets the count of packets received
    * \param count the count of packets received
-   * \return none
    */
   void SetRxPktCount (int count);
 
@@ -191,7 +181,6 @@
    * \brief Increments the count of (application data) bytes transmitted
    * not including MAC/PHY overhead
    * \param bytes the bytes of application-data transmitted
-   * \return none
    */
   void IncTxByteCount (int bytes);
 
@@ -223,7 +212,6 @@
   /**
    * \brief Enables/disables logging
    * \param log
-   * \return none
    */
   void SetLogging (int log);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/helper/wave-helper.cc ns-3.34/src/wave/helper/wave-helper.cc
--- ns-3.33/src/wave/helper/wave-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/helper/wave-helper.cc	2021-07-14 10:31:07.000000000 -0700
@@ -26,7 +26,6 @@
 #include "ns3/minstrel-wifi-manager.h"
 #include "ns3/radiotap-header.h"
 #include "ns3/unused.h"
-#include "ns3/wifi-ack-policy-selector.h"
 #include "wave-mac-helper.h"
 #include "wave-helper.h"
 
@@ -278,10 +277,6 @@
                                   "DataMode", StringValue ("OfdmRate6MbpsBW10MHz"),
                                   "ControlMode",StringValue ("OfdmRate6MbpsBW10MHz"),
                                   "NonUnicastMode", StringValue ("OfdmRate6MbpsBW10MHz"));
-  helper.SetAckPolicySelectorForAc (AC_BE, "ns3::ConstantWifiAckPolicySelector");
-  helper.SetAckPolicySelectorForAc (AC_BK, "ns3::ConstantWifiAckPolicySelector");
-  helper.SetAckPolicySelectorForAc (AC_VI, "ns3::ConstantWifiAckPolicySelector");
-  helper.SetAckPolicySelectorForAc (AC_VO, "ns3::ConstantWifiAckPolicySelector");
   return helper;
 }
 
@@ -340,29 +335,6 @@
 }
 
 void
-WaveHelper::SetAckPolicySelectorForAc (AcIndex ac, std::string type,
-                                       std::string n0, const AttributeValue &v0,
-                                       std::string n1, const AttributeValue &v1,
-                                       std::string n2, const AttributeValue &v2,
-                                       std::string n3, const AttributeValue &v3,
-                                       std::string n4, const AttributeValue &v4,
-                                       std::string n5, const AttributeValue &v5,
-                                       std::string n6, const AttributeValue &v6,
-                                       std::string n7, const AttributeValue &v7)
-{
-  m_ackPolicySelector[ac] = ObjectFactory ();
-  m_ackPolicySelector[ac].SetTypeId (type);
-  m_ackPolicySelector[ac].Set (n0, v0);
-  m_ackPolicySelector[ac].Set (n1, v1);
-  m_ackPolicySelector[ac].Set (n2, v2);
-  m_ackPolicySelector[ac].Set (n3, v3);
-  m_ackPolicySelector[ac].Set (n4, v4);
-  m_ackPolicySelector[ac].Set (n5, v5);
-  m_ackPolicySelector[ac].Set (n6, v6);
-  m_ackPolicySelector[ac].Set (n7, v7);
-}
-
-void
 WaveHelper::SetChannelScheduler (std::string type,
                                  std::string n0, const AttributeValue &v0,
                                  std::string n1, const AttributeValue &v1,
@@ -420,40 +392,10 @@
       for (std::vector<uint32_t>::const_iterator k = m_macsForChannelNumber.begin ();
            k != m_macsForChannelNumber.end (); ++k)
         {
-          Ptr<WifiMac> wifiMac = macHelper.Create (device);
+          Ptr<WifiMac> wifiMac = macHelper.Create (device, WIFI_STANDARD_80211p);
           Ptr<OcbWifiMac> ocbMac = DynamicCast<OcbWifiMac> (wifiMac);
-          // we use WaveMacLow to replace original MacLow
-          ocbMac->EnableForWave (device);
           ocbMac->SetWifiRemoteStationManager (m_stationManager.Create<WifiRemoteStationManager> ());
-          ocbMac->ConfigureStandard (WIFI_STANDARD_80211p);
-          // Install ack policy selector
-          BooleanValue qosSupported;
-          PointerValue ptr;
-          Ptr<WifiAckPolicySelector> ackSelector;
-
-          ocbMac->GetAttributeFailSafe ("QosSupported", qosSupported);
-          if (qosSupported.Get ())
-            {
-              ocbMac->GetAttributeFailSafe ("BE_Txop", ptr);
-              ackSelector = m_ackPolicySelector[AC_BE].Create<WifiAckPolicySelector> ();
-              ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
-              ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
-
-              ocbMac->GetAttributeFailSafe ("BK_Txop", ptr);
-              ackSelector = m_ackPolicySelector[AC_BK].Create<WifiAckPolicySelector> ();
-              ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
-              ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
-
-              ocbMac->GetAttributeFailSafe ("VI_Txop", ptr);
-              ackSelector = m_ackPolicySelector[AC_VI].Create<WifiAckPolicySelector> ();
-              ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
-              ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
-
-              ocbMac->GetAttributeFailSafe ("VO_Txop", ptr);
-              ackSelector = m_ackPolicySelector[AC_VO].Create<WifiAckPolicySelector> ();
-              ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
-              ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
-            }
+          ocbMac->EnableForWave (device);
           device->AddMac (*k, ocbMac);
         }
 
@@ -491,7 +433,7 @@
   LogComponentEnable ("VsaManager", LOG_LEVEL_ALL);
   LogComponentEnable ("OcbWifiMac", LOG_LEVEL_ALL);
   LogComponentEnable ("VendorSpecificAction", LOG_LEVEL_ALL);
-  LogComponentEnable ("WaveMacLow", LOG_LEVEL_ALL);
+  LogComponentEnable ("WaveFrameExchangeManager", LOG_LEVEL_ALL);
   LogComponentEnable ("HigherLayerTxVectorTag", LOG_LEVEL_ALL);
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/helper/wave-helper.h ns-3.34/src/wave/helper/wave-helper.h
--- ns-3.33/src/wave/helper/wave-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/helper/wave-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -42,6 +42,7 @@
 public:
   /**
    * Create a phy helper in a default working state.
+   * \return A phy helper
    */
   static YansWavePhyHelper Default (void);
 
@@ -166,38 +167,6 @@
                                 std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
                                 std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
   /**
-   * \param ac the Access Category to attach the ack policy selector to.
-   * \param type the type of ns3::WifiAckPolicySelector to create.
-   * \param n0 the name of the attribute to set
-   * \param v0 the value of the attribute to set
-   * \param n1 the name of the attribute to set
-   * \param v1 the value of the attribute to set
-   * \param n2 the name of the attribute to set
-   * \param v2 the value of the attribute to set
-   * \param n3 the name of the attribute to set
-   * \param v3 the value of the attribute to set
-   * \param n4 the name of the attribute to set
-   * \param v4 the value of the attribute to set
-   * \param n5 the name of the attribute to set
-   * \param v5 the value of the attribute to set
-   * \param n6 the name of the attribute to set
-   * \param v6 the value of the attribute to set
-   * \param n7 the name of the attribute to set
-   * \param v7 the value of the attribute to set
-   *
-   * All the attributes specified in this method should exist
-   * in the requested ack policy selector.
-   */
-  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 ());
-  /**
    * \param type the type of ns3::ChannelScheduler to create.
    * \param n0 the name of the attribute to set
    * \param v0 the value of the attribute to set
@@ -277,7 +246,6 @@
 
 protected:
   ObjectFactory m_stationManager; ///< station manager
-  ObjectFactory m_ackPolicySelector[4]; ///< ack policy selector for all ACs
   ObjectFactory m_channelScheduler; ///< channel scheduler
   std::vector<uint32_t> m_macsForChannelNumber; ///< MACs for channel number
   uint32_t m_physNumber; ///< Phy number
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/helper/wave-mac-helper.h ns-3.34/src/wave/helper/wave-mac-helper.h
--- ns-3.33/src/wave/helper/wave-mac-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/helper/wave-mac-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -115,6 +115,7 @@
 
   /**
    * Create a mac helper in a default working state.
+   * \return A mac helper
    */
   static QosWaveMacHelper Default (void);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/bsm-application.h ns-3.34/src/wave/model/bsm-application.h
--- ns-3.33/src/wave/model/bsm-application.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/bsm-application.h	2021-07-14 10:31:07.000000000 -0700
@@ -48,7 +48,6 @@
 
   /**
    * \brief Constructor
-   * \return none
    */
   BsmApplication ();
   virtual ~BsmApplication ();
@@ -70,7 +69,6 @@
    * \param nodesMoving of whether or not node(s) are moving
    * \param mode
    * \param txDelay
-   * \return none
    */
   void Setup (Ipv4InterfaceContainer & i,
               int nodeId,
@@ -116,7 +114,6 @@
    * \param pktInterval the interval, in seconds, until the next packet
    * should be transmitted
    * \param sendingNodeId
-   * \return none
    */
   void GenerateWaveTraffic (Ptr<Socket> socket, uint32_t pktSize,
                             uint32_t pktCount, Time pktInterval,
@@ -125,7 +122,6 @@
   /**
    * \brief Receive a WAVE BSM packet
    * \param socket the receiving socket
-   * \return none
    */
   void ReceiveWavePacket (Ptr<Socket> socket);
 
@@ -133,7 +129,6 @@
    * \brief Handle the receipt of a WAVE BSM packet from sender to receiver
    * \param txNode the sending node
    * \param rxNode the receiving node
-   * \return none
    */
   void HandleReceivedBsmPacket (Ptr<Node> txNode,
                                 Ptr<Node> rxNode);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/channel-manager.cc ns-3.34/src/wave/model/channel-manager.cc
--- ns-3.33/src/wave/model/channel-manager.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/channel-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -51,12 +51,6 @@
 ChannelManager::~ChannelManager ()
 {
   NS_LOG_FUNCTION (this);
-  std::map<uint32_t, WaveChannel *> ::iterator i;
-  for (i = m_channels.begin (); i != m_channels.end (); ++i)
-    {
-      delete (i->second);
-    }
-  m_channels.clear ();
 }
 
 uint32_t
@@ -175,4 +169,16 @@
   return m_channels[channelNumber]->txPowerLevel;
 }
 
+void
+ChannelManager::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  std::map<uint32_t, WaveChannel *> ::iterator i;
+  for (i = m_channels.begin (); i != m_channels.end (); ++i)
+    {
+      delete (i->second);
+    }
+  m_channels.clear ();
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/channel-manager.h ns-3.34/src/wave/model/channel-manager.h
--- ns-3.33/src/wave/model/channel-manager.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/channel-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -21,7 +21,7 @@
 #include <vector>
 #include "ns3/object.h"
 #include "ns3/wifi-mode.h"
-#include "ns3/wifi-preamble.h"
+#include "ns3/wifi-phy-common.h"
 
 namespace ns3 {
 
@@ -132,6 +132,9 @@
    */
   uint32_t GetManagementPowerLevel (uint32_t channelNumber);
 
+protected:
+  virtual void DoDispose (void);
+
 private:
   /// 1609.4-2010 Annex H
   static const uint32_t  DEFAULT_OPERATING_CLASS = 17;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/channel-scheduler.cc ns-3.34/src/wave/model/channel-scheduler.cc
--- ns-3.33/src/wave/model/channel-scheduler.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/channel-scheduler.cc	2021-07-14 10:31:07.000000000 -0700
@@ -160,4 +160,11 @@
   return ReleaseAccess (channelNumber);
 }
 
+void
+ChannelScheduler::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_device = 0;
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/channel-scheduler.h ns-3.34/src/wave/model/channel-scheduler.h
--- ns-3.33/src/wave/model/channel-scheduler.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/channel-scheduler.h	2021-07-14 10:31:07.000000000 -0700
@@ -195,6 +195,7 @@
 
 protected:
   virtual void DoInitialize (void);
+  virtual void DoDispose (void);
 
   /**
      * \param channelNumber the specific channel
@@ -214,6 +215,7 @@
   virtual bool AssignContinuousAccess (uint32_t channelNumber, bool immediate) = 0;
   /**
    * \param channelNumber the specific channel
+   * \param extends extension duration
    * \param immediate indicate whether channel switch to channel
    * \return whether the channel access is assigned successfully
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/default-channel-scheduler.cc ns-3.34/src/wave/model/default-channel-scheduler.cc
--- ns-3.33/src/wave/model/default-channel-scheduler.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/default-channel-scheduler.cc	2021-07-14 10:31:07.000000000 -0700
@@ -111,6 +111,7 @@
     {
       m_waitEvent.Cancel ();
     }
+  m_phy = 0;
   ChannelScheduler::DoDispose ();
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/default-channel-scheduler.h ns-3.34/src/wave/model/default-channel-scheduler.h
--- ns-3.33/src/wave/model/default-channel-scheduler.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/default-channel-scheduler.h	2021-07-14 10:31:07.000000000 -0700
@@ -87,6 +87,7 @@
   virtual bool AssignContinuousAccess (uint32_t channelNumber, bool immediate);
   /**
    * \param channelNumber the specific channel
+   * \param extends extension duration
    * \param immediate indicate whether channel switch to channel
    * \return whether the channel access is assigned successfully
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/ocb-wifi-mac.cc ns-3.34/src/wave/model/ocb-wifi-mac.cc
--- ns-3.33/src/wave/model/ocb-wifi-mac.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/ocb-wifi-mac.cc	2021-07-14 10:31:07.000000000 -0700
@@ -27,7 +27,8 @@
 #include "ns3/mac-rx-middle.h"
 #include "ns3/ht-capabilities.h"
 #include "ns3/vht-capabilities.h"
-#include "wave-mac-low.h"
+#include "ns3/channel-access-manager.h"
+#include "wave-frame-exchange-manager.h"
 #include "ocb-wifi-mac.h"
 #include "vendor-specific-action.h"
 #include "higher-tx-tag.h"
@@ -390,6 +391,21 @@
   ConfigureEdca (cwmin, cwmax, 3, AC_VI);
   ConfigureEdca (cwmin, cwmax, 6, AC_BE);
   ConfigureEdca (cwmin, cwmax, 9, AC_BK);
+
+  // Setup FrameExchangeManager
+  m_feManager = CreateObject<WaveFrameExchangeManager> ();
+  m_feManager->SetWifiMac (this);
+  m_feManager->SetMacTxMiddle (m_txMiddle);
+  m_feManager->SetMacRxMiddle (m_rxMiddle);
+  m_feManager->SetAddress (GetAddress ());
+  m_channelAccessManager->SetupFrameExchangeManager (m_feManager);
+  if (GetQosSupported ())
+    {
+      for (const auto& pair : m_edca)
+        {
+          pair.second->SetQosFrameExchangeManager (DynamicCast<QosFrameExchangeManager> (m_feManager));
+        }
+    }
 }
 
 
@@ -398,7 +414,7 @@
 {
   NS_LOG_FUNCTION (this);
   m_channelAccessManager->NotifySleepNow ();
-  m_low->NotifySleepNow ();
+  m_feManager->NotifySleepNow ();
 }
 
 void
@@ -432,23 +448,22 @@
   NS_LOG_FUNCTION (this);
   // The switching event is used to notify MAC entity reset its operation.
   m_channelAccessManager->NotifySwitchingStartNow (Time (0));
-  m_low->NotifySwitchingStartNow (Time (0));
+  m_feManager->NotifySwitchingStartNow (Time (0));
 }
 
 void
 OcbWifiMac::EnableForWave (Ptr<WaveNetDevice> device)
 {
   NS_LOG_FUNCTION (this << device);
-  // To extend current OcbWifiMac for WAVE 1609.4, we shall use WaveMacLow instead of MacLow
-  m_low = CreateObject<WaveMacLow> ();
-  (DynamicCast<WaveMacLow> (m_low))->SetWaveNetDevice (device);
-  m_low->SetRxCallback (MakeCallback (&MacRxMiddle::Receive, m_rxMiddle));
-  m_channelAccessManager->SetupLow (m_low);
-  m_txop->SetMacLow (m_low);
-  for (EdcaQueues::iterator i = m_edca.begin (); i != m_edca.end (); ++i)
-    {
-      i->second->SetMacLow (m_low);
-      i->second->CompleteConfig ();
-    }
+  // To extend current OcbWifiMac for WAVE 1609.4, we shall use WaveFrameExchangeManager
+  StaticCast<WaveFrameExchangeManager> (m_feManager)->SetWaveNetDevice (device);
 }
+
+void
+OcbWifiMac::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  RegularWifiMac::DoDispose ();
+}
+
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/ocb-wifi-mac.h ns-3.34/src/wave/model/ocb-wifi-mac.h
--- ns-3.33/src/wave/model/ocb-wifi-mac.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/ocb-wifi-mac.h	2021-07-14 10:31:07.000000000 -0700
@@ -101,6 +101,7 @@
   /**
    * This method shall not be used in WAVE environment and
    * here it will overloaded to log warn message
+   * \return An invalid BSSID.
    */
   virtual Mac48Address GetBssid (void) const;
   /**
@@ -175,6 +176,8 @@
 
   // Inherited from base class
   virtual void ConfigureStandard (enum WifiStandard standard);
+protected:
+  virtual void DoDispose (void);
 private:
   virtual void Receive (Ptr<WifiMacQueueItem> mpdu);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/vendor-specific-action.h ns-3.34/src/wave/model/vendor-specific-action.h
--- ns-3.33/src/wave/model/vendor-specific-action.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/vendor-specific-action.h	2021-07-14 10:31:07.000000000 -0700
@@ -61,7 +61,11 @@
    * \param length identifier length
    */
   OrganizationIdentifier (const uint8_t *str, uint32_t length);
-  /// assignment operator
+  /**
+   * Assignment operator
+   * \param oi object to copy from
+   * \return reference to the new object
+   */
   OrganizationIdentifier& operator= (const OrganizationIdentifier& oi);
   virtual ~OrganizationIdentifier (void);
 
@@ -167,7 +171,11 @@
    */
   OrganizationIdentifier GetOrganizationIdentifier (void) const;
   /**
-   * the category field shall be CATEGORY_OF_VSA
+   * Get the category field
+   *
+   * The category field shall be CATEGORY_OF_VSA
+   *
+   * \return The category field
    */
   uint8_t GetCategory (void) const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/vsa-manager.h ns-3.34/src/wave/model/vsa-manager.h
--- ns-3.33/src/wave/model/vsa-manager.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/vsa-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -132,7 +132,10 @@
    */
   void SetWaveNetDevice (Ptr<WaveNetDevice> device);
 
-  /// set wave vsa callback function
+  /**
+   * Set wave vsa callback function
+   * \param vsaCallback the callback
+   */
   void SetWaveVsaCallback (Callback<bool, Ptr<const Packet>,const Address &, uint32_t, uint32_t>  vsaCallback);
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/wave-frame-exchange-manager.cc ns-3.34/src/wave/model/wave-frame-exchange-manager.cc
--- ns-3.33/src/wave/model/wave-frame-exchange-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wave/model/wave-frame-exchange-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,175 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "ns3/abort.h"
+#include "ns3/wifi-protection.h"
+#include "ns3/wifi-acknowledgment.h"
+#include "wave-frame-exchange-manager.h"
+#include "higher-tx-tag.h"
+
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("WaveFrameExchangeManager");
+
+NS_OBJECT_ENSURE_REGISTERED (WaveFrameExchangeManager);
+
+TypeId
+WaveFrameExchangeManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::WaveFrameExchangeManager")
+    .SetParent<QosFrameExchangeManager> ()
+    .AddConstructor<WaveFrameExchangeManager> ()
+    .SetGroupName ("Wave")
+  ;
+  return tid;
+}
+
+WaveFrameExchangeManager::WaveFrameExchangeManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+WaveFrameExchangeManager::~WaveFrameExchangeManager ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+void
+WaveFrameExchangeManager::SetWaveNetDevice (Ptr<WaveNetDevice> device)
+{
+  m_scheduler = device->GetChannelScheduler ();
+  m_coordinator = device->GetChannelCoordinator ();
+  NS_ASSERT (m_scheduler != 0 && m_coordinator != 0);
+}
+
+WifiTxVector
+WaveFrameExchangeManager::GetDataTxVector (Ptr<const WifiMacQueueItem> item) const
+{
+  NS_LOG_FUNCTION (this << *item);
+  HigherLayerTxVectorTag datatag;
+  bool found;
+  found = ConstCast<Packet> (item->GetPacket ())->PeekPacketTag (datatag);
+  // if high layer has not controlled transmit parameters, the real transmit parameters
+  // will be determined by MAC layer itself.
+  if (!found)
+    {
+      return m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (item->GetHeader ());
+    }
+
+  // if high layer has set the transmit parameters with non-adaption mode,
+  // the real transmit parameters are determined by high layer.
+  if (!datatag.IsAdaptable ())
+    {
+      return datatag.GetTxVector ();
+    }
+
+  // if high layer has set the transmit parameters with non-adaption mode,
+  // the real transmit parameters are determined by both high layer and MAC layer.
+  WifiTxVector txHigher = datatag.GetTxVector ();
+  WifiTxVector txMac = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (item->GetHeader ());
+  WifiTxVector txAdapter;
+  txAdapter.SetChannelWidth (10);
+  // the DataRate set by higher layer is the minimum data rate
+  // which is the lower bound for the actual data rate.
+  if (txHigher.GetMode ().GetDataRate (txHigher.GetChannelWidth ()) > txMac.GetMode ().GetDataRate (txMac.GetChannelWidth ()))
+    {
+      txAdapter.SetMode (txHigher.GetMode ());
+      txAdapter.SetPreambleType (txHigher.GetPreambleType ());
+    }
+  else
+    {
+      txAdapter.SetMode (txMac.GetMode ());
+      txAdapter.SetPreambleType (txMac.GetPreambleType ());
+    }
+  // the TxPwr_Level set by higher layer is the maximum transmit
+  // power which is the upper bound for the actual transmit power;
+  txAdapter.SetTxPowerLevel (std::min (txHigher.GetTxPowerLevel (), txMac.GetTxPowerLevel ()));
+
+  return txAdapter;
+}
+
+bool
+WaveFrameExchangeManager::StartTransmission (Ptr<Txop> dcf)
+{
+  NS_LOG_FUNCTION (this << dcf);
+
+  uint32_t curChannel = m_phy->GetChannelNumber ();
+  // if current channel access is not AlternatingAccess, just do as FrameExchangeManager.
+  if (m_scheduler == 0 || !m_scheduler->IsAlternatingAccessAssigned (curChannel))
+    {
+      return FrameExchangeManager::StartTransmission (dcf);
+    }
+
+  m_txTimer.Cancel ();
+  m_dcf = dcf;
+
+  Ptr<WifiMacQueue> queue = dcf->GetWifiMacQueue ();
+
+  if (queue->IsEmpty ())
+    {
+      NS_LOG_DEBUG ("Queue empty");
+      m_dcf->NotifyChannelReleased ();
+      m_dcf = 0;
+      return false;
+    }
+
+  m_dcf->NotifyChannelAccessed ();
+  Ptr<WifiMacQueueItem> mpdu = *queue->Peek ()->GetQueueIteratorPairs ().front ().it;
+  NS_ASSERT (mpdu != 0);
+
+  // assign a sequence number if this is not a fragment nor a retransmission
+  if (!mpdu->IsFragment () && !mpdu->GetHeader ().IsRetry ())
+    {
+      uint16_t sequence = m_txMiddle->GetNextSequenceNumberFor (&mpdu->GetHeader ());
+      mpdu->GetHeader ().SetSequenceNumber (sequence);
+    }
+
+  WifiTxParameters txParams;
+  txParams.m_txVector = GetDataTxVector (mpdu);
+  Time remainingTime = m_coordinator->NeedTimeToGuardInterval ();
+
+  if (!TryAddMpdu (mpdu, txParams, remainingTime))
+    {
+      // The attempt for this transmission will be canceled;
+      // and this packet will be pending for next transmission by QosTxop class
+      NS_LOG_DEBUG ("Because the required transmission time exceeds the remainingTime = "
+                    << remainingTime.As (Time::MS)
+                    << ", currently this packet will not be transmitted.");
+    }
+  else
+    {
+      SendMpduWithProtection (mpdu, txParams);
+      return true;
+    }
+  return false;
+}
+
+void
+WaveFrameExchangeManager::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_scheduler = 0;
+  m_coordinator = 0;
+  FrameExchangeManager::DoDispose ();
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/wave-frame-exchange-manager.h ns-3.34/src/wave/model/wave-frame-exchange-manager.h
--- ns-3.33/src/wave/model/wave-frame-exchange-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wave/model/wave-frame-exchange-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,87 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *         Junling Bu <linlinjavaer@gmail.com>
+ *         Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef WAVE_FRAME_EXCHANGE_MANAGER_H
+#define WAVE_FRAME_EXCHANGE_MANAGER_H
+
+#include "ns3/qos-frame-exchange-manager.h"
+#include "wave-net-device.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup wave
+ *
+ * This class is the subclass of QosFrameExchangeManager to provide support for MAC extension
+ * (1) allows higher layer control data rate and tx power level.
+ *     If higher layer does not set, they will be determined by WifiRemoteStationManager
+ *          of MAC layer;
+ *     If higher layer sets tx parameters in non-adaptable mode, the data rate
+ *        and tx power level will be used for transmission;.
+ *    If higher layer sets tx parameters in adaptable mode, the data rate
+ *        will be lower bound for the actual data rate, and the power level
+ *        will be upper bound for the actual transmit power.
+ * (2) implements the feature described in Annex C : avoid transmission at scheduled guard intervals
+ *      However, the feature is extended further here that the required transmit time is determined
+ *      by MAC layer itself rather than PHY layer, which contains RTS/CTS, DATA and ACK time.
+ */
+class WaveFrameExchangeManager : public QosFrameExchangeManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  WaveFrameExchangeManager ();
+  virtual ~WaveFrameExchangeManager ();
+
+  // Overridden from FrameExchangeManager
+  virtual bool StartTransmission (Ptr<Txop> dcf);
+
+  /**
+   * \param device WaveNetDevice associated with WaveFrameExchangeManager
+   */
+  void SetWaveNetDevice (Ptr<WaveNetDevice> device);
+
+protected:
+  // Overridden from FrameExchangeManager
+  virtual void DoDispose (void);
+
+private:
+  /**
+   * Return a TXVECTOR for the DATA frame given the destination.
+   * The function consults WifiRemoteStationManager, which controls the rate
+   * to different destinations.
+   *
+   * \param item the item being asked for TXVECTOR
+   * \return TXVECTOR for the given item
+   */
+  virtual WifiTxVector GetDataTxVector (Ptr<const WifiMacQueueItem> item) const;
+
+  Ptr<ChannelScheduler> m_scheduler;     ///< the channel scheduler
+  Ptr<ChannelCoordinator> m_coordinator; ///< the channel coordinator
+};
+
+} //namespace ns3
+
+#endif /* VHT_FRAME_EXCHANGE_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/wave-mac-low.cc ns-3.34/src/wave/model/wave-mac-low.cc
--- ns-3.33/src/wave/model/wave-mac-low.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/wave-mac-low.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,140 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2008 INRIA
- * Copyright (c) 2013 Dalian University of Technology
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- *         Junling Bu <linlinjavaer@gmail.com>
- */
-
-#include "ns3/log.h"
-#include "ns3/event-id.h"
-#include "ns3/wifi-phy.h"
-#include "wave-mac-low.h"
-#include "higher-tx-tag.h"
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("WaveMacLow");
-
-NS_OBJECT_ENSURE_REGISTERED (WaveMacLow);
-
-TypeId
-WaveMacLow::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::WaveMacLow")
-    .SetParent<MacLow> ()
-    .SetGroupName ("Wave")
-    .AddConstructor<WaveMacLow> ()
-  ;
-  return tid;
-}
-WaveMacLow::WaveMacLow ()
-{
-  NS_LOG_FUNCTION (this);
-}
-WaveMacLow::~WaveMacLow ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-WaveMacLow::SetWaveNetDevice (Ptr<WaveNetDevice> device)
-{
-  m_scheduler  =  device->GetChannelScheduler ();
-  m_coordinator =  device->GetChannelCoordinator ();
-  NS_ASSERT (m_scheduler != 0 && m_coordinator != 0);
-}
-
-WifiTxVector
-WaveMacLow::GetDataTxVector (Ptr<const WifiMacQueueItem> item) const
-{
-  NS_LOG_FUNCTION (this << *item);
-  HigherLayerTxVectorTag datatag;
-  bool found;
-  found = ConstCast<Packet> (item->GetPacket ())->PeekPacketTag (datatag);
-  // if high layer has not controlled transmit parameters, the real transmit parameters
-  // will be determined by MAC layer itself.
-  if (!found)
-    {
-      return MacLow::GetDataTxVector (item);
-    }
-
-  // if high layer has set the transmit parameters with non-adaption mode,
-  // the real transmit parameters are determined by high layer.
-  if (!datatag.IsAdaptable ())
-    {
-      return datatag.GetTxVector ();
-    }
-
-  // if high layer has set the transmit parameters with non-adaption mode,
-  // the real transmit parameters are determined by both high layer and MAC layer.
-  WifiTxVector txHigher = datatag.GetTxVector ();
-  WifiTxVector txMac = MacLow::GetDataTxVector (item);
-  WifiTxVector txAdapter;
-  txAdapter.SetChannelWidth (10);
-  // the DataRate set by higher layer is the minimum data rate
-  // which is the lower bound for the actual data rate.
-  if (txHigher.GetMode ().GetDataRate (txHigher.GetChannelWidth ()) > txMac.GetMode ().GetDataRate (txMac.GetChannelWidth ()))
-    {
-      txAdapter.SetMode (txHigher.GetMode ());
-      txAdapter.SetPreambleType (txHigher.GetPreambleType ());
-    }
-  else
-    {
-      txAdapter.SetMode (txMac.GetMode ());
-      txAdapter.SetPreambleType (txMac.GetPreambleType ());
-    }
-  // the TxPwr_Level set by higher layer is the maximum transmit
-  // power which is the upper bound for the actual transmit power;
-  txAdapter.SetTxPowerLevel (std::min (txHigher.GetTxPowerLevel (), txMac.GetTxPowerLevel ()));
-
-  return txAdapter;
-}
-
-void
-WaveMacLow::StartTransmission (Ptr<WifiMacQueueItem> mpdu,
-                               MacLowTransmissionParameters params,
-                               Ptr<Txop> dca)
-{
-  NS_LOG_FUNCTION (this << *mpdu << params << dca);
-  Ptr<WifiPhy> phy = MacLow::GetPhy ();
-  uint32_t curChannel = phy->GetChannelNumber ();
-  // if current channel access is not AlternatingAccess, just do as MacLow.
-  if (!m_scheduler->IsAlternatingAccessAssigned (curChannel))
-    {
-      MacLow::StartTransmission (mpdu, params, dca);
-      return;
-    }
-
-  Time transmissionTime = MacLow::CalculateTransmissionTime (mpdu->GetPacket (), &mpdu->GetHeader (), params);
-  Time remainingTime = m_coordinator->NeedTimeToGuardInterval ();
-
-  if (transmissionTime > remainingTime)
-    {
-      // The attempt for this transmission will be canceled;
-      // and this packet will be pending for next transmission by QosTxop class
-      NS_LOG_DEBUG ("Because the required transmission time = " << transmissionTime.As (Time::MS)
-                                                                << " exceeds the remainingTime = " << remainingTime.As (Time::MS)
-                                                                << ", currently this packet will not be transmitted.");
-    }
-  else
-    {
-      MacLow::StartTransmission (mpdu, params, dca);
-    }
-}
-
-} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/wave-mac-low.h ns-3.34/src/wave/model/wave-mac-low.h
--- ns-3.33/src/wave/model/wave-mac-low.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/wave-mac-low.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,93 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2008 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- *         Junling Bu <linlinjavaer@gmail.com>
- */
-#ifndef WAVE_MAC_LOW_H
-#define WAVE_MAC_LOW_H
-
-#include "ns3/mac-low.h"
-#include "ns3/msdu-aggregator.h"
-#include "ns3/mpdu-aggregator.h"
-#include "ns3/wifi-psdu.h"
-#include "wave-net-device.h"
-
-namespace ns3 {
-class WaveNetDevice;
-class WifiMacQueueItem;
-
-/**
- * \ingroup wave
- * This class is the subclass of MacLow to provide support for MAC extension
- * (1) allows higher layer control data rate and tx power level.
- *     If higher layer does not set, they will be determined by WifiRemoteStationManager
- *          of MAC layer;
- *     If higher layer sets tx parameters in non-adaptable mode, the data rate
- *        and tx power level will be used for transmission;.
- *    If higher layer sets tx parameters in adaptable mode, the data rate
- *        will be lower bound for the actual data rate, and the power level
- *        will be upper bound for the actual transmit power.
- * (2) implements the feature described in Annex C : avoid transmission at scheduled guard intervals
- *      However, the feature is extended further here that the required transmit time is determined
- *      by MAC layer itself rather than PHY layer, which contains RTS/CTS, DATA and ACK time.
- */
-class WaveMacLow : public MacLow
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  WaveMacLow ();
-  virtual ~WaveMacLow ();
-
-  /**
-   * \param device WaveNetDevice associated with WaveMacLow
-   */
-  void SetWaveNetDevice (Ptr<WaveNetDevice> device);
-
-  /**
-   * \param mpdu packet to send
-   * \param parameters the transmission parameters to use for this packet.
-   * \param txop pointer to the calling Txop.
-   *
-   * Start the transmission of the input packet and notify the listener
-   * of transmission events.
-   */
-  virtual void StartTransmission (Ptr<WifiMacQueueItem> mpdu,
-                                  MacLowTransmissionParameters parameters,
-                                  Ptr<Txop> txop);
-private:
-  /**
-   * Return a TXVECTOR for the DATA frame given the destination.
-   * The function consults WifiRemoteStationManager, which controls the rate
-   * to different destinations.
-   *
-   * \param item the item being asked for TXVECTOR
-   * \return TXVECTOR for the given item
-   */
-  virtual WifiTxVector GetDataTxVector (Ptr<const WifiMacQueueItem> item) const;
-
-  Ptr<ChannelScheduler> m_scheduler; ///< the channel scheduler
-  Ptr<ChannelCoordinator> m_coordinator; ///< the channel coordinator
-};
-
-} // namespace ns3
-
-#endif /* WAVE_MAC_LOW_H*/
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/wave-net-device.cc ns-3.34/src/wave/model/wave-net-device.cc
--- ns-3.33/src/wave/model/wave-net-device.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/wave-net-device.cc	2021-07-14 10:31:07.000000000 -0700
@@ -117,6 +117,7 @@
       mac->Dispose ();
     }
   m_macEntities.clear ();
+  m_phyEntities.clear ();
   m_channelCoordinator->Dispose ();
   m_channelManager->Dispose ();
   m_channelScheduler->Dispose ();
@@ -126,7 +127,7 @@
   m_channelScheduler = 0;
   m_vsaManager = 0;
   // chain up.
-  NetDevice::DoDispose ();
+  WifiNetDevice::DoDispose ();
 }
 
 void
@@ -635,16 +636,6 @@
   return true;
 }
 
-Ptr<Node>
-WaveNetDevice::GetNode (void) const
-{
-  return m_node;
-}
-void
-WaveNetDevice::SetNode (Ptr<Node> node)
-{
-  m_node = node;
-}
 bool
 WaveNetDevice::NeedsArp (void) const
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/model/wave-net-device.h ns-3.34/src/wave/model/wave-net-device.h
--- ns-3.33/src/wave/model/wave-net-device.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/model/wave-net-device.h	2021-07-14 10:31:07.000000000 -0700
@@ -343,8 +343,6 @@
   virtual Address GetMulticast (Ipv4Address multicastGroup) const;
   virtual bool IsPointToPoint (void) const;
   virtual bool IsBridge (void) const;
-  virtual Ptr<Node> GetNode (void) const;
-  virtual void SetNode (Ptr<Node> node);
   virtual bool NeedsArp (void) const;
   virtual void SetReceiveCallback (NetDevice::ReceiveCallback cb);
   virtual Address GetMulticast (Ipv6Address addr) const;
@@ -401,7 +399,6 @@
   TracedCallback<Address, Address> m_addressChange;
 
   // copy from WifiNetDevice
-  Ptr<Node> m_node; ///< the node
   NetDevice::ReceiveCallback m_forwardUp; ///< forward up receive callback
   NetDevice::PromiscReceiveCallback m_promiscRx; ///< promiscious receive callback
   uint32_t m_ifIndex; ///< IF index
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/test/examples-to-run.py ns-3.34/src/wave/test/examples-to-run.py
--- ns-3.33/src/wave/test/examples-to-run.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/test/examples-to-run.py	2021-07-14 10:31:07.000000000 -0700
@@ -10,6 +10,9 @@
 cpp_examples = [
     ("wave-simple-80211p", "True", "True"),
     ("wave-simple-device", "True", "True"),
+    ("vanet-routing-compare --totaltime=2 --80211Mode=1", "True", "True"),
+    ("vanet-routing-compare --totaltime=2 --80211Mode=2", "True", "True"),
+    ("vanet-routing-compare --totaltime=2 --80211Mode=3", "True", "True"),
 ]
 
 # A list of Python examples to run in order to ensure that they remain
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wave/wscript ns-3.34/src/wave/wscript
--- ns-3.33/src/wave/wscript	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wave/wscript	2021-07-14 10:31:07.000000000 -0700
@@ -9,7 +9,7 @@
 def build(bld):
     module = bld.create_ns3_module('wave', ['core','wifi', 'propagation', 'internet'])
     module.source = [
-        'model/wave-mac-low.cc',
+        'model/wave-frame-exchange-manager.cc',
         'model/ocb-wifi-mac.cc',
         'model/vendor-specific-action.cc',
         'model/channel-coordinator.cc',
@@ -42,7 +42,7 @@
     headers = bld(features='ns3header')
     headers.module = 'wave'
     headers.source = [
-        'model/wave-mac-low.h',
+        'model/wave-frame-exchange-manager.h',
         'model/ocb-wifi-mac.h',
         'model/vendor-specific-action.h',
         'model/channel-coordinator.h',
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/bindings/callbacks_list.py ns-3.34/src/wifi/bindings/callbacks_list.py
--- ns-3.33/src/wifi/bindings/callbacks_list.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/bindings/callbacks_list.py	2021-07-14 10:31:07.000000000 -0700
@@ -1,5 +1,10 @@
 callback_classes = [
     ['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned long', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
@@ -9,19 +14,22 @@
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'unsigned char', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Mac48Address', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'const ns3::WifiMacHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::Mac48Address', 'unsigned char', 'ns3::OriginatorBlockAckAgreement::State', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'const ns3::WifiMacHeader &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'unsigned short', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'double', 'double', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::DataRate', 'ns3::DataRate', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned char', 'double', 'bool', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'double', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::Time', 'WifiPhyState', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'double', 'ns3::WifiMode', 'ns3::WifiPreamble', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
@@ -33,15 +41,17 @@
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::WifiPhyRxfailureReason', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'ns3::SignalNoiseDbm', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'ns3::WifiTxVector', 'ns3::MpduInfo', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::HePreambleParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::HeSigAParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<const ns3::QueueDiscItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<const ns3::Packet>', 'unsigned short', 'const ns3::Address &', 'const ns3::Address &', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'std::basic_string<char>', 'ns3::Ptr<const ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::SpectrumPhy>', 'ns3::Ptr<const ns3::SpectrumPhy>', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::MobilityModel>', 'ns3::Ptr<const ns3::MobilityModel>', 'double', 'double', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::SpectrumSignalParameters>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'bool', 'unsigned int', 'double', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::QueueDiscItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<const ns3::Packet>', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/bindings/modulegen_customizations.py ns-3.34/src/wifi/bindings/modulegen_customizations.py
--- ns-3.33/src/wifi/bindings/modulegen_customizations.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/bindings/modulegen_customizations.py	2021-07-14 10:31:07.000000000 -0700
@@ -1,4 +1,281 @@
+from pybindgen import param, retval
+
 
 def post_register_types(root_module):
     root_module.add_include('"ns3/propagation-module.h"')
 
+    root_module["WifiMacHelper"].add_method(
+        "SetType",
+        retval("void"),
+        [
+            param("std::string", "type"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetType",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetType",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetType",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+            param("std::string &", "param3_name"),
+            param("ns3::AttributeValue const &", "param3_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetType",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+            param("std::string &", "param3_name"),
+            param("ns3::AttributeValue const &", "param3_value"),
+            param("std::string &", "param4_name"),
+            param("ns3::AttributeValue const &", "param4_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetType",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+            param("std::string &", "param3_name"),
+            param("ns3::AttributeValue const &", "param3_value"),
+            param("std::string &", "param4_name"),
+            param("ns3::AttributeValue const &", "param4_value"),
+            param("std::string &", "param5_name"),
+            param("ns3::AttributeValue const &", "param5_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetType",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+            param("std::string &", "param3_name"),
+            param("ns3::AttributeValue const &", "param3_value"),
+            param("std::string &", "param4_name"),
+            param("ns3::AttributeValue const &", "param4_value"),
+            param("std::string &", "param5_name"),
+            param("ns3::AttributeValue const &", "param5_value"),
+            param("std::string &", "param6_name"),
+            param("ns3::AttributeValue const &", "param6_value"),
+        ],
+    )
+
+    root_module["WifiMacHelper"].add_method(
+        "SetProtectionManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetProtectionManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetProtectionManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetProtectionManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+            param("std::string &", "param3_name"),
+            param("ns3::AttributeValue const &", "param3_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetProtectionManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+            param("std::string &", "param3_name"),
+            param("ns3::AttributeValue const &", "param3_value"),
+            param("std::string &", "param4_name"),
+            param("ns3::AttributeValue const &", "param4_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetProtectionManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+            param("std::string &", "param3_name"),
+            param("ns3::AttributeValue const &", "param3_value"),
+            param("std::string &", "param4_name"),
+            param("ns3::AttributeValue const &", "param4_value"),
+            param("std::string &", "param5_name"),
+            param("ns3::AttributeValue const &", "param5_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetProtectionManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+            param("std::string &", "param3_name"),
+            param("ns3::AttributeValue const &", "param3_value"),
+            param("std::string &", "param4_name"),
+            param("ns3::AttributeValue const &", "param4_value"),
+            param("std::string &", "param5_name"),
+            param("ns3::AttributeValue const &", "param5_value"),
+            param("std::string &", "param6_name"),
+            param("ns3::AttributeValue const &", "param6_value"),
+        ],
+    )
+
+    root_module["WifiMacHelper"].add_method(
+        "SetAckManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetAckManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetAckManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetAckManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+            param("std::string &", "param3_name"),
+            param("ns3::AttributeValue const &", "param3_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetAckManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+            param("std::string &", "param3_name"),
+            param("ns3::AttributeValue const &", "param3_value"),
+            param("std::string &", "param4_name"),
+            param("ns3::AttributeValue const &", "param4_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetAckManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+            param("std::string &", "param3_name"),
+            param("ns3::AttributeValue const &", "param3_value"),
+            param("std::string &", "param4_name"),
+            param("ns3::AttributeValue const &", "param4_value"),
+            param("std::string &", "param5_name"),
+            param("ns3::AttributeValue const &", "param5_value"),
+        ],
+    )
+    root_module["WifiMacHelper"].add_method(
+        "SetAckManager",
+        retval("void"),
+        [
+            param("std::string", "type"),
+            param("std::string &", "param1_name"),
+            param("ns3::AttributeValue const &", "param1_value"),
+            param("std::string &", "param2_name"),
+            param("ns3::AttributeValue const &", "param2_value"),
+            param("std::string &", "param3_name"),
+            param("ns3::AttributeValue const &", "param3_value"),
+            param("std::string &", "param4_name"),
+            param("ns3::AttributeValue const &", "param4_value"),
+            param("std::string &", "param5_name"),
+            param("ns3::AttributeValue const &", "param5_value"),
+            param("std::string &", "param6_name"),
+            param("ns3::AttributeValue const &", "param6_value"),
+        ],
+    )
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/bindings/modulegen__gcc_ILP32.py ns-3.34/src/wifi/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/wifi/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -26,41 +26,53 @@
     module.add_enum('CitySize', ['SmallCity', 'MediumCity', 'LargeCity'], import_from_module='ns.propagation')
     ## queue-size.h (module 'network'): ns3::QueueSizeUnit [enumeration]
     module.add_enum('QueueSizeUnit', ['PACKETS', 'BYTES'], import_from_module='ns.network')
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'SIG_A_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'FILTERED'])
-    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
-    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'])
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroupType [enumeration]
+    module.add_enum('McsGroupType', ['GROUP_HT', 'GROUP_VHT', 'GROUP_HE'])
     ## ht-operation.h (module 'wifi'): ns3::HtProtectionType [enumeration]
     module.add_enum('HtProtectionType', ['NO_PROTECTION', 'NON_MEMBER_PROTECTION', 'TWENTY_MHZ_PROTECTION', 'MIXED_MODE_PROTECTION'])
-    ## qos-txop.h (module 'wifi'): ns3::TypeOfStation [enumeration]
-    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA', 'OCB'])
+    ## ofdm-phy.h (module 'wifi'): ns3::OfdmPhyVariant [enumeration]
+    module.add_enum('OfdmPhyVariant', ['OFDM_PHY_DEFAULT', 'OFDM_PHY_10_MHZ', 'OFDM_PHY_5_MHZ'])
+    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
+    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'])
+    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'])
+    ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType [enumeration]
+    module.add_enum('TriggerFrameType', ['BASIC_TRIGGER', 'BFRP_TRIGGER', 'MU_BAR_TRIGGER', 'MU_RTS_TRIGGER', 'BSRP_TRIGGER', 'GCR_MU_BAR_TRIGGER', 'BQRP_TRIGGER', 'NFRP_TRIGGER'])
+    ## regular-wifi-mac.h (module 'wifi'): ns3::WifiTxTimerReason [enumeration]
+    module.add_enum('WifiTxTimerReason', [])
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT'])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
-    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'])
+    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_TRIGGER', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'])
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'])
     ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'])
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'])
     ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
     module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'])
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_holland', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'])
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'])
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
+    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'])
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
     module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'])
-    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
-    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'])
-    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'])
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [enumeration]
-    module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'EXTENDED_COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
-    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'])
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'])
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'])
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduField [enumeration]
+    module.add_enum('WifiPpduField', ['WIFI_PPDU_FIELD_PREAMBLE', 'WIFI_PPDU_FIELD_NON_HT_HEADER', 'WIFI_PPDU_FIELD_HT_SIG', 'WIFI_PPDU_FIELD_TRAINING', 'WIFI_PPDU_FIELD_SIG_A', 'WIFI_PPDU_FIELD_SIG_B', 'WIFI_PPDU_FIELD_DATA'])
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
+    module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'])
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'])
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
     module.add_class('Address', import_from_module='ns.network')
     ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
     module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
-    ## angles.h (module 'antenna'): ns3::Angles [struct]
+    ## angles.h (module 'antenna'): ns3::Angles [class]
     module.add_class('Angles', import_from_module='ns.antenna')
     ## sta-wifi-mac.h (module 'wifi'): ns3::ApInfo [struct]
     module.add_class('ApInfo')
@@ -82,9 +94,15 @@
     ## block-ack-manager.h (module 'wifi'): ns3::Bar [struct]
     module.add_class('Bar')
     ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement [class]
-    module.add_class('BlockAckAgreement')
-    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache [class]
-    module.add_class('BlockAckCache')
+    module.add_class('BlockAckAgreement', allow_subclassing=True)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType [struct]
+    module.add_class('BlockAckReqType')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID'], outer_class=root_module['ns3::BlockAckReqType'])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [struct]
+    module.add_class('BlockAckType')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID', 'MULTI_STA'], outer_class=root_module['ns3::BlockAckType'])
     ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow [class]
     module.add_class('BlockAckWindow')
     ## buffer.h (module 'network'): ns3::Buffer [class]
@@ -105,6 +123,8 @@
     module.add_class('CallbackBase', import_from_module='ns.core')
     ## capability-information.h (module 'wifi'): ns3::CapabilityInformation [class]
     module.add_class('CapabilityInformation')
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField [class]
+    module.add_class('CtrlTriggerUserInfoField')
     ## data-rate.h (module 'network'): ns3::DataRate [class]
     module.add_class('DataRate', import_from_module='ns.network')
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::AttributeAccessor> [struct]
@@ -131,6 +151,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::OutputStreamWrapper'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Packet> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Packet'])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity> [struct]
+    module.add_class('DefaultDeleter', template_parameters=['ns3::PhyEntity'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::QosBlockedDestinations> [struct]
     module.add_class('DefaultDeleter', template_parameters=['ns3::QosBlockedDestinations'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::QueueItem> [struct]
@@ -170,13 +192,11 @@
     module.add_class('Hasher', import_from_module='ns.core')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo [struct]
     module.add_class('HeMuUserInfo')
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters [struct]
-    module.add_class('HePreambleParameters')
     ## he-ru.h (module 'wifi'): ns3::HeRu [class]
     module.add_class('HeRu')
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuType [enumeration]
     module.add_enum('RuType', ['RU_26_TONE', 'RU_52_TONE', 'RU_106_TONE', 'RU_242_TONE', 'RU_484_TONE', 'RU_996_TONE', 'RU_2x996_TONE'], outer_class=root_module['ns3::HeRu'])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [struct]
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [class]
     module.add_class('RuSpec', outer_class=root_module['ns3::HeRu'])
     typehandlers.add_type_alias('std::pair< short, short >', 'ns3::HeRu::SubcarrierRange')
     typehandlers.add_type_alias('std::pair< short, short >*', 'ns3::HeRu::SubcarrierRange*')
@@ -184,32 +204,30 @@
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >', 'ns3::HeRu::SubcarrierGroup')
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >*', 'ns3::HeRu::SubcarrierGroup*')
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >&', 'ns3::HeRu::SubcarrierGroup&')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec', 'ns3::HeRu::RuSpec')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec*', 'ns3::HeRu::RuSpec*')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec&', 'ns3::HeRu::RuSpec&')
-    module.add_typedef(root_module['ns3::HeRu::RuSpec'], 'RuSpec')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >', 'ns3::HeRu::BwTonesPair')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >*', 'ns3::HeRu::BwTonesPair*')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >&', 'ns3::HeRu::BwTonesPair&')
     typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', 'ns3::HeRu::SubcarrierGroups')
     typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >*', 'ns3::HeRu::SubcarrierGroups*')
     typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >&', 'ns3::HeRu::SubcarrierGroups&')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo [struct]
-    module.add_class('HtRateInfo')
+    ## he-phy.h (module 'wifi'): ns3::HeSigAParameters [struct]
+    module.add_class('HeSigAParameters')
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper [class]
     module.add_class('InterferenceHelper')
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer [struct]
-    module.add_class('SnrPer', outer_class=root_module['ns3::InterferenceHelper'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -228,11 +246,11 @@
     module.add_class('Mac8Address', import_from_module='ns.network')
     ## mac8-address.h (module 'network'): ns3::Mac8Address [class]
     root_module['ns3::Mac8Address'].implicitly_converts_to(root_module['ns3::Address'])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters [class]
-    module.add_class('MacLowTransmissionParameters')
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup [struct]
     module.add_class('McsGroup')
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo [struct]
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo [struct]
+    module.add_class('MinstrelHtRateInfo')
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo [struct]
     module.add_class('MpduInfo')
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
@@ -277,7 +295,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## propagation-cache.h (module 'propagation'): ns3::PropagationCache<ns3::JakesProcess> [class]
@@ -286,7 +304,11 @@
     module.add_class('QueueSize', import_from_module='ns.network')
     ## minstrel-wifi-manager.h (module 'wifi'): ns3::RateInfo [struct]
     module.add_class('RateInfo')
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm [struct]
+    ## recipient-block-ack-agreement.h (module 'wifi'): ns3::RecipientBlockAckAgreement [class]
+    module.add_class('RecipientBlockAckAgreement', parent=root_module['ns3::BlockAckAgreement'])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo [struct]
+    module.add_class('RxSignalInfo')
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm [struct]
     module.add_class('SignalNoiseDbm')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::ObjectBase'], template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'])
@@ -332,6 +354,36 @@
     module.add_class('Vector2D', import_from_module='ns.core')
     ## vector.h (module 'core'): ns3::Vector3D [class]
     module.add_class('Vector3D', import_from_module='ns.core')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc [class]
+    module.add_class('WifiAc')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment [struct]
+    module.add_class('WifiAcknowledgment', allow_subclassing=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::Method [enumeration]
+    module.add_enum('Method', ['NONE', 'NORMAL_ACK', 'BLOCK_ACK', 'BAR_BLOCK_ACK', 'DL_MU_BAR_BA_SEQUENCE', 'DL_MU_TF_MU_BAR', 'DL_MU_AGGREGATE_TF', 'UL_MU_MULTI_STA_BA', 'ACK_AFTER_TB_PPDU'], outer_class=root_module['ns3::WifiAcknowledgment'])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash [struct]
+    module.add_class('WifiAddressHash')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash [struct]
+    module.add_class('WifiAddressTidHash')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck [struct]
+    module.add_class('WifiBarBlockAck', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck [struct]
+    module.add_class('WifiBlockAck', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf [struct]
+    module.add_class('WifiDlMuAggregateTf', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo [struct]
+    module.add_class('BlockAckInfo', outer_class=root_module['ns3::WifiDlMuAggregateTf'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence [struct]
+    module.add_class('WifiDlMuBarBaSequence', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo [struct]
+    module.add_class('AckInfo', outer_class=root_module['ns3::WifiDlMuBarBaSequence'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo [struct]
+    module.add_class('BlockAckInfo', outer_class=root_module['ns3::WifiDlMuBarBaSequence'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo [struct]
+    module.add_class('BlockAckReqInfo', outer_class=root_module['ns3::WifiDlMuBarBaSequence'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar [struct]
+    module.add_class('WifiDlMuTfMuBar', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo [struct]
+    module.add_class('BlockAckInfo', outer_class=root_module['ns3::WifiDlMuTfMuBar'])
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper [class]
     module.add_class('WifiHelper', allow_subclassing=True)
     typehandlers.add_type_alias('std::function< unsigned long long ( ns3::Ptr< ns3::QueueItem > ) >', 'ns3::WifiHelper::SelectQueueCallback')
@@ -343,12 +395,46 @@
     module.add_class('WifiMode')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
     module.add_class('WifiModeFactory')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::CodeRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::CodeRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::CodeRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck [struct]
+    module.add_class('WifiNoAck', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck [struct]
+    module.add_class('WifiNormalAck', parent=root_module['ns3::WifiAcknowledgment'])
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper [class]
     module.add_class('WifiPhyHelper', parent=[root_module['ns3::PcapHelperForDevice'], root_module['ns3::AsciiTraceHelperForDevice']])
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::SupportedPcapDataLinkTypes [enumeration]
     module.add_enum('SupportedPcapDataLinkTypes', ['DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO'], outer_class=root_module['ns3::WifiPhyHelper'])
     ## wifi-phy-listener.h (module 'wifi'): ns3::WifiPhyListener [class]
     module.add_class('WifiPhyListener', allow_subclassing=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel [class]
+    module.add_class('WifiPhyOperatingChannel')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection [struct]
+    module.add_class('WifiProtection', allow_subclassing=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::Method [enumeration]
+    module.add_enum('Method', ['NONE', 'RTS_CTS', 'CTS_TO_SELF'], outer_class=root_module['ns3::WifiProtection'])
     ## wifi-radio-energy-model-helper.h (module 'wifi'): ns3::WifiRadioEnergyModelHelper [class]
     module.add_class('WifiRadioEnergyModelHelper', parent=root_module['ns3::DeviceEnergyModelHelper'])
     ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener [class]
@@ -368,17 +454,41 @@
     module.add_class('WifiRraaThresholds')
     ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiRrpaaThresholds [struct]
     module.add_class('WifiRrpaaThresholds')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection [struct]
+    module.add_class('WifiRtsCtsProtection', parent=root_module['ns3::WifiProtection'])
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory [class]
     module.add_class('WifiSpectrumValue5MhzFactory', allow_subclassing=True, import_from_module='ns.spectrum')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValueHelper [class]
     module.add_class('WifiSpectrumValueHelper', import_from_module='ns.spectrum')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
     module.add_class('WifiStandardInfo')
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters [class]
+    module.add_class('WifiTxParameters')
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo [struct]
+    module.add_class('PsduInfo', outer_class=root_module['ns3::WifiTxParameters'])
+    typehandlers.add_type_alias('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >', 'ns3::WifiTxParameters::PsduInfoMap')
+    typehandlers.add_type_alias('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >*', 'ns3::WifiTxParameters::PsduInfoMap*')
+    typehandlers.add_type_alias('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >&', 'ns3::WifiTxParameters::PsduInfoMap&')
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer [class]
+    module.add_class('WifiTxTimer')
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::Reason [enumeration]
+    module.add_enum('Reason', ['NOT_RUNNING', 'WAIT_CTS', 'WAIT_NORMAL_ACK', 'WAIT_BLOCK_ACK', 'WAIT_NORMAL_ACK_AFTER_DL_MU_PPDU', 'WAIT_BLOCK_ACKS_IN_TB_PPDU', 'WAIT_TB_PPDU_AFTER_BASIC_TF', 'WAIT_QOS_NULL_AFTER_BSRP_TF', 'WAIT_BLOCK_ACK_AFTER_TB_PPDU'], outer_class=root_module['ns3::WifiTxTimer'])
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiTxTimer::MpduResponseTimeout')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiTxTimer::MpduResponseTimeout*')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiTxTimer::MpduResponseTimeout&')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiTxTimer::PsduResponseTimeout')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiTxTimer::PsduResponseTimeout*')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiTxTimer::PsduResponseTimeout&')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiTxTimer::PsduMapResponseTimeout')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiTxTimer::PsduMapResponseTimeout*')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiTxTimer::PsduMapResponseTimeout&')
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
     module.add_class('WifiTxVector')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >', 'ns3::WifiTxVector::HeMuUserInfoMap')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >*', 'ns3::WifiTxVector::HeMuUserInfoMap*')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >&', 'ns3::WifiTxVector::HeMuUserInfoMap&')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa [struct]
+    module.add_class('WifiUlMuMultiStaBa', parent=root_module['ns3::WifiAcknowledgment'])
     ## yans-wifi-helper.h (module 'wifi'): ns3::YansWifiChannelHelper [class]
     module.add_class('YansWifiChannelHelper')
     ## yans-wifi-helper.h (module 'wifi'): ns3::YansWifiPhyHelper [class]
@@ -395,10 +505,6 @@
     module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## header.h (module 'network'): ns3::Header [class]
     module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader [class]
-    module.add_class('HtSigHeader', parent=root_module['ns3::Header'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader [class]
-    module.add_class('LSigHeader', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaRequestHeader [class]
     module.add_class('MgtAddBaRequestHeader', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaResponseHeader [class]
@@ -417,6 +523,8 @@
     module.add_class('MgtReassocRequestHeader', parent=root_module['ns3::Header'])
     ## minstrel-wifi-manager.h (module 'wifi'): ns3::MinstrelWifiRemoteStation [struct]
     module.add_class('MinstrelWifiRemoteStation', parent=root_module['ns3::WifiRemoteStation'])
+    ## mu-snr-tag.h (module 'wifi'): ns3::MuSnrTag [class]
+    module.add_class('MuSnrTag', parent=root_module['ns3::Tag'])
     ## object.h (module 'core'): ns3::Object [class]
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
@@ -470,6 +578,8 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PhyEntity', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PhyEntity>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QosBlockedDestinations', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QosBlockedDestinations>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
@@ -531,25 +641,21 @@
     module.add_class('TwoRayGroundPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## txop.h (module 'wifi'): ns3::Txop [class]
     module.add_class('Txop', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxFailed&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxDropped')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxDropped*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxDropped&')
+    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus [enumeration]
+    module.add_enum('ChannelAccessStatus', ['NOT_REQUESTED', 'REQUESTED', 'GRANTED'], outer_class=root_module['ns3::Txop'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::DroppedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::DroppedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::DroppedMpdu&')
     ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
     module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## vht-configuration.h (module 'wifi'): ns3::VhtConfiguration [class]
     module.add_class('VhtConfiguration', parent=root_module['ns3::Object'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader [class]
-    module.add_class('VhtSigHeader', parent=root_module['ns3::Header'])
     ## random-variable-stream.h (module 'core'): ns3::WeibullRandomVariable [class]
     module.add_class('WeibullRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## wifi-ack-policy-selector.h (module 'wifi'): ns3::WifiAckPolicySelector [class]
-    module.add_class('WifiAckPolicySelector', parent=root_module['ns3::Object'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu [struct]
+    module.add_class('WifiAckAfterTbPpdu', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-ack-manager.h (module 'wifi'): ns3::WifiAckManager [class]
+    module.add_class('WifiAckManager', parent=root_module['ns3::Object'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
@@ -568,6 +674,10 @@
     typehandlers.add_type_alias('ns3::WifiActionHeader::ActionValue*', 'ns3::WifiActionHeader::ActionValue*')
     typehandlers.add_type_alias('ns3::WifiActionHeader::ActionValue&', 'ns3::WifiActionHeader::ActionValue&')
     module.add_typedef(root_module['ns3::WifiActionHeader::ActionValue'], 'ActionValue')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection [struct]
+    module.add_class('WifiCtsToSelfProtection', parent=root_module['ns3::WifiProtection'])
+    ## wifi-default-ack-manager.h (module 'wifi'): ns3::WifiDefaultAckManager [class]
+    module.add_class('WifiDefaultAckManager', parent=root_module['ns3::WifiAckManager'])
     ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement [class]
     module.add_class('WifiInformationElement', parent=root_module['ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >'])
     ## wifi-information-element-vector.h (module 'wifi'): ns3::WifiInformationElementVector [class]
@@ -577,6 +687,9 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::WifiInformationElement > > iterator&', 'ns3::WifiInformationElementVector::Iterator&')
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac [class]
     module.add_class('WifiMac', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiMac::ForwardUpCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiMac::ForwardUpCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiMac::ForwardUpCallback&')
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader [class]
     module.add_class('WifiMacHeader', parent=root_module['ns3::Header'])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy [enumeration]
@@ -588,19 +701,23 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiMacHeader const & )&', 'ns3::WifiMacHeader::TracedCallback&')
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem [class]
     module.add_class('WifiMacQueueItem', parent=root_module['ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >'])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair [struct]
+    module.add_class('QueueIteratorPair', outer_class=root_module['ns3::WifiMacQueueItem'])
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::WifiMacQueueItem::DeaggregatedMsdus')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::WifiMacQueueItem::DeaggregatedMsdus*')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::WifiMacQueueItem::DeaggregatedMsdus&')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI*')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI&')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'ns3::WifiMacQueueItem::ConstIterator')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator*', 'ns3::WifiMacQueueItem::ConstIterator*')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator&', 'ns3::WifiMacQueueItem::ConstIterator&')
     ## wifi-mac-trailer.h (module 'wifi'): ns3::WifiMacTrailer [class]
     module.add_class('WifiMacTrailer', parent=root_module['ns3::Trailer'])
+    ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection [struct]
+    module.add_class('WifiNoProtection', parent=root_module['ns3::WifiProtection'])
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy [class]
     module.add_class('WifiPhy', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >', 'ns3::WifiPhy::ChannelNumberBandPair')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >*', 'ns3::WifiPhy::ChannelNumberBandPair*')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >&', 'ns3::WifiPhy::ChannelNumberBandPair&')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >', 'ns3::WifiPhy::ChannelNumberStandardPair')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >*', 'ns3::WifiPhy::ChannelNumberStandardPair*')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >&', 'ns3::WifiPhy::ChannelNumberStandardPair&')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >', 'ns3::WifiPhy::FrequencyWidthPair')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >*', 'ns3::WifiPhy::FrequencyWidthPair*')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >&', 'ns3::WifiPhy::FrequencyWidthPair&')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )', 'ns3::WifiPhy::MonitorSnifferRxCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )*', 'ns3::WifiPhy::MonitorSnifferRxCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )&', 'ns3::WifiPhy::MonitorSnifferRxCallback&')
@@ -610,9 +727,6 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )', 'ns3::WifiPhy::PsduTxBeginCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )*', 'ns3::WifiPhy::PsduTxBeginCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )&', 'ns3::WifiPhy::PsduTxBeginCallback&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )', 'ns3::WifiPhy::EndOfHePreambleCallback')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )*', 'ns3::WifiPhy::EndOfHePreambleCallback*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )&', 'ns3::WifiPhy::EndOfHePreambleCallback&')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )*', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )&', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback&')
@@ -632,6 +746,8 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::WifiMode, ns3::WifiPreamble, uint8_t )&', 'ns3::WifiPhyStateHelper::TxTracedCallback&')
     ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu [class]
     module.add_class('WifiPpdu', parent=root_module['ns3::SimpleRefCount< ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >'])
+    ## wifi-protection-manager.h (module 'wifi'): ns3::WifiProtectionManager [class]
+    module.add_class('WifiProtectionManager', parent=root_module['ns3::Object'])
     ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu [class]
     module.add_class('WifiPsdu', parent=root_module['ns3::SimpleRefCount< ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> >'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
@@ -690,12 +806,12 @@
     module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager [class]
     module.add_class('BlockAckManager', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )', 'ns3::BlockAckManager::AgreementStateTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )*', 'ns3::BlockAckManager::AgreementStateTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )&', 'ns3::BlockAckManager::AgreementStateTracedCallback&')
@@ -711,8 +827,6 @@
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## cara-wifi-manager.h (module 'wifi'): ns3::CaraWifiManager [class]
     module.add_class('CaraWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
-    ## cf-parameter-set.h (module 'wifi'): ns3::CfParameterSet [class]
-    module.add_class('CfParameterSet', parent=root_module['ns3::WifiInformationElement'])
     ## channel.h (module 'network'): ns3::Channel [class]
     module.add_class('Channel', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager [class]
@@ -733,14 +847,20 @@
     module.add_class('ConstantRateWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
     ## propagation-delay-model.h (module 'propagation'): ns3::ConstantSpeedPropagationDelayModel [class]
     module.add_class('ConstantSpeedPropagationDelayModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationDelayModel'])
-    ## constant-wifi-ack-policy-selector.h (module 'wifi'): ns3::ConstantWifiAckPolicySelector [class]
-    module.add_class('ConstantWifiAckPolicySelector', parent=root_module['ns3::WifiAckPolicySelector'])
     ## cost231-propagation-loss-model.h (module 'propagation'): ns3::Cost231PropagationLossModel [class]
     module.add_class('Cost231PropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader [class]
     module.add_class('CtrlBAckRequestHeader', parent=root_module['ns3::Header'])
     ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader [class]
     module.add_class('CtrlBAckResponseHeader', parent=root_module['ns3::Header'])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader [class]
+    module.add_class('CtrlTriggerHeader', parent=root_module['ns3::Header'])
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'ns3::CtrlTriggerHeader::ConstIterator')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > const_iterator*', 'ns3::CtrlTriggerHeader::ConstIterator*')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > const_iterator&', 'ns3::CtrlTriggerHeader::ConstIterator&')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > iterator', 'ns3::CtrlTriggerHeader::Iterator')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > iterator*', 'ns3::CtrlTriggerHeader::Iterator*')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > iterator&', 'ns3::CtrlTriggerHeader::Iterator&')
     ## data-rate.h (module 'network'): ns3::DataRateChecker [class]
     module.add_class('DataRateChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## data-rate.h (module 'network'): ns3::DataRateValue [class]
@@ -756,8 +876,10 @@
     module.add_class('DoubleValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## dsss-parameter-set.h (module 'wifi'): ns3::DsssParameterSet [class]
     module.add_class('DsssParameterSet', parent=root_module['ns3::WifiInformationElement'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader [class]
-    module.add_class('DsssSigHeader', parent=root_module['ns3::Header'])
+    ## dsss-ppdu.h (module 'wifi'): ns3::DsssPpdu [class]
+    module.add_class('DsssPpdu', parent=root_module['ns3::WifiPpdu'])
+    ## dsss-ppdu.h (module 'wifi'): ns3::DsssPpdu::DsssSigHeader [class]
+    module.add_class('DsssSigHeader', outer_class=root_module['ns3::DsssPpdu'], parent=root_module['ns3::Header'])
     ## edca-parameter-set.h (module 'wifi'): ns3::EdcaParameterSet [class]
     module.add_class('EdcaParameterSet', parent=root_module['ns3::WifiInformationElement'])
     ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable [class]
@@ -803,6 +925,14 @@
     module.add_class('FixedRssLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## frame-capture-model.h (module 'wifi'): ns3::FrameCaptureModel [class]
     module.add_class('FrameCaptureModel', parent=root_module['ns3::Object'])
+    ## frame-exchange-manager.h (module 'wifi'): ns3::FrameExchangeManager [class]
+    module.add_class('FrameExchangeManager', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::FrameExchangeManager::DroppedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::FrameExchangeManager::DroppedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::FrameExchangeManager::DroppedMpdu&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::FrameExchangeManager::AckedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::FrameExchangeManager::AckedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::FrameExchangeManager::AckedMpdu&')
     ## propagation-loss-model.h (module 'propagation'): ns3::FriisPropagationLossModel [class]
     module.add_class('FriisPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable [class]
@@ -813,8 +943,6 @@
     module.add_class('HeConfiguration', parent=root_module['ns3::Object'])
     ## he-operation.h (module 'wifi'): ns3::HeOperation [class]
     module.add_class('HeOperation', parent=root_module['ns3::WifiInformationElement'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader [class]
-    module.add_class('HeSigHeader', parent=root_module['ns3::Header'])
     ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities [class]
     module.add_class('HtCapabilities', parent=root_module['ns3::WifiInformationElement'])
     ## ht-configuration.h (module 'wifi'): ns3::HtConfiguration [class]
@@ -863,11 +991,6 @@
     module.add_class('Mac48AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## mac48-address.h (module 'network'): ns3::Mac48AddressValue [class]
     module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
-    ## mac-low.h (module 'wifi'): ns3::MacLow [class]
-    module.add_class('MacLow', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::MacLow::MacLowRxCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::MacLow::MacLowRxCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::MacLow::MacLowRxCallback&')
     ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle [class]
     module.add_class('MacRxMiddle', parent=root_module['ns3::SimpleRefCount< ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >'])
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::MacRxMiddle::ForwardUpCallback')
@@ -898,15 +1021,17 @@
     typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >&', 'ns3::MpduAggregator::EdcaQueues&')
     ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator [class]
     module.add_class('MsduAggregator', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::MsduAggregator::DeaggregatedMsdus')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::MsduAggregator::DeaggregatedMsdus*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::MsduAggregator::DeaggregatedMsdus&')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::MsduAggregator::DeaggregatedMsdusCI')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::MsduAggregator::DeaggregatedMsdusCI*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::MsduAggregator::DeaggregatedMsdusCI&')
     typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'ns3::MsduAggregator::EdcaQueues')
     typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >*', 'ns3::MsduAggregator::EdcaQueues*')
     typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >&', 'ns3::MsduAggregator::EdcaQueues&')
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler [class]
+    module.add_class('MultiUserScheduler', parent=root_module['ns3::Object'])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat [enumeration]
+    module.add_enum('TxFormat', ['NO_TX', 'SU_TX', 'DL_MU_TX', 'UL_MU_TX'], outer_class=root_module['ns3::MultiUserScheduler'])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo [struct]
+    module.add_class('DlMuInfo', outer_class=root_module['ns3::MultiUserScheduler'])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo [struct]
+    module.add_class('UlMuInfo', outer_class=root_module['ns3::MultiUserScheduler'])
     ## propagation-loss-model.h (module 'propagation'): ns3::NakagamiPropagationLossModel [class]
     module.add_class('NakagamiPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
@@ -944,6 +1069,10 @@
     module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
     module.add_class('ObjectFactoryValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## ofdm-ppdu.h (module 'wifi'): ns3::OfdmPpdu [class]
+    module.add_class('OfdmPpdu', parent=root_module['ns3::WifiPpdu'])
+    ## ofdm-ppdu.h (module 'wifi'): ns3::OfdmPpdu::LSigHeader [class]
+    module.add_class('LSigHeader', outer_class=root_module['ns3::OfdmPpdu'], parent=root_module['ns3::Header'])
     ## okumura-hata-propagation-loss-model.h (module 'propagation'): ns3::OkumuraHataPropagationLossModel [class]
     module.add_class('OkumuraHataPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## onoe-wifi-manager.h (module 'wifi'): ns3::OnoeWifiManager [class]
@@ -974,8 +1103,24 @@
     module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## parf-wifi-manager.h (module 'wifi'): ns3::ParfWifiManager [class]
     module.add_class('ParfWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity [class]
+    module.add_class('PhyEntity', parent=root_module['ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyRxFailureAction [enumeration]
+    module.add_enum('PhyRxFailureAction', ['DROP', 'ABORT', 'IGNORE'], outer_class=root_module['ns3::PhyEntity'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus [struct]
+    module.add_class('PhyFieldRxStatus', outer_class=root_module['ns3::PhyEntity'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer [struct]
+    module.add_class('SnrPer', outer_class=root_module['ns3::PhyEntity'])
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >', 'ns3::PhyEntity::PhyHeaderChunkInfo')
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >*', 'ns3::PhyEntity::PhyHeaderChunkInfo*')
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >&', 'ns3::PhyEntity::PhyHeaderChunkInfo&')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', 'ns3::PhyEntity::PhyHeaderSections')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >*', 'ns3::PhyEntity::PhyHeaderSections*')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >&', 'ns3::PhyEntity::PhyHeaderSections&')
     ## qos-blocked-destinations.h (module 'wifi'): ns3::QosBlockedDestinations [class]
     module.add_class('QosBlockedDestinations', parent=root_module['ns3::SimpleRefCount< ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> >'])
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::QosFrameExchangeManager [class]
+    module.add_class('QosFrameExchangeManager', parent=root_module['ns3::FrameExchangeManager'])
     ## qos-txop.h (module 'wifi'): ns3::QosTxop [class]
     module.add_class('QosTxop', parent=root_module['ns3::Txop'])
     ## queue.h (module 'network'): ns3::Queue<ns3::Packet> [class]
@@ -1014,9 +1159,8 @@
     module.add_class('ReceiveListErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
     ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
     module.add_class('RegularWifiMac', parent=root_module['ns3::WifiMac'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RegularWifiMac::ForwardUpCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RegularWifiMac::ForwardUpCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RegularWifiMac::ForwardUpCallback&')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::RrMultiUserScheduler [class]
+    module.add_class('RrMultiUserScheduler', parent=root_module['ns3::MultiUserScheduler'])
     ## rraa-wifi-manager.h (module 'wifi'): ns3::RraaWifiManager [class]
     module.add_class('RraaWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
     ## rrpaa-wifi-manager.h (module 'wifi'): ns3::RrpaaWifiManager [class]
@@ -1045,10 +1189,14 @@
     module.add_class('SsidChecker', parent=root_module['ns3::AttributeChecker'])
     ## ssid.h (module 'wifi'): ns3::SsidValue [class]
     module.add_class('SsidValue', parent=root_module['ns3::AttributeValue'])
+    ## sta-wifi-mac.h (module 'wifi'): ns3::StaWifiMac [class]
+    module.add_class('StaWifiMac', parent=root_module['ns3::RegularWifiMac'])
     ## supported-rates.h (module 'wifi'): ns3::SupportedRates [class]
     module.add_class('SupportedRates', parent=root_module['ns3::WifiInformationElement'])
     ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel [class]
     module.add_class('TableBasedErrorRateModel', parent=root_module['ns3::ErrorRateModel'])
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): ns3::ThompsonSamplingWifiManager [class]
+    module.add_class('ThompsonSamplingWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
     ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppChannelConditionModel [class]
     module.add_class('ThreeGppChannelConditionModel', import_from_module='ns.propagation', parent=root_module['ns3::ChannelConditionModel'])
     ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppIndoorMixedOfficeChannelConditionModel [class]
@@ -1085,6 +1233,12 @@
     module.add_class('VhtCapabilities', parent=root_module['ns3::WifiInformationElement'])
     ## vht-operation.h (module 'wifi'): ns3::VhtOperation [class]
     module.add_class('VhtOperation', parent=root_module['ns3::WifiInformationElement'])
+    ## vht-ppdu.h (module 'wifi'): ns3::VhtPpdu [class]
+    module.add_class('VhtPpdu', parent=root_module['ns3::OfdmPpdu'])
+    ## vht-ppdu.h (module 'wifi'): ns3::VhtPpdu::VhtSigHeader [class]
+    module.add_class('VhtSigHeader', outer_class=root_module['ns3::VhtPpdu'], parent=root_module['ns3::Header'])
+    ## wifi-default-protection-manager.h (module 'wifi'): ns3::WifiDefaultProtectionManager [class]
+    module.add_class('WifiDefaultProtectionManager', parent=root_module['ns3::WifiProtectionManager'])
     ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue [class]
     module.add_class('WifiMacQueue', parent=root_module['ns3::Queue< ns3::WifiMacQueueItem >'])
     ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::DropPolicy [enumeration]
@@ -1115,12 +1269,24 @@
     module.add_class('AdhocWifiMac', parent=root_module['ns3::RegularWifiMac'])
     ## channel-condition-model.h (module 'propagation'): ns3::AlwaysLosChannelConditionModel [class]
     module.add_class('AlwaysLosChannelConditionModel', import_from_module='ns.propagation', parent=root_module['ns3::ChannelConditionModel'])
+    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac [class]
+    module.add_class('ApWifiMac', parent=root_module['ns3::RegularWifiMac'])
     ## error-model.h (module 'network'): ns3::BinaryErrorModel [class]
     module.add_class('BinaryErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
     ## error-model.h (module 'network'): ns3::BurstErrorModel [class]
     module.add_class('BurstErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'bool', 'unsigned int', 'double', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1135,8 +1301,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::DataRate', 'ns3::DataRate', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::HePreambleParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::HeSigAParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1175,8 +1341,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::SpectrumSignalParameters>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'double', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1187,6 +1353,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1195,39 +1363,90 @@
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'double', 'bool', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned long long', 'unsigned long long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## infrastructure-wifi-mac.h (module 'wifi'): ns3::InfrastructureWifiMac [class]
-    module.add_class('InfrastructureWifiMac', parent=root_module['ns3::RegularWifiMac'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## dsss-phy.h (module 'wifi'): ns3::DsssPhy [class]
+    module.add_class('DsssPhy', parent=root_module['ns3::PhyEntity'])
+    ## erp-ofdm-ppdu.h (module 'wifi'): ns3::ErpOfdmPpdu [class]
+    module.add_class('ErpOfdmPpdu', parent=root_module['ns3::OfdmPpdu'])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu [class]
+    module.add_class('HePpdu', parent=root_module['ns3::OfdmPpdu'])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::TxPsdFlag [enumeration]
+    module.add_enum('TxPsdFlag', ['PSD_NON_HE_TB', 'PSD_HE_TB_NON_OFDMA_PORTION', 'PSD_HE_TB_OFDMA_PORTION'], outer_class=root_module['ns3::HePpdu'])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HeSigHeader [class]
+    module.add_class('HeSigHeader', outer_class=root_module['ns3::HePpdu'], parent=root_module['ns3::Header'])
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::HtFrameExchangeManager [class]
+    module.add_class('HtFrameExchangeManager', parent=root_module['ns3::QosFrameExchangeManager'])
+    ## ht-ppdu.h (module 'wifi'): ns3::HtPpdu [class]
+    module.add_class('HtPpdu', parent=root_module['ns3::OfdmPpdu'])
+    ## ht-ppdu.h (module 'wifi'): ns3::HtPpdu::HtSigHeader [class]
+    module.add_class('HtSigHeader', outer_class=root_module['ns3::HtPpdu'], parent=root_module['ns3::Header'])
+    ## ofdm-phy.h (module 'wifi'): ns3::OfdmPhy [class]
+    module.add_class('OfdmPhy', parent=root_module['ns3::PhyEntity'])
     ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vHighwayChannelConditionModel [class]
     module.add_class('ProbabilisticV2vHighwayChannelConditionModel', import_from_module='ns.propagation', parent=root_module['ns3::ThreeGppChannelConditionModel'])
     ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vUrbanChannelConditionModel [class]
     module.add_class('ProbabilisticV2vUrbanChannelConditionModel', import_from_module='ns.propagation', parent=root_module['ns3::ThreeGppChannelConditionModel'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
-    ## sta-wifi-mac.h (module 'wifi'): ns3::StaWifiMac [class]
-    module.add_class('StaWifiMac', parent=root_module['ns3::InfrastructureWifiMac'])
-    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac [class]
-    module.add_class('ApWifiMac', parent=root_module['ns3::InfrastructureWifiMac'])
-    module.add_container('ns3::HtMinstrelRate', 'ns3::HtRateInfo', container_type='vector')
+    ## vht-frame-exchange-manager.h (module 'wifi'): ns3::VhtFrameExchangeManager [class]
+    module.add_class('VhtFrameExchangeManager', parent=root_module['ns3::HtFrameExchangeManager'])
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::ErpOfdmPhy [class]
+    module.add_class('ErpOfdmPhy', parent=root_module['ns3::OfdmPhy'])
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::HeFrameExchangeManager [class]
+    module.add_class('HeFrameExchangeManager', parent=root_module['ns3::VhtFrameExchangeManager'])
+    ## ht-phy.h (module 'wifi'): ns3::HtPhy [class]
+    module.add_class('HtPhy', parent=root_module['ns3::OfdmPhy'])
+    ## vht-phy.h (module 'wifi'): ns3::VhtPhy [class]
+    module.add_class('VhtPhy', parent=root_module['ns3::HtPhy'])
+    ## he-phy.h (module 'wifi'): ns3::HePhy [class]
+    module.add_class('HePhy', parent=root_module['ns3::VhtPhy'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::HePhy::EndOfHeSigACallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::HePhy::EndOfHeSigACallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::HePhy::EndOfHeSigACallback&')
+    module.add_container('std::vector< double >', 'double', container_type='vector')
+    module.add_container('std::list< ns3::BlockAckReqType >', 'ns3::BlockAckReqType', container_type='list')
+    module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
+    module.add_container('ns3::MinstrelHtRate', 'ns3::MinstrelHtRateInfo', container_type='vector')
     module.add_container('std::vector< std::pair< short, short > >', 'std::pair< short, short >', container_type='vector')
+    module.add_container('std::vector< ns3::HeRu::RuSpec >', 'ns3::HeRu::RuSpec', container_type='vector')
     module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
     module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('ns3::RxPowerWattPerChannelBand', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::TxTime', ('ns3::WifiMode', 'ns3::Time'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuAggregateTf::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuAggregateTf::BlockAckInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::AckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::AckInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckReqInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckReqInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuTfMuBar::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuTfMuBar::BlockAckInfo'), container_type='map')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
+    module.add_container('std::map< unsigned char, std::set< unsigned short > >', ('unsigned char', 'std::set< unsigned short >'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >', ('ns3::Mac48Address', 'ns3::WifiTxParameters::PsduInfo'), container_type='map')
     module.add_container('std::map< unsigned short, ns3::HeMuUserInfo >', ('short unsigned int', 'ns3::HeMuUserInfo'), container_type='map')
+    module.add_container('std::map< std::pair< ns3::Mac48Address, unsigned char >, unsigned long long >', ('std::pair< ns3::Mac48Address, unsigned char >', 'long unsigned int'), container_type='map')
     module.add_container('ns3::MinstrelRate', 'ns3::RateInfo', container_type='vector')
     module.add_container('ns3::SampleRate', 'std::vector< unsigned char >', container_type='vector')
-    module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('ns3::Bands', 'ns3::BandInfo', container_type='vector')
+    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
+    module.add_container('std::list< ns3::WifiMacQueueItem::QueueIteratorPair >', 'ns3::WifiMacQueueItem::QueueIteratorPair', container_type='list')
+    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiConstPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
+    module.add_container('std::list< ns3::WifiMode >', 'ns3::WifiMode', container_type='list')
+    module.add_container('std::list< unsigned char >', 'unsigned char', container_type='list')
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
     module.add_container('std::vector< unsigned short >', 'short unsigned int', container_type='vector')
     module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
@@ -1235,15 +1454,18 @@
     module.add_container('std::set< unsigned char >', 'unsigned char', container_type='set')
     module.add_container('std::vector< ns3::WifiRemoteStation * >', 'ns3::WifiRemoteStation *', container_type='vector')
     module.add_container('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationState *', container_type='vector')
+    module.add_container('std::vector< unsigned int >', 'unsigned int', container_type='vector')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
     module.add_container('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('ns3::MpduAggregator::EdcaQueues', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('ns3::MsduAggregator::DeaggregatedMsdus', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('ns3::MsduAggregator::EdcaQueues', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('std::map< ns3::Mac48Address, bool >', ('ns3::Mac48Address', 'bool'), container_type='map')
-    module.add_container('std::list< ns3::Ptr< ns3::WifiMacQueueItem > >', 'ns3::Ptr< ns3::WifiMacQueueItem >', container_type='list')
+    module.add_container('ns3::WifiMacQueueItem::DeaggregatedMsdus', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
+    module.add_container('ns3::WifiPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
+    module.add_container('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
+    module.add_container('ns3::PhyEntity::PhyHeaderSections', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
+    module.add_container('std::map< unsigned short, ns3::Mac48Address >', ('short unsigned int', 'ns3::Mac48Address'), container_type='map')
     module.add_container('std::map< std::pair< unsigned int, unsigned int >, double >', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
+    module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
+    module.add_container('std::set< ns3::Mac48Address >', 'ns3::Mac48Address', container_type='set')
+    module.add_container('std::map< ns3::WifiPreamble, std::vector< ns3::WifiPpduField > >', ('ns3::WifiPreamble', 'std::vector< ns3::WifiPpduField >'), container_type='map')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -1256,15 +1478,6 @@
     typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
     typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxOkCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxOkCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxOkCallback&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxErrorCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxErrorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxErrorCallback&')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRrpaaThresholds, ns3::WifiMode > >', 'ns3::RrpaaThresholdsTable')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRrpaaThresholds, ns3::WifiMode > >*', 'ns3::RrpaaThresholdsTable*')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRrpaaThresholds, ns3::WifiMode > >&', 'ns3::RrpaaThresholdsTable&')
@@ -1274,15 +1487,18 @@
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRraaThresholds, ns3::WifiMode > >', 'ns3::RraaThresholdsTable')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRraaThresholds, ns3::WifiMode > >*', 'ns3::RraaThresholdsTable*')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRraaThresholds, ns3::WifiMode > >&', 'ns3::RraaThresholdsTable&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
     typehandlers.add_type_alias('std::map< ns3::WifiMode, ns3::Time >', 'ns3::TxTime')
     typehandlers.add_type_alias('std::map< ns3::WifiMode, ns3::Time >*', 'ns3::TxTime*')
     typehandlers.add_type_alias('std::map< ns3::WifiMode, ns3::Time >&', 'ns3::TxTime&')
     typehandlers.add_type_alias('std::vector< ns3::McsGroup >', 'ns3::MinstrelMcsGroups')
     typehandlers.add_type_alias('std::vector< ns3::McsGroup >*', 'ns3::MinstrelMcsGroups*')
     typehandlers.add_type_alias('std::vector< ns3::McsGroup >&', 'ns3::MinstrelMcsGroups&')
-    typehandlers.add_type_alias('std::vector< ns3::HtRateInfo >', 'ns3::HtMinstrelRate')
-    typehandlers.add_type_alias('std::vector< ns3::HtRateInfo >*', 'ns3::HtMinstrelRate*')
-    typehandlers.add_type_alias('std::vector< ns3::HtRateInfo >&', 'ns3::HtMinstrelRate&')
+    typehandlers.add_type_alias('std::vector< ns3::MinstrelHtRateInfo >', 'ns3::MinstrelHtRate')
+    typehandlers.add_type_alias('std::vector< ns3::MinstrelHtRateInfo >*', 'ns3::MinstrelHtRate*')
+    typehandlers.add_type_alias('std::vector< ns3::MinstrelHtRateInfo >&', 'ns3::MinstrelHtRate&')
     typehandlers.add_type_alias('std::vector< ns3::GroupInfo >', 'ns3::McsGroupData')
     typehandlers.add_type_alias('std::vector< ns3::GroupInfo >*', 'ns3::McsGroupData*')
     typehandlers.add_type_alias('std::vector< ns3::GroupInfo >&', 'ns3::McsGroupData&')
@@ -1292,6 +1508,21 @@
     typehandlers.add_type_alias('std::vector< std::vector< unsigned char > >', 'ns3::SampleRate')
     typehandlers.add_type_alias('std::vector< std::vector< unsigned char > >*', 'ns3::SampleRate*')
     typehandlers.add_type_alias('std::vector< std::vector< unsigned char > >&', 'ns3::SampleRate&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', 'ns3::FrequencyChannelInfo')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >*', 'ns3::FrequencyChannelInfo*')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >&', 'ns3::FrequencyChannelInfo&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxOkCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxOkCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxOkCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxErrorCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxErrorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxErrorCallback&')
+    typehandlers.add_type_alias('std::vector< std::pair< double, double > >', 'ns3::SnrPerTable')
+    typehandlers.add_type_alias('std::vector< std::pair< double, double > >*', 'ns3::SnrPerTable*')
+    typehandlers.add_type_alias('std::vector< std::pair< double, double > >&', 'ns3::SnrPerTable&')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >', 'ns3::RxPowerWattPerChannelBand')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >*', 'ns3::RxPowerWattPerChannelBand*')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >&', 'ns3::RxPowerWattPerChannelBand&')
@@ -1310,12 +1541,18 @@
     typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
     typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
+    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
+    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -1440,7 +1677,8 @@
     register_Ns3BandInfo_methods(root_module, root_module['ns3::BandInfo'])
     register_Ns3Bar_methods(root_module, root_module['ns3::Bar'])
     register_Ns3BlockAckAgreement_methods(root_module, root_module['ns3::BlockAckAgreement'])
-    register_Ns3BlockAckCache_methods(root_module, root_module['ns3::BlockAckCache'])
+    register_Ns3BlockAckReqType_methods(root_module, root_module['ns3::BlockAckReqType'])
+    register_Ns3BlockAckType_methods(root_module, root_module['ns3::BlockAckType'])
     register_Ns3BlockAckWindow_methods(root_module, root_module['ns3::BlockAckWindow'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
@@ -1451,6 +1689,7 @@
     register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
     register_Ns3CapabilityInformation_methods(root_module, root_module['ns3::CapabilityInformation'])
+    register_Ns3CtrlTriggerUserInfoField_methods(root_module, root_module['ns3::CtrlTriggerUserInfoField'])
     register_Ns3DataRate_methods(root_module, root_module['ns3::DataRate'])
     register_Ns3DefaultDeleter__Ns3AttributeAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::AttributeAccessor >'])
     register_Ns3DefaultDeleter__Ns3AttributeChecker_methods(root_module, root_module['ns3::DefaultDeleter< ns3::AttributeChecker >'])
@@ -1464,6 +1703,7 @@
     register_Ns3DefaultDeleter__Ns3NixVector_methods(root_module, root_module['ns3::DefaultDeleter< ns3::NixVector >'])
     register_Ns3DefaultDeleter__Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::DefaultDeleter< ns3::OutputStreamWrapper >'])
     register_Ns3DefaultDeleter__Ns3Packet_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Packet >'])
+    register_Ns3DefaultDeleter__Ns3PhyEntity_methods(root_module, root_module['ns3::DefaultDeleter< ns3::PhyEntity >'])
     register_Ns3DefaultDeleter__Ns3QosBlockedDestinations_methods(root_module, root_module['ns3::DefaultDeleter< ns3::QosBlockedDestinations >'])
     register_Ns3DefaultDeleter__Ns3QueueItem_methods(root_module, root_module['ns3::DefaultDeleter< ns3::QueueItem >'])
     register_Ns3DefaultDeleter__Ns3SpectrumModel_methods(root_module, root_module['ns3::DefaultDeleter< ns3::SpectrumModel >'])
@@ -1482,21 +1722,21 @@
     register_Ns3GroupInfo_methods(root_module, root_module['ns3::GroupInfo'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3HeMuUserInfo_methods(root_module, root_module['ns3::HeMuUserInfo'])
-    register_Ns3HePreambleParameters_methods(root_module, root_module['ns3::HePreambleParameters'])
     register_Ns3HeRu_methods(root_module, root_module['ns3::HeRu'])
     register_Ns3HeRuRuSpec_methods(root_module, root_module['ns3::HeRu::RuSpec'])
-    register_Ns3HtRateInfo_methods(root_module, root_module['ns3::HtRateInfo'])
+    register_Ns3HeSigAParameters_methods(root_module, root_module['ns3::HeSigAParameters'])
     register_Ns3InterferenceHelper_methods(root_module, root_module['ns3::InterferenceHelper'])
-    register_Ns3InterferenceHelperSnrPer_methods(root_module, root_module['ns3::InterferenceHelper::SnrPer'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
-    register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
     register_Ns3McsGroup_methods(root_module, root_module['ns3::McsGroup'])
+    register_Ns3MinstrelHtRateInfo_methods(root_module, root_module['ns3::MinstrelHtRateInfo'])
     register_Ns3MpduInfo_methods(root_module, root_module['ns3::MpduInfo'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
@@ -1518,6 +1758,8 @@
     register_Ns3PropagationCache__Ns3JakesProcess_methods(root_module, root_module['ns3::PropagationCache< ns3::JakesProcess >'])
     register_Ns3QueueSize_methods(root_module, root_module['ns3::QueueSize'])
     register_Ns3RateInfo_methods(root_module, root_module['ns3::RateInfo'])
+    register_Ns3RecipientBlockAckAgreement_methods(root_module, root_module['ns3::RecipientBlockAckAgreement'])
+    register_Ns3RxSignalInfo_methods(root_module, root_module['ns3::RxSignalInfo'])
     register_Ns3SignalNoiseDbm_methods(root_module, root_module['ns3::SignalNoiseDbm'])
     register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     register_Ns3Simulator_methods(root_module, root_module['ns3::Simulator'])
@@ -1534,12 +1776,30 @@
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
     register_Ns3Vector2D_methods(root_module, root_module['ns3::Vector2D'])
     register_Ns3Vector3D_methods(root_module, root_module['ns3::Vector3D'])
+    register_Ns3WifiAc_methods(root_module, root_module['ns3::WifiAc'])
+    register_Ns3WifiAcknowledgment_methods(root_module, root_module['ns3::WifiAcknowledgment'])
+    register_Ns3WifiAddressHash_methods(root_module, root_module['ns3::WifiAddressHash'])
+    register_Ns3WifiAddressTidHash_methods(root_module, root_module['ns3::WifiAddressTidHash'])
+    register_Ns3WifiBarBlockAck_methods(root_module, root_module['ns3::WifiBarBlockAck'])
+    register_Ns3WifiBlockAck_methods(root_module, root_module['ns3::WifiBlockAck'])
+    register_Ns3WifiDlMuAggregateTf_methods(root_module, root_module['ns3::WifiDlMuAggregateTf'])
+    register_Ns3WifiDlMuAggregateTfBlockAckInfo_methods(root_module, root_module['ns3::WifiDlMuAggregateTf::BlockAckInfo'])
+    register_Ns3WifiDlMuBarBaSequence_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence'])
+    register_Ns3WifiDlMuBarBaSequenceAckInfo_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence::AckInfo'])
+    register_Ns3WifiDlMuBarBaSequenceBlockAckInfo_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence::BlockAckInfo'])
+    register_Ns3WifiDlMuBarBaSequenceBlockAckReqInfo_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence::BlockAckReqInfo'])
+    register_Ns3WifiDlMuTfMuBar_methods(root_module, root_module['ns3::WifiDlMuTfMuBar'])
+    register_Ns3WifiDlMuTfMuBarBlockAckInfo_methods(root_module, root_module['ns3::WifiDlMuTfMuBar::BlockAckInfo'])
     register_Ns3WifiHelper_methods(root_module, root_module['ns3::WifiHelper'])
     register_Ns3WifiMacHelper_methods(root_module, root_module['ns3::WifiMacHelper'])
     register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
     register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
+    register_Ns3WifiNoAck_methods(root_module, root_module['ns3::WifiNoAck'])
+    register_Ns3WifiNormalAck_methods(root_module, root_module['ns3::WifiNormalAck'])
     register_Ns3WifiPhyHelper_methods(root_module, root_module['ns3::WifiPhyHelper'])
     register_Ns3WifiPhyListener_methods(root_module, root_module['ns3::WifiPhyListener'])
+    register_Ns3WifiPhyOperatingChannel_methods(root_module, root_module['ns3::WifiPhyOperatingChannel'])
+    register_Ns3WifiProtection_methods(root_module, root_module['ns3::WifiProtection'])
     register_Ns3WifiRadioEnergyModelHelper_methods(root_module, root_module['ns3::WifiRadioEnergyModelHelper'])
     register_Ns3WifiRadioEnergyModelPhyListener_methods(root_module, root_module['ns3::WifiRadioEnergyModelPhyListener'])
     register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
@@ -1547,10 +1807,15 @@
     register_Ns3WifiRemoteStationState_methods(root_module, root_module['ns3::WifiRemoteStationState'])
     register_Ns3WifiRraaThresholds_methods(root_module, root_module['ns3::WifiRraaThresholds'])
     register_Ns3WifiRrpaaThresholds_methods(root_module, root_module['ns3::WifiRrpaaThresholds'])
+    register_Ns3WifiRtsCtsProtection_methods(root_module, root_module['ns3::WifiRtsCtsProtection'])
     register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, root_module['ns3::WifiSpectrumValue5MhzFactory'])
     register_Ns3WifiSpectrumValueHelper_methods(root_module, root_module['ns3::WifiSpectrumValueHelper'])
     register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
+    register_Ns3WifiTxParameters_methods(root_module, root_module['ns3::WifiTxParameters'])
+    register_Ns3WifiTxParametersPsduInfo_methods(root_module, root_module['ns3::WifiTxParameters::PsduInfo'])
+    register_Ns3WifiTxTimer_methods(root_module, root_module['ns3::WifiTxTimer'])
     register_Ns3WifiTxVector_methods(root_module, root_module['ns3::WifiTxVector'])
+    register_Ns3WifiUlMuMultiStaBa_methods(root_module, root_module['ns3::WifiUlMuMultiStaBa'])
     register_Ns3YansWifiChannelHelper_methods(root_module, root_module['ns3::YansWifiChannelHelper'])
     register_Ns3YansWifiPhyHelper_methods(root_module, root_module['ns3::YansWifiPhyHelper'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
@@ -1558,8 +1823,6 @@
     register_Ns3AmpduTag_methods(root_module, root_module['ns3::AmpduTag'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
-    register_Ns3HtSigHeader_methods(root_module, root_module['ns3::HtSigHeader'])
-    register_Ns3LSigHeader_methods(root_module, root_module['ns3::LSigHeader'])
     register_Ns3MgtAddBaRequestHeader_methods(root_module, root_module['ns3::MgtAddBaRequestHeader'])
     register_Ns3MgtAddBaResponseHeader_methods(root_module, root_module['ns3::MgtAddBaResponseHeader'])
     register_Ns3MgtAssocRequestHeader_methods(root_module, root_module['ns3::MgtAssocRequestHeader'])
@@ -1569,6 +1832,7 @@
     register_Ns3MgtProbeResponseHeader_methods(root_module, root_module['ns3::MgtProbeResponseHeader'])
     register_Ns3MgtReassocRequestHeader_methods(root_module, root_module['ns3::MgtReassocRequestHeader'])
     register_Ns3MinstrelWifiRemoteStation_methods(root_module, root_module['ns3::MinstrelWifiRemoteStation'])
+    register_Ns3MuSnrTag_methods(root_module, root_module['ns3::MuSnrTag'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
     register_Ns3ObssPdAlgorithm_methods(root_module, root_module['ns3::ObssPdAlgorithm'])
@@ -1594,6 +1858,7 @@
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >'])
     register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >'])
     register_Ns3SimpleRefCount__Ns3QosBlockedDestinations_Ns3Empty_Ns3DefaultDeleter__lt__ns3QosBlockedDestinations__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> >'])
     register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >'])
     register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >'])
@@ -1625,20 +1890,25 @@
     register_Ns3Txop_methods(root_module, root_module['ns3::Txop'])
     register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
     register_Ns3VhtConfiguration_methods(root_module, root_module['ns3::VhtConfiguration'])
-    register_Ns3VhtSigHeader_methods(root_module, root_module['ns3::VhtSigHeader'])
     register_Ns3WeibullRandomVariable_methods(root_module, root_module['ns3::WeibullRandomVariable'])
-    register_Ns3WifiAckPolicySelector_methods(root_module, root_module['ns3::WifiAckPolicySelector'])
+    register_Ns3WifiAckAfterTbPpdu_methods(root_module, root_module['ns3::WifiAckAfterTbPpdu'])
+    register_Ns3WifiAckManager_methods(root_module, root_module['ns3::WifiAckManager'])
     register_Ns3WifiActionHeader_methods(root_module, root_module['ns3::WifiActionHeader'])
     register_Ns3WifiActionHeaderActionValue_methods(root_module, root_module['ns3::WifiActionHeader::ActionValue'])
+    register_Ns3WifiCtsToSelfProtection_methods(root_module, root_module['ns3::WifiCtsToSelfProtection'])
+    register_Ns3WifiDefaultAckManager_methods(root_module, root_module['ns3::WifiDefaultAckManager'])
     register_Ns3WifiInformationElement_methods(root_module, root_module['ns3::WifiInformationElement'])
     register_Ns3WifiInformationElementVector_methods(root_module, root_module['ns3::WifiInformationElementVector'])
     register_Ns3WifiMac_methods(root_module, root_module['ns3::WifiMac'])
     register_Ns3WifiMacHeader_methods(root_module, root_module['ns3::WifiMacHeader'])
     register_Ns3WifiMacQueueItem_methods(root_module, root_module['ns3::WifiMacQueueItem'])
+    register_Ns3WifiMacQueueItemQueueIteratorPair_methods(root_module, root_module['ns3::WifiMacQueueItem::QueueIteratorPair'])
     register_Ns3WifiMacTrailer_methods(root_module, root_module['ns3::WifiMacTrailer'])
+    register_Ns3WifiNoProtection_methods(root_module, root_module['ns3::WifiNoProtection'])
     register_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
     register_Ns3WifiPhyStateHelper_methods(root_module, root_module['ns3::WifiPhyStateHelper'])
     register_Ns3WifiPpdu_methods(root_module, root_module['ns3::WifiPpdu'])
+    register_Ns3WifiProtectionManager_methods(root_module, root_module['ns3::WifiProtectionManager'])
     register_Ns3WifiPsdu_methods(root_module, root_module['ns3::WifiPsdu'])
     register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
     register_Ns3WifiSpectrumPhyInterface_methods(root_module, root_module['ns3::WifiSpectrumPhyInterface'])
@@ -1666,7 +1936,6 @@
     register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
     register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
     register_Ns3CaraWifiManager_methods(root_module, root_module['ns3::CaraWifiManager'])
-    register_Ns3CfParameterSet_methods(root_module, root_module['ns3::CfParameterSet'])
     register_Ns3Channel_methods(root_module, root_module['ns3::Channel'])
     register_Ns3ChannelAccessManager_methods(root_module, root_module['ns3::ChannelAccessManager'])
     register_Ns3ChannelCondition_methods(root_module, root_module['ns3::ChannelCondition'])
@@ -1675,17 +1944,18 @@
     register_Ns3ConstantRandomVariable_methods(root_module, root_module['ns3::ConstantRandomVariable'])
     register_Ns3ConstantRateWifiManager_methods(root_module, root_module['ns3::ConstantRateWifiManager'])
     register_Ns3ConstantSpeedPropagationDelayModel_methods(root_module, root_module['ns3::ConstantSpeedPropagationDelayModel'])
-    register_Ns3ConstantWifiAckPolicySelector_methods(root_module, root_module['ns3::ConstantWifiAckPolicySelector'])
     register_Ns3Cost231PropagationLossModel_methods(root_module, root_module['ns3::Cost231PropagationLossModel'])
     register_Ns3CtrlBAckRequestHeader_methods(root_module, root_module['ns3::CtrlBAckRequestHeader'])
     register_Ns3CtrlBAckResponseHeader_methods(root_module, root_module['ns3::CtrlBAckResponseHeader'])
+    register_Ns3CtrlTriggerHeader_methods(root_module, root_module['ns3::CtrlTriggerHeader'])
     register_Ns3DataRateChecker_methods(root_module, root_module['ns3::DataRateChecker'])
     register_Ns3DataRateValue_methods(root_module, root_module['ns3::DataRateValue'])
     register_Ns3DeterministicRandomVariable_methods(root_module, root_module['ns3::DeterministicRandomVariable'])
     register_Ns3DeviceEnergyModel_methods(root_module, root_module['ns3::DeviceEnergyModel'])
     register_Ns3DoubleValue_methods(root_module, root_module['ns3::DoubleValue'])
     register_Ns3DsssParameterSet_methods(root_module, root_module['ns3::DsssParameterSet'])
-    register_Ns3DsssSigHeader_methods(root_module, root_module['ns3::DsssSigHeader'])
+    register_Ns3DsssPpdu_methods(root_module, root_module['ns3::DsssPpdu'])
+    register_Ns3DsssPpduDsssSigHeader_methods(root_module, root_module['ns3::DsssPpdu::DsssSigHeader'])
     register_Ns3EdcaParameterSet_methods(root_module, root_module['ns3::EdcaParameterSet'])
     register_Ns3EmpiricalRandomVariable_methods(root_module, root_module['ns3::EmpiricalRandomVariable'])
     register_Ns3EmptyAttributeAccessor_methods(root_module, root_module['ns3::EmptyAttributeAccessor'])
@@ -1707,12 +1977,12 @@
     register_Ns3ExtendedSupportedRatesIE_methods(root_module, root_module['ns3::ExtendedSupportedRatesIE'])
     register_Ns3FixedRssLossModel_methods(root_module, root_module['ns3::FixedRssLossModel'])
     register_Ns3FrameCaptureModel_methods(root_module, root_module['ns3::FrameCaptureModel'])
+    register_Ns3FrameExchangeManager_methods(root_module, root_module['ns3::FrameExchangeManager'])
     register_Ns3FriisPropagationLossModel_methods(root_module, root_module['ns3::FriisPropagationLossModel'])
     register_Ns3GammaRandomVariable_methods(root_module, root_module['ns3::GammaRandomVariable'])
     register_Ns3HeCapabilities_methods(root_module, root_module['ns3::HeCapabilities'])
     register_Ns3HeConfiguration_methods(root_module, root_module['ns3::HeConfiguration'])
     register_Ns3HeOperation_methods(root_module, root_module['ns3::HeOperation'])
-    register_Ns3HeSigHeader_methods(root_module, root_module['ns3::HeSigHeader'])
     register_Ns3HtCapabilities_methods(root_module, root_module['ns3::HtCapabilities'])
     register_Ns3HtConfiguration_methods(root_module, root_module['ns3::HtConfiguration'])
     register_Ns3HtOperation_methods(root_module, root_module['ns3::HtOperation'])
@@ -1737,7 +2007,6 @@
     register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
     register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
     register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
-    register_Ns3MacLow_methods(root_module, root_module['ns3::MacLow'])
     register_Ns3MacRxMiddle_methods(root_module, root_module['ns3::MacRxMiddle'])
     register_Ns3MacTxMiddle_methods(root_module, root_module['ns3::MacTxMiddle'])
     register_Ns3MatrixPropagationLossModel_methods(root_module, root_module['ns3::MatrixPropagationLossModel'])
@@ -1747,6 +2016,9 @@
     register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
     register_Ns3MpduAggregator_methods(root_module, root_module['ns3::MpduAggregator'])
     register_Ns3MsduAggregator_methods(root_module, root_module['ns3::MsduAggregator'])
+    register_Ns3MultiUserScheduler_methods(root_module, root_module['ns3::MultiUserScheduler'])
+    register_Ns3MultiUserSchedulerDlMuInfo_methods(root_module, root_module['ns3::MultiUserScheduler::DlMuInfo'])
+    register_Ns3MultiUserSchedulerUlMuInfo_methods(root_module, root_module['ns3::MultiUserScheduler::UlMuInfo'])
     register_Ns3NakagamiPropagationLossModel_methods(root_module, root_module['ns3::NakagamiPropagationLossModel'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NeverLosChannelConditionModel_methods(root_module, root_module['ns3::NeverLosChannelConditionModel'])
@@ -1757,13 +2029,19 @@
     register_Ns3NormalRandomVariable_methods(root_module, root_module['ns3::NormalRandomVariable'])
     register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
     register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
+    register_Ns3OfdmPpdu_methods(root_module, root_module['ns3::OfdmPpdu'])
+    register_Ns3OfdmPpduLSigHeader_methods(root_module, root_module['ns3::OfdmPpdu::LSigHeader'])
     register_Ns3OkumuraHataPropagationLossModel_methods(root_module, root_module['ns3::OkumuraHataPropagationLossModel'])
     register_Ns3OnoeWifiManager_methods(root_module, root_module['ns3::OnoeWifiManager'])
     register_Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::OutputStreamWrapper'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
     register_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
     register_Ns3ParfWifiManager_methods(root_module, root_module['ns3::ParfWifiManager'])
+    register_Ns3PhyEntity_methods(root_module, root_module['ns3::PhyEntity'])
+    register_Ns3PhyEntityPhyFieldRxStatus_methods(root_module, root_module['ns3::PhyEntity::PhyFieldRxStatus'])
+    register_Ns3PhyEntitySnrPer_methods(root_module, root_module['ns3::PhyEntity::SnrPer'])
     register_Ns3QosBlockedDestinations_methods(root_module, root_module['ns3::QosBlockedDestinations'])
+    register_Ns3QosFrameExchangeManager_methods(root_module, root_module['ns3::QosFrameExchangeManager'])
     register_Ns3QosTxop_methods(root_module, root_module['ns3::QosTxop'])
     register_Ns3Queue__Ns3Packet_methods(root_module, root_module['ns3::Queue< ns3::Packet >'])
     register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, root_module['ns3::Queue< ns3::QueueDiscItem >'])
@@ -1774,6 +2052,7 @@
     register_Ns3RateErrorModel_methods(root_module, root_module['ns3::RateErrorModel'])
     register_Ns3ReceiveListErrorModel_methods(root_module, root_module['ns3::ReceiveListErrorModel'])
     register_Ns3RegularWifiMac_methods(root_module, root_module['ns3::RegularWifiMac'])
+    register_Ns3RrMultiUserScheduler_methods(root_module, root_module['ns3::RrMultiUserScheduler'])
     register_Ns3RraaWifiManager_methods(root_module, root_module['ns3::RraaWifiManager'])
     register_Ns3RrpaaWifiManager_methods(root_module, root_module['ns3::RrpaaWifiManager'])
     register_Ns3SimpleFrameCaptureModel_methods(root_module, root_module['ns3::SimpleFrameCaptureModel'])
@@ -1782,8 +2061,10 @@
     register_Ns3Ssid_methods(root_module, root_module['ns3::Ssid'])
     register_Ns3SsidChecker_methods(root_module, root_module['ns3::SsidChecker'])
     register_Ns3SsidValue_methods(root_module, root_module['ns3::SsidValue'])
+    register_Ns3StaWifiMac_methods(root_module, root_module['ns3::StaWifiMac'])
     register_Ns3SupportedRates_methods(root_module, root_module['ns3::SupportedRates'])
     register_Ns3TableBasedErrorRateModel_methods(root_module, root_module['ns3::TableBasedErrorRateModel'])
+    register_Ns3ThompsonSamplingWifiManager_methods(root_module, root_module['ns3::ThompsonSamplingWifiManager'])
     register_Ns3ThreeGppChannelConditionModel_methods(root_module, root_module['ns3::ThreeGppChannelConditionModel'])
     register_Ns3ThreeGppIndoorMixedOfficeChannelConditionModel_methods(root_module, root_module['ns3::ThreeGppIndoorMixedOfficeChannelConditionModel'])
     register_Ns3ThreeGppIndoorOfficePropagationLossModel_methods(root_module, root_module['ns3::ThreeGppIndoorOfficePropagationLossModel'])
@@ -1802,6 +2083,9 @@
     register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
     register_Ns3VhtCapabilities_methods(root_module, root_module['ns3::VhtCapabilities'])
     register_Ns3VhtOperation_methods(root_module, root_module['ns3::VhtOperation'])
+    register_Ns3VhtPpdu_methods(root_module, root_module['ns3::VhtPpdu'])
+    register_Ns3VhtPpduVhtSigHeader_methods(root_module, root_module['ns3::VhtPpdu::VhtSigHeader'])
+    register_Ns3WifiDefaultProtectionManager_methods(root_module, root_module['ns3::WifiDefaultProtectionManager'])
     register_Ns3WifiMacQueue_methods(root_module, root_module['ns3::WifiMacQueue'])
     register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
     register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
@@ -1813,9 +2097,15 @@
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3AdhocWifiMac_methods(root_module, root_module['ns3::AdhocWifiMac'])
     register_Ns3AlwaysLosChannelConditionModel_methods(root_module, root_module['ns3::AlwaysLosChannelConditionModel'])
+    register_Ns3ApWifiMac_methods(root_module, root_module['ns3::ApWifiMac'])
     register_Ns3BinaryErrorModel_methods(root_module, root_module['ns3::BinaryErrorModel'])
     register_Ns3BurstErrorModel_methods(root_module, root_module['ns3::BurstErrorModel'])
+    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Bool_Unsigned_int_Double_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Double_Double_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1823,7 +2113,7 @@
     register_Ns3CallbackImpl__Void_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3DataRate_Ns3DataRate_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3HePreambleParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3HeSigAParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Ptr__lt__const_ns3MobilityModel__gt___Double_Double_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1843,25 +2133,41 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3SpectrumSignalParameters__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Double_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Double_Bool_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3InfrastructureWifiMac_methods(root_module, root_module['ns3::InfrastructureWifiMac'])
+    register_Ns3CallbackImpl__Void_Unsigned_short_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3DsssPhy_methods(root_module, root_module['ns3::DsssPhy'])
+    register_Ns3ErpOfdmPpdu_methods(root_module, root_module['ns3::ErpOfdmPpdu'])
+    register_Ns3HePpdu_methods(root_module, root_module['ns3::HePpdu'])
+    register_Ns3HePpduHeSigHeader_methods(root_module, root_module['ns3::HePpdu::HeSigHeader'])
+    register_Ns3HtFrameExchangeManager_methods(root_module, root_module['ns3::HtFrameExchangeManager'])
+    register_Ns3HtPpdu_methods(root_module, root_module['ns3::HtPpdu'])
+    register_Ns3HtPpduHtSigHeader_methods(root_module, root_module['ns3::HtPpdu::HtSigHeader'])
+    register_Ns3OfdmPhy_methods(root_module, root_module['ns3::OfdmPhy'])
     register_Ns3ProbabilisticV2vHighwayChannelConditionModel_methods(root_module, root_module['ns3::ProbabilisticV2vHighwayChannelConditionModel'])
     register_Ns3ProbabilisticV2vUrbanChannelConditionModel_methods(root_module, root_module['ns3::ProbabilisticV2vUrbanChannelConditionModel'])
     register_Ns3QueueDiscItem_methods(root_module, root_module['ns3::QueueDiscItem'])
-    register_Ns3StaWifiMac_methods(root_module, root_module['ns3::StaWifiMac'])
-    register_Ns3ApWifiMac_methods(root_module, root_module['ns3::ApWifiMac'])
+    register_Ns3VhtFrameExchangeManager_methods(root_module, root_module['ns3::VhtFrameExchangeManager'])
+    register_Ns3ErpOfdmPhy_methods(root_module, root_module['ns3::ErpOfdmPhy'])
+    register_Ns3HeFrameExchangeManager_methods(root_module, root_module['ns3::HeFrameExchangeManager'])
+    register_Ns3HtPhy_methods(root_module, root_module['ns3::HtPhy'])
+    register_Ns3VhtPhy_methods(root_module, root_module['ns3::VhtPhy'])
+    register_Ns3HePhy_methods(root_module, root_module['ns3::HePhy'])
     register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
     register_Ns3HashFunctionFnv1a_methods(root_module, root_module['ns3::Hash::Function::Fnv1a'])
     register_Ns3HashFunctionHash32_methods(root_module, root_module['ns3::Hash::Function::Hash32'])
@@ -1943,18 +2249,32 @@
     cls.add_output_stream_operator()
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Angles const & arg0) [constructor]
     cls.add_constructor([param('ns3::Angles const &', 'arg0')])
-    ## angles.h (module 'antenna'): ns3::Angles::Angles() [constructor]
-    cls.add_constructor([])
-    ## angles.h (module 'antenna'): ns3::Angles::Angles(double phi, double theta) [constructor]
-    cls.add_constructor([param('double', 'phi'), param('double', 'theta')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(double azimuth, double inclination) [constructor]
+    cls.add_constructor([param('double', 'azimuth'), param('double', 'inclination')])
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v) [constructor]
     cls.add_constructor([param('ns3::Vector', 'v')])
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v, ns3::Vector o) [constructor]
     cls.add_constructor([param('ns3::Vector', 'v'), param('ns3::Vector', 'o')])
-    ## angles.h (module 'antenna'): ns3::Angles::phi [variable]
-    cls.add_instance_attribute('phi', 'double', is_const=False)
-    ## angles.h (module 'antenna'): ns3::Angles::theta [variable]
-    cls.add_instance_attribute('theta', 'double', is_const=False)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetAzimuth() const [member function]
+    cls.add_method('GetAzimuth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetInclination() const [member function]
+    cls.add_method('GetInclination', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): void ns3::Angles::SetAzimuth(double azimuth) [member function]
+    cls.add_method('SetAzimuth', 
+                   'void', 
+                   [param('double', 'azimuth')])
+    ## angles.h (module 'antenna'): void ns3::Angles::SetInclination(double inclination) [member function]
+    cls.add_method('SetInclination', 
+                   'void', 
+                   [param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::m_printDeg [variable]
+    cls.add_static_attribute('m_printDeg', 'bool', is_const=False)
     return
 
 def register_Ns3ApInfo_methods(root_module, cls):
@@ -2190,11 +2510,26 @@
     cls.add_constructor([param('ns3::BlockAckAgreement const &', 'arg0')])
     ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::Mac48Address peer, uint8_t tid) [constructor]
     cls.add_constructor([param('ns3::Mac48Address', 'peer'), param('uint8_t', 'tid')])
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckAgreement::GetBlockAckReqType() const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckAgreement::GetBlockAckType() const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [], 
+                   is_const=True)
     ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetBufferSize() const [member function]
     cls.add_method('GetBufferSize', 
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): static std::size_t ns3::BlockAckAgreement::GetDistance(uint16_t seqNumber, uint16_t startingSeqNumber) [member function]
+    cls.add_method('GetDistance', 
+                   'std::size_t', 
+                   [param('uint16_t', 'seqNumber'), param('uint16_t', 'startingSeqNumber')], 
+                   is_static=True)
     ## block-ack-agreement.h (module 'wifi'): ns3::Mac48Address ns3::BlockAckAgreement::GetPeer() const [member function]
     cls.add_method('GetPeer', 
                    'ns3::Mac48Address', 
@@ -2204,7 +2539,7 @@
     cls.add_method('GetStartingSequence', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequenceControl() const [member function]
     cls.add_method('GetStartingSequenceControl', 
                    'uint16_t', 
@@ -2274,32 +2609,36 @@
                    [param('uint16_t', 'timeout')])
     return
 
-def register_Ns3BlockAckCache_methods(root_module, cls):
-    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache::BlockAckCache() [constructor]
-    cls.add_constructor([])
-    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache::BlockAckCache(ns3::BlockAckCache const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BlockAckCache const &', 'arg0')])
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::FillBlockAckBitmap(ns3::CtrlBAckResponseHeader * blockAckHeader) [member function]
-    cls.add_method('FillBlockAckBitmap', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader *', 'blockAckHeader')])
-    ## block-ack-cache.h (module 'wifi'): uint16_t ns3::BlockAckCache::GetWinStart() const [member function]
-    cls.add_method('GetWinStart', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::Init(uint16_t winStart, uint16_t winSize) [member function]
-    cls.add_method('Init', 
-                   'void', 
-                   [param('uint16_t', 'winStart'), param('uint16_t', 'winSize')])
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::UpdateWithBlockAckReq(uint16_t startingSeq) [member function]
-    cls.add_method('UpdateWithBlockAckReq', 
-                   'void', 
-                   [param('uint16_t', 'startingSeq')])
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::UpdateWithMpdu(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('UpdateWithMpdu', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
+def register_Ns3BlockAckReqType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v, uint8_t nSeqControls) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v'), param('uint8_t', 'nSeqControls')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_nSeqControls [variable]
+    cls.add_instance_attribute('m_nSeqControls', 'uint8_t', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckReqType::Variant', is_const=False)
+    return
+
+def register_Ns3BlockAckType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
+    cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckType::Variant', is_const=False)
     return
 
 def register_Ns3BlockAckWindow_methods(root_module, cls):
@@ -2315,6 +2654,11 @@
     cls.add_method('At', 
                    'std::vector< bool > reference', 
                    [param('std::size_t', 'distance')])
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
+    cls.add_method('At', 
+                   'std::vector< bool > const_reference', 
+                   [param('std::size_t', 'distance')], 
+                   is_const=True)
     ## block-ack-window.h (module 'wifi'): uint16_t ns3::BlockAckWindow::GetWinEnd() const [member function]
     cls.add_method('GetWinEnd', 
                    'uint16_t', 
@@ -2786,9 +3130,177 @@
                    [param('bool', 'shortSlotTime')])
     return
 
+def register_Ns3CtrlTriggerUserInfoField_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField::CtrlTriggerUserInfoField(ns3::CtrlTriggerUserInfoField const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlTriggerUserInfoField const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField::CtrlTriggerUserInfoField(uint8_t triggerType) [constructor]
+    cls.add_constructor([param('uint8_t', 'triggerType')])
+    ## ctrl-headers.h (module 'wifi'): ns3::Buffer::Iterator ns3::CtrlTriggerUserInfoField::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')])
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerUserInfoField::GetAid12() const [member function]
+    cls.add_method('GetAid12', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::GetMoreRaRu() const [member function]
+    cls.add_method('GetMoreRaRu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetMpduMuSpacingFactor() const [member function]
+    cls.add_method('GetMpduMuSpacingFactor', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader const & ns3::CtrlTriggerUserInfoField::GetMuBarTriggerDepUserInfo() const [member function]
+    cls.add_method('GetMuBarTriggerDepUserInfo', 
+                   'ns3::CtrlBAckRequestHeader const &', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetNRaRus() const [member function]
+    cls.add_method('GetNRaRus', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetNss() const [member function]
+    cls.add_method('GetNss', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::AcIndex ns3::CtrlTriggerUserInfoField::GetPreferredAc() const [member function]
+    cls.add_method('GetPreferredAc', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::HeRu::RuSpec ns3::CtrlTriggerUserInfoField::GetRuAllocation() const [member function]
+    cls.add_method('GetRuAllocation', 
+                   'ns3::HeRu::RuSpec', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlTriggerUserInfoField::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetStartingSs() const [member function]
+    cls.add_method('GetStartingSs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetTidAggregationLimit() const [member function]
+    cls.add_method('GetTidAggregationLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType ns3::CtrlTriggerUserInfoField::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::TriggerFrameType', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::GetUlDcm() const [member function]
+    cls.add_method('GetUlDcm', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::GetUlFecCodingType() const [member function]
+    cls.add_method('GetUlFecCodingType', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetUlMcs() const [member function]
+    cls.add_method('GetUlMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): int8_t ns3::CtrlTriggerUserInfoField::GetUlTargetRssi() const [member function]
+    cls.add_method('GetUlTargetRssi', 
+                   'int8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::HasRaRuForAssociatedSta() const [member function]
+    cls.add_method('HasRaRuForAssociatedSta', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::HasRaRuForUnassociatedSta() const [member function]
+    cls.add_method('HasRaRuForUnassociatedSta', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::IsUlTargetRssiMaxTxPower() const [member function]
+    cls.add_method('IsUlTargetRssiMaxTxPower', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::Buffer::Iterator ns3::CtrlTriggerUserInfoField::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetAid12(uint16_t aid) [member function]
+    cls.add_method('SetAid12', 
+                   'void', 
+                   [param('uint16_t', 'aid')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetBasicTriggerDepUserInfo(uint8_t spacingFactor, uint8_t tidLimit, ns3::AcIndex prefAc) [member function]
+    cls.add_method('SetBasicTriggerDepUserInfo', 
+                   'void', 
+                   [param('uint8_t', 'spacingFactor'), param('uint8_t', 'tidLimit'), param('ns3::AcIndex', 'prefAc')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetMuBarTriggerDepUserInfo(ns3::CtrlBAckRequestHeader const & bar) [member function]
+    cls.add_method('SetMuBarTriggerDepUserInfo', 
+                   'void', 
+                   [param('ns3::CtrlBAckRequestHeader const &', 'bar')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetRaRuInformation(uint8_t nRaRu, bool moreRaRu) [member function]
+    cls.add_method('SetRaRuInformation', 
+                   'void', 
+                   [param('uint8_t', 'nRaRu'), param('bool', 'moreRaRu')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetRuAllocation(ns3::HeRu::RuSpec ru) [member function]
+    cls.add_method('SetRuAllocation', 
+                   'void', 
+                   [param('ns3::HeRu::RuSpec', 'ru')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetSsAllocation(uint8_t startingSs, uint8_t nSs) [member function]
+    cls.add_method('SetSsAllocation', 
+                   'void', 
+                   [param('uint8_t', 'startingSs'), param('uint8_t', 'nSs')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlDcm(bool dcm) [member function]
+    cls.add_method('SetUlDcm', 
+                   'void', 
+                   [param('bool', 'dcm')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlFecCodingType(bool ldpc) [member function]
+    cls.add_method('SetUlFecCodingType', 
+                   'void', 
+                   [param('bool', 'ldpc')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlMcs(uint8_t mcs) [member function]
+    cls.add_method('SetUlMcs', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlTargetRssi(int8_t dBm) [member function]
+    cls.add_method('SetUlTargetRssi', 
+                   'void', 
+                   [param('int8_t', 'dBm')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlTargetRssiMaxTxPower() [member function]
+    cls.add_method('SetUlTargetRssiMaxTxPower', 
+                   'void', 
+                   [])
+    return
+
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2963,6 +3475,18 @@
                    is_static=True)
     return
 
+def register_Ns3DefaultDeleter__Ns3PhyEntity_methods(root_module, cls):
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity>::DefaultDeleter() [constructor]
+    cls.add_constructor([])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity>::DefaultDeleter(ns3::DefaultDeleter<ns3::PhyEntity> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DefaultDeleter< ns3::PhyEntity > const &', 'arg0')])
+    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::PhyEntity>::Delete(ns3::PhyEntity * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::PhyEntity *', 'object')], 
+                   is_static=True)
+    return
+
 def register_Ns3DefaultDeleter__Ns3QosBlockedDestinations_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::QosBlockedDestinations>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -3294,7 +3818,7 @@
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::GroupInfo::m_maxTpRate2 [variable]
     cls.add_instance_attribute('m_maxTpRate2', 'uint16_t', is_const=False)
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::GroupInfo::m_ratesTable [variable]
-    cls.add_instance_attribute('m_ratesTable', 'ns3::HtMinstrelRate', is_const=False)
+    cls.add_instance_attribute('m_ratesTable', 'ns3::MinstrelHtRate', is_const=False)
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::GroupInfo::m_supported [variable]
     cls.add_instance_attribute('m_supported', 'bool', is_const=False)
     return
@@ -3341,41 +3865,60 @@
     cls.add_instance_attribute('ru', 'ns3::HeRu::RuSpec', is_const=False)
     return
 
-def register_Ns3HePreambleParameters_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::HePreambleParameters() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::HePreambleParameters(ns3::HePreambleParameters const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HePreambleParameters const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::bssColor [variable]
-    cls.add_instance_attribute('bssColor', 'uint8_t', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::rssiW [variable]
-    cls.add_instance_attribute('rssiW', 'double', is_const=False)
-    return
-
 def register_Ns3HeRu_methods(root_module, cls):
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu() [constructor]
     cls.add_constructor([])
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, ns3::HeRu::SubcarrierGroup const & toneRanges) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('ns3::HeRu::SubcarrierGroup const &', 'toneRanges')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuSpec ns3::HeRu::FindOverlappingRu(uint16_t bw, ns3::HeRu::RuSpec referenceRu, ns3::HeRu::RuType searchedRuType) [member function]
+    cls.add_method('FindOverlappingRu', 
+                   'ns3::HeRu::RuSpec', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'referenceRu'), param('ns3::HeRu::RuType', 'searchedRuType')], 
+                   is_static=True)
     ## he-ru.h (module 'wifi'): static uint16_t ns3::HeRu::GetBandwidth(ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetBandwidth', 
                    'uint16_t', 
                    [param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetCentral26TonesRus', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations, std::size_t & nCentral26TonesRus) [member function]
     cls.add_method('GetEqualSizedRusForStations', 
                    'ns3::HeRu::RuType', 
-                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations')], 
+                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations'), param('std::size_t &', 'nCentral26TonesRus')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint8_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetNRus', 
                    'std::size_t', 
-                   [param('uint8_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetRuType(uint16_t bandwidth) [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [param('uint16_t', 'bandwidth')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetRusOfType', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint8_t bw, ns3::HeRu::RuType ruType, std::size_t index) [member function]
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint16_t bw, ns3::HeRu::RuType ruType, std::size_t phyIndex) [member function]
     cls.add_method('GetSubcarrierGroup', 
                    'ns3::HeRu::SubcarrierGroup', 
-                   [param('uint8_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index')], 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'phyIndex')], 
                    is_static=True)
     ## he-ru.h (module 'wifi'): ns3::HeRu::m_heRuSubcarrierGroups [variable]
     cls.add_static_attribute('m_heRuSubcarrierGroups', 'ns3::HeRu::SubcarrierGroups const', is_const=True)
@@ -3383,57 +3926,52 @@
 
 def register_Ns3HeRuRuSpec_methods(root_module, cls):
     cls.add_output_stream_operator()
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec() [constructor]
-    cls.add_constructor([])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::index [variable]
-    cls.add_instance_attribute('index', 'std::size_t', is_const=False)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::primary80MHz [variable]
-    cls.add_instance_attribute('primary80MHz', 'bool', is_const=False)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::ruType [variable]
-    cls.add_instance_attribute('ruType', 'ns3::HeRu::RuType', is_const=False)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
+    cls.add_constructor([])
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuType ruType, std::size_t index, bool primary80MHz) [constructor]
+    cls.add_constructor([param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index'), param('bool', 'primary80MHz')])
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetIndex() const [member function]
+    cls.add_method('GetIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetPhyIndex() const [member function]
+    cls.add_method('GetPhyIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::GetPrimary80MHz() const [member function]
+    cls.add_method('GetPrimary80MHz', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType ns3::HeRu::RuSpec::GetRuType() const [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::IsPhyIndexSet() const [member function]
+    cls.add_method('IsPhyIndexSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): void ns3::HeRu::RuSpec::SetPhyIndex(uint16_t bw, uint8_t p20Index) [member function]
+    cls.add_method('SetPhyIndex', 
+                   'void', 
+                   [param('uint16_t', 'bw'), param('uint8_t', 'p20Index')])
     return
 
-def register_Ns3HtRateInfo_methods(root_module, cls):
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::HtRateInfo() [constructor]
-    cls.add_constructor([])
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::HtRateInfo(ns3::HtRateInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtRateInfo const &', 'arg0')])
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::adjustedRetryCount [variable]
-    cls.add_instance_attribute('adjustedRetryCount', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::attemptHist [variable]
-    cls.add_instance_attribute('attemptHist', 'uint64_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::ewmaProb [variable]
-    cls.add_instance_attribute('ewmaProb', 'double', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::ewmsdProb [variable]
-    cls.add_instance_attribute('ewmsdProb', 'double', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::mcsIndex [variable]
-    cls.add_instance_attribute('mcsIndex', 'uint8_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::numRateAttempt [variable]
-    cls.add_instance_attribute('numRateAttempt', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::numRateSuccess [variable]
-    cls.add_instance_attribute('numRateSuccess', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::numSamplesSkipped [variable]
-    cls.add_instance_attribute('numSamplesSkipped', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::perfectTxTime [variable]
-    cls.add_instance_attribute('perfectTxTime', 'ns3::Time', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::prevNumRateAttempt [variable]
-    cls.add_instance_attribute('prevNumRateAttempt', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::prevNumRateSuccess [variable]
-    cls.add_instance_attribute('prevNumRateSuccess', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::prob [variable]
-    cls.add_instance_attribute('prob', 'double', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::retryCount [variable]
-    cls.add_instance_attribute('retryCount', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::retryUpdated [variable]
-    cls.add_instance_attribute('retryUpdated', 'bool', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::successHist [variable]
-    cls.add_instance_attribute('successHist', 'uint64_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::supported [variable]
-    cls.add_instance_attribute('supported', 'bool', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::throughput [variable]
-    cls.add_instance_attribute('throughput', 'double', is_const=False)
+def register_Ns3HeSigAParameters_methods(root_module, cls):
+    ## he-phy.h (module 'wifi'): ns3::HeSigAParameters::HeSigAParameters() [constructor]
+    cls.add_constructor([])
+    ## he-phy.h (module 'wifi'): ns3::HeSigAParameters::HeSigAParameters(ns3::HeSigAParameters const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeSigAParameters const &', 'arg0')])
+    ## he-phy.h (module 'wifi'): ns3::HeSigAParameters::bssColor [variable]
+    cls.add_instance_attribute('bssColor', 'uint8_t', is_const=False)
+    ## he-phy.h (module 'wifi'): ns3::HeSigAParameters::rssiW [variable]
+    cls.add_instance_attribute('rssiW', 'double', is_const=False)
     return
 
 def register_Ns3InterferenceHelper_methods(root_module, cls):
@@ -3441,10 +3979,10 @@
     cls.add_constructor([param('ns3::InterferenceHelper const &', 'arg0')])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper() [constructor]
     cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::InterferenceHelper::Add(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::InterferenceHelper::Add(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [member function]
     cls.add_method('Add', 
                    'ns3::Ptr< ns3::Event >', 
-                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')])
     ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddBand(ns3::WifiSpectrumBand band) [member function]
     cls.add_method('AddBand', 
                    'void', 
@@ -3453,21 +3991,16 @@
     cls.add_method('AddForeignSignal', 
                    'void', 
                    [param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateHtPhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('CalculateHtPhyHeaderSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
-                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateNonHtPhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('CalculateNonHtPhyHeaderSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
-                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculatePayloadSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, uint16_t staId, std::pair<ns3::Time, ns3::Time> relativeMpduStartStop) const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::InterferenceHelper::CalculatePayloadSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, uint16_t staId, std::pair<ns3::Time, ns3::Time> relativeMpduStartStop) const [member function]
     cls.add_method('CalculatePayloadSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
                    [param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'channelWidth'), param('std::pair< unsigned int, unsigned int >', 'band'), param('uint16_t', 'staId'), param('std::pair< ns3::Time, ns3::Time >', 'relativeMpduStartStop')], 
                    is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::InterferenceHelper::CalculatePhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, ns3::WifiPpduField header) const [member function]
+    cls.add_method('CalculatePhyHeaderSnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'channelWidth'), param('std::pair< unsigned int, unsigned int >', 'band'), param('ns3::WifiPpduField', 'header')], 
+                   is_const=True)
     ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateSnr(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, uint8_t nss, ns3::WifiSpectrumBand band) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
@@ -3477,20 +4010,19 @@
     cls.add_method('EraseEvents', 
                    'void', 
                    [])
-    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW, ns3::WifiSpectrumBand band) const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW, ns3::WifiSpectrumBand band) [member function]
     cls.add_method('GetEnergyDuration', 
                    'ns3::Time', 
-                   [param('double', 'energyW'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
+                   [param('double', 'energyW'), param('std::pair< unsigned int, unsigned int >', 'band')])
     ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::ErrorRateModel> ns3::InterferenceHelper::GetErrorRateModel() const [member function]
     cls.add_method('GetErrorRateModel', 
                    'ns3::Ptr< ns3::ErrorRateModel >', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd() [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd(ns3::Time endTime) [member function]
     cls.add_method('NotifyRxEnd', 
                    'void', 
-                   [])
+                   [param('ns3::Time', 'endTime')])
     ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxStart() [member function]
     cls.add_method('NotifyRxStart', 
                    'void', 
@@ -3511,10 +4043,19 @@
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint8_t', 'rx')])
-    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiMode mode, ns3::WifiTxVector txVector) const [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiMode mode, ns3::WifiTxVector const & txVector, ns3::WifiPpduField field) const [member function]
     cls.add_method('CalculateChunkSuccessRate', 
                    'double', 
-                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector')], 
+                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPpduField', 'field')], 
+                   is_const=True, visibility='protected')
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculatePayloadChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
+    cls.add_method('CalculatePayloadChunkSuccessRate', 
+                   'double', 
+                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True, visibility='protected')
     ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateSnr(double signal, double noiseInterference, uint16_t channelWidth, uint8_t nss) const [member function]
     cls.add_method('CalculateSnr', 
@@ -3523,17 +4064,6 @@
                    is_const=True, visibility='protected')
     return
 
-def register_Ns3InterferenceHelperSnrPer_methods(root_module, cls):
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer() [constructor]
-    cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer(ns3::InterferenceHelper::SnrPer const & arg0) [constructor]
-    cls.add_constructor([param('ns3::InterferenceHelper::SnrPer const &', 'arg0')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::per [variable]
-    cls.add_instance_attribute('per', 'double', is_const=False)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::snr [variable]
-    cls.add_instance_attribute('snr', 'double', is_const=False)
-    return
-
 def register_Ns3Ipv4Address_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3657,6 +4187,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3870,6 +4412,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -3945,6 +4492,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3965,6 +4524,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4179,119 +4743,76 @@
                    is_static=True)
     return
 
-def register_Ns3MacLowTransmissionParameters_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters(ns3::MacLowTransmissionParameters const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacLowTransmissionParameters const &', 'arg0')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters() [constructor]
-    cls.add_constructor([])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableAck() [member function]
-    cls.add_method('DisableAck', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableBlockAckRequest() [member function]
-    cls.add_method('DisableBlockAckRequest', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableNextData() [member function]
-    cls.add_method('DisableNextData', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableRts() [member function]
-    cls.add_method('DisableRts', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableAck() [member function]
-    cls.add_method('EnableAck', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBlockAck(ns3::BlockAckType type) [member function]
-    cls.add_method('EnableBlockAck', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBlockAckRequest(ns3::BlockAckType type) [member function]
-    cls.add_method('EnableBlockAckRequest', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableNextData(uint32_t size) [member function]
-    cls.add_method('EnableNextData', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableRts() [member function]
-    cls.add_method('EnableRts', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::BlockAckType ns3::MacLowTransmissionParameters::GetBlockAckRequestType() const [member function]
-    cls.add_method('GetBlockAckRequestType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::BlockAckType ns3::MacLowTransmissionParameters::GetBlockAckType() const [member function]
-    cls.add_method('GetBlockAckType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): uint32_t ns3::MacLowTransmissionParameters::GetNextPacketSize() const [member function]
-    cls.add_method('GetNextPacketSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::HasNextPacket() const [member function]
-    cls.add_method('HasNextPacket', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendBlockAckRequest() const [member function]
-    cls.add_method('MustSendBlockAckRequest', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendRts() const [member function]
-    cls.add_method('MustSendRts', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitBlockAck() const [member function]
-    cls.add_method('MustWaitBlockAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitNormalAck() const [member function]
-    cls.add_method('MustWaitNormalAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    return
-
-def register_Ns3McsGroup_methods(root_module, cls):
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::McsGroup() [constructor]
+def register_Ns3McsGroup_methods(root_module, cls):
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::McsGroup() [constructor]
     cls.add_constructor([])
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::McsGroup(ns3::McsGroup const & arg0) [constructor]
     cls.add_constructor([param('ns3::McsGroup const &', 'arg0')])
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::chWidth [variable]
     cls.add_instance_attribute('chWidth', 'uint16_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::gi [variable]
+    cls.add_instance_attribute('gi', 'uint16_t', is_const=False)
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::isSupported [variable]
     cls.add_instance_attribute('isSupported', 'bool', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::isVht [variable]
-    cls.add_instance_attribute('isVht', 'bool', is_const=False)
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::ratesFirstMpduTxTimeTable [variable]
     cls.add_instance_attribute('ratesFirstMpduTxTimeTable', 'ns3::TxTime', is_const=False)
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::ratesTxTimeTable [variable]
     cls.add_instance_attribute('ratesTxTimeTable', 'ns3::TxTime', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::sgi [variable]
-    cls.add_instance_attribute('sgi', 'uint8_t', is_const=False)
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::streams [variable]
     cls.add_instance_attribute('streams', 'uint8_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::type [variable]
+    cls.add_instance_attribute('type', 'ns3::McsGroupType', is_const=False)
+    return
+
+def register_Ns3MinstrelHtRateInfo_methods(root_module, cls):
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::MinstrelHtRateInfo() [constructor]
+    cls.add_constructor([])
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::MinstrelHtRateInfo(ns3::MinstrelHtRateInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MinstrelHtRateInfo const &', 'arg0')])
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::adjustedRetryCount [variable]
+    cls.add_instance_attribute('adjustedRetryCount', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::attemptHist [variable]
+    cls.add_instance_attribute('attemptHist', 'uint64_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::ewmaProb [variable]
+    cls.add_instance_attribute('ewmaProb', 'double', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::ewmsdProb [variable]
+    cls.add_instance_attribute('ewmsdProb', 'double', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::mcsIndex [variable]
+    cls.add_instance_attribute('mcsIndex', 'uint8_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::numRateAttempt [variable]
+    cls.add_instance_attribute('numRateAttempt', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::numRateSuccess [variable]
+    cls.add_instance_attribute('numRateSuccess', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::numSamplesSkipped [variable]
+    cls.add_instance_attribute('numSamplesSkipped', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::perfectTxTime [variable]
+    cls.add_instance_attribute('perfectTxTime', 'ns3::Time', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::prevNumRateAttempt [variable]
+    cls.add_instance_attribute('prevNumRateAttempt', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::prevNumRateSuccess [variable]
+    cls.add_instance_attribute('prevNumRateSuccess', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::prob [variable]
+    cls.add_instance_attribute('prob', 'double', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::retryCount [variable]
+    cls.add_instance_attribute('retryCount', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::retryUpdated [variable]
+    cls.add_instance_attribute('retryUpdated', 'bool', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::successHist [variable]
+    cls.add_instance_attribute('successHist', 'uint64_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::supported [variable]
+    cls.add_instance_attribute('supported', 'bool', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::throughput [variable]
+    cls.add_instance_attribute('throughput', 'double', is_const=False)
     return
 
 def register_Ns3MpduInfo_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::MpduInfo() [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::MpduInfo() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::MpduInfo(ns3::MpduInfo const & arg0) [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::MpduInfo(ns3::MpduInfo const & arg0) [constructor]
     cls.add_constructor([param('ns3::MpduInfo const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::mpduRefNumber [variable]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::mpduRefNumber [variable]
     cls.add_instance_attribute('mpduRefNumber', 'uint32_t', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::type [variable]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::type [variable]
     cls.add_instance_attribute('type', 'ns3::MpduType', is_const=False)
     return
 
@@ -4537,7 +5058,7 @@
     cls.add_method('GetStartingSequence', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::InitTxWindow() [member function]
     cls.add_method('InitTxWindow', 
                    'void', 
@@ -5026,14 +5547,54 @@
     cls.add_instance_attribute('throughput', 'uint32_t', is_const=False)
     return
 
+def register_Ns3RecipientBlockAckAgreement_methods(root_module, cls):
+    ## recipient-block-ack-agreement.h (module 'wifi'): ns3::RecipientBlockAckAgreement::RecipientBlockAckAgreement(ns3::RecipientBlockAckAgreement const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RecipientBlockAckAgreement const &', 'arg0')])
+    ## recipient-block-ack-agreement.h (module 'wifi'): ns3::RecipientBlockAckAgreement::RecipientBlockAckAgreement(ns3::Mac48Address originator, bool amsduSupported, uint8_t tid, uint16_t bufferSize, uint16_t timeout, uint16_t startingSeq, bool htSupported) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address', 'originator'), param('bool', 'amsduSupported'), param('uint8_t', 'tid'), param('uint16_t', 'bufferSize'), param('uint16_t', 'timeout'), param('uint16_t', 'startingSeq'), param('bool', 'htSupported')])
+    ## recipient-block-ack-agreement.h (module 'wifi'): void ns3::RecipientBlockAckAgreement::FillBlockAckBitmap(ns3::CtrlBAckResponseHeader * blockAckHeader, std::size_t index=0) const [member function]
+    cls.add_method('FillBlockAckBitmap', 
+                   'void', 
+                   [param('ns3::CtrlBAckResponseHeader *', 'blockAckHeader'), param('std::size_t', 'index', default_value='0')], 
+                   is_const=True)
+    ## recipient-block-ack-agreement.h (module 'wifi'): void ns3::RecipientBlockAckAgreement::Flush() [member function]
+    cls.add_method('Flush', 
+                   'void', 
+                   [])
+    ## recipient-block-ack-agreement.h (module 'wifi'): void ns3::RecipientBlockAckAgreement::NotifyReceivedBar(uint16_t startingSequenceNumber) [member function]
+    cls.add_method('NotifyReceivedBar', 
+                   'void', 
+                   [param('uint16_t', 'startingSequenceNumber')])
+    ## recipient-block-ack-agreement.h (module 'wifi'): void ns3::RecipientBlockAckAgreement::NotifyReceivedMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyReceivedMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## recipient-block-ack-agreement.h (module 'wifi'): void ns3::RecipientBlockAckAgreement::SetMacRxMiddle(ns3::Ptr<ns3::MacRxMiddle> const rxMiddle) [member function]
+    cls.add_method('SetMacRxMiddle', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MacRxMiddle > const', 'rxMiddle')])
+    return
+
+def register_Ns3RxSignalInfo_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::RxSignalInfo() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::RxSignalInfo(ns3::RxSignalInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RxSignalInfo const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::rssi [variable]
+    cls.add_instance_attribute('rssi', 'double', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
+    return
+
 def register_Ns3SignalNoiseDbm_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm() [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm(ns3::SignalNoiseDbm const & arg0) [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm(ns3::SignalNoiseDbm const & arg0) [constructor]
     cls.add_constructor([param('ns3::SignalNoiseDbm const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::noise [variable]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::noise [variable]
     cls.add_instance_attribute('noise', 'double', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::signal [variable]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::signal [variable]
     cls.add_instance_attribute('signal', 'double', is_const=False)
     return
 
@@ -5858,6 +6419,290 @@
     cls.add_instance_attribute('z', 'double', is_const=False)
     return
 
+def register_Ns3WifiAc_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(ns3::WifiAc const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAc const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(uint8_t lowTid, uint8_t highTid) [constructor]
+    cls.add_constructor([param('uint8_t', 'lowTid'), param('uint8_t', 'highTid')])
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetHighTid() const [member function]
+    cls.add_method('GetHighTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetLowTid() const [member function]
+    cls.add_method('GetLowTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetOtherTid(uint8_t tid) const [member function]
+    cls.add_method('GetOtherTid', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    return
+
+def register_Ns3WifiAcknowledgment_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::WifiAcknowledgment(ns3::WifiAcknowledgment::Method m) [constructor]
+    cls.add_constructor([param('ns3::WifiAcknowledgment::Method', 'm')])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAcknowledgment::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiAcknowledgment::GetQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid) const [member function]
+    cls.add_method('GetQosAckPolicy', 
+                   'ns3::WifiMacHeader::QosAckPolicy', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiAcknowledgment::SetQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) [member function]
+    cls.add_method('SetQosAckPolicy', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')])
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiAcknowledgment::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::method [variable]
+    cls.add_instance_attribute('method', 'ns3::WifiAcknowledgment::Method const', is_const=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::acknowledgmentTime [variable]
+    cls.add_instance_attribute('acknowledgmentTime', 'ns3::Time', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::WifiAcknowledgment(ns3::WifiAcknowledgment const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAcknowledgment const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiAcknowledgment::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3WifiAddressHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash(ns3::WifiAddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressHash::operator()(ns3::Mac48Address const & address) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3WifiAddressTidHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash(ns3::WifiAddressTidHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressTidHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressTidHash::operator()(ns3::WifiAddressTidPair const & addressTidPair) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::WifiAddressTidPair const &', 'addressTidPair')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3WifiBarBlockAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::WifiBarBlockAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBarBlockAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiBarBlockAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiBarBlockAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::blockAckReqTxVector [variable]
+    cls.add_instance_attribute('blockAckReqTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::barType [variable]
+    cls.add_instance_attribute('barType', 'ns3::BlockAckReqType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::WifiBarBlockAck(ns3::WifiBarBlockAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiBarBlockAck const &', 'arg0')])
+    return
+
+def register_Ns3WifiBlockAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::WifiBlockAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBlockAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiBlockAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiBlockAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::WifiBlockAck(ns3::WifiBlockAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiBlockAck const &', 'arg0')])
+    return
+
+def register_Ns3WifiDlMuAggregateTf_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::WifiDlMuAggregateTf(ns3::WifiDlMuAggregateTf const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuAggregateTf const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::WifiDlMuAggregateTf() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiDlMuAggregateTf::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuAggregateTf::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiDlMuAggregateTf::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::stationsReplyingWithBlockAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithBlockAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuAggregateTf::BlockAckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::ulLength [variable]
+    cls.add_instance_attribute('ulLength', 'uint16_t', is_const=False)
+    return
+
+def register_Ns3WifiDlMuAggregateTfBlockAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::BlockAckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::BlockAckInfo(ns3::WifiDlMuAggregateTf::BlockAckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuAggregateTf::BlockAckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::barHeader [variable]
+    cls.add_instance_attribute('barHeader', 'ns3::CtrlBAckRequestHeader', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::muBarSize [variable]
+    cls.add_instance_attribute('muBarSize', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequence_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::WifiDlMuBarBaSequence(ns3::WifiDlMuBarBaSequence const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::WifiDlMuBarBaSequence() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiDlMuBarBaSequence::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuBarBaSequence::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiDlMuBarBaSequence::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::stationsReplyingWithBlockAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithBlockAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::stationsReplyingWithNormalAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithNormalAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::AckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::stationsSendBlockAckReqTo [variable]
+    cls.add_instance_attribute('stationsSendBlockAckReqTo', 'std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckReqInfo >', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequenceAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo::AckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo::AckInfo(ns3::WifiDlMuBarBaSequence::AckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence::AckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo::ackTxVector [variable]
+    cls.add_instance_attribute('ackTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequenceBlockAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::BlockAckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::BlockAckInfo(ns3::WifiDlMuBarBaSequence::BlockAckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence::BlockAckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequenceBlockAckReqInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::BlockAckReqInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::BlockAckReqInfo(ns3::WifiDlMuBarBaSequence::BlockAckReqInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence::BlockAckReqInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::barType [variable]
+    cls.add_instance_attribute('barType', 'ns3::BlockAckReqType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::blockAckReqTxVector [variable]
+    cls.add_instance_attribute('blockAckReqTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiDlMuTfMuBar_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::WifiDlMuTfMuBar(ns3::WifiDlMuTfMuBar const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuTfMuBar const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::WifiDlMuTfMuBar() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiDlMuTfMuBar::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuTfMuBar::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiDlMuTfMuBar::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::barTypes [variable]
+    cls.add_instance_attribute('barTypes', 'std::list< ns3::BlockAckReqType >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::muBarTxVector [variable]
+    cls.add_instance_attribute('muBarTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::stationsReplyingWithBlockAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithBlockAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuTfMuBar::BlockAckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::ulLength [variable]
+    cls.add_instance_attribute('ulLength', 'uint16_t', is_const=False)
+    return
+
+def register_Ns3WifiDlMuTfMuBarBlockAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::BlockAckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::BlockAckInfo(ns3::WifiDlMuTfMuBar::BlockAckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuTfMuBar::BlockAckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::barHeader [variable]
+    cls.add_instance_attribute('barHeader', 'ns3::CtrlBAckRequestHeader', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
 def register_Ns3WifiHelper_methods(root_module, cls):
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper::WifiHelper(ns3::WifiHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiHelper const &', 'arg0')])
@@ -5892,10 +6737,6 @@
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('std::string', 'nodeName')], 
                    is_const=True, is_virtual=True)
-    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetAckPolicySelectorForAc(ns3::AcIndex ac, std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetAckPolicySelectorForAc', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac'), param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
     ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetObssPdAlgorithm(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetObssPdAlgorithm', 
                    'void', 
@@ -5925,20 +6766,16 @@
     cls.add_constructor([param('ns3::WifiMacHelper const &', 'arg0')])
     ## wifi-mac-helper.h (module 'wifi'): ns3::WifiMacHelper::WifiMacHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::NetDevice> device, ns3::WifiStandard standard) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::WifiStandard', 'standard')], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-helper.h (module 'wifi'): void ns3::WifiMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue(), std::string n8="", ns3::AttributeValue const & v8=ns3::EmptyAttributeValue(), std::string n9="", ns3::AttributeValue const & v9=ns3::EmptyAttributeValue(), std::string n10="", ns3::AttributeValue const & v10=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetType', 
-                   'void', 
-                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n8', default_value='""'), param('ns3::AttributeValue const &', 'v8', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n9', default_value='""'), param('ns3::AttributeValue const &', 'v9', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n10', default_value='""'), param('ns3::AttributeValue const &', 'v10', default_value='ns3::EmptyAttributeValue()')], 
-                   is_virtual=True)
     return
 
 def register_Ns3WifiMode_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
     cls.add_output_stream_operator()
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [constructor]
@@ -5962,10 +6799,10 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector txVector, uint16_t staId=65535) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetDataRate', 
@@ -5992,10 +6829,15 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector txVector) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('uint16_t', 'channelWidth')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -6032,18 +6874,64 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
     return
 
+def register_Ns3WifiNoAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck::WifiNoAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNoAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiNoAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiNoAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck::WifiNoAck(ns3::WifiNoAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiNoAck const &', 'arg0')])
+    return
+
+def register_Ns3WifiNormalAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::WifiNormalAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNormalAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiNormalAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiNormalAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::ackTxVector [variable]
+    cls.add_instance_attribute('ackTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::WifiNormalAck(ns3::WifiNormalAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiNormalAck const &', 'arg0')])
+    return
+
 def register_Ns3WifiPhyHelper_methods(root_module, cls):
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::WifiPhyHelper(ns3::WifiPhyHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiPhyHelper const &', 'arg0')])
@@ -6162,6 +7050,76 @@
                    is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3WifiPhyOperatingChannel_methods(root_module, cls):
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel(ns3::WifiPhyOperatingChannel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhyOperatingChannel const &', 'arg0')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetNumber() const [member function]
+    cls.add_method('GetNumber', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelCenterFrequency(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelCenterFrequency', 
+                   'uint16_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelIndex(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelIndex', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetWidth() const [member function]
+    cls.add_method('GetWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): bool ns3::WifiPhyOperatingChannel::IsSet() const [member function]
+    cls.add_method('IsSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('SetDefault', 
+                   'void', 
+                   [param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetPrimary20Index(uint8_t index) [member function]
+    cls.add_method('SetPrimary20Index', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    return
+
+def register_Ns3WifiProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::WifiProtection(ns3::WifiProtection::Method m) [constructor]
+    cls.add_constructor([param('ns3::WifiProtection::Method', 'm')])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::method [variable]
+    cls.add_instance_attribute('method', 'ns3::WifiProtection::Method const', is_const=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::protectionTime [variable]
+    cls.add_instance_attribute('protectionTime', 'ns3::Time', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::WifiProtection(ns3::WifiProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiRadioEnergyModelHelper_methods(root_module, cls):
     ## wifi-radio-energy-model-helper.h (module 'wifi'): ns3::WifiRadioEnergyModelHelper::WifiRadioEnergyModelHelper(ns3::WifiRadioEnergyModelHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRadioEnergyModelHelper const &', 'arg0')])
@@ -6261,6 +7219,8 @@
     cls.add_constructor([])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation(ns3::WifiRemoteStation const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRemoteStation const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_rssiAndUpdateTimePair [variable]
+    cls.add_instance_attribute('m_rssiAndUpdateTimePair', 'std::pair< double, ns3::Time >', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_state [variable]
     cls.add_instance_attribute('m_state', 'ns3::WifiRemoteStationState *', is_const=False)
     return
@@ -6296,6 +7256,10 @@
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
     cls.add_instance_attribute('m_channelWidth', 'uint16_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_dsssSupported [variable]
+    cls.add_instance_attribute('m_dsssSupported', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_erpOfdmSupported [variable]
+    cls.add_instance_attribute('m_erpOfdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_guardInterval [variable]
     cls.add_instance_attribute('m_guardInterval', 'uint16_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_heCapabilities [variable]
@@ -6306,6 +7270,8 @@
     cls.add_instance_attribute('m_info', 'ns3::WifiRemoteStationInfo', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint8_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ofdmSupported [variable]
+    cls.add_instance_attribute('m_ofdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
     cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
@@ -6346,6 +7312,27 @@
     cls.add_instance_attribute('m_ori', 'double', is_const=False)
     return
 
+def register_Ns3WifiRtsCtsProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::WifiRtsCtsProtection() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiRtsCtsProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiRtsCtsProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::rtsTxVector [variable]
+    cls.add_instance_attribute('rtsTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::ctsTxVector [variable]
+    cls.add_instance_attribute('ctsTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::WifiRtsCtsProtection(ns3::WifiRtsCtsProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiRtsCtsProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, cls):
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory::WifiSpectrumValue5MhzFactory() [constructor]
     cls.add_constructor([])
@@ -6378,6 +7365,11 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeMuOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, ns3::WifiSpectrumBand ru) [member function]
+    cls.add_method('CreateHeMuOfdmTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('uint32_t', 'centerFrequency'), param('uint16_t', 'channelWidth'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'ru')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40) [member function]
     cls.add_method('CreateHeOfdmTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
@@ -6443,12 +7435,134 @@
     cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
     return
 
-def register_Ns3WifiTxVector_methods(root_module, cls):
-    cls.add_output_stream_operator()
+def register_Ns3WifiTxParameters_methods(root_module, cls):
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::WifiTxParameters() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::WifiTxParameters(ns3::WifiTxParameters const & txParams) [constructor]
+    cls.add_constructor([param('ns3::WifiTxParameters const &', 'txParams')])
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::AddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('AddMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::AggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu) [member function]
+    cls.add_method('AggregateMsdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu')])
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::Clear() [member function]
+    cls.add_method('Clear', 
+                   'void', 
+                   [])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo const * ns3::WifiTxParameters::GetPsduInfo(ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetPsduInfo', 
+                   'ns3::WifiTxParameters::PsduInfo const *', 
+                   [param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfoMap const & ns3::WifiTxParameters::GetPsduInfoMap() const [member function]
+    cls.add_method('GetPsduInfoMap', 
+                   'ns3::WifiTxParameters::PsduInfoMap const &', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): uint32_t ns3::WifiTxParameters::GetSize(ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): uint32_t ns3::WifiTxParameters::GetSizeIfAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('GetSizeIfAddMpdu', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): std::pair<unsigned int, unsigned int> ns3::WifiTxParameters::GetSizeIfAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu) const [member function]
+    cls.add_method('GetSizeIfAggregateMsdu', 
+                   'std::pair< unsigned int, unsigned int >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_acknowledgment [variable]
+    cls.add_instance_attribute('m_acknowledgment', 'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_protection [variable]
+    cls.add_instance_attribute('m_protection', 'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_txDuration [variable]
+    cls.add_instance_attribute('m_txDuration', 'ns3::Time', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_txVector [variable]
+    cls.add_instance_attribute('m_txVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiTxParametersPsduInfo_methods(root_module, cls):
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::PsduInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::PsduInfo(ns3::WifiTxParameters::PsduInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiTxParameters::PsduInfo const &', 'arg0')])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::ampduSize [variable]
+    cls.add_instance_attribute('ampduSize', 'uint32_t', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::amsduSize [variable]
+    cls.add_instance_attribute('amsduSize', 'uint32_t', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::header [variable]
+    cls.add_instance_attribute('header', 'ns3::WifiMacHeader', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::seqNumbers [variable]
+    cls.add_instance_attribute('seqNumbers', 'std::map< unsigned char, std::set< unsigned short > >', is_const=False)
+    return
+
+def register_Ns3WifiTxTimer_methods(root_module, cls):
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::WifiTxTimer(ns3::WifiTxTimer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiTxTimer const &', 'arg0')])
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::WifiTxTimer() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## wifi-tx-timer.h (module 'wifi'): ns3::Time ns3::WifiTxTimer::GetDelayLeft() const [member function]
+    cls.add_method('GetDelayLeft', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::Reason ns3::WifiTxTimer::GetReason() const [member function]
+    cls.add_method('GetReason', 
+                   'ns3::WifiTxTimer::Reason', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): std::string ns3::WifiTxTimer::GetReasonString(ns3::WifiTxTimer::Reason reason) const [member function]
+    cls.add_method('GetReasonString', 
+                   'std::string', 
+                   [param('ns3::WifiTxTimer::Reason', 'reason')], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): bool ns3::WifiTxTimer::IsRunning() const [member function]
+    cls.add_method('IsRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::Reschedule(ns3::Time const & delay) [member function]
+    cls.add_method('Reschedule', 
+                   'void', 
+                   [param('ns3::Time const &', 'delay')])
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::SetMpduResponseTimeoutCallback(ns3::WifiTxTimer::MpduResponseTimeout callback) const [member function]
+    cls.add_method('SetMpduResponseTimeoutCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::SetPsduMapResponseTimeoutCallback(ns3::WifiTxTimer::PsduMapResponseTimeout callback) const [member function]
+    cls.add_method('SetPsduMapResponseTimeoutCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::SetPsduResponseTimeoutCallback(ns3::WifiTxTimer::PsduResponseTimeout callback) const [member function]
+    cls.add_method('SetPsduResponseTimeoutCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_const=True)
+    return
+
+def register_Ns3WifiTxVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0, uint16_t length=0) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0'), param('uint16_t', 'length', default_value='0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & txVector) [constructor]
     cls.add_constructor([param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetBssColor() const [member function]
@@ -6476,6 +7590,15 @@
                    'ns3::WifiTxVector::HeMuUserInfoMap const &', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap & ns3::WifiTxVector::GetHeMuUserInfoMap() [member function]
+    cls.add_method('GetHeMuUserInfoMap', 
+                   'ns3::WifiTxVector::HeMuUserInfoMap &', 
+                   [])
+    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode(uint16_t staId=65535) const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -6486,6 +7609,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiTxVector::GetModulationClass() const [member function]
+    cls.add_method('GetModulationClass', 
+                   'ns3::WifiModulationClass', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNTx() const [member function]
     cls.add_method('GetNTx', 
                    'uint8_t', 
@@ -6506,6 +7634,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): std::pair<unsigned long long, unsigned long long> ns3::WifiTxVector::GetNumRusPerHeSigBContentChannel() const [member function]
+    cls.add_method('GetNumRusPerHeSigBContentChannel', 
+                   'std::pair< unsigned long long, unsigned long long >', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiPreamble ns3::WifiTxVector::GetPreambleType() const [member function]
     cls.add_method('GetPreambleType', 
                    'ns3::WifiPreamble', 
@@ -6526,16 +7659,31 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsDlMu() const [member function]
+    cls.add_method('IsDlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsLdpc() const [member function]
     cls.add_method('IsLdpc', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsMu() const [member function]
+    cls.add_method('IsMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsStbc() const [member function]
     cls.add_method('IsStbc', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsUlMu() const [member function]
+    cls.add_method('IsUlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsValid() const [member function]
     cls.add_method('IsValid', 
                    'bool', 
@@ -6565,6 +7713,10 @@
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('bool', 'ldpc')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -6607,6 +7759,36 @@
                    [param('uint8_t', 'powerlevel')])
     return
 
+def register_Ns3WifiUlMuMultiStaBa_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::WifiUlMuMultiStaBa() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiUlMuMultiStaBa::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiUlMuMultiStaBa::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiUlMuMultiStaBa::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::stationsReceivingMultiStaBa [variable]
+    cls.add_instance_attribute('stationsReceivingMultiStaBa', 'std::map< std::pair< ns3::Mac48Address, unsigned char >, unsigned long long >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::tbPpduTxVector [variable]
+    cls.add_instance_attribute('tbPpduTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::multiStaBaTxVector [variable]
+    cls.add_instance_attribute('multiStaBaTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::WifiUlMuMultiStaBa(ns3::WifiUlMuMultiStaBa const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiUlMuMultiStaBa const &', 'arg0')])
+    return
+
 def register_Ns3YansWifiChannelHelper_methods(root_module, cls):
     ## yans-wifi-helper.h (module 'wifi'): ns3::YansWifiChannelHelper::YansWifiChannelHelper(ns3::YansWifiChannelHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::YansWifiChannelHelper const &', 'arg0')])
@@ -6856,152 +8038,6 @@
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3HtSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader::HtSigHeader(ns3::HtSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader::HtSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::GetAggregation() const [member function]
-    cls.add_method('GetAggregation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HtSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HtSigHeader::GetHtLength() const [member function]
-    cls.add_method('GetHtLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::HtSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HtSigHeader::GetMcs() const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HtSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::GetShortGuardInterval() const [member function]
-    cls.add_method('GetShortGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::HtSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::IsLdpcFecCoding() const [member function]
-    cls.add_method('IsLdpcFecCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetAggregation(bool aggregation) [member function]
-    cls.add_method('SetAggregation', 
-                   'void', 
-                   [param('bool', 'aggregation')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetFecCoding(bool ldpc) [member function]
-    cls.add_method('SetFecCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetHtLength(uint16_t length) [member function]
-    cls.add_method('SetHtLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetMcs(uint8_t mcs) [member function]
-    cls.add_method('SetMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetShortGuardInterval(bool sgi) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'sgi')])
-    return
-
-def register_Ns3LSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader::LSigHeader(ns3::LSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader::LSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::LSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::LSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::LSigHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint64_t ns3::LSigHeader::GetRate(uint16_t channelWidth=20) const [member function]
-    cls.add_method('GetRate', 
-                   'uint64_t', 
-                   [param('uint16_t', 'channelWidth', default_value='20')], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::LSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::LSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::SetRate(uint64_t rate, uint16_t channelWidth=20) [member function]
-    cls.add_method('SetRate', 
-                   'void', 
-                   [param('uint64_t', 'rate'), param('uint16_t', 'channelWidth', default_value='20')])
-    return
-
 def register_Ns3MgtAddBaRequestHeader_methods(root_module, cls):
     ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaRequestHeader::MgtAddBaRequestHeader(ns3::MgtAddBaRequestHeader const & arg0) [constructor]
     cls.add_constructor([param('ns3::MgtAddBaRequestHeader const &', 'arg0')])
@@ -7623,11 +8659,6 @@
                    'ns3::CapabilityInformation', 
                    [], 
                    is_const=True)
-    ## mgt-headers.h (module 'wifi'): ns3::CfParameterSet ns3::MgtProbeResponseHeader::GetCfParameterSet() const [member function]
-    cls.add_method('GetCfParameterSet', 
-                   'ns3::CfParameterSet', 
-                   [], 
-                   is_const=True)
     ## mgt-headers.h (module 'wifi'): ns3::DsssParameterSet ns3::MgtProbeResponseHeader::GetDsssParameterSet() const [member function]
     cls.add_method('GetDsssParameterSet', 
                    'ns3::DsssParameterSet', 
@@ -7725,10 +8756,6 @@
     cls.add_method('SetCapabilities', 
                    'void', 
                    [param('ns3::CapabilityInformation', 'capabilities')])
-    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetCfParameterSet(ns3::CfParameterSet cfParameterSet) [member function]
-    cls.add_method('SetCfParameterSet', 
-                   'void', 
-                   [param('ns3::CfParameterSet', 'cfParameterSet')])
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetDsssParameterSet(ns3::DsssParameterSet dsssParameterSet) [member function]
     cls.add_method('SetDsssParameterSet', 
                    'void', 
@@ -7939,6 +8966,61 @@
     cls.add_constructor([])
     return
 
+def register_Ns3MuSnrTag_methods(root_module, cls):
+    ## mu-snr-tag.h (module 'wifi'): ns3::MuSnrTag::MuSnrTag(ns3::MuSnrTag const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MuSnrTag const &', 'arg0')])
+    ## mu-snr-tag.h (module 'wifi'): ns3::MuSnrTag::MuSnrTag() [constructor]
+    cls.add_constructor([])
+    ## mu-snr-tag.h (module 'wifi'): void ns3::MuSnrTag::Deserialize(ns3::TagBuffer i) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_virtual=True)
+    ## mu-snr-tag.h (module 'wifi'): double ns3::MuSnrTag::Get(uint16_t staId) const [member function]
+    cls.add_method('Get', 
+                   'double', 
+                   [param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## mu-snr-tag.h (module 'wifi'): ns3::TypeId ns3::MuSnrTag::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-snr-tag.h (module 'wifi'): uint32_t ns3::MuSnrTag::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-snr-tag.h (module 'wifi'): static ns3::TypeId ns3::MuSnrTag::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mu-snr-tag.h (module 'wifi'): bool ns3::MuSnrTag::IsPresent(uint16_t staId) const [member function]
+    cls.add_method('IsPresent', 
+                   'bool', 
+                   [param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## mu-snr-tag.h (module 'wifi'): void ns3::MuSnrTag::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mu-snr-tag.h (module 'wifi'): void ns3::MuSnrTag::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [])
+    ## mu-snr-tag.h (module 'wifi'): void ns3::MuSnrTag::Serialize(ns3::TagBuffer i) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## mu-snr-tag.h (module 'wifi'): void ns3::MuSnrTag::Set(uint16_t staId, double snr) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint16_t', 'staId'), param('double', 'snr')])
+    return
+
 def register_Ns3Object_methods(root_module, cls):
     ## object.h (module 'core'): ns3::Object::Object() [constructor]
     cls.add_constructor([])
@@ -8035,15 +9117,15 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## obss-pd-algorithm.h (module 'wifi'): void ns3::ObssPdAlgorithm::ReceiveHeSig(ns3::HePreambleParameters params) [member function]
-    cls.add_method('ReceiveHeSig', 
+    ## obss-pd-algorithm.h (module 'wifi'): void ns3::ObssPdAlgorithm::ReceiveHeSigA(ns3::HeSigAParameters params) [member function]
+    cls.add_method('ReceiveHeSigA', 
                    'void', 
-                   [param('ns3::HePreambleParameters', 'params')], 
+                   [param('ns3::HeSigAParameters', 'params')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## obss-pd-algorithm.h (module 'wifi'): void ns3::ObssPdAlgorithm::ResetPhy(ns3::HePreambleParameters params) [member function]
+    ## obss-pd-algorithm.h (module 'wifi'): void ns3::ObssPdAlgorithm::ResetPhy(ns3::HeSigAParameters params) [member function]
     cls.add_method('ResetPhy', 
                    'void', 
-                   [param('ns3::HePreambleParameters', 'params')])
+                   [param('ns3::HeSigAParameters', 'params')])
     ## obss-pd-algorithm.h (module 'wifi'): void ns3::ObssPdAlgorithm::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -8530,6 +9612,13 @@
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
+def register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter< ns3::PhyEntity > > const &', 'o')])
+    return
+
 def register_Ns3SimpleRefCount__Ns3QosBlockedDestinations_Ns3Empty_Ns3DefaultDeleter__lt__ns3QosBlockedDestinations__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -8704,11 +9793,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
     cls.add_method('SetChannel', 
                    'void', 
@@ -8719,11 +9808,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -9300,31 +10389,21 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## txop.h (module 'wifi'): bool ns3::Txop::CanStartNextPolling() const [member function]
-    cls.add_method('CanStartNextPolling', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::Cancel() [member function]
-    cls.add_method('Cancel', 
-                   'void', 
+    ## txop.h (module 'wifi'): ns3::AcIndex ns3::Txop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
                    [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::EndTxNoAck() [member function]
-    cls.add_method('EndTxNoAck', 
-                   'void', 
+                   is_const=True, is_virtual=True)
+    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus ns3::Txop::GetAccessStatus() const [member function]
+    cls.add_method('GetAccessStatus', 
+                   'ns3::Txop::ChannelAccessStatus', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): uint8_t ns3::Txop::GetAifsn() const [member function]
     cls.add_method('GetAifsn', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::MacLow> ns3::Txop::GetLow() const [member function]
-    cls.add_method('GetLow', 
-                   'ns3::Ptr< ns3::MacLow >', 
-                   [], 
-                   is_const=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMaxCw() const [member function]
     cls.add_method('GetMaxCw', 
                    'uint32_t', 
@@ -9340,11 +10419,6 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopRemaining() const [member function]
-    cls.add_method('GetTxopRemaining', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): static ns3::TypeId ns3::Txop::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -9355,46 +10429,18 @@
                    'ns3::Ptr< ns3::WifiMacQueue >', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotAck() [member function]
-    cls.add_method('GotAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('GotBlockAck', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotCfEnd() [member function]
-    cls.add_method('GotCfEnd', 
-                   'void', 
-                   [])
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsAccessRequested() const [member function]
-    cls.add_method('IsAccessRequested', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): bool ns3::Txop::IsQosTxop() const [member function]
     cls.add_method('IsQosTxop', 
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedAck() [member function]
-    cls.add_method('MissedAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedBlockAck(uint8_t nMpdus) [member function]
-    cls.add_method('MissedBlockAck', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelAccessed(ns3::Time txopDuration=ns3::Seconds(0)) [member function]
+    cls.add_method('NotifyChannelAccessed', 
                    'void', 
-                   [param('uint8_t', 'nMpdus')], 
+                   [param('ns3::Time', 'txopDuration', default_value='ns3::Seconds(0)')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedCfPollResponse(bool expectedCfAck) [member function]
-    cls.add_method('MissedCfPollResponse', 
-                   'void', 
-                   [param('bool', 'expectedCfAck')])
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedCts() [member function]
-    cls.add_method('MissedCts', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelReleased() [member function]
+    cls.add_method('NotifyChannelReleased', 
                    'void', 
                    [], 
                    is_virtual=True)
@@ -9428,10 +10474,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SendCfFrame(ns3::WifiMacType frameType, ns3::Mac48Address addr) [member function]
-    cls.add_method('SendCfFrame', 
+    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
+    cls.add_method('ResetCw', 
                    'void', 
-                   [param('ns3::WifiMacType', 'frameType'), param('ns3::Mac48Address', 'addr')])
+                   [])
     ## txop.h (module 'wifi'): void ns3::Txop::SetAifsn(uint8_t aifsn) [member function]
     cls.add_method('SetAifsn', 
                    'void', 
@@ -9440,10 +10486,11 @@
     cls.add_method('SetChannelAccessManager', 
                    'void', 
                    [param('ns3::Ptr< ns3::ChannelAccessManager > const', 'manager')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMacLow(ns3::Ptr<ns3::MacLow> const low) [member function]
-    cls.add_method('SetMacLow', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::MacLow > const', 'low')])
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::SetMaxCw(uint32_t maxCw) [member function]
     cls.add_method('SetMaxCw', 
                    'void', 
@@ -9452,22 +10499,10 @@
     cls.add_method('SetMinCw', 
                    'void', 
                    [param('uint32_t', 'minCw')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxDroppedCallback(ns3::Txop::TxDropped callback) [member function]
-    cls.add_method('SetTxDroppedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxFailedCallback(ns3::Txop::TxFailed callback) [member function]
-    cls.add_method('SetTxFailedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## txop.h (module 'wifi'): void ns3::Txop::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
     cls.add_method('SetTxMiddle', 
                    'void', 
                    [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxOkCallback(ns3::Txop::TxOk callback) [member function]
-    cls.add_method('SetTxOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## txop.h (module 'wifi'): void ns3::Txop::SetTxopLimit(ns3::Time txopLimit) [member function]
     cls.add_method('SetTxopLimit', 
                    'void', 
@@ -9481,21 +10516,10 @@
     cls.add_method('StartBackoffNow', 
                    'void', 
                    [param('uint32_t', 'nSlots')])
-    ## txop.h (module 'wifi'): void ns3::Txop::StartNextFragment() [member function]
-    cls.add_method('StartNextFragment', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::StartNextPacket() [member function]
-    cls.add_method('StartNextPacket', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::TerminateTxop() [member function]
-    cls.add_method('TerminateTxop', 
+    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
+    cls.add_method('UpdateFailedCw', 
                    'void', 
-                   [], 
-                   is_virtual=True)
+                   [])
     ## txop.h (module 'wifi'): void ns3::Txop::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -9526,61 +10550,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetFragmentOffset() const [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::Txop::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
-    cls.add_method('GetFragmentPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('ns3::WifiMacHeader *', 'hdr')], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetFragmentSize() const [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetNextFragmentSize() const [member function]
-    cls.add_method('GetNextFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): bool ns3::Txop::HasFramesToTransmit() [member function]
     cls.add_method('HasFramesToTransmit', 
                    'bool', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsLastFragment() const [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedDataRetransmission(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('NeedDataRetransmission', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedFragmentation() const [member function]
-    cls.add_method('NeedFragmentation', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedRtsRetransmission(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('NeedRtsRetransmission', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NextFragment() [member function]
-    cls.add_method('NextFragment', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessGranted() [member function]
-    cls.add_method('NotifyAccessGranted', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessRequested() [member function]
     cls.add_method('NotifyAccessRequested', 
                    'void', 
@@ -9591,36 +10565,21 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
-    cls.add_method('ResetCw', 
+    ## txop.h (module 'wifi'): void ns3::Txop::RequestAccess() [member function]
+    cls.add_method('RequestAccess', 
                    'void', 
                    [], 
                    visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::RestartAccessIfNeeded() [member function]
-    cls.add_method('RestartAccessIfNeeded', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::StartAccessIfNeeded() [member function]
     cls.add_method('StartAccessIfNeeded', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::TxDroppedPacket(ns3::Ptr<const ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('TxDroppedPacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item')], 
-                   visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::UpdateBackoffSlotsNow(uint32_t nSlots, ns3::Time backoffUpdateBound) [member function]
     cls.add_method('UpdateBackoffSlotsNow', 
                    'void', 
                    [param('uint32_t', 'nSlots'), param('ns3::Time', 'backoffUpdateBound')], 
                    visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
-    cls.add_method('UpdateFailedCw', 
-                   'void', 
-                   [], 
-                   visibility='protected')
     return
 
 def register_Ns3UniformRandomVariable_methods(root_module, cls):
@@ -9673,101 +10632,6 @@
                    is_static=True)
     return
 
-def register_Ns3VhtSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader::VhtSigHeader(ns3::VhtSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::VhtSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader::VhtSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::VhtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::VhtSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::VhtSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::VhtSigHeader::GetNStreams() const [member function]
-    cls.add_method('GetNStreams', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::VhtSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::GetShortGuardInterval() const [member function]
-    cls.add_method('GetShortGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::GetShortGuardIntervalDisambiguation() const [member function]
-    cls.add_method('GetShortGuardIntervalDisambiguation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::VhtSigHeader::GetSuMcs() const [member function]
-    cls.add_method('GetSuMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::VhtSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::IsLdpcCoding() const [member function]
-    cls.add_method('IsLdpcCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetCoding(bool ldpc) [member function]
-    cls.add_method('SetCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetMuFlag(bool mu) [member function]
-    cls.add_method('SetMuFlag', 
-                   'void', 
-                   [param('bool', 'mu')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetNStreams(uint8_t nStreams) [member function]
-    cls.add_method('SetNStreams', 
-                   'void', 
-                   [param('uint8_t', 'nStreams')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetShortGuardInterval(bool sgi) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'sgi')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetShortGuardIntervalDisambiguation(bool disambiguation) [member function]
-    cls.add_method('SetShortGuardIntervalDisambiguation', 
-                   'void', 
-                   [param('bool', 'disambiguation')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetSuMcs(uint8_t mcs) [member function]
-    cls.add_method('SetSuMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    return
-
 def register_Ns3WeibullRandomVariable_methods(root_module, cls):
     ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::WeibullRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -9811,40 +10675,67 @@
                    is_virtual=True)
     return
 
-def register_Ns3WifiAckPolicySelector_methods(root_module, cls):
-    ## wifi-ack-policy-selector.h (module 'wifi'): ns3::WifiAckPolicySelector::WifiAckPolicySelector() [constructor]
+def register_Ns3WifiAckAfterTbPpdu_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu::WifiAckAfterTbPpdu() [constructor]
     cls.add_constructor([])
-    ## wifi-ack-policy-selector.h (module 'wifi'): ns3::WifiAckPolicySelector::WifiAckPolicySelector(ns3::WifiAckPolicySelector const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiAckPolicySelector const &', 'arg0')])
-    ## wifi-ack-policy-selector.h (module 'wifi'): void ns3::WifiAckPolicySelector::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-ack-policy-selector.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiAckPolicySelector::GetQosTxop() const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckAfterTbPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
-                   is_const=True)
-    ## wifi-ack-policy-selector.h (module 'wifi'): static ns3::TypeId ns3::WifiAckPolicySelector::GetTypeId() [member function]
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiAckAfterTbPpdu::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiAckAfterTbPpdu::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu::WifiAckAfterTbPpdu(ns3::WifiAckAfterTbPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAckAfterTbPpdu const &', 'arg0')])
+    return
+
+def register_Ns3WifiAckManager_methods(root_module, cls):
+    ## wifi-ack-manager.h (module 'wifi'): ns3::WifiAckManager::WifiAckManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-ack-manager.h (module 'wifi'): ns3::WifiAckManager::WifiAckManager(ns3::WifiAckManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAckManager const &', 'arg0')])
+    ## wifi-ack-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiAckManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-ack-policy-selector.h (module 'wifi'): static void ns3::WifiAckPolicySelector::SetAckPolicy(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::MacLowTransmissionParameters const & params) [member function]
-    cls.add_method('SetAckPolicy', 
+    ## wifi-ack-manager.h (module 'wifi'): static void ns3::WifiAckManager::SetQosAckPolicy(ns3::Ptr<ns3::WifiMacQueueItem> item, ns3::WifiAcknowledgment const * acknowledgment) [member function]
+    cls.add_method('SetQosAckPolicy', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::MacLowTransmissionParameters const &', 'params')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item'), param('ns3::WifiAcknowledgment const *', 'acknowledgment')], 
                    is_static=True)
-    ## wifi-ack-policy-selector.h (module 'wifi'): void ns3::WifiAckPolicySelector::SetQosTxop(ns3::Ptr<ns3::QosTxop> qosTxop) [member function]
-    cls.add_method('SetQosTxop', 
+    ## wifi-ack-manager.h (module 'wifi'): static void ns3::WifiAckManager::SetQosAckPolicy(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiAcknowledgment const * acknowledgment) [member function]
+    cls.add_method('SetQosAckPolicy', 
                    'void', 
-                   [param('ns3::Ptr< ns3::QosTxop >', 'qosTxop')])
-    ## wifi-ack-policy-selector.h (module 'wifi'): void ns3::WifiAckPolicySelector::UpdateTxParams(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::MacLowTransmissionParameters & params) [member function]
-    cls.add_method('UpdateTxParams', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiAcknowledgment const *', 'acknowledgment')], 
+                   is_static=True)
+    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::MacLowTransmissionParameters &', 'params')], 
+                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAddMpdu', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3WifiActionHeader_methods(root_module, cls):
@@ -9911,6 +10802,77 @@
     cls.add_instance_attribute('selfProtectedAction', 'ns3::WifiActionHeader::SelfProtectedActionValue', is_const=False)
     return
 
+def register_Ns3WifiCtsToSelfProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::WifiCtsToSelfProtection() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiCtsToSelfProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiCtsToSelfProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::ctsTxVector [variable]
+    cls.add_instance_attribute('ctsTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::WifiCtsToSelfProtection(ns3::WifiCtsToSelfProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiCtsToSelfProtection const &', 'arg0')])
+    return
+
+def register_Ns3WifiDefaultAckManager_methods(root_module, cls):
+    ## wifi-default-ack-manager.h (module 'wifi'): ns3::WifiDefaultAckManager::WifiDefaultAckManager(ns3::WifiDefaultAckManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDefaultAckManager const &', 'arg0')])
+    ## wifi-default-ack-manager.h (module 'wifi'): ns3::WifiDefaultAckManager::WifiDefaultAckManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-default-ack-manager.h (module 'wifi'): uint16_t ns3::WifiDefaultAckManager::GetMaxDistFromStartingSeq(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) const [member function]
+    cls.add_method('GetMaxDistFromStartingSeq', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_const=True)
+    ## wifi-default-ack-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiDefaultAckManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAddMpdu', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True)
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True)
+    ## wifi-default-ack-manager.h (module 'wifi'): bool ns3::WifiDefaultAckManager::IsResponseNeeded(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) const [member function]
+    cls.add_method('IsResponseNeeded', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_const=True, visibility='protected')
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::GetAckInfoIfAggregatedMuBar(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('GetAckInfoIfAggregatedMuBar', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::GetAckInfoIfBarBaSequence(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('GetAckInfoIfBarBaSequence', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::GetAckInfoIfTfMuBar(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('GetAckInfoIfTfMuBar', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::TryUlMuTransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryUlMuTransmission', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True, visibility='private')
+    return
+
 def register_Ns3WifiInformationElement_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement::WifiInformationElement() [constructor]
@@ -9949,7 +10911,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -9959,7 +10921,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'i')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -10102,6 +11064,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
     cls.add_method('GetVhtConfiguration', 
                    'ns3::Ptr< ns3::VhtConfiguration >', 
@@ -10151,7 +11118,7 @@
     cls.add_method('SetDevice', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::Callback<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function]
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
@@ -10181,6 +11148,11 @@
                    'void', 
                    [param('ns3::Ssid', 'ssid')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
     cls.add_method('SetWifiPhy', 
                    'void', 
@@ -10208,6 +11180,8 @@
     cls.add_constructor([param('ns3::WifiMacHeader const &', 'arg0')])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader() [constructor]
     cls.add_constructor([])
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader(ns3::WifiMacType type) [constructor]
+    cls.add_constructor([param('ns3::WifiMacType', 'type')])
     ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -10253,6 +11227,11 @@
                    'ns3::WifiMacHeader::QosAckPolicy', 
                    [], 
                    is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosQueueSize() const [member function]
+    cls.add_method('GetQosQueueSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosTid() const [member function]
     cls.add_method('GetQosTid', 
                    'uint8_t', 
@@ -10468,6 +11447,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsTrigger() const [member function]
+    cls.add_method('IsTrigger', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -10570,6 +11554,10 @@
     cls.add_method('SetQosNoMeshControlPresent', 
                    'void', 
                    [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosQueueSize(uint8_t size) [member function]
+    cls.add_method('SetQosQueueSize', 
+                   'void', 
+                   [param('uint8_t', 'size')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTid(uint8_t tid) [member function]
     cls.add_method('SetQosTid', 
                    'void', 
@@ -10627,11 +11615,21 @@
                    'ns3::Ptr< ns3::Packet const >', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetPacketSize() const [member function]
+    cls.add_method('GetPacketSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiMacQueueItem::GetProtocolDataUnit() const [member function]
     cls.add_method('GetProtocolDataUnit', 
                    'ns3::Ptr< ns3::Packet >', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): std::list<ns3::WifiMacQueueItem::QueueIteratorPair, std::allocator<ns3::WifiMacQueueItem::QueueIteratorPair> > const & ns3::WifiMacQueueItem::GetQueueIteratorPairs() const [member function]
+    cls.add_method('GetQueueIteratorPairs', 
+                   'std::list< ns3::WifiMacQueueItem::QueueIteratorPair > const &', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
     cls.add_method('GetSize', 
                    'uint32_t', 
@@ -10642,21 +11640,42 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsFragment() const [member function]
+    cls.add_method('IsFragment', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
+    cls.add_method('IsQueued', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::MsduAggregator::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
     cls.add_method('begin', 
-                   'ns3::MsduAggregator::DeaggregatedMsdusCI', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
                    [])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::MsduAggregator::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
     cls.add_method('end', 
-                   'ns3::MsduAggregator::DeaggregatedMsdusCI', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
                    [])
     return
 
+def register_Ns3WifiMacQueueItemQueueIteratorPair_methods(root_module, cls):
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::QueueIteratorPair() [constructor]
+    cls.add_constructor([])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::QueueIteratorPair(ns3::WifiMacQueueItem::QueueIteratorPair const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiMacQueueItem::QueueIteratorPair const &', 'arg0')])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::it [variable]
+    cls.add_instance_attribute('it', 'ns3::WifiMacQueueItem::ConstIterator', is_const=False)
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::queue [variable]
+    cls.add_instance_attribute('queue', 'ns3::WifiMacQueue *', is_const=False)
+    return
+
 def register_Ns3WifiMacTrailer_methods(root_module, cls):
     ## wifi-mac-trailer.h (module 'wifi'): ns3::WifiMacTrailer::WifiMacTrailer(ns3::WifiMacTrailer const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiMacTrailer const &', 'arg0')])
@@ -10694,11 +11713,33 @@
                    is_const=True, is_virtual=True)
     return
 
+def register_Ns3WifiNoProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection::WifiNoProtection() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiNoProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiNoProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection::WifiNoProtection(ns3::WifiNoProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiNoProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiPhy_methods(root_module, cls):
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
     cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): static void ns3::WifiPhy::AddStaticPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
+    cls.add_method('AddStaticPhyEntity', 
+                   'void', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
+                   is_static=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddSupportedChannelWidth(uint16_t width) [member function]
     cls.add_method('AddSupportedChannelWidth', 
                    'void', 
@@ -10708,45 +11749,43 @@
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('CalculatePhyPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiTxVector txVector, double ber) const [member function]
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiTxVector const & txVector, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('double', 'ber')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('double', 'ber')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, uint16_t staId=65535) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint16_t', 'staId', default_value='65535')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector txVector, ns3::WifiPhyBand band) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('ConfigureStandardAndBand', 
                    'void', 
                    [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
                    is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ContinueReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('ContinueReceiveHeader', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DefineChannelNumber(uint8_t channelNumber, ns3::WifiPhyBand band, ns3::WifiPhyStandard standard, uint16_t frequency, uint16_t channelWidth) [member function]
-    cls.add_method('DefineChannelNumber', 
-                   'bool', 
-                   [param('uint8_t', 'channelNumber'), param('ns3::WifiPhyBand', 'band'), param('ns3::WifiPhyStandard', 'standard'), param('uint16_t', 'frequency'), param('uint16_t', 'channelWidth')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::EndReceive(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('EndReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::EndReceiveInterBss() [member function]
-    cls.add_method('EndReceiveInterBss', 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t bandWidth, uint16_t guardBandwidth, ns3::HeRu::SubcarrierRange range, uint8_t bandIndex=0) const [member function]
+    cls.add_method('ConvertHeRuSubcarriers', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< short, short >', 'range'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::EndReceiveInterBss() [member function]
+    cls.add_method('EndReceiveInterBss', 
                    'void', 
                    [])
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetAckTxTime() const [member function]
@@ -10759,10 +11798,10 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetBssMembershipSelector(uint8_t selector) const [member function]
-    cls.add_method('GetBssMembershipSelector', 
-                   'uint8_t', 
-                   [param('uint8_t', 'selector')], 
+    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char> > ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
+    cls.add_method('GetBssMembershipSelectorList', 
+                   'std::list< unsigned char >', 
+                   [], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetCcaEdThreshold() const [member function]
     cls.add_method('GetCcaEdThreshold', 
@@ -10789,6 +11828,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetDefaultMode() const [member function]
+    cls.add_method('GetDefaultMode', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
@@ -10798,12409 +11842,15342 @@
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate11Mbps() [member function]
-    cls.add_method('GetDsssRate11Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate1Mbps() [member function]
-    cls.add_method('GetDsssRate1Mbps', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate2Mbps() [member function]
-    cls.add_method('GetDsssRate2Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxEndTime() const [member function]
+    cls.add_method('GetLastRxEndTime', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate5_5Mbps() [member function]
-    cls.add_method('GetDsssRate5_5Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
                    [], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetMaxPsduSize(ns3::WifiModulationClass modulation) [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate12Mbps() [member function]
-    cls.add_method('GetErpOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedRxSpatialStreams() const [member function]
+    cls.add_method('GetMaxSupportedRxSpatialStreams', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate18Mbps() [member function]
-    cls.add_method('GetErpOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedTxSpatialStreams() const [member function]
+    cls.add_method('GetMaxSupportedTxSpatialStreams', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate24Mbps() [member function]
-    cls.add_method('GetErpOfdmRate24Mbps', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
                    'ns3::WifiMode', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList() const [member function]
+    cls.add_method('GetMcsList', 
+                   'std::list< ns3::WifiMode >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate36Mbps() [member function]
-    cls.add_method('GetErpOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetMcsList', 
+                   'std::list< ns3::WifiMode >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::WifiPhy::GetMobility() const [member function]
+    cls.add_method('GetMobility', 
+                   'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate48Mbps() [member function]
-    cls.add_method('GetErpOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList() const [member function]
+    cls.add_method('GetModeList', 
+                   'std::list< ns3::WifiMode >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate54Mbps() [member function]
-    cls.add_method('GetErpOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetModeList', 
+                   'std::list< ns3::WifiMode >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate6Mbps() [member function]
-    cls.add_method('GetErpOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate9Mbps() [member function]
-    cls.add_method('GetErpOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNumberOfAntennas() const [member function]
+    cls.add_method('GetNumberOfAntennas', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
-    cls.add_method('GetFrequency', 
-                   'uint16_t', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyOperatingChannel const & ns3::WifiPhy::GetOperatingChannel() const [member function]
+    cls.add_method('GetOperatingChannel', 
+                   'ns3::WifiPhyOperatingChannel const &', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs(uint8_t mcs) [member function]
-    cls.add_method('GetHeMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype=::ns3::MpduType::NORMAL_MPDU, uint16_t staId=65535) [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype', default_value='::ns3::MpduType::NORMAL_MPDU'), param('uint16_t', 'staId', default_value='65535')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs0() [member function]
-    cls.add_method('GetHeMcs0', 
-                   'ns3::WifiMode', 
-                   [], 
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs1() [member function]
-    cls.add_method('GetHeMcs1', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyBand ns3::WifiPhy::GetPhyBand() const [member function]
+    cls.add_method('GetPhyBand', 
+                   'ns3::WifiPhyBand', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs10() [member function]
-    cls.add_method('GetHeMcs10', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::PhyEntity> ns3::WifiPhy::GetPhyEntity(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetPhyEntity', 
+                   'ns3::Ptr< ns3::PhyEntity >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
+    cls.add_method('GetPhyStandard', 
+                   'ns3::WifiPhyStandard', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs11() [member function]
-    cls.add_method('GetHeMcs11', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPifs() const [member function]
+    cls.add_method('GetPifs', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs2() [member function]
-    cls.add_method('GetHeMcs2', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetPowerDbm(uint8_t power) const [member function]
+    cls.add_method('GetPowerDbm', 
+                   'double', 
+                   [param('uint8_t', 'power')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPreambleDetectionDuration() [member function]
+    cls.add_method('GetPreambleDetectionDuration', 
+                   'ns3::Time', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs3() [member function]
-    cls.add_method('GetHeMcs3', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): uint64_t ns3::WifiPhy::GetPreviouslyRxPpduUid() const [member function]
+    cls.add_method('GetPreviouslyRxPpduUid', 
+                   'uint64_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs4() [member function]
-    cls.add_method('GetHeMcs4', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxGain() const [member function]
+    cls.add_method('GetRxGain', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs5() [member function]
-    cls.add_method('GetHeMcs5', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxSensitivity() const [member function]
+    cls.add_method('GetRxSensitivity', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs6() [member function]
-    cls.add_method('GetHeMcs6', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetShortPhyPreambleSupported() const [member function]
+    cls.add_method('GetShortPhyPreambleSupported', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs7() [member function]
-    cls.add_method('GetHeMcs7', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetSifs() const [member function]
+    cls.add_method('GetSifs', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs8() [member function]
-    cls.add_method('GetHeMcs8', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetSlot() const [member function]
+    cls.add_method('GetSlot', 
+                   'ns3::Time', 
                    [], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('GetStartOfPacketDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs9() [member function]
-    cls.add_method('GetHeMcs9', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPhyStateHelper> ns3::WifiPhy::GetState() const [member function]
+    cls.add_method('GetState', 
+                   'ns3::Ptr< ns3::WifiPhyStateHelper >', 
                    [], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Ptr<const ns3::PhyEntity> const ns3::WifiPhy::GetStaticPhyEntity(ns3::WifiModulationClass modulation) [member function]
+    cls.add_method('GetStaticPhyEntity', 
+                   'ns3::Ptr< ns3::PhyEntity const > const', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHePhyHeaderMode() [member function]
-    cls.add_method('GetHePhyHeaderMode', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'std::vector< unsigned short >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs(uint8_t mcs) [member function]
-    cls.add_method('GetHtMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
-    cls.add_method('GetHtMcs0', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxGain() const [member function]
+    cls.add_method('GetTxGain', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
-    cls.add_method('GetHtMcs1', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::tuple<double, double, double> ns3::WifiPhy::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
-    cls.add_method('GetHtMcs10', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerEnd() const [member function]
+    cls.add_method('GetTxPowerEnd', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
-    cls.add_method('GetHtMcs11', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerForTransmission(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerForTransmission', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerStart() const [member function]
+    cls.add_method('GetTxPowerStart', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
-    cls.add_method('GetHtMcs12', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
-    cls.add_method('GetHtMcs13', 
-                   'ns3::WifiMode', 
-                   [], 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiConstPsduMap ns3::WifiPhy::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
-    cls.add_method('GetHtMcs14', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
+    cls.add_method('IsMcsSupported', 
+                   'bool', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
+    cls.add_method('IsModeSupported', 
+                   'bool', 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateCcaBusy() const [member function]
+    cls.add_method('IsStateCcaBusy', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
-    cls.add_method('GetHtMcs15', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateIdle() const [member function]
+    cls.add_method('IsStateIdle', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
-    cls.add_method('GetHtMcs16', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
-    cls.add_method('GetHtMcs17', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
-    cls.add_method('GetHtMcs18', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
-    cls.add_method('GetHtMcs19', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
-    cls.add_method('GetHtMcs2', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateOff() const [member function]
+    cls.add_method('IsStateOff', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
-    cls.add_method('GetHtMcs20', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateRx() const [member function]
+    cls.add_method('IsStateRx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
-    cls.add_method('GetHtMcs21', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSleep() const [member function]
+    cls.add_method('IsStateSleep', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
-    cls.add_method('GetHtMcs22', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSwitching() const [member function]
+    cls.add_method('IsStateSwitching', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
-    cls.add_method('GetHtMcs23', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateTx() const [member function]
+    cls.add_method('IsStateTx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
-    cls.add_method('GetHtMcs24', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyChannelAccessRequested() [member function]
+    cls.add_method('NotifyChannelAccessRequested', 
+                   'void', 
+                   [])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
+    cls.add_method('NotifyMonitorSniffRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, uint16_t staId=65535) [member function]
+    cls.add_method('NotifyMonitorSniffTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    cls.add_method('NotifyRxBegin', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('NotifyRxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiPhyRxfailureReason', 'reason')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('NotifyRxEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::WifiConstPsduMap psdus, double txPowerW) [member function]
+    cls.add_method('NotifyTxBegin', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerW')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('NotifyTxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxEnd(ns3::WifiConstPsduMap psdus) [member function]
+    cls.add_method('NotifyTxEnd', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('RegisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetCca(bool powerRestricted, double txPowerMaxSiso=0, double txPowerMaxMimo=0) [member function]
+    cls.add_method('ResetCca', 
+                   'void', 
+                   [param('bool', 'powerRestricted'), param('double', 'txPowerMaxSiso', default_value='0'), param('double', 'txPowerMaxMimo', default_value='0')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResumeFromOff() [member function]
+    cls.add_method('ResumeFromOff', 
+                   'void', 
+                   [])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResumeFromSleep() [member function]
+    cls.add_method('ResumeFromSleep', 
+                   'void', 
+                   [])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('Send', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('Send', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCapabilitiesChangedCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetCapabilitiesChangedCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCcaEdThreshold(double threshold) [member function]
+    cls.add_method('SetCcaEdThreshold', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
+    cls.add_method('SetChannelNumber', 
+                   'void', 
+                   [param('uint8_t', 'id')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> const rate) [member function]
+    cls.add_method('SetErrorRateModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorRateModel > const', 'rate')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrameCaptureModel(ns3::Ptr<ns3::FrameCaptureModel> const frameCaptureModel) [member function]
+    cls.add_method('SetFrameCaptureModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::FrameCaptureModel > const', 'frameCaptureModel')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('uint16_t', 'freq')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedRxSpatialStreams(uint8_t streams) [member function]
+    cls.add_method('SetMaxSupportedRxSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'streams')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedTxSpatialStreams(uint8_t streams) [member function]
+    cls.add_method('SetMaxSupportedTxSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'streams')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> const mobility) [member function]
+    cls.add_method('SetMobility', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel > const', 'mobility')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNTxPower(uint8_t n) [member function]
+    cls.add_method('SetNTxPower', 
+                   'void', 
+                   [param('uint8_t', 'n')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
+    cls.add_method('SetNumberOfAntennas', 
+                   'void', 
+                   [param('uint8_t', 'antennas')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOffMode() [member function]
+    cls.add_method('SetOffMode', 
+                   'void', 
+                   [])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(uint8_t number, uint16_t frequency, uint16_t width) [member function]
+    cls.add_method('SetOperatingChannel', 
+                   'void', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPifs(ns3::Time pifs) [member function]
+    cls.add_method('SetPifs', 
+                   'void', 
+                   [param('ns3::Time', 'pifs')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPostReceptionErrorModel(ns3::Ptr<ns3::ErrorModel> const em) [member function]
+    cls.add_method('SetPostReceptionErrorModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorModel > const', 'em')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPreambleDetectionModel(ns3::Ptr<ns3::PreambleDetectionModel> const preambleDetectionModel) [member function]
+    cls.add_method('SetPreambleDetectionModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PreambleDetectionModel > const', 'preambleDetectionModel')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPrimary20Index(uint8_t index) [member function]
+    cls.add_method('SetPrimary20Index', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
+    cls.add_method('SetReceiveErrorCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
+    cls.add_method('SetReceiveOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxGain(double gain) [member function]
+    cls.add_method('SetRxGain', 
+                   'void', 
+                   [param('double', 'gain')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
+    cls.add_method('SetRxNoiseFigure', 
+                   'void', 
+                   [param('double', 'noiseFigureDb')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxSensitivity(double threshold) [member function]
+    cls.add_method('SetRxSensitivity', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetShortPhyPreambleSupported(bool preamble) [member function]
+    cls.add_method('SetShortPhyPreambleSupported', 
+                   'void', 
+                   [param('bool', 'preamble')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSifs(ns3::Time sifs) [member function]
+    cls.add_method('SetSifs', 
+                   'void', 
+                   [param('ns3::Time', 'sifs')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSleepMode() [member function]
+    cls.add_method('SetSleepMode', 
+                   'void', 
+                   [])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSlot(ns3::Time slot) [member function]
+    cls.add_method('SetSlot', 
+                   'void', 
+                   [param('ns3::Time', 'slot')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxGain(double gain) [member function]
+    cls.add_method('SetTxGain', 
+                   'void', 
+                   [param('double', 'gain')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerEnd(double end) [member function]
+    cls.add_method('SetTxPowerEnd', 
+                   'void', 
+                   [param('double', 'end')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerStart(double start) [member function]
+    cls.add_method('SetTxPowerStart', 
+                   'void', 
+                   [param('double', 'start')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetWifiRadioEnergyModel(ns3::Ptr<ns3::WifiRadioEnergyModel> const wifiRadioEnergyModel) [member function]
+    cls.add_method('SetWifiRadioEnergyModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRadioEnergyModel > const', 'wifiRadioEnergyModel')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreamble', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('UnregisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::m_frequencyChannels [variable]
+    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
+    cls.add_method('AddPhyEntity', 
+                   'void', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::DoChannelSwitch() [member function]
+    cls.add_method('DoChannelSwitch', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
-    cls.add_method('GetHtMcs25', 
-                   'ns3::WifiMode', 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
-    cls.add_method('GetHtMcs26', 
-                   'ns3::WifiMode', 
+                   is_virtual=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
+    cls.add_method('GetBand', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetPrimaryBand(uint16_t bandWidth) [member function]
+    cls.add_method('GetPrimaryBand', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth')], 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
-    cls.add_method('GetHtMcs27', 
-                   'ns3::WifiMode', 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy(uint16_t channelWidth) [member function]
+    cls.add_method('SwitchMaybeToCcaBusy', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')], 
+                   visibility='protected')
+    return
+
+def register_Ns3WifiPhyStateHelper_methods(root_module, cls):
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper(ns3::WifiPhyStateHelper const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhyStateHelper const &', 'arg0')])
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::ContinueRxNextMpdu(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('ContinueRxNextMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetDelayUntilIdle() const [member function]
+    cls.add_method('GetDelayUntilIdle', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
-    cls.add_method('GetHtMcs28', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxEndTime() const [member function]
+    cls.add_method('GetLastRxEndTime', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
-    cls.add_method('GetHtMcs29', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
-    cls.add_method('GetHtMcs3', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): WifiPhyState ns3::WifiPhyStateHelper::GetState() const [member function]
+    cls.add_method('GetState', 
+                   'WifiPhyState', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
-    cls.add_method('GetHtMcs30', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): static ns3::TypeId ns3::WifiPhyStateHelper::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
-    cls.add_method('GetHtMcs31', 
-                   'ns3::WifiMode', 
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateCcaBusy() const [member function]
+    cls.add_method('IsStateCcaBusy', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
-    cls.add_method('GetHtMcs4', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateIdle() const [member function]
+    cls.add_method('IsStateIdle', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
-    cls.add_method('GetHtMcs5', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateOff() const [member function]
+    cls.add_method('IsStateOff', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
-    cls.add_method('GetHtMcs6', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateRx() const [member function]
+    cls.add_method('IsStateRx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
-    cls.add_method('GetHtMcs7', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSleep() const [member function]
+    cls.add_method('IsStateSleep', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
-    cls.add_method('GetHtMcs8', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSwitching() const [member function]
+    cls.add_method('IsStateSwitching', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
-    cls.add_method('GetHtMcs9', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateTx() const [member function]
+    cls.add_method('IsStateTx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPhyHeaderMode() [member function]
-    cls.add_method('GetHtPhyHeaderMode', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::RegisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('RegisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
+    cls.add_method('SetReceiveErrorCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
+    cls.add_method('SetReceiveOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromOff(ns3::Time duration) [member function]
+    cls.add_method('SwitchFromOff', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxAbort() [member function]
+    cls.add_method('SwitchFromRxAbort', 
+                   'void', 
+                   [])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndError(ns3::Ptr<ns3::WifiPsdu> psdu, double snr) [member function]
+    cls.add_method('SwitchFromRxEndError', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
+    cls.add_method('SwitchFromRxEndOk', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromSleep(ns3::Time duration) [member function]
+    cls.add_method('SwitchFromSleep', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchMaybeToCcaBusy(ns3::Time duration) [member function]
+    cls.add_method('SwitchMaybeToCcaBusy', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToChannelSwitching(ns3::Time switchingDuration) [member function]
+    cls.add_method('SwitchToChannelSwitching', 
+                   'void', 
+                   [param('ns3::Time', 'switchingDuration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToOff() [member function]
+    cls.add_method('SwitchToOff', 
+                   'void', 
+                   [])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToRx(ns3::Time rxDuration) [member function]
+    cls.add_method('SwitchToRx', 
+                   'void', 
+                   [param('ns3::Time', 'rxDuration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToSleep() [member function]
+    cls.add_method('SwitchToSleep', 
+                   'void', 
+                   [])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToTx(ns3::Time txDuration, ns3::WifiConstPsduMap psdus, double txPowerDbm, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('SwitchToTx', 
+                   'void', 
+                   [param('ns3::Time', 'txDuration'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('UnregisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')])
+    return
+
+def register_Ns3WifiPpdu_methods(root_module, cls):
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPpdu const &', 'arg0')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, uint64_t uid=(18446744073709551615UL)) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('uint64_t', 'uid', default_value='(18446744073709551615UL)')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('uint64_t', 'uid')])
+    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::CanBeReceived(uint16_t txCenterFreq, uint16_t p20MinFreq, uint16_t p20MaxFreq) const [member function]
+    cls.add_method('CanBeReceived', 
+                   'bool', 
+                   [param('uint16_t', 'txCenterFreq'), param('uint16_t', 'p20MinFreq'), param('uint16_t', 'p20MaxFreq')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::WifiPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxEndTime() const [member function]
-    cls.add_method('GetLastRxEndTime', 
-                   'ns3::Time', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiPpdu::GetModulation() const [member function]
+    cls.add_method('GetModulation', 
+                   'ns3::WifiModulationClass', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPreamble ns3::WifiPpdu::GetPreamble() const [member function]
+    cls.add_method('GetPreamble', 
+                   'ns3::WifiPreamble', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedRxSpatialStreams() const [member function]
-    cls.add_method('GetMaxSupportedRxSpatialStreams', 
-                   'uint8_t', 
+    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::WifiPpdu::GetPsdu() const [member function]
+    cls.add_method('GetPsdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedTxSpatialStreams() const [member function]
-    cls.add_method('GetMaxSupportedTxSpatialStreams', 
-                   'uint8_t', 
+    ## wifi-ppdu.h (module 'wifi'): uint16_t ns3::WifiPpdu::GetStaId() const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
                    [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::WifiPhy::GetMobility() const [member function]
-    cls.add_method('GetMobility', 
-                   'ns3::Ptr< ns3::MobilityModel >', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): uint16_t ns3::WifiPpdu::GetTransmissionChannelWidth() const [member function]
+    cls.add_method('GetTransmissionChannelWidth', 
+                   'uint16_t', 
                    [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint8_t mode) const [member function]
-    cls.add_method('GetMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mode')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
                    [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::GetTxVector() const [member function]
+    cls.add_method('GetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint8_t', 
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpduType ns3::WifiPpdu::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::WifiPpduType', 
                    [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNTxPower() const [member function]
-    cls.add_method('GetNTxPower', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): uint64_t ns3::WifiPpdu::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNumberOfAntennas() const [member function]
-    cls.add_method('GetNumberOfAntennas', 
-                   'uint8_t', 
+    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsTruncatedTx() const [member function]
+    cls.add_method('IsTruncatedTx', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
+    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::SetTruncatedTx() [member function]
+    cls.add_method('SetTruncatedTx', 
+                   'void', 
+                   [])
+    ## wifi-ppdu.h (module 'wifi'): std::string ns3::WifiPpdu::PrintPayload() const [member function]
+    cls.add_method('PrintPayload', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3WifiProtectionManager_methods(root_module, cls):
+    ## wifi-protection-manager.h (module 'wifi'): ns3::WifiProtectionManager::WifiProtectionManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection-manager.h (module 'wifi'): ns3::WifiProtectionManager::WifiProtectionManager(ns3::WifiProtectionManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiProtectionManager const &', 'arg0')])
+    ## wifi-protection-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiProtectionManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
-    cls.add_method('GetOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
+    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    cls.add_method('SetWifiMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAddMpdu', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3WifiPsdu_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::WifiPsdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPsdu const &', 'arg0')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::Packet> p, ns3::WifiMacHeader const & header) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('bool', 'isSingle')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('bool', 'isSingle')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [constructor]
+    cls.add_constructor([param('std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiPsdu::GetAckPolicyForTid(uint8_t tid) const [member function]
+    cls.add_method('GetAckPolicyForTid', 
+                   'ns3::WifiMacHeader::QosAckPolicy', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr1() const [member function]
+    cls.add_method('GetAddr1', 
+                   'ns3::Mac48Address', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr2() const [member function]
+    cls.add_method('GetAddr2', 
+                   'ns3::Mac48Address', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype=::ns3::MpduType::NORMAL_MPDU, uint16_t staId=65535) [member function]
-    cls.add_method('GetPayloadDuration', 
-                   'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype', default_value='::ns3::MpduType::NORMAL_MPDU'), param('uint16_t', 'staId', default_value='65535')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) [member function]
-    cls.add_method('GetPayloadDuration', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiPsdu::GetAmpduSubframe(std::size_t i) const [member function]
+    cls.add_method('GetAmpduSubframe', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetAmpduSubframeSize(std::size_t i) const [member function]
+    cls.add_method('GetAmpduSubframeSize', 
+                   'std::size_t', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetDuration() const [member function]
+    cls.add_method('GetDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyBand ns3::WifiPhy::GetPhyBand() const [member function]
-    cls.add_method('GetPhyBand', 
-                   'ns3::WifiPhyBand', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyHeaderDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPhyHeaderMode(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhyHtSigHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyPreambleDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyPreambleDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigA1Duration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigA1Duration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigA2Duration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigA2Duration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigBDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigBDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
-    cls.add_method('GetPhyStandard', 
-                   'ns3::WifiPhyStandard', 
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader const & ns3::WifiPsdu::GetHeader(std::size_t i) const [member function]
+    cls.add_method('GetHeader', 
+                   'ns3::WifiMacHeader const &', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader & ns3::WifiPsdu::GetHeader(std::size_t i) [member function]
+    cls.add_method('GetHeader', 
+                   'ns3::WifiMacHeader &', 
+                   [param('std::size_t', 'i')])
+    ## wifi-psdu.h (module 'wifi'): uint16_t ns3::WifiPsdu::GetMaxDistFromStartingSeq(uint16_t startingSeq) const [member function]
+    cls.add_method('GetMaxDistFromStartingSeq', 
+                   'uint16_t', 
+                   [param('uint16_t', 'startingSeq')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetNMpdus() const [member function]
+    cls.add_method('GetNMpdus', 
+                   'std::size_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyTrainingSymbolDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyTrainingSymbolDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPifs() const [member function]
-    cls.add_method('GetPifs', 
-                   'ns3::Time', 
+    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPacket() const [member function]
+    cls.add_method('GetPacket', 
+                   'ns3::Ptr< ns3::Packet const >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetPowerDbm(uint8_t power) const [member function]
-    cls.add_method('GetPowerDbm', 
-                   'double', 
-                   [param('uint8_t', 'power')], 
+    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPayload(std::size_t i) const [member function]
+    cls.add_method('GetPayload', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('std::size_t', 'i')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPreambleDetectionDuration() [member function]
-    cls.add_method('GetPreambleDetectionDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxGain() const [member function]
-    cls.add_method('GetRxGain', 
-                   'double', 
+    ## wifi-psdu.h (module 'wifi'): uint32_t ns3::WifiPsdu::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxSensitivity() const [member function]
-    cls.add_method('GetRxSensitivity', 
-                   'double', 
+    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > ns3::WifiPsdu::GetTids() const [member function]
+    cls.add_method('GetTids', 
+                   'std::set< unsigned char >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetShortPhyPreambleSupported() const [member function]
-    cls.add_method('GetShortPhyPreambleSupported', 
+    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetTimeStamp(std::size_t i) const [member function]
+    cls.add_method('GetTimeStamp', 
+                   'ns3::Time', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsAggregate() const [member function]
+    cls.add_method('IsAggregate', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetSifs() const [member function]
-    cls.add_method('GetSifs', 
-                   'ns3::Time', 
+    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsSingle() const [member function]
+    cls.add_method('IsSingle', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetSlot() const [member function]
-    cls.add_method('GetSlot', 
-                   'ns3::Time', 
+    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetAckPolicyForTid(uint8_t tid, ns3::WifiMacHeader::QosAckPolicy policy) [member function]
+    cls.add_method('SetAckPolicyForTid', 
+                   'void', 
+                   [param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
+    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetDuration(ns3::Time duration) [member function]
+    cls.add_method('SetDuration', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::begin() const [member function]
+    cls.add_method('begin', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetStartOfPacketDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPhyStateHelper> ns3::WifiPhy::GetState() const [member function]
-    cls.add_method('GetState', 
-                   'ns3::Ptr< ns3::WifiPhyStateHelper >', 
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::begin() [member function]
+    cls.add_method('begin', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
+                   [])
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::end() const [member function]
+    cls.add_method('end', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
-    cls.add_method('GetSupportedChannelWidthSet', 
-                   'std::vector< unsigned short >', 
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::end() [member function]
+    cls.add_method('end', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
+                   [])
+    return
+
+def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedMcs(ns3::Mac48Address address) [member function]
+    cls.add_method('AddAllSupportedMcs', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedModes(ns3::Mac48Address address) [member function]
+    cls.add_method('AddAllSupportedModes', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
+    cls.add_method('AddBasicMcs', 
+                   'void', 
+                   [param('ns3::WifiMode', 'mcs')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
+    cls.add_method('AddBasicMode', 
+                   'void', 
+                   [param('ns3::WifiMode', 'mode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHeCapabilities(ns3::Mac48Address from, ns3::HeCapabilities heCapabilities) [member function]
+    cls.add_method('AddStationHeCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::HeCapabilities', 'heCapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHtCapabilities(ns3::Mac48Address from, ns3::HtCapabilities htCapabilities) [member function]
+    cls.add_method('AddStationHtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htCapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtCapabilities) [member function]
+    cls.add_method('AddStationVhtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtCapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedErpSlotTime(ns3::Mac48Address address, bool isShortSlotTimeSupported) [member function]
+    cls.add_method('AddSupportedErpSlotTime', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortSlotTimeSupported')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
+    cls.add_method('AddSupportedMcs', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
+    cls.add_method('AddSupportedMode', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedPhyPreamble(ns3::Mac48Address address, bool isShortPreambleSupported) [member function]
+    cls.add_method('AddSupportedPhyPreamble', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortPreambleSupported')])
+    ## wifi-remote-station-manager.h (module 'wifi'): int64_t ns3::WifiRemoteStationManager::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint8_t i) const [member function]
+    cls.add_method('GetBasicMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'i')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint8_t i) const [member function]
+    cls.add_method('GetBasicMode', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'i')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetBlockAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetBlockAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetChannelWidthSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetChannelWidthSupported', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetControlAnswerMode(ns3::WifiMode reqMode) const [member function]
+    cls.add_method('GetControlAnswerMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'reqMode')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector() [member function]
+    cls.add_method('GetCtsToSelfTxVector', 
+                   'ns3::WifiTxVector', 
+                   [])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsTxVector(ns3::Mac48Address to, ns3::WifiMode rtsTxMode) const [member function]
+    cls.add_method('GetCtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiMode', 'rtsTxMode')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetDataTxVector(ns3::WifiMacHeader const & header) [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    cls.add_method('GetDefaultMcs', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxGain() const [member function]
-    cls.add_method('GetTxGain', 
-                   'double', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
+    cls.add_method('GetDefaultMode', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerEnd() const [member function]
-    cls.add_method('GetTxPowerEnd', 
-                   'double', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
+    cls.add_method('GetDefaultTxPowerLevel', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerForTransmission(ns3::WifiTxVector txVector) const [member function]
-    cls.add_method('GetTxPowerForTransmission', 
-                   'double', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetDsssSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerStart() const [member function]
-    cls.add_method('GetTxPowerStart', 
-                   'double', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetErpOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetErpOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
+    cls.add_method('GetFragmentOffset', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
+    cls.add_method('GetFragmentSize', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentationThreshold() const [member function]
+    cls.add_method('GetFragmentationThreshold', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs(uint8_t mcs) [member function]
-    cls.add_method('GetVhtMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
-    cls.add_method('GetVhtMcs0', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
-    cls.add_method('GetVhtMcs1', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo ns3::WifiRemoteStationManager::GetInfo(ns3::Mac48Address address) [member function]
+    cls.add_method('GetInfo', 
+                   'ns3::WifiRemoteStationInfo', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported() const [member function]
+    cls.add_method('GetLdpcSupported', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
-    cls.add_method('GetVhtMcs2', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetLdpcSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
+    cls.add_method('GetMac', 
+                   'ns3::Ptr< ns3::WifiMac >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
-    cls.add_method('GetVhtMcs3', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMaxNumberOfTransmitStreams() const [member function]
+    cls.add_method('GetMaxNumberOfTransmitStreams', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
-    cls.add_method('GetVhtMcs4', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): double ns3::WifiRemoteStationManager::GetMostRecentRssi(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetMostRecentRssi', 
+                   'double', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicMcs() const [member function]
+    cls.add_method('GetNBasicMcs', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
-    cls.add_method('GetVhtMcs5', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicModes() const [member function]
+    cls.add_method('GetNBasicModes', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
-    cls.add_method('GetVhtMcs6', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetNMcsSupported', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNNonErpBasicModes() const [member function]
+    cls.add_method('GetNNonErpBasicModes', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
-    cls.add_method('GetVhtMcs7', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonErpBasicMode(uint8_t i) const [member function]
+    cls.add_method('GetNonErpBasicMode', 
                    'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
-    cls.add_method('GetVhtMcs8', 
+                   [param('uint8_t', 'i')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonUnicastMode() const [member function]
+    cls.add_method('GetNonUnicastMode', 
                    'ns3::WifiMode', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
-    cls.add_method('GetVhtMcs9', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfAntennas() const [member function]
+    cls.add_method('GetNumberOfAntennas', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPhyHeaderMode() [member function]
-    cls.add_method('GetVhtPhyHeaderMode', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetNumberOfSupportedStreams', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
+    cls.add_method('GetPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiMode mcs) const [member function]
-    cls.add_method('IsMcsSupported', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetQosSupported', 
                    'bool', 
-                   [param('ns3::WifiMode', 'mcs')], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiModulationClass mc, uint8_t mcs) const [member function]
-    cls.add_method('IsMcsSupported', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetRtsTxVector(ns3::Mac48Address address) [member function]
+    cls.add_method('GetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported() const [member function]
+    cls.add_method('GetShortGuardIntervalSupported', 
                    'bool', 
-                   [param('ns3::WifiModulationClass', 'mc'), param('uint8_t', 'mcs')], 
+                   [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
-    cls.add_method('IsModeSupported', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetShortGuardIntervalSupported', 
                    'bool', 
-                   [param('ns3::WifiMode', 'mode')], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateCcaBusy() const [member function]
-    cls.add_method('IsStateCcaBusy', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleEnabled() const [member function]
+    cls.add_method('GetShortPreambleEnabled', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateIdle() const [member function]
-    cls.add_method('IsStateIdle', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetShortPreambleSupported', 
                    'bool', 
-                   [], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateOff() const [member function]
-    cls.add_method('IsStateOff', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeEnabled() const [member function]
+    cls.add_method('GetShortSlotTimeEnabled', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateRx() const [member function]
-    cls.add_method('IsStateRx', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
                    'bool', 
-                   [], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSleep() const [member function]
-    cls.add_method('IsStateSleep', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HeCapabilities> ns3::WifiRemoteStationManager::GetStationHeCapabilities(ns3::Mac48Address from) [member function]
+    cls.add_method('GetStationHeCapabilities', 
+                   'ns3::Ptr< ns3::HeCapabilities const >', 
+                   [param('ns3::Mac48Address', 'from')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HtCapabilities> ns3::WifiRemoteStationManager::GetStationHtCapabilities(ns3::Mac48Address from) [member function]
+    cls.add_method('GetStationHtCapabilities', 
+                   'ns3::Ptr< ns3::HtCapabilities const >', 
+                   [param('ns3::Mac48Address', 'from')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::VhtCapabilities> ns3::WifiRemoteStationManager::GetStationVhtCapabilities(ns3::Mac48Address from) [member function]
+    cls.add_method('GetStationVhtCapabilities', 
+                   'ns3::Ptr< ns3::VhtCapabilities const >', 
+                   [param('ns3::Mac48Address', 'from')])
+    ## wifi-remote-station-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiRemoteStationManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonErpProtection() const [member function]
+    cls.add_method('GetUseNonErpProtection', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSwitching() const [member function]
-    cls.add_method('IsStateSwitching', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonHtProtection() const [member function]
+    cls.add_method('GetUseNonHtProtection', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateTx() const [member function]
-    cls.add_method('IsStateTx', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyChannelAccessRequested() [member function]
-    cls.add_method('NotifyChannelAccessRequested', 
-                   'void', 
-                   [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyEndOfHePreamble(ns3::HePreambleParameters params) [member function]
-    cls.add_method('NotifyEndOfHePreamble', 
-                   'void', 
-                   [param('ns3::HePreambleParameters', 'params')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
-    cls.add_method('NotifyMonitorSniffRx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, uint16_t staId=65535) [member function]
-    cls.add_method('NotifyMonitorSniffTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
-    cls.add_method('NotifyRxBegin', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiPhyRxfailureReason reason) [member function]
-    cls.add_method('NotifyRxDrop', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiPhyRxfailureReason', 'reason')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
-    cls.add_method('NotifyRxEnd', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::WifiConstPsduMap psdus, double txPowerW) [member function]
-    cls.add_method('NotifyTxBegin', 
-                   'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
-    cls.add_method('NotifyTxDrop', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxEnd(ns3::WifiConstPsduMap psdus) [member function]
-    cls.add_method('NotifyTxEnd', 
-                   'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('RegisterListener', 
-                   'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetCca(bool powerRestricted, double txPowerMaxSiso=0, double txPowerMaxMimo=0) [member function]
-    cls.add_method('ResetCca', 
-                   'void', 
-                   [param('bool', 'powerRestricted'), param('double', 'txPowerMaxSiso', default_value='0'), param('double', 'txPowerMaxMimo', default_value='0')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('ResetReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResumeFromOff() [member function]
-    cls.add_method('ResumeFromOff', 
-                   'void', 
-                   [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResumeFromSleep() [member function]
-    cls.add_method('ResumeFromSleep', 
-                   'void', 
-                   [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector txVector) [member function]
-    cls.add_method('Send', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
-    cls.add_method('Send', 
-                   'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCapabilitiesChangedCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetCapabilitiesChangedCallback', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsAssociated', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsBrandNew(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsBrandNew', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
+    cls.add_method('IsLastFragment', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsWaitAssocTxOk(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsWaitAssocTxOk', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedCtsToSelf(ns3::WifiTxVector txVector) [member function]
+    cls.add_method('NeedCtsToSelf', 
+                   'bool', 
+                   [param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NeedFragmentation', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NeedRetransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::WifiMacHeader const & header, uint32_t size) [member function]
+    cls.add_method('NeedRts', 
+                   'bool', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordDisassociated(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordDisassociated', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCcaEdThreshold(double threshold) [member function]
-    cls.add_method('SetCcaEdThreshold', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxFailed(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordGotAssocTxFailed', 
                    'void', 
-                   [param('double', 'threshold')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxOk(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordGotAssocTxOk', 
                    'void', 
-                   [param('uint8_t', 'id')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordWaitAssocTxOk(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordWaitAssocTxOk', 
                    'void', 
-                   [param('uint16_t', 'channelWidth')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
-    cls.add_method('SetDevice', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RemoveAllSupportedMcs(ns3::Mac48Address address) [member function]
+    cls.add_method('RemoveAllSupportedMcs', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> const rate) [member function]
-    cls.add_method('SetErrorRateModel', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+    cls.add_method('ReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ErrorRateModel > const', 'rate')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrameCaptureModel(ns3::Ptr<ns3::FrameCaptureModel> const frameCaptureModel) [member function]
-    cls.add_method('SetFrameCaptureModel', 
+                   [param('ns3::Mac48Address', 'address'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('ReportDataFailed', 
                    'void', 
-                   [param('ns3::Ptr< ns3::FrameCaptureModel > const', 'frameCaptureModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+    cls.add_method('ReportDataOk', 
                    'void', 
-                   [param('uint16_t', 'freq')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedRxSpatialStreams(uint8_t streams) [member function]
-    cls.add_method('SetMaxSupportedRxSpatialStreams', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('ReportFinalDataFailed', 
                    'void', 
-                   [param('uint8_t', 'streams')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedTxSpatialStreams(uint8_t streams) [member function]
-    cls.add_method('SetMaxSupportedTxSpatialStreams', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::WifiMacHeader const & header) [member function]
+    cls.add_method('ReportFinalRtsFailed', 
                    'void', 
-                   [param('uint8_t', 'streams')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> const mobility) [member function]
-    cls.add_method('SetMobility', 
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::WifiMacHeader const & header) [member function]
+    cls.add_method('ReportRtsFailed', 
                    'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel > const', 'mobility')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNTxPower(uint8_t n) [member function]
-    cls.add_method('SetNTxPower', 
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::WifiMacHeader const & header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('ReportRtsOk', 
                    'void', 
-                   [param('uint8_t', 'n')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
-    cls.add_method('SetNumberOfAntennas', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('ReportRxOk', 
                    'void', 
-                   [param('uint8_t', 'antennas')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOffMode() [member function]
-    cls.add_method('SetOffMode', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::Reset() [member function]
+    cls.add_method('Reset', 
                    'void', 
                    [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPifs(ns3::Time pifs) [member function]
-    cls.add_method('SetPifs', 
-                   'void', 
-                   [param('ns3::Time', 'pifs')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPostReceptionErrorModel(ns3::Ptr<ns3::ErrorModel> const em) [member function]
-    cls.add_method('SetPostReceptionErrorModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ErrorModel > const', 'em')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPreambleDetectionModel(ns3::Ptr<ns3::PreambleDetectionModel> const preambleDetectionModel) [member function]
-    cls.add_method('SetPreambleDetectionModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::PreambleDetectionModel > const', 'preambleDetectionModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
-    cls.add_method('SetReceiveErrorCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
-    cls.add_method('SetReceiveOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxGain(double gain) [member function]
-    cls.add_method('SetRxGain', 
-                   'void', 
-                   [param('double', 'gain')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
-    cls.add_method('SetRxNoiseFigure', 
-                   'void', 
-                   [param('double', 'noiseFigureDb')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxSensitivity(double threshold) [member function]
-    cls.add_method('SetRxSensitivity', 
-                   'void', 
-                   [param('double', 'threshold')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetShortPhyPreambleSupported(bool preamble) [member function]
-    cls.add_method('SetShortPhyPreambleSupported', 
-                   'void', 
-                   [param('bool', 'preamble')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSifs(ns3::Time sifs) [member function]
-    cls.add_method('SetSifs', 
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
+    cls.add_method('SetDefaultTxPowerLevel', 
                    'void', 
-                   [param('ns3::Time', 'sifs')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSleepMode() [member function]
-    cls.add_method('SetSleepMode', 
+                   [param('uint8_t', 'txPower')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetFragmentationThreshold(uint32_t threshold) [member function]
+    cls.add_method('SetFragmentationThreshold', 
                    'void', 
-                   [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSlot(ns3::Time slot) [member function]
-    cls.add_method('SetSlot', 
+                   [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSlrc(uint32_t maxSlrc) [member function]
+    cls.add_method('SetMaxSlrc', 
                    'void', 
-                   [param('ns3::Time', 'slot')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxGain(double gain) [member function]
-    cls.add_method('SetTxGain', 
+                   [param('uint32_t', 'maxSlrc')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
+    cls.add_method('SetMaxSsrc', 
                    'void', 
-                   [param('double', 'gain')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerEnd(double end) [member function]
-    cls.add_method('SetTxPowerEnd', 
+                   [param('uint32_t', 'maxSsrc')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
+    cls.add_method('SetQosSupport', 
                    'void', 
-                   [param('double', 'end')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerStart(double start) [member function]
-    cls.add_method('SetTxPowerStart', 
+                   [param('ns3::Mac48Address', 'from'), param('bool', 'qosSupported')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetRtsCtsThreshold(uint32_t threshold) [member function]
+    cls.add_method('SetRtsCtsThreshold', 
                    'void', 
-                   [param('double', 'start')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetWifiRadioEnergyModel(ns3::Ptr<ns3::WifiRadioEnergyModel> const wifiRadioEnergyModel) [member function]
-    cls.add_method('SetWifiRadioEnergyModel', 
+                   [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortPreambleEnabled(bool enable) [member function]
+    cls.add_method('SetShortPreambleEnabled', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRadioEnergyModel > const', 'wifiRadioEnergyModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('StartReceiveHeader', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortSlotTimeEnabled(bool enable) [member function]
+    cls.add_method('SetShortSlotTimeEnabled', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('StartReceivePayload', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonErpProtection(bool enable) [member function]
+    cls.add_method('SetUseNonErpProtection', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
-    cls.add_method('StartReceivePreamble', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonHtProtection(bool enable) [member function]
+    cls.add_method('SetUseNonHtProtection', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
-    cls.add_method('StartTx', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetupMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('UnregisterListener', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
                    'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t channelWidth, ns3::HeRu::SubcarrierRange range) const [member function]
-    cls.add_method('ConvertHeRuSubcarriers', 
-                   'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'channelWidth'), param('std::pair< short, short >', 'range')], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DoChannelSwitch(uint8_t id) [member function]
-    cls.add_method('DoChannelSwitch', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseLdpcForDestination(ns3::Mac48Address dest) const [member function]
+    cls.add_method('UseLdpcForDestination', 
                    'bool', 
-                   [param('uint8_t', 'id')], 
-                   visibility='protected')
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
+                   [param('ns3::Mac48Address', 'dest')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DoFrequencySwitch(uint16_t frequency) [member function]
-    cls.add_method('DoFrequencySwitch', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Mac48Address ns3::WifiRemoteStationManager::GetAddress(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetAggregation(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAggregation', 
                    'bool', 
-                   [param('uint16_t', 'frequency')], 
-                   visibility='protected')
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
-    cls.add_method('GetBand', 
-                   'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetStaId() const [member function]
-    cls.add_method('GetStaId', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetChannelWidth(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetChannelWidth', 
                    'uint16_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy() [member function]
-    cls.add_method('SwitchMaybeToCcaBusy', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    return
-
-def register_Ns3WifiPhyStateHelper_methods(root_module, cls):
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper(ns3::WifiPhyStateHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPhyStateHelper const &', 'arg0')])
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::ContinueRxNextMpdu(ns3::Ptr<ns3::WifiPsdu> psdu, double snr, ns3::WifiTxVector txVector) [member function]
-    cls.add_method('ContinueRxNextMpdu', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetDelayUntilIdle() const [member function]
-    cls.add_method('GetDelayUntilIdle', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxEndTime() const [member function]
-    cls.add_method('GetLastRxEndTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): WifiPhyState ns3::WifiPhyStateHelper::GetState() const [member function]
-    cls.add_method('GetState', 
-                   'WifiPhyState', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): static ns3::TypeId ns3::WifiPhyStateHelper::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateCcaBusy() const [member function]
-    cls.add_method('IsStateCcaBusy', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'uint16_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetHeSupported', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateIdle() const [member function]
-    cls.add_method('IsStateIdle', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetHtSupported', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateOff() const [member function]
-    cls.add_method('IsStateOff', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
+    cls.add_method('GetMcsSupported', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint8_t', 'i')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNMcsSupported', 
+                   'uint8_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNNonErpSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNNonErpSupported', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNSupported', 
+                   'uint8_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNess(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNess', 
+                   'uint8_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonErpSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
+    cls.add_method('GetNonErpSupported', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint8_t', 'i')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNumberOfSupportedStreams', 
+                   'uint8_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetQosSupported', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateRx() const [member function]
-    cls.add_method('IsStateRx', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetShortGuardIntervalSupported', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSleep() const [member function]
-    cls.add_method('IsStateSleep', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
+    cls.add_method('GetSupported', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint8_t', 'i')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetVhtSupported', 
                    'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::WifiRemoteStationManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSwitching() const [member function]
-    cls.add_method('IsStateSwitching', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedFragmentation(ns3::WifiRemoteStation * station, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
+    cls.add_method('DoNeedFragmentation', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateTx() const [member function]
-    cls.add_method('IsStateTx', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRetransmission(ns3::WifiRemoteStation * station, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
+    cls.add_method('DoNeedRetransmission', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::RegisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('RegisterListener', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
+    cls.add_method('DoNeedRts', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
-    cls.add_method('SetReceiveErrorCallback', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
-    cls.add_method('SetReceiveOkCallback', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromOff(ns3::Time duration) [member function]
-    cls.add_method('SwitchFromOff', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxAbort() [member function]
-    cls.add_method('SwitchFromRxAbort', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndError(ns3::Ptr<ns3::WifiPsdu> psdu, double snr) [member function]
-    cls.add_method('SwitchFromRxEndError', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, double snr, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
-    cls.add_method('SwitchFromRxEndOk', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromSleep(ns3::Time duration) [member function]
-    cls.add_method('SwitchFromSleep', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchMaybeToCcaBusy(ns3::Time duration) [member function]
-    cls.add_method('SwitchMaybeToCcaBusy', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3WifiSpectrumPhyInterface_methods(root_module, cls):
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): static ns3::TypeId ns3::WifiSpectrumPhyInterface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::WifiSpectrumPhyInterface::WifiSpectrumPhyInterface() [constructor]
+    cls.add_constructor([])
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetSpectrumWifiPhy(ns3::Ptr<ns3::SpectrumWifiPhy> const phy) [member function]
+    cls.add_method('SetSpectrumWifiPhy', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToChannelSwitching(ns3::Time switchingDuration) [member function]
-    cls.add_method('SwitchToChannelSwitching', 
+                   [param('ns3::Ptr< ns3::SpectrumWifiPhy > const', 'phy')])
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiSpectrumPhyInterface::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetDevice(ns3::Ptr<ns3::NetDevice> const d) [member function]
+    cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::Time', 'switchingDuration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToOff() [member function]
-    cls.add_method('SwitchToOff', 
+                   [param('ns3::Ptr< ns3::NetDevice > const', 'd')], 
+                   is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetMobility(ns3::Ptr<ns3::MobilityModel> const m) [member function]
+    cls.add_method('SetMobility', 
                    'void', 
-                   [])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToRx(ns3::Time rxDuration) [member function]
-    cls.add_method('SwitchToRx', 
+                   [param('ns3::Ptr< ns3::MobilityModel > const', 'm')], 
+                   is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::WifiSpectrumPhyInterface::GetMobility() const [member function]
+    cls.add_method('GetMobility', 
+                   'ns3::Ptr< ns3::MobilityModel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetChannel(ns3::Ptr<ns3::SpectrumChannel> const c) [member function]
+    cls.add_method('SetChannel', 
                    'void', 
-                   [param('ns3::Time', 'rxDuration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToSleep() [member function]
-    cls.add_method('SwitchToSleep', 
+                   [param('ns3::Ptr< ns3::SpectrumChannel > const', 'c')], 
+                   is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<const ns3::SpectrumModel> ns3::WifiSpectrumPhyInterface::GetRxSpectrumModel() const [member function]
+    cls.add_method('GetRxSpectrumModel', 
+                   'ns3::Ptr< ns3::SpectrumModel const >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::AntennaModel> ns3::WifiSpectrumPhyInterface::GetRxAntenna() const [member function]
+    cls.add_method('GetRxAntenna', 
+                   'ns3::Ptr< ns3::AntennaModel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
+    cls.add_method('StartRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params')], 
+                   is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3WifiSpectrumSignalParameters_methods(root_module, cls):
+    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::WifiSpectrumSignalParameters() [constructor]
+    cls.add_constructor([])
+    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::WifiSpectrumSignalParameters(ns3::WifiSpectrumSignalParameters const & p) [constructor]
+    cls.add_constructor([param('ns3::WifiSpectrumSignalParameters const &', 'p')])
+    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::Ptr<ns3::SpectrumSignalParameters> ns3::WifiSpectrumSignalParameters::Copy() [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::SpectrumSignalParameters >', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::ppdu [variable]
+    cls.add_instance_attribute('ppdu', 'ns3::Ptr< ns3::WifiPpdu >', is_const=False)
+    return
+
+def register_Ns3WifiTxCurrentModel_methods(root_module, cls):
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel::WifiTxCurrentModel(ns3::WifiTxCurrentModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiTxCurrentModel const &', 'arg0')])
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel::WifiTxCurrentModel() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::WifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
+    cls.add_method('CalcTxCurrent', 
+                   'double', 
+                   [param('double', 'txPowerDbm')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-tx-current-model.h (module 'wifi'): static ns3::TypeId ns3::WifiTxCurrentModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3YansWifiPhy_methods(root_module, cls):
+    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy(ns3::YansWifiPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::YansWifiPhy const &', 'arg0')])
+    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy() [constructor]
+    cls.add_constructor([])
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::YansWifiPhy::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint16_t ns3::YansWifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): std::tuple<double, double, double> ns3::YansWifiPhy::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::YansWifiPhy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannel(ns3::Ptr<ns3::YansWifiChannel> const channel) [member function]
+    cls.add_method('SetChannel', 
                    'void', 
-                   [])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToTx(ns3::Time txDuration, ns3::WifiConstPsduMap psdus, double txPowerDbm, ns3::WifiTxVector txVector) [member function]
-    cls.add_method('SwitchToTx', 
+                   [param('ns3::Ptr< ns3::YansWifiChannel > const', 'channel')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
                    'void', 
-                   [param('ns3::Time', 'txDuration'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('UnregisterListener', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')])
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
-def register_Ns3WifiPpdu_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiPpdu const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPpdu const &', 'arg0')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band) [constructor]
-    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiPpdu::GetModulation() const [member function]
-    cls.add_method('GetModulation', 
-                   'ns3::WifiModulationClass', 
-                   [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::WifiPpdu::GetPsdu(uint8_t bssColor=64, uint16_t staId=65535) const [member function]
-    cls.add_method('GetPsdu', 
-                   'ns3::Ptr< ns3::WifiPsdu const >', 
-                   [param('uint8_t', 'bssColor', default_value='64'), param('uint16_t', 'staId', default_value='65535')], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
-    cls.add_method('GetTxDuration', 
-                   'ns3::Time', 
+def register_Ns3ZetaRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZetaRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::GetTxVector() const [member function]
-    cls.add_method('GetTxVector', 
-                   'ns3::WifiTxVector', 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable::ZetaRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsMu() const [member function]
-    cls.add_method('IsMu', 
-                   'bool', 
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue(double alpha) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger(uint32_t alpha) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'alpha')])
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsTruncatedTx() const [member function]
-    cls.add_method('IsTruncatedTx', 
-                   'bool', 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::SetTruncatedTx() [member function]
-    cls.add_method('SetTruncatedTx', 
-                   'void', 
-                   [])
+                   is_virtual=True)
     return
 
-def register_Ns3WifiPsdu_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::WifiPsdu const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPsdu const &', 'arg0')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::Packet> p, ns3::WifiMacHeader const & header) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::WifiMacHeader const &', 'header')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('bool', 'isSingle')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('bool', 'isSingle')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [constructor]
-    cls.add_constructor([param('std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiPsdu::GetAckPolicyForTid(uint8_t tid) const [member function]
-    cls.add_method('GetAckPolicyForTid', 
-                   'ns3::WifiMacHeader::QosAckPolicy', 
-                   [param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr1() const [member function]
-    cls.add_method('GetAddr1', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr2() const [member function]
-    cls.add_method('GetAddr2', 
-                   'ns3::Mac48Address', 
+def register_Ns3ZipfRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZipfRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiPsdu::GetAmpduSubframe(std::size_t i) const [member function]
-    cls.add_method('GetAmpduSubframe', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetAmpduSubframeSize(std::size_t i) const [member function]
-    cls.add_method('GetAmpduSubframeSize', 
-                   'std::size_t', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetDuration() const [member function]
-    cls.add_method('GetDuration', 
-                   'ns3::Time', 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable::ZipfRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader const & ns3::WifiPsdu::GetHeader(std::size_t i) const [member function]
-    cls.add_method('GetHeader', 
-                   'ns3::WifiMacHeader const &', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader & ns3::WifiPsdu::GetHeader(std::size_t i) [member function]
-    cls.add_method('GetHeader', 
-                   'ns3::WifiMacHeader &', 
-                   [param('std::size_t', 'i')])
-    ## wifi-psdu.h (module 'wifi'): uint16_t ns3::WifiPsdu::GetMaxDistFromStartingSeq(uint16_t startingSeq) const [member function]
-    cls.add_method('GetMaxDistFromStartingSeq', 
-                   'uint16_t', 
-                   [param('uint16_t', 'startingSeq')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetNMpdus() const [member function]
-    cls.add_method('GetNMpdus', 
-                   'std::size_t', 
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet const >', 
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue(uint32_t n, double alpha) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('uint32_t', 'n'), param('double', 'alpha')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger(uint32_t n, uint32_t alpha) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'n'), param('uint32_t', 'alpha')])
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPayload(std::size_t i) const [member function]
-    cls.add_method('GetPayload', 
-                   'ns3::Ptr< ns3::Packet const >', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): uint32_t ns3::WifiPsdu::GetSize() const [member function]
-    cls.add_method('GetSize', 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > ns3::WifiPsdu::GetTids() const [member function]
-    cls.add_method('GetTids', 
-                   'std::set< unsigned char >', 
+                   is_virtual=True)
+    return
+
+def register_Ns3AarfWifiManager_methods(root_module, cls):
+    ## aarf-wifi-manager.h (module 'wifi'): ns3::AarfWifiManager::AarfWifiManager(ns3::AarfWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AarfWifiManager const &', 'arg0')])
+    ## aarf-wifi-manager.h (module 'wifi'): ns3::AarfWifiManager::AarfWifiManager() [constructor]
+    cls.add_constructor([])
+    ## aarf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AarfWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetTimeStamp(std::size_t i) const [member function]
-    cls.add_method('GetTimeStamp', 
-                   'ns3::Time', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsAggregate() const [member function]
-    cls.add_method('IsAggregate', 
-                   'bool', 
+                   is_static=True)
+    ## aarf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AarfWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsSingle() const [member function]
-    cls.add_method('IsSingle', 
-                   'bool', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetAckPolicyForTid(uint8_t tid, ns3::WifiMacHeader::QosAckPolicy policy) [member function]
-    cls.add_method('SetAckPolicyForTid', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
-    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetDuration(ns3::Time duration) [member function]
-    cls.add_method('SetDuration', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::begin() const [member function]
-    cls.add_method('begin', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::begin() [member function]
-    cls.add_method('begin', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
-                   [])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::end() const [member function]
-    cls.add_method('end', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::end() [member function]
-    cls.add_method('end', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
-                   [])
-    return
-
-def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager() [constructor]
-    cls.add_constructor([])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedMcs(ns3::Mac48Address address) [member function]
-    cls.add_method('AddAllSupportedMcs', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedModes(ns3::Mac48Address address) [member function]
-    cls.add_method('AddAllSupportedModes', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
-    cls.add_method('AddBasicMcs', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
                    'void', 
-                   [param('ns3::WifiMode', 'mcs')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
-    cls.add_method('AddBasicMode', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3AarfcdWifiManager_methods(root_module, cls):
+    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::AarfcdWifiManager::AarfcdWifiManager(ns3::AarfcdWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AarfcdWifiManager const &', 'arg0')])
+    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::AarfcdWifiManager::AarfcdWifiManager() [constructor]
+    cls.add_constructor([])
+    ## aarfcd-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AarfcdWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AarfcdWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfcdWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfcdWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::WifiMode', 'mode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHeCapabilities(ns3::Mac48Address from, ns3::HeCapabilities heCapabilities) [member function]
-    cls.add_method('AddStationHeCapabilities', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): bool ns3::AarfcdWifiManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
+    cls.add_method('DoNeedRts', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'from'), param('ns3::HeCapabilities', 'heCapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHtCapabilities(ns3::Mac48Address from, ns3::HtCapabilities htCapabilities) [member function]
-    cls.add_method('AddStationHtCapabilities', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htCapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtCapabilities) [member function]
-    cls.add_method('AddStationVhtCapabilities', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtCapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedErpSlotTime(ns3::Mac48Address address, bool isShortSlotTimeSupported) [member function]
-    cls.add_method('AddSupportedErpSlotTime', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortSlotTimeSupported')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
-    cls.add_method('AddSupportedMcs', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
-    cls.add_method('AddSupportedMode', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedPhyPreamble(ns3::Mac48Address address, bool isShortPreambleSupported) [member function]
-    cls.add_method('AddSupportedPhyPreamble', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortPreambleSupported')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint8_t i) const [member function]
-    cls.add_method('GetBasicMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint8_t i) const [member function]
-    cls.add_method('GetBasicMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetChannelWidthSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetChannelWidthSupported', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector() [member function]
-    cls.add_method('GetCtsToSelfTxVector', 
-                   'ns3::WifiTxVector', 
-                   [])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetDataTxVector(ns3::WifiMacHeader const & header) [member function]
-    cls.add_method('GetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiMacHeader const &', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
-    cls.add_method('GetDefaultMcs', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
-    cls.add_method('GetDefaultMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
-    cls.add_method('GetDefaultTxPowerLevel', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentationThreshold() const [member function]
-    cls.add_method('GetFragmentationThreshold', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3AmpduSubframeHeader_methods(root_module, cls):
+    ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader::AmpduSubframeHeader(ns3::AmpduSubframeHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AmpduSubframeHeader const &', 'arg0')])
+    ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader::AmpduSubframeHeader() [constructor]
+    cls.add_constructor([])
+    ## ampdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmpduSubframeHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
                    'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported() const [member function]
-    cls.add_method('GetGreenfieldSupported', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ampdu-subframe-header.h (module 'wifi'): bool ns3::AmpduSubframeHeader::GetEof() const [member function]
+    cls.add_method('GetEof', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
+    ## ampdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmpduSubframeHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported() const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## ampdu-subframe-header.h (module 'wifi'): uint16_t ns3::AmpduSubframeHeader::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported() const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
+    ## ampdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmpduSubframeHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo ns3::WifiRemoteStationManager::GetInfo(ns3::Mac48Address address) [member function]
-    cls.add_method('GetInfo', 
-                   'ns3::WifiRemoteStationInfo', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported() const [member function]
-    cls.add_method('GetLdpcSupported', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## ampdu-subframe-header.h (module 'wifi'): static ns3::TypeId ns3::AmpduSubframeHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetLdpcSupported', 
+                   is_static=True)
+    ## ampdu-subframe-header.h (module 'wifi'): bool ns3::AmpduSubframeHeader::IsSignatureValid() const [member function]
+    cls.add_method('IsSignatureValid', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMaxNumberOfTransmitStreams() const [member function]
-    cls.add_method('GetMaxNumberOfTransmitStreams', 
-                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicMcs() const [member function]
-    cls.add_method('GetNBasicMcs', 
-                   'uint8_t', 
+    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetEof(bool eof) [member function]
+    cls.add_method('SetEof', 
+                   'void', 
+                   [param('bool', 'eof')])
+    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
+    return
+
+def register_Ns3AmrrWifiManager_methods(root_module, cls):
+    ## amrr-wifi-manager.h (module 'wifi'): ns3::AmrrWifiManager::AmrrWifiManager(ns3::AmrrWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AmrrWifiManager const &', 'arg0')])
+    ## amrr-wifi-manager.h (module 'wifi'): ns3::AmrrWifiManager::AmrrWifiManager() [constructor]
+    cls.add_constructor([])
+    ## amrr-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AmrrWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicModes() const [member function]
-    cls.add_method('GetNBasicModes', 
-                   'uint8_t', 
+                   is_static=True)
+    ## amrr-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AmrrWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetNMcsSupported', 
-                   'uint8_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNNonErpBasicModes() const [member function]
-    cls.add_method('GetNNonErpBasicModes', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AmrrWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AmrrWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3AmsduSubframeHeader_methods(root_module, cls):
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader(ns3::AmsduSubframeHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AmsduSubframeHeader const &', 'arg0')])
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader() [constructor]
+    cls.add_constructor([])
+    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
                    'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetDestinationAddr() const [member function]
+    cls.add_method('GetDestinationAddr', 
+                   'ns3::Mac48Address', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonErpBasicMode(uint8_t i) const [member function]
-    cls.add_method('GetNonErpBasicMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonUnicastMode() const [member function]
-    cls.add_method('GetNonUnicastMode', 
-                   'ns3::WifiMode', 
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmsduSubframeHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfAntennas() const [member function]
-    cls.add_method('GetNumberOfAntennas', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): uint16_t ns3::AmsduSubframeHeader::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetNumberOfSupportedStreams', 
-                   'uint8_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetPcfSupported() const [member function]
-    cls.add_method('GetPcfSupported', 
-                   'bool', 
+    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetRtsTxVector(ns3::Mac48Address address) [member function]
-    cls.add_method('GetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported() const [member function]
-    cls.add_method('GetShortGuardIntervalSupported', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetSourceAddr() const [member function]
+    cls.add_method('GetSourceAddr', 
+                   'ns3::Mac48Address', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetShortGuardIntervalSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleEnabled() const [member function]
-    cls.add_method('GetShortPreambleEnabled', 
-                   'bool', 
+    ## amsdu-subframe-header.h (module 'wifi'): static ns3::TypeId ns3::AmsduSubframeHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetShortPreambleSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeEnabled() const [member function]
-    cls.add_method('GetShortSlotTimeEnabled', 
-                   'bool', 
+                   is_static=True)
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetDestinationAddr(ns3::Mac48Address to) [member function]
+    cls.add_method('SetDestinationAddr', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'to')])
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetSourceAddr(ns3::Mac48Address to) [member function]
+    cls.add_method('SetSourceAddr', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'to')])
+    return
+
+def register_Ns3AntennaModel_methods(root_module, cls):
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel(ns3::AntennaModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AntennaModel const &', 'arg0')])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel() [constructor]
+    cls.add_constructor([])
+    ## antenna-model.h (module 'antenna'): double ns3::AntennaModel::GetGainDb(ns3::Angles a) [member function]
+    cls.add_method('GetGainDb', 
+                   'double', 
+                   [param('ns3::Angles', 'a')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## antenna-model.h (module 'antenna'): static ns3::TypeId ns3::AntennaModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HeCapabilities> ns3::WifiRemoteStationManager::GetStationHeCapabilities(ns3::Mac48Address from) [member function]
-    cls.add_method('GetStationHeCapabilities', 
-                   'ns3::Ptr< ns3::HeCapabilities const >', 
-                   [param('ns3::Mac48Address', 'from')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HtCapabilities> ns3::WifiRemoteStationManager::GetStationHtCapabilities(ns3::Mac48Address from) [member function]
-    cls.add_method('GetStationHtCapabilities', 
-                   'ns3::Ptr< ns3::HtCapabilities const >', 
-                   [param('ns3::Mac48Address', 'from')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::VhtCapabilities> ns3::WifiRemoteStationManager::GetStationVhtCapabilities(ns3::Mac48Address from) [member function]
-    cls.add_method('GetStationVhtCapabilities', 
-                   'ns3::Ptr< ns3::VhtCapabilities const >', 
-                   [param('ns3::Mac48Address', 'from')])
-    ## wifi-remote-station-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiRemoteStationManager::GetTypeId() [member function]
+                   is_static=True)
+    return
+
+def register_Ns3AparfWifiManager_methods(root_module, cls):
+    ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager::AparfWifiManager(ns3::AparfWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AparfWifiManager const &', 'arg0')])
+    ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager::AparfWifiManager() [constructor]
+    cls.add_constructor([])
+    ## aparf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AparfWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseGreenfieldProtection() const [member function]
-    cls.add_method('GetUseGreenfieldProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonErpProtection() const [member function]
-    cls.add_method('GetUseNonErpProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonHtProtection() const [member function]
-    cls.add_method('GetUseNonHtProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported() const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
-    cls.add_method('IsAssociated', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsBrandNew(ns3::Mac48Address address) const [member function]
-    cls.add_method('IsBrandNew', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsWaitAssocTxOk(ns3::Mac48Address address) const [member function]
-    cls.add_method('IsWaitAssocTxOk', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedCtsToSelf(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('NeedCtsToSelf', 
-                   'bool', 
-                   [param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NeedFragmentation', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NeedRetransmission', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::WifiMacHeader const & header, uint32_t size) [member function]
-    cls.add_method('NeedRts', 
-                   'bool', 
-                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordDisassociated(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordDisassociated', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxFailed(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordGotAssocTxFailed', 
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxOk(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordGotAssocTxOk', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## aparf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AparfWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AparfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AparfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordWaitAssocTxOk(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordWaitAssocTxOk', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RemoveAllSupportedMcs(ns3::Mac48Address address) [member function]
-    cls.add_method('RemoveAllSupportedMcs', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('ReportAmpduTxStatus', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
-    cls.add_method('ReportDataFailed', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector, uint32_t packetSize) [member function]
-    cls.add_method('ReportDataOk', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
-    cls.add_method('ReportFinalDataFailed', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
-    cls.add_method('ReportFinalRtsFailed', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
-    cls.add_method('ReportRtsFailed', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ArfWifiManager_methods(root_module, cls):
+    ## arf-wifi-manager.h (module 'wifi'): ns3::ArfWifiManager::ArfWifiManager(ns3::ArfWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ArfWifiManager const &', 'arg0')])
+    ## arf-wifi-manager.h (module 'wifi'): ns3::ArfWifiManager::ArfWifiManager() [constructor]
+    cls.add_constructor([])
+    ## arf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ArfWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## arf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ArfWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ArfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ArfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('ReportRtsOk', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('ReportRxOk', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::Reset() [member function]
-    cls.add_method('Reset', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
-    cls.add_method('SetDefaultTxPowerLevel', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [param('uint8_t', 'txPower')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetFragmentationThreshold(uint32_t threshold) [member function]
-    cls.add_method('SetFragmentationThreshold', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
                    'void', 
-                   [param('uint32_t', 'threshold')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSlrc(uint32_t maxSlrc) [member function]
-    cls.add_method('SetMaxSlrc', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
                    'void', 
-                   [param('uint32_t', 'maxSlrc')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
-    cls.add_method('SetMaxSsrc', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
                    'void', 
-                   [param('uint32_t', 'maxSsrc')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetPcfSupported(bool enable) [member function]
-    cls.add_method('SetPcfSupported', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3AthstatsWifiTraceSink_methods(root_module, cls):
+    ## athstats-helper.h (module 'wifi'): ns3::AthstatsWifiTraceSink::AthstatsWifiTraceSink(ns3::AthstatsWifiTraceSink const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AthstatsWifiTraceSink const &', 'arg0')])
+    ## athstats-helper.h (module 'wifi'): ns3::AthstatsWifiTraceSink::AthstatsWifiTraceSink() [constructor]
+    cls.add_constructor([])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::DevRxTrace(std::string context, ns3::Ptr<const ns3::Packet> p) [member function]
+    cls.add_method('DevRxTrace', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
-    cls.add_method('SetQosSupport', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::DevTxTrace(std::string context, ns3::Ptr<const ns3::Packet> p) [member function]
+    cls.add_method('DevTxTrace', 
                    'void', 
-                   [param('ns3::Mac48Address', 'from'), param('bool', 'qosSupported')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetRtsCtsThreshold(uint32_t threshold) [member function]
-    cls.add_method('SetRtsCtsThreshold', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+    ## athstats-helper.h (module 'wifi'): static ns3::TypeId ns3::AthstatsWifiTraceSink::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::Open(std::string const & name) [member function]
+    cls.add_method('Open', 
                    'void', 
-                   [param('uint32_t', 'threshold')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortPreambleEnabled(bool enable) [member function]
-    cls.add_method('SetShortPreambleEnabled', 
+                   [param('std::string const &', 'name')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyRxErrorTrace(std::string context, ns3::Ptr<const ns3::Packet> packet, double snr) [member function]
+    cls.add_method('PhyRxErrorTrace', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortSlotTimeEnabled(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeEnabled', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'snr')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyRxOkTrace(std::string context, ns3::Ptr<const ns3::Packet> packet, double snr, ns3::WifiMode mode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('PhyRxOkTrace', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseGreenfieldProtection(bool enable) [member function]
-    cls.add_method('SetUseGreenfieldProtection', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'snr'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyStateTrace(std::string context, ns3::Time start, ns3::Time duration, WifiPhyState state) [member function]
+    cls.add_method('PhyStateTrace', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonErpProtection(bool enable) [member function]
-    cls.add_method('SetUseNonErpProtection', 
+                   [param('std::string', 'context'), param('ns3::Time', 'start'), param('ns3::Time', 'duration'), param('WifiPhyState', 'state')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyTxTrace(std::string context, ns3::Ptr<const ns3::Packet> packet, ns3::WifiMode mode, ns3::WifiPreamble preamble, uint8_t txPower) [member function]
+    cls.add_method('PhyTxTrace', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonHtProtection(bool enable) [member function]
-    cls.add_method('SetUseNonHtProtection', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'txPower')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxDataFailedTrace(std::string context, ns3::Mac48Address address) [member function]
+    cls.add_method('TxDataFailedTrace', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetupMac', 
+                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxFinalDataFailedTrace(std::string context, ns3::Mac48Address address) [member function]
+    cls.add_method('TxFinalDataFailedTrace', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
-                   is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
+                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxFinalRtsFailedTrace(std::string context, ns3::Mac48Address address) [member function]
+    cls.add_method('TxFinalRtsFailedTrace', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
-    cls.add_method('UpdateFragmentationThreshold', 
+                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxRtsFailedTrace(std::string context, ns3::Mac48Address address) [member function]
+    cls.add_method('TxRtsFailedTrace', 
                    'void', 
-                   [])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseGreenfieldForDestination(ns3::Mac48Address dest) const [member function]
-    cls.add_method('UseGreenfieldForDestination', 
+                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
+    return
+
+def register_Ns3AttributeAccessor_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor(ns3::AttributeAccessor const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AttributeAccessor const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('Get', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseLdpcForDestination(ns3::Mac48Address dest) const [member function]
-    cls.add_method('UseLdpcForDestination', 
+                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasGetter() const [member function]
+    cls.add_method('HasGetter', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Mac48Address ns3::WifiRemoteStationManager::GetAddress(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetAggregation(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetAggregation', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasSetter() const [member function]
+    cls.add_method('HasSetter', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetChannelWidth(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetGreenfield', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Set', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetHeSupported', 
+                   [param('ns3::ObjectBase *', 'object', transfer_ownership=False), param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeChecker_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker(ns3::AttributeChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AttributeChecker const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetHtSupported', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
+    cls.add_method('Copy', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
-    cls.add_method('GetMac', 
-                   'ns3::Ptr< ns3::WifiMac >', 
+                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
-    cls.add_method('GetMcsSupported', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint8_t', 'i')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetNMcsSupported', 
-                   'uint8_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNNonErpSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetNNonErpSupported', 
-                   'uint32_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetNSupported', 
-                   'uint8_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNess(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetNess', 
-                   'uint8_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonErpSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
-    cls.add_method('GetNonErpSupported', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint8_t', 'i')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetNumberOfSupportedStreams', 
-                   'uint8_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::CreateValidValue(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('CreateValidValue', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetShortGuardIntervalSupported', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
-    cls.add_method('GetSupported', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint8_t', 'i')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetVhtSupported', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue(ns3::AttributeValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::WifiRemoteStationManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3BlockAckManager_methods(root_module, cls):
+    ## block-ack-manager.h (module 'wifi'): static ns3::TypeId ns3::BlockAckManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedFragmentation(ns3::WifiRemoteStation * station, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
-    cls.add_method('DoNeedFragmentation', 
+                   is_static=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager::BlockAckManager() [constructor]
+    cls.add_constructor([])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const manager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'manager')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreement(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('ExistsAgreement', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRetransmission(ns3::WifiRemoteStation * station, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
-    cls.add_method('DoNeedRetransmission', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreementInState(ns3::Mac48Address recipient, uint8_t tid, ns3::OriginatorBlockAckAgreement::State state) const [member function]
+    cls.add_method('ExistsAgreementInState', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
-    cls.add_method('DoNeedRts', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::OriginatorBlockAckAgreement::State', 'state')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('CreateAgreement', 
+                   'void', 
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('DestroyAgreement', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient, uint16_t startingSeq) [member function]
+    cls.add_method('UpdateAgreement', 
+                   'void', 
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient'), param('uint16_t', 'startingSeq')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::StorePacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('StorePacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('GetBar', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('bool', 'remove', default_value='true'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasPackets() [member function]
+    cls.add_method('HasPackets', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportAmpduTxStatus', 
+                   [])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotAck(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyGotAck', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyMissedAck', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, double rxSnr, double dataSnr, ns3::WifiTxVector const & dataTxVector, size_t index=0) [member function]
+    cls.add_method('NotifyGotBlockAck', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
+                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector const &', 'dataTxVector'), param('size_t', 'index', default_value='0')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('NotifyMissedBlockAck', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DiscardOutstandingMpdus(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('DiscardOutstandingMpdus', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): uint32_t ns3::BlockAckManager::GetNBufferedPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetNBufferedPackets', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementEstablished(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
+    cls.add_method('NotifyAgreementEstablished', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementRejected(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('NotifyAgreementRejected', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementNoReply(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('NotifyAgreementNoReply', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementReset(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('NotifyAgreementReset', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckThreshold(uint8_t nPackets) [member function]
+    cls.add_method('SetBlockAckThreshold', 
+                   'void', 
+                   [param('uint8_t', 'nPackets')])
+    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::BlockAckManager::GetRetransmitQueue() [member function]
+    cls.add_method('GetRetransmitQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetQueue(ns3::Ptr<ns3::WifiMacQueue> const queue) [member function]
+    cls.add_method('SetQueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueue > const', 'queue')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckInactivityCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetBlockAckInactivityCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetBlockDestinationCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetUnblockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetUnblockDestinationCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::SwitchToBlockAckIfNeeded(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
+    cls.add_method('SwitchToBlockAckIfNeeded', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::NeedBarRetransmission(uint8_t tid, ns3::Mac48Address recipient) [member function]
+    cls.add_method('NeedBarRetransmission', 
+                   'bool', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'recipient')])
+    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetRecipientBufferSize(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetRecipientBufferSize', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckManager::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckManager::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetOriginatorStartingSequence(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetOriginatorStartingSequence', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxOkCallback(ns3::BlockAckManager::TxOk callback) [member function]
+    cls.add_method('SetTxOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxFailedCallback(ns3::BlockAckManager::TxFailed callback) [member function]
+    cls.add_method('SetTxFailedCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyDiscardedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyDiscardedMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## block-ack-manager.h (module 'wifi'): ns3::CtrlBAckRequestHeader ns3::BlockAckManager::GetBlockAckReqHeader(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqHeader', 
+                   'ns3::CtrlBAckRequestHeader', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::ScheduleBar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, bool skipIfNoDataQueued=false) [member function]
+    cls.add_method('ScheduleBar', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
     return
 
-def register_Ns3WifiSpectrumPhyInterface_methods(root_module, cls):
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): static ns3::TypeId ns3::WifiSpectrumPhyInterface::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3BooleanChecker_methods(root_module, cls):
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker(ns3::BooleanChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BooleanChecker const &', 'arg0')])
+    return
+
+def register_Ns3BooleanValue_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(ns3::BooleanValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BooleanValue const &', 'arg0')])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(bool value) [constructor]
+    cls.add_constructor([param('bool', 'value')])
+    ## boolean.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::BooleanValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('bool', 'value')])
+    return
+
+def register_Ns3CallbackChecker_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
+    return
+
+def register_Ns3CallbackImplBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<const ns3::CallbackImplBase> other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['void'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned long long'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['double'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['bool'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::WifiSpectrumPhyInterface::WifiSpectrumPhyInterface() [constructor]
-    cls.add_constructor([])
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetSpectrumWifiPhy(ns3::Ptr<ns3::SpectrumWifiPhy> const phy) [member function]
-    cls.add_method('SetSpectrumWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumWifiPhy > const', 'phy')])
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiSpectrumPhyInterface::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
+                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetDevice(ns3::Ptr<ns3::NetDevice> const d) [member function]
-    cls.add_method('SetDevice', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'd')], 
-                   is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetMobility(ns3::Ptr<ns3::MobilityModel> const m) [member function]
-    cls.add_method('SetMobility', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel > const', 'm')], 
-                   is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::WifiSpectrumPhyInterface::GetMobility() [member function]
-    cls.add_method('GetMobility', 
-                   'ns3::Ptr< ns3::MobilityModel >', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetChannel(ns3::Ptr<ns3::SpectrumChannel> const c) [member function]
-    cls.add_method('SetChannel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumChannel > const', 'c')], 
-                   is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<const ns3::SpectrumModel> ns3::WifiSpectrumPhyInterface::GetRxSpectrumModel() const [member function]
-    cls.add_method('GetRxSpectrumModel', 
-                   'ns3::Ptr< ns3::SpectrumModel const >', 
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::AntennaModel> ns3::WifiSpectrumPhyInterface::GetRxAntenna() [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
-    cls.add_method('StartRx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params')], 
-                   is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
+                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3WifiSpectrumSignalParameters_methods(root_module, cls):
-    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::WifiSpectrumSignalParameters() [constructor]
-    cls.add_constructor([])
-    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::WifiSpectrumSignalParameters(ns3::WifiSpectrumSignalParameters const & p) [constructor]
-    cls.add_constructor([param('ns3::WifiSpectrumSignalParameters const &', 'p')])
-    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::Ptr<ns3::SpectrumSignalParameters> ns3::WifiSpectrumSignalParameters::Copy() [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::SpectrumSignalParameters >', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::ppdu [variable]
-    cls.add_instance_attribute('ppdu', 'ns3::Ptr< ns3::WifiPpdu >', is_const=False)
-    return
-
-def register_Ns3WifiTxCurrentModel_methods(root_module, cls):
-    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel::WifiTxCurrentModel(ns3::WifiTxCurrentModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiTxCurrentModel const &', 'arg0')])
-    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel::WifiTxCurrentModel() [constructor]
-    cls.add_constructor([])
-    ## wifi-tx-current-model.h (module 'wifi'): double ns3::WifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
-    cls.add_method('CalcTxCurrent', 
-                   'double', 
-                   [param('double', 'txPowerDbm')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-tx-current-model.h (module 'wifi'): static ns3::TypeId ns3::WifiTxCurrentModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    return
-
-def register_Ns3YansWifiPhy_methods(root_module, cls):
-    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy(ns3::YansWifiPhy const & arg0) [constructor]
-    cls.add_constructor([param('ns3::YansWifiPhy const &', 'arg0')])
-    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy() [constructor]
-    cls.add_constructor([])
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::YansWifiPhy::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::Channel >', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::YansWifiPhy::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannel(ns3::Ptr<ns3::YansWifiChannel> const channel) [member function]
-    cls.add_method('SetChannel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::YansWifiChannel > const', 'channel')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
-    cls.add_method('StartTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
+                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    return
-
-def register_Ns3ZetaRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZetaRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True, template_parameters=['ns3::DataRate'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable::ZetaRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetAlpha() const [member function]
-    cls.add_method('GetAlpha', 
-                   'double', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue(double alpha) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'alpha')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger(uint32_t alpha) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'alpha')])
-    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
+                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    return
-
-def register_Ns3ZipfRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZipfRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable::ZipfRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetN() const [member function]
-    cls.add_method('GetN', 
-                   'uint32_t', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetAlpha() const [member function]
-    cls.add_method('GetAlpha', 
-                   'double', 
+                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue(uint32_t n, double alpha) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('uint32_t', 'n'), param('double', 'alpha')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger(uint32_t n, uint32_t alpha) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'n'), param('uint32_t', 'alpha')])
-    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
+                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   is_static=True, template_parameters=['ns3::HeSigAParameters'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    return
-
-def register_Ns3AarfWifiManager_methods(root_module, cls):
-    ## aarf-wifi-manager.h (module 'wifi'): ns3::AarfWifiManager::AarfWifiManager(ns3::AarfWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AarfWifiManager const &', 'arg0')])
-    ## aarf-wifi-manager.h (module 'wifi'): ns3::AarfWifiManager::AarfWifiManager() [constructor]
-    cls.add_constructor([])
-    ## aarf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AarfWifiManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## aarf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AarfWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3AarfcdWifiManager_methods(root_module, cls):
-    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::AarfcdWifiManager::AarfcdWifiManager(ns3::AarfcdWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AarfcdWifiManager const &', 'arg0')])
-    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::AarfcdWifiManager::AarfcdWifiManager() [constructor]
-    cls.add_constructor([])
-    ## aarfcd-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AarfcdWifiManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AarfcdWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfcdWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfcdWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumPhy const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): bool ns3::AarfcdWifiManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
-    cls.add_method('DoNeedRts', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['int'], visibility='protected')
     return
 
-def register_Ns3AmpduSubframeHeader_methods(root_module, cls):
-    ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader::AmpduSubframeHeader(ns3::AmpduSubframeHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AmpduSubframeHeader const &', 'arg0')])
-    ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader::AmpduSubframeHeader() [constructor]
+def register_Ns3CallbackValue_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
     cls.add_constructor([])
-    ## ampdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmpduSubframeHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## ampdu-subframe-header.h (module 'wifi'): bool ns3::AmpduSubframeHeader::GetEof() const [member function]
-    cls.add_method('GetEof', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ampdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmpduSubframeHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ampdu-subframe-header.h (module 'wifi'): uint16_t ns3::AmpduSubframeHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## ampdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmpduSubframeHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ampdu-subframe-header.h (module 'wifi'): static ns3::TypeId ns3::AmpduSubframeHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## ampdu-subframe-header.h (module 'wifi'): bool ns3::AmpduSubframeHeader::IsSignatureValid() const [member function]
-    cls.add_method('IsSignatureValid', 
+    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetEof(bool eof) [member function]
-    cls.add_method('SetEof', 
-                   'void', 
-                   [param('bool', 'eof')])
-    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
+    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('uint16_t', 'length')])
+                   [param('ns3::CallbackBase', 'base')])
     return
 
-def register_Ns3AmrrWifiManager_methods(root_module, cls):
-    ## amrr-wifi-manager.h (module 'wifi'): ns3::AmrrWifiManager::AmrrWifiManager(ns3::AmrrWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AmrrWifiManager const &', 'arg0')])
-    ## amrr-wifi-manager.h (module 'wifi'): ns3::AmrrWifiManager::AmrrWifiManager() [constructor]
+def register_Ns3CaraWifiManager_methods(root_module, cls):
+    ## cara-wifi-manager.h (module 'wifi'): ns3::CaraWifiManager::CaraWifiManager(ns3::CaraWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CaraWifiManager const &', 'arg0')])
+    ## cara-wifi-manager.h (module 'wifi'): ns3::CaraWifiManager::CaraWifiManager() [constructor]
     cls.add_constructor([])
-    ## amrr-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AmrrWifiManager::GetTypeId() [member function]
+    ## cara-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::CaraWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## amrr-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AmrrWifiManager::DoCreateStation() const [member function]
+    ## cara-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::CaraWifiManager::DoCreateStation() const [member function]
     cls.add_method('DoCreateStation', 
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AmrrWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::CaraWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoGetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AmrrWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::CaraWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoGetRtsTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoInitialize() [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): bool ns3::CaraWifiManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
+    cls.add_method('DoNeedRts', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportDataFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
     cls.add_method('DoReportDataOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportFinalDataFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportRtsFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
     cls.add_method('DoReportRtsOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
     cls.add_method('DoReportRxOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3AmsduSubframeHeader_methods(root_module, cls):
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader(ns3::AmsduSubframeHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AmsduSubframeHeader const &', 'arg0')])
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader() [constructor]
+def register_Ns3Channel_methods(root_module, cls):
+    ## channel.h (module 'network'): ns3::Channel::Channel(ns3::Channel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Channel const &', 'arg0')])
+    ## channel.h (module 'network'): ns3::Channel::Channel() [constructor]
     cls.add_constructor([])
-    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
+    ## channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Channel::GetDevice(std::size_t i) const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## channel.h (module 'network'): uint32_t ns3::Channel::GetId() const [member function]
+    cls.add_method('GetId', 
                    'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetDestinationAddr() const [member function]
-    cls.add_method('GetDestinationAddr', 
-                   'ns3::Mac48Address', 
                    [], 
                    is_const=True)
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmsduSubframeHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
+    ## channel.h (module 'network'): std::size_t ns3::Channel::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## channel.h (module 'network'): static ns3::TypeId ns3::Channel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): uint16_t ns3::AmsduSubframeHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
+                   is_static=True)
+    return
+
+def register_Ns3ChannelAccessManager_methods(root_module, cls):
+    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager(ns3::ChannelAccessManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelAccessManager const &', 'arg0')])
+    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager() [constructor]
+    cls.add_constructor([])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::Add(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetAccessGrantStart(bool ignoreNav=false) const [member function]
+    cls.add_method('GetAccessGrantStart', 
+                   'ns3::Time', 
+                   [param('bool', 'ignoreNav', default_value='false')], 
+                   is_const=True)
+    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::IsBusy() const [member function]
+    cls.add_method('IsBusy', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
+    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::NeedBackoffUponAccess(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('NeedBackoffUponAccess', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutResetNow() [member function]
+    cls.add_method('NotifyAckTimeoutResetNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyAckTimeoutStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutResetNow() [member function]
+    cls.add_method('NotifyCtsTimeoutResetNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyCtsTimeoutStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyMaybeCcaBusyStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyMaybeCcaBusyStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavResetNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyNavResetNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyNavStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOffNow() [member function]
+    cls.add_method('NotifyOffNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOnNow() [member function]
+    cls.add_method('NotifyOnNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndErrorNow() [member function]
+    cls.add_method('NotifyRxEndErrorNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndOkNow() [member function]
+    cls.add_method('NotifyRxEndOkNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyRxStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySleepNow() [member function]
+    cls.add_method('NotifySleepNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyTxStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyTxStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyWakeupNow() [member function]
+    cls.add_method('NotifyWakeupNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RemovePhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('RemovePhyListener', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RequestAccess(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('RequestAccess', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupFrameExchangeManager(ns3::Ptr<ns3::FrameExchangeManager> feManager) [member function]
+    cls.add_method('SetupFrameExchangeManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::FrameExchangeManager >', 'feManager')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupPhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetupPhyListener', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetSourceAddr() const [member function]
-    cls.add_method('GetSourceAddr', 
-                   'ns3::Mac48Address', 
+                   is_virtual=True, visibility='protected')
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetEifsNoDifs() const [member function]
+    cls.add_method('GetEifsNoDifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSifs() const [member function]
+    cls.add_method('GetSifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSlot() const [member function]
+    cls.add_method('GetSlot', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ChannelCondition_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::ChannelCondition(ns3::ChannelCondition const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelCondition const &', 'arg0')])
+    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::ChannelCondition() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::ChannelCondition(ns3::ChannelCondition::LosConditionValue losCondition, ns3::ChannelCondition::O2iConditionValue o2iCondition=::ns3::ChannelCondition::O2iConditionValue::O2O) [constructor]
+    cls.add_constructor([param('ns3::ChannelCondition::LosConditionValue', 'losCondition'), param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition', default_value='::ns3::ChannelCondition::O2iConditionValue::O2O')])
+    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::LosConditionValue ns3::ChannelCondition::GetLosCondition() const [member function]
+    cls.add_method('GetLosCondition', 
+                   'ns3::ChannelCondition::LosConditionValue', 
                    [], 
                    is_const=True)
-    ## amsdu-subframe-header.h (module 'wifi'): static ns3::TypeId ns3::AmsduSubframeHeader::GetTypeId() [member function]
+    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::O2iConditionValue ns3::ChannelCondition::GetO2iCondition() const [member function]
+    cls.add_method('GetO2iCondition', 
+                   'ns3::ChannelCondition::O2iConditionValue', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ChannelCondition::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::Ptr<const ns3::ChannelCondition> otherCondition) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ChannelCondition const >', 'otherCondition')], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsI2i() const [member function]
+    cls.add_method('IsI2i', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsLos() const [member function]
+    cls.add_method('IsLos', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsNlos() const [member function]
+    cls.add_method('IsNlos', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsNlosv() const [member function]
+    cls.add_method('IsNlosv', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsO2i() const [member function]
+    cls.add_method('IsO2i', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsO2o() const [member function]
+    cls.add_method('IsO2o', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): void ns3::ChannelCondition::SetLosCondition(ns3::ChannelCondition::LosConditionValue losCondition) [member function]
+    cls.add_method('SetLosCondition', 
+                   'void', 
+                   [param('ns3::ChannelCondition::LosConditionValue', 'losCondition')])
+    ## channel-condition-model.h (module 'propagation'): void ns3::ChannelCondition::SetO2iCondition(ns3::ChannelCondition::O2iConditionValue o2iCondition) [member function]
+    cls.add_method('SetO2iCondition', 
+                   'void', 
+                   [param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition')])
+    return
+
+def register_Ns3ChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::ChannelConditionModel::ChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::ChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetChannelCondition', 
+                   'ns3::Ptr< ns3::ChannelCondition >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## channel-condition-model.h (module 'propagation'): int64_t ns3::ChannelConditionModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3ConstantObssPdAlgorithm_methods(root_module, cls):
+    ## constant-obss-pd-algorithm.h (module 'wifi'): ns3::ConstantObssPdAlgorithm::ConstantObssPdAlgorithm(ns3::ConstantObssPdAlgorithm const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ConstantObssPdAlgorithm const &', 'arg0')])
+    ## constant-obss-pd-algorithm.h (module 'wifi'): ns3::ConstantObssPdAlgorithm::ConstantObssPdAlgorithm() [constructor]
+    cls.add_constructor([])
+    ## constant-obss-pd-algorithm.h (module 'wifi'): void ns3::ConstantObssPdAlgorithm::ConnectWifiNetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
+    cls.add_method('ConnectWifiNetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')], 
+                   is_virtual=True)
+    ## constant-obss-pd-algorithm.h (module 'wifi'): static ns3::TypeId ns3::ConstantObssPdAlgorithm::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetDestinationAddr(ns3::Mac48Address to) [member function]
-    cls.add_method('SetDestinationAddr', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'to')])
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetSourceAddr(ns3::Mac48Address to) [member function]
-    cls.add_method('SetSourceAddr', 
+    ## constant-obss-pd-algorithm.h (module 'wifi'): void ns3::ConstantObssPdAlgorithm::ReceiveHeSigA(ns3::HeSigAParameters params) [member function]
+    cls.add_method('ReceiveHeSigA', 
                    'void', 
-                   [param('ns3::Mac48Address', 'to')])
+                   [param('ns3::HeSigAParameters', 'params')], 
+                   is_virtual=True)
     return
 
-def register_Ns3AntennaModel_methods(root_module, cls):
-    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel(ns3::AntennaModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AntennaModel const &', 'arg0')])
-    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel() [constructor]
-    cls.add_constructor([])
-    ## antenna-model.h (module 'antenna'): double ns3::AntennaModel::GetGainDb(ns3::Angles a) [member function]
-    cls.add_method('GetGainDb', 
-                   'double', 
-                   [param('ns3::Angles', 'a')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## antenna-model.h (module 'antenna'): static ns3::TypeId ns3::AntennaModel::GetTypeId() [member function]
+def register_Ns3ConstantRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ConstantRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable::ConstantRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetConstant() const [member function]
+    cls.add_method('GetConstant', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue(double constant) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'constant')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger(uint32_t constant) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'constant')])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
     return
 
-def register_Ns3AparfWifiManager_methods(root_module, cls):
-    ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager::AparfWifiManager(ns3::AparfWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AparfWifiManager const &', 'arg0')])
-    ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager::AparfWifiManager() [constructor]
+def register_Ns3ConstantRateWifiManager_methods(root_module, cls):
+    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::ConstantRateWifiManager::ConstantRateWifiManager(ns3::ConstantRateWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ConstantRateWifiManager const &', 'arg0')])
+    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::ConstantRateWifiManager::ConstantRateWifiManager() [constructor]
     cls.add_constructor([])
-    ## aparf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AparfWifiManager::GetTypeId() [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ConstantRateWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## aparf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AparfWifiManager::DoCreateStation() const [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ConstantRateWifiManager::DoCreateStation() const [member function]
     cls.add_method('DoCreateStation', 
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AparfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ConstantRateWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoGetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AparfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ConstantRateWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoGetRtsTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportDataFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
     cls.add_method('DoReportDataOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportFinalDataFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportRtsFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
     cls.add_method('DoReportRtsOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
     cls.add_method('DoReportRxOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3ArfWifiManager_methods(root_module, cls):
-    ## arf-wifi-manager.h (module 'wifi'): ns3::ArfWifiManager::ArfWifiManager(ns3::ArfWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ArfWifiManager const &', 'arg0')])
-    ## arf-wifi-manager.h (module 'wifi'): ns3::ArfWifiManager::ArfWifiManager() [constructor]
+def register_Ns3ConstantSpeedPropagationDelayModel_methods(root_module, cls):
+    ## propagation-delay-model.h (module 'propagation'): ns3::ConstantSpeedPropagationDelayModel::ConstantSpeedPropagationDelayModel(ns3::ConstantSpeedPropagationDelayModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ConstantSpeedPropagationDelayModel const &', 'arg0')])
+    ## propagation-delay-model.h (module 'propagation'): ns3::ConstantSpeedPropagationDelayModel::ConstantSpeedPropagationDelayModel() [constructor]
     cls.add_constructor([])
-    ## arf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ArfWifiManager::GetTypeId() [member function]
+    ## propagation-delay-model.h (module 'propagation'): ns3::Time ns3::ConstantSpeedPropagationDelayModel::GetDelay(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetDelay', 
+                   'ns3::Time', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True)
+    ## propagation-delay-model.h (module 'propagation'): double ns3::ConstantSpeedPropagationDelayModel::GetSpeed() const [member function]
+    cls.add_method('GetSpeed', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## propagation-delay-model.h (module 'propagation'): static ns3::TypeId ns3::ConstantSpeedPropagationDelayModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## arf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ArfWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ArfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ArfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
+    ## propagation-delay-model.h (module 'propagation'): void ns3::ConstantSpeedPropagationDelayModel::SetSpeed(double speed) [member function]
+    cls.add_method('SetSpeed', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   [param('double', 'speed')])
+    ## propagation-delay-model.h (module 'propagation'): int64_t ns3::ConstantSpeedPropagationDelayModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
                    is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
+    return
+
+def register_Ns3Cost231PropagationLossModel_methods(root_module, cls):
+    ## cost231-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::Cost231PropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## cost231-propagation-loss-model.h (module 'propagation'): ns3::Cost231PropagationLossModel::Cost231PropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetLoss', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True)
+    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetBSAntennaHeight(double height) [member function]
+    cls.add_method('SetBSAntennaHeight', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
+                   [param('double', 'height')])
+    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetSSAntennaHeight(double height) [member function]
+    cls.add_method('SetSSAntennaHeight', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+                   [param('double', 'height')])
+    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetLambda(double lambda) [member function]
+    cls.add_method('SetLambda', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('double', 'lambda')])
+    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetLambda(double frequency, double speed) [member function]
+    cls.add_method('SetLambda', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('double', 'frequency'), param('double', 'speed')])
+    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetMinDistance(double minDistance) [member function]
+    cls.add_method('SetMinDistance', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('double', 'minDistance')])
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetBSAntennaHeight() const [member function]
+    cls.add_method('GetBSAntennaHeight', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetSSAntennaHeight() const [member function]
+    cls.add_method('GetSSAntennaHeight', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetMinDistance() const [member function]
+    cls.add_method('GetMinDistance', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetLambda() const [member function]
+    cls.add_method('GetLambda', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetShadowing() [member function]
+    cls.add_method('GetShadowing', 
+                   'double', 
+                   [])
+    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetShadowing(double shadowing) [member function]
+    cls.add_method('SetShadowing', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   [param('double', 'shadowing')])
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## cost231-propagation-loss-model.h (module 'propagation'): int64_t ns3::Cost231PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3AthstatsWifiTraceSink_methods(root_module, cls):
-    ## athstats-helper.h (module 'wifi'): ns3::AthstatsWifiTraceSink::AthstatsWifiTraceSink(ns3::AthstatsWifiTraceSink const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AthstatsWifiTraceSink const &', 'arg0')])
-    ## athstats-helper.h (module 'wifi'): ns3::AthstatsWifiTraceSink::AthstatsWifiTraceSink() [constructor]
+def register_Ns3CtrlBAckRequestHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader(ns3::CtrlBAckRequestHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlBAckRequestHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader() [constructor]
     cls.add_constructor([])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::DevRxTrace(std::string context, ns3::Ptr<const ns3::Packet> p) [member function]
-    cls.add_method('DevRxTrace', 
-                   'void', 
-                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::DevTxTrace(std::string context, ns3::Ptr<const ns3::Packet> p) [member function]
-    cls.add_method('DevTxTrace', 
-                   'void', 
-                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## athstats-helper.h (module 'wifi'): static ns3::TypeId ns3::AthstatsWifiTraceSink::GetTypeId() [member function]
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckRequestHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequence() const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequenceControl() const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckRequestHeader::GetTidInfo() const [member function]
+    cls.add_method('GetTidInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckReqType ns3::CtrlBAckRequestHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::BlockAckReqType', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckRequestHeader::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::Open(std::string const & name) [member function]
-    cls.add_method('Open', 
-                   'void', 
-                   [param('std::string const &', 'name')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyRxErrorTrace(std::string context, ns3::Ptr<const ns3::Packet> packet, double snr) [member function]
-    cls.add_method('PhyRxErrorTrace', 
-                   'void', 
-                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'snr')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyRxOkTrace(std::string context, ns3::Ptr<const ns3::Packet> packet, double snr, ns3::WifiMode mode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('PhyRxOkTrace', 
-                   'void', 
-                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'snr'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyStateTrace(std::string context, ns3::Time start, ns3::Time duration, WifiPhyState state) [member function]
-    cls.add_method('PhyStateTrace', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsCompressed() const [member function]
+    cls.add_method('IsCompressed', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsExtendedCompressed() const [member function]
+    cls.add_method('IsExtendedCompressed', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsMultiTid() const [member function]
+    cls.add_method('IsMultiTid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::MustSendHtImmediateAck() const [member function]
+    cls.add_method('MustSendHtImmediateAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('std::string', 'context'), param('ns3::Time', 'start'), param('ns3::Time', 'duration'), param('WifiPhyState', 'state')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyTxTrace(std::string context, ns3::Ptr<const ns3::Packet> packet, ns3::WifiMode mode, ns3::WifiPreamble preamble, uint8_t txPower) [member function]
-    cls.add_method('PhyTxTrace', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'txPower')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxDataFailedTrace(std::string context, ns3::Mac48Address address) [member function]
-    cls.add_method('TxDataFailedTrace', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetHtImmediateAck(bool immediateAck) [member function]
+    cls.add_method('SetHtImmediateAck', 
                    'void', 
-                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxFinalDataFailedTrace(std::string context, ns3::Mac48Address address) [member function]
-    cls.add_method('TxFinalDataFailedTrace', 
+                   [param('bool', 'immediateAck')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetStartingSequence(uint16_t seq) [member function]
+    cls.add_method('SetStartingSequence', 
                    'void', 
-                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxFinalRtsFailedTrace(std::string context, ns3::Mac48Address address) [member function]
-    cls.add_method('TxFinalRtsFailedTrace', 
+                   [param('uint16_t', 'seq')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetTidInfo(uint8_t tid) [member function]
+    cls.add_method('SetTidInfo', 
                    'void', 
-                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxRtsFailedTrace(std::string context, ns3::Mac48Address address) [member function]
-    cls.add_method('TxRtsFailedTrace', 
+                   [param('uint8_t', 'tid')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetType(ns3::BlockAckReqType type) [member function]
+    cls.add_method('SetType', 
                    'void', 
-                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
+                   [param('ns3::BlockAckReqType', 'type')])
     return
 
-def register_Ns3AttributeAccessor_methods(root_module, cls):
-    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor(ns3::AttributeAccessor const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AttributeAccessor const &', 'arg0')])
-    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor() [constructor]
+def register_Ns3CtrlBAckResponseHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader(ns3::CtrlBAckResponseHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlBAckResponseHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader() [constructor]
     cls.add_constructor([])
-    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
-    cls.add_method('Get', 
-                   'bool', 
-                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasGetter() const [member function]
-    cls.add_method('HasGetter', 
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned int, std::allocator<unsigned int> > ns3::CtrlBAckResponseHeader::FindPerAidTidInfoWithAid(uint16_t aid) const [member function]
+    cls.add_method('FindPerAidTidInfoWithAid', 
+                   'std::vector< unsigned int >', 
+                   [param('uint16_t', 'aid')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::GetAckType(std::size_t index) const [member function]
+    cls.add_method('GetAckType', 
                    'bool', 
+                   [param('std::size_t', 'index')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetAid11(std::size_t index) const [member function]
+    cls.add_method('GetAid11', 
+                   'uint16_t', 
+                   [param('std::size_t', 'index')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned char, std::allocator<unsigned char> > const & ns3::CtrlBAckResponseHeader::GetBitmap(std::size_t index=0) const [member function]
+    cls.add_method('GetBitmap', 
+                   'std::vector< unsigned char > const &', 
+                   [param('std::size_t', 'index', default_value='0')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckResponseHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasSetter() const [member function]
-    cls.add_method('HasSetter', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): std::size_t ns3::CtrlBAckResponseHeader::GetNPerAidTidInfoSubfields() const [member function]
+    cls.add_method('GetNPerAidTidInfoSubfields', 
+                   'std::size_t', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
-    cls.add_method('Set', 
-                   'bool', 
-                   [param('ns3::ObjectBase *', 'object', transfer_ownership=False), param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3AttributeChecker_methods(root_module, cls):
-    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker(ns3::AttributeChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AttributeChecker const &', 'arg0')])
-    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker() [constructor]
-    cls.add_constructor([])
-    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
-    cls.add_method('Check', 
-                   'bool', 
-                   [param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
-    cls.add_method('Copy', 
-                   'bool', 
-                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::Create() const [member function]
-    cls.add_method('Create', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::CreateValidValue(ns3::AttributeValue const & value) const [member function]
-    cls.add_method('CreateValidValue', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequence(std::size_t index=0) const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [param('std::size_t', 'index', default_value='0')], 
                    is_const=True)
-    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetUnderlyingTypeInformation() const [member function]
-    cls.add_method('GetUnderlyingTypeInformation', 
-                   'std::string', 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequenceControl(std::size_t index=0) const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
+                   [param('std::size_t', 'index', default_value='0')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckResponseHeader::GetTidInfo(std::size_t index=0) const [member function]
+    cls.add_method('GetTidInfo', 
+                   'uint8_t', 
+                   [param('std::size_t', 'index', default_value='0')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType ns3::CtrlBAckResponseHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::BlockAckType', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetValueTypeName() const [member function]
-    cls.add_method('GetValueTypeName', 
-                   'std::string', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckResponseHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::AttributeChecker::HasUnderlyingTypeInformation() const [member function]
-    cls.add_method('HasUnderlyingTypeInformation', 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::Mac48Address ns3::CtrlBAckResponseHeader::GetUnassociatedStaAddress(std::size_t index) const [member function]
+    cls.add_method('GetUnassociatedStaAddress', 
+                   'ns3::Mac48Address', 
+                   [param('std::size_t', 'index')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
                    'bool', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3AttributeValue_methods(root_module, cls):
-    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue(ns3::AttributeValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AttributeValue const &', 'arg0')])
-    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue() [constructor]
-    cls.add_constructor([])
-    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsCompressed() const [member function]
+    cls.add_method('IsCompressed', 
+                   'bool', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsExtendedCompressed() const [member function]
+    cls.add_method('IsExtendedCompressed', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsFragmentReceived(uint16_t seq, uint8_t frag) const [member function]
+    cls.add_method('IsFragmentReceived', 
+                   'bool', 
+                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsMultiSta() const [member function]
+    cls.add_method('IsMultiSta', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3BlockAckManager_methods(root_module, cls):
-    ## block-ack-manager.h (module 'wifi'): static ns3::TypeId ns3::BlockAckManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager::BlockAckManager() [constructor]
-    cls.add_constructor([])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const manager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'manager')])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreement(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('ExistsAgreement', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsMultiTid() const [member function]
+    cls.add_method('IsMultiTid', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   [], 
                    is_const=True)
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreementInState(ns3::Mac48Address recipient, uint8_t tid, ns3::OriginatorBlockAckAgreement::State state) const [member function]
-    cls.add_method('ExistsAgreementInState', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsPacketReceived(uint16_t seq, std::size_t index=0) const [member function]
+    cls.add_method('IsPacketReceived', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::OriginatorBlockAckAgreement::State', 'state')], 
+                   [param('uint16_t', 'seq'), param('std::size_t', 'index', default_value='0')], 
                    is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient) [member function]
-    cls.add_method('CreateAgreement', 
-                   'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('DestroyAgreement', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
-    cls.add_method('UpdateAgreement', 
-                   'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::StorePacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('StorePacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true) [member function]
-    cls.add_method('GetBar', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('bool', 'remove', default_value='true')])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasPackets() [member function]
-    cls.add_method('HasPackets', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::MustSendHtImmediateAck() const [member function]
+    cls.add_method('MustSendHtImmediateAck', 
                    'bool', 
-                   [])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotAck(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyGotAck', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyMissedAck', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('NotifyGotBlockAck', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyMissedBlockAck', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DiscardOutstandingMpdus(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('DiscardOutstandingMpdus', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::ResetBitmap(std::size_t index=0) [member function]
+    cls.add_method('ResetBitmap', 
                    'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): uint32_t ns3::BlockAckManager::GetNBufferedPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetNBufferedPackets', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementEstablished(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
-    cls.add_method('NotifyAgreementEstablished', 
+                   [param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementRejected(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyAgreementRejected', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetAckType(bool type, std::size_t index) [member function]
+    cls.add_method('SetAckType', 
                    'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementNoReply(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyAgreementNoReply', 
+                   [param('bool', 'type'), param('std::size_t', 'index')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetAid11(uint16_t aid, std::size_t index) [member function]
+    cls.add_method('SetAid11', 
                    'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementReset(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyAgreementReset', 
+                   [param('uint16_t', 'aid'), param('std::size_t', 'index')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immediateAck) [member function]
+    cls.add_method('SetHtImmediateAck', 
                    'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckThreshold(uint8_t nPackets) [member function]
-    cls.add_method('SetBlockAckThreshold', 
+                   [param('bool', 'immediateAck')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedFragment(uint16_t seq, uint8_t frag) [member function]
+    cls.add_method('SetReceivedFragment', 
                    'void', 
-                   [param('uint8_t', 'nPackets')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::BlockAckManager::GetRetransmitQueue() [member function]
-    cls.add_method('GetRetransmitQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
-                   [])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetQueue(ns3::Ptr<ns3::WifiMacQueue> const queue) [member function]
-    cls.add_method('SetQueue', 
+                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedPacket(uint16_t seq, std::size_t index=0) [member function]
+    cls.add_method('SetReceivedPacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueue > const', 'queue')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
-    cls.add_method('SetTxMiddle', 
+                   [param('uint16_t', 'seq'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequence(uint16_t seq, std::size_t index=0) [member function]
+    cls.add_method('SetStartingSequence', 
                    'void', 
-                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckType(ns3::BlockAckType bAckType) [member function]
-    cls.add_method('SetBlockAckType', 
+                   [param('uint16_t', 'seq'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequenceControl(uint16_t seqControl, std::size_t index=0) [member function]
+    cls.add_method('SetStartingSequenceControl', 
                    'void', 
-                   [param('ns3::BlockAckType', 'bAckType')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckInactivityCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetBlockAckInactivityCallback', 
+                   [param('uint16_t', 'seqControl'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetTidInfo(uint8_t tid, std::size_t index=0) [member function]
+    cls.add_method('SetTidInfo', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetBlockDestinationCallback', 
+                   [param('uint8_t', 'tid'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetType(ns3::BlockAckType type) [member function]
+    cls.add_method('SetType', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetUnblockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetUnblockDestinationCallback', 
+                   [param('ns3::BlockAckType', 'type')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetUnassociatedStaAddress(ns3::Mac48Address const & ra, std::size_t index) [member function]
+    cls.add_method('SetUnassociatedStaAddress', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::SwitchToBlockAckIfNeeded(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
-    cls.add_method('SwitchToBlockAckIfNeeded', 
+                   [param('ns3::Mac48Address const &', 'ra'), param('std::size_t', 'index')])
+    return
+
+def register_Ns3CtrlTriggerHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::CtrlTriggerHeader(ns3::CtrlTriggerHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlTriggerHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::CtrlTriggerHeader() [constructor]
+    cls.add_constructor([])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::CtrlTriggerHeader(ns3::TriggerFrameType type, ns3::WifiTxVector const & txVector) [constructor]
+    cls.add_constructor([param('ns3::TriggerFrameType', 'type'), param('ns3::WifiTxVector const &', 'txVector')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField & ns3::CtrlTriggerHeader::AddUserInfoField() [member function]
+    cls.add_method('AddUserInfoField', 
+                   'ns3::CtrlTriggerUserInfoField &', 
+                   [])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField & ns3::CtrlTriggerHeader::AddUserInfoField(ns3::CtrlTriggerUserInfoField const & userInfo) [member function]
+    cls.add_method('AddUserInfoField', 
+                   'ns3::CtrlTriggerUserInfoField &', 
+                   [param('ns3::CtrlTriggerUserInfoField const &', 'userInfo')])
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlTriggerHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithAid(ns3::CtrlTriggerHeader::ConstIterator start, uint16_t aid12) const [member function]
+    cls.add_method('FindUserInfoWithAid', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'start'), param('uint16_t', 'aid12')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithAid(uint16_t aid12) const [member function]
+    cls.add_method('FindUserInfoWithAid', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('uint16_t', 'aid12')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuAssociated(ns3::CtrlTriggerHeader::ConstIterator start) const [member function]
+    cls.add_method('FindUserInfoWithRaRuAssociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'start')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuAssociated() const [member function]
+    cls.add_method('FindUserInfoWithRaRuAssociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuUnassociated(ns3::CtrlTriggerHeader::ConstIterator start) const [member function]
+    cls.add_method('FindUserInfoWithRaRuUnassociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'start')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuUnassociated() const [member function]
+    cls.add_method('FindUserInfoWithRaRuUnassociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): int8_t ns3::CtrlTriggerHeader::GetApTxPower() const [member function]
+    cls.add_method('GetApTxPower', 
+                   'int8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader ns3::CtrlTriggerHeader::GetCommonInfoField() const [member function]
+    cls.add_method('GetCommonInfoField', 
+                   'ns3::CtrlTriggerHeader', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::GetCsRequired() const [member function]
+    cls.add_method('GetCsRequired', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::NeedBarRetransmission(uint8_t tid, ns3::Mac48Address recipient) [member function]
-    cls.add_method('NeedBarRetransmission', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::WifiTxVector ns3::CtrlTriggerHeader::GetHeTbTxVector(uint16_t staId) const [member function]
+    cls.add_method('GetHeTbTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlTriggerHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerHeader::GetLtfType() const [member function]
+    cls.add_method('GetLtfType', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::GetMoreTF() const [member function]
+    cls.add_method('GetMoreTF', 
                    'bool', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'recipient')])
-    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetRecipientBufferSize(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetRecipientBufferSize', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): std::size_t ns3::CtrlTriggerHeader::GetNUserInfoFields() const [member function]
+    cls.add_method('GetNUserInfoFields', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlTriggerHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType ns3::CtrlTriggerHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::TriggerFrameType', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlTriggerHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): char const * ns3::CtrlTriggerHeader::GetTypeString() const [member function]
+    cls.add_method('GetTypeString', 
+                   'char const *', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static char const * ns3::CtrlTriggerHeader::GetTypeString(ns3::TriggerFrameType type) [member function]
+    cls.add_method('GetTypeString', 
+                   'char const *', 
+                   [param('ns3::TriggerFrameType', 'type')], 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetUlBandwidth() const [member function]
+    cls.add_method('GetUlBandwidth', 
                    'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   [], 
                    is_const=True)
-    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetOriginatorStartingSequence(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetOriginatorStartingSequence', 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetUlLength() const [member function]
+    cls.add_method('GetUlLength', 
                    'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   [], 
                    is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxOkCallback(ns3::BlockAckManager::TxOk callback) [member function]
-    cls.add_method('SetTxOkCallback', 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetUlSpatialReuse() const [member function]
+    cls.add_method('GetUlSpatialReuse', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBfrp() const [member function]
+    cls.add_method('IsBfrp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBqrp() const [member function]
+    cls.add_method('IsBqrp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBsrp() const [member function]
+    cls.add_method('IsBsrp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsGcrMuBar() const [member function]
+    cls.add_method('IsGcrMuBar', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsMuBar() const [member function]
+    cls.add_method('IsMuBar', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsMuRts() const [member function]
+    cls.add_method('IsMuRts', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsNfrp() const [member function]
+    cls.add_method('IsNfrp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsValid() const [member function]
+    cls.add_method('IsValid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxFailedCallback(ns3::BlockAckManager::TxFailed callback) [member function]
-    cls.add_method('SetTxFailedCallback', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyDiscardedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyDiscardedMpdu', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetApTxPower(int8_t power) [member function]
+    cls.add_method('SetApTxPower', 
+                   'void', 
+                   [param('int8_t', 'power')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetCsRequired(bool cs) [member function]
+    cls.add_method('SetCsRequired', 
+                   'void', 
+                   [param('bool', 'cs')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetGiAndLtfType(uint16_t guardInterval, uint8_t ltfType) [member function]
+    cls.add_method('SetGiAndLtfType', 
+                   'void', 
+                   [param('uint16_t', 'guardInterval'), param('uint8_t', 'ltfType')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetMoreTF(bool more) [member function]
+    cls.add_method('SetMoreTF', 
+                   'void', 
+                   [param('bool', 'more')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetType(ns3::TriggerFrameType type) [member function]
+    cls.add_method('SetType', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): ns3::CtrlBAckRequestHeader ns3::BlockAckManager::GetBlockAckReqHeader(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetBlockAckReqHeader', 
-                   'ns3::CtrlBAckRequestHeader', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::ScheduleBar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, bool skipIfNoDataQueued=false) [member function]
-    cls.add_method('ScheduleBar', 
+                   [param('ns3::TriggerFrameType', 'type')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetUlBandwidth(uint16_t bw) [member function]
+    cls.add_method('SetUlBandwidth', 
+                   'void', 
+                   [param('uint16_t', 'bw')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetUlLength(uint16_t len) [member function]
+    cls.add_method('SetUlLength', 
+                   'void', 
+                   [param('uint16_t', 'len')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetUlSpatialReuse(uint16_t sr) [member function]
+    cls.add_method('SetUlSpatialReuse', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
+                   [param('uint16_t', 'sr')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::Iterator ns3::CtrlTriggerHeader::begin() [member function]
+    cls.add_method('begin', 
+                   'ns3::CtrlTriggerHeader::Iterator', 
+                   [])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::Iterator ns3::CtrlTriggerHeader::end() [member function]
+    cls.add_method('end', 
+                   'ns3::CtrlTriggerHeader::Iterator', 
+                   [])
     return
 
-def register_Ns3BooleanChecker_methods(root_module, cls):
-    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker() [constructor]
+def register_Ns3DataRateChecker_methods(root_module, cls):
+    ## data-rate.h (module 'network'): ns3::DataRateChecker::DataRateChecker() [constructor]
     cls.add_constructor([])
-    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker(ns3::BooleanChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BooleanChecker const &', 'arg0')])
+    ## data-rate.h (module 'network'): ns3::DataRateChecker::DataRateChecker(ns3::DataRateChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DataRateChecker const &', 'arg0')])
     return
 
-def register_Ns3BooleanValue_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(ns3::BooleanValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BooleanValue const &', 'arg0')])
-    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue() [constructor]
+def register_Ns3DataRateValue_methods(root_module, cls):
+    ## data-rate.h (module 'network'): ns3::DataRateValue::DataRateValue() [constructor]
     cls.add_constructor([])
-    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(bool value) [constructor]
-    cls.add_constructor([param('bool', 'value')])
-    ## boolean.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::BooleanValue::Copy() const [member function]
+    ## data-rate.h (module 'network'): ns3::DataRateValue::DataRateValue(ns3::DataRate const & value) [constructor]
+    cls.add_constructor([param('ns3::DataRate const &', 'value')])
+    ## data-rate.h (module 'network'): ns3::DataRateValue::DataRateValue(ns3::DataRateValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DataRateValue const &', 'arg0')])
+    ## data-rate.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::DataRateValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    ## data-rate.h (module 'network'): bool ns3::DataRateValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
+    ## data-rate.h (module 'network'): ns3::DataRate ns3::DataRateValue::Get() const [member function]
     cls.add_method('Get', 
-                   'bool', 
+                   'ns3::DataRate', 
                    [], 
                    is_const=True)
-    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    ## data-rate.h (module 'network'): std::string ns3::DataRateValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
+    ## data-rate.h (module 'network'): void ns3::DataRateValue::Set(ns3::DataRate const & value) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('bool', 'value')])
+                   [param('ns3::DataRate const &', 'value')])
     return
 
-def register_Ns3CallbackChecker_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
+def register_Ns3DeterministicRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::DeterministicRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable::DeterministicRandomVariable() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
+    ## random-variable-stream.h (module 'core'): void ns3::DeterministicRandomVariable::SetValueArray(double * values, std::size_t length) [member function]
+    cls.add_method('SetValueArray', 
+                   'void', 
+                   [param('double *', 'values'), param('std::size_t', 'length')])
+    ## random-variable-stream.h (module 'core'): double ns3::DeterministicRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::DeterministicRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
     return
 
-def register_Ns3CallbackImplBase_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
+def register_Ns3DeviceEnergyModel_methods(root_module, cls):
+    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel::DeviceEnergyModel(ns3::DeviceEnergyModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DeviceEnergyModel const &', 'arg0')])
+    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel::DeviceEnergyModel() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
-    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<const ns3::CallbackImplBase> other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['void'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['unsigned long long'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::DataRate'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::ChangeState(int newState) [member function]
+    cls.add_method('ChangeState', 
+                   'void', 
+                   [param('int', 'newState')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::GetCurrentA() const [member function]
+    cls.add_method('GetCurrentA', 
+                   'double', 
                    [], 
-                   is_static=True, template_parameters=['ns3::HePreambleParameters'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::GetTotalEnergyConsumption() const [member function]
+    cls.add_method('GetTotalEnergyConsumption', 
+                   'double', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): static ns3::TypeId ns3::DeviceEnergyModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumPhy const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyChanged() [member function]
+    cls.add_method('HandleEnergyChanged', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyDepletion() [member function]
+    cls.add_method('HandleEnergyDepletion', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyRecharged() [member function]
+    cls.add_method('HandleEnergyRecharged', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('SetEnergySource', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::DoGetCurrentA() const [member function]
+    cls.add_method('DoGetCurrentA', 
+                   'double', 
                    [], 
-                   is_static=True, template_parameters=['int'], visibility='protected')
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3CallbackValue_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
-    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
+def register_Ns3DoubleValue_methods(root_module, cls):
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
-    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
-    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(double const & value) [constructor]
+    cls.add_constructor([param('double const &', 'value')])
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(ns3::DoubleValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DoubleValue const &', 'arg0')])
+    ## double.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::DoubleValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    ## double.h (module 'core'): bool ns3::DoubleValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    ## double.h (module 'core'): double ns3::DoubleValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## double.h (module 'core'): std::string ns3::DoubleValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
+    ## double.h (module 'core'): void ns3::DoubleValue::Set(double const & value) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('ns3::CallbackBase', 'base')])
+                   [param('double const &', 'value')])
     return
 
-def register_Ns3CaraWifiManager_methods(root_module, cls):
-    ## cara-wifi-manager.h (module 'wifi'): ns3::CaraWifiManager::CaraWifiManager(ns3::CaraWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CaraWifiManager const &', 'arg0')])
-    ## cara-wifi-manager.h (module 'wifi'): ns3::CaraWifiManager::CaraWifiManager() [constructor]
+def register_Ns3DsssParameterSet_methods(root_module, cls):
+    ## dsss-parameter-set.h (module 'wifi'): ns3::DsssParameterSet::DsssParameterSet(ns3::DsssParameterSet const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DsssParameterSet const &', 'arg0')])
+    ## dsss-parameter-set.h (module 'wifi'): ns3::DsssParameterSet::DsssParameterSet() [constructor]
     cls.add_constructor([])
-    ## cara-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::CaraWifiManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## dsss-parameter-set.h (module 'wifi'): uint8_t ns3::DsssParameterSet::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## dsss-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::DsssParameterSet::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_static=True)
-    ## cara-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::CaraWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+                   is_const=True, is_virtual=True)
+    ## dsss-parameter-set.h (module 'wifi'): uint8_t ns3::DsssParameterSet::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::CaraWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::CaraWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
+                   is_const=True, is_virtual=True)
+    ## dsss-parameter-set.h (module 'wifi'): uint16_t ns3::DsssParameterSet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): bool ns3::CaraWifiManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
-    cls.add_method('DoNeedRts', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
+                   is_const=True, is_virtual=True)
+    ## dsss-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::DsssParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SetCurrentChannel(uint8_t currentChannel) [member function]
+    cls.add_method('SetCurrentChannel', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
+                   [param('uint8_t', 'currentChannel')])
+    ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SetDsssSupported(uint8_t dsssSupported) [member function]
+    cls.add_method('SetDsssSupported', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+                   [param('uint8_t', 'dsssSupported')])
+    return
+
+def register_Ns3DsssPpdu_methods(root_module, cls):
+    ## dsss-ppdu.h (module 'wifi'): ns3::DsssPpdu::DsssPpdu(ns3::DsssPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DsssPpdu const &', 'arg0')])
+    ## dsss-ppdu.h (module 'wifi'): ns3::DsssPpdu::DsssPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('uint64_t', 'uid')])
+    ## dsss-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::DsssPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): ns3::Time ns3::DsssPpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::DsssPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3DsssPpduDsssSigHeader_methods(root_module, cls):
+    ## dsss-ppdu.h (module 'wifi'): ns3::DsssPpdu::DsssSigHeader::DsssSigHeader(ns3::DsssPpdu::DsssSigHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DsssPpdu::DsssSigHeader const &', 'arg0')])
+    ## dsss-ppdu.h (module 'wifi'): ns3::DsssPpdu::DsssSigHeader::DsssSigHeader() [constructor]
+    cls.add_constructor([])
+    ## dsss-ppdu.h (module 'wifi'): uint32_t ns3::DsssPpdu::DsssSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): ns3::TypeId ns3::DsssPpdu::DsssSigHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): uint16_t ns3::DsssPpdu::DsssSigHeader::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## dsss-ppdu.h (module 'wifi'): uint64_t ns3::DsssPpdu::DsssSigHeader::GetRate() const [member function]
+    cls.add_method('GetRate', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## dsss-ppdu.h (module 'wifi'): uint32_t ns3::DsssPpdu::DsssSigHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): static ns3::TypeId ns3::DsssPpdu::DsssSigHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## dsss-ppdu.h (module 'wifi'): void ns3::DsssPpdu::DsssSigHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): void ns3::DsssPpdu::DsssSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): void ns3::DsssPpdu::DsssSigHeader::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('uint16_t', 'length')])
+    ## dsss-ppdu.h (module 'wifi'): void ns3::DsssPpdu::DsssSigHeader::SetRate(uint64_t rate) [member function]
+    cls.add_method('SetRate', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
+                   [param('uint64_t', 'rate')])
     return
 
-def register_Ns3CfParameterSet_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## cf-parameter-set.h (module 'wifi'): ns3::CfParameterSet::CfParameterSet(ns3::CfParameterSet const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CfParameterSet const &', 'arg0')])
-    ## cf-parameter-set.h (module 'wifi'): ns3::CfParameterSet::CfParameterSet() [constructor]
+def register_Ns3EdcaParameterSet_methods(root_module, cls):
+    ## edca-parameter-set.h (module 'wifi'): ns3::EdcaParameterSet::EdcaParameterSet(ns3::EdcaParameterSet const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EdcaParameterSet const &', 'arg0')])
+    ## edca-parameter-set.h (module 'wifi'): ns3::EdcaParameterSet::EdcaParameterSet() [constructor]
     cls.add_constructor([])
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
     cls.add_method('DeserializeInformationField', 
                    'uint8_t', 
                    [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
                    is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::CfParameterSet::ElementId() const [member function]
+    ## edca-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::EdcaParameterSet::ElementId() const [member function]
     cls.add_method('ElementId', 
                    'ns3::WifiInformationElementId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::GetCFPCount() const [member function]
-    cls.add_method('GetCFPCount', 
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetBeAifsn() const [member function]
+    cls.add_method('GetBeAifsn', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBeCWmax() const [member function]
+    cls.add_method('GetBeCWmax', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBeCWmin() const [member function]
+    cls.add_method('GetBeCWmin', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetBeTxopLimit() const [member function]
+    cls.add_method('GetBeTxopLimit', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetBkAifsn() const [member function]
+    cls.add_method('GetBkAifsn', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint64_t ns3::CfParameterSet::GetCFPDurRemainingUs() const [member function]
-    cls.add_method('GetCFPDurRemainingUs', 
-                   'uint64_t', 
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBkCWmax() const [member function]
+    cls.add_method('GetBkCWmax', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint64_t ns3::CfParameterSet::GetCFPMaxDurationUs() const [member function]
-    cls.add_method('GetCFPMaxDurationUs', 
-                   'uint64_t', 
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBkCWmin() const [member function]
+    cls.add_method('GetBkCWmin', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::GetCFPPeriod() const [member function]
-    cls.add_method('GetCFPPeriod', 
-                   'uint8_t', 
+    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetBkTxopLimit() const [member function]
+    cls.add_method('GetBkTxopLimit', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::GetInformationFieldSize() const [member function]
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetInformationFieldSize() const [member function]
     cls.add_method('GetInformationFieldSize', 
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): uint16_t ns3::CfParameterSet::GetSerializedSize() const [member function]
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetQosInfo() const [member function]
+    cls.add_method('GetQosInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::CfParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPCount(uint8_t count) [member function]
-    cls.add_method('SetCFPCount', 
-                   'void', 
-                   [param('uint8_t', 'count')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPDurRemainingUs(uint64_t durRemaining) [member function]
-    cls.add_method('SetCFPDurRemainingUs', 
-                   'void', 
-                   [param('uint64_t', 'durRemaining')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPMaxDurationUs(uint64_t maxDuration) [member function]
-    cls.add_method('SetCFPMaxDurationUs', 
-                   'void', 
-                   [param('uint64_t', 'maxDuration')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPPeriod(uint8_t period) [member function]
-    cls.add_method('SetCFPPeriod', 
-                   'void', 
-                   [param('uint8_t', 'period')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetPcfSupported(uint8_t pcfSupported) [member function]
-    cls.add_method('SetPcfSupported', 
-                   'void', 
-                   [param('uint8_t', 'pcfSupported')])
-    return
-
-def register_Ns3Channel_methods(root_module, cls):
-    ## channel.h (module 'network'): ns3::Channel::Channel(ns3::Channel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Channel const &', 'arg0')])
-    ## channel.h (module 'network'): ns3::Channel::Channel() [constructor]
-    cls.add_constructor([])
-    ## channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Channel::GetDevice(std::size_t i) const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## channel.h (module 'network'): uint32_t ns3::Channel::GetId() const [member function]
-    cls.add_method('GetId', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## channel.h (module 'network'): std::size_t ns3::Channel::GetNDevices() const [member function]
-    cls.add_method('GetNDevices', 
-                   'std::size_t', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## channel.h (module 'network'): static ns3::TypeId ns3::Channel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    return
-
-def register_Ns3ChannelAccessManager_methods(root_module, cls):
-    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager(ns3::ChannelAccessManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelAccessManager const &', 'arg0')])
-    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager() [constructor]
-    cls.add_constructor([])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::Add(ns3::Ptr<ns3::Txop> txop) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
-    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::IsBusy() const [member function]
-    cls.add_method('IsBusy', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::NeedBackoffUponAccess(ns3::Ptr<ns3::Txop> txop) [member function]
-    cls.add_method('NeedBackoffUponAccess', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutResetNow() [member function]
-    cls.add_method('NotifyAckTimeoutResetNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyAckTimeoutStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutResetNow() [member function]
-    cls.add_method('NotifyCtsTimeoutResetNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyCtsTimeoutStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyMaybeCcaBusyStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyMaybeCcaBusyStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavResetNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyNavResetNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyNavStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOffNow() [member function]
-    cls.add_method('NotifyOffNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOnNow() [member function]
-    cls.add_method('NotifyOnNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndErrorNow() [member function]
-    cls.add_method('NotifyRxEndErrorNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndOkNow() [member function]
-    cls.add_method('NotifyRxEndOkNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyRxStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySleepNow() [member function]
-    cls.add_method('NotifySleepNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifySwitchingStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyTxStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyTxStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyWakeupNow() [member function]
-    cls.add_method('NotifyWakeupNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RemovePhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('RemovePhyListener', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RequestAccess(ns3::Ptr<ns3::Txop> txop, bool isCfPeriod=false) [member function]
-    cls.add_method('RequestAccess', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'txop'), param('bool', 'isCfPeriod', default_value='false')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupLow(ns3::Ptr<ns3::MacLow> low) [member function]
-    cls.add_method('SetupLow', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacLow >', 'low')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupPhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('SetupPhyListener', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetEifsNoDifs() const [member function]
-    cls.add_method('GetEifsNoDifs', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSifs() const [member function]
-    cls.add_method('GetSifs', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSlot() const [member function]
-    cls.add_method('GetSlot', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3ChannelCondition_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::ChannelCondition(ns3::ChannelCondition const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelCondition const &', 'arg0')])
-    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::ChannelCondition() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::ChannelCondition(ns3::ChannelCondition::LosConditionValue losCondition, ns3::ChannelCondition::O2iConditionValue o2iCondition=::ns3::ChannelCondition::O2iConditionValue::O2O) [constructor]
-    cls.add_constructor([param('ns3::ChannelCondition::LosConditionValue', 'losCondition'), param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition', default_value='::ns3::ChannelCondition::O2iConditionValue::O2O')])
-    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::LosConditionValue ns3::ChannelCondition::GetLosCondition() const [member function]
-    cls.add_method('GetLosCondition', 
-                   'ns3::ChannelCondition::LosConditionValue', 
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetViAifsn() const [member function]
+    cls.add_method('GetViAifsn', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::O2iConditionValue ns3::ChannelCondition::GetO2iCondition() const [member function]
-    cls.add_method('GetO2iCondition', 
-                   'ns3::ChannelCondition::O2iConditionValue', 
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetViCWmax() const [member function]
+    cls.add_method('GetViCWmax', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ChannelCondition::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetViCWmin() const [member function]
+    cls.add_method('GetViCWmin', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::Ptr<const ns3::ChannelCondition> otherCondition) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::ChannelCondition const >', 'otherCondition')], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsI2i() const [member function]
-    cls.add_method('IsI2i', 
-                   'bool', 
+    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetViTxopLimit() const [member function]
+    cls.add_method('GetViTxopLimit', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsLos() const [member function]
-    cls.add_method('IsLos', 
-                   'bool', 
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetVoAifsn() const [member function]
+    cls.add_method('GetVoAifsn', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsNlos() const [member function]
-    cls.add_method('IsNlos', 
-                   'bool', 
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetVoCWmax() const [member function]
+    cls.add_method('GetVoCWmax', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsNlosv() const [member function]
-    cls.add_method('IsNlosv', 
-                   'bool', 
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetVoCWmin() const [member function]
+    cls.add_method('GetVoCWmin', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsO2i() const [member function]
-    cls.add_method('IsO2i', 
-                   'bool', 
+    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetVoTxopLimit() const [member function]
+    cls.add_method('GetVoTxopLimit', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsO2o() const [member function]
-    cls.add_method('IsO2o', 
-                   'bool', 
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::IsQosSupported() const [member function]
+    cls.add_method('IsQosSupported', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): void ns3::ChannelCondition::SetLosCondition(ns3::ChannelCondition::LosConditionValue losCondition) [member function]
-    cls.add_method('SetLosCondition', 
+    ## edca-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::EdcaParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeAci(uint8_t aci) [member function]
+    cls.add_method('SetBeAci', 
+                   'void', 
+                   [param('uint8_t', 'aci')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetBeAifsn', 
                    'void', 
-                   [param('ns3::ChannelCondition::LosConditionValue', 'losCondition')])
-    ## channel-condition-model.h (module 'propagation'): void ns3::ChannelCondition::SetO2iCondition(ns3::ChannelCondition::O2iConditionValue o2iCondition) [member function]
-    cls.add_method('SetO2iCondition', 
+                   [param('uint8_t', 'aifsn')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeCWmax(uint32_t cwMax) [member function]
+    cls.add_method('SetBeCWmax', 
                    'void', 
-                   [param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition')])
-    return
-
-def register_Ns3ChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ChannelConditionModel::ChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::ChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetChannelCondition', 
-                   'ns3::Ptr< ns3::ChannelCondition >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## channel-condition-model.h (module 'propagation'): int64_t ns3::ChannelConditionModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [param('uint32_t', 'cwMax')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeCWmin(uint32_t cwMin) [member function]
+    cls.add_method('SetBeCWmin', 
+                   'void', 
+                   [param('uint32_t', 'cwMin')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeTxopLimit(uint16_t txop) [member function]
+    cls.add_method('SetBeTxopLimit', 
+                   'void', 
+                   [param('uint16_t', 'txop')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkAci(uint8_t aci) [member function]
+    cls.add_method('SetBkAci', 
+                   'void', 
+                   [param('uint8_t', 'aci')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetBkAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aifsn')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkCWmax(uint32_t cwMax) [member function]
+    cls.add_method('SetBkCWmax', 
+                   'void', 
+                   [param('uint32_t', 'cwMax')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkCWmin(uint32_t cwMin) [member function]
+    cls.add_method('SetBkCWmin', 
+                   'void', 
+                   [param('uint32_t', 'cwMin')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkTxopLimit(uint16_t txop) [member function]
+    cls.add_method('SetBkTxopLimit', 
+                   'void', 
+                   [param('uint16_t', 'txop')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetQosInfo(uint8_t qosInfo) [member function]
+    cls.add_method('SetQosInfo', 
+                   'void', 
+                   [param('uint8_t', 'qosInfo')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetQosSupported(uint8_t qosSupported) [member function]
+    cls.add_method('SetQosSupported', 
+                   'void', 
+                   [param('uint8_t', 'qosSupported')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViAci(uint8_t aci) [member function]
+    cls.add_method('SetViAci', 
+                   'void', 
+                   [param('uint8_t', 'aci')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetViAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aifsn')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViCWmax(uint32_t cwMax) [member function]
+    cls.add_method('SetViCWmax', 
+                   'void', 
+                   [param('uint32_t', 'cwMax')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViCWmin(uint32_t cwMin) [member function]
+    cls.add_method('SetViCWmin', 
+                   'void', 
+                   [param('uint32_t', 'cwMin')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViTxopLimit(uint16_t txop) [member function]
+    cls.add_method('SetViTxopLimit', 
+                   'void', 
+                   [param('uint16_t', 'txop')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoAci(uint8_t aci) [member function]
+    cls.add_method('SetVoAci', 
+                   'void', 
+                   [param('uint8_t', 'aci')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetVoAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aifsn')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoCWmax(uint32_t cwMax) [member function]
+    cls.add_method('SetVoCWmax', 
+                   'void', 
+                   [param('uint32_t', 'cwMax')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoCWmin(uint32_t cwMin) [member function]
+    cls.add_method('SetVoCWmin', 
+                   'void', 
+                   [param('uint32_t', 'cwMin')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoTxopLimit(uint16_t txop) [member function]
+    cls.add_method('SetVoTxopLimit', 
+                   'void', 
+                   [param('uint16_t', 'txop')])
     return
 
-def register_Ns3ConstantObssPdAlgorithm_methods(root_module, cls):
-    ## constant-obss-pd-algorithm.h (module 'wifi'): ns3::ConstantObssPdAlgorithm::ConstantObssPdAlgorithm(ns3::ConstantObssPdAlgorithm const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ConstantObssPdAlgorithm const &', 'arg0')])
-    ## constant-obss-pd-algorithm.h (module 'wifi'): ns3::ConstantObssPdAlgorithm::ConstantObssPdAlgorithm() [constructor]
+def register_Ns3EmpiricalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable::EmpiricalRandomVariable() [constructor]
     cls.add_constructor([])
-    ## constant-obss-pd-algorithm.h (module 'wifi'): void ns3::ConstantObssPdAlgorithm::ConnectWifiNetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
-    cls.add_method('ConnectWifiNetDevice', 
+    ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::CDF(double v, double c) [member function]
+    cls.add_method('CDF', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')], 
-                   is_virtual=True)
-    ## constant-obss-pd-algorithm.h (module 'wifi'): static ns3::TypeId ns3::ConstantObssPdAlgorithm::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   [param('double', 'v'), param('double', 'c')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::EmpiricalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## constant-obss-pd-algorithm.h (module 'wifi'): void ns3::ConstantObssPdAlgorithm::ReceiveHeSig(ns3::HePreambleParameters params) [member function]
-    cls.add_method('ReceiveHeSig', 
-                   'void', 
-                   [param('ns3::HePreambleParameters', 'params')], 
                    is_virtual=True)
-    return
-
-def register_Ns3ConstantRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ConstantRandomVariable::GetTypeId() [member function]
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::EmpiricalRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable::ConstantRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetConstant() const [member function]
-    cls.add_method('GetConstant', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue(double constant) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'constant')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger(uint32_t constant) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'constant')])
-    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue() [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::GetValue() [member function]
     cls.add_method('GetValue', 
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate() [member function]
+    cls.add_method('Interpolate', 
+                   'double', 
                    [], 
                    is_virtual=True)
+    ## random-variable-stream.h (module 'core'): bool ns3::EmpiricalRandomVariable::SetInterpolate(bool interpolate) [member function]
+    cls.add_method('SetInterpolate', 
+                   'bool', 
+                   [param('bool', 'interpolate')])
     return
 
-def register_Ns3ConstantRateWifiManager_methods(root_module, cls):
-    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::ConstantRateWifiManager::ConstantRateWifiManager(ns3::ConstantRateWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ConstantRateWifiManager const &', 'arg0')])
-    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::ConstantRateWifiManager::ConstantRateWifiManager() [constructor]
+def register_Ns3EmptyAttributeAccessor_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor::EmptyAttributeAccessor(ns3::EmptyAttributeAccessor const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EmptyAttributeAccessor const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor::EmptyAttributeAccessor() [constructor]
     cls.add_constructor([])
-    ## constant-rate-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ConstantRateWifiManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::HasGetter() const [member function]
+    cls.add_method('HasGetter', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ConstantRateWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::HasSetter() const [member function]
+    cls.add_method('HasSetter', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ConstantRateWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ConstantRateWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Set', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'object'), param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
     return
 
-def register_Ns3ConstantSpeedPropagationDelayModel_methods(root_module, cls):
-    ## propagation-delay-model.h (module 'propagation'): ns3::ConstantSpeedPropagationDelayModel::ConstantSpeedPropagationDelayModel(ns3::ConstantSpeedPropagationDelayModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ConstantSpeedPropagationDelayModel const &', 'arg0')])
-    ## propagation-delay-model.h (module 'propagation'): ns3::ConstantSpeedPropagationDelayModel::ConstantSpeedPropagationDelayModel() [constructor]
+def register_Ns3EmptyAttributeChecker_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::EmptyAttributeChecker::EmptyAttributeChecker(ns3::EmptyAttributeChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EmptyAttributeChecker const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeChecker::EmptyAttributeChecker() [constructor]
     cls.add_constructor([])
-    ## propagation-delay-model.h (module 'propagation'): ns3::Time ns3::ConstantSpeedPropagationDelayModel::GetDelay(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetDelay', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
                    is_const=True, is_virtual=True)
-    ## propagation-delay-model.h (module 'propagation'): double ns3::ConstantSpeedPropagationDelayModel::GetSpeed() const [member function]
-    cls.add_method('GetSpeed', 
-                   'double', 
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True)
-    ## propagation-delay-model.h (module 'propagation'): static ns3::TypeId ns3::ConstantSpeedPropagationDelayModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## propagation-delay-model.h (module 'propagation'): void ns3::ConstantSpeedPropagationDelayModel::SetSpeed(double speed) [member function]
-    cls.add_method('SetSpeed', 
-                   'void', 
-                   [param('double', 'speed')])
-    ## propagation-delay-model.h (module 'propagation'): int64_t ns3::ConstantSpeedPropagationDelayModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
     return
 
-def register_Ns3ConstantWifiAckPolicySelector_methods(root_module, cls):
-    ## constant-wifi-ack-policy-selector.h (module 'wifi'): ns3::ConstantWifiAckPolicySelector::ConstantWifiAckPolicySelector(ns3::ConstantWifiAckPolicySelector const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ConstantWifiAckPolicySelector const &', 'arg0')])
-    ## constant-wifi-ack-policy-selector.h (module 'wifi'): ns3::ConstantWifiAckPolicySelector::ConstantWifiAckPolicySelector() [constructor]
+def register_Ns3EmptyAttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue() [constructor]
     cls.add_constructor([])
-    ## constant-wifi-ack-policy-selector.h (module 'wifi'): static ns3::TypeId ns3::ConstantWifiAckPolicySelector::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_static=True)
-    ## constant-wifi-ack-policy-selector.h (module 'wifi'): void ns3::ConstantWifiAckPolicySelector::UpdateTxParams(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::MacLowTransmissionParameters & params) [member function]
-    cls.add_method('UpdateTxParams', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::MacLowTransmissionParameters &', 'params')], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True, visibility='private')
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True, visibility='private')
+    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3Cost231PropagationLossModel_methods(root_module, cls):
-    ## cost231-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::Cost231PropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## cost231-propagation-loss-model.h (module 'propagation'): ns3::Cost231PropagationLossModel::Cost231PropagationLossModel() [constructor]
+def register_Ns3EnergyHarvester_methods(root_module, cls):
+    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester::EnergyHarvester(ns3::EnergyHarvester const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EnergyHarvester const &', 'arg0')])
+    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester::EnergyHarvester() [constructor]
     cls.add_constructor([])
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetLoss', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True)
-    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetBSAntennaHeight(double height) [member function]
-    cls.add_method('SetBSAntennaHeight', 
-                   'void', 
-                   [param('double', 'height')])
-    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetSSAntennaHeight(double height) [member function]
-    cls.add_method('SetSSAntennaHeight', 
-                   'void', 
-                   [param('double', 'height')])
-    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetLambda(double lambda) [member function]
-    cls.add_method('SetLambda', 
-                   'void', 
-                   [param('double', 'lambda')])
-    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetLambda(double frequency, double speed) [member function]
-    cls.add_method('SetLambda', 
-                   'void', 
-                   [param('double', 'frequency'), param('double', 'speed')])
-    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetMinDistance(double minDistance) [member function]
-    cls.add_method('SetMinDistance', 
-                   'void', 
-                   [param('double', 'minDistance')])
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetBSAntennaHeight() const [member function]
-    cls.add_method('GetBSAntennaHeight', 
-                   'double', 
+    ## energy-harvester.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergyHarvester::GetEnergySource() const [member function]
+    cls.add_method('GetEnergySource', 
+                   'ns3::Ptr< ns3::EnergySource >', 
                    [], 
                    is_const=True)
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetSSAntennaHeight() const [member function]
-    cls.add_method('GetSSAntennaHeight', 
-                   'double', 
+    ## energy-harvester.h (module 'energy'): ns3::Ptr<ns3::Node> ns3::EnergyHarvester::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
                    [], 
                    is_const=True)
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetMinDistance() const [member function]
-    cls.add_method('GetMinDistance', 
+    ## energy-harvester.h (module 'energy'): double ns3::EnergyHarvester::GetPower() const [member function]
+    cls.add_method('GetPower', 
                    'double', 
                    [], 
                    is_const=True)
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetLambda() const [member function]
-    cls.add_method('GetLambda', 
-                   'double', 
+    ## energy-harvester.h (module 'energy'): static ns3::TypeId ns3::EnergyHarvester::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetShadowing() [member function]
-    cls.add_method('GetShadowing', 
-                   'double', 
-                   [])
-    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetShadowing(double shadowing) [member function]
-    cls.add_method('SetShadowing', 
+                   is_static=True)
+    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('SetEnergySource', 
                    'void', 
-                   [param('double', 'shadowing')])
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')])
+    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## energy-harvester.h (module 'energy'): double ns3::EnergyHarvester::DoGetPower() const [member function]
+    cls.add_method('DoGetPower', 
                    'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   [], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## cost231-propagation-loss-model.h (module 'propagation'): int64_t ns3::Cost231PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3CtrlBAckRequestHeader_methods(root_module, cls):
-    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader(ns3::CtrlBAckRequestHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CtrlBAckRequestHeader const &', 'arg0')])
-    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader() [constructor]
+def register_Ns3EnergySource_methods(root_module, cls):
+    ## energy-source.h (module 'energy'): ns3::EnergySource::EnergySource(ns3::EnergySource const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EnergySource const &', 'arg0')])
+    ## energy-source.h (module 'energy'): ns3::EnergySource::EnergySource() [constructor]
     cls.add_constructor([])
-    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckRequestHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::AppendDeviceEnergyModel(ns3::Ptr<ns3::DeviceEnergyModel> deviceEnergyModelPtr) [member function]
+    cls.add_method('AppendDeviceEnergyModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::DeviceEnergyModel >', 'deviceEnergyModelPtr')])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::ConnectEnergyHarvester(ns3::Ptr<ns3::EnergyHarvester> energyHarvesterPtr) [member function]
+    cls.add_method('ConnectEnergyHarvester', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergyHarvester >', 'energyHarvesterPtr')])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::DisposeDeviceModels() [member function]
+    cls.add_method('DisposeDeviceModels', 
+                   'void', 
+                   [])
+    ## energy-source.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::EnergySource::FindDeviceEnergyModels(ns3::TypeId tid) [member function]
+    cls.add_method('FindDeviceEnergyModels', 
+                   'ns3::DeviceEnergyModelContainer', 
+                   [param('ns3::TypeId', 'tid')])
+    ## energy-source.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::EnergySource::FindDeviceEnergyModels(std::string name) [member function]
+    cls.add_method('FindDeviceEnergyModels', 
+                   'ns3::DeviceEnergyModelContainer', 
+                   [param('std::string', 'name')])
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetEnergyFraction() [member function]
+    cls.add_method('GetEnergyFraction', 
+                   'double', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequence() const [member function]
-    cls.add_method('GetStartingSequence', 
-                   'uint16_t', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetInitialEnergy() const [member function]
+    cls.add_method('GetInitialEnergy', 
+                   'double', 
                    [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequenceControl() const [member function]
-    cls.add_method('GetStartingSequenceControl', 
-                   'uint16_t', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): ns3::Ptr<ns3::Node> ns3::EnergySource::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
                    [], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckRequestHeader::GetTidInfo() const [member function]
-    cls.add_method('GetTidInfo', 
-                   'uint8_t', 
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetRemainingEnergy() [member function]
+    cls.add_method('GetRemainingEnergy', 
+                   'double', 
                    [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType ns3::CtrlBAckRequestHeader::GetType() const [member function]
-    cls.add_method('GetType', 
-                   'ns3::BlockAckType', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetSupplyVoltage() const [member function]
+    cls.add_method('GetSupplyVoltage', 
+                   'double', 
                    [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckRequestHeader::GetTypeId() [member function]
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): static ns3::TypeId ns3::EnergySource::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsBasic() const [member function]
-    cls.add_method('IsBasic', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsCompressed() const [member function]
-    cls.add_method('IsCompressed', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsExtendedCompressed() const [member function]
-    cls.add_method('IsExtendedCompressed', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsMultiTid() const [member function]
-    cls.add_method('IsMultiTid', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::MustSendHtImmediateAck() const [member function]
-    cls.add_method('MustSendHtImmediateAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::InitializeDeviceModels() [member function]
+    cls.add_method('InitializeDeviceModels', 
                    'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
+                   [])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetHtImmediateAck(bool immediateAck) [member function]
-    cls.add_method('SetHtImmediateAck', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::UpdateEnergySource() [member function]
+    cls.add_method('UpdateEnergySource', 
                    'void', 
-                   [param('bool', 'immediateAck')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetStartingSequence(uint16_t seq) [member function]
-    cls.add_method('SetStartingSequence', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::BreakDeviceEnergyModelRefCycle() [member function]
+    cls.add_method('BreakDeviceEnergyModelRefCycle', 
                    'void', 
-                   [param('uint16_t', 'seq')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetTidInfo(uint8_t tid) [member function]
-    cls.add_method('SetTidInfo', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::CalculateTotalCurrent() [member function]
+    cls.add_method('CalculateTotalCurrent', 
+                   'double', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyChanged() [member function]
+    cls.add_method('NotifyEnergyChanged', 
                    'void', 
-                   [param('uint8_t', 'tid')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetType(ns3::BlockAckType type) [member function]
-    cls.add_method('SetType', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyDrained() [member function]
+    cls.add_method('NotifyEnergyDrained', 
                    'void', 
-                   [param('ns3::BlockAckType', 'type')])
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyRecharged() [member function]
+    cls.add_method('NotifyEnergyRecharged', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3CtrlBAckResponseHeader_methods(root_module, cls):
-    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader(ns3::CtrlBAckResponseHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CtrlBAckResponseHeader const &', 'arg0')])
-    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader() [constructor]
+def register_Ns3EnergySourceContainer_methods(root_module, cls):
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::EnergySourceContainer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EnergySourceContainer const &', 'arg0')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer() [constructor]
     cls.add_constructor([])
-    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): uint16_t const * ns3::CtrlBAckResponseHeader::GetBitmap() const [member function]
-    cls.add_method('GetBitmap', 
-                   'uint16_t const *', 
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::Ptr<ns3::EnergySource> source) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::EnergySource >', 'source')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(std::string sourceName) [constructor]
+    cls.add_constructor([param('std::string', 'sourceName')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::EnergySourceContainer const & a, ns3::EnergySourceContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::EnergySourceContainer const &', 'a'), param('ns3::EnergySourceContainer const &', 'b')])
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(ns3::EnergySourceContainer container) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::EnergySourceContainer', 'container')])
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')])
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(std::string sourceName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'sourceName')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::Iterator ns3::EnergySourceContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'ns3::EnergySourceContainer::Iterator', 
                    [], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): uint64_t ns3::CtrlBAckResponseHeader::GetCompressedBitmap() const [member function]
-    cls.add_method('GetCompressedBitmap', 
-                   'uint64_t', 
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::Iterator ns3::EnergySourceContainer::End() const [member function]
+    cls.add_method('End', 
+                   'ns3::EnergySourceContainer::Iterator', 
                    [], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): uint64_t const * ns3::CtrlBAckResponseHeader::GetExtendedCompressedBitmap() const [member function]
-    cls.add_method('GetExtendedCompressedBitmap', 
-                   'uint64_t const *', 
-                   [], 
+    ## energy-source-container.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergySourceContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::EnergySource >', 
+                   [param('uint32_t', 'i')], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckResponseHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
+    ## energy-source-container.h (module 'energy'): uint32_t ns3::EnergySourceContainer::GetN() const [member function]
+    cls.add_method('GetN', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequence() const [member function]
-    cls.add_method('GetStartingSequence', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequenceControl() const [member function]
-    cls.add_method('GetStartingSequenceControl', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckResponseHeader::GetTidInfo() const [member function]
-    cls.add_method('GetTidInfo', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType ns3::CtrlBAckResponseHeader::GetType() const [member function]
-    cls.add_method('GetType', 
-                   'ns3::BlockAckType', 
-                   [], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckResponseHeader::GetTypeId() [member function]
+    ## energy-source-container.h (module 'energy'): static ns3::TypeId ns3::EnergySourceContainer::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsBasic() const [member function]
-    cls.add_method('IsBasic', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsCompressed() const [member function]
-    cls.add_method('IsCompressed', 
-                   'bool', 
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsExtendedCompressed() const [member function]
-    cls.add_method('IsExtendedCompressed', 
-                   'bool', 
+                   is_virtual=True, visibility='private')
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsFragmentReceived(uint16_t seq, uint8_t frag) const [member function]
-    cls.add_method('IsFragmentReceived', 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3EnumChecker_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker(ns3::EnumChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EnumChecker const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): void ns3::EnumChecker::Add(int value, std::string name) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('int', 'value'), param('std::string', 'name')])
+    ## enum.h (module 'core'): void ns3::EnumChecker::AddDefault(int value, std::string name) [member function]
+    cls.add_method('AddDefault', 
+                   'void', 
+                   [param('int', 'value'), param('std::string', 'name')])
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
                    'bool', 
-                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsMultiTid() const [member function]
-    cls.add_method('IsMultiTid', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Copy(ns3::AttributeValue const & src, ns3::AttributeValue & dst) const [member function]
+    cls.add_method('Copy', 
                    'bool', 
+                   [param('ns3::AttributeValue const &', 'src'), param('ns3::AttributeValue &', 'dst')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetName(int value) const [member function]
+    cls.add_method('GetName', 
+                   'std::string', 
+                   [param('int', 'value')], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsPacketReceived(uint16_t seq) const [member function]
-    cls.add_method('IsPacketReceived', 
-                   'bool', 
-                   [param('uint16_t', 'seq')], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::MustSendHtImmediateAck() const [member function]
-    cls.add_method('MustSendHtImmediateAck', 
-                   'bool', 
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): int ns3::EnumChecker::GetValue(std::string const name) const [member function]
+    cls.add_method('GetValue', 
+                   'int', 
+                   [param('std::string const', 'name')], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::ResetBitmap() [member function]
-    cls.add_method('ResetBitmap', 
-                   'void', 
-                   [])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+    ## enum.h (module 'core'): bool ns3::EnumChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immediateAck) [member function]
-    cls.add_method('SetHtImmediateAck', 
-                   'void', 
-                   [param('bool', 'immediateAck')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedFragment(uint16_t seq, uint8_t frag) [member function]
-    cls.add_method('SetReceivedFragment', 
-                   'void', 
-                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedPacket(uint16_t seq) [member function]
-    cls.add_method('SetReceivedPacket', 
-                   'void', 
-                   [param('uint16_t', 'seq')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequence(uint16_t seq) [member function]
-    cls.add_method('SetStartingSequence', 
-                   'void', 
-                   [param('uint16_t', 'seq')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequenceControl(uint16_t seqControl) [member function]
-    cls.add_method('SetStartingSequenceControl', 
-                   'void', 
-                   [param('uint16_t', 'seqControl')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetTidInfo(uint8_t tid) [member function]
-    cls.add_method('SetTidInfo', 
-                   'void', 
-                   [param('uint8_t', 'tid')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetType(ns3::BlockAckType type) [member function]
-    cls.add_method('SetType', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    return
-
-def register_Ns3DataRateChecker_methods(root_module, cls):
-    ## data-rate.h (module 'network'): ns3::DataRateChecker::DataRateChecker() [constructor]
-    cls.add_constructor([])
-    ## data-rate.h (module 'network'): ns3::DataRateChecker::DataRateChecker(ns3::DataRateChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DataRateChecker const &', 'arg0')])
     return
 
-def register_Ns3DataRateValue_methods(root_module, cls):
-    ## data-rate.h (module 'network'): ns3::DataRateValue::DataRateValue() [constructor]
+def register_Ns3EnumValue_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(ns3::EnumValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EnumValue const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue() [constructor]
     cls.add_constructor([])
-    ## data-rate.h (module 'network'): ns3::DataRateValue::DataRateValue(ns3::DataRate const & value) [constructor]
-    cls.add_constructor([param('ns3::DataRate const &', 'value')])
-    ## data-rate.h (module 'network'): ns3::DataRateValue::DataRateValue(ns3::DataRateValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DataRateValue const &', 'arg0')])
-    ## data-rate.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::DataRateValue::Copy() const [member function]
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(int value) [constructor]
+    cls.add_constructor([param('int', 'value')])
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## data-rate.h (module 'network'): bool ns3::DataRateValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    ## enum.h (module 'core'): bool ns3::EnumValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## data-rate.h (module 'network'): ns3::DataRate ns3::DataRateValue::Get() const [member function]
+    ## enum.h (module 'core'): int ns3::EnumValue::Get() const [member function]
     cls.add_method('Get', 
-                   'ns3::DataRate', 
+                   'int', 
                    [], 
                    is_const=True)
-    ## data-rate.h (module 'network'): std::string ns3::DataRateValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    ## enum.h (module 'core'): std::string ns3::EnumValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## data-rate.h (module 'network'): void ns3::DataRateValue::Set(ns3::DataRate const & value) [member function]
+    ## enum.h (module 'core'): void ns3::EnumValue::Set(int value) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('ns3::DataRate const &', 'value')])
+                   [param('int', 'value')])
     return
 
-def register_Ns3DeterministicRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::DeterministicRandomVariable::GetTypeId() [member function]
+def register_Ns3ErlangRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ErlangRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable::DeterministicRandomVariable() [constructor]
+    ## random-variable-stream.h (module 'core'): ns3::ErlangRandomVariable::ErlangRandomVariable() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): void ns3::DeterministicRandomVariable::SetValueArray(double * values, std::size_t length) [member function]
-    cls.add_method('SetValueArray', 
-                   'void', 
-                   [param('double *', 'values'), param('std::size_t', 'length')])
-    ## random-variable-stream.h (module 'core'): double ns3::DeterministicRandomVariable::GetValue() [member function]
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetK() const [member function]
+    cls.add_method('GetK', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetLambda() const [member function]
+    cls.add_method('GetLambda', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue(uint32_t k, double lambda) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('uint32_t', 'k'), param('double', 'lambda')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger(uint32_t k, uint32_t lambda) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'k'), param('uint32_t', 'lambda')])
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue() [member function]
     cls.add_method('GetValue', 
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::DeterministicRandomVariable::GetInteger() [member function]
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger() [member function]
     cls.add_method('GetInteger', 
                    'uint32_t', 
                    [], 
                    is_virtual=True)
     return
 
-def register_Ns3DeviceEnergyModel_methods(root_module, cls):
-    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel::DeviceEnergyModel(ns3::DeviceEnergyModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DeviceEnergyModel const &', 'arg0')])
-    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel::DeviceEnergyModel() [constructor]
+def register_Ns3ErpInformation_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## erp-information.h (module 'wifi'): ns3::ErpInformation::ErpInformation(ns3::ErpInformation const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ErpInformation const &', 'arg0')])
+    ## erp-information.h (module 'wifi'): ns3::ErpInformation::ErpInformation() [constructor]
     cls.add_constructor([])
-    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::ChangeState(int newState) [member function]
-    cls.add_method('ChangeState', 
-                   'void', 
-                   [param('int', 'newState')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::GetCurrentA() const [member function]
-    cls.add_method('GetCurrentA', 
-                   'double', 
+    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## erp-information.h (module 'wifi'): ns3::WifiInformationElementId ns3::ErpInformation::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetBarkerPreambleMode() const [member function]
+    cls.add_method('GetBarkerPreambleMode', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::GetTotalEnergyConsumption() const [member function]
-    cls.add_method('GetTotalEnergyConsumption', 
-                   'double', 
+    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## device-energy-model.h (module 'energy'): static ns3::TypeId ns3::DeviceEnergyModel::GetTypeId() [member function]
+                   is_const=True, is_virtual=True)
+    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetNonErpPresent() const [member function]
+    cls.add_method('GetNonErpPresent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## erp-information.h (module 'wifi'): uint16_t ns3::ErpInformation::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetUseProtection() const [member function]
+    cls.add_method('GetUseProtection', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## erp-information.h (module 'wifi'): ns3::Buffer::Iterator ns3::ErpInformation::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetBarkerPreambleMode(uint8_t barkerPreambleMode) [member function]
+    cls.add_method('SetBarkerPreambleMode', 
+                   'void', 
+                   [param('uint8_t', 'barkerPreambleMode')])
+    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetErpSupported(uint8_t erpSupported) [member function]
+    cls.add_method('SetErpSupported', 
+                   'void', 
+                   [param('uint8_t', 'erpSupported')])
+    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetNonErpPresent(uint8_t nonErpPresent) [member function]
+    cls.add_method('SetNonErpPresent', 
+                   'void', 
+                   [param('uint8_t', 'nonErpPresent')])
+    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetUseProtection(uint8_t useProtection) [member function]
+    cls.add_method('SetUseProtection', 
+                   'void', 
+                   [param('uint8_t', 'useProtection')])
+    return
+
+def register_Ns3ErrorModel_methods(root_module, cls):
+    ## error-model.h (module 'network'): ns3::ErrorModel::ErrorModel(ns3::ErrorModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ErrorModel const &', 'arg0')])
+    ## error-model.h (module 'network'): ns3::ErrorModel::ErrorModel() [constructor]
+    cls.add_constructor([])
+    ## error-model.h (module 'network'): void ns3::ErrorModel::Disable() [member function]
+    cls.add_method('Disable', 
+                   'void', 
+                   [])
+    ## error-model.h (module 'network'): void ns3::ErrorModel::Enable() [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [])
+    ## error-model.h (module 'network'): static ns3::TypeId ns3::ErrorModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyChanged() [member function]
-    cls.add_method('HandleEnergyChanged', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyDepletion() [member function]
-    cls.add_method('HandleEnergyDepletion', 
-                   'void', 
+    ## error-model.h (module 'network'): bool ns3::ErrorModel::IsCorrupt(ns3::Ptr<ns3::Packet> pkt) [member function]
+    cls.add_method('IsCorrupt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'pkt')])
+    ## error-model.h (module 'network'): bool ns3::ErrorModel::IsEnabled() const [member function]
+    cls.add_method('IsEnabled', 
+                   'bool', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyRecharged() [member function]
-    cls.add_method('HandleEnergyRecharged', 
+                   is_const=True)
+    ## error-model.h (module 'network'): void ns3::ErrorModel::Reset() [member function]
+    cls.add_method('Reset', 
                    'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
-    cls.add_method('SetEnergySource', 
+                   [])
+    ## error-model.h (module 'network'): bool ns3::ErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorrupt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## error-model.h (module 'network'): void ns3::ErrorModel::DoReset() [member function]
+    cls.add_method('DoReset', 
                    'void', 
-                   [param('ns3::Ptr< ns3::EnergySource >', 'source')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::DoGetCurrentA() const [member function]
-    cls.add_method('DoGetCurrentA', 
-                   'double', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3DoubleValue_methods(root_module, cls):
-    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue() [constructor]
+def register_Ns3ErrorRateModel_methods(root_module, cls):
+    ## error-rate-model.h (module 'wifi'): ns3::ErrorRateModel::ErrorRateModel() [constructor]
     cls.add_constructor([])
-    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(double const & value) [constructor]
-    cls.add_constructor([param('double const &', 'value')])
-    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(ns3::DoubleValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DoubleValue const &', 'arg0')])
-    ## double.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::DoubleValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## error-rate-model.h (module 'wifi'): ns3::ErrorRateModel::ErrorRateModel(ns3::ErrorRateModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ErrorRateModel const &', 'arg0')])
+    ## error-rate-model.h (module 'wifi'): int64_t ns3::ErrorRateModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::CalculateSnr(ns3::WifiTxVector const & txVector, double ber) const [member function]
+    cls.add_method('CalculateSnr', 
+                   'double', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('double', 'ber')], 
+                   is_const=True)
+    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector const & txVector, double snr, uint64_t nbits, uint8_t numRxAntennas=1, ns3::WifiPpduField field=::ns3::WifiPpduField::WIFI_PPDU_FIELD_DATA, uint16_t staId=65535) const [member function]
+    cls.add_method('GetChunkSuccessRate', 
+                   'double', 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits'), param('uint8_t', 'numRxAntennas', default_value='1'), param('ns3::WifiPpduField', 'field', default_value='::ns3::WifiPpduField::WIFI_PPDU_FIELD_DATA'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::ErrorRateModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## double.h (module 'core'): bool ns3::DoubleValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+                   is_static=True)
+    ## error-rate-model.h (module 'wifi'): bool ns3::ErrorRateModel::IsAwgn() const [member function]
+    cls.add_method('IsAwgn', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## double.h (module 'core'): double ns3::DoubleValue::Get() const [member function]
-    cls.add_method('Get', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector const & txVector, double snr, uint64_t nbits, uint8_t numRxAntennas, ns3::WifiPpduField field, uint16_t staId) const [member function]
+    cls.add_method('DoGetChunkSuccessRate', 
+                   'double', 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits'), param('uint8_t', 'numRxAntennas'), param('ns3::WifiPpduField', 'field'), param('uint16_t', 'staId')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3Event_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Event const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Event const &', 'arg0')])
+    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetDuration() const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetEndTime() const [member function]
+    cls.add_method('GetEndTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<const ns3::WifiPpdu> ns3::Event::GetPpdu() const [member function]
+    cls.add_method('GetPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu const >', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): double ns3::Event::GetRxPowerW() const [member function]
+    cls.add_method('GetRxPowerW', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): double ns3::Event::GetRxPowerW(ns3::WifiSpectrumBand band) const [member function]
+    cls.add_method('GetRxPowerW', 
                    'double', 
+                   [param('std::pair< unsigned int, unsigned int >', 'band')], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::RxPowerWattPerChannelBand ns3::Event::GetRxPowerWPerBand() const [member function]
+    cls.add_method('GetRxPowerWPerBand', 
+                   'ns3::RxPowerWattPerChannelBand', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetStartTime() const [member function]
+    cls.add_method('GetStartTime', 
+                   'ns3::Time', 
                    [], 
                    is_const=True)
-    ## double.h (module 'core'): std::string ns3::DoubleValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## double.h (module 'core'): void ns3::DoubleValue::Set(double const & value) [member function]
-    cls.add_method('Set', 
+    ## interference-helper.h (module 'wifi'): ns3::WifiTxVector const & ns3::Event::GetTxVector() const [member function]
+    cls.add_method('GetTxVector', 
+                   'ns3::WifiTxVector const &', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateRxPowerW', 
                    'void', 
-                   [param('double const &', 'value')])
+                   [param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
     return
 
-def register_Ns3DsssParameterSet_methods(root_module, cls):
-    ## dsss-parameter-set.h (module 'wifi'): ns3::DsssParameterSet::DsssParameterSet(ns3::DsssParameterSet const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DsssParameterSet const &', 'arg0')])
-    ## dsss-parameter-set.h (module 'wifi'): ns3::DsssParameterSet::DsssParameterSet() [constructor]
+def register_Ns3EventImpl_methods(root_module, cls):
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl() [constructor]
     cls.add_constructor([])
-    ## dsss-parameter-set.h (module 'wifi'): uint8_t ns3::DsssParameterSet::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## dsss-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::DsssParameterSet::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## dsss-parameter-set.h (module 'wifi'): uint8_t ns3::DsssParameterSet::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## dsss-parameter-set.h (module 'wifi'): uint16_t ns3::DsssParameterSet::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## dsss-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::DsssParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
+    cls.add_method('Cancel', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SetCurrentChannel(uint8_t currentChannel) [member function]
-    cls.add_method('SetCurrentChannel', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
+    cls.add_method('Invoke', 
                    'void', 
-                   [param('uint8_t', 'currentChannel')])
-    ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SetDsssSupported(uint8_t dsssSupported) [member function]
-    cls.add_method('SetDsssSupported', 
+                   [])
+    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
+    cls.add_method('IsCancelled', 
+                   'bool', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
+    cls.add_method('Notify', 
                    'void', 
-                   [param('uint8_t', 'dsssSupported')])
+                   [], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
-def register_Ns3DsssSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader::DsssSigHeader(ns3::DsssSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DsssSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader::DsssSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::DsssSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::DsssSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
+def register_Ns3ExponentialRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ExponentialRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::DsssSigHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable::ExponentialRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint64_t ns3::DsssSigHeader::GetRate() const [member function]
-    cls.add_method('GetRate', 
-                   'uint64_t', 
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::DsssSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue(double mean, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger(uint32_t mean, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::DsssSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::SetRate(uint64_t rate) [member function]
-    cls.add_method('SetRate', 
-                   'void', 
-                   [param('uint64_t', 'rate')])
+                   is_virtual=True)
     return
 
-def register_Ns3EdcaParameterSet_methods(root_module, cls):
-    ## edca-parameter-set.h (module 'wifi'): ns3::EdcaParameterSet::EdcaParameterSet(ns3::EdcaParameterSet const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EdcaParameterSet const &', 'arg0')])
-    ## edca-parameter-set.h (module 'wifi'): ns3::EdcaParameterSet::EdcaParameterSet() [constructor]
+def register_Ns3ExtendedCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## extended-capabilities.h (module 'wifi'): ns3::ExtendedCapabilities::ExtendedCapabilities(ns3::ExtendedCapabilities const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ExtendedCapabilities const &', 'arg0')])
+    ## extended-capabilities.h (module 'wifi'): ns3::ExtendedCapabilities::ExtendedCapabilities() [constructor]
     cls.add_constructor([])
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
     cls.add_method('DeserializeInformationField', 
                    'uint8_t', 
                    [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
                    is_virtual=True)
-    ## edca-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::EdcaParameterSet::ElementId() const [member function]
+    ## extended-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::ExtendedCapabilities::ElementId() const [member function]
     cls.add_method('ElementId', 
                    'ns3::WifiInformationElementId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetBeAifsn() const [member function]
-    cls.add_method('GetBeAifsn', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte1() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte1', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBeCWmax() const [member function]
-    cls.add_method('GetBeCWmax', 
-                   'uint32_t', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte2() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte2', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBeCWmin() const [member function]
-    cls.add_method('GetBeCWmin', 
-                   'uint32_t', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte3() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte3', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetBeTxopLimit() const [member function]
-    cls.add_method('GetBeTxopLimit', 
-                   'uint16_t', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte4() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte4', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetBkAifsn() const [member function]
-    cls.add_method('GetBkAifsn', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte5() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte5', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBkCWmax() const [member function]
-    cls.add_method('GetBkCWmax', 
-                   'uint32_t', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte6() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte6', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBkCWmin() const [member function]
-    cls.add_method('GetBkCWmin', 
-                   'uint32_t', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte7() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte7', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetBkTxopLimit() const [member function]
-    cls.add_method('GetBkTxopLimit', 
-                   'uint16_t', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte8() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte8', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetInformationFieldSize() const [member function]
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetInformationFieldSize() const [member function]
     cls.add_method('GetInformationFieldSize', 
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetQosInfo() const [member function]
-    cls.add_method('GetQosInfo', 
+    ## extended-capabilities.h (module 'wifi'): uint16_t ns3::ExtendedCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## extended-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte1(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte1', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte2(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte2', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte3(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte3', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte4(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte4', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte5(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte5', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte6(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte6', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte7(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte7', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte8(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte8', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetHtSupported(uint8_t htSupported) [member function]
+    cls.add_method('SetHtSupported', 
+                   'void', 
+                   [param('uint8_t', 'htSupported')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetVhtSupported(uint8_t vhtSupported) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('uint8_t', 'vhtSupported')])
+    return
+
+def register_Ns3ExtendedSupportedRatesIE_methods(root_module, cls):
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE(ns3::ExtendedSupportedRatesIE const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ExtendedSupportedRatesIE const &', 'arg0')])
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE() [constructor]
+    cls.add_constructor([])
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE(ns3::SupportedRates * rates) [constructor]
+    cls.add_constructor([param('ns3::SupportedRates *', 'rates')])
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::ExtendedSupportedRatesIE::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## supported-rates.h (module 'wifi'): ns3::WifiInformationElementId ns3::ExtendedSupportedRatesIE::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::ExtendedSupportedRatesIE::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
                    'uint8_t', 
                    [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetSerializedSize() const [member function]
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint16_t ns3::ExtendedSupportedRatesIE::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetViAifsn() const [member function]
-    cls.add_method('GetViAifsn', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetViCWmax() const [member function]
-    cls.add_method('GetViCWmax', 
-                   'uint32_t', 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedSupportedRatesIE::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): void ns3::ExtendedSupportedRatesIE::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): void ns3::ExtendedSupportedRatesIE::SetSupportedRates(ns3::SupportedRates * rates) [member function]
+    cls.add_method('SetSupportedRates', 
+                   'void', 
+                   [param('ns3::SupportedRates *', 'rates')])
+    return
+
+def register_Ns3FixedRssLossModel_methods(root_module, cls):
+    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::FixedRssLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetViCWmin() const [member function]
-    cls.add_method('GetViCWmin', 
-                   'uint32_t', 
+                   is_static=True)
+    ## propagation-loss-model.h (module 'propagation'): ns3::FixedRssLossModel::FixedRssLossModel() [constructor]
+    cls.add_constructor([])
+    ## propagation-loss-model.h (module 'propagation'): void ns3::FixedRssLossModel::SetRss(double rss) [member function]
+    cls.add_method('SetRss', 
+                   'void', 
+                   [param('double', 'rss')])
+    ## propagation-loss-model.h (module 'propagation'): double ns3::FixedRssLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::FixedRssLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3FrameCaptureModel_methods(root_module, cls):
+    ## frame-capture-model.h (module 'wifi'): ns3::FrameCaptureModel::FrameCaptureModel() [constructor]
+    cls.add_constructor([])
+    ## frame-capture-model.h (module 'wifi'): ns3::FrameCaptureModel::FrameCaptureModel(ns3::FrameCaptureModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::FrameCaptureModel const &', 'arg0')])
+    ## frame-capture-model.h (module 'wifi'): bool ns3::FrameCaptureModel::CaptureNewFrame(ns3::Ptr<ns3::Event> currentEvent, ns3::Ptr<ns3::Event> newEvent) const [member function]
+    cls.add_method('CaptureNewFrame', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Event >', 'currentEvent'), param('ns3::Ptr< ns3::Event >', 'newEvent')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## frame-capture-model.h (module 'wifi'): static ns3::TypeId ns3::FrameCaptureModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetViTxopLimit() const [member function]
-    cls.add_method('GetViTxopLimit', 
-                   'uint16_t', 
+                   is_static=True)
+    ## frame-capture-model.h (module 'wifi'): bool ns3::FrameCaptureModel::IsInCaptureWindow(ns3::Time timePreambleDetected) const [member function]
+    cls.add_method('IsInCaptureWindow', 
+                   'bool', 
+                   [param('ns3::Time', 'timePreambleDetected')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3FrameExchangeManager_methods(root_module, cls):
+    ## frame-exchange-manager.h (module 'wifi'): ns3::FrameExchangeManager::FrameExchangeManager(ns3::FrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::FrameExchangeManager const &', 'arg0')])
+    ## frame-exchange-manager.h (module 'wifi'): ns3::FrameExchangeManager::FrameExchangeManager() [constructor]
+    cls.add_constructor([])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::CalculateAcknowledgmentTime(ns3::WifiAcknowledgment * acknowledgment) const [member function]
+    cls.add_method('CalculateAcknowledgmentTime', 
+                   'void', 
+                   [param('ns3::WifiAcknowledgment *', 'acknowledgment')], 
+                   is_const=True, is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::CalculateProtectionTime(ns3::WifiProtection * protection) const [member function]
+    cls.add_method('CalculateProtectionTime', 
+                   'void', 
+                   [param('ns3::WifiProtection *', 'protection')], 
+                   is_const=True, is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiAckManager> ns3::FrameExchangeManager::GetAckManager() const [member function]
+    cls.add_method('GetAckManager', 
+                   'ns3::Ptr< ns3::WifiAckManager >', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetVoAifsn() const [member function]
-    cls.add_method('GetVoAifsn', 
-                   'uint8_t', 
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiProtectionManager> ns3::FrameExchangeManager::GetProtectionManager() const [member function]
+    cls.add_method('GetProtectionManager', 
+                   'ns3::Ptr< ns3::WifiProtectionManager >', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetVoCWmax() const [member function]
-    cls.add_method('GetVoCWmax', 
-                   'uint32_t', 
+    ## frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::FrameExchangeManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetVoCWmin() const [member function]
-    cls.add_method('GetVoCWmin', 
-                   'uint32_t', 
+                   is_static=True)
+    ## frame-exchange-manager.h (module 'wifi'): ns3::WifiTxTimer const & ns3::FrameExchangeManager::GetWifiTxTimer() const [member function]
+    cls.add_method('GetWifiTxTimer', 
+                   'ns3::WifiTxTimer const &', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetVoTxopLimit() const [member function]
-    cls.add_method('GetVoTxopLimit', 
-                   'uint16_t', 
+    ## frame-exchange-manager.h (module 'wifi'): bool ns3::FrameExchangeManager::IsPromisc() const [member function]
+    cls.add_method('IsPromisc', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::IsQosSupported() const [member function]
-    cls.add_method('IsQosSupported', 
-                   'uint8_t', 
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyOffNow() [member function]
+    cls.add_method('NotifyOffNow', 
+                   'void', 
+                   [])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifySleepNow() [member function]
+    cls.add_method('NotifySleepNow', 
+                   'void', 
+                   [])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Receive(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool> > perMpduStatus) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('std::vector< bool >', 'perMpduStatus')])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ResetPhy() [member function]
+    cls.add_method('ResetPhy', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::EdcaParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetAckManager(ns3::Ptr<ns3::WifiAckManager> ackManager) [member function]
+    cls.add_method('SetAckManager', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeAci(uint8_t aci) [member function]
-    cls.add_method('SetBeAci', 
+                   [param('ns3::Ptr< ns3::WifiAckManager >', 'ackManager')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetAckedMpduCallback(ns3::FrameExchangeManager::AckedMpdu callback) [member function]
+    cls.add_method('SetAckedMpduCallback', 
                    'void', 
-                   [param('uint8_t', 'aci')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetBeAifsn', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
                    'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeCWmax(uint32_t cwMax) [member function]
-    cls.add_method('SetBeCWmax', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
                    'void', 
-                   [param('uint32_t', 'cwMax')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeCWmin(uint32_t cwMin) [member function]
-    cls.add_method('SetBeCWmin', 
+                   [param('ns3::Mac48Address', 'bssid')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> const channelAccessManager) [member function]
+    cls.add_method('SetChannelAccessManager', 
                    'void', 
-                   [param('uint32_t', 'cwMin')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeTxopLimit(uint16_t txop) [member function]
-    cls.add_method('SetBeTxopLimit', 
+                   [param('ns3::Ptr< ns3::ChannelAccessManager > const', 'channelAccessManager')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetDroppedMpduCallback(ns3::FrameExchangeManager::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
                    'void', 
-                   [param('uint16_t', 'txop')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkAci(uint8_t aci) [member function]
-    cls.add_method('SetBkAci', 
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetMacRxMiddle(ns3::Ptr<ns3::MacRxMiddle> const rxMiddle) [member function]
+    cls.add_method('SetMacRxMiddle', 
                    'void', 
-                   [param('uint8_t', 'aci')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetBkAifsn', 
+                   [param('ns3::Ptr< ns3::MacRxMiddle > const', 'rxMiddle')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetMacTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
+    cls.add_method('SetMacTxMiddle', 
                    'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkCWmax(uint32_t cwMax) [member function]
-    cls.add_method('SetBkCWmax', 
+                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
                    'void', 
-                   [param('uint32_t', 'cwMax')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkCWmin(uint32_t cwMin) [member function]
-    cls.add_method('SetBkCWmin', 
+                   [])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetProtectionManager(ns3::Ptr<ns3::WifiProtectionManager> protectionManager) [member function]
+    cls.add_method('SetProtectionManager', 
                    'void', 
-                   [param('uint32_t', 'cwMin')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkTxopLimit(uint16_t txop) [member function]
-    cls.add_method('SetBkTxopLimit', 
+                   [param('ns3::Ptr< ns3::WifiProtectionManager >', 'protectionManager')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('uint16_t', 'txop')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetQosInfo(uint8_t qosInfo) [member function]
-    cls.add_method('SetQosInfo', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetWifiPhy', 
                    'void', 
-                   [param('uint8_t', 'qosInfo')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetQosSupported(uint8_t qosSupported) [member function]
-    cls.add_method('SetQosSupported', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): bool ns3::FrameExchangeManager::StartTransmission(ns3::Ptr<ns3::Txop> dcf) [member function]
+    cls.add_method('StartTransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'dcf')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::CtsTimeout(ns3::Ptr<ns3::WifiMacQueueItem> rts, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('CtsTimeout', 
                    'void', 
-                   [param('uint8_t', 'qosSupported')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViAci(uint8_t aci) [member function]
-    cls.add_method('SetViAci', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'rts'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DequeueMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DequeueMpdu', 
                    'void', 
-                   [param('uint8_t', 'aci')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetViAifsn', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoSendCtsAfterRts(ns3::WifiMacHeader const & rtsHdr, ns3::WifiTxVector & ctsTxVector, double rtsSnr) [member function]
+    cls.add_method('DoSendCtsAfterRts', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'rtsHdr'), param('ns3::WifiTxVector &', 'ctsTxVector'), param('double', 'rtsSnr')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    cls.add_method('EndReceiveAmpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ForwardMpduDown(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector & txVector) [member function]
+    cls.add_method('ForwardMpduDown', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetCtsToSelfDurationId(ns3::WifiTxVector const & ctsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetCtsToSelfDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'ctsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::FrameExchangeManager::GetFirstFragmentIfNeeded(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('GetFirstFragmentIfNeeded', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetFrameDurationId(ns3::WifiMacHeader const & header, uint32_t size, ns3::WifiTxParameters const & txParams, ns3::Ptr<ns3::Packet> fragmentedPacket) const [member function]
+    cls.add_method('GetFrameDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Ptr< ns3::Packet >', 'fragmentedPacket')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::FrameExchangeManager::GetNextFragment() [member function]
+    cls.add_method('GetNextFragment', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetRtsDurationId(ns3::WifiTxVector const & rtsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetRtsDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'rtsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetTxDuration(uint32_t ppduPayloadSize, ns3::Mac48Address receiver, ns3::WifiTxParameters const & txParams) const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'ppduPayloadSize'), param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NavResetTimeout() [member function]
+    cls.add_method('NavResetTimeout', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NormalAckTimeout(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('NormalAckTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyPacketDiscarded(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyPacketDiscarded', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyReceivedNormalAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyReceivedNormalAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::PreProcessFrame(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('PreProcessFrame', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ReceiveMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector const & txVector, bool inAmpdu) [member function]
+    cls.add_method('ReceiveMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ReceivedNormalAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector, ns3::WifiTxVector const & ackTxVector, ns3::RxSignalInfo const & rxInfo, double snr) [member function]
+    cls.add_method('ReceivedNormalAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiTxVector const &', 'ackTxVector'), param('ns3::RxSignalInfo const &', 'rxInfo'), param('double', 'snr')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedCts(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedCts', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendCtsAfterRts(ns3::WifiMacHeader const & rtsHdr, ns3::WifiMode rtsTxMode, double rtsSnr) [member function]
+    cls.add_method('SendCtsAfterRts', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'rtsHdr'), param('ns3::WifiMode', 'rtsTxMode'), param('double', 'rtsSnr')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendCtsToSelf(ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('SendCtsToSelf', 
                    'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViCWmax(uint32_t cwMax) [member function]
-    cls.add_method('SetViCWmax', 
+                   [param('ns3::WifiTxParameters const &', 'txParams')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendMpduWithProtection(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams) [member function]
+    cls.add_method('SendMpduWithProtection', 
                    'void', 
-                   [param('uint32_t', 'cwMax')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViCWmin(uint32_t cwMin) [member function]
-    cls.add_method('SetViCWmin', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendNormalAck(ns3::WifiMacHeader const & hdr, ns3::WifiTxVector const & dataTxVector, double dataSnr) [member function]
+    cls.add_method('SendNormalAck', 
                    'void', 
-                   [param('uint32_t', 'cwMin')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViTxopLimit(uint16_t txop) [member function]
-    cls.add_method('SetViTxopLimit', 
+                   [param('ns3::WifiMacHeader const &', 'hdr'), param('ns3::WifiTxVector const &', 'dataTxVector'), param('double', 'dataSnr')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendRts(ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('SendRts', 
                    'void', 
-                   [param('uint16_t', 'txop')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoAci(uint8_t aci) [member function]
-    cls.add_method('SetVoAci', 
+                   [param('ns3::WifiTxParameters const &', 'txParams')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::TransmissionFailed() [member function]
+    cls.add_method('TransmissionFailed', 
                    'void', 
-                   [param('uint8_t', 'aci')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetVoAifsn', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::TransmissionSucceeded() [member function]
+    cls.add_method('TransmissionSucceeded', 
                    'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoCWmax(uint32_t cwMax) [member function]
-    cls.add_method('SetVoCWmax', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::UpdateNav(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('UpdateNav', 
                    'void', 
-                   [param('uint32_t', 'cwMax')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoCWmin(uint32_t cwMin) [member function]
-    cls.add_method('SetVoCWmin', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::UpdateTxDuration(ns3::Mac48Address receiver, ns3::WifiTxParameters & txParams) const [member function]
+    cls.add_method('UpdateTxDuration', 
                    'void', 
-                   [param('uint32_t', 'cwMin')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoTxopLimit(uint16_t txop) [member function]
-    cls.add_method('SetVoTxopLimit', 
+                   [param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters &', 'txParams')], 
+                   is_const=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Reset() [member function]
+    cls.add_method('Reset', 
                    'void', 
-                   [param('uint16_t', 'txop')])
+                   [], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3EmpiricalRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable::EmpiricalRandomVariable() [constructor]
+def register_Ns3FriisPropagationLossModel_methods(root_module, cls):
+    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::FriisPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## propagation-loss-model.h (module 'propagation'): ns3::FriisPropagationLossModel::FriisPropagationLossModel() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::CDF(double v, double c) [member function]
-    cls.add_method('CDF', 
+    ## propagation-loss-model.h (module 'propagation'): void ns3::FriisPropagationLossModel::SetFrequency(double frequency) [member function]
+    cls.add_method('SetFrequency', 
                    'void', 
-                   [param('double', 'v'), param('double', 'c')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::EmpiricalRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   [param('double', 'frequency')])
+    ## propagation-loss-model.h (module 'propagation'): void ns3::FriisPropagationLossModel::SetSystemLoss(double systemLoss) [member function]
+    cls.add_method('SetSystemLoss', 
+                   'void', 
+                   [param('double', 'systemLoss')])
+    ## propagation-loss-model.h (module 'propagation'): void ns3::FriisPropagationLossModel::SetMinLoss(double minLoss) [member function]
+    cls.add_method('SetMinLoss', 
+                   'void', 
+                   [param('double', 'minLoss')])
+    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::GetMinLoss() const [member function]
+    cls.add_method('GetMinLoss', 
+                   'double', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::EmpiricalRandomVariable::GetTypeId() [member function]
+                   is_const=True)
+    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::GetSystemLoss() const [member function]
+    cls.add_method('GetSystemLoss', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::FriisPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3GammaRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::GammaRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::GetValue() [member function]
+    ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable::GammaRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetBeta() const [member function]
+    cls.add_method('GetBeta', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue(double alpha, double beta) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha'), param('double', 'beta')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger(uint32_t alpha, uint32_t beta) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'alpha'), param('uint32_t', 'beta')])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue() [member function]
     cls.add_method('GetValue', 
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate() [member function]
-    cls.add_method('Interpolate', 
-                   'double', 
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): bool ns3::EmpiricalRandomVariable::SetInterpolate(bool interpolate) [member function]
-    cls.add_method('SetInterpolate', 
-                   'bool', 
-                   [param('bool', 'interpolate')])
     return
 
-def register_Ns3EmptyAttributeAccessor_methods(root_module, cls):
-    ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor::EmptyAttributeAccessor(ns3::EmptyAttributeAccessor const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EmptyAttributeAccessor const &', 'arg0')])
-    ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor::EmptyAttributeAccessor() [constructor]
+def register_Ns3HeCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities::HeCapabilities(ns3::HeCapabilities const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeCapabilities const &', 'arg0')])
+    ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities::HeCapabilities() [constructor]
     cls.add_constructor([])
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
-    cls.add_method('Get', 
-                   'bool', 
-                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
-                   is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::HasGetter() const [member function]
-    cls.add_method('HasGetter', 
-                   'bool', 
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## he-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::HasSetter() const [member function]
-    cls.add_method('HasSetter', 
-                   'bool', 
+    ## he-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeCapabilities::ElementIdExt() const [member function]
+    cls.add_method('ElementIdExt', 
+                   'ns3::WifiInformationElementId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
-    cls.add_method('Set', 
-                   'bool', 
-                   [param('ns3::ObjectBase *', 'object'), param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_virtual=True)
-    return
-
-def register_Ns3EmptyAttributeChecker_methods(root_module, cls):
-    ## attribute.h (module 'core'): ns3::EmptyAttributeChecker::EmptyAttributeChecker(ns3::EmptyAttributeChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EmptyAttributeChecker const &', 'arg0')])
-    ## attribute.h (module 'core'): ns3::EmptyAttributeChecker::EmptyAttributeChecker() [constructor]
-    cls.add_constructor([])
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
-    cls.add_method('Check', 
-                   'bool', 
-                   [param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
-    cls.add_method('Copy', 
-                   'bool', 
-                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
-                   is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeChecker::Create() const [member function]
-    cls.add_method('Create', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetChannelWidthSet() const [member function]
+    cls.add_method('GetChannelWidthSet', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeChecker::GetUnderlyingTypeInformation() const [member function]
-    cls.add_method('GetUnderlyingTypeInformation', 
-                   'std::string', 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeLtfAndGiForHePpdus() const [member function]
+    cls.add_method('GetHeLtfAndGiForHePpdus', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeChecker::GetValueTypeName() const [member function]
-    cls.add_method('GetValueTypeName', 
-                   'std::string', 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo1() const [member function]
+    cls.add_method('GetHeMacCapabilitiesInfo1', 
+                   'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeChecker::HasUnderlyingTypeInformation() const [member function]
-    cls.add_method('HasUnderlyingTypeInformation', 
-                   'bool', 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
+    cls.add_method('GetHeMacCapabilitiesInfo2', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint64_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo1() const [member function]
+    cls.add_method('GetHePhyCapabilitiesInfo1', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
+    cls.add_method('GetHePhyCapabilitiesInfo2', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestMcsSupported() const [member function]
+    cls.add_method('GetHighestMcsSupported', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestNssSupported() const [member function]
+    cls.add_method('GetHighestNssSupported', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    return
-
-def register_Ns3EmptyAttributeValue_methods(root_module, cls):
-    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
-    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue() [constructor]
-    cls.add_constructor([])
-    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetLdpcCodingInPayload() const [member function]
+    cls.add_method('GetLdpcCodingInPayload', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+                   is_const=True, is_virtual=True)
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSupportedMcsAndNss() const [member function]
+    cls.add_method('GetSupportedMcsAndNss', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedRxMcs', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True, visibility='private')
-    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True, visibility='private')
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedTxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::HeCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetChannelWidthSet(uint8_t channelWidthSet) [member function]
+    cls.add_method('SetChannelWidthSet', 
+                   'void', 
+                   [param('uint8_t', 'channelWidthSet')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeLtfAndGiForHePpdus(uint8_t heLtfAndGiForHePpdus) [member function]
+    cls.add_method('SetHeLtfAndGiForHePpdus', 
+                   'void', 
+                   [param('uint8_t', 'heLtfAndGiForHePpdus')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint8_t ctrl2) [member function]
+    cls.add_method('SetHeMacCapabilitiesInfo', 
+                   'void', 
+                   [param('uint32_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint8_t ctrl2) [member function]
+    cls.add_method('SetHePhyCapabilitiesInfo', 
+                   'void', 
+                   [param('uint64_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSupported(uint8_t heSupported) [member function]
+    cls.add_method('SetHeSupported', 
+                   'void', 
+                   [param('uint8_t', 'heSupported')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHighestMcsSupported(uint8_t mcs) [member function]
+    cls.add_method('SetHighestMcsSupported', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHighestNssSupported(uint8_t nss) [member function]
+    cls.add_method('SetHighestNssSupported', 
+                   'void', 
+                   [param('uint8_t', 'nss')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetLdpcCodingInPayload(uint8_t ldpcCodingInPayload) [member function]
+    cls.add_method('SetLdpcCodingInPayload', 
+                   'void', 
+                   [param('uint8_t', 'ldpcCodingInPayload')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetMaxAmpduLength(uint32_t maxAmpduLength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
+                   'void', 
+                   [param('uint32_t', 'maxAmpduLength')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetSupportedMcsAndNss(uint16_t ctrl) [member function]
+    cls.add_method('SetSupportedMcsAndNss', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
     return
 
-def register_Ns3EnergyHarvester_methods(root_module, cls):
-    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester::EnergyHarvester(ns3::EnergyHarvester const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EnergyHarvester const &', 'arg0')])
-    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester::EnergyHarvester() [constructor]
+def register_Ns3HeConfiguration_methods(root_module, cls):
+    ## he-configuration.h (module 'wifi'): ns3::HeConfiguration::HeConfiguration(ns3::HeConfiguration const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeConfiguration const &', 'arg0')])
+    ## he-configuration.h (module 'wifi'): ns3::HeConfiguration::HeConfiguration() [constructor]
     cls.add_constructor([])
-    ## energy-harvester.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergyHarvester::GetEnergySource() const [member function]
-    cls.add_method('GetEnergySource', 
-                   'ns3::Ptr< ns3::EnergySource >', 
+    ## he-configuration.h (module 'wifi'): uint8_t ns3::HeConfiguration::GetBssColor() const [member function]
+    cls.add_method('GetBssColor', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## energy-harvester.h (module 'energy'): ns3::Ptr<ns3::Node> ns3::EnergyHarvester::GetNode() const [member function]
-    cls.add_method('GetNode', 
-                   'ns3::Ptr< ns3::Node >', 
+    ## he-configuration.h (module 'wifi'): ns3::Time ns3::HeConfiguration::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'ns3::Time', 
                    [], 
                    is_const=True)
-    ## energy-harvester.h (module 'energy'): double ns3::EnergyHarvester::GetPower() const [member function]
-    cls.add_method('GetPower', 
-                   'double', 
+    ## he-configuration.h (module 'wifi'): uint16_t ns3::HeConfiguration::GetMpduBufferSize() const [member function]
+    cls.add_method('GetMpduBufferSize', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## energy-harvester.h (module 'energy'): static ns3::TypeId ns3::EnergyHarvester::GetTypeId() [member function]
+    ## he-configuration.h (module 'wifi'): static ns3::TypeId ns3::HeConfiguration::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
-    cls.add_method('SetEnergySource', 
+    ## he-configuration.h (module 'wifi'): void ns3::HeConfiguration::SetBssColor(uint8_t bssColor) [member function]
+    cls.add_method('SetBssColor', 
                    'void', 
-                   [param('ns3::Ptr< ns3::EnergySource >', 'source')])
-    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::SetNode(ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('SetNode', 
+                   [param('uint8_t', 'bssColor')])
+    ## he-configuration.h (module 'wifi'): void ns3::HeConfiguration::SetGuardInterval(ns3::Time guardInterval) [member function]
+    cls.add_method('SetGuardInterval', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Time', 'guardInterval')])
+    ## he-configuration.h (module 'wifi'): void ns3::HeConfiguration::SetMpduBufferSize(uint16_t size) [member function]
+    cls.add_method('SetMpduBufferSize', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## energy-harvester.h (module 'energy'): double ns3::EnergyHarvester::DoGetPower() const [member function]
-    cls.add_method('DoGetPower', 
-                   'double', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
+                   [param('uint16_t', 'size')])
     return
 
-def register_Ns3EnergySource_methods(root_module, cls):
-    ## energy-source.h (module 'energy'): ns3::EnergySource::EnergySource(ns3::EnergySource const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EnergySource const &', 'arg0')])
-    ## energy-source.h (module 'energy'): ns3::EnergySource::EnergySource() [constructor]
+def register_Ns3HeOperation_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## he-operation.h (module 'wifi'): ns3::HeOperation::HeOperation(ns3::HeOperation const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeOperation const &', 'arg0')])
+    ## he-operation.h (module 'wifi'): ns3::HeOperation::HeOperation() [constructor]
     cls.add_constructor([])
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::AppendDeviceEnergyModel(ns3::Ptr<ns3::DeviceEnergyModel> deviceEnergyModelPtr) [member function]
-    cls.add_method('AppendDeviceEnergyModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::DeviceEnergyModel >', 'deviceEnergyModelPtr')])
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::ConnectEnergyHarvester(ns3::Ptr<ns3::EnergyHarvester> energyHarvesterPtr) [member function]
-    cls.add_method('ConnectEnergyHarvester', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::EnergyHarvester >', 'energyHarvesterPtr')])
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::DisposeDeviceModels() [member function]
-    cls.add_method('DisposeDeviceModels', 
-                   'void', 
-                   [])
-    ## energy-source.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::EnergySource::FindDeviceEnergyModels(ns3::TypeId tid) [member function]
-    cls.add_method('FindDeviceEnergyModels', 
-                   'ns3::DeviceEnergyModelContainer', 
-                   [param('ns3::TypeId', 'tid')])
-    ## energy-source.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::EnergySource::FindDeviceEnergyModels(std::string name) [member function]
-    cls.add_method('FindDeviceEnergyModels', 
-                   'ns3::DeviceEnergyModelContainer', 
-                   [param('std::string', 'name')])
-    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetEnergyFraction() [member function]
-    cls.add_method('GetEnergyFraction', 
-                   'double', 
+    ## he-operation.h (module 'wifi'): uint8_t ns3::HeOperation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## he-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeOperation::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetInitialEnergy() const [member function]
-    cls.add_method('GetInitialEnergy', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## he-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeOperation::ElementIdExt() const [member function]
+    cls.add_method('ElementIdExt', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## energy-source.h (module 'energy'): ns3::Ptr<ns3::Node> ns3::EnergySource::GetNode() const [member function]
-    cls.add_method('GetNode', 
-                   'ns3::Ptr< ns3::Node >', 
+                   is_const=True, is_virtual=True)
+    ## he-operation.h (module 'wifi'): uint16_t ns3::HeOperation::GetBasicHeMcsAndNssSet() const [member function]
+    cls.add_method('GetBasicHeMcsAndNssSet', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetRemainingEnergy() [member function]
-    cls.add_method('GetRemainingEnergy', 
-                   'double', 
+    ## he-operation.h (module 'wifi'): uint8_t ns3::HeOperation::GetBssColor() const [member function]
+    cls.add_method('GetBssColor', 
+                   'uint8_t', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetSupplyVoltage() const [member function]
-    cls.add_method('GetSupplyVoltage', 
-                   'double', 
+                   is_const=True)
+    ## he-operation.h (module 'wifi'): uint32_t ns3::HeOperation::GetHeOperationParameters() const [member function]
+    cls.add_method('GetHeOperationParameters', 
+                   'uint32_t', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## energy-source.h (module 'energy'): static ns3::TypeId ns3::EnergySource::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_const=True)
+    ## he-operation.h (module 'wifi'): uint8_t ns3::HeOperation::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::InitializeDeviceModels() [member function]
-    cls.add_method('InitializeDeviceModels', 
-                   'void', 
-                   [])
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::SetNode(ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('SetNode', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::UpdateEnergySource() [member function]
-    cls.add_method('UpdateEnergySource', 
-                   'void', 
+                   is_const=True, is_virtual=True)
+    ## he-operation.h (module 'wifi'): uint16_t ns3::HeOperation::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::BreakDeviceEnergyModelRefCycle() [member function]
-    cls.add_method('BreakDeviceEnergyModelRefCycle', 
+                   is_const=True, is_virtual=True)
+    ## he-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::HeOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
                    'void', 
-                   [], 
-                   visibility='protected')
-    ## energy-source.h (module 'energy'): double ns3::EnergySource::CalculateTotalCurrent() [member function]
-    cls.add_method('CalculateTotalCurrent', 
-                   'double', 
-                   [], 
-                   visibility='protected')
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyChanged() [member function]
-    cls.add_method('NotifyEnergyChanged', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetBssColor(uint8_t bssColor) [member function]
+    cls.add_method('SetBssColor', 
                    'void', 
-                   [], 
-                   visibility='protected')
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyDrained() [member function]
-    cls.add_method('NotifyEnergyDrained', 
+                   [param('uint8_t', 'bssColor')])
+    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetHeOperationParameters(uint32_t ctrl) [member function]
+    cls.add_method('SetHeOperationParameters', 
                    'void', 
-                   [], 
-                   visibility='protected')
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyRecharged() [member function]
-    cls.add_method('NotifyEnergyRecharged', 
+                   [param('uint32_t', 'ctrl')])
+    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetHeSupported(uint8_t heSupported) [member function]
+    cls.add_method('SetHeSupported', 
                    'void', 
-                   [], 
-                   visibility='protected')
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('uint8_t', 'heSupported')])
+    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetMaxHeMcsPerNss(uint8_t nss, uint8_t maxHeMcs) [member function]
+    cls.add_method('SetMaxHeMcsPerNss', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
+                   [param('uint8_t', 'nss'), param('uint8_t', 'maxHeMcs')])
     return
 
-def register_Ns3EnergySourceContainer_methods(root_module, cls):
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::EnergySourceContainer const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EnergySourceContainer const &', 'arg0')])
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer() [constructor]
+def register_Ns3HtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities(ns3::HtCapabilities const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtCapabilities const &', 'arg0')])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities() [constructor]
     cls.add_constructor([])
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::Ptr<ns3::EnergySource> source) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::EnergySource >', 'source')])
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(std::string sourceName) [constructor]
-    cls.add_constructor([param('std::string', 'sourceName')])
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::EnergySourceContainer const & a, ns3::EnergySourceContainer const & b) [constructor]
-    cls.add_constructor([param('ns3::EnergySourceContainer const &', 'a'), param('ns3::EnergySourceContainer const &', 'b')])
-    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(ns3::EnergySourceContainer container) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::EnergySourceContainer', 'container')])
-    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(ns3::Ptr<ns3::EnergySource> source) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::EnergySource >', 'source')])
-    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(std::string sourceName) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('std::string', 'sourceName')])
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::Iterator ns3::EnergySourceContainer::Begin() const [member function]
-    cls.add_method('Begin', 
-                   'ns3::EnergySourceContainer::Iterator', 
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAmpduParameters() const [member function]
+    cls.add_method('GetAmpduParameters', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::Iterator ns3::EnergySourceContainer::End() const [member function]
-    cls.add_method('End', 
-                   'ns3::EnergySourceContainer::Iterator', 
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAntennaSelectionCapabilities() const [member function]
+    cls.add_method('GetAntennaSelectionCapabilities', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## energy-source-container.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergySourceContainer::Get(uint32_t i) const [member function]
-    cls.add_method('Get', 
-                   'ns3::Ptr< ns3::EnergySource >', 
-                   [param('uint32_t', 'i')], 
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetExtendedHtCapabilities() const [member function]
+    cls.add_method('GetExtendedHtCapabilities', 
+                   'uint16_t', 
+                   [], 
                    is_const=True)
-    ## energy-source-container.h (module 'energy'): uint32_t ns3::EnergySourceContainer::GetN() const [member function]
-    cls.add_method('GetN', 
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetHtCapabilitiesInfo() const [member function]
+    cls.add_method('GetHtCapabilitiesInfo', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## energy-source-container.h (module 'energy'): static ns3::TypeId ns3::EnergySourceContainer::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetMaxAmsduLength() const [member function]
+    cls.add_method('GetMaxAmsduLength', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetRxHighestSupportedAntennas() const [member function]
+    cls.add_method('GetRxHighestSupportedAntennas', 
+                   'uint8_t', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3EnumChecker_methods(root_module, cls):
-    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker(ns3::EnumChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EnumChecker const &', 'arg0')])
-    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker() [constructor]
-    cls.add_constructor([])
-    ## enum.h (module 'core'): void ns3::EnumChecker::Add(int value, std::string name) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('int', 'value'), param('std::string', 'name')])
-    ## enum.h (module 'core'): void ns3::EnumChecker::AddDefault(int value, std::string name) [member function]
-    cls.add_method('AddDefault', 
-                   'void', 
-                   [param('int', 'value'), param('std::string', 'name')])
-    ## enum.h (module 'core'): bool ns3::EnumChecker::Check(ns3::AttributeValue const & value) const [member function]
-    cls.add_method('Check', 
-                   'bool', 
-                   [param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): bool ns3::EnumChecker::Copy(ns3::AttributeValue const & src, ns3::AttributeValue & dst) const [member function]
-    cls.add_method('Copy', 
-                   'bool', 
-                   [param('ns3::AttributeValue const &', 'src'), param('ns3::AttributeValue &', 'dst')], 
                    is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumChecker::Create() const [member function]
-    cls.add_method('Create', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval20() const [member function]
+    cls.add_method('GetShortGuardInterval20', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetName(int value) const [member function]
-    cls.add_method('GetName', 
-                   'std::string', 
-                   [param('int', 'value')], 
                    is_const=True)
-    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetUnderlyingTypeInformation() const [member function]
-    cls.add_method('GetUnderlyingTypeInformation', 
-                   'std::string', 
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
+    cls.add_method('GetSupportedChannelWidth', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): int ns3::EnumChecker::GetValue(std::string const name) const [member function]
-    cls.add_method('GetValue', 
-                   'int', 
-                   [param('std::string const', 'name')], 
                    is_const=True)
-    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetValueTypeName() const [member function]
-    cls.add_method('GetValueTypeName', 
-                   'std::string', 
+    ## ht-capabilities.h (module 'wifi'): uint64_t ns3::HtCapabilities::GetSupportedMcsSet1() const [member function]
+    cls.add_method('GetSupportedMcsSet1', 
+                   'uint64_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): bool ns3::EnumChecker::HasUnderlyingTypeInformation() const [member function]
-    cls.add_method('HasUnderlyingTypeInformation', 
-                   'bool', 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint64_t ns3::HtCapabilities::GetSupportedMcsSet2() const [member function]
+    cls.add_method('GetSupportedMcsSet2', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetTxBfCapabilities() const [member function]
+    cls.add_method('GetTxBfCapabilities', 
+                   'uint32_t', 
                    [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::HtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAmpduParameters(uint8_t ctrl) [member function]
+    cls.add_method('SetAmpduParameters', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAntennaSelectionCapabilities(uint8_t ctrl) [member function]
+    cls.add_method('SetAntennaSelectionCapabilities', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetExtendedHtCapabilities(uint16_t ctrl) [member function]
+    cls.add_method('SetExtendedHtCapabilities', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtCapabilitiesInfo(uint16_t ctrl) [member function]
+    cls.add_method('SetHtCapabilitiesInfo', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtSupported(uint8_t htSupported) [member function]
+    cls.add_method('SetHtSupported', 
+                   'void', 
+                   [param('uint8_t', 'htSupported')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLSigProtectionSupport(uint8_t lSigProtection) [member function]
+    cls.add_method('SetLSigProtectionSupport', 
+                   'void', 
+                   [param('uint8_t', 'lSigProtection')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
+    cls.add_method('SetLdpc', 
+                   'void', 
+                   [param('uint8_t', 'ldpc')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmpduLength(uint32_t maxAmpduLength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
+                   'void', 
+                   [param('uint32_t', 'maxAmpduLength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmsduLength(uint16_t maxAmsduLength) [member function]
+    cls.add_method('SetMaxAmsduLength', 
+                   'void', 
+                   [param('uint16_t', 'maxAmsduLength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxHighestSupportedDataRate(uint16_t maxSupportedRate) [member function]
+    cls.add_method('SetRxHighestSupportedDataRate', 
+                   'void', 
+                   [param('uint16_t', 'maxSupportedRate')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
+    cls.add_method('SetRxMcsBitmask', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval20(uint8_t shortGuardInterval) [member function]
+    cls.add_method('SetShortGuardInterval20', 
+                   'void', 
+                   [param('uint8_t', 'shortGuardInterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval40(uint8_t shortGuardInterval) [member function]
+    cls.add_method('SetShortGuardInterval40', 
+                   'void', 
+                   [param('uint8_t', 'shortGuardInterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedChannelWidth) [member function]
+    cls.add_method('SetSupportedChannelWidth', 
+                   'void', 
+                   [param('uint8_t', 'supportedChannelWidth')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedMcsSet(uint64_t ctrl1, uint64_t ctrl2) [member function]
+    cls.add_method('SetSupportedMcsSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxBfCapabilities(uint32_t ctrl) [member function]
+    cls.add_method('SetTxBfCapabilities', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams) [member function]
+    cls.add_method('SetTxMaxNSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'maxTxSpatialStreams')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMcsSetDefined(uint8_t txMcsSetDefined) [member function]
+    cls.add_method('SetTxMcsSetDefined', 
+                   'void', 
+                   [param('uint8_t', 'txMcsSetDefined')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal) [member function]
+    cls.add_method('SetTxRxMcsSetUnequal', 
+                   'void', 
+                   [param('uint8_t', 'txRxMcsSetUnequal')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxUnequalModulation(uint8_t txUnequalModulation) [member function]
+    cls.add_method('SetTxUnequalModulation', 
+                   'void', 
+                   [param('uint8_t', 'txUnequalModulation')])
     return
 
-def register_Ns3EnumValue_methods(root_module, cls):
-    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(ns3::EnumValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EnumValue const &', 'arg0')])
-    ## enum.h (module 'core'): ns3::EnumValue::EnumValue() [constructor]
+def register_Ns3HtConfiguration_methods(root_module, cls):
+    ## ht-configuration.h (module 'wifi'): ns3::HtConfiguration::HtConfiguration(ns3::HtConfiguration const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtConfiguration const &', 'arg0')])
+    ## ht-configuration.h (module 'wifi'): ns3::HtConfiguration::HtConfiguration() [constructor]
     cls.add_constructor([])
-    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(int value) [constructor]
-    cls.add_constructor([param('int', 'value')])
-    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## ht-configuration.h (module 'wifi'): bool ns3::HtConfiguration::GetLdpcSupported() const [member function]
+    cls.add_method('GetLdpcSupported', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): bool ns3::EnumValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+                   is_const=True)
+    ## ht-configuration.h (module 'wifi'): bool ns3::HtConfiguration::GetShortGuardIntervalSupported() const [member function]
+    cls.add_method('GetShortGuardIntervalSupported', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## enum.h (module 'core'): int ns3::EnumValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'int', 
                    [], 
                    is_const=True)
-    ## enum.h (module 'core'): std::string ns3::EnumValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): void ns3::EnumValue::Set(int value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('int', 'value')])
-    return
-
-def register_Ns3ErlangRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ErlangRandomVariable::GetTypeId() [member function]
+    ## ht-configuration.h (module 'wifi'): static ns3::TypeId ns3::HtConfiguration::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ErlangRandomVariable::ErlangRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetK() const [member function]
-    cls.add_method('GetK', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetLambda() const [member function]
-    cls.add_method('GetLambda', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue(uint32_t k, double lambda) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('uint32_t', 'k'), param('double', 'lambda')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger(uint32_t k, uint32_t lambda) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'k'), param('uint32_t', 'lambda')])
-    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [], 
-                   is_virtual=True)
+    ## ht-configuration.h (module 'wifi'): void ns3::HtConfiguration::SetLdpcSupported(bool enable) [member function]
+    cls.add_method('SetLdpcSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## ht-configuration.h (module 'wifi'): void ns3::HtConfiguration::SetShortGuardIntervalSupported(bool enable) [member function]
+    cls.add_method('SetShortGuardIntervalSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     return
 
-def register_Ns3ErpInformation_methods(root_module, cls):
+def register_Ns3HtOperation_methods(root_module, cls):
     cls.add_output_stream_operator()
-    ## erp-information.h (module 'wifi'): ns3::ErpInformation::ErpInformation(ns3::ErpInformation const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ErpInformation const &', 'arg0')])
-    ## erp-information.h (module 'wifi'): ns3::ErpInformation::ErpInformation() [constructor]
+    ## ht-operation.h (module 'wifi'): ns3::HtOperation::HtOperation(ns3::HtOperation const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtOperation const &', 'arg0')])
+    ## ht-operation.h (module 'wifi'): ns3::HtOperation::HtOperation() [constructor]
     cls.add_constructor([])
-    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
     cls.add_method('DeserializeInformationField', 
                    'uint8_t', 
                    [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
                    is_virtual=True)
-    ## erp-information.h (module 'wifi'): ns3::WifiInformationElementId ns3::ErpInformation::ElementId() const [member function]
+    ## ht-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::HtOperation::ElementId() const [member function]
     cls.add_method('ElementId', 
                    'ns3::WifiInformationElementId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetBarkerPreambleMode() const [member function]
-    cls.add_method('GetBarkerPreambleMode', 
+    ## ht-operation.h (module 'wifi'): uint64_t ns3::HtOperation::GetBasicMcsSet1() const [member function]
+    cls.add_method('GetBasicMcsSet1', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint64_t ns3::HtOperation::GetBasicMcsSet2() const [member function]
+    cls.add_method('GetBasicMcsSet2', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetDualBeacon() const [member function]
+    cls.add_method('GetDualBeacon', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetInformationFieldSize() const [member function]
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetDualCtsProtection() const [member function]
+    cls.add_method('GetDualCtsProtection', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetHtProtection() const [member function]
+    cls.add_method('GetHtProtection', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetInformationFieldSize() const [member function]
     cls.add_method('GetInformationFieldSize', 
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetNonErpPresent() const [member function]
-    cls.add_method('GetNonErpPresent', 
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetInformationSubset1() const [member function]
+    cls.add_method('GetInformationSubset1', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## erp-information.h (module 'wifi'): uint16_t ns3::ErpInformation::GetSerializedSize() const [member function]
+    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetInformationSubset2() const [member function]
+    cls.add_method('GetInformationSubset2', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetInformationSubset3() const [member function]
+    cls.add_method('GetInformationSubset3', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetLSigTxopProtectionFullSupport() const [member function]
+    cls.add_method('GetLSigTxopProtectionFullSupport', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetNonGfHtStasPresent() const [member function]
+    cls.add_method('GetNonGfHtStasPresent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetObssNonHtStasPresent() const [member function]
+    cls.add_method('GetObssNonHtStasPresent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetPcoActive() const [member function]
+    cls.add_method('GetPcoActive', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetPhase() const [member function]
+    cls.add_method('GetPhase', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetPrimaryChannel() const [member function]
+    cls.add_method('GetPrimaryChannel', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetRifsMode() const [member function]
+    cls.add_method('GetRifsMode', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetRxHighestSupportedDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetSecondaryChannelOffset() const [member function]
+    cls.add_method('GetSecondaryChannelOffset', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetStaChannelWidth() const [member function]
+    cls.add_method('GetStaChannelWidth', 
+                   'uint8_t', 
+                   [], 
                    is_const=True)
-    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetUseProtection() const [member function]
-    cls.add_method('GetUseProtection', 
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetStbcBeacon() const [member function]
+    cls.add_method('GetStbcBeacon', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## erp-information.h (module 'wifi'): ns3::Buffer::Iterator ns3::ErpInformation::Serialize(ns3::Buffer::Iterator start) const [member function]
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxMaxNSpatialStreams() const [member function]
+    cls.add_method('GetTxMaxNSpatialStreams', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxMcsSetDefined() const [member function]
+    cls.add_method('GetTxMcsSetDefined', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxRxMcsSetUnequal() const [member function]
+    cls.add_method('GetTxRxMcsSetUnequal', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxUnequalModulation() const [member function]
+    cls.add_method('GetTxUnequalModulation', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): bool ns3::HtOperation::IsSupportedMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::HtOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+                   is_const=True, is_virtual=True)
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetBarkerPreambleMode(uint8_t barkerPreambleMode) [member function]
-    cls.add_method('SetBarkerPreambleMode', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetBasicMcsSet(uint64_t ctrl1, uint64_t ctrl2) [member function]
+    cls.add_method('SetBasicMcsSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetDualBeacon(uint8_t dualBeacon) [member function]
+    cls.add_method('SetDualBeacon', 
+                   'void', 
+                   [param('uint8_t', 'dualBeacon')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetDualCtsProtection(uint8_t dualCtsProtection) [member function]
+    cls.add_method('SetDualCtsProtection', 
+                   'void', 
+                   [param('uint8_t', 'dualCtsProtection')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetHtProtection(uint8_t htProtection) [member function]
+    cls.add_method('SetHtProtection', 
+                   'void', 
+                   [param('uint8_t', 'htProtection')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetHtSupported(uint8_t htSupported) [member function]
+    cls.add_method('SetHtSupported', 
+                   'void', 
+                   [param('uint8_t', 'htSupported')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetInformationSubset1(uint8_t ctrl) [member function]
+    cls.add_method('SetInformationSubset1', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetInformationSubset2(uint16_t ctrl) [member function]
+    cls.add_method('SetInformationSubset2', 
                    'void', 
-                   [param('uint8_t', 'barkerPreambleMode')])
-    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetErpSupported(uint8_t erpSupported) [member function]
-    cls.add_method('SetErpSupported', 
+                   [param('uint16_t', 'ctrl')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetInformationSubset3(uint16_t ctrl) [member function]
+    cls.add_method('SetInformationSubset3', 
                    'void', 
-                   [param('uint8_t', 'erpSupported')])
-    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetNonErpPresent(uint8_t nonErpPresent) [member function]
-    cls.add_method('SetNonErpPresent', 
+                   [param('uint16_t', 'ctrl')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetLSigTxopProtectionFullSupport(uint8_t lSigTxopProtectionFullSupport) [member function]
+    cls.add_method('SetLSigTxopProtectionFullSupport', 
                    'void', 
-                   [param('uint8_t', 'nonErpPresent')])
-    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetUseProtection(uint8_t useProtection) [member function]
-    cls.add_method('SetUseProtection', 
+                   [param('uint8_t', 'lSigTxopProtectionFullSupport')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetNonGfHtStasPresent(uint8_t nonGfHtStasPresent) [member function]
+    cls.add_method('SetNonGfHtStasPresent', 
                    'void', 
-                   [param('uint8_t', 'useProtection')])
-    return
-
-def register_Ns3ErrorModel_methods(root_module, cls):
-    ## error-model.h (module 'network'): ns3::ErrorModel::ErrorModel(ns3::ErrorModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ErrorModel const &', 'arg0')])
-    ## error-model.h (module 'network'): ns3::ErrorModel::ErrorModel() [constructor]
-    cls.add_constructor([])
-    ## error-model.h (module 'network'): void ns3::ErrorModel::Disable() [member function]
-    cls.add_method('Disable', 
+                   [param('uint8_t', 'nonGfHtStasPresent')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetObssNonHtStasPresent(uint8_t obssNonHtStasPresent) [member function]
+    cls.add_method('SetObssNonHtStasPresent', 
                    'void', 
-                   [])
-    ## error-model.h (module 'network'): void ns3::ErrorModel::Enable() [member function]
-    cls.add_method('Enable', 
+                   [param('uint8_t', 'obssNonHtStasPresent')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetPcoActive(uint8_t pcoActive) [member function]
+    cls.add_method('SetPcoActive', 
                    'void', 
-                   [])
-    ## error-model.h (module 'network'): static ns3::TypeId ns3::ErrorModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## error-model.h (module 'network'): bool ns3::ErrorModel::IsCorrupt(ns3::Ptr<ns3::Packet> pkt) [member function]
-    cls.add_method('IsCorrupt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'pkt')])
-    ## error-model.h (module 'network'): bool ns3::ErrorModel::IsEnabled() const [member function]
-    cls.add_method('IsEnabled', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## error-model.h (module 'network'): void ns3::ErrorModel::Reset() [member function]
-    cls.add_method('Reset', 
+                   [param('uint8_t', 'pcoActive')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetPhase(uint8_t pcoPhase) [member function]
+    cls.add_method('SetPhase', 
                    'void', 
-                   [])
-    ## error-model.h (module 'network'): bool ns3::ErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorrupt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): void ns3::ErrorModel::DoReset() [member function]
-    cls.add_method('DoReset', 
+                   [param('uint8_t', 'pcoPhase')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetPrimaryChannel(uint8_t ctrl) [member function]
+    cls.add_method('SetPrimaryChannel', 
                    'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   [param('uint8_t', 'ctrl')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetRifsMode(uint8_t rifsMode) [member function]
+    cls.add_method('SetRifsMode', 
+                   'void', 
+                   [param('uint8_t', 'rifsMode')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetRxHighestSupportedDataRate(uint16_t maxSupportedRate) [member function]
+    cls.add_method('SetRxHighestSupportedDataRate', 
+                   'void', 
+                   [param('uint16_t', 'maxSupportedRate')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetRxMcsBitmask(uint8_t index) [member function]
+    cls.add_method('SetRxMcsBitmask', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetSecondaryChannelOffset(uint8_t secondaryChannelOffset) [member function]
+    cls.add_method('SetSecondaryChannelOffset', 
+                   'void', 
+                   [param('uint8_t', 'secondaryChannelOffset')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetStaChannelWidth(uint8_t staChannelWidth) [member function]
+    cls.add_method('SetStaChannelWidth', 
+                   'void', 
+                   [param('uint8_t', 'staChannelWidth')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetStbcBeacon(uint8_t stbcBeacon) [member function]
+    cls.add_method('SetStbcBeacon', 
+                   'void', 
+                   [param('uint8_t', 'stbcBeacon')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams) [member function]
+    cls.add_method('SetTxMaxNSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'maxTxSpatialStreams')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxMcsSetDefined(uint8_t txMcsSetDefined) [member function]
+    cls.add_method('SetTxMcsSetDefined', 
+                   'void', 
+                   [param('uint8_t', 'txMcsSetDefined')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal) [member function]
+    cls.add_method('SetTxRxMcsSetUnequal', 
+                   'void', 
+                   [param('uint8_t', 'txRxMcsSetUnequal')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxUnequalModulation(uint8_t txUnequalModulation) [member function]
+    cls.add_method('SetTxUnequalModulation', 
+                   'void', 
+                   [param('uint8_t', 'txUnequalModulation')])
     return
 
-def register_Ns3ErrorRateModel_methods(root_module, cls):
-    ## error-rate-model.h (module 'wifi'): ns3::ErrorRateModel::ErrorRateModel() [constructor]
+def register_Ns3IdealWifiManager_methods(root_module, cls):
+    ## ideal-wifi-manager.h (module 'wifi'): ns3::IdealWifiManager::IdealWifiManager(ns3::IdealWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::IdealWifiManager const &', 'arg0')])
+    ## ideal-wifi-manager.h (module 'wifi'): ns3::IdealWifiManager::IdealWifiManager() [constructor]
     cls.add_constructor([])
-    ## error-rate-model.h (module 'wifi'): ns3::ErrorRateModel::ErrorRateModel(ns3::ErrorRateModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ErrorRateModel const &', 'arg0')])
-    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::CalculateSnr(ns3::WifiTxVector txVector, double ber) const [member function]
-    cls.add_method('CalculateSnr', 
-                   'double', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('double', 'ber')], 
-                   is_const=True)
-    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint64_t nbits) const [member function]
-    cls.add_method('GetChunkSuccessRate', 
-                   'double', 
-                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits')], 
-                   is_const=True)
-    ## error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::ErrorRateModel::GetTypeId() [member function]
+    ## ideal-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::IdealWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint64_t nbits) const [member function]
-    cls.add_method('DoGetChunkSuccessRate', 
-                   'double', 
-                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3Event_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Event const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Event const &', 'arg0')])
-    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand', 'rxPower')])
-    ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetDuration() const [member function]
-    cls.add_method('GetDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetEndTime() const [member function]
-    cls.add_method('GetEndTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::Ptr<const ns3::WifiPpdu> ns3::Event::GetPpdu() const [member function]
-    cls.add_method('GetPpdu', 
-                   'ns3::Ptr< ns3::WifiPpdu const >', 
-                   [], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): double ns3::Event::GetRxPowerW() const [member function]
-    cls.add_method('GetRxPowerW', 
-                   'double', 
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## ideal-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::IdealWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): double ns3::Event::GetRxPowerW(ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('GetRxPowerW', 
-                   'double', 
-                   [param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::RxPowerWattPerChannelBand ns3::Event::GetRxPowerWPerBand() const [member function]
-    cls.add_method('GetRxPowerWPerBand', 
-                   'ns3::RxPowerWattPerChannelBand', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::IdealWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::IdealWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetStartTime() const [member function]
-    cls.add_method('GetStartTime', 
-                   'ns3::Time', 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportAmpduTxStatus', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3IntegerValue_methods(root_module, cls):
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue() [constructor]
+    cls.add_constructor([])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(int64_t const & value) [constructor]
+    cls.add_constructor([param('int64_t const &', 'value')])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(ns3::IntegerValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::IntegerValue const &', 'arg0')])
+    ## integer.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::IntegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::WifiTxVector ns3::Event::GetTxVector() const [member function]
-    cls.add_method('GetTxVector', 
-                   'ns3::WifiTxVector', 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): bool ns3::IntegerValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## integer.h (module 'core'): int64_t ns3::IntegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int64_t', 
                    [], 
                    is_const=True)
+    ## integer.h (module 'core'): std::string ns3::IntegerValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): void ns3::IntegerValue::Set(int64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('int64_t const &', 'value')])
     return
 
-def register_Ns3EventImpl_methods(root_module, cls):
-    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
-    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl() [constructor]
+def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
     cls.add_constructor([])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
-    cls.add_method('Cancel', 
-                   'void', 
-                   [])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
-    cls.add_method('Invoke', 
-                   'void', 
-                   [])
-    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
-    cls.add_method('IsCancelled', 
-                   'bool', 
-                   [])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
-    cls.add_method('Notify', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker(ns3::Ipv4AddressChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressChecker const &', 'arg0')])
     return
 
-def register_Ns3ExponentialRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ExponentialRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable::ExponentialRandomVariable() [constructor]
+def register_Ns3Ipv4AddressValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetMean() const [member function]
-    cls.add_method('GetMean', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetBound() const [member function]
-    cls.add_method('GetBound', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue(double mean, double bound) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'mean'), param('double', 'bound')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger(uint32_t mean, uint32_t bound) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'mean'), param('uint32_t', 'bound')])
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4AddressValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Address', 
                    [], 
-                   is_virtual=True)
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4AddressValue::Set(ns3::Ipv4Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Address const &', 'value')])
     return
 
-def register_Ns3ExtendedCapabilities_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## extended-capabilities.h (module 'wifi'): ns3::ExtendedCapabilities::ExtendedCapabilities(ns3::ExtendedCapabilities const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ExtendedCapabilities const &', 'arg0')])
-    ## extended-capabilities.h (module 'wifi'): ns3::ExtendedCapabilities::ExtendedCapabilities() [constructor]
+def register_Ns3Ipv4MaskChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker() [constructor]
     cls.add_constructor([])
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## extended-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::ExtendedCapabilities::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker(ns3::Ipv4MaskChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4MaskValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4Mask const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4MaskValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4MaskValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte1() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte1', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte2() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte2', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte3() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte3', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte4() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte4', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte5() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte5', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte6() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte6', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte7() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte7', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte8() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte8', 
-                   'uint8_t', 
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4MaskValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask ns3::Ipv4MaskValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Mask', 
                    [], 
                    is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
-                   [], 
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4MaskValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## extended-capabilities.h (module 'wifi'): uint16_t ns3::ExtendedCapabilities::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4MaskValue::Set(ns3::Ipv4Mask const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+                   [param('ns3::Ipv4Mask const &', 'value')])
+    return
+
+def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker(ns3::Ipv6AddressChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6AddressValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6AddressValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte1(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte1', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte2(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte2', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte3(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte3', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte4(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte4', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte5(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte5', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte6(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte6', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte7(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte7', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte8(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte8', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetHtSupported(uint8_t htSupported) [member function]
-    cls.add_method('SetHtSupported', 
-                   'void', 
-                   [param('uint8_t', 'htSupported')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetVhtSupported(uint8_t vhtSupported) [member function]
-    cls.add_method('SetVhtSupported', 
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6AddressValue::Set(ns3::Ipv6Address const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('uint8_t', 'vhtSupported')])
+                   [param('ns3::Ipv6Address const &', 'value')])
     return
 
-def register_Ns3ExtendedSupportedRatesIE_methods(root_module, cls):
-    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE(ns3::ExtendedSupportedRatesIE const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ExtendedSupportedRatesIE const &', 'arg0')])
-    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE() [constructor]
+def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
     cls.add_constructor([])
-    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE(ns3::SupportedRates * rates) [constructor]
-    cls.add_constructor([param('ns3::SupportedRates *', 'rates')])
-    ## supported-rates.h (module 'wifi'): uint8_t ns3::ExtendedSupportedRatesIE::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## supported-rates.h (module 'wifi'): ns3::WifiInformationElementId ns3::ExtendedSupportedRatesIE::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker(ns3::Ipv6PrefixChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6PrefixValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6Prefix const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6PrefixValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6PrefixValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## supported-rates.h (module 'wifi'): uint8_t ns3::ExtendedSupportedRatesIE::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6PrefixValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix ns3::Ipv6PrefixValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Prefix', 
                    [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6PrefixValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## supported-rates.h (module 'wifi'): uint16_t ns3::ExtendedSupportedRatesIE::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6PrefixValue::Set(ns3::Ipv6Prefix const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Prefix const &', 'value')])
+    return
+
+def register_Ns3ItuR1411LosPropagationLossModel_methods(root_module, cls):
+    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ItuR1411LosPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
+                   is_static=True)
+    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): ns3::ItuR1411LosPropagationLossModel::ItuR1411LosPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): void ns3::ItuR1411LosPropagationLossModel::SetFrequency(double freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('double', 'freq')])
+    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411LosPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetLoss', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True)
-    ## supported-rates.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedSupportedRatesIE::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411LosPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): int64_t ns3::ItuR1411LosPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ItuR1411NlosOverRooftopPropagationLossModel_methods(root_module, cls):
+    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ItuR1411NlosOverRooftopPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): ns3::ItuR1411NlosOverRooftopPropagationLossModel::ItuR1411NlosOverRooftopPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): void ns3::ItuR1411NlosOverRooftopPropagationLossModel::SetFrequency(double freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('double', 'freq')])
+    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411NlosOverRooftopPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetLoss', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True)
-    ## supported-rates.h (module 'wifi'): void ns3::ExtendedSupportedRatesIE::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411NlosOverRooftopPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): int64_t ns3::ItuR1411NlosOverRooftopPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3JakesProcess_methods(root_module, cls):
+    ## jakes-process.h (module 'propagation'): ns3::JakesProcess::JakesProcess(ns3::JakesProcess const & arg0) [constructor]
+    cls.add_constructor([param('ns3::JakesProcess const &', 'arg0')])
+    ## jakes-process.h (module 'propagation'): ns3::JakesProcess::JakesProcess() [constructor]
+    cls.add_constructor([])
+    ## jakes-process.h (module 'propagation'): void ns3::JakesProcess::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## supported-rates.h (module 'wifi'): void ns3::ExtendedSupportedRatesIE::SetSupportedRates(ns3::SupportedRates * rates) [member function]
-    cls.add_method('SetSupportedRates', 
+                   [], 
+                   is_virtual=True)
+    ## jakes-process.h (module 'propagation'): double ns3::JakesProcess::GetChannelGainDb() const [member function]
+    cls.add_method('GetChannelGainDb', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## jakes-process.h (module 'propagation'): std::complex<double> ns3::JakesProcess::GetComplexGain() const [member function]
+    cls.add_method('GetComplexGain', 
+                   'std::complex< double >', 
+                   [], 
+                   is_const=True)
+    ## jakes-process.h (module 'propagation'): static ns3::TypeId ns3::JakesProcess::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## jakes-process.h (module 'propagation'): void ns3::JakesProcess::SetPropagationLossModel(ns3::Ptr<const ns3::PropagationLossModel> model) [member function]
+    cls.add_method('SetPropagationLossModel', 
                    'void', 
-                   [param('ns3::SupportedRates *', 'rates')])
+                   [param('ns3::Ptr< ns3::PropagationLossModel const >', 'model')])
     return
 
-def register_Ns3FixedRssLossModel_methods(root_module, cls):
-    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::FixedRssLossModel::GetTypeId() [member function]
+def register_Ns3JakesPropagationLossModel_methods(root_module, cls):
+    ## jakes-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::JakesPropagationLossModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## propagation-loss-model.h (module 'propagation'): ns3::FixedRssLossModel::FixedRssLossModel() [constructor]
+    ## jakes-propagation-loss-model.h (module 'propagation'): ns3::JakesPropagationLossModel::JakesPropagationLossModel() [constructor]
     cls.add_constructor([])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::FixedRssLossModel::SetRss(double rss) [member function]
-    cls.add_method('SetRss', 
-                   'void', 
-                   [param('double', 'rss')])
-    ## propagation-loss-model.h (module 'propagation'): double ns3::FixedRssLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    ## jakes-propagation-loss-model.h (module 'propagation'): double ns3::JakesPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::FixedRssLossModel::DoAssignStreams(int64_t stream) [member function]
+    ## jakes-propagation-loss-model.h (module 'propagation'): int64_t ns3::JakesPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3FrameCaptureModel_methods(root_module, cls):
-    ## frame-capture-model.h (module 'wifi'): ns3::FrameCaptureModel::FrameCaptureModel() [constructor]
+def register_Ns3Kun2600MhzPropagationLossModel_methods(root_module, cls):
+    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::Kun2600MhzPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): ns3::Kun2600MhzPropagationLossModel::Kun2600MhzPropagationLossModel() [constructor]
     cls.add_constructor([])
-    ## frame-capture-model.h (module 'wifi'): ns3::FrameCaptureModel::FrameCaptureModel(ns3::FrameCaptureModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::FrameCaptureModel const &', 'arg0')])
-    ## frame-capture-model.h (module 'wifi'): bool ns3::FrameCaptureModel::CaptureNewFrame(ns3::Ptr<ns3::Event> currentEvent, ns3::Ptr<ns3::Event> newEvent) const [member function]
-    cls.add_method('CaptureNewFrame', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Event >', 'currentEvent'), param('ns3::Ptr< ns3::Event >', 'newEvent')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## frame-capture-model.h (module 'wifi'): static ns3::TypeId ns3::FrameCaptureModel::GetTypeId() [member function]
+    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): double ns3::Kun2600MhzPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetLoss', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True)
+    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): double ns3::Kun2600MhzPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): int64_t ns3::Kun2600MhzPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3LinearWifiTxCurrentModel_methods(root_module, cls):
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel(ns3::LinearWifiTxCurrentModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LinearWifiTxCurrentModel const &', 'arg0')])
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::LinearWifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
+    cls.add_method('CalcTxCurrent', 
+                   'double', 
+                   [param('double', 'txPowerDbm')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-tx-current-model.h (module 'wifi'): static ns3::TypeId ns3::LinearWifiTxCurrentModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3ListErrorModel_methods(root_module, cls):
+    ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel(ns3::ListErrorModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
+    ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
+    cls.add_constructor([])
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    cls.add_method('GetList', 
+                   'std::list< unsigned int >', 
+                   [], 
+                   is_const=True)
+    ## error-model.h (module 'network'): static ns3::TypeId ns3::ListErrorModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## frame-capture-model.h (module 'wifi'): bool ns3::FrameCaptureModel::IsInCaptureWindow(ns3::Time timePreambleDetected) const [member function]
-    cls.add_method('IsInCaptureWindow', 
-                   'bool', 
-                   [param('ns3::Time', 'timePreambleDetected')], 
-                   is_const=True, is_virtual=True)
+                   is_static=True)
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    cls.add_method('SetList', 
+                   'void', 
+                   [param('std::list< unsigned int > const &', 'packetlist')])
+    ## error-model.h (module 'network'): bool ns3::ListErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorrupt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
+                   is_virtual=True, visibility='private')
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::DoReset() [member function]
+    cls.add_method('DoReset', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3FriisPropagationLossModel_methods(root_module, cls):
-    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::FriisPropagationLossModel::GetTypeId() [member function]
+def register_Ns3LogDistancePropagationLossModel_methods(root_module, cls):
+    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::LogDistancePropagationLossModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## propagation-loss-model.h (module 'propagation'): ns3::FriisPropagationLossModel::FriisPropagationLossModel() [constructor]
+    ## propagation-loss-model.h (module 'propagation'): ns3::LogDistancePropagationLossModel::LogDistancePropagationLossModel() [constructor]
     cls.add_constructor([])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::FriisPropagationLossModel::SetFrequency(double frequency) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('double', 'frequency')])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::FriisPropagationLossModel::SetSystemLoss(double systemLoss) [member function]
-    cls.add_method('SetSystemLoss', 
-                   'void', 
-                   [param('double', 'systemLoss')])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::FriisPropagationLossModel::SetMinLoss(double minLoss) [member function]
-    cls.add_method('SetMinLoss', 
+    ## propagation-loss-model.h (module 'propagation'): void ns3::LogDistancePropagationLossModel::SetPathLossExponent(double n) [member function]
+    cls.add_method('SetPathLossExponent', 
                    'void', 
-                   [param('double', 'minLoss')])
-    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::GetMinLoss() const [member function]
-    cls.add_method('GetMinLoss', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::GetFrequency() const [member function]
-    cls.add_method('GetFrequency', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::GetSystemLoss() const [member function]
-    cls.add_method('GetSystemLoss', 
+                   [param('double', 'n')])
+    ## propagation-loss-model.h (module 'propagation'): double ns3::LogDistancePropagationLossModel::GetPathLossExponent() const [member function]
+    cls.add_method('GetPathLossExponent', 
                    'double', 
                    [], 
                    is_const=True)
-    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    ## propagation-loss-model.h (module 'propagation'): void ns3::LogDistancePropagationLossModel::SetReference(double referenceDistance, double referenceLoss) [member function]
+    cls.add_method('SetReference', 
+                   'void', 
+                   [param('double', 'referenceDistance'), param('double', 'referenceLoss')])
+    ## propagation-loss-model.h (module 'propagation'): double ns3::LogDistancePropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::FriisPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::LogDistancePropagationLossModel::DoAssignStreams(int64_t stream) [member function]
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3GammaRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::GammaRandomVariable::GetTypeId() [member function]
+def register_Ns3LogNormalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::LogNormalRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable::GammaRandomVariable() [constructor]
+    ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable::LogNormalRandomVariable() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetAlpha() const [member function]
-    cls.add_method('GetAlpha', 
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetMu() const [member function]
+    cls.add_method('GetMu', 
                    'double', 
                    [], 
                    is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetBeta() const [member function]
-    cls.add_method('GetBeta', 
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetSigma() const [member function]
+    cls.add_method('GetSigma', 
                    'double', 
                    [], 
                    is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue(double alpha, double beta) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue(double mu, double sigma) [member function]
     cls.add_method('GetValue', 
                    'double', 
-                   [param('double', 'alpha'), param('double', 'beta')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger(uint32_t alpha, uint32_t beta) [member function]
+                   [param('double', 'mu'), param('double', 'sigma')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger(uint32_t mu, uint32_t sigma) [member function]
     cls.add_method('GetInteger', 
                    'uint32_t', 
-                   [param('uint32_t', 'alpha'), param('uint32_t', 'beta')])
-    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue() [member function]
+                   [param('uint32_t', 'mu'), param('uint32_t', 'sigma')])
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue() [member function]
     cls.add_method('GetValue', 
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger() [member function]
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger() [member function]
     cls.add_method('GetInteger', 
                    'uint32_t', 
                    [], 
                    is_virtual=True)
     return
 
-def register_Ns3HeCapabilities_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities::HeCapabilities(ns3::HeCapabilities const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeCapabilities const &', 'arg0')])
-    ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities::HeCapabilities() [constructor]
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
+def register_Ns3MacRxMiddle_methods(root_module, cls):
+    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle::MacRxMiddle(ns3::MacRxMiddle const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MacRxMiddle const &', 'arg0')])
+    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle::MacRxMiddle() [constructor]
+    cls.add_constructor([])
+    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::SetForwardCallback(ns3::MacRxMiddle::ForwardUpCallback callback) [member function]
+    cls.add_method('SetForwardCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    return
+
+def register_Ns3MacTxMiddle_methods(root_module, cls):
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle(ns3::MacTxMiddle const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MacTxMiddle const &', 'arg0')])
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle() [constructor]
+    cls.add_constructor([])
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSeqNumberByTidAndAddress(uint8_t tid, ns3::Mac48Address addr) const [member function]
+    cls.add_method('GetNextSeqNumberByTidAndAddress', 
+                   'uint16_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'addr')], 
+                   is_const=True)
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('GetNextSequenceNumberFor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('PeekNextSequenceNumberFor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## mac-tx-middle.h (module 'wifi'): void ns3::MacTxMiddle::SetSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('SetSequenceNumberFor', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    return
+
+def register_Ns3MatrixPropagationLossModel_methods(root_module, cls):
+    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::MatrixPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## propagation-loss-model.h (module 'propagation'): ns3::MatrixPropagationLossModel::MatrixPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## propagation-loss-model.h (module 'propagation'): void ns3::MatrixPropagationLossModel::SetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b, double loss, bool symmetric=true) [member function]
+    cls.add_method('SetLoss', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b'), param('double', 'loss'), param('bool', 'symmetric', default_value='true')])
+    ## propagation-loss-model.h (module 'propagation'): void ns3::MatrixPropagationLossModel::SetDefaultLoss(double defaultLoss) [member function]
+    cls.add_method('SetDefaultLoss', 
+                   'void', 
+                   [param('double', 'defaultLoss')])
+    ## propagation-loss-model.h (module 'propagation'): double ns3::MatrixPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::MatrixPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3MgtBeaconHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader(ns3::MgtBeaconHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MgtBeaconHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtBeaconHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3MinstrelHtWifiManager_methods(root_module, cls):
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtWifiManager::MinstrelHtWifiManager(ns3::MinstrelHtWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MinstrelHtWifiManager const &', 'arg0')])
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtWifiManager::MinstrelHtWifiManager() [constructor]
+    cls.add_constructor([])
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): int64_t ns3::MinstrelHtWifiManager::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::MinstrelHtWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetupMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::MinstrelHtWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelHtWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelHtWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): bool ns3::MinstrelHtWifiManager::DoNeedRetransmission(ns3::WifiRemoteStation * st, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
+    cls.add_method('DoNeedRetransmission', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'st'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportAmpduTxStatus', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3MinstrelWifiManager_methods(root_module, cls):
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::MinstrelWifiManager::MinstrelWifiManager(ns3::MinstrelWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MinstrelWifiManager const &', 'arg0')])
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::MinstrelWifiManager::MinstrelWifiManager() [constructor]
     cls.add_constructor([])
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+    ## minstrel-wifi-manager.h (module 'wifi'): int64_t ns3::MinstrelWifiManager::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
                    is_virtual=True)
-    ## he-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeCapabilities::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## he-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeCapabilities::ElementIdExt() const [member function]
-    cls.add_method('ElementIdExt', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetChannelWidthSet() const [member function]
-    cls.add_method('GetChannelWidthSet', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeLtfAndGiForHePpdus() const [member function]
-    cls.add_method('GetHeLtfAndGiForHePpdus', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo1() const [member function]
-    cls.add_method('GetHeMacCapabilitiesInfo1', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
-    cls.add_method('GetHeMacCapabilitiesInfo2', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint64_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo1() const [member function]
-    cls.add_method('GetHePhyCapabilitiesInfo1', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
-    cls.add_method('GetHePhyCapabilitiesInfo2', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestMcsSupported() const [member function]
-    cls.add_method('GetHighestMcsSupported', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestNssSupported() const [member function]
-    cls.add_method('GetHighestNssSupported', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetLdpcCodingInPayload() const [member function]
-    cls.add_method('GetLdpcCodingInPayload', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetMaxAmpduLength() const [member function]
-    cls.add_method('GetMaxAmpduLength', 
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::CheckInit(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('CheckInit', 
+                   'void', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): uint32_t ns3::MinstrelWifiManager::CountRetries(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('CountRetries', 
                    'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSupportedMcsAndNss() const [member function]
-    cls.add_method('GetSupportedMcsAndNss', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): uint16_t ns3::MinstrelWifiManager::FindRate(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('FindRate', 
                    'uint16_t', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::GetDataTxVector(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::GetRtsTxVector(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('GetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::MinstrelWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
-    cls.add_method('IsSupportedRxMcs', 
-                   'bool', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
-    cls.add_method('IsSupportedTxMcs', 
-                   'bool', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::HeCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+                   is_static=True)
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::InitSampleTable(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('InitSampleTable', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetChannelWidthSet(uint8_t channelWidthSet) [member function]
-    cls.add_method('SetChannelWidthSet', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetupMac', 
                    'void', 
-                   [param('uint8_t', 'channelWidthSet')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeLtfAndGiForHePpdus(uint8_t heLtfAndGiForHePpdus) [member function]
-    cls.add_method('SetHeLtfAndGiForHePpdus', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
                    'void', 
-                   [param('uint8_t', 'heLtfAndGiForHePpdus')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint8_t ctrl2) [member function]
-    cls.add_method('SetHeMacCapabilitiesInfo', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdatePacketCounters(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('UpdatePacketCounters', 
                    'void', 
-                   [param('uint32_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint8_t ctrl2) [member function]
-    cls.add_method('SetHePhyCapabilitiesInfo', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdateRate(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('UpdateRate', 
                    'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSupported(uint8_t heSupported) [member function]
-    cls.add_method('SetHeSupported', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdateRetry(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('UpdateRetry', 
                    'void', 
-                   [param('uint8_t', 'heSupported')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHighestMcsSupported(uint8_t mcs) [member function]
-    cls.add_method('SetHighestMcsSupported', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdateStats(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('UpdateStats', 
                    'void', 
-                   [param('uint8_t', 'mcs')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHighestNssSupported(uint8_t nss) [member function]
-    cls.add_method('SetHighestNssSupported', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::MinstrelWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('uint8_t', 'nss')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetLdpcCodingInPayload(uint8_t ldpcCodingInPayload) [member function]
-    cls.add_method('SetLdpcCodingInPayload', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): bool ns3::MinstrelWifiManager::DoNeedRetransmission(ns3::WifiRemoteStation * st, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
+    cls.add_method('DoNeedRetransmission', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'st'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [param('uint8_t', 'ldpcCodingInPayload')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetMaxAmpduLength(uint32_t maxAmpduLength) [member function]
-    cls.add_method('SetMaxAmpduLength', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('uint32_t', 'maxAmpduLength')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetSupportedMcsAndNss(uint16_t ctrl) [member function]
-    cls.add_method('SetSupportedMcsAndNss', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
                    'void', 
-                   [param('uint16_t', 'ctrl')])
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3HeConfiguration_methods(root_module, cls):
-    ## he-configuration.h (module 'wifi'): ns3::HeConfiguration::HeConfiguration(ns3::HeConfiguration const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeConfiguration const &', 'arg0')])
-    ## he-configuration.h (module 'wifi'): ns3::HeConfiguration::HeConfiguration() [constructor]
+def register_Ns3MobilityModel_methods(root_module, cls):
+    ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel(ns3::MobilityModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MobilityModel const &', 'arg0')])
+    ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel() [constructor]
     cls.add_constructor([])
-    ## he-configuration.h (module 'wifi'): ns3::Time ns3::HeConfiguration::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'ns3::Time', 
-                   [], 
+    ## mobility-model.h (module 'mobility'): int64_t ns3::MobilityModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetDistanceFrom(ns3::Ptr<const ns3::MobilityModel> position) const [member function]
+    cls.add_method('GetDistanceFrom', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'position')], 
                    is_const=True)
-    ## he-configuration.h (module 'wifi'): uint16_t ns3::HeConfiguration::GetMpduBufferSize() const [member function]
-    cls.add_method('GetMpduBufferSize', 
-                   'uint16_t', 
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPosition() const [member function]
+    cls.add_method('GetPosition', 
+                   'ns3::Vector', 
                    [], 
                    is_const=True)
-    ## he-configuration.h (module 'wifi'): static ns3::TypeId ns3::HeConfiguration::GetTypeId() [member function]
+    ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetRelativeSpeed(ns3::Ptr<const ns3::MobilityModel> other) const [member function]
+    cls.add_method('GetRelativeSpeed', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'other')], 
+                   is_const=True)
+    ## mobility-model.h (module 'mobility'): static ns3::TypeId ns3::MobilityModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## he-configuration.h (module 'wifi'): void ns3::HeConfiguration::SetGuardInterval(ns3::Time guardInterval) [member function]
-    cls.add_method('SetGuardInterval', 
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetVelocity() const [member function]
+    cls.add_method('GetVelocity', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True)
+    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::SetPosition(ns3::Vector const & position) [member function]
+    cls.add_method('SetPosition', 
                    'void', 
-                   [param('ns3::Time', 'guardInterval')])
-    ## he-configuration.h (module 'wifi'): void ns3::HeConfiguration::SetMpduBufferSize(uint16_t size) [member function]
-    cls.add_method('SetMpduBufferSize', 
+                   [param('ns3::Vector const &', 'position')])
+    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::NotifyCourseChange() const [member function]
+    cls.add_method('NotifyCourseChange', 
                    'void', 
-                   [param('uint16_t', 'size')])
+                   [], 
+                   is_const=True, visibility='protected')
+    ## mobility-model.h (module 'mobility'): int64_t ns3::MobilityModel::DoAssignStreams(int64_t start) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'start')], 
+                   is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPosition() const [member function]
+    cls.add_method('DoGetPosition', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetVelocity() const [member function]
+    cls.add_method('DoGetVelocity', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
+    cls.add_method('DoSetPosition', 
+                   'void', 
+                   [param('ns3::Vector const &', 'position')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3HeOperation_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## he-operation.h (module 'wifi'): ns3::HeOperation::HeOperation(ns3::HeOperation const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeOperation const &', 'arg0')])
-    ## he-operation.h (module 'wifi'): ns3::HeOperation::HeOperation() [constructor]
+def register_Ns3MpduAggregator_methods(root_module, cls):
+    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator(ns3::MpduAggregator const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MpduAggregator const &', 'arg0')])
+    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator() [constructor]
     cls.add_constructor([])
-    ## he-operation.h (module 'wifi'): uint8_t ns3::HeOperation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
+    ## mpdu-aggregator.h (module 'wifi'): static void ns3::MpduAggregator::Aggregate(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::Ptr<ns3::Packet> ampdu, bool isSingle) [member function]
+    cls.add_method('Aggregate', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::Ptr< ns3::Packet >', 'ampdu'), param('bool', 'isSingle')], 
+                   is_static=True)
+    ## mpdu-aggregator.h (module 'wifi'): static uint8_t ns3::MpduAggregator::CalculatePadding(uint32_t ampduSize) [member function]
+    cls.add_method('CalculatePadding', 
                    'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## he-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeOperation::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## he-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeOperation::ElementIdExt() const [member function]
-    cls.add_method('ElementIdExt', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## he-operation.h (module 'wifi'): uint16_t ns3::HeOperation::GetBasicHeMcsAndNssSet() const [member function]
-    cls.add_method('GetBasicHeMcsAndNssSet', 
-                   'uint16_t', 
-                   [], 
+                   [param('uint32_t', 'ampduSize')], 
+                   is_static=True)
+    ## mpdu-aggregator.h (module 'wifi'): static ns3::AmpduSubframeHeader ns3::MpduAggregator::GetAmpduSubframeHeader(uint16_t mpduSize, bool isSingle) [member function]
+    cls.add_method('GetAmpduSubframeHeader', 
+                   'ns3::AmpduSubframeHeader', 
+                   [param('uint16_t', 'mpduSize'), param('bool', 'isSingle')], 
+                   is_static=True)
+    ## mpdu-aggregator.h (module 'wifi'): uint32_t ns3::MpduAggregator::GetMaxAmpduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
-    ## he-operation.h (module 'wifi'): uint8_t ns3::HeOperation::GetBssColor() const [member function]
-    cls.add_method('GetBssColor', 
-                   'uint8_t', 
-                   [], 
+    ## mpdu-aggregator.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > ns3::MpduAggregator::GetNextAmpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime, ns3::WifiMacQueueItem::QueueIteratorPair queueIt) const [member function]
+    cls.add_method('GetNextAmpdu', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('ns3::WifiMacQueueItem::QueueIteratorPair', 'queueIt')], 
                    is_const=True)
-    ## he-operation.h (module 'wifi'): uint32_t ns3::HeOperation::GetHeOperationParameters() const [member function]
-    cls.add_method('GetHeOperationParameters', 
+    ## mpdu-aggregator.h (module 'wifi'): static uint32_t ns3::MpduAggregator::GetSizeIfAggregated(uint32_t mpduSize, uint32_t ampduSize) [member function]
+    cls.add_method('GetSizeIfAggregated', 
                    'uint32_t', 
+                   [param('uint32_t', 'mpduSize'), param('uint32_t', 'ampduSize')], 
+                   is_static=True)
+    ## mpdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MpduAggregator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## he-operation.h (module 'wifi'): uint8_t ns3::HeOperation::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
+                   is_static=True)
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')])
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## he-operation.h (module 'wifi'): uint16_t ns3::HeOperation::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3MsduAggregator_methods(root_module, cls):
+    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator(ns3::MsduAggregator const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MsduAggregator const &', 'arg0')])
+    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator() [constructor]
+    cls.add_constructor([])
+    ## msdu-aggregator.h (module 'wifi'): static uint8_t ns3::MsduAggregator::CalculatePadding(uint16_t amsduSize) [member function]
+    cls.add_method('CalculatePadding', 
+                   'uint8_t', 
+                   [param('uint16_t', 'amsduSize')], 
+                   is_static=True)
+    ## msdu-aggregator.h (module 'wifi'): static ns3::WifiMacQueueItem::DeaggregatedMsdus ns3::MsduAggregator::Deaggregate(ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
+    cls.add_method('Deaggregate', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdus', 
+                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
+                   is_static=True)
+    ## msdu-aggregator.h (module 'wifi'): uint16_t ns3::MsduAggregator::GetMaxAmsduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
                    'uint16_t', 
-                   [], 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
-    ## he-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::HeOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+    ## msdu-aggregator.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::MsduAggregator::GetNextAmsdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, ns3::WifiMacQueueItem::QueueIteratorPair & queueIt) const [member function]
+    cls.add_method('GetNextAmsdu', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('ns3::WifiMacQueueItem::QueueIteratorPair &', 'queueIt')], 
                    is_const=True)
-    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+    ## msdu-aggregator.h (module 'wifi'): static uint16_t ns3::MsduAggregator::GetSizeIfAggregated(uint16_t msduSize, uint16_t amsduSize) [member function]
+    cls.add_method('GetSizeIfAggregated', 
+                   'uint16_t', 
+                   [param('uint16_t', 'msduSize'), param('uint16_t', 'amsduSize')], 
+                   is_static=True)
+    ## msdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MsduAggregator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetBssColor(uint8_t bssColor) [member function]
-    cls.add_method('SetBssColor', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')])
+    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('uint8_t', 'bssColor')])
-    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetHeOperationParameters(uint32_t ctrl) [member function]
-    cls.add_method('SetHeOperationParameters', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3MultiUserScheduler_methods(root_module, cls):
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::MultiUserScheduler(ns3::MultiUserScheduler const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MultiUserScheduler const &', 'arg0')])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::MultiUserScheduler() [constructor]
+    cls.add_constructor([])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo & ns3::MultiUserScheduler::GetDlMuInfo() [member function]
+    cls.add_method('GetDlMuInfo', 
+                   'ns3::MultiUserScheduler::DlMuInfo &', 
+                   [])
+    ## multi-user-scheduler.h (module 'wifi'): static ns3::TypeId ns3::MultiUserScheduler::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo & ns3::MultiUserScheduler::GetUlMuInfo() [member function]
+    cls.add_method('GetUlMuInfo', 
+                   'ns3::MultiUserScheduler::UlMuInfo &', 
+                   [])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::MultiUserScheduler::NotifyAccessGranted(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('NotifyAccessGranted', 
+                   'ns3::MultiUserScheduler::TxFormat', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')])
+    ## multi-user-scheduler.h (module 'wifi'): void ns3::MultiUserScheduler::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('uint32_t', 'ctrl')])
-    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetHeSupported(uint8_t heSupported) [member function]
-    cls.add_method('SetHeSupported', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## multi-user-scheduler.h (module 'wifi'): void ns3::MultiUserScheduler::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('uint8_t', 'heSupported')])
-    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetMaxHeMcsPerNss(uint8_t nss, uint8_t maxHeMcs) [member function]
-    cls.add_method('SetMaxHeMcsPerNss', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::MultiUserScheduler::GetLastTxFormat() const [member function]
+    cls.add_method('GetLastTxFormat', 
+                   'ns3::MultiUserScheduler::TxFormat', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## multi-user-scheduler.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::MultiUserScheduler::GetWifiRemoteStationManager() const [member function]
+    cls.add_method('GetWifiRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## multi-user-scheduler.h (module 'wifi'): void ns3::MultiUserScheduler::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
                    'void', 
-                   [param('uint8_t', 'nss'), param('uint8_t', 'maxHeMcs')])
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo ns3::MultiUserScheduler::ComputeDlMuInfo() [member function]
+    cls.add_method('ComputeDlMuInfo', 
+                   'ns3::MultiUserScheduler::DlMuInfo', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo ns3::MultiUserScheduler::ComputeUlMuInfo() [member function]
+    cls.add_method('ComputeUlMuInfo', 
+                   'ns3::MultiUserScheduler::UlMuInfo', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::MultiUserScheduler::SelectTxFormat() [member function]
+    cls.add_method('SelectTxFormat', 
+                   'ns3::MultiUserScheduler::TxFormat', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3MultiUserSchedulerDlMuInfo_methods(root_module, cls):
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo::DlMuInfo() [constructor]
+    cls.add_constructor([])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo::DlMuInfo(ns3::MultiUserScheduler::DlMuInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MultiUserScheduler::DlMuInfo const &', 'arg0')])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo::psduMap [variable]
+    cls.add_instance_attribute('psduMap', 'ns3::WifiPsduMap', is_const=False)
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo::txParams [variable]
+    cls.add_instance_attribute('txParams', 'ns3::WifiTxParameters', is_const=False)
+    return
+
+def register_Ns3MultiUserSchedulerUlMuInfo_methods(root_module, cls):
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::UlMuInfo() [constructor]
+    cls.add_constructor([])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::UlMuInfo(ns3::MultiUserScheduler::UlMuInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MultiUserScheduler::UlMuInfo const &', 'arg0')])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::tbPpduDuration [variable]
+    cls.add_instance_attribute('tbPpduDuration', 'ns3::Time', is_const=False)
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::trigger [variable]
+    cls.add_instance_attribute('trigger', 'ns3::Ptr< ns3::WifiMacQueueItem >', is_const=False)
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::txParams [variable]
+    cls.add_instance_attribute('txParams', 'ns3::WifiTxParameters', is_const=False)
+    return
+
+def register_Ns3NakagamiPropagationLossModel_methods(root_module, cls):
+    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::NakagamiPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## propagation-loss-model.h (module 'propagation'): ns3::NakagamiPropagationLossModel::NakagamiPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## propagation-loss-model.h (module 'propagation'): double ns3::NakagamiPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::NakagamiPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3HeSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader::HeSigHeader(ns3::HeSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader::HeSigHeader() [constructor]
+def register_Ns3NetDevice_methods(root_module, cls):
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HeSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [constructor]
+    cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
+    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('AddLinkChangeCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetBroadcast() const [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Channel> ns3::NetDevice::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint32_t ns3::NetDevice::GetIfIndex() const [member function]
+    cls.add_method('GetIfIndex', 
                    'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetBssColor() const [member function]
-    cls.add_method('GetBssColor', 
-                   'uint8_t', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HeSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint16_t ns3::NetDevice::GetMtu() const [member function]
+    cls.add_method('GetMtu', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HeSigHeader::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv4Address', 'multicastGroup')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NetDevice::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::HeSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): static ns3::TypeId ns3::NetDevice::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetMcs() const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
+                   is_static=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBridge() const [member function]
+    cls.add_method('IsBridge', 
+                   'bool', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetNStreams() const [member function]
-    cls.add_method('GetNStreams', 
-                   'uint8_t', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HeSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsLinkUp() const [member function]
+    cls.add_method('IsLinkUp', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::HeSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HeSigHeader::IsLdpcCoding() const [member function]
-    cls.add_method('IsLdpcCoding', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsPointToPoint() const [member function]
+    cls.add_method('IsPointToPoint', 
                    'bool', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetBssColor(uint8_t bssColor) [member function]
-    cls.add_method('SetBssColor', 
-                   'void', 
-                   [param('uint8_t', 'bssColor')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetCoding(bool ldpc) [member function]
-    cls.add_method('SetCoding', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::NeedsArp() const [member function]
+    cls.add_method('NeedsArp', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('SendFrom', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetAddress(ns3::Address address) [member function]
+    cls.add_method('SetAddress', 
                    'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetGuardIntervalAndLtfSize(uint16_t gi, uint8_t ltf) [member function]
-    cls.add_method('SetGuardIntervalAndLtfSize', 
+                   [param('ns3::Address', 'address')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetIfIndex(uint32_t const index) [member function]
+    cls.add_method('SetIfIndex', 
                    'void', 
-                   [param('uint16_t', 'gi'), param('uint8_t', 'ltf')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetMcs(uint8_t mcs) [member function]
-    cls.add_method('SetMcs', 
+                   [param('uint32_t const', 'index')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SetMtu(uint16_t const mtu) [member function]
+    cls.add_method('SetMtu', 
+                   'bool', 
+                   [param('uint16_t const', 'mtu')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
                    'void', 
-                   [param('uint8_t', 'mcs')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetMuFlag(bool mu) [member function]
-    cls.add_method('SetMuFlag', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetPromiscReceiveCallback(ns3::NetDevice::PromiscReceiveCallback cb) [member function]
+    cls.add_method('SetPromiscReceiveCallback', 
                    'void', 
-                   [param('bool', 'mu')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetNStreams(uint8_t nStreams) [member function]
-    cls.add_method('SetNStreams', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetReceiveCallback(ns3::NetDevice::ReceiveCallback cb) [member function]
+    cls.add_method('SetReceiveCallback', 
                    'void', 
-                   [param('uint8_t', 'nStreams')])
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3HtCapabilities_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities(ns3::HtCapabilities const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtCapabilities const &', 'arg0')])
-    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities() [constructor]
+def register_Ns3NeverLosChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::NeverLosChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::NeverLosChannelConditionModel::NeverLosChannelConditionModel() [constructor]
     cls.add_constructor([])
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::NeverLosChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetChannelCondition', 
+                   'ns3::Ptr< ns3::ChannelCondition >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True)
+    ## channel-condition-model.h (module 'propagation'): int64_t ns3::NeverLosChannelConditionModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
                    is_virtual=True)
-    ## ht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HtCapabilities::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    return
+
+def register_Ns3NeverLosVehicleChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::NeverLosVehicleChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::NeverLosVehicleChannelConditionModel::NeverLosVehicleChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::NeverLosVehicleChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetChannelCondition', 
+                   'ns3::Ptr< ns3::ChannelCondition >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
                    is_const=True, is_virtual=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAmpduParameters() const [member function]
-    cls.add_method('GetAmpduParameters', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAntennaSelectionCapabilities() const [member function]
-    cls.add_method('GetAntennaSelectionCapabilities', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetExtendedHtCapabilities() const [member function]
-    cls.add_method('GetExtendedHtCapabilities', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
-    cls.add_method('GetGreenfield', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetHtCapabilitiesInfo() const [member function]
-    cls.add_method('GetHtCapabilitiesInfo', 
-                   'uint16_t', 
+    ## channel-condition-model.h (module 'propagation'): int64_t ns3::NeverLosVehicleChannelConditionModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    return
+
+def register_Ns3NistErrorRateModel_methods(root_module, cls):
+    ## nist-error-rate-model.h (module 'wifi'): ns3::NistErrorRateModel::NistErrorRateModel(ns3::NistErrorRateModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::NistErrorRateModel const &', 'arg0')])
+    ## nist-error-rate-model.h (module 'wifi'): ns3::NistErrorRateModel::NistErrorRateModel() [constructor]
+    cls.add_constructor([])
+    ## nist-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::NistErrorRateModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
+                   is_static=True)
+    ## nist-error-rate-model.h (module 'wifi'): double ns3::NistErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector const & txVector, double snr, uint64_t nbits, uint8_t numRxAntennas, ns3::WifiPpduField field, uint16_t staId) const [member function]
+    cls.add_method('DoGetChunkSuccessRate', 
+                   'double', 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits'), param('uint8_t', 'numRxAntennas'), param('ns3::WifiPpduField', 'field'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3NixVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
+    cls.add_constructor([])
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector(ns3::NixVector const & o) [constructor]
+    cls.add_constructor([param('ns3::NixVector const &', 'o')])
+    ## nix-vector.h (module 'network'): void ns3::NixVector::AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits) [member function]
+    cls.add_method('AddNeighborIndex', 
+                   'void', 
+                   [param('uint32_t', 'newBits'), param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::BitCount(uint32_t numberOfNeighbors) const [member function]
+    cls.add_method('BitCount', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfNeighbors')], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
-    cls.add_method('GetLdpc', 
-                   'uint8_t', 
+    ## nix-vector.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::NixVector::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::NixVector >', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetMaxAmpduLength() const [member function]
-    cls.add_method('GetMaxAmpduLength', 
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::ExtractNeighborIndex(uint32_t numberOfBits) [member function]
+    cls.add_method('ExtractNeighborIndex', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    cls.add_method('GetRemainingBits', 
+                   'uint32_t', 
+                   [])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetMaxAmsduLength() const [member function]
-    cls.add_method('GetMaxAmsduLength', 
-                   'uint16_t', 
-                   [], 
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetRxHighestSupportedAntennas() const [member function]
-    cls.add_method('GetRxHighestSupportedAntennas', 
-                   'uint8_t', 
+    return
+
+def register_Ns3Node_methods(root_module, cls):
+    ## node.h (module 'network'): ns3::Node::Node(ns3::Node const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Node const &', 'arg0')])
+    ## node.h (module 'network'): ns3::Node::Node() [constructor]
+    cls.add_constructor([])
+    ## node.h (module 'network'): ns3::Node::Node(uint32_t systemId) [constructor]
+    cls.add_constructor([param('uint32_t', 'systemId')])
+    ## node.h (module 'network'): uint32_t ns3::Node::AddApplication(ns3::Ptr<ns3::Application> application) [member function]
+    cls.add_method('AddApplication', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::Application >', 'application')])
+    ## node.h (module 'network'): uint32_t ns3::Node::AddDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('AddDevice', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## node.h (module 'network'): static bool ns3::Node::ChecksumEnabled() [member function]
+    cls.add_method('ChecksumEnabled', 
+                   'bool', 
                    [], 
+                   is_static=True)
+    ## node.h (module 'network'): ns3::Ptr<ns3::Application> ns3::Node::GetApplication(uint32_t index) const [member function]
+    cls.add_method('GetApplication', 
+                   'ns3::Ptr< ns3::Application >', 
+                   [param('uint32_t', 'index')], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
+    ## node.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Node::GetDevice(uint32_t index) const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'index')], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval20() const [member function]
-    cls.add_method('GetShortGuardInterval20', 
-                   'uint8_t', 
+    ## node.h (module 'network'): uint32_t ns3::Node::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
-    cls.add_method('GetSupportedChannelWidth', 
-                   'uint8_t', 
+    ## node.h (module 'network'): ns3::Time ns3::Node::GetLocalTime() const [member function]
+    cls.add_method('GetLocalTime', 
+                   'ns3::Time', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint64_t ns3::HtCapabilities::GetSupportedMcsSet1() const [member function]
-    cls.add_method('GetSupportedMcsSet1', 
-                   'uint64_t', 
+    ## node.h (module 'network'): uint32_t ns3::Node::GetNApplications() const [member function]
+    cls.add_method('GetNApplications', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint64_t ns3::HtCapabilities::GetSupportedMcsSet2() const [member function]
-    cls.add_method('GetSupportedMcsSet2', 
-                   'uint64_t', 
+    ## node.h (module 'network'): uint32_t ns3::Node::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetTxBfCapabilities() const [member function]
-    cls.add_method('GetTxBfCapabilities', 
+    ## node.h (module 'network'): uint32_t ns3::Node::GetSystemId() const [member function]
+    cls.add_method('GetSystemId', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) const [member function]
-    cls.add_method('IsSupportedMcs', 
-                   'bool', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## ht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::HtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAmpduParameters(uint8_t ctrl) [member function]
-    cls.add_method('SetAmpduParameters', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAntennaSelectionCapabilities(uint8_t ctrl) [member function]
-    cls.add_method('SetAntennaSelectionCapabilities', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetExtendedHtCapabilities(uint16_t ctrl) [member function]
-    cls.add_method('SetExtendedHtCapabilities', 
-                   'void', 
-                   [param('uint16_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
-    cls.add_method('SetGreenfield', 
-                   'void', 
-                   [param('uint8_t', 'greenfield')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtCapabilitiesInfo(uint16_t ctrl) [member function]
-    cls.add_method('SetHtCapabilitiesInfo', 
-                   'void', 
-                   [param('uint16_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtSupported(uint8_t htSupported) [member function]
-    cls.add_method('SetHtSupported', 
-                   'void', 
-                   [param('uint8_t', 'htSupported')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLSigProtectionSupport(uint8_t lSigProtection) [member function]
-    cls.add_method('SetLSigProtectionSupport', 
-                   'void', 
-                   [param('uint8_t', 'lSigProtection')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
-    cls.add_method('SetLdpc', 
-                   'void', 
-                   [param('uint8_t', 'ldpc')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmpduLength(uint32_t maxAmpduLength) [member function]
-    cls.add_method('SetMaxAmpduLength', 
-                   'void', 
-                   [param('uint32_t', 'maxAmpduLength')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmsduLength(uint16_t maxAmsduLength) [member function]
-    cls.add_method('SetMaxAmsduLength', 
-                   'void', 
-                   [param('uint16_t', 'maxAmsduLength')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxHighestSupportedDataRate(uint16_t maxSupportedRate) [member function]
-    cls.add_method('SetRxHighestSupportedDataRate', 
-                   'void', 
-                   [param('uint16_t', 'maxSupportedRate')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
-    cls.add_method('SetRxMcsBitmask', 
-                   'void', 
-                   [param('uint8_t', 'index')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval20(uint8_t shortGuardInterval) [member function]
-    cls.add_method('SetShortGuardInterval20', 
-                   'void', 
-                   [param('uint8_t', 'shortGuardInterval')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval40(uint8_t shortGuardInterval) [member function]
-    cls.add_method('SetShortGuardInterval40', 
-                   'void', 
-                   [param('uint8_t', 'shortGuardInterval')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedChannelWidth) [member function]
-    cls.add_method('SetSupportedChannelWidth', 
-                   'void', 
-                   [param('uint8_t', 'supportedChannelWidth')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedMcsSet(uint64_t ctrl1, uint64_t ctrl2) [member function]
-    cls.add_method('SetSupportedMcsSet', 
+    ## node.h (module 'network'): static ns3::TypeId ns3::Node::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## node.h (module 'network'): void ns3::Node::RegisterDeviceAdditionListener(ns3::Node::DeviceAdditionListener listener) [member function]
+    cls.add_method('RegisterDeviceAdditionListener', 
                    'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxBfCapabilities(uint32_t ctrl) [member function]
-    cls.add_method('SetTxBfCapabilities', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
+    ## node.h (module 'network'): void ns3::Node::RegisterProtocolHandler(ns3::Node::ProtocolHandler handler, uint16_t protocolType, ns3::Ptr<ns3::NetDevice> device, bool promiscuous=false) [member function]
+    cls.add_method('RegisterProtocolHandler', 
                    'void', 
-                   [param('uint32_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams) [member function]
-    cls.add_method('SetTxMaxNSpatialStreams', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler'), param('uint16_t', 'protocolType'), param('ns3::Ptr< ns3::NetDevice >', 'device'), param('bool', 'promiscuous', default_value='false')])
+    ## node.h (module 'network'): void ns3::Node::UnregisterDeviceAdditionListener(ns3::Node::DeviceAdditionListener listener) [member function]
+    cls.add_method('UnregisterDeviceAdditionListener', 
                    'void', 
-                   [param('uint8_t', 'maxTxSpatialStreams')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMcsSetDefined(uint8_t txMcsSetDefined) [member function]
-    cls.add_method('SetTxMcsSetDefined', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
+    ## node.h (module 'network'): void ns3::Node::UnregisterProtocolHandler(ns3::Node::ProtocolHandler handler) [member function]
+    cls.add_method('UnregisterProtocolHandler', 
                    'void', 
-                   [param('uint8_t', 'txMcsSetDefined')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal) [member function]
-    cls.add_method('SetTxRxMcsSetUnequal', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler')])
+    ## node.h (module 'network'): void ns3::Node::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('uint8_t', 'txRxMcsSetUnequal')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxUnequalModulation(uint8_t txUnequalModulation) [member function]
-    cls.add_method('SetTxUnequalModulation', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## node.h (module 'network'): void ns3::Node::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('uint8_t', 'txUnequalModulation')])
+                   [], 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3NormalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::INFINITE_VALUE [variable]
+    cls.add_static_attribute('INFINITE_VALUE', 'double const', is_const=True)
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::NormalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::NormalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetVariance() const [member function]
+    cls.add_method('GetVariance', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue(double mean, double variance, double bound=ns3::NormalRandomVariable::INFINITE_VALUE) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'variance'), param('double', 'bound', default_value='ns3::NormalRandomVariable::INFINITE_VALUE')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger(uint32_t mean, uint32_t variance, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'variance'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
     return
 
-def register_Ns3HtConfiguration_methods(root_module, cls):
-    ## ht-configuration.h (module 'wifi'): ns3::HtConfiguration::HtConfiguration(ns3::HtConfiguration const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtConfiguration const &', 'arg0')])
-    ## ht-configuration.h (module 'wifi'): ns3::HtConfiguration::HtConfiguration() [constructor]
+def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
     cls.add_constructor([])
-    ## ht-configuration.h (module 'wifi'): bool ns3::HtConfiguration::GetGreenfieldSupported() const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker(ns3::ObjectFactoryChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryChecker const &', 'arg0')])
+    return
+
+def register_Ns3ObjectFactoryValue_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactory const & value) [constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'value')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactoryValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryValue const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::ObjectFactoryValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True)
-    ## ht-configuration.h (module 'wifi'): bool ns3::HtConfiguration::GetLdpcSupported() const [member function]
-    cls.add_method('GetLdpcSupported', 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): bool ns3::ObjectFactoryValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
                    'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## object-factory.h (module 'core'): ns3::ObjectFactory ns3::ObjectFactoryValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::ObjectFactory', 
                    [], 
                    is_const=True)
-    ## ht-configuration.h (module 'wifi'): bool ns3::HtConfiguration::GetShortGuardIntervalSupported() const [member function]
-    cls.add_method('GetShortGuardIntervalSupported', 
-                   'bool', 
+    ## object-factory.h (module 'core'): std::string ns3::ObjectFactoryValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactoryValue::Set(ns3::ObjectFactory const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::ObjectFactory const &', 'value')])
+    return
+
+def register_Ns3OfdmPpdu_methods(root_module, cls):
+    ## ofdm-ppdu.h (module 'wifi'): ns3::OfdmPpdu::OfdmPpdu(ns3::OfdmPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::OfdmPpdu const &', 'arg0')])
+    ## ofdm-ppdu.h (module 'wifi'): ns3::OfdmPpdu::OfdmPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, uint64_t uid, bool instantiateLSig=true) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid'), param('bool', 'instantiateLSig', default_value='true')])
+    ## ofdm-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::OfdmPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
-                   is_const=True)
-    ## ht-configuration.h (module 'wifi'): static ns3::TypeId ns3::HtConfiguration::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_const=True, is_virtual=True)
+    ## ofdm-ppdu.h (module 'wifi'): ns3::Time ns3::OfdmPpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## ht-configuration.h (module 'wifi'): void ns3::HtConfiguration::SetGreenfieldSupported(bool enable) [member function]
-    cls.add_method('SetGreenfieldSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## ht-configuration.h (module 'wifi'): void ns3::HtConfiguration::SetLdpcSupported(bool enable) [member function]
-    cls.add_method('SetLdpcSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## ht-configuration.h (module 'wifi'): void ns3::HtConfiguration::SetShortGuardIntervalSupported(bool enable) [member function]
-    cls.add_method('SetShortGuardIntervalSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
+                   is_const=True, is_virtual=True)
+    ## ofdm-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::OfdmPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3HtOperation_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## ht-operation.h (module 'wifi'): ns3::HtOperation::HtOperation(ns3::HtOperation const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtOperation const &', 'arg0')])
-    ## ht-operation.h (module 'wifi'): ns3::HtOperation::HtOperation() [constructor]
+def register_Ns3OfdmPpduLSigHeader_methods(root_module, cls):
+    ## ofdm-ppdu.h (module 'wifi'): ns3::OfdmPpdu::LSigHeader::LSigHeader(ns3::OfdmPpdu::LSigHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::OfdmPpdu::LSigHeader const &', 'arg0')])
+    ## ofdm-ppdu.h (module 'wifi'): ns3::OfdmPpdu::LSigHeader::LSigHeader() [constructor]
     cls.add_constructor([])
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+    ## ofdm-ppdu.h (module 'wifi'): uint32_t ns3::OfdmPpdu::LSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## ht-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::HtOperation::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    ## ofdm-ppdu.h (module 'wifi'): ns3::TypeId ns3::OfdmPpdu::LSigHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ht-operation.h (module 'wifi'): uint64_t ns3::HtOperation::GetBasicMcsSet1() const [member function]
-    cls.add_method('GetBasicMcsSet1', 
-                   'uint64_t', 
+    ## ofdm-ppdu.h (module 'wifi'): uint16_t ns3::OfdmPpdu::LSigHeader::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint64_t ns3::HtOperation::GetBasicMcsSet2() const [member function]
-    cls.add_method('GetBasicMcsSet2', 
+    ## ofdm-ppdu.h (module 'wifi'): uint64_t ns3::OfdmPpdu::LSigHeader::GetRate(uint16_t channelWidth=20) const [member function]
+    cls.add_method('GetRate', 
                    'uint64_t', 
-                   [], 
+                   [param('uint16_t', 'channelWidth', default_value='20')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetDualBeacon() const [member function]
-    cls.add_method('GetDualBeacon', 
-                   'uint8_t', 
+    ## ofdm-ppdu.h (module 'wifi'): uint32_t ns3::OfdmPpdu::LSigHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetDualCtsProtection() const [member function]
-    cls.add_method('GetDualCtsProtection', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## ofdm-ppdu.h (module 'wifi'): static ns3::TypeId ns3::OfdmPpdu::LSigHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetHtProtection() const [member function]
-    cls.add_method('GetHtProtection', 
-                   'uint8_t', 
+                   is_static=True)
+    ## ofdm-ppdu.h (module 'wifi'): void ns3::OfdmPpdu::LSigHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ofdm-ppdu.h (module 'wifi'): void ns3::OfdmPpdu::LSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ofdm-ppdu.h (module 'wifi'): void ns3::OfdmPpdu::LSigHeader::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
+    ## ofdm-ppdu.h (module 'wifi'): void ns3::OfdmPpdu::LSigHeader::SetRate(uint64_t rate, uint16_t channelWidth=20) [member function]
+    cls.add_method('SetRate', 
+                   'void', 
+                   [param('uint64_t', 'rate'), param('uint16_t', 'channelWidth', default_value='20')])
+    return
+
+def register_Ns3OkumuraHataPropagationLossModel_methods(root_module, cls):
+    ## okumura-hata-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::OkumuraHataPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
+                   is_static=True)
+    ## okumura-hata-propagation-loss-model.h (module 'propagation'): ns3::OkumuraHataPropagationLossModel::OkumuraHataPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## okumura-hata-propagation-loss-model.h (module 'propagation'): double ns3::OkumuraHataPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetLoss', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
+    ## okumura-hata-propagation-loss-model.h (module 'propagation'): double ns3::OkumuraHataPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## okumura-hata-propagation-loss-model.h (module 'propagation'): int64_t ns3::OkumuraHataPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3OnoeWifiManager_methods(root_module, cls):
+    ## onoe-wifi-manager.h (module 'wifi'): ns3::OnoeWifiManager::OnoeWifiManager(ns3::OnoeWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::OnoeWifiManager const &', 'arg0')])
+    ## onoe-wifi-manager.h (module 'wifi'): ns3::OnoeWifiManager::OnoeWifiManager() [constructor]
+    cls.add_constructor([])
+    ## onoe-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::OnoeWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetInformationSubset1() const [member function]
-    cls.add_method('GetInformationSubset1', 
-                   'uint8_t', 
+                   is_static=True)
+    ## onoe-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::OnoeWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True)
-    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetInformationSubset2() const [member function]
-    cls.add_method('GetInformationSubset2', 
-                   'uint16_t', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::OnoeWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::OnoeWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3OutputStreamWrapper_methods(root_module, cls):
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(ns3::OutputStreamWrapper const & arg0) [constructor]
+    cls.add_constructor([param('ns3::OutputStreamWrapper const &', 'arg0')])
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(std::string filename, std::ios_base::openmode filemode) [constructor]
+    cls.add_constructor([param('std::string', 'filename'), param('std::ios_base::openmode', 'filemode')])
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(std::ostream * os) [constructor]
+    cls.add_constructor([param('std::ostream *', 'os')])
+    ## output-stream-wrapper.h (module 'network'): std::ostream * ns3::OutputStreamWrapper::GetStream() [member function]
+    cls.add_method('GetStream', 
+                   'std::ostream *', 
+                   [])
+    return
+
+def register_Ns3Packet_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
+    cls.add_constructor([])
+    ## packet.h (module 'network'): ns3::Packet::Packet(ns3::Packet const & o) [constructor]
+    cls.add_constructor([param('ns3::Packet const &', 'o')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint32_t size) [constructor]
+    cls.add_constructor([param('uint32_t', 'size')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size, bool magic) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size'), param('bool', 'magic')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddAtEnd(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddByteTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetInformationSubset3() const [member function]
-    cls.add_method('GetInformationSubset3', 
-                   'uint16_t', 
-                   [], 
+    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag, uint32_t start, uint32_t end) const [member function]
+    cls.add_method('AddByteTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag'), param('uint32_t', 'start'), param('uint32_t', 'end')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetLSigTxopProtectionFullSupport() const [member function]
-    cls.add_method('GetLSigTxopProtectionFullSupport', 
-                   'uint8_t', 
-                   [], 
+    ## packet.h (module 'network'): void ns3::Packet::AddHeader(ns3::Header const & header) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header')])
+    ## packet.h (module 'network'): void ns3::Packet::AddPacketTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddPacketTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetNonGfHtStasPresent() const [member function]
-    cls.add_method('GetNonGfHtStasPresent', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): void ns3::Packet::AddPaddingAtEnd(uint32_t size) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddTrailer(ns3::Trailer const & trailer) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer')])
+    ## packet.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::Packet::BeginItem() const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetObssNonHtStasPresent() const [member function]
-    cls.add_method('GetObssNonHtStasPresent', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::Packet >', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetPcoActive() const [member function]
-    cls.add_method('GetPcoActive', 
-                   'uint8_t', 
-                   [], 
+    ## packet.h (module 'network'): uint32_t ns3::Packet::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetPhase() const [member function]
-    cls.add_method('GetPhase', 
-                   'uint8_t', 
-                   [], 
+    ## packet.h (module 'network'): void ns3::Packet::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetPrimaryChannel() const [member function]
-    cls.add_method('GetPrimaryChannel', 
-                   'uint8_t', 
-                   [], 
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetRifsMode() const [member function]
-    cls.add_method('GetRifsMode', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): static void ns3::Packet::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetRxHighestSupportedDataRate() const [member function]
-    cls.add_method('GetRxHighestSupportedDataRate', 
-                   'uint16_t', 
+                   is_static=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnablePrinting() [member function]
+    cls.add_method('EnablePrinting', 
+                   'void', 
                    [], 
+                   is_static=True)
+    ## packet.h (module 'network'): bool ns3::Packet::FindFirstMatchingByteTag(ns3::Tag & tag) const [member function]
+    cls.add_method('FindFirstMatchingByteTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetSecondaryChannelOffset() const [member function]
-    cls.add_method('GetSecondaryChannelOffset', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): ns3::ByteTagIterator ns3::Packet::GetByteTagIterator() const [member function]
+    cls.add_method('GetByteTagIterator', 
+                   'ns3::ByteTagIterator', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
+    ## packet.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::Packet::GetNixVector() const [member function]
+    cls.add_method('GetNixVector', 
+                   'ns3::Ptr< ns3::NixVector >', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetStaChannelWidth() const [member function]
-    cls.add_method('GetStaChannelWidth', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): ns3::PacketTagIterator ns3::Packet::GetPacketTagIterator() const [member function]
+    cls.add_method('GetPacketTagIterator', 
+                   'ns3::PacketTagIterator', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetStbcBeacon() const [member function]
-    cls.add_method('GetStbcBeacon', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxMaxNSpatialStreams() const [member function]
-    cls.add_method('GetTxMaxNSpatialStreams', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxMcsSetDefined() const [member function]
-    cls.add_method('GetTxMcsSetDefined', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): uint64_t ns3::Packet::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxRxMcsSetUnequal() const [member function]
-    cls.add_method('GetTxRxMcsSetUnequal', 
-                   'uint8_t', 
-                   [], 
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
+    cls.add_method('PeekHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxUnequalModulation() const [member function]
-    cls.add_method('GetTxUnequalModulation', 
-                   'uint8_t', 
-                   [], 
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header, uint32_t size) const [member function]
+    cls.add_method('PeekHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header'), param('uint32_t', 'size')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): bool ns3::HtOperation::IsSupportedMcs(uint8_t mcs) const [member function]
-    cls.add_method('IsSupportedMcs', 
+    ## packet.h (module 'network'): bool ns3::Packet::PeekPacketTag(ns3::Tag & tag) const [member function]
+    cls.add_method('PeekPacketTag', 
                    'bool', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## ht-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::HtOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+                   [param('ns3::Tag &', 'tag')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetBasicMcsSet(uint64_t ctrl1, uint64_t ctrl2) [member function]
-    cls.add_method('SetBasicMcsSet', 
-                   'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetDualBeacon(uint8_t dualBeacon) [member function]
-    cls.add_method('SetDualBeacon', 
-                   'void', 
-                   [param('uint8_t', 'dualBeacon')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetDualCtsProtection(uint8_t dualCtsProtection) [member function]
-    cls.add_method('SetDualCtsProtection', 
-                   'void', 
-                   [param('uint8_t', 'dualCtsProtection')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetHtProtection(uint8_t htProtection) [member function]
-    cls.add_method('SetHtProtection', 
-                   'void', 
-                   [param('uint8_t', 'htProtection')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetHtSupported(uint8_t htSupported) [member function]
-    cls.add_method('SetHtSupported', 
-                   'void', 
-                   [param('uint8_t', 'htSupported')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetInformationSubset1(uint8_t ctrl) [member function]
-    cls.add_method('SetInformationSubset1', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetInformationSubset2(uint16_t ctrl) [member function]
-    cls.add_method('SetInformationSubset2', 
-                   'void', 
-                   [param('uint16_t', 'ctrl')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetInformationSubset3(uint16_t ctrl) [member function]
-    cls.add_method('SetInformationSubset3', 
-                   'void', 
-                   [param('uint16_t', 'ctrl')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetLSigTxopProtectionFullSupport(uint8_t lSigTxopProtectionFullSupport) [member function]
-    cls.add_method('SetLSigTxopProtectionFullSupport', 
-                   'void', 
-                   [param('uint8_t', 'lSigTxopProtectionFullSupport')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetNonGfHtStasPresent(uint8_t nonGfHtStasPresent) [member function]
-    cls.add_method('SetNonGfHtStasPresent', 
-                   'void', 
-                   [param('uint8_t', 'nonGfHtStasPresent')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetObssNonHtStasPresent(uint8_t obssNonHtStasPresent) [member function]
-    cls.add_method('SetObssNonHtStasPresent', 
-                   'void', 
-                   [param('uint8_t', 'obssNonHtStasPresent')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetPcoActive(uint8_t pcoActive) [member function]
-    cls.add_method('SetPcoActive', 
-                   'void', 
-                   [param('uint8_t', 'pcoActive')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetPhase(uint8_t pcoPhase) [member function]
-    cls.add_method('SetPhase', 
-                   'void', 
-                   [param('uint8_t', 'pcoPhase')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetPrimaryChannel(uint8_t ctrl) [member function]
-    cls.add_method('SetPrimaryChannel', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetRifsMode(uint8_t rifsMode) [member function]
-    cls.add_method('SetRifsMode', 
-                   'void', 
-                   [param('uint8_t', 'rifsMode')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetRxHighestSupportedDataRate(uint16_t maxSupportedRate) [member function]
-    cls.add_method('SetRxHighestSupportedDataRate', 
-                   'void', 
-                   [param('uint16_t', 'maxSupportedRate')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetRxMcsBitmask(uint8_t index) [member function]
-    cls.add_method('SetRxMcsBitmask', 
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('PeekTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): void ns3::Packet::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('uint8_t', 'index')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetSecondaryChannelOffset(uint8_t secondaryChannelOffset) [member function]
-    cls.add_method('SetSecondaryChannelOffset', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintByteTags(std::ostream & os) const [member function]
+    cls.add_method('PrintByteTags', 
                    'void', 
-                   [param('uint8_t', 'secondaryChannelOffset')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetStaChannelWidth(uint8_t staChannelWidth) [member function]
-    cls.add_method('SetStaChannelWidth', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintPacketTags(std::ostream & os) const [member function]
+    cls.add_method('PrintPacketTags', 
                    'void', 
-                   [param('uint8_t', 'staChannelWidth')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetStbcBeacon(uint8_t stbcBeacon) [member function]
-    cls.add_method('SetStbcBeacon', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllByteTags() [member function]
+    cls.add_method('RemoveAllByteTags', 
                    'void', 
-                   [param('uint8_t', 'stbcBeacon')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams) [member function]
-    cls.add_method('SetTxMaxNSpatialStreams', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllPacketTags() [member function]
+    cls.add_method('RemoveAllPacketTags', 
                    'void', 
-                   [param('uint8_t', 'maxTxSpatialStreams')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxMcsSetDefined(uint8_t txMcsSetDefined) [member function]
-    cls.add_method('SetTxMcsSetDefined', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtEnd(uint32_t size) [member function]
+    cls.add_method('RemoveAtEnd', 
                    'void', 
-                   [param('uint8_t', 'txMcsSetDefined')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal) [member function]
-    cls.add_method('SetTxRxMcsSetUnequal', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtStart(uint32_t size) [member function]
+    cls.add_method('RemoveAtStart', 
                    'void', 
-                   [param('uint8_t', 'txRxMcsSetUnequal')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxUnequalModulation(uint8_t txUnequalModulation) [member function]
-    cls.add_method('SetTxUnequalModulation', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header) [member function]
+    cls.add_method('RemoveHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header, uint32_t size) [member function]
+    cls.add_method('RemoveHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header'), param('uint32_t', 'size')])
+    ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('RemovePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('ReplacePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    cls.add_method('SetNixVector', 
                    'void', 
-                   [param('uint8_t', 'txUnequalModulation')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+    ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
+    cls.add_method('ToString', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
     return
 
-def register_Ns3IdealWifiManager_methods(root_module, cls):
-    ## ideal-wifi-manager.h (module 'wifi'): ns3::IdealWifiManager::IdealWifiManager(ns3::IdealWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::IdealWifiManager const &', 'arg0')])
-    ## ideal-wifi-manager.h (module 'wifi'): ns3::IdealWifiManager::IdealWifiManager() [constructor]
+def register_Ns3ParetoRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ParetoRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable::ParetoRandomVariable() [constructor]
     cls.add_constructor([])
-    ## ideal-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::IdealWifiManager::GetTypeId() [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetScale() const [member function]
+    cls.add_method('GetScale', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue(double scale, double shape, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3ParfWifiManager_methods(root_module, cls):
+    ## parf-wifi-manager.h (module 'wifi'): ns3::ParfWifiManager::ParfWifiManager(ns3::ParfWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ParfWifiManager const &', 'arg0')])
+    ## parf-wifi-manager.h (module 'wifi'): ns3::ParfWifiManager::ParfWifiManager() [constructor]
+    cls.add_constructor([])
+    ## parf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ParfWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
     cls.add_method('SetupPhy', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
                    is_virtual=True)
-    ## ideal-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::IdealWifiManager::DoCreateStation() const [member function]
+    ## parf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ParfWifiManager::DoCreateStation() const [member function]
     cls.add_method('DoCreateStation', 
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::IdealWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ParfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoGetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::IdealWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ParfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoGetRtsTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoInitialize() [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportAmpduTxStatus', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportDataFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
     cls.add_method('DoReportDataOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportFinalDataFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportRtsFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
     cls.add_method('DoReportRtsOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
     cls.add_method('DoReportRxOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3IntegerValue_methods(root_module, cls):
-    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue() [constructor]
+def register_Ns3PhyEntity_methods(root_module, cls):
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyEntity() [constructor]
     cls.add_constructor([])
-    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(int64_t const & value) [constructor]
-    cls.add_constructor([param('int64_t const &', 'value')])
-    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(ns3::IntegerValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::IntegerValue const &', 'arg0')])
-    ## integer.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::IntegerValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## integer.h (module 'core'): bool ns3::IntegerValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyEntity(ns3::PhyEntity const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::PhyEntity::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
                    is_virtual=True)
-    ## integer.h (module 'core'): int64_t ns3::IntegerValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'int64_t', 
-                   [], 
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('CalculatePhyPreambleAndHeaderDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_const=True)
-    ## integer.h (module 'core'): std::string ns3::IntegerValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) const [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_const=True, is_virtual=True)
-    ## integer.h (module 'core'): void ns3::IntegerValue::Set(int64_t const & value) [member function]
-    cls.add_method('Set', 
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::CancelAllEvents() [member function]
+    cls.add_method('CancelAllEvents', 
                    'void', 
-                   [param('int64_t const &', 'value')])
-    return
-
-def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
-    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
-    cls.add_constructor([])
-    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker(ns3::Ipv4AddressChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4AddressChecker const &', 'arg0')])
-    return
-
-def register_Ns3Ipv4AddressValue_methods(root_module, cls):
-    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue() [constructor]
-    cls.add_constructor([])
-    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4Address const & value) [constructor]
-    cls.add_constructor([param('ns3::Ipv4Address const &', 'value')])
-    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4AddressValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4AddressValue const &', 'arg0')])
-    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4AddressValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4AddressValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Ipv4Address', 
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::CancelRunningEndPreambleDetectionEvents(bool clear=false) [member function]
+    cls.add_method('CancelRunningEndPreambleDetectionEvents', 
+                   'void', 
+                   [param('bool', 'clear', default_value='false')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceiveField', 
+                   'void', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::PhyEntity::GetAddressedPsduInPpdu(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetAddressedPsduInPpdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetDurationUpToField(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDurationUpToField', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint32_t ns3::PhyEntity::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
                    [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiMode ns3::PhyEntity::GetMcs(uint8_t index) const [member function]
+    cls.add_method('GetMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiPpduField ns3::PhyEntity::GetNextField(ns3::WifiPpduField currentField, ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetNextField', 
+                   'ns3::WifiPpduField', 
+                   [param('ns3::WifiPpduField', 'currentField'), param('ns3::WifiPreamble', 'preamble')], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+    ## phy-entity.h (module 'wifi'): uint8_t ns3::PhyEntity::GetNumModes() const [member function]
+    cls.add_method('GetNumModes', 
+                   'uint8_t', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## ipv4-address.h (module 'network'): void ns3::Ipv4AddressValue::Set(ns3::Ipv4Address const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::Ipv4Address const &', 'value')])
-    return
-
-def register_Ns3Ipv4MaskChecker_methods(root_module, cls):
-    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker() [constructor]
-    cls.add_constructor([])
-    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker(ns3::Ipv4MaskChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4MaskChecker const &', 'arg0')])
-    return
-
-def register_Ns3Ipv4MaskValue_methods(root_module, cls):
-    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue() [constructor]
-    cls.add_constructor([])
-    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4Mask const & value) [constructor]
-    cls.add_constructor([param('ns3::Ipv4Mask const &', 'value')])
-    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4MaskValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4MaskValue const &', 'arg0')])
-    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4MaskValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) const [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyHeaderSections ns3::PhyEntity::GetPhyHeaderSections(ns3::WifiTxVector const & txVector, ns3::Time ppduStart) const [member function]
+    cls.add_method('GetPhyHeaderSections', 
+                   'ns3::PhyEntity::PhyHeaderSections', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduStart')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetRemainingDurationAfterField(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiPpduField field) const [member function]
+    cls.add_method('GetRemainingDurationAfterField', 
+                   'ns3::Time', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiPpduField', 'field')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetRxChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetRxChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiMode ns3::PhyEntity::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetStaId(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiConstPsduMap ns3::PhyEntity::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::HandlesMcsModes() const [member function]
+    cls.add_method('HandlesMcsModes', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4MaskValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsMcsSupported(uint8_t index) const [member function]
+    cls.add_method('IsMcsSupported', 
+                   'bool', 
+                   [param('uint8_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsModeSupported(ns3::WifiMode mode) const [member function]
+    cls.add_method('IsModeSupported', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::NoEndPreambleDetectionEvents() const [member function]
+    cls.add_method('NoEndPreambleDetectionEvents', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::SetOwner(ns3::Ptr<ns3::WifiPhy> wifiPhy) [member function]
+    cls.add_method('SetOwner', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'wifiPhy')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceiveField', 
+                   'void', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreamble', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')], 
                    is_virtual=True)
-    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask ns3::Ipv4MaskValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Ipv4Mask', 
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::Transmit(ns3::Time txDuration, ns3::Ptr<ns3::WifiPpdu> ppdu, std::string type) [member function]
+    cls.add_method('Transmit', 
+                   'void', 
+                   [param('ns3::Time', 'txDuration'), param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::string', 'type')])
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::begin() const [member function]
+    cls.add_method('begin', 
+                   'std::list< ns3::WifiMode > const_iterator', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4MaskValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## ipv4-address.h (module 'network'): void ns3::Ipv4MaskValue::Set(ns3::Ipv4Mask const & value) [member function]
-    cls.add_method('Set', 
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::end() const [member function]
+    cls.add_method('end', 
+                   'std::list< ns3::WifiMode > const_iterator', 
+                   [], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::AbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('AbortCurrentReception', 
                    'void', 
-                   [param('ns3::Ipv4Mask const &', 'value')])
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::AddPreambleEvent(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('AddPreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::PhyEntity::CreateInterferenceEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [member function]
+    cls.add_method('CreateInterferenceEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoAbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('DoAbortCurrentReception', 
+                   'void', 
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::PhyEntity::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoEndReceivePayload(ns3::Ptr<const ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('DoEndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::PhyEntity::DoEndReceivePreamble(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceivePreamble', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::PhyEntity::DoGetEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    cls.add_method('DoGetEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::DoStartReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceiveField', 
+                   'bool', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoStartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DropPreambleEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiPhyRxfailureReason reason, ns3::Time endRx, uint16_t measurementChannelWidth) [member function]
+    cls.add_method('DropPreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiPhyRxfailureReason', 'reason'), param('ns3::Time', 'endRx'), param('uint16_t', 'measurementChannelWidth')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndOfMpdu(ns3::Ptr<ns3::Event> event, ns3::Ptr<const ns3::WifiPsdu> psdu, size_t mpduIndex, ns3::Time relativeStart, ns3::Time mpduDuration) [member function]
+    cls.add_method('EndOfMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('size_t', 'mpduIndex'), param('ns3::Time', 'relativeStart'), param('ns3::Time', 'mpduDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndPreambleDetectionPeriod(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndPreambleDetectionPeriod', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ErasePreambleEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::Time rxDuration) [member function]
+    cls.add_method('ErasePreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::Time', 'rxDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetCenterFrequencyForChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetCenterFrequencyForChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetChannelWidthAndBand', 
+                   'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<const ns3::Event> ns3::PhyEntity::GetCurrentEvent() const [member function]
+    cls.add_method('GetCurrentEvent', 
+                   'ns3::Ptr< ns3::Event const >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long long, ns3::WifiPreamble> >, std::allocator<std::pair<const std::pair<unsigned long long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event> > > > const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
+    cls.add_method('GetCurrentPreambleEvents', 
+                   'std::map< std::pair< unsigned long long, ns3::WifiPreamble >, ns3::Ptr< ns3::Event > > const &', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::PhyEntity::GetPhyHeaderSnrPer(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) const [member function]
+    cls.add_method('GetPhyHeaderSnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::PhyEntity::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): double ns3::PhyEntity::GetRandomValue() const [member function]
+    cls.add_method('GetRandomValue', 
+                   'double', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::pair<bool, ns3::SignalNoiseDbm> ns3::PhyEntity::GetReceptionStatus(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::Ptr<ns3::Event> event, uint16_t staId, ns3::Time relativeMpduStart, ns3::Time mpduDuration) [member function]
+    cls.add_method('GetReceptionStatus', 
+                   'std::pair< bool, ns3::SignalNoiseDbm >', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'staId'), param('ns3::Time', 'relativeMpduStart'), param('ns3::Time', 'mpduDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): double ns3::PhyEntity::GetRxPowerWForPpdu(ns3::Ptr<ns3::Event> event) const [member function]
+    cls.add_method('GetRxPowerWForPpdu', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::tuple<double, double, double> ns3::PhyEntity::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::PhyEntity::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsConfigSupported(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsConfigSupported', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::NotifyInterferenceRxEndAndClear(bool reset) [member function]
+    cls.add_method('NotifyInterferenceRxEndAndClear', 
+                   'void', 
+                   [param('bool', 'reset')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint64_t ns3::PhyEntity::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('ObtainNextUid', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ScheduleEndOfMpdus(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ScheduleEndOfMpdus', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartPreambleDetectionPeriod(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartPreambleDetectionPeriod', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::UpdateInterferenceEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateInterferenceEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')], 
+                   visibility='protected')
     return
 
-def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
-    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
-    cls.add_constructor([])
-    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker(ns3::Ipv6AddressChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv6AddressChecker const &', 'arg0')])
+def register_Ns3PhyEntityPhyFieldRxStatus_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(ns3::PhyEntity::PhyFieldRxStatus const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity::PhyFieldRxStatus const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(bool s) [constructor]
+    cls.add_constructor([param('bool', 's')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(bool s, ns3::WifiPhyRxfailureReason r, ns3::PhyEntity::PhyRxFailureAction a) [constructor]
+    cls.add_constructor([param('bool', 's'), param('ns3::WifiPhyRxfailureReason', 'r'), param('ns3::PhyEntity::PhyRxFailureAction', 'a')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::actionIfFailure [variable]
+    cls.add_instance_attribute('actionIfFailure', 'ns3::PhyEntity::PhyRxFailureAction', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::isSuccess [variable]
+    cls.add_instance_attribute('isSuccess', 'bool', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::reason [variable]
+    cls.add_instance_attribute('reason', 'ns3::WifiPhyRxfailureReason', is_const=False)
+    return
+
+def register_Ns3PhyEntitySnrPer_methods(root_module, cls):
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer(ns3::PhyEntity::SnrPer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity::SnrPer const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer(double s, double p) [constructor]
+    cls.add_constructor([param('double', 's'), param('double', 'p')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::per [variable]
+    cls.add_instance_attribute('per', 'double', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
     return
 
-def register_Ns3Ipv6AddressValue_methods(root_module, cls):
-    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue() [constructor]
+def register_Ns3QosBlockedDestinations_methods(root_module, cls):
+    ## qos-blocked-destinations.h (module 'wifi'): ns3::QosBlockedDestinations::QosBlockedDestinations(ns3::QosBlockedDestinations const & arg0) [constructor]
+    cls.add_constructor([param('ns3::QosBlockedDestinations const &', 'arg0')])
+    ## qos-blocked-destinations.h (module 'wifi'): ns3::QosBlockedDestinations::QosBlockedDestinations() [constructor]
     cls.add_constructor([])
-    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6Address const & value) [constructor]
-    cls.add_constructor([param('ns3::Ipv6Address const &', 'value')])
-    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6AddressValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv6AddressValue const &', 'arg0')])
-    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6AddressValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+    ## qos-blocked-destinations.h (module 'wifi'): void ns3::QosBlockedDestinations::Block(ns3::Mac48Address dest, uint8_t tid) [member function]
+    cls.add_method('Block', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'dest'), param('uint8_t', 'tid')])
+    ## qos-blocked-destinations.h (module 'wifi'): bool ns3::QosBlockedDestinations::IsBlocked(ns3::Mac48Address dest, uint8_t tid) const [member function]
+    cls.add_method('IsBlocked', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6AddressValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Ipv6Address', 
-                   [], 
+                   [param('ns3::Mac48Address', 'dest'), param('uint8_t', 'tid')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## ipv6-address.h (module 'network'): void ns3::Ipv6AddressValue::Set(ns3::Ipv6Address const & value) [member function]
-    cls.add_method('Set', 
+    ## qos-blocked-destinations.h (module 'wifi'): void ns3::QosBlockedDestinations::Unblock(ns3::Mac48Address dest, uint8_t tid) [member function]
+    cls.add_method('Unblock', 
                    'void', 
-                   [param('ns3::Ipv6Address const &', 'value')])
-    return
-
-def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
-    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
-    cls.add_constructor([])
-    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker(ns3::Ipv6PrefixChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv6PrefixChecker const &', 'arg0')])
+                   [param('ns3::Mac48Address', 'dest'), param('uint8_t', 'tid')])
     return
 
-def register_Ns3Ipv6PrefixValue_methods(root_module, cls):
-    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue() [constructor]
+def register_Ns3QosFrameExchangeManager_methods(root_module, cls):
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::QosFrameExchangeManager::QosFrameExchangeManager(ns3::QosFrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::QosFrameExchangeManager const &', 'arg0')])
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::QosFrameExchangeManager::QosFrameExchangeManager() [constructor]
     cls.add_constructor([])
-    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6Prefix const & value) [constructor]
-    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'value')])
-    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6PrefixValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv6PrefixValue const &', 'arg0')])
-    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6PrefixValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## qos-frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::QosFrameExchangeManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
+                   is_static=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::IsWithinLimitsIfAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams, ns3::Time ppduDurationLimit) const [member function]
+    cls.add_method('IsWithinLimitsIfAddMpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Time', 'ppduDurationLimit')], 
                    is_const=True, is_virtual=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6PrefixValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::IsWithinSizeAndTimeLimits(uint32_t ppduPayloadSize, ns3::Mac48Address receiver, ns3::WifiTxParameters const & txParams, ns3::Time ppduDurationLimit) const [member function]
+    cls.add_method('IsWithinSizeAndTimeLimits', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [param('uint32_t', 'ppduPayloadSize'), param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Time', 'ppduDurationLimit')], 
+                   is_const=True, is_virtual=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::StartTransmission(ns3::Ptr<ns3::Txop> edca) [member function]
+    cls.add_method('StartTransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'edca')], 
                    is_virtual=True)
-    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix ns3::Ipv6PrefixValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Ipv6Prefix', 
-                   [], 
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime) const [member function]
+    cls.add_method('TryAddMpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6PrefixValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## ipv6-address.h (module 'network'): void ns3::Ipv6PrefixValue::Set(ns3::Ipv6Prefix const & value) [member function]
-    cls.add_method('Set', 
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('ns3::Ipv6Prefix const &', 'value')])
-    return
-
-def register_Ns3ItuR1411LosPropagationLossModel_methods(root_module, cls):
-    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ItuR1411LosPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): ns3::ItuR1411LosPropagationLossModel::ItuR1411LosPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): void ns3::ItuR1411LosPropagationLossModel::SetFrequency(double freq) [member function]
-    cls.add_method('SetFrequency', 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::QosFrameExchangeManager::GetCtsToSelfDurationId(ns3::WifiTxVector const & ctsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetCtsToSelfDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'ctsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::QosFrameExchangeManager::GetFrameDurationId(ns3::WifiMacHeader const & header, uint32_t size, ns3::WifiTxParameters const & txParams, ns3::Ptr<ns3::Packet> fragmentedPacket) const [member function]
+    cls.add_method('GetFrameDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Ptr< ns3::Packet >', 'fragmentedPacket')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::QosFrameExchangeManager::GetRtsDurationId(ns3::WifiTxVector const & rtsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetRtsDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'rtsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::PifsRecovery() [member function]
+    cls.add_method('PifsRecovery', 
                    'void', 
-                   [param('double', 'freq')])
-    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411LosPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetLoss', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True)
-    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411LosPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): int64_t ns3::ItuR1411LosPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3ItuR1411NlosOverRooftopPropagationLossModel_methods(root_module, cls):
-    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ItuR1411NlosOverRooftopPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): ns3::ItuR1411NlosOverRooftopPropagationLossModel::ItuR1411NlosOverRooftopPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): void ns3::ItuR1411NlosOverRooftopPropagationLossModel::SetFrequency(double freq) [member function]
-    cls.add_method('SetFrequency', 
+                   visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::PreProcessFrame(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('PreProcessFrame', 
                    'void', 
-                   [param('double', 'freq')])
-    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411NlosOverRooftopPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetLoss', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True)
-    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411NlosOverRooftopPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): int64_t ns3::ItuR1411NlosOverRooftopPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::ReceiveMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector const & txVector, bool inAmpdu) [member function]
+    cls.add_method('ReceiveMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::SendCfEndIfNeeded() [member function]
+    cls.add_method('SendCfEndIfNeeded', 
+                   'bool', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::SetTxopHolder(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('SetTxopHolder', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::StartFrameExchange(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('StartFrameExchange', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::StartTransmission(ns3::Ptr<ns3::QosTxop> edca, ns3::Time txopDuration) [member function]
+    cls.add_method('StartTransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'txopDuration')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::TransmissionFailed() [member function]
+    cls.add_method('TransmissionFailed', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::TransmissionSucceeded() [member function]
+    cls.add_method('TransmissionSucceeded', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
-def register_Ns3JakesProcess_methods(root_module, cls):
-    ## jakes-process.h (module 'propagation'): ns3::JakesProcess::JakesProcess(ns3::JakesProcess const & arg0) [constructor]
-    cls.add_constructor([param('ns3::JakesProcess const &', 'arg0')])
-    ## jakes-process.h (module 'propagation'): ns3::JakesProcess::JakesProcess() [constructor]
+def register_Ns3QosTxop_methods(root_module, cls):
+    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::QosTxop const & arg0) [constructor]
+    cls.add_constructor([param('ns3::QosTxop const &', 'arg0')])
+    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop() [constructor]
     cls.add_constructor([])
-    ## jakes-process.h (module 'propagation'): void ns3::JakesProcess::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AddBaResponseTimeout(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('AddBaResponseTimeout', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AssignSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('AssignSequenceNumber', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteMpduTx(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('CompleteMpduTx', 
                    'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## qos-txop.h (module 'wifi'): ns3::AcIndex ns3::QosTxop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
                    [], 
-                   is_virtual=True)
-    ## jakes-process.h (module 'propagation'): double ns3::JakesProcess::GetChannelGainDb() const [member function]
-    cls.add_method('GetChannelGainDb', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetAddBaResponseTimeout() const [member function]
+    cls.add_method('GetAddBaResponseTimeout', 
+                   'ns3::Time', 
                    [], 
                    is_const=True)
-    ## jakes-process.h (module 'propagation'): std::complex<double> ns3::JakesProcess::GetComplexGain() const [member function]
-    cls.add_method('GetComplexGain', 
-                   'std::complex< double >', 
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetBaAgreementEstablished(ns3::Mac48Address address, uint8_t tid) const [member function]
+    cls.add_method('GetBaAgreementEstablished', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBaBufferSize(ns3::Mac48Address address, uint8_t tid) const [member function]
+    cls.add_method('GetBaBufferSize', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::BlockAckManager> ns3::QosTxop::GetBaManager() [member function]
+    cls.add_method('GetBaManager', 
+                   'ns3::Ptr< ns3::BlockAckManager >', 
+                   [])
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBaStartingSequence(ns3::Mac48Address address, uint8_t tid) const [member function]
+    cls.add_method('GetBaStartingSequence', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBlockAckInactivityTimeout() const [member function]
+    cls.add_method('GetBlockAckInactivityTimeout', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## jakes-process.h (module 'propagation'): static ns3::TypeId ns3::JakesProcess::GetTypeId() [member function]
+    ## qos-txop.h (module 'wifi'): ns3::BlockAckReqType ns3::QosTxop::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetBlockAckThreshold() const [member function]
+    cls.add_method('GetBlockAckThreshold', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::BlockAckType ns3::QosTxop::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetFailedAddBaTimeout() const [member function]
+    cls.add_method('GetFailedAddBaTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame, ns3::WifiMacQueueItem::QueueIteratorPair & queueIt) [member function]
+    cls.add_method('GetNextMpdu', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::QueueIteratorPair &', 'queueIt')])
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('GetNextSequenceNumberFor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetRemainingTxop() const [member function]
+    cls.add_method('GetRemainingTxop', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): static ns3::TypeId ns3::QosTxop::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## jakes-process.h (module 'propagation'): void ns3::JakesProcess::SetPropagationLossModel(ns3::Ptr<const ns3::PropagationLossModel> model) [member function]
-    cls.add_method('SetPropagationLossModel', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAddBaResponse(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('GotAddBaResponse', 
                    'void', 
-                   [param('ns3::Ptr< ns3::PropagationLossModel const >', 'model')])
-    return
-
-def register_Ns3JakesPropagationLossModel_methods(root_module, cls):
-    ## jakes-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::JakesPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotDelBaFrame(ns3::MgtDelBaHeader const * delBaHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('GotDelBaFrame', 
+                   'void', 
+                   [param('ns3::MgtDelBaHeader const *', 'delBaHdr'), param('ns3::Mac48Address', 'recipient')])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::HasFramesToTransmit() [member function]
+    cls.add_method('HasFramesToTransmit', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## jakes-propagation-loss-model.h (module 'propagation'): ns3::JakesPropagationLossModel::JakesPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## jakes-propagation-loss-model.h (module 'propagation'): double ns3::JakesPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## jakes-propagation-loss-model.h (module 'propagation'): int64_t ns3::JakesPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3Kun2600MhzPropagationLossModel_methods(root_module, cls):
-    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::Kun2600MhzPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_virtual=True)
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsQosTxop() const [member function]
+    cls.add_method('IsQosTxop', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): ns3::Kun2600MhzPropagationLossModel::Kun2600MhzPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): double ns3::Kun2600MhzPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetLoss', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True)
-    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): double ns3::Kun2600MhzPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): int64_t ns3::Kun2600MhzPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3LinearWifiTxCurrentModel_methods(root_module, cls):
-    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel(ns3::LinearWifiTxCurrentModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LinearWifiTxCurrentModel const &', 'arg0')])
-    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel() [constructor]
-    cls.add_constructor([])
-    ## wifi-tx-current-model.h (module 'wifi'): double ns3::LinearWifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
-    cls.add_method('CalcTxCurrent', 
-                   'double', 
-                   [param('double', 'txPowerDbm')], 
                    is_const=True, is_virtual=True)
-    ## wifi-tx-current-model.h (module 'wifi'): static ns3::TypeId ns3::LinearWifiTxCurrentModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsTxopStarted() const [member function]
+    cls.add_method('IsTxopStarted', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    return
-
-def register_Ns3ListErrorModel_methods(root_module, cls):
-    ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel(ns3::ListErrorModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
-    ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
-    cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
-    cls.add_method('GetList', 
-                   'std::list< unsigned int >', 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
+    cls.add_method('NotifyChannelAccessed', 
+                   'void', 
+                   [param('ns3::Time', 'txopDuration')], 
+                   is_virtual=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelReleased() [member function]
+    cls.add_method('NotifyChannelReleased', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## error-model.h (module 'network'): static ns3::TypeId ns3::ListErrorModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_virtual=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyInternalCollision() [member function]
+    cls.add_method('NotifyInternalCollision', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
-    cls.add_method('SetList', 
+                   is_virtual=True)
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('PeekNextMpdu', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::QueueIteratorPair queueIt, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('PeekNextMpdu', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::WifiMacQueueItem::QueueIteratorPair', 'queueIt'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('PeekNextSequenceNumberFor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PrepareBlockAckRequest(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('PrepareBlockAckRequest', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::PushFront(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('PushFront', 
                    'void', 
-                   [param('std::list< unsigned int > const &', 'packetlist')])
-    ## error-model.h (module 'network'): bool ns3::ListErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorrupt', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ResetBa(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('ResetBa', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ScheduleBar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, bool skipIfNoDataQueued=false) [member function]
+    cls.add_method('ScheduleBar', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAccessCategory(ns3::AcIndex ac) [member function]
+    cls.add_method('SetAccessCategory', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAddBaResponseTimeout(ns3::Time addBaResponseTimeout) [member function]
+    cls.add_method('SetAddBaResponseTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'addBaResponseTimeout')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckInactivityTimeout(uint16_t timeout) [member function]
+    cls.add_method('SetBlockAckInactivityTimeout', 
+                   'void', 
+                   [param('uint16_t', 'timeout')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckThreshold(uint8_t threshold) [member function]
+    cls.add_method('SetBlockAckThreshold', 
+                   'void', 
+                   [param('uint8_t', 'threshold')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetFailedAddBaTimeout(ns3::Time failedAddBaTimeout) [member function]
+    cls.add_method('SetFailedAddBaTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'failedAddBaTimeout')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosFrameExchangeManager(ns3::Ptr<ns3::QosFrameExchangeManager> const qosFem) [member function]
+    cls.add_method('SetQosFrameExchangeManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::QosFrameExchangeManager > const', 'qosFem')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosQueueSize(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('SetQosQueueSize', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
+                   is_virtual=True)
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::UseExplicitBarAfterMissedBlockAck() const [member function]
+    cls.add_method('UseExplicitBarAfterMissedBlockAck', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::DoReset() [member function]
-    cls.add_method('DoReset', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3LogDistancePropagationLossModel_methods(root_module, cls):
-    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::LogDistancePropagationLossModel::GetTypeId() [member function]
+def register_Ns3Queue__Ns3Packet_methods(root_module, cls):
+    ## queue.h (module 'network'): static ns3::TypeId ns3::Queue<ns3::Packet>::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## propagation-loss-model.h (module 'propagation'): ns3::LogDistancePropagationLossModel::LogDistancePropagationLossModel() [constructor]
+    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Queue() [constructor]
     cls.add_constructor([])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::LogDistancePropagationLossModel::SetPathLossExponent(double n) [member function]
-    cls.add_method('SetPathLossExponent', 
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::Enqueue(ns3::Ptr<ns3::Packet> item) [member function]
+    cls.add_method('Enqueue', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'item')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::Dequeue() [member function]
+    cls.add_method('Dequeue', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::Remove() [member function]
+    cls.add_method('Remove', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<const ns3::Packet> ns3::Queue<ns3::Packet>::Peek() const [member function]
+    cls.add_method('Peek', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::Flush() [member function]
+    cls.add_method('Flush', 
                    'void', 
-                   [param('double', 'n')])
-    ## propagation-loss-model.h (module 'propagation'): double ns3::LogDistancePropagationLossModel::GetPathLossExponent() const [member function]
-    cls.add_method('GetPathLossExponent', 
-                   'double', 
+                   [])
+    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Queue(ns3::Queue<ns3::Packet> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Queue< ns3::Packet > const &', 'arg0')])
+    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::ConstIterator ns3::Queue<ns3::Packet>::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::Queue< ns3::Packet > ConstIterator', 
                    [], 
-                   is_const=True)
-    ## propagation-loss-model.h (module 'propagation'): void ns3::LogDistancePropagationLossModel::SetReference(double referenceDistance, double referenceLoss) [member function]
-    cls.add_method('SetReference', 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Iterator ns3::Queue<ns3::Packet>::begin() [member function]
+    cls.add_method('begin', 
+                   'ns3::Queue< ns3::Packet > Iterator', 
+                   [], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::ConstIterator ns3::Queue<ns3::Packet>::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::Queue< ns3::Packet > ConstIterator', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Iterator ns3::Queue<ns3::Packet>::end() [member function]
+    cls.add_method('end', 
+                   'ns3::Queue< ns3::Packet > Iterator', 
+                   [], 
+                   visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
+    cls.add_method('DoDequeue', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoRemove(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
+    cls.add_method('DoRemove', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<const ns3::Packet> ns3::Queue<ns3::Packet>::DoPeek(ns3::Queue<ns3::Packet>::ConstIterator pos) const [member function]
+    cls.add_method('DoPeek', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos')], 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DropBeforeEnqueue(ns3::Ptr<ns3::Packet> item) [member function]
+    cls.add_method('DropBeforeEnqueue', 
                    'void', 
-                   [param('double', 'referenceDistance'), param('double', 'referenceLoss')])
-    ## propagation-loss-model.h (module 'propagation'): double ns3::LogDistancePropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::LogDistancePropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
+                   [param('ns3::Ptr< ns3::Packet >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DropAfterDequeue(ns3::Ptr<ns3::Packet> item) [member function]
+    cls.add_method('DropAfterDequeue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
-def register_Ns3LogNormalRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::LogNormalRandomVariable::GetTypeId() [member function]
+def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
+    ## queue.h (module 'network'): static ns3::TypeId ns3::Queue<ns3::QueueDiscItem>::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable::LogNormalRandomVariable() [constructor]
+    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Queue() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetMu() const [member function]
-    cls.add_method('GetMu', 
-                   'double', 
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::Enqueue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
+    cls.add_method('Enqueue', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::Dequeue() [member function]
+    cls.add_method('Dequeue', 
+                   'ns3::Ptr< ns3::QueueDiscItem >', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetSigma() const [member function]
-    cls.add_method('GetSigma', 
-                   'double', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::Remove() [member function]
+    cls.add_method('Remove', 
+                   'ns3::Ptr< ns3::QueueDiscItem >', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue(double mu, double sigma) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'mu'), param('double', 'sigma')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger(uint32_t mu, uint32_t sigma) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'mu'), param('uint32_t', 'sigma')])
-    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<const ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::Peek() const [member function]
+    cls.add_method('Peek', 
+                   'ns3::Ptr< ns3::QueueDiscItem const >', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::Flush() [member function]
+    cls.add_method('Flush', 
+                   'void', 
+                   [])
+    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Queue(ns3::Queue<ns3::QueueDiscItem> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Queue< ns3::QueueDiscItem > const &', 'arg0')])
+    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::ConstIterator ns3::Queue<ns3::QueueDiscItem>::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::Queue< ns3::QueueDiscItem > ConstIterator', 
                    [], 
-                   is_virtual=True)
-    return
-
-def register_Ns3Mac48AddressChecker_methods(root_module, cls):
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
-    cls.add_constructor([])
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
-    return
-
-def register_Ns3Mac48AddressValue_methods(root_module, cls):
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
-    cls.add_constructor([])
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
-    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
-    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Iterator ns3::Queue<ns3::QueueDiscItem>::begin() [member function]
+    cls.add_method('begin', 
+                   'ns3::Queue< ns3::QueueDiscItem > Iterator', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Mac48Address', 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::ConstIterator ns3::Queue<ns3::QueueDiscItem>::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::Queue< ns3::QueueDiscItem > ConstIterator', 
                    [], 
-                   is_const=True)
-    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::Mac48Address const &', 'value')])
-    return
-
-def register_Ns3MacLow_methods(root_module, cls):
-    ## mac-low.h (module 'wifi'): ns3::MacLow::MacLow(ns3::MacLow const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacLow const &', 'arg0')])
-    ## mac-low.h (module 'wifi'): ns3::MacLow::MacLow() [constructor]
-    cls.add_constructor([])
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateOverallTxTime(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const * hdr, ns3::MacLowTransmissionParameters const & params, uint32_t fragmentSize=0) const [member function]
-    cls.add_method('CalculateOverallTxTime', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters const &', 'params'), param('uint32_t', 'fragmentSize', default_value='0')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateOverheadTxTime(ns3::Ptr<const ns3::WifiMacQueueItem> item, ns3::MacLowTransmissionParameters const & params) const [member function]
-    cls.add_method('CalculateOverheadTxTime', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item'), param('ns3::MacLowTransmissionParameters const &', 'params')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateTransmissionTime(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const * hdr, ns3::MacLowTransmissionParameters const & parameters) const [member function]
-    cls.add_method('CalculateTransmissionTime', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters const &', 'parameters')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::CanTransmitNextCfFrame() const [member function]
-    cls.add_method('CanTransmitNextCfFrame', 
-                   'bool', 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Iterator ns3::Queue<ns3::QueueDiscItem>::end() [member function]
+    cls.add_method('end', 
+                   'ns3::Queue< ns3::QueueDiscItem > Iterator', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::CreateBlockAckAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address originator, uint16_t startingSeq) [member function]
-    cls.add_method('CreateBlockAckAgreement', 
+                   visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
+    cls.add_method('DoDequeue', 
+                   'ns3::Ptr< ns3::QueueDiscItem >', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoRemove(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
+    cls.add_method('DoRemove', 
+                   'ns3::Ptr< ns3::QueueDiscItem >', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<const ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoPeek(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) const [member function]
+    cls.add_method('DoPeek', 
+                   'ns3::Ptr< ns3::QueueDiscItem const >', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos')], 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DropBeforeEnqueue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
+    cls.add_method('DropBeforeEnqueue', 
                    'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'originator'), param('uint16_t', 'startingSeq')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DeaggregateAmpduAndReceive(ns3::Ptr<ns3::WifiPsdu> aggregatedPacket, double rxSnr, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
-    cls.add_method('DeaggregateAmpduAndReceive', 
+                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DropAfterDequeue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
+    cls.add_method('DropAfterDequeue', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'aggregatedPacket'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('std::vector< bool >', 'statusPerMpdu')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DestroyBlockAckAgreement(ns3::Mac48Address originator, uint8_t tid) [member function]
-    cls.add_method('DestroyBlockAckAgreement', 
+                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')])
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::DoNavStartNow(ns3::Time duration) [member function]
-    cls.add_method('DoNavStartNow', 
-                   'bool', 
-                   [param('ns3::Time', 'duration')])
-    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLow::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetBeaconInterval() const [member function]
-    cls.add_method('GetBeaconInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLow::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetCfpMaxDuration() const [member function]
-    cls.add_method('GetCfpMaxDuration', 
-                   'ns3::Time', 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3Queue__Ns3WifiMacQueueItem_methods(root_module, cls):
+    ## queue.h (module 'network'): static ns3::TypeId ns3::Queue<ns3::WifiMacQueueItem>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::GetCtsToSelfSupported() const [member function]
-    cls.add_method('GetCtsToSelfSupported', 
+                   is_static=True)
+    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::Queue() [constructor]
+    cls.add_constructor([])
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::WifiMacQueueItem>::Enqueue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    cls.add_method('Enqueue', 
                    'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::Dequeue() [member function]
+    cls.add_method('Dequeue', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::WifiTxVector ns3::MacLow::GetDataTxVector(ns3::Ptr<const ns3::WifiMacQueueItem> item) const [member function]
-    cls.add_method('GetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item')], 
-                   is_const=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::MacLow::GetEdca(uint8_t tid) const [member function]
-    cls.add_method('GetEdca', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MpduAggregator> ns3::MacLow::GetMpduAggregator() const [member function]
-    cls.add_method('GetMpduAggregator', 
-                   'ns3::Ptr< ns3::MpduAggregator >', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MsduAggregator> ns3::MacLow::GetMsduAggregator() const [member function]
-    cls.add_method('GetMsduAggregator', 
-                   'ns3::Ptr< ns3::MsduAggregator >', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::MacLow::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetPifs() const [member function]
-    cls.add_method('GetPifs', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetRemainingCfpDuration() const [member function]
-    cls.add_method('GetRemainingCfpDuration', 
-                   'ns3::Time', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::Remove() [member function]
+    cls.add_method('Remove', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetSifs() const [member function]
-    cls.add_method('GetSifs', 
-                   'ns3::Time', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::Peek() const [member function]
+    cls.add_method('Peek', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetSlotTime() const [member function]
-    cls.add_method('GetSlotTime', 
-                   'ns3::Time', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::Flush() [member function]
+    cls.add_method('Flush', 
+                   'void', 
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::Queue(ns3::Queue<ns3::WifiMacQueueItem> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Queue< ns3::WifiMacQueueItem > const &', 'arg0')])
+    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::Queue<ns3::WifiMacQueueItem>::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): static ns3::TypeId ns3::MacLow::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::Iterator ns3::Queue<ns3::WifiMacQueueItem>::begin() [member function]
+    cls.add_method('begin', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > Iterator', 
                    [], 
-                   is_static=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsCfPeriod() const [member function]
-    cls.add_method('IsCfPeriod', 
-                   'bool', 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::Queue<ns3::WifiMacQueueItem>::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsPromisc() const [member function]
-    cls.add_method('IsPromisc', 
-                   'bool', 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::Iterator ns3::Queue<ns3::WifiMacQueueItem>::end() [member function]
+    cls.add_method('end', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > Iterator', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsWithinSizeAndTimeLimits(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector txVector, uint32_t ampduSize, ns3::Time ppduDurationLimit) [member function]
-    cls.add_method('IsWithinSizeAndTimeLimits', 
+                   visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::WifiMacQueueItem>::DoEnqueue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    cls.add_method('DoEnqueue', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize'), param('ns3::Time', 'ppduDurationLimit')])
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsWithinSizeAndTimeLimits(uint32_t mpduSize, ns3::Mac48Address receiver, uint8_t tid, ns3::WifiTxVector txVector, uint32_t ampduSize, ns3::Time ppduDurationLimit) [member function]
-    cls.add_method('IsWithinSizeAndTimeLimits', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::WifiMacQueueItem>::DoEnqueue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item, ns3::Queue<ns3::WifiMacQueueItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
                    'bool', 
-                   [param('uint32_t', 'mpduSize'), param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize'), param('ns3::Time', 'ppduDurationLimit')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifyOffNow() [member function]
-    cls.add_method('NotifyOffNow', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifySleepNow() [member function]
-    cls.add_method('NotifySleepNow', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifySwitchingStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifySwitchingStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveError(ns3::Ptr<ns3::WifiPsdu> psdu) [member function]
-    cls.add_method('ReceiveError', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, double rxSnr, ns3::WifiTxVector txVector, bool ampduSubframe) [member function]
-    cls.add_method('ReceiveOk', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('bool', 'ampduSubframe')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> channelAccessManager) [member function]
-    cls.add_method('RegisterChannelAccessManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ChannelAccessManager >', 'channelAccessManager')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterEdcaForAc(ns3::AcIndex ac, ns3::Ptr<ns3::QosTxop> edca) [member function]
-    cls.add_method('RegisterEdcaForAc', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac'), param('ns3::Ptr< ns3::QosTxop >', 'edca')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ResetPhy() [member function]
-    cls.add_method('ResetPhy', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RxStartIndication(ns3::WifiTxVector txVector, ns3::Time psduDuration) [member function]
-    cls.add_method('RxStartIndication', 
-                   'void', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'psduDuration')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetAddress(ns3::Mac48Address ad) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'ad')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetBeaconInterval(ns3::Time interval) [member function]
-    cls.add_method('SetBeaconInterval', 
-                   'void', 
-                   [param('ns3::Time', 'interval')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetBssid(ns3::Mac48Address ad) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'ad')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCfpMaxDuration(ns3::Time duration) [member function]
-    cls.add_method('SetCfpMaxDuration', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCtsToSelfSupported(bool enable) [member function]
-    cls.add_method('SetCtsToSelfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetMpduAggregator(ns3::Ptr<ns3::MpduAggregator> const aggr) [member function]
-    cls.add_method('SetMpduAggregator', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MpduAggregator > const', 'aggr')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetMsduAggregator(ns3::Ptr<ns3::MsduAggregator> const aggr) [member function]
-    cls.add_method('SetMsduAggregator', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MsduAggregator > const', 'aggr')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetRxCallback(ns3::Callback<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetRxCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const manager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item'), param('ns3::Queue< ns3::WifiMacQueueItem > Iterator &', 'ret')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoDequeue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
+    cls.add_method('DoDequeue', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoRemove(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
+    cls.add_method('DoRemove', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoPeek(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) const [member function]
+    cls.add_method('DoPeek', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')], 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::DropBeforeEnqueue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    cls.add_method('DropBeforeEnqueue', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'manager')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::StartTransmission(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::MacLowTransmissionParameters parameters, ns3::Ptr<ns3::Txop> txop) [member function]
-    cls.add_method('StartTransmission', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::DropAfterDequeue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    cls.add_method('DropAfterDequeue', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::Ptr< ns3::Txop >', 'txop')], 
-                   is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DoDispose() [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3MacRxMiddle_methods(root_module, cls):
-    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle::MacRxMiddle(ns3::MacRxMiddle const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacRxMiddle const &', 'arg0')])
-    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle::MacRxMiddle() [constructor]
-    cls.add_constructor([])
-    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::SetForwardCallback(ns3::MacRxMiddle::ForwardUpCallback callback) [member function]
-    cls.add_method('SetForwardCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::SetPcfCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetPcfCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   is_virtual=True, visibility='protected')
     return
 
-def register_Ns3MacTxMiddle_methods(root_module, cls):
-    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle(ns3::MacTxMiddle const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacTxMiddle const &', 'arg0')])
-    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle() [constructor]
-    cls.add_constructor([])
-    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSeqNumberByTidAndAddress(uint8_t tid, ns3::Mac48Address addr) const [member function]
-    cls.add_method('GetNextSeqNumberByTidAndAddress', 
-                   'uint16_t', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'addr')], 
+def register_Ns3QueueItem_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## queue-item.h (module 'network'): ns3::QueueItem::QueueItem(ns3::Ptr<ns3::Packet> p) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'p')])
+    ## queue-item.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::QueueItem::GetPacket() const [member function]
+    cls.add_method('GetPacket', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [], 
                    is_const=True)
-    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('GetNextSequenceNumberFor', 
-                   'uint16_t', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('PeekNextSequenceNumberFor', 
-                   'uint16_t', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
-    return
-
-def register_Ns3MatrixPropagationLossModel_methods(root_module, cls):
-    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::MatrixPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## queue-item.h (module 'network'): uint32_t ns3::QueueItem::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## propagation-loss-model.h (module 'propagation'): ns3::MatrixPropagationLossModel::MatrixPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::MatrixPropagationLossModel::SetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b, double loss, bool symmetric=true) [member function]
-    cls.add_method('SetLoss', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b'), param('double', 'loss'), param('bool', 'symmetric', default_value='true')])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::MatrixPropagationLossModel::SetDefaultLoss(double defaultLoss) [member function]
-    cls.add_method('SetDefaultLoss', 
-                   'void', 
-                   [param('double', 'defaultLoss')])
-    ## propagation-loss-model.h (module 'propagation'): double ns3::MatrixPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::MatrixPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
+                   is_const=True, is_virtual=True)
+    ## queue-item.h (module 'network'): bool ns3::QueueItem::GetUint8Value(ns3::QueueItem::Uint8Values field, uint8_t & value) const [member function]
+    cls.add_method('GetUint8Value', 
+                   'bool', 
+                   [param('ns3::QueueItem::Uint8Values', 'field'), param('uint8_t &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## queue-item.h (module 'network'): void ns3::QueueItem::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
     return
 
-def register_Ns3MgtBeaconHeader_methods(root_module, cls):
-    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader() [constructor]
+def register_Ns3QueueSizeChecker_methods(root_module, cls):
+    ## queue-size.h (module 'network'): ns3::QueueSizeChecker::QueueSizeChecker() [constructor]
     cls.add_constructor([])
-    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader(ns3::MgtBeaconHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MgtBeaconHeader const &', 'arg0')])
-    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtBeaconHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## queue-size.h (module 'network'): ns3::QueueSizeChecker::QueueSizeChecker(ns3::QueueSizeChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::QueueSizeChecker const &', 'arg0')])
+    return
+
+def register_Ns3QueueSizeValue_methods(root_module, cls):
+    ## queue-size.h (module 'network'): ns3::QueueSizeValue::QueueSizeValue() [constructor]
+    cls.add_constructor([])
+    ## queue-size.h (module 'network'): ns3::QueueSizeValue::QueueSizeValue(ns3::QueueSize const & value) [constructor]
+    cls.add_constructor([param('ns3::QueueSize const &', 'value')])
+    ## queue-size.h (module 'network'): ns3::QueueSizeValue::QueueSizeValue(ns3::QueueSizeValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::QueueSizeValue const &', 'arg0')])
+    ## queue-size.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::QueueSizeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_static=True)
+                   is_const=True, is_virtual=True)
+    ## queue-size.h (module 'network'): bool ns3::QueueSizeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## queue-size.h (module 'network'): ns3::QueueSize ns3::QueueSizeValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::QueueSize', 
+                   [], 
+                   is_const=True)
+    ## queue-size.h (module 'network'): std::string ns3::QueueSizeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## queue-size.h (module 'network'): void ns3::QueueSizeValue::Set(ns3::QueueSize const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::QueueSize const &', 'value')])
     return
 
-def register_Ns3MinstrelHtWifiManager_methods(root_module, cls):
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtWifiManager::MinstrelHtWifiManager(ns3::MinstrelHtWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MinstrelHtWifiManager const &', 'arg0')])
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtWifiManager::MinstrelHtWifiManager() [constructor]
+def register_Ns3RateErrorModel_methods(root_module, cls):
+    ## error-model.h (module 'network'): ns3::RateErrorModel::RateErrorModel(ns3::RateErrorModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RateErrorModel const &', 'arg0')])
+    ## error-model.h (module 'network'): ns3::RateErrorModel::RateErrorModel() [constructor]
     cls.add_constructor([])
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): int64_t ns3::MinstrelHtWifiManager::AssignStreams(int64_t stream) [member function]
+    ## error-model.h (module 'network'): int64_t ns3::RateErrorModel::AssignStreams(int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::MinstrelHtWifiManager::GetTypeId() [member function]
+    ## error-model.h (module 'network'): double ns3::RateErrorModel::GetRate() const [member function]
+    cls.add_method('GetRate', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## error-model.h (module 'network'): static ns3::TypeId ns3::RateErrorModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetupMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
-                   is_virtual=True)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::MinstrelHtWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+    ## error-model.h (module 'network'): ns3::RateErrorModel::ErrorUnit ns3::RateErrorModel::GetUnit() const [member function]
+    cls.add_method('GetUnit', 
+                   'ns3::RateErrorModel::ErrorUnit', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelHtWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelHtWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   is_const=True)
+    ## error-model.h (module 'network'): void ns3::RateErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+    cls.add_method('SetRandomVariable', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): bool ns3::MinstrelHtWifiManager::DoNeedRetransmission(ns3::WifiRemoteStation * st, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
-    cls.add_method('DoNeedRetransmission', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation *', 'st'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportAmpduTxStatus', 
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
+    ## error-model.h (module 'network'): void ns3::RateErrorModel::SetRate(double rate) [member function]
+    cls.add_method('SetRate', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
+                   [param('double', 'rate')])
+    ## error-model.h (module 'network'): void ns3::RateErrorModel::SetUnit(ns3::RateErrorModel::ErrorUnit error_unit) [member function]
+    cls.add_method('SetUnit', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   [param('ns3::RateErrorModel::ErrorUnit', 'error_unit')])
+    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorrupt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
                    is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorruptBit(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorruptBit', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
                    is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
+    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorruptByte(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorruptByte', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
                    is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
+    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorruptPkt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorruptPkt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
                    is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+    ## error-model.h (module 'network'): void ns3::RateErrorModel::DoReset() [member function]
+    cls.add_method('DoReset', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   [], 
                    is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+    return
+
+def register_Ns3ReceiveListErrorModel_methods(root_module, cls):
+    ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel(ns3::ReceiveListErrorModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
+    ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
+    cls.add_constructor([])
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    cls.add_method('GetList', 
+                   'std::list< unsigned int >', 
+                   [], 
+                   is_const=True)
+    ## error-model.h (module 'network'): static ns3::TypeId ns3::ReceiveListErrorModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    cls.add_method('SetList', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   [param('std::list< unsigned int > const &', 'packetlist')])
+    ## error-model.h (module 'network'): bool ns3::ReceiveListErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorrupt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
                    is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::DoReset() [member function]
+    cls.add_method('DoReset', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   [], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3MinstrelWifiManager_methods(root_module, cls):
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::MinstrelWifiManager::MinstrelWifiManager(ns3::MinstrelWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MinstrelWifiManager const &', 'arg0')])
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::MinstrelWifiManager::MinstrelWifiManager() [constructor]
-    cls.add_constructor([])
-    ## minstrel-wifi-manager.h (module 'wifi'): int64_t ns3::MinstrelWifiManager::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::CheckInit(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('CheckInit', 
-                   'void', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): uint32_t ns3::MinstrelWifiManager::CountRetries(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('CountRetries', 
-                   'uint32_t', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): uint16_t ns3::MinstrelWifiManager::FindRate(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('FindRate', 
-                   'uint16_t', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::GetDataTxVector(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('GetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::GetRtsTxVector(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('GetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::MinstrelWifiManager::GetTypeId() [member function]
+def register_Ns3RegularWifiMac_methods(root_module, cls):
+    ## regular-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::RegularWifiMac::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::InitSampleTable(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('InitSampleTable', 
-                   'void', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetupMac', 
+                   is_static=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac::RegularWifiMac() [constructor]
+    cls.add_constructor([])
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetShortSlotTimeSupported(bool enable) [member function]
+    cls.add_method('SetShortSlotTimeSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetShortSlotTimeSupported() const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ssid ns3::RegularWifiMac::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
                    is_virtual=True)
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetWifiPhy', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
                    is_virtual=True)
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdatePacketCounters(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('UpdatePacketCounters', 
-                   'void', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdateRate(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('UpdateRate', 
-                   'void', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdateRetry(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('UpdateRetry', 
-                   'void', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdateStats(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('UpdateStats', 
-                   'void', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::MinstrelWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::RegularWifiMac::GetWifiPhy() const [member function]
+    cls.add_method('GetWifiPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ResetWifiPhy() [member function]
+    cls.add_method('ResetWifiPhy', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): bool ns3::MinstrelWifiManager::DoNeedRetransmission(ns3::WifiRemoteStation * st, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
-    cls.add_method('DoNeedRetransmission', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation *', 'st'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
+                   [param('ns3::WifiStandard', 'standard')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::RegularWifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
+    cls.add_method('SetForwardUpCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
+    cls.add_method('GetWifiRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::RegularWifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3MobilityModel_methods(root_module, cls):
-    ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel(ns3::MobilityModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MobilityModel const &', 'arg0')])
-    ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel() [constructor]
-    cls.add_constructor([])
-    ## mobility-model.h (module 'mobility'): int64_t ns3::MobilityModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetDistanceFrom(ns3::Ptr<const ns3::MobilityModel> position) const [member function]
-    cls.add_method('GetDistanceFrom', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'position')], 
+                   [param('bool', 'enable')])
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')])
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
+                   [], 
                    is_const=True)
-    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPosition() const [member function]
-    cls.add_method('GetPosition', 
-                   'ns3::Vector', 
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
+    cls.add_method('GetExtendedCapabilities', 
+                   'ns3::ExtendedCapabilities', 
                    [], 
                    is_const=True)
-    ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetRelativeSpeed(ns3::Ptr<const ns3::MobilityModel> other) const [member function]
-    cls.add_method('GetRelativeSpeed', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'other')], 
+    ## regular-wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::RegularWifiMac::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
                    is_const=True)
-    ## mobility-model.h (module 'mobility'): static ns3::TypeId ns3::MobilityModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## regular-wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::RegularWifiMac::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
                    [], 
-                   is_static=True)
-    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetVelocity() const [member function]
-    cls.add_method('GetVelocity', 
-                   'ns3::Vector', 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::RegularWifiMac::GetHeCapabilities() const [member function]
+    cls.add_method('GetHeCapabilities', 
+                   'ns3::HeCapabilities', 
                    [], 
                    is_const=True)
-    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::SetPosition(ns3::Vector const & position) [member function]
-    cls.add_method('SetPosition', 
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Vector const &', 'position')])
-    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::NotifyCourseChange() const [member function]
-    cls.add_method('NotifyCourseChange', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_virtual=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
+    cls.add_method('ConfigureContentionWindow', 
+                   'void', 
+                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
+    cls.add_method('SetQosSupported', 
                    'void', 
+                   [param('bool', 'enable')], 
+                   is_virtual=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
                    [], 
                    is_const=True, visibility='protected')
-    ## mobility-model.h (module 'mobility'): int64_t ns3::MobilityModel::DoAssignStreams(int64_t start) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'start')], 
-                   is_virtual=True, visibility='private')
-    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPosition() const [member function]
-    cls.add_method('DoGetPosition', 
-                   'ns3::Vector', 
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetupFrameExchangeManager() [member function]
+    cls.add_method('SetupFrameExchangeManager', 
+                   'void', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetVelocity() const [member function]
-    cls.add_method('DoGetVelocity', 
-                   'ns3::Vector', 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
-    cls.add_method('DoSetPosition', 
-                   'void', 
-                   [param('ns3::Vector const &', 'position')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3MpduAggregator_methods(root_module, cls):
-    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator(ns3::MpduAggregator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MpduAggregator const &', 'arg0')])
-    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator() [constructor]
-    cls.add_constructor([])
-    ## mpdu-aggregator.h (module 'wifi'): static void ns3::MpduAggregator::Aggregate(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::Ptr<ns3::Packet> ampdu, bool isSingle) [member function]
-    cls.add_method('Aggregate', 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetErpSupported(bool enable) [member function]
+    cls.add_method('SetErpSupported', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::Ptr< ns3::Packet >', 'ampdu'), param('bool', 'isSingle')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): static uint8_t ns3::MpduAggregator::CalculatePadding(uint32_t ampduSize) [member function]
-    cls.add_method('CalculatePadding', 
-                   'uint8_t', 
-                   [param('uint32_t', 'ampduSize')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): static ns3::AmpduSubframeHeader ns3::MpduAggregator::GetAmpduSubframeHeader(uint16_t mpduSize, bool isSingle) [member function]
-    cls.add_method('GetAmpduSubframeHeader', 
-                   'ns3::AmpduSubframeHeader', 
-                   [param('uint16_t', 'mpduSize'), param('bool', 'isSingle')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): uint32_t ns3::MpduAggregator::GetMaxAmpduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
-    cls.add_method('GetMaxAmpduSize', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
-                   is_const=True)
-    ## mpdu-aggregator.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > ns3::MpduAggregator::GetNextAmpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector txVector, ns3::Time ppduDurationLimit=ns3::Time::Min()) const [member function]
-    cls.add_method('GetNextAmpdu', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')], 
-                   is_const=True)
-    ## mpdu-aggregator.h (module 'wifi'): static uint32_t ns3::MpduAggregator::GetSizeIfAggregated(uint32_t mpduSize, uint32_t ampduSize) [member function]
-    cls.add_method('GetSizeIfAggregated', 
-                   'uint32_t', 
-                   [param('uint32_t', 'mpduSize'), param('uint32_t', 'ampduSize')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MpduAggregator::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::SetEdcaQueues(ns3::MpduAggregator::EdcaQueues edcaQueues) [member function]
-    cls.add_method('SetEdcaQueues', 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetDsssSupported(bool enable) [member function]
+    cls.add_method('SetDsssSupported', 
                    'void', 
-                   [param('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'edcaQueues')])
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
     return
 
-def register_Ns3MsduAggregator_methods(root_module, cls):
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator(ns3::MsduAggregator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MsduAggregator const &', 'arg0')])
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator() [constructor]
+def register_Ns3RrMultiUserScheduler_methods(root_module, cls):
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::RrMultiUserScheduler::RrMultiUserScheduler(ns3::RrMultiUserScheduler const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RrMultiUserScheduler const &', 'arg0')])
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::RrMultiUserScheduler::RrMultiUserScheduler() [constructor]
     cls.add_constructor([])
-    ## msdu-aggregator.h (module 'wifi'): static uint8_t ns3::MsduAggregator::CalculatePadding(uint16_t amsduSize) [member function]
-    cls.add_method('CalculatePadding', 
-                   'uint8_t', 
-                   [param('uint16_t', 'amsduSize')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): static ns3::MsduAggregator::DeaggregatedMsdus ns3::MsduAggregator::Deaggregate(ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
-    cls.add_method('Deaggregate', 
-                   'ns3::MsduAggregator::DeaggregatedMsdus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): uint16_t ns3::MsduAggregator::GetMaxAmsduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
-    cls.add_method('GetMaxAmsduSize', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
-                   is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::MsduAggregator::GetNextAmsdu(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiTxVector txVector, uint32_t ampduSize=0, ns3::Time ppduDurationLimit=ns3::Time::Min()) const [member function]
-    cls.add_method('GetNextAmsdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize', default_value='0'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')], 
-                   is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): static uint16_t ns3::MsduAggregator::GetSizeIfAggregated(uint16_t msduSize, uint16_t amsduSize) [member function]
-    cls.add_method('GetSizeIfAggregated', 
-                   'uint16_t', 
-                   [param('uint16_t', 'msduSize'), param('uint16_t', 'amsduSize')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MsduAggregator::GetTypeId() [member function]
+    ## rr-multi-user-scheduler.h (module 'wifi'): static ns3::TypeId ns3::RrMultiUserScheduler::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::SetEdcaQueues(ns3::MsduAggregator::EdcaQueues map) [member function]
-    cls.add_method('SetEdcaQueues', 
+    ## rr-multi-user-scheduler.h (module 'wifi'): void ns3::RrMultiUserScheduler::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'map')])
-    return
-
-def register_Ns3NakagamiPropagationLossModel_methods(root_module, cls):
-    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::NakagamiPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## propagation-loss-model.h (module 'propagation'): ns3::NakagamiPropagationLossModel::NakagamiPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## propagation-loss-model.h (module 'propagation'): double ns3::NakagamiPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::NakagamiPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3NetDevice_methods(root_module, cls):
-    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
-    cls.add_constructor([])
-    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [constructor]
-    cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
-    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('AddLinkChangeCallback', 
+                   is_virtual=True, visibility='protected')
+    ## rr-multi-user-scheduler.h (module 'wifi'): void ns3::RrMultiUserScheduler::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Address', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetBroadcast() const [member function]
-    cls.add_method('GetBroadcast', 
-                   'ns3::Address', 
+                   is_virtual=True, visibility='protected')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo ns3::RrMultiUserScheduler::ComputeDlMuInfo() [member function]
+    cls.add_method('ComputeDlMuInfo', 
+                   'ns3::MultiUserScheduler::DlMuInfo', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): ns3::Ptr<ns3::Channel> ns3::NetDevice::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::Channel >', 
+                   is_virtual=True, visibility='private')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo ns3::RrMultiUserScheduler::ComputeUlMuInfo() [member function]
+    cls.add_method('ComputeUlMuInfo', 
+                   'ns3::MultiUserScheduler::UlMuInfo', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): uint32_t ns3::NetDevice::GetIfIndex() const [member function]
-    cls.add_method('GetIfIndex', 
-                   'uint32_t', 
+                   is_virtual=True, visibility='private')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::RrMultiUserScheduler::SelectTxFormat() [member function]
+    cls.add_method('SelectTxFormat', 
+                   'ns3::MultiUserScheduler::TxFormat', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): uint16_t ns3::NetDevice::GetMtu() const [member function]
-    cls.add_method('GetMtu', 
-                   'uint16_t', 
+                   is_virtual=True, visibility='private')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::RrMultiUserScheduler::TrySendingBasicTf() [member function]
+    cls.add_method('TrySendingBasicTf', 
+                   'ns3::MultiUserScheduler::TxFormat', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
-    cls.add_method('GetMulticast', 
-                   'ns3::Address', 
-                   [param('ns3::Ipv4Address', 'multicastGroup')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
-    cls.add_method('GetMulticast', 
-                   'ns3::Address', 
-                   [param('ns3::Ipv6Address', 'addr')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NetDevice::GetNode() const [member function]
-    cls.add_method('GetNode', 
-                   'ns3::Ptr< ns3::Node >', 
+                   is_virtual=True, visibility='private')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::RrMultiUserScheduler::TrySendingBsrpTf() [member function]
+    cls.add_method('TrySendingBsrpTf', 
+                   'ns3::MultiUserScheduler::TxFormat', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): static ns3::TypeId ns3::NetDevice::GetTypeId() [member function]
+                   is_virtual=True, visibility='private')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::RrMultiUserScheduler::TrySendingDlMuPpdu() [member function]
+    cls.add_method('TrySendingDlMuPpdu', 
+                   'ns3::MultiUserScheduler::TxFormat', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3RraaWifiManager_methods(root_module, cls):
+    ## rraa-wifi-manager.h (module 'wifi'): ns3::RraaWifiManager::RraaWifiManager(ns3::RraaWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RraaWifiManager const &', 'arg0')])
+    ## rraa-wifi-manager.h (module 'wifi'): ns3::RraaWifiManager::RraaWifiManager() [constructor]
+    cls.add_constructor([])
+    ## rraa-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::RraaWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBridge() const [member function]
-    cls.add_method('IsBridge', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBroadcast() const [member function]
-    cls.add_method('IsBroadcast', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::IsLinkUp() const [member function]
-    cls.add_method('IsLinkUp', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::IsMulticast() const [member function]
-    cls.add_method('IsMulticast', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::IsPointToPoint() const [member function]
-    cls.add_method('IsPointToPoint', 
-                   'bool', 
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetupMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## rraa-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::RraaWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::NeedsArp() const [member function]
-    cls.add_method('NeedsArp', 
-                   'bool', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RraaWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RraaWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
-    cls.add_method('Send', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
-    cls.add_method('SendFrom', 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): bool ns3::RraaWifiManager::DoNeedRts(ns3::WifiRemoteStation * st, uint32_t size, bool normally) [member function]
+    cls.add_method('DoNeedRts', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): void ns3::NetDevice::SetAddress(ns3::Address address) [member function]
-    cls.add_method('SetAddress', 
+                   [param('ns3::WifiRemoteStation *', 'st'), param('uint32_t', 'size'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [param('ns3::Address', 'address')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): void ns3::NetDevice::SetIfIndex(uint32_t const index) [member function]
-    cls.add_method('SetIfIndex', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('uint32_t const', 'index')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::SetMtu(uint16_t const mtu) [member function]
-    cls.add_method('SetMtu', 
-                   'bool', 
-                   [param('uint16_t const', 'mtu')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): void ns3::NetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('SetNode', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): void ns3::NetDevice::SetPromiscReceiveCallback(ns3::NetDevice::PromiscReceiveCallback cb) [member function]
-    cls.add_method('SetPromiscReceiveCallback', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): void ns3::NetDevice::SetReceiveCallback(ns3::NetDevice::ReceiveCallback cb) [member function]
-    cls.add_method('SetReceiveCallback', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
                    'void', 
-                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3NeverLosChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::NeverLosChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::NeverLosChannelConditionModel::NeverLosChannelConditionModel() [constructor]
+def register_Ns3RrpaaWifiManager_methods(root_module, cls):
+    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::RrpaaWifiManager::RrpaaWifiManager(ns3::RrpaaWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RrpaaWifiManager const &', 'arg0')])
+    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::RrpaaWifiManager::RrpaaWifiManager() [constructor]
     cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::NeverLosChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetChannelCondition', 
-                   'ns3::Ptr< ns3::ChannelCondition >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True)
-    ## channel-condition-model.h (module 'propagation'): int64_t ns3::NeverLosChannelConditionModel::AssignStreams(int64_t stream) [member function]
+    ## rrpaa-wifi-manager.h (module 'wifi'): int64_t ns3::RrpaaWifiManager::AssignStreams(int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_virtual=True)
-    return
-
-def register_Ns3NeverLosVehicleChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::NeverLosVehicleChannelConditionModel::GetTypeId() [member function]
+    ## rrpaa-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::RrpaaWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::NeverLosVehicleChannelConditionModel::NeverLosVehicleChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::NeverLosVehicleChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetChannelCondition', 
-                   'ns3::Ptr< ns3::ChannelCondition >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True)
-    ## channel-condition-model.h (module 'propagation'): int64_t ns3::NeverLosVehicleChannelConditionModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetupMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
                    is_virtual=True)
+    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::RrpaaWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RrpaaWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RrpaaWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): bool ns3::RrpaaWifiManager::DoNeedRts(ns3::WifiRemoteStation * st, uint32_t size, bool normally) [member function]
+    cls.add_method('DoNeedRts', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'st'), param('uint32_t', 'size'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3NistErrorRateModel_methods(root_module, cls):
-    ## nist-error-rate-model.h (module 'wifi'): ns3::NistErrorRateModel::NistErrorRateModel(ns3::NistErrorRateModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::NistErrorRateModel const &', 'arg0')])
-    ## nist-error-rate-model.h (module 'wifi'): ns3::NistErrorRateModel::NistErrorRateModel() [constructor]
+def register_Ns3SimpleFrameCaptureModel_methods(root_module, cls):
+    ## simple-frame-capture-model.h (module 'wifi'): ns3::SimpleFrameCaptureModel::SimpleFrameCaptureModel(ns3::SimpleFrameCaptureModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SimpleFrameCaptureModel const &', 'arg0')])
+    ## simple-frame-capture-model.h (module 'wifi'): ns3::SimpleFrameCaptureModel::SimpleFrameCaptureModel() [constructor]
     cls.add_constructor([])
-    ## nist-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::NistErrorRateModel::GetTypeId() [member function]
+    ## simple-frame-capture-model.h (module 'wifi'): bool ns3::SimpleFrameCaptureModel::CaptureNewFrame(ns3::Ptr<ns3::Event> currentEvent, ns3::Ptr<ns3::Event> newEvent) const [member function]
+    cls.add_method('CaptureNewFrame', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Event >', 'currentEvent'), param('ns3::Ptr< ns3::Event >', 'newEvent')], 
+                   is_const=True, is_virtual=True)
+    ## simple-frame-capture-model.h (module 'wifi'): double ns3::SimpleFrameCaptureModel::GetMargin() const [member function]
+    cls.add_method('GetMargin', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## simple-frame-capture-model.h (module 'wifi'): static ns3::TypeId ns3::SimpleFrameCaptureModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## nist-error-rate-model.h (module 'wifi'): double ns3::NistErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint64_t nbits) const [member function]
-    cls.add_method('DoGetChunkSuccessRate', 
-                   'double', 
-                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## simple-frame-capture-model.h (module 'wifi'): void ns3::SimpleFrameCaptureModel::SetMargin(double margin) [member function]
+    cls.add_method('SetMargin', 
+                   'void', 
+                   [param('double', 'margin')])
     return
 
-def register_Ns3NixVector_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
+def register_Ns3SpectrumChannel_methods(root_module, cls):
+    ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel(ns3::SpectrumChannel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SpectrumChannel const &', 'arg0')])
+    ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
     cls.add_constructor([])
-    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector(ns3::NixVector const & o) [constructor]
-    cls.add_constructor([param('ns3::NixVector const &', 'o')])
-    ## nix-vector.h (module 'network'): void ns3::NixVector::AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits) [member function]
-    cls.add_method('AddNeighborIndex', 
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
+    cls.add_method('AddPropagationLossModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PropagationLossModel >', 'loss')])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('AddRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddSpectrumPropagationLossModel(ns3::Ptr<ns3::SpectrumPropagationLossModel> loss) [member function]
+    cls.add_method('AddSpectrumPropagationLossModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPropagationLossModel >', 'loss')])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('uint32_t', 'newBits'), param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::BitCount(uint32_t numberOfNeighbors) const [member function]
-    cls.add_method('BitCount', 
-                   'uint32_t', 
-                   [param('uint32_t', 'numberOfNeighbors')], 
-                   is_const=True)
-    ## nix-vector.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::NixVector::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::NixVector >', 
                    [], 
-                   is_const=True)
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::ExtractNeighborIndex(uint32_t numberOfBits) [member function]
-    cls.add_method('ExtractNeighborIndex', 
-                   'uint32_t', 
-                   [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
-    cls.add_method('GetRemainingBits', 
-                   'uint32_t', 
+                   is_virtual=True)
+    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PropagationLossModel> ns3::SpectrumChannel::GetPropagationLossModel() [member function]
+    cls.add_method('GetPropagationLossModel', 
+                   'ns3::Ptr< ns3::PropagationLossModel >', 
                    [])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
+    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumPropagationLossModel> ns3::SpectrumChannel::GetSpectrumPropagationLossModel() [member function]
+    cls.add_method('GetSpectrumPropagationLossModel', 
+                   'ns3::Ptr< ns3::SpectrumPropagationLossModel >', 
+                   [])
+    ## spectrum-channel.h (module 'spectrum'): static ns3::TypeId ns3::SpectrumChannel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   'uint32_t', 
-                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
-                   is_const=True)
+                   is_static=True)
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
+    cls.add_method('SetPropagationDelayModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PropagationDelayModel >', 'delay')])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::StartTx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params')], 
+                   is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3Node_methods(root_module, cls):
-    ## node.h (module 'network'): ns3::Node::Node(ns3::Node const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Node const &', 'arg0')])
-    ## node.h (module 'network'): ns3::Node::Node() [constructor]
+def register_Ns3SpectrumWifiPhy_methods(root_module, cls):
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::SpectrumWifiPhy::SpectrumWifiPhy(ns3::SpectrumWifiPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SpectrumWifiPhy const &', 'arg0')])
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::SpectrumWifiPhy::SpectrumWifiPhy() [constructor]
     cls.add_constructor([])
-    ## node.h (module 'network'): ns3::Node::Node(uint32_t systemId) [constructor]
-    cls.add_constructor([param('uint32_t', 'systemId')])
-    ## node.h (module 'network'): uint32_t ns3::Node::AddApplication(ns3::Ptr<ns3::Application> application) [member function]
-    cls.add_method('AddApplication', 
-                   'uint32_t', 
-                   [param('ns3::Ptr< ns3::Application >', 'application')])
-    ## node.h (module 'network'): uint32_t ns3::Node::AddDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
-    cls.add_method('AddDevice', 
-                   'uint32_t', 
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('ConfigureStandardAndBand', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::CreateWifiSpectrumPhyInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('CreateWifiSpectrumPhyInterface', 
+                   'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'device')])
-    ## node.h (module 'network'): static bool ns3::Node::ChecksumEnabled() [member function]
-    cls.add_method('ChecksumEnabled', 
-                   'bool', 
-                   [], 
-                   is_static=True)
-    ## node.h (module 'network'): ns3::Ptr<ns3::Application> ns3::Node::GetApplication(uint32_t index) const [member function]
-    cls.add_method('GetApplication', 
-                   'ns3::Ptr< ns3::Application >', 
-                   [param('uint32_t', 'index')], 
-                   is_const=True)
-    ## node.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Node::GetDevice(uint32_t index) const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [param('uint32_t', 'index')], 
-                   is_const=True)
-    ## node.h (module 'network'): uint32_t ns3::Node::GetId() const [member function]
-    cls.add_method('GetId', 
+    ## spectrum-wifi-phy.h (module 'wifi'): uint32_t ns3::SpectrumWifiPhy::GetBandBandwidth() const [member function]
+    cls.add_method('GetBandBandwidth', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## node.h (module 'network'): ns3::Time ns3::Node::GetLocalTime() const [member function]
-    cls.add_method('GetLocalTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## node.h (module 'network'): uint32_t ns3::Node::GetNApplications() const [member function]
-    cls.add_method('GetNApplications', 
-                   'uint32_t', 
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::SpectrumWifiPhy::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
                    [], 
-                   is_const=True)
-    ## node.h (module 'network'): uint32_t ns3::Node::GetNDevices() const [member function]
-    cls.add_method('GetNDevices', 
-                   'uint32_t', 
+                   is_const=True, is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): uint16_t ns3::SpectrumWifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumWifiPhy::GetRxAntenna() const [member function]
+    cls.add_method('GetRxAntenna', 
+                   'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
                    is_const=True)
-    ## node.h (module 'network'): uint32_t ns3::Node::GetSystemId() const [member function]
-    cls.add_method('GetSystemId', 
-                   'uint32_t', 
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<const ns3::SpectrumModel> ns3::SpectrumWifiPhy::GetRxSpectrumModel() [member function]
+    cls.add_method('GetRxSpectrumModel', 
+                   'ns3::Ptr< ns3::SpectrumModel const >', 
+                   [])
+    ## spectrum-wifi-phy.h (module 'wifi'): std::tuple<double, double, double> ns3::SpectrumWifiPhy::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
                    [], 
-                   is_const=True)
-    ## node.h (module 'network'): static ns3::TypeId ns3::Node::GetTypeId() [member function]
+                   is_const=True, is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::SpectrumWifiPhy::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## node.h (module 'network'): void ns3::Node::RegisterDeviceAdditionListener(ns3::Node::DeviceAdditionListener listener) [member function]
-    cls.add_method('RegisterDeviceAdditionListener', 
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetAntenna(ns3::Ptr<ns3::AntennaModel> const antenna) [member function]
+    cls.add_method('SetAntenna', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
-    ## node.h (module 'network'): void ns3::Node::RegisterProtocolHandler(ns3::Node::ProtocolHandler handler, uint16_t protocolType, ns3::Ptr<ns3::NetDevice> device, bool promiscuous=false) [member function]
-    cls.add_method('RegisterProtocolHandler', 
+                   [param('ns3::Ptr< ns3::AntennaModel > const', 'antenna')])
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> const channel) [member function]
+    cls.add_method('SetChannel', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler'), param('uint16_t', 'protocolType'), param('ns3::Ptr< ns3::NetDevice >', 'device'), param('bool', 'promiscuous', default_value='false')])
-    ## node.h (module 'network'): void ns3::Node::UnregisterDeviceAdditionListener(ns3::Node::DeviceAdditionListener listener) [member function]
-    cls.add_method('UnregisterDeviceAdditionListener', 
+                   [param('ns3::Ptr< ns3::SpectrumChannel > const', 'channel')])
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannelNumber(uint8_t id) [member function]
+    cls.add_method('SetChannelNumber', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
-    ## node.h (module 'network'): void ns3::Node::UnregisterProtocolHandler(ns3::Node::ProtocolHandler handler) [member function]
-    cls.add_method('UnregisterProtocolHandler', 
+                   [param('uint8_t', 'id')], 
+                   is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannelWidth(uint16_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler')])
-    ## node.h (module 'network'): void ns3::Node::DoDispose() [member function]
+                   [param('uint16_t', 'channelwidth')], 
+                   is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetFrequency(uint16_t freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('uint16_t', 'freq')], 
+                   is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> rxParams) [member function]
+    cls.add_method('StartRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'rxParams')])
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::Transmit(ns3::Ptr<ns3::WifiSpectrumSignalParameters> txParams) [member function]
+    cls.add_method('Transmit', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiSpectrumSignalParameters >', 'txParams')])
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## node.h (module 'network'): void ns3::Node::DoInitialize() [member function]
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::SpectrumWifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
+    cls.add_method('GetBand', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_virtual=True, visibility='protected')
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::SpectrumWifiPhy::ConvertHeRuSubcarriers(uint16_t bandWidth, uint16_t guardBandwidth, ns3::HeRu::SubcarrierRange range, uint8_t bandIndex=0) const [member function]
+    cls.add_method('ConvertHeRuSubcarriers', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< short, short >', 'range'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3NormalRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::INFINITE_VALUE [variable]
-    cls.add_static_attribute('INFINITE_VALUE', 'double const', is_const=True)
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::NormalRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::NormalRandomVariable() [constructor]
+def register_Ns3Ssid_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(ns3::Ssid const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ssid const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetMean() const [member function]
-    cls.add_method('GetMean', 
-                   'double', 
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(std::string s) [constructor]
+    cls.add_constructor([param('std::string', 's')])
+    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## ssid.h (module 'wifi'): ns3::WifiInformationElementId ns3::Ssid::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetVariance() const [member function]
-    cls.add_method('GetVariance', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetBound() const [member function]
-    cls.add_method('GetBound', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue(double mean, double variance, double bound=ns3::NormalRandomVariable::INFINITE_VALUE) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'mean'), param('double', 'variance'), param('double', 'bound', default_value='ns3::NormalRandomVariable::INFINITE_VALUE')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger(uint32_t mean, uint32_t variance, uint32_t bound) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'mean'), param('uint32_t', 'variance'), param('uint32_t', 'bound')])
-    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsEqual(ns3::Ssid const & o) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ssid const &', 'o')], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): char * ns3::Ssid::PeekString() const [member function]
+    cls.add_method('PeekString', 
+                   'char *', 
                    [], 
-                   is_virtual=True)
+                   is_const=True)
+    ## ssid.h (module 'wifi'): void ns3::Ssid::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
     return
 
-def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
+def register_Ns3SsidChecker_methods(root_module, cls):
+    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker() [constructor]
     cls.add_constructor([])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker(ns3::ObjectFactoryChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ObjectFactoryChecker const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker(ns3::SsidChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SsidChecker const &', 'arg0')])
     return
 
-def register_Ns3ObjectFactoryValue_methods(root_module, cls):
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue() [constructor]
+def register_Ns3SsidValue_methods(root_module, cls):
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue() [constructor]
     cls.add_constructor([])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactory const & value) [constructor]
-    cls.add_constructor([param('ns3::ObjectFactory const &', 'value')])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactoryValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ObjectFactoryValue const &', 'arg0')])
-    ## object-factory.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::ObjectFactoryValue::Copy() const [member function]
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::Ssid const & value) [constructor]
+    cls.add_constructor([param('ns3::Ssid const &', 'value')])
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::SsidValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SsidValue const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::SsidValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## object-factory.h (module 'core'): bool ns3::ObjectFactoryValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    ## ssid.h (module 'wifi'): bool ns3::SsidValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## object-factory.h (module 'core'): ns3::ObjectFactory ns3::ObjectFactoryValue::Get() const [member function]
+    ## ssid.h (module 'wifi'): ns3::Ssid ns3::SsidValue::Get() const [member function]
     cls.add_method('Get', 
-                   'ns3::ObjectFactory', 
+                   'ns3::Ssid', 
                    [], 
                    is_const=True)
-    ## object-factory.h (module 'core'): std::string ns3::ObjectFactoryValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    ## ssid.h (module 'wifi'): std::string ns3::SsidValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## object-factory.h (module 'core'): void ns3::ObjectFactoryValue::Set(ns3::ObjectFactory const & value) [member function]
+    ## ssid.h (module 'wifi'): void ns3::SsidValue::Set(ns3::Ssid const & value) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('ns3::ObjectFactory const &', 'value')])
+                   [param('ns3::Ssid const &', 'value')])
     return
 
-def register_Ns3OkumuraHataPropagationLossModel_methods(root_module, cls):
-    ## okumura-hata-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::OkumuraHataPropagationLossModel::GetTypeId() [member function]
+def register_Ns3StaWifiMac_methods(root_module, cls):
+    ## sta-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::StaWifiMac::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## okumura-hata-propagation-loss-model.h (module 'propagation'): ns3::OkumuraHataPropagationLossModel::OkumuraHataPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## okumura-hata-propagation-loss-model.h (module 'propagation'): double ns3::OkumuraHataPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetLoss', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True)
-    ## okumura-hata-propagation-loss-model.h (module 'propagation'): double ns3::OkumuraHataPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## okumura-hata-propagation-loss-model.h (module 'propagation'): int64_t ns3::OkumuraHataPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3OnoeWifiManager_methods(root_module, cls):
-    ## onoe-wifi-manager.h (module 'wifi'): ns3::OnoeWifiManager::OnoeWifiManager(ns3::OnoeWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::OnoeWifiManager const &', 'arg0')])
-    ## onoe-wifi-manager.h (module 'wifi'): ns3::OnoeWifiManager::OnoeWifiManager() [constructor]
+    ## sta-wifi-mac.h (module 'wifi'): ns3::StaWifiMac::StaWifiMac() [constructor]
     cls.add_constructor([])
-    ## onoe-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::OnoeWifiManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_virtual=True)
+    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## sta-wifi-mac.h (module 'wifi'): bool ns3::StaWifiMac::IsAssociated() const [member function]
+    cls.add_method('IsAssociated', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## onoe-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::OnoeWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+                   is_const=True)
+    ## sta-wifi-mac.h (module 'wifi'): uint16_t ns3::StaWifiMac::GetAssociationId() const [member function]
+    cls.add_method('GetAssociationId', 
+                   'uint16_t', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::OnoeWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::OnoeWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_const=True)
+    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoInitialize() [member function]
+    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3OutputStreamWrapper_methods(root_module, cls):
-    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(ns3::OutputStreamWrapper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::OutputStreamWrapper const &', 'arg0')])
-    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(std::string filename, std::ios_base::openmode filemode) [constructor]
-    cls.add_constructor([param('std::string', 'filename'), param('std::ios_base::openmode', 'filemode')])
-    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(std::ostream * os) [constructor]
-    cls.add_constructor([param('std::ostream *', 'os')])
-    ## output-stream-wrapper.h (module 'network'): std::ostream * ns3::OutputStreamWrapper::GetStream() [member function]
-    cls.add_method('GetStream', 
-                   'std::ostream *', 
-                   [])
     return
 
-def register_Ns3Packet_methods(root_module, cls):
+def register_Ns3SupportedRates_methods(root_module, cls):
     cls.add_output_stream_operator()
-    ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates() [constructor]
     cls.add_constructor([])
-    ## packet.h (module 'network'): ns3::Packet::Packet(ns3::Packet const & o) [constructor]
-    cls.add_constructor([param('ns3::Packet const &', 'o')])
-    ## packet.h (module 'network'): ns3::Packet::Packet(uint32_t size) [constructor]
-    cls.add_constructor([param('uint32_t', 'size')])
-    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size, bool magic) [constructor]
-    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size'), param('bool', 'magic')])
-    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size) [constructor]
-    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## packet.h (module 'network'): void ns3::Packet::AddAtEnd(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('AddAtEnd', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag) const [member function]
-    cls.add_method('AddByteTag', 
-                   'void', 
-                   [param('ns3::Tag const &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag, uint32_t start, uint32_t end) const [member function]
-    cls.add_method('AddByteTag', 
-                   'void', 
-                   [param('ns3::Tag const &', 'tag'), param('uint32_t', 'start'), param('uint32_t', 'end')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::AddHeader(ns3::Header const & header) [member function]
-    cls.add_method('AddHeader', 
-                   'void', 
-                   [param('ns3::Header const &', 'header')])
-    ## packet.h (module 'network'): void ns3::Packet::AddPacketTag(ns3::Tag const & tag) const [member function]
-    cls.add_method('AddPacketTag', 
-                   'void', 
-                   [param('ns3::Tag const &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::AddPaddingAtEnd(uint32_t size) [member function]
-    cls.add_method('AddPaddingAtEnd', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## packet.h (module 'network'): void ns3::Packet::AddTrailer(ns3::Trailer const & trailer) [member function]
-    cls.add_method('AddTrailer', 
-                   'void', 
-                   [param('ns3::Trailer const &', 'trailer')])
-    ## packet.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::Packet::BeginItem() const [member function]
-    cls.add_method('BeginItem', 
-                   'ns3::PacketMetadata::ItemIterator', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::CopyData(uint8_t * buffer, uint32_t size) const [member function]
-    cls.add_method('CopyData', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::CopyData(std::ostream * os, uint32_t size) const [member function]
-    cls.add_method('CopyData', 
-                   'void', 
-                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::CreateFragment(uint32_t start, uint32_t length) const [member function]
-    cls.add_method('CreateFragment', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
-                   is_const=True)
-    ## packet.h (module 'network'): static void ns3::Packet::EnableChecking() [member function]
-    cls.add_method('EnableChecking', 
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates(ns3::SupportedRates const & rates) [constructor]
+    cls.add_constructor([param('ns3::SupportedRates const &', 'rates')])
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::AddBssMembershipSelectorRate(uint64_t bs) [member function]
+    cls.add_method('AddBssMembershipSelectorRate', 
                    'void', 
-                   [], 
-                   is_static=True)
-    ## packet.h (module 'network'): static void ns3::Packet::EnablePrinting() [member function]
-    cls.add_method('EnablePrinting', 
+                   [param('uint64_t', 'bs')])
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::AddSupportedRate(uint64_t bs) [member function]
+    cls.add_method('AddSupportedRate', 
                    'void', 
+                   [param('uint64_t', 'bs')])
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## supported-rates.h (module 'wifi'): ns3::WifiInformationElementId ns3::SupportedRates::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_static=True)
-    ## packet.h (module 'network'): bool ns3::Packet::FindFirstMatchingByteTag(ns3::Tag & tag) const [member function]
-    cls.add_method('FindFirstMatchingByteTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::ByteTagIterator ns3::Packet::GetByteTagIterator() const [member function]
-    cls.add_method('GetByteTagIterator', 
-                   'ns3::ByteTagIterator', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::Packet::GetNixVector() const [member function]
-    cls.add_method('GetNixVector', 
-                   'ns3::Ptr< ns3::NixVector >', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::PacketTagIterator ns3::Packet::GetPacketTagIterator() const [member function]
-    cls.add_method('GetPacketTagIterator', 
-                   'ns3::PacketTagIterator', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint64_t ns3::Packet::GetUid() const [member function]
-    cls.add_method('GetUid', 
-                   'uint64_t', 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::GetNRates() const [member function]
+    cls.add_method('GetNRates', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
-    cls.add_method('PeekHeader', 
+    ## supported-rates.h (module 'wifi'): uint32_t ns3::SupportedRates::GetRate(uint8_t i) const [member function]
+    cls.add_method('GetRate', 
                    'uint32_t', 
-                   [param('ns3::Header &', 'header')], 
+                   [param('uint8_t', 'i')], 
                    is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header, uint32_t size) const [member function]
-    cls.add_method('PeekHeader', 
-                   'uint32_t', 
-                   [param('ns3::Header &', 'header'), param('uint32_t', 'size')], 
+    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsBasicRate(uint64_t bs) const [member function]
+    cls.add_method('IsBasicRate', 
+                   'bool', 
+                   [param('uint64_t', 'bs')], 
                    is_const=True)
-    ## packet.h (module 'network'): bool ns3::Packet::PeekPacketTag(ns3::Tag & tag) const [member function]
-    cls.add_method('PeekPacketTag', 
+    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsBssMembershipSelectorRate(uint64_t bs) const [member function]
+    cls.add_method('IsBssMembershipSelectorRate', 
                    'bool', 
-                   [param('ns3::Tag &', 'tag')], 
+                   [param('uint64_t', 'bs')], 
                    is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekTrailer(ns3::Trailer & trailer) [member function]
-    cls.add_method('PeekTrailer', 
-                   'uint32_t', 
-                   [param('ns3::Trailer &', 'trailer')])
-    ## packet.h (module 'network'): void ns3::Packet::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
+    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsSupportedRate(uint64_t bs) const [member function]
+    cls.add_method('IsSupportedRate', 
+                   'bool', 
+                   [param('uint64_t', 'bs')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::PrintByteTags(std::ostream & os) const [member function]
-    cls.add_method('PrintByteTags', 
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
                    'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::PrintPacketTags(std::ostream & os) const [member function]
-    cls.add_method('PrintPacketTags', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::SetBasicRate(uint64_t bs) [member function]
+    cls.add_method('SetBasicRate', 
                    'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAllByteTags() [member function]
-    cls.add_method('RemoveAllByteTags', 
+                   [param('uint64_t', 'bs')])
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::MAX_SUPPORTED_RATES [variable]
+    cls.add_static_attribute('MAX_SUPPORTED_RATES', 'uint8_t const', is_const=True)
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::extended [variable]
+    cls.add_instance_attribute('extended', 'ns3::ExtendedSupportedRatesIE', is_const=False)
+    return
+
+def register_Ns3TableBasedErrorRateModel_methods(root_module, cls):
+    ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel::TableBasedErrorRateModel(ns3::TableBasedErrorRateModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::TableBasedErrorRateModel const &', 'arg0')])
+    ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel::TableBasedErrorRateModel() [constructor]
+    cls.add_constructor([])
+    ## table-based-error-rate-model.h (module 'wifi'): static uint8_t ns3::TableBasedErrorRateModel::GetMcsForMode(ns3::WifiMode mode) [member function]
+    cls.add_method('GetMcsForMode', 
+                   'uint8_t', 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_static=True)
+    ## table-based-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::TableBasedErrorRateModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## table-based-error-rate-model.h (module 'wifi'): double ns3::TableBasedErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector const & txVector, double snr, uint64_t nbits, uint8_t numRxAntennas, ns3::WifiPpduField field, uint16_t staId) const [member function]
+    cls.add_method('DoGetChunkSuccessRate', 
+                   'double', 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits'), param('uint8_t', 'numRxAntennas'), param('ns3::WifiPpduField', 'field'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThompsonSamplingWifiManager_methods(root_module, cls):
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): ns3::ThompsonSamplingWifiManager::ThompsonSamplingWifiManager(ns3::ThompsonSamplingWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ThompsonSamplingWifiManager const &', 'arg0')])
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): ns3::ThompsonSamplingWifiManager::ThompsonSamplingWifiManager() [constructor]
+    cls.add_constructor([])
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): int64_t ns3::ThompsonSamplingWifiManager::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ThompsonSamplingWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ThompsonSamplingWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ThompsonSamplingWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ThompsonSamplingWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportAmpduTxStatus', 
                    'void', 
-                   [])
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAllPacketTags() [member function]
-    cls.add_method('RemoveAllPacketTags', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [])
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAtEnd(uint32_t size) [member function]
-    cls.add_method('RemoveAtEnd', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('uint32_t', 'size')])
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAtStart(uint32_t size) [member function]
-    cls.add_method('RemoveAtStart', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [param('uint32_t', 'size')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header) [member function]
-    cls.add_method('RemoveHeader', 
-                   'uint32_t', 
-                   [param('ns3::Header &', 'header')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header, uint32_t size) [member function]
-    cls.add_method('RemoveHeader', 
-                   'uint32_t', 
-                   [param('ns3::Header &', 'header'), param('uint32_t', 'size')])
-    ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
-    cls.add_method('RemovePacketTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
-    cls.add_method('RemoveTrailer', 
-                   'uint32_t', 
-                   [param('ns3::Trailer &', 'trailer')])
-    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
-    cls.add_method('ReplacePacketTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
-    cls.add_method('SetNixVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
-    ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
-    cls.add_method('ToString', 
-                   'std::string', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppChannelConditionModel::ThreeGppChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): int64_t ns3::ThreeGppChannelConditionModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::ThreeGppChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetChannelCondition', 
+                   'ns3::Ptr< ns3::ChannelCondition >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True)
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): static double ns3::ThreeGppChannelConditionModel::Calculate2dDistance(ns3::Vector const & a, ns3::Vector const & b) [member function]
+    cls.add_method('Calculate2dDistance', 
+                   'double', 
+                   [param('ns3::Vector const &', 'a'), param('ns3::Vector const &', 'b')], 
+                   is_static=True, visibility='protected')
+    ## channel-condition-model.h (module 'propagation'): void ns3::ThreeGppChannelConditionModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppChannelConditionModel::ComputePnlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePnlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppIndoorMixedOfficeChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppIndoorMixedOfficeChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppIndoorMixedOfficeChannelConditionModel::ThreeGppIndoorMixedOfficeChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppIndoorMixedOfficeChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppIndoorOfficePropagationLossModel_methods(root_module, cls):
+    ## three-gpp-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppIndoorOfficePropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## three-gpp-propagation-loss-model.h (module 'propagation'): ns3::ThreeGppIndoorOfficePropagationLossModel::ThreeGppIndoorOfficePropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetLossLos(double distance2D, double distance3D, double hUt, double hBs) const [member function]
+    cls.add_method('GetLossLos', 
+                   'double', 
+                   [param('double', 'distance2D'), param('double', 'distance3D'), param('double', 'hUt'), param('double', 'hBs')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetLossNlos(double distance2D, double distance3D, double hUt, double hBs) const [member function]
+    cls.add_method('GetLossNlos', 
+                   'double', 
+                   [param('double', 'distance2D'), param('double', 'distance3D'), param('double', 'hUt'), param('double', 'hBs')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetShadowingStd(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b, ns3::ChannelCondition::LosConditionValue cond) const [member function]
+    cls.add_method('GetShadowingStd', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b'), param('ns3::ChannelCondition::LosConditionValue', 'cond')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetShadowingCorrelationDistance(ns3::ChannelCondition::LosConditionValue cond) const [member function]
+    cls.add_method('GetShadowingCorrelationDistance', 
+                   'double', 
+                   [param('ns3::ChannelCondition::LosConditionValue', 'cond')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppIndoorOpenOfficeChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppIndoorOpenOfficeChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppIndoorOpenOfficeChannelConditionModel::ThreeGppIndoorOpenOfficeChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppIndoorOpenOfficeChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3ParetoRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ParetoRandomVariable::GetTypeId() [member function]
+def register_Ns3ThreeGppRmaChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppRmaChannelConditionModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable::ParetoRandomVariable() [constructor]
+    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppRmaChannelConditionModel::ThreeGppRmaChannelConditionModel() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetScale() const [member function]
-    cls.add_method('GetScale', 
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppRmaChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
                    'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppUmaChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppUmaChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetShape() const [member function]
-    cls.add_method('GetShape', 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppUmaChannelConditionModel::ThreeGppUmaChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppUmaChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
                    'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppUmiStreetCanyonChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppUmiStreetCanyonChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetBound() const [member function]
-    cls.add_method('GetBound', 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppUmiStreetCanyonChannelConditionModel::ThreeGppUmiStreetCanyonChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppUmiStreetCanyonChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
                    'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppV2vHighwayPropagationLossModel_methods(root_module, cls):
+    ## three-gpp-v2v-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppV2vHighwayPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue(double scale, double shape, double bound) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
+                   is_static=True)
+    ## three-gpp-v2v-propagation-loss-model.h (module 'propagation'): ns3::ThreeGppV2vHighwayPropagationLossModel::ThreeGppV2vHighwayPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## three-gpp-v2v-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppV2vHighwayPropagationLossModel::GetLossLos(double distance2D, double distance3D, double hUt, double hBs) const [member function]
+    cls.add_method('GetLossLos', 
                    'double', 
+                   [param('double', 'distance2D'), param('double', 'distance3D'), param('double', 'hUt'), param('double', 'hBs')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3TimeValue_methods(root_module, cls):
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::Time const & value) [constructor]
+    cls.add_constructor([param('ns3::Time const &', 'value')])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::TimeValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::TimeValue const &', 'arg0')])
+    ## nstime.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TimeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): bool ns3::TimeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+    ## nstime.h (module 'core'): ns3::Time ns3::TimeValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Time', 
                    [], 
-                   is_virtual=True)
+                   is_const=True)
+    ## nstime.h (module 'core'): std::string ns3::TimeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): void ns3::TimeValue::Set(ns3::Time const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Time const &', 'value')])
     return
 
-def register_Ns3ParfWifiManager_methods(root_module, cls):
-    ## parf-wifi-manager.h (module 'wifi'): ns3::ParfWifiManager::ParfWifiManager(ns3::ParfWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ParfWifiManager const &', 'arg0')])
-    ## parf-wifi-manager.h (module 'wifi'): ns3::ParfWifiManager::ParfWifiManager() [constructor]
+def register_Ns3TypeIdChecker_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
     cls.add_constructor([])
-    ## parf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ParfWifiManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker(ns3::TypeIdChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::TypeIdChecker const &', 'arg0')])
+    return
+
+def register_Ns3TypeIdValue_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeId const & value) [constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'value')])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeIdValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::TypeIdValue const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TypeIdValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_static=True)
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): bool ns3::TypeIdValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## parf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ParfWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeIdValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ParfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ParfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeIdValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): void ns3::TypeIdValue::Set(ns3::TypeId const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
+                   [param('ns3::TypeId const &', 'value')])
+    return
+
+def register_Ns3UintegerValue_methods(root_module, cls):
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue() [constructor]
+    cls.add_constructor([])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(uint64_t const & value) [constructor]
+    cls.add_constructor([param('uint64_t const &', 'value')])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(ns3::UintegerValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::UintegerValue const &', 'arg0')])
+    ## uinteger.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::UintegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): bool ns3::UintegerValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## uinteger.h (module 'core'): uint64_t ns3::UintegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## uinteger.h (module 'core'): std::string ns3::UintegerValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): void ns3::UintegerValue::Set(uint64_t const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('uint64_t const &', 'value')])
+    return
+
+def register_Ns3Vector2DChecker_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker(ns3::Vector2DChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Vector2DChecker const &', 'arg0')])
+    return
+
+def register_Ns3Vector2DValue_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2D const & value) [constructor]
+    cls.add_constructor([param('ns3::Vector2D const &', 'value')])
+    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2DValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Vector2DValue const &', 'arg0')])
+    ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector2DValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): bool ns3::Vector2DValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vector.h (module 'core'): ns3::Vector2D ns3::Vector2DValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Vector2D', 
+                   [], 
+                   is_const=True)
+    ## vector.h (module 'core'): std::string ns3::Vector2DValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): void ns3::Vector2DValue::Set(ns3::Vector2D const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
+                   [param('ns3::Vector2D const &', 'value')])
     return
 
-def register_Ns3QosBlockedDestinations_methods(root_module, cls):
-    ## qos-blocked-destinations.h (module 'wifi'): ns3::QosBlockedDestinations::QosBlockedDestinations(ns3::QosBlockedDestinations const & arg0) [constructor]
-    cls.add_constructor([param('ns3::QosBlockedDestinations const &', 'arg0')])
-    ## qos-blocked-destinations.h (module 'wifi'): ns3::QosBlockedDestinations::QosBlockedDestinations() [constructor]
+def register_Ns3Vector3DChecker_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker() [constructor]
     cls.add_constructor([])
-    ## qos-blocked-destinations.h (module 'wifi'): void ns3::QosBlockedDestinations::Block(ns3::Mac48Address dest, uint8_t tid) [member function]
-    cls.add_method('Block', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'dest'), param('uint8_t', 'tid')])
-    ## qos-blocked-destinations.h (module 'wifi'): bool ns3::QosBlockedDestinations::IsBlocked(ns3::Mac48Address dest, uint8_t tid) const [member function]
-    cls.add_method('IsBlocked', 
+    ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker(ns3::Vector3DChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Vector3DChecker const &', 'arg0')])
+    return
+
+def register_Ns3Vector3DValue_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3D const & value) [constructor]
+    cls.add_constructor([param('ns3::Vector3D const &', 'value')])
+    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3DValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Vector3DValue const &', 'arg0')])
+    ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector3DValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): bool ns3::Vector3DValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'dest'), param('uint8_t', 'tid')], 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vector.h (module 'core'): ns3::Vector3D ns3::Vector3DValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Vector3D', 
+                   [], 
                    is_const=True)
-    ## qos-blocked-destinations.h (module 'wifi'): void ns3::QosBlockedDestinations::Unblock(ns3::Mac48Address dest, uint8_t tid) [member function]
-    cls.add_method('Unblock', 
+    ## vector.h (module 'core'): std::string ns3::Vector3DValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): void ns3::Vector3DValue::Set(ns3::Vector3D const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('ns3::Mac48Address', 'dest'), param('uint8_t', 'tid')])
+                   [param('ns3::Vector3D const &', 'value')])
     return
 
-def register_Ns3QosTxop_methods(root_module, cls):
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::QosTxop const & arg0) [constructor]
-    cls.add_constructor([param('ns3::QosTxop const &', 'arg0')])
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop() [constructor]
+def register_Ns3VhtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities(ns3::VhtCapabilities const & arg0) [constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities() [constructor]
     cls.add_constructor([])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::BaTxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('BaTxFailed', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::BaTxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('BaTxOk', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteConfig() [member function]
-    cls.add_method('CompleteConfig', 
-                   'void', 
-                   [])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteMpduTx(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('CompleteMpduTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::DequeuePeekedFrame(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxVector txVector, bool aggregate=true, uint32_t ampduSize=0, ns3::Time ppduDurationLimit=ns3::Time::Min()) [member function]
-    cls.add_method('DequeuePeekedFrame', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxVector', 'txVector'), param('bool', 'aggregate', default_value='true'), param('uint32_t', 'ampduSize', default_value='0'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::EndTxNoAck() [member function]
-    cls.add_method('EndTxNoAck', 
-                   'void', 
-                   [], 
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiAckPolicySelector> ns3::QosTxop::GetAckPolicySelector() const [member function]
-    cls.add_method('GetAckPolicySelector', 
-                   'ns3::Ptr< ns3::WifiAckPolicySelector >', 
+    ## vht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetAddBaResponseTimeout() const [member function]
-    cls.add_method('GetAddBaResponseTimeout', 
-                   'ns3::Time', 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetAmpduExist(ns3::Mac48Address dest) const [member function]
-    cls.add_method('GetAmpduExist', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetBaAgreementEstablished(ns3::Mac48Address address, uint8_t tid) const [member function]
-    cls.add_method('GetBaAgreementEstablished', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBaBufferSize(ns3::Mac48Address address, uint8_t tid) const [member function]
-    cls.add_method('GetBaBufferSize', 
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetMaxMpduLength() const [member function]
+    cls.add_method('GetMaxMpduLength', 
                    'uint16_t', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
+                   [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBaStartingSequence(ns3::Mac48Address address, uint8_t tid) const [member function]
-    cls.add_method('GetBaStartingSequence', 
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedLgiDataRate', 
                    'uint16_t', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
+                   [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetBlockAckThreshold() const [member function]
-    cls.add_method('GetBlockAckThreshold', 
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxLdpc() const [member function]
+    cls.add_method('GetRxLdpc', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetFailedAddBaTimeout() const [member function]
-    cls.add_method('GetFailedAddBaTimeout', 
-                   'ns3::Time', 
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxStbc() const [member function]
+    cls.add_method('GetRxStbc', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::QosTxop::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
-    cls.add_method('GetFragmentPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('ns3::WifiMacHeader *', 'hdr')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('GetNextSequenceNumberFor', 
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
                    'uint16_t', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::MacLowTransmissionParameters ns3::QosTxop::GetTransmissionParameters(ns3::Ptr<const ns3::WifiMacQueueItem> frame) const [member function]
-    cls.add_method('GetTransmissionParameters', 
-                   'ns3::MacLowTransmissionParameters', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'frame')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetTxopRemaining() const [member function]
-    cls.add_method('GetTxopRemaining', 
-                   'ns3::Time', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): static ns3::TypeId ns3::QosTxop::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## qos-txop.h (module 'wifi'): ns3::TypeOfStation ns3::QosTxop::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint64_t ns3::VhtCapabilities::GetSupportedMcsAndNssSet() const [member function]
+    cls.add_method('GetSupportedMcsAndNssSet', 
+                   'uint64_t', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAck() [member function]
-    cls.add_method('GotAck', 
-                   'void', 
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetTxStbc() const [member function]
+    cls.add_method('GetTxStbc', 
+                   'uint8_t', 
                    [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAddBaResponse(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
-    cls.add_method('GotAddBaResponse', 
-                   'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('GotBlockAck', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotDelBaFrame(ns3::MgtDelBaHeader const * delBaHdr, ns3::Mac48Address recipient) [member function]
-    cls.add_method('GotDelBaFrame', 
-                   'void', 
-                   [param('ns3::MgtDelBaHeader const *', 'delBaHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::HasFramesToTransmit() [member function]
-    cls.add_method('HasFramesToTransmit', 
-                   'bool', 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetVhtCapabilitiesInfo() const [member function]
+    cls.add_method('GetVhtCapabilitiesInfo', 
+                   'uint32_t', 
                    [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsQosTxop() const [member function]
-    cls.add_method('IsQosTxop', 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedMcs(uint8_t mcs, uint8_t nss) const [member function]
+    cls.add_method('IsSupportedMcs', 
                    'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Mac48Address ns3::QosTxop::MapDestAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('MapDestAddressForAggregation', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Mac48Address ns3::QosTxop::MapSrcAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('MapSrcAddressForAggregation', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::MissedAck() [member function]
-    cls.add_method('MissedAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::MissedBlockAck(uint8_t nMpdus) [member function]
-    cls.add_method('MissedBlockAck', 
-                   'void', 
-                   [param('uint8_t', 'nMpdus')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::NeedBarRetransmission() [member function]
-    cls.add_method('NeedBarRetransmission', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedRxMcs', 
                    'bool', 
-                   [])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::NeedFragmentation() const [member function]
-    cls.add_method('NeedFragmentation', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedTxMcs', 
                    'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyAccessGranted() [member function]
-    cls.add_method('NotifyAccessGranted', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyInternalCollision() [member function]
-    cls.add_method('NotifyInternalCollision', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyMissedCts(std::list<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [member function]
-    cls.add_method('NotifyMissedCts', 
-                   'void', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextFrame(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextFrame', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('PeekNextSequenceNumberFor', 
-                   'uint16_t', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PrepareBlockAckRequest(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('PrepareBlockAckRequest', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   [param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::PushFront(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('PushFront', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::RestartAccessIfNeeded() [member function]
-    cls.add_method('RestartAccessIfNeeded', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ScheduleBar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, bool skipIfNoDataQueued=false) [member function]
-    cls.add_method('ScheduleBar', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
-    cls.add_method('SendDelbaFrame', 
+    ## vht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
                    'void', 
-                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAccessCategory(ns3::AcIndex ac) [member function]
-    cls.add_method('SetAccessCategory', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxAmpduLength(uint32_t maxAmpduLength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
                    'void', 
-                   [param('ns3::AcIndex', 'ac')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAckPolicySelector(ns3::Ptr<ns3::WifiAckPolicySelector> ackSelector) [member function]
-    cls.add_method('SetAckPolicySelector', 
+                   [param('uint32_t', 'maxAmpduLength')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxMpduLength(uint16_t length) [member function]
+    cls.add_method('SetMaxMpduLength', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiAckPolicySelector >', 'ackSelector')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAddBaResponseTimeout(ns3::Time addBaResponseTimeout) [member function]
-    cls.add_method('SetAddBaResponseTimeout', 
+                   [param('uint16_t', 'length')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxHighestSupportedLgiDataRate(uint16_t supportedDatarate) [member function]
+    cls.add_method('SetRxHighestSupportedLgiDataRate', 
                    'void', 
-                   [param('ns3::Time', 'addBaResponseTimeout')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAmpduExist(ns3::Mac48Address dest, bool enableAmpdu) [member function]
-    cls.add_method('SetAmpduExist', 
+                   [param('uint16_t', 'supportedDatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxLdpc(uint8_t rxLdpc) [member function]
+    cls.add_method('SetRxLdpc', 
                    'void', 
-                   [param('ns3::Mac48Address', 'dest'), param('bool', 'enableAmpdu')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckInactivityTimeout(uint16_t timeout) [member function]
-    cls.add_method('SetBlockAckInactivityTimeout', 
+                   [param('uint8_t', 'rxLdpc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetRxMcsMap', 
                    'void', 
-                   [param('uint16_t', 'timeout')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckThreshold(uint8_t threshold) [member function]
-    cls.add_method('SetBlockAckThreshold', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxStbc(uint8_t rxStbc) [member function]
+    cls.add_method('SetRxStbc', 
                    'void', 
-                   [param('uint8_t', 'threshold')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetFailedAddBaTimeout(ns3::Time failedAddBaTimeout) [member function]
-    cls.add_method('SetFailedAddBaTimeout', 
+                   [param('uint8_t', 'rxStbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor160Mhz(uint8_t shortGuardInterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor160Mhz', 
                    'void', 
-                   [param('ns3::Time', 'failedAddBaTimeout')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
+                   [param('uint8_t', 'shortGuardInterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor80Mhz(uint8_t shortGuardInterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor80Mhz', 
                    'void', 
-                   [param('ns3::TypeOfStation', 'type')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
+                   [param('uint8_t', 'shortGuardInterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedChannelWidthSet(uint8_t channelWidthSet) [member function]
+    cls.add_method('SetSupportedChannelWidthSet', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartAccessIfNeeded() [member function]
-    cls.add_method('StartAccessIfNeeded', 
+                   [param('uint8_t', 'channelWidthSet')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedMcsAndNssSet(uint64_t ctrl) [member function]
+    cls.add_method('SetSupportedMcsAndNssSet', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartNextPacket() [member function]
-    cls.add_method('StartNextPacket', 
+                   [param('uint64_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxHighestSupportedLgiDataRate(uint16_t supportedDatarate) [member function]
+    cls.add_method('SetTxHighestSupportedLgiDataRate', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::UpdateCurrentPacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('UpdateCurrentPacket', 
+                   [param('uint16_t', 'supportedDatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetTxMcsMap', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::m_aMpduEnabled [variable]
-    cls.add_instance_attribute('m_aMpduEnabled', 'std::map< ns3::Mac48Address, bool >', is_const=False)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxStbc(uint8_t txStbc) [member function]
+    cls.add_method('SetTxStbc', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   [param('uint8_t', 'txStbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtCapabilitiesInfo(uint32_t ctrl) [member function]
+    cls.add_method('SetVhtCapabilitiesInfo', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetFragmentOffset() const [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetFragmentSize() const [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetNextFragmentSize() const [member function]
-    cls.add_method('GetNextFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsLastFragment() const [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::TerminateTxop() [member function]
-    cls.add_method('TerminateTxop', 
+                   [param('uint32_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtSupported(uint8_t vhtSupported) [member function]
+    cls.add_method('SetVhtSupported', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
+                   [param('uint8_t', 'vhtSupported')])
     return
 
-def register_Ns3Queue__Ns3Packet_methods(root_module, cls):
-    ## queue.h (module 'network'): static ns3::TypeId ns3::Queue<ns3::Packet>::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Queue() [constructor]
+def register_Ns3VhtOperation_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## vht-operation.h (module 'wifi'): ns3::VhtOperation::VhtOperation(ns3::VhtOperation const & arg0) [constructor]
+    cls.add_constructor([param('ns3::VhtOperation const &', 'arg0')])
+    ## vht-operation.h (module 'wifi'): ns3::VhtOperation::VhtOperation() [constructor]
     cls.add_constructor([])
-    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::Enqueue(ns3::Ptr<ns3::Packet> item) [member function]
-    cls.add_method('Enqueue', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'item')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::Dequeue() [member function]
-    cls.add_method('Dequeue', 
-                   'ns3::Ptr< ns3::Packet >', 
+    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## vht-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtOperation::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::Remove() [member function]
-    cls.add_method('Remove', 
-                   'ns3::Ptr< ns3::Packet >', 
+                   is_const=True, is_virtual=True)
+    ## vht-operation.h (module 'wifi'): uint16_t ns3::VhtOperation::GetBasicVhtMcsAndNssSet() const [member function]
+    cls.add_method('GetBasicVhtMcsAndNssSet', 
+                   'uint16_t', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<const ns3::Packet> ns3::Queue<ns3::Packet>::Peek() const [member function]
-    cls.add_method('Peek', 
-                   'ns3::Ptr< ns3::Packet const >', 
+                   is_const=True)
+    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetChannelCenterFrequencySegment0() const [member function]
+    cls.add_method('GetChannelCenterFrequencySegment0', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::Flush() [member function]
-    cls.add_method('Flush', 
-                   'void', 
-                   [])
-    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Queue(ns3::Queue<ns3::Packet> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Queue< ns3::Packet > const &', 'arg0')])
-    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::ConstIterator ns3::Queue<ns3::Packet>::begin() const [member function]
-    cls.add_method('begin', 
-                   'ns3::Queue< ns3::Packet > ConstIterator', 
+                   is_const=True)
+    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetChannelCenterFrequencySegment1() const [member function]
+    cls.add_method('GetChannelCenterFrequencySegment1', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Iterator ns3::Queue<ns3::Packet>::begin() [member function]
-    cls.add_method('begin', 
-                   'ns3::Queue< ns3::Packet > Iterator', 
+                   is_const=True)
+    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint8_t', 
                    [], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::ConstIterator ns3::Queue<ns3::Packet>::end() const [member function]
-    cls.add_method('end', 
-                   'ns3::Queue< ns3::Packet > ConstIterator', 
+                   is_const=True)
+    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Iterator ns3::Queue<ns3::Packet>::end() [member function]
-    cls.add_method('end', 
-                   'ns3::Queue< ns3::Packet > Iterator', 
+                   is_const=True, is_virtual=True)
+    ## vht-operation.h (module 'wifi'): uint16_t ns3::VhtOperation::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
                    [], 
-                   visibility='protected')
-    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item) [member function]
-    cls.add_method('DoEnqueue', 
-                   'bool', 
-                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
-    cls.add_method('DoDequeue', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoRemove(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
-    cls.add_method('DoRemove', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<const ns3::Packet> ns3::Queue<ns3::Packet>::DoPeek(ns3::Queue<ns3::Packet>::ConstIterator pos) const [member function]
-    cls.add_method('DoPeek', 
-                   'ns3::Ptr< ns3::Packet const >', 
-                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos')], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DropBeforeEnqueue(ns3::Ptr<ns3::Packet> item) [member function]
-    cls.add_method('DropBeforeEnqueue', 
+                   is_const=True, is_virtual=True)
+    ## vht-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'item')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DropAfterDequeue(ns3::Ptr<ns3::Packet> item) [member function]
-    cls.add_method('DropAfterDequeue', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetBasicVhtMcsAndNssSet(uint16_t basicVhtMcsAndNssSet) [member function]
+    cls.add_method('SetBasicVhtMcsAndNssSet', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'item')], 
-                   visibility='protected')
+                   [param('uint16_t', 'basicVhtMcsAndNssSet')])
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetChannelCenterFrequencySegment0(uint8_t channelCenterFrequencySegment0) [member function]
+    cls.add_method('SetChannelCenterFrequencySegment0', 
+                   'void', 
+                   [param('uint8_t', 'channelCenterFrequencySegment0')])
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetChannelCenterFrequencySegment1(uint8_t channelCenterFrequencySegment1) [member function]
+    cls.add_method('SetChannelCenterFrequencySegment1', 
+                   'void', 
+                   [param('uint8_t', 'channelCenterFrequencySegment1')])
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetChannelWidth(uint8_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint8_t', 'channelWidth')])
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetMaxVhtMcsPerNss(uint8_t nss, uint8_t maxVhtMcs) [member function]
+    cls.add_method('SetMaxVhtMcsPerNss', 
+                   'void', 
+                   [param('uint8_t', 'nss'), param('uint8_t', 'maxVhtMcs')])
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetVhtSupported(uint8_t vhtSupported) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('uint8_t', 'vhtSupported')])
     return
 
-def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
-    ## queue.h (module 'network'): static ns3::TypeId ns3::Queue<ns3::QueueDiscItem>::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3VhtPpdu_methods(root_module, cls):
+    ## vht-ppdu.h (module 'wifi'): ns3::VhtPpdu::VhtPpdu(ns3::VhtPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::VhtPpdu const &', 'arg0')])
+    ## vht-ppdu.h (module 'wifi'): ns3::VhtPpdu::VhtPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid')])
+    ## vht-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::VhtPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
-                   is_static=True)
-    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Queue() [constructor]
-    cls.add_constructor([])
-    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::Enqueue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
-    cls.add_method('Enqueue', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::Dequeue() [member function]
-    cls.add_method('Dequeue', 
-                   'ns3::Ptr< ns3::QueueDiscItem >', 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): ns3::Time ns3::VhtPpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::Remove() [member function]
-    cls.add_method('Remove', 
-                   'ns3::Ptr< ns3::QueueDiscItem >', 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): ns3::WifiPpduType ns3::VhtPpdu::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::WifiPpduType', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<const ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::Peek() const [member function]
-    cls.add_method('Peek', 
-                   'ns3::Ptr< ns3::QueueDiscItem const >', 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::VhtPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::Flush() [member function]
-    cls.add_method('Flush', 
-                   'void', 
-                   [])
-    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Queue(ns3::Queue<ns3::QueueDiscItem> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Queue< ns3::QueueDiscItem > const &', 'arg0')])
-    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::ConstIterator ns3::Queue<ns3::QueueDiscItem>::begin() const [member function]
-    cls.add_method('begin', 
-                   'ns3::Queue< ns3::QueueDiscItem > ConstIterator', 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3VhtPpduVhtSigHeader_methods(root_module, cls):
+    ## vht-ppdu.h (module 'wifi'): ns3::VhtPpdu::VhtSigHeader::VhtSigHeader(ns3::VhtPpdu::VhtSigHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::VhtPpdu::VhtSigHeader const &', 'arg0')])
+    ## vht-ppdu.h (module 'wifi'): ns3::VhtPpdu::VhtSigHeader::VhtSigHeader() [constructor]
+    cls.add_constructor([])
+    ## vht-ppdu.h (module 'wifi'): uint32_t ns3::VhtPpdu::VhtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): uint16_t ns3::VhtPpdu::VhtSigHeader::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint16_t', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Iterator ns3::Queue<ns3::QueueDiscItem>::begin() [member function]
-    cls.add_method('begin', 
-                   'ns3::Queue< ns3::QueueDiscItem > Iterator', 
+                   is_const=True)
+    ## vht-ppdu.h (module 'wifi'): ns3::TypeId ns3::VhtPpdu::VhtSigHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::ConstIterator ns3::Queue<ns3::QueueDiscItem>::end() const [member function]
-    cls.add_method('end', 
-                   'ns3::Queue< ns3::QueueDiscItem > ConstIterator', 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): uint8_t ns3::VhtPpdu::VhtSigHeader::GetNStreams() const [member function]
+    cls.add_method('GetNStreams', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Iterator ns3::Queue<ns3::QueueDiscItem>::end() [member function]
-    cls.add_method('end', 
-                   'ns3::Queue< ns3::QueueDiscItem > Iterator', 
+                   is_const=True)
+    ## vht-ppdu.h (module 'wifi'): uint32_t ns3::VhtPpdu::VhtSigHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
-                   visibility='protected')
-    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item) [member function]
-    cls.add_method('DoEnqueue', 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): bool ns3::VhtPpdu::VhtSigHeader::GetShortGuardInterval() const [member function]
+    cls.add_method('GetShortGuardInterval', 
                    'bool', 
-                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
-    cls.add_method('DoDequeue', 
-                   'ns3::Ptr< ns3::QueueDiscItem >', 
-                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoRemove(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
-    cls.add_method('DoRemove', 
-                   'ns3::Ptr< ns3::QueueDiscItem >', 
-                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<const ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoPeek(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) const [member function]
-    cls.add_method('DoPeek', 
-                   'ns3::Ptr< ns3::QueueDiscItem const >', 
-                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos')], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DropBeforeEnqueue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
-    cls.add_method('DropBeforeEnqueue', 
+                   [], 
+                   is_const=True)
+    ## vht-ppdu.h (module 'wifi'): bool ns3::VhtPpdu::VhtSigHeader::GetShortGuardIntervalDisambiguation() const [member function]
+    cls.add_method('GetShortGuardIntervalDisambiguation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## vht-ppdu.h (module 'wifi'): uint8_t ns3::VhtPpdu::VhtSigHeader::GetSuMcs() const [member function]
+    cls.add_method('GetSuMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-ppdu.h (module 'wifi'): static ns3::TypeId ns3::VhtPpdu::VhtSigHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DropAfterDequeue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
-    cls.add_method('DropAfterDequeue', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
-                   visibility='protected')
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')])
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::SetMuFlag(bool mu) [member function]
+    cls.add_method('SetMuFlag', 
+                   'void', 
+                   [param('bool', 'mu')])
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::SetNStreams(uint8_t nStreams) [member function]
+    cls.add_method('SetNStreams', 
+                   'void', 
+                   [param('uint8_t', 'nStreams')])
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::SetShortGuardInterval(bool sgi) [member function]
+    cls.add_method('SetShortGuardInterval', 
+                   'void', 
+                   [param('bool', 'sgi')])
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::SetShortGuardIntervalDisambiguation(bool disambiguation) [member function]
+    cls.add_method('SetShortGuardIntervalDisambiguation', 
+                   'void', 
+                   [param('bool', 'disambiguation')])
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::SetSuMcs(uint8_t mcs) [member function]
+    cls.add_method('SetSuMcs', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
     return
 
-def register_Ns3Queue__Ns3WifiMacQueueItem_methods(root_module, cls):
-    ## queue.h (module 'network'): static ns3::TypeId ns3::Queue<ns3::WifiMacQueueItem>::GetTypeId() [member function]
+def register_Ns3WifiDefaultProtectionManager_methods(root_module, cls):
+    ## wifi-default-protection-manager.h (module 'wifi'): ns3::WifiDefaultProtectionManager::WifiDefaultProtectionManager(ns3::WifiDefaultProtectionManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDefaultProtectionManager const &', 'arg0')])
+    ## wifi-default-protection-manager.h (module 'wifi'): ns3::WifiDefaultProtectionManager::WifiDefaultProtectionManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-default-protection-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiDefaultProtectionManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::Queue() [constructor]
+    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiDefaultProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAddMpdu', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True)
+    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiDefaultProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True)
+    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiDefaultProtectionManager::GetPsduProtection(ns3::WifiMacHeader const & hdr, uint32_t size, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetPsduProtection', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::WifiMacHeader const &', 'hdr'), param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3WifiMacQueue_methods(root_module, cls):
+    ## wifi-mac-queue.h (module 'wifi'): static ns3::TypeId ns3::WifiMacQueue::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue() [constructor]
     cls.add_constructor([])
-    ## queue.h (module 'network'): bool ns3::Queue<ns3::WifiMacQueueItem>::Enqueue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::SetMaxDelay(ns3::Time delay) [member function]
+    cls.add_method('SetMaxDelay', 
+                   'void', 
+                   [param('ns3::Time', 'delay')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Time ns3::WifiMacQueue::GetMaxDelay() const [member function]
+    cls.add_method('GetMaxDelay', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Enqueue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
     cls.add_method('Enqueue', 
                    'bool', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::Dequeue() [member function]
+                   is_virtual=True)
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::PushFront(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    cls.add_method('PushFront', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Insert(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    cls.add_method('Insert', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Dequeue() [member function]
     cls.add_method('Dequeue', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::Remove() [member function]
-    cls.add_method('Remove', 
+                   is_virtual=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueByAddress(ns3::Mac48Address dest) [member function]
+    cls.add_method('DequeueByAddress', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::Peek() const [member function]
-    cls.add_method('Peek', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::Flush() [member function]
-    cls.add_method('Flush', 
-                   'void', 
-                   [])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::Queue(ns3::Queue<ns3::WifiMacQueueItem> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Queue< ns3::WifiMacQueueItem > const &', 'arg0')])
-    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::Queue<ns3::WifiMacQueueItem>::begin() const [member function]
-    cls.add_method('begin', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::Iterator ns3::Queue<ns3::WifiMacQueueItem>::begin() [member function]
-    cls.add_method('begin', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > Iterator', 
-                   [], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::Queue<ns3::WifiMacQueueItem>::end() const [member function]
-    cls.add_method('end', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::Iterator ns3::Queue<ns3::WifiMacQueueItem>::end() [member function]
-    cls.add_method('end', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > Iterator', 
-                   [], 
-                   visibility='protected')
-    ## queue.h (module 'network'): bool ns3::Queue<ns3::WifiMacQueueItem>::DoEnqueue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('DoEnqueue', 
-                   'bool', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoDequeue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
-    cls.add_method('DoDequeue', 
+                   [param('ns3::Mac48Address', 'dest')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueByTid(uint8_t tid) [member function]
+    cls.add_method('DequeueByTid', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoRemove(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
-    cls.add_method('DoRemove', 
+                   [param('uint8_t', 'tid')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueByTidAndAddress(uint8_t tid, ns3::Mac48Address dest) [member function]
+    cls.add_method('DequeueByTidAndAddress', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoPeek(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) const [member function]
-    cls.add_method('DoPeek', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr) [member function]
+    cls.add_method('DequeueFirstAvailable', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Dequeue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
+    cls.add_method('Dequeue', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::Peek() const [member function]
+    cls.add_method('Peek', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::DropBeforeEnqueue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('DropBeforeEnqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::DropAfterDequeue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('DropAfterDequeue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
-                   visibility='protected')
-    return
-
-def register_Ns3QueueItem_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## queue-item.h (module 'network'): ns3::QueueItem::QueueItem(ns3::Ptr<ns3::Packet> p) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'p')])
-    ## queue-item.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::QueueItem::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByAddress(ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    cls.add_method('PeekByAddress', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
+                   [param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTid(uint8_t tid, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    cls.add_method('PeekByTid', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
+                   [param('uint8_t', 'tid'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTidAndAddress(uint8_t tid, ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    cls.add_method('PeekByTidAndAddress', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    cls.add_method('PeekFirstAvailable', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
+                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Remove() [member function]
+    cls.add_method('Remove', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Remove(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('Remove', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::Remove(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, bool removeExpired=false) [member function]
+    cls.add_method('Remove', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('bool', 'removeExpired', default_value='false')])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByAddress(ns3::Mac48Address dest) [member function]
+    cls.add_method('GetNPacketsByAddress', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'dest')])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByTidAndAddress(uint8_t tid, ns3::Mac48Address dest) [member function]
+    cls.add_method('GetNPacketsByTidAndAddress', 
+                   'uint32_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPackets(uint8_t tid, ns3::Mac48Address dest) const [member function]
+    cls.add_method('GetNPackets', 
+                   'uint32_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')], 
                    is_const=True)
-    ## queue-item.h (module 'network'): uint32_t ns3::QueueItem::GetSize() const [member function]
-    cls.add_method('GetSize', 
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNBytes(uint8_t tid, ns3::Mac48Address dest) const [member function]
+    cls.add_method('GetNBytes', 
                    'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## queue-item.h (module 'network'): bool ns3::QueueItem::GetUint8Value(ns3::QueueItem::Uint8Values field, uint8_t & value) const [member function]
-    cls.add_method('GetUint8Value', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::IsEmpty() [member function]
+    cls.add_method('IsEmpty', 
                    'bool', 
-                   [param('ns3::QueueItem::Uint8Values', 'field'), param('uint8_t &', 'value')], 
-                   is_const=True, is_virtual=True)
-    ## queue-item.h (module 'network'): void ns3::QueueItem::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPackets() [member function]
+    cls.add_method('GetNPackets', 
+                   'uint32_t', 
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNBytes() [member function]
+    cls.add_method('GetNBytes', 
+                   'uint32_t', 
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::EMPTY [variable]
+    cls.add_static_attribute('EMPTY', 'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator const', is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::WifiMacQueue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiMacQueue const &', 'arg0')])
     return
 
-def register_Ns3QueueSizeChecker_methods(root_module, cls):
-    ## queue-size.h (module 'network'): ns3::QueueSizeChecker::QueueSizeChecker() [constructor]
+def register_Ns3WifiModeChecker_methods(root_module, cls):
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker() [constructor]
     cls.add_constructor([])
-    ## queue-size.h (module 'network'): ns3::QueueSizeChecker::QueueSizeChecker(ns3::QueueSizeChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::QueueSizeChecker const &', 'arg0')])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker(ns3::WifiModeChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiModeChecker const &', 'arg0')])
     return
 
-def register_Ns3QueueSizeValue_methods(root_module, cls):
-    ## queue-size.h (module 'network'): ns3::QueueSizeValue::QueueSizeValue() [constructor]
+def register_Ns3WifiModeValue_methods(root_module, cls):
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue() [constructor]
     cls.add_constructor([])
-    ## queue-size.h (module 'network'): ns3::QueueSizeValue::QueueSizeValue(ns3::QueueSize const & value) [constructor]
-    cls.add_constructor([param('ns3::QueueSize const &', 'value')])
-    ## queue-size.h (module 'network'): ns3::QueueSizeValue::QueueSizeValue(ns3::QueueSizeValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::QueueSizeValue const &', 'arg0')])
-    ## queue-size.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::QueueSizeValue::Copy() const [member function]
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiMode const & value) [constructor]
+    cls.add_constructor([param('ns3::WifiMode const &', 'value')])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiModeValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiModeValue const &', 'arg0')])
+    ## wifi-mode.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::WifiModeValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## queue-size.h (module 'network'): bool ns3::QueueSizeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiModeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## queue-size.h (module 'network'): ns3::QueueSize ns3::QueueSizeValue::Get() const [member function]
+    ## wifi-mode.h (module 'wifi'): ns3::WifiMode ns3::WifiModeValue::Get() const [member function]
     cls.add_method('Get', 
-                   'ns3::QueueSize', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
-    ## queue-size.h (module 'network'): std::string ns3::QueueSizeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    ## wifi-mode.h (module 'wifi'): std::string ns3::WifiModeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## queue-size.h (module 'network'): void ns3::QueueSizeValue::Set(ns3::QueueSize const & value) [member function]
+    ## wifi-mode.h (module 'wifi'): void ns3::WifiModeValue::Set(ns3::WifiMode const & value) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('ns3::QueueSize const &', 'value')])
+                   [param('ns3::WifiMode const &', 'value')])
     return
 
-def register_Ns3RateErrorModel_methods(root_module, cls):
-    ## error-model.h (module 'network'): ns3::RateErrorModel::RateErrorModel(ns3::RateErrorModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::RateErrorModel const &', 'arg0')])
-    ## error-model.h (module 'network'): ns3::RateErrorModel::RateErrorModel() [constructor]
-    cls.add_constructor([])
-    ## error-model.h (module 'network'): int64_t ns3::RateErrorModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## error-model.h (module 'network'): double ns3::RateErrorModel::GetRate() const [member function]
-    cls.add_method('GetRate', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## error-model.h (module 'network'): static ns3::TypeId ns3::RateErrorModel::GetTypeId() [member function]
+def register_Ns3WifiNetDevice_methods(root_module, cls):
+    ## wifi-net-device.h (module 'wifi'): static ns3::TypeId ns3::WifiNetDevice::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): ns3::RateErrorModel::ErrorUnit ns3::RateErrorModel::GetUnit() const [member function]
-    cls.add_method('GetUnit', 
-                   'ns3::RateErrorModel::ErrorUnit', 
-                   [], 
-                   is_const=True)
-    ## error-model.h (module 'network'): void ns3::RateErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
-    cls.add_method('SetRandomVariable', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
-    ## error-model.h (module 'network'): void ns3::RateErrorModel::SetRate(double rate) [member function]
-    cls.add_method('SetRate', 
+    ## wifi-net-device.h (module 'wifi'): ns3::WifiNetDevice::WifiNetDevice() [constructor]
+    cls.add_constructor([])
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetMac', 
                    'void', 
-                   [param('double', 'rate')])
-    ## error-model.h (module 'network'): void ns3::RateErrorModel::SetUnit(ns3::RateErrorModel::ErrorUnit error_unit) [member function]
-    cls.add_method('SetUnit', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')])
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetPhy', 
                    'void', 
-                   [param('ns3::RateErrorModel::ErrorUnit', 'error_unit')])
-    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorrupt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorruptBit(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorruptBit', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorruptByte(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorruptByte', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorruptPkt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorruptPkt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): void ns3::RateErrorModel::DoReset() [member function]
-    cls.add_method('DoReset', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')])
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const manager) [member function]
+    cls.add_method('SetRemoteStationManager', 
                    'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'manager')])
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiNetDevice::GetMac() const [member function]
+    cls.add_method('GetMac', 
+                   'ns3::Ptr< ns3::WifiMac >', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3ReceiveListErrorModel_methods(root_module, cls):
-    ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel(ns3::ReceiveListErrorModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
-    ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
-    cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
-    cls.add_method('GetList', 
-                   'std::list< unsigned int >', 
+                   is_const=True)
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiNetDevice::GetPhy() const [member function]
+    cls.add_method('GetPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
                    is_const=True)
-    ## error-model.h (module 'network'): static ns3::TypeId ns3::ReceiveListErrorModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiNetDevice::GetRemoteStationManager() const [member function]
+    cls.add_method('GetRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
                    [], 
-                   is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
-    cls.add_method('SetList', 
-                   'void', 
-                   [param('std::list< unsigned int > const &', 'packetlist')])
-    ## error-model.h (module 'network'): bool ns3::ReceiveListErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorrupt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::DoReset() [member function]
-    cls.add_method('DoReset', 
+                   is_const=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetHtConfiguration(ns3::Ptr<ns3::HtConfiguration> htConfiguration) [member function]
+    cls.add_method('SetHtConfiguration', 
                    'void', 
+                   [param('ns3::Ptr< ns3::HtConfiguration >', 'htConfiguration')])
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiNetDevice::GetHtConfiguration() const [member function]
+    cls.add_method('GetHtConfiguration', 
+                   'ns3::Ptr< ns3::HtConfiguration >', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3RegularWifiMac_methods(root_module, cls):
-    ## regular-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::RegularWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_const=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetVhtConfiguration(ns3::Ptr<ns3::VhtConfiguration> vhtConfiguration) [member function]
+    cls.add_method('SetVhtConfiguration', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::VhtConfiguration >', 'vhtConfiguration')])
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiNetDevice::GetVhtConfiguration() const [member function]
+    cls.add_method('GetVhtConfiguration', 
+                   'ns3::Ptr< ns3::VhtConfiguration >', 
                    [], 
-                   is_static=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac::RegularWifiMac() [constructor]
-    cls.add_constructor([])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetShortSlotTimeSupported(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeSupported', 
+                   is_const=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetHeConfiguration(ns3::Ptr<ns3::HeConfiguration> heConfiguration) [member function]
+    cls.add_method('SetHeConfiguration', 
                    'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
+                   [param('ns3::Ptr< ns3::HeConfiguration >', 'heConfiguration')])
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiNetDevice::GetHeConfiguration() const [member function]
+    cls.add_method('GetHeConfiguration', 
+                   'ns3::Ptr< ns3::HeConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetIfIndex(uint32_t const index) [member function]
+    cls.add_method('SetIfIndex', 
                    'void', 
-                   [param('ns3::Ssid', 'ssid')], 
+                   [param('uint32_t const', 'index')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    ## wifi-net-device.h (module 'wifi'): uint32_t ns3::WifiNetDevice::GetIfIndex() const [member function]
+    cls.add_method('GetIfIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::WifiNetDevice::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetAddress(ns3::Address address) [member function]
     cls.add_method('SetAddress', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')], 
+                   [param('ns3::Address', 'address')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
-                   'void', 
+    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
                    [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::SetMtu(uint16_t const mtu) [member function]
+    cls.add_method('SetMtu', 
                    'bool', 
+                   [param('uint16_t const', 'mtu')], 
+                   is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): uint16_t ns3::WifiNetDevice::GetMtu() const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ssid ns3::RegularWifiMac::GetSsid() const [member function]
-    cls.add_method('GetSsid', 
-                   'ns3::Ssid', 
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsLinkUp() const [member function]
+    cls.add_method('IsLinkUp', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('AddLinkChangeCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
+    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetBroadcast() const [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Address', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::RegularWifiMac::GetWifiPhy() const [member function]
-    cls.add_method('GetWifiPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
+    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv4Address', 'multicastGroup')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsPointToPoint() const [member function]
+    cls.add_method('IsPointToPoint', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsBridge() const [member function]
+    cls.add_method('IsBridge', 
+                   'bool', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::Node> ns3::WifiNetDevice::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetNode(ns3::Ptr<ns3::Node> const node) [member function]
+    cls.add_method('SetNode', 
                    'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
+                   [param('ns3::Ptr< ns3::Node > const', 'node')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::RegularWifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::NeedsArp() const [member function]
+    cls.add_method('NeedsArp', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetReceiveCallback(ns3::NetDevice::ReceiveCallback cb) [member function]
+    cls.add_method('SetReceiveCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('SendFrom', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetPromiscReceiveCallback(ns3::NetDevice::PromiscReceiveCallback cb) [member function]
+    cls.add_method('SetPromiscReceiveCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
-    cls.add_method('SetCtsToSelfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'bssid')])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
-    cls.add_method('GetExtendedCapabilities', 
-                   'ns3::ExtendedCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::RegularWifiMac::GetHtCapabilities() const [member function]
-    cls.add_method('GetHtCapabilities', 
-                   'ns3::HtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::RegularWifiMac::GetVhtCapabilities() const [member function]
-    cls.add_method('GetVhtCapabilities', 
-                   'ns3::VhtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::RegularWifiMac::GetHeCapabilities() const [member function]
-    cls.add_method('GetHeCapabilities', 
-                   'ns3::HeCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoDispose() [member function]
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
-    cls.add_method('GetTxop', 
-                   'ns3::Ptr< ns3::Txop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
-    cls.add_method('GetVOQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVIQueue() const [member function]
-    cls.add_method('GetVIQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBEQueue() const [member function]
-    cls.add_method('GetBEQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBKQueue() const [member function]
-    cls.add_method('GetBKQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
-    cls.add_method('ConfigureContentionWindow', 
-                   'void', 
-                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxOk', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxFailed', 
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   [], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
     cls.add_method('ForwardUp', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
                    visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('DeaggregateAmsduAndForward', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SendAddBaResponse(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address originator) [member function]
-    cls.add_method('SendAddBaResponse', 
-                   'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'originator')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
-    cls.add_method('SetQosSupported', 
+    return
+
+def register_Ns3WifiRadioEnergyModel_methods(root_module, cls):
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel(ns3::WifiRadioEnergyModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiRadioEnergyModel const &', 'arg0')])
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel() [constructor]
+    cls.add_constructor([])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::ChangeState(int newState) [member function]
+    cls.add_method('ChangeState', 
                    'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
+                   [param('int', 'newState')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetCcaBusyCurrentA() const [member function]
+    cls.add_method('GetCcaBusyCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): WifiPhyState ns3::WifiRadioEnergyModel::GetCurrentState() const [member function]
+    cls.add_method('GetCurrentState', 
+                   'WifiPhyState', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetIdleCurrentA() const [member function]
+    cls.add_method('GetIdleCurrentA', 
+                   'double', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::Time ns3::WifiRadioEnergyModel::GetMaximumTimeInState(int state) const [member function]
+    cls.add_method('GetMaximumTimeInState', 
+                   'ns3::Time', 
+                   [param('int', 'state')], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener * ns3::WifiRadioEnergyModel::GetPhyListener() [member function]
+    cls.add_method('GetPhyListener', 
+                   'ns3::WifiRadioEnergyModelPhyListener *', 
+                   [])
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetRxCurrentA() const [member function]
+    cls.add_method('GetRxCurrentA', 
+                   'double', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetErpSupported(bool enable) [member function]
-    cls.add_method('SetErpSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
-    cls.add_method('GetErpSupported', 
-                   'bool', 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetSleepCurrentA() const [member function]
+    cls.add_method('GetSleepCurrentA', 
+                   'double', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetDsssSupported(bool enable) [member function]
-    cls.add_method('SetDsssSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
-    cls.add_method('GetDsssSupported', 
-                   'bool', 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetSwitchingCurrentA() const [member function]
+    cls.add_method('GetSwitchingCurrentA', 
+                   'double', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetTotalEnergyConsumption() const [member function]
+    cls.add_method('GetTotalEnergyConsumption', 
+                   'double', 
                    [], 
-                   is_const=True, visibility='protected')
-    return
-
-def register_Ns3RraaWifiManager_methods(root_module, cls):
-    ## rraa-wifi-manager.h (module 'wifi'): ns3::RraaWifiManager::RraaWifiManager(ns3::RraaWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::RraaWifiManager const &', 'arg0')])
-    ## rraa-wifi-manager.h (module 'wifi'): ns3::RraaWifiManager::RraaWifiManager() [constructor]
-    cls.add_constructor([])
-    ## rraa-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::RraaWifiManager::GetTypeId() [member function]
+                   is_const=True, is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetTxCurrentA() const [member function]
+    cls.add_method('GetTxCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): static ns3::TypeId ns3::WifiRadioEnergyModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetupMac', 
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyChanged() [member function]
+    cls.add_method('HandleEnergyChanged', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   [], 
                    is_virtual=True)
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyDepletion() [member function]
+    cls.add_method('HandleEnergyDepletion', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## rraa-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::RraaWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RraaWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RraaWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyRecharged() [member function]
+    cls.add_method('HandleEnergyRecharged', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): bool ns3::RraaWifiManager::DoNeedRts(ns3::WifiRemoteStation * st, uint32_t size, bool normally) [member function]
-    cls.add_method('DoNeedRts', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation *', 'st'), param('uint32_t', 'size'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetCcaBusyCurrentA(double ccaBusyCurrentA) [member function]
+    cls.add_method('SetCcaBusyCurrentA', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
+                   [param('double', 'ccaBusyCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergyDepletionCallback(ns3::WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback callback) [member function]
+    cls.add_method('SetEnergyDepletionCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergyRechargedCallback(ns3::WifiRadioEnergyModel::WifiRadioEnergyRechargedCallback callback) [member function]
+    cls.add_method('SetEnergyRechargedCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> const source) [member function]
+    cls.add_method('SetEnergySource', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('ns3::Ptr< ns3::EnergySource > const', 'source')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetIdleCurrentA(double idleCurrentA) [member function]
+    cls.add_method('SetIdleCurrentA', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('double', 'idleCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetRxCurrentA(double rxCurrentA) [member function]
+    cls.add_method('SetRxCurrentA', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('double', 'rxCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetSleepCurrentA(double sleepCurrentA) [member function]
+    cls.add_method('SetSleepCurrentA', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   [param('double', 'sleepCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetSwitchingCurrentA(double switchingCurrentA) [member function]
+    cls.add_method('SetSwitchingCurrentA', 
+                   'void', 
+                   [param('double', 'switchingCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentA(double txCurrentA) [member function]
+    cls.add_method('SetTxCurrentA', 
+                   'void', 
+                   [param('double', 'txCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentFromModel(double txPowerDbm) [member function]
+    cls.add_method('SetTxCurrentFromModel', 
+                   'void', 
+                   [param('double', 'txPowerDbm')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentModel(ns3::Ptr<ns3::WifiTxCurrentModel> const model) [member function]
+    cls.add_method('SetTxCurrentModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiTxCurrentModel > const', 'model')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
                    is_virtual=True, visibility='private')
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::DoGetCurrentA() const [member function]
+    cls.add_method('DoGetCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3RrpaaWifiManager_methods(root_module, cls):
-    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::RrpaaWifiManager::RrpaaWifiManager(ns3::RrpaaWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::RrpaaWifiManager const &', 'arg0')])
-    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::RrpaaWifiManager::RrpaaWifiManager() [constructor]
+def register_Ns3YansErrorRateModel_methods(root_module, cls):
+    ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel::YansErrorRateModel(ns3::YansErrorRateModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::YansErrorRateModel const &', 'arg0')])
+    ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel::YansErrorRateModel() [constructor]
     cls.add_constructor([])
-    ## rrpaa-wifi-manager.h (module 'wifi'): int64_t ns3::RrpaaWifiManager::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## rrpaa-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::RrpaaWifiManager::GetTypeId() [member function]
+    ## yans-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::YansErrorRateModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetupMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
-                   is_virtual=True)
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::RrpaaWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
-                   [], 
+    ## yans-error-rate-model.h (module 'wifi'): double ns3::YansErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector const & txVector, double snr, uint64_t nbits, uint8_t numRxAntennas, ns3::WifiPpduField field, uint16_t staId) const [member function]
+    cls.add_method('DoGetChunkSuccessRate', 
+                   'double', 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits'), param('uint8_t', 'numRxAntennas'), param('ns3::WifiPpduField', 'field'), param('uint16_t', 'staId')], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RrpaaWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RrpaaWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): bool ns3::RrpaaWifiManager::DoNeedRts(ns3::WifiRemoteStation * st, uint32_t size, bool normally) [member function]
-    cls.add_method('DoNeedRts', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation *', 'st'), param('uint32_t', 'size'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+    return
+
+def register_Ns3YansWifiChannel_methods(root_module, cls):
+    ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel::YansWifiChannel(ns3::YansWifiChannel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::YansWifiChannel const &', 'arg0')])
+    ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel::YansWifiChannel() [constructor]
+    cls.add_constructor([])
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Add(ns3::Ptr<ns3::YansWifiPhy> phy) [member function]
+    cls.add_method('Add', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'phy')])
+    ## yans-wifi-channel.h (module 'wifi'): int64_t ns3::YansWifiChannel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::YansWifiChannel::GetDevice(std::size_t i) const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-channel.h (module 'wifi'): std::size_t ns3::YansWifiChannel::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-channel.h (module 'wifi'): static ns3::TypeId ns3::YansWifiChannel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<const ns3::WifiPpdu> ppdu, double txPowerDbm) const [member function]
+    cls.add_method('Send', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('double', 'txPowerDbm')], 
+                   is_const=True)
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> const delay) [member function]
+    cls.add_method('SetPropagationDelayModel', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('ns3::Ptr< ns3::PropagationDelayModel > const', 'delay')])
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> const loss) [member function]
+    cls.add_method('SetPropagationLossModel', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
+                   [param('ns3::Ptr< ns3::PropagationLossModel > const', 'loss')])
     return
 
-def register_Ns3SimpleFrameCaptureModel_methods(root_module, cls):
-    ## simple-frame-capture-model.h (module 'wifi'): ns3::SimpleFrameCaptureModel::SimpleFrameCaptureModel(ns3::SimpleFrameCaptureModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SimpleFrameCaptureModel const &', 'arg0')])
-    ## simple-frame-capture-model.h (module 'wifi'): ns3::SimpleFrameCaptureModel::SimpleFrameCaptureModel() [constructor]
+def register_Ns3AddressChecker_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
     cls.add_constructor([])
-    ## simple-frame-capture-model.h (module 'wifi'): bool ns3::SimpleFrameCaptureModel::CaptureNewFrame(ns3::Ptr<ns3::Event> currentEvent, ns3::Ptr<ns3::Event> newEvent) const [member function]
-    cls.add_method('CaptureNewFrame', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Event >', 'currentEvent'), param('ns3::Ptr< ns3::Event >', 'newEvent')], 
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker(ns3::AddressChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3AddressValue_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Address const &', 'value')])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::AddressValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AddressValue const &', 'arg0')])
+    ## address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## simple-frame-capture-model.h (module 'wifi'): double ns3::SimpleFrameCaptureModel::GetMargin() const [member function]
-    cls.add_method('GetMargin', 
-                   'double', 
+    ## address.h (module 'network'): bool ns3::AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## address.h (module 'network'): ns3::Address ns3::AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Address', 
                    [], 
                    is_const=True)
-    ## simple-frame-capture-model.h (module 'wifi'): static ns3::TypeId ns3::SimpleFrameCaptureModel::GetTypeId() [member function]
+    ## address.h (module 'network'): std::string ns3::AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): void ns3::AddressValue::Set(ns3::Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Address const &', 'value')])
+    return
+
+def register_Ns3AdhocWifiMac_methods(root_module, cls):
+    ## adhoc-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::AdhocWifiMac::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## simple-frame-capture-model.h (module 'wifi'): void ns3::SimpleFrameCaptureModel::SetMargin(double margin) [member function]
-    cls.add_method('SetMargin', 
-                   'void', 
-                   [param('double', 'margin')])
-    return
-
-def register_Ns3SpectrumChannel_methods(root_module, cls):
-    ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel(ns3::SpectrumChannel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SpectrumChannel const &', 'arg0')])
-    ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
+    ## adhoc-wifi-mac.h (module 'wifi'): ns3::AdhocWifiMac::AdhocWifiMac() [constructor]
     cls.add_constructor([])
-    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
-    cls.add_method('AddPropagationLossModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::PropagationLossModel >', 'loss')])
-    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
-    cls.add_method('AddRx', 
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
                    'void', 
-                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddSpectrumPropagationLossModel(ns3::Ptr<ns3::SpectrumPropagationLossModel> loss) [member function]
-    cls.add_method('AddSpectrumPropagationLossModel', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::SpectrumPropagationLossModel >', 'loss')])
-    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
                    'void', 
-                   [], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
                    is_virtual=True)
-    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PropagationLossModel> ns3::SpectrumChannel::GetPropagationLossModel() [member function]
-    cls.add_method('GetPropagationLossModel', 
-                   'ns3::Ptr< ns3::PropagationLossModel >', 
-                   [])
-    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumPropagationLossModel> ns3::SpectrumChannel::GetSpectrumPropagationLossModel() [member function]
-    cls.add_method('GetSpectrumPropagationLossModel', 
-                   'ns3::Ptr< ns3::SpectrumPropagationLossModel >', 
-                   [])
-    ## spectrum-channel.h (module 'spectrum'): static ns3::TypeId ns3::SpectrumChannel::GetTypeId() [member function]
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3AlwaysLosChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::AlwaysLosChannelConditionModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
-    cls.add_method('SetPropagationDelayModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::PropagationDelayModel >', 'delay')])
-    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::StartTx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
-    cls.add_method('StartTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params')], 
-                   is_pure_virtual=True, is_virtual=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::AlwaysLosChannelConditionModel::AlwaysLosChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::AlwaysLosChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetChannelCondition', 
+                   'ns3::Ptr< ns3::ChannelCondition >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True)
+    ## channel-condition-model.h (module 'propagation'): int64_t ns3::AlwaysLosChannelConditionModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
     return
 
-def register_Ns3SpectrumWifiPhy_methods(root_module, cls):
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::SpectrumWifiPhy::SpectrumWifiPhy(ns3::SpectrumWifiPhy const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SpectrumWifiPhy const &', 'arg0')])
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::SpectrumWifiPhy::SpectrumWifiPhy() [constructor]
+def register_Ns3ApWifiMac_methods(root_module, cls):
+    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac::ApWifiMac() [constructor]
     cls.add_constructor([])
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
-    cls.add_method('ConfigureStandardAndBand', 
+    ## ap-wifi-mac.h (module 'wifi'): int64_t ns3::ApWifiMac::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
                    is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::CreateWifiSpectrumPhyInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
-    cls.add_method('CreateWifiSpectrumPhyInterface', 
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
-    ## spectrum-wifi-phy.h (module 'wifi'): uint32_t ns3::SpectrumWifiPhy::GetBandBandwidth() const [member function]
-    cls.add_method('GetBandBandwidth', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): uint16_t ns3::SpectrumWifiPhy::GetCenterFrequencyForChannelWidth(ns3::WifiTxVector txVector) const [member function]
-    cls.add_method('GetCenterFrequencyForChannelWidth', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetAssociationId(ns3::Mac48Address addr) const [member function]
+    cls.add_method('GetAssociationId', 
                    'uint16_t', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::Mac48Address', 'addr')], 
                    is_const=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::SpectrumWifiPhy::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::Channel >', 
+    ## ap-wifi-mac.h (module 'wifi'): ns3::Time ns3::ApWifiMac::GetBeaconInterval() const [member function]
+    cls.add_method('GetBeaconInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): uint16_t ns3::SpectrumWifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
-    cls.add_method('GetGuardBandwidth', 
-                   'uint16_t', 
-                   [param('uint16_t', 'currentChannelWidth')], 
                    is_const=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumWifiPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## ap-wifi-mac.h (module 'wifi'): uint8_t ns3::ApWifiMac::GetBufferStatus(uint8_t tid, ns3::Mac48Address address) const [member function]
+    cls.add_method('GetBufferStatus', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): uint8_t ns3::ApWifiMac::GetMaxBufferStatus(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetMaxBufferStatus', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): std::map<unsigned short, ns3::Mac48Address, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Mac48Address> > > const & ns3::ApWifiMac::GetStaList() const [member function]
+    cls.add_method('GetStaList', 
+                   'std::map< unsigned short, ns3::Mac48Address > const &', 
                    [], 
                    is_const=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<const ns3::SpectrumModel> ns3::SpectrumWifiPhy::GetRxSpectrumModel() [member function]
-    cls.add_method('GetRxSpectrumModel', 
-                   'ns3::Ptr< ns3::SpectrumModel const >', 
-                   [])
-    ## spectrum-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::SpectrumWifiPhy::GetTypeId() [member function]
+    ## ap-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::ApWifiMac::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetAntenna(ns3::Ptr<ns3::AntennaModel> const antenna) [member function]
-    cls.add_method('SetAntenna', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::AntennaModel > const', 'antenna')])
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> const channel) [member function]
-    cls.add_method('SetChannel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumChannel > const', 'channel')])
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
+    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetVhtOperationalChannelWidth() const [member function]
+    cls.add_method('GetVhtOperationalChannelWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
                    'void', 
-                   [param('uint8_t', 'id')], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannelWidth(uint16_t channelwidth) [member function]
-    cls.add_method('SetChannelWidth', 
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBeaconInterval(ns3::Time interval) [member function]
+    cls.add_method('SetBeaconInterval', 
+                   'void', 
+                   [param('ns3::Time', 'interval')])
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBufferStatus(uint8_t tid, ns3::Mac48Address address, uint8_t size) [member function]
+    cls.add_method('SetBufferStatus', 
                    'void', 
-                   [param('uint16_t', 'channelwidth')], 
-                   is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'address'), param('uint8_t', 'size')])
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
                    'void', 
-                   [param('uint16_t', 'freq')], 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
                    is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> rxParams) [member function]
-    cls.add_method('StartRx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'rxParams')])
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
-    cls.add_method('StartTx', 
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
                    is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::DoDispose() [member function]
+    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::DoInitialize() [member function]
+                   is_virtual=True, visibility='private')
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::SpectrumWifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
-    cls.add_method('GetBand', 
-                   'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
-                   is_virtual=True, visibility='protected')
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::SpectrumWifiPhy::ConvertHeRuSubcarriers(uint16_t channelWidth, ns3::HeRu::SubcarrierRange range) const [member function]
-    cls.add_method('ConvertHeRuSubcarriers', 
-                   'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'channelWidth'), param('std::pair< short, short >', 'range')], 
-                   is_const=True, is_virtual=True, visibility='private')
+                   is_virtual=True, visibility='private')
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3Ssid_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(ns3::Ssid const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ssid const &', 'arg0')])
-    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid() [constructor]
+def register_Ns3BinaryErrorModel_methods(root_module, cls):
+    ## error-model.h (module 'network'): ns3::BinaryErrorModel::BinaryErrorModel(ns3::BinaryErrorModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BinaryErrorModel const &', 'arg0')])
+    ## error-model.h (module 'network'): ns3::BinaryErrorModel::BinaryErrorModel() [constructor]
     cls.add_constructor([])
-    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(std::string s) [constructor]
-    cls.add_constructor([param('std::string', 's')])
-    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## ssid.h (module 'wifi'): ns3::WifiInformationElementId ns3::Ssid::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsBroadcast() const [member function]
-    cls.add_method('IsBroadcast', 
-                   'bool', 
+    ## error-model.h (module 'network'): static ns3::TypeId ns3::BinaryErrorModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsEqual(ns3::Ssid const & o) const [member function]
-    cls.add_method('IsEqual', 
+                   is_static=True)
+    ## error-model.h (module 'network'): bool ns3::BinaryErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorrupt', 
                    'bool', 
-                   [param('ns3::Ssid const &', 'o')], 
-                   is_const=True)
-    ## ssid.h (module 'wifi'): char * ns3::Ssid::PeekString() const [member function]
-    cls.add_method('PeekString', 
-                   'char *', 
-                   [], 
-                   is_const=True)
-    ## ssid.h (module 'wifi'): void ns3::Ssid::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
+                   is_virtual=True, visibility='private')
+    ## error-model.h (module 'network'): void ns3::BinaryErrorModel::DoReset() [member function]
+    cls.add_method('DoReset', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    return
-
-def register_Ns3SsidChecker_methods(root_module, cls):
-    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker() [constructor]
-    cls.add_constructor([])
-    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker(ns3::SsidChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SsidChecker const &', 'arg0')])
+                   [], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3SsidValue_methods(root_module, cls):
-    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue() [constructor]
+def register_Ns3BurstErrorModel_methods(root_module, cls):
+    ## error-model.h (module 'network'): ns3::BurstErrorModel::BurstErrorModel(ns3::BurstErrorModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BurstErrorModel const &', 'arg0')])
+    ## error-model.h (module 'network'): ns3::BurstErrorModel::BurstErrorModel() [constructor]
     cls.add_constructor([])
-    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::Ssid const & value) [constructor]
-    cls.add_constructor([param('ns3::Ssid const &', 'value')])
-    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::SsidValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SsidValue const &', 'arg0')])
-    ## ssid.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::SsidValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ssid.h (module 'wifi'): bool ns3::SsidValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## ssid.h (module 'wifi'): ns3::Ssid ns3::SsidValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Ssid', 
+    ## error-model.h (module 'network'): int64_t ns3::BurstErrorModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## error-model.h (module 'network'): double ns3::BurstErrorModel::GetBurstRate() const [member function]
+    cls.add_method('GetBurstRate', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## ssid.h (module 'wifi'): std::string ns3::SsidValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## ssid.h (module 'wifi'): void ns3::SsidValue::Set(ns3::Ssid const & value) [member function]
-    cls.add_method('Set', 
+    ## error-model.h (module 'network'): static ns3::TypeId ns3::BurstErrorModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetBurstRate(double rate) [member function]
+    cls.add_method('SetBurstRate', 
                    'void', 
-                   [param('ns3::Ssid const &', 'value')])
+                   [param('double', 'rate')])
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> burstSz) [member function]
+    cls.add_method('SetRandomBurstSize', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'burstSz')])
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> ranVar) [member function]
+    cls.add_method('SetRandomVariable', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'ranVar')])
+    ## error-model.h (module 'network'): bool ns3::BurstErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorrupt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
+                   is_virtual=True, visibility='private')
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::DoReset() [member function]
+    cls.add_method('DoReset', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3SupportedRates_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates() [constructor]
+def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates(ns3::SupportedRates const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SupportedRates const &', 'arg0')])
-    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::AddBssMembershipSelectorRate(uint64_t bs) [member function]
-    cls.add_method('AddBssMembershipSelectorRate', 
-                   'void', 
-                   [param('uint64_t', 'bs')])
-    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::AddSupportedRate(uint64_t bs) [member function]
-    cls.add_method('AddSupportedRate', 
-                   'void', 
-                   [param('uint64_t', 'bs')])
-    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## supported-rates.h (module 'wifi'): ns3::WifiInformationElementId ns3::SupportedRates::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::GetNRates() const [member function]
-    cls.add_method('GetNRates', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## supported-rates.h (module 'wifi'): uint32_t ns3::SupportedRates::GetRate(uint8_t i) const [member function]
-    cls.add_method('GetRate', 
-                   'uint32_t', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsBasicRate(uint64_t bs) const [member function]
-    cls.add_method('IsBasicRate', 
-                   'bool', 
-                   [param('uint64_t', 'bs')], 
-                   is_const=True)
-    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsBssMembershipSelectorRate(uint64_t bs) const [member function]
-    cls.add_method('IsBssMembershipSelectorRate', 
-                   'bool', 
-                   [param('uint64_t', 'bs')], 
-                   is_const=True)
-    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsSupportedRate(uint64_t bs) const [member function]
-    cls.add_method('IsSupportedRate', 
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    cls.add_method('operator()', 
                    'bool', 
-                   [param('uint64_t', 'bs')], 
-                   is_const=True)
-    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::SetBasicRate(uint64_t bs) [member function]
-    cls.add_method('SetBasicRate', 
-                   'void', 
-                   [param('uint64_t', 'bs')])
-    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::MAX_SUPPORTED_RATES [variable]
-    cls.add_static_attribute('MAX_SUPPORTED_RATES', 'uint8_t const', is_const=True)
-    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::extended [variable]
-    cls.add_instance_attribute('extended', 'ns3::ExtendedSupportedRatesIE', is_const=False)
+                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): ns3::ObjectBase * ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'ns3::ObjectBase *', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3TableBasedErrorRateModel_methods(root_module, cls):
-    ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel::TableBasedErrorRateModel(ns3::TableBasedErrorRateModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::TableBasedErrorRateModel const &', 'arg0')])
-    ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel::TableBasedErrorRateModel() [constructor]
+def register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## table-based-error-rate-model.h (module 'wifi'): double ns3::TableBasedErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint64_t nbits) const [member function]
-    cls.add_method('DoGetChunkSuccessRate', 
-                   'double', 
-                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits')], 
-                   is_const=True, is_virtual=True)
-    ## table-based-error-rate-model.h (module 'wifi'): static uint8_t ns3::TableBasedErrorRateModel::GetMcsForMode(ns3::WifiMode mode) [member function]
-    cls.add_method('GetMcsForMode', 
-                   'uint8_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_static=True)
-    ## table-based-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::TableBasedErrorRateModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0, short unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('ns3::WifiTxVector const &', 'arg0'), param('short unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppChannelConditionModel::ThreeGppChannelConditionModel() [constructor]
+def register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): int64_t ns3::ThreeGppChannelConditionModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::ThreeGppChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetChannelCondition', 
-                   'ns3::Ptr< ns3::ChannelCondition >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True)
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): static double ns3::ThreeGppChannelConditionModel::Calculate2dDistance(ns3::Vector const & a, ns3::Vector const & b) [member function]
-    cls.add_method('Calculate2dDistance', 
-                   'double', 
-                   [param('ns3::Vector const &', 'a'), param('ns3::Vector const &', 'b')], 
-                   is_static=True, visibility='protected')
-    ## channel-condition-model.h (module 'propagation'): void ns3::ThreeGppChannelConditionModel::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppChannelConditionModel::ComputePnlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePnlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppIndoorMixedOfficeChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppIndoorMixedOfficeChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppIndoorMixedOfficeChannelConditionModel::ThreeGppIndoorMixedOfficeChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppIndoorMixedOfficeChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppIndoorOfficePropagationLossModel_methods(root_module, cls):
-    ## three-gpp-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppIndoorOfficePropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## three-gpp-propagation-loss-model.h (module 'propagation'): ns3::ThreeGppIndoorOfficePropagationLossModel::ThreeGppIndoorOfficePropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetLossLos(double distance2D, double distance3D, double hUt, double hBs) const [member function]
-    cls.add_method('GetLossLos', 
-                   'double', 
-                   [param('double', 'distance2D'), param('double', 'distance3D'), param('double', 'hUt'), param('double', 'hBs')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetLossNlos(double distance2D, double distance3D, double hUt, double hBs) const [member function]
-    cls.add_method('GetLossNlos', 
-                   'double', 
-                   [param('double', 'distance2D'), param('double', 'distance3D'), param('double', 'hUt'), param('double', 'hBs')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetShadowingStd(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b, ns3::ChannelCondition::LosConditionValue cond) const [member function]
-    cls.add_method('GetShadowingStd', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b'), param('ns3::ChannelCondition::LosConditionValue', 'cond')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetShadowingCorrelationDistance(ns3::ChannelCondition::LosConditionValue cond) const [member function]
-    cls.add_method('GetShadowingCorrelationDistance', 
-                   'double', 
-                   [param('ns3::ChannelCondition::LosConditionValue', 'cond')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): short unsigned int ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'short unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppIndoorOpenOfficeChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppIndoorOpenOfficeChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Void_Bool_Unsigned_int_Double_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppIndoorOpenOfficeChannelConditionModel::ThreeGppIndoorOpenOfficeChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppIndoorOpenOfficeChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(bool arg0, unsigned int arg1, double arg2, ns3::Time arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('bool', 'arg0'), param('unsigned int', 'arg1'), param('double', 'arg2'), param('ns3::Time', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppRmaChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppRmaChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppRmaChannelConditionModel::ThreeGppRmaChannelConditionModel() [constructor]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiMacHeader const & arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Double_Double_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppRmaChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(double arg0, double arg1, ns3::Mac48Address arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('double', 'arg0'), param('double', 'arg1'), param('ns3::Mac48Address', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppUmaChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppUmaChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Void_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppUmaChannelConditionModel::ThreeGppUmaChannelConditionModel() [constructor]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(double arg0, double arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('double', 'arg0'), param('double', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppUmaChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(double arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('double', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppUmiStreetCanyonChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppUmiStreetCanyonChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Void_Int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppUmiStreetCanyonChannelConditionModel::ThreeGppUmiStreetCanyonChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppUmiStreetCanyonChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(int arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('int', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppV2vHighwayPropagationLossModel_methods(root_module, cls):
-    ## three-gpp-v2v-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppV2vHighwayPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Void_Ns3DataRate_Ns3DataRate_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## three-gpp-v2v-propagation-loss-model.h (module 'propagation'): ns3::ThreeGppV2vHighwayPropagationLossModel::ThreeGppV2vHighwayPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## three-gpp-v2v-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppV2vHighwayPropagationLossModel::GetLossLos(double distance2D, double distance3D, double hUt, double hBs) const [member function]
-    cls.add_method('GetLossLos', 
-                   'double', 
-                   [param('double', 'distance2D'), param('double', 'distance3D'), param('double', 'hUt'), param('double', 'hBs')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::DataRate arg0, ns3::DataRate arg1, ns3::Mac48Address arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::DataRate', 'arg0'), param('ns3::DataRate', 'arg1'), param('ns3::Mac48Address', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3TimeValue_methods(root_module, cls):
-    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3HeSigAParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::Time const & value) [constructor]
-    cls.add_constructor([param('ns3::Time const &', 'value')])
-    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::TimeValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::TimeValue const &', 'arg0')])
-    ## nstime.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TimeValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## nstime.h (module 'core'): bool ns3::TimeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## nstime.h (module 'core'): ns3::Time ns3::TimeValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Time', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): std::string ns3::TimeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## nstime.h (module 'core'): void ns3::TimeValue::Set(ns3::Time const & value) [member function]
-    cls.add_method('Set', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::HeSigAParameters arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Time const &', 'value')])
+                   [param('ns3::HeSigAParameters', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3TypeIdChecker_methods(root_module, cls):
-    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker(ns3::TypeIdChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::TypeIdChecker const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Mac48Address arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3TypeIdValue_methods(root_module, cls):
-    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Ptr__lt__const_ns3MobilityModel__gt___Double_Double_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeId const & value) [constructor]
-    cls.add_constructor([param('ns3::TypeId const &', 'value')])
-    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeIdValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::TypeIdValue const &', 'arg0')])
-    ## type-id.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TypeIdValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## type-id.h (module 'core'): bool ns3::TypeIdValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeIdValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::TypeId', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::MobilityModel const >, ns3::Ptr< ns3::MobilityModel const >, double, double, double, double, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## type-id.h (module 'core'): std::string ns3::TypeIdValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## type-id.h (module 'core'): void ns3::TypeIdValue::Set(ns3::TypeId const & value) [member function]
-    cls.add_method('Set', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::MobilityModel> arg0, ns3::Ptr<const ns3::MobilityModel> arg1, double arg2, double arg3, double arg4, double arg5) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::TypeId const &', 'value')])
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'arg0'), param('ns3::Ptr< ns3::MobilityModel const >', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4'), param('double', 'arg5')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3UintegerValue_methods(root_module, cls):
-    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(uint64_t const & value) [constructor]
-    cls.add_constructor([param('uint64_t const &', 'value')])
-    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(ns3::UintegerValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::UintegerValue const &', 'arg0')])
-    ## uinteger.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::UintegerValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## uinteger.h (module 'core'): bool ns3::UintegerValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## uinteger.h (module 'core'): uint64_t ns3::UintegerValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'uint64_t', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::MobilityModel const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## uinteger.h (module 'core'): std::string ns3::UintegerValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## uinteger.h (module 'core'): void ns3::UintegerValue::Set(uint64_t const & value) [member function]
-    cls.add_method('Set', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::MobilityModel> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint64_t const &', 'value')])
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3Vector2DChecker_methods(root_module, cls):
-    ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Double_Ns3WifiMode_Ns3WifiPreamble_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker(ns3::Vector2DChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Vector2DChecker const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, double arg1, ns3::WifiMode arg2, ns3::WifiPreamble arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('double', 'arg1'), param('ns3::WifiMode', 'arg2'), param('ns3::WifiPreamble', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3Vector2DValue_methods(root_module, cls):
-    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2D const & value) [constructor]
-    cls.add_constructor([param('ns3::Vector2D const &', 'value')])
-    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2DValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Vector2DValue const &', 'arg0')])
-    ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector2DValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## vector.h (module 'core'): bool ns3::Vector2DValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## vector.h (module 'core'): ns3::Vector2D ns3::Vector2DValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Vector2D', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vector.h (module 'core'): std::string ns3::Vector2DValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## vector.h (module 'core'): void ns3::Vector2DValue::Set(ns3::Vector2D const & value) [member function]
-    cls.add_method('Set', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, double arg1) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Vector2D const &', 'value')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('double', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3Vector3DChecker_methods(root_module, cls):
-    ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker(ns3::Vector3DChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Vector3DChecker const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::Mac48Address arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::Mac48Address', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3Vector3DValue_methods(root_module, cls):
-    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiMode_Ns3WifiPreamble_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3D const & value) [constructor]
-    cls.add_constructor([param('ns3::Vector3D const &', 'value')])
-    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3DValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Vector3DValue const &', 'arg0')])
-    ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector3DValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## vector.h (module 'core'): bool ns3::Vector3DValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## vector.h (module 'core'): ns3::Vector3D ns3::Vector3DValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Vector3D', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vector.h (module 'core'): std::string ns3::Vector3DValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## vector.h (module 'core'): void ns3::Vector3DValue::Set(ns3::Vector3D const & value) [member function]
-    cls.add_method('Set', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::WifiMode arg1, ns3::WifiPreamble arg2, unsigned char arg3) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Vector3D const &', 'value')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::WifiMode', 'arg1'), param('ns3::WifiPreamble', 'arg2'), param('unsigned char', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3VhtCapabilities_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities(ns3::VhtCapabilities const & arg0) [constructor]
-    cls.add_constructor([param('ns3::VhtCapabilities const &', 'arg0')])
-    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiPhyRxfailureReason_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## vht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtCapabilities::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetMaxAmpduLength() const [member function]
-    cls.add_method('GetMaxAmpduLength', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetMaxMpduLength() const [member function]
-    cls.add_method('GetMaxMpduLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxHighestSupportedLgiDataRate() const [member function]
-    cls.add_method('GetRxHighestSupportedLgiDataRate', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxLdpc() const [member function]
-    cls.add_method('GetRxLdpc', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxStbc() const [member function]
-    cls.add_method('GetRxStbc', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
-    cls.add_method('GetSupportedChannelWidthSet', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint64_t ns3::VhtCapabilities::GetSupportedMcsAndNssSet() const [member function]
-    cls.add_method('GetSupportedMcsAndNssSet', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetTxStbc() const [member function]
-    cls.add_method('GetTxStbc', 
-                   'uint8_t', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::WifiPhyRxfailureReason arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::WifiPhyRxfailureReason', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetVhtCapabilitiesInfo() const [member function]
-    cls.add_method('GetVhtCapabilitiesInfo', 
-                   'uint32_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedMcs(uint8_t mcs, uint8_t nss) const [member function]
-    cls.add_method('IsSupportedMcs', 
-                   'bool', 
-                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
-    cls.add_method('IsSupportedRxMcs', 
-                   'bool', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
-    cls.add_method('IsSupportedTxMcs', 
-                   'bool', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxAmpduLength(uint32_t maxAmpduLength) [member function]
-    cls.add_method('SetMaxAmpduLength', 
-                   'void', 
-                   [param('uint32_t', 'maxAmpduLength')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxMpduLength(uint16_t length) [member function]
-    cls.add_method('SetMaxMpduLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxHighestSupportedLgiDataRate(uint16_t supportedDatarate) [member function]
-    cls.add_method('SetRxHighestSupportedLgiDataRate', 
-                   'void', 
-                   [param('uint16_t', 'supportedDatarate')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxLdpc(uint8_t rxLdpc) [member function]
-    cls.add_method('SetRxLdpc', 
-                   'void', 
-                   [param('uint8_t', 'rxLdpc')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint8_t mcs, uint8_t nss) [member function]
-    cls.add_method('SetRxMcsMap', 
-                   'void', 
-                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxStbc(uint8_t rxStbc) [member function]
-    cls.add_method('SetRxStbc', 
-                   'void', 
-                   [param('uint8_t', 'rxStbc')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor160Mhz(uint8_t shortGuardInterval) [member function]
-    cls.add_method('SetShortGuardIntervalFor160Mhz', 
-                   'void', 
-                   [param('uint8_t', 'shortGuardInterval')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor80Mhz(uint8_t shortGuardInterval) [member function]
-    cls.add_method('SetShortGuardIntervalFor80Mhz', 
-                   'void', 
-                   [param('uint8_t', 'shortGuardInterval')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedChannelWidthSet(uint8_t channelWidthSet) [member function]
-    cls.add_method('SetSupportedChannelWidthSet', 
-                   'void', 
-                   [param('uint8_t', 'channelWidthSet')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedMcsAndNssSet(uint64_t ctrl) [member function]
-    cls.add_method('SetSupportedMcsAndNssSet', 
-                   'void', 
-                   [param('uint64_t', 'ctrl')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxHighestSupportedLgiDataRate(uint16_t supportedDatarate) [member function]
-    cls.add_method('SetTxHighestSupportedLgiDataRate', 
-                   'void', 
-                   [param('uint16_t', 'supportedDatarate')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint8_t mcs, uint8_t nss) [member function]
-    cls.add_method('SetTxMcsMap', 
-                   'void', 
-                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxStbc(uint8_t txStbc) [member function]
-    cls.add_method('SetTxStbc', 
-                   'void', 
-                   [param('uint8_t', 'txStbc')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtCapabilitiesInfo(uint32_t ctrl) [member function]
-    cls.add_method('SetVhtCapabilitiesInfo', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint32_t', 'ctrl')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtSupported(uint8_t vhtSupported) [member function]
-    cls.add_method('SetVhtSupported', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, std::map< std::pair< unsigned int, unsigned int >, double >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > > arg1) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint8_t', 'vhtSupported')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
     return
 
-def register_Ns3VhtOperation_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## vht-operation.h (module 'wifi'): ns3::VhtOperation::VhtOperation(ns3::VhtOperation const & arg0) [constructor]
-    cls.add_constructor([param('ns3::VhtOperation const &', 'arg0')])
-    ## vht-operation.h (module 'wifi'): ns3::VhtOperation::VhtOperation() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Ns3SignalNoiseDbm_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## vht-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtOperation::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## vht-operation.h (module 'wifi'): uint16_t ns3::VhtOperation::GetBasicVhtMcsAndNssSet() const [member function]
-    cls.add_method('GetBasicVhtMcsAndNssSet', 
-                   'uint16_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetChannelCenterFrequencySegment0() const [member function]
-    cls.add_method('GetChannelCenterFrequencySegment0', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, short unsigned int arg1, ns3::WifiTxVector arg2, ns3::MpduInfo arg3, ns3::SignalNoiseDbm arg4, short unsigned int arg5) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('short unsigned int', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('ns3::MpduInfo', 'arg3'), param('ns3::SignalNoiseDbm', 'arg4'), param('short unsigned int', 'arg5')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetChannelCenterFrequencySegment1() const [member function]
-    cls.add_method('GetChannelCenterFrequencySegment1', 
-                   'uint8_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, short unsigned int arg1, ns3::WifiTxVector arg2, ns3::MpduInfo arg3, short unsigned int arg4) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('short unsigned int', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('ns3::MpduInfo', 'arg3'), param('short unsigned int', 'arg4')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3QueueDiscItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::QueueDiscItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## vht-operation.h (module 'wifi'): uint16_t ns3::VhtOperation::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## vht-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::QueueDiscItem> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+                   [param('ns3::Ptr< ns3::QueueDiscItem const >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3SpectrumPhy__gt___Ns3Ptr__lt__const_ns3SpectrumPhy__gt___Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::SpectrumPhy const >, ns3::Ptr< ns3::SpectrumPhy const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetBasicVhtMcsAndNssSet(uint16_t basicVhtMcsAndNssSet) [member function]
-    cls.add_method('SetBasicVhtMcsAndNssSet', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::SpectrumPhy> arg0, ns3::Ptr<const ns3::SpectrumPhy> arg1, double arg2) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint16_t', 'basicVhtMcsAndNssSet')])
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetChannelCenterFrequencySegment0(uint8_t channelCenterFrequencySegment0) [member function]
-    cls.add_method('SetChannelCenterFrequencySegment0', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy const >', 'arg0'), param('ns3::Ptr< ns3::SpectrumPhy const >', 'arg1'), param('double', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::WifiMacQueueItem> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint8_t', 'channelCenterFrequencySegment0')])
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetChannelCenterFrequencySegment1(uint8_t channelCenterFrequencySegment1) [member function]
-    cls.add_method('SetChannelCenterFrequencySegment1', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::NetDevice> arg0, ns3::Ptr<const ns3::Packet> arg1, short unsigned int arg2, ns3::Address const & arg3, ns3::Address const & arg4, ns3::NetDevice::PacketType arg5) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint8_t', 'channelCenterFrequencySegment1')])
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetChannelWidth(uint8_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('short unsigned int', 'arg2'), param('ns3::Address const &', 'arg3'), param('ns3::Address const &', 'arg4'), param('ns3::NetDevice::PacketType', 'arg5')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::NetDevice> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint8_t', 'channelWidth')])
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetMaxVhtMcsPerNss(uint8_t nss, uint8_t maxVhtMcs) [member function]
-    cls.add_method('SetMaxVhtMcsPerNss', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3SpectrumSignalParameters__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::SpectrumSignalParameters >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::SpectrumSignalParameters> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint8_t', 'nss'), param('uint8_t', 'maxVhtMcs')])
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetVhtSupported(uint8_t vhtSupported) [member function]
-    cls.add_method('SetVhtSupported', 
+                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiMacQueueItem> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint8_t', 'vhtSupported')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3WifiMacQueue_methods(root_module, cls):
-    ## wifi-mac-queue.h (module 'wifi'): static ns3::TypeId ns3::WifiMacQueue::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::SetMaxDelay(ns3::Time delay) [member function]
-    cls.add_method('SetMaxDelay', 
-                   'void', 
-                   [param('ns3::Time', 'delay')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Time ns3::WifiMacQueue::GetMaxDelay() const [member function]
-    cls.add_method('GetMaxDelay', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Enqueue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('Enqueue', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
-                   is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::PushFront(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('PushFront', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Insert(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('Insert', 
-                   'bool', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Dequeue() [member function]
-    cls.add_method('Dequeue', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueByAddress(ns3::Mac48Address dest) [member function]
-    cls.add_method('DequeueByAddress', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Mac48Address', 'dest')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueByTid(uint8_t tid) [member function]
-    cls.add_method('DequeueByTid', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('uint8_t', 'tid')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueByTidAndAddress(uint8_t tid, ns3::Mac48Address dest) [member function]
-    cls.add_method('DequeueByTidAndAddress', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr) [member function]
-    cls.add_method('DequeueFirstAvailable', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Dequeue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
-    cls.add_method('Dequeue', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::Peek() const [member function]
-    cls.add_method('Peek', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByAddress(ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
-    cls.add_method('PeekByAddress', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
-                   is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTid(uint8_t tid, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
-    cls.add_method('PeekByTid', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('uint8_t', 'tid'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
-                   is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTidAndAddress(uint8_t tid, ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
-    cls.add_method('PeekByTidAndAddress', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
-                   is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
-    cls.add_method('PeekFirstAvailable', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
-                   is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Remove() [member function]
-    cls.add_method('Remove', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Remove(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('Remove', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::Remove(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, bool removeExpired=false) [member function]
-    cls.add_method('Remove', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('bool', 'removeExpired', default_value='false')])
-    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByAddress(ns3::Mac48Address dest) [member function]
-    cls.add_method('GetNPacketsByAddress', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'dest')])
-    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByTidAndAddress(uint8_t tid, ns3::Mac48Address dest) [member function]
-    cls.add_method('GetNPacketsByTidAndAddress', 
-                   'uint32_t', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')])
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::IsEmpty() [member function]
-    cls.add_method('IsEmpty', 
-                   'bool', 
-                   [])
-    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPackets() [member function]
-    cls.add_method('GetNPackets', 
-                   'uint32_t', 
-                   [])
-    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNBytes() [member function]
-    cls.add_method('GetNBytes', 
-                   'uint32_t', 
-                   [])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::EMPTY [variable]
-    cls.add_static_attribute('EMPTY', 'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator const', is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::WifiMacQueue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMacQueue const &', 'arg0')])
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('ns3::RxSignalInfo', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
     return
 
-def register_Ns3WifiModeChecker_methods(root_module, cls):
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker(ns3::WifiModeChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiModeChecker const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3WifiModeValue_methods(root_module, cls):
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiMode const & value) [constructor]
-    cls.add_constructor([param('ns3::WifiMode const &', 'value')])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiModeValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiModeValue const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::WifiModeValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-mode.h (module 'wifi'): bool ns3::WifiModeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiMode ns3::WifiModeValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::WifiMode', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Mac48Address arg1, unsigned char arg2, ns3::OriginatorBlockAckAgreement::State arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Time', 'arg0'), param('ns3::Mac48Address', 'arg1'), param('unsigned char', 'arg2'), param('ns3::OriginatorBlockAckAgreement::State', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): std::string ns3::WifiModeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## wifi-mode.h (module 'wifi'): void ns3::WifiModeValue::Set(ns3::WifiMode const & value) [member function]
-    cls.add_method('Set', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Time arg1, WifiPhyState arg2) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::WifiMode const &', 'value')])
+                   [param('ns3::Time', 'arg0'), param('ns3::Time', 'arg1'), param('WifiPhyState', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3WifiNetDevice_methods(root_module, cls):
-    ## wifi-net-device.h (module 'wifi'): static ns3::TypeId ns3::WifiNetDevice::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::WifiNetDevice::WifiNetDevice() [constructor]
-    cls.add_constructor([])
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')])
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')])
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const manager) [member function]
-    cls.add_method('SetRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'manager')])
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiNetDevice::GetMac() const [member function]
-    cls.add_method('GetMac', 
-                   'ns3::Ptr< ns3::WifiMac >', 
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiNetDevice::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Time arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Time', 'arg0'), param('ns3::Time', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiNetDevice::GetRemoteStationManager() const [member function]
-    cls.add_method('GetRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetHtConfiguration(ns3::Ptr<ns3::HtConfiguration> htConfiguration) [member function]
-    cls.add_method('SetHtConfiguration', 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Ptr< ns3::HtConfiguration >', 'htConfiguration')])
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiNetDevice::GetHtConfiguration() const [member function]
-    cls.add_method('GetHtConfiguration', 
-                   'ns3::Ptr< ns3::HtConfiguration >', 
+                   [param('ns3::Time', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetVhtConfiguration(ns3::Ptr<ns3::VhtConfiguration> vhtConfiguration) [member function]
-    cls.add_method('SetVhtConfiguration', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::VhtConfiguration >', 'vhtConfiguration')])
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiNetDevice::GetVhtConfiguration() const [member function]
-    cls.add_method('GetVhtConfiguration', 
-                   'ns3::Ptr< ns3::VhtConfiguration >', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetHeConfiguration(ns3::Ptr<ns3::HeConfiguration> heConfiguration) [member function]
-    cls.add_method('SetHeConfiguration', 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiMacDropReason arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Ptr< ns3::HeConfiguration >', 'heConfiguration')])
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiNetDevice::GetHeConfiguration() const [member function]
-    cls.add_method('GetHeConfiguration', 
-                   'ns3::Ptr< ns3::HeConfiguration >', 
+                   [param('ns3::WifiMacDropReason', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetIfIndex(uint32_t const index) [member function]
-    cls.add_method('SetIfIndex', 
-                   'void', 
-                   [param('uint32_t const', 'index')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): uint32_t ns3::WifiNetDevice::GetIfIndex() const [member function]
-    cls.add_method('GetIfIndex', 
-                   'uint32_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::WifiNetDevice::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::Channel >', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector arg0, ns3::Time arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::WifiTxVector', 'arg0'), param('ns3::Time', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetAddress(ns3::Address address) [member function]
-    cls.add_method('SetAddress', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Address', 'address')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Address', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::SetMtu(uint16_t const mtu) [member function]
-    cls.add_method('SetMtu', 
-                   'bool', 
-                   [param('uint16_t const', 'mtu')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): uint16_t ns3::WifiNetDevice::GetMtu() const [member function]
-    cls.add_method('GetMtu', 
-                   'uint16_t', 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsLinkUp() const [member function]
-    cls.add_method('IsLinkUp', 
-                   'bool', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('AddLinkChangeCallback', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > > arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsBroadcast() const [member function]
-    cls.add_method('IsBroadcast', 
-                   'bool', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'arg0'), param('ns3::WifiTxVector', 'arg1'), param('double', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Double_Bool_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetBroadcast() const [member function]
-    cls.add_method('GetBroadcast', 
-                   'ns3::Address', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsMulticast() const [member function]
-    cls.add_method('IsMulticast', 
-                   'bool', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, double arg1, bool arg2, double arg3, double arg4) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('double', 'arg1'), param('bool', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
-    cls.add_method('GetMulticast', 
-                   'ns3::Address', 
-                   [param('ns3::Ipv4Address', 'multicastGroup')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsPointToPoint() const [member function]
-    cls.add_method('IsPointToPoint', 
-                   'bool', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsBridge() const [member function]
-    cls.add_method('IsBridge', 
-                   'bool', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
-    cls.add_method('Send', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::Node> ns3::WifiNetDevice::GetNode() const [member function]
-    cls.add_method('GetNode', 
-                   'ns3::Ptr< ns3::Node >', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetNode(ns3::Ptr<ns3::Node> const node) [member function]
-    cls.add_method('SetNode', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiPsdu> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node > const', 'node')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::NeedsArp() const [member function]
-    cls.add_method('NeedsArp', 
-                   'bool', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiPsdu const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetReceiveCallback(ns3::NetDevice::ReceiveCallback cb) [member function]
-    cls.add_method('SetReceiveCallback', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * arg2, long unsigned int arg3) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
-    cls.add_method('GetMulticast', 
-                   'ns3::Address', 
-                   [param('ns3::Ipv6Address', 'addr')], 
+                   [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
-    cls.add_method('SendFrom', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetPromiscReceiveCallback(ns3::NetDevice::PromiscReceiveCallback cb) [member function]
-    cls.add_method('SetPromiscReceiveCallback', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned int arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
+                   [param('unsigned int', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned int arg0, unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
                    'void', 
+                   [param('unsigned int', 'arg0'), param('unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
-    cls.add_method('ForwardUp', 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(long unsigned int arg0, long unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
-                   visibility='protected')
+                   [param('long unsigned int', 'arg0'), param('long unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3WifiRadioEnergyModel_methods(root_module, cls):
-    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel(ns3::WifiRadioEnergyModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiRadioEnergyModel const &', 'arg0')])
-    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel() [constructor]
+def register_Ns3CallbackImpl__Void_Unsigned_short_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::ChangeState(int newState) [member function]
-    cls.add_method('ChangeState', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, ns3::Mac48Address arg1) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('int', 'newState')], 
+                   [param('short unsigned int', 'arg0'), param('ns3::Mac48Address', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3DsssPhy_methods(root_module, cls):
+    ## dsss-phy.h (module 'wifi'): ns3::DsssPhy::DsssPhy(ns3::DsssPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DsssPhy const &', 'arg0')])
+    ## dsss-phy.h (module 'wifi'): ns3::DsssPhy::DsssPhy() [constructor]
+    cls.add_constructor([])
+    ## dsss-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::DsssPhy::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
                    is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetCcaBusyCurrentA() const [member function]
-    cls.add_method('GetCcaBusyCurrentA', 
-                   'double', 
+    ## dsss-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::DsssPhy::GetCodeRate(std::string const & name) [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('std::string const &', 'name')], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static uint16_t ns3::DsssPhy::GetConstellationSize(std::string const & name) [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint16_t', 
+                   [param('std::string const &', 'name')], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static uint64_t ns3::DsssPhy::GetDataRate(std::string const & name, ns3::WifiModulationClass modClass, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [param('std::string const &', 'name'), param('ns3::WifiModulationClass', 'modClass'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static uint64_t ns3::DsssPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetDataRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static ns3::WifiMode ns3::DsssPhy::GetDsssRate(uint64_t rate) [member function]
+    cls.add_method('GetDsssRate', 
+                   'ns3::WifiMode', 
+                   [param('uint64_t', 'rate')], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static ns3::WifiMode ns3::DsssPhy::GetDsssRate11Mbps() [member function]
+    cls.add_method('GetDsssRate11Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): WifiPhyState ns3::WifiRadioEnergyModel::GetCurrentState() const [member function]
-    cls.add_method('GetCurrentState', 
-                   'WifiPhyState', 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static ns3::WifiMode ns3::DsssPhy::GetDsssRate1Mbps() [member function]
+    cls.add_method('GetDsssRate1Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetIdleCurrentA() const [member function]
-    cls.add_method('GetIdleCurrentA', 
-                   'double', 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static ns3::WifiMode ns3::DsssPhy::GetDsssRate2Mbps() [member function]
+    cls.add_method('GetDsssRate2Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): ns3::Time ns3::WifiRadioEnergyModel::GetMaximumTimeInState(int state) const [member function]
-    cls.add_method('GetMaximumTimeInState', 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static ns3::WifiMode ns3::DsssPhy::GetDsssRate5_5Mbps() [member function]
+    cls.add_method('GetDsssRate5_5Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): ns3::Time ns3::DsssPhy::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
                    'ns3::Time', 
-                   [param('int', 'state')], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener * ns3::WifiRadioEnergyModel::GetPhyListener() [member function]
-    cls.add_method('GetPhyListener', 
-                   'ns3::WifiRadioEnergyModelPhyListener *', 
-                   [])
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetRxCurrentA() const [member function]
-    cls.add_method('GetRxCurrentA', 
-                   'double', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-phy.h (module 'wifi'): uint32_t ns3::DsssPhy::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetSleepCurrentA() const [member function]
-    cls.add_method('GetSleepCurrentA', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## dsss-phy.h (module 'wifi'): ns3::Time ns3::DsssPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) const [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-phy.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::DsssPhy::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
                    [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetSwitchingCurrentA() const [member function]
-    cls.add_method('GetSwitchingCurrentA', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## dsss-phy.h (module 'wifi'): ns3::WifiMode ns3::DsssPhy::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-phy.h (module 'wifi'): static void ns3::DsssPhy::InitializeModes() [member function]
+    cls.add_method('InitializeModes', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetTotalEnergyConsumption() const [member function]
-    cls.add_method('GetTotalEnergyConsumption', 
-                   'double', 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static bool ns3::DsssPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsModeAllowed', 
+                   'bool', 
+                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::DsssPhy::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='private')
+    ## dsss-phy.h (module 'wifi'): uint16_t ns3::DsssPhy::GetRxChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetRxChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## dsss-phy.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::DsssPhy::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ErpOfdmPpdu_methods(root_module, cls):
+    ## erp-ofdm-ppdu.h (module 'wifi'): ns3::ErpOfdmPpdu::ErpOfdmPpdu(ns3::ErpOfdmPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ErpOfdmPpdu const &', 'arg0')])
+    ## erp-ofdm-ppdu.h (module 'wifi'): ns3::ErpOfdmPpdu::ErpOfdmPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid')])
+    ## erp-ofdm-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::ErpOfdmPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetTxCurrentA() const [member function]
-    cls.add_method('GetTxCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): static ns3::TypeId ns3::WifiRadioEnergyModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## erp-ofdm-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::ErpOfdmPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
-                   is_static=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyChanged() [member function]
-    cls.add_method('HandleEnergyChanged', 
-                   'void', 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3HePpdu_methods(root_module, cls):
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HePpdu(ns3::HePpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HePpdu const &', 'arg0')])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HePpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid')])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HePpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid, ns3::HePpdu::TxPsdFlag flag) [constructor]
+    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid'), param('ns3::HePpdu::TxPsdFlag', 'flag')])
+    ## he-ppdu.h (module 'wifi'): bool ns3::HePpdu::CanBeReceived(uint16_t txCenterFreq, uint16_t p20MinFreq, uint16_t p20MaxFreq) const [member function]
+    cls.add_method('CanBeReceived', 
+                   'bool', 
+                   [param('uint16_t', 'txCenterFreq'), param('uint16_t', 'p20MinFreq'), param('uint16_t', 'p20MaxFreq')], 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::HePpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyDepletion() [member function]
-    cls.add_method('HandleEnergyDepletion', 
-                   'void', 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::HePpdu::GetPsdu(uint8_t bssColor, uint16_t staId=65535) const [member function]
+    cls.add_method('GetPsdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
+                   [param('uint8_t', 'bssColor'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): uint16_t ns3::HePpdu::GetStaId() const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
                    [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyRecharged() [member function]
-    cls.add_method('HandleEnergyRecharged', 
-                   'void', 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): uint16_t ns3::HePpdu::GetTransmissionChannelWidth() const [member function]
+    cls.add_method('GetTransmissionChannelWidth', 
+                   'uint16_t', 
                    [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetCcaBusyCurrentA(double ccaBusyCurrentA) [member function]
-    cls.add_method('SetCcaBusyCurrentA', 
-                   'void', 
-                   [param('double', 'ccaBusyCurrentA')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergyDepletionCallback(ns3::WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback callback) [member function]
-    cls.add_method('SetEnergyDepletionCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergyRechargedCallback(ns3::WifiRadioEnergyModel::WifiRadioEnergyRechargedCallback callback) [member function]
-    cls.add_method('SetEnergyRechargedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> const source) [member function]
-    cls.add_method('SetEnergySource', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::EnergySource > const', 'source')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetIdleCurrentA(double idleCurrentA) [member function]
-    cls.add_method('SetIdleCurrentA', 
-                   'void', 
-                   [param('double', 'idleCurrentA')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetRxCurrentA(double rxCurrentA) [member function]
-    cls.add_method('SetRxCurrentA', 
-                   'void', 
-                   [param('double', 'rxCurrentA')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetSleepCurrentA(double sleepCurrentA) [member function]
-    cls.add_method('SetSleepCurrentA', 
-                   'void', 
-                   [param('double', 'sleepCurrentA')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetSwitchingCurrentA(double switchingCurrentA) [member function]
-    cls.add_method('SetSwitchingCurrentA', 
-                   'void', 
-                   [param('double', 'switchingCurrentA')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentA(double txCurrentA) [member function]
-    cls.add_method('SetTxCurrentA', 
-                   'void', 
-                   [param('double', 'txCurrentA')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentFromModel(double txPowerDbm) [member function]
-    cls.add_method('SetTxCurrentFromModel', 
-                   'void', 
-                   [param('double', 'txPowerDbm')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentModel(ns3::Ptr<ns3::WifiTxCurrentModel> const model) [member function]
-    cls.add_method('SetTxCurrentModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiTxCurrentModel > const', 'model')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): ns3::Time ns3::HePpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::TxPsdFlag ns3::HePpdu::GetTxPsdFlag() const [member function]
+    cls.add_method('GetTxPsdFlag', 
+                   'ns3::HePpdu::TxPsdFlag', 
+                   [], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): ns3::WifiPpduType ns3::HePpdu::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::WifiPpduType', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::SetTxPsdFlag(ns3::HePpdu::TxPsdFlag flag) [member function]
+    cls.add_method('SetTxPsdFlag', 
                    'void', 
+                   [param('ns3::HePpdu::TxPsdFlag', 'flag')])
+    ## he-ppdu.h (module 'wifi'): bool ns3::HePpdu::IsDlMu() const [member function]
+    cls.add_method('IsDlMu', 
+                   'bool', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::DoGetCurrentA() const [member function]
-    cls.add_method('DoGetCurrentA', 
-                   'double', 
+                   is_const=True, visibility='protected')
+    ## he-ppdu.h (module 'wifi'): bool ns3::HePpdu::IsMu() const [member function]
+    cls.add_method('IsMu', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## he-ppdu.h (module 'wifi'): bool ns3::HePpdu::IsUlMu() const [member function]
+    cls.add_method('IsUlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## he-ppdu.h (module 'wifi'): std::string ns3::HePpdu::PrintPayload() const [member function]
+    cls.add_method('PrintPayload', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::HePpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
                    is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3YansErrorRateModel_methods(root_module, cls):
-    ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel::YansErrorRateModel(ns3::YansErrorRateModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::YansErrorRateModel const &', 'arg0')])
-    ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel::YansErrorRateModel() [constructor]
+def register_Ns3HePpduHeSigHeader_methods(root_module, cls):
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HeSigHeader::HeSigHeader(ns3::HePpdu::HeSigHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HePpdu::HeSigHeader const &', 'arg0')])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HeSigHeader::HeSigHeader() [constructor]
     cls.add_constructor([])
-    ## yans-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::YansErrorRateModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
+    ## he-ppdu.h (module 'wifi'): uint32_t ns3::HePpdu::HeSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): uint8_t ns3::HePpdu::HeSigHeader::GetBssColor() const [member function]
+    cls.add_method('GetBssColor', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): uint16_t ns3::HePpdu::HeSigHeader::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): uint16_t ns3::HePpdu::HeSigHeader::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): ns3::TypeId ns3::HePpdu::HeSigHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## yans-error-rate-model.h (module 'wifi'): double ns3::YansErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint64_t nbits) const [member function]
-    cls.add_method('DoGetChunkSuccessRate', 
-                   'double', 
-                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3YansWifiChannel_methods(root_module, cls):
-    ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel::YansWifiChannel(ns3::YansWifiChannel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::YansWifiChannel const &', 'arg0')])
-    ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel::YansWifiChannel() [constructor]
-    cls.add_constructor([])
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Add(ns3::Ptr<ns3::YansWifiPhy> phy) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'phy')])
-    ## yans-wifi-channel.h (module 'wifi'): int64_t ns3::YansWifiChannel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## yans-wifi-channel.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::YansWifiChannel::GetDevice(std::size_t i) const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [param('std::size_t', 'i')], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-channel.h (module 'wifi'): std::size_t ns3::YansWifiChannel::GetNDevices() const [member function]
-    cls.add_method('GetNDevices', 
-                   'std::size_t', 
+    ## he-ppdu.h (module 'wifi'): uint8_t ns3::HePpdu::HeSigHeader::GetMcs() const [member function]
+    cls.add_method('GetMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): uint8_t ns3::HePpdu::HeSigHeader::GetNStreams() const [member function]
+    cls.add_method('GetNStreams', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): uint32_t ns3::HePpdu::HeSigHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-channel.h (module 'wifi'): static ns3::TypeId ns3::YansWifiChannel::GetTypeId() [member function]
+    ## he-ppdu.h (module 'wifi'): static ns3::TypeId ns3::HePpdu::HeSigHeader::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<const ns3::WifiPpdu> ppdu, double txPowerDbm) const [member function]
-    cls.add_method('Send', 
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('double', 'txPowerDbm')], 
-                   is_const=True)
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> const delay) [member function]
-    cls.add_method('SetPropagationDelayModel', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::PropagationDelayModel > const', 'delay')])
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> const loss) [member function]
-    cls.add_method('SetPropagationLossModel', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::SetBssColor(uint8_t bssColor) [member function]
+    cls.add_method('SetBssColor', 
                    'void', 
-                   [param('ns3::Ptr< ns3::PropagationLossModel > const', 'loss')])
-    return
-
-def register_Ns3AddressChecker_methods(root_module, cls):
-    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
-    cls.add_constructor([])
-    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker(ns3::AddressChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AddressChecker const &', 'arg0')])
+                   [param('uint8_t', 'bssColor')])
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')])
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::SetGuardIntervalAndLtfSize(uint16_t gi, uint8_t ltf) [member function]
+    cls.add_method('SetGuardIntervalAndLtfSize', 
+                   'void', 
+                   [param('uint16_t', 'gi'), param('uint8_t', 'ltf')])
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::SetMcs(uint8_t mcs) [member function]
+    cls.add_method('SetMcs', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::SetMuFlag(bool mu) [member function]
+    cls.add_method('SetMuFlag', 
+                   'void', 
+                   [param('bool', 'mu')])
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::SetNStreams(uint8_t nStreams) [member function]
+    cls.add_method('SetNStreams', 
+                   'void', 
+                   [param('uint8_t', 'nStreams')])
     return
 
-def register_Ns3AddressValue_methods(root_module, cls):
-    ## address.h (module 'network'): ns3::AddressValue::AddressValue() [constructor]
+def register_Ns3HtFrameExchangeManager_methods(root_module, cls):
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::HtFrameExchangeManager::HtFrameExchangeManager(ns3::HtFrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtFrameExchangeManager const &', 'arg0')])
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::HtFrameExchangeManager::HtFrameExchangeManager() [constructor]
     cls.add_constructor([])
-    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::Address const & value) [constructor]
-    cls.add_constructor([param('ns3::Address const &', 'value')])
-    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::AddressValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AddressValue const &', 'arg0')])
-    ## address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::AddressValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::CalculateAcknowledgmentTime(ns3::WifiAcknowledgment * acknowledgment) const [member function]
+    cls.add_method('CalculateAcknowledgmentTime', 
+                   'void', 
+                   [param('ns3::WifiAcknowledgment *', 'acknowledgment')], 
                    is_const=True, is_virtual=True)
-    ## address.h (module 'network'): bool ns3::AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::CreateBlockAckAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address originator, uint16_t startingSeq) [member function]
+    cls.add_method('CreateBlockAckAgreement', 
+                   'void', 
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'originator'), param('uint16_t', 'startingSeq')])
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::DestroyBlockAckAgreement(ns3::Mac48Address originator, uint8_t tid) [member function]
+    cls.add_method('DestroyBlockAckAgreement', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')])
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::GetBaAgreementEstablished(ns3::Mac48Address originator, uint8_t tid) const [member function]
+    cls.add_method('GetBaAgreementEstablished', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## address.h (module 'network'): ns3::Address ns3::AddressValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Address', 
+                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::BlockAckType ns3::HtFrameExchangeManager::GetBlockAckType(ns3::Mac48Address originator, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::MpduAggregator> ns3::HtFrameExchangeManager::GetMpduAggregator() const [member function]
+    cls.add_method('GetMpduAggregator', 
+                   'ns3::Ptr< ns3::MpduAggregator >', 
                    [], 
                    is_const=True)
-    ## address.h (module 'network'): std::string ns3::AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::MsduAggregator> ns3::HtFrameExchangeManager::GetMsduAggregator() const [member function]
+    cls.add_method('GetMsduAggregator', 
+                   'ns3::Ptr< ns3::MsduAggregator >', 
+                   [], 
+                   is_const=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): uint16_t ns3::HtFrameExchangeManager::GetSupportedBaBufferSize() const [member function]
+    cls.add_method('GetSupportedBaBufferSize', 
+                   'uint16_t', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## address.h (module 'network'): void ns3::AddressValue::Set(ns3::Address const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::Address const &', 'value')])
-    return
-
-def register_Ns3AdhocWifiMac_methods(root_module, cls):
-    ## adhoc-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::AdhocWifiMac::GetTypeId() [member function]
+    ## ht-frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::HtFrameExchangeManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): ns3::AdhocWifiMac::AdhocWifiMac() [constructor]
-    cls.add_constructor([])
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::IsWithinAmpduSizeLimit(uint32_t ampduSize, ns3::Mac48Address receiver, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('IsWithinAmpduSizeLimit', 
+                   'bool', 
+                   [param('uint32_t', 'ampduSize'), param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True, is_virtual=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::IsWithinLimitsIfAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams, ns3::Time ppduDurationLimit) const [member function]
+    cls.add_method('IsWithinLimitsIfAddMpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Time', 'ppduDurationLimit')], 
+                   is_const=True, is_virtual=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::IsWithinLimitsIfAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams, ns3::Time ppduDurationLimit) const [member function]
+    cls.add_method('IsWithinLimitsIfAggregateMsdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Time', 'ppduDurationLimit')], 
+                   is_const=True, is_virtual=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendAddBaResponse(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address originator) [member function]
+    cls.add_method('SendAddBaResponse', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_virtual=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'originator')])
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
                    is_virtual=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::StartFrameExchange(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('StartFrameExchange', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
                    is_virtual=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime) const [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime')], 
+                   is_const=True, is_virtual=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::BlockAckTimeout(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('BlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::CtsTimeout(ns3::Ptr<ns3::WifiMacQueueItem> rts, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('CtsTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'rts'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::DequeueMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DequeueMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::DequeuePsdu(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('DequeuePsdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')], 
+                   visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    cls.add_method('EndReceiveAmpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::ForwardMpduDown(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector & txVector) [member function]
+    cls.add_method('ForwardMpduDown', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::ForwardPsduDown(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector & txVector) [member function]
+    cls.add_method('ForwardPsduDown', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::BlockAckManager> ns3::HtFrameExchangeManager::GetBaManager(uint8_t tid) const [member function]
+    cls.add_method('GetBaManager', 
+                   'ns3::Ptr< ns3::BlockAckManager >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::HtFrameExchangeManager::GetPsduDurationId(ns3::Time txDuration, ns3::WifiTxParameters const & txParams) const [member function]
+    cls.add_method('GetPsduDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::Time', 'txDuration'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPsdu> ns3::HtFrameExchangeManager::GetWifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetWifiPsdu', 
+                   'ns3::Ptr< ns3::WifiPsdu >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::MissedBlockAck(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, bool & resetCw) [member function]
+    cls.add_method('MissedBlockAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('bool &', 'resetCw')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::NeedSetupBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('NeedSetupBlockAck', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::NotifyPacketDiscarded(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyPacketDiscarded', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::NotifyReceivedNormalAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyReceivedNormalAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::NotifyTxToEdca(ns3::Ptr<const ns3::WifiPsdu> psdu) const [member function]
+    cls.add_method('NotifyTxToEdca', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::ReceiveMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector const & txVector, bool inAmpdu) [member function]
+    cls.add_method('ReceiveMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::RetransmitMpduAfterMissedCts(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedCts', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendAddBaRequest(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq, uint16_t timeout, bool immediateBAck) [member function]
+    cls.add_method('SendAddBaRequest', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq'), param('uint16_t', 'timeout'), param('bool', 'immediateBAck')], 
+                   visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendBlockAck(ns3::RecipientBlockAckAgreement const & agreement, ns3::Time durationId, ns3::WifiTxVector & blockAckTxVector, double rxSnr) [member function]
+    cls.add_method('SendBlockAck', 
+                   'void', 
+                   [param('ns3::RecipientBlockAckAgreement const &', 'agreement'), param('ns3::Time', 'durationId'), param('ns3::WifiTxVector &', 'blockAckTxVector'), param('double', 'rxSnr')], 
+                   visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::SendDataFrame(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('SendDataFrame', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
+    cls.add_method('SendDelbaFrame', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')], 
+                   visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::SendMpduFromBaManager(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('SendMpduFromBaManager', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendPsduWithProtection(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiTxParameters & txParams) [member function]
+    cls.add_method('SendPsduWithProtection', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiTxParameters &', 'txParams')], 
+                   visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::TransmissionSucceeded() [member function]
+    cls.add_method('TransmissionSucceeded', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
-def register_Ns3AlwaysLosChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::AlwaysLosChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3HtPpdu_methods(root_module, cls):
+    ## ht-ppdu.h (module 'wifi'): ns3::HtPpdu::HtPpdu(ns3::HtPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtPpdu const &', 'arg0')])
+    ## ht-ppdu.h (module 'wifi'): ns3::HtPpdu::HtPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid')])
+    ## ht-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::HtPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
-                   is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::AlwaysLosChannelConditionModel::AlwaysLosChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::AlwaysLosChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetChannelCondition', 
-                   'ns3::Ptr< ns3::ChannelCondition >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
                    is_const=True, is_virtual=True)
-    ## channel-condition-model.h (module 'propagation'): int64_t ns3::AlwaysLosChannelConditionModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): ns3::Time ns3::HtPpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::HtPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3BinaryErrorModel_methods(root_module, cls):
-    ## error-model.h (module 'network'): ns3::BinaryErrorModel::BinaryErrorModel(ns3::BinaryErrorModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BinaryErrorModel const &', 'arg0')])
-    ## error-model.h (module 'network'): ns3::BinaryErrorModel::BinaryErrorModel() [constructor]
+def register_Ns3HtPpduHtSigHeader_methods(root_module, cls):
+    ## ht-ppdu.h (module 'wifi'): ns3::HtPpdu::HtSigHeader::HtSigHeader(ns3::HtPpdu::HtSigHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtPpdu::HtSigHeader const &', 'arg0')])
+    ## ht-ppdu.h (module 'wifi'): ns3::HtPpdu::HtSigHeader::HtSigHeader() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): static ns3::TypeId ns3::BinaryErrorModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
+    ## ht-ppdu.h (module 'wifi'): uint32_t ns3::HtPpdu::HtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): bool ns3::HtPpdu::HtSigHeader::GetAggregation() const [member function]
+    cls.add_method('GetAggregation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ht-ppdu.h (module 'wifi'): uint16_t ns3::HtPpdu::HtSigHeader::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-ppdu.h (module 'wifi'): uint16_t ns3::HtPpdu::HtSigHeader::GetHtLength() const [member function]
+    cls.add_method('GetHtLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-ppdu.h (module 'wifi'): ns3::TypeId ns3::HtPpdu::HtSigHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## error-model.h (module 'network'): bool ns3::BinaryErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorrupt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): void ns3::BinaryErrorModel::DoReset() [member function]
-    cls.add_method('DoReset', 
-                   'void', 
+                   is_const=True, is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): uint8_t ns3::HtPpdu::HtSigHeader::GetMcs() const [member function]
+    cls.add_method('GetMcs', 
+                   'uint8_t', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3BurstErrorModel_methods(root_module, cls):
-    ## error-model.h (module 'network'): ns3::BurstErrorModel::BurstErrorModel(ns3::BurstErrorModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BurstErrorModel const &', 'arg0')])
-    ## error-model.h (module 'network'): ns3::BurstErrorModel::BurstErrorModel() [constructor]
-    cls.add_constructor([])
-    ## error-model.h (module 'network'): int64_t ns3::BurstErrorModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## error-model.h (module 'network'): double ns3::BurstErrorModel::GetBurstRate() const [member function]
-    cls.add_method('GetBurstRate', 
-                   'double', 
+                   is_const=True)
+    ## ht-ppdu.h (module 'wifi'): uint32_t ns3::HtPpdu::HtSigHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): bool ns3::HtPpdu::HtSigHeader::GetShortGuardInterval() const [member function]
+    cls.add_method('GetShortGuardInterval', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## error-model.h (module 'network'): static ns3::TypeId ns3::BurstErrorModel::GetTypeId() [member function]
+    ## ht-ppdu.h (module 'wifi'): static ns3::TypeId ns3::HtPpdu::HtSigHeader::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetBurstRate(double rate) [member function]
-    cls.add_method('SetBurstRate', 
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('double', 'rate')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> burstSz) [member function]
-    cls.add_method('SetRandomBurstSize', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'burstSz')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> ranVar) [member function]
-    cls.add_method('SetRandomVariable', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::SetAggregation(bool aggregation) [member function]
+    cls.add_method('SetAggregation', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'ranVar')])
-    ## error-model.h (module 'network'): bool ns3::BurstErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorrupt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::DoReset() [member function]
-    cls.add_method('DoReset', 
+                   [param('bool', 'aggregation')])
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
+                   [param('uint16_t', 'channelWidth')])
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::SetHtLength(uint16_t length) [member function]
+    cls.add_method('SetHtLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::SetMcs(uint8_t mcs) [member function]
+    cls.add_method('SetMcs', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::SetShortGuardInterval(bool sgi) [member function]
+    cls.add_method('SetShortGuardInterval', 
+                   'void', 
+                   [param('bool', 'sgi')])
     return
 
-def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+def register_Ns3OfdmPhy_methods(root_module, cls):
+    ## ofdm-phy.h (module 'wifi'): ns3::OfdmPhy::OfdmPhy(ns3::OfdmPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::OfdmPhy const &', 'arg0')])
+    ## ofdm-phy.h (module 'wifi'): ns3::OfdmPhy::OfdmPhy(ns3::OfdmPhyVariant variant=::ns3::OfdmPhyVariant::OFDM_PHY_DEFAULT, bool buildModeList=true) [constructor]
+    cls.add_constructor([param('ns3::OfdmPhyVariant', 'variant', default_value='::ns3::OfdmPhyVariant::OFDM_PHY_DEFAULT'), param('bool', 'buildModeList', default_value='true')])
+    ## ofdm-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::OfdmPhy::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
+                   is_virtual=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::OfdmPhy::GetCodeRate(std::string const & name) [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('std::string const &', 'name')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static uint16_t ns3::OfdmPhy::GetConstellationSize(std::string const & name) [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint16_t', 
+                   [param('std::string const &', 'name')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetDataRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetDataRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): ns3::Time ns3::OfdmPhy::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate(uint64_t rate, uint16_t bw=20) [member function]
+    cls.add_method('GetOfdmRate', 
+                   'ns3::WifiMode', 
+                   [param('uint64_t', 'rate'), param('uint16_t', 'bw', default_value='20')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate12Mbps() [member function]
+    cls.add_method('GetOfdmRate12Mbps', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate12MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): ns3::ObjectBase * ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
-    cls.add_method('operator()', 
-                   'ns3::ObjectBase *', 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate12MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
+                   'ns3::WifiMode', 
                    [], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Bool_Unsigned_int_Double_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate18Mbps() [member function]
+    cls.add_method('GetOfdmRate18Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(bool arg0, unsigned int arg1, double arg2, ns3::Time arg3) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('bool', 'arg0'), param('unsigned int', 'arg1'), param('double', 'arg2'), param('ns3::Time', 'arg3')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate18MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate24Mbps() [member function]
+    cls.add_method('GetOfdmRate24Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate24MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate27MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate36Mbps() [member function]
+    cls.add_method('GetOfdmRate36Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate3MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate3MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate48Mbps() [member function]
+    cls.add_method('GetOfdmRate48Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate54Mbps() [member function]
+    cls.add_method('GetOfdmRate54Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate6Mbps() [member function]
+    cls.add_method('GetOfdmRate6Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate6MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiMacHeader const & arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Double_Double_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate6MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate9Mbps() [member function]
+    cls.add_method('GetOfdmRate9Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(double arg0, double arg1, ns3::Mac48Address arg2) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('ns3::Mac48Address', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate9MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate9MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
+                   'ns3::WifiMode', 
                    [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): ns3::Time ns3::OfdmPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) const [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(double arg0, double arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('double', 'arg0'), param('double', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetPhyRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetPhyRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::OfdmPhy::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(double arg0) [member operator]
-    cls.add_method('operator()', 
+    ## ofdm-phy.h (module 'wifi'): ns3::WifiMode ns3::OfdmPhy::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## ofdm-phy.h (module 'wifi'): static void ns3::OfdmPhy::InitializeModes() [member function]
+    cls.add_method('InitializeModes', 
                    'void', 
-                   [param('double', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static bool ns3::OfdmPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsModeAllowed', 
+                   'bool', 
+                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::CalculateDataRate(ns3::WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('CalculateDataRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'codeRate'), param('uint16_t', 'constellationSize'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::CalculateDataRate(double symbolDuration, uint16_t guardInterval, uint16_t usableSubCarriers, uint16_t numberOfBitsPerSubcarrier, double codingRate) [member function]
+    cls.add_method('CalculateDataRate', 
+                   'uint64_t', 
+                   [param('double', 'symbolDuration'), param('uint16_t', 'guardInterval'), param('uint16_t', 'usableSubCarriers'), param('uint16_t', 'numberOfBitsPerSubcarrier'), param('double', 'codingRate')], 
+                   is_static=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::CalculatePhyRate(ns3::WifiCodeRate codeRate, uint64_t dataRate) [member function]
+    cls.add_method('CalculatePhyRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'codeRate'), param('uint64_t', 'dataRate')], 
+                   is_static=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::OfdmPhy::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::OfdmPhy::EndReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceiveHeader', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): static double ns3::OfdmPhy::GetCodeRatio(ns3::WifiCodeRate codeRate) [member function]
+    cls.add_method('GetCodeRatio', 
+                   'double', 
+                   [param('uint16_t', 'codeRate')], 
+                   is_static=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::Time ns3::OfdmPhy::GetHeaderDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetHeaderDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::WifiMode ns3::OfdmPhy::GetHeaderMode(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): uint32_t ns3::OfdmPhy::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(int arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('int', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): uint8_t ns3::OfdmPhy::GetNumberServiceBits() const [member function]
+    cls.add_method('GetNumberServiceBits', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::Time ns3::OfdmPhy::GetPreambleDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetPreambleDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::Time ns3::OfdmPhy::GetSignalExtension(ns3::WifiPhyBand band) const [member function]
+    cls.add_method('GetSignalExtension', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPhyBand', 'band')], 
+                   is_const=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::OfdmPhy::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): bool ns3::OfdmPhy::IsAllConfigSupported(ns3::WifiPpduField field, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsAllConfigSupported', 
+                   'bool', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): bool ns3::OfdmPhy::IsChannelWidthSupported(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsChannelWidthSupported', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     return
 
-def register_Ns3CallbackImpl__Void_Ns3DataRate_Ns3DataRate_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+def register_Ns3ProbabilisticV2vHighwayChannelConditionModel_methods(root_module, cls):
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ProbabilisticV2vHighwayChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::DataRate arg0, ns3::DataRate arg1, ns3::Mac48Address arg2) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::DataRate', 'arg0'), param('ns3::DataRate', 'arg1'), param('ns3::Mac48Address', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vHighwayChannelConditionModel::ProbabilisticV2vHighwayChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vHighwayChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vHighwayChannelConditionModel::ComputePnlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePnlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3CallbackImpl__Void_Ns3HePreambleParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+def register_Ns3ProbabilisticV2vUrbanChannelConditionModel_methods(root_module, cls):
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ProbabilisticV2vUrbanChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::HePreambleParameters arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::HePreambleParameters', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vUrbanChannelConditionModel::ProbabilisticV2vUrbanChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vUrbanChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vUrbanChannelConditionModel::ComputePnlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePnlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+def register_Ns3QueueDiscItem_methods(root_module, cls):
+    ## queue-item.h (module 'network'): ns3::QueueDiscItem::QueueDiscItem(ns3::Ptr<ns3::Packet> p, ns3::Address const & addr, uint16_t protocol) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Address const &', 'addr'), param('uint16_t', 'protocol')])
+    ## queue-item.h (module 'network'): ns3::Address ns3::QueueDiscItem::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
                    [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## queue-item.h (module 'network'): uint16_t ns3::QueueDiscItem::GetProtocol() const [member function]
+    cls.add_method('GetProtocol', 
+                   'uint16_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Mac48Address arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Ptr__lt__const_ns3MobilityModel__gt___Double_Double_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::MobilityModel const >, ns3::Ptr< ns3::MobilityModel const >, double, double, double, double, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## queue-item.h (module 'network'): uint8_t ns3::QueueDiscItem::GetTxQueueIndex() const [member function]
+    cls.add_method('GetTxQueueIndex', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::SetTxQueueIndex(uint8_t txq) [member function]
+    cls.add_method('SetTxQueueIndex', 
+                   'void', 
+                   [param('uint8_t', 'txq')])
+    ## queue-item.h (module 'network'): ns3::Time ns3::QueueDiscItem::GetTimeStamp() const [member function]
+    cls.add_method('GetTimeStamp', 
+                   'ns3::Time', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::MobilityModel> arg0, ns3::Ptr<const ns3::MobilityModel> arg1, double arg2, double arg3, double arg4, double arg5) [member operator]
-    cls.add_method('operator()', 
+                   is_const=True)
+    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::SetTimeStamp(ns3::Time t) [member function]
+    cls.add_method('SetTimeStamp', 
+                   'void', 
+                   [param('ns3::Time', 't')])
+    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::AddHeader() [member function]
+    cls.add_method('AddHeader', 
                    'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'arg0'), param('ns3::Ptr< ns3::MobilityModel const >', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4'), param('double', 'arg5')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::MobilityModel const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
                    [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## queue-item.h (module 'network'): bool ns3::QueueDiscItem::Mark() [member function]
+    cls.add_method('Mark', 
+                   'bool', 
                    [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue-item.h (module 'network'): uint32_t ns3::QueueDiscItem::Hash(uint32_t perturbation=0) const [member function]
+    cls.add_method('Hash', 
+                   'uint32_t', 
+                   [param('uint32_t', 'perturbation', default_value='0')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::MobilityModel> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Double_Ns3WifiMode_Ns3WifiPreamble_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3VhtFrameExchangeManager_methods(root_module, cls):
+    ## vht-frame-exchange-manager.h (module 'wifi'): ns3::VhtFrameExchangeManager::VhtFrameExchangeManager(ns3::VhtFrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::VhtFrameExchangeManager const &', 'arg0')])
+    ## vht-frame-exchange-manager.h (module 'wifi'): ns3::VhtFrameExchangeManager::VhtFrameExchangeManager() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+    ## vht-frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::VhtFrameExchangeManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, double arg1, ns3::WifiMode arg2, ns3::WifiPreamble arg3) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('double', 'arg1'), param('ns3::WifiMode', 'arg2'), param('ns3::WifiPreamble', 'arg3')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    ## vht-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPsdu> ns3::VhtFrameExchangeManager::GetWifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetWifiPsdu', 
+                   'ns3::Ptr< ns3::WifiPsdu >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
+def register_Ns3ErpOfdmPhy_methods(root_module, cls):
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::ErpOfdmPhy::ErpOfdmPhy(ns3::ErpOfdmPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ErpOfdmPhy const &', 'arg0')])
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::ErpOfdmPhy::ErpOfdmPhy() [constructor]
+    cls.add_constructor([])
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::ErpOfdmPhy::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
+                   is_virtual=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::ErpOfdmPhy::GetCodeRate(std::string const & name) [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('std::string const &', 'name')], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## erp-ofdm-phy.h (module 'wifi'): static uint16_t ns3::ErpOfdmPhy::GetConstellationSize(std::string const & name) [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint16_t', 
+                   [param('std::string const &', 'name')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetDataRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetDataRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate(uint64_t rate) [member function]
+    cls.add_method('GetErpOfdmRate', 
+                   'ns3::WifiMode', 
+                   [param('uint64_t', 'rate')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate12Mbps() [member function]
+    cls.add_method('GetErpOfdmRate12Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, double arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('double', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate18Mbps() [member function]
+    cls.add_method('GetErpOfdmRate18Mbps', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate24Mbps() [member function]
+    cls.add_method('GetErpOfdmRate24Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::Mac48Address arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::Mac48Address', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiMode_Ns3WifiPreamble_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate36Mbps() [member function]
+    cls.add_method('GetErpOfdmRate36Mbps', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate48Mbps() [member function]
+    cls.add_method('GetErpOfdmRate48Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::WifiMode arg1, ns3::WifiPreamble arg2, unsigned char arg3) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::WifiMode', 'arg1'), param('ns3::WifiPreamble', 'arg2'), param('unsigned char', 'arg3')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiPhyRxfailureReason_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate54Mbps() [member function]
+    cls.add_method('GetErpOfdmRate54Mbps', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate6Mbps() [member function]
+    cls.add_method('GetErpOfdmRate6Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::WifiPhyRxfailureReason arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::WifiPhyRxfailureReason', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate9Mbps() [member function]
+    cls.add_method('GetErpOfdmRate9Mbps', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## erp-ofdm-phy.h (module 'wifi'): uint32_t ns3::ErpOfdmPhy::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0) [member operator]
-    cls.add_method('operator()', 
+    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetPhyRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetPhyRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static void ns3::ErpOfdmPhy::InitializeModes() [member function]
+    cls.add_method('InitializeModes', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+                   [], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static bool ns3::ErpOfdmPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsModeAllowed', 
+                   'bool', 
+                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::Time ns3::ErpOfdmPhy::GetHeaderDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetHeaderDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::WifiMode ns3::ErpOfdmPhy::GetHeaderMode(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::Time ns3::ErpOfdmPhy::GetPreambleDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetPreambleDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3HeFrameExchangeManager_methods(root_module, cls):
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::HeFrameExchangeManager::HeFrameExchangeManager(ns3::HeFrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeFrameExchangeManager const &', 'arg0')])
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::HeFrameExchangeManager::HeFrameExchangeManager() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, std::map< std::pair< unsigned int, unsigned int >, double >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::CalculateAcknowledgmentTime(ns3::WifiAcknowledgment * acknowledgment) const [member function]
+    cls.add_method('CalculateAcknowledgmentTime', 
+                   'void', 
+                   [param('ns3::WifiAcknowledgment *', 'acknowledgment')], 
+                   is_const=True, is_virtual=True)
+    ## he-frame-exchange-manager.h (module 'wifi'): static ns3::Ptr<ns3::WifiPsdu> ns3::HeFrameExchangeManager::GetPsduTo(ns3::Mac48Address to, ns3::WifiPsduMap const & psduMap) [member function]
+    cls.add_method('GetPsduTo', 
+                   'ns3::Ptr< ns3::WifiPsdu >', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiPsduMap const &', 'psduMap')], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## he-frame-exchange-manager.h (module 'wifi'): uint16_t ns3::HeFrameExchangeManager::GetSupportedBaBufferSize() const [member function]
+    cls.add_method('GetSupportedBaBufferSize', 
+                   'uint16_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > > arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    cls.add_copy_constructor()
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Ns3SignalNoiseDbm_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+    ## he-frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::HeFrameExchangeManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SetMultiUserScheduler(ns3::Ptr<ns3::MultiUserScheduler> const muScheduler) [member function]
+    cls.add_method('SetMultiUserScheduler', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MultiUserScheduler > const', 'muScheduler')])
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SetTargetRssi(ns3::CtrlTriggerHeader & trigger) const [member function]
+    cls.add_method('SetTargetRssi', 
+                   'void', 
+                   [param('ns3::CtrlTriggerHeader &', 'trigger')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, short unsigned int arg1, ns3::WifiTxVector arg2, ns3::MpduInfo arg3, ns3::SignalNoiseDbm arg4, short unsigned int arg5) [member operator]
-    cls.add_method('operator()', 
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## he-frame-exchange-manager.h (module 'wifi'): bool ns3::HeFrameExchangeManager::StartFrameExchange(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('StartFrameExchange', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
+                   is_virtual=True)
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::BlockAckAfterTbPpduTimeout(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('BlockAckAfterTbPpduTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::BlockAcksInTbPpduTimeout(ns3::WifiPsduMap * psduMap, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * staMissedBlockAckFrom, std::size_t nSolicitedStations) [member function]
+    cls.add_method('BlockAcksInTbPpduTimeout', 
+                   'void', 
+                   [param('ns3::WifiPsduMap *', 'psduMap'), param('std::set< ns3::Mac48Address > const *', 'staMissedBlockAckFrom'), param('std::size_t', 'nSolicitedStations')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    cls.add_method('EndReceiveAmpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::ForwardPsduMapDown(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector & txVector) [member function]
+    cls.add_method('ForwardPsduMapDown', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector &', 'txVector')], 
+                   visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::WifiTxVector ns3::HeFrameExchangeManager::GetHeTbTxVector(ns3::CtrlTriggerHeader trigger, ns3::Mac48Address triggerSender) const [member function]
+    cls.add_method('GetHeTbTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::CtrlTriggerHeader', 'trigger'), param('ns3::Mac48Address', 'triggerSender')], 
+                   is_const=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::HeFrameExchangeManager::GetTxDuration(uint32_t ppduPayloadSize, ns3::Mac48Address receiver, ns3::WifiTxParameters const & txParams) const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'ppduPayloadSize'), param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::HeFrameExchangeManager::PrepareMuBar(ns3::WifiTxVector const & responseTxVector, std::map<unsigned short, ns3::CtrlBAckRequestHeader, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::CtrlBAckRequestHeader> > > recipients) const [member function]
+    cls.add_method('PrepareMuBar', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('ns3::WifiTxVector const &', 'responseTxVector'), param('std::map< unsigned short, ns3::CtrlBAckRequestHeader >', 'recipients')], 
+                   is_const=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::ReceiveMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector const & txVector, bool inAmpdu) [member function]
+    cls.add_method('ReceiveMpdu', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('short unsigned int', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('ns3::MpduInfo', 'arg3'), param('ns3::SignalNoiseDbm', 'arg4'), param('short unsigned int', 'arg5')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): bool ns3::HeFrameExchangeManager::SendMpduFromBaManager(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('SendMpduFromBaManager', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SendMultiStaBlockAck(ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('SendMultiStaBlockAck', 
+                   'void', 
+                   [param('ns3::WifiTxParameters const &', 'txParams')], 
+                   visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SendPsduMapWithProtection(ns3::WifiPsduMap psduMap, ns3::WifiTxParameters & txParams) [member function]
+    cls.add_method('SendPsduMapWithProtection', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'psduMap'), param('ns3::WifiTxParameters &', 'txParams')], 
+                   visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SendQosNullFramesInTbPpdu(ns3::CtrlTriggerHeader const & trigger, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('SendQosNullFramesInTbPpdu', 
+                   'void', 
+                   [param('ns3::CtrlTriggerHeader const &', 'trigger'), param('ns3::WifiMacHeader const &', 'hdr')], 
+                   visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::TbPpduTimeout(ns3::WifiPsduMap * psduMap, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * staMissedTbPpduFrom, std::size_t nSolicitedStations) [member function]
+    cls.add_method('TbPpduTimeout', 
+                   'void', 
+                   [param('ns3::WifiPsduMap *', 'psduMap'), param('std::set< ns3::Mac48Address > const *', 'staMissedTbPpduFrom'), param('std::size_t', 'nSolicitedStations')], 
+                   is_virtual=True, visibility='protected')
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+def register_Ns3HtPhy_methods(root_module, cls):
+    ## ht-phy.h (module 'wifi'): ns3::HtPhy::HtPhy(ns3::HtPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtPhy const &', 'arg0')])
+    ## ht-phy.h (module 'wifi'): ns3::HtPhy::HtPhy(uint8_t maxNss=1, bool buildModeList=true) [constructor]
+    cls.add_constructor([param('uint8_t', 'maxNss', default_value='1'), param('bool', 'buildModeList', default_value='true')])
+    ## ht-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::HtPhy::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
+                   is_virtual=True)
+    ## ht-phy.h (module 'wifi'): uint8_t ns3::HtPhy::GetBssMembershipSelector() const [member function]
+    cls.add_method('GetBssMembershipSelector', 
+                   'uint8_t', 
                    [], 
+                   is_const=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::HtPhy::GetCodeRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('uint8_t', 'mcsValue')], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
+    ## ht-phy.h (module 'wifi'): static uint16_t ns3::HtPhy::GetConstellationSize(uint8_t mcsValue) [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint16_t', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::GetDataRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetDataRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): ns3::Time ns3::HtPhy::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, short unsigned int arg1, ns3::WifiTxVector arg2, ns3::MpduInfo arg3, short unsigned int arg4) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('short unsigned int', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('ns3::MpduInfo', 'arg3'), param('short unsigned int', 'arg4')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3QueueDiscItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::QueueDiscItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::HtPhy::GetHtCodeRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetHtCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static uint16_t ns3::HtPhy::GetHtConstellationSize(uint8_t mcsValue) [member function]
+    cls.add_method('GetHtConstellationSize', 
+                   'uint16_t', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs(uint8_t index) [member function]
+    cls.add_method('GetHtMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs0() [member function]
+    cls.add_method('GetHtMcs0', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs1() [member function]
+    cls.add_method('GetHtMcs1', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::QueueDiscItem> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::QueueDiscItem const >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3SpectrumPhy__gt___Ns3Ptr__lt__const_ns3SpectrumPhy__gt___Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::SpectrumPhy const >, ns3::Ptr< ns3::SpectrumPhy const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs10() [member function]
+    cls.add_method('GetHtMcs10', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs11() [member function]
+    cls.add_method('GetHtMcs11', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::SpectrumPhy> arg0, ns3::Ptr<const ns3::SpectrumPhy> arg1, double arg2) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumPhy const >', 'arg0'), param('ns3::Ptr< ns3::SpectrumPhy const >', 'arg1'), param('double', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs12() [member function]
+    cls.add_method('GetHtMcs12', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs13() [member function]
+    cls.add_method('GetHtMcs13', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::WifiMacQueueItem> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs14() [member function]
+    cls.add_method('GetHtMcs14', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs15() [member function]
+    cls.add_method('GetHtMcs15', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::NetDevice> arg0, ns3::Ptr<const ns3::Packet> arg1, short unsigned int arg2, ns3::Address const & arg3, ns3::Address const & arg4, ns3::NetDevice::PacketType arg5) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('short unsigned int', 'arg2'), param('ns3::Address const &', 'arg3'), param('ns3::Address const &', 'arg4'), param('ns3::NetDevice::PacketType', 'arg5')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs16() [member function]
+    cls.add_method('GetHtMcs16', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs17() [member function]
+    cls.add_method('GetHtMcs17', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::NetDevice> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3SpectrumSignalParameters__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::SpectrumSignalParameters >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs18() [member function]
+    cls.add_method('GetHtMcs18', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs19() [member function]
+    cls.add_method('GetHtMcs19', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::SpectrumSignalParameters> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs2() [member function]
+    cls.add_method('GetHtMcs2', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs20() [member function]
+    cls.add_method('GetHtMcs20', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiMacQueueItem> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Double_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs21() [member function]
+    cls.add_method('GetHtMcs21', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs22() [member function]
+    cls.add_method('GetHtMcs22', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, double arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('double', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    cls.add_copy_constructor()
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs23() [member function]
+    cls.add_method('GetHtMcs23', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs24() [member function]
+    cls.add_method('GetHtMcs24', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs25() [member function]
+    cls.add_method('GetHtMcs25', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs26() [member function]
+    cls.add_method('GetHtMcs26', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Mac48Address arg1, unsigned char arg2, ns3::OriginatorBlockAckAgreement::State arg3) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Time', 'arg0'), param('ns3::Mac48Address', 'arg1'), param('unsigned char', 'arg2'), param('ns3::OriginatorBlockAckAgreement::State', 'arg3')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs27() [member function]
+    cls.add_method('GetHtMcs27', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs28() [member function]
+    cls.add_method('GetHtMcs28', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Time arg1, WifiPhyState arg2) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Time', 'arg0'), param('ns3::Time', 'arg1'), param('WifiPhyState', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs29() [member function]
+    cls.add_method('GetHtMcs29', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs3() [member function]
+    cls.add_method('GetHtMcs3', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Time arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Time', 'arg0'), param('ns3::Time', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs30() [member function]
+    cls.add_method('GetHtMcs30', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs31() [member function]
+    cls.add_method('GetHtMcs31', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Time', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs4() [member function]
+    cls.add_method('GetHtMcs4', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs5() [member function]
+    cls.add_method('GetHtMcs5', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector arg0, ns3::Time arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::WifiTxVector', 'arg0'), param('ns3::Time', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs6() [member function]
+    cls.add_method('GetHtMcs6', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs7() [member function]
+    cls.add_method('GetHtMcs7', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
-    cls.add_method('operator()', 
-                   'void', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs8() [member function]
+    cls.add_method('GetHtMcs8', 
+                   'ns3::WifiMode', 
                    [], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs9() [member function]
+    cls.add_method('GetHtMcs9', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): ns3::Time ns3::HtPhy::GetHtSigDuration() const [member function]
+    cls.add_method('GetHtSigDuration', 
+                   'ns3::Time', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > > arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'arg0'), param('ns3::WifiTxVector', 'arg1'), param('double', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    cls.add_copy_constructor()
-    return
-
-def register_Ns3CallbackImpl__Void_Unsigned_char_Double_Bool_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): ns3::WifiMode ns3::HtPhy::GetHtSigMode() const [member function]
+    cls.add_method('GetHtSigMode', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, double arg1, bool arg2, double arg3, double arg4) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('unsigned char', 'arg0'), param('double', 'arg1'), param('bool', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): ns3::Time ns3::HtPhy::GetLSigDuration(ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetLSigDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True, is_virtual=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetLSigMode() [member function]
+    cls.add_method('GetLSigMode', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): uint8_t ns3::HtPhy::GetMaxSupportedMcsIndexPerSs() const [member function]
+    cls.add_method('GetMaxSupportedMcsIndexPerSs', 
+                   'uint8_t', 
                    [], 
+                   is_const=True)
+    ## ht-phy.h (module 'wifi'): ns3::WifiMode ns3::HtPhy::GetMcs(uint8_t index) const [member function]
+    cls.add_method('GetMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned int arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('unsigned int', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::GetNonHtReferenceRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetNonHtReferenceRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue')], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): ns3::Time ns3::HtPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) const [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True)
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::GetPhyRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetPhyRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::HtPhy::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-phy.h (module 'wifi'): ns3::WifiMode ns3::HtPhy::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## ht-phy.h (module 'wifi'): ns3::Time ns3::HtPhy::GetTrainingDuration(ns3::WifiTxVector const & txVector, uint8_t nDataLtf, uint8_t nExtensionLtf=0) const [member function]
+    cls.add_method('GetTrainingDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint8_t', 'nDataLtf'), param('uint8_t', 'nExtensionLtf', default_value='0')], 
+                   is_const=True, is_virtual=True)
+    ## ht-phy.h (module 'wifi'): bool ns3::HtPhy::HandlesMcsModes() const [member function]
+    cls.add_method('HandlesMcsModes', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned int arg0, unsigned int arg1) [member operator]
-    cls.add_method('operator()', 
+    ## ht-phy.h (module 'wifi'): static void ns3::HtPhy::InitializeModes() [member function]
+    cls.add_method('InitializeModes', 
                    'void', 
-                   [param('unsigned int', 'arg0'), param('unsigned int', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
+    ## ht-phy.h (module 'wifi'): bool ns3::HtPhy::IsMcsSupported(uint8_t index) const [member function]
+    cls.add_method('IsMcsSupported', 
+                   'bool', 
+                   [param('uint8_t', 'index')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned long long, unsigned long long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(long unsigned int arg0, long unsigned int arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('long unsigned int', 'arg0'), param('long unsigned int', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3InfrastructureWifiMac_methods(root_module, cls):
-    ## infrastructure-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::InfrastructureWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
+    ## ht-phy.h (module 'wifi'): static bool ns3::HtPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsModeAllowed', 
+                   'bool', 
+                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_static=True)
-    ## infrastructure-wifi-mac.h (module 'wifi'): ns3::InfrastructureWifiMac::InfrastructureWifiMac() [constructor]
-    cls.add_constructor([])
-    ## infrastructure-wifi-mac.h (module 'wifi'): void ns3::InfrastructureWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## infrastructure-wifi-mac.h (module 'wifi'): void ns3::InfrastructureWifiMac::SetQosSupported(bool enable) [member function]
-    cls.add_method('SetQosSupported', 
+    ## ht-phy.h (module 'wifi'): void ns3::HtPhy::SetMaxSupportedMcsIndexPerSs(uint8_t maxIndex) [member function]
+    cls.add_method('SetMaxSupportedMcsIndexPerSs', 
                    'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True)
-    ## infrastructure-wifi-mac.h (module 'wifi'): void ns3::InfrastructureWifiMac::SetPcfSupported(bool enable) [member function]
-    cls.add_method('SetPcfSupported', 
+                   [param('uint8_t', 'maxIndex')])
+    ## ht-phy.h (module 'wifi'): void ns3::HtPhy::SetMaxSupportedNss(uint8_t maxNss) [member function]
+    cls.add_method('SetMaxSupportedNss', 
+                   'void', 
+                   [param('uint8_t', 'maxNss')])
+    ## ht-phy.h (module 'wifi'): void ns3::HtPhy::BuildModeList() [member function]
+    cls.add_method('BuildModeList', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## infrastructure-wifi-mac.h (module 'wifi'): bool ns3::InfrastructureWifiMac::GetPcfSupported() const [member function]
-    cls.add_method('GetPcfSupported', 
-                   'bool', 
                    [], 
-                   is_const=True)
+                   is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::CalculateDataRate(double symbolDuration, uint16_t guardInterval, uint16_t usableSubCarriers, uint16_t numberOfBitsPerSubcarrier, double codingRate, uint8_t nss) [member function]
+    cls.add_method('CalculateDataRate', 
+                   'uint64_t', 
+                   [param('double', 'symbolDuration'), param('uint16_t', 'guardInterval'), param('uint16_t', 'usableSubCarriers'), param('uint16_t', 'numberOfBitsPerSubcarrier'), param('double', 'codingRate'), param('uint8_t', 'nss')], 
+                   is_static=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::CalculateNonHtReferenceRate(ns3::WifiCodeRate codeRate, uint16_t constellationSize) [member function]
+    cls.add_method('CalculateNonHtReferenceRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'codeRate'), param('uint16_t', 'constellationSize')], 
+                   is_static=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::CalculatePhyRate(ns3::WifiCodeRate codeRate, uint64_t dataRate) [member function]
+    cls.add_method('CalculatePhyRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'codeRate'), param('uint64_t', 'dataRate')], 
+                   is_static=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::HtPhy::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): static double ns3::HtPhy::GetCodeRatio(ns3::WifiCodeRate codeRate) [member function]
+    cls.add_method('GetCodeRatio', 
+                   'double', 
+                   [param('uint16_t', 'codeRate')], 
+                   is_static=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): uint32_t ns3::HtPhy::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): uint8_t ns3::HtPhy::GetNumberBccEncoders(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetNumberBccEncoders', 
+                   'uint8_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): ns3::Time ns3::HtPhy::GetSymbolDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSymbolDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::HtPhy::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): static uint16_t ns3::HtPhy::GetUsableSubcarriers(uint16_t channelWidth) [member function]
+    cls.add_method('GetUsableSubcarriers', 
+                   'uint16_t', 
+                   [param('uint16_t', 'channelWidth')], 
+                   is_static=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): bool ns3::HtPhy::IsAllConfigSupported(ns3::WifiPpduField field, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsAllConfigSupported', 
+                   'bool', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): bool ns3::HtPhy::IsConfigSupported(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsConfigSupported', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     return
 
-def register_Ns3ProbabilisticV2vHighwayChannelConditionModel_methods(root_module, cls):
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ProbabilisticV2vHighwayChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3VhtPhy_methods(root_module, cls):
+    ## vht-phy.h (module 'wifi'): ns3::VhtPhy::VhtPhy(ns3::VhtPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::VhtPhy const &', 'arg0')])
+    ## vht-phy.h (module 'wifi'): ns3::VhtPhy::VhtPhy(bool buildModeList=true) [constructor]
+    cls.add_constructor([param('bool', 'buildModeList', default_value='true')])
+    ## vht-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::VhtPhy::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
+                   is_virtual=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::VhtPhy::GetCodeRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static uint16_t ns3::VhtPhy::GetConstellationSize(uint8_t mcsValue) [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint16_t', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static uint64_t ns3::VhtPhy::GetDataRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static uint64_t ns3::VhtPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetDataRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): ns3::Time ns3::VhtPhy::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::Time ns3::VhtPhy::GetLSigDuration(ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetLSigDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): static uint64_t ns3::VhtPhy::GetNonHtReferenceRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetNonHtReferenceRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static uint64_t ns3::VhtPhy::GetPhyRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static uint64_t ns3::VhtPhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetPhyRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::VhtPhy::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::Time ns3::VhtPhy::GetSigADuration(ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetSigADuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::WifiMode ns3::VhtPhy::GetSigAMode() const [member function]
+    cls.add_method('GetSigAMode', 
+                   'ns3::WifiMode', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::Time ns3::VhtPhy::GetSigBDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigBDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::WifiMode ns3::VhtPhy::GetSigBMode(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigBMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::WifiMode ns3::VhtPhy::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::Time ns3::VhtPhy::GetTrainingDuration(ns3::WifiTxVector const & txVector, uint8_t nDataLtf, uint8_t nExtensionLtf=0) const [member function]
+    cls.add_method('GetTrainingDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint8_t', 'nDataLtf'), param('uint8_t', 'nExtensionLtf', default_value='0')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs(uint8_t index) [member function]
+    cls.add_method('GetVhtMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
                    is_static=True)
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vHighwayChannelConditionModel::ProbabilisticV2vHighwayChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vHighwayChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vHighwayChannelConditionModel::ComputePnlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePnlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3ProbabilisticV2vUrbanChannelConditionModel_methods(root_module, cls):
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ProbabilisticV2vUrbanChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs0() [member function]
+    cls.add_method('GetVhtMcs0', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vUrbanChannelConditionModel::ProbabilisticV2vUrbanChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vUrbanChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vUrbanChannelConditionModel::ComputePnlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePnlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3QueueDiscItem_methods(root_module, cls):
-    ## queue-item.h (module 'network'): ns3::QueueDiscItem::QueueDiscItem(ns3::Ptr<ns3::Packet> p, ns3::Address const & addr, uint16_t protocol) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Address const &', 'addr'), param('uint16_t', 'protocol')])
-    ## queue-item.h (module 'network'): ns3::Address ns3::QueueDiscItem::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Address', 
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs1() [member function]
+    cls.add_method('GetVhtMcs1', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## queue-item.h (module 'network'): uint16_t ns3::QueueDiscItem::GetProtocol() const [member function]
-    cls.add_method('GetProtocol', 
-                   'uint16_t', 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs2() [member function]
+    cls.add_method('GetVhtMcs2', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## queue-item.h (module 'network'): uint8_t ns3::QueueDiscItem::GetTxQueueIndex() const [member function]
-    cls.add_method('GetTxQueueIndex', 
-                   'uint8_t', 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs3() [member function]
+    cls.add_method('GetVhtMcs3', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::SetTxQueueIndex(uint8_t txq) [member function]
-    cls.add_method('SetTxQueueIndex', 
-                   'void', 
-                   [param('uint8_t', 'txq')])
-    ## queue-item.h (module 'network'): ns3::Time ns3::QueueDiscItem::GetTimeStamp() const [member function]
-    cls.add_method('GetTimeStamp', 
-                   'ns3::Time', 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs4() [member function]
+    cls.add_method('GetVhtMcs4', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::SetTimeStamp(ns3::Time t) [member function]
-    cls.add_method('SetTimeStamp', 
-                   'void', 
-                   [param('ns3::Time', 't')])
-    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::AddHeader() [member function]
-    cls.add_method('AddHeader', 
-                   'void', 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs5() [member function]
+    cls.add_method('GetVhtMcs5', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## queue-item.h (module 'network'): bool ns3::QueueDiscItem::Mark() [member function]
-    cls.add_method('Mark', 
-                   'bool', 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs6() [member function]
+    cls.add_method('GetVhtMcs6', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue-item.h (module 'network'): uint32_t ns3::QueueDiscItem::Hash(uint32_t perturbation=0) const [member function]
-    cls.add_method('Hash', 
-                   'uint32_t', 
-                   [param('uint32_t', 'perturbation', default_value='0')], 
-                   is_const=True, is_virtual=True)
-    return
-
-def register_Ns3StaWifiMac_methods(root_module, cls):
-    ## sta-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::StaWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs7() [member function]
+    cls.add_method('GetVhtMcs7', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## sta-wifi-mac.h (module 'wifi'): ns3::StaWifiMac::StaWifiMac() [constructor]
-    cls.add_constructor([])
-    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
-                   is_virtual=True)
-    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_virtual=True)
-    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetWifiPhy', 
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs8() [member function]
+    cls.add_method('GetVhtMcs8', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs9() [member function]
+    cls.add_method('GetVhtMcs9', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static void ns3::VhtPhy::InitializeModes() [member function]
+    cls.add_method('InitializeModes', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## sta-wifi-mac.h (module 'wifi'): bool ns3::StaWifiMac::IsAssociated() const [member function]
-    cls.add_method('IsAssociated', 
+                   [], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static bool ns3::VhtPhy::IsModeAllowed(uint8_t mcsValue, uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsModeAllowed', 
                    'bool', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static uint64_t ns3::VhtPhy::CalculateNonHtReferenceRate(ns3::WifiCodeRate codeRate, uint16_t constellationSize) [member function]
+    cls.add_method('CalculateNonHtReferenceRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'codeRate'), param('uint16_t', 'constellationSize')], 
+                   is_static=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::VhtPhy::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::VhtPhy::EndReceiveSigA(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceiveSigA', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::VhtPhy::EndReceiveSigB(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceiveSigB', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::Time ns3::VhtPhy::GetHtSigDuration() const [member function]
+    cls.add_method('GetHtSigDuration', 
+                   'ns3::Time', 
                    [], 
-                   is_const=True)
-    ## sta-wifi-mac.h (module 'wifi'): uint16_t ns3::StaWifiMac::GetAssociationId() const [member function]
-    cls.add_method('GetAssociationId', 
-                   'uint16_t', 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::WifiMode ns3::VhtPhy::GetHtSigMode() const [member function]
+    cls.add_method('GetHtSigMode', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): uint32_t ns3::VhtPhy::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): uint8_t ns3::VhtPhy::GetNumberBccEncoders(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetNumberBccEncoders', 
+                   'uint8_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): static uint16_t ns3::VhtPhy::GetUsableSubcarriers(uint16_t channelWidth) [member function]
+    cls.add_method('GetUsableSubcarriers', 
+                   'uint16_t', 
+                   [param('uint16_t', 'channelWidth')], 
+                   is_static=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): bool ns3::VhtPhy::IsAllConfigSupported(ns3::WifiPpduField field, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsAllConfigSupported', 
+                   'bool', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::VhtPhy::ProcessSigA(ns3::Ptr<ns3::Event> event, ns3::PhyEntity::PhyFieldRxStatus status) [member function]
+    cls.add_method('ProcessSigA', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::PhyEntity::PhyFieldRxStatus', 'status')], 
+                   is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::VhtPhy::ProcessSigB(ns3::Ptr<ns3::Event> event, ns3::PhyEntity::PhyFieldRxStatus status) [member function]
+    cls.add_method('ProcessSigB', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::PhyEntity::PhyFieldRxStatus', 'status')], 
+                   is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): void ns3::VhtPhy::BuildModeList() [member function]
+    cls.add_method('BuildModeList', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3ApWifiMac_methods(root_module, cls):
-    ## ap-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::ApWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac::ApWifiMac() [constructor]
-    cls.add_constructor([])
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+def register_Ns3HePhy_methods(root_module, cls):
+    ## he-phy.h (module 'wifi'): ns3::HePhy::HePhy(ns3::HePhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HePhy const &', 'arg0')])
+    ## he-phy.h (module 'wifi'): ns3::HePhy::HePhy(bool buildModeList=true) [constructor]
+    cls.add_constructor([param('bool', 'buildModeList', default_value='true')])
+    ## he-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::HePhy::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
                    is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::CalculateNonOfdmaDurationForHeTb(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('CalculateNonOfdmaDurationForHeTb', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) const [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_const=True, is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::CancelAllEvents() [member function]
+    cls.add_method('CancelAllEvents', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')], 
+                   [], 
                    is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBeaconInterval(ns3::Time interval) [member function]
-    cls.add_method('SetBeaconInterval', 
-                   'void', 
-                   [param('ns3::Time', 'interval')])
-    ## ap-wifi-mac.h (module 'wifi'): ns3::Time ns3::ApWifiMac::GetBeaconInterval() const [member function]
-    cls.add_method('GetBeaconInterval', 
+    ## he-phy.h (module 'wifi'): static uint16_t ns3::HePhy::ConvertHeTbPpduDurationToLSigLength(ns3::Time ppduDuration, ns3::WifiPhyBand band) [member function]
+    cls.add_method('ConvertHeTbPpduDurationToLSigLength', 
+                   'uint16_t', 
+                   [param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::Time ns3::HePhy::ConvertLSigLengthToHeTbPpduDuration(uint16_t length, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
+    cls.add_method('ConvertLSigLengthToHeTbPpduDuration', 
                    'ns3::Time', 
+                   [param('uint16_t', 'length'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::HePhy::GetAddressedPsduInPpdu(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetAddressedPsduInPpdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): uint8_t ns3::HePhy::GetBssColor() const [member function]
+    cls.add_method('GetBssColor', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetCfpMaxDuration(ns3::Time duration) [member function]
-    cls.add_method('SetCfpMaxDuration', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## ap-wifi-mac.h (module 'wifi'): ns3::Time ns3::ApWifiMac::GetCfpMaxDuration() const [member function]
-    cls.add_method('GetCfpMaxDuration', 
-                   'ns3::Time', 
-                   [], 
+    ## he-phy.h (module 'wifi'): uint16_t ns3::HePhy::GetCenterFrequencyForNonOfdmaPart(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetCenterFrequencyForNonOfdmaPart', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
                    is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::GetShortSlotTimeEnabled() const [member function]
-    cls.add_method('GetShortSlotTimeEnabled', 
-                   'bool', 
+    ## he-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::HePhy::GetCodeRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static uint16_t ns3::HePhy::GetConstellationSize(uint8_t mcsValue) [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint16_t', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): uint64_t ns3::HePhy::GetCurrentHeTbPpduUid() const [member function]
+    cls.add_method('GetCurrentHeTbPpduUid', 
+                   'uint64_t', 
                    [], 
                    is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::GetShortPreambleEnabled() const [member function]
-    cls.add_method('GetShortPreambleEnabled', 
-                   'bool', 
+    ## he-phy.h (module 'wifi'): static uint64_t ns3::HePhy::GetDataRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static uint64_t ns3::HePhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId=65535) [member function]
+    cls.add_method('GetDataRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs(uint8_t index) [member function]
+    cls.add_method('GetHeMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs0() [member function]
+    cls.add_method('GetHeMcs0', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::IsNonGfHtStasPresent() const [member function]
-    cls.add_method('IsNonGfHtStasPresent', 
-                   'bool', 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs1() [member function]
+    cls.add_method('GetHeMcs1', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs10() [member function]
+    cls.add_method('GetHeMcs10', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs11() [member function]
+    cls.add_method('GetHeMcs11', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs2() [member function]
+    cls.add_method('GetHeMcs2', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs3() [member function]
+    cls.add_method('GetHeMcs3', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs4() [member function]
+    cls.add_method('GetHeMcs4', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs5() [member function]
+    cls.add_method('GetHeMcs5', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs6() [member function]
+    cls.add_method('GetHeMcs6', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs7() [member function]
+    cls.add_method('GetHeMcs7', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs8() [member function]
+    cls.add_method('GetHeMcs8', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs9() [member function]
+    cls.add_method('GetHeMcs9', 
+                   'ns3::WifiMode', 
                    [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::GetLSigDuration(ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetLSigDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): uint16_t ns3::HePhy::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): static uint64_t ns3::HePhy::GetNonHtReferenceRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetNonHtReferenceRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::HePhy::GetNonOfdmaBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetNonOfdmaBand', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
                    is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetVhtOperationalChannelWidth() const [member function]
-    cls.add_method('GetVhtOperationalChannelWidth', 
+    ## he-phy.h (module 'wifi'): uint16_t ns3::HePhy::GetNonOfdmaWidth(ns3::HeRu::RuSpec ru) const [member function]
+    cls.add_method('GetNonOfdmaWidth', 
                    'uint16_t', 
+                   [param('ns3::HeRu::RuSpec', 'ru')], 
+                   is_const=True)
+    ## he-phy.h (module 'wifi'): static uint64_t ns3::HePhy::GetPhyRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static uint64_t ns3::HePhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId=65535) [member function]
+    cls.add_method('GetPhyRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::HePhy::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::HePhy::GetRuBandForRx(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetRuBandForRx', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
                    is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): int64_t ns3::ApWifiMac::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
+    ## he-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::HePhy::GetRuBandForTx(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetRuBandForTx', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::GetSigADuration(ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetSigADuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): ns3::WifiMode ns3::HePhy::GetSigAMode() const [member function]
+    cls.add_method('GetSigAMode', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::GetSigBDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigBDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): ns3::WifiMode ns3::HePhy::GetSigBMode(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigBMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): ns3::WifiMode ns3::HePhy::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): uint16_t ns3::HePhy::GetStaId(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::GetTrainingDuration(ns3::WifiTxVector const & txVector, uint8_t nDataLtf, uint8_t nExtensionLtf=0) const [member function]
+    cls.add_method('GetTrainingDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint8_t', 'nDataLtf'), param('uint8_t', 'nExtensionLtf', default_value='0')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): static void ns3::HePhy::InitializeModes() [member function]
+    cls.add_method('InitializeModes', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::TxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxOk', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static bool ns3::HePhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsModeAllowed', 
+                   'bool', 
+                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::NotifyEndOfHeSigA(ns3::HeSigAParameters params) [member function]
+    cls.add_method('NotifyEndOfHeSigA', 
                    'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::TxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxFailed', 
+                   [param('ns3::HeSigAParameters', 'params')])
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::SetEndOfHeSigACallback(ns3::HePhy::EndOfHeSigACallback callback) [member function]
+    cls.add_method('SetEndOfHeSigACallback', 
                    'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('DeaggregateAmsduAndForward', 
+                   [param('ns3::Callback< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreamble', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')], 
+                   is_virtual=True)
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_virtual=True)
+    ## he-phy.h (module 'wifi'): static uint64_t ns3::HePhy::CalculateNonHtReferenceRate(ns3::WifiCodeRate codeRate, uint16_t constellationSize) [member function]
+    cls.add_method('CalculateNonHtReferenceRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'codeRate'), param('uint16_t', 'constellationSize')], 
+                   is_static=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::DoAbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('DoAbortCurrentReception', 
+                   'void', 
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::DoEndReceivePayload(ns3::Ptr<const ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('DoEndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::HePhy::DoGetEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    cls.add_method('DoGetEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::DoResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::DoStartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceivePayload', 
                    'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::HePhy::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetChannelWidthAndBand', 
+                   'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): uint32_t ns3::HePhy::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::HePhy::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): static uint16_t ns3::HePhy::GetUsableSubcarriers(uint16_t channelWidth) [member function]
+    cls.add_method('GetUsableSubcarriers', 
+                   'uint16_t', 
+                   [param('uint16_t', 'channelWidth')], 
+                   is_static=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): ns3::WifiConstPsduMap ns3::HePhy::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): bool ns3::HePhy::IsConfigSupported(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsConfigSupported', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): uint64_t ns3::HePhy::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('ObtainNextUid', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::HePhy::ProcessSigA(ns3::Ptr<ns3::Event> event, ns3::PhyEntity::PhyFieldRxStatus status) [member function]
+    cls.add_method('ProcessSigA', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::PhyEntity::PhyFieldRxStatus', 'status')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::HePhy::ProcessSigB(ns3::Ptr<ns3::Event> event, ns3::PhyEntity::PhyFieldRxStatus status) [member function]
+    cls.add_method('ProcessSigB', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::PhyEntity::PhyFieldRxStatus', 'status')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::StartReceiveOfdmaPayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceiveOfdmaPayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::BuildModeList() [member function]
+    cls.add_method('BuildModeList', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
+    ## he-phy.h (module 'wifi'): uint8_t ns3::HePhy::GetNumberBccEncoders(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetNumberBccEncoders', 
+                   'uint8_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::GetSymbolDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSymbolDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3HashImplementation_methods(root_module, cls):
@@ -23334,10 +27311,10 @@
     module.add_function('GetAckSize', 
                         'uint32_t', 
                         [])
-    ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetBlockAckRequestSize(ns3::BlockAckType type) [free function]
+    ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetBlockAckRequestSize(ns3::BlockAckReqType type) [free function]
     module.add_function('GetBlockAckRequestSize', 
                         'uint32_t', 
-                        [param('ns3::BlockAckType', 'type')])
+                        [param('ns3::BlockAckReqType', 'type')])
     ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetBlockAckSize(ns3::BlockAckType type) [free function]
     module.add_function('GetBlockAckSize', 
                         'uint32_t', 
@@ -23350,14 +27327,30 @@
     module.add_function('GetCtsSize', 
                         'uint32_t', 
                         [])
+    ## wifi-standards.h (module 'wifi'): uint16_t ns3::GetDefaultChannelWidth(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [free function]
+    module.add_function('GetDefaultChannelWidth', 
+                        'uint16_t', 
+                        [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType ns3::GetFrequencyChannelType(ns3::WifiPhyStandard standard) [free function]
+    module.add_function('GetFrequencyChannelType', 
+                        'ns3::FrequencyChannelType', 
+                        [param('ns3::WifiPhyStandard', 'standard')])
+    ## wifi-standards.h (module 'wifi'): uint16_t ns3::GetMaximumChannelWidth(ns3::WifiPhyStandard standard) [free function]
+    module.add_function('GetMaximumChannelWidth', 
+                        'uint16_t', 
+                        [param('ns3::WifiPhyStandard', 'standard')])
+    ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetMuBarSize(std::list<ns3::BlockAckReqType, std::allocator<ns3::BlockAckReqType> > types) [free function]
+    module.add_function('GetMuBarSize', 
+                        'uint32_t', 
+                        [param('std::list< ns3::BlockAckReqType >', 'types')])
     ## wifi-utils.h (module 'wifi'): ns3::Time ns3::GetPpduMaxTime(ns3::WifiPreamble preamble) [free function]
     module.add_function('GetPpduMaxTime', 
                         'ns3::Time', 
                         [param('ns3::WifiPreamble', 'preamble')])
-    ## wifi-utils.h (module 'wifi'): ns3::WifiPreamble ns3::GetPreambleForTransmission(ns3::WifiModulationClass modulation, bool useShortPreamble, bool useGreenfield) [free function]
+    ## wifi-utils.h (module 'wifi'): ns3::WifiPreamble ns3::GetPreambleForTransmission(ns3::WifiModulationClass modulation, bool useShortPreamble) [free function]
     module.add_function('GetPreambleForTransmission', 
                         'ns3::WifiPreamble', 
-                        [param('ns3::WifiModulationClass', 'modulation'), param('bool', 'useShortPreamble'), param('bool', 'useGreenfield')])
+                        [param('ns3::WifiModulationClass', 'modulation'), param('bool', 'useShortPreamble')])
     ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetRtsSize() [free function]
     module.add_function('GetRtsSize', 
                         'uint32_t', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/bindings/modulegen__gcc_LP64.py ns-3.34/src/wifi/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/wifi/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -26,41 +26,53 @@
     module.add_enum('CitySize', ['SmallCity', 'MediumCity', 'LargeCity'], import_from_module='ns.propagation')
     ## queue-size.h (module 'network'): ns3::QueueSizeUnit [enumeration]
     module.add_enum('QueueSizeUnit', ['PACKETS', 'BYTES'], import_from_module='ns.network')
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
-    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'SIG_A_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'FILTERED'])
-    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
-    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'])
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroupType [enumeration]
+    module.add_enum('McsGroupType', ['GROUP_HT', 'GROUP_VHT', 'GROUP_HE'])
     ## ht-operation.h (module 'wifi'): ns3::HtProtectionType [enumeration]
     module.add_enum('HtProtectionType', ['NO_PROTECTION', 'NON_MEMBER_PROTECTION', 'TWENTY_MHZ_PROTECTION', 'MIXED_MODE_PROTECTION'])
-    ## qos-txop.h (module 'wifi'): ns3::TypeOfStation [enumeration]
-    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA', 'OCB'])
+    ## ofdm-phy.h (module 'wifi'): ns3::OfdmPhyVariant [enumeration]
+    module.add_enum('OfdmPhyVariant', ['OFDM_PHY_DEFAULT', 'OFDM_PHY_10_MHZ', 'OFDM_PHY_5_MHZ'])
+    ## wifi-mpdu-type.h (module 'wifi'): ns3::MpduType [enumeration]
+    module.add_enum('MpduType', ['NORMAL_MPDU', 'SINGLE_MPDU', 'FIRST_MPDU_IN_AGGREGATE', 'MIDDLE_MPDU_IN_AGGREGATE', 'LAST_MPDU_IN_AGGREGATE'])
+    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'])
+    ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType [enumeration]
+    module.add_enum('TriggerFrameType', ['BASIC_TRIGGER', 'BFRP_TRIGGER', 'MU_BAR_TRIGGER', 'MU_RTS_TRIGGER', 'BSRP_TRIGGER', 'GCR_MU_BAR_TRIGGER', 'BQRP_TRIGGER', 'NFRP_TRIGGER'])
+    ## regular-wifi-mac.h (module 'wifi'): ns3::WifiTxTimerReason [enumeration]
+    module.add_enum('WifiTxTimerReason', [])
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMacDropReason [enumeration]
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT'])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
-    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'])
+    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_TRIGGER', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_END', 'WIFI_MAC_CTL_END_ACK', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'])
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation [enumeration]
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'OCB'])
     ## wifi-standards.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
-    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'])
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_80211p', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ', 'WIFI_PHY_STANDARD_80211n', 'WIFI_PHY_STANDARD_80211ac', 'WIFI_PHY_STANDARD_80211ax', 'WIFI_PHY_STANDARD_UNSPECIFIED'])
     ## wifi-standards.h (module 'wifi'): ns3::WifiMacStandard [enumeration]
     module.add_enum('WifiMacStandard', ['WIFI_MAC_STANDARD_80211', 'WIFI_MAC_STANDARD_80211n', 'WIFI_MAC_STANDARD_80211ac', 'WIFI_MAC_STANDARD_80211ax'])
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandard [enumeration]
-    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_holland', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'])
+    module.add_enum('WifiStandard', ['WIFI_STANDARD_80211a', 'WIFI_STANDARD_80211b', 'WIFI_STANDARD_80211g', 'WIFI_STANDARD_80211p', 'WIFI_STANDARD_80211n_2_4GHZ', 'WIFI_STANDARD_80211n_5GHZ', 'WIFI_STANDARD_80211ac', 'WIFI_STANDARD_80211ax_2_4GHZ', 'WIFI_STANDARD_80211ax_5GHZ', 'WIFI_STANDARD_80211ax_6GHZ'])
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType [enumeration]
+    module.add_enum('FrequencyChannelType', ['WIFI_PHY_DSSS_CHANNEL', 'WIFI_PHY_OFDM_CHANNEL', 'WIFI_PHY_80211p_CHANNEL'])
     ## wifi-phy-band.h (module 'wifi'): ns3::WifiPhyBand [enumeration]
     module.add_enum('WifiPhyBand', ['WIFI_PHY_BAND_2_4GHZ', 'WIFI_PHY_BAND_5GHZ', 'WIFI_PHY_BAND_6GHZ', 'WIFI_PHY_BAND_UNSPECIFIED'])
-    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
-    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'])
-    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
-    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'])
-    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [enumeration]
-    module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'EXTENDED_COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
-    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
-    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'])
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPreamble [enumeration]
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_VHT_SU', 'WIFI_PREAMBLE_VHT_MU', 'WIFI_PREAMBLE_HE_SU', 'WIFI_PREAMBLE_HE_ER_SU', 'WIFI_PREAMBLE_HE_MU', 'WIFI_PREAMBLE_HE_TB'])
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_HR_DSSS', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT', 'WIFI_MOD_CLASS_VHT', 'WIFI_MOD_CLASS_HE'])
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduField [enumeration]
+    module.add_enum('WifiPpduField', ['WIFI_PPDU_FIELD_PREAMBLE', 'WIFI_PPDU_FIELD_NON_HT_HEADER', 'WIFI_PPDU_FIELD_HT_SIG', 'WIFI_PPDU_FIELD_TRAINING', 'WIFI_PPDU_FIELD_SIG_A', 'WIFI_PPDU_FIELD_SIG_B', 'WIFI_PPDU_FIELD_DATA'])
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPpduType [enumeration]
+    module.add_enum('WifiPpduType', ['WIFI_PPDU_TYPE_SU', 'WIFI_PPDU_TYPE_DL_MU', 'WIFI_PPDU_TYPE_UL_MU'])
+    ## wifi-phy-common.h (module 'wifi'): ns3::WifiPhyRxfailureReason [enumeration]
+    module.add_enum('WifiPhyRxfailureReason', ['UNKNOWN', 'UNSUPPORTED_SETTINGS', 'CHANNEL_SWITCHING', 'RXING', 'TXING', 'SLEEPING', 'BUSY_DECODING_PREAMBLE', 'PREAMBLE_DETECT_FAILURE', 'RECEPTION_ABORTED_BY_TX', 'L_SIG_FAILURE', 'HT_SIG_FAILURE', 'SIG_A_FAILURE', 'SIG_B_FAILURE', 'PREAMBLE_DETECTION_PACKET_SWITCH', 'FRAME_CAPTURE_PACKET_SWITCH', 'OBSS_PD_CCA_RESET', 'HE_TB_PPDU_TOO_LATE', 'FILTERED'])
     ## log.h (module 'core'): ns3::LogLevel [enumeration]
     module.add_enum('LogLevel', ['LOG_NONE', 'LOG_ERROR', 'LOG_LEVEL_ERROR', 'LOG_WARN', 'LOG_LEVEL_WARN', 'LOG_DEBUG', 'LOG_LEVEL_DEBUG', 'LOG_INFO', 'LOG_LEVEL_INFO', 'LOG_FUNCTION', 'LOG_LEVEL_FUNCTION', 'LOG_LOGIC', 'LOG_LEVEL_LOGIC', 'LOG_ALL', 'LOG_LEVEL_ALL', 'LOG_PREFIX_FUNC', 'LOG_PREFIX_TIME', 'LOG_PREFIX_NODE', 'LOG_PREFIX_LEVEL', 'LOG_PREFIX_ALL'], import_from_module='ns.core')
     ## address.h (module 'network'): ns3::Address [class]
     module.add_class('Address', import_from_module='ns.network')
     ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
     module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
-    ## angles.h (module 'antenna'): ns3::Angles [struct]
+    ## angles.h (module 'antenna'): ns3::Angles [class]
     module.add_class('Angles', import_from_module='ns.antenna')
     ## sta-wifi-mac.h (module 'wifi'): ns3::ApInfo [struct]
     module.add_class('ApInfo')
@@ -82,9 +94,15 @@
     ## block-ack-manager.h (module 'wifi'): ns3::Bar [struct]
     module.add_class('Bar')
     ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement [class]
-    module.add_class('BlockAckAgreement')
-    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache [class]
-    module.add_class('BlockAckCache')
+    module.add_class('BlockAckAgreement', allow_subclassing=True)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType [struct]
+    module.add_class('BlockAckReqType')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID'], outer_class=root_module['ns3::BlockAckReqType'])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType [struct]
+    module.add_class('BlockAckType')
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::Variant [enumeration]
+    module.add_enum('Variant', ['BASIC', 'COMPRESSED', 'EXTENDED_COMPRESSED', 'MULTI_TID', 'MULTI_STA'], outer_class=root_module['ns3::BlockAckType'])
     ## block-ack-window.h (module 'wifi'): ns3::BlockAckWindow [class]
     module.add_class('BlockAckWindow')
     ## buffer.h (module 'network'): ns3::Buffer [class]
@@ -105,6 +123,8 @@
     module.add_class('CallbackBase', import_from_module='ns.core')
     ## capability-information.h (module 'wifi'): ns3::CapabilityInformation [class]
     module.add_class('CapabilityInformation')
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField [class]
+    module.add_class('CtrlTriggerUserInfoField')
     ## data-rate.h (module 'network'): ns3::DataRate [class]
     module.add_class('DataRate', import_from_module='ns.network')
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::AttributeAccessor> [struct]
@@ -131,6 +151,8 @@
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::OutputStreamWrapper'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Packet> [struct]
     module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Packet'])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity> [struct]
+    module.add_class('DefaultDeleter', template_parameters=['ns3::PhyEntity'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::QosBlockedDestinations> [struct]
     module.add_class('DefaultDeleter', template_parameters=['ns3::QosBlockedDestinations'])
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::QueueItem> [struct]
@@ -170,13 +192,11 @@
     module.add_class('Hasher', import_from_module='ns.core')
     ## wifi-tx-vector.h (module 'wifi'): ns3::HeMuUserInfo [struct]
     module.add_class('HeMuUserInfo')
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters [struct]
-    module.add_class('HePreambleParameters')
     ## he-ru.h (module 'wifi'): ns3::HeRu [class]
     module.add_class('HeRu')
     ## he-ru.h (module 'wifi'): ns3::HeRu::RuType [enumeration]
     module.add_enum('RuType', ['RU_26_TONE', 'RU_52_TONE', 'RU_106_TONE', 'RU_242_TONE', 'RU_484_TONE', 'RU_996_TONE', 'RU_2x996_TONE'], outer_class=root_module['ns3::HeRu'])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [struct]
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec [class]
     module.add_class('RuSpec', outer_class=root_module['ns3::HeRu'])
     typehandlers.add_type_alias('std::pair< short, short >', 'ns3::HeRu::SubcarrierRange')
     typehandlers.add_type_alias('std::pair< short, short >*', 'ns3::HeRu::SubcarrierRange*')
@@ -184,32 +204,30 @@
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >', 'ns3::HeRu::SubcarrierGroup')
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >*', 'ns3::HeRu::SubcarrierGroup*')
     typehandlers.add_type_alias('std::vector< std::pair< short, short > >&', 'ns3::HeRu::SubcarrierGroup&')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec', 'ns3::HeRu::RuSpec')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec*', 'ns3::HeRu::RuSpec*')
-    typehandlers.add_type_alias('ns3::HeRu::RuSpec&', 'ns3::HeRu::RuSpec&')
-    module.add_typedef(root_module['ns3::HeRu::RuSpec'], 'RuSpec')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >', 'ns3::HeRu::BwTonesPair')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >*', 'ns3::HeRu::BwTonesPair*')
     typehandlers.add_type_alias('std::pair< unsigned char, ns3::HeRu::RuType >&', 'ns3::HeRu::BwTonesPair&')
     typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', 'ns3::HeRu::SubcarrierGroups')
     typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >*', 'ns3::HeRu::SubcarrierGroups*')
     typehandlers.add_type_alias('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >&', 'ns3::HeRu::SubcarrierGroups&')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo [struct]
-    module.add_class('HtRateInfo')
+    ## he-phy.h (module 'wifi'): ns3::HeSigAParameters [struct]
+    module.add_class('HeSigAParameters')
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper [class]
     module.add_class('InterferenceHelper')
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer [struct]
-    module.add_class('SnrPer', outer_class=root_module['ns3::InterferenceHelper'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -228,11 +246,11 @@
     module.add_class('Mac8Address', import_from_module='ns.network')
     ## mac8-address.h (module 'network'): ns3::Mac8Address [class]
     root_module['ns3::Mac8Address'].implicitly_converts_to(root_module['ns3::Address'])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters [class]
-    module.add_class('MacLowTransmissionParameters')
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup [struct]
     module.add_class('McsGroup')
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo [struct]
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo [struct]
+    module.add_class('MinstrelHtRateInfo')
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo [struct]
     module.add_class('MpduInfo')
     ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
     module.add_class('NetDeviceContainer', import_from_module='ns.network')
@@ -277,7 +295,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## propagation-cache.h (module 'propagation'): ns3::PropagationCache<ns3::JakesProcess> [class]
@@ -286,7 +304,11 @@
     module.add_class('QueueSize', import_from_module='ns.network')
     ## minstrel-wifi-manager.h (module 'wifi'): ns3::RateInfo [struct]
     module.add_class('RateInfo')
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm [struct]
+    ## recipient-block-ack-agreement.h (module 'wifi'): ns3::RecipientBlockAckAgreement [class]
+    module.add_class('RecipientBlockAckAgreement', parent=root_module['ns3::BlockAckAgreement'])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo [struct]
+    module.add_class('RxSignalInfo')
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm [struct]
     module.add_class('SignalNoiseDbm')
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::ObjectBase'], template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'])
@@ -332,6 +354,36 @@
     module.add_class('Vector2D', import_from_module='ns.core')
     ## vector.h (module 'core'): ns3::Vector3D [class]
     module.add_class('Vector3D', import_from_module='ns.core')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc [class]
+    module.add_class('WifiAc')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment [struct]
+    module.add_class('WifiAcknowledgment', allow_subclassing=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::Method [enumeration]
+    module.add_enum('Method', ['NONE', 'NORMAL_ACK', 'BLOCK_ACK', 'BAR_BLOCK_ACK', 'DL_MU_BAR_BA_SEQUENCE', 'DL_MU_TF_MU_BAR', 'DL_MU_AGGREGATE_TF', 'UL_MU_MULTI_STA_BA', 'ACK_AFTER_TB_PPDU'], outer_class=root_module['ns3::WifiAcknowledgment'])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash [struct]
+    module.add_class('WifiAddressHash')
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash [struct]
+    module.add_class('WifiAddressTidHash')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck [struct]
+    module.add_class('WifiBarBlockAck', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck [struct]
+    module.add_class('WifiBlockAck', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf [struct]
+    module.add_class('WifiDlMuAggregateTf', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo [struct]
+    module.add_class('BlockAckInfo', outer_class=root_module['ns3::WifiDlMuAggregateTf'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence [struct]
+    module.add_class('WifiDlMuBarBaSequence', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo [struct]
+    module.add_class('AckInfo', outer_class=root_module['ns3::WifiDlMuBarBaSequence'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo [struct]
+    module.add_class('BlockAckInfo', outer_class=root_module['ns3::WifiDlMuBarBaSequence'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo [struct]
+    module.add_class('BlockAckReqInfo', outer_class=root_module['ns3::WifiDlMuBarBaSequence'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar [struct]
+    module.add_class('WifiDlMuTfMuBar', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo [struct]
+    module.add_class('BlockAckInfo', outer_class=root_module['ns3::WifiDlMuTfMuBar'])
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper [class]
     module.add_class('WifiHelper', allow_subclassing=True)
     typehandlers.add_type_alias('std::function< unsigned long ( ns3::Ptr< ns3::QueueItem > ) >', 'ns3::WifiHelper::SelectQueueCallback')
@@ -343,12 +395,46 @@
     module.add_class('WifiMode')
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
     module.add_class('WifiModeFactory')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::CodeRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::CodeRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::CodeRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ConstellationSizeCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ConstellationSizeCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ConstellationSizeCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::PhyRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::DataRateFromTxVectorCallback&')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::NonHtReferenceRateCallback')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::NonHtReferenceRateCallback*')
+    typehandlers.add_type_alias('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::NonHtReferenceRateCallback&')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiModeFactory::ModeAllowedCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiModeFactory::ModeAllowedCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiModeFactory::ModeAllowedCallback&')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck [struct]
+    module.add_class('WifiNoAck', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck [struct]
+    module.add_class('WifiNormalAck', parent=root_module['ns3::WifiAcknowledgment'])
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper [class]
     module.add_class('WifiPhyHelper', parent=[root_module['ns3::PcapHelperForDevice'], root_module['ns3::AsciiTraceHelperForDevice']])
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::SupportedPcapDataLinkTypes [enumeration]
     module.add_enum('SupportedPcapDataLinkTypes', ['DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO'], outer_class=root_module['ns3::WifiPhyHelper'])
     ## wifi-phy-listener.h (module 'wifi'): ns3::WifiPhyListener [class]
     module.add_class('WifiPhyListener', allow_subclassing=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel [class]
+    module.add_class('WifiPhyOperatingChannel')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection [struct]
+    module.add_class('WifiProtection', allow_subclassing=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::Method [enumeration]
+    module.add_enum('Method', ['NONE', 'RTS_CTS', 'CTS_TO_SELF'], outer_class=root_module['ns3::WifiProtection'])
     ## wifi-radio-energy-model-helper.h (module 'wifi'): ns3::WifiRadioEnergyModelHelper [class]
     module.add_class('WifiRadioEnergyModelHelper', parent=root_module['ns3::DeviceEnergyModelHelper'])
     ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener [class]
@@ -368,17 +454,41 @@
     module.add_class('WifiRraaThresholds')
     ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiRrpaaThresholds [struct]
     module.add_class('WifiRrpaaThresholds')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection [struct]
+    module.add_class('WifiRtsCtsProtection', parent=root_module['ns3::WifiProtection'])
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory [class]
     module.add_class('WifiSpectrumValue5MhzFactory', allow_subclassing=True, import_from_module='ns.spectrum')
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValueHelper [class]
     module.add_class('WifiSpectrumValueHelper', import_from_module='ns.spectrum')
     ## wifi-standards.h (module 'wifi'): ns3::WifiStandardInfo [struct]
     module.add_class('WifiStandardInfo')
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters [class]
+    module.add_class('WifiTxParameters')
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo [struct]
+    module.add_class('PsduInfo', outer_class=root_module['ns3::WifiTxParameters'])
+    typehandlers.add_type_alias('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >', 'ns3::WifiTxParameters::PsduInfoMap')
+    typehandlers.add_type_alias('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >*', 'ns3::WifiTxParameters::PsduInfoMap*')
+    typehandlers.add_type_alias('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >&', 'ns3::WifiTxParameters::PsduInfoMap&')
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer [class]
+    module.add_class('WifiTxTimer')
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::Reason [enumeration]
+    module.add_enum('Reason', ['NOT_RUNNING', 'WAIT_CTS', 'WAIT_NORMAL_ACK', 'WAIT_BLOCK_ACK', 'WAIT_NORMAL_ACK_AFTER_DL_MU_PPDU', 'WAIT_BLOCK_ACKS_IN_TB_PPDU', 'WAIT_TB_PPDU_AFTER_BASIC_TF', 'WAIT_QOS_NULL_AFTER_BSRP_TF', 'WAIT_BLOCK_ACK_AFTER_TB_PPDU'], outer_class=root_module['ns3::WifiTxTimer'])
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiTxTimer::MpduResponseTimeout')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiTxTimer::MpduResponseTimeout*')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiTxTimer::MpduResponseTimeout&')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiTxTimer::PsduResponseTimeout')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiTxTimer::PsduResponseTimeout*')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiTxTimer::PsduResponseTimeout&')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiTxTimer::PsduMapResponseTimeout')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiTxTimer::PsduMapResponseTimeout*')
+    typehandlers.add_type_alias('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiTxTimer::PsduMapResponseTimeout&')
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
     module.add_class('WifiTxVector')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >', 'ns3::WifiTxVector::HeMuUserInfoMap')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >*', 'ns3::WifiTxVector::HeMuUserInfoMap*')
     typehandlers.add_type_alias('std::map< unsigned short, ns3::HeMuUserInfo >&', 'ns3::WifiTxVector::HeMuUserInfoMap&')
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa [struct]
+    module.add_class('WifiUlMuMultiStaBa', parent=root_module['ns3::WifiAcknowledgment'])
     ## yans-wifi-helper.h (module 'wifi'): ns3::YansWifiChannelHelper [class]
     module.add_class('YansWifiChannelHelper')
     ## yans-wifi-helper.h (module 'wifi'): ns3::YansWifiPhyHelper [class]
@@ -395,10 +505,6 @@
     module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## header.h (module 'network'): ns3::Header [class]
     module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader [class]
-    module.add_class('HtSigHeader', parent=root_module['ns3::Header'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader [class]
-    module.add_class('LSigHeader', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaRequestHeader [class]
     module.add_class('MgtAddBaRequestHeader', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaResponseHeader [class]
@@ -417,6 +523,8 @@
     module.add_class('MgtReassocRequestHeader', parent=root_module['ns3::Header'])
     ## minstrel-wifi-manager.h (module 'wifi'): ns3::MinstrelWifiRemoteStation [struct]
     module.add_class('MinstrelWifiRemoteStation', parent=root_module['ns3::WifiRemoteStation'])
+    ## mu-snr-tag.h (module 'wifi'): ns3::MuSnrTag [class]
+    module.add_class('MuSnrTag', parent=root_module['ns3::Tag'])
     ## object.h (module 'core'): ns3::Object [class]
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
@@ -470,6 +578,8 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::PhyEntity', 'ns3::empty', 'ns3::DefaultDeleter<ns3::PhyEntity>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'), parent=root_module['ns3::empty'], template_parameters=['ns3::QosBlockedDestinations', 'ns3::empty', 'ns3::DefaultDeleter<ns3::QosBlockedDestinations>'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> > [class]
@@ -531,25 +641,21 @@
     module.add_class('TwoRayGroundPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## txop.h (module 'wifi'): ns3::Txop [class]
     module.add_class('Txop', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxFailed&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::TxDropped')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::TxDropped*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::TxDropped&')
+    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus [enumeration]
+    module.add_enum('ChannelAccessStatus', ['NOT_REQUESTED', 'REQUESTED', 'GRANTED'], outer_class=root_module['ns3::Txop'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Txop::DroppedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Txop::DroppedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Txop::DroppedMpdu&')
     ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
     module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## vht-configuration.h (module 'wifi'): ns3::VhtConfiguration [class]
     module.add_class('VhtConfiguration', parent=root_module['ns3::Object'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader [class]
-    module.add_class('VhtSigHeader', parent=root_module['ns3::Header'])
     ## random-variable-stream.h (module 'core'): ns3::WeibullRandomVariable [class]
     module.add_class('WeibullRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
-    ## wifi-ack-policy-selector.h (module 'wifi'): ns3::WifiAckPolicySelector [class]
-    module.add_class('WifiAckPolicySelector', parent=root_module['ns3::Object'])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu [struct]
+    module.add_class('WifiAckAfterTbPpdu', parent=root_module['ns3::WifiAcknowledgment'])
+    ## wifi-ack-manager.h (module 'wifi'): ns3::WifiAckManager [class]
+    module.add_class('WifiAckManager', parent=root_module['ns3::Object'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
@@ -568,6 +674,10 @@
     typehandlers.add_type_alias('ns3::WifiActionHeader::ActionValue*', 'ns3::WifiActionHeader::ActionValue*')
     typehandlers.add_type_alias('ns3::WifiActionHeader::ActionValue&', 'ns3::WifiActionHeader::ActionValue&')
     module.add_typedef(root_module['ns3::WifiActionHeader::ActionValue'], 'ActionValue')
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection [struct]
+    module.add_class('WifiCtsToSelfProtection', parent=root_module['ns3::WifiProtection'])
+    ## wifi-default-ack-manager.h (module 'wifi'): ns3::WifiDefaultAckManager [class]
+    module.add_class('WifiDefaultAckManager', parent=root_module['ns3::WifiAckManager'])
     ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement [class]
     module.add_class('WifiInformationElement', parent=root_module['ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >'])
     ## wifi-information-element-vector.h (module 'wifi'): ns3::WifiInformationElementVector [class]
@@ -577,6 +687,9 @@
     typehandlers.add_type_alias('std::vector< ns3::Ptr< ns3::WifiInformationElement > > iterator&', 'ns3::WifiInformationElementVector::Iterator&')
     ## wifi-mac.h (module 'wifi'): ns3::WifiMac [class]
     module.add_class('WifiMac', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::WifiMac::ForwardUpCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::WifiMac::ForwardUpCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::WifiMac::ForwardUpCallback&')
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader [class]
     module.add_class('WifiMacHeader', parent=root_module['ns3::Header'])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy [enumeration]
@@ -588,19 +701,23 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiMacHeader const & )&', 'ns3::WifiMacHeader::TracedCallback&')
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem [class]
     module.add_class('WifiMacQueueItem', parent=root_module['ns3::SimpleRefCount< ns3::WifiMacQueueItem, ns3::empty, ns3::DefaultDeleter<ns3::WifiMacQueueItem> >'])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair [struct]
+    module.add_class('QueueIteratorPair', outer_class=root_module['ns3::WifiMacQueueItem'])
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::WifiMacQueueItem::DeaggregatedMsdus')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::WifiMacQueueItem::DeaggregatedMsdus*')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::WifiMacQueueItem::DeaggregatedMsdus&')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI*')
+    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::WifiMacQueueItem::DeaggregatedMsdusCI&')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'ns3::WifiMacQueueItem::ConstIterator')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator*', 'ns3::WifiMacQueueItem::ConstIterator*')
+    typehandlers.add_type_alias('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator&', 'ns3::WifiMacQueueItem::ConstIterator&')
     ## wifi-mac-trailer.h (module 'wifi'): ns3::WifiMacTrailer [class]
     module.add_class('WifiMacTrailer', parent=root_module['ns3::Trailer'])
+    ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection [struct]
+    module.add_class('WifiNoProtection', parent=root_module['ns3::WifiProtection'])
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy [class]
     module.add_class('WifiPhy', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >', 'ns3::WifiPhy::ChannelNumberBandPair')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >*', 'ns3::WifiPhy::ChannelNumberBandPair*')
-    typehandlers.add_type_alias('std::pair< unsigned char, ns3::WifiPhyBand >&', 'ns3::WifiPhy::ChannelNumberBandPair&')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >', 'ns3::WifiPhy::ChannelNumberStandardPair')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >*', 'ns3::WifiPhy::ChannelNumberStandardPair*')
-    typehandlers.add_type_alias('std::pair< std::pair< unsigned char, ns3::WifiPhyBand >, ns3::WifiPhyStandard >&', 'ns3::WifiPhy::ChannelNumberStandardPair&')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >', 'ns3::WifiPhy::FrequencyWidthPair')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >*', 'ns3::WifiPhy::FrequencyWidthPair*')
-    typehandlers.add_type_alias('std::pair< unsigned short, unsigned short >&', 'ns3::WifiPhy::FrequencyWidthPair&')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )', 'ns3::WifiPhy::MonitorSnifferRxCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )*', 'ns3::WifiPhy::MonitorSnifferRxCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, uint16_t )&', 'ns3::WifiPhy::MonitorSnifferRxCallback&')
@@ -610,9 +727,6 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )', 'ns3::WifiPhy::PsduTxBeginCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )*', 'ns3::WifiPhy::PsduTxBeginCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiConstPsduMap, ns3::WifiTxVector, double )&', 'ns3::WifiPhy::PsduTxBeginCallback&')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )', 'ns3::WifiPhy::EndOfHePreambleCallback')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )*', 'ns3::WifiPhy::EndOfHePreambleCallback*')
-    typehandlers.add_type_alias('void ( * ) ( ns3::HePreambleParameters )&', 'ns3::WifiPhy::EndOfHePreambleCallback&')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )*', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::WifiTxVector, ns3::Time )&', 'ns3::WifiPhy::PhyRxPayloadBeginTracedCallback&')
@@ -632,6 +746,8 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::WifiMode, ns3::WifiPreamble, uint8_t )&', 'ns3::WifiPhyStateHelper::TxTracedCallback&')
     ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu [class]
     module.add_class('WifiPpdu', parent=root_module['ns3::SimpleRefCount< ns3::WifiPpdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPpdu> >'])
+    ## wifi-protection-manager.h (module 'wifi'): ns3::WifiProtectionManager [class]
+    module.add_class('WifiProtectionManager', parent=root_module['ns3::Object'])
     ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu [class]
     module.add_class('WifiPsdu', parent=root_module['ns3::SimpleRefCount< ns3::WifiPsdu, ns3::empty, ns3::DefaultDeleter<ns3::WifiPsdu> >'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
@@ -690,12 +806,12 @@
     module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager [class]
     module.add_class('BlockAckManager', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxOk')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxOk*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxOk&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::BlockAckManager::TxFailed')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::BlockAckManager::TxFailed*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::BlockAckManager::TxFailed&')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )', 'ns3::BlockAckManager::AgreementStateTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )*', 'ns3::BlockAckManager::AgreementStateTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Time, ns3::Mac48Address, uint8_t, ns3::OriginatorBlockAckAgreement::State )&', 'ns3::BlockAckManager::AgreementStateTracedCallback&')
@@ -711,8 +827,6 @@
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## cara-wifi-manager.h (module 'wifi'): ns3::CaraWifiManager [class]
     module.add_class('CaraWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
-    ## cf-parameter-set.h (module 'wifi'): ns3::CfParameterSet [class]
-    module.add_class('CfParameterSet', parent=root_module['ns3::WifiInformationElement'])
     ## channel.h (module 'network'): ns3::Channel [class]
     module.add_class('Channel', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager [class]
@@ -733,14 +847,20 @@
     module.add_class('ConstantRateWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
     ## propagation-delay-model.h (module 'propagation'): ns3::ConstantSpeedPropagationDelayModel [class]
     module.add_class('ConstantSpeedPropagationDelayModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationDelayModel'])
-    ## constant-wifi-ack-policy-selector.h (module 'wifi'): ns3::ConstantWifiAckPolicySelector [class]
-    module.add_class('ConstantWifiAckPolicySelector', parent=root_module['ns3::WifiAckPolicySelector'])
     ## cost231-propagation-loss-model.h (module 'propagation'): ns3::Cost231PropagationLossModel [class]
     module.add_class('Cost231PropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader [class]
     module.add_class('CtrlBAckRequestHeader', parent=root_module['ns3::Header'])
     ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader [class]
     module.add_class('CtrlBAckResponseHeader', parent=root_module['ns3::Header'])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader [class]
+    module.add_class('CtrlTriggerHeader', parent=root_module['ns3::Header'])
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'ns3::CtrlTriggerHeader::ConstIterator')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > const_iterator*', 'ns3::CtrlTriggerHeader::ConstIterator*')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > const_iterator&', 'ns3::CtrlTriggerHeader::ConstIterator&')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > iterator', 'ns3::CtrlTriggerHeader::Iterator')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > iterator*', 'ns3::CtrlTriggerHeader::Iterator*')
+    typehandlers.add_type_alias('std::list< ns3::CtrlTriggerUserInfoField > iterator&', 'ns3::CtrlTriggerHeader::Iterator&')
     ## data-rate.h (module 'network'): ns3::DataRateChecker [class]
     module.add_class('DataRateChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## data-rate.h (module 'network'): ns3::DataRateValue [class]
@@ -756,8 +876,10 @@
     module.add_class('DoubleValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## dsss-parameter-set.h (module 'wifi'): ns3::DsssParameterSet [class]
     module.add_class('DsssParameterSet', parent=root_module['ns3::WifiInformationElement'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader [class]
-    module.add_class('DsssSigHeader', parent=root_module['ns3::Header'])
+    ## dsss-ppdu.h (module 'wifi'): ns3::DsssPpdu [class]
+    module.add_class('DsssPpdu', parent=root_module['ns3::WifiPpdu'])
+    ## dsss-ppdu.h (module 'wifi'): ns3::DsssPpdu::DsssSigHeader [class]
+    module.add_class('DsssSigHeader', outer_class=root_module['ns3::DsssPpdu'], parent=root_module['ns3::Header'])
     ## edca-parameter-set.h (module 'wifi'): ns3::EdcaParameterSet [class]
     module.add_class('EdcaParameterSet', parent=root_module['ns3::WifiInformationElement'])
     ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable [class]
@@ -803,6 +925,14 @@
     module.add_class('FixedRssLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## frame-capture-model.h (module 'wifi'): ns3::FrameCaptureModel [class]
     module.add_class('FrameCaptureModel', parent=root_module['ns3::Object'])
+    ## frame-exchange-manager.h (module 'wifi'): ns3::FrameExchangeManager [class]
+    module.add_class('FrameExchangeManager', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::FrameExchangeManager::DroppedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::FrameExchangeManager::DroppedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::FrameExchangeManager::DroppedMpdu&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::FrameExchangeManager::AckedMpdu')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::FrameExchangeManager::AckedMpdu*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::FrameExchangeManager::AckedMpdu&')
     ## propagation-loss-model.h (module 'propagation'): ns3::FriisPropagationLossModel [class]
     module.add_class('FriisPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable [class]
@@ -813,8 +943,6 @@
     module.add_class('HeConfiguration', parent=root_module['ns3::Object'])
     ## he-operation.h (module 'wifi'): ns3::HeOperation [class]
     module.add_class('HeOperation', parent=root_module['ns3::WifiInformationElement'])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader [class]
-    module.add_class('HeSigHeader', parent=root_module['ns3::Header'])
     ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities [class]
     module.add_class('HtCapabilities', parent=root_module['ns3::WifiInformationElement'])
     ## ht-configuration.h (module 'wifi'): ns3::HtConfiguration [class]
@@ -863,11 +991,6 @@
     module.add_class('Mac48AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## mac48-address.h (module 'network'): ns3::Mac48AddressValue [class]
     module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
-    ## mac-low.h (module 'wifi'): ns3::MacLow [class]
-    module.add_class('MacLow', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::MacLow::MacLowRxCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::MacLow::MacLowRxCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::MacLow::MacLowRxCallback&')
     ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle [class]
     module.add_class('MacRxMiddle', parent=root_module['ns3::SimpleRefCount< ns3::MacRxMiddle, ns3::empty, ns3::DefaultDeleter<ns3::MacRxMiddle> >'])
     typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::MacRxMiddle::ForwardUpCallback')
@@ -898,15 +1021,17 @@
     typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >&', 'ns3::MpduAggregator::EdcaQueues&')
     ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator [class]
     module.add_class('MsduAggregator', parent=root_module['ns3::Object'])
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'ns3::MsduAggregator::DeaggregatedMsdus')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >*', 'ns3::MsduAggregator::DeaggregatedMsdus*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >&', 'ns3::MsduAggregator::DeaggregatedMsdus&')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator', 'ns3::MsduAggregator::DeaggregatedMsdusCI')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator*', 'ns3::MsduAggregator::DeaggregatedMsdusCI*')
-    typehandlers.add_type_alias('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > > const_iterator&', 'ns3::MsduAggregator::DeaggregatedMsdusCI&')
     typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'ns3::MsduAggregator::EdcaQueues')
     typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >*', 'ns3::MsduAggregator::EdcaQueues*')
     typehandlers.add_type_alias('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >&', 'ns3::MsduAggregator::EdcaQueues&')
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler [class]
+    module.add_class('MultiUserScheduler', parent=root_module['ns3::Object'])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat [enumeration]
+    module.add_enum('TxFormat', ['NO_TX', 'SU_TX', 'DL_MU_TX', 'UL_MU_TX'], outer_class=root_module['ns3::MultiUserScheduler'])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo [struct]
+    module.add_class('DlMuInfo', outer_class=root_module['ns3::MultiUserScheduler'])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo [struct]
+    module.add_class('UlMuInfo', outer_class=root_module['ns3::MultiUserScheduler'])
     ## propagation-loss-model.h (module 'propagation'): ns3::NakagamiPropagationLossModel [class]
     module.add_class('NakagamiPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
@@ -944,6 +1069,10 @@
     module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
     module.add_class('ObjectFactoryValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## ofdm-ppdu.h (module 'wifi'): ns3::OfdmPpdu [class]
+    module.add_class('OfdmPpdu', parent=root_module['ns3::WifiPpdu'])
+    ## ofdm-ppdu.h (module 'wifi'): ns3::OfdmPpdu::LSigHeader [class]
+    module.add_class('LSigHeader', outer_class=root_module['ns3::OfdmPpdu'], parent=root_module['ns3::Header'])
     ## okumura-hata-propagation-loss-model.h (module 'propagation'): ns3::OkumuraHataPropagationLossModel [class]
     module.add_class('OkumuraHataPropagationLossModel', import_from_module='ns.propagation', parent=root_module['ns3::PropagationLossModel'])
     ## onoe-wifi-manager.h (module 'wifi'): ns3::OnoeWifiManager [class]
@@ -974,8 +1103,24 @@
     module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## parf-wifi-manager.h (module 'wifi'): ns3::ParfWifiManager [class]
     module.add_class('ParfWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity [class]
+    module.add_class('PhyEntity', parent=root_module['ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyRxFailureAction [enumeration]
+    module.add_enum('PhyRxFailureAction', ['DROP', 'ABORT', 'IGNORE'], outer_class=root_module['ns3::PhyEntity'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus [struct]
+    module.add_class('PhyFieldRxStatus', outer_class=root_module['ns3::PhyEntity'])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer [struct]
+    module.add_class('SnrPer', outer_class=root_module['ns3::PhyEntity'])
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >', 'ns3::PhyEntity::PhyHeaderChunkInfo')
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >*', 'ns3::PhyEntity::PhyHeaderChunkInfo*')
+    typehandlers.add_type_alias('std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >&', 'ns3::PhyEntity::PhyHeaderChunkInfo&')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', 'ns3::PhyEntity::PhyHeaderSections')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >*', 'ns3::PhyEntity::PhyHeaderSections*')
+    typehandlers.add_type_alias('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >&', 'ns3::PhyEntity::PhyHeaderSections&')
     ## qos-blocked-destinations.h (module 'wifi'): ns3::QosBlockedDestinations [class]
     module.add_class('QosBlockedDestinations', parent=root_module['ns3::SimpleRefCount< ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> >'])
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::QosFrameExchangeManager [class]
+    module.add_class('QosFrameExchangeManager', parent=root_module['ns3::FrameExchangeManager'])
     ## qos-txop.h (module 'wifi'): ns3::QosTxop [class]
     module.add_class('QosTxop', parent=root_module['ns3::Txop'])
     ## queue.h (module 'network'): ns3::Queue<ns3::Packet> [class]
@@ -1014,9 +1159,8 @@
     module.add_class('ReceiveListErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
     ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
     module.add_class('RegularWifiMac', parent=root_module['ns3::WifiMac'])
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RegularWifiMac::ForwardUpCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RegularWifiMac::ForwardUpCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RegularWifiMac::ForwardUpCallback&')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::RrMultiUserScheduler [class]
+    module.add_class('RrMultiUserScheduler', parent=root_module['ns3::MultiUserScheduler'])
     ## rraa-wifi-manager.h (module 'wifi'): ns3::RraaWifiManager [class]
     module.add_class('RraaWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
     ## rrpaa-wifi-manager.h (module 'wifi'): ns3::RrpaaWifiManager [class]
@@ -1045,10 +1189,14 @@
     module.add_class('SsidChecker', parent=root_module['ns3::AttributeChecker'])
     ## ssid.h (module 'wifi'): ns3::SsidValue [class]
     module.add_class('SsidValue', parent=root_module['ns3::AttributeValue'])
+    ## sta-wifi-mac.h (module 'wifi'): ns3::StaWifiMac [class]
+    module.add_class('StaWifiMac', parent=root_module['ns3::RegularWifiMac'])
     ## supported-rates.h (module 'wifi'): ns3::SupportedRates [class]
     module.add_class('SupportedRates', parent=root_module['ns3::WifiInformationElement'])
     ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel [class]
     module.add_class('TableBasedErrorRateModel', parent=root_module['ns3::ErrorRateModel'])
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): ns3::ThompsonSamplingWifiManager [class]
+    module.add_class('ThompsonSamplingWifiManager', parent=root_module['ns3::WifiRemoteStationManager'])
     ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppChannelConditionModel [class]
     module.add_class('ThreeGppChannelConditionModel', import_from_module='ns.propagation', parent=root_module['ns3::ChannelConditionModel'])
     ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppIndoorMixedOfficeChannelConditionModel [class]
@@ -1085,6 +1233,12 @@
     module.add_class('VhtCapabilities', parent=root_module['ns3::WifiInformationElement'])
     ## vht-operation.h (module 'wifi'): ns3::VhtOperation [class]
     module.add_class('VhtOperation', parent=root_module['ns3::WifiInformationElement'])
+    ## vht-ppdu.h (module 'wifi'): ns3::VhtPpdu [class]
+    module.add_class('VhtPpdu', parent=root_module['ns3::OfdmPpdu'])
+    ## vht-ppdu.h (module 'wifi'): ns3::VhtPpdu::VhtSigHeader [class]
+    module.add_class('VhtSigHeader', outer_class=root_module['ns3::VhtPpdu'], parent=root_module['ns3::Header'])
+    ## wifi-default-protection-manager.h (module 'wifi'): ns3::WifiDefaultProtectionManager [class]
+    module.add_class('WifiDefaultProtectionManager', parent=root_module['ns3::WifiProtectionManager'])
     ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue [class]
     module.add_class('WifiMacQueue', parent=root_module['ns3::Queue< ns3::WifiMacQueueItem >'])
     ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::DropPolicy [enumeration]
@@ -1115,12 +1269,24 @@
     module.add_class('AdhocWifiMac', parent=root_module['ns3::RegularWifiMac'])
     ## channel-condition-model.h (module 'propagation'): ns3::AlwaysLosChannelConditionModel [class]
     module.add_class('AlwaysLosChannelConditionModel', import_from_module='ns.propagation', parent=root_module['ns3::ChannelConditionModel'])
+    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac [class]
+    module.add_class('ApWifiMac', parent=root_module['ns3::RegularWifiMac'])
     ## error-model.h (module 'network'): ns3::BinaryErrorModel [class]
     module.add_class('BinaryErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
     ## error-model.h (module 'network'): ns3::BurstErrorModel [class]
     module.add_class('BurstErrorModel', import_from_module='ns.network', parent=root_module['ns3::ErrorModel'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['bool', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['ns3::ObjectBase *', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'const ns3::WifiTxVector &', 'unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned long', 'unsigned short', 'unsigned short', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['unsigned short', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'bool', 'unsigned int', 'double', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1135,8 +1301,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::DataRate', 'ns3::DataRate', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::HePreambleParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::HeSigAParameters', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1175,8 +1341,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::SpectrumSignalParameters>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
-    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'double', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::RxSignalInfo', 'ns3::WifiTxVector', 'std::vector<bool, std::allocator<bool> >', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Ptr<ns3::WifiPsdu>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1187,6 +1353,8 @@
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiMacDropReason', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'ns3::WifiTxVector', 'ns3::Time', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
@@ -1195,39 +1363,90 @@
     module.add_class('CallbackImpl', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >', 'ns3::WifiTxVector', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'double', 'bool', 'double', 'double', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiMacQueueItem>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'ns3::Ptr<const ns3::WifiPsdu>', 'const ns3::WifiTxVector &', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned char', 'std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *', 'const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned int', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
     ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
     module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned long', 'unsigned long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
-    ## infrastructure-wifi-mac.h (module 'wifi'): ns3::InfrastructureWifiMac [class]
-    module.add_class('InfrastructureWifiMac', parent=root_module['ns3::RegularWifiMac'])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> [class]
+    module.add_class('CallbackImpl', import_from_module='ns.core', parent=root_module['ns3::CallbackImplBase'], template_parameters=['void', 'unsigned short', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'])
+    ## dsss-phy.h (module 'wifi'): ns3::DsssPhy [class]
+    module.add_class('DsssPhy', parent=root_module['ns3::PhyEntity'])
+    ## erp-ofdm-ppdu.h (module 'wifi'): ns3::ErpOfdmPpdu [class]
+    module.add_class('ErpOfdmPpdu', parent=root_module['ns3::OfdmPpdu'])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu [class]
+    module.add_class('HePpdu', parent=root_module['ns3::OfdmPpdu'])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::TxPsdFlag [enumeration]
+    module.add_enum('TxPsdFlag', ['PSD_NON_HE_TB', 'PSD_HE_TB_NON_OFDMA_PORTION', 'PSD_HE_TB_OFDMA_PORTION'], outer_class=root_module['ns3::HePpdu'])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HeSigHeader [class]
+    module.add_class('HeSigHeader', outer_class=root_module['ns3::HePpdu'], parent=root_module['ns3::Header'])
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::HtFrameExchangeManager [class]
+    module.add_class('HtFrameExchangeManager', parent=root_module['ns3::QosFrameExchangeManager'])
+    ## ht-ppdu.h (module 'wifi'): ns3::HtPpdu [class]
+    module.add_class('HtPpdu', parent=root_module['ns3::OfdmPpdu'])
+    ## ht-ppdu.h (module 'wifi'): ns3::HtPpdu::HtSigHeader [class]
+    module.add_class('HtSigHeader', outer_class=root_module['ns3::HtPpdu'], parent=root_module['ns3::Header'])
+    ## ofdm-phy.h (module 'wifi'): ns3::OfdmPhy [class]
+    module.add_class('OfdmPhy', parent=root_module['ns3::PhyEntity'])
     ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vHighwayChannelConditionModel [class]
     module.add_class('ProbabilisticV2vHighwayChannelConditionModel', import_from_module='ns.propagation', parent=root_module['ns3::ThreeGppChannelConditionModel'])
     ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vUrbanChannelConditionModel [class]
     module.add_class('ProbabilisticV2vUrbanChannelConditionModel', import_from_module='ns.propagation', parent=root_module['ns3::ThreeGppChannelConditionModel'])
     ## queue-item.h (module 'network'): ns3::QueueDiscItem [class]
     module.add_class('QueueDiscItem', import_from_module='ns.network', parent=root_module['ns3::QueueItem'])
-    ## sta-wifi-mac.h (module 'wifi'): ns3::StaWifiMac [class]
-    module.add_class('StaWifiMac', parent=root_module['ns3::InfrastructureWifiMac'])
-    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac [class]
-    module.add_class('ApWifiMac', parent=root_module['ns3::InfrastructureWifiMac'])
-    module.add_container('ns3::HtMinstrelRate', 'ns3::HtRateInfo', container_type='vector')
+    ## vht-frame-exchange-manager.h (module 'wifi'): ns3::VhtFrameExchangeManager [class]
+    module.add_class('VhtFrameExchangeManager', parent=root_module['ns3::HtFrameExchangeManager'])
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::ErpOfdmPhy [class]
+    module.add_class('ErpOfdmPhy', parent=root_module['ns3::OfdmPhy'])
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::HeFrameExchangeManager [class]
+    module.add_class('HeFrameExchangeManager', parent=root_module['ns3::VhtFrameExchangeManager'])
+    ## ht-phy.h (module 'wifi'): ns3::HtPhy [class]
+    module.add_class('HtPhy', parent=root_module['ns3::OfdmPhy'])
+    ## vht-phy.h (module 'wifi'): ns3::VhtPhy [class]
+    module.add_class('VhtPhy', parent=root_module['ns3::HtPhy'])
+    ## he-phy.h (module 'wifi'): ns3::HePhy [class]
+    module.add_class('HePhy', parent=root_module['ns3::VhtPhy'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::HePhy::EndOfHeSigACallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::HePhy::EndOfHeSigACallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::HePhy::EndOfHeSigACallback&')
+    module.add_container('std::vector< double >', 'double', container_type='vector')
+    module.add_container('std::list< ns3::BlockAckReqType >', 'ns3::BlockAckReqType', container_type='list')
+    module.add_container('std::vector< unsigned char >', 'unsigned char', container_type='vector')
+    module.add_container('ns3::MinstrelHtRate', 'ns3::MinstrelHtRateInfo', container_type='vector')
     module.add_container('std::vector< std::pair< short, short > >', 'std::pair< short, short >', container_type='vector')
+    module.add_container('std::vector< ns3::HeRu::RuSpec >', 'ns3::HeRu::RuSpec', container_type='vector')
     module.add_container('ns3::HeRu::SubcarrierGroup', 'std::pair< short, short >', container_type='vector')
     module.add_container('std::map< std::pair< unsigned char, ns3::HeRu::RuType >, std::vector< std::vector< std::pair< short, short > > > >', ('std::pair< unsigned char, ns3::HeRu::RuType >', 'std::vector< std::vector< std::pair< short, short > > >'), container_type='map')
     module.add_container('ns3::RxPowerWattPerChannelBand', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     module.add_container('ns3::TxTime', ('ns3::WifiMode', 'ns3::Time'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuAggregateTf::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuAggregateTf::BlockAckInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::AckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::AckInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckReqInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuBarBaSequence::BlockAckReqInfo'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiDlMuTfMuBar::BlockAckInfo >', ('ns3::Mac48Address', 'ns3::WifiDlMuTfMuBar::BlockAckInfo'), container_type='map')
     module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
     module.add_container('std::vector< std::pair< unsigned int, unsigned int > >', 'std::pair< unsigned int, unsigned int >', container_type='vector')
+    module.add_container('std::map< unsigned char, std::set< unsigned short > >', ('unsigned char', 'std::set< unsigned short >'), container_type='map')
+    module.add_container('std::map< ns3::Mac48Address, ns3::WifiTxParameters::PsduInfo >', ('ns3::Mac48Address', 'ns3::WifiTxParameters::PsduInfo'), container_type='map')
     module.add_container('std::map< unsigned short, ns3::HeMuUserInfo >', ('short unsigned int', 'ns3::HeMuUserInfo'), container_type='map')
+    module.add_container('std::map< std::pair< ns3::Mac48Address, unsigned char >, unsigned long >', ('std::pair< ns3::Mac48Address, unsigned char >', 'long unsigned int'), container_type='map')
     module.add_container('ns3::MinstrelRate', 'ns3::RateInfo', container_type='vector')
     module.add_container('ns3::SampleRate', 'std::vector< unsigned char >', container_type='vector')
-    module.add_container('std::vector< double >', 'double', container_type='vector')
     module.add_container('ns3::Bands', 'ns3::BandInfo', container_type='vector')
+    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
+    module.add_container('std::list< ns3::WifiMacQueueItem::QueueIteratorPair >', 'ns3::WifiMacQueueItem::QueueIteratorPair', container_type='list')
+    module.add_container('std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > >', 'std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', container_type='set')
     module.add_container('ns3::WifiConstPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
+    module.add_container('std::list< ns3::WifiMode >', 'ns3::WifiMode', container_type='list')
+    module.add_container('std::list< unsigned char >', 'unsigned char', container_type='list')
     module.add_container('std::vector< bool >', 'bool', container_type='vector')
     module.add_container('std::vector< unsigned short >', 'short unsigned int', container_type='vector')
     module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu const >'), container_type='map')
@@ -1235,15 +1454,18 @@
     module.add_container('std::set< unsigned char >', 'unsigned char', container_type='set')
     module.add_container('std::vector< ns3::WifiRemoteStation * >', 'ns3::WifiRemoteStation *', container_type='vector')
     module.add_container('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationState *', container_type='vector')
+    module.add_container('std::vector< unsigned int >', 'unsigned int', container_type='vector')
     module.add_container('std::list< unsigned int >', 'unsigned int', container_type='list')
     module.add_container('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('ns3::MpduAggregator::EdcaQueues', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader > >', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('ns3::MsduAggregator::DeaggregatedMsdus', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
-    module.add_container('ns3::MsduAggregator::EdcaQueues', ('ns3::AcIndex', 'ns3::Ptr< ns3::QosTxop >'), container_type='map')
-    module.add_container('std::map< ns3::Mac48Address, bool >', ('ns3::Mac48Address', 'bool'), container_type='map')
-    module.add_container('std::list< ns3::Ptr< ns3::WifiMacQueueItem > >', 'ns3::Ptr< ns3::WifiMacQueueItem >', container_type='list')
+    module.add_container('ns3::WifiMacQueueItem::DeaggregatedMsdus', 'std::pair< ns3::Ptr< ns3::Packet const >, ns3::AmsduSubframeHeader >', container_type='list')
+    module.add_container('ns3::WifiPsduMap', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
+    module.add_container('std::map< ns3::WifiPpduField, std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode > >', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
+    module.add_container('ns3::PhyEntity::PhyHeaderSections', ('ns3::WifiPpduField', 'std::pair< std::pair< ns3::Time, ns3::Time >, ns3::WifiMode >'), container_type='map')
+    module.add_container('std::map< unsigned short, ns3::Mac48Address >', ('short unsigned int', 'ns3::Mac48Address'), container_type='map')
     module.add_container('std::map< std::pair< unsigned int, unsigned int >, double >', ('std::pair< unsigned int, unsigned int >', 'double'), container_type='map')
+    module.add_container('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', ('short unsigned int', 'ns3::Ptr< ns3::WifiPsdu >'), container_type='map')
+    module.add_container('std::set< ns3::Mac48Address >', 'ns3::Mac48Address', container_type='set')
+    module.add_container('std::map< ns3::WifiPreamble, std::vector< ns3::WifiPpduField > >', ('ns3::WifiPreamble', 'std::vector< ns3::WifiPpduField >'), container_type='map')
     typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
     typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
     typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
@@ -1256,15 +1478,6 @@
     typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
     typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
     module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxOkCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxOkCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxOkCallback&')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxErrorCallback')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxErrorCallback*')
-    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxErrorCallback&')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
-    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRrpaaThresholds, ns3::WifiMode > >', 'ns3::RrpaaThresholdsTable')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRrpaaThresholds, ns3::WifiMode > >*', 'ns3::RrpaaThresholdsTable*')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRrpaaThresholds, ns3::WifiMode > >&', 'ns3::RrpaaThresholdsTable&')
@@ -1274,15 +1487,18 @@
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRraaThresholds, ns3::WifiMode > >', 'ns3::RraaThresholdsTable')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRraaThresholds, ns3::WifiMode > >*', 'ns3::RraaThresholdsTable*')
     typehandlers.add_type_alias('std::vector< std::pair< ns3::WifiRraaThresholds, ns3::WifiMode > >&', 'ns3::RraaThresholdsTable&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'ns3::WifiPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >*', 'ns3::WifiPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >&', 'ns3::WifiPsduMap&')
     typehandlers.add_type_alias('std::map< ns3::WifiMode, ns3::Time >', 'ns3::TxTime')
     typehandlers.add_type_alias('std::map< ns3::WifiMode, ns3::Time >*', 'ns3::TxTime*')
     typehandlers.add_type_alias('std::map< ns3::WifiMode, ns3::Time >&', 'ns3::TxTime&')
     typehandlers.add_type_alias('std::vector< ns3::McsGroup >', 'ns3::MinstrelMcsGroups')
     typehandlers.add_type_alias('std::vector< ns3::McsGroup >*', 'ns3::MinstrelMcsGroups*')
     typehandlers.add_type_alias('std::vector< ns3::McsGroup >&', 'ns3::MinstrelMcsGroups&')
-    typehandlers.add_type_alias('std::vector< ns3::HtRateInfo >', 'ns3::HtMinstrelRate')
-    typehandlers.add_type_alias('std::vector< ns3::HtRateInfo >*', 'ns3::HtMinstrelRate*')
-    typehandlers.add_type_alias('std::vector< ns3::HtRateInfo >&', 'ns3::HtMinstrelRate&')
+    typehandlers.add_type_alias('std::vector< ns3::MinstrelHtRateInfo >', 'ns3::MinstrelHtRate')
+    typehandlers.add_type_alias('std::vector< ns3::MinstrelHtRateInfo >*', 'ns3::MinstrelHtRate*')
+    typehandlers.add_type_alias('std::vector< ns3::MinstrelHtRateInfo >&', 'ns3::MinstrelHtRate&')
     typehandlers.add_type_alias('std::vector< ns3::GroupInfo >', 'ns3::McsGroupData')
     typehandlers.add_type_alias('std::vector< ns3::GroupInfo >*', 'ns3::McsGroupData*')
     typehandlers.add_type_alias('std::vector< ns3::GroupInfo >&', 'ns3::McsGroupData&')
@@ -1292,6 +1508,21 @@
     typehandlers.add_type_alias('std::vector< std::vector< unsigned char > >', 'ns3::SampleRate')
     typehandlers.add_type_alias('std::vector< std::vector< unsigned char > >*', 'ns3::SampleRate*')
     typehandlers.add_type_alias('std::vector< std::vector< unsigned char > >&', 'ns3::SampleRate&')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'ns3::WifiConstPsduMap')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >*', 'ns3::WifiConstPsduMap*')
+    typehandlers.add_type_alias('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >&', 'ns3::WifiConstPsduMap&')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >', 'ns3::FrequencyChannelInfo')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >*', 'ns3::FrequencyChannelInfo*')
+    typehandlers.add_type_alias('std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand >&', 'ns3::FrequencyChannelInfo&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxOkCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxOkCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxOkCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::RxErrorCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::RxErrorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::RxErrorCallback&')
+    typehandlers.add_type_alias('std::vector< std::pair< double, double > >', 'ns3::SnrPerTable')
+    typehandlers.add_type_alias('std::vector< std::pair< double, double > >*', 'ns3::SnrPerTable*')
+    typehandlers.add_type_alias('std::vector< std::pair< double, double > >&', 'ns3::SnrPerTable&')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >', 'ns3::RxPowerWattPerChannelBand')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >*', 'ns3::RxPowerWattPerChannelBand*')
     typehandlers.add_type_alias('std::map< std::pair< unsigned int, unsigned int >, double >&', 'ns3::RxPowerWattPerChannelBand&')
@@ -1310,12 +1541,18 @@
     typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
     typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
     typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >', 'ns3::WifiAddressTidPair')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >*', 'ns3::WifiAddressTidPair*')
+    typehandlers.add_type_alias('std::pair< ns3::Mac48Address, unsigned char >&', 'ns3::WifiAddressTidPair&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >', 'ns3::WifiModeList')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >*', 'ns3::WifiModeList*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode >&', 'ns3::WifiModeList&')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator', 'ns3::WifiModeListIterator')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator*', 'ns3::WifiModeListIterator*')
     typehandlers.add_type_alias('std::vector< ns3::WifiMode > const_iterator&', 'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias('uint16_t', 'ns3::WifiCodeRate')
+    typehandlers.add_type_alias('uint16_t*', 'ns3::WifiCodeRate*')
+    typehandlers.add_type_alias('uint16_t&', 'ns3::WifiCodeRate&')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )', 'ns3::TimePrinter')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )*', 'ns3::TimePrinter*')
     typehandlers.add_type_alias('void ( * ) ( std::ostream & )&', 'ns3::TimePrinter&')
@@ -1440,7 +1677,8 @@
     register_Ns3BandInfo_methods(root_module, root_module['ns3::BandInfo'])
     register_Ns3Bar_methods(root_module, root_module['ns3::Bar'])
     register_Ns3BlockAckAgreement_methods(root_module, root_module['ns3::BlockAckAgreement'])
-    register_Ns3BlockAckCache_methods(root_module, root_module['ns3::BlockAckCache'])
+    register_Ns3BlockAckReqType_methods(root_module, root_module['ns3::BlockAckReqType'])
+    register_Ns3BlockAckType_methods(root_module, root_module['ns3::BlockAckType'])
     register_Ns3BlockAckWindow_methods(root_module, root_module['ns3::BlockAckWindow'])
     register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
     register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
@@ -1451,6 +1689,7 @@
     register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
     register_Ns3CapabilityInformation_methods(root_module, root_module['ns3::CapabilityInformation'])
+    register_Ns3CtrlTriggerUserInfoField_methods(root_module, root_module['ns3::CtrlTriggerUserInfoField'])
     register_Ns3DataRate_methods(root_module, root_module['ns3::DataRate'])
     register_Ns3DefaultDeleter__Ns3AttributeAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::AttributeAccessor >'])
     register_Ns3DefaultDeleter__Ns3AttributeChecker_methods(root_module, root_module['ns3::DefaultDeleter< ns3::AttributeChecker >'])
@@ -1464,6 +1703,7 @@
     register_Ns3DefaultDeleter__Ns3NixVector_methods(root_module, root_module['ns3::DefaultDeleter< ns3::NixVector >'])
     register_Ns3DefaultDeleter__Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::DefaultDeleter< ns3::OutputStreamWrapper >'])
     register_Ns3DefaultDeleter__Ns3Packet_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Packet >'])
+    register_Ns3DefaultDeleter__Ns3PhyEntity_methods(root_module, root_module['ns3::DefaultDeleter< ns3::PhyEntity >'])
     register_Ns3DefaultDeleter__Ns3QosBlockedDestinations_methods(root_module, root_module['ns3::DefaultDeleter< ns3::QosBlockedDestinations >'])
     register_Ns3DefaultDeleter__Ns3QueueItem_methods(root_module, root_module['ns3::DefaultDeleter< ns3::QueueItem >'])
     register_Ns3DefaultDeleter__Ns3SpectrumModel_methods(root_module, root_module['ns3::DefaultDeleter< ns3::SpectrumModel >'])
@@ -1482,21 +1722,21 @@
     register_Ns3GroupInfo_methods(root_module, root_module['ns3::GroupInfo'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3HeMuUserInfo_methods(root_module, root_module['ns3::HeMuUserInfo'])
-    register_Ns3HePreambleParameters_methods(root_module, root_module['ns3::HePreambleParameters'])
     register_Ns3HeRu_methods(root_module, root_module['ns3::HeRu'])
     register_Ns3HeRuRuSpec_methods(root_module, root_module['ns3::HeRu::RuSpec'])
-    register_Ns3HtRateInfo_methods(root_module, root_module['ns3::HtRateInfo'])
+    register_Ns3HeSigAParameters_methods(root_module, root_module['ns3::HeSigAParameters'])
     register_Ns3InterferenceHelper_methods(root_module, root_module['ns3::InterferenceHelper'])
-    register_Ns3InterferenceHelperSnrPer_methods(root_module, root_module['ns3::InterferenceHelper::SnrPer'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
     register_Ns3Mac8Address_methods(root_module, root_module['ns3::Mac8Address'])
-    register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
     register_Ns3McsGroup_methods(root_module, root_module['ns3::McsGroup'])
+    register_Ns3MinstrelHtRateInfo_methods(root_module, root_module['ns3::MinstrelHtRateInfo'])
     register_Ns3MpduInfo_methods(root_module, root_module['ns3::MpduInfo'])
     register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
     register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
@@ -1518,6 +1758,8 @@
     register_Ns3PropagationCache__Ns3JakesProcess_methods(root_module, root_module['ns3::PropagationCache< ns3::JakesProcess >'])
     register_Ns3QueueSize_methods(root_module, root_module['ns3::QueueSize'])
     register_Ns3RateInfo_methods(root_module, root_module['ns3::RateInfo'])
+    register_Ns3RecipientBlockAckAgreement_methods(root_module, root_module['ns3::RecipientBlockAckAgreement'])
+    register_Ns3RxSignalInfo_methods(root_module, root_module['ns3::RxSignalInfo'])
     register_Ns3SignalNoiseDbm_methods(root_module, root_module['ns3::SignalNoiseDbm'])
     register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     register_Ns3Simulator_methods(root_module, root_module['ns3::Simulator'])
@@ -1534,12 +1776,30 @@
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
     register_Ns3Vector2D_methods(root_module, root_module['ns3::Vector2D'])
     register_Ns3Vector3D_methods(root_module, root_module['ns3::Vector3D'])
+    register_Ns3WifiAc_methods(root_module, root_module['ns3::WifiAc'])
+    register_Ns3WifiAcknowledgment_methods(root_module, root_module['ns3::WifiAcknowledgment'])
+    register_Ns3WifiAddressHash_methods(root_module, root_module['ns3::WifiAddressHash'])
+    register_Ns3WifiAddressTidHash_methods(root_module, root_module['ns3::WifiAddressTidHash'])
+    register_Ns3WifiBarBlockAck_methods(root_module, root_module['ns3::WifiBarBlockAck'])
+    register_Ns3WifiBlockAck_methods(root_module, root_module['ns3::WifiBlockAck'])
+    register_Ns3WifiDlMuAggregateTf_methods(root_module, root_module['ns3::WifiDlMuAggregateTf'])
+    register_Ns3WifiDlMuAggregateTfBlockAckInfo_methods(root_module, root_module['ns3::WifiDlMuAggregateTf::BlockAckInfo'])
+    register_Ns3WifiDlMuBarBaSequence_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence'])
+    register_Ns3WifiDlMuBarBaSequenceAckInfo_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence::AckInfo'])
+    register_Ns3WifiDlMuBarBaSequenceBlockAckInfo_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence::BlockAckInfo'])
+    register_Ns3WifiDlMuBarBaSequenceBlockAckReqInfo_methods(root_module, root_module['ns3::WifiDlMuBarBaSequence::BlockAckReqInfo'])
+    register_Ns3WifiDlMuTfMuBar_methods(root_module, root_module['ns3::WifiDlMuTfMuBar'])
+    register_Ns3WifiDlMuTfMuBarBlockAckInfo_methods(root_module, root_module['ns3::WifiDlMuTfMuBar::BlockAckInfo'])
     register_Ns3WifiHelper_methods(root_module, root_module['ns3::WifiHelper'])
     register_Ns3WifiMacHelper_methods(root_module, root_module['ns3::WifiMacHelper'])
     register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
     register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
+    register_Ns3WifiNoAck_methods(root_module, root_module['ns3::WifiNoAck'])
+    register_Ns3WifiNormalAck_methods(root_module, root_module['ns3::WifiNormalAck'])
     register_Ns3WifiPhyHelper_methods(root_module, root_module['ns3::WifiPhyHelper'])
     register_Ns3WifiPhyListener_methods(root_module, root_module['ns3::WifiPhyListener'])
+    register_Ns3WifiPhyOperatingChannel_methods(root_module, root_module['ns3::WifiPhyOperatingChannel'])
+    register_Ns3WifiProtection_methods(root_module, root_module['ns3::WifiProtection'])
     register_Ns3WifiRadioEnergyModelHelper_methods(root_module, root_module['ns3::WifiRadioEnergyModelHelper'])
     register_Ns3WifiRadioEnergyModelPhyListener_methods(root_module, root_module['ns3::WifiRadioEnergyModelPhyListener'])
     register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
@@ -1547,10 +1807,15 @@
     register_Ns3WifiRemoteStationState_methods(root_module, root_module['ns3::WifiRemoteStationState'])
     register_Ns3WifiRraaThresholds_methods(root_module, root_module['ns3::WifiRraaThresholds'])
     register_Ns3WifiRrpaaThresholds_methods(root_module, root_module['ns3::WifiRrpaaThresholds'])
+    register_Ns3WifiRtsCtsProtection_methods(root_module, root_module['ns3::WifiRtsCtsProtection'])
     register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, root_module['ns3::WifiSpectrumValue5MhzFactory'])
     register_Ns3WifiSpectrumValueHelper_methods(root_module, root_module['ns3::WifiSpectrumValueHelper'])
     register_Ns3WifiStandardInfo_methods(root_module, root_module['ns3::WifiStandardInfo'])
+    register_Ns3WifiTxParameters_methods(root_module, root_module['ns3::WifiTxParameters'])
+    register_Ns3WifiTxParametersPsduInfo_methods(root_module, root_module['ns3::WifiTxParameters::PsduInfo'])
+    register_Ns3WifiTxTimer_methods(root_module, root_module['ns3::WifiTxTimer'])
     register_Ns3WifiTxVector_methods(root_module, root_module['ns3::WifiTxVector'])
+    register_Ns3WifiUlMuMultiStaBa_methods(root_module, root_module['ns3::WifiUlMuMultiStaBa'])
     register_Ns3YansWifiChannelHelper_methods(root_module, root_module['ns3::YansWifiChannelHelper'])
     register_Ns3YansWifiPhyHelper_methods(root_module, root_module['ns3::YansWifiPhyHelper'])
     register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
@@ -1558,8 +1823,6 @@
     register_Ns3AmpduTag_methods(root_module, root_module['ns3::AmpduTag'])
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
-    register_Ns3HtSigHeader_methods(root_module, root_module['ns3::HtSigHeader'])
-    register_Ns3LSigHeader_methods(root_module, root_module['ns3::LSigHeader'])
     register_Ns3MgtAddBaRequestHeader_methods(root_module, root_module['ns3::MgtAddBaRequestHeader'])
     register_Ns3MgtAddBaResponseHeader_methods(root_module, root_module['ns3::MgtAddBaResponseHeader'])
     register_Ns3MgtAssocRequestHeader_methods(root_module, root_module['ns3::MgtAssocRequestHeader'])
@@ -1569,6 +1832,7 @@
     register_Ns3MgtProbeResponseHeader_methods(root_module, root_module['ns3::MgtProbeResponseHeader'])
     register_Ns3MgtReassocRequestHeader_methods(root_module, root_module['ns3::MgtReassocRequestHeader'])
     register_Ns3MinstrelWifiRemoteStation_methods(root_module, root_module['ns3::MinstrelWifiRemoteStation'])
+    register_Ns3MuSnrTag_methods(root_module, root_module['ns3::MuSnrTag'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
     register_Ns3ObssPdAlgorithm_methods(root_module, root_module['ns3::ObssPdAlgorithm'])
@@ -1594,6 +1858,7 @@
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >'])
     register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >'])
     register_Ns3SimpleRefCount__Ns3QosBlockedDestinations_Ns3Empty_Ns3DefaultDeleter__lt__ns3QosBlockedDestinations__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> >'])
     register_Ns3SimpleRefCount__Ns3QueueItem_Ns3Empty_Ns3DefaultDeleter__lt__ns3QueueItem__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::QueueItem, ns3::empty, ns3::DefaultDeleter<ns3::QueueItem> >'])
     register_Ns3SimpleRefCount__Ns3SpectrumModel_Ns3Empty_Ns3DefaultDeleter__lt__ns3SpectrumModel__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::SpectrumModel, ns3::empty, ns3::DefaultDeleter<ns3::SpectrumModel> >'])
@@ -1625,20 +1890,25 @@
     register_Ns3Txop_methods(root_module, root_module['ns3::Txop'])
     register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
     register_Ns3VhtConfiguration_methods(root_module, root_module['ns3::VhtConfiguration'])
-    register_Ns3VhtSigHeader_methods(root_module, root_module['ns3::VhtSigHeader'])
     register_Ns3WeibullRandomVariable_methods(root_module, root_module['ns3::WeibullRandomVariable'])
-    register_Ns3WifiAckPolicySelector_methods(root_module, root_module['ns3::WifiAckPolicySelector'])
+    register_Ns3WifiAckAfterTbPpdu_methods(root_module, root_module['ns3::WifiAckAfterTbPpdu'])
+    register_Ns3WifiAckManager_methods(root_module, root_module['ns3::WifiAckManager'])
     register_Ns3WifiActionHeader_methods(root_module, root_module['ns3::WifiActionHeader'])
     register_Ns3WifiActionHeaderActionValue_methods(root_module, root_module['ns3::WifiActionHeader::ActionValue'])
+    register_Ns3WifiCtsToSelfProtection_methods(root_module, root_module['ns3::WifiCtsToSelfProtection'])
+    register_Ns3WifiDefaultAckManager_methods(root_module, root_module['ns3::WifiDefaultAckManager'])
     register_Ns3WifiInformationElement_methods(root_module, root_module['ns3::WifiInformationElement'])
     register_Ns3WifiInformationElementVector_methods(root_module, root_module['ns3::WifiInformationElementVector'])
     register_Ns3WifiMac_methods(root_module, root_module['ns3::WifiMac'])
     register_Ns3WifiMacHeader_methods(root_module, root_module['ns3::WifiMacHeader'])
     register_Ns3WifiMacQueueItem_methods(root_module, root_module['ns3::WifiMacQueueItem'])
+    register_Ns3WifiMacQueueItemQueueIteratorPair_methods(root_module, root_module['ns3::WifiMacQueueItem::QueueIteratorPair'])
     register_Ns3WifiMacTrailer_methods(root_module, root_module['ns3::WifiMacTrailer'])
+    register_Ns3WifiNoProtection_methods(root_module, root_module['ns3::WifiNoProtection'])
     register_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
     register_Ns3WifiPhyStateHelper_methods(root_module, root_module['ns3::WifiPhyStateHelper'])
     register_Ns3WifiPpdu_methods(root_module, root_module['ns3::WifiPpdu'])
+    register_Ns3WifiProtectionManager_methods(root_module, root_module['ns3::WifiProtectionManager'])
     register_Ns3WifiPsdu_methods(root_module, root_module['ns3::WifiPsdu'])
     register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
     register_Ns3WifiSpectrumPhyInterface_methods(root_module, root_module['ns3::WifiSpectrumPhyInterface'])
@@ -1666,7 +1936,6 @@
     register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
     register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
     register_Ns3CaraWifiManager_methods(root_module, root_module['ns3::CaraWifiManager'])
-    register_Ns3CfParameterSet_methods(root_module, root_module['ns3::CfParameterSet'])
     register_Ns3Channel_methods(root_module, root_module['ns3::Channel'])
     register_Ns3ChannelAccessManager_methods(root_module, root_module['ns3::ChannelAccessManager'])
     register_Ns3ChannelCondition_methods(root_module, root_module['ns3::ChannelCondition'])
@@ -1675,17 +1944,18 @@
     register_Ns3ConstantRandomVariable_methods(root_module, root_module['ns3::ConstantRandomVariable'])
     register_Ns3ConstantRateWifiManager_methods(root_module, root_module['ns3::ConstantRateWifiManager'])
     register_Ns3ConstantSpeedPropagationDelayModel_methods(root_module, root_module['ns3::ConstantSpeedPropagationDelayModel'])
-    register_Ns3ConstantWifiAckPolicySelector_methods(root_module, root_module['ns3::ConstantWifiAckPolicySelector'])
     register_Ns3Cost231PropagationLossModel_methods(root_module, root_module['ns3::Cost231PropagationLossModel'])
     register_Ns3CtrlBAckRequestHeader_methods(root_module, root_module['ns3::CtrlBAckRequestHeader'])
     register_Ns3CtrlBAckResponseHeader_methods(root_module, root_module['ns3::CtrlBAckResponseHeader'])
+    register_Ns3CtrlTriggerHeader_methods(root_module, root_module['ns3::CtrlTriggerHeader'])
     register_Ns3DataRateChecker_methods(root_module, root_module['ns3::DataRateChecker'])
     register_Ns3DataRateValue_methods(root_module, root_module['ns3::DataRateValue'])
     register_Ns3DeterministicRandomVariable_methods(root_module, root_module['ns3::DeterministicRandomVariable'])
     register_Ns3DeviceEnergyModel_methods(root_module, root_module['ns3::DeviceEnergyModel'])
     register_Ns3DoubleValue_methods(root_module, root_module['ns3::DoubleValue'])
     register_Ns3DsssParameterSet_methods(root_module, root_module['ns3::DsssParameterSet'])
-    register_Ns3DsssSigHeader_methods(root_module, root_module['ns3::DsssSigHeader'])
+    register_Ns3DsssPpdu_methods(root_module, root_module['ns3::DsssPpdu'])
+    register_Ns3DsssPpduDsssSigHeader_methods(root_module, root_module['ns3::DsssPpdu::DsssSigHeader'])
     register_Ns3EdcaParameterSet_methods(root_module, root_module['ns3::EdcaParameterSet'])
     register_Ns3EmpiricalRandomVariable_methods(root_module, root_module['ns3::EmpiricalRandomVariable'])
     register_Ns3EmptyAttributeAccessor_methods(root_module, root_module['ns3::EmptyAttributeAccessor'])
@@ -1707,12 +1977,12 @@
     register_Ns3ExtendedSupportedRatesIE_methods(root_module, root_module['ns3::ExtendedSupportedRatesIE'])
     register_Ns3FixedRssLossModel_methods(root_module, root_module['ns3::FixedRssLossModel'])
     register_Ns3FrameCaptureModel_methods(root_module, root_module['ns3::FrameCaptureModel'])
+    register_Ns3FrameExchangeManager_methods(root_module, root_module['ns3::FrameExchangeManager'])
     register_Ns3FriisPropagationLossModel_methods(root_module, root_module['ns3::FriisPropagationLossModel'])
     register_Ns3GammaRandomVariable_methods(root_module, root_module['ns3::GammaRandomVariable'])
     register_Ns3HeCapabilities_methods(root_module, root_module['ns3::HeCapabilities'])
     register_Ns3HeConfiguration_methods(root_module, root_module['ns3::HeConfiguration'])
     register_Ns3HeOperation_methods(root_module, root_module['ns3::HeOperation'])
-    register_Ns3HeSigHeader_methods(root_module, root_module['ns3::HeSigHeader'])
     register_Ns3HtCapabilities_methods(root_module, root_module['ns3::HtCapabilities'])
     register_Ns3HtConfiguration_methods(root_module, root_module['ns3::HtConfiguration'])
     register_Ns3HtOperation_methods(root_module, root_module['ns3::HtOperation'])
@@ -1737,7 +2007,6 @@
     register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
     register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
     register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
-    register_Ns3MacLow_methods(root_module, root_module['ns3::MacLow'])
     register_Ns3MacRxMiddle_methods(root_module, root_module['ns3::MacRxMiddle'])
     register_Ns3MacTxMiddle_methods(root_module, root_module['ns3::MacTxMiddle'])
     register_Ns3MatrixPropagationLossModel_methods(root_module, root_module['ns3::MatrixPropagationLossModel'])
@@ -1747,6 +2016,9 @@
     register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
     register_Ns3MpduAggregator_methods(root_module, root_module['ns3::MpduAggregator'])
     register_Ns3MsduAggregator_methods(root_module, root_module['ns3::MsduAggregator'])
+    register_Ns3MultiUserScheduler_methods(root_module, root_module['ns3::MultiUserScheduler'])
+    register_Ns3MultiUserSchedulerDlMuInfo_methods(root_module, root_module['ns3::MultiUserScheduler::DlMuInfo'])
+    register_Ns3MultiUserSchedulerUlMuInfo_methods(root_module, root_module['ns3::MultiUserScheduler::UlMuInfo'])
     register_Ns3NakagamiPropagationLossModel_methods(root_module, root_module['ns3::NakagamiPropagationLossModel'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NeverLosChannelConditionModel_methods(root_module, root_module['ns3::NeverLosChannelConditionModel'])
@@ -1757,13 +2029,19 @@
     register_Ns3NormalRandomVariable_methods(root_module, root_module['ns3::NormalRandomVariable'])
     register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
     register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
+    register_Ns3OfdmPpdu_methods(root_module, root_module['ns3::OfdmPpdu'])
+    register_Ns3OfdmPpduLSigHeader_methods(root_module, root_module['ns3::OfdmPpdu::LSigHeader'])
     register_Ns3OkumuraHataPropagationLossModel_methods(root_module, root_module['ns3::OkumuraHataPropagationLossModel'])
     register_Ns3OnoeWifiManager_methods(root_module, root_module['ns3::OnoeWifiManager'])
     register_Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::OutputStreamWrapper'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
     register_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
     register_Ns3ParfWifiManager_methods(root_module, root_module['ns3::ParfWifiManager'])
+    register_Ns3PhyEntity_methods(root_module, root_module['ns3::PhyEntity'])
+    register_Ns3PhyEntityPhyFieldRxStatus_methods(root_module, root_module['ns3::PhyEntity::PhyFieldRxStatus'])
+    register_Ns3PhyEntitySnrPer_methods(root_module, root_module['ns3::PhyEntity::SnrPer'])
     register_Ns3QosBlockedDestinations_methods(root_module, root_module['ns3::QosBlockedDestinations'])
+    register_Ns3QosFrameExchangeManager_methods(root_module, root_module['ns3::QosFrameExchangeManager'])
     register_Ns3QosTxop_methods(root_module, root_module['ns3::QosTxop'])
     register_Ns3Queue__Ns3Packet_methods(root_module, root_module['ns3::Queue< ns3::Packet >'])
     register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, root_module['ns3::Queue< ns3::QueueDiscItem >'])
@@ -1774,6 +2052,7 @@
     register_Ns3RateErrorModel_methods(root_module, root_module['ns3::RateErrorModel'])
     register_Ns3ReceiveListErrorModel_methods(root_module, root_module['ns3::ReceiveListErrorModel'])
     register_Ns3RegularWifiMac_methods(root_module, root_module['ns3::RegularWifiMac'])
+    register_Ns3RrMultiUserScheduler_methods(root_module, root_module['ns3::RrMultiUserScheduler'])
     register_Ns3RraaWifiManager_methods(root_module, root_module['ns3::RraaWifiManager'])
     register_Ns3RrpaaWifiManager_methods(root_module, root_module['ns3::RrpaaWifiManager'])
     register_Ns3SimpleFrameCaptureModel_methods(root_module, root_module['ns3::SimpleFrameCaptureModel'])
@@ -1782,8 +2061,10 @@
     register_Ns3Ssid_methods(root_module, root_module['ns3::Ssid'])
     register_Ns3SsidChecker_methods(root_module, root_module['ns3::SsidChecker'])
     register_Ns3SsidValue_methods(root_module, root_module['ns3::SsidValue'])
+    register_Ns3StaWifiMac_methods(root_module, root_module['ns3::StaWifiMac'])
     register_Ns3SupportedRates_methods(root_module, root_module['ns3::SupportedRates'])
     register_Ns3TableBasedErrorRateModel_methods(root_module, root_module['ns3::TableBasedErrorRateModel'])
+    register_Ns3ThompsonSamplingWifiManager_methods(root_module, root_module['ns3::ThompsonSamplingWifiManager'])
     register_Ns3ThreeGppChannelConditionModel_methods(root_module, root_module['ns3::ThreeGppChannelConditionModel'])
     register_Ns3ThreeGppIndoorMixedOfficeChannelConditionModel_methods(root_module, root_module['ns3::ThreeGppIndoorMixedOfficeChannelConditionModel'])
     register_Ns3ThreeGppIndoorOfficePropagationLossModel_methods(root_module, root_module['ns3::ThreeGppIndoorOfficePropagationLossModel'])
@@ -1802,6 +2083,9 @@
     register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
     register_Ns3VhtCapabilities_methods(root_module, root_module['ns3::VhtCapabilities'])
     register_Ns3VhtOperation_methods(root_module, root_module['ns3::VhtOperation'])
+    register_Ns3VhtPpdu_methods(root_module, root_module['ns3::VhtPpdu'])
+    register_Ns3VhtPpduVhtSigHeader_methods(root_module, root_module['ns3::VhtPpdu::VhtSigHeader'])
+    register_Ns3WifiDefaultProtectionManager_methods(root_module, root_module['ns3::WifiDefaultProtectionManager'])
     register_Ns3WifiMacQueue_methods(root_module, root_module['ns3::WifiMacQueue'])
     register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
     register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
@@ -1813,9 +2097,15 @@
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3AdhocWifiMac_methods(root_module, root_module['ns3::AdhocWifiMac'])
     register_Ns3AlwaysLosChannelConditionModel_methods(root_module, root_module['ns3::AlwaysLosChannelConditionModel'])
+    register_Ns3ApWifiMac_methods(root_module, root_module['ns3::ApWifiMac'])
     register_Ns3BinaryErrorModel_methods(root_module, root_module['ns3::BinaryErrorModel'])
     register_Ns3BurstErrorModel_methods(root_module, root_module['ns3::BurstErrorModel'])
+    register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Bool_Unsigned_int_Double_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Double_Double_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1823,7 +2113,7 @@
     register_Ns3CallbackImpl__Void_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3DataRate_Ns3DataRate_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3HePreambleParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3HeSigAParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Ptr__lt__const_ns3MobilityModel__gt___Double_Double_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
@@ -1843,25 +2133,41 @@
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3SpectrumSignalParameters__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Double_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_char_Double_Bool_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
     register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
-    register_Ns3InfrastructureWifiMac_methods(root_module, root_module['ns3::InfrastructureWifiMac'])
+    register_Ns3CallbackImpl__Void_Unsigned_short_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, root_module['ns3::CallbackImpl< void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >'])
+    register_Ns3DsssPhy_methods(root_module, root_module['ns3::DsssPhy'])
+    register_Ns3ErpOfdmPpdu_methods(root_module, root_module['ns3::ErpOfdmPpdu'])
+    register_Ns3HePpdu_methods(root_module, root_module['ns3::HePpdu'])
+    register_Ns3HePpduHeSigHeader_methods(root_module, root_module['ns3::HePpdu::HeSigHeader'])
+    register_Ns3HtFrameExchangeManager_methods(root_module, root_module['ns3::HtFrameExchangeManager'])
+    register_Ns3HtPpdu_methods(root_module, root_module['ns3::HtPpdu'])
+    register_Ns3HtPpduHtSigHeader_methods(root_module, root_module['ns3::HtPpdu::HtSigHeader'])
+    register_Ns3OfdmPhy_methods(root_module, root_module['ns3::OfdmPhy'])
     register_Ns3ProbabilisticV2vHighwayChannelConditionModel_methods(root_module, root_module['ns3::ProbabilisticV2vHighwayChannelConditionModel'])
     register_Ns3ProbabilisticV2vUrbanChannelConditionModel_methods(root_module, root_module['ns3::ProbabilisticV2vUrbanChannelConditionModel'])
     register_Ns3QueueDiscItem_methods(root_module, root_module['ns3::QueueDiscItem'])
-    register_Ns3StaWifiMac_methods(root_module, root_module['ns3::StaWifiMac'])
-    register_Ns3ApWifiMac_methods(root_module, root_module['ns3::ApWifiMac'])
+    register_Ns3VhtFrameExchangeManager_methods(root_module, root_module['ns3::VhtFrameExchangeManager'])
+    register_Ns3ErpOfdmPhy_methods(root_module, root_module['ns3::ErpOfdmPhy'])
+    register_Ns3HeFrameExchangeManager_methods(root_module, root_module['ns3::HeFrameExchangeManager'])
+    register_Ns3HtPhy_methods(root_module, root_module['ns3::HtPhy'])
+    register_Ns3VhtPhy_methods(root_module, root_module['ns3::VhtPhy'])
+    register_Ns3HePhy_methods(root_module, root_module['ns3::HePhy'])
     register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
     register_Ns3HashFunctionFnv1a_methods(root_module, root_module['ns3::Hash::Function::Fnv1a'])
     register_Ns3HashFunctionHash32_methods(root_module, root_module['ns3::Hash::Function::Hash32'])
@@ -1943,18 +2249,32 @@
     cls.add_output_stream_operator()
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Angles const & arg0) [constructor]
     cls.add_constructor([param('ns3::Angles const &', 'arg0')])
-    ## angles.h (module 'antenna'): ns3::Angles::Angles() [constructor]
-    cls.add_constructor([])
-    ## angles.h (module 'antenna'): ns3::Angles::Angles(double phi, double theta) [constructor]
-    cls.add_constructor([param('double', 'phi'), param('double', 'theta')])
+    ## angles.h (module 'antenna'): ns3::Angles::Angles(double azimuth, double inclination) [constructor]
+    cls.add_constructor([param('double', 'azimuth'), param('double', 'inclination')])
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v) [constructor]
     cls.add_constructor([param('ns3::Vector', 'v')])
     ## angles.h (module 'antenna'): ns3::Angles::Angles(ns3::Vector v, ns3::Vector o) [constructor]
     cls.add_constructor([param('ns3::Vector', 'v'), param('ns3::Vector', 'o')])
-    ## angles.h (module 'antenna'): ns3::Angles::phi [variable]
-    cls.add_instance_attribute('phi', 'double', is_const=False)
-    ## angles.h (module 'antenna'): ns3::Angles::theta [variable]
-    cls.add_instance_attribute('theta', 'double', is_const=False)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetAzimuth() const [member function]
+    cls.add_method('GetAzimuth', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): double ns3::Angles::GetInclination() const [member function]
+    cls.add_method('GetInclination', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## angles.h (module 'antenna'): void ns3::Angles::SetAzimuth(double azimuth) [member function]
+    cls.add_method('SetAzimuth', 
+                   'void', 
+                   [param('double', 'azimuth')])
+    ## angles.h (module 'antenna'): void ns3::Angles::SetInclination(double inclination) [member function]
+    cls.add_method('SetInclination', 
+                   'void', 
+                   [param('double', 'inclination')])
+    ## angles.h (module 'antenna'): ns3::Angles::m_printDeg [variable]
+    cls.add_static_attribute('m_printDeg', 'bool', is_const=False)
     return
 
 def register_Ns3ApInfo_methods(root_module, cls):
@@ -2190,11 +2510,26 @@
     cls.add_constructor([param('ns3::BlockAckAgreement const &', 'arg0')])
     ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::Mac48Address peer, uint8_t tid) [constructor]
     cls.add_constructor([param('ns3::Mac48Address', 'peer'), param('uint8_t', 'tid')])
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckAgreement::GetBlockAckReqType() const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckAgreement::GetBlockAckType() const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [], 
+                   is_const=True)
     ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetBufferSize() const [member function]
     cls.add_method('GetBufferSize', 
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): static std::size_t ns3::BlockAckAgreement::GetDistance(uint16_t seqNumber, uint16_t startingSeqNumber) [member function]
+    cls.add_method('GetDistance', 
+                   'std::size_t', 
+                   [param('uint16_t', 'seqNumber'), param('uint16_t', 'startingSeqNumber')], 
+                   is_static=True)
     ## block-ack-agreement.h (module 'wifi'): ns3::Mac48Address ns3::BlockAckAgreement::GetPeer() const [member function]
     cls.add_method('GetPeer', 
                    'ns3::Mac48Address', 
@@ -2204,7 +2539,7 @@
     cls.add_method('GetStartingSequence', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequenceControl() const [member function]
     cls.add_method('GetStartingSequenceControl', 
                    'uint16_t', 
@@ -2274,32 +2609,36 @@
                    [param('uint16_t', 'timeout')])
     return
 
-def register_Ns3BlockAckCache_methods(root_module, cls):
-    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache::BlockAckCache() [constructor]
-    cls.add_constructor([])
-    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache::BlockAckCache(ns3::BlockAckCache const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BlockAckCache const &', 'arg0')])
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::FillBlockAckBitmap(ns3::CtrlBAckResponseHeader * blockAckHeader) [member function]
-    cls.add_method('FillBlockAckBitmap', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader *', 'blockAckHeader')])
-    ## block-ack-cache.h (module 'wifi'): uint16_t ns3::BlockAckCache::GetWinStart() const [member function]
-    cls.add_method('GetWinStart', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::Init(uint16_t winStart, uint16_t winSize) [member function]
-    cls.add_method('Init', 
-                   'void', 
-                   [param('uint16_t', 'winStart'), param('uint16_t', 'winSize')])
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::UpdateWithBlockAckReq(uint16_t startingSeq) [member function]
-    cls.add_method('UpdateWithBlockAckReq', 
-                   'void', 
-                   [param('uint16_t', 'startingSeq')])
-    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::UpdateWithMpdu(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('UpdateWithMpdu', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
+def register_Ns3BlockAckReqType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::BlockAckReqType(ns3::BlockAckReqType::Variant v, uint8_t nSeqControls) [constructor]
+    cls.add_constructor([param('ns3::BlockAckReqType::Variant', 'v'), param('uint8_t', 'nSeqControls')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_nSeqControls [variable]
+    cls.add_instance_attribute('m_nSeqControls', 'uint8_t', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckReqType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckReqType::Variant', is_const=False)
+    return
+
+def register_Ns3BlockAckType_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType const &', 'arg0')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType() [constructor]
+    cls.add_constructor([])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::BlockAckType(ns3::BlockAckType::Variant v, std::vector<unsigned char, std::allocator<unsigned char> > l) [constructor]
+    cls.add_constructor([param('ns3::BlockAckType::Variant', 'v'), param('std::vector< unsigned char >', 'l')])
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_bitmapLen [variable]
+    cls.add_instance_attribute('m_bitmapLen', 'std::vector< unsigned char >', is_const=False)
+    ## block-ack-type.h (module 'wifi'): ns3::BlockAckType::m_variant [variable]
+    cls.add_instance_attribute('m_variant', 'ns3::BlockAckType::Variant', is_const=False)
     return
 
 def register_Ns3BlockAckWindow_methods(root_module, cls):
@@ -2315,6 +2654,11 @@
     cls.add_method('At', 
                    'std::vector< bool > reference', 
                    [param('std::size_t', 'distance')])
+    ## block-ack-window.h (module 'wifi'): std::vector<bool, std::allocator<bool> >::const_reference ns3::BlockAckWindow::At(std::size_t distance) const [member function]
+    cls.add_method('At', 
+                   'std::vector< bool > const_reference', 
+                   [param('std::size_t', 'distance')], 
+                   is_const=True)
     ## block-ack-window.h (module 'wifi'): uint16_t ns3::BlockAckWindow::GetWinEnd() const [member function]
     cls.add_method('GetWinEnd', 
                    'uint16_t', 
@@ -2786,9 +3130,177 @@
                    [param('bool', 'shortSlotTime')])
     return
 
+def register_Ns3CtrlTriggerUserInfoField_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField::CtrlTriggerUserInfoField(ns3::CtrlTriggerUserInfoField const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlTriggerUserInfoField const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField::CtrlTriggerUserInfoField(uint8_t triggerType) [constructor]
+    cls.add_constructor([param('uint8_t', 'triggerType')])
+    ## ctrl-headers.h (module 'wifi'): ns3::Buffer::Iterator ns3::CtrlTriggerUserInfoField::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')])
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerUserInfoField::GetAid12() const [member function]
+    cls.add_method('GetAid12', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::GetMoreRaRu() const [member function]
+    cls.add_method('GetMoreRaRu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetMpduMuSpacingFactor() const [member function]
+    cls.add_method('GetMpduMuSpacingFactor', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader const & ns3::CtrlTriggerUserInfoField::GetMuBarTriggerDepUserInfo() const [member function]
+    cls.add_method('GetMuBarTriggerDepUserInfo', 
+                   'ns3::CtrlBAckRequestHeader const &', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetNRaRus() const [member function]
+    cls.add_method('GetNRaRus', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetNss() const [member function]
+    cls.add_method('GetNss', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::AcIndex ns3::CtrlTriggerUserInfoField::GetPreferredAc() const [member function]
+    cls.add_method('GetPreferredAc', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::HeRu::RuSpec ns3::CtrlTriggerUserInfoField::GetRuAllocation() const [member function]
+    cls.add_method('GetRuAllocation', 
+                   'ns3::HeRu::RuSpec', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlTriggerUserInfoField::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetStartingSs() const [member function]
+    cls.add_method('GetStartingSs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetTidAggregationLimit() const [member function]
+    cls.add_method('GetTidAggregationLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType ns3::CtrlTriggerUserInfoField::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::TriggerFrameType', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::GetUlDcm() const [member function]
+    cls.add_method('GetUlDcm', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::GetUlFecCodingType() const [member function]
+    cls.add_method('GetUlFecCodingType', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerUserInfoField::GetUlMcs() const [member function]
+    cls.add_method('GetUlMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): int8_t ns3::CtrlTriggerUserInfoField::GetUlTargetRssi() const [member function]
+    cls.add_method('GetUlTargetRssi', 
+                   'int8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::HasRaRuForAssociatedSta() const [member function]
+    cls.add_method('HasRaRuForAssociatedSta', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::HasRaRuForUnassociatedSta() const [member function]
+    cls.add_method('HasRaRuForUnassociatedSta', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerUserInfoField::IsUlTargetRssiMaxTxPower() const [member function]
+    cls.add_method('IsUlTargetRssiMaxTxPower', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::Buffer::Iterator ns3::CtrlTriggerUserInfoField::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetAid12(uint16_t aid) [member function]
+    cls.add_method('SetAid12', 
+                   'void', 
+                   [param('uint16_t', 'aid')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetBasicTriggerDepUserInfo(uint8_t spacingFactor, uint8_t tidLimit, ns3::AcIndex prefAc) [member function]
+    cls.add_method('SetBasicTriggerDepUserInfo', 
+                   'void', 
+                   [param('uint8_t', 'spacingFactor'), param('uint8_t', 'tidLimit'), param('ns3::AcIndex', 'prefAc')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetMuBarTriggerDepUserInfo(ns3::CtrlBAckRequestHeader const & bar) [member function]
+    cls.add_method('SetMuBarTriggerDepUserInfo', 
+                   'void', 
+                   [param('ns3::CtrlBAckRequestHeader const &', 'bar')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetRaRuInformation(uint8_t nRaRu, bool moreRaRu) [member function]
+    cls.add_method('SetRaRuInformation', 
+                   'void', 
+                   [param('uint8_t', 'nRaRu'), param('bool', 'moreRaRu')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetRuAllocation(ns3::HeRu::RuSpec ru) [member function]
+    cls.add_method('SetRuAllocation', 
+                   'void', 
+                   [param('ns3::HeRu::RuSpec', 'ru')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetSsAllocation(uint8_t startingSs, uint8_t nSs) [member function]
+    cls.add_method('SetSsAllocation', 
+                   'void', 
+                   [param('uint8_t', 'startingSs'), param('uint8_t', 'nSs')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlDcm(bool dcm) [member function]
+    cls.add_method('SetUlDcm', 
+                   'void', 
+                   [param('bool', 'dcm')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlFecCodingType(bool ldpc) [member function]
+    cls.add_method('SetUlFecCodingType', 
+                   'void', 
+                   [param('bool', 'ldpc')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlMcs(uint8_t mcs) [member function]
+    cls.add_method('SetUlMcs', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlTargetRssi(int8_t dBm) [member function]
+    cls.add_method('SetUlTargetRssi', 
+                   'void', 
+                   [param('int8_t', 'dBm')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerUserInfoField::SetUlTargetRssiMaxTxPower() [member function]
+    cls.add_method('SetUlTargetRssiMaxTxPower', 
+                   'void', 
+                   [])
+    return
+
 def register_Ns3DataRate_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('double', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('uint64_t', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('double', 'right'))
+    cls.add_inplace_numeric_operator('*=', param('uint64_t', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::DataRate', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::DataRate'], root_module['ns3::DataRate'], param('ns3::DataRate', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::DataRate', 'right'))
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
@@ -2963,6 +3475,18 @@
                    is_static=True)
     return
 
+def register_Ns3DefaultDeleter__Ns3PhyEntity_methods(root_module, cls):
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity>::DefaultDeleter() [constructor]
+    cls.add_constructor([])
+    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::PhyEntity>::DefaultDeleter(ns3::DefaultDeleter<ns3::PhyEntity> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DefaultDeleter< ns3::PhyEntity > const &', 'arg0')])
+    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::PhyEntity>::Delete(ns3::PhyEntity * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::PhyEntity *', 'object')], 
+                   is_static=True)
+    return
+
 def register_Ns3DefaultDeleter__Ns3QosBlockedDestinations_methods(root_module, cls):
     ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::QosBlockedDestinations>::DefaultDeleter() [constructor]
     cls.add_constructor([])
@@ -3294,7 +3818,7 @@
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::GroupInfo::m_maxTpRate2 [variable]
     cls.add_instance_attribute('m_maxTpRate2', 'uint16_t', is_const=False)
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::GroupInfo::m_ratesTable [variable]
-    cls.add_instance_attribute('m_ratesTable', 'ns3::HtMinstrelRate', is_const=False)
+    cls.add_instance_attribute('m_ratesTable', 'ns3::MinstrelHtRate', is_const=False)
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::GroupInfo::m_supported [variable]
     cls.add_instance_attribute('m_supported', 'bool', is_const=False)
     return
@@ -3341,41 +3865,60 @@
     cls.add_instance_attribute('ru', 'ns3::HeRu::RuSpec', is_const=False)
     return
 
-def register_Ns3HePreambleParameters_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::HePreambleParameters() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::HePreambleParameters(ns3::HePreambleParameters const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HePreambleParameters const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::bssColor [variable]
-    cls.add_instance_attribute('bssColor', 'uint8_t', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::HePreambleParameters::rssiW [variable]
-    cls.add_instance_attribute('rssiW', 'double', is_const=False)
-    return
-
 def register_Ns3HeRu_methods(root_module, cls):
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu() [constructor]
     cls.add_constructor([])
     ## he-ru.h (module 'wifi'): ns3::HeRu::HeRu(ns3::HeRu const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu const &', 'arg0')])
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > const & v) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('std::vector< ns3::HeRu::RuSpec > const &', 'v')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static bool ns3::HeRu::DoesOverlap(uint16_t bw, ns3::HeRu::RuSpec ru, ns3::HeRu::SubcarrierGroup const & toneRanges) [member function]
+    cls.add_method('DoesOverlap', 
+                   'bool', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'ru'), param('ns3::HeRu::SubcarrierGroup const &', 'toneRanges')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuSpec ns3::HeRu::FindOverlappingRu(uint16_t bw, ns3::HeRu::RuSpec referenceRu, ns3::HeRu::RuType searchedRuType) [member function]
+    cls.add_method('FindOverlappingRu', 
+                   'ns3::HeRu::RuSpec', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuSpec', 'referenceRu'), param('ns3::HeRu::RuType', 'searchedRuType')], 
+                   is_static=True)
     ## he-ru.h (module 'wifi'): static uint16_t ns3::HeRu::GetBandwidth(ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetBandwidth', 
                    'uint16_t', 
                    [param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations) [member function]
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetCentral26TonesRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetCentral26TonesRus', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetEqualSizedRusForStations(uint16_t bandwidth, std::size_t & nStations, std::size_t & nCentral26TonesRus) [member function]
     cls.add_method('GetEqualSizedRusForStations', 
                    'ns3::HeRu::RuType', 
-                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations')], 
+                   [param('uint16_t', 'bandwidth'), param('std::size_t &', 'nStations'), param('std::size_t &', 'nCentral26TonesRus')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint8_t bw, ns3::HeRu::RuType ruType) [member function]
+    ## he-ru.h (module 'wifi'): static std::size_t ns3::HeRu::GetNRus(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
     cls.add_method('GetNRus', 
                    'std::size_t', 
-                   [param('uint8_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::RuType ns3::HeRu::GetRuType(uint16_t bandwidth) [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [param('uint16_t', 'bandwidth')], 
+                   is_static=True)
+    ## he-ru.h (module 'wifi'): static std::vector<ns3::HeRu::RuSpec, std::allocator<ns3::HeRu::RuSpec> > ns3::HeRu::GetRusOfType(uint16_t bw, ns3::HeRu::RuType ruType) [member function]
+    cls.add_method('GetRusOfType', 
+                   'std::vector< ns3::HeRu::RuSpec >', 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType')], 
                    is_static=True)
-    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint8_t bw, ns3::HeRu::RuType ruType, std::size_t index) [member function]
+    ## he-ru.h (module 'wifi'): static ns3::HeRu::SubcarrierGroup ns3::HeRu::GetSubcarrierGroup(uint16_t bw, ns3::HeRu::RuType ruType, std::size_t phyIndex) [member function]
     cls.add_method('GetSubcarrierGroup', 
                    'ns3::HeRu::SubcarrierGroup', 
-                   [param('uint8_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index')], 
+                   [param('uint16_t', 'bw'), param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'phyIndex')], 
                    is_static=True)
     ## he-ru.h (module 'wifi'): ns3::HeRu::m_heRuSubcarrierGroups [variable]
     cls.add_static_attribute('m_heRuSubcarrierGroups', 'ns3::HeRu::SubcarrierGroups const', is_const=True)
@@ -3383,57 +3926,52 @@
 
 def register_Ns3HeRuRuSpec_methods(root_module, cls):
     cls.add_output_stream_operator()
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec() [constructor]
-    cls.add_constructor([])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuSpec const & arg0) [constructor]
     cls.add_constructor([param('ns3::HeRu::RuSpec const &', 'arg0')])
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::index [variable]
-    cls.add_instance_attribute('index', 'std::size_t', is_const=False)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::primary80MHz [variable]
-    cls.add_instance_attribute('primary80MHz', 'bool', is_const=False)
-    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::ruType [variable]
-    cls.add_instance_attribute('ruType', 'ns3::HeRu::RuType', is_const=False)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec() [constructor]
+    cls.add_constructor([])
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuSpec::RuSpec(ns3::HeRu::RuType ruType, std::size_t index, bool primary80MHz) [constructor]
+    cls.add_constructor([param('ns3::HeRu::RuType', 'ruType'), param('std::size_t', 'index'), param('bool', 'primary80MHz')])
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetIndex() const [member function]
+    cls.add_method('GetIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): std::size_t ns3::HeRu::RuSpec::GetPhyIndex() const [member function]
+    cls.add_method('GetPhyIndex', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::GetPrimary80MHz() const [member function]
+    cls.add_method('GetPrimary80MHz', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): ns3::HeRu::RuType ns3::HeRu::RuSpec::GetRuType() const [member function]
+    cls.add_method('GetRuType', 
+                   'ns3::HeRu::RuType', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): bool ns3::HeRu::RuSpec::IsPhyIndexSet() const [member function]
+    cls.add_method('IsPhyIndexSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## he-ru.h (module 'wifi'): void ns3::HeRu::RuSpec::SetPhyIndex(uint16_t bw, uint8_t p20Index) [member function]
+    cls.add_method('SetPhyIndex', 
+                   'void', 
+                   [param('uint16_t', 'bw'), param('uint8_t', 'p20Index')])
     return
 
-def register_Ns3HtRateInfo_methods(root_module, cls):
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::HtRateInfo() [constructor]
-    cls.add_constructor([])
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::HtRateInfo(ns3::HtRateInfo const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtRateInfo const &', 'arg0')])
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::adjustedRetryCount [variable]
-    cls.add_instance_attribute('adjustedRetryCount', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::attemptHist [variable]
-    cls.add_instance_attribute('attemptHist', 'uint64_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::ewmaProb [variable]
-    cls.add_instance_attribute('ewmaProb', 'double', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::ewmsdProb [variable]
-    cls.add_instance_attribute('ewmsdProb', 'double', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::mcsIndex [variable]
-    cls.add_instance_attribute('mcsIndex', 'uint8_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::numRateAttempt [variable]
-    cls.add_instance_attribute('numRateAttempt', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::numRateSuccess [variable]
-    cls.add_instance_attribute('numRateSuccess', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::numSamplesSkipped [variable]
-    cls.add_instance_attribute('numSamplesSkipped', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::perfectTxTime [variable]
-    cls.add_instance_attribute('perfectTxTime', 'ns3::Time', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::prevNumRateAttempt [variable]
-    cls.add_instance_attribute('prevNumRateAttempt', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::prevNumRateSuccess [variable]
-    cls.add_instance_attribute('prevNumRateSuccess', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::prob [variable]
-    cls.add_instance_attribute('prob', 'double', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::retryCount [variable]
-    cls.add_instance_attribute('retryCount', 'uint32_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::retryUpdated [variable]
-    cls.add_instance_attribute('retryUpdated', 'bool', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::successHist [variable]
-    cls.add_instance_attribute('successHist', 'uint64_t', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::supported [variable]
-    cls.add_instance_attribute('supported', 'bool', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::HtRateInfo::throughput [variable]
-    cls.add_instance_attribute('throughput', 'double', is_const=False)
+def register_Ns3HeSigAParameters_methods(root_module, cls):
+    ## he-phy.h (module 'wifi'): ns3::HeSigAParameters::HeSigAParameters() [constructor]
+    cls.add_constructor([])
+    ## he-phy.h (module 'wifi'): ns3::HeSigAParameters::HeSigAParameters(ns3::HeSigAParameters const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeSigAParameters const &', 'arg0')])
+    ## he-phy.h (module 'wifi'): ns3::HeSigAParameters::bssColor [variable]
+    cls.add_instance_attribute('bssColor', 'uint8_t', is_const=False)
+    ## he-phy.h (module 'wifi'): ns3::HeSigAParameters::rssiW [variable]
+    cls.add_instance_attribute('rssiW', 'double', is_const=False)
     return
 
 def register_Ns3InterferenceHelper_methods(root_module, cls):
@@ -3441,10 +3979,10 @@
     cls.add_constructor([param('ns3::InterferenceHelper const &', 'arg0')])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper() [constructor]
     cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::InterferenceHelper::Add(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::InterferenceHelper::Add(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [member function]
     cls.add_method('Add', 
                    'ns3::Ptr< ns3::Event >', 
-                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')])
     ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddBand(ns3::WifiSpectrumBand band) [member function]
     cls.add_method('AddBand', 
                    'void', 
@@ -3453,21 +3991,16 @@
     cls.add_method('AddForeignSignal', 
                    'void', 
                    [param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateHtPhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('CalculateHtPhyHeaderSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
-                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculateNonHtPhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('CalculateNonHtPhyHeaderSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
-                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer ns3::InterferenceHelper::CalculatePayloadSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, uint16_t staId, std::pair<ns3::Time, ns3::Time> relativeMpduStartStop) const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::InterferenceHelper::CalculatePayloadSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, uint16_t staId, std::pair<ns3::Time, ns3::Time> relativeMpduStartStop) const [member function]
     cls.add_method('CalculatePayloadSnrPer', 
-                   'ns3::InterferenceHelper::SnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
                    [param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'channelWidth'), param('std::pair< unsigned int, unsigned int >', 'band'), param('uint16_t', 'staId'), param('std::pair< ns3::Time, ns3::Time >', 'relativeMpduStartStop')], 
                    is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::InterferenceHelper::CalculatePhyHeaderSnrPer(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, ns3::WifiSpectrumBand band, ns3::WifiPpduField header) const [member function]
+    cls.add_method('CalculatePhyHeaderSnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'channelWidth'), param('std::pair< unsigned int, unsigned int >', 'band'), param('ns3::WifiPpduField', 'header')], 
+                   is_const=True)
     ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateSnr(ns3::Ptr<ns3::Event> event, uint16_t channelWidth, uint8_t nss, ns3::WifiSpectrumBand band) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
@@ -3477,20 +4010,19 @@
     cls.add_method('EraseEvents', 
                    'void', 
                    [])
-    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW, ns3::WifiSpectrumBand band) const [member function]
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::InterferenceHelper::GetEnergyDuration(double energyW, ns3::WifiSpectrumBand band) [member function]
     cls.add_method('GetEnergyDuration', 
                    'ns3::Time', 
-                   [param('double', 'energyW'), param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
+                   [param('double', 'energyW'), param('std::pair< unsigned int, unsigned int >', 'band')])
     ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::ErrorRateModel> ns3::InterferenceHelper::GetErrorRateModel() const [member function]
     cls.add_method('GetErrorRateModel', 
                    'ns3::Ptr< ns3::ErrorRateModel >', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd() [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd(ns3::Time endTime) [member function]
     cls.add_method('NotifyRxEnd', 
                    'void', 
-                   [])
+                   [param('ns3::Time', 'endTime')])
     ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxStart() [member function]
     cls.add_method('NotifyRxStart', 
                    'void', 
@@ -3511,10 +4043,19 @@
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint8_t', 'rx')])
-    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiMode mode, ns3::WifiTxVector txVector) const [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiMode mode, ns3::WifiTxVector const & txVector, ns3::WifiPpduField field) const [member function]
     cls.add_method('CalculateChunkSuccessRate', 
                    'double', 
-                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector')], 
+                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPpduField', 'field')], 
+                   is_const=True, visibility='protected')
+    ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculatePayloadChunkSuccessRate(double snir, ns3::Time duration, ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
+    cls.add_method('CalculatePayloadChunkSuccessRate', 
+                   'double', 
+                   [param('double', 'snir'), param('ns3::Time', 'duration'), param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True, visibility='protected')
     ## interference-helper.h (module 'wifi'): double ns3::InterferenceHelper::CalculateSnr(double signal, double noiseInterference, uint16_t channelWidth, uint8_t nss) const [member function]
     cls.add_method('CalculateSnr', 
@@ -3523,17 +4064,6 @@
                    is_const=True, visibility='protected')
     return
 
-def register_Ns3InterferenceHelperSnrPer_methods(root_module, cls):
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer() [constructor]
-    cls.add_constructor([])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::SnrPer(ns3::InterferenceHelper::SnrPer const & arg0) [constructor]
-    cls.add_constructor([param('ns3::InterferenceHelper::SnrPer const &', 'arg0')])
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::per [variable]
-    cls.add_instance_attribute('per', 'double', is_const=False)
-    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::SnrPer::snr [variable]
-    cls.add_instance_attribute('snr', 'double', is_const=False)
-    return
-
 def register_Ns3Ipv4Address_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3657,6 +4187,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3870,6 +4412,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -3945,6 +4492,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -3965,6 +4524,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -4179,119 +4743,76 @@
                    is_static=True)
     return
 
-def register_Ns3MacLowTransmissionParameters_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters(ns3::MacLowTransmissionParameters const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacLowTransmissionParameters const &', 'arg0')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters() [constructor]
-    cls.add_constructor([])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableAck() [member function]
-    cls.add_method('DisableAck', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableBlockAckRequest() [member function]
-    cls.add_method('DisableBlockAckRequest', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableNextData() [member function]
-    cls.add_method('DisableNextData', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableRts() [member function]
-    cls.add_method('DisableRts', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableAck() [member function]
-    cls.add_method('EnableAck', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBlockAck(ns3::BlockAckType type) [member function]
-    cls.add_method('EnableBlockAck', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBlockAckRequest(ns3::BlockAckType type) [member function]
-    cls.add_method('EnableBlockAckRequest', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableNextData(uint32_t size) [member function]
-    cls.add_method('EnableNextData', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## mac-low-transmission-parameters.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableRts() [member function]
-    cls.add_method('EnableRts', 
-                   'void', 
-                   [])
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::BlockAckType ns3::MacLowTransmissionParameters::GetBlockAckRequestType() const [member function]
-    cls.add_method('GetBlockAckRequestType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): ns3::BlockAckType ns3::MacLowTransmissionParameters::GetBlockAckType() const [member function]
-    cls.add_method('GetBlockAckType', 
-                   'ns3::BlockAckType', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): uint32_t ns3::MacLowTransmissionParameters::GetNextPacketSize() const [member function]
-    cls.add_method('GetNextPacketSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::HasNextPacket() const [member function]
-    cls.add_method('HasNextPacket', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendBlockAckRequest() const [member function]
-    cls.add_method('MustSendBlockAckRequest', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendRts() const [member function]
-    cls.add_method('MustSendRts', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitBlockAck() const [member function]
-    cls.add_method('MustWaitBlockAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## mac-low-transmission-parameters.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitNormalAck() const [member function]
-    cls.add_method('MustWaitNormalAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    return
-
-def register_Ns3McsGroup_methods(root_module, cls):
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::McsGroup() [constructor]
+def register_Ns3McsGroup_methods(root_module, cls):
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::McsGroup() [constructor]
     cls.add_constructor([])
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::McsGroup(ns3::McsGroup const & arg0) [constructor]
     cls.add_constructor([param('ns3::McsGroup const &', 'arg0')])
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::chWidth [variable]
     cls.add_instance_attribute('chWidth', 'uint16_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::gi [variable]
+    cls.add_instance_attribute('gi', 'uint16_t', is_const=False)
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::isSupported [variable]
     cls.add_instance_attribute('isSupported', 'bool', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::isVht [variable]
-    cls.add_instance_attribute('isVht', 'bool', is_const=False)
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::ratesFirstMpduTxTimeTable [variable]
     cls.add_instance_attribute('ratesFirstMpduTxTimeTable', 'ns3::TxTime', is_const=False)
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::ratesTxTimeTable [variable]
     cls.add_instance_attribute('ratesTxTimeTable', 'ns3::TxTime', is_const=False)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::sgi [variable]
-    cls.add_instance_attribute('sgi', 'uint8_t', is_const=False)
     ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::streams [variable]
     cls.add_instance_attribute('streams', 'uint8_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::McsGroup::type [variable]
+    cls.add_instance_attribute('type', 'ns3::McsGroupType', is_const=False)
+    return
+
+def register_Ns3MinstrelHtRateInfo_methods(root_module, cls):
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::MinstrelHtRateInfo() [constructor]
+    cls.add_constructor([])
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::MinstrelHtRateInfo(ns3::MinstrelHtRateInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MinstrelHtRateInfo const &', 'arg0')])
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::adjustedRetryCount [variable]
+    cls.add_instance_attribute('adjustedRetryCount', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::attemptHist [variable]
+    cls.add_instance_attribute('attemptHist', 'uint64_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::ewmaProb [variable]
+    cls.add_instance_attribute('ewmaProb', 'double', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::ewmsdProb [variable]
+    cls.add_instance_attribute('ewmsdProb', 'double', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::mcsIndex [variable]
+    cls.add_instance_attribute('mcsIndex', 'uint8_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::numRateAttempt [variable]
+    cls.add_instance_attribute('numRateAttempt', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::numRateSuccess [variable]
+    cls.add_instance_attribute('numRateSuccess', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::numSamplesSkipped [variable]
+    cls.add_instance_attribute('numSamplesSkipped', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::perfectTxTime [variable]
+    cls.add_instance_attribute('perfectTxTime', 'ns3::Time', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::prevNumRateAttempt [variable]
+    cls.add_instance_attribute('prevNumRateAttempt', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::prevNumRateSuccess [variable]
+    cls.add_instance_attribute('prevNumRateSuccess', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::prob [variable]
+    cls.add_instance_attribute('prob', 'double', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::retryCount [variable]
+    cls.add_instance_attribute('retryCount', 'uint32_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::retryUpdated [variable]
+    cls.add_instance_attribute('retryUpdated', 'bool', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::successHist [variable]
+    cls.add_instance_attribute('successHist', 'uint64_t', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::supported [variable]
+    cls.add_instance_attribute('supported', 'bool', is_const=False)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtRateInfo::throughput [variable]
+    cls.add_instance_attribute('throughput', 'double', is_const=False)
     return
 
 def register_Ns3MpduInfo_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::MpduInfo() [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::MpduInfo() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::MpduInfo(ns3::MpduInfo const & arg0) [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::MpduInfo(ns3::MpduInfo const & arg0) [constructor]
     cls.add_constructor([param('ns3::MpduInfo const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::mpduRefNumber [variable]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::mpduRefNumber [variable]
     cls.add_instance_attribute('mpduRefNumber', 'uint32_t', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::MpduInfo::type [variable]
+    ## phy-entity.h (module 'wifi'): ns3::MpduInfo::type [variable]
     cls.add_instance_attribute('type', 'ns3::MpduType', is_const=False)
     return
 
@@ -4537,7 +5058,7 @@
     cls.add_method('GetStartingSequence', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::InitTxWindow() [member function]
     cls.add_method('InitTxWindow', 
                    'void', 
@@ -5026,14 +5547,54 @@
     cls.add_instance_attribute('throughput', 'uint32_t', is_const=False)
     return
 
+def register_Ns3RecipientBlockAckAgreement_methods(root_module, cls):
+    ## recipient-block-ack-agreement.h (module 'wifi'): ns3::RecipientBlockAckAgreement::RecipientBlockAckAgreement(ns3::RecipientBlockAckAgreement const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RecipientBlockAckAgreement const &', 'arg0')])
+    ## recipient-block-ack-agreement.h (module 'wifi'): ns3::RecipientBlockAckAgreement::RecipientBlockAckAgreement(ns3::Mac48Address originator, bool amsduSupported, uint8_t tid, uint16_t bufferSize, uint16_t timeout, uint16_t startingSeq, bool htSupported) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address', 'originator'), param('bool', 'amsduSupported'), param('uint8_t', 'tid'), param('uint16_t', 'bufferSize'), param('uint16_t', 'timeout'), param('uint16_t', 'startingSeq'), param('bool', 'htSupported')])
+    ## recipient-block-ack-agreement.h (module 'wifi'): void ns3::RecipientBlockAckAgreement::FillBlockAckBitmap(ns3::CtrlBAckResponseHeader * blockAckHeader, std::size_t index=0) const [member function]
+    cls.add_method('FillBlockAckBitmap', 
+                   'void', 
+                   [param('ns3::CtrlBAckResponseHeader *', 'blockAckHeader'), param('std::size_t', 'index', default_value='0')], 
+                   is_const=True)
+    ## recipient-block-ack-agreement.h (module 'wifi'): void ns3::RecipientBlockAckAgreement::Flush() [member function]
+    cls.add_method('Flush', 
+                   'void', 
+                   [])
+    ## recipient-block-ack-agreement.h (module 'wifi'): void ns3::RecipientBlockAckAgreement::NotifyReceivedBar(uint16_t startingSequenceNumber) [member function]
+    cls.add_method('NotifyReceivedBar', 
+                   'void', 
+                   [param('uint16_t', 'startingSequenceNumber')])
+    ## recipient-block-ack-agreement.h (module 'wifi'): void ns3::RecipientBlockAckAgreement::NotifyReceivedMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyReceivedMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## recipient-block-ack-agreement.h (module 'wifi'): void ns3::RecipientBlockAckAgreement::SetMacRxMiddle(ns3::Ptr<ns3::MacRxMiddle> const rxMiddle) [member function]
+    cls.add_method('SetMacRxMiddle', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MacRxMiddle > const', 'rxMiddle')])
+    return
+
+def register_Ns3RxSignalInfo_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::RxSignalInfo() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::RxSignalInfo(ns3::RxSignalInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RxSignalInfo const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::rssi [variable]
+    cls.add_instance_attribute('rssi', 'double', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::RxSignalInfo::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
+    return
+
 def register_Ns3SignalNoiseDbm_methods(root_module, cls):
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm() [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm() [constructor]
     cls.add_constructor([])
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm(ns3::SignalNoiseDbm const & arg0) [constructor]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::SignalNoiseDbm(ns3::SignalNoiseDbm const & arg0) [constructor]
     cls.add_constructor([param('ns3::SignalNoiseDbm const &', 'arg0')])
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::noise [variable]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::noise [variable]
     cls.add_instance_attribute('noise', 'double', is_const=False)
-    ## wifi-phy.h (module 'wifi'): ns3::SignalNoiseDbm::signal [variable]
+    ## phy-entity.h (module 'wifi'): ns3::SignalNoiseDbm::signal [variable]
     cls.add_instance_attribute('signal', 'double', is_const=False)
     return
 
@@ -5858,6 +6419,290 @@
     cls.add_instance_attribute('z', 'double', is_const=False)
     return
 
+def register_Ns3WifiAc_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(ns3::WifiAc const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAc const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAc::WifiAc(uint8_t lowTid, uint8_t highTid) [constructor]
+    cls.add_constructor([param('uint8_t', 'lowTid'), param('uint8_t', 'highTid')])
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetHighTid() const [member function]
+    cls.add_method('GetHighTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetLowTid() const [member function]
+    cls.add_method('GetLowTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-utils.h (module 'wifi'): uint8_t ns3::WifiAc::GetOtherTid(uint8_t tid) const [member function]
+    cls.add_method('GetOtherTid', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    return
+
+def register_Ns3WifiAcknowledgment_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::WifiAcknowledgment(ns3::WifiAcknowledgment::Method m) [constructor]
+    cls.add_constructor([param('ns3::WifiAcknowledgment::Method', 'm')])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAcknowledgment::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiAcknowledgment::GetQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid) const [member function]
+    cls.add_method('GetQosAckPolicy', 
+                   'ns3::WifiMacHeader::QosAckPolicy', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiAcknowledgment::SetQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) [member function]
+    cls.add_method('SetQosAckPolicy', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')])
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiAcknowledgment::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::method [variable]
+    cls.add_instance_attribute('method', 'ns3::WifiAcknowledgment::Method const', is_const=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::acknowledgmentTime [variable]
+    cls.add_instance_attribute('acknowledgmentTime', 'ns3::Time', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAcknowledgment::WifiAcknowledgment(ns3::WifiAcknowledgment const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAcknowledgment const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiAcknowledgment::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3WifiAddressHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressHash::WifiAddressHash(ns3::WifiAddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressHash::operator()(ns3::Mac48Address const & address) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3WifiAddressTidHash_methods(root_module, cls):
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash() [constructor]
+    cls.add_constructor([])
+    ## qos-utils.h (module 'wifi'): ns3::WifiAddressTidHash::WifiAddressTidHash(ns3::WifiAddressTidHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAddressTidHash const &', 'arg0')])
+    ## qos-utils.h (module 'wifi'): std::size_t ns3::WifiAddressTidHash::operator()(ns3::WifiAddressTidPair const & addressTidPair) const [member operator]
+    cls.add_method('operator()', 
+                   'std::size_t', 
+                   [param('ns3::WifiAddressTidPair const &', 'addressTidPair')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3WifiBarBlockAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::WifiBarBlockAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBarBlockAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiBarBlockAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiBarBlockAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::blockAckReqTxVector [variable]
+    cls.add_instance_attribute('blockAckReqTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::barType [variable]
+    cls.add_instance_attribute('barType', 'ns3::BlockAckReqType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBarBlockAck::WifiBarBlockAck(ns3::WifiBarBlockAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiBarBlockAck const &', 'arg0')])
+    return
+
+def register_Ns3WifiBlockAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::WifiBlockAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiBlockAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiBlockAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiBlockAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiBlockAck::WifiBlockAck(ns3::WifiBlockAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiBlockAck const &', 'arg0')])
+    return
+
+def register_Ns3WifiDlMuAggregateTf_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::WifiDlMuAggregateTf(ns3::WifiDlMuAggregateTf const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuAggregateTf const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::WifiDlMuAggregateTf() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiDlMuAggregateTf::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuAggregateTf::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiDlMuAggregateTf::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::stationsReplyingWithBlockAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithBlockAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuAggregateTf::BlockAckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::ulLength [variable]
+    cls.add_instance_attribute('ulLength', 'uint16_t', is_const=False)
+    return
+
+def register_Ns3WifiDlMuAggregateTfBlockAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::BlockAckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::BlockAckInfo(ns3::WifiDlMuAggregateTf::BlockAckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuAggregateTf::BlockAckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::barHeader [variable]
+    cls.add_instance_attribute('barHeader', 'ns3::CtrlBAckRequestHeader', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuAggregateTf::BlockAckInfo::muBarSize [variable]
+    cls.add_instance_attribute('muBarSize', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequence_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::WifiDlMuBarBaSequence(ns3::WifiDlMuBarBaSequence const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::WifiDlMuBarBaSequence() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiDlMuBarBaSequence::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuBarBaSequence::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiDlMuBarBaSequence::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::stationsReplyingWithBlockAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithBlockAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::stationsReplyingWithNormalAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithNormalAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::AckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::stationsSendBlockAckReqTo [variable]
+    cls.add_instance_attribute('stationsSendBlockAckReqTo', 'std::map< ns3::Mac48Address, ns3::WifiDlMuBarBaSequence::BlockAckReqInfo >', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequenceAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo::AckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo::AckInfo(ns3::WifiDlMuBarBaSequence::AckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence::AckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::AckInfo::ackTxVector [variable]
+    cls.add_instance_attribute('ackTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequenceBlockAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::BlockAckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::BlockAckInfo(ns3::WifiDlMuBarBaSequence::BlockAckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence::BlockAckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiDlMuBarBaSequenceBlockAckReqInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::BlockAckReqInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::BlockAckReqInfo(ns3::WifiDlMuBarBaSequence::BlockAckReqInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuBarBaSequence::BlockAckReqInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::barType [variable]
+    cls.add_instance_attribute('barType', 'ns3::BlockAckReqType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::blockAckReqTxVector [variable]
+    cls.add_instance_attribute('blockAckReqTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuBarBaSequence::BlockAckReqInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiDlMuTfMuBar_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::WifiDlMuTfMuBar(ns3::WifiDlMuTfMuBar const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuTfMuBar const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::WifiDlMuTfMuBar() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiDlMuTfMuBar::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDlMuTfMuBar::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiDlMuTfMuBar::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::barTypes [variable]
+    cls.add_instance_attribute('barTypes', 'std::list< ns3::BlockAckReqType >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::muBarTxVector [variable]
+    cls.add_instance_attribute('muBarTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::stationsReplyingWithBlockAck [variable]
+    cls.add_instance_attribute('stationsReplyingWithBlockAck', 'std::map< ns3::Mac48Address, ns3::WifiDlMuTfMuBar::BlockAckInfo >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::ulLength [variable]
+    cls.add_instance_attribute('ulLength', 'uint16_t', is_const=False)
+    return
+
+def register_Ns3WifiDlMuTfMuBarBlockAckInfo_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::BlockAckInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::BlockAckInfo(ns3::WifiDlMuTfMuBar::BlockAckInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDlMuTfMuBar::BlockAckInfo const &', 'arg0')])
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::barHeader [variable]
+    cls.add_instance_attribute('barHeader', 'ns3::CtrlBAckRequestHeader', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiDlMuTfMuBar::BlockAckInfo::blockAckTxVector [variable]
+    cls.add_instance_attribute('blockAckTxVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
 def register_Ns3WifiHelper_methods(root_module, cls):
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper::WifiHelper(ns3::WifiHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiHelper const &', 'arg0')])
@@ -5892,10 +6737,6 @@
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('std::string', 'nodeName')], 
                    is_const=True, is_virtual=True)
-    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetAckPolicySelectorForAc(ns3::AcIndex ac, std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetAckPolicySelectorForAc', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac'), param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
     ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetObssPdAlgorithm(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetObssPdAlgorithm', 
                    'void', 
@@ -5925,20 +6766,16 @@
     cls.add_constructor([param('ns3::WifiMacHelper const &', 'arg0')])
     ## wifi-mac-helper.h (module 'wifi'): ns3::WifiMacHelper::WifiMacHelper() [constructor]
     cls.add_constructor([])
-    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::NetDevice> device) const [member function]
+    ## wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create(ns3::Ptr<ns3::NetDevice> device, ns3::WifiStandard standard) const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device'), param('ns3::WifiStandard', 'standard')], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-helper.h (module 'wifi'): void ns3::WifiMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue(), std::string n8="", ns3::AttributeValue const & v8=ns3::EmptyAttributeValue(), std::string n9="", ns3::AttributeValue const & v9=ns3::EmptyAttributeValue(), std::string n10="", ns3::AttributeValue const & v10=ns3::EmptyAttributeValue()) [member function]
-    cls.add_method('SetType', 
-                   'void', 
-                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n8', default_value='""'), param('ns3::AttributeValue const &', 'v8', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n9', default_value='""'), param('ns3::AttributeValue const &', 'v9', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n10', default_value='""'), param('ns3::AttributeValue const &', 'v10', default_value='ns3::EmptyAttributeValue()')], 
-                   is_virtual=True)
     return
 
 def register_Ns3WifiMode_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('!=')
     cls.add_binary_comparison_operator('<')
     cls.add_output_stream_operator()
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [constructor]
@@ -5962,10 +6799,10 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector txVector, uint16_t staId=65535) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
     cls.add_method('GetDataRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetDataRate', 
@@ -5992,10 +6829,15 @@
                    'uint64_t', 
                    [param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_const=True)
-    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector txVector) const [member function]
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(ns3::WifiTxVector const & txVector, uint16_t staId=65535) const [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate(uint16_t channelWidth) const [member function]
     cls.add_method('GetPhyRate', 
                    'uint64_t', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('uint16_t', 'channelWidth')], 
                    is_const=True)
     ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
     cls.add_method('GetUid', 
@@ -6032,18 +6874,64 @@
 def register_Ns3WifiModeFactory_methods(root_module, cls):
     ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMcs(std::string uniqueName, uint8_t mcsValue, ns3::WifiModulationClass modClass, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::NonHtReferenceRateCallback nonHtReferenceRateCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMcs', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass')], 
+                   [param('std::string', 'uniqueName'), param('uint8_t', 'mcsValue'), param('ns3::WifiModulationClass', 'modClass'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'nonHtReferenceRateCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
-    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiCodeRate codingRate, uint16_t constellationSize) [member function]
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, ns3::WifiModeFactory::CodeRateCallback codeRateCallback, ns3::WifiModeFactory::ConstellationSizeCallback constellationSizeCallback, ns3::WifiModeFactory::PhyRateCallback phyRateCallback, ns3::WifiModeFactory::PhyRateFromTxVectorCallback phyRateFromTxVectorCallback, ns3::WifiModeFactory::DataRateCallback dataRateCallback, ns3::WifiModeFactory::DataRateFromTxVectorCallback dataRateFromTxVectorCallback, ns3::WifiModeFactory::ModeAllowedCallback isModeAllowedCallback) [member function]
     cls.add_method('CreateWifiMode', 
                    'ns3::WifiMode', 
-                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::WifiCodeRate', 'codingRate'), param('uint16_t', 'constellationSize')], 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'codeRateCallback'), param('ns3::Callback< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'constellationSizeCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'phyRateFromTxVectorCallback'), param('ns3::Callback< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateCallback'), param('ns3::Callback< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'dataRateFromTxVectorCallback'), param('ns3::Callback< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'isModeAllowedCallback')], 
                    is_static=True)
     return
 
+def register_Ns3WifiNoAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck::WifiNoAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNoAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiNoAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiNoAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNoAck::WifiNoAck(ns3::WifiNoAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiNoAck const &', 'arg0')])
+    return
+
+def register_Ns3WifiNormalAck_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::WifiNormalAck() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiNormalAck::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiNormalAck::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiNormalAck::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::ackTxVector [variable]
+    cls.add_instance_attribute('ackTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiNormalAck::WifiNormalAck(ns3::WifiNormalAck const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiNormalAck const &', 'arg0')])
+    return
+
 def register_Ns3WifiPhyHelper_methods(root_module, cls):
     ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::WifiPhyHelper(ns3::WifiPhyHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiPhyHelper const &', 'arg0')])
@@ -6162,6 +7050,76 @@
                    is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3WifiPhyOperatingChannel_methods(root_module, cls):
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel(ns3::WifiPhyOperatingChannel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhyOperatingChannel const &', 'arg0')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): ns3::WifiPhyOperatingChannel::WifiPhyOperatingChannel() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetNumber() const [member function]
+    cls.add_method('GetNumber', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelCenterFrequency(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelCenterFrequency', 
+                   'uint16_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint8_t ns3::WifiPhyOperatingChannel::GetPrimaryChannelIndex(uint16_t primaryChannelWidth) const [member function]
+    cls.add_method('GetPrimaryChannelIndex', 
+                   'uint8_t', 
+                   [param('uint16_t', 'primaryChannelWidth')], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): uint16_t ns3::WifiPhyOperatingChannel::GetWidth() const [member function]
+    cls.add_method('GetWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): bool ns3::WifiPhyOperatingChannel::IsSet() const [member function]
+    cls.add_method('IsSet', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::Set(uint8_t number, uint16_t frequency, uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetDefault(uint16_t width, ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('SetDefault', 
+                   'void', 
+                   [param('uint16_t', 'width'), param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-phy-operating-channel.h (module 'wifi'): void ns3::WifiPhyOperatingChannel::SetPrimary20Index(uint8_t index) [member function]
+    cls.add_method('SetPrimary20Index', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    return
+
+def register_Ns3WifiProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::WifiProtection(ns3::WifiProtection::Method m) [constructor]
+    cls.add_constructor([param('ns3::WifiProtection::Method', 'm')])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::method [variable]
+    cls.add_instance_attribute('method', 'ns3::WifiProtection::Method const', is_const=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::protectionTime [variable]
+    cls.add_instance_attribute('protectionTime', 'ns3::Time', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiProtection::WifiProtection(ns3::WifiProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiRadioEnergyModelHelper_methods(root_module, cls):
     ## wifi-radio-energy-model-helper.h (module 'wifi'): ns3::WifiRadioEnergyModelHelper::WifiRadioEnergyModelHelper(ns3::WifiRadioEnergyModelHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRadioEnergyModelHelper const &', 'arg0')])
@@ -6261,6 +7219,8 @@
     cls.add_constructor([])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation(ns3::WifiRemoteStation const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiRemoteStation const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_rssiAndUpdateTimePair [variable]
+    cls.add_instance_attribute('m_rssiAndUpdateTimePair', 'std::pair< double, ns3::Time >', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_state [variable]
     cls.add_instance_attribute('m_state', 'ns3::WifiRemoteStationState *', is_const=False)
     return
@@ -6296,6 +7256,10 @@
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_channelWidth [variable]
     cls.add_instance_attribute('m_channelWidth', 'uint16_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_dsssSupported [variable]
+    cls.add_instance_attribute('m_dsssSupported', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_erpOfdmSupported [variable]
+    cls.add_instance_attribute('m_erpOfdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_guardInterval [variable]
     cls.add_instance_attribute('m_guardInterval', 'uint16_t', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_heCapabilities [variable]
@@ -6306,6 +7270,8 @@
     cls.add_instance_attribute('m_info', 'ns3::WifiRemoteStationInfo', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ness [variable]
     cls.add_instance_attribute('m_ness', 'uint8_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_ofdmSupported [variable]
+    cls.add_instance_attribute('m_ofdmSupported', 'bool', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
     cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiModeList', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
@@ -6346,6 +7312,27 @@
     cls.add_instance_attribute('m_ori', 'double', is_const=False)
     return
 
+def register_Ns3WifiRtsCtsProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::WifiRtsCtsProtection() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiRtsCtsProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiRtsCtsProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::rtsTxVector [variable]
+    cls.add_instance_attribute('rtsTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::ctsTxVector [variable]
+    cls.add_instance_attribute('ctsTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiRtsCtsProtection::WifiRtsCtsProtection(ns3::WifiRtsCtsProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiRtsCtsProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiSpectrumValue5MhzFactory_methods(root_module, cls):
     ## wifi-spectrum-value-helper.h (module 'spectrum'): ns3::WifiSpectrumValue5MhzFactory::WifiSpectrumValue5MhzFactory() [constructor]
     cls.add_constructor([])
@@ -6378,6 +7365,11 @@
                    'ns3::Ptr< ns3::SpectrumValue >', 
                    [param('uint32_t', 'centerFrequency'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeMuOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, ns3::WifiSpectrumBand ru) [member function]
+    cls.add_method('CreateHeMuOfdmTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('uint32_t', 'centerFrequency'), param('uint16_t', 'channelWidth'), param('double', 'txPowerW'), param('uint16_t', 'guardBandwidth'), param('std::pair< unsigned int, unsigned int >', 'ru')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumValue> ns3::WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40) [member function]
     cls.add_method('CreateHeOfdmTxPowerSpectralDensity', 
                    'ns3::Ptr< ns3::SpectrumValue >', 
@@ -6443,12 +7435,134 @@
     cls.add_instance_attribute('phyStandard', 'ns3::WifiPhyStandard', is_const=False)
     return
 
-def register_Ns3WifiTxVector_methods(root_module, cls):
-    cls.add_output_stream_operator()
+def register_Ns3WifiTxParameters_methods(root_module, cls):
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::WifiTxParameters() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::WifiTxParameters(ns3::WifiTxParameters const & txParams) [constructor]
+    cls.add_constructor([param('ns3::WifiTxParameters const &', 'txParams')])
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::AddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('AddMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::AggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu) [member function]
+    cls.add_method('AggregateMsdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu')])
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::Clear() [member function]
+    cls.add_method('Clear', 
+                   'void', 
+                   [])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo const * ns3::WifiTxParameters::GetPsduInfo(ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetPsduInfo', 
+                   'ns3::WifiTxParameters::PsduInfo const *', 
+                   [param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfoMap const & ns3::WifiTxParameters::GetPsduInfoMap() const [member function]
+    cls.add_method('GetPsduInfoMap', 
+                   'ns3::WifiTxParameters::PsduInfoMap const &', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): uint32_t ns3::WifiTxParameters::GetSize(ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): uint32_t ns3::WifiTxParameters::GetSizeIfAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('GetSizeIfAddMpdu', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): std::pair<unsigned int, unsigned int> ns3::WifiTxParameters::GetSizeIfAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu) const [member function]
+    cls.add_method('GetSizeIfAggregateMsdu', 
+                   'std::pair< unsigned int, unsigned int >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): void ns3::WifiTxParameters::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_acknowledgment [variable]
+    cls.add_instance_attribute('m_acknowledgment', 'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_protection [variable]
+    cls.add_instance_attribute('m_protection', 'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_txDuration [variable]
+    cls.add_instance_attribute('m_txDuration', 'ns3::Time', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::m_txVector [variable]
+    cls.add_instance_attribute('m_txVector', 'ns3::WifiTxVector', is_const=False)
+    return
+
+def register_Ns3WifiTxParametersPsduInfo_methods(root_module, cls):
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::PsduInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::PsduInfo(ns3::WifiTxParameters::PsduInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiTxParameters::PsduInfo const &', 'arg0')])
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::ampduSize [variable]
+    cls.add_instance_attribute('ampduSize', 'uint32_t', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::amsduSize [variable]
+    cls.add_instance_attribute('amsduSize', 'uint32_t', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::header [variable]
+    cls.add_instance_attribute('header', 'ns3::WifiMacHeader', is_const=False)
+    ## wifi-tx-parameters.h (module 'wifi'): ns3::WifiTxParameters::PsduInfo::seqNumbers [variable]
+    cls.add_instance_attribute('seqNumbers', 'std::map< unsigned char, std::set< unsigned short > >', is_const=False)
+    return
+
+def register_Ns3WifiTxTimer_methods(root_module, cls):
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::WifiTxTimer(ns3::WifiTxTimer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiTxTimer const &', 'arg0')])
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::WifiTxTimer() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## wifi-tx-timer.h (module 'wifi'): ns3::Time ns3::WifiTxTimer::GetDelayLeft() const [member function]
+    cls.add_method('GetDelayLeft', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): ns3::WifiTxTimer::Reason ns3::WifiTxTimer::GetReason() const [member function]
+    cls.add_method('GetReason', 
+                   'ns3::WifiTxTimer::Reason', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): std::string ns3::WifiTxTimer::GetReasonString(ns3::WifiTxTimer::Reason reason) const [member function]
+    cls.add_method('GetReasonString', 
+                   'std::string', 
+                   [param('ns3::WifiTxTimer::Reason', 'reason')], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): bool ns3::WifiTxTimer::IsRunning() const [member function]
+    cls.add_method('IsRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::Reschedule(ns3::Time const & delay) [member function]
+    cls.add_method('Reschedule', 
+                   'void', 
+                   [param('ns3::Time const &', 'delay')])
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::SetMpduResponseTimeoutCallback(ns3::WifiTxTimer::MpduResponseTimeout callback) const [member function]
+    cls.add_method('SetMpduResponseTimeoutCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::SetPsduMapResponseTimeoutCallback(ns3::WifiTxTimer::PsduMapResponseTimeout callback) const [member function]
+    cls.add_method('SetPsduMapResponseTimeoutCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_const=True)
+    ## wifi-tx-timer.h (module 'wifi'): void ns3::WifiTxTimer::SetPsduResponseTimeoutCallback(ns3::WifiTxTimer::PsduResponseTimeout callback) const [member function]
+    cls.add_method('SetPsduResponseTimeoutCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_const=True)
+    return
+
+def register_Ns3WifiTxVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, ns3::WifiPreamble preamble, uint16_t guardInterval, uint8_t nTx, uint8_t nss, uint8_t ness, uint16_t channelWidth, bool aggregation, bool stbc=false, bool ldpc=false, uint8_t bssColor=0, uint16_t length=0) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('ns3::WifiPreamble', 'preamble'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nTx'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('uint16_t', 'channelWidth'), param('bool', 'aggregation'), param('bool', 'stbc', default_value='false'), param('bool', 'ldpc', default_value='false'), param('uint8_t', 'bssColor', default_value='0'), param('uint16_t', 'length', default_value='0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & txVector) [constructor]
     cls.add_constructor([param('ns3::WifiTxVector const &', 'txVector')])
     ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetBssColor() const [member function]
@@ -6476,6 +7590,15 @@
                    'ns3::WifiTxVector::HeMuUserInfoMap const &', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::HeMuUserInfoMap & ns3::WifiTxVector::GetHeMuUserInfoMap() [member function]
+    cls.add_method('GetHeMuUserInfoMap', 
+                   'ns3::WifiTxVector::HeMuUserInfoMap &', 
+                   [])
+    ## wifi-tx-vector.h (module 'wifi'): uint16_t ns3::WifiTxVector::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode(uint16_t staId=65535) const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -6486,6 +7609,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiTxVector::GetModulationClass() const [member function]
+    cls.add_method('GetModulationClass', 
+                   'ns3::WifiModulationClass', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNTx() const [member function]
     cls.add_method('GetNTx', 
                    'uint8_t', 
@@ -6506,6 +7634,11 @@
                    'uint8_t', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): std::pair<unsigned long, unsigned long> ns3::WifiTxVector::GetNumRusPerHeSigBContentChannel() const [member function]
+    cls.add_method('GetNumRusPerHeSigBContentChannel', 
+                   'std::pair< unsigned long, unsigned long >', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiPreamble ns3::WifiTxVector::GetPreambleType() const [member function]
     cls.add_method('GetPreambleType', 
                    'ns3::WifiPreamble', 
@@ -6526,16 +7659,31 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsDlMu() const [member function]
+    cls.add_method('IsDlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsLdpc() const [member function]
     cls.add_method('IsLdpc', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsMu() const [member function]
+    cls.add_method('IsMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsStbc() const [member function]
     cls.add_method('IsStbc', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsUlMu() const [member function]
+    cls.add_method('IsUlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsValid() const [member function]
     cls.add_method('IsValid', 
                    'bool', 
@@ -6565,6 +7713,10 @@
     cls.add_method('SetLdpc', 
                    'void', 
                    [param('bool', 'ldpc')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
     cls.add_method('SetMode', 
                    'void', 
@@ -6607,6 +7759,36 @@
                    [param('uint8_t', 'powerlevel')])
     return
 
+def register_Ns3WifiUlMuMultiStaBa_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::WifiUlMuMultiStaBa() [constructor]
+    cls.add_constructor([])
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiUlMuMultiStaBa::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiUlMuMultiStaBa::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiUlMuMultiStaBa::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::stationsReceivingMultiStaBa [variable]
+    cls.add_instance_attribute('stationsReceivingMultiStaBa', 'std::map< std::pair< ns3::Mac48Address, unsigned char >, unsigned long >', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::baType [variable]
+    cls.add_instance_attribute('baType', 'ns3::BlockAckType', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::tbPpduTxVector [variable]
+    cls.add_instance_attribute('tbPpduTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::multiStaBaTxVector [variable]
+    cls.add_instance_attribute('multiStaBaTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiUlMuMultiStaBa::WifiUlMuMultiStaBa(ns3::WifiUlMuMultiStaBa const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiUlMuMultiStaBa const &', 'arg0')])
+    return
+
 def register_Ns3YansWifiChannelHelper_methods(root_module, cls):
     ## yans-wifi-helper.h (module 'wifi'): ns3::YansWifiChannelHelper::YansWifiChannelHelper(ns3::YansWifiChannelHelper const & arg0) [constructor]
     cls.add_constructor([param('ns3::YansWifiChannelHelper const &', 'arg0')])
@@ -6856,152 +8038,6 @@
                    is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3HtSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader::HtSigHeader(ns3::HtSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HtSigHeader::HtSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::GetAggregation() const [member function]
-    cls.add_method('GetAggregation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HtSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HtSigHeader::GetHtLength() const [member function]
-    cls.add_method('GetHtLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::HtSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HtSigHeader::GetMcs() const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HtSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::GetShortGuardInterval() const [member function]
-    cls.add_method('GetShortGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::HtSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HtSigHeader::IsLdpcFecCoding() const [member function]
-    cls.add_method('IsLdpcFecCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetAggregation(bool aggregation) [member function]
-    cls.add_method('SetAggregation', 
-                   'void', 
-                   [param('bool', 'aggregation')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetFecCoding(bool ldpc) [member function]
-    cls.add_method('SetFecCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetHtLength(uint16_t length) [member function]
-    cls.add_method('SetHtLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetMcs(uint8_t mcs) [member function]
-    cls.add_method('SetMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HtSigHeader::SetShortGuardInterval(bool sgi) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'sgi')])
-    return
-
-def register_Ns3LSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader::LSigHeader(ns3::LSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::LSigHeader::LSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::LSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::LSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::LSigHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint64_t ns3::LSigHeader::GetRate(uint16_t channelWidth=20) const [member function]
-    cls.add_method('GetRate', 
-                   'uint64_t', 
-                   [param('uint16_t', 'channelWidth', default_value='20')], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::LSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::LSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::LSigHeader::SetRate(uint64_t rate, uint16_t channelWidth=20) [member function]
-    cls.add_method('SetRate', 
-                   'void', 
-                   [param('uint64_t', 'rate'), param('uint16_t', 'channelWidth', default_value='20')])
-    return
-
 def register_Ns3MgtAddBaRequestHeader_methods(root_module, cls):
     ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaRequestHeader::MgtAddBaRequestHeader(ns3::MgtAddBaRequestHeader const & arg0) [constructor]
     cls.add_constructor([param('ns3::MgtAddBaRequestHeader const &', 'arg0')])
@@ -7623,11 +8659,6 @@
                    'ns3::CapabilityInformation', 
                    [], 
                    is_const=True)
-    ## mgt-headers.h (module 'wifi'): ns3::CfParameterSet ns3::MgtProbeResponseHeader::GetCfParameterSet() const [member function]
-    cls.add_method('GetCfParameterSet', 
-                   'ns3::CfParameterSet', 
-                   [], 
-                   is_const=True)
     ## mgt-headers.h (module 'wifi'): ns3::DsssParameterSet ns3::MgtProbeResponseHeader::GetDsssParameterSet() const [member function]
     cls.add_method('GetDsssParameterSet', 
                    'ns3::DsssParameterSet', 
@@ -7725,10 +8756,6 @@
     cls.add_method('SetCapabilities', 
                    'void', 
                    [param('ns3::CapabilityInformation', 'capabilities')])
-    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetCfParameterSet(ns3::CfParameterSet cfParameterSet) [member function]
-    cls.add_method('SetCfParameterSet', 
-                   'void', 
-                   [param('ns3::CfParameterSet', 'cfParameterSet')])
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetDsssParameterSet(ns3::DsssParameterSet dsssParameterSet) [member function]
     cls.add_method('SetDsssParameterSet', 
                    'void', 
@@ -7939,6 +8966,61 @@
     cls.add_constructor([])
     return
 
+def register_Ns3MuSnrTag_methods(root_module, cls):
+    ## mu-snr-tag.h (module 'wifi'): ns3::MuSnrTag::MuSnrTag(ns3::MuSnrTag const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MuSnrTag const &', 'arg0')])
+    ## mu-snr-tag.h (module 'wifi'): ns3::MuSnrTag::MuSnrTag() [constructor]
+    cls.add_constructor([])
+    ## mu-snr-tag.h (module 'wifi'): void ns3::MuSnrTag::Deserialize(ns3::TagBuffer i) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_virtual=True)
+    ## mu-snr-tag.h (module 'wifi'): double ns3::MuSnrTag::Get(uint16_t staId) const [member function]
+    cls.add_method('Get', 
+                   'double', 
+                   [param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## mu-snr-tag.h (module 'wifi'): ns3::TypeId ns3::MuSnrTag::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-snr-tag.h (module 'wifi'): uint32_t ns3::MuSnrTag::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-snr-tag.h (module 'wifi'): static ns3::TypeId ns3::MuSnrTag::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mu-snr-tag.h (module 'wifi'): bool ns3::MuSnrTag::IsPresent(uint16_t staId) const [member function]
+    cls.add_method('IsPresent', 
+                   'bool', 
+                   [param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## mu-snr-tag.h (module 'wifi'): void ns3::MuSnrTag::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mu-snr-tag.h (module 'wifi'): void ns3::MuSnrTag::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [])
+    ## mu-snr-tag.h (module 'wifi'): void ns3::MuSnrTag::Serialize(ns3::TagBuffer i) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## mu-snr-tag.h (module 'wifi'): void ns3::MuSnrTag::Set(uint16_t staId, double snr) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint16_t', 'staId'), param('double', 'snr')])
+    return
+
 def register_Ns3Object_methods(root_module, cls):
     ## object.h (module 'core'): ns3::Object::Object() [constructor]
     cls.add_constructor([])
@@ -8035,15 +9117,15 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## obss-pd-algorithm.h (module 'wifi'): void ns3::ObssPdAlgorithm::ReceiveHeSig(ns3::HePreambleParameters params) [member function]
-    cls.add_method('ReceiveHeSig', 
+    ## obss-pd-algorithm.h (module 'wifi'): void ns3::ObssPdAlgorithm::ReceiveHeSigA(ns3::HeSigAParameters params) [member function]
+    cls.add_method('ReceiveHeSigA', 
                    'void', 
-                   [param('ns3::HePreambleParameters', 'params')], 
+                   [param('ns3::HeSigAParameters', 'params')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## obss-pd-algorithm.h (module 'wifi'): void ns3::ObssPdAlgorithm::ResetPhy(ns3::HePreambleParameters params) [member function]
+    ## obss-pd-algorithm.h (module 'wifi'): void ns3::ObssPdAlgorithm::ResetPhy(ns3::HeSigAParameters params) [member function]
     cls.add_method('ResetPhy', 
                    'void', 
-                   [param('ns3::HePreambleParameters', 'params')])
+                   [param('ns3::HeSigAParameters', 'params')])
     ## obss-pd-algorithm.h (module 'wifi'): void ns3::ObssPdAlgorithm::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -8530,6 +9612,13 @@
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
     return
 
+def register_Ns3SimpleRefCount__Ns3PhyEntity_Ns3Empty_Ns3DefaultDeleter__lt__ns3PhyEntity__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> >::SimpleRefCount(ns3::SimpleRefCount<ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter<ns3::PhyEntity> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::PhyEntity, ns3::empty, ns3::DefaultDeleter< ns3::PhyEntity > > const &', 'o')])
+    return
+
 def register_Ns3SimpleRefCount__Ns3QosBlockedDestinations_Ns3Empty_Ns3DefaultDeleter__lt__ns3QosBlockedDestinations__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::QosBlockedDestinations, ns3::empty, ns3::DefaultDeleter<ns3::QosBlockedDestinations> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -8704,11 +9793,11 @@
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'm')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::MobilityModel> ns3::SpectrumPhy::GetMobility() const [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> c) [member function]
     cls.add_method('SetChannel', 
                    'void', 
@@ -8719,11 +9808,11 @@
                    'ns3::Ptr< ns3::SpectrumModel const >', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() [member function]
+    ## spectrum-phy.h (module 'spectrum'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumPhy::GetRxAntenna() const [member function]
     cls.add_method('GetRxAntenna', 
                    'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## spectrum-phy.h (module 'spectrum'): void ns3::SpectrumPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
     cls.add_method('StartRx', 
                    'void', 
@@ -9300,31 +10389,21 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## txop.h (module 'wifi'): bool ns3::Txop::CanStartNextPolling() const [member function]
-    cls.add_method('CanStartNextPolling', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::Cancel() [member function]
-    cls.add_method('Cancel', 
-                   'void', 
+    ## txop.h (module 'wifi'): ns3::AcIndex ns3::Txop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
                    [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::EndTxNoAck() [member function]
-    cls.add_method('EndTxNoAck', 
-                   'void', 
+                   is_const=True, is_virtual=True)
+    ## txop.h (module 'wifi'): ns3::Txop::ChannelAccessStatus ns3::Txop::GetAccessStatus() const [member function]
+    cls.add_method('GetAccessStatus', 
+                   'ns3::Txop::ChannelAccessStatus', 
                    [], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): uint8_t ns3::Txop::GetAifsn() const [member function]
     cls.add_method('GetAifsn', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::MacLow> ns3::Txop::GetLow() const [member function]
-    cls.add_method('GetLow', 
-                   'ns3::Ptr< ns3::MacLow >', 
-                   [], 
-                   is_const=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMaxCw() const [member function]
     cls.add_method('GetMaxCw', 
                    'uint32_t', 
@@ -9340,11 +10419,6 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopRemaining() const [member function]
-    cls.add_method('GetTxopRemaining', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): static ns3::TypeId ns3::Txop::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -9355,46 +10429,18 @@
                    'ns3::Ptr< ns3::WifiMacQueue >', 
                    [], 
                    is_const=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotAck() [member function]
-    cls.add_method('GotAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('GotBlockAck', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::GotCfEnd() [member function]
-    cls.add_method('GotCfEnd', 
-                   'void', 
-                   [])
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsAccessRequested() const [member function]
-    cls.add_method('IsAccessRequested', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): bool ns3::Txop::IsQosTxop() const [member function]
     cls.add_method('IsQosTxop', 
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedAck() [member function]
-    cls.add_method('MissedAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedBlockAck(uint8_t nMpdus) [member function]
-    cls.add_method('MissedBlockAck', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelAccessed(ns3::Time txopDuration=ns3::Seconds(0)) [member function]
+    cls.add_method('NotifyChannelAccessed', 
                    'void', 
-                   [param('uint8_t', 'nMpdus')], 
+                   [param('ns3::Time', 'txopDuration', default_value='ns3::Seconds(0)')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedCfPollResponse(bool expectedCfAck) [member function]
-    cls.add_method('MissedCfPollResponse', 
-                   'void', 
-                   [param('bool', 'expectedCfAck')])
-    ## txop.h (module 'wifi'): void ns3::Txop::MissedCts() [member function]
-    cls.add_method('MissedCts', 
+    ## txop.h (module 'wifi'): void ns3::Txop::NotifyChannelReleased() [member function]
+    cls.add_method('NotifyChannelReleased', 
                    'void', 
                    [], 
                    is_virtual=True)
@@ -9428,10 +10474,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
                    is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::SendCfFrame(ns3::WifiMacType frameType, ns3::Mac48Address addr) [member function]
-    cls.add_method('SendCfFrame', 
+    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
+    cls.add_method('ResetCw', 
                    'void', 
-                   [param('ns3::WifiMacType', 'frameType'), param('ns3::Mac48Address', 'addr')])
+                   [])
     ## txop.h (module 'wifi'): void ns3::Txop::SetAifsn(uint8_t aifsn) [member function]
     cls.add_method('SetAifsn', 
                    'void', 
@@ -9440,10 +10486,11 @@
     cls.add_method('SetChannelAccessManager', 
                    'void', 
                    [param('ns3::Ptr< ns3::ChannelAccessManager > const', 'manager')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetMacLow(ns3::Ptr<ns3::MacLow> const low) [member function]
-    cls.add_method('SetMacLow', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::MacLow > const', 'low')])
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::SetMaxCw(uint32_t maxCw) [member function]
     cls.add_method('SetMaxCw', 
                    'void', 
@@ -9452,22 +10499,10 @@
     cls.add_method('SetMinCw', 
                    'void', 
                    [param('uint32_t', 'minCw')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxDroppedCallback(ns3::Txop::TxDropped callback) [member function]
-    cls.add_method('SetTxDroppedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxFailedCallback(ns3::Txop::TxFailed callback) [member function]
-    cls.add_method('SetTxFailedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## txop.h (module 'wifi'): void ns3::Txop::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
     cls.add_method('SetTxMiddle', 
                    'void', 
                    [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetTxOkCallback(ns3::Txop::TxOk callback) [member function]
-    cls.add_method('SetTxOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## txop.h (module 'wifi'): void ns3::Txop::SetTxopLimit(ns3::Time txopLimit) [member function]
     cls.add_method('SetTxopLimit', 
                    'void', 
@@ -9481,21 +10516,10 @@
     cls.add_method('StartBackoffNow', 
                    'void', 
                    [param('uint32_t', 'nSlots')])
-    ## txop.h (module 'wifi'): void ns3::Txop::StartNextFragment() [member function]
-    cls.add_method('StartNextFragment', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::StartNextPacket() [member function]
-    cls.add_method('StartNextPacket', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## txop.h (module 'wifi'): void ns3::Txop::TerminateTxop() [member function]
-    cls.add_method('TerminateTxop', 
+    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
+    cls.add_method('UpdateFailedCw', 
                    'void', 
-                   [], 
-                   is_virtual=True)
+                   [])
     ## txop.h (module 'wifi'): void ns3::Txop::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -9526,61 +10550,11 @@
                    'uint32_t', 
                    [], 
                    is_const=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetFragmentOffset() const [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::Txop::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
-    cls.add_method('GetFragmentPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('ns3::WifiMacHeader *', 'hdr')], 
-                   is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetFragmentSize() const [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetNextFragmentSize() const [member function]
-    cls.add_method('GetNextFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): bool ns3::Txop::HasFramesToTransmit() [member function]
     cls.add_method('HasFramesToTransmit', 
                    'bool', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::IsLastFragment() const [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedDataRetransmission(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('NeedDataRetransmission', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedFragmentation() const [member function]
-    cls.add_method('NeedFragmentation', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): bool ns3::Txop::NeedRtsRetransmission(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('NeedRtsRetransmission', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NextFragment() [member function]
-    cls.add_method('NextFragment', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessGranted() [member function]
-    cls.add_method('NotifyAccessGranted', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::NotifyAccessRequested() [member function]
     cls.add_method('NotifyAccessRequested', 
                    'void', 
@@ -9591,36 +10565,21 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::ResetCw() [member function]
-    cls.add_method('ResetCw', 
+    ## txop.h (module 'wifi'): void ns3::Txop::RequestAccess() [member function]
+    cls.add_method('RequestAccess', 
                    'void', 
                    [], 
                    visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::RestartAccessIfNeeded() [member function]
-    cls.add_method('RestartAccessIfNeeded', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::StartAccessIfNeeded() [member function]
     cls.add_method('StartAccessIfNeeded', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::TxDroppedPacket(ns3::Ptr<const ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('TxDroppedPacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item')], 
-                   visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::UpdateBackoffSlotsNow(uint32_t nSlots, ns3::Time backoffUpdateBound) [member function]
     cls.add_method('UpdateBackoffSlotsNow', 
                    'void', 
                    [param('uint32_t', 'nSlots'), param('ns3::Time', 'backoffUpdateBound')], 
                    visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::UpdateFailedCw() [member function]
-    cls.add_method('UpdateFailedCw', 
-                   'void', 
-                   [], 
-                   visibility='protected')
     return
 
 def register_Ns3UniformRandomVariable_methods(root_module, cls):
@@ -9673,101 +10632,6 @@
                    is_static=True)
     return
 
-def register_Ns3VhtSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader::VhtSigHeader(ns3::VhtSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::VhtSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::VhtSigHeader::VhtSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::VhtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::VhtSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::VhtSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::VhtSigHeader::GetNStreams() const [member function]
-    cls.add_method('GetNStreams', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::VhtSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::GetShortGuardInterval() const [member function]
-    cls.add_method('GetShortGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::GetShortGuardIntervalDisambiguation() const [member function]
-    cls.add_method('GetShortGuardIntervalDisambiguation', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::VhtSigHeader::GetSuMcs() const [member function]
-    cls.add_method('GetSuMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::VhtSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::VhtSigHeader::IsLdpcCoding() const [member function]
-    cls.add_method('IsLdpcCoding', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetCoding(bool ldpc) [member function]
-    cls.add_method('SetCoding', 
-                   'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetMuFlag(bool mu) [member function]
-    cls.add_method('SetMuFlag', 
-                   'void', 
-                   [param('bool', 'mu')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetNStreams(uint8_t nStreams) [member function]
-    cls.add_method('SetNStreams', 
-                   'void', 
-                   [param('uint8_t', 'nStreams')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetShortGuardInterval(bool sgi) [member function]
-    cls.add_method('SetShortGuardInterval', 
-                   'void', 
-                   [param('bool', 'sgi')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetShortGuardIntervalDisambiguation(bool disambiguation) [member function]
-    cls.add_method('SetShortGuardIntervalDisambiguation', 
-                   'void', 
-                   [param('bool', 'disambiguation')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::VhtSigHeader::SetSuMcs(uint8_t mcs) [member function]
-    cls.add_method('SetSuMcs', 
-                   'void', 
-                   [param('uint8_t', 'mcs')])
-    return
-
 def register_Ns3WeibullRandomVariable_methods(root_module, cls):
     ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::WeibullRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -9811,40 +10675,67 @@
                    is_virtual=True)
     return
 
-def register_Ns3WifiAckPolicySelector_methods(root_module, cls):
-    ## wifi-ack-policy-selector.h (module 'wifi'): ns3::WifiAckPolicySelector::WifiAckPolicySelector() [constructor]
+def register_Ns3WifiAckAfterTbPpdu_methods(root_module, cls):
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu::WifiAckAfterTbPpdu() [constructor]
     cls.add_constructor([])
-    ## wifi-ack-policy-selector.h (module 'wifi'): ns3::WifiAckPolicySelector::WifiAckPolicySelector(ns3::WifiAckPolicySelector const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiAckPolicySelector const &', 'arg0')])
-    ## wifi-ack-policy-selector.h (module 'wifi'): void ns3::WifiAckPolicySelector::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-ack-policy-selector.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::WifiAckPolicySelector::GetQosTxop() const [member function]
-    cls.add_method('GetQosTxop', 
-                   'ns3::Ptr< ns3::QosTxop >', 
+    ## wifi-acknowledgment.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckAfterTbPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
                    [], 
-                   is_const=True)
-    ## wifi-ack-policy-selector.h (module 'wifi'): static ns3::TypeId ns3::WifiAckPolicySelector::GetTypeId() [member function]
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): bool ns3::WifiAckAfterTbPpdu::CheckQosAckPolicy(ns3::Mac48Address receiver, uint8_t tid, ns3::WifiMacHeader::QosAckPolicy ackPolicy) const [member function]
+    cls.add_method('CheckQosAckPolicy', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'ackPolicy')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): void ns3::WifiAckAfterTbPpdu::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-acknowledgment.h (module 'wifi'): ns3::WifiAckAfterTbPpdu::WifiAckAfterTbPpdu(ns3::WifiAckAfterTbPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAckAfterTbPpdu const &', 'arg0')])
+    return
+
+def register_Ns3WifiAckManager_methods(root_module, cls):
+    ## wifi-ack-manager.h (module 'wifi'): ns3::WifiAckManager::WifiAckManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-ack-manager.h (module 'wifi'): ns3::WifiAckManager::WifiAckManager(ns3::WifiAckManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiAckManager const &', 'arg0')])
+    ## wifi-ack-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiAckManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-ack-policy-selector.h (module 'wifi'): static void ns3::WifiAckPolicySelector::SetAckPolicy(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::MacLowTransmissionParameters const & params) [member function]
-    cls.add_method('SetAckPolicy', 
+    ## wifi-ack-manager.h (module 'wifi'): static void ns3::WifiAckManager::SetQosAckPolicy(ns3::Ptr<ns3::WifiMacQueueItem> item, ns3::WifiAcknowledgment const * acknowledgment) [member function]
+    cls.add_method('SetQosAckPolicy', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::MacLowTransmissionParameters const &', 'params')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item'), param('ns3::WifiAcknowledgment const *', 'acknowledgment')], 
                    is_static=True)
-    ## wifi-ack-policy-selector.h (module 'wifi'): void ns3::WifiAckPolicySelector::SetQosTxop(ns3::Ptr<ns3::QosTxop> qosTxop) [member function]
-    cls.add_method('SetQosTxop', 
+    ## wifi-ack-manager.h (module 'wifi'): static void ns3::WifiAckManager::SetQosAckPolicy(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiAcknowledgment const * acknowledgment) [member function]
+    cls.add_method('SetQosAckPolicy', 
                    'void', 
-                   [param('ns3::Ptr< ns3::QosTxop >', 'qosTxop')])
-    ## wifi-ack-policy-selector.h (module 'wifi'): void ns3::WifiAckPolicySelector::UpdateTxParams(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::MacLowTransmissionParameters & params) [member function]
-    cls.add_method('UpdateTxParams', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiAcknowledgment const *', 'acknowledgment')], 
+                   is_static=True)
+    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::MacLowTransmissionParameters &', 'params')], 
+                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAddMpdu', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-ack-manager.h (module 'wifi'): void ns3::WifiAckManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3WifiActionHeader_methods(root_module, cls):
@@ -9911,6 +10802,77 @@
     cls.add_instance_attribute('selfProtectedAction', 'ns3::WifiActionHeader::SelfProtectedActionValue', is_const=False)
     return
 
+def register_Ns3WifiCtsToSelfProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::WifiCtsToSelfProtection() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiCtsToSelfProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiCtsToSelfProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::ctsTxVector [variable]
+    cls.add_instance_attribute('ctsTxVector', 'ns3::WifiTxVector', is_const=False)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiCtsToSelfProtection::WifiCtsToSelfProtection(ns3::WifiCtsToSelfProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiCtsToSelfProtection const &', 'arg0')])
+    return
+
+def register_Ns3WifiDefaultAckManager_methods(root_module, cls):
+    ## wifi-default-ack-manager.h (module 'wifi'): ns3::WifiDefaultAckManager::WifiDefaultAckManager(ns3::WifiDefaultAckManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDefaultAckManager const &', 'arg0')])
+    ## wifi-default-ack-manager.h (module 'wifi'): ns3::WifiDefaultAckManager::WifiDefaultAckManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-default-ack-manager.h (module 'wifi'): uint16_t ns3::WifiDefaultAckManager::GetMaxDistFromStartingSeq(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) const [member function]
+    cls.add_method('GetMaxDistFromStartingSeq', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_const=True)
+    ## wifi-default-ack-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiDefaultAckManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAddMpdu', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True)
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True)
+    ## wifi-default-ack-manager.h (module 'wifi'): bool ns3::WifiDefaultAckManager::IsResponseNeeded(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) const [member function]
+    cls.add_method('IsResponseNeeded', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_const=True, visibility='protected')
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::GetAckInfoIfAggregatedMuBar(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('GetAckInfoIfAggregatedMuBar', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::GetAckInfoIfBarBaSequence(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('GetAckInfoIfBarBaSequence', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::GetAckInfoIfTfMuBar(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('GetAckInfoIfTfMuBar', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-default-ack-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiAcknowledgment, std::default_delete<ns3::WifiAcknowledgment> > ns3::WifiDefaultAckManager::TryUlMuTransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryUlMuTransmission', 
+                   'std::unique_ptr< ns3::WifiAcknowledgment, std::default_delete< ns3::WifiAcknowledgment > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True, visibility='private')
+    return
+
 def register_Ns3WifiInformationElement_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement::WifiInformationElement() [constructor]
@@ -9949,7 +10911,7 @@
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -9959,7 +10921,7 @@
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'i')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
@@ -10102,6 +11064,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::WifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiMac::GetVhtConfiguration() const [member function]
     cls.add_method('GetVhtConfiguration', 
                    'ns3::Ptr< ns3::VhtConfiguration >', 
@@ -10151,7 +11118,7 @@
     cls.add_method('SetDevice', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::Callback<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function]
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
@@ -10181,6 +11148,11 @@
                    'void', 
                    [param('ns3::Ssid', 'ssid')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
     cls.add_method('SetWifiPhy', 
                    'void', 
@@ -10208,6 +11180,8 @@
     cls.add_constructor([param('ns3::WifiMacHeader const &', 'arg0')])
     ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader() [constructor]
     cls.add_constructor([])
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader(ns3::WifiMacType type) [constructor]
+    cls.add_constructor([param('ns3::WifiMacType', 'type')])
     ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
@@ -10253,6 +11227,11 @@
                    'ns3::WifiMacHeader::QosAckPolicy', 
                    [], 
                    is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosQueueSize() const [member function]
+    cls.add_method('GetQosQueueSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosTid() const [member function]
     cls.add_method('GetQosTid', 
                    'uint8_t', 
@@ -10468,6 +11447,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsTrigger() const [member function]
+    cls.add_method('IsTrigger', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
@@ -10570,6 +11554,10 @@
     cls.add_method('SetQosNoMeshControlPresent', 
                    'void', 
                    [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosQueueSize(uint8_t size) [member function]
+    cls.add_method('SetQosQueueSize', 
+                   'void', 
+                   [param('uint8_t', 'size')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTid(uint8_t tid) [member function]
     cls.add_method('SetQosTid', 
                    'void', 
@@ -10627,11 +11615,21 @@
                    'ns3::Ptr< ns3::Packet const >', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetPacketSize() const [member function]
+    cls.add_method('GetPacketSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiMacQueueItem::GetProtocolDataUnit() const [member function]
     cls.add_method('GetProtocolDataUnit', 
                    'ns3::Ptr< ns3::Packet >', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): std::list<ns3::WifiMacQueueItem::QueueIteratorPair, std::allocator<ns3::WifiMacQueueItem::QueueIteratorPair> > const & ns3::WifiMacQueueItem::GetQueueIteratorPairs() const [member function]
+    cls.add_method('GetQueueIteratorPairs', 
+                   'std::list< ns3::WifiMacQueueItem::QueueIteratorPair > const &', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
     cls.add_method('GetSize', 
                    'uint32_t', 
@@ -10642,21 +11640,42 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsFragment() const [member function]
+    cls.add_method('IsFragment', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
+    cls.add_method('IsQueued', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::MsduAggregator::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
     cls.add_method('begin', 
-                   'ns3::MsduAggregator::DeaggregatedMsdusCI', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
                    [])
-    ## wifi-mac-queue-item.h (module 'wifi'): ns3::MsduAggregator::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::end() [member function]
     cls.add_method('end', 
-                   'ns3::MsduAggregator::DeaggregatedMsdusCI', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
                    [])
     return
 
+def register_Ns3WifiMacQueueItemQueueIteratorPair_methods(root_module, cls):
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::QueueIteratorPair() [constructor]
+    cls.add_constructor([])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::QueueIteratorPair(ns3::WifiMacQueueItem::QueueIteratorPair const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiMacQueueItem::QueueIteratorPair const &', 'arg0')])
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::it [variable]
+    cls.add_instance_attribute('it', 'ns3::WifiMacQueueItem::ConstIterator', is_const=False)
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::QueueIteratorPair::queue [variable]
+    cls.add_instance_attribute('queue', 'ns3::WifiMacQueue *', is_const=False)
+    return
+
 def register_Ns3WifiMacTrailer_methods(root_module, cls):
     ## wifi-mac-trailer.h (module 'wifi'): ns3::WifiMacTrailer::WifiMacTrailer(ns3::WifiMacTrailer const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiMacTrailer const &', 'arg0')])
@@ -10694,11 +11713,33 @@
                    is_const=True, is_virtual=True)
     return
 
+def register_Ns3WifiNoProtection_methods(root_module, cls):
+    ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection::WifiNoProtection() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiNoProtection::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): void ns3::WifiNoProtection::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-protection.h (module 'wifi'): ns3::WifiNoProtection::WifiNoProtection(ns3::WifiNoProtection const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiNoProtection const &', 'arg0')])
+    return
+
 def register_Ns3WifiPhy_methods(root_module, cls):
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [constructor]
     cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
     ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
     cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): static void ns3::WifiPhy::AddStaticPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
+    cls.add_method('AddStaticPhyEntity', 
+                   'void', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
+                   is_static=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddSupportedChannelWidth(uint16_t width) [member function]
     cls.add_method('AddSupportedChannelWidth', 
                    'void', 
@@ -10708,45 +11749,43 @@
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector txVector) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector const & txVector) [member function]
     cls.add_method('CalculatePhyPreambleAndHeaderDuration', 
                    'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiTxVector txVector, double ber) const [member function]
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiTxVector const & txVector, double ber) const [member function]
     cls.add_method('CalculateSnr', 
                    'double', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('double', 'ber')], 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('double', 'ber')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, uint16_t staId=65535) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, uint16_t staId=65535) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint16_t', 'staId', default_value='65535')], 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint16_t', 'staId', default_value='65535')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector txVector, ns3::WifiPhyBand band) [member function]
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
     cls.add_method('CalculateTxDuration', 
                    'ns3::Time', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_static=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
     cls.add_method('ConfigureStandardAndBand', 
                    'void', 
                    [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
                    is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ContinueReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('ContinueReceiveHeader', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DefineChannelNumber(uint8_t channelNumber, ns3::WifiPhyBand band, ns3::WifiPhyStandard standard, uint16_t frequency, uint16_t channelWidth) [member function]
-    cls.add_method('DefineChannelNumber', 
-                   'bool', 
-                   [param('uint8_t', 'channelNumber'), param('ns3::WifiPhyBand', 'band'), param('ns3::WifiPhyStandard', 'standard'), param('uint16_t', 'frequency'), param('uint16_t', 'channelWidth')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::EndReceive(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('EndReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::EndReceiveInterBss() [member function]
-    cls.add_method('EndReceiveInterBss', 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t bandWidth, uint16_t guardBandwidth, ns3::HeRu::SubcarrierRange range, uint8_t bandIndex=0) const [member function]
+    cls.add_method('ConvertHeRuSubcarriers', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< short, short >', 'range'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::EndReceiveInterBss() [member function]
+    cls.add_method('EndReceiveInterBss', 
                    'void', 
                    [])
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetAckTxTime() const [member function]
@@ -10759,10 +11798,10 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetBssMembershipSelector(uint8_t selector) const [member function]
-    cls.add_method('GetBssMembershipSelector', 
-                   'uint8_t', 
-                   [param('uint8_t', 'selector')], 
+    ## wifi-phy.h (module 'wifi'): std::list<unsigned char, std::allocator<unsigned char> > ns3::WifiPhy::GetBssMembershipSelectorList() const [member function]
+    cls.add_method('GetBssMembershipSelectorList', 
+                   'std::list< unsigned char >', 
+                   [], 
                    is_const=True)
     ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetCcaEdThreshold() const [member function]
     cls.add_method('GetCcaEdThreshold', 
@@ -10789,6 +11828,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetDefaultMode() const [member function]
+    cls.add_method('GetDefaultMode', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_const=True)
     ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
     cls.add_method('GetDelayUntilIdle', 
                    'ns3::Time', 
@@ -10798,12409 +11842,15342 @@
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate11Mbps() [member function]
-    cls.add_method('GetDsssRate11Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate1Mbps() [member function]
-    cls.add_method('GetDsssRate1Mbps', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate2Mbps() [member function]
-    cls.add_method('GetDsssRate2Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxEndTime() const [member function]
+    cls.add_method('GetLastRxEndTime', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate5_5Mbps() [member function]
-    cls.add_method('GetDsssRate5_5Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
                    [], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetMaxPsduSize(ns3::WifiModulationClass modulation) [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate12Mbps() [member function]
-    cls.add_method('GetErpOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedRxSpatialStreams() const [member function]
+    cls.add_method('GetMaxSupportedRxSpatialStreams', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate18Mbps() [member function]
-    cls.add_method('GetErpOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedTxSpatialStreams() const [member function]
+    cls.add_method('GetMaxSupportedTxSpatialStreams', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate24Mbps() [member function]
-    cls.add_method('GetErpOfdmRate24Mbps', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
                    'ns3::WifiMode', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList() const [member function]
+    cls.add_method('GetMcsList', 
+                   'std::list< ns3::WifiMode >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate36Mbps() [member function]
-    cls.add_method('GetErpOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetMcsList(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetMcsList', 
+                   'std::list< ns3::WifiMode >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::WifiPhy::GetMobility() const [member function]
+    cls.add_method('GetMobility', 
+                   'ns3::Ptr< ns3::MobilityModel >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate48Mbps() [member function]
-    cls.add_method('GetErpOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList() const [member function]
+    cls.add_method('GetModeList', 
+                   'std::list< ns3::WifiMode >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate54Mbps() [member function]
-    cls.add_method('GetErpOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> > ns3::WifiPhy::GetModeList(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetModeList', 
+                   'std::list< ns3::WifiMode >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate6Mbps() [member function]
-    cls.add_method('GetErpOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate9Mbps() [member function]
-    cls.add_method('GetErpOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNumberOfAntennas() const [member function]
+    cls.add_method('GetNumberOfAntennas', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetFrequency() const [member function]
-    cls.add_method('GetFrequency', 
-                   'uint16_t', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyOperatingChannel const & ns3::WifiPhy::GetOperatingChannel() const [member function]
+    cls.add_method('GetOperatingChannel', 
+                   'ns3::WifiPhyOperatingChannel const &', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs(uint8_t mcs) [member function]
-    cls.add_method('GetHeMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype=::ns3::MpduType::NORMAL_MPDU, uint16_t staId=65535) [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype', default_value='::ns3::MpduType::NORMAL_MPDU'), param('uint16_t', 'staId', default_value='65535')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs0() [member function]
-    cls.add_method('GetHeMcs0', 
-                   'ns3::WifiMode', 
-                   [], 
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs1() [member function]
-    cls.add_method('GetHeMcs1', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyBand ns3::WifiPhy::GetPhyBand() const [member function]
+    cls.add_method('GetPhyBand', 
+                   'ns3::WifiPhyBand', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs10() [member function]
-    cls.add_method('GetHeMcs10', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::PhyEntity> ns3::WifiPhy::GetPhyEntity(ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetPhyEntity', 
+                   'ns3::Ptr< ns3::PhyEntity >', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
+    cls.add_method('GetPhyStandard', 
+                   'ns3::WifiPhyStandard', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs11() [member function]
-    cls.add_method('GetHeMcs11', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPifs() const [member function]
+    cls.add_method('GetPifs', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs2() [member function]
-    cls.add_method('GetHeMcs2', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetPowerDbm(uint8_t power) const [member function]
+    cls.add_method('GetPowerDbm', 
+                   'double', 
+                   [param('uint8_t', 'power')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPreambleDetectionDuration() [member function]
+    cls.add_method('GetPreambleDetectionDuration', 
+                   'ns3::Time', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs3() [member function]
-    cls.add_method('GetHeMcs3', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): uint64_t ns3::WifiPhy::GetPreviouslyRxPpduUid() const [member function]
+    cls.add_method('GetPreviouslyRxPpduUid', 
+                   'uint64_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs4() [member function]
-    cls.add_method('GetHeMcs4', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxGain() const [member function]
+    cls.add_method('GetRxGain', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs5() [member function]
-    cls.add_method('GetHeMcs5', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxSensitivity() const [member function]
+    cls.add_method('GetRxSensitivity', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs6() [member function]
-    cls.add_method('GetHeMcs6', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetShortPhyPreambleSupported() const [member function]
+    cls.add_method('GetShortPhyPreambleSupported', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs7() [member function]
-    cls.add_method('GetHeMcs7', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetSifs() const [member function]
+    cls.add_method('GetSifs', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs8() [member function]
-    cls.add_method('GetHeMcs8', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetSlot() const [member function]
+    cls.add_method('GetSlot', 
+                   'ns3::Time', 
                    [], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('GetStartOfPacketDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHeMcs9() [member function]
-    cls.add_method('GetHeMcs9', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPhyStateHelper> ns3::WifiPhy::GetState() const [member function]
+    cls.add_method('GetState', 
+                   'ns3::Ptr< ns3::WifiPhyStateHelper >', 
                    [], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Ptr<const ns3::PhyEntity> const ns3::WifiPhy::GetStaticPhyEntity(ns3::WifiModulationClass modulation) [member function]
+    cls.add_method('GetStaticPhyEntity', 
+                   'ns3::Ptr< ns3::PhyEntity const > const', 
+                   [param('ns3::WifiModulationClass', 'modulation')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHePhyHeaderMode() [member function]
-    cls.add_method('GetHePhyHeaderMode', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'std::vector< unsigned short >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs(uint8_t mcs) [member function]
-    cls.add_method('GetHtMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs0() [member function]
-    cls.add_method('GetHtMcs0', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxGain() const [member function]
+    cls.add_method('GetTxGain', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs1() [member function]
-    cls.add_method('GetHtMcs1', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): std::tuple<double, double, double> ns3::WifiPhy::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs10() [member function]
-    cls.add_method('GetHtMcs10', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerEnd() const [member function]
+    cls.add_method('GetTxPowerEnd', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs11() [member function]
-    cls.add_method('GetHtMcs11', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerForTransmission(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerForTransmission', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerStart() const [member function]
+    cls.add_method('GetTxPowerStart', 
+                   'double', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs12() [member function]
-    cls.add_method('GetHtMcs12', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs13() [member function]
-    cls.add_method('GetHtMcs13', 
-                   'ns3::WifiMode', 
-                   [], 
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiConstPsduMap ns3::WifiPhy::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs14() [member function]
-    cls.add_method('GetHtMcs14', 
-                   'ns3::WifiMode', 
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
+    cls.add_method('IsMcsSupported', 
+                   'bool', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
+    cls.add_method('IsModeSupported', 
+                   'bool', 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateCcaBusy() const [member function]
+    cls.add_method('IsStateCcaBusy', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs15() [member function]
-    cls.add_method('GetHtMcs15', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateIdle() const [member function]
+    cls.add_method('IsStateIdle', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs16() [member function]
-    cls.add_method('GetHtMcs16', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs17() [member function]
-    cls.add_method('GetHtMcs17', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs18() [member function]
-    cls.add_method('GetHtMcs18', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs19() [member function]
-    cls.add_method('GetHtMcs19', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs2() [member function]
-    cls.add_method('GetHtMcs2', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateOff() const [member function]
+    cls.add_method('IsStateOff', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs20() [member function]
-    cls.add_method('GetHtMcs20', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateRx() const [member function]
+    cls.add_method('IsStateRx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs21() [member function]
-    cls.add_method('GetHtMcs21', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSleep() const [member function]
+    cls.add_method('IsStateSleep', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs22() [member function]
-    cls.add_method('GetHtMcs22', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSwitching() const [member function]
+    cls.add_method('IsStateSwitching', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs23() [member function]
-    cls.add_method('GetHtMcs23', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateTx() const [member function]
+    cls.add_method('IsStateTx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs24() [member function]
-    cls.add_method('GetHtMcs24', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyChannelAccessRequested() [member function]
+    cls.add_method('NotifyChannelAccessRequested', 
+                   'void', 
+                   [])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
+    cls.add_method('NotifyMonitorSniffRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, uint16_t staId=65535) [member function]
+    cls.add_method('NotifyMonitorSniffTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    cls.add_method('NotifyRxBegin', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('NotifyRxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiPhyRxfailureReason', 'reason')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('NotifyRxEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::WifiConstPsduMap psdus, double txPowerW) [member function]
+    cls.add_method('NotifyTxBegin', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerW')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('NotifyTxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxEnd(ns3::WifiConstPsduMap psdus) [member function]
+    cls.add_method('NotifyTxEnd', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('RegisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetCca(bool powerRestricted, double txPowerMaxSiso=0, double txPowerMaxMimo=0) [member function]
+    cls.add_method('ResetCca', 
+                   'void', 
+                   [param('bool', 'powerRestricted'), param('double', 'txPowerMaxSiso', default_value='0'), param('double', 'txPowerMaxMimo', default_value='0')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResumeFromOff() [member function]
+    cls.add_method('ResumeFromOff', 
+                   'void', 
+                   [])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResumeFromSleep() [member function]
+    cls.add_method('ResumeFromSleep', 
+                   'void', 
+                   [])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('Send', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('Send', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCapabilitiesChangedCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetCapabilitiesChangedCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCcaEdThreshold(double threshold) [member function]
+    cls.add_method('SetCcaEdThreshold', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
+    cls.add_method('SetChannelNumber', 
+                   'void', 
+                   [param('uint8_t', 'id')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> const rate) [member function]
+    cls.add_method('SetErrorRateModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorRateModel > const', 'rate')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrameCaptureModel(ns3::Ptr<ns3::FrameCaptureModel> const frameCaptureModel) [member function]
+    cls.add_method('SetFrameCaptureModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::FrameCaptureModel > const', 'frameCaptureModel')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('uint16_t', 'freq')], 
+                   is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedRxSpatialStreams(uint8_t streams) [member function]
+    cls.add_method('SetMaxSupportedRxSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'streams')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedTxSpatialStreams(uint8_t streams) [member function]
+    cls.add_method('SetMaxSupportedTxSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'streams')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> const mobility) [member function]
+    cls.add_method('SetMobility', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel > const', 'mobility')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNTxPower(uint8_t n) [member function]
+    cls.add_method('SetNTxPower', 
+                   'void', 
+                   [param('uint8_t', 'n')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
+    cls.add_method('SetNumberOfAntennas', 
+                   'void', 
+                   [param('uint8_t', 'antennas')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOffMode() [member function]
+    cls.add_method('SetOffMode', 
+                   'void', 
+                   [])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOperatingChannel(uint8_t number, uint16_t frequency, uint16_t width) [member function]
+    cls.add_method('SetOperatingChannel', 
+                   'void', 
+                   [param('uint8_t', 'number'), param('uint16_t', 'frequency'), param('uint16_t', 'width')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPifs(ns3::Time pifs) [member function]
+    cls.add_method('SetPifs', 
+                   'void', 
+                   [param('ns3::Time', 'pifs')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPostReceptionErrorModel(ns3::Ptr<ns3::ErrorModel> const em) [member function]
+    cls.add_method('SetPostReceptionErrorModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorModel > const', 'em')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPreambleDetectionModel(ns3::Ptr<ns3::PreambleDetectionModel> const preambleDetectionModel) [member function]
+    cls.add_method('SetPreambleDetectionModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PreambleDetectionModel > const', 'preambleDetectionModel')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPrimary20Index(uint8_t index) [member function]
+    cls.add_method('SetPrimary20Index', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
+    cls.add_method('SetReceiveErrorCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
+    cls.add_method('SetReceiveOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxGain(double gain) [member function]
+    cls.add_method('SetRxGain', 
+                   'void', 
+                   [param('double', 'gain')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
+    cls.add_method('SetRxNoiseFigure', 
+                   'void', 
+                   [param('double', 'noiseFigureDb')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxSensitivity(double threshold) [member function]
+    cls.add_method('SetRxSensitivity', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetShortPhyPreambleSupported(bool preamble) [member function]
+    cls.add_method('SetShortPhyPreambleSupported', 
+                   'void', 
+                   [param('bool', 'preamble')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSifs(ns3::Time sifs) [member function]
+    cls.add_method('SetSifs', 
+                   'void', 
+                   [param('ns3::Time', 'sifs')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSleepMode() [member function]
+    cls.add_method('SetSleepMode', 
+                   'void', 
+                   [])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSlot(ns3::Time slot) [member function]
+    cls.add_method('SetSlot', 
+                   'void', 
+                   [param('ns3::Time', 'slot')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxGain(double gain) [member function]
+    cls.add_method('SetTxGain', 
+                   'void', 
+                   [param('double', 'gain')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerEnd(double end) [member function]
+    cls.add_method('SetTxPowerEnd', 
+                   'void', 
+                   [param('double', 'end')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerStart(double start) [member function]
+    cls.add_method('SetTxPowerStart', 
+                   'void', 
+                   [param('double', 'start')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetWifiRadioEnergyModel(ns3::Ptr<ns3::WifiRadioEnergyModel> const wifiRadioEnergyModel) [member function]
+    cls.add_method('SetWifiRadioEnergyModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRadioEnergyModel > const', 'wifiRadioEnergyModel')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreamble', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('UnregisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::m_frequencyChannels [variable]
+    cls.add_static_attribute('m_frequencyChannels', 'std::set< std::tuple< unsigned char, unsigned short, unsigned short, ns3::FrequencyChannelType, ns3::WifiPhyBand > > const', is_const=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::AddPhyEntity(ns3::WifiModulationClass modulation, ns3::Ptr<ns3::PhyEntity> phyEntity) [member function]
+    cls.add_method('AddPhyEntity', 
+                   'void', 
+                   [param('ns3::WifiModulationClass', 'modulation'), param('ns3::Ptr< ns3::PhyEntity >', 'phyEntity')], 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::DoChannelSwitch() [member function]
+    cls.add_method('DoChannelSwitch', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs25() [member function]
-    cls.add_method('GetHtMcs25', 
-                   'ns3::WifiMode', 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs26() [member function]
-    cls.add_method('GetHtMcs26', 
-                   'ns3::WifiMode', 
+                   is_virtual=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
+    cls.add_method('GetBand', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_virtual=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, visibility='protected')
+    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetPrimaryBand(uint16_t bandWidth) [member function]
+    cls.add_method('GetPrimaryBand', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth')], 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs27() [member function]
-    cls.add_method('GetHtMcs27', 
-                   'ns3::WifiMode', 
+                   visibility='protected')
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy(uint16_t channelWidth) [member function]
+    cls.add_method('SwitchMaybeToCcaBusy', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')], 
+                   visibility='protected')
+    return
+
+def register_Ns3WifiPhyStateHelper_methods(root_module, cls):
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper(ns3::WifiPhyStateHelper const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPhyStateHelper const &', 'arg0')])
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::ContinueRxNextMpdu(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('ContinueRxNextMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetDelayUntilIdle() const [member function]
+    cls.add_method('GetDelayUntilIdle', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs28() [member function]
-    cls.add_method('GetHtMcs28', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxEndTime() const [member function]
+    cls.add_method('GetLastRxEndTime', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs29() [member function]
-    cls.add_method('GetHtMcs29', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs3() [member function]
-    cls.add_method('GetHtMcs3', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): WifiPhyState ns3::WifiPhyStateHelper::GetState() const [member function]
+    cls.add_method('GetState', 
+                   'WifiPhyState', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs30() [member function]
-    cls.add_method('GetHtMcs30', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): static ns3::TypeId ns3::WifiPhyStateHelper::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs31() [member function]
-    cls.add_method('GetHtMcs31', 
-                   'ns3::WifiMode', 
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateCcaBusy() const [member function]
+    cls.add_method('IsStateCcaBusy', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs4() [member function]
-    cls.add_method('GetHtMcs4', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateIdle() const [member function]
+    cls.add_method('IsStateIdle', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs5() [member function]
-    cls.add_method('GetHtMcs5', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateOff() const [member function]
+    cls.add_method('IsStateOff', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs6() [member function]
-    cls.add_method('GetHtMcs6', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateRx() const [member function]
+    cls.add_method('IsStateRx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs7() [member function]
-    cls.add_method('GetHtMcs7', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSleep() const [member function]
+    cls.add_method('IsStateSleep', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs8() [member function]
-    cls.add_method('GetHtMcs8', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSwitching() const [member function]
+    cls.add_method('IsStateSwitching', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtMcs9() [member function]
-    cls.add_method('GetHtMcs9', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateTx() const [member function]
+    cls.add_method('IsStateTx', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetHtPhyHeaderMode() [member function]
-    cls.add_method('GetHtPhyHeaderMode', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::RegisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('RegisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
+    cls.add_method('SetReceiveErrorCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
+    cls.add_method('SetReceiveOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromOff(ns3::Time duration) [member function]
+    cls.add_method('SwitchFromOff', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxAbort() [member function]
+    cls.add_method('SwitchFromRxAbort', 
+                   'void', 
+                   [])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndError(ns3::Ptr<ns3::WifiPsdu> psdu, double snr) [member function]
+    cls.add_method('SwitchFromRxEndError', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
+    cls.add_method('SwitchFromRxEndOk', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromSleep(ns3::Time duration) [member function]
+    cls.add_method('SwitchFromSleep', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchMaybeToCcaBusy(ns3::Time duration) [member function]
+    cls.add_method('SwitchMaybeToCcaBusy', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToChannelSwitching(ns3::Time switchingDuration) [member function]
+    cls.add_method('SwitchToChannelSwitching', 
+                   'void', 
+                   [param('ns3::Time', 'switchingDuration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToOff() [member function]
+    cls.add_method('SwitchToOff', 
+                   'void', 
+                   [])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToRx(ns3::Time rxDuration) [member function]
+    cls.add_method('SwitchToRx', 
+                   'void', 
+                   [param('ns3::Time', 'rxDuration')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToSleep() [member function]
+    cls.add_method('SwitchToSleep', 
+                   'void', 
+                   [])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToTx(ns3::Time txDuration, ns3::WifiConstPsduMap psdus, double txPowerDbm, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('SwitchToTx', 
+                   'void', 
+                   [param('ns3::Time', 'txDuration'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('UnregisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')])
+    return
+
+def register_Ns3WifiPpdu_methods(root_module, cls):
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPpdu const &', 'arg0')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, uint64_t uid=(18446744073709551615UL)) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('uint64_t', 'uid', default_value='(18446744073709551615UL)')])
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('uint64_t', 'uid')])
+    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::CanBeReceived(uint16_t txCenterFreq, uint16_t p20MinFreq, uint16_t p20MaxFreq) const [member function]
+    cls.add_method('CanBeReceived', 
+                   'bool', 
+                   [param('uint16_t', 'txCenterFreq'), param('uint16_t', 'p20MinFreq'), param('uint16_t', 'p20MaxFreq')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::WifiPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxEndTime() const [member function]
-    cls.add_method('GetLastRxEndTime', 
-                   'ns3::Time', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiPpdu::GetModulation() const [member function]
+    cls.add_method('GetModulation', 
+                   'ns3::WifiModulationClass', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPreamble ns3::WifiPpdu::GetPreamble() const [member function]
+    cls.add_method('GetPreamble', 
+                   'ns3::WifiPreamble', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedRxSpatialStreams() const [member function]
-    cls.add_method('GetMaxSupportedRxSpatialStreams', 
-                   'uint8_t', 
+    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::WifiPpdu::GetPsdu() const [member function]
+    cls.add_method('GetPsdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMaxSupportedTxSpatialStreams() const [member function]
-    cls.add_method('GetMaxSupportedTxSpatialStreams', 
-                   'uint8_t', 
+    ## wifi-ppdu.h (module 'wifi'): uint16_t ns3::WifiPpdu::GetStaId() const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
                    [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMcs(ns3::WifiModulationClass modulation, uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiModulationClass', 'modulation'), param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::WifiPhy::GetMobility() const [member function]
-    cls.add_method('GetMobility', 
-                   'ns3::Ptr< ns3::MobilityModel >', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): uint16_t ns3::WifiPpdu::GetTransmissionChannelWidth() const [member function]
+    cls.add_method('GetTransmissionChannelWidth', 
+                   'uint16_t', 
                    [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint8_t mode) const [member function]
-    cls.add_method('GetMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mode')], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
                    [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::GetTxVector() const [member function]
+    cls.add_method('GetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint8_t', 
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpduType ns3::WifiPpdu::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::WifiPpduType', 
                    [], 
-                   is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNTxPower() const [member function]
-    cls.add_method('GetNTxPower', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## wifi-ppdu.h (module 'wifi'): uint64_t ns3::WifiPpdu::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNumberOfAntennas() const [member function]
-    cls.add_method('GetNumberOfAntennas', 
-                   'uint8_t', 
+    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsTruncatedTx() const [member function]
+    cls.add_method('IsTruncatedTx', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
-    cls.add_method('GetOfdmRate12Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
-    cls.add_method('GetOfdmRate18Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
-    cls.add_method('GetOfdmRate24Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
-    cls.add_method('GetOfdmRate36Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
-    cls.add_method('GetOfdmRate48Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
-    cls.add_method('GetOfdmRate54Mbps', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
-    cls.add_method('GetOfdmRate6Mbps', 
-                   'ns3::WifiMode', 
+    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::SetTruncatedTx() [member function]
+    cls.add_method('SetTruncatedTx', 
+                   'void', 
+                   [])
+    ## wifi-ppdu.h (module 'wifi'): std::string ns3::WifiPpdu::PrintPayload() const [member function]
+    cls.add_method('PrintPayload', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3WifiProtectionManager_methods(root_module, cls):
+    ## wifi-protection-manager.h (module 'wifi'): ns3::WifiProtectionManager::WifiProtectionManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-protection-manager.h (module 'wifi'): ns3::WifiProtectionManager::WifiProtectionManager(ns3::WifiProtectionManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiProtectionManager const &', 'arg0')])
+    ## wifi-protection-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiProtectionManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
-    cls.add_method('GetOfdmRate9Mbps', 
-                   'ns3::WifiMode', 
+    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> mac) [member function]
+    cls.add_method('SetWifiMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac >', 'mac')])
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAddMpdu', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-protection-manager.h (module 'wifi'): void ns3::WifiProtectionManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
-                   'ns3::WifiMode', 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3WifiPsdu_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::WifiPsdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiPsdu const &', 'arg0')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::Packet> p, ns3::WifiMacHeader const & header) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('bool', 'isSingle')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('bool', 'isSingle')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [constructor]
+    cls.add_constructor([param('std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiPsdu::GetAckPolicyForTid(uint8_t tid) const [member function]
+    cls.add_method('GetAckPolicyForTid', 
+                   'ns3::WifiMacHeader::QosAckPolicy', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr1() const [member function]
+    cls.add_method('GetAddr1', 
+                   'ns3::Mac48Address', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
-    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr2() const [member function]
+    cls.add_method('GetAddr2', 
+                   'ns3::Mac48Address', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype=::ns3::MpduType::NORMAL_MPDU, uint16_t staId=65535) [member function]
-    cls.add_method('GetPayloadDuration', 
-                   'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype', default_value='::ns3::MpduType::NORMAL_MPDU'), param('uint16_t', 'staId', default_value='65535')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) [member function]
-    cls.add_method('GetPayloadDuration', 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiPsdu::GetAmpduSubframe(std::size_t i) const [member function]
+    cls.add_method('GetAmpduSubframe', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetAmpduSubframeSize(std::size_t i) const [member function]
+    cls.add_method('GetAmpduSubframeSize', 
+                   'std::size_t', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetDuration() const [member function]
+    cls.add_method('GetDuration', 
                    'ns3::Time', 
-                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyBand ns3::WifiPhy::GetPhyBand() const [member function]
-    cls.add_method('GetPhyBand', 
-                   'ns3::WifiPhyBand', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyHeaderDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPhyHeaderMode(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyHeaderMode', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyHtSigHeaderDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhyHtSigHeaderDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyPreambleDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyPreambleDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigA1Duration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigA1Duration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigA2Duration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigA2Duration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhySigBDuration(ns3::WifiPreamble preamble) [member function]
-    cls.add_method('GetPhySigBDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiPreamble', 'preamble')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyStandard ns3::WifiPhy::GetPhyStandard() const [member function]
-    cls.add_method('GetPhyStandard', 
-                   'ns3::WifiPhyStandard', 
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader const & ns3::WifiPsdu::GetHeader(std::size_t i) const [member function]
+    cls.add_method('GetHeader', 
+                   'ns3::WifiMacHeader const &', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader & ns3::WifiPsdu::GetHeader(std::size_t i) [member function]
+    cls.add_method('GetHeader', 
+                   'ns3::WifiMacHeader &', 
+                   [param('std::size_t', 'i')])
+    ## wifi-psdu.h (module 'wifi'): uint16_t ns3::WifiPsdu::GetMaxDistFromStartingSeq(uint16_t startingSeq) const [member function]
+    cls.add_method('GetMaxDistFromStartingSeq', 
+                   'uint16_t', 
+                   [param('uint16_t', 'startingSeq')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetNMpdus() const [member function]
+    cls.add_method('GetNMpdus', 
+                   'std::size_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPhyTrainingSymbolDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetPhyTrainingSymbolDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetPifs() const [member function]
-    cls.add_method('GetPifs', 
-                   'ns3::Time', 
+    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPacket() const [member function]
+    cls.add_method('GetPacket', 
+                   'ns3::Ptr< ns3::Packet const >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetPowerDbm(uint8_t power) const [member function]
-    cls.add_method('GetPowerDbm', 
-                   'double', 
-                   [param('uint8_t', 'power')], 
+    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPayload(std::size_t i) const [member function]
+    cls.add_method('GetPayload', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('std::size_t', 'i')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPreambleDetectionDuration() [member function]
-    cls.add_method('GetPreambleDetectionDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxGain() const [member function]
-    cls.add_method('GetRxGain', 
-                   'double', 
+    ## wifi-psdu.h (module 'wifi'): uint32_t ns3::WifiPsdu::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetRxSensitivity() const [member function]
-    cls.add_method('GetRxSensitivity', 
-                   'double', 
+    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > ns3::WifiPsdu::GetTids() const [member function]
+    cls.add_method('GetTids', 
+                   'std::set< unsigned char >', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetShortPhyPreambleSupported() const [member function]
-    cls.add_method('GetShortPhyPreambleSupported', 
+    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetTimeStamp(std::size_t i) const [member function]
+    cls.add_method('GetTimeStamp', 
+                   'ns3::Time', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsAggregate() const [member function]
+    cls.add_method('IsAggregate', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetSifs() const [member function]
-    cls.add_method('GetSifs', 
-                   'ns3::Time', 
+    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsSingle() const [member function]
+    cls.add_method('IsSingle', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetSlot() const [member function]
-    cls.add_method('GetSlot', 
-                   'ns3::Time', 
+    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetAckPolicyForTid(uint8_t tid, ns3::WifiMacHeader::QosAckPolicy policy) [member function]
+    cls.add_method('SetAckPolicyForTid', 
+                   'void', 
+                   [param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
+    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetDuration(ns3::Time duration) [member function]
+    cls.add_method('SetDuration', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::begin() const [member function]
+    cls.add_method('begin', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetStartOfPacketDuration(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('GetStartOfPacketDuration', 
-                   'ns3::Time', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPhyStateHelper> ns3::WifiPhy::GetState() const [member function]
-    cls.add_method('GetState', 
-                   'ns3::Ptr< ns3::WifiPhyStateHelper >', 
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::begin() [member function]
+    cls.add_method('begin', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
+                   [])
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::end() const [member function]
+    cls.add_method('end', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): std::vector<unsigned short, std::allocator<unsigned short> > ns3::WifiPhy::GetSupportedChannelWidthSet() const [member function]
-    cls.add_method('GetSupportedChannelWidthSet', 
-                   'std::vector< unsigned short >', 
+    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::end() [member function]
+    cls.add_method('end', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
+                   [])
+    return
+
+def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedMcs(ns3::Mac48Address address) [member function]
+    cls.add_method('AddAllSupportedMcs', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedModes(ns3::Mac48Address address) [member function]
+    cls.add_method('AddAllSupportedModes', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
+    cls.add_method('AddBasicMcs', 
+                   'void', 
+                   [param('ns3::WifiMode', 'mcs')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
+    cls.add_method('AddBasicMode', 
+                   'void', 
+                   [param('ns3::WifiMode', 'mode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHeCapabilities(ns3::Mac48Address from, ns3::HeCapabilities heCapabilities) [member function]
+    cls.add_method('AddStationHeCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::HeCapabilities', 'heCapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHtCapabilities(ns3::Mac48Address from, ns3::HtCapabilities htCapabilities) [member function]
+    cls.add_method('AddStationHtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htCapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtCapabilities) [member function]
+    cls.add_method('AddStationVhtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtCapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedErpSlotTime(ns3::Mac48Address address, bool isShortSlotTimeSupported) [member function]
+    cls.add_method('AddSupportedErpSlotTime', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortSlotTimeSupported')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
+    cls.add_method('AddSupportedMcs', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
+    cls.add_method('AddSupportedMode', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedPhyPreamble(ns3::Mac48Address address, bool isShortPreambleSupported) [member function]
+    cls.add_method('AddSupportedPhyPreamble', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortPreambleSupported')])
+    ## wifi-remote-station-manager.h (module 'wifi'): int64_t ns3::WifiRemoteStationManager::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint8_t i) const [member function]
+    cls.add_method('GetBasicMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'i')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint8_t i) const [member function]
+    cls.add_method('GetBasicMode', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'i')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetBlockAckTxVector(ns3::Mac48Address to, ns3::WifiTxVector const & dataTxVector) const [member function]
+    cls.add_method('GetBlockAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiTxVector const &', 'dataTxVector')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetChannelWidthSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetChannelWidthSupported', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetControlAnswerMode(ns3::WifiMode reqMode) const [member function]
+    cls.add_method('GetControlAnswerMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'reqMode')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector() [member function]
+    cls.add_method('GetCtsToSelfTxVector', 
+                   'ns3::WifiTxVector', 
+                   [])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsTxVector(ns3::Mac48Address to, ns3::WifiMode rtsTxMode) const [member function]
+    cls.add_method('GetCtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiMode', 'rtsTxMode')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetDataTxVector(ns3::WifiMacHeader const & header) [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    cls.add_method('GetDefaultMcs', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxGain() const [member function]
-    cls.add_method('GetTxGain', 
-                   'double', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
+    cls.add_method('GetDefaultMode', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerEnd() const [member function]
-    cls.add_method('GetTxPowerEnd', 
-                   'double', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
+    cls.add_method('GetDefaultTxPowerLevel', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerForTransmission(ns3::WifiTxVector txVector) const [member function]
-    cls.add_method('GetTxPowerForTransmission', 
-                   'double', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetDsssSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerStart() const [member function]
-    cls.add_method('GetTxPowerStart', 
-                   'double', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetErpOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetErpOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
+    cls.add_method('GetFragmentOffset', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
+    cls.add_method('GetFragmentSize', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentationThreshold() const [member function]
+    cls.add_method('GetFragmentationThreshold', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs(uint8_t mcs) [member function]
-    cls.add_method('GetVhtMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs0() [member function]
-    cls.add_method('GetVhtMcs0', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs1() [member function]
-    cls.add_method('GetVhtMcs1', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo ns3::WifiRemoteStationManager::GetInfo(ns3::Mac48Address address) [member function]
+    cls.add_method('GetInfo', 
+                   'ns3::WifiRemoteStationInfo', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported() const [member function]
+    cls.add_method('GetLdpcSupported', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs2() [member function]
-    cls.add_method('GetVhtMcs2', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetLdpcSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
+    cls.add_method('GetMac', 
+                   'ns3::Ptr< ns3::WifiMac >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs3() [member function]
-    cls.add_method('GetVhtMcs3', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMaxNumberOfTransmitStreams() const [member function]
+    cls.add_method('GetMaxNumberOfTransmitStreams', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs4() [member function]
-    cls.add_method('GetVhtMcs4', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): double ns3::WifiRemoteStationManager::GetMostRecentRssi(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetMostRecentRssi', 
+                   'double', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicMcs() const [member function]
+    cls.add_method('GetNBasicMcs', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs5() [member function]
-    cls.add_method('GetVhtMcs5', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicModes() const [member function]
+    cls.add_method('GetNBasicModes', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs6() [member function]
-    cls.add_method('GetVhtMcs6', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetNMcsSupported', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNNonErpBasicModes() const [member function]
+    cls.add_method('GetNNonErpBasicModes', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs7() [member function]
-    cls.add_method('GetVhtMcs7', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonErpBasicMode(uint8_t i) const [member function]
+    cls.add_method('GetNonErpBasicMode', 
                    'ns3::WifiMode', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs8() [member function]
-    cls.add_method('GetVhtMcs8', 
+                   [param('uint8_t', 'i')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonUnicastMode() const [member function]
+    cls.add_method('GetNonUnicastMode', 
                    'ns3::WifiMode', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtMcs9() [member function]
-    cls.add_method('GetVhtMcs9', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfAntennas() const [member function]
+    cls.add_method('GetNumberOfAntennas', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetVhtPhyHeaderMode() [member function]
-    cls.add_method('GetVhtPhyHeaderMode', 
-                   'ns3::WifiMode', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetNumberOfSupportedStreams', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetOfdmSupported(ns3::Mac48Address const & address) const [member function]
+    cls.add_method('GetOfdmSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address const &', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
+    cls.add_method('GetPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
-                   is_static=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiMode mcs) const [member function]
-    cls.add_method('IsMcsSupported', 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetQosSupported', 
                    'bool', 
-                   [param('ns3::WifiMode', 'mcs')], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsMcsSupported(ns3::WifiModulationClass mc, uint8_t mcs) const [member function]
-    cls.add_method('IsMcsSupported', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetRtsTxVector(ns3::Mac48Address address) [member function]
+    cls.add_method('GetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported() const [member function]
+    cls.add_method('GetShortGuardIntervalSupported', 
                    'bool', 
-                   [param('ns3::WifiModulationClass', 'mc'), param('uint8_t', 'mcs')], 
+                   [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsModeSupported(ns3::WifiMode mode) const [member function]
-    cls.add_method('IsModeSupported', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetShortGuardIntervalSupported', 
                    'bool', 
-                   [param('ns3::WifiMode', 'mode')], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateCcaBusy() const [member function]
-    cls.add_method('IsStateCcaBusy', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleEnabled() const [member function]
+    cls.add_method('GetShortPreambleEnabled', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateIdle() const [member function]
-    cls.add_method('IsStateIdle', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetShortPreambleSupported', 
                    'bool', 
-                   [], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateOff() const [member function]
-    cls.add_method('IsStateOff', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeEnabled() const [member function]
+    cls.add_method('GetShortSlotTimeEnabled', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateRx() const [member function]
-    cls.add_method('IsStateRx', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
                    'bool', 
-                   [], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSleep() const [member function]
-    cls.add_method('IsStateSleep', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HeCapabilities> ns3::WifiRemoteStationManager::GetStationHeCapabilities(ns3::Mac48Address from) [member function]
+    cls.add_method('GetStationHeCapabilities', 
+                   'ns3::Ptr< ns3::HeCapabilities const >', 
+                   [param('ns3::Mac48Address', 'from')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HtCapabilities> ns3::WifiRemoteStationManager::GetStationHtCapabilities(ns3::Mac48Address from) [member function]
+    cls.add_method('GetStationHtCapabilities', 
+                   'ns3::Ptr< ns3::HtCapabilities const >', 
+                   [param('ns3::Mac48Address', 'from')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::VhtCapabilities> ns3::WifiRemoteStationManager::GetStationVhtCapabilities(ns3::Mac48Address from) [member function]
+    cls.add_method('GetStationVhtCapabilities', 
+                   'ns3::Ptr< ns3::VhtCapabilities const >', 
+                   [param('ns3::Mac48Address', 'from')])
+    ## wifi-remote-station-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiRemoteStationManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonErpProtection() const [member function]
+    cls.add_method('GetUseNonErpProtection', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSwitching() const [member function]
-    cls.add_method('IsStateSwitching', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonHtProtection() const [member function]
+    cls.add_method('GetUseNonHtProtection', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateTx() const [member function]
-    cls.add_method('IsStateTx', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyChannelAccessRequested() [member function]
-    cls.add_method('NotifyChannelAccessRequested', 
-                   'void', 
-                   [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyEndOfHePreamble(ns3::HePreambleParameters params) [member function]
-    cls.add_method('NotifyEndOfHePreamble', 
-                   'void', 
-                   [param('ns3::HePreambleParameters', 'params')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, ns3::SignalNoiseDbm signalNoise, std::vector<bool, std::allocator<bool> > statusPerMpdu, uint16_t staId=65535) [member function]
-    cls.add_method('NotifyMonitorSniffRx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('ns3::SignalNoiseDbm', 'signalNoise'), param('std::vector< bool >', 'statusPerMpdu'), param('uint16_t', 'staId', default_value='65535')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<const ns3::WifiPsdu> psdu, uint16_t channelFreqMhz, ns3::WifiTxVector txVector, uint16_t staId=65535) [member function]
-    cls.add_method('NotifyMonitorSniffTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('uint16_t', 'channelFreqMhz'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId', default_value='65535')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
-    cls.add_method('NotifyRxBegin', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiPhyRxfailureReason reason) [member function]
-    cls.add_method('NotifyRxDrop', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiPhyRxfailureReason', 'reason')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
-    cls.add_method('NotifyRxEnd', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::WifiConstPsduMap psdus, double txPowerW) [member function]
-    cls.add_method('NotifyTxBegin', 
-                   'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxDrop(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
-    cls.add_method('NotifyTxDrop', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxEnd(ns3::WifiConstPsduMap psdus) [member function]
-    cls.add_method('NotifyTxEnd', 
-                   'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('RegisterListener', 
-                   'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetCca(bool powerRestricted, double txPowerMaxSiso=0, double txPowerMaxMimo=0) [member function]
-    cls.add_method('ResetCca', 
-                   'void', 
-                   [param('bool', 'powerRestricted'), param('double', 'txPowerMaxSiso', default_value='0'), param('double', 'txPowerMaxMimo', default_value='0')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('ResetReceive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResumeFromOff() [member function]
-    cls.add_method('ResumeFromOff', 
-                   'void', 
-                   [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ResumeFromSleep() [member function]
-    cls.add_method('ResumeFromSleep', 
-                   'void', 
-                   [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector txVector) [member function]
-    cls.add_method('Send', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::Send(ns3::WifiConstPsduMap psdus, ns3::WifiTxVector txVector) [member function]
-    cls.add_method('Send', 
-                   'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCapabilitiesChangedCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetCapabilitiesChangedCallback', 
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsAssociated', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsBrandNew(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsBrandNew', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, uint32_t fragmentNumber) [member function]
+    cls.add_method('IsLastFragment', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsWaitAssocTxOk(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsWaitAssocTxOk', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedCtsToSelf(ns3::WifiTxVector txVector) [member function]
+    cls.add_method('NeedCtsToSelf', 
+                   'bool', 
+                   [param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NeedFragmentation', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NeedRetransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::WifiMacHeader const & header, uint32_t size) [member function]
+    cls.add_method('NeedRts', 
+                   'bool', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordDisassociated(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordDisassociated', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetCcaEdThreshold(double threshold) [member function]
-    cls.add_method('SetCcaEdThreshold', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxFailed(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordGotAssocTxFailed', 
                    'void', 
-                   [param('double', 'threshold')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxOk(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordGotAssocTxOk', 
                    'void', 
-                   [param('uint8_t', 'id')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordWaitAssocTxOk(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordWaitAssocTxOk', 
                    'void', 
-                   [param('uint16_t', 'channelWidth')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetDevice(ns3::Ptr<ns3::NetDevice> const device) [member function]
-    cls.add_method('SetDevice', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RemoveAllSupportedMcs(ns3::Mac48Address address) [member function]
+    cls.add_method('RemoveAllSupportedMcs', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'device')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> const rate) [member function]
-    cls.add_method('SetErrorRateModel', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+    cls.add_method('ReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ErrorRateModel > const', 'rate')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrameCaptureModel(ns3::Ptr<ns3::FrameCaptureModel> const frameCaptureModel) [member function]
-    cls.add_method('SetFrameCaptureModel', 
+                   [param('ns3::Mac48Address', 'address'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('ReportDataFailed', 
                    'void', 
-                   [param('ns3::Ptr< ns3::FrameCaptureModel > const', 'frameCaptureModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
+    cls.add_method('ReportDataOk', 
                    'void', 
-                   [param('uint16_t', 'freq')], 
-                   is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedRxSpatialStreams(uint8_t streams) [member function]
-    cls.add_method('SetMaxSupportedRxSpatialStreams', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('ReportFinalDataFailed', 
                    'void', 
-                   [param('uint8_t', 'streams')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMaxSupportedTxSpatialStreams(uint8_t streams) [member function]
-    cls.add_method('SetMaxSupportedTxSpatialStreams', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::WifiMacHeader const & header) [member function]
+    cls.add_method('ReportFinalRtsFailed', 
                    'void', 
-                   [param('uint8_t', 'streams')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetMobility(ns3::Ptr<ns3::MobilityModel> const mobility) [member function]
-    cls.add_method('SetMobility', 
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::WifiMacHeader const & header) [member function]
+    cls.add_method('ReportRtsFailed', 
                    'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel > const', 'mobility')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNTxPower(uint8_t n) [member function]
-    cls.add_method('SetNTxPower', 
+                   [param('ns3::WifiMacHeader const &', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::WifiMacHeader const & header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('ReportRtsOk', 
                    'void', 
-                   [param('uint8_t', 'n')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfAntennas(uint8_t antennas) [member function]
-    cls.add_method('SetNumberOfAntennas', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector) [member function]
+    cls.add_method('ReportRxOk', 
                    'void', 
-                   [param('uint8_t', 'antennas')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetOffMode() [member function]
-    cls.add_method('SetOffMode', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::Reset() [member function]
+    cls.add_method('Reset', 
                    'void', 
                    [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPifs(ns3::Time pifs) [member function]
-    cls.add_method('SetPifs', 
-                   'void', 
-                   [param('ns3::Time', 'pifs')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPostReceptionErrorModel(ns3::Ptr<ns3::ErrorModel> const em) [member function]
-    cls.add_method('SetPostReceptionErrorModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ErrorModel > const', 'em')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetPreambleDetectionModel(ns3::Ptr<ns3::PreambleDetectionModel> const preambleDetectionModel) [member function]
-    cls.add_method('SetPreambleDetectionModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::PreambleDetectionModel > const', 'preambleDetectionModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
-    cls.add_method('SetReceiveErrorCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
-    cls.add_method('SetReceiveOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxGain(double gain) [member function]
-    cls.add_method('SetRxGain', 
-                   'void', 
-                   [param('double', 'gain')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
-    cls.add_method('SetRxNoiseFigure', 
-                   'void', 
-                   [param('double', 'noiseFigureDb')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetRxSensitivity(double threshold) [member function]
-    cls.add_method('SetRxSensitivity', 
-                   'void', 
-                   [param('double', 'threshold')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetShortPhyPreambleSupported(bool preamble) [member function]
-    cls.add_method('SetShortPhyPreambleSupported', 
-                   'void', 
-                   [param('bool', 'preamble')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSifs(ns3::Time sifs) [member function]
-    cls.add_method('SetSifs', 
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
+    cls.add_method('SetDefaultTxPowerLevel', 
                    'void', 
-                   [param('ns3::Time', 'sifs')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSleepMode() [member function]
-    cls.add_method('SetSleepMode', 
+                   [param('uint8_t', 'txPower')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetFragmentationThreshold(uint32_t threshold) [member function]
+    cls.add_method('SetFragmentationThreshold', 
                    'void', 
-                   [])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSlot(ns3::Time slot) [member function]
-    cls.add_method('SetSlot', 
+                   [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSlrc(uint32_t maxSlrc) [member function]
+    cls.add_method('SetMaxSlrc', 
                    'void', 
-                   [param('ns3::Time', 'slot')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxGain(double gain) [member function]
-    cls.add_method('SetTxGain', 
+                   [param('uint32_t', 'maxSlrc')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
+    cls.add_method('SetMaxSsrc', 
                    'void', 
-                   [param('double', 'gain')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerEnd(double end) [member function]
-    cls.add_method('SetTxPowerEnd', 
+                   [param('uint32_t', 'maxSsrc')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
+    cls.add_method('SetQosSupport', 
                    'void', 
-                   [param('double', 'end')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetTxPowerStart(double start) [member function]
-    cls.add_method('SetTxPowerStart', 
+                   [param('ns3::Mac48Address', 'from'), param('bool', 'qosSupported')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetRtsCtsThreshold(uint32_t threshold) [member function]
+    cls.add_method('SetRtsCtsThreshold', 
                    'void', 
-                   [param('double', 'start')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetWifiRadioEnergyModel(ns3::Ptr<ns3::WifiRadioEnergyModel> const wifiRadioEnergyModel) [member function]
-    cls.add_method('SetWifiRadioEnergyModel', 
+                   [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortPreambleEnabled(bool enable) [member function]
+    cls.add_method('SetShortPreambleEnabled', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRadioEnergyModel > const', 'wifiRadioEnergyModel')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('StartReceiveHeader', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortSlotTimeEnabled(bool enable) [member function]
+    cls.add_method('SetShortSlotTimeEnabled', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
-    cls.add_method('StartReceivePayload', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonErpProtection(bool enable) [member function]
+    cls.add_method('SetUseNonErpProtection', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Event >', 'event')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
-    cls.add_method('StartReceivePreamble', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonHtProtection(bool enable) [member function]
+    cls.add_method('SetUseNonHtProtection', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')])
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
-    cls.add_method('StartTx', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetupMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('UnregisterListener', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
                    'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')])
-    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::ConvertHeRuSubcarriers(uint16_t channelWidth, ns3::HeRu::SubcarrierRange range) const [member function]
-    cls.add_method('ConvertHeRuSubcarriers', 
-                   'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'channelWidth'), param('std::pair< short, short >', 'range')], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DoChannelSwitch(uint8_t id) [member function]
-    cls.add_method('DoChannelSwitch', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseLdpcForDestination(ns3::Mac48Address dest) const [member function]
+    cls.add_method('UseLdpcForDestination', 
                    'bool', 
-                   [param('uint8_t', 'id')], 
-                   visibility='protected')
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoDispose() [member function]
+                   [param('ns3::Mac48Address', 'dest')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::DoFrequencySwitch(uint16_t frequency) [member function]
-    cls.add_method('DoFrequencySwitch', 
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Mac48Address ns3::WifiRemoteStationManager::GetAddress(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetAggregation(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetAggregation', 
                    'bool', 
-                   [param('uint16_t', 'frequency')], 
-                   visibility='protected')
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::WifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
-    cls.add_method('GetBand', 
-                   'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetStaId() const [member function]
-    cls.add_method('GetStaId', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetChannelWidth(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetChannelWidth', 
                    'uint16_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='protected')
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SwitchMaybeToCcaBusy() [member function]
-    cls.add_method('SwitchMaybeToCcaBusy', 
-                   'void', 
-                   [], 
-                   visibility='protected')
-    return
-
-def register_Ns3WifiPhyStateHelper_methods(root_module, cls):
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper(ns3::WifiPhyStateHelper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPhyStateHelper const &', 'arg0')])
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::WifiPhyStateHelper::WifiPhyStateHelper() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::ContinueRxNextMpdu(ns3::Ptr<ns3::WifiPsdu> psdu, double snr, ns3::WifiTxVector txVector) [member function]
-    cls.add_method('ContinueRxNextMpdu', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetDelayUntilIdle() const [member function]
-    cls.add_method('GetDelayUntilIdle', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxEndTime() const [member function]
-    cls.add_method('GetLastRxEndTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): ns3::Time ns3::WifiPhyStateHelper::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): WifiPhyState ns3::WifiPhyStateHelper::GetState() const [member function]
-    cls.add_method('GetState', 
-                   'WifiPhyState', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): static ns3::TypeId ns3::WifiPhyStateHelper::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateCcaBusy() const [member function]
-    cls.add_method('IsStateCcaBusy', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'uint16_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetHeSupported', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateIdle() const [member function]
-    cls.add_method('IsStateIdle', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetHtSupported', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateOff() const [member function]
-    cls.add_method('IsStateOff', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
+    cls.add_method('GetMcsSupported', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint8_t', 'i')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNMcsSupported', 
+                   'uint8_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNNonErpSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNNonErpSupported', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNSupported', 
+                   'uint8_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNess(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNess', 
+                   'uint8_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonErpSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
+    cls.add_method('GetNonErpSupported', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint8_t', 'i')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNumberOfSupportedStreams', 
+                   'uint8_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetQosSupported', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateRx() const [member function]
-    cls.add_method('IsStateRx', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetShortGuardIntervalSupported', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSleep() const [member function]
-    cls.add_method('IsStateSleep', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
+    cls.add_method('GetSupported', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint8_t', 'i')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetVhtSupported', 
                    'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::WifiRemoteStationManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateSwitching() const [member function]
-    cls.add_method('IsStateSwitching', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedFragmentation(ns3::WifiRemoteStation * station, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
+    cls.add_method('DoNeedFragmentation', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): bool ns3::WifiPhyStateHelper::IsStateTx() const [member function]
-    cls.add_method('IsStateTx', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRetransmission(ns3::WifiRemoteStation * station, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
+    cls.add_method('DoNeedRetransmission', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::RegisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('RegisterListener', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
+    cls.add_method('DoNeedRts', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportAmpduTxStatus', 
                    'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveErrorCallback(ns3::RxErrorCallback callback) [member function]
-    cls.add_method('SetReceiveErrorCallback', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SetReceiveOkCallback(ns3::RxOkCallback callback) [member function]
-    cls.add_method('SetReceiveOkCallback', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromOff(ns3::Time duration) [member function]
-    cls.add_method('SwitchFromOff', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxAbort() [member function]
-    cls.add_method('SwitchFromRxAbort', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndError(ns3::Ptr<ns3::WifiPsdu> psdu, double snr) [member function]
-    cls.add_method('SwitchFromRxEndError', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromRxEndOk(ns3::Ptr<ns3::WifiPsdu> psdu, double snr, ns3::WifiTxVector txVector, uint16_t staId, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
-    cls.add_method('SwitchFromRxEndOk', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('double', 'snr'), param('ns3::WifiTxVector', 'txVector'), param('uint16_t', 'staId'), param('std::vector< bool >', 'statusPerMpdu')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchFromSleep(ns3::Time duration) [member function]
-    cls.add_method('SwitchFromSleep', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchMaybeToCcaBusy(ns3::Time duration) [member function]
-    cls.add_method('SwitchMaybeToCcaBusy', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3WifiSpectrumPhyInterface_methods(root_module, cls):
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): static ns3::TypeId ns3::WifiSpectrumPhyInterface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::WifiSpectrumPhyInterface::WifiSpectrumPhyInterface() [constructor]
+    cls.add_constructor([])
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetSpectrumWifiPhy(ns3::Ptr<ns3::SpectrumWifiPhy> const phy) [member function]
+    cls.add_method('SetSpectrumWifiPhy', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToChannelSwitching(ns3::Time switchingDuration) [member function]
-    cls.add_method('SwitchToChannelSwitching', 
+                   [param('ns3::Ptr< ns3::SpectrumWifiPhy > const', 'phy')])
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiSpectrumPhyInterface::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetDevice(ns3::Ptr<ns3::NetDevice> const d) [member function]
+    cls.add_method('SetDevice', 
                    'void', 
-                   [param('ns3::Time', 'switchingDuration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToOff() [member function]
-    cls.add_method('SwitchToOff', 
+                   [param('ns3::Ptr< ns3::NetDevice > const', 'd')], 
+                   is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetMobility(ns3::Ptr<ns3::MobilityModel> const m) [member function]
+    cls.add_method('SetMobility', 
                    'void', 
-                   [])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToRx(ns3::Time rxDuration) [member function]
-    cls.add_method('SwitchToRx', 
+                   [param('ns3::Ptr< ns3::MobilityModel > const', 'm')], 
+                   is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::WifiSpectrumPhyInterface::GetMobility() const [member function]
+    cls.add_method('GetMobility', 
+                   'ns3::Ptr< ns3::MobilityModel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetChannel(ns3::Ptr<ns3::SpectrumChannel> const c) [member function]
+    cls.add_method('SetChannel', 
                    'void', 
-                   [param('ns3::Time', 'rxDuration')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToSleep() [member function]
-    cls.add_method('SwitchToSleep', 
+                   [param('ns3::Ptr< ns3::SpectrumChannel > const', 'c')], 
+                   is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<const ns3::SpectrumModel> ns3::WifiSpectrumPhyInterface::GetRxSpectrumModel() const [member function]
+    cls.add_method('GetRxSpectrumModel', 
+                   'ns3::Ptr< ns3::SpectrumModel const >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::AntennaModel> ns3::WifiSpectrumPhyInterface::GetRxAntenna() const [member function]
+    cls.add_method('GetRxAntenna', 
+                   'ns3::Ptr< ns3::AntennaModel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
+    cls.add_method('StartRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params')], 
+                   is_virtual=True)
+    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3WifiSpectrumSignalParameters_methods(root_module, cls):
+    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::WifiSpectrumSignalParameters() [constructor]
+    cls.add_constructor([])
+    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::WifiSpectrumSignalParameters(ns3::WifiSpectrumSignalParameters const & p) [constructor]
+    cls.add_constructor([param('ns3::WifiSpectrumSignalParameters const &', 'p')])
+    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::Ptr<ns3::SpectrumSignalParameters> ns3::WifiSpectrumSignalParameters::Copy() [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::SpectrumSignalParameters >', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::ppdu [variable]
+    cls.add_instance_attribute('ppdu', 'ns3::Ptr< ns3::WifiPpdu >', is_const=False)
+    return
+
+def register_Ns3WifiTxCurrentModel_methods(root_module, cls):
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel::WifiTxCurrentModel(ns3::WifiTxCurrentModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiTxCurrentModel const &', 'arg0')])
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel::WifiTxCurrentModel() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::WifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
+    cls.add_method('CalcTxCurrent', 
+                   'double', 
+                   [param('double', 'txPowerDbm')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## wifi-tx-current-model.h (module 'wifi'): static ns3::TypeId ns3::WifiTxCurrentModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3YansWifiPhy_methods(root_module, cls):
+    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy(ns3::YansWifiPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::YansWifiPhy const &', 'arg0')])
+    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy() [constructor]
+    cls.add_constructor([])
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::YansWifiPhy::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint16_t ns3::YansWifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): std::tuple<double, double, double> ns3::YansWifiPhy::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::YansWifiPhy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannel(ns3::Ptr<ns3::YansWifiChannel> const channel) [member function]
+    cls.add_method('SetChannel', 
                    'void', 
-                   [])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::SwitchToTx(ns3::Time txDuration, ns3::WifiConstPsduMap psdus, double txPowerDbm, ns3::WifiTxVector txVector) [member function]
-    cls.add_method('SwitchToTx', 
+                   [param('ns3::Ptr< ns3::YansWifiChannel > const', 'channel')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
                    'void', 
-                   [param('ns3::Time', 'txDuration'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psdus'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-phy-state-helper.h (module 'wifi'): void ns3::WifiPhyStateHelper::UnregisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('UnregisterListener', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')])
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
-def register_Ns3WifiPpdu_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiPpdu const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPpdu const &', 'arg0')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiPpdu::WifiPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band) [constructor]
-    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')])
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiPpdu::GetModulation() const [member function]
-    cls.add_method('GetModulation', 
-                   'ns3::WifiModulationClass', 
-                   [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::WifiPpdu::GetPsdu(uint8_t bssColor=64, uint16_t staId=65535) const [member function]
-    cls.add_method('GetPsdu', 
-                   'ns3::Ptr< ns3::WifiPsdu const >', 
-                   [param('uint8_t', 'bssColor', default_value='64'), param('uint16_t', 'staId', default_value='65535')], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
-    cls.add_method('GetTxDuration', 
-                   'ns3::Time', 
+def register_Ns3ZetaRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZetaRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::WifiPpdu::GetTxVector() const [member function]
-    cls.add_method('GetTxVector', 
-                   'ns3::WifiTxVector', 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable::ZetaRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsMu() const [member function]
-    cls.add_method('IsMu', 
-                   'bool', 
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue(double alpha) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger(uint32_t alpha) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'alpha')])
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): bool ns3::WifiPpdu::IsTruncatedTx() const [member function]
-    cls.add_method('IsTruncatedTx', 
-                   'bool', 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## wifi-ppdu.h (module 'wifi'): void ns3::WifiPpdu::SetTruncatedTx() [member function]
-    cls.add_method('SetTruncatedTx', 
-                   'void', 
-                   [])
+                   is_virtual=True)
     return
 
-def register_Ns3WifiPsdu_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::WifiPsdu const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiPsdu const &', 'arg0')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::Packet> p, ns3::WifiMacHeader const & header) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::WifiMacHeader const &', 'header')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('bool', 'isSingle')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, bool isSingle) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('bool', 'isSingle')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiPsdu::WifiPsdu(std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [constructor]
-    cls.add_constructor([param('std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiPsdu::GetAckPolicyForTid(uint8_t tid) const [member function]
-    cls.add_method('GetAckPolicyForTid', 
-                   'ns3::WifiMacHeader::QosAckPolicy', 
-                   [param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr1() const [member function]
-    cls.add_method('GetAddr1', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Mac48Address ns3::WifiPsdu::GetAddr2() const [member function]
-    cls.add_method('GetAddr2', 
-                   'ns3::Mac48Address', 
+def register_Ns3ZipfRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZipfRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::WifiPsdu::GetAmpduSubframe(std::size_t i) const [member function]
-    cls.add_method('GetAmpduSubframe', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetAmpduSubframeSize(std::size_t i) const [member function]
-    cls.add_method('GetAmpduSubframeSize', 
-                   'std::size_t', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetDuration() const [member function]
-    cls.add_method('GetDuration', 
-                   'ns3::Time', 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable::ZipfRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader const & ns3::WifiPsdu::GetHeader(std::size_t i) const [member function]
-    cls.add_method('GetHeader', 
-                   'ns3::WifiMacHeader const &', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::WifiMacHeader & ns3::WifiPsdu::GetHeader(std::size_t i) [member function]
-    cls.add_method('GetHeader', 
-                   'ns3::WifiMacHeader &', 
-                   [param('std::size_t', 'i')])
-    ## wifi-psdu.h (module 'wifi'): uint16_t ns3::WifiPsdu::GetMaxDistFromStartingSeq(uint16_t startingSeq) const [member function]
-    cls.add_method('GetMaxDistFromStartingSeq', 
-                   'uint16_t', 
-                   [param('uint16_t', 'startingSeq')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::size_t ns3::WifiPsdu::GetNMpdus() const [member function]
-    cls.add_method('GetNMpdus', 
-                   'std::size_t', 
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet const >', 
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue(uint32_t n, double alpha) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('uint32_t', 'n'), param('double', 'alpha')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger(uint32_t n, uint32_t alpha) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'n'), param('uint32_t', 'alpha')])
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Ptr<const ns3::Packet> ns3::WifiPsdu::GetPayload(std::size_t i) const [member function]
-    cls.add_method('GetPayload', 
-                   'ns3::Ptr< ns3::Packet const >', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): uint32_t ns3::WifiPsdu::GetSize() const [member function]
-    cls.add_method('GetSize', 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > ns3::WifiPsdu::GetTids() const [member function]
-    cls.add_method('GetTids', 
-                   'std::set< unsigned char >', 
+                   is_virtual=True)
+    return
+
+def register_Ns3AarfWifiManager_methods(root_module, cls):
+    ## aarf-wifi-manager.h (module 'wifi'): ns3::AarfWifiManager::AarfWifiManager(ns3::AarfWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AarfWifiManager const &', 'arg0')])
+    ## aarf-wifi-manager.h (module 'wifi'): ns3::AarfWifiManager::AarfWifiManager() [constructor]
+    cls.add_constructor([])
+    ## aarf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AarfWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): ns3::Time ns3::WifiPsdu::GetTimeStamp(std::size_t i) const [member function]
-    cls.add_method('GetTimeStamp', 
-                   'ns3::Time', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsAggregate() const [member function]
-    cls.add_method('IsAggregate', 
-                   'bool', 
+                   is_static=True)
+    ## aarf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AarfWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): bool ns3::WifiPsdu::IsSingle() const [member function]
-    cls.add_method('IsSingle', 
-                   'bool', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetAckPolicyForTid(uint8_t tid, ns3::WifiMacHeader::QosAckPolicy policy) [member function]
-    cls.add_method('SetAckPolicyForTid', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [param('uint8_t', 'tid'), param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
-    ## wifi-psdu.h (module 'wifi'): void ns3::WifiPsdu::SetDuration(ns3::Time duration) [member function]
-    cls.add_method('SetDuration', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Time', 'duration')])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::begin() const [member function]
-    cls.add_method('begin', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::begin() [member function]
-    cls.add_method('begin', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
-                   [])
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::const_iterator ns3::WifiPsdu::end() const [member function]
-    cls.add_method('end', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 
-                   [], 
-                   is_const=True)
-    ## wifi-psdu.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > >::iterator ns3::WifiPsdu::end() [member function]
-    cls.add_method('end', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > > iterator', 
-                   [])
-    return
-
-def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager() [constructor]
-    cls.add_constructor([])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedMcs(ns3::Mac48Address address) [member function]
-    cls.add_method('AddAllSupportedMcs', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddAllSupportedModes(ns3::Mac48Address address) [member function]
-    cls.add_method('AddAllSupportedModes', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
-    cls.add_method('AddBasicMcs', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
                    'void', 
-                   [param('ns3::WifiMode', 'mcs')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
-    cls.add_method('AddBasicMode', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3AarfcdWifiManager_methods(root_module, cls):
+    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::AarfcdWifiManager::AarfcdWifiManager(ns3::AarfcdWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AarfcdWifiManager const &', 'arg0')])
+    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::AarfcdWifiManager::AarfcdWifiManager() [constructor]
+    cls.add_constructor([])
+    ## aarfcd-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AarfcdWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AarfcdWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfcdWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfcdWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::WifiMode', 'mode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHeCapabilities(ns3::Mac48Address from, ns3::HeCapabilities heCapabilities) [member function]
-    cls.add_method('AddStationHeCapabilities', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): bool ns3::AarfcdWifiManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
+    cls.add_method('DoNeedRts', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'from'), param('ns3::HeCapabilities', 'heCapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHtCapabilities(ns3::Mac48Address from, ns3::HtCapabilities htCapabilities) [member function]
-    cls.add_method('AddStationHtCapabilities', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htCapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationVhtCapabilities(ns3::Mac48Address from, ns3::VhtCapabilities vhtCapabilities) [member function]
-    cls.add_method('AddStationVhtCapabilities', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'from'), param('ns3::VhtCapabilities', 'vhtCapabilities')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedErpSlotTime(ns3::Mac48Address address, bool isShortSlotTimeSupported) [member function]
-    cls.add_method('AddSupportedErpSlotTime', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortSlotTimeSupported')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, ns3::WifiMode mcs) [member function]
-    cls.add_method('AddSupportedMcs', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mcs')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
-    cls.add_method('AddSupportedMode', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedPhyPreamble(ns3::Mac48Address address, bool isShortPreambleSupported) [member function]
-    cls.add_method('AddSupportedPhyPreamble', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('bool', 'isShortPreambleSupported')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMcs(uint8_t i) const [member function]
-    cls.add_method('GetBasicMcs', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint8_t i) const [member function]
-    cls.add_method('GetBasicMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetChannelWidthSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetChannelWidthSupported', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector() [member function]
-    cls.add_method('GetCtsToSelfTxVector', 
-                   'ns3::WifiTxVector', 
-                   [])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetDataTxVector(ns3::WifiMacHeader const & header) [member function]
-    cls.add_method('GetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiMacHeader const &', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
-    cls.add_method('GetDefaultMcs', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
-    cls.add_method('GetDefaultMode', 
-                   'ns3::WifiMode', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
-    cls.add_method('GetDefaultTxPowerLevel', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentationThreshold() const [member function]
-    cls.add_method('GetFragmentationThreshold', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3AmpduSubframeHeader_methods(root_module, cls):
+    ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader::AmpduSubframeHeader(ns3::AmpduSubframeHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AmpduSubframeHeader const &', 'arg0')])
+    ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader::AmpduSubframeHeader() [constructor]
+    cls.add_constructor([])
+    ## ampdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmpduSubframeHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
                    'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported() const [member function]
-    cls.add_method('GetGreenfieldSupported', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ampdu-subframe-header.h (module 'wifi'): bool ns3::AmpduSubframeHeader::GetEof() const [member function]
+    cls.add_method('GetEof', 
                    'bool', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
+    ## ampdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmpduSubframeHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported() const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## ampdu-subframe-header.h (module 'wifi'): uint16_t ns3::AmpduSubframeHeader::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported() const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
+    ## ampdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmpduSubframeHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo ns3::WifiRemoteStationManager::GetInfo(ns3::Mac48Address address) [member function]
-    cls.add_method('GetInfo', 
-                   'ns3::WifiRemoteStationInfo', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported() const [member function]
-    cls.add_method('GetLdpcSupported', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## ampdu-subframe-header.h (module 'wifi'): static ns3::TypeId ns3::AmpduSubframeHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetLdpcSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetLdpcSupported', 
+                   is_static=True)
+    ## ampdu-subframe-header.h (module 'wifi'): bool ns3::AmpduSubframeHeader::IsSignatureValid() const [member function]
+    cls.add_method('IsSignatureValid', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMaxNumberOfTransmitStreams() const [member function]
-    cls.add_method('GetMaxNumberOfTransmitStreams', 
-                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicMcs() const [member function]
-    cls.add_method('GetNBasicMcs', 
-                   'uint8_t', 
+    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetEof(bool eof) [member function]
+    cls.add_method('SetEof', 
+                   'void', 
+                   [param('bool', 'eof')])
+    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
+    return
+
+def register_Ns3AmrrWifiManager_methods(root_module, cls):
+    ## amrr-wifi-manager.h (module 'wifi'): ns3::AmrrWifiManager::AmrrWifiManager(ns3::AmrrWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AmrrWifiManager const &', 'arg0')])
+    ## amrr-wifi-manager.h (module 'wifi'): ns3::AmrrWifiManager::AmrrWifiManager() [constructor]
+    cls.add_constructor([])
+    ## amrr-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AmrrWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNBasicModes() const [member function]
-    cls.add_method('GetNBasicModes', 
-                   'uint8_t', 
+                   is_static=True)
+    ## amrr-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AmrrWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetNMcsSupported', 
-                   'uint8_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNNonErpBasicModes() const [member function]
-    cls.add_method('GetNNonErpBasicModes', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AmrrWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AmrrWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3AmsduSubframeHeader_methods(root_module, cls):
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader(ns3::AmsduSubframeHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AmsduSubframeHeader const &', 'arg0')])
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader() [constructor]
+    cls.add_constructor([])
+    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
                    'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetDestinationAddr() const [member function]
+    cls.add_method('GetDestinationAddr', 
+                   'ns3::Mac48Address', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonErpBasicMode(uint8_t i) const [member function]
-    cls.add_method('GetNonErpBasicMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonUnicastMode() const [member function]
-    cls.add_method('GetNonUnicastMode', 
-                   'ns3::WifiMode', 
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmsduSubframeHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfAntennas() const [member function]
-    cls.add_method('GetNumberOfAntennas', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): uint16_t ns3::AmsduSubframeHeader::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetNumberOfSupportedStreams', 
-                   'uint8_t', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetPcfSupported() const [member function]
-    cls.add_method('GetPcfSupported', 
-                   'bool', 
+    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetRtsTxVector(ns3::Mac48Address address) [member function]
-    cls.add_method('GetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported() const [member function]
-    cls.add_method('GetShortGuardIntervalSupported', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetSourceAddr() const [member function]
+    cls.add_method('GetSourceAddr', 
+                   'ns3::Mac48Address', 
                    [], 
                    is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetShortGuardIntervalSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleEnabled() const [member function]
-    cls.add_method('GetShortPreambleEnabled', 
-                   'bool', 
+    ## amsdu-subframe-header.h (module 'wifi'): static ns3::TypeId ns3::AmsduSubframeHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortPreambleSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetShortPreambleSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeEnabled() const [member function]
-    cls.add_method('GetShortSlotTimeEnabled', 
-                   'bool', 
+                   is_static=True)
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetDestinationAddr(ns3::Mac48Address to) [member function]
+    cls.add_method('SetDestinationAddr', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'to')])
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
+    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetSourceAddr(ns3::Mac48Address to) [member function]
+    cls.add_method('SetSourceAddr', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'to')])
+    return
+
+def register_Ns3AntennaModel_methods(root_module, cls):
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel(ns3::AntennaModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AntennaModel const &', 'arg0')])
+    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel() [constructor]
+    cls.add_constructor([])
+    ## antenna-model.h (module 'antenna'): double ns3::AntennaModel::GetGainDb(ns3::Angles a) [member function]
+    cls.add_method('GetGainDb', 
+                   'double', 
+                   [param('ns3::Angles', 'a')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## antenna-model.h (module 'antenna'): static ns3::TypeId ns3::AntennaModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortSlotTimeSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HeCapabilities> ns3::WifiRemoteStationManager::GetStationHeCapabilities(ns3::Mac48Address from) [member function]
-    cls.add_method('GetStationHeCapabilities', 
-                   'ns3::Ptr< ns3::HeCapabilities const >', 
-                   [param('ns3::Mac48Address', 'from')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::HtCapabilities> ns3::WifiRemoteStationManager::GetStationHtCapabilities(ns3::Mac48Address from) [member function]
-    cls.add_method('GetStationHtCapabilities', 
-                   'ns3::Ptr< ns3::HtCapabilities const >', 
-                   [param('ns3::Mac48Address', 'from')])
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<const ns3::VhtCapabilities> ns3::WifiRemoteStationManager::GetStationVhtCapabilities(ns3::Mac48Address from) [member function]
-    cls.add_method('GetStationVhtCapabilities', 
-                   'ns3::Ptr< ns3::VhtCapabilities const >', 
-                   [param('ns3::Mac48Address', 'from')])
-    ## wifi-remote-station-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiRemoteStationManager::GetTypeId() [member function]
+                   is_static=True)
+    return
+
+def register_Ns3AparfWifiManager_methods(root_module, cls):
+    ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager::AparfWifiManager(ns3::AparfWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AparfWifiManager const &', 'arg0')])
+    ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager::AparfWifiManager() [constructor]
+    cls.add_constructor([])
+    ## aparf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AparfWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseGreenfieldProtection() const [member function]
-    cls.add_method('GetUseGreenfieldProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonErpProtection() const [member function]
-    cls.add_method('GetUseNonErpProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetUseNonHtProtection() const [member function]
-    cls.add_method('GetUseNonHtProtection', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported() const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported(ns3::Mac48Address address) const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
-    cls.add_method('IsAssociated', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsBrandNew(ns3::Mac48Address address) const [member function]
-    cls.add_method('IsBrandNew', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet, uint32_t fragmentNumber) [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsWaitAssocTxOk(ns3::Mac48Address address) const [member function]
-    cls.add_method('IsWaitAssocTxOk', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedCtsToSelf(ns3::WifiTxVector txVector) [member function]
-    cls.add_method('NeedCtsToSelf', 
-                   'bool', 
-                   [param('ns3::WifiTxVector', 'txVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NeedFragmentation', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRetransmission(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('NeedRetransmission', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::WifiMacHeader const & header, uint32_t size) [member function]
-    cls.add_method('NeedRts', 
-                   'bool', 
-                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordDisassociated(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordDisassociated', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxFailed(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordGotAssocTxFailed', 
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxOk(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordGotAssocTxOk', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## aparf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AparfWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AparfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AparfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordWaitAssocTxOk(ns3::Mac48Address address) [member function]
-    cls.add_method('RecordWaitAssocTxOk', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RemoveAllSupportedMcs(ns3::Mac48Address address) [member function]
-    cls.add_method('RemoveAllSupportedMcs', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportAmpduTxStatus(ns3::Mac48Address address, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('ReportAmpduTxStatus', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
-    cls.add_method('ReportDataFailed', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ackSnr, ns3::WifiMode ackMode, double dataSnr, ns3::WifiTxVector dataTxVector, uint32_t packetSize) [member function]
-    cls.add_method('ReportDataOk', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header, uint32_t packetSize) [member function]
-    cls.add_method('ReportFinalDataFailed', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('uint32_t', 'packetSize')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
-    cls.add_method('ReportFinalRtsFailed', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
-    cls.add_method('ReportRtsFailed', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ArfWifiManager_methods(root_module, cls):
+    ## arf-wifi-manager.h (module 'wifi'): ns3::ArfWifiManager::ArfWifiManager(ns3::ArfWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ArfWifiManager const &', 'arg0')])
+    ## arf-wifi-manager.h (module 'wifi'): ns3::ArfWifiManager::ArfWifiManager() [constructor]
+    cls.add_constructor([])
+    ## arf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ArfWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## arf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ArfWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ArfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ArfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('ReportRtsOk', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('ReportRxOk', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::Reset() [member function]
-    cls.add_method('Reset', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
-    cls.add_method('SetDefaultTxPowerLevel', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [param('uint8_t', 'txPower')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetFragmentationThreshold(uint32_t threshold) [member function]
-    cls.add_method('SetFragmentationThreshold', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
                    'void', 
-                   [param('uint32_t', 'threshold')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSlrc(uint32_t maxSlrc) [member function]
-    cls.add_method('SetMaxSlrc', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
                    'void', 
-                   [param('uint32_t', 'maxSlrc')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
-    cls.add_method('SetMaxSsrc', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
                    'void', 
-                   [param('uint32_t', 'maxSsrc')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetPcfSupported(bool enable) [member function]
-    cls.add_method('SetPcfSupported', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3AthstatsWifiTraceSink_methods(root_module, cls):
+    ## athstats-helper.h (module 'wifi'): ns3::AthstatsWifiTraceSink::AthstatsWifiTraceSink(ns3::AthstatsWifiTraceSink const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AthstatsWifiTraceSink const &', 'arg0')])
+    ## athstats-helper.h (module 'wifi'): ns3::AthstatsWifiTraceSink::AthstatsWifiTraceSink() [constructor]
+    cls.add_constructor([])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::DevRxTrace(std::string context, ns3::Ptr<const ns3::Packet> p) [member function]
+    cls.add_method('DevRxTrace', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
-    cls.add_method('SetQosSupport', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::DevTxTrace(std::string context, ns3::Ptr<const ns3::Packet> p) [member function]
+    cls.add_method('DevTxTrace', 
                    'void', 
-                   [param('ns3::Mac48Address', 'from'), param('bool', 'qosSupported')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetRtsCtsThreshold(uint32_t threshold) [member function]
-    cls.add_method('SetRtsCtsThreshold', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+    ## athstats-helper.h (module 'wifi'): static ns3::TypeId ns3::AthstatsWifiTraceSink::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::Open(std::string const & name) [member function]
+    cls.add_method('Open', 
                    'void', 
-                   [param('uint32_t', 'threshold')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortPreambleEnabled(bool enable) [member function]
-    cls.add_method('SetShortPreambleEnabled', 
+                   [param('std::string const &', 'name')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyRxErrorTrace(std::string context, ns3::Ptr<const ns3::Packet> packet, double snr) [member function]
+    cls.add_method('PhyRxErrorTrace', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetShortSlotTimeEnabled(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeEnabled', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'snr')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyRxOkTrace(std::string context, ns3::Ptr<const ns3::Packet> packet, double snr, ns3::WifiMode mode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('PhyRxOkTrace', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseGreenfieldProtection(bool enable) [member function]
-    cls.add_method('SetUseGreenfieldProtection', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'snr'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyStateTrace(std::string context, ns3::Time start, ns3::Time duration, WifiPhyState state) [member function]
+    cls.add_method('PhyStateTrace', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonErpProtection(bool enable) [member function]
-    cls.add_method('SetUseNonErpProtection', 
+                   [param('std::string', 'context'), param('ns3::Time', 'start'), param('ns3::Time', 'duration'), param('WifiPhyState', 'state')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyTxTrace(std::string context, ns3::Ptr<const ns3::Packet> packet, ns3::WifiMode mode, ns3::WifiPreamble preamble, uint8_t txPower) [member function]
+    cls.add_method('PhyTxTrace', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetUseNonHtProtection(bool enable) [member function]
-    cls.add_method('SetUseNonHtProtection', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'txPower')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxDataFailedTrace(std::string context, ns3::Mac48Address address) [member function]
+    cls.add_method('TxDataFailedTrace', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetupMac', 
+                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxFinalDataFailedTrace(std::string context, ns3::Mac48Address address) [member function]
+    cls.add_method('TxFinalDataFailedTrace', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
-                   is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
+                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxFinalRtsFailedTrace(std::string context, ns3::Mac48Address address) [member function]
+    cls.add_method('TxFinalRtsFailedTrace', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::UpdateFragmentationThreshold() [member function]
-    cls.add_method('UpdateFragmentationThreshold', 
+                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
+    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxRtsFailedTrace(std::string context, ns3::Mac48Address address) [member function]
+    cls.add_method('TxRtsFailedTrace', 
                    'void', 
-                   [])
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseGreenfieldForDestination(ns3::Mac48Address dest) const [member function]
-    cls.add_method('UseGreenfieldForDestination', 
+                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
+    return
+
+def register_Ns3AttributeAccessor_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor(ns3::AttributeAccessor const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AttributeAccessor const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('Get', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::UseLdpcForDestination(ns3::Mac48Address dest) const [member function]
-    cls.add_method('UseLdpcForDestination', 
+                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasGetter() const [member function]
+    cls.add_method('HasGetter', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Mac48Address ns3::WifiRemoteStationManager::GetAddress(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetAggregation(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetAggregation', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasSetter() const [member function]
+    cls.add_method('HasSetter', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetChannelWidth(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint16_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetGreenfield', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Set', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetGuardInterval(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHeSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetHeSupported', 
+                   [param('ns3::ObjectBase *', 'object', transfer_ownership=False), param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeChecker_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker(ns3::AttributeChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AttributeChecker const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetHtSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetHtSupported', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
+    cls.add_method('Copy', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiRemoteStationManager::GetMac() const [member function]
-    cls.add_method('GetMac', 
-                   'ns3::Ptr< ns3::WifiMac >', 
+                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
-    cls.add_method('GetMcsSupported', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint8_t', 'i')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetNMcsSupported', 
-                   'uint8_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNNonErpSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetNNonErpSupported', 
-                   'uint32_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetNSupported', 
-                   'uint8_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNess(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetNess', 
-                   'uint8_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonErpSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
-    cls.add_method('GetNonErpSupported', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint8_t', 'i')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetNumberOfSupportedStreams(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetNumberOfSupportedStreams', 
-                   'uint8_t', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiRemoteStationManager::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::CreateValidValue(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('CreateValidValue', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetQosSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardIntervalSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetShortGuardIntervalSupported', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetSupported(ns3::WifiRemoteStation const * station, uint8_t i) const [member function]
-    cls.add_method('GetSupported', 
-                   'ns3::WifiMode', 
-                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint8_t', 'i')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetVhtSupported(ns3::WifiRemoteStation const * station) const [member function]
-    cls.add_method('GetVhtSupported', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue(ns3::AttributeValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation const *', 'station')], 
-                   is_const=True, visibility='protected')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::WifiRemoteStationManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3BlockAckManager_methods(root_module, cls):
+    ## block-ack-manager.h (module 'wifi'): static ns3::TypeId ns3::BlockAckManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedFragmentation(ns3::WifiRemoteStation * station, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
-    cls.add_method('DoNeedFragmentation', 
+                   is_static=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager::BlockAckManager() [constructor]
+    cls.add_constructor([])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const manager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'manager')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreement(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('ExistsAgreement', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRetransmission(ns3::WifiRemoteStation * station, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
-    cls.add_method('DoNeedRetransmission', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreementInState(ns3::Mac48Address recipient, uint8_t tid, ns3::OriginatorBlockAckAgreement::State state) const [member function]
+    cls.add_method('ExistsAgreementInState', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
-    cls.add_method('DoNeedRts', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::OriginatorBlockAckAgreement::State', 'state')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('CreateAgreement', 
+                   'void', 
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('DestroyAgreement', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient, uint16_t startingSeq) [member function]
+    cls.add_method('UpdateAgreement', 
+                   'void', 
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient'), param('uint16_t', 'startingSeq')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::StorePacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('StorePacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('GetBar', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('bool', 'remove', default_value='true'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasPackets() [member function]
+    cls.add_method('HasPackets', 
                    'bool', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportAmpduTxStatus', 
+                   [])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotAck(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyGotAck', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyMissedAck', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, double rxSnr, double dataSnr, ns3::WifiTxVector const & dataTxVector, size_t index=0) [member function]
+    cls.add_method('NotifyGotBlockAck', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
+                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector const &', 'dataTxVector'), param('size_t', 'index', default_value='0')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('NotifyMissedBlockAck', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DiscardOutstandingMpdus(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('DiscardOutstandingMpdus', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): uint32_t ns3::BlockAckManager::GetNBufferedPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetNBufferedPackets', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementEstablished(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
+    cls.add_method('NotifyAgreementEstablished', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementRejected(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('NotifyAgreementRejected', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementNoReply(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('NotifyAgreementNoReply', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementReset(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('NotifyAgreementReset', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckThreshold(uint8_t nPackets) [member function]
+    cls.add_method('SetBlockAckThreshold', 
+                   'void', 
+                   [param('uint8_t', 'nPackets')])
+    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::BlockAckManager::GetRetransmitQueue() [member function]
+    cls.add_method('GetRetransmitQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetQueue(ns3::Ptr<ns3::WifiMacQueue> const queue) [member function]
+    cls.add_method('SetQueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueue > const', 'queue')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckInactivityCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetBlockAckInactivityCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetBlockDestinationCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetUnblockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetUnblockDestinationCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::SwitchToBlockAckIfNeeded(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
+    cls.add_method('SwitchToBlockAckIfNeeded', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::NeedBarRetransmission(uint8_t tid, ns3::Mac48Address recipient) [member function]
+    cls.add_method('NeedBarRetransmission', 
+                   'bool', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'recipient')])
+    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetRecipientBufferSize(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetRecipientBufferSize', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckReqType ns3::BlockAckManager::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckType ns3::BlockAckManager::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetOriginatorStartingSequence(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetOriginatorStartingSequence', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxOkCallback(ns3::BlockAckManager::TxOk callback) [member function]
+    cls.add_method('SetTxOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxFailedCallback(ns3::BlockAckManager::TxFailed callback) [member function]
+    cls.add_method('SetTxFailedCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyDiscardedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyDiscardedMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
+    ## block-ack-manager.h (module 'wifi'): ns3::CtrlBAckRequestHeader ns3::BlockAckManager::GetBlockAckReqHeader(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqHeader', 
+                   'ns3::CtrlBAckRequestHeader', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::ScheduleBar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, bool skipIfNoDataQueued=false) [member function]
+    cls.add_method('ScheduleBar', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
     return
 
-def register_Ns3WifiSpectrumPhyInterface_methods(root_module, cls):
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): static ns3::TypeId ns3::WifiSpectrumPhyInterface::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3BooleanChecker_methods(root_module, cls):
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker(ns3::BooleanChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BooleanChecker const &', 'arg0')])
+    return
+
+def register_Ns3BooleanValue_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(ns3::BooleanValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BooleanValue const &', 'arg0')])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue() [constructor]
+    cls.add_constructor([])
+    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(bool value) [constructor]
+    cls.add_constructor([param('bool', 'value')])
+    ## boolean.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::BooleanValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('bool', 'value')])
+    return
+
+def register_Ns3CallbackChecker_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
+    return
+
+def register_Ns3CallbackImplBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<const ns3::CallbackImplBase> other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['void'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned long'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['double'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiTxVector const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['bool'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::WifiSpectrumPhyInterface::WifiSpectrumPhyInterface() [constructor]
-    cls.add_constructor([])
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetSpectrumWifiPhy(ns3::Ptr<ns3::SpectrumWifiPhy> const phy) [member function]
-    cls.add_method('SetSpectrumWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumWifiPhy > const', 'phy')])
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::WifiSpectrumPhyInterface::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
+                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetDevice(ns3::Ptr<ns3::NetDevice> const d) [member function]
-    cls.add_method('SetDevice', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NetDevice > const', 'd')], 
-                   is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetMobility(ns3::Ptr<ns3::MobilityModel> const m) [member function]
-    cls.add_method('SetMobility', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel > const', 'm')], 
-                   is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::MobilityModel> ns3::WifiSpectrumPhyInterface::GetMobility() [member function]
-    cls.add_method('GetMobility', 
-                   'ns3::Ptr< ns3::MobilityModel >', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::SetChannel(ns3::Ptr<ns3::SpectrumChannel> const c) [member function]
-    cls.add_method('SetChannel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumChannel > const', 'c')], 
-                   is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<const ns3::SpectrumModel> ns3::WifiSpectrumPhyInterface::GetRxSpectrumModel() const [member function]
-    cls.add_method('GetRxSpectrumModel', 
-                   'ns3::Ptr< ns3::SpectrumModel const >', 
+                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): ns3::Ptr<ns3::AntennaModel> ns3::WifiSpectrumPhyInterface::GetRxAntenna() [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
-    cls.add_method('StartRx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params')], 
-                   is_virtual=True)
-    ## wifi-spectrum-phy-interface.h (module 'wifi'): void ns3::WifiSpectrumPhyInterface::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
+                   is_static=True, template_parameters=['ns3::WifiMacDropReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3WifiSpectrumSignalParameters_methods(root_module, cls):
-    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::WifiSpectrumSignalParameters() [constructor]
-    cls.add_constructor([])
-    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::WifiSpectrumSignalParameters(ns3::WifiSpectrumSignalParameters const & p) [constructor]
-    cls.add_constructor([param('ns3::WifiSpectrumSignalParameters const &', 'p')])
-    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::Ptr<ns3::SpectrumSignalParameters> ns3::WifiSpectrumSignalParameters::Copy() [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::SpectrumSignalParameters >', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    ## wifi-spectrum-signal-parameters.h (module 'wifi'): ns3::WifiSpectrumSignalParameters::ppdu [variable]
-    cls.add_instance_attribute('ppdu', 'ns3::Ptr< ns3::WifiPpdu >', is_const=False)
-    return
-
-def register_Ns3WifiTxCurrentModel_methods(root_module, cls):
-    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel::WifiTxCurrentModel(ns3::WifiTxCurrentModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiTxCurrentModel const &', 'arg0')])
-    ## wifi-tx-current-model.h (module 'wifi'): ns3::WifiTxCurrentModel::WifiTxCurrentModel() [constructor]
-    cls.add_constructor([])
-    ## wifi-tx-current-model.h (module 'wifi'): double ns3::WifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
-    cls.add_method('CalcTxCurrent', 
-                   'double', 
-                   [param('double', 'txPowerDbm')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## wifi-tx-current-model.h (module 'wifi'): static ns3::TypeId ns3::WifiTxCurrentModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    return
-
-def register_Ns3YansWifiPhy_methods(root_module, cls):
-    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy(ns3::YansWifiPhy const & arg0) [constructor]
-    cls.add_constructor([param('ns3::YansWifiPhy const &', 'arg0')])
-    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy() [constructor]
-    cls.add_constructor([])
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::YansWifiPhy::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::Channel >', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::YansWifiPhy::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu> > > >*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannel(ns3::Ptr<ns3::YansWifiChannel> const channel) [member function]
-    cls.add_method('SetChannel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::YansWifiChannel > const', 'channel')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
-    cls.add_method('StartTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
+                   is_static=True, template_parameters=['std::set<ns3::Mac48Address', ' std::less<ns3::Mac48Address>', ' std::allocator<ns3::Mac48Address> > const*'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    return
-
-def register_Ns3ZetaRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZetaRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True, template_parameters=['ns3::DataRate'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable::ZetaRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetAlpha() const [member function]
-    cls.add_method('GetAlpha', 
-                   'double', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue(double alpha) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'alpha')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger(uint32_t alpha) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'alpha')])
-    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
+                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    return
-
-def register_Ns3ZipfRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZipfRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable::ZipfRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetN() const [member function]
-    cls.add_method('GetN', 
-                   'uint32_t', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetAlpha() const [member function]
-    cls.add_method('GetAlpha', 
-                   'double', 
+                   is_static=True, template_parameters=['ns3::RxSignalInfo'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue(uint32_t n, double alpha) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('uint32_t', 'n'), param('double', 'alpha')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger(uint32_t n, uint32_t alpha) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'n'), param('uint32_t', 'alpha')])
-    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
+                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   is_static=True, template_parameters=['ns3::HeSigAParameters'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    return
-
-def register_Ns3AarfWifiManager_methods(root_module, cls):
-    ## aarf-wifi-manager.h (module 'wifi'): ns3::AarfWifiManager::AarfWifiManager(ns3::AarfWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AarfWifiManager const &', 'arg0')])
-    ## aarf-wifi-manager.h (module 'wifi'): ns3::AarfWifiManager::AarfWifiManager() [constructor]
-    cls.add_constructor([])
-    ## aarf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AarfWifiManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## aarf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AarfWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
+                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## aarf-wifi-manager.h (module 'wifi'): void ns3::AarfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3AarfcdWifiManager_methods(root_module, cls):
-    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::AarfcdWifiManager::AarfcdWifiManager(ns3::AarfcdWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AarfcdWifiManager const &', 'arg0')])
-    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::AarfcdWifiManager::AarfcdWifiManager() [constructor]
-    cls.add_constructor([])
-    ## aarfcd-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AarfcdWifiManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AarfcdWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfcdWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AarfcdWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumPhy const> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): bool ns3::AarfcdWifiManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
-    cls.add_method('DoNeedRts', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## aarfcd-wifi-manager.h (module 'wifi'): void ns3::AarfcdWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
+                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
+    cls.add_method('GetCppTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True, template_parameters=['int'], visibility='protected')
     return
 
-def register_Ns3AmpduSubframeHeader_methods(root_module, cls):
-    ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader::AmpduSubframeHeader(ns3::AmpduSubframeHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AmpduSubframeHeader const &', 'arg0')])
-    ## ampdu-subframe-header.h (module 'wifi'): ns3::AmpduSubframeHeader::AmpduSubframeHeader() [constructor]
+def register_Ns3CallbackValue_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
     cls.add_constructor([])
-    ## ampdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmpduSubframeHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## ampdu-subframe-header.h (module 'wifi'): bool ns3::AmpduSubframeHeader::GetEof() const [member function]
-    cls.add_method('GetEof', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ampdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmpduSubframeHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ampdu-subframe-header.h (module 'wifi'): uint16_t ns3::AmpduSubframeHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## ampdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmpduSubframeHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ampdu-subframe-header.h (module 'wifi'): static ns3::TypeId ns3::AmpduSubframeHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## ampdu-subframe-header.h (module 'wifi'): bool ns3::AmpduSubframeHeader::IsSignatureValid() const [member function]
-    cls.add_method('IsSignatureValid', 
+    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
                    'bool', 
-                   [], 
-                   is_const=True)
-    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetEof(bool eof) [member function]
-    cls.add_method('SetEof', 
-                   'void', 
-                   [param('bool', 'eof')])
-    ## ampdu-subframe-header.h (module 'wifi'): void ns3::AmpduSubframeHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
+    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('uint16_t', 'length')])
+                   [param('ns3::CallbackBase', 'base')])
     return
 
-def register_Ns3AmrrWifiManager_methods(root_module, cls):
-    ## amrr-wifi-manager.h (module 'wifi'): ns3::AmrrWifiManager::AmrrWifiManager(ns3::AmrrWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AmrrWifiManager const &', 'arg0')])
-    ## amrr-wifi-manager.h (module 'wifi'): ns3::AmrrWifiManager::AmrrWifiManager() [constructor]
+def register_Ns3CaraWifiManager_methods(root_module, cls):
+    ## cara-wifi-manager.h (module 'wifi'): ns3::CaraWifiManager::CaraWifiManager(ns3::CaraWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CaraWifiManager const &', 'arg0')])
+    ## cara-wifi-manager.h (module 'wifi'): ns3::CaraWifiManager::CaraWifiManager() [constructor]
     cls.add_constructor([])
-    ## amrr-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AmrrWifiManager::GetTypeId() [member function]
+    ## cara-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::CaraWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## amrr-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AmrrWifiManager::DoCreateStation() const [member function]
+    ## cara-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::CaraWifiManager::DoCreateStation() const [member function]
     cls.add_method('DoCreateStation', 
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AmrrWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::CaraWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoGetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AmrrWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::CaraWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoGetRtsTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoInitialize() [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): bool ns3::CaraWifiManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
+    cls.add_method('DoNeedRts', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportDataFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
     cls.add_method('DoReportDataOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportFinalDataFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportRtsFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
     cls.add_method('DoReportRtsOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
                    is_virtual=True, visibility='private')
-    ## amrr-wifi-manager.h (module 'wifi'): void ns3::AmrrWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
     cls.add_method('DoReportRxOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3AmsduSubframeHeader_methods(root_module, cls):
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader(ns3::AmsduSubframeHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AmsduSubframeHeader const &', 'arg0')])
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::AmsduSubframeHeader::AmsduSubframeHeader() [constructor]
+def register_Ns3Channel_methods(root_module, cls):
+    ## channel.h (module 'network'): ns3::Channel::Channel(ns3::Channel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Channel const &', 'arg0')])
+    ## channel.h (module 'network'): ns3::Channel::Channel() [constructor]
     cls.add_constructor([])
-    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
+    ## channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Channel::GetDevice(std::size_t i) const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## channel.h (module 'network'): uint32_t ns3::Channel::GetId() const [member function]
+    cls.add_method('GetId', 
                    'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetDestinationAddr() const [member function]
-    cls.add_method('GetDestinationAddr', 
-                   'ns3::Mac48Address', 
                    [], 
                    is_const=True)
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::TypeId ns3::AmsduSubframeHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
+    ## channel.h (module 'network'): std::size_t ns3::Channel::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## channel.h (module 'network'): static ns3::TypeId ns3::Channel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): uint16_t ns3::AmsduSubframeHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
+                   is_static=True)
+    return
+
+def register_Ns3ChannelAccessManager_methods(root_module, cls):
+    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager(ns3::ChannelAccessManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelAccessManager const &', 'arg0')])
+    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager() [constructor]
+    cls.add_constructor([])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::Add(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetAccessGrantStart(bool ignoreNav=false) const [member function]
+    cls.add_method('GetAccessGrantStart', 
+                   'ns3::Time', 
+                   [param('bool', 'ignoreNav', default_value='false')], 
+                   is_const=True)
+    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::IsBusy() const [member function]
+    cls.add_method('IsBusy', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## amsdu-subframe-header.h (module 'wifi'): uint32_t ns3::AmsduSubframeHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
+    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::NeedBackoffUponAccess(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('NeedBackoffUponAccess', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutResetNow() [member function]
+    cls.add_method('NotifyAckTimeoutResetNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyAckTimeoutStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutResetNow() [member function]
+    cls.add_method('NotifyCtsTimeoutResetNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyCtsTimeoutStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyMaybeCcaBusyStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyMaybeCcaBusyStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavResetNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyNavResetNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyNavStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOffNow() [member function]
+    cls.add_method('NotifyOffNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOnNow() [member function]
+    cls.add_method('NotifyOnNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndErrorNow() [member function]
+    cls.add_method('NotifyRxEndErrorNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndOkNow() [member function]
+    cls.add_method('NotifyRxEndOkNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyRxStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySleepNow() [member function]
+    cls.add_method('NotifySleepNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyTxStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifyTxStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyWakeupNow() [member function]
+    cls.add_method('NotifyWakeupNow', 
+                   'void', 
+                   [])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RemovePhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('RemovePhyListener', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RequestAccess(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('RequestAccess', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupFrameExchangeManager(ns3::Ptr<ns3::FrameExchangeManager> feManager) [member function]
+    cls.add_method('SetupFrameExchangeManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::FrameExchangeManager >', 'feManager')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupPhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetupPhyListener', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): ns3::Mac48Address ns3::AmsduSubframeHeader::GetSourceAddr() const [member function]
-    cls.add_method('GetSourceAddr', 
-                   'ns3::Mac48Address', 
+                   is_virtual=True, visibility='protected')
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetEifsNoDifs() const [member function]
+    cls.add_method('GetEifsNoDifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSifs() const [member function]
+    cls.add_method('GetSifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSlot() const [member function]
+    cls.add_method('GetSlot', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ChannelCondition_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::ChannelCondition(ns3::ChannelCondition const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ChannelCondition const &', 'arg0')])
+    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::ChannelCondition() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::ChannelCondition(ns3::ChannelCondition::LosConditionValue losCondition, ns3::ChannelCondition::O2iConditionValue o2iCondition=::ns3::ChannelCondition::O2iConditionValue::O2O) [constructor]
+    cls.add_constructor([param('ns3::ChannelCondition::LosConditionValue', 'losCondition'), param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition', default_value='::ns3::ChannelCondition::O2iConditionValue::O2O')])
+    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::LosConditionValue ns3::ChannelCondition::GetLosCondition() const [member function]
+    cls.add_method('GetLosCondition', 
+                   'ns3::ChannelCondition::LosConditionValue', 
                    [], 
                    is_const=True)
-    ## amsdu-subframe-header.h (module 'wifi'): static ns3::TypeId ns3::AmsduSubframeHeader::GetTypeId() [member function]
+    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::O2iConditionValue ns3::ChannelCondition::GetO2iCondition() const [member function]
+    cls.add_method('GetO2iCondition', 
+                   'ns3::ChannelCondition::O2iConditionValue', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ChannelCondition::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::Ptr<const ns3::ChannelCondition> otherCondition) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ChannelCondition const >', 'otherCondition')], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsI2i() const [member function]
+    cls.add_method('IsI2i', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsLos() const [member function]
+    cls.add_method('IsLos', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsNlos() const [member function]
+    cls.add_method('IsNlos', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsNlosv() const [member function]
+    cls.add_method('IsNlosv', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsO2i() const [member function]
+    cls.add_method('IsO2i', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsO2o() const [member function]
+    cls.add_method('IsO2o', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## channel-condition-model.h (module 'propagation'): void ns3::ChannelCondition::SetLosCondition(ns3::ChannelCondition::LosConditionValue losCondition) [member function]
+    cls.add_method('SetLosCondition', 
+                   'void', 
+                   [param('ns3::ChannelCondition::LosConditionValue', 'losCondition')])
+    ## channel-condition-model.h (module 'propagation'): void ns3::ChannelCondition::SetO2iCondition(ns3::ChannelCondition::O2iConditionValue o2iCondition) [member function]
+    cls.add_method('SetO2iCondition', 
+                   'void', 
+                   [param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition')])
+    return
+
+def register_Ns3ChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::ChannelConditionModel::ChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::ChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetChannelCondition', 
+                   'ns3::Ptr< ns3::ChannelCondition >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## channel-condition-model.h (module 'propagation'): int64_t ns3::ChannelConditionModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3ConstantObssPdAlgorithm_methods(root_module, cls):
+    ## constant-obss-pd-algorithm.h (module 'wifi'): ns3::ConstantObssPdAlgorithm::ConstantObssPdAlgorithm(ns3::ConstantObssPdAlgorithm const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ConstantObssPdAlgorithm const &', 'arg0')])
+    ## constant-obss-pd-algorithm.h (module 'wifi'): ns3::ConstantObssPdAlgorithm::ConstantObssPdAlgorithm() [constructor]
+    cls.add_constructor([])
+    ## constant-obss-pd-algorithm.h (module 'wifi'): void ns3::ConstantObssPdAlgorithm::ConnectWifiNetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
+    cls.add_method('ConnectWifiNetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')], 
+                   is_virtual=True)
+    ## constant-obss-pd-algorithm.h (module 'wifi'): static ns3::TypeId ns3::ConstantObssPdAlgorithm::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetDestinationAddr(ns3::Mac48Address to) [member function]
-    cls.add_method('SetDestinationAddr', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'to')])
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## amsdu-subframe-header.h (module 'wifi'): void ns3::AmsduSubframeHeader::SetSourceAddr(ns3::Mac48Address to) [member function]
-    cls.add_method('SetSourceAddr', 
+    ## constant-obss-pd-algorithm.h (module 'wifi'): void ns3::ConstantObssPdAlgorithm::ReceiveHeSigA(ns3::HeSigAParameters params) [member function]
+    cls.add_method('ReceiveHeSigA', 
                    'void', 
-                   [param('ns3::Mac48Address', 'to')])
+                   [param('ns3::HeSigAParameters', 'params')], 
+                   is_virtual=True)
     return
 
-def register_Ns3AntennaModel_methods(root_module, cls):
-    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel(ns3::AntennaModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AntennaModel const &', 'arg0')])
-    ## antenna-model.h (module 'antenna'): ns3::AntennaModel::AntennaModel() [constructor]
-    cls.add_constructor([])
-    ## antenna-model.h (module 'antenna'): double ns3::AntennaModel::GetGainDb(ns3::Angles a) [member function]
-    cls.add_method('GetGainDb', 
-                   'double', 
-                   [param('ns3::Angles', 'a')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## antenna-model.h (module 'antenna'): static ns3::TypeId ns3::AntennaModel::GetTypeId() [member function]
+def register_Ns3ConstantRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ConstantRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable::ConstantRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetConstant() const [member function]
+    cls.add_method('GetConstant', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue(double constant) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'constant')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger(uint32_t constant) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'constant')])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
     return
 
-def register_Ns3AparfWifiManager_methods(root_module, cls):
-    ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager::AparfWifiManager(ns3::AparfWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AparfWifiManager const &', 'arg0')])
-    ## aparf-wifi-manager.h (module 'wifi'): ns3::AparfWifiManager::AparfWifiManager() [constructor]
+def register_Ns3ConstantRateWifiManager_methods(root_module, cls):
+    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::ConstantRateWifiManager::ConstantRateWifiManager(ns3::ConstantRateWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ConstantRateWifiManager const &', 'arg0')])
+    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::ConstantRateWifiManager::ConstantRateWifiManager() [constructor]
     cls.add_constructor([])
-    ## aparf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::AparfWifiManager::GetTypeId() [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ConstantRateWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## aparf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::AparfWifiManager::DoCreateStation() const [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ConstantRateWifiManager::DoCreateStation() const [member function]
     cls.add_method('DoCreateStation', 
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AparfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ConstantRateWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoGetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::AparfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ConstantRateWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoGetRtsTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportDataFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
     cls.add_method('DoReportDataOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportFinalDataFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportRtsFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
     cls.add_method('DoReportRtsOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
                    is_virtual=True, visibility='private')
-    ## aparf-wifi-manager.h (module 'wifi'): void ns3::AparfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
     cls.add_method('DoReportRxOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3ArfWifiManager_methods(root_module, cls):
-    ## arf-wifi-manager.h (module 'wifi'): ns3::ArfWifiManager::ArfWifiManager(ns3::ArfWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ArfWifiManager const &', 'arg0')])
-    ## arf-wifi-manager.h (module 'wifi'): ns3::ArfWifiManager::ArfWifiManager() [constructor]
+def register_Ns3ConstantSpeedPropagationDelayModel_methods(root_module, cls):
+    ## propagation-delay-model.h (module 'propagation'): ns3::ConstantSpeedPropagationDelayModel::ConstantSpeedPropagationDelayModel(ns3::ConstantSpeedPropagationDelayModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ConstantSpeedPropagationDelayModel const &', 'arg0')])
+    ## propagation-delay-model.h (module 'propagation'): ns3::ConstantSpeedPropagationDelayModel::ConstantSpeedPropagationDelayModel() [constructor]
     cls.add_constructor([])
-    ## arf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ArfWifiManager::GetTypeId() [member function]
+    ## propagation-delay-model.h (module 'propagation'): ns3::Time ns3::ConstantSpeedPropagationDelayModel::GetDelay(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetDelay', 
+                   'ns3::Time', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True)
+    ## propagation-delay-model.h (module 'propagation'): double ns3::ConstantSpeedPropagationDelayModel::GetSpeed() const [member function]
+    cls.add_method('GetSpeed', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## propagation-delay-model.h (module 'propagation'): static ns3::TypeId ns3::ConstantSpeedPropagationDelayModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## arf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ArfWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ArfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ArfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
+    ## propagation-delay-model.h (module 'propagation'): void ns3::ConstantSpeedPropagationDelayModel::SetSpeed(double speed) [member function]
+    cls.add_method('SetSpeed', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   [param('double', 'speed')])
+    ## propagation-delay-model.h (module 'propagation'): int64_t ns3::ConstantSpeedPropagationDelayModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
                    is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
+    return
+
+def register_Ns3Cost231PropagationLossModel_methods(root_module, cls):
+    ## cost231-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::Cost231PropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## cost231-propagation-loss-model.h (module 'propagation'): ns3::Cost231PropagationLossModel::Cost231PropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetLoss', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True)
+    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetBSAntennaHeight(double height) [member function]
+    cls.add_method('SetBSAntennaHeight', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
+                   [param('double', 'height')])
+    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetSSAntennaHeight(double height) [member function]
+    cls.add_method('SetSSAntennaHeight', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+                   [param('double', 'height')])
+    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetLambda(double lambda) [member function]
+    cls.add_method('SetLambda', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('double', 'lambda')])
+    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetLambda(double frequency, double speed) [member function]
+    cls.add_method('SetLambda', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('double', 'frequency'), param('double', 'speed')])
+    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetMinDistance(double minDistance) [member function]
+    cls.add_method('SetMinDistance', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## arf-wifi-manager.h (module 'wifi'): void ns3::ArfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('double', 'minDistance')])
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetBSAntennaHeight() const [member function]
+    cls.add_method('GetBSAntennaHeight', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetSSAntennaHeight() const [member function]
+    cls.add_method('GetSSAntennaHeight', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetMinDistance() const [member function]
+    cls.add_method('GetMinDistance', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetLambda() const [member function]
+    cls.add_method('GetLambda', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetShadowing() [member function]
+    cls.add_method('GetShadowing', 
+                   'double', 
+                   [])
+    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetShadowing(double shadowing) [member function]
+    cls.add_method('SetShadowing', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   [param('double', 'shadowing')])
+    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## cost231-propagation-loss-model.h (module 'propagation'): int64_t ns3::Cost231PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3AthstatsWifiTraceSink_methods(root_module, cls):
-    ## athstats-helper.h (module 'wifi'): ns3::AthstatsWifiTraceSink::AthstatsWifiTraceSink(ns3::AthstatsWifiTraceSink const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AthstatsWifiTraceSink const &', 'arg0')])
-    ## athstats-helper.h (module 'wifi'): ns3::AthstatsWifiTraceSink::AthstatsWifiTraceSink() [constructor]
+def register_Ns3CtrlBAckRequestHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader(ns3::CtrlBAckRequestHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlBAckRequestHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader() [constructor]
     cls.add_constructor([])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::DevRxTrace(std::string context, ns3::Ptr<const ns3::Packet> p) [member function]
-    cls.add_method('DevRxTrace', 
-                   'void', 
-                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::DevTxTrace(std::string context, ns3::Ptr<const ns3::Packet> p) [member function]
-    cls.add_method('DevTxTrace', 
-                   'void', 
-                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')])
-    ## athstats-helper.h (module 'wifi'): static ns3::TypeId ns3::AthstatsWifiTraceSink::GetTypeId() [member function]
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckRequestHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequence() const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequenceControl() const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckRequestHeader::GetTidInfo() const [member function]
+    cls.add_method('GetTidInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckReqType ns3::CtrlBAckRequestHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::BlockAckReqType', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckRequestHeader::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::Open(std::string const & name) [member function]
-    cls.add_method('Open', 
-                   'void', 
-                   [param('std::string const &', 'name')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyRxErrorTrace(std::string context, ns3::Ptr<const ns3::Packet> packet, double snr) [member function]
-    cls.add_method('PhyRxErrorTrace', 
-                   'void', 
-                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'snr')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyRxOkTrace(std::string context, ns3::Ptr<const ns3::Packet> packet, double snr, ns3::WifiMode mode, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('PhyRxOkTrace', 
-                   'void', 
-                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'snr'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyStateTrace(std::string context, ns3::Time start, ns3::Time duration, WifiPhyState state) [member function]
-    cls.add_method('PhyStateTrace', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsCompressed() const [member function]
+    cls.add_method('IsCompressed', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsExtendedCompressed() const [member function]
+    cls.add_method('IsExtendedCompressed', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsMultiTid() const [member function]
+    cls.add_method('IsMultiTid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::MustSendHtImmediateAck() const [member function]
+    cls.add_method('MustSendHtImmediateAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('std::string', 'context'), param('ns3::Time', 'start'), param('ns3::Time', 'duration'), param('WifiPhyState', 'state')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::PhyTxTrace(std::string context, ns3::Ptr<const ns3::Packet> packet, ns3::WifiMode mode, ns3::WifiPreamble preamble, uint8_t txPower) [member function]
-    cls.add_method('PhyTxTrace', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble'), param('uint8_t', 'txPower')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxDataFailedTrace(std::string context, ns3::Mac48Address address) [member function]
-    cls.add_method('TxDataFailedTrace', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetHtImmediateAck(bool immediateAck) [member function]
+    cls.add_method('SetHtImmediateAck', 
                    'void', 
-                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxFinalDataFailedTrace(std::string context, ns3::Mac48Address address) [member function]
-    cls.add_method('TxFinalDataFailedTrace', 
+                   [param('bool', 'immediateAck')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetStartingSequence(uint16_t seq) [member function]
+    cls.add_method('SetStartingSequence', 
                    'void', 
-                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxFinalRtsFailedTrace(std::string context, ns3::Mac48Address address) [member function]
-    cls.add_method('TxFinalRtsFailedTrace', 
+                   [param('uint16_t', 'seq')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetTidInfo(uint8_t tid) [member function]
+    cls.add_method('SetTidInfo', 
                    'void', 
-                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
-    ## athstats-helper.h (module 'wifi'): void ns3::AthstatsWifiTraceSink::TxRtsFailedTrace(std::string context, ns3::Mac48Address address) [member function]
-    cls.add_method('TxRtsFailedTrace', 
+                   [param('uint8_t', 'tid')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetType(ns3::BlockAckReqType type) [member function]
+    cls.add_method('SetType', 
                    'void', 
-                   [param('std::string', 'context'), param('ns3::Mac48Address', 'address')])
+                   [param('ns3::BlockAckReqType', 'type')])
     return
 
-def register_Ns3AttributeAccessor_methods(root_module, cls):
-    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor(ns3::AttributeAccessor const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AttributeAccessor const &', 'arg0')])
-    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor() [constructor]
+def register_Ns3CtrlBAckResponseHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader(ns3::CtrlBAckResponseHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlBAckResponseHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader() [constructor]
     cls.add_constructor([])
-    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
-    cls.add_method('Get', 
-                   'bool', 
-                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasGetter() const [member function]
-    cls.add_method('HasGetter', 
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned int, std::allocator<unsigned int> > ns3::CtrlBAckResponseHeader::FindPerAidTidInfoWithAid(uint16_t aid) const [member function]
+    cls.add_method('FindPerAidTidInfoWithAid', 
+                   'std::vector< unsigned int >', 
+                   [param('uint16_t', 'aid')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::GetAckType(std::size_t index) const [member function]
+    cls.add_method('GetAckType', 
                    'bool', 
+                   [param('std::size_t', 'index')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetAid11(std::size_t index) const [member function]
+    cls.add_method('GetAid11', 
+                   'uint16_t', 
+                   [param('std::size_t', 'index')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): std::vector<unsigned char, std::allocator<unsigned char> > const & ns3::CtrlBAckResponseHeader::GetBitmap(std::size_t index=0) const [member function]
+    cls.add_method('GetBitmap', 
+                   'std::vector< unsigned char > const &', 
+                   [param('std::size_t', 'index', default_value='0')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckResponseHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasSetter() const [member function]
-    cls.add_method('HasSetter', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): std::size_t ns3::CtrlBAckResponseHeader::GetNPerAidTidInfoSubfields() const [member function]
+    cls.add_method('GetNPerAidTidInfoSubfields', 
+                   'std::size_t', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
-    cls.add_method('Set', 
-                   'bool', 
-                   [param('ns3::ObjectBase *', 'object', transfer_ownership=False), param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3AttributeChecker_methods(root_module, cls):
-    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker(ns3::AttributeChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AttributeChecker const &', 'arg0')])
-    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker() [constructor]
-    cls.add_constructor([])
-    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
-    cls.add_method('Check', 
-                   'bool', 
-                   [param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
-    cls.add_method('Copy', 
-                   'bool', 
-                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::Create() const [member function]
-    cls.add_method('Create', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::CreateValidValue(ns3::AttributeValue const & value) const [member function]
-    cls.add_method('CreateValidValue', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequence(std::size_t index=0) const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [param('std::size_t', 'index', default_value='0')], 
                    is_const=True)
-    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetUnderlyingTypeInformation() const [member function]
-    cls.add_method('GetUnderlyingTypeInformation', 
-                   'std::string', 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequenceControl(std::size_t index=0) const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
+                   [param('std::size_t', 'index', default_value='0')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckResponseHeader::GetTidInfo(std::size_t index=0) const [member function]
+    cls.add_method('GetTidInfo', 
+                   'uint8_t', 
+                   [param('std::size_t', 'index', default_value='0')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType ns3::CtrlBAckResponseHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::BlockAckType', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetValueTypeName() const [member function]
-    cls.add_method('GetValueTypeName', 
-                   'std::string', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckResponseHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::AttributeChecker::HasUnderlyingTypeInformation() const [member function]
-    cls.add_method('HasUnderlyingTypeInformation', 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::Mac48Address ns3::CtrlBAckResponseHeader::GetUnassociatedStaAddress(std::size_t index) const [member function]
+    cls.add_method('GetUnassociatedStaAddress', 
+                   'ns3::Mac48Address', 
+                   [param('std::size_t', 'index')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
                    'bool', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3AttributeValue_methods(root_module, cls):
-    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue(ns3::AttributeValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AttributeValue const &', 'arg0')])
-    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue() [constructor]
-    cls.add_constructor([])
-    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsCompressed() const [member function]
+    cls.add_method('IsCompressed', 
+                   'bool', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsExtendedCompressed() const [member function]
+    cls.add_method('IsExtendedCompressed', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsFragmentReceived(uint16_t seq, uint8_t frag) const [member function]
+    cls.add_method('IsFragmentReceived', 
+                   'bool', 
+                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsMultiSta() const [member function]
+    cls.add_method('IsMultiSta', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3BlockAckManager_methods(root_module, cls):
-    ## block-ack-manager.h (module 'wifi'): static ns3::TypeId ns3::BlockAckManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager::BlockAckManager() [constructor]
-    cls.add_constructor([])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const manager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'manager')])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreement(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('ExistsAgreement', 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsMultiTid() const [member function]
+    cls.add_method('IsMultiTid', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   [], 
                    is_const=True)
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreementInState(ns3::Mac48Address recipient, uint8_t tid, ns3::OriginatorBlockAckAgreement::State state) const [member function]
-    cls.add_method('ExistsAgreementInState', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsPacketReceived(uint16_t seq, std::size_t index=0) const [member function]
+    cls.add_method('IsPacketReceived', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::OriginatorBlockAckAgreement::State', 'state')], 
+                   [param('uint16_t', 'seq'), param('std::size_t', 'index', default_value='0')], 
                    is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient) [member function]
-    cls.add_method('CreateAgreement', 
-                   'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('DestroyAgreement', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
-    cls.add_method('UpdateAgreement', 
-                   'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::StorePacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('StorePacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::BlockAckManager::GetBar(bool remove=true) [member function]
-    cls.add_method('GetBar', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('bool', 'remove', default_value='true')])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasPackets() [member function]
-    cls.add_method('HasPackets', 
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::MustSendHtImmediateAck() const [member function]
+    cls.add_method('MustSendHtImmediateAck', 
                    'bool', 
-                   [])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotAck(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyGotAck', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyMissedAck', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('NotifyGotBlockAck', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMissedBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyMissedBlockAck', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DiscardOutstandingMpdus(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('DiscardOutstandingMpdus', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::ResetBitmap(std::size_t index=0) [member function]
+    cls.add_method('ResetBitmap', 
                    'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): uint32_t ns3::BlockAckManager::GetNBufferedPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetNBufferedPackets', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementEstablished(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
-    cls.add_method('NotifyAgreementEstablished', 
+                   [param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementRejected(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyAgreementRejected', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetAckType(bool type, std::size_t index) [member function]
+    cls.add_method('SetAckType', 
                    'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementNoReply(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyAgreementNoReply', 
+                   [param('bool', 'type'), param('std::size_t', 'index')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetAid11(uint16_t aid, std::size_t index) [member function]
+    cls.add_method('SetAid11', 
                    'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementReset(ns3::Mac48Address recipient, uint8_t tid) [member function]
-    cls.add_method('NotifyAgreementReset', 
+                   [param('uint16_t', 'aid'), param('std::size_t', 'index')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immediateAck) [member function]
+    cls.add_method('SetHtImmediateAck', 
                    'void', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckThreshold(uint8_t nPackets) [member function]
-    cls.add_method('SetBlockAckThreshold', 
+                   [param('bool', 'immediateAck')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedFragment(uint16_t seq, uint8_t frag) [member function]
+    cls.add_method('SetReceivedFragment', 
                    'void', 
-                   [param('uint8_t', 'nPackets')])
-    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::BlockAckManager::GetRetransmitQueue() [member function]
-    cls.add_method('GetRetransmitQueue', 
-                   'ns3::Ptr< ns3::WifiMacQueue >', 
-                   [])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetQueue(ns3::Ptr<ns3::WifiMacQueue> const queue) [member function]
-    cls.add_method('SetQueue', 
+                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedPacket(uint16_t seq, std::size_t index=0) [member function]
+    cls.add_method('SetReceivedPacket', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueue > const', 'queue')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
-    cls.add_method('SetTxMiddle', 
+                   [param('uint16_t', 'seq'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequence(uint16_t seq, std::size_t index=0) [member function]
+    cls.add_method('SetStartingSequence', 
                    'void', 
-                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckType(ns3::BlockAckType bAckType) [member function]
-    cls.add_method('SetBlockAckType', 
+                   [param('uint16_t', 'seq'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequenceControl(uint16_t seqControl, std::size_t index=0) [member function]
+    cls.add_method('SetStartingSequenceControl', 
                    'void', 
-                   [param('ns3::BlockAckType', 'bAckType')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckInactivityCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetBlockAckInactivityCallback', 
+                   [param('uint16_t', 'seqControl'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetTidInfo(uint8_t tid, std::size_t index=0) [member function]
+    cls.add_method('SetTidInfo', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetBlockDestinationCallback', 
+                   [param('uint8_t', 'tid'), param('std::size_t', 'index', default_value='0')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetType(ns3::BlockAckType type) [member function]
+    cls.add_method('SetType', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetUnblockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetUnblockDestinationCallback', 
+                   [param('ns3::BlockAckType', 'type')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetUnassociatedStaAddress(ns3::Mac48Address const & ra, std::size_t index) [member function]
+    cls.add_method('SetUnassociatedStaAddress', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::SwitchToBlockAckIfNeeded(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
-    cls.add_method('SwitchToBlockAckIfNeeded', 
+                   [param('ns3::Mac48Address const &', 'ra'), param('std::size_t', 'index')])
+    return
+
+def register_Ns3CtrlTriggerHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::CtrlTriggerHeader(ns3::CtrlTriggerHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CtrlTriggerHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::CtrlTriggerHeader() [constructor]
+    cls.add_constructor([])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::CtrlTriggerHeader(ns3::TriggerFrameType type, ns3::WifiTxVector const & txVector) [constructor]
+    cls.add_constructor([param('ns3::TriggerFrameType', 'type'), param('ns3::WifiTxVector const &', 'txVector')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField & ns3::CtrlTriggerHeader::AddUserInfoField() [member function]
+    cls.add_method('AddUserInfoField', 
+                   'ns3::CtrlTriggerUserInfoField &', 
+                   [])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerUserInfoField & ns3::CtrlTriggerHeader::AddUserInfoField(ns3::CtrlTriggerUserInfoField const & userInfo) [member function]
+    cls.add_method('AddUserInfoField', 
+                   'ns3::CtrlTriggerUserInfoField &', 
+                   [param('ns3::CtrlTriggerUserInfoField const &', 'userInfo')])
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlTriggerHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithAid(ns3::CtrlTriggerHeader::ConstIterator start, uint16_t aid12) const [member function]
+    cls.add_method('FindUserInfoWithAid', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'start'), param('uint16_t', 'aid12')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithAid(uint16_t aid12) const [member function]
+    cls.add_method('FindUserInfoWithAid', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('uint16_t', 'aid12')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuAssociated(ns3::CtrlTriggerHeader::ConstIterator start) const [member function]
+    cls.add_method('FindUserInfoWithRaRuAssociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'start')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuAssociated() const [member function]
+    cls.add_method('FindUserInfoWithRaRuAssociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuUnassociated(ns3::CtrlTriggerHeader::ConstIterator start) const [member function]
+    cls.add_method('FindUserInfoWithRaRuUnassociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [param('std::list< ns3::CtrlTriggerUserInfoField > const_iterator', 'start')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::FindUserInfoWithRaRuUnassociated() const [member function]
+    cls.add_method('FindUserInfoWithRaRuUnassociated', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): int8_t ns3::CtrlTriggerHeader::GetApTxPower() const [member function]
+    cls.add_method('GetApTxPower', 
+                   'int8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader ns3::CtrlTriggerHeader::GetCommonInfoField() const [member function]
+    cls.add_method('GetCommonInfoField', 
+                   'ns3::CtrlTriggerHeader', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::GetCsRequired() const [member function]
+    cls.add_method('GetCsRequired', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
-    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::NeedBarRetransmission(uint8_t tid, ns3::Mac48Address recipient) [member function]
-    cls.add_method('NeedBarRetransmission', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::WifiTxVector ns3::CtrlTriggerHeader::GetHeTbTxVector(uint16_t staId) const [member function]
+    cls.add_method('GetHeTbTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlTriggerHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlTriggerHeader::GetLtfType() const [member function]
+    cls.add_method('GetLtfType', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::GetMoreTF() const [member function]
+    cls.add_method('GetMoreTF', 
                    'bool', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'recipient')])
-    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetRecipientBufferSize(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetRecipientBufferSize', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): std::size_t ns3::CtrlTriggerHeader::GetNUserInfoFields() const [member function]
+    cls.add_method('GetNUserInfoFields', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlTriggerHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TriggerFrameType ns3::CtrlTriggerHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::TriggerFrameType', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlTriggerHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): char const * ns3::CtrlTriggerHeader::GetTypeString() const [member function]
+    cls.add_method('GetTypeString', 
+                   'char const *', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static char const * ns3::CtrlTriggerHeader::GetTypeString(ns3::TriggerFrameType type) [member function]
+    cls.add_method('GetTypeString', 
+                   'char const *', 
+                   [param('ns3::TriggerFrameType', 'type')], 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetUlBandwidth() const [member function]
+    cls.add_method('GetUlBandwidth', 
                    'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   [], 
                    is_const=True)
-    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetOriginatorStartingSequence(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetOriginatorStartingSequence', 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetUlLength() const [member function]
+    cls.add_method('GetUlLength', 
                    'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   [], 
                    is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxOkCallback(ns3::BlockAckManager::TxOk callback) [member function]
-    cls.add_method('SetTxOkCallback', 
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlTriggerHeader::GetUlSpatialReuse() const [member function]
+    cls.add_method('GetUlSpatialReuse', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBfrp() const [member function]
+    cls.add_method('IsBfrp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBqrp() const [member function]
+    cls.add_method('IsBqrp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsBsrp() const [member function]
+    cls.add_method('IsBsrp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsGcrMuBar() const [member function]
+    cls.add_method('IsGcrMuBar', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsMuBar() const [member function]
+    cls.add_method('IsMuBar', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsMuRts() const [member function]
+    cls.add_method('IsMuRts', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsNfrp() const [member function]
+    cls.add_method('IsNfrp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlTriggerHeader::IsValid() const [member function]
+    cls.add_method('IsValid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxFailedCallback(ns3::BlockAckManager::TxFailed callback) [member function]
-    cls.add_method('SetTxFailedCallback', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyDiscardedMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('NotifyDiscardedMpdu', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetApTxPower(int8_t power) [member function]
+    cls.add_method('SetApTxPower', 
+                   'void', 
+                   [param('int8_t', 'power')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetCsRequired(bool cs) [member function]
+    cls.add_method('SetCsRequired', 
+                   'void', 
+                   [param('bool', 'cs')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetGiAndLtfType(uint16_t guardInterval, uint8_t ltfType) [member function]
+    cls.add_method('SetGiAndLtfType', 
+                   'void', 
+                   [param('uint16_t', 'guardInterval'), param('uint8_t', 'ltfType')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetMoreTF(bool more) [member function]
+    cls.add_method('SetMoreTF', 
+                   'void', 
+                   [param('bool', 'more')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetType(ns3::TriggerFrameType type) [member function]
+    cls.add_method('SetType', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
-    ## block-ack-manager.h (module 'wifi'): ns3::CtrlBAckRequestHeader ns3::BlockAckManager::GetBlockAckReqHeader(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('GetBlockAckReqHeader', 
-                   'ns3::CtrlBAckRequestHeader', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::ScheduleBar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, bool skipIfNoDataQueued=false) [member function]
-    cls.add_method('ScheduleBar', 
+                   [param('ns3::TriggerFrameType', 'type')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetUlBandwidth(uint16_t bw) [member function]
+    cls.add_method('SetUlBandwidth', 
+                   'void', 
+                   [param('uint16_t', 'bw')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetUlLength(uint16_t len) [member function]
+    cls.add_method('SetUlLength', 
+                   'void', 
+                   [param('uint16_t', 'len')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlTriggerHeader::SetUlSpatialReuse(uint16_t sr) [member function]
+    cls.add_method('SetUlSpatialReuse', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
+                   [param('uint16_t', 'sr')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::Iterator ns3::CtrlTriggerHeader::begin() [member function]
+    cls.add_method('begin', 
+                   'ns3::CtrlTriggerHeader::Iterator', 
+                   [])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::ConstIterator ns3::CtrlTriggerHeader::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::CtrlTriggerHeader::ConstIterator', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlTriggerHeader::Iterator ns3::CtrlTriggerHeader::end() [member function]
+    cls.add_method('end', 
+                   'ns3::CtrlTriggerHeader::Iterator', 
+                   [])
     return
 
-def register_Ns3BooleanChecker_methods(root_module, cls):
-    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker() [constructor]
+def register_Ns3DataRateChecker_methods(root_module, cls):
+    ## data-rate.h (module 'network'): ns3::DataRateChecker::DataRateChecker() [constructor]
     cls.add_constructor([])
-    ## boolean.h (module 'core'): ns3::BooleanChecker::BooleanChecker(ns3::BooleanChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BooleanChecker const &', 'arg0')])
+    ## data-rate.h (module 'network'): ns3::DataRateChecker::DataRateChecker(ns3::DataRateChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DataRateChecker const &', 'arg0')])
     return
 
-def register_Ns3BooleanValue_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(ns3::BooleanValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BooleanValue const &', 'arg0')])
-    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue() [constructor]
+def register_Ns3DataRateValue_methods(root_module, cls):
+    ## data-rate.h (module 'network'): ns3::DataRateValue::DataRateValue() [constructor]
     cls.add_constructor([])
-    ## boolean.h (module 'core'): ns3::BooleanValue::BooleanValue(bool value) [constructor]
-    cls.add_constructor([param('bool', 'value')])
-    ## boolean.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::BooleanValue::Copy() const [member function]
+    ## data-rate.h (module 'network'): ns3::DataRateValue::DataRateValue(ns3::DataRate const & value) [constructor]
+    cls.add_constructor([param('ns3::DataRate const &', 'value')])
+    ## data-rate.h (module 'network'): ns3::DataRateValue::DataRateValue(ns3::DataRateValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DataRateValue const &', 'arg0')])
+    ## data-rate.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::DataRateValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## boolean.h (module 'core'): bool ns3::BooleanValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    ## data-rate.h (module 'network'): bool ns3::DataRateValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## boolean.h (module 'core'): bool ns3::BooleanValue::Get() const [member function]
+    ## data-rate.h (module 'network'): ns3::DataRate ns3::DataRateValue::Get() const [member function]
     cls.add_method('Get', 
-                   'bool', 
+                   'ns3::DataRate', 
                    [], 
                    is_const=True)
-    ## boolean.h (module 'core'): std::string ns3::BooleanValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    ## data-rate.h (module 'network'): std::string ns3::DataRateValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## boolean.h (module 'core'): void ns3::BooleanValue::Set(bool value) [member function]
+    ## data-rate.h (module 'network'): void ns3::DataRateValue::Set(ns3::DataRate const & value) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('bool', 'value')])
+                   [param('ns3::DataRate const &', 'value')])
     return
 
-def register_Ns3CallbackChecker_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
+def register_Ns3DeterministicRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::DeterministicRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable::DeterministicRandomVariable() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
+    ## random-variable-stream.h (module 'core'): void ns3::DeterministicRandomVariable::SetValueArray(double * values, std::size_t length) [member function]
+    cls.add_method('SetValueArray', 
+                   'void', 
+                   [param('double *', 'values'), param('std::size_t', 'length')])
+    ## random-variable-stream.h (module 'core'): double ns3::DeterministicRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::DeterministicRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
     return
 
-def register_Ns3CallbackImplBase_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
+def register_Ns3DeviceEnergyModel_methods(root_module, cls):
+    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel::DeviceEnergyModel(ns3::DeviceEnergyModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DeviceEnergyModel const &', 'arg0')])
+    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel::DeviceEnergyModel() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
-    ## callback.h (module 'core'): std::string ns3::CallbackImplBase::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<const ns3::CallbackImplBase> other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::Demangle(std::string const & mangled) [member function]
-    cls.add_method('Demangle', 
-                   'std::string', 
-                   [param('std::string const &', 'mangled')], 
-                   is_static=True, visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['void'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['unsigned long'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['unsigned int'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['double'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Mac48Address'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::Packet const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Time'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['unsigned char'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::OriginatorBlockAckAgreement::State'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::WifiMacHeader const&'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::DataRate'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['bool'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::NetDevice> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['unsigned short'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Address const&'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::NetDevice::PacketType'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['WifiPhyState'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::WifiMode'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::WifiPreamble'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiPsdu> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::WifiTxVector'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['std::vector<bool', ' std::allocator<bool> > '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['std::unordered_map<unsigned short', ' ns3::Ptr<ns3::WifiPsdu const>', ' std::hash<unsigned short>', ' std::equal_to<unsigned short>', ' std::allocator<std::pair<unsigned short const', ' ns3::Ptr<ns3::WifiPsdu const> > > > '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['std::map<std::pair<unsigned int', ' unsigned int>', ' double', ' std::less<std::pair<unsigned int', ' unsigned int> >', ' std::allocator<std::pair<std::pair<unsigned int', ' unsigned int> const', ' double> > > '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::WifiPhyRxfailureReason'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::MpduInfo'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True, template_parameters=['ns3::SignalNoiseDbm'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::ChangeState(int newState) [member function]
+    cls.add_method('ChangeState', 
+                   'void', 
+                   [param('int', 'newState')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::GetCurrentA() const [member function]
+    cls.add_method('GetCurrentA', 
+                   'double', 
                    [], 
-                   is_static=True, template_parameters=['ns3::HePreambleParameters'], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::GetTotalEnergyConsumption() const [member function]
+    cls.add_method('GetTotalEnergyConsumption', 
+                   'double', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::MobilityModel const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): static ns3::TypeId ns3::DeviceEnergyModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumPhy const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyChanged() [member function]
+    cls.add_method('HandleEnergyChanged', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::SpectrumSignalParameters> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyDepletion() [member function]
+    cls.add_method('HandleEnergyDepletion', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::QueueDiscItem const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyRecharged() [member function]
+    cls.add_method('HandleEnergyRecharged', 
+                   'void', 
                    [], 
-                   is_static=True, template_parameters=['ns3::Ptr<ns3::WifiMacQueueItem const> '], visibility='protected')
-    ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
-    cls.add_method('GetCppTypeid', 
-                   'std::string', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('SetEnergySource', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::DoGetCurrentA() const [member function]
+    cls.add_method('DoGetCurrentA', 
+                   'double', 
                    [], 
-                   is_static=True, template_parameters=['int'], visibility='protected')
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3CallbackValue_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
-    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
+def register_Ns3DoubleValue_methods(root_module, cls):
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
-    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
-    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(double const & value) [constructor]
+    cls.add_constructor([param('double const &', 'value')])
+    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(ns3::DoubleValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DoubleValue const &', 'arg0')])
+    ## double.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::DoubleValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    ## double.h (module 'core'): bool ns3::DoubleValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    ## double.h (module 'core'): double ns3::DoubleValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## double.h (module 'core'): std::string ns3::DoubleValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
+    ## double.h (module 'core'): void ns3::DoubleValue::Set(double const & value) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('ns3::CallbackBase', 'base')])
+                   [param('double const &', 'value')])
     return
 
-def register_Ns3CaraWifiManager_methods(root_module, cls):
-    ## cara-wifi-manager.h (module 'wifi'): ns3::CaraWifiManager::CaraWifiManager(ns3::CaraWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CaraWifiManager const &', 'arg0')])
-    ## cara-wifi-manager.h (module 'wifi'): ns3::CaraWifiManager::CaraWifiManager() [constructor]
+def register_Ns3DsssParameterSet_methods(root_module, cls):
+    ## dsss-parameter-set.h (module 'wifi'): ns3::DsssParameterSet::DsssParameterSet(ns3::DsssParameterSet const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DsssParameterSet const &', 'arg0')])
+    ## dsss-parameter-set.h (module 'wifi'): ns3::DsssParameterSet::DsssParameterSet() [constructor]
     cls.add_constructor([])
-    ## cara-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::CaraWifiManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## dsss-parameter-set.h (module 'wifi'): uint8_t ns3::DsssParameterSet::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## dsss-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::DsssParameterSet::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_static=True)
-    ## cara-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::CaraWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+                   is_const=True, is_virtual=True)
+    ## dsss-parameter-set.h (module 'wifi'): uint8_t ns3::DsssParameterSet::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::CaraWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::CaraWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
+                   is_const=True, is_virtual=True)
+    ## dsss-parameter-set.h (module 'wifi'): uint16_t ns3::DsssParameterSet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): bool ns3::CaraWifiManager::DoNeedRts(ns3::WifiRemoteStation * station, uint32_t size, bool normally) [member function]
-    cls.add_method('DoNeedRts', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
+                   is_const=True, is_virtual=True)
+    ## dsss-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::DsssParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SetCurrentChannel(uint8_t currentChannel) [member function]
+    cls.add_method('SetCurrentChannel', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
+                   [param('uint8_t', 'currentChannel')])
+    ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SetDsssSupported(uint8_t dsssSupported) [member function]
+    cls.add_method('SetDsssSupported', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+                   [param('uint8_t', 'dsssSupported')])
+    return
+
+def register_Ns3DsssPpdu_methods(root_module, cls):
+    ## dsss-ppdu.h (module 'wifi'): ns3::DsssPpdu::DsssPpdu(ns3::DsssPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DsssPpdu const &', 'arg0')])
+    ## dsss-ppdu.h (module 'wifi'): ns3::DsssPpdu::DsssPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('uint64_t', 'uid')])
+    ## dsss-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::DsssPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): ns3::Time ns3::DsssPpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::DsssPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3DsssPpduDsssSigHeader_methods(root_module, cls):
+    ## dsss-ppdu.h (module 'wifi'): ns3::DsssPpdu::DsssSigHeader::DsssSigHeader(ns3::DsssPpdu::DsssSigHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DsssPpdu::DsssSigHeader const &', 'arg0')])
+    ## dsss-ppdu.h (module 'wifi'): ns3::DsssPpdu::DsssSigHeader::DsssSigHeader() [constructor]
+    cls.add_constructor([])
+    ## dsss-ppdu.h (module 'wifi'): uint32_t ns3::DsssPpdu::DsssSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): ns3::TypeId ns3::DsssPpdu::DsssSigHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): uint16_t ns3::DsssPpdu::DsssSigHeader::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## dsss-ppdu.h (module 'wifi'): uint64_t ns3::DsssPpdu::DsssSigHeader::GetRate() const [member function]
+    cls.add_method('GetRate', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## dsss-ppdu.h (module 'wifi'): uint32_t ns3::DsssPpdu::DsssSigHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): static ns3::TypeId ns3::DsssPpdu::DsssSigHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## dsss-ppdu.h (module 'wifi'): void ns3::DsssPpdu::DsssSigHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): void ns3::DsssPpdu::DsssSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-ppdu.h (module 'wifi'): void ns3::DsssPpdu::DsssSigHeader::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## cara-wifi-manager.h (module 'wifi'): void ns3::CaraWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('uint16_t', 'length')])
+    ## dsss-ppdu.h (module 'wifi'): void ns3::DsssPpdu::DsssSigHeader::SetRate(uint64_t rate) [member function]
+    cls.add_method('SetRate', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
+                   [param('uint64_t', 'rate')])
     return
 
-def register_Ns3CfParameterSet_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## cf-parameter-set.h (module 'wifi'): ns3::CfParameterSet::CfParameterSet(ns3::CfParameterSet const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CfParameterSet const &', 'arg0')])
-    ## cf-parameter-set.h (module 'wifi'): ns3::CfParameterSet::CfParameterSet() [constructor]
+def register_Ns3EdcaParameterSet_methods(root_module, cls):
+    ## edca-parameter-set.h (module 'wifi'): ns3::EdcaParameterSet::EdcaParameterSet(ns3::EdcaParameterSet const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EdcaParameterSet const &', 'arg0')])
+    ## edca-parameter-set.h (module 'wifi'): ns3::EdcaParameterSet::EdcaParameterSet() [constructor]
     cls.add_constructor([])
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
     cls.add_method('DeserializeInformationField', 
                    'uint8_t', 
                    [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
                    is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::CfParameterSet::ElementId() const [member function]
+    ## edca-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::EdcaParameterSet::ElementId() const [member function]
     cls.add_method('ElementId', 
                    'ns3::WifiInformationElementId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::GetCFPCount() const [member function]
-    cls.add_method('GetCFPCount', 
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetBeAifsn() const [member function]
+    cls.add_method('GetBeAifsn', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBeCWmax() const [member function]
+    cls.add_method('GetBeCWmax', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBeCWmin() const [member function]
+    cls.add_method('GetBeCWmin', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetBeTxopLimit() const [member function]
+    cls.add_method('GetBeTxopLimit', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetBkAifsn() const [member function]
+    cls.add_method('GetBkAifsn', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint64_t ns3::CfParameterSet::GetCFPDurRemainingUs() const [member function]
-    cls.add_method('GetCFPDurRemainingUs', 
-                   'uint64_t', 
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBkCWmax() const [member function]
+    cls.add_method('GetBkCWmax', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint64_t ns3::CfParameterSet::GetCFPMaxDurationUs() const [member function]
-    cls.add_method('GetCFPMaxDurationUs', 
-                   'uint64_t', 
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBkCWmin() const [member function]
+    cls.add_method('GetBkCWmin', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::GetCFPPeriod() const [member function]
-    cls.add_method('GetCFPPeriod', 
-                   'uint8_t', 
+    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetBkTxopLimit() const [member function]
+    cls.add_method('GetBkTxopLimit', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): uint8_t ns3::CfParameterSet::GetInformationFieldSize() const [member function]
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetInformationFieldSize() const [member function]
     cls.add_method('GetInformationFieldSize', 
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): uint16_t ns3::CfParameterSet::GetSerializedSize() const [member function]
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetQosInfo() const [member function]
+    cls.add_method('GetQosInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::CfParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPCount(uint8_t count) [member function]
-    cls.add_method('SetCFPCount', 
-                   'void', 
-                   [param('uint8_t', 'count')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPDurRemainingUs(uint64_t durRemaining) [member function]
-    cls.add_method('SetCFPDurRemainingUs', 
-                   'void', 
-                   [param('uint64_t', 'durRemaining')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPMaxDurationUs(uint64_t maxDuration) [member function]
-    cls.add_method('SetCFPMaxDurationUs', 
-                   'void', 
-                   [param('uint64_t', 'maxDuration')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetCFPPeriod(uint8_t period) [member function]
-    cls.add_method('SetCFPPeriod', 
-                   'void', 
-                   [param('uint8_t', 'period')])
-    ## cf-parameter-set.h (module 'wifi'): void ns3::CfParameterSet::SetPcfSupported(uint8_t pcfSupported) [member function]
-    cls.add_method('SetPcfSupported', 
-                   'void', 
-                   [param('uint8_t', 'pcfSupported')])
-    return
-
-def register_Ns3Channel_methods(root_module, cls):
-    ## channel.h (module 'network'): ns3::Channel::Channel(ns3::Channel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Channel const &', 'arg0')])
-    ## channel.h (module 'network'): ns3::Channel::Channel() [constructor]
-    cls.add_constructor([])
-    ## channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Channel::GetDevice(std::size_t i) const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [param('std::size_t', 'i')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## channel.h (module 'network'): uint32_t ns3::Channel::GetId() const [member function]
-    cls.add_method('GetId', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## channel.h (module 'network'): std::size_t ns3::Channel::GetNDevices() const [member function]
-    cls.add_method('GetNDevices', 
-                   'std::size_t', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## channel.h (module 'network'): static ns3::TypeId ns3::Channel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    return
-
-def register_Ns3ChannelAccessManager_methods(root_module, cls):
-    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager(ns3::ChannelAccessManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelAccessManager const &', 'arg0')])
-    ## channel-access-manager.h (module 'wifi'): ns3::ChannelAccessManager::ChannelAccessManager() [constructor]
-    cls.add_constructor([])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::Add(ns3::Ptr<ns3::Txop> txop) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
-    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::IsBusy() const [member function]
-    cls.add_method('IsBusy', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## channel-access-manager.h (module 'wifi'): bool ns3::ChannelAccessManager::NeedBackoffUponAccess(ns3::Ptr<ns3::Txop> txop) [member function]
-    cls.add_method('NeedBackoffUponAccess', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Txop >', 'txop')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutResetNow() [member function]
-    cls.add_method('NotifyAckTimeoutResetNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyAckTimeoutStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyAckTimeoutStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutResetNow() [member function]
-    cls.add_method('NotifyCtsTimeoutResetNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyCtsTimeoutStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyCtsTimeoutStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyMaybeCcaBusyStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyMaybeCcaBusyStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavResetNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyNavResetNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyNavStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyNavStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOffNow() [member function]
-    cls.add_method('NotifyOffNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyOnNow() [member function]
-    cls.add_method('NotifyOnNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndErrorNow() [member function]
-    cls.add_method('NotifyRxEndErrorNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxEndOkNow() [member function]
-    cls.add_method('NotifyRxEndOkNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyRxStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyRxStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySleepNow() [member function]
-    cls.add_method('NotifySleepNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifySwitchingStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyTxStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifyTxStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::NotifyWakeupNow() [member function]
-    cls.add_method('NotifyWakeupNow', 
-                   'void', 
-                   [])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RemovePhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('RemovePhyListener', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::RequestAccess(ns3::Ptr<ns3::Txop> txop, bool isCfPeriod=false) [member function]
-    cls.add_method('RequestAccess', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Txop >', 'txop'), param('bool', 'isCfPeriod', default_value='false')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupLow(ns3::Ptr<ns3::MacLow> low) [member function]
-    cls.add_method('SetupLow', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MacLow >', 'low')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::SetupPhyListener(ns3::Ptr<ns3::WifiPhy> phy) [member function]
-    cls.add_method('SetupPhyListener', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
-    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetEifsNoDifs() const [member function]
-    cls.add_method('GetEifsNoDifs', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSifs() const [member function]
-    cls.add_method('GetSifs', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetSlot() const [member function]
-    cls.add_method('GetSlot', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3ChannelCondition_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::ChannelCondition(ns3::ChannelCondition const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ChannelCondition const &', 'arg0')])
-    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::ChannelCondition() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::ChannelCondition(ns3::ChannelCondition::LosConditionValue losCondition, ns3::ChannelCondition::O2iConditionValue o2iCondition=::ns3::ChannelCondition::O2iConditionValue::O2O) [constructor]
-    cls.add_constructor([param('ns3::ChannelCondition::LosConditionValue', 'losCondition'), param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition', default_value='::ns3::ChannelCondition::O2iConditionValue::O2O')])
-    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::LosConditionValue ns3::ChannelCondition::GetLosCondition() const [member function]
-    cls.add_method('GetLosCondition', 
-                   'ns3::ChannelCondition::LosConditionValue', 
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetViAifsn() const [member function]
+    cls.add_method('GetViAifsn', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ChannelCondition::O2iConditionValue ns3::ChannelCondition::GetO2iCondition() const [member function]
-    cls.add_method('GetO2iCondition', 
-                   'ns3::ChannelCondition::O2iConditionValue', 
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetViCWmax() const [member function]
+    cls.add_method('GetViCWmax', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ChannelCondition::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetViCWmin() const [member function]
+    cls.add_method('GetViCWmin', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsEqual(ns3::Ptr<const ns3::ChannelCondition> otherCondition) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::ChannelCondition const >', 'otherCondition')], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsI2i() const [member function]
-    cls.add_method('IsI2i', 
-                   'bool', 
+    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetViTxopLimit() const [member function]
+    cls.add_method('GetViTxopLimit', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsLos() const [member function]
-    cls.add_method('IsLos', 
-                   'bool', 
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetVoAifsn() const [member function]
+    cls.add_method('GetVoAifsn', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsNlos() const [member function]
-    cls.add_method('IsNlos', 
-                   'bool', 
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetVoCWmax() const [member function]
+    cls.add_method('GetVoCWmax', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsNlosv() const [member function]
-    cls.add_method('IsNlosv', 
-                   'bool', 
+    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetVoCWmin() const [member function]
+    cls.add_method('GetVoCWmin', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsO2i() const [member function]
-    cls.add_method('IsO2i', 
-                   'bool', 
+    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetVoTxopLimit() const [member function]
+    cls.add_method('GetVoTxopLimit', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): bool ns3::ChannelCondition::IsO2o() const [member function]
-    cls.add_method('IsO2o', 
-                   'bool', 
+    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::IsQosSupported() const [member function]
+    cls.add_method('IsQosSupported', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## channel-condition-model.h (module 'propagation'): void ns3::ChannelCondition::SetLosCondition(ns3::ChannelCondition::LosConditionValue losCondition) [member function]
-    cls.add_method('SetLosCondition', 
+    ## edca-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::EdcaParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeAci(uint8_t aci) [member function]
+    cls.add_method('SetBeAci', 
+                   'void', 
+                   [param('uint8_t', 'aci')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetBeAifsn', 
                    'void', 
-                   [param('ns3::ChannelCondition::LosConditionValue', 'losCondition')])
-    ## channel-condition-model.h (module 'propagation'): void ns3::ChannelCondition::SetO2iCondition(ns3::ChannelCondition::O2iConditionValue o2iCondition) [member function]
-    cls.add_method('SetO2iCondition', 
+                   [param('uint8_t', 'aifsn')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeCWmax(uint32_t cwMax) [member function]
+    cls.add_method('SetBeCWmax', 
                    'void', 
-                   [param('ns3::ChannelCondition::O2iConditionValue', 'o2iCondition')])
-    return
-
-def register_Ns3ChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ChannelConditionModel::ChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::ChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetChannelCondition', 
-                   'ns3::Ptr< ns3::ChannelCondition >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## channel-condition-model.h (module 'propagation'): int64_t ns3::ChannelConditionModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_pure_virtual=True, is_virtual=True)
+                   [param('uint32_t', 'cwMax')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeCWmin(uint32_t cwMin) [member function]
+    cls.add_method('SetBeCWmin', 
+                   'void', 
+                   [param('uint32_t', 'cwMin')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeTxopLimit(uint16_t txop) [member function]
+    cls.add_method('SetBeTxopLimit', 
+                   'void', 
+                   [param('uint16_t', 'txop')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkAci(uint8_t aci) [member function]
+    cls.add_method('SetBkAci', 
+                   'void', 
+                   [param('uint8_t', 'aci')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetBkAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aifsn')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkCWmax(uint32_t cwMax) [member function]
+    cls.add_method('SetBkCWmax', 
+                   'void', 
+                   [param('uint32_t', 'cwMax')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkCWmin(uint32_t cwMin) [member function]
+    cls.add_method('SetBkCWmin', 
+                   'void', 
+                   [param('uint32_t', 'cwMin')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkTxopLimit(uint16_t txop) [member function]
+    cls.add_method('SetBkTxopLimit', 
+                   'void', 
+                   [param('uint16_t', 'txop')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetQosInfo(uint8_t qosInfo) [member function]
+    cls.add_method('SetQosInfo', 
+                   'void', 
+                   [param('uint8_t', 'qosInfo')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetQosSupported(uint8_t qosSupported) [member function]
+    cls.add_method('SetQosSupported', 
+                   'void', 
+                   [param('uint8_t', 'qosSupported')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViAci(uint8_t aci) [member function]
+    cls.add_method('SetViAci', 
+                   'void', 
+                   [param('uint8_t', 'aci')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetViAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aifsn')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViCWmax(uint32_t cwMax) [member function]
+    cls.add_method('SetViCWmax', 
+                   'void', 
+                   [param('uint32_t', 'cwMax')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViCWmin(uint32_t cwMin) [member function]
+    cls.add_method('SetViCWmin', 
+                   'void', 
+                   [param('uint32_t', 'cwMin')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViTxopLimit(uint16_t txop) [member function]
+    cls.add_method('SetViTxopLimit', 
+                   'void', 
+                   [param('uint16_t', 'txop')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoAci(uint8_t aci) [member function]
+    cls.add_method('SetVoAci', 
+                   'void', 
+                   [param('uint8_t', 'aci')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetVoAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aifsn')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoCWmax(uint32_t cwMax) [member function]
+    cls.add_method('SetVoCWmax', 
+                   'void', 
+                   [param('uint32_t', 'cwMax')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoCWmin(uint32_t cwMin) [member function]
+    cls.add_method('SetVoCWmin', 
+                   'void', 
+                   [param('uint32_t', 'cwMin')])
+    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoTxopLimit(uint16_t txop) [member function]
+    cls.add_method('SetVoTxopLimit', 
+                   'void', 
+                   [param('uint16_t', 'txop')])
     return
 
-def register_Ns3ConstantObssPdAlgorithm_methods(root_module, cls):
-    ## constant-obss-pd-algorithm.h (module 'wifi'): ns3::ConstantObssPdAlgorithm::ConstantObssPdAlgorithm(ns3::ConstantObssPdAlgorithm const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ConstantObssPdAlgorithm const &', 'arg0')])
-    ## constant-obss-pd-algorithm.h (module 'wifi'): ns3::ConstantObssPdAlgorithm::ConstantObssPdAlgorithm() [constructor]
+def register_Ns3EmpiricalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable::EmpiricalRandomVariable() [constructor]
     cls.add_constructor([])
-    ## constant-obss-pd-algorithm.h (module 'wifi'): void ns3::ConstantObssPdAlgorithm::ConnectWifiNetDevice(ns3::Ptr<ns3::WifiNetDevice> const device) [member function]
-    cls.add_method('ConnectWifiNetDevice', 
+    ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::CDF(double v, double c) [member function]
+    cls.add_method('CDF', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')], 
-                   is_virtual=True)
-    ## constant-obss-pd-algorithm.h (module 'wifi'): static ns3::TypeId ns3::ConstantObssPdAlgorithm::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   [param('double', 'v'), param('double', 'c')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::EmpiricalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## constant-obss-pd-algorithm.h (module 'wifi'): void ns3::ConstantObssPdAlgorithm::ReceiveHeSig(ns3::HePreambleParameters params) [member function]
-    cls.add_method('ReceiveHeSig', 
-                   'void', 
-                   [param('ns3::HePreambleParameters', 'params')], 
                    is_virtual=True)
-    return
-
-def register_Ns3ConstantRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ConstantRandomVariable::GetTypeId() [member function]
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::EmpiricalRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable::ConstantRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetConstant() const [member function]
-    cls.add_method('GetConstant', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue(double constant) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'constant')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger(uint32_t constant) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'constant')])
-    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue() [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::GetValue() [member function]
     cls.add_method('GetValue', 
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate() [member function]
+    cls.add_method('Interpolate', 
+                   'double', 
                    [], 
                    is_virtual=True)
+    ## random-variable-stream.h (module 'core'): bool ns3::EmpiricalRandomVariable::SetInterpolate(bool interpolate) [member function]
+    cls.add_method('SetInterpolate', 
+                   'bool', 
+                   [param('bool', 'interpolate')])
     return
 
-def register_Ns3ConstantRateWifiManager_methods(root_module, cls):
-    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::ConstantRateWifiManager::ConstantRateWifiManager(ns3::ConstantRateWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ConstantRateWifiManager const &', 'arg0')])
-    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::ConstantRateWifiManager::ConstantRateWifiManager() [constructor]
+def register_Ns3EmptyAttributeAccessor_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor::EmptyAttributeAccessor(ns3::EmptyAttributeAccessor const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EmptyAttributeAccessor const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor::EmptyAttributeAccessor() [constructor]
     cls.add_constructor([])
-    ## constant-rate-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ConstantRateWifiManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::HasGetter() const [member function]
+    cls.add_method('HasGetter', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ConstantRateWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::HasSetter() const [member function]
+    cls.add_method('HasSetter', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ConstantRateWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ConstantRateWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## constant-rate-wifi-manager.h (module 'wifi'): void ns3::ConstantRateWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Set', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'object'), param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
     return
 
-def register_Ns3ConstantSpeedPropagationDelayModel_methods(root_module, cls):
-    ## propagation-delay-model.h (module 'propagation'): ns3::ConstantSpeedPropagationDelayModel::ConstantSpeedPropagationDelayModel(ns3::ConstantSpeedPropagationDelayModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ConstantSpeedPropagationDelayModel const &', 'arg0')])
-    ## propagation-delay-model.h (module 'propagation'): ns3::ConstantSpeedPropagationDelayModel::ConstantSpeedPropagationDelayModel() [constructor]
+def register_Ns3EmptyAttributeChecker_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::EmptyAttributeChecker::EmptyAttributeChecker(ns3::EmptyAttributeChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EmptyAttributeChecker const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeChecker::EmptyAttributeChecker() [constructor]
     cls.add_constructor([])
-    ## propagation-delay-model.h (module 'propagation'): ns3::Time ns3::ConstantSpeedPropagationDelayModel::GetDelay(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetDelay', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
                    is_const=True, is_virtual=True)
-    ## propagation-delay-model.h (module 'propagation'): double ns3::ConstantSpeedPropagationDelayModel::GetSpeed() const [member function]
-    cls.add_method('GetSpeed', 
-                   'double', 
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True)
-    ## propagation-delay-model.h (module 'propagation'): static ns3::TypeId ns3::ConstantSpeedPropagationDelayModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
                    [], 
-                   is_static=True)
-    ## propagation-delay-model.h (module 'propagation'): void ns3::ConstantSpeedPropagationDelayModel::SetSpeed(double speed) [member function]
-    cls.add_method('SetSpeed', 
-                   'void', 
-                   [param('double', 'speed')])
-    ## propagation-delay-model.h (module 'propagation'): int64_t ns3::ConstantSpeedPropagationDelayModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
     return
 
-def register_Ns3ConstantWifiAckPolicySelector_methods(root_module, cls):
-    ## constant-wifi-ack-policy-selector.h (module 'wifi'): ns3::ConstantWifiAckPolicySelector::ConstantWifiAckPolicySelector(ns3::ConstantWifiAckPolicySelector const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ConstantWifiAckPolicySelector const &', 'arg0')])
-    ## constant-wifi-ack-policy-selector.h (module 'wifi'): ns3::ConstantWifiAckPolicySelector::ConstantWifiAckPolicySelector() [constructor]
+def register_Ns3EmptyAttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue() [constructor]
     cls.add_constructor([])
-    ## constant-wifi-ack-policy-selector.h (module 'wifi'): static ns3::TypeId ns3::ConstantWifiAckPolicySelector::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_static=True)
-    ## constant-wifi-ack-policy-selector.h (module 'wifi'): void ns3::ConstantWifiAckPolicySelector::UpdateTxParams(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::MacLowTransmissionParameters & params) [member function]
-    cls.add_method('UpdateTxParams', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::MacLowTransmissionParameters &', 'params')], 
-                   is_virtual=True)
+                   is_const=True, is_virtual=True, visibility='private')
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True, visibility='private')
+    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3Cost231PropagationLossModel_methods(root_module, cls):
-    ## cost231-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::Cost231PropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## cost231-propagation-loss-model.h (module 'propagation'): ns3::Cost231PropagationLossModel::Cost231PropagationLossModel() [constructor]
+def register_Ns3EnergyHarvester_methods(root_module, cls):
+    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester::EnergyHarvester(ns3::EnergyHarvester const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EnergyHarvester const &', 'arg0')])
+    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester::EnergyHarvester() [constructor]
     cls.add_constructor([])
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetLoss', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True)
-    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetBSAntennaHeight(double height) [member function]
-    cls.add_method('SetBSAntennaHeight', 
-                   'void', 
-                   [param('double', 'height')])
-    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetSSAntennaHeight(double height) [member function]
-    cls.add_method('SetSSAntennaHeight', 
-                   'void', 
-                   [param('double', 'height')])
-    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetLambda(double lambda) [member function]
-    cls.add_method('SetLambda', 
-                   'void', 
-                   [param('double', 'lambda')])
-    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetLambda(double frequency, double speed) [member function]
-    cls.add_method('SetLambda', 
-                   'void', 
-                   [param('double', 'frequency'), param('double', 'speed')])
-    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetMinDistance(double minDistance) [member function]
-    cls.add_method('SetMinDistance', 
-                   'void', 
-                   [param('double', 'minDistance')])
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetBSAntennaHeight() const [member function]
-    cls.add_method('GetBSAntennaHeight', 
-                   'double', 
+    ## energy-harvester.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergyHarvester::GetEnergySource() const [member function]
+    cls.add_method('GetEnergySource', 
+                   'ns3::Ptr< ns3::EnergySource >', 
                    [], 
                    is_const=True)
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetSSAntennaHeight() const [member function]
-    cls.add_method('GetSSAntennaHeight', 
-                   'double', 
+    ## energy-harvester.h (module 'energy'): ns3::Ptr<ns3::Node> ns3::EnergyHarvester::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
                    [], 
                    is_const=True)
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetMinDistance() const [member function]
-    cls.add_method('GetMinDistance', 
+    ## energy-harvester.h (module 'energy'): double ns3::EnergyHarvester::GetPower() const [member function]
+    cls.add_method('GetPower', 
                    'double', 
                    [], 
                    is_const=True)
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetLambda() const [member function]
-    cls.add_method('GetLambda', 
-                   'double', 
+    ## energy-harvester.h (module 'energy'): static ns3::TypeId ns3::EnergyHarvester::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::GetShadowing() [member function]
-    cls.add_method('GetShadowing', 
-                   'double', 
-                   [])
-    ## cost231-propagation-loss-model.h (module 'propagation'): void ns3::Cost231PropagationLossModel::SetShadowing(double shadowing) [member function]
-    cls.add_method('SetShadowing', 
+                   is_static=True)
+    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('SetEnergySource', 
                    'void', 
-                   [param('double', 'shadowing')])
-    ## cost231-propagation-loss-model.h (module 'propagation'): double ns3::Cost231PropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')])
+    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## energy-harvester.h (module 'energy'): double ns3::EnergyHarvester::DoGetPower() const [member function]
+    cls.add_method('DoGetPower', 
                    'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   [], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## cost231-propagation-loss-model.h (module 'propagation'): int64_t ns3::Cost231PropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3CtrlBAckRequestHeader_methods(root_module, cls):
-    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader(ns3::CtrlBAckRequestHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CtrlBAckRequestHeader const &', 'arg0')])
-    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader() [constructor]
+def register_Ns3EnergySource_methods(root_module, cls):
+    ## energy-source.h (module 'energy'): ns3::EnergySource::EnergySource(ns3::EnergySource const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EnergySource const &', 'arg0')])
+    ## energy-source.h (module 'energy'): ns3::EnergySource::EnergySource() [constructor]
     cls.add_constructor([])
-    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckRequestHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::AppendDeviceEnergyModel(ns3::Ptr<ns3::DeviceEnergyModel> deviceEnergyModelPtr) [member function]
+    cls.add_method('AppendDeviceEnergyModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::DeviceEnergyModel >', 'deviceEnergyModelPtr')])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::ConnectEnergyHarvester(ns3::Ptr<ns3::EnergyHarvester> energyHarvesterPtr) [member function]
+    cls.add_method('ConnectEnergyHarvester', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergyHarvester >', 'energyHarvesterPtr')])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::DisposeDeviceModels() [member function]
+    cls.add_method('DisposeDeviceModels', 
+                   'void', 
+                   [])
+    ## energy-source.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::EnergySource::FindDeviceEnergyModels(ns3::TypeId tid) [member function]
+    cls.add_method('FindDeviceEnergyModels', 
+                   'ns3::DeviceEnergyModelContainer', 
+                   [param('ns3::TypeId', 'tid')])
+    ## energy-source.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::EnergySource::FindDeviceEnergyModels(std::string name) [member function]
+    cls.add_method('FindDeviceEnergyModels', 
+                   'ns3::DeviceEnergyModelContainer', 
+                   [param('std::string', 'name')])
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetEnergyFraction() [member function]
+    cls.add_method('GetEnergyFraction', 
+                   'double', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequence() const [member function]
-    cls.add_method('GetStartingSequence', 
-                   'uint16_t', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetInitialEnergy() const [member function]
+    cls.add_method('GetInitialEnergy', 
+                   'double', 
                    [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequenceControl() const [member function]
-    cls.add_method('GetStartingSequenceControl', 
-                   'uint16_t', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): ns3::Ptr<ns3::Node> ns3::EnergySource::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
                    [], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckRequestHeader::GetTidInfo() const [member function]
-    cls.add_method('GetTidInfo', 
-                   'uint8_t', 
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetRemainingEnergy() [member function]
+    cls.add_method('GetRemainingEnergy', 
+                   'double', 
                    [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType ns3::CtrlBAckRequestHeader::GetType() const [member function]
-    cls.add_method('GetType', 
-                   'ns3::BlockAckType', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetSupplyVoltage() const [member function]
+    cls.add_method('GetSupplyVoltage', 
+                   'double', 
                    [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckRequestHeader::GetTypeId() [member function]
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): static ns3::TypeId ns3::EnergySource::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsBasic() const [member function]
-    cls.add_method('IsBasic', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsCompressed() const [member function]
-    cls.add_method('IsCompressed', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsExtendedCompressed() const [member function]
-    cls.add_method('IsExtendedCompressed', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsMultiTid() const [member function]
-    cls.add_method('IsMultiTid', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::MustSendHtImmediateAck() const [member function]
-    cls.add_method('MustSendHtImmediateAck', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::InitializeDeviceModels() [member function]
+    cls.add_method('InitializeDeviceModels', 
                    'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
+                   [])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetHtImmediateAck(bool immediateAck) [member function]
-    cls.add_method('SetHtImmediateAck', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::UpdateEnergySource() [member function]
+    cls.add_method('UpdateEnergySource', 
                    'void', 
-                   [param('bool', 'immediateAck')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetStartingSequence(uint16_t seq) [member function]
-    cls.add_method('SetStartingSequence', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::BreakDeviceEnergyModelRefCycle() [member function]
+    cls.add_method('BreakDeviceEnergyModelRefCycle', 
                    'void', 
-                   [param('uint16_t', 'seq')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetTidInfo(uint8_t tid) [member function]
-    cls.add_method('SetTidInfo', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): double ns3::EnergySource::CalculateTotalCurrent() [member function]
+    cls.add_method('CalculateTotalCurrent', 
+                   'double', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyChanged() [member function]
+    cls.add_method('NotifyEnergyChanged', 
                    'void', 
-                   [param('uint8_t', 'tid')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetType(ns3::BlockAckType type) [member function]
-    cls.add_method('SetType', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyDrained() [member function]
+    cls.add_method('NotifyEnergyDrained', 
                    'void', 
-                   [param('ns3::BlockAckType', 'type')])
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyRecharged() [member function]
+    cls.add_method('NotifyEnergyRecharged', 
+                   'void', 
+                   [], 
+                   visibility='protected')
+    ## energy-source.h (module 'energy'): void ns3::EnergySource::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3CtrlBAckResponseHeader_methods(root_module, cls):
-    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader(ns3::CtrlBAckResponseHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CtrlBAckResponseHeader const &', 'arg0')])
-    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader() [constructor]
+def register_Ns3EnergySourceContainer_methods(root_module, cls):
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::EnergySourceContainer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EnergySourceContainer const &', 'arg0')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer() [constructor]
     cls.add_constructor([])
-    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): uint16_t const * ns3::CtrlBAckResponseHeader::GetBitmap() const [member function]
-    cls.add_method('GetBitmap', 
-                   'uint16_t const *', 
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::Ptr<ns3::EnergySource> source) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::EnergySource >', 'source')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(std::string sourceName) [constructor]
+    cls.add_constructor([param('std::string', 'sourceName')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::EnergySourceContainer const & a, ns3::EnergySourceContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::EnergySourceContainer const &', 'a'), param('ns3::EnergySourceContainer const &', 'b')])
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(ns3::EnergySourceContainer container) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::EnergySourceContainer', 'container')])
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(ns3::Ptr<ns3::EnergySource> source) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::EnergySource >', 'source')])
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(std::string sourceName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'sourceName')])
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::Iterator ns3::EnergySourceContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'ns3::EnergySourceContainer::Iterator', 
                    [], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): uint64_t ns3::CtrlBAckResponseHeader::GetCompressedBitmap() const [member function]
-    cls.add_method('GetCompressedBitmap', 
-                   'uint64_t', 
+    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::Iterator ns3::EnergySourceContainer::End() const [member function]
+    cls.add_method('End', 
+                   'ns3::EnergySourceContainer::Iterator', 
                    [], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): uint64_t const * ns3::CtrlBAckResponseHeader::GetExtendedCompressedBitmap() const [member function]
-    cls.add_method('GetExtendedCompressedBitmap', 
-                   'uint64_t const *', 
-                   [], 
+    ## energy-source-container.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergySourceContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::EnergySource >', 
+                   [param('uint32_t', 'i')], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckResponseHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
+    ## energy-source-container.h (module 'energy'): uint32_t ns3::EnergySourceContainer::GetN() const [member function]
+    cls.add_method('GetN', 
                    'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequence() const [member function]
-    cls.add_method('GetStartingSequence', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequenceControl() const [member function]
-    cls.add_method('GetStartingSequenceControl', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckResponseHeader::GetTidInfo() const [member function]
-    cls.add_method('GetTidInfo', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType ns3::CtrlBAckResponseHeader::GetType() const [member function]
-    cls.add_method('GetType', 
-                   'ns3::BlockAckType', 
-                   [], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckResponseHeader::GetTypeId() [member function]
+    ## energy-source-container.h (module 'energy'): static ns3::TypeId ns3::EnergySourceContainer::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsBasic() const [member function]
-    cls.add_method('IsBasic', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsCompressed() const [member function]
-    cls.add_method('IsCompressed', 
-                   'bool', 
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsExtendedCompressed() const [member function]
-    cls.add_method('IsExtendedCompressed', 
-                   'bool', 
+                   is_virtual=True, visibility='private')
+    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsFragmentReceived(uint16_t seq, uint8_t frag) const [member function]
-    cls.add_method('IsFragmentReceived', 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3EnumChecker_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker(ns3::EnumChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EnumChecker const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker() [constructor]
+    cls.add_constructor([])
+    ## enum.h (module 'core'): void ns3::EnumChecker::Add(int value, std::string name) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('int', 'value'), param('std::string', 'name')])
+    ## enum.h (module 'core'): void ns3::EnumChecker::AddDefault(int value, std::string name) [member function]
+    cls.add_method('AddDefault', 
+                   'void', 
+                   [param('int', 'value'), param('std::string', 'name')])
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
                    'bool', 
-                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsMultiTid() const [member function]
-    cls.add_method('IsMultiTid', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): bool ns3::EnumChecker::Copy(ns3::AttributeValue const & src, ns3::AttributeValue & dst) const [member function]
+    cls.add_method('Copy', 
                    'bool', 
+                   [param('ns3::AttributeValue const &', 'src'), param('ns3::AttributeValue &', 'dst')], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetName(int value) const [member function]
+    cls.add_method('GetName', 
+                   'std::string', 
+                   [param('int', 'value')], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsPacketReceived(uint16_t seq) const [member function]
-    cls.add_method('IsPacketReceived', 
-                   'bool', 
-                   [param('uint16_t', 'seq')], 
-                   is_const=True)
-    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::MustSendHtImmediateAck() const [member function]
-    cls.add_method('MustSendHtImmediateAck', 
-                   'bool', 
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## enum.h (module 'core'): int ns3::EnumChecker::GetValue(std::string const name) const [member function]
+    cls.add_method('GetValue', 
+                   'int', 
+                   [param('std::string const', 'name')], 
                    is_const=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
+    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::ResetBitmap() [member function]
-    cls.add_method('ResetBitmap', 
-                   'void', 
-                   [])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+    ## enum.h (module 'core'): bool ns3::EnumChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immediateAck) [member function]
-    cls.add_method('SetHtImmediateAck', 
-                   'void', 
-                   [param('bool', 'immediateAck')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedFragment(uint16_t seq, uint8_t frag) [member function]
-    cls.add_method('SetReceivedFragment', 
-                   'void', 
-                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedPacket(uint16_t seq) [member function]
-    cls.add_method('SetReceivedPacket', 
-                   'void', 
-                   [param('uint16_t', 'seq')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequence(uint16_t seq) [member function]
-    cls.add_method('SetStartingSequence', 
-                   'void', 
-                   [param('uint16_t', 'seq')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequenceControl(uint16_t seqControl) [member function]
-    cls.add_method('SetStartingSequenceControl', 
-                   'void', 
-                   [param('uint16_t', 'seqControl')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetTidInfo(uint8_t tid) [member function]
-    cls.add_method('SetTidInfo', 
-                   'void', 
-                   [param('uint8_t', 'tid')])
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetType(ns3::BlockAckType type) [member function]
-    cls.add_method('SetType', 
-                   'void', 
-                   [param('ns3::BlockAckType', 'type')])
-    return
-
-def register_Ns3DataRateChecker_methods(root_module, cls):
-    ## data-rate.h (module 'network'): ns3::DataRateChecker::DataRateChecker() [constructor]
-    cls.add_constructor([])
-    ## data-rate.h (module 'network'): ns3::DataRateChecker::DataRateChecker(ns3::DataRateChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DataRateChecker const &', 'arg0')])
     return
 
-def register_Ns3DataRateValue_methods(root_module, cls):
-    ## data-rate.h (module 'network'): ns3::DataRateValue::DataRateValue() [constructor]
+def register_Ns3EnumValue_methods(root_module, cls):
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(ns3::EnumValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EnumValue const &', 'arg0')])
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue() [constructor]
     cls.add_constructor([])
-    ## data-rate.h (module 'network'): ns3::DataRateValue::DataRateValue(ns3::DataRate const & value) [constructor]
-    cls.add_constructor([param('ns3::DataRate const &', 'value')])
-    ## data-rate.h (module 'network'): ns3::DataRateValue::DataRateValue(ns3::DataRateValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DataRateValue const &', 'arg0')])
-    ## data-rate.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::DataRateValue::Copy() const [member function]
+    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(int value) [constructor]
+    cls.add_constructor([param('int', 'value')])
+    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## data-rate.h (module 'network'): bool ns3::DataRateValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    ## enum.h (module 'core'): bool ns3::EnumValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## data-rate.h (module 'network'): ns3::DataRate ns3::DataRateValue::Get() const [member function]
+    ## enum.h (module 'core'): int ns3::EnumValue::Get() const [member function]
     cls.add_method('Get', 
-                   'ns3::DataRate', 
+                   'int', 
                    [], 
                    is_const=True)
-    ## data-rate.h (module 'network'): std::string ns3::DataRateValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    ## enum.h (module 'core'): std::string ns3::EnumValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## data-rate.h (module 'network'): void ns3::DataRateValue::Set(ns3::DataRate const & value) [member function]
+    ## enum.h (module 'core'): void ns3::EnumValue::Set(int value) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('ns3::DataRate const &', 'value')])
+                   [param('int', 'value')])
     return
 
-def register_Ns3DeterministicRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::DeterministicRandomVariable::GetTypeId() [member function]
+def register_Ns3ErlangRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ErlangRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable::DeterministicRandomVariable() [constructor]
+    ## random-variable-stream.h (module 'core'): ns3::ErlangRandomVariable::ErlangRandomVariable() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): void ns3::DeterministicRandomVariable::SetValueArray(double * values, std::size_t length) [member function]
-    cls.add_method('SetValueArray', 
-                   'void', 
-                   [param('double *', 'values'), param('std::size_t', 'length')])
-    ## random-variable-stream.h (module 'core'): double ns3::DeterministicRandomVariable::GetValue() [member function]
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetK() const [member function]
+    cls.add_method('GetK', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetLambda() const [member function]
+    cls.add_method('GetLambda', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue(uint32_t k, double lambda) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('uint32_t', 'k'), param('double', 'lambda')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger(uint32_t k, uint32_t lambda) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'k'), param('uint32_t', 'lambda')])
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue() [member function]
     cls.add_method('GetValue', 
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::DeterministicRandomVariable::GetInteger() [member function]
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger() [member function]
     cls.add_method('GetInteger', 
                    'uint32_t', 
                    [], 
                    is_virtual=True)
     return
 
-def register_Ns3DeviceEnergyModel_methods(root_module, cls):
-    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel::DeviceEnergyModel(ns3::DeviceEnergyModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DeviceEnergyModel const &', 'arg0')])
-    ## device-energy-model.h (module 'energy'): ns3::DeviceEnergyModel::DeviceEnergyModel() [constructor]
+def register_Ns3ErpInformation_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## erp-information.h (module 'wifi'): ns3::ErpInformation::ErpInformation(ns3::ErpInformation const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ErpInformation const &', 'arg0')])
+    ## erp-information.h (module 'wifi'): ns3::ErpInformation::ErpInformation() [constructor]
     cls.add_constructor([])
-    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::ChangeState(int newState) [member function]
-    cls.add_method('ChangeState', 
-                   'void', 
-                   [param('int', 'newState')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::GetCurrentA() const [member function]
-    cls.add_method('GetCurrentA', 
-                   'double', 
+    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## erp-information.h (module 'wifi'): ns3::WifiInformationElementId ns3::ErpInformation::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetBarkerPreambleMode() const [member function]
+    cls.add_method('GetBarkerPreambleMode', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::GetTotalEnergyConsumption() const [member function]
-    cls.add_method('GetTotalEnergyConsumption', 
-                   'double', 
+    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## device-energy-model.h (module 'energy'): static ns3::TypeId ns3::DeviceEnergyModel::GetTypeId() [member function]
+                   is_const=True, is_virtual=True)
+    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetNonErpPresent() const [member function]
+    cls.add_method('GetNonErpPresent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## erp-information.h (module 'wifi'): uint16_t ns3::ErpInformation::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetUseProtection() const [member function]
+    cls.add_method('GetUseProtection', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## erp-information.h (module 'wifi'): ns3::Buffer::Iterator ns3::ErpInformation::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetBarkerPreambleMode(uint8_t barkerPreambleMode) [member function]
+    cls.add_method('SetBarkerPreambleMode', 
+                   'void', 
+                   [param('uint8_t', 'barkerPreambleMode')])
+    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetErpSupported(uint8_t erpSupported) [member function]
+    cls.add_method('SetErpSupported', 
+                   'void', 
+                   [param('uint8_t', 'erpSupported')])
+    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetNonErpPresent(uint8_t nonErpPresent) [member function]
+    cls.add_method('SetNonErpPresent', 
+                   'void', 
+                   [param('uint8_t', 'nonErpPresent')])
+    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetUseProtection(uint8_t useProtection) [member function]
+    cls.add_method('SetUseProtection', 
+                   'void', 
+                   [param('uint8_t', 'useProtection')])
+    return
+
+def register_Ns3ErrorModel_methods(root_module, cls):
+    ## error-model.h (module 'network'): ns3::ErrorModel::ErrorModel(ns3::ErrorModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ErrorModel const &', 'arg0')])
+    ## error-model.h (module 'network'): ns3::ErrorModel::ErrorModel() [constructor]
+    cls.add_constructor([])
+    ## error-model.h (module 'network'): void ns3::ErrorModel::Disable() [member function]
+    cls.add_method('Disable', 
+                   'void', 
+                   [])
+    ## error-model.h (module 'network'): void ns3::ErrorModel::Enable() [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [])
+    ## error-model.h (module 'network'): static ns3::TypeId ns3::ErrorModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyChanged() [member function]
-    cls.add_method('HandleEnergyChanged', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyDepletion() [member function]
-    cls.add_method('HandleEnergyDepletion', 
-                   'void', 
+    ## error-model.h (module 'network'): bool ns3::ErrorModel::IsCorrupt(ns3::Ptr<ns3::Packet> pkt) [member function]
+    cls.add_method('IsCorrupt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'pkt')])
+    ## error-model.h (module 'network'): bool ns3::ErrorModel::IsEnabled() const [member function]
+    cls.add_method('IsEnabled', 
+                   'bool', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::HandleEnergyRecharged() [member function]
-    cls.add_method('HandleEnergyRecharged', 
+                   is_const=True)
+    ## error-model.h (module 'network'): void ns3::ErrorModel::Reset() [member function]
+    cls.add_method('Reset', 
                    'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## device-energy-model.h (module 'energy'): void ns3::DeviceEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
-    cls.add_method('SetEnergySource', 
+                   [])
+    ## error-model.h (module 'network'): bool ns3::ErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorrupt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## error-model.h (module 'network'): void ns3::ErrorModel::DoReset() [member function]
+    cls.add_method('DoReset', 
                    'void', 
-                   [param('ns3::Ptr< ns3::EnergySource >', 'source')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## device-energy-model.h (module 'energy'): double ns3::DeviceEnergyModel::DoGetCurrentA() const [member function]
-    cls.add_method('DoGetCurrentA', 
-                   'double', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3DoubleValue_methods(root_module, cls):
-    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue() [constructor]
+def register_Ns3ErrorRateModel_methods(root_module, cls):
+    ## error-rate-model.h (module 'wifi'): ns3::ErrorRateModel::ErrorRateModel() [constructor]
     cls.add_constructor([])
-    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(double const & value) [constructor]
-    cls.add_constructor([param('double const &', 'value')])
-    ## double.h (module 'core'): ns3::DoubleValue::DoubleValue(ns3::DoubleValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DoubleValue const &', 'arg0')])
-    ## double.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::DoubleValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## error-rate-model.h (module 'wifi'): ns3::ErrorRateModel::ErrorRateModel(ns3::ErrorRateModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ErrorRateModel const &', 'arg0')])
+    ## error-rate-model.h (module 'wifi'): int64_t ns3::ErrorRateModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::CalculateSnr(ns3::WifiTxVector const & txVector, double ber) const [member function]
+    cls.add_method('CalculateSnr', 
+                   'double', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('double', 'ber')], 
+                   is_const=True)
+    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector const & txVector, double snr, uint64_t nbits, uint8_t numRxAntennas=1, ns3::WifiPpduField field=::ns3::WifiPpduField::WIFI_PPDU_FIELD_DATA, uint16_t staId=65535) const [member function]
+    cls.add_method('GetChunkSuccessRate', 
+                   'double', 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits'), param('uint8_t', 'numRxAntennas', default_value='1'), param('ns3::WifiPpduField', 'field', default_value='::ns3::WifiPpduField::WIFI_PPDU_FIELD_DATA'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::ErrorRateModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## double.h (module 'core'): bool ns3::DoubleValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+                   is_static=True)
+    ## error-rate-model.h (module 'wifi'): bool ns3::ErrorRateModel::IsAwgn() const [member function]
+    cls.add_method('IsAwgn', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## double.h (module 'core'): double ns3::DoubleValue::Get() const [member function]
-    cls.add_method('Get', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector const & txVector, double snr, uint64_t nbits, uint8_t numRxAntennas, ns3::WifiPpduField field, uint16_t staId) const [member function]
+    cls.add_method('DoGetChunkSuccessRate', 
+                   'double', 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits'), param('uint8_t', 'numRxAntennas'), param('ns3::WifiPpduField', 'field'), param('uint16_t', 'staId')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3Event_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Event const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Event const &', 'arg0')])
+    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand', 'rxPower')])
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetDuration() const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetEndTime() const [member function]
+    cls.add_method('GetEndTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::Ptr<const ns3::WifiPpdu> ns3::Event::GetPpdu() const [member function]
+    cls.add_method('GetPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu const >', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): double ns3::Event::GetRxPowerW() const [member function]
+    cls.add_method('GetRxPowerW', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): double ns3::Event::GetRxPowerW(ns3::WifiSpectrumBand band) const [member function]
+    cls.add_method('GetRxPowerW', 
                    'double', 
+                   [param('std::pair< unsigned int, unsigned int >', 'band')], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::RxPowerWattPerChannelBand ns3::Event::GetRxPowerWPerBand() const [member function]
+    cls.add_method('GetRxPowerWPerBand', 
+                   'ns3::RxPowerWattPerChannelBand', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetStartTime() const [member function]
+    cls.add_method('GetStartTime', 
+                   'ns3::Time', 
                    [], 
                    is_const=True)
-    ## double.h (module 'core'): std::string ns3::DoubleValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## double.h (module 'core'): void ns3::DoubleValue::Set(double const & value) [member function]
-    cls.add_method('Set', 
+    ## interference-helper.h (module 'wifi'): ns3::WifiTxVector const & ns3::Event::GetTxVector() const [member function]
+    cls.add_method('GetTxVector', 
+                   'ns3::WifiTxVector const &', 
+                   [], 
+                   is_const=True)
+    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateRxPowerW', 
                    'void', 
-                   [param('double const &', 'value')])
+                   [param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
     return
 
-def register_Ns3DsssParameterSet_methods(root_module, cls):
-    ## dsss-parameter-set.h (module 'wifi'): ns3::DsssParameterSet::DsssParameterSet(ns3::DsssParameterSet const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DsssParameterSet const &', 'arg0')])
-    ## dsss-parameter-set.h (module 'wifi'): ns3::DsssParameterSet::DsssParameterSet() [constructor]
+def register_Ns3EventImpl_methods(root_module, cls):
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [constructor]
+    cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl() [constructor]
     cls.add_constructor([])
-    ## dsss-parameter-set.h (module 'wifi'): uint8_t ns3::DsssParameterSet::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## dsss-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::DsssParameterSet::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## dsss-parameter-set.h (module 'wifi'): uint8_t ns3::DsssParameterSet::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## dsss-parameter-set.h (module 'wifi'): uint16_t ns3::DsssParameterSet::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## dsss-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::DsssParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
+    cls.add_method('Cancel', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SetCurrentChannel(uint8_t currentChannel) [member function]
-    cls.add_method('SetCurrentChannel', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
+    cls.add_method('Invoke', 
                    'void', 
-                   [param('uint8_t', 'currentChannel')])
-    ## dsss-parameter-set.h (module 'wifi'): void ns3::DsssParameterSet::SetDsssSupported(uint8_t dsssSupported) [member function]
-    cls.add_method('SetDsssSupported', 
+                   [])
+    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
+    cls.add_method('IsCancelled', 
+                   'bool', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
+    cls.add_method('Notify', 
                    'void', 
-                   [param('uint8_t', 'dsssSupported')])
+                   [], 
+                   is_pure_virtual=True, is_virtual=True, visibility='protected')
     return
 
-def register_Ns3DsssSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader::DsssSigHeader(ns3::DsssSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DsssSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::DsssSigHeader::DsssSigHeader() [constructor]
-    cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::DsssSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::DsssSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
+def register_Ns3ExponentialRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ExponentialRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::DsssSigHeader::GetLength() const [member function]
-    cls.add_method('GetLength', 
-                   'uint16_t', 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable::ExponentialRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint64_t ns3::DsssSigHeader::GetRate() const [member function]
-    cls.add_method('GetRate', 
-                   'uint64_t', 
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::DsssSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue(double mean, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger(uint32_t mean, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
                    'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::DsssSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::SetLength(uint16_t length) [member function]
-    cls.add_method('SetLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::DsssSigHeader::SetRate(uint64_t rate) [member function]
-    cls.add_method('SetRate', 
-                   'void', 
-                   [param('uint64_t', 'rate')])
+                   is_virtual=True)
     return
 
-def register_Ns3EdcaParameterSet_methods(root_module, cls):
-    ## edca-parameter-set.h (module 'wifi'): ns3::EdcaParameterSet::EdcaParameterSet(ns3::EdcaParameterSet const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EdcaParameterSet const &', 'arg0')])
-    ## edca-parameter-set.h (module 'wifi'): ns3::EdcaParameterSet::EdcaParameterSet() [constructor]
+def register_Ns3ExtendedCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## extended-capabilities.h (module 'wifi'): ns3::ExtendedCapabilities::ExtendedCapabilities(ns3::ExtendedCapabilities const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ExtendedCapabilities const &', 'arg0')])
+    ## extended-capabilities.h (module 'wifi'): ns3::ExtendedCapabilities::ExtendedCapabilities() [constructor]
     cls.add_constructor([])
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
     cls.add_method('DeserializeInformationField', 
                    'uint8_t', 
                    [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
                    is_virtual=True)
-    ## edca-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::EdcaParameterSet::ElementId() const [member function]
+    ## extended-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::ExtendedCapabilities::ElementId() const [member function]
     cls.add_method('ElementId', 
                    'ns3::WifiInformationElementId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetBeAifsn() const [member function]
-    cls.add_method('GetBeAifsn', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte1() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte1', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBeCWmax() const [member function]
-    cls.add_method('GetBeCWmax', 
-                   'uint32_t', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte2() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte2', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBeCWmin() const [member function]
-    cls.add_method('GetBeCWmin', 
-                   'uint32_t', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte3() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte3', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetBeTxopLimit() const [member function]
-    cls.add_method('GetBeTxopLimit', 
-                   'uint16_t', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte4() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte4', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetBkAifsn() const [member function]
-    cls.add_method('GetBkAifsn', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte5() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte5', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBkCWmax() const [member function]
-    cls.add_method('GetBkCWmax', 
-                   'uint32_t', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte6() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte6', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetBkCWmin() const [member function]
-    cls.add_method('GetBkCWmin', 
-                   'uint32_t', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte7() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte7', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetBkTxopLimit() const [member function]
-    cls.add_method('GetBkTxopLimit', 
-                   'uint16_t', 
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte8() const [member function]
+    cls.add_method('GetExtendedCapabilitiesByte8', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetInformationFieldSize() const [member function]
+    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetInformationFieldSize() const [member function]
     cls.add_method('GetInformationFieldSize', 
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetQosInfo() const [member function]
-    cls.add_method('GetQosInfo', 
+    ## extended-capabilities.h (module 'wifi'): uint16_t ns3::ExtendedCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## extended-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte1(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte1', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte2(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte2', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte3(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte3', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte4(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte4', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte5(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte5', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte6(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte6', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte7(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte7', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte8(uint8_t ctrl) [member function]
+    cls.add_method('SetExtendedCapabilitiesByte8', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetHtSupported(uint8_t htSupported) [member function]
+    cls.add_method('SetHtSupported', 
+                   'void', 
+                   [param('uint8_t', 'htSupported')])
+    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetVhtSupported(uint8_t vhtSupported) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('uint8_t', 'vhtSupported')])
+    return
+
+def register_Ns3ExtendedSupportedRatesIE_methods(root_module, cls):
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE(ns3::ExtendedSupportedRatesIE const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ExtendedSupportedRatesIE const &', 'arg0')])
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE() [constructor]
+    cls.add_constructor([])
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE(ns3::SupportedRates * rates) [constructor]
+    cls.add_constructor([param('ns3::SupportedRates *', 'rates')])
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::ExtendedSupportedRatesIE::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## supported-rates.h (module 'wifi'): ns3::WifiInformationElementId ns3::ExtendedSupportedRatesIE::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::ExtendedSupportedRatesIE::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
                    'uint8_t', 
                    [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetSerializedSize() const [member function]
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint16_t ns3::ExtendedSupportedRatesIE::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetViAifsn() const [member function]
-    cls.add_method('GetViAifsn', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetViCWmax() const [member function]
-    cls.add_method('GetViCWmax', 
-                   'uint32_t', 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedSupportedRatesIE::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): void ns3::ExtendedSupportedRatesIE::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): void ns3::ExtendedSupportedRatesIE::SetSupportedRates(ns3::SupportedRates * rates) [member function]
+    cls.add_method('SetSupportedRates', 
+                   'void', 
+                   [param('ns3::SupportedRates *', 'rates')])
+    return
+
+def register_Ns3FixedRssLossModel_methods(root_module, cls):
+    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::FixedRssLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetViCWmin() const [member function]
-    cls.add_method('GetViCWmin', 
-                   'uint32_t', 
+                   is_static=True)
+    ## propagation-loss-model.h (module 'propagation'): ns3::FixedRssLossModel::FixedRssLossModel() [constructor]
+    cls.add_constructor([])
+    ## propagation-loss-model.h (module 'propagation'): void ns3::FixedRssLossModel::SetRss(double rss) [member function]
+    cls.add_method('SetRss', 
+                   'void', 
+                   [param('double', 'rss')])
+    ## propagation-loss-model.h (module 'propagation'): double ns3::FixedRssLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::FixedRssLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3FrameCaptureModel_methods(root_module, cls):
+    ## frame-capture-model.h (module 'wifi'): ns3::FrameCaptureModel::FrameCaptureModel() [constructor]
+    cls.add_constructor([])
+    ## frame-capture-model.h (module 'wifi'): ns3::FrameCaptureModel::FrameCaptureModel(ns3::FrameCaptureModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::FrameCaptureModel const &', 'arg0')])
+    ## frame-capture-model.h (module 'wifi'): bool ns3::FrameCaptureModel::CaptureNewFrame(ns3::Ptr<ns3::Event> currentEvent, ns3::Ptr<ns3::Event> newEvent) const [member function]
+    cls.add_method('CaptureNewFrame', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Event >', 'currentEvent'), param('ns3::Ptr< ns3::Event >', 'newEvent')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## frame-capture-model.h (module 'wifi'): static ns3::TypeId ns3::FrameCaptureModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetViTxopLimit() const [member function]
-    cls.add_method('GetViTxopLimit', 
-                   'uint16_t', 
+                   is_static=True)
+    ## frame-capture-model.h (module 'wifi'): bool ns3::FrameCaptureModel::IsInCaptureWindow(ns3::Time timePreambleDetected) const [member function]
+    cls.add_method('IsInCaptureWindow', 
+                   'bool', 
+                   [param('ns3::Time', 'timePreambleDetected')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3FrameExchangeManager_methods(root_module, cls):
+    ## frame-exchange-manager.h (module 'wifi'): ns3::FrameExchangeManager::FrameExchangeManager(ns3::FrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::FrameExchangeManager const &', 'arg0')])
+    ## frame-exchange-manager.h (module 'wifi'): ns3::FrameExchangeManager::FrameExchangeManager() [constructor]
+    cls.add_constructor([])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::CalculateAcknowledgmentTime(ns3::WifiAcknowledgment * acknowledgment) const [member function]
+    cls.add_method('CalculateAcknowledgmentTime', 
+                   'void', 
+                   [param('ns3::WifiAcknowledgment *', 'acknowledgment')], 
+                   is_const=True, is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::CalculateProtectionTime(ns3::WifiProtection * protection) const [member function]
+    cls.add_method('CalculateProtectionTime', 
+                   'void', 
+                   [param('ns3::WifiProtection *', 'protection')], 
+                   is_const=True, is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiAckManager> ns3::FrameExchangeManager::GetAckManager() const [member function]
+    cls.add_method('GetAckManager', 
+                   'ns3::Ptr< ns3::WifiAckManager >', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::GetVoAifsn() const [member function]
-    cls.add_method('GetVoAifsn', 
-                   'uint8_t', 
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiProtectionManager> ns3::FrameExchangeManager::GetProtectionManager() const [member function]
+    cls.add_method('GetProtectionManager', 
+                   'ns3::Ptr< ns3::WifiProtectionManager >', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetVoCWmax() const [member function]
-    cls.add_method('GetVoCWmax', 
-                   'uint32_t', 
+    ## frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::FrameExchangeManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint32_t ns3::EdcaParameterSet::GetVoCWmin() const [member function]
-    cls.add_method('GetVoCWmin', 
-                   'uint32_t', 
+                   is_static=True)
+    ## frame-exchange-manager.h (module 'wifi'): ns3::WifiTxTimer const & ns3::FrameExchangeManager::GetWifiTxTimer() const [member function]
+    cls.add_method('GetWifiTxTimer', 
+                   'ns3::WifiTxTimer const &', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint16_t ns3::EdcaParameterSet::GetVoTxopLimit() const [member function]
-    cls.add_method('GetVoTxopLimit', 
-                   'uint16_t', 
+    ## frame-exchange-manager.h (module 'wifi'): bool ns3::FrameExchangeManager::IsPromisc() const [member function]
+    cls.add_method('IsPromisc', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): uint8_t ns3::EdcaParameterSet::IsQosSupported() const [member function]
-    cls.add_method('IsQosSupported', 
-                   'uint8_t', 
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyOffNow() [member function]
+    cls.add_method('NotifyOffNow', 
+                   'void', 
+                   [])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifySleepNow() [member function]
+    cls.add_method('NotifySleepNow', 
+                   'void', 
+                   [])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifySwitchingStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Receive(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool> > perMpduStatus) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector', 'txVector'), param('std::vector< bool >', 'perMpduStatus')])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ResetPhy() [member function]
+    cls.add_method('ResetPhy', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::EdcaParameterSet::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetAckManager(ns3::Ptr<ns3::WifiAckManager> ackManager) [member function]
+    cls.add_method('SetAckManager', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeAci(uint8_t aci) [member function]
-    cls.add_method('SetBeAci', 
+                   [param('ns3::Ptr< ns3::WifiAckManager >', 'ackManager')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetAckedMpduCallback(ns3::FrameExchangeManager::AckedMpdu callback) [member function]
+    cls.add_method('SetAckedMpduCallback', 
                    'void', 
-                   [param('uint8_t', 'aci')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetBeAifsn', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
                    'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeCWmax(uint32_t cwMax) [member function]
-    cls.add_method('SetBeCWmax', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
                    'void', 
-                   [param('uint32_t', 'cwMax')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeCWmin(uint32_t cwMin) [member function]
-    cls.add_method('SetBeCWmin', 
+                   [param('ns3::Mac48Address', 'bssid')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> const channelAccessManager) [member function]
+    cls.add_method('SetChannelAccessManager', 
                    'void', 
-                   [param('uint32_t', 'cwMin')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBeTxopLimit(uint16_t txop) [member function]
-    cls.add_method('SetBeTxopLimit', 
+                   [param('ns3::Ptr< ns3::ChannelAccessManager > const', 'channelAccessManager')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetDroppedMpduCallback(ns3::FrameExchangeManager::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
                    'void', 
-                   [param('uint16_t', 'txop')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkAci(uint8_t aci) [member function]
-    cls.add_method('SetBkAci', 
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetMacRxMiddle(ns3::Ptr<ns3::MacRxMiddle> const rxMiddle) [member function]
+    cls.add_method('SetMacRxMiddle', 
                    'void', 
-                   [param('uint8_t', 'aci')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetBkAifsn', 
+                   [param('ns3::Ptr< ns3::MacRxMiddle > const', 'rxMiddle')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetMacTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
+    cls.add_method('SetMacTxMiddle', 
                    'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkCWmax(uint32_t cwMax) [member function]
-    cls.add_method('SetBkCWmax', 
+                   [param('ns3::Ptr< ns3::MacTxMiddle > const', 'txMiddle')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
                    'void', 
-                   [param('uint32_t', 'cwMax')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkCWmin(uint32_t cwMin) [member function]
-    cls.add_method('SetBkCWmin', 
+                   [])
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetProtectionManager(ns3::Ptr<ns3::WifiProtectionManager> protectionManager) [member function]
+    cls.add_method('SetProtectionManager', 
                    'void', 
-                   [param('uint32_t', 'cwMin')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetBkTxopLimit(uint16_t txop) [member function]
-    cls.add_method('SetBkTxopLimit', 
+                   [param('ns3::Ptr< ns3::WifiProtectionManager >', 'protectionManager')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('uint16_t', 'txop')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetQosInfo(uint8_t qosInfo) [member function]
-    cls.add_method('SetQosInfo', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetWifiPhy', 
                    'void', 
-                   [param('uint8_t', 'qosInfo')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetQosSupported(uint8_t qosSupported) [member function]
-    cls.add_method('SetQosSupported', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): bool ns3::FrameExchangeManager::StartTransmission(ns3::Ptr<ns3::Txop> dcf) [member function]
+    cls.add_method('StartTransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'dcf')], 
+                   is_virtual=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::CtsTimeout(ns3::Ptr<ns3::WifiMacQueueItem> rts, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('CtsTimeout', 
                    'void', 
-                   [param('uint8_t', 'qosSupported')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViAci(uint8_t aci) [member function]
-    cls.add_method('SetViAci', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'rts'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DequeueMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DequeueMpdu', 
                    'void', 
-                   [param('uint8_t', 'aci')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetViAifsn', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoSendCtsAfterRts(ns3::WifiMacHeader const & rtsHdr, ns3::WifiTxVector & ctsTxVector, double rtsSnr) [member function]
+    cls.add_method('DoSendCtsAfterRts', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'rtsHdr'), param('ns3::WifiTxVector &', 'ctsTxVector'), param('double', 'rtsSnr')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    cls.add_method('EndReceiveAmpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ForwardMpduDown(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector & txVector) [member function]
+    cls.add_method('ForwardMpduDown', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetCtsToSelfDurationId(ns3::WifiTxVector const & ctsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetCtsToSelfDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'ctsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::FrameExchangeManager::GetFirstFragmentIfNeeded(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('GetFirstFragmentIfNeeded', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetFrameDurationId(ns3::WifiMacHeader const & header, uint32_t size, ns3::WifiTxParameters const & txParams, ns3::Ptr<ns3::Packet> fragmentedPacket) const [member function]
+    cls.add_method('GetFrameDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Ptr< ns3::Packet >', 'fragmentedPacket')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::FrameExchangeManager::GetNextFragment() [member function]
+    cls.add_method('GetNextFragment', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetRtsDurationId(ns3::WifiTxVector const & rtsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetRtsDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'rtsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::FrameExchangeManager::GetTxDuration(uint32_t ppduPayloadSize, ns3::Mac48Address receiver, ns3::WifiTxParameters const & txParams) const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'ppduPayloadSize'), param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NavResetTimeout() [member function]
+    cls.add_method('NavResetTimeout', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NormalAckTimeout(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('NormalAckTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyPacketDiscarded(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyPacketDiscarded', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyReceivedNormalAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyReceivedNormalAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::PreProcessFrame(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('PreProcessFrame', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ReceiveMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector const & txVector, bool inAmpdu) [member function]
+    cls.add_method('ReceiveMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::ReceivedNormalAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector, ns3::WifiTxVector const & ackTxVector, ns3::RxSignalInfo const & rxInfo, double snr) [member function]
+    cls.add_method('ReceivedNormalAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiTxVector const &', 'ackTxVector'), param('ns3::RxSignalInfo const &', 'rxInfo'), param('double', 'snr')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::RetransmitMpduAfterMissedCts(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedCts', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendCtsAfterRts(ns3::WifiMacHeader const & rtsHdr, ns3::WifiMode rtsTxMode, double rtsSnr) [member function]
+    cls.add_method('SendCtsAfterRts', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'rtsHdr'), param('ns3::WifiMode', 'rtsTxMode'), param('double', 'rtsSnr')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendCtsToSelf(ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('SendCtsToSelf', 
                    'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViCWmax(uint32_t cwMax) [member function]
-    cls.add_method('SetViCWmax', 
+                   [param('ns3::WifiTxParameters const &', 'txParams')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendMpduWithProtection(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams) [member function]
+    cls.add_method('SendMpduWithProtection', 
                    'void', 
-                   [param('uint32_t', 'cwMax')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViCWmin(uint32_t cwMin) [member function]
-    cls.add_method('SetViCWmin', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendNormalAck(ns3::WifiMacHeader const & hdr, ns3::WifiTxVector const & dataTxVector, double dataSnr) [member function]
+    cls.add_method('SendNormalAck', 
                    'void', 
-                   [param('uint32_t', 'cwMin')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetViTxopLimit(uint16_t txop) [member function]
-    cls.add_method('SetViTxopLimit', 
+                   [param('ns3::WifiMacHeader const &', 'hdr'), param('ns3::WifiTxVector const &', 'dataTxVector'), param('double', 'dataSnr')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::SendRts(ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('SendRts', 
                    'void', 
-                   [param('uint16_t', 'txop')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoAci(uint8_t aci) [member function]
-    cls.add_method('SetVoAci', 
+                   [param('ns3::WifiTxParameters const &', 'txParams')], 
+                   visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::TransmissionFailed() [member function]
+    cls.add_method('TransmissionFailed', 
                    'void', 
-                   [param('uint8_t', 'aci')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoAifsn(uint8_t aifsn) [member function]
-    cls.add_method('SetVoAifsn', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::TransmissionSucceeded() [member function]
+    cls.add_method('TransmissionSucceeded', 
                    'void', 
-                   [param('uint8_t', 'aifsn')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoCWmax(uint32_t cwMax) [member function]
-    cls.add_method('SetVoCWmax', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::UpdateNav(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('UpdateNav', 
                    'void', 
-                   [param('uint32_t', 'cwMax')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoCWmin(uint32_t cwMin) [member function]
-    cls.add_method('SetVoCWmin', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::UpdateTxDuration(ns3::Mac48Address receiver, ns3::WifiTxParameters & txParams) const [member function]
+    cls.add_method('UpdateTxDuration', 
                    'void', 
-                   [param('uint32_t', 'cwMin')])
-    ## edca-parameter-set.h (module 'wifi'): void ns3::EdcaParameterSet::SetVoTxopLimit(uint16_t txop) [member function]
-    cls.add_method('SetVoTxopLimit', 
+                   [param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters &', 'txParams')], 
+                   is_const=True, visibility='protected')
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::Reset() [member function]
+    cls.add_method('Reset', 
                    'void', 
-                   [param('uint16_t', 'txop')])
+                   [], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3EmpiricalRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable::EmpiricalRandomVariable() [constructor]
+def register_Ns3FriisPropagationLossModel_methods(root_module, cls):
+    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::FriisPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## propagation-loss-model.h (module 'propagation'): ns3::FriisPropagationLossModel::FriisPropagationLossModel() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::CDF(double v, double c) [member function]
-    cls.add_method('CDF', 
+    ## propagation-loss-model.h (module 'propagation'): void ns3::FriisPropagationLossModel::SetFrequency(double frequency) [member function]
+    cls.add_method('SetFrequency', 
                    'void', 
-                   [param('double', 'v'), param('double', 'c')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::EmpiricalRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   [param('double', 'frequency')])
+    ## propagation-loss-model.h (module 'propagation'): void ns3::FriisPropagationLossModel::SetSystemLoss(double systemLoss) [member function]
+    cls.add_method('SetSystemLoss', 
+                   'void', 
+                   [param('double', 'systemLoss')])
+    ## propagation-loss-model.h (module 'propagation'): void ns3::FriisPropagationLossModel::SetMinLoss(double minLoss) [member function]
+    cls.add_method('SetMinLoss', 
+                   'void', 
+                   [param('double', 'minLoss')])
+    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::GetMinLoss() const [member function]
+    cls.add_method('GetMinLoss', 
+                   'double', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::EmpiricalRandomVariable::GetTypeId() [member function]
+                   is_const=True)
+    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::GetSystemLoss() const [member function]
+    cls.add_method('GetSystemLoss', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::FriisPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3GammaRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::GammaRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::GetValue() [member function]
+    ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable::GammaRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetBeta() const [member function]
+    cls.add_method('GetBeta', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue(double alpha, double beta) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha'), param('double', 'beta')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger(uint32_t alpha, uint32_t beta) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'alpha'), param('uint32_t', 'beta')])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue() [member function]
     cls.add_method('GetValue', 
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate() [member function]
-    cls.add_method('Interpolate', 
-                   'double', 
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): bool ns3::EmpiricalRandomVariable::SetInterpolate(bool interpolate) [member function]
-    cls.add_method('SetInterpolate', 
-                   'bool', 
-                   [param('bool', 'interpolate')])
     return
 
-def register_Ns3EmptyAttributeAccessor_methods(root_module, cls):
-    ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor::EmptyAttributeAccessor(ns3::EmptyAttributeAccessor const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EmptyAttributeAccessor const &', 'arg0')])
-    ## attribute.h (module 'core'): ns3::EmptyAttributeAccessor::EmptyAttributeAccessor() [constructor]
+def register_Ns3HeCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities::HeCapabilities(ns3::HeCapabilities const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeCapabilities const &', 'arg0')])
+    ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities::HeCapabilities() [constructor]
     cls.add_constructor([])
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
-    cls.add_method('Get', 
-                   'bool', 
-                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
-                   is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::HasGetter() const [member function]
-    cls.add_method('HasGetter', 
-                   'bool', 
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## he-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::HasSetter() const [member function]
-    cls.add_method('HasSetter', 
-                   'bool', 
+    ## he-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeCapabilities::ElementIdExt() const [member function]
+    cls.add_method('ElementIdExt', 
+                   'ns3::WifiInformationElementId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
-    cls.add_method('Set', 
-                   'bool', 
-                   [param('ns3::ObjectBase *', 'object'), param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_virtual=True)
-    return
-
-def register_Ns3EmptyAttributeChecker_methods(root_module, cls):
-    ## attribute.h (module 'core'): ns3::EmptyAttributeChecker::EmptyAttributeChecker(ns3::EmptyAttributeChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EmptyAttributeChecker const &', 'arg0')])
-    ## attribute.h (module 'core'): ns3::EmptyAttributeChecker::EmptyAttributeChecker() [constructor]
-    cls.add_constructor([])
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
-    cls.add_method('Check', 
-                   'bool', 
-                   [param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
-    cls.add_method('Copy', 
-                   'bool', 
-                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
-                   is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeChecker::Create() const [member function]
-    cls.add_method('Create', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetChannelWidthSet() const [member function]
+    cls.add_method('GetChannelWidthSet', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeChecker::GetUnderlyingTypeInformation() const [member function]
-    cls.add_method('GetUnderlyingTypeInformation', 
-                   'std::string', 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeLtfAndGiForHePpdus() const [member function]
+    cls.add_method('GetHeLtfAndGiForHePpdus', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeChecker::GetValueTypeName() const [member function]
-    cls.add_method('GetValueTypeName', 
-                   'std::string', 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo1() const [member function]
+    cls.add_method('GetHeMacCapabilitiesInfo1', 
+                   'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeChecker::HasUnderlyingTypeInformation() const [member function]
-    cls.add_method('HasUnderlyingTypeInformation', 
-                   'bool', 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
+    cls.add_method('GetHeMacCapabilitiesInfo2', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint64_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo1() const [member function]
+    cls.add_method('GetHePhyCapabilitiesInfo1', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
+    cls.add_method('GetHePhyCapabilitiesInfo2', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestMcsSupported() const [member function]
+    cls.add_method('GetHighestMcsSupported', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestNssSupported() const [member function]
+    cls.add_method('GetHighestNssSupported', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    return
-
-def register_Ns3EmptyAttributeValue_methods(root_module, cls):
-    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
-    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue() [constructor]
-    cls.add_constructor([])
-    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetLdpcCodingInPayload() const [member function]
+    cls.add_method('GetLdpcCodingInPayload', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## attribute.h (module 'core'): bool ns3::EmptyAttributeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+                   is_const=True, is_virtual=True)
+    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSupportedMcsAndNss() const [member function]
+    cls.add_method('GetSupportedMcsAndNss', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedRxMcs', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True, visibility='private')
-    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True, visibility='private')
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedTxMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## he-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::HeCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetChannelWidthSet(uint8_t channelWidthSet) [member function]
+    cls.add_method('SetChannelWidthSet', 
+                   'void', 
+                   [param('uint8_t', 'channelWidthSet')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeLtfAndGiForHePpdus(uint8_t heLtfAndGiForHePpdus) [member function]
+    cls.add_method('SetHeLtfAndGiForHePpdus', 
+                   'void', 
+                   [param('uint8_t', 'heLtfAndGiForHePpdus')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint8_t ctrl2) [member function]
+    cls.add_method('SetHeMacCapabilitiesInfo', 
+                   'void', 
+                   [param('uint32_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint8_t ctrl2) [member function]
+    cls.add_method('SetHePhyCapabilitiesInfo', 
+                   'void', 
+                   [param('uint64_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSupported(uint8_t heSupported) [member function]
+    cls.add_method('SetHeSupported', 
+                   'void', 
+                   [param('uint8_t', 'heSupported')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHighestMcsSupported(uint8_t mcs) [member function]
+    cls.add_method('SetHighestMcsSupported', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHighestNssSupported(uint8_t nss) [member function]
+    cls.add_method('SetHighestNssSupported', 
+                   'void', 
+                   [param('uint8_t', 'nss')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetLdpcCodingInPayload(uint8_t ldpcCodingInPayload) [member function]
+    cls.add_method('SetLdpcCodingInPayload', 
+                   'void', 
+                   [param('uint8_t', 'ldpcCodingInPayload')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetMaxAmpduLength(uint32_t maxAmpduLength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
+                   'void', 
+                   [param('uint32_t', 'maxAmpduLength')])
+    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetSupportedMcsAndNss(uint16_t ctrl) [member function]
+    cls.add_method('SetSupportedMcsAndNss', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
     return
 
-def register_Ns3EnergyHarvester_methods(root_module, cls):
-    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester::EnergyHarvester(ns3::EnergyHarvester const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EnergyHarvester const &', 'arg0')])
-    ## energy-harvester.h (module 'energy'): ns3::EnergyHarvester::EnergyHarvester() [constructor]
+def register_Ns3HeConfiguration_methods(root_module, cls):
+    ## he-configuration.h (module 'wifi'): ns3::HeConfiguration::HeConfiguration(ns3::HeConfiguration const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeConfiguration const &', 'arg0')])
+    ## he-configuration.h (module 'wifi'): ns3::HeConfiguration::HeConfiguration() [constructor]
     cls.add_constructor([])
-    ## energy-harvester.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergyHarvester::GetEnergySource() const [member function]
-    cls.add_method('GetEnergySource', 
-                   'ns3::Ptr< ns3::EnergySource >', 
+    ## he-configuration.h (module 'wifi'): uint8_t ns3::HeConfiguration::GetBssColor() const [member function]
+    cls.add_method('GetBssColor', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## energy-harvester.h (module 'energy'): ns3::Ptr<ns3::Node> ns3::EnergyHarvester::GetNode() const [member function]
-    cls.add_method('GetNode', 
-                   'ns3::Ptr< ns3::Node >', 
+    ## he-configuration.h (module 'wifi'): ns3::Time ns3::HeConfiguration::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'ns3::Time', 
                    [], 
                    is_const=True)
-    ## energy-harvester.h (module 'energy'): double ns3::EnergyHarvester::GetPower() const [member function]
-    cls.add_method('GetPower', 
-                   'double', 
+    ## he-configuration.h (module 'wifi'): uint16_t ns3::HeConfiguration::GetMpduBufferSize() const [member function]
+    cls.add_method('GetMpduBufferSize', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## energy-harvester.h (module 'energy'): static ns3::TypeId ns3::EnergyHarvester::GetTypeId() [member function]
+    ## he-configuration.h (module 'wifi'): static ns3::TypeId ns3::HeConfiguration::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::SetEnergySource(ns3::Ptr<ns3::EnergySource> source) [member function]
-    cls.add_method('SetEnergySource', 
+    ## he-configuration.h (module 'wifi'): void ns3::HeConfiguration::SetBssColor(uint8_t bssColor) [member function]
+    cls.add_method('SetBssColor', 
                    'void', 
-                   [param('ns3::Ptr< ns3::EnergySource >', 'source')])
-    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::SetNode(ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('SetNode', 
+                   [param('uint8_t', 'bssColor')])
+    ## he-configuration.h (module 'wifi'): void ns3::HeConfiguration::SetGuardInterval(ns3::Time guardInterval) [member function]
+    cls.add_method('SetGuardInterval', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## energy-harvester.h (module 'energy'): void ns3::EnergyHarvester::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Time', 'guardInterval')])
+    ## he-configuration.h (module 'wifi'): void ns3::HeConfiguration::SetMpduBufferSize(uint16_t size) [member function]
+    cls.add_method('SetMpduBufferSize', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## energy-harvester.h (module 'energy'): double ns3::EnergyHarvester::DoGetPower() const [member function]
-    cls.add_method('DoGetPower', 
-                   'double', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
+                   [param('uint16_t', 'size')])
     return
 
-def register_Ns3EnergySource_methods(root_module, cls):
-    ## energy-source.h (module 'energy'): ns3::EnergySource::EnergySource(ns3::EnergySource const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EnergySource const &', 'arg0')])
-    ## energy-source.h (module 'energy'): ns3::EnergySource::EnergySource() [constructor]
+def register_Ns3HeOperation_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## he-operation.h (module 'wifi'): ns3::HeOperation::HeOperation(ns3::HeOperation const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeOperation const &', 'arg0')])
+    ## he-operation.h (module 'wifi'): ns3::HeOperation::HeOperation() [constructor]
     cls.add_constructor([])
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::AppendDeviceEnergyModel(ns3::Ptr<ns3::DeviceEnergyModel> deviceEnergyModelPtr) [member function]
-    cls.add_method('AppendDeviceEnergyModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::DeviceEnergyModel >', 'deviceEnergyModelPtr')])
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::ConnectEnergyHarvester(ns3::Ptr<ns3::EnergyHarvester> energyHarvesterPtr) [member function]
-    cls.add_method('ConnectEnergyHarvester', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::EnergyHarvester >', 'energyHarvesterPtr')])
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::DisposeDeviceModels() [member function]
-    cls.add_method('DisposeDeviceModels', 
-                   'void', 
-                   [])
-    ## energy-source.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::EnergySource::FindDeviceEnergyModels(ns3::TypeId tid) [member function]
-    cls.add_method('FindDeviceEnergyModels', 
-                   'ns3::DeviceEnergyModelContainer', 
-                   [param('ns3::TypeId', 'tid')])
-    ## energy-source.h (module 'energy'): ns3::DeviceEnergyModelContainer ns3::EnergySource::FindDeviceEnergyModels(std::string name) [member function]
-    cls.add_method('FindDeviceEnergyModels', 
-                   'ns3::DeviceEnergyModelContainer', 
-                   [param('std::string', 'name')])
-    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetEnergyFraction() [member function]
-    cls.add_method('GetEnergyFraction', 
-                   'double', 
+    ## he-operation.h (module 'wifi'): uint8_t ns3::HeOperation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## he-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeOperation::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetInitialEnergy() const [member function]
-    cls.add_method('GetInitialEnergy', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## he-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeOperation::ElementIdExt() const [member function]
+    cls.add_method('ElementIdExt', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## energy-source.h (module 'energy'): ns3::Ptr<ns3::Node> ns3::EnergySource::GetNode() const [member function]
-    cls.add_method('GetNode', 
-                   'ns3::Ptr< ns3::Node >', 
+                   is_const=True, is_virtual=True)
+    ## he-operation.h (module 'wifi'): uint16_t ns3::HeOperation::GetBasicHeMcsAndNssSet() const [member function]
+    cls.add_method('GetBasicHeMcsAndNssSet', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetRemainingEnergy() [member function]
-    cls.add_method('GetRemainingEnergy', 
-                   'double', 
+    ## he-operation.h (module 'wifi'): uint8_t ns3::HeOperation::GetBssColor() const [member function]
+    cls.add_method('GetBssColor', 
+                   'uint8_t', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## energy-source.h (module 'energy'): double ns3::EnergySource::GetSupplyVoltage() const [member function]
-    cls.add_method('GetSupplyVoltage', 
-                   'double', 
+                   is_const=True)
+    ## he-operation.h (module 'wifi'): uint32_t ns3::HeOperation::GetHeOperationParameters() const [member function]
+    cls.add_method('GetHeOperationParameters', 
+                   'uint32_t', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## energy-source.h (module 'energy'): static ns3::TypeId ns3::EnergySource::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_const=True)
+    ## he-operation.h (module 'wifi'): uint8_t ns3::HeOperation::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::InitializeDeviceModels() [member function]
-    cls.add_method('InitializeDeviceModels', 
-                   'void', 
-                   [])
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::SetNode(ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('SetNode', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::UpdateEnergySource() [member function]
-    cls.add_method('UpdateEnergySource', 
-                   'void', 
+                   is_const=True, is_virtual=True)
+    ## he-operation.h (module 'wifi'): uint16_t ns3::HeOperation::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::BreakDeviceEnergyModelRefCycle() [member function]
-    cls.add_method('BreakDeviceEnergyModelRefCycle', 
+                   is_const=True, is_virtual=True)
+    ## he-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::HeOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
                    'void', 
-                   [], 
-                   visibility='protected')
-    ## energy-source.h (module 'energy'): double ns3::EnergySource::CalculateTotalCurrent() [member function]
-    cls.add_method('CalculateTotalCurrent', 
-                   'double', 
-                   [], 
-                   visibility='protected')
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyChanged() [member function]
-    cls.add_method('NotifyEnergyChanged', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetBssColor(uint8_t bssColor) [member function]
+    cls.add_method('SetBssColor', 
                    'void', 
-                   [], 
-                   visibility='protected')
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyDrained() [member function]
-    cls.add_method('NotifyEnergyDrained', 
+                   [param('uint8_t', 'bssColor')])
+    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetHeOperationParameters(uint32_t ctrl) [member function]
+    cls.add_method('SetHeOperationParameters', 
                    'void', 
-                   [], 
-                   visibility='protected')
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::NotifyEnergyRecharged() [member function]
-    cls.add_method('NotifyEnergyRecharged', 
+                   [param('uint32_t', 'ctrl')])
+    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetHeSupported(uint8_t heSupported) [member function]
+    cls.add_method('SetHeSupported', 
                    'void', 
-                   [], 
-                   visibility='protected')
-    ## energy-source.h (module 'energy'): void ns3::EnergySource::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('uint8_t', 'heSupported')])
+    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetMaxHeMcsPerNss(uint8_t nss, uint8_t maxHeMcs) [member function]
+    cls.add_method('SetMaxHeMcsPerNss', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
+                   [param('uint8_t', 'nss'), param('uint8_t', 'maxHeMcs')])
     return
 
-def register_Ns3EnergySourceContainer_methods(root_module, cls):
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::EnergySourceContainer const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EnergySourceContainer const &', 'arg0')])
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer() [constructor]
+def register_Ns3HtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities(ns3::HtCapabilities const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtCapabilities const &', 'arg0')])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities() [constructor]
     cls.add_constructor([])
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::Ptr<ns3::EnergySource> source) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::EnergySource >', 'source')])
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(std::string sourceName) [constructor]
-    cls.add_constructor([param('std::string', 'sourceName')])
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::EnergySourceContainer(ns3::EnergySourceContainer const & a, ns3::EnergySourceContainer const & b) [constructor]
-    cls.add_constructor([param('ns3::EnergySourceContainer const &', 'a'), param('ns3::EnergySourceContainer const &', 'b')])
-    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(ns3::EnergySourceContainer container) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::EnergySourceContainer', 'container')])
-    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(ns3::Ptr<ns3::EnergySource> source) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::EnergySource >', 'source')])
-    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::Add(std::string sourceName) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('std::string', 'sourceName')])
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::Iterator ns3::EnergySourceContainer::Begin() const [member function]
-    cls.add_method('Begin', 
-                   'ns3::EnergySourceContainer::Iterator', 
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAmpduParameters() const [member function]
+    cls.add_method('GetAmpduParameters', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## energy-source-container.h (module 'energy'): ns3::EnergySourceContainer::Iterator ns3::EnergySourceContainer::End() const [member function]
-    cls.add_method('End', 
-                   'ns3::EnergySourceContainer::Iterator', 
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAntennaSelectionCapabilities() const [member function]
+    cls.add_method('GetAntennaSelectionCapabilities', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## energy-source-container.h (module 'energy'): ns3::Ptr<ns3::EnergySource> ns3::EnergySourceContainer::Get(uint32_t i) const [member function]
-    cls.add_method('Get', 
-                   'ns3::Ptr< ns3::EnergySource >', 
-                   [param('uint32_t', 'i')], 
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetExtendedHtCapabilities() const [member function]
+    cls.add_method('GetExtendedHtCapabilities', 
+                   'uint16_t', 
+                   [], 
                    is_const=True)
-    ## energy-source-container.h (module 'energy'): uint32_t ns3::EnergySourceContainer::GetN() const [member function]
-    cls.add_method('GetN', 
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetHtCapabilitiesInfo() const [member function]
+    cls.add_method('GetHtCapabilitiesInfo', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## energy-source-container.h (module 'energy'): static ns3::TypeId ns3::EnergySourceContainer::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetMaxAmsduLength() const [member function]
+    cls.add_method('GetMaxAmsduLength', 
+                   'uint16_t', 
                    [], 
-                   is_static=True)
-    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetRxHighestSupportedAntennas() const [member function]
+    cls.add_method('GetRxHighestSupportedAntennas', 
+                   'uint8_t', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## energy-source-container.h (module 'energy'): void ns3::EnergySourceContainer::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3EnumChecker_methods(root_module, cls):
-    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker(ns3::EnumChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EnumChecker const &', 'arg0')])
-    ## enum.h (module 'core'): ns3::EnumChecker::EnumChecker() [constructor]
-    cls.add_constructor([])
-    ## enum.h (module 'core'): void ns3::EnumChecker::Add(int value, std::string name) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('int', 'value'), param('std::string', 'name')])
-    ## enum.h (module 'core'): void ns3::EnumChecker::AddDefault(int value, std::string name) [member function]
-    cls.add_method('AddDefault', 
-                   'void', 
-                   [param('int', 'value'), param('std::string', 'name')])
-    ## enum.h (module 'core'): bool ns3::EnumChecker::Check(ns3::AttributeValue const & value) const [member function]
-    cls.add_method('Check', 
-                   'bool', 
-                   [param('ns3::AttributeValue const &', 'value')], 
-                   is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): bool ns3::EnumChecker::Copy(ns3::AttributeValue const & src, ns3::AttributeValue & dst) const [member function]
-    cls.add_method('Copy', 
-                   'bool', 
-                   [param('ns3::AttributeValue const &', 'src'), param('ns3::AttributeValue &', 'dst')], 
                    is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumChecker::Create() const [member function]
-    cls.add_method('Create', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval20() const [member function]
+    cls.add_method('GetShortGuardInterval20', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetName(int value) const [member function]
-    cls.add_method('GetName', 
-                   'std::string', 
-                   [param('int', 'value')], 
                    is_const=True)
-    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetUnderlyingTypeInformation() const [member function]
-    cls.add_method('GetUnderlyingTypeInformation', 
-                   'std::string', 
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
+    cls.add_method('GetSupportedChannelWidth', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): int ns3::EnumChecker::GetValue(std::string const name) const [member function]
-    cls.add_method('GetValue', 
-                   'int', 
-                   [param('std::string const', 'name')], 
                    is_const=True)
-    ## enum.h (module 'core'): std::string ns3::EnumChecker::GetValueTypeName() const [member function]
-    cls.add_method('GetValueTypeName', 
-                   'std::string', 
+    ## ht-capabilities.h (module 'wifi'): uint64_t ns3::HtCapabilities::GetSupportedMcsSet1() const [member function]
+    cls.add_method('GetSupportedMcsSet1', 
+                   'uint64_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): bool ns3::EnumChecker::HasUnderlyingTypeInformation() const [member function]
-    cls.add_method('HasUnderlyingTypeInformation', 
-                   'bool', 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint64_t ns3::HtCapabilities::GetSupportedMcsSet2() const [member function]
+    cls.add_method('GetSupportedMcsSet2', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetTxBfCapabilities() const [member function]
+    cls.add_method('GetTxBfCapabilities', 
+                   'uint32_t', 
                    [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::HtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAmpduParameters(uint8_t ctrl) [member function]
+    cls.add_method('SetAmpduParameters', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAntennaSelectionCapabilities(uint8_t ctrl) [member function]
+    cls.add_method('SetAntennaSelectionCapabilities', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetExtendedHtCapabilities(uint16_t ctrl) [member function]
+    cls.add_method('SetExtendedHtCapabilities', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtCapabilitiesInfo(uint16_t ctrl) [member function]
+    cls.add_method('SetHtCapabilitiesInfo', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtSupported(uint8_t htSupported) [member function]
+    cls.add_method('SetHtSupported', 
+                   'void', 
+                   [param('uint8_t', 'htSupported')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLSigProtectionSupport(uint8_t lSigProtection) [member function]
+    cls.add_method('SetLSigProtectionSupport', 
+                   'void', 
+                   [param('uint8_t', 'lSigProtection')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
+    cls.add_method('SetLdpc', 
+                   'void', 
+                   [param('uint8_t', 'ldpc')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmpduLength(uint32_t maxAmpduLength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
+                   'void', 
+                   [param('uint32_t', 'maxAmpduLength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmsduLength(uint16_t maxAmsduLength) [member function]
+    cls.add_method('SetMaxAmsduLength', 
+                   'void', 
+                   [param('uint16_t', 'maxAmsduLength')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxHighestSupportedDataRate(uint16_t maxSupportedRate) [member function]
+    cls.add_method('SetRxHighestSupportedDataRate', 
+                   'void', 
+                   [param('uint16_t', 'maxSupportedRate')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
+    cls.add_method('SetRxMcsBitmask', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval20(uint8_t shortGuardInterval) [member function]
+    cls.add_method('SetShortGuardInterval20', 
+                   'void', 
+                   [param('uint8_t', 'shortGuardInterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval40(uint8_t shortGuardInterval) [member function]
+    cls.add_method('SetShortGuardInterval40', 
+                   'void', 
+                   [param('uint8_t', 'shortGuardInterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedChannelWidth) [member function]
+    cls.add_method('SetSupportedChannelWidth', 
+                   'void', 
+                   [param('uint8_t', 'supportedChannelWidth')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedMcsSet(uint64_t ctrl1, uint64_t ctrl2) [member function]
+    cls.add_method('SetSupportedMcsSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxBfCapabilities(uint32_t ctrl) [member function]
+    cls.add_method('SetTxBfCapabilities', 
+                   'void', 
+                   [param('uint32_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams) [member function]
+    cls.add_method('SetTxMaxNSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'maxTxSpatialStreams')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMcsSetDefined(uint8_t txMcsSetDefined) [member function]
+    cls.add_method('SetTxMcsSetDefined', 
+                   'void', 
+                   [param('uint8_t', 'txMcsSetDefined')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal) [member function]
+    cls.add_method('SetTxRxMcsSetUnequal', 
+                   'void', 
+                   [param('uint8_t', 'txRxMcsSetUnequal')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxUnequalModulation(uint8_t txUnequalModulation) [member function]
+    cls.add_method('SetTxUnequalModulation', 
+                   'void', 
+                   [param('uint8_t', 'txUnequalModulation')])
     return
 
-def register_Ns3EnumValue_methods(root_module, cls):
-    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(ns3::EnumValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EnumValue const &', 'arg0')])
-    ## enum.h (module 'core'): ns3::EnumValue::EnumValue() [constructor]
+def register_Ns3HtConfiguration_methods(root_module, cls):
+    ## ht-configuration.h (module 'wifi'): ns3::HtConfiguration::HtConfiguration(ns3::HtConfiguration const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtConfiguration const &', 'arg0')])
+    ## ht-configuration.h (module 'wifi'): ns3::HtConfiguration::HtConfiguration() [constructor]
     cls.add_constructor([])
-    ## enum.h (module 'core'): ns3::EnumValue::EnumValue(int value) [constructor]
-    cls.add_constructor([param('int', 'value')])
-    ## enum.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EnumValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## ht-configuration.h (module 'wifi'): bool ns3::HtConfiguration::GetLdpcSupported() const [member function]
+    cls.add_method('GetLdpcSupported', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): bool ns3::EnumValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+                   is_const=True)
+    ## ht-configuration.h (module 'wifi'): bool ns3::HtConfiguration::GetShortGuardIntervalSupported() const [member function]
+    cls.add_method('GetShortGuardIntervalSupported', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## enum.h (module 'core'): int ns3::EnumValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'int', 
                    [], 
                    is_const=True)
-    ## enum.h (module 'core'): std::string ns3::EnumValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## enum.h (module 'core'): void ns3::EnumValue::Set(int value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('int', 'value')])
-    return
-
-def register_Ns3ErlangRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ErlangRandomVariable::GetTypeId() [member function]
+    ## ht-configuration.h (module 'wifi'): static ns3::TypeId ns3::HtConfiguration::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ErlangRandomVariable::ErlangRandomVariable() [constructor]
-    cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetK() const [member function]
-    cls.add_method('GetK', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetLambda() const [member function]
-    cls.add_method('GetLambda', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue(uint32_t k, double lambda) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('uint32_t', 'k'), param('double', 'lambda')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger(uint32_t k, uint32_t lambda) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'k'), param('uint32_t', 'lambda')])
-    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [], 
-                   is_virtual=True)
+    ## ht-configuration.h (module 'wifi'): void ns3::HtConfiguration::SetLdpcSupported(bool enable) [member function]
+    cls.add_method('SetLdpcSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## ht-configuration.h (module 'wifi'): void ns3::HtConfiguration::SetShortGuardIntervalSupported(bool enable) [member function]
+    cls.add_method('SetShortGuardIntervalSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
     return
 
-def register_Ns3ErpInformation_methods(root_module, cls):
+def register_Ns3HtOperation_methods(root_module, cls):
     cls.add_output_stream_operator()
-    ## erp-information.h (module 'wifi'): ns3::ErpInformation::ErpInformation(ns3::ErpInformation const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ErpInformation const &', 'arg0')])
-    ## erp-information.h (module 'wifi'): ns3::ErpInformation::ErpInformation() [constructor]
+    ## ht-operation.h (module 'wifi'): ns3::HtOperation::HtOperation(ns3::HtOperation const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtOperation const &', 'arg0')])
+    ## ht-operation.h (module 'wifi'): ns3::HtOperation::HtOperation() [constructor]
     cls.add_constructor([])
-    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
     cls.add_method('DeserializeInformationField', 
                    'uint8_t', 
                    [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
                    is_virtual=True)
-    ## erp-information.h (module 'wifi'): ns3::WifiInformationElementId ns3::ErpInformation::ElementId() const [member function]
+    ## ht-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::HtOperation::ElementId() const [member function]
     cls.add_method('ElementId', 
                    'ns3::WifiInformationElementId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetBarkerPreambleMode() const [member function]
-    cls.add_method('GetBarkerPreambleMode', 
+    ## ht-operation.h (module 'wifi'): uint64_t ns3::HtOperation::GetBasicMcsSet1() const [member function]
+    cls.add_method('GetBasicMcsSet1', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint64_t ns3::HtOperation::GetBasicMcsSet2() const [member function]
+    cls.add_method('GetBasicMcsSet2', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetDualBeacon() const [member function]
+    cls.add_method('GetDualBeacon', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetInformationFieldSize() const [member function]
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetDualCtsProtection() const [member function]
+    cls.add_method('GetDualCtsProtection', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetHtProtection() const [member function]
+    cls.add_method('GetHtProtection', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetInformationFieldSize() const [member function]
     cls.add_method('GetInformationFieldSize', 
                    'uint8_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetNonErpPresent() const [member function]
-    cls.add_method('GetNonErpPresent', 
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetInformationSubset1() const [member function]
+    cls.add_method('GetInformationSubset1', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## erp-information.h (module 'wifi'): uint16_t ns3::ErpInformation::GetSerializedSize() const [member function]
+    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetInformationSubset2() const [member function]
+    cls.add_method('GetInformationSubset2', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetInformationSubset3() const [member function]
+    cls.add_method('GetInformationSubset3', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetLSigTxopProtectionFullSupport() const [member function]
+    cls.add_method('GetLSigTxopProtectionFullSupport', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetNonGfHtStasPresent() const [member function]
+    cls.add_method('GetNonGfHtStasPresent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetObssNonHtStasPresent() const [member function]
+    cls.add_method('GetObssNonHtStasPresent', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetPcoActive() const [member function]
+    cls.add_method('GetPcoActive', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetPhase() const [member function]
+    cls.add_method('GetPhase', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetPrimaryChannel() const [member function]
+    cls.add_method('GetPrimaryChannel', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetRifsMode() const [member function]
+    cls.add_method('GetRifsMode', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetRxHighestSupportedDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedDataRate', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetSecondaryChannelOffset() const [member function]
+    cls.add_method('GetSecondaryChannelOffset', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint16_t', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetStaChannelWidth() const [member function]
+    cls.add_method('GetStaChannelWidth', 
+                   'uint8_t', 
+                   [], 
                    is_const=True)
-    ## erp-information.h (module 'wifi'): uint8_t ns3::ErpInformation::GetUseProtection() const [member function]
-    cls.add_method('GetUseProtection', 
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetStbcBeacon() const [member function]
+    cls.add_method('GetStbcBeacon', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## erp-information.h (module 'wifi'): ns3::Buffer::Iterator ns3::ErpInformation::Serialize(ns3::Buffer::Iterator start) const [member function]
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxMaxNSpatialStreams() const [member function]
+    cls.add_method('GetTxMaxNSpatialStreams', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxMcsSetDefined() const [member function]
+    cls.add_method('GetTxMcsSetDefined', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxRxMcsSetUnequal() const [member function]
+    cls.add_method('GetTxRxMcsSetUnequal', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxUnequalModulation() const [member function]
+    cls.add_method('GetTxUnequalModulation', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): bool ns3::HtOperation::IsSupportedMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## ht-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::HtOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'ns3::Buffer::Iterator', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+                   is_const=True, is_virtual=True)
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('SerializeInformationField', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetBarkerPreambleMode(uint8_t barkerPreambleMode) [member function]
-    cls.add_method('SetBarkerPreambleMode', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetBasicMcsSet(uint64_t ctrl1, uint64_t ctrl2) [member function]
+    cls.add_method('SetBasicMcsSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetDualBeacon(uint8_t dualBeacon) [member function]
+    cls.add_method('SetDualBeacon', 
+                   'void', 
+                   [param('uint8_t', 'dualBeacon')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetDualCtsProtection(uint8_t dualCtsProtection) [member function]
+    cls.add_method('SetDualCtsProtection', 
+                   'void', 
+                   [param('uint8_t', 'dualCtsProtection')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetHtProtection(uint8_t htProtection) [member function]
+    cls.add_method('SetHtProtection', 
+                   'void', 
+                   [param('uint8_t', 'htProtection')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetHtSupported(uint8_t htSupported) [member function]
+    cls.add_method('SetHtSupported', 
+                   'void', 
+                   [param('uint8_t', 'htSupported')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetInformationSubset1(uint8_t ctrl) [member function]
+    cls.add_method('SetInformationSubset1', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetInformationSubset2(uint16_t ctrl) [member function]
+    cls.add_method('SetInformationSubset2', 
                    'void', 
-                   [param('uint8_t', 'barkerPreambleMode')])
-    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetErpSupported(uint8_t erpSupported) [member function]
-    cls.add_method('SetErpSupported', 
+                   [param('uint16_t', 'ctrl')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetInformationSubset3(uint16_t ctrl) [member function]
+    cls.add_method('SetInformationSubset3', 
                    'void', 
-                   [param('uint8_t', 'erpSupported')])
-    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetNonErpPresent(uint8_t nonErpPresent) [member function]
-    cls.add_method('SetNonErpPresent', 
+                   [param('uint16_t', 'ctrl')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetLSigTxopProtectionFullSupport(uint8_t lSigTxopProtectionFullSupport) [member function]
+    cls.add_method('SetLSigTxopProtectionFullSupport', 
                    'void', 
-                   [param('uint8_t', 'nonErpPresent')])
-    ## erp-information.h (module 'wifi'): void ns3::ErpInformation::SetUseProtection(uint8_t useProtection) [member function]
-    cls.add_method('SetUseProtection', 
+                   [param('uint8_t', 'lSigTxopProtectionFullSupport')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetNonGfHtStasPresent(uint8_t nonGfHtStasPresent) [member function]
+    cls.add_method('SetNonGfHtStasPresent', 
                    'void', 
-                   [param('uint8_t', 'useProtection')])
-    return
-
-def register_Ns3ErrorModel_methods(root_module, cls):
-    ## error-model.h (module 'network'): ns3::ErrorModel::ErrorModel(ns3::ErrorModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ErrorModel const &', 'arg0')])
-    ## error-model.h (module 'network'): ns3::ErrorModel::ErrorModel() [constructor]
-    cls.add_constructor([])
-    ## error-model.h (module 'network'): void ns3::ErrorModel::Disable() [member function]
-    cls.add_method('Disable', 
+                   [param('uint8_t', 'nonGfHtStasPresent')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetObssNonHtStasPresent(uint8_t obssNonHtStasPresent) [member function]
+    cls.add_method('SetObssNonHtStasPresent', 
                    'void', 
-                   [])
-    ## error-model.h (module 'network'): void ns3::ErrorModel::Enable() [member function]
-    cls.add_method('Enable', 
+                   [param('uint8_t', 'obssNonHtStasPresent')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetPcoActive(uint8_t pcoActive) [member function]
+    cls.add_method('SetPcoActive', 
                    'void', 
-                   [])
-    ## error-model.h (module 'network'): static ns3::TypeId ns3::ErrorModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## error-model.h (module 'network'): bool ns3::ErrorModel::IsCorrupt(ns3::Ptr<ns3::Packet> pkt) [member function]
-    cls.add_method('IsCorrupt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'pkt')])
-    ## error-model.h (module 'network'): bool ns3::ErrorModel::IsEnabled() const [member function]
-    cls.add_method('IsEnabled', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## error-model.h (module 'network'): void ns3::ErrorModel::Reset() [member function]
-    cls.add_method('Reset', 
+                   [param('uint8_t', 'pcoActive')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetPhase(uint8_t pcoPhase) [member function]
+    cls.add_method('SetPhase', 
                    'void', 
-                   [])
-    ## error-model.h (module 'network'): bool ns3::ErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorrupt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): void ns3::ErrorModel::DoReset() [member function]
-    cls.add_method('DoReset', 
+                   [param('uint8_t', 'pcoPhase')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetPrimaryChannel(uint8_t ctrl) [member function]
+    cls.add_method('SetPrimaryChannel', 
                    'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
+                   [param('uint8_t', 'ctrl')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetRifsMode(uint8_t rifsMode) [member function]
+    cls.add_method('SetRifsMode', 
+                   'void', 
+                   [param('uint8_t', 'rifsMode')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetRxHighestSupportedDataRate(uint16_t maxSupportedRate) [member function]
+    cls.add_method('SetRxHighestSupportedDataRate', 
+                   'void', 
+                   [param('uint16_t', 'maxSupportedRate')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetRxMcsBitmask(uint8_t index) [member function]
+    cls.add_method('SetRxMcsBitmask', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetSecondaryChannelOffset(uint8_t secondaryChannelOffset) [member function]
+    cls.add_method('SetSecondaryChannelOffset', 
+                   'void', 
+                   [param('uint8_t', 'secondaryChannelOffset')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetStaChannelWidth(uint8_t staChannelWidth) [member function]
+    cls.add_method('SetStaChannelWidth', 
+                   'void', 
+                   [param('uint8_t', 'staChannelWidth')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetStbcBeacon(uint8_t stbcBeacon) [member function]
+    cls.add_method('SetStbcBeacon', 
+                   'void', 
+                   [param('uint8_t', 'stbcBeacon')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams) [member function]
+    cls.add_method('SetTxMaxNSpatialStreams', 
+                   'void', 
+                   [param('uint8_t', 'maxTxSpatialStreams')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxMcsSetDefined(uint8_t txMcsSetDefined) [member function]
+    cls.add_method('SetTxMcsSetDefined', 
+                   'void', 
+                   [param('uint8_t', 'txMcsSetDefined')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal) [member function]
+    cls.add_method('SetTxRxMcsSetUnequal', 
+                   'void', 
+                   [param('uint8_t', 'txRxMcsSetUnequal')])
+    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxUnequalModulation(uint8_t txUnequalModulation) [member function]
+    cls.add_method('SetTxUnequalModulation', 
+                   'void', 
+                   [param('uint8_t', 'txUnequalModulation')])
     return
 
-def register_Ns3ErrorRateModel_methods(root_module, cls):
-    ## error-rate-model.h (module 'wifi'): ns3::ErrorRateModel::ErrorRateModel() [constructor]
+def register_Ns3IdealWifiManager_methods(root_module, cls):
+    ## ideal-wifi-manager.h (module 'wifi'): ns3::IdealWifiManager::IdealWifiManager(ns3::IdealWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::IdealWifiManager const &', 'arg0')])
+    ## ideal-wifi-manager.h (module 'wifi'): ns3::IdealWifiManager::IdealWifiManager() [constructor]
     cls.add_constructor([])
-    ## error-rate-model.h (module 'wifi'): ns3::ErrorRateModel::ErrorRateModel(ns3::ErrorRateModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ErrorRateModel const &', 'arg0')])
-    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::CalculateSnr(ns3::WifiTxVector txVector, double ber) const [member function]
-    cls.add_method('CalculateSnr', 
-                   'double', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('double', 'ber')], 
-                   is_const=True)
-    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::GetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint64_t nbits) const [member function]
-    cls.add_method('GetChunkSuccessRate', 
-                   'double', 
-                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits')], 
-                   is_const=True)
-    ## error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::ErrorRateModel::GetTypeId() [member function]
+    ## ideal-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::IdealWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-rate-model.h (module 'wifi'): double ns3::ErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint64_t nbits) const [member function]
-    cls.add_method('DoGetChunkSuccessRate', 
-                   'double', 
-                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3Event_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Event const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Event const &', 'arg0')])
-    ## interference-helper.h (module 'wifi'): ns3::Event::Event(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand', 'rxPower')])
-    ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetDuration() const [member function]
-    cls.add_method('GetDuration', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetEndTime() const [member function]
-    cls.add_method('GetEndTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::Ptr<const ns3::WifiPpdu> ns3::Event::GetPpdu() const [member function]
-    cls.add_method('GetPpdu', 
-                   'ns3::Ptr< ns3::WifiPpdu const >', 
-                   [], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): double ns3::Event::GetRxPowerW() const [member function]
-    cls.add_method('GetRxPowerW', 
-                   'double', 
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## ideal-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::IdealWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): double ns3::Event::GetRxPowerW(ns3::WifiSpectrumBand band) const [member function]
-    cls.add_method('GetRxPowerW', 
-                   'double', 
-                   [param('std::pair< unsigned int, unsigned int >', 'band')], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::RxPowerWattPerChannelBand ns3::Event::GetRxPowerWPerBand() const [member function]
-    cls.add_method('GetRxPowerWPerBand', 
-                   'ns3::RxPowerWattPerChannelBand', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::IdealWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::IdealWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetStartTime() const [member function]
-    cls.add_method('GetStartTime', 
-                   'ns3::Time', 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportAmpduTxStatus', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3IntegerValue_methods(root_module, cls):
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue() [constructor]
+    cls.add_constructor([])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(int64_t const & value) [constructor]
+    cls.add_constructor([param('int64_t const &', 'value')])
+    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(ns3::IntegerValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::IntegerValue const &', 'arg0')])
+    ## integer.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::IntegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True)
-    ## interference-helper.h (module 'wifi'): ns3::WifiTxVector ns3::Event::GetTxVector() const [member function]
-    cls.add_method('GetTxVector', 
-                   'ns3::WifiTxVector', 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): bool ns3::IntegerValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## integer.h (module 'core'): int64_t ns3::IntegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'int64_t', 
                    [], 
                    is_const=True)
+    ## integer.h (module 'core'): std::string ns3::IntegerValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## integer.h (module 'core'): void ns3::IntegerValue::Set(int64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('int64_t const &', 'value')])
     return
 
-def register_Ns3EventImpl_methods(root_module, cls):
-    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [constructor]
-    cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
-    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl() [constructor]
+def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
     cls.add_constructor([])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
-    cls.add_method('Cancel', 
-                   'void', 
-                   [])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
-    cls.add_method('Invoke', 
-                   'void', 
-                   [])
-    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
-    cls.add_method('IsCancelled', 
-                   'bool', 
-                   [])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
-    cls.add_method('Notify', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker(ns3::Ipv4AddressChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressChecker const &', 'arg0')])
     return
 
-def register_Ns3ExponentialRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ExponentialRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable::ExponentialRandomVariable() [constructor]
+def register_Ns3Ipv4AddressValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetMean() const [member function]
-    cls.add_method('GetMean', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetBound() const [member function]
-    cls.add_method('GetBound', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue(double mean, double bound) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'mean'), param('double', 'bound')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger(uint32_t mean, uint32_t bound) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'mean'), param('uint32_t', 'bound')])
-    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4AddressValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Address', 
                    [], 
-                   is_virtual=True)
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4AddressValue::Set(ns3::Ipv4Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Address const &', 'value')])
     return
 
-def register_Ns3ExtendedCapabilities_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## extended-capabilities.h (module 'wifi'): ns3::ExtendedCapabilities::ExtendedCapabilities(ns3::ExtendedCapabilities const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ExtendedCapabilities const &', 'arg0')])
-    ## extended-capabilities.h (module 'wifi'): ns3::ExtendedCapabilities::ExtendedCapabilities() [constructor]
+def register_Ns3Ipv4MaskChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker() [constructor]
     cls.add_constructor([])
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## extended-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::ExtendedCapabilities::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker(ns3::Ipv4MaskChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4MaskValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4Mask const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4MaskValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4MaskValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte1() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte1', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte2() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte2', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte3() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte3', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte4() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte4', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte5() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte5', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte6() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte6', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte7() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte7', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetExtendedCapabilitiesByte8() const [member function]
-    cls.add_method('GetExtendedCapabilitiesByte8', 
-                   'uint8_t', 
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4MaskValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask ns3::Ipv4MaskValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Mask', 
                    [], 
                    is_const=True)
-    ## extended-capabilities.h (module 'wifi'): uint8_t ns3::ExtendedCapabilities::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
-                   [], 
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4MaskValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## extended-capabilities.h (module 'wifi'): uint16_t ns3::ExtendedCapabilities::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4MaskValue::Set(ns3::Ipv4Mask const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+                   [param('ns3::Ipv4Mask const &', 'value')])
+    return
+
+def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker(ns3::Ipv6AddressChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6AddressValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6AddressValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte1(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte1', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte2(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte2', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte3(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte3', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte4(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte4', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte5(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte5', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte6(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte6', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte7(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte7', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetExtendedCapabilitiesByte8(uint8_t ctrl) [member function]
-    cls.add_method('SetExtendedCapabilitiesByte8', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetHtSupported(uint8_t htSupported) [member function]
-    cls.add_method('SetHtSupported', 
-                   'void', 
-                   [param('uint8_t', 'htSupported')])
-    ## extended-capabilities.h (module 'wifi'): void ns3::ExtendedCapabilities::SetVhtSupported(uint8_t vhtSupported) [member function]
-    cls.add_method('SetVhtSupported', 
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6AddressValue::Set(ns3::Ipv6Address const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('uint8_t', 'vhtSupported')])
+                   [param('ns3::Ipv6Address const &', 'value')])
     return
 
-def register_Ns3ExtendedSupportedRatesIE_methods(root_module, cls):
-    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE(ns3::ExtendedSupportedRatesIE const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ExtendedSupportedRatesIE const &', 'arg0')])
-    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE() [constructor]
+def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
     cls.add_constructor([])
-    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE(ns3::SupportedRates * rates) [constructor]
-    cls.add_constructor([param('ns3::SupportedRates *', 'rates')])
-    ## supported-rates.h (module 'wifi'): uint8_t ns3::ExtendedSupportedRatesIE::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## supported-rates.h (module 'wifi'): ns3::WifiInformationElementId ns3::ExtendedSupportedRatesIE::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker(ns3::Ipv6PrefixChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6PrefixValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6Prefix const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6PrefixValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6PrefixValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## supported-rates.h (module 'wifi'): uint8_t ns3::ExtendedSupportedRatesIE::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6PrefixValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix ns3::Ipv6PrefixValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Prefix', 
                    [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6PrefixValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## supported-rates.h (module 'wifi'): uint16_t ns3::ExtendedSupportedRatesIE::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6PrefixValue::Set(ns3::Ipv6Prefix const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Prefix const &', 'value')])
+    return
+
+def register_Ns3ItuR1411LosPropagationLossModel_methods(root_module, cls):
+    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ItuR1411LosPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
+                   is_static=True)
+    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): ns3::ItuR1411LosPropagationLossModel::ItuR1411LosPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): void ns3::ItuR1411LosPropagationLossModel::SetFrequency(double freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('double', 'freq')])
+    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411LosPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetLoss', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True)
-    ## supported-rates.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedSupportedRatesIE::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411LosPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): int64_t ns3::ItuR1411LosPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ItuR1411NlosOverRooftopPropagationLossModel_methods(root_module, cls):
+    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ItuR1411NlosOverRooftopPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): ns3::ItuR1411NlosOverRooftopPropagationLossModel::ItuR1411NlosOverRooftopPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): void ns3::ItuR1411NlosOverRooftopPropagationLossModel::SetFrequency(double freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('double', 'freq')])
+    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411NlosOverRooftopPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetLoss', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True)
-    ## supported-rates.h (module 'wifi'): void ns3::ExtendedSupportedRatesIE::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411NlosOverRooftopPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): int64_t ns3::ItuR1411NlosOverRooftopPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3JakesProcess_methods(root_module, cls):
+    ## jakes-process.h (module 'propagation'): ns3::JakesProcess::JakesProcess(ns3::JakesProcess const & arg0) [constructor]
+    cls.add_constructor([param('ns3::JakesProcess const &', 'arg0')])
+    ## jakes-process.h (module 'propagation'): ns3::JakesProcess::JakesProcess() [constructor]
+    cls.add_constructor([])
+    ## jakes-process.h (module 'propagation'): void ns3::JakesProcess::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## supported-rates.h (module 'wifi'): void ns3::ExtendedSupportedRatesIE::SetSupportedRates(ns3::SupportedRates * rates) [member function]
-    cls.add_method('SetSupportedRates', 
+                   [], 
+                   is_virtual=True)
+    ## jakes-process.h (module 'propagation'): double ns3::JakesProcess::GetChannelGainDb() const [member function]
+    cls.add_method('GetChannelGainDb', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## jakes-process.h (module 'propagation'): std::complex<double> ns3::JakesProcess::GetComplexGain() const [member function]
+    cls.add_method('GetComplexGain', 
+                   'std::complex< double >', 
+                   [], 
+                   is_const=True)
+    ## jakes-process.h (module 'propagation'): static ns3::TypeId ns3::JakesProcess::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## jakes-process.h (module 'propagation'): void ns3::JakesProcess::SetPropagationLossModel(ns3::Ptr<const ns3::PropagationLossModel> model) [member function]
+    cls.add_method('SetPropagationLossModel', 
                    'void', 
-                   [param('ns3::SupportedRates *', 'rates')])
+                   [param('ns3::Ptr< ns3::PropagationLossModel const >', 'model')])
     return
 
-def register_Ns3FixedRssLossModel_methods(root_module, cls):
-    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::FixedRssLossModel::GetTypeId() [member function]
+def register_Ns3JakesPropagationLossModel_methods(root_module, cls):
+    ## jakes-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::JakesPropagationLossModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## propagation-loss-model.h (module 'propagation'): ns3::FixedRssLossModel::FixedRssLossModel() [constructor]
+    ## jakes-propagation-loss-model.h (module 'propagation'): ns3::JakesPropagationLossModel::JakesPropagationLossModel() [constructor]
     cls.add_constructor([])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::FixedRssLossModel::SetRss(double rss) [member function]
-    cls.add_method('SetRss', 
-                   'void', 
-                   [param('double', 'rss')])
-    ## propagation-loss-model.h (module 'propagation'): double ns3::FixedRssLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    ## jakes-propagation-loss-model.h (module 'propagation'): double ns3::JakesPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::FixedRssLossModel::DoAssignStreams(int64_t stream) [member function]
+    ## jakes-propagation-loss-model.h (module 'propagation'): int64_t ns3::JakesPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3FrameCaptureModel_methods(root_module, cls):
-    ## frame-capture-model.h (module 'wifi'): ns3::FrameCaptureModel::FrameCaptureModel() [constructor]
+def register_Ns3Kun2600MhzPropagationLossModel_methods(root_module, cls):
+    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::Kun2600MhzPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): ns3::Kun2600MhzPropagationLossModel::Kun2600MhzPropagationLossModel() [constructor]
     cls.add_constructor([])
-    ## frame-capture-model.h (module 'wifi'): ns3::FrameCaptureModel::FrameCaptureModel(ns3::FrameCaptureModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::FrameCaptureModel const &', 'arg0')])
-    ## frame-capture-model.h (module 'wifi'): bool ns3::FrameCaptureModel::CaptureNewFrame(ns3::Ptr<ns3::Event> currentEvent, ns3::Ptr<ns3::Event> newEvent) const [member function]
-    cls.add_method('CaptureNewFrame', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Event >', 'currentEvent'), param('ns3::Ptr< ns3::Event >', 'newEvent')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## frame-capture-model.h (module 'wifi'): static ns3::TypeId ns3::FrameCaptureModel::GetTypeId() [member function]
+    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): double ns3::Kun2600MhzPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetLoss', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True)
+    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): double ns3::Kun2600MhzPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): int64_t ns3::Kun2600MhzPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3LinearWifiTxCurrentModel_methods(root_module, cls):
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel(ns3::LinearWifiTxCurrentModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::LinearWifiTxCurrentModel const &', 'arg0')])
+    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-current-model.h (module 'wifi'): double ns3::LinearWifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
+    cls.add_method('CalcTxCurrent', 
+                   'double', 
+                   [param('double', 'txPowerDbm')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-tx-current-model.h (module 'wifi'): static ns3::TypeId ns3::LinearWifiTxCurrentModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3ListErrorModel_methods(root_module, cls):
+    ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel(ns3::ListErrorModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
+    ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
+    cls.add_constructor([])
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
+    cls.add_method('GetList', 
+                   'std::list< unsigned int >', 
+                   [], 
+                   is_const=True)
+    ## error-model.h (module 'network'): static ns3::TypeId ns3::ListErrorModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## frame-capture-model.h (module 'wifi'): bool ns3::FrameCaptureModel::IsInCaptureWindow(ns3::Time timePreambleDetected) const [member function]
-    cls.add_method('IsInCaptureWindow', 
-                   'bool', 
-                   [param('ns3::Time', 'timePreambleDetected')], 
-                   is_const=True, is_virtual=True)
+                   is_static=True)
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    cls.add_method('SetList', 
+                   'void', 
+                   [param('std::list< unsigned int > const &', 'packetlist')])
+    ## error-model.h (module 'network'): bool ns3::ListErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorrupt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
+                   is_virtual=True, visibility='private')
+    ## error-model.h (module 'network'): void ns3::ListErrorModel::DoReset() [member function]
+    cls.add_method('DoReset', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3FriisPropagationLossModel_methods(root_module, cls):
-    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::FriisPropagationLossModel::GetTypeId() [member function]
+def register_Ns3LogDistancePropagationLossModel_methods(root_module, cls):
+    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::LogDistancePropagationLossModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## propagation-loss-model.h (module 'propagation'): ns3::FriisPropagationLossModel::FriisPropagationLossModel() [constructor]
+    ## propagation-loss-model.h (module 'propagation'): ns3::LogDistancePropagationLossModel::LogDistancePropagationLossModel() [constructor]
     cls.add_constructor([])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::FriisPropagationLossModel::SetFrequency(double frequency) [member function]
-    cls.add_method('SetFrequency', 
-                   'void', 
-                   [param('double', 'frequency')])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::FriisPropagationLossModel::SetSystemLoss(double systemLoss) [member function]
-    cls.add_method('SetSystemLoss', 
-                   'void', 
-                   [param('double', 'systemLoss')])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::FriisPropagationLossModel::SetMinLoss(double minLoss) [member function]
-    cls.add_method('SetMinLoss', 
+    ## propagation-loss-model.h (module 'propagation'): void ns3::LogDistancePropagationLossModel::SetPathLossExponent(double n) [member function]
+    cls.add_method('SetPathLossExponent', 
                    'void', 
-                   [param('double', 'minLoss')])
-    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::GetMinLoss() const [member function]
-    cls.add_method('GetMinLoss', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::GetFrequency() const [member function]
-    cls.add_method('GetFrequency', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::GetSystemLoss() const [member function]
-    cls.add_method('GetSystemLoss', 
+                   [param('double', 'n')])
+    ## propagation-loss-model.h (module 'propagation'): double ns3::LogDistancePropagationLossModel::GetPathLossExponent() const [member function]
+    cls.add_method('GetPathLossExponent', 
                    'double', 
                    [], 
                    is_const=True)
-    ## propagation-loss-model.h (module 'propagation'): double ns3::FriisPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    ## propagation-loss-model.h (module 'propagation'): void ns3::LogDistancePropagationLossModel::SetReference(double referenceDistance, double referenceLoss) [member function]
+    cls.add_method('SetReference', 
+                   'void', 
+                   [param('double', 'referenceDistance'), param('double', 'referenceLoss')])
+    ## propagation-loss-model.h (module 'propagation'): double ns3::LogDistancePropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
     cls.add_method('DoCalcRxPower', 
                    'double', 
                    [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::FriisPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::LogDistancePropagationLossModel::DoAssignStreams(int64_t stream) [member function]
     cls.add_method('DoAssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3GammaRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::GammaRandomVariable::GetTypeId() [member function]
+def register_Ns3LogNormalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::LogNormalRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable::GammaRandomVariable() [constructor]
+    ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable::LogNormalRandomVariable() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetAlpha() const [member function]
-    cls.add_method('GetAlpha', 
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetMu() const [member function]
+    cls.add_method('GetMu', 
                    'double', 
                    [], 
                    is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetBeta() const [member function]
-    cls.add_method('GetBeta', 
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetSigma() const [member function]
+    cls.add_method('GetSigma', 
                    'double', 
                    [], 
                    is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue(double alpha, double beta) [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue(double mu, double sigma) [member function]
     cls.add_method('GetValue', 
                    'double', 
-                   [param('double', 'alpha'), param('double', 'beta')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger(uint32_t alpha, uint32_t beta) [member function]
+                   [param('double', 'mu'), param('double', 'sigma')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger(uint32_t mu, uint32_t sigma) [member function]
     cls.add_method('GetInteger', 
                    'uint32_t', 
-                   [param('uint32_t', 'alpha'), param('uint32_t', 'beta')])
-    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue() [member function]
+                   [param('uint32_t', 'mu'), param('uint32_t', 'sigma')])
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue() [member function]
     cls.add_method('GetValue', 
                    'double', 
                    [], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger() [member function]
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger() [member function]
     cls.add_method('GetInteger', 
                    'uint32_t', 
                    [], 
                    is_virtual=True)
     return
 
-def register_Ns3HeCapabilities_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities::HeCapabilities(ns3::HeCapabilities const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeCapabilities const &', 'arg0')])
-    ## he-capabilities.h (module 'wifi'): ns3::HeCapabilities::HeCapabilities() [constructor]
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
+def register_Ns3MacRxMiddle_methods(root_module, cls):
+    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle::MacRxMiddle(ns3::MacRxMiddle const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MacRxMiddle const &', 'arg0')])
+    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle::MacRxMiddle() [constructor]
+    cls.add_constructor([])
+    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::SetForwardCallback(ns3::MacRxMiddle::ForwardUpCallback callback) [member function]
+    cls.add_method('SetForwardCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    return
+
+def register_Ns3MacTxMiddle_methods(root_module, cls):
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle(ns3::MacTxMiddle const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MacTxMiddle const &', 'arg0')])
+    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle() [constructor]
+    cls.add_constructor([])
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSeqNumberByTidAndAddress(uint8_t tid, ns3::Mac48Address addr) const [member function]
+    cls.add_method('GetNextSeqNumberByTidAndAddress', 
+                   'uint16_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'addr')], 
+                   is_const=True)
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('GetNextSequenceNumberFor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('PeekNextSequenceNumberFor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## mac-tx-middle.h (module 'wifi'): void ns3::MacTxMiddle::SetSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('SetSequenceNumberFor', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    return
+
+def register_Ns3MatrixPropagationLossModel_methods(root_module, cls):
+    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::MatrixPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## propagation-loss-model.h (module 'propagation'): ns3::MatrixPropagationLossModel::MatrixPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## propagation-loss-model.h (module 'propagation'): void ns3::MatrixPropagationLossModel::SetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b, double loss, bool symmetric=true) [member function]
+    cls.add_method('SetLoss', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b'), param('double', 'loss'), param('bool', 'symmetric', default_value='true')])
+    ## propagation-loss-model.h (module 'propagation'): void ns3::MatrixPropagationLossModel::SetDefaultLoss(double defaultLoss) [member function]
+    cls.add_method('SetDefaultLoss', 
+                   'void', 
+                   [param('double', 'defaultLoss')])
+    ## propagation-loss-model.h (module 'propagation'): double ns3::MatrixPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::MatrixPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3MgtBeaconHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader(ns3::MgtBeaconHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MgtBeaconHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtBeaconHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3MinstrelHtWifiManager_methods(root_module, cls):
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtWifiManager::MinstrelHtWifiManager(ns3::MinstrelHtWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MinstrelHtWifiManager const &', 'arg0')])
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtWifiManager::MinstrelHtWifiManager() [constructor]
+    cls.add_constructor([])
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): int64_t ns3::MinstrelHtWifiManager::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::MinstrelHtWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetupMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::MinstrelHtWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelHtWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelHtWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): bool ns3::MinstrelHtWifiManager::DoNeedRetransmission(ns3::WifiRemoteStation * st, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
+    cls.add_method('DoNeedRetransmission', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'st'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportAmpduTxStatus', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3MinstrelWifiManager_methods(root_module, cls):
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::MinstrelWifiManager::MinstrelWifiManager(ns3::MinstrelWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MinstrelWifiManager const &', 'arg0')])
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::MinstrelWifiManager::MinstrelWifiManager() [constructor]
     cls.add_constructor([])
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+    ## minstrel-wifi-manager.h (module 'wifi'): int64_t ns3::MinstrelWifiManager::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
                    is_virtual=True)
-    ## he-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeCapabilities::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## he-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeCapabilities::ElementIdExt() const [member function]
-    cls.add_method('ElementIdExt', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetChannelWidthSet() const [member function]
-    cls.add_method('GetChannelWidthSet', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeLtfAndGiForHePpdus() const [member function]
-    cls.add_method('GetHeLtfAndGiForHePpdus', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo1() const [member function]
-    cls.add_method('GetHeMacCapabilitiesInfo1', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHeMacCapabilitiesInfo2() const [member function]
-    cls.add_method('GetHeMacCapabilitiesInfo2', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint64_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo1() const [member function]
-    cls.add_method('GetHePhyCapabilitiesInfo1', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHePhyCapabilitiesInfo2() const [member function]
-    cls.add_method('GetHePhyCapabilitiesInfo2', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestMcsSupported() const [member function]
-    cls.add_method('GetHighestMcsSupported', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetHighestNssSupported() const [member function]
-    cls.add_method('GetHighestNssSupported', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## he-capabilities.h (module 'wifi'): uint8_t ns3::HeCapabilities::GetLdpcCodingInPayload() const [member function]
-    cls.add_method('GetLdpcCodingInPayload', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint32_t ns3::HeCapabilities::GetMaxAmpduLength() const [member function]
-    cls.add_method('GetMaxAmpduLength', 
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::CheckInit(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('CheckInit', 
+                   'void', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): uint32_t ns3::MinstrelWifiManager::CountRetries(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('CountRetries', 
                    'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): uint16_t ns3::HeCapabilities::GetSupportedMcsAndNss() const [member function]
-    cls.add_method('GetSupportedMcsAndNss', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): uint16_t ns3::MinstrelWifiManager::FindRate(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('FindRate', 
                    'uint16_t', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::GetDataTxVector(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::GetRtsTxVector(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('GetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::MinstrelWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
-    cls.add_method('IsSupportedRxMcs', 
-                   'bool', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): bool ns3::HeCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
-    cls.add_method('IsSupportedTxMcs', 
-                   'bool', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::HeCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+                   is_static=True)
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::InitSampleTable(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('InitSampleTable', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetChannelWidthSet(uint8_t channelWidthSet) [member function]
-    cls.add_method('SetChannelWidthSet', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetupMac', 
                    'void', 
-                   [param('uint8_t', 'channelWidthSet')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeLtfAndGiForHePpdus(uint8_t heLtfAndGiForHePpdus) [member function]
-    cls.add_method('SetHeLtfAndGiForHePpdus', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
                    'void', 
-                   [param('uint8_t', 'heLtfAndGiForHePpdus')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeMacCapabilitiesInfo(uint32_t ctrl1, uint8_t ctrl2) [member function]
-    cls.add_method('SetHeMacCapabilitiesInfo', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdatePacketCounters(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('UpdatePacketCounters', 
                    'void', 
-                   [param('uint32_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHePhyCapabilitiesInfo(uint64_t ctrl1, uint8_t ctrl2) [member function]
-    cls.add_method('SetHePhyCapabilitiesInfo', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdateRate(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('UpdateRate', 
                    'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint8_t', 'ctrl2')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHeSupported(uint8_t heSupported) [member function]
-    cls.add_method('SetHeSupported', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdateRetry(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('UpdateRetry', 
                    'void', 
-                   [param('uint8_t', 'heSupported')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHighestMcsSupported(uint8_t mcs) [member function]
-    cls.add_method('SetHighestMcsSupported', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdateStats(ns3::MinstrelWifiRemoteStation * station) [member function]
+    cls.add_method('UpdateStats', 
                    'void', 
-                   [param('uint8_t', 'mcs')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetHighestNssSupported(uint8_t nss) [member function]
-    cls.add_method('SetHighestNssSupported', 
+                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::MinstrelWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('uint8_t', 'nss')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetLdpcCodingInPayload(uint8_t ldpcCodingInPayload) [member function]
-    cls.add_method('SetLdpcCodingInPayload', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): bool ns3::MinstrelWifiManager::DoNeedRetransmission(ns3::WifiRemoteStation * st, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
+    cls.add_method('DoNeedRetransmission', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'st'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [param('uint8_t', 'ldpcCodingInPayload')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetMaxAmpduLength(uint32_t maxAmpduLength) [member function]
-    cls.add_method('SetMaxAmpduLength', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('uint32_t', 'maxAmpduLength')])
-    ## he-capabilities.h (module 'wifi'): void ns3::HeCapabilities::SetSupportedMcsAndNss(uint16_t ctrl) [member function]
-    cls.add_method('SetSupportedMcsAndNss', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
                    'void', 
-                   [param('uint16_t', 'ctrl')])
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3HeConfiguration_methods(root_module, cls):
-    ## he-configuration.h (module 'wifi'): ns3::HeConfiguration::HeConfiguration(ns3::HeConfiguration const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeConfiguration const &', 'arg0')])
-    ## he-configuration.h (module 'wifi'): ns3::HeConfiguration::HeConfiguration() [constructor]
+def register_Ns3MobilityModel_methods(root_module, cls):
+    ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel(ns3::MobilityModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MobilityModel const &', 'arg0')])
+    ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel() [constructor]
     cls.add_constructor([])
-    ## he-configuration.h (module 'wifi'): ns3::Time ns3::HeConfiguration::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'ns3::Time', 
-                   [], 
+    ## mobility-model.h (module 'mobility'): int64_t ns3::MobilityModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetDistanceFrom(ns3::Ptr<const ns3::MobilityModel> position) const [member function]
+    cls.add_method('GetDistanceFrom', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'position')], 
                    is_const=True)
-    ## he-configuration.h (module 'wifi'): uint16_t ns3::HeConfiguration::GetMpduBufferSize() const [member function]
-    cls.add_method('GetMpduBufferSize', 
-                   'uint16_t', 
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPosition() const [member function]
+    cls.add_method('GetPosition', 
+                   'ns3::Vector', 
                    [], 
                    is_const=True)
-    ## he-configuration.h (module 'wifi'): static ns3::TypeId ns3::HeConfiguration::GetTypeId() [member function]
+    ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetRelativeSpeed(ns3::Ptr<const ns3::MobilityModel> other) const [member function]
+    cls.add_method('GetRelativeSpeed', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'other')], 
+                   is_const=True)
+    ## mobility-model.h (module 'mobility'): static ns3::TypeId ns3::MobilityModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## he-configuration.h (module 'wifi'): void ns3::HeConfiguration::SetGuardInterval(ns3::Time guardInterval) [member function]
-    cls.add_method('SetGuardInterval', 
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetVelocity() const [member function]
+    cls.add_method('GetVelocity', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True)
+    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::SetPosition(ns3::Vector const & position) [member function]
+    cls.add_method('SetPosition', 
                    'void', 
-                   [param('ns3::Time', 'guardInterval')])
-    ## he-configuration.h (module 'wifi'): void ns3::HeConfiguration::SetMpduBufferSize(uint16_t size) [member function]
-    cls.add_method('SetMpduBufferSize', 
+                   [param('ns3::Vector const &', 'position')])
+    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::NotifyCourseChange() const [member function]
+    cls.add_method('NotifyCourseChange', 
                    'void', 
-                   [param('uint16_t', 'size')])
+                   [], 
+                   is_const=True, visibility='protected')
+    ## mobility-model.h (module 'mobility'): int64_t ns3::MobilityModel::DoAssignStreams(int64_t start) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'start')], 
+                   is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPosition() const [member function]
+    cls.add_method('DoGetPosition', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetVelocity() const [member function]
+    cls.add_method('DoGetVelocity', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
+    cls.add_method('DoSetPosition', 
+                   'void', 
+                   [param('ns3::Vector const &', 'position')], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3HeOperation_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## he-operation.h (module 'wifi'): ns3::HeOperation::HeOperation(ns3::HeOperation const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeOperation const &', 'arg0')])
-    ## he-operation.h (module 'wifi'): ns3::HeOperation::HeOperation() [constructor]
+def register_Ns3MpduAggregator_methods(root_module, cls):
+    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator(ns3::MpduAggregator const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MpduAggregator const &', 'arg0')])
+    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator() [constructor]
     cls.add_constructor([])
-    ## he-operation.h (module 'wifi'): uint8_t ns3::HeOperation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
+    ## mpdu-aggregator.h (module 'wifi'): static void ns3::MpduAggregator::Aggregate(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::Ptr<ns3::Packet> ampdu, bool isSingle) [member function]
+    cls.add_method('Aggregate', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::Ptr< ns3::Packet >', 'ampdu'), param('bool', 'isSingle')], 
+                   is_static=True)
+    ## mpdu-aggregator.h (module 'wifi'): static uint8_t ns3::MpduAggregator::CalculatePadding(uint32_t ampduSize) [member function]
+    cls.add_method('CalculatePadding', 
                    'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## he-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeOperation::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## he-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::HeOperation::ElementIdExt() const [member function]
-    cls.add_method('ElementIdExt', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## he-operation.h (module 'wifi'): uint16_t ns3::HeOperation::GetBasicHeMcsAndNssSet() const [member function]
-    cls.add_method('GetBasicHeMcsAndNssSet', 
-                   'uint16_t', 
-                   [], 
+                   [param('uint32_t', 'ampduSize')], 
+                   is_static=True)
+    ## mpdu-aggregator.h (module 'wifi'): static ns3::AmpduSubframeHeader ns3::MpduAggregator::GetAmpduSubframeHeader(uint16_t mpduSize, bool isSingle) [member function]
+    cls.add_method('GetAmpduSubframeHeader', 
+                   'ns3::AmpduSubframeHeader', 
+                   [param('uint16_t', 'mpduSize'), param('bool', 'isSingle')], 
+                   is_static=True)
+    ## mpdu-aggregator.h (module 'wifi'): uint32_t ns3::MpduAggregator::GetMaxAmpduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
-    ## he-operation.h (module 'wifi'): uint8_t ns3::HeOperation::GetBssColor() const [member function]
-    cls.add_method('GetBssColor', 
-                   'uint8_t', 
-                   [], 
+    ## mpdu-aggregator.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > ns3::MpduAggregator::GetNextAmpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime, ns3::WifiMacQueueItem::QueueIteratorPair queueIt) const [member function]
+    cls.add_method('GetNextAmpdu', 
+                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('ns3::WifiMacQueueItem::QueueIteratorPair', 'queueIt')], 
                    is_const=True)
-    ## he-operation.h (module 'wifi'): uint32_t ns3::HeOperation::GetHeOperationParameters() const [member function]
-    cls.add_method('GetHeOperationParameters', 
+    ## mpdu-aggregator.h (module 'wifi'): static uint32_t ns3::MpduAggregator::GetSizeIfAggregated(uint32_t mpduSize, uint32_t ampduSize) [member function]
+    cls.add_method('GetSizeIfAggregated', 
                    'uint32_t', 
+                   [param('uint32_t', 'mpduSize'), param('uint32_t', 'ampduSize')], 
+                   is_static=True)
+    ## mpdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MpduAggregator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## he-operation.h (module 'wifi'): uint8_t ns3::HeOperation::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
+                   is_static=True)
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')])
+    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## he-operation.h (module 'wifi'): uint16_t ns3::HeOperation::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3MsduAggregator_methods(root_module, cls):
+    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator(ns3::MsduAggregator const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MsduAggregator const &', 'arg0')])
+    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator() [constructor]
+    cls.add_constructor([])
+    ## msdu-aggregator.h (module 'wifi'): static uint8_t ns3::MsduAggregator::CalculatePadding(uint16_t amsduSize) [member function]
+    cls.add_method('CalculatePadding', 
+                   'uint8_t', 
+                   [param('uint16_t', 'amsduSize')], 
+                   is_static=True)
+    ## msdu-aggregator.h (module 'wifi'): static ns3::WifiMacQueueItem::DeaggregatedMsdus ns3::MsduAggregator::Deaggregate(ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
+    cls.add_method('Deaggregate', 
+                   'ns3::WifiMacQueueItem::DeaggregatedMsdus', 
+                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
+                   is_static=True)
+    ## msdu-aggregator.h (module 'wifi'): uint16_t ns3::MsduAggregator::GetMaxAmsduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
                    'uint16_t', 
-                   [], 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
                    is_const=True)
-    ## he-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::HeOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+    ## msdu-aggregator.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::MsduAggregator::GetNextAmsdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, ns3::WifiMacQueueItem::QueueIteratorPair & queueIt) const [member function]
+    cls.add_method('GetNextAmsdu', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('ns3::WifiMacQueueItem::QueueIteratorPair &', 'queueIt')], 
                    is_const=True)
-    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+    ## msdu-aggregator.h (module 'wifi'): static uint16_t ns3::MsduAggregator::GetSizeIfAggregated(uint16_t msduSize, uint16_t amsduSize) [member function]
+    cls.add_method('GetSizeIfAggregated', 
+                   'uint16_t', 
+                   [param('uint16_t', 'msduSize'), param('uint16_t', 'amsduSize')], 
+                   is_static=True)
+    ## msdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MsduAggregator::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetBssColor(uint8_t bssColor) [member function]
-    cls.add_method('SetBssColor', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')])
+    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('uint8_t', 'bssColor')])
-    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetHeOperationParameters(uint32_t ctrl) [member function]
-    cls.add_method('SetHeOperationParameters', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3MultiUserScheduler_methods(root_module, cls):
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::MultiUserScheduler(ns3::MultiUserScheduler const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MultiUserScheduler const &', 'arg0')])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::MultiUserScheduler() [constructor]
+    cls.add_constructor([])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo & ns3::MultiUserScheduler::GetDlMuInfo() [member function]
+    cls.add_method('GetDlMuInfo', 
+                   'ns3::MultiUserScheduler::DlMuInfo &', 
+                   [])
+    ## multi-user-scheduler.h (module 'wifi'): static ns3::TypeId ns3::MultiUserScheduler::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo & ns3::MultiUserScheduler::GetUlMuInfo() [member function]
+    cls.add_method('GetUlMuInfo', 
+                   'ns3::MultiUserScheduler::UlMuInfo &', 
+                   [])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::MultiUserScheduler::NotifyAccessGranted(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('NotifyAccessGranted', 
+                   'ns3::MultiUserScheduler::TxFormat', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')])
+    ## multi-user-scheduler.h (module 'wifi'): void ns3::MultiUserScheduler::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('uint32_t', 'ctrl')])
-    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetHeSupported(uint8_t heSupported) [member function]
-    cls.add_method('SetHeSupported', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## multi-user-scheduler.h (module 'wifi'): void ns3::MultiUserScheduler::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('uint8_t', 'heSupported')])
-    ## he-operation.h (module 'wifi'): void ns3::HeOperation::SetMaxHeMcsPerNss(uint8_t nss, uint8_t maxHeMcs) [member function]
-    cls.add_method('SetMaxHeMcsPerNss', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::MultiUserScheduler::GetLastTxFormat() const [member function]
+    cls.add_method('GetLastTxFormat', 
+                   'ns3::MultiUserScheduler::TxFormat', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## multi-user-scheduler.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::MultiUserScheduler::GetWifiRemoteStationManager() const [member function]
+    cls.add_method('GetWifiRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## multi-user-scheduler.h (module 'wifi'): void ns3::MultiUserScheduler::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
                    'void', 
-                   [param('uint8_t', 'nss'), param('uint8_t', 'maxHeMcs')])
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo ns3::MultiUserScheduler::ComputeDlMuInfo() [member function]
+    cls.add_method('ComputeDlMuInfo', 
+                   'ns3::MultiUserScheduler::DlMuInfo', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo ns3::MultiUserScheduler::ComputeUlMuInfo() [member function]
+    cls.add_method('ComputeUlMuInfo', 
+                   'ns3::MultiUserScheduler::UlMuInfo', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::MultiUserScheduler::SelectTxFormat() [member function]
+    cls.add_method('SelectTxFormat', 
+                   'ns3::MultiUserScheduler::TxFormat', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3MultiUserSchedulerDlMuInfo_methods(root_module, cls):
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo::DlMuInfo() [constructor]
+    cls.add_constructor([])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo::DlMuInfo(ns3::MultiUserScheduler::DlMuInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MultiUserScheduler::DlMuInfo const &', 'arg0')])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo::psduMap [variable]
+    cls.add_instance_attribute('psduMap', 'ns3::WifiPsduMap', is_const=False)
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo::txParams [variable]
+    cls.add_instance_attribute('txParams', 'ns3::WifiTxParameters', is_const=False)
+    return
+
+def register_Ns3MultiUserSchedulerUlMuInfo_methods(root_module, cls):
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::UlMuInfo() [constructor]
+    cls.add_constructor([])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::UlMuInfo(ns3::MultiUserScheduler::UlMuInfo const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MultiUserScheduler::UlMuInfo const &', 'arg0')])
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::tbPpduDuration [variable]
+    cls.add_instance_attribute('tbPpduDuration', 'ns3::Time', is_const=False)
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::trigger [variable]
+    cls.add_instance_attribute('trigger', 'ns3::Ptr< ns3::WifiMacQueueItem >', is_const=False)
+    ## multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo::txParams [variable]
+    cls.add_instance_attribute('txParams', 'ns3::WifiTxParameters', is_const=False)
+    return
+
+def register_Ns3NakagamiPropagationLossModel_methods(root_module, cls):
+    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::NakagamiPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## propagation-loss-model.h (module 'propagation'): ns3::NakagamiPropagationLossModel::NakagamiPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## propagation-loss-model.h (module 'propagation'): double ns3::NakagamiPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::NakagamiPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3HeSigHeader_methods(root_module, cls):
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader::HeSigHeader(ns3::HeSigHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HeSigHeader const &', 'arg0')])
-    ## wifi-phy-header.h (module 'wifi'): ns3::HeSigHeader::HeSigHeader() [constructor]
+def register_Ns3NetDevice_methods(root_module, cls):
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HeSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [constructor]
+    cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
+    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('AddLinkChangeCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetBroadcast() const [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Channel> ns3::NetDevice::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint32_t ns3::NetDevice::GetIfIndex() const [member function]
+    cls.add_method('GetIfIndex', 
                    'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetBssColor() const [member function]
-    cls.add_method('GetBssColor', 
-                   'uint8_t', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HeSigHeader::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint16_t ns3::NetDevice::GetMtu() const [member function]
+    cls.add_method('GetMtu', 
                    'uint16_t', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint16_t ns3::HeSigHeader::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'uint16_t', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv4Address', 'multicastGroup')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NetDevice::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): ns3::TypeId ns3::HeSigHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): static ns3::TypeId ns3::NetDevice::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetMcs() const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
+                   is_static=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBridge() const [member function]
+    cls.add_method('IsBridge', 
+                   'bool', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint8_t ns3::HeSigHeader::GetNStreams() const [member function]
-    cls.add_method('GetNStreams', 
-                   'uint8_t', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): uint32_t ns3::HeSigHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsLinkUp() const [member function]
+    cls.add_method('IsLinkUp', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): static ns3::TypeId ns3::HeSigHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## wifi-phy-header.h (module 'wifi'): bool ns3::HeSigHeader::IsLdpcCoding() const [member function]
-    cls.add_method('IsLdpcCoding', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsPointToPoint() const [member function]
+    cls.add_method('IsPointToPoint', 
                    'bool', 
                    [], 
-                   is_const=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetBssColor(uint8_t bssColor) [member function]
-    cls.add_method('SetBssColor', 
-                   'void', 
-                   [param('uint8_t', 'bssColor')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
-                   'void', 
-                   [param('uint16_t', 'channelWidth')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetCoding(bool ldpc) [member function]
-    cls.add_method('SetCoding', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::NeedsArp() const [member function]
+    cls.add_method('NeedsArp', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('SendFrom', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetAddress(ns3::Address address) [member function]
+    cls.add_method('SetAddress', 
                    'void', 
-                   [param('bool', 'ldpc')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetGuardIntervalAndLtfSize(uint16_t gi, uint8_t ltf) [member function]
-    cls.add_method('SetGuardIntervalAndLtfSize', 
+                   [param('ns3::Address', 'address')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetIfIndex(uint32_t const index) [member function]
+    cls.add_method('SetIfIndex', 
                    'void', 
-                   [param('uint16_t', 'gi'), param('uint8_t', 'ltf')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetMcs(uint8_t mcs) [member function]
-    cls.add_method('SetMcs', 
+                   [param('uint32_t const', 'index')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SetMtu(uint16_t const mtu) [member function]
+    cls.add_method('SetMtu', 
+                   'bool', 
+                   [param('uint16_t const', 'mtu')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
                    'void', 
-                   [param('uint8_t', 'mcs')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetMuFlag(bool mu) [member function]
-    cls.add_method('SetMuFlag', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetPromiscReceiveCallback(ns3::NetDevice::PromiscReceiveCallback cb) [member function]
+    cls.add_method('SetPromiscReceiveCallback', 
                    'void', 
-                   [param('bool', 'mu')])
-    ## wifi-phy-header.h (module 'wifi'): void ns3::HeSigHeader::SetNStreams(uint8_t nStreams) [member function]
-    cls.add_method('SetNStreams', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetReceiveCallback(ns3::NetDevice::ReceiveCallback cb) [member function]
+    cls.add_method('SetReceiveCallback', 
                    'void', 
-                   [param('uint8_t', 'nStreams')])
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3HtCapabilities_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities(ns3::HtCapabilities const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtCapabilities const &', 'arg0')])
-    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities() [constructor]
+def register_Ns3NeverLosChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::NeverLosChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::NeverLosChannelConditionModel::NeverLosChannelConditionModel() [constructor]
     cls.add_constructor([])
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::NeverLosChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetChannelCondition', 
+                   'ns3::Ptr< ns3::ChannelCondition >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True)
+    ## channel-condition-model.h (module 'propagation'): int64_t ns3::NeverLosChannelConditionModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
                    is_virtual=True)
-    ## ht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HtCapabilities::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    return
+
+def register_Ns3NeverLosVehicleChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::NeverLosVehicleChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::NeverLosVehicleChannelConditionModel::NeverLosVehicleChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::NeverLosVehicleChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetChannelCondition', 
+                   'ns3::Ptr< ns3::ChannelCondition >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
                    is_const=True, is_virtual=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAmpduParameters() const [member function]
-    cls.add_method('GetAmpduParameters', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAntennaSelectionCapabilities() const [member function]
-    cls.add_method('GetAntennaSelectionCapabilities', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetExtendedHtCapabilities() const [member function]
-    cls.add_method('GetExtendedHtCapabilities', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
-    cls.add_method('GetGreenfield', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetHtCapabilitiesInfo() const [member function]
-    cls.add_method('GetHtCapabilitiesInfo', 
-                   'uint16_t', 
+    ## channel-condition-model.h (module 'propagation'): int64_t ns3::NeverLosVehicleChannelConditionModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    return
+
+def register_Ns3NistErrorRateModel_methods(root_module, cls):
+    ## nist-error-rate-model.h (module 'wifi'): ns3::NistErrorRateModel::NistErrorRateModel(ns3::NistErrorRateModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::NistErrorRateModel const &', 'arg0')])
+    ## nist-error-rate-model.h (module 'wifi'): ns3::NistErrorRateModel::NistErrorRateModel() [constructor]
+    cls.add_constructor([])
+    ## nist-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::NistErrorRateModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
+                   is_static=True)
+    ## nist-error-rate-model.h (module 'wifi'): double ns3::NistErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector const & txVector, double snr, uint64_t nbits, uint8_t numRxAntennas, ns3::WifiPpduField field, uint16_t staId) const [member function]
+    cls.add_method('DoGetChunkSuccessRate', 
+                   'double', 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits'), param('uint8_t', 'numRxAntennas'), param('ns3::WifiPpduField', 'field'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3NixVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
+    cls.add_constructor([])
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector(ns3::NixVector const & o) [constructor]
+    cls.add_constructor([param('ns3::NixVector const &', 'o')])
+    ## nix-vector.h (module 'network'): void ns3::NixVector::AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits) [member function]
+    cls.add_method('AddNeighborIndex', 
+                   'void', 
+                   [param('uint32_t', 'newBits'), param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::BitCount(uint32_t numberOfNeighbors) const [member function]
+    cls.add_method('BitCount', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfNeighbors')], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
-    cls.add_method('GetLdpc', 
-                   'uint8_t', 
+    ## nix-vector.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::NixVector::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::NixVector >', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetMaxAmpduLength() const [member function]
-    cls.add_method('GetMaxAmpduLength', 
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::ExtractNeighborIndex(uint32_t numberOfBits) [member function]
+    cls.add_method('ExtractNeighborIndex', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    cls.add_method('GetRemainingBits', 
+                   'uint32_t', 
+                   [])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetMaxAmsduLength() const [member function]
-    cls.add_method('GetMaxAmsduLength', 
-                   'uint16_t', 
-                   [], 
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetRxHighestSupportedAntennas() const [member function]
-    cls.add_method('GetRxHighestSupportedAntennas', 
-                   'uint8_t', 
+    return
+
+def register_Ns3Node_methods(root_module, cls):
+    ## node.h (module 'network'): ns3::Node::Node(ns3::Node const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Node const &', 'arg0')])
+    ## node.h (module 'network'): ns3::Node::Node() [constructor]
+    cls.add_constructor([])
+    ## node.h (module 'network'): ns3::Node::Node(uint32_t systemId) [constructor]
+    cls.add_constructor([param('uint32_t', 'systemId')])
+    ## node.h (module 'network'): uint32_t ns3::Node::AddApplication(ns3::Ptr<ns3::Application> application) [member function]
+    cls.add_method('AddApplication', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::Application >', 'application')])
+    ## node.h (module 'network'): uint32_t ns3::Node::AddDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('AddDevice', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## node.h (module 'network'): static bool ns3::Node::ChecksumEnabled() [member function]
+    cls.add_method('ChecksumEnabled', 
+                   'bool', 
                    [], 
+                   is_static=True)
+    ## node.h (module 'network'): ns3::Ptr<ns3::Application> ns3::Node::GetApplication(uint32_t index) const [member function]
+    cls.add_method('GetApplication', 
+                   'ns3::Ptr< ns3::Application >', 
+                   [param('uint32_t', 'index')], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
+    ## node.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Node::GetDevice(uint32_t index) const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'index')], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval20() const [member function]
-    cls.add_method('GetShortGuardInterval20', 
-                   'uint8_t', 
+    ## node.h (module 'network'): uint32_t ns3::Node::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
-    cls.add_method('GetSupportedChannelWidth', 
-                   'uint8_t', 
+    ## node.h (module 'network'): ns3::Time ns3::Node::GetLocalTime() const [member function]
+    cls.add_method('GetLocalTime', 
+                   'ns3::Time', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint64_t ns3::HtCapabilities::GetSupportedMcsSet1() const [member function]
-    cls.add_method('GetSupportedMcsSet1', 
-                   'uint64_t', 
+    ## node.h (module 'network'): uint32_t ns3::Node::GetNApplications() const [member function]
+    cls.add_method('GetNApplications', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint64_t ns3::HtCapabilities::GetSupportedMcsSet2() const [member function]
-    cls.add_method('GetSupportedMcsSet2', 
-                   'uint64_t', 
+    ## node.h (module 'network'): uint32_t ns3::Node::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): uint32_t ns3::HtCapabilities::GetTxBfCapabilities() const [member function]
-    cls.add_method('GetTxBfCapabilities', 
+    ## node.h (module 'network'): uint32_t ns3::Node::GetSystemId() const [member function]
+    cls.add_method('GetSystemId', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) const [member function]
-    cls.add_method('IsSupportedMcs', 
-                   'bool', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## ht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::HtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAmpduParameters(uint8_t ctrl) [member function]
-    cls.add_method('SetAmpduParameters', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAntennaSelectionCapabilities(uint8_t ctrl) [member function]
-    cls.add_method('SetAntennaSelectionCapabilities', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetExtendedHtCapabilities(uint16_t ctrl) [member function]
-    cls.add_method('SetExtendedHtCapabilities', 
-                   'void', 
-                   [param('uint16_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
-    cls.add_method('SetGreenfield', 
-                   'void', 
-                   [param('uint8_t', 'greenfield')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtCapabilitiesInfo(uint16_t ctrl) [member function]
-    cls.add_method('SetHtCapabilitiesInfo', 
-                   'void', 
-                   [param('uint16_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtSupported(uint8_t htSupported) [member function]
-    cls.add_method('SetHtSupported', 
-                   'void', 
-                   [param('uint8_t', 'htSupported')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLSigProtectionSupport(uint8_t lSigProtection) [member function]
-    cls.add_method('SetLSigProtectionSupport', 
-                   'void', 
-                   [param('uint8_t', 'lSigProtection')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
-    cls.add_method('SetLdpc', 
-                   'void', 
-                   [param('uint8_t', 'ldpc')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmpduLength(uint32_t maxAmpduLength) [member function]
-    cls.add_method('SetMaxAmpduLength', 
-                   'void', 
-                   [param('uint32_t', 'maxAmpduLength')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetMaxAmsduLength(uint16_t maxAmsduLength) [member function]
-    cls.add_method('SetMaxAmsduLength', 
-                   'void', 
-                   [param('uint16_t', 'maxAmsduLength')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxHighestSupportedDataRate(uint16_t maxSupportedRate) [member function]
-    cls.add_method('SetRxHighestSupportedDataRate', 
-                   'void', 
-                   [param('uint16_t', 'maxSupportedRate')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
-    cls.add_method('SetRxMcsBitmask', 
-                   'void', 
-                   [param('uint8_t', 'index')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval20(uint8_t shortGuardInterval) [member function]
-    cls.add_method('SetShortGuardInterval20', 
-                   'void', 
-                   [param('uint8_t', 'shortGuardInterval')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval40(uint8_t shortGuardInterval) [member function]
-    cls.add_method('SetShortGuardInterval40', 
-                   'void', 
-                   [param('uint8_t', 'shortGuardInterval')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedChannelWidth) [member function]
-    cls.add_method('SetSupportedChannelWidth', 
-                   'void', 
-                   [param('uint8_t', 'supportedChannelWidth')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedMcsSet(uint64_t ctrl1, uint64_t ctrl2) [member function]
-    cls.add_method('SetSupportedMcsSet', 
+    ## node.h (module 'network'): static ns3::TypeId ns3::Node::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## node.h (module 'network'): void ns3::Node::RegisterDeviceAdditionListener(ns3::Node::DeviceAdditionListener listener) [member function]
+    cls.add_method('RegisterDeviceAdditionListener', 
                    'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxBfCapabilities(uint32_t ctrl) [member function]
-    cls.add_method('SetTxBfCapabilities', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
+    ## node.h (module 'network'): void ns3::Node::RegisterProtocolHandler(ns3::Node::ProtocolHandler handler, uint16_t protocolType, ns3::Ptr<ns3::NetDevice> device, bool promiscuous=false) [member function]
+    cls.add_method('RegisterProtocolHandler', 
                    'void', 
-                   [param('uint32_t', 'ctrl')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams) [member function]
-    cls.add_method('SetTxMaxNSpatialStreams', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler'), param('uint16_t', 'protocolType'), param('ns3::Ptr< ns3::NetDevice >', 'device'), param('bool', 'promiscuous', default_value='false')])
+    ## node.h (module 'network'): void ns3::Node::UnregisterDeviceAdditionListener(ns3::Node::DeviceAdditionListener listener) [member function]
+    cls.add_method('UnregisterDeviceAdditionListener', 
                    'void', 
-                   [param('uint8_t', 'maxTxSpatialStreams')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxMcsSetDefined(uint8_t txMcsSetDefined) [member function]
-    cls.add_method('SetTxMcsSetDefined', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
+    ## node.h (module 'network'): void ns3::Node::UnregisterProtocolHandler(ns3::Node::ProtocolHandler handler) [member function]
+    cls.add_method('UnregisterProtocolHandler', 
                    'void', 
-                   [param('uint8_t', 'txMcsSetDefined')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal) [member function]
-    cls.add_method('SetTxRxMcsSetUnequal', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler')])
+    ## node.h (module 'network'): void ns3::Node::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('uint8_t', 'txRxMcsSetUnequal')])
-    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetTxUnequalModulation(uint8_t txUnequalModulation) [member function]
-    cls.add_method('SetTxUnequalModulation', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## node.h (module 'network'): void ns3::Node::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('uint8_t', 'txUnequalModulation')])
+                   [], 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3NormalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::INFINITE_VALUE [variable]
+    cls.add_static_attribute('INFINITE_VALUE', 'double const', is_const=True)
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::NormalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::NormalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetVariance() const [member function]
+    cls.add_method('GetVariance', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue(double mean, double variance, double bound=ns3::NormalRandomVariable::INFINITE_VALUE) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'variance'), param('double', 'bound', default_value='ns3::NormalRandomVariable::INFINITE_VALUE')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger(uint32_t mean, uint32_t variance, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'variance'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
     return
 
-def register_Ns3HtConfiguration_methods(root_module, cls):
-    ## ht-configuration.h (module 'wifi'): ns3::HtConfiguration::HtConfiguration(ns3::HtConfiguration const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtConfiguration const &', 'arg0')])
-    ## ht-configuration.h (module 'wifi'): ns3::HtConfiguration::HtConfiguration() [constructor]
+def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
     cls.add_constructor([])
-    ## ht-configuration.h (module 'wifi'): bool ns3::HtConfiguration::GetGreenfieldSupported() const [member function]
-    cls.add_method('GetGreenfieldSupported', 
-                   'bool', 
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker(ns3::ObjectFactoryChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryChecker const &', 'arg0')])
+    return
+
+def register_Ns3ObjectFactoryValue_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactory const & value) [constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'value')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactoryValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryValue const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::ObjectFactoryValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True)
-    ## ht-configuration.h (module 'wifi'): bool ns3::HtConfiguration::GetLdpcSupported() const [member function]
-    cls.add_method('GetLdpcSupported', 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): bool ns3::ObjectFactoryValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
                    'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## object-factory.h (module 'core'): ns3::ObjectFactory ns3::ObjectFactoryValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::ObjectFactory', 
                    [], 
                    is_const=True)
-    ## ht-configuration.h (module 'wifi'): bool ns3::HtConfiguration::GetShortGuardIntervalSupported() const [member function]
-    cls.add_method('GetShortGuardIntervalSupported', 
-                   'bool', 
+    ## object-factory.h (module 'core'): std::string ns3::ObjectFactoryValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactoryValue::Set(ns3::ObjectFactory const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::ObjectFactory const &', 'value')])
+    return
+
+def register_Ns3OfdmPpdu_methods(root_module, cls):
+    ## ofdm-ppdu.h (module 'wifi'): ns3::OfdmPpdu::OfdmPpdu(ns3::OfdmPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::OfdmPpdu const &', 'arg0')])
+    ## ofdm-ppdu.h (module 'wifi'): ns3::OfdmPpdu::OfdmPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, uint64_t uid, bool instantiateLSig=true) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid'), param('bool', 'instantiateLSig', default_value='true')])
+    ## ofdm-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::OfdmPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
-                   is_const=True)
-    ## ht-configuration.h (module 'wifi'): static ns3::TypeId ns3::HtConfiguration::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_const=True, is_virtual=True)
+    ## ofdm-ppdu.h (module 'wifi'): ns3::Time ns3::OfdmPpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
                    [], 
-                   is_static=True)
-    ## ht-configuration.h (module 'wifi'): void ns3::HtConfiguration::SetGreenfieldSupported(bool enable) [member function]
-    cls.add_method('SetGreenfieldSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## ht-configuration.h (module 'wifi'): void ns3::HtConfiguration::SetLdpcSupported(bool enable) [member function]
-    cls.add_method('SetLdpcSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## ht-configuration.h (module 'wifi'): void ns3::HtConfiguration::SetShortGuardIntervalSupported(bool enable) [member function]
-    cls.add_method('SetShortGuardIntervalSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
+                   is_const=True, is_virtual=True)
+    ## ofdm-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::OfdmPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3HtOperation_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## ht-operation.h (module 'wifi'): ns3::HtOperation::HtOperation(ns3::HtOperation const & arg0) [constructor]
-    cls.add_constructor([param('ns3::HtOperation const &', 'arg0')])
-    ## ht-operation.h (module 'wifi'): ns3::HtOperation::HtOperation() [constructor]
+def register_Ns3OfdmPpduLSigHeader_methods(root_module, cls):
+    ## ofdm-ppdu.h (module 'wifi'): ns3::OfdmPpdu::LSigHeader::LSigHeader(ns3::OfdmPpdu::LSigHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::OfdmPpdu::LSigHeader const &', 'arg0')])
+    ## ofdm-ppdu.h (module 'wifi'): ns3::OfdmPpdu::LSigHeader::LSigHeader() [constructor]
     cls.add_constructor([])
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+    ## ofdm-ppdu.h (module 'wifi'): uint32_t ns3::OfdmPpdu::LSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
                    is_virtual=True)
-    ## ht-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::HtOperation::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    ## ofdm-ppdu.h (module 'wifi'): ns3::TypeId ns3::OfdmPpdu::LSigHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ht-operation.h (module 'wifi'): uint64_t ns3::HtOperation::GetBasicMcsSet1() const [member function]
-    cls.add_method('GetBasicMcsSet1', 
-                   'uint64_t', 
+    ## ofdm-ppdu.h (module 'wifi'): uint16_t ns3::OfdmPpdu::LSigHeader::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint64_t ns3::HtOperation::GetBasicMcsSet2() const [member function]
-    cls.add_method('GetBasicMcsSet2', 
+    ## ofdm-ppdu.h (module 'wifi'): uint64_t ns3::OfdmPpdu::LSigHeader::GetRate(uint16_t channelWidth=20) const [member function]
+    cls.add_method('GetRate', 
                    'uint64_t', 
-                   [], 
+                   [param('uint16_t', 'channelWidth', default_value='20')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetDualBeacon() const [member function]
-    cls.add_method('GetDualBeacon', 
-                   'uint8_t', 
+    ## ofdm-ppdu.h (module 'wifi'): uint32_t ns3::OfdmPpdu::LSigHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetDualCtsProtection() const [member function]
-    cls.add_method('GetDualCtsProtection', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## ofdm-ppdu.h (module 'wifi'): static ns3::TypeId ns3::OfdmPpdu::LSigHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetHtProtection() const [member function]
-    cls.add_method('GetHtProtection', 
-                   'uint8_t', 
+                   is_static=True)
+    ## ofdm-ppdu.h (module 'wifi'): void ns3::OfdmPpdu::LSigHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ofdm-ppdu.h (module 'wifi'): void ns3::OfdmPpdu::LSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ofdm-ppdu.h (module 'wifi'): void ns3::OfdmPpdu::LSigHeader::SetLength(uint16_t length) [member function]
+    cls.add_method('SetLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
+    ## ofdm-ppdu.h (module 'wifi'): void ns3::OfdmPpdu::LSigHeader::SetRate(uint64_t rate, uint16_t channelWidth=20) [member function]
+    cls.add_method('SetRate', 
+                   'void', 
+                   [param('uint64_t', 'rate'), param('uint16_t', 'channelWidth', default_value='20')])
+    return
+
+def register_Ns3OkumuraHataPropagationLossModel_methods(root_module, cls):
+    ## okumura-hata-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::OkumuraHataPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
+                   is_static=True)
+    ## okumura-hata-propagation-loss-model.h (module 'propagation'): ns3::OkumuraHataPropagationLossModel::OkumuraHataPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## okumura-hata-propagation-loss-model.h (module 'propagation'): double ns3::OkumuraHataPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetLoss', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
+    ## okumura-hata-propagation-loss-model.h (module 'propagation'): double ns3::OkumuraHataPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
+    cls.add_method('DoCalcRxPower', 
+                   'double', 
+                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## okumura-hata-propagation-loss-model.h (module 'propagation'): int64_t ns3::OkumuraHataPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3OnoeWifiManager_methods(root_module, cls):
+    ## onoe-wifi-manager.h (module 'wifi'): ns3::OnoeWifiManager::OnoeWifiManager(ns3::OnoeWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::OnoeWifiManager const &', 'arg0')])
+    ## onoe-wifi-manager.h (module 'wifi'): ns3::OnoeWifiManager::OnoeWifiManager() [constructor]
+    cls.add_constructor([])
+    ## onoe-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::OnoeWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetInformationSubset1() const [member function]
-    cls.add_method('GetInformationSubset1', 
-                   'uint8_t', 
+                   is_static=True)
+    ## onoe-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::OnoeWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True)
-    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetInformationSubset2() const [member function]
-    cls.add_method('GetInformationSubset2', 
-                   'uint16_t', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::OnoeWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::OnoeWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3OutputStreamWrapper_methods(root_module, cls):
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(ns3::OutputStreamWrapper const & arg0) [constructor]
+    cls.add_constructor([param('ns3::OutputStreamWrapper const &', 'arg0')])
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(std::string filename, std::ios_base::openmode filemode) [constructor]
+    cls.add_constructor([param('std::string', 'filename'), param('std::ios_base::openmode', 'filemode')])
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(std::ostream * os) [constructor]
+    cls.add_constructor([param('std::ostream *', 'os')])
+    ## output-stream-wrapper.h (module 'network'): std::ostream * ns3::OutputStreamWrapper::GetStream() [member function]
+    cls.add_method('GetStream', 
+                   'std::ostream *', 
+                   [])
+    return
+
+def register_Ns3Packet_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
+    cls.add_constructor([])
+    ## packet.h (module 'network'): ns3::Packet::Packet(ns3::Packet const & o) [constructor]
+    cls.add_constructor([param('ns3::Packet const &', 'o')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint32_t size) [constructor]
+    cls.add_constructor([param('uint32_t', 'size')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size, bool magic) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size'), param('bool', 'magic')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddAtEnd(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddByteTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetInformationSubset3() const [member function]
-    cls.add_method('GetInformationSubset3', 
-                   'uint16_t', 
-                   [], 
+    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag, uint32_t start, uint32_t end) const [member function]
+    cls.add_method('AddByteTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag'), param('uint32_t', 'start'), param('uint32_t', 'end')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetLSigTxopProtectionFullSupport() const [member function]
-    cls.add_method('GetLSigTxopProtectionFullSupport', 
-                   'uint8_t', 
-                   [], 
+    ## packet.h (module 'network'): void ns3::Packet::AddHeader(ns3::Header const & header) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header')])
+    ## packet.h (module 'network'): void ns3::Packet::AddPacketTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddPacketTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetNonGfHtStasPresent() const [member function]
-    cls.add_method('GetNonGfHtStasPresent', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): void ns3::Packet::AddPaddingAtEnd(uint32_t size) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddTrailer(ns3::Trailer const & trailer) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer')])
+    ## packet.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::Packet::BeginItem() const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetObssNonHtStasPresent() const [member function]
-    cls.add_method('GetObssNonHtStasPresent', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::Packet >', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetPcoActive() const [member function]
-    cls.add_method('GetPcoActive', 
-                   'uint8_t', 
-                   [], 
+    ## packet.h (module 'network'): uint32_t ns3::Packet::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetPhase() const [member function]
-    cls.add_method('GetPhase', 
-                   'uint8_t', 
-                   [], 
+    ## packet.h (module 'network'): void ns3::Packet::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetPrimaryChannel() const [member function]
-    cls.add_method('GetPrimaryChannel', 
-                   'uint8_t', 
-                   [], 
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetRifsMode() const [member function]
-    cls.add_method('GetRifsMode', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): static void ns3::Packet::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetRxHighestSupportedDataRate() const [member function]
-    cls.add_method('GetRxHighestSupportedDataRate', 
-                   'uint16_t', 
+                   is_static=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnablePrinting() [member function]
+    cls.add_method('EnablePrinting', 
+                   'void', 
                    [], 
+                   is_static=True)
+    ## packet.h (module 'network'): bool ns3::Packet::FindFirstMatchingByteTag(ns3::Tag & tag) const [member function]
+    cls.add_method('FindFirstMatchingByteTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetSecondaryChannelOffset() const [member function]
-    cls.add_method('GetSecondaryChannelOffset', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): ns3::ByteTagIterator ns3::Packet::GetByteTagIterator() const [member function]
+    cls.add_method('GetByteTagIterator', 
+                   'ns3::ByteTagIterator', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint16_t ns3::HtOperation::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
+    ## packet.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::Packet::GetNixVector() const [member function]
+    cls.add_method('GetNixVector', 
+                   'ns3::Ptr< ns3::NixVector >', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetStaChannelWidth() const [member function]
-    cls.add_method('GetStaChannelWidth', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): ns3::PacketTagIterator ns3::Packet::GetPacketTagIterator() const [member function]
+    cls.add_method('GetPacketTagIterator', 
+                   'ns3::PacketTagIterator', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetStbcBeacon() const [member function]
-    cls.add_method('GetStbcBeacon', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxMaxNSpatialStreams() const [member function]
-    cls.add_method('GetTxMaxNSpatialStreams', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxMcsSetDefined() const [member function]
-    cls.add_method('GetTxMcsSetDefined', 
-                   'uint8_t', 
+    ## packet.h (module 'network'): uint64_t ns3::Packet::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
                    [], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxRxMcsSetUnequal() const [member function]
-    cls.add_method('GetTxRxMcsSetUnequal', 
-                   'uint8_t', 
-                   [], 
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
+    cls.add_method('PeekHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): uint8_t ns3::HtOperation::GetTxUnequalModulation() const [member function]
-    cls.add_method('GetTxUnequalModulation', 
-                   'uint8_t', 
-                   [], 
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header, uint32_t size) const [member function]
+    cls.add_method('PeekHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header'), param('uint32_t', 'size')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): bool ns3::HtOperation::IsSupportedMcs(uint8_t mcs) const [member function]
-    cls.add_method('IsSupportedMcs', 
+    ## packet.h (module 'network'): bool ns3::Packet::PeekPacketTag(ns3::Tag & tag) const [member function]
+    cls.add_method('PeekPacketTag', 
                    'bool', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## ht-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::HtOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+                   [param('ns3::Tag &', 'tag')], 
                    is_const=True)
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetBasicMcsSet(uint64_t ctrl1, uint64_t ctrl2) [member function]
-    cls.add_method('SetBasicMcsSet', 
-                   'void', 
-                   [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetDualBeacon(uint8_t dualBeacon) [member function]
-    cls.add_method('SetDualBeacon', 
-                   'void', 
-                   [param('uint8_t', 'dualBeacon')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetDualCtsProtection(uint8_t dualCtsProtection) [member function]
-    cls.add_method('SetDualCtsProtection', 
-                   'void', 
-                   [param('uint8_t', 'dualCtsProtection')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetHtProtection(uint8_t htProtection) [member function]
-    cls.add_method('SetHtProtection', 
-                   'void', 
-                   [param('uint8_t', 'htProtection')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetHtSupported(uint8_t htSupported) [member function]
-    cls.add_method('SetHtSupported', 
-                   'void', 
-                   [param('uint8_t', 'htSupported')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetInformationSubset1(uint8_t ctrl) [member function]
-    cls.add_method('SetInformationSubset1', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetInformationSubset2(uint16_t ctrl) [member function]
-    cls.add_method('SetInformationSubset2', 
-                   'void', 
-                   [param('uint16_t', 'ctrl')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetInformationSubset3(uint16_t ctrl) [member function]
-    cls.add_method('SetInformationSubset3', 
-                   'void', 
-                   [param('uint16_t', 'ctrl')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetLSigTxopProtectionFullSupport(uint8_t lSigTxopProtectionFullSupport) [member function]
-    cls.add_method('SetLSigTxopProtectionFullSupport', 
-                   'void', 
-                   [param('uint8_t', 'lSigTxopProtectionFullSupport')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetNonGfHtStasPresent(uint8_t nonGfHtStasPresent) [member function]
-    cls.add_method('SetNonGfHtStasPresent', 
-                   'void', 
-                   [param('uint8_t', 'nonGfHtStasPresent')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetObssNonHtStasPresent(uint8_t obssNonHtStasPresent) [member function]
-    cls.add_method('SetObssNonHtStasPresent', 
-                   'void', 
-                   [param('uint8_t', 'obssNonHtStasPresent')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetPcoActive(uint8_t pcoActive) [member function]
-    cls.add_method('SetPcoActive', 
-                   'void', 
-                   [param('uint8_t', 'pcoActive')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetPhase(uint8_t pcoPhase) [member function]
-    cls.add_method('SetPhase', 
-                   'void', 
-                   [param('uint8_t', 'pcoPhase')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetPrimaryChannel(uint8_t ctrl) [member function]
-    cls.add_method('SetPrimaryChannel', 
-                   'void', 
-                   [param('uint8_t', 'ctrl')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetRifsMode(uint8_t rifsMode) [member function]
-    cls.add_method('SetRifsMode', 
-                   'void', 
-                   [param('uint8_t', 'rifsMode')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetRxHighestSupportedDataRate(uint16_t maxSupportedRate) [member function]
-    cls.add_method('SetRxHighestSupportedDataRate', 
-                   'void', 
-                   [param('uint16_t', 'maxSupportedRate')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetRxMcsBitmask(uint8_t index) [member function]
-    cls.add_method('SetRxMcsBitmask', 
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('PeekTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): void ns3::Packet::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('uint8_t', 'index')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetSecondaryChannelOffset(uint8_t secondaryChannelOffset) [member function]
-    cls.add_method('SetSecondaryChannelOffset', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintByteTags(std::ostream & os) const [member function]
+    cls.add_method('PrintByteTags', 
                    'void', 
-                   [param('uint8_t', 'secondaryChannelOffset')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetStaChannelWidth(uint8_t staChannelWidth) [member function]
-    cls.add_method('SetStaChannelWidth', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintPacketTags(std::ostream & os) const [member function]
+    cls.add_method('PrintPacketTags', 
                    'void', 
-                   [param('uint8_t', 'staChannelWidth')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetStbcBeacon(uint8_t stbcBeacon) [member function]
-    cls.add_method('SetStbcBeacon', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllByteTags() [member function]
+    cls.add_method('RemoveAllByteTags', 
                    'void', 
-                   [param('uint8_t', 'stbcBeacon')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams) [member function]
-    cls.add_method('SetTxMaxNSpatialStreams', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllPacketTags() [member function]
+    cls.add_method('RemoveAllPacketTags', 
                    'void', 
-                   [param('uint8_t', 'maxTxSpatialStreams')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxMcsSetDefined(uint8_t txMcsSetDefined) [member function]
-    cls.add_method('SetTxMcsSetDefined', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtEnd(uint32_t size) [member function]
+    cls.add_method('RemoveAtEnd', 
                    'void', 
-                   [param('uint8_t', 'txMcsSetDefined')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal) [member function]
-    cls.add_method('SetTxRxMcsSetUnequal', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtStart(uint32_t size) [member function]
+    cls.add_method('RemoveAtStart', 
                    'void', 
-                   [param('uint8_t', 'txRxMcsSetUnequal')])
-    ## ht-operation.h (module 'wifi'): void ns3::HtOperation::SetTxUnequalModulation(uint8_t txUnequalModulation) [member function]
-    cls.add_method('SetTxUnequalModulation', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header) [member function]
+    cls.add_method('RemoveHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header, uint32_t size) [member function]
+    cls.add_method('RemoveHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header'), param('uint32_t', 'size')])
+    ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('RemovePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('ReplacePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
+    cls.add_method('SetNixVector', 
                    'void', 
-                   [param('uint8_t', 'txUnequalModulation')])
+                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
+    ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
+    cls.add_method('ToString', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
     return
 
-def register_Ns3IdealWifiManager_methods(root_module, cls):
-    ## ideal-wifi-manager.h (module 'wifi'): ns3::IdealWifiManager::IdealWifiManager(ns3::IdealWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::IdealWifiManager const &', 'arg0')])
-    ## ideal-wifi-manager.h (module 'wifi'): ns3::IdealWifiManager::IdealWifiManager() [constructor]
+def register_Ns3ParetoRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ParetoRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable::ParetoRandomVariable() [constructor]
     cls.add_constructor([])
-    ## ideal-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::IdealWifiManager::GetTypeId() [member function]
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetScale() const [member function]
+    cls.add_method('GetScale', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue(double scale, double shape, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3ParfWifiManager_methods(root_module, cls):
+    ## parf-wifi-manager.h (module 'wifi'): ns3::ParfWifiManager::ParfWifiManager(ns3::ParfWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ParfWifiManager const &', 'arg0')])
+    ## parf-wifi-manager.h (module 'wifi'): ns3::ParfWifiManager::ParfWifiManager() [constructor]
+    cls.add_constructor([])
+    ## parf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ParfWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
     cls.add_method('SetupPhy', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
                    is_virtual=True)
-    ## ideal-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::IdealWifiManager::DoCreateStation() const [member function]
+    ## parf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ParfWifiManager::DoCreateStation() const [member function]
     cls.add_method('DoCreateStation', 
                    'ns3::WifiRemoteStation *', 
                    [], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::IdealWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ParfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoGetDataTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::IdealWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ParfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoGetRtsTxVector', 
                    'ns3::WifiTxVector', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoInitialize() [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportAmpduTxStatus', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportDataFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
     cls.add_method('DoReportDataOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportFinalDataFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
     cls.add_method('DoReportRtsFailed', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
     cls.add_method('DoReportRtsOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
                    is_virtual=True, visibility='private')
-    ## ideal-wifi-manager.h (module 'wifi'): void ns3::IdealWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
     cls.add_method('DoReportRxOk', 
                    'void', 
                    [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3IntegerValue_methods(root_module, cls):
-    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue() [constructor]
+def register_Ns3PhyEntity_methods(root_module, cls):
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyEntity() [constructor]
     cls.add_constructor([])
-    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(int64_t const & value) [constructor]
-    cls.add_constructor([param('int64_t const &', 'value')])
-    ## integer.h (module 'core'): ns3::IntegerValue::IntegerValue(ns3::IntegerValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::IntegerValue const &', 'arg0')])
-    ## integer.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::IntegerValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## integer.h (module 'core'): bool ns3::IntegerValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyEntity(ns3::PhyEntity const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::PhyEntity::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
                    is_virtual=True)
-    ## integer.h (module 'core'): int64_t ns3::IntegerValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'int64_t', 
-                   [], 
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::CalculatePhyPreambleAndHeaderDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('CalculatePhyPreambleAndHeaderDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
                    is_const=True)
-    ## integer.h (module 'core'): std::string ns3::IntegerValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) const [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_const=True, is_virtual=True)
-    ## integer.h (module 'core'): void ns3::IntegerValue::Set(int64_t const & value) [member function]
-    cls.add_method('Set', 
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::CancelAllEvents() [member function]
+    cls.add_method('CancelAllEvents', 
                    'void', 
-                   [param('int64_t const &', 'value')])
-    return
-
-def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
-    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
-    cls.add_constructor([])
-    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker(ns3::Ipv4AddressChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4AddressChecker const &', 'arg0')])
-    return
-
-def register_Ns3Ipv4AddressValue_methods(root_module, cls):
-    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue() [constructor]
-    cls.add_constructor([])
-    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4Address const & value) [constructor]
-    cls.add_constructor([param('ns3::Ipv4Address const &', 'value')])
-    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4AddressValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4AddressValue const &', 'arg0')])
-    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4AddressValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4AddressValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Ipv4Address', 
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::CancelRunningEndPreambleDetectionEvents(bool clear=false) [member function]
+    cls.add_method('CancelRunningEndPreambleDetectionEvents', 
+                   'void', 
+                   [param('bool', 'clear', default_value='false')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceiveField', 
+                   'void', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::PhyEntity::GetAddressedPsduInPpdu(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetAddressedPsduInPpdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetDurationUpToField(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDurationUpToField', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint32_t ns3::PhyEntity::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
                    [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiMode ns3::PhyEntity::GetMcs(uint8_t index) const [member function]
+    cls.add_method('GetMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiPpduField ns3::PhyEntity::GetNextField(ns3::WifiPpduField currentField, ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetNextField', 
+                   'ns3::WifiPpduField', 
+                   [param('ns3::WifiPpduField', 'currentField'), param('ns3::WifiPreamble', 'preamble')], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+    ## phy-entity.h (module 'wifi'): uint8_t ns3::PhyEntity::GetNumModes() const [member function]
+    cls.add_method('GetNumModes', 
+                   'uint8_t', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## ipv4-address.h (module 'network'): void ns3::Ipv4AddressValue::Set(ns3::Ipv4Address const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::Ipv4Address const &', 'value')])
-    return
-
-def register_Ns3Ipv4MaskChecker_methods(root_module, cls):
-    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker() [constructor]
-    cls.add_constructor([])
-    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker(ns3::Ipv4MaskChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4MaskChecker const &', 'arg0')])
-    return
-
-def register_Ns3Ipv4MaskValue_methods(root_module, cls):
-    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue() [constructor]
-    cls.add_constructor([])
-    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4Mask const & value) [constructor]
-    cls.add_constructor([param('ns3::Ipv4Mask const &', 'value')])
-    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4MaskValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4MaskValue const &', 'arg0')])
-    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4MaskValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) const [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyHeaderSections ns3::PhyEntity::GetPhyHeaderSections(ns3::WifiTxVector const & txVector, ns3::Time ppduStart) const [member function]
+    cls.add_method('GetPhyHeaderSections', 
+                   'ns3::PhyEntity::PhyHeaderSections', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduStart')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): ns3::Time ns3::PhyEntity::GetRemainingDurationAfterField(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiPpduField field) const [member function]
+    cls.add_method('GetRemainingDurationAfterField', 
+                   'ns3::Time', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiPpduField', 'field')], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetRxChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetRxChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiMode ns3::PhyEntity::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetStaId(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): ns3::WifiConstPsduMap ns3::PhyEntity::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::HandlesMcsModes() const [member function]
+    cls.add_method('HandlesMcsModes', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4MaskValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsMcsSupported(uint8_t index) const [member function]
+    cls.add_method('IsMcsSupported', 
+                   'bool', 
+                   [param('uint8_t', 'index')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsModeSupported(ns3::WifiMode mode) const [member function]
+    cls.add_method('IsModeSupported', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_const=True, is_virtual=True)
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::NoEndPreambleDetectionEvents() const [member function]
+    cls.add_method('NoEndPreambleDetectionEvents', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::SetOwner(ns3::Ptr<ns3::WifiPhy> wifiPhy) [member function]
+    cls.add_method('SetOwner', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'wifiPhy')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceiveField', 
+                   'void', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')])
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreamble', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')], 
                    is_virtual=True)
-    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask ns3::Ipv4MaskValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Ipv4Mask', 
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_virtual=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::Transmit(ns3::Time txDuration, ns3::Ptr<ns3::WifiPpdu> ppdu, std::string type) [member function]
+    cls.add_method('Transmit', 
+                   'void', 
+                   [param('ns3::Time', 'txDuration'), param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::string', 'type')])
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::begin() const [member function]
+    cls.add_method('begin', 
+                   'std::list< ns3::WifiMode > const_iterator', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4MaskValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## ipv4-address.h (module 'network'): void ns3::Ipv4MaskValue::Set(ns3::Ipv4Mask const & value) [member function]
-    cls.add_method('Set', 
+    ## phy-entity.h (module 'wifi'): std::list<ns3::WifiMode, std::allocator<ns3::WifiMode> >::const_iterator ns3::PhyEntity::end() const [member function]
+    cls.add_method('end', 
+                   'std::list< ns3::WifiMode > const_iterator', 
+                   [], 
+                   is_const=True)
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::AbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('AbortCurrentReception', 
                    'void', 
-                   [param('ns3::Ipv4Mask const &', 'value')])
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::AddPreambleEvent(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('AddPreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::PhyEntity::CreateInterferenceEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiTxVector const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [member function]
+    cls.add_method('CreateInterferenceEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoAbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('DoAbortCurrentReception', 
+                   'void', 
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::PhyEntity::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoEndReceivePayload(ns3::Ptr<const ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('DoEndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::PhyEntity::DoEndReceivePreamble(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceivePreamble', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::PhyEntity::DoGetEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    cls.add_method('DoGetEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::DoStartReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceiveField', 
+                   'bool', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DoStartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::DropPreambleEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::WifiPhyRxfailureReason reason, ns3::Time endRx, uint16_t measurementChannelWidth) [member function]
+    cls.add_method('DropPreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiPhyRxfailureReason', 'reason'), param('ns3::Time', 'endRx'), param('uint16_t', 'measurementChannelWidth')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndOfMpdu(ns3::Ptr<ns3::Event> event, ns3::Ptr<const ns3::WifiPsdu> psdu, size_t mpduIndex, ns3::Time relativeStart, ns3::Time mpduDuration) [member function]
+    cls.add_method('EndOfMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('size_t', 'mpduIndex'), param('ns3::Time', 'relativeStart'), param('ns3::Time', 'mpduDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::EndPreambleDetectionPeriod(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndPreambleDetectionPeriod', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ErasePreambleEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::Time rxDuration) [member function]
+    cls.add_method('ErasePreambleEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::Time', 'rxDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetCenterFrequencyForChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetCenterFrequencyForChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::PhyEntity::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetChannelWidthAndBand', 
+                   'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<const ns3::Event> ns3::PhyEntity::GetCurrentEvent() const [member function]
+    cls.add_method('GetCurrentEvent', 
+                   'ns3::Ptr< ns3::Event const >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::map<std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event>, std::less<std::pair<unsigned long, ns3::WifiPreamble> >, std::allocator<std::pair<const std::pair<unsigned long, ns3::WifiPreamble>, ns3::Ptr<ns3::Event> > > > const & ns3::PhyEntity::GetCurrentPreambleEvents() const [member function]
+    cls.add_method('GetCurrentPreambleEvents', 
+                   'std::map< std::pair< unsigned long, ns3::WifiPreamble >, ns3::Ptr< ns3::Event > > const &', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint16_t ns3::PhyEntity::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer ns3::PhyEntity::GetPhyHeaderSnrPer(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) const [member function]
+    cls.add_method('GetPhyHeaderSnrPer', 
+                   'ns3::PhyEntity::SnrPer', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::PhyEntity::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): double ns3::PhyEntity::GetRandomValue() const [member function]
+    cls.add_method('GetRandomValue', 
+                   'double', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::pair<bool, ns3::SignalNoiseDbm> ns3::PhyEntity::GetReceptionStatus(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::Ptr<ns3::Event> event, uint16_t staId, ns3::Time relativeMpduStart, ns3::Time mpduDuration) [member function]
+    cls.add_method('GetReceptionStatus', 
+                   'std::pair< bool, ns3::SignalNoiseDbm >', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::Ptr< ns3::Event >', 'event'), param('uint16_t', 'staId'), param('ns3::Time', 'relativeMpduStart'), param('ns3::Time', 'mpduDuration')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): double ns3::PhyEntity::GetRxPowerWForPpdu(ns3::Ptr<ns3::Event> event) const [member function]
+    cls.add_method('GetRxPowerWForPpdu', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): std::tuple<double, double, double> ns3::PhyEntity::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::PhyEntity::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): bool ns3::PhyEntity::IsConfigSupported(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsConfigSupported', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::NotifyInterferenceRxEndAndClear(bool reset) [member function]
+    cls.add_method('NotifyInterferenceRxEndAndClear', 
+                   'void', 
+                   [param('bool', 'reset')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): uint64_t ns3::PhyEntity::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('ObtainNextUid', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::ScheduleEndOfMpdus(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('ScheduleEndOfMpdus', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartPreambleDetectionPeriod(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartPreambleDetectionPeriod', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::StartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::UpdateInterferenceEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    cls.add_method('UpdateInterferenceEvent', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')], 
+                   visibility='protected')
     return
 
-def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
-    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
-    cls.add_constructor([])
-    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker(ns3::Ipv6AddressChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv6AddressChecker const &', 'arg0')])
+def register_Ns3PhyEntityPhyFieldRxStatus_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(ns3::PhyEntity::PhyFieldRxStatus const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity::PhyFieldRxStatus const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(bool s) [constructor]
+    cls.add_constructor([param('bool', 's')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::PhyFieldRxStatus(bool s, ns3::WifiPhyRxfailureReason r, ns3::PhyEntity::PhyRxFailureAction a) [constructor]
+    cls.add_constructor([param('bool', 's'), param('ns3::WifiPhyRxfailureReason', 'r'), param('ns3::PhyEntity::PhyRxFailureAction', 'a')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::actionIfFailure [variable]
+    cls.add_instance_attribute('actionIfFailure', 'ns3::PhyEntity::PhyRxFailureAction', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::isSuccess [variable]
+    cls.add_instance_attribute('isSuccess', 'bool', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus::reason [variable]
+    cls.add_instance_attribute('reason', 'ns3::WifiPhyRxfailureReason', is_const=False)
+    return
+
+def register_Ns3PhyEntitySnrPer_methods(root_module, cls):
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer(ns3::PhyEntity::SnrPer const & arg0) [constructor]
+    cls.add_constructor([param('ns3::PhyEntity::SnrPer const &', 'arg0')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer() [constructor]
+    cls.add_constructor([])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::SnrPer(double s, double p) [constructor]
+    cls.add_constructor([param('double', 's'), param('double', 'p')])
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::per [variable]
+    cls.add_instance_attribute('per', 'double', is_const=False)
+    ## phy-entity.h (module 'wifi'): ns3::PhyEntity::SnrPer::snr [variable]
+    cls.add_instance_attribute('snr', 'double', is_const=False)
     return
 
-def register_Ns3Ipv6AddressValue_methods(root_module, cls):
-    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue() [constructor]
+def register_Ns3QosBlockedDestinations_methods(root_module, cls):
+    ## qos-blocked-destinations.h (module 'wifi'): ns3::QosBlockedDestinations::QosBlockedDestinations(ns3::QosBlockedDestinations const & arg0) [constructor]
+    cls.add_constructor([param('ns3::QosBlockedDestinations const &', 'arg0')])
+    ## qos-blocked-destinations.h (module 'wifi'): ns3::QosBlockedDestinations::QosBlockedDestinations() [constructor]
     cls.add_constructor([])
-    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6Address const & value) [constructor]
-    cls.add_constructor([param('ns3::Ipv6Address const &', 'value')])
-    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6AddressValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv6AddressValue const &', 'arg0')])
-    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6AddressValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+    ## qos-blocked-destinations.h (module 'wifi'): void ns3::QosBlockedDestinations::Block(ns3::Mac48Address dest, uint8_t tid) [member function]
+    cls.add_method('Block', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'dest'), param('uint8_t', 'tid')])
+    ## qos-blocked-destinations.h (module 'wifi'): bool ns3::QosBlockedDestinations::IsBlocked(ns3::Mac48Address dest, uint8_t tid) const [member function]
+    cls.add_method('IsBlocked', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6AddressValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Ipv6Address', 
-                   [], 
+                   [param('ns3::Mac48Address', 'dest'), param('uint8_t', 'tid')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## ipv6-address.h (module 'network'): void ns3::Ipv6AddressValue::Set(ns3::Ipv6Address const & value) [member function]
-    cls.add_method('Set', 
+    ## qos-blocked-destinations.h (module 'wifi'): void ns3::QosBlockedDestinations::Unblock(ns3::Mac48Address dest, uint8_t tid) [member function]
+    cls.add_method('Unblock', 
                    'void', 
-                   [param('ns3::Ipv6Address const &', 'value')])
-    return
-
-def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
-    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
-    cls.add_constructor([])
-    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker(ns3::Ipv6PrefixChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv6PrefixChecker const &', 'arg0')])
+                   [param('ns3::Mac48Address', 'dest'), param('uint8_t', 'tid')])
     return
 
-def register_Ns3Ipv6PrefixValue_methods(root_module, cls):
-    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue() [constructor]
+def register_Ns3QosFrameExchangeManager_methods(root_module, cls):
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::QosFrameExchangeManager::QosFrameExchangeManager(ns3::QosFrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::QosFrameExchangeManager const &', 'arg0')])
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::QosFrameExchangeManager::QosFrameExchangeManager() [constructor]
     cls.add_constructor([])
-    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6Prefix const & value) [constructor]
-    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'value')])
-    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6PrefixValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv6PrefixValue const &', 'arg0')])
-    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6PrefixValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## qos-frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::QosFrameExchangeManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
+                   is_static=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::IsWithinLimitsIfAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams, ns3::Time ppduDurationLimit) const [member function]
+    cls.add_method('IsWithinLimitsIfAddMpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Time', 'ppduDurationLimit')], 
                    is_const=True, is_virtual=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6PrefixValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::IsWithinSizeAndTimeLimits(uint32_t ppduPayloadSize, ns3::Mac48Address receiver, ns3::WifiTxParameters const & txParams, ns3::Time ppduDurationLimit) const [member function]
+    cls.add_method('IsWithinSizeAndTimeLimits', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [param('uint32_t', 'ppduPayloadSize'), param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Time', 'ppduDurationLimit')], 
+                   is_const=True, is_virtual=True)
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::StartTransmission(ns3::Ptr<ns3::Txop> edca) [member function]
+    cls.add_method('StartTransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Txop >', 'edca')], 
                    is_virtual=True)
-    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix ns3::Ipv6PrefixValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Ipv6Prefix', 
-                   [], 
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime) const [member function]
+    cls.add_method('TryAddMpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6PrefixValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## ipv6-address.h (module 'network'): void ns3::Ipv6PrefixValue::Set(ns3::Ipv6Prefix const & value) [member function]
-    cls.add_method('Set', 
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('ns3::Ipv6Prefix const &', 'value')])
-    return
-
-def register_Ns3ItuR1411LosPropagationLossModel_methods(root_module, cls):
-    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ItuR1411LosPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): ns3::ItuR1411LosPropagationLossModel::ItuR1411LosPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): void ns3::ItuR1411LosPropagationLossModel::SetFrequency(double freq) [member function]
-    cls.add_method('SetFrequency', 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::QosFrameExchangeManager::GetCtsToSelfDurationId(ns3::WifiTxVector const & ctsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetCtsToSelfDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'ctsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::QosFrameExchangeManager::GetFrameDurationId(ns3::WifiMacHeader const & header, uint32_t size, ns3::WifiTxParameters const & txParams, ns3::Ptr<ns3::Packet> fragmentedPacket) const [member function]
+    cls.add_method('GetFrameDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiMacHeader const &', 'header'), param('uint32_t', 'size'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Ptr< ns3::Packet >', 'fragmentedPacket')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::QosFrameExchangeManager::GetRtsDurationId(ns3::WifiTxVector const & rtsTxVector, ns3::Time txDuration, ns3::Time response) const [member function]
+    cls.add_method('GetRtsDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'rtsTxVector'), param('ns3::Time', 'txDuration'), param('ns3::Time', 'response')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::PifsRecovery() [member function]
+    cls.add_method('PifsRecovery', 
                    'void', 
-                   [param('double', 'freq')])
-    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411LosPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetLoss', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True)
-    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411LosPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## itu-r-1411-los-propagation-loss-model.h (module 'propagation'): int64_t ns3::ItuR1411LosPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3ItuR1411NlosOverRooftopPropagationLossModel_methods(root_module, cls):
-    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ItuR1411NlosOverRooftopPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): ns3::ItuR1411NlosOverRooftopPropagationLossModel::ItuR1411NlosOverRooftopPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): void ns3::ItuR1411NlosOverRooftopPropagationLossModel::SetFrequency(double freq) [member function]
-    cls.add_method('SetFrequency', 
+                   visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::PreProcessFrame(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('PreProcessFrame', 
                    'void', 
-                   [param('double', 'freq')])
-    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411NlosOverRooftopPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetLoss', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True)
-    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): double ns3::ItuR1411NlosOverRooftopPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## itu-r-1411-nlos-over-rooftop-propagation-loss-model.h (module 'propagation'): int64_t ns3::ItuR1411NlosOverRooftopPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::ReceiveMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector const & txVector, bool inAmpdu) [member function]
+    cls.add_method('ReceiveMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::SendCfEndIfNeeded() [member function]
+    cls.add_method('SendCfEndIfNeeded', 
+                   'bool', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::SetTxopHolder(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('SetTxopHolder', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::StartFrameExchange(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('StartFrameExchange', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): bool ns3::QosFrameExchangeManager::StartTransmission(ns3::Ptr<ns3::QosTxop> edca, ns3::Time txopDuration) [member function]
+    cls.add_method('StartTransmission', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'txopDuration')], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::TransmissionFailed() [member function]
+    cls.add_method('TransmissionFailed', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::TransmissionSucceeded() [member function]
+    cls.add_method('TransmissionSucceeded', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
-def register_Ns3JakesProcess_methods(root_module, cls):
-    ## jakes-process.h (module 'propagation'): ns3::JakesProcess::JakesProcess(ns3::JakesProcess const & arg0) [constructor]
-    cls.add_constructor([param('ns3::JakesProcess const &', 'arg0')])
-    ## jakes-process.h (module 'propagation'): ns3::JakesProcess::JakesProcess() [constructor]
+def register_Ns3QosTxop_methods(root_module, cls):
+    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::QosTxop const & arg0) [constructor]
+    cls.add_constructor([param('ns3::QosTxop const &', 'arg0')])
+    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop() [constructor]
     cls.add_constructor([])
-    ## jakes-process.h (module 'propagation'): void ns3::JakesProcess::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AddBaResponseTimeout(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('AddBaResponseTimeout', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AssignSequenceNumber(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('AssignSequenceNumber', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteMpduTx(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('CompleteMpduTx', 
                    'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## qos-txop.h (module 'wifi'): ns3::AcIndex ns3::QosTxop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
                    [], 
-                   is_virtual=True)
-    ## jakes-process.h (module 'propagation'): double ns3::JakesProcess::GetChannelGainDb() const [member function]
-    cls.add_method('GetChannelGainDb', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetAddBaResponseTimeout() const [member function]
+    cls.add_method('GetAddBaResponseTimeout', 
+                   'ns3::Time', 
                    [], 
                    is_const=True)
-    ## jakes-process.h (module 'propagation'): std::complex<double> ns3::JakesProcess::GetComplexGain() const [member function]
-    cls.add_method('GetComplexGain', 
-                   'std::complex< double >', 
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetBaAgreementEstablished(ns3::Mac48Address address, uint8_t tid) const [member function]
+    cls.add_method('GetBaAgreementEstablished', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBaBufferSize(ns3::Mac48Address address, uint8_t tid) const [member function]
+    cls.add_method('GetBaBufferSize', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::BlockAckManager> ns3::QosTxop::GetBaManager() [member function]
+    cls.add_method('GetBaManager', 
+                   'ns3::Ptr< ns3::BlockAckManager >', 
+                   [])
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBaStartingSequence(ns3::Mac48Address address, uint8_t tid) const [member function]
+    cls.add_method('GetBaStartingSequence', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBlockAckInactivityTimeout() const [member function]
+    cls.add_method('GetBlockAckInactivityTimeout', 
+                   'uint16_t', 
                    [], 
                    is_const=True)
-    ## jakes-process.h (module 'propagation'): static ns3::TypeId ns3::JakesProcess::GetTypeId() [member function]
+    ## qos-txop.h (module 'wifi'): ns3::BlockAckReqType ns3::QosTxop::GetBlockAckReqType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckReqType', 
+                   'ns3::BlockAckReqType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetBlockAckThreshold() const [member function]
+    cls.add_method('GetBlockAckThreshold', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::BlockAckType ns3::QosTxop::GetBlockAckType(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetFailedAddBaTimeout() const [member function]
+    cls.add_method('GetFailedAddBaTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::GetNextMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, bool initialFrame, ns3::WifiMacQueueItem::QueueIteratorPair & queueIt) [member function]
+    cls.add_method('GetNextMpdu', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::QueueIteratorPair &', 'queueIt')])
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('GetNextSequenceNumberFor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetRemainingTxop() const [member function]
+    cls.add_method('GetRemainingTxop', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): static ns3::TypeId ns3::QosTxop::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## jakes-process.h (module 'propagation'): void ns3::JakesProcess::SetPropagationLossModel(ns3::Ptr<const ns3::PropagationLossModel> model) [member function]
-    cls.add_method('SetPropagationLossModel', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAddBaResponse(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('GotAddBaResponse', 
                    'void', 
-                   [param('ns3::Ptr< ns3::PropagationLossModel const >', 'model')])
-    return
-
-def register_Ns3JakesPropagationLossModel_methods(root_module, cls):
-    ## jakes-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::JakesPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotDelBaFrame(ns3::MgtDelBaHeader const * delBaHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('GotDelBaFrame', 
+                   'void', 
+                   [param('ns3::MgtDelBaHeader const *', 'delBaHdr'), param('ns3::Mac48Address', 'recipient')])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::HasFramesToTransmit() [member function]
+    cls.add_method('HasFramesToTransmit', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## jakes-propagation-loss-model.h (module 'propagation'): ns3::JakesPropagationLossModel::JakesPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## jakes-propagation-loss-model.h (module 'propagation'): double ns3::JakesPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## jakes-propagation-loss-model.h (module 'propagation'): int64_t ns3::JakesPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3Kun2600MhzPropagationLossModel_methods(root_module, cls):
-    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::Kun2600MhzPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_virtual=True)
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsQosTxop() const [member function]
+    cls.add_method('IsQosTxop', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): ns3::Kun2600MhzPropagationLossModel::Kun2600MhzPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): double ns3::Kun2600MhzPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetLoss', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True)
-    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): double ns3::Kun2600MhzPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## kun-2600-mhz-propagation-loss-model.h (module 'propagation'): int64_t ns3::Kun2600MhzPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3LinearWifiTxCurrentModel_methods(root_module, cls):
-    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel(ns3::LinearWifiTxCurrentModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::LinearWifiTxCurrentModel const &', 'arg0')])
-    ## wifi-tx-current-model.h (module 'wifi'): ns3::LinearWifiTxCurrentModel::LinearWifiTxCurrentModel() [constructor]
-    cls.add_constructor([])
-    ## wifi-tx-current-model.h (module 'wifi'): double ns3::LinearWifiTxCurrentModel::CalcTxCurrent(double txPowerDbm) const [member function]
-    cls.add_method('CalcTxCurrent', 
-                   'double', 
-                   [param('double', 'txPowerDbm')], 
                    is_const=True, is_virtual=True)
-    ## wifi-tx-current-model.h (module 'wifi'): static ns3::TypeId ns3::LinearWifiTxCurrentModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsTxopStarted() const [member function]
+    cls.add_method('IsTxopStarted', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    return
-
-def register_Ns3ListErrorModel_methods(root_module, cls):
-    ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel(ns3::ListErrorModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ListErrorModel const &', 'arg0')])
-    ## error-model.h (module 'network'): ns3::ListErrorModel::ListErrorModel() [constructor]
-    cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ListErrorModel::GetList() const [member function]
-    cls.add_method('GetList', 
-                   'std::list< unsigned int >', 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
+    cls.add_method('NotifyChannelAccessed', 
+                   'void', 
+                   [param('ns3::Time', 'txopDuration')], 
+                   is_virtual=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelReleased() [member function]
+    cls.add_method('NotifyChannelReleased', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## error-model.h (module 'network'): static ns3::TypeId ns3::ListErrorModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_virtual=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyInternalCollision() [member function]
+    cls.add_method('NotifyInternalCollision', 
+                   'void', 
                    [], 
-                   is_static=True)
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
-    cls.add_method('SetList', 
+                   is_virtual=True)
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('PeekNextMpdu', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::QueueIteratorPair queueIt, uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
+    cls.add_method('PeekNextMpdu', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::WifiMacQueueItem::QueueIteratorPair', 'queueIt'), param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
+    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('PeekNextSequenceNumberFor', 
+                   'uint16_t', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PrepareBlockAckRequest(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('PrepareBlockAckRequest', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::PushFront(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('PushFront', 
                    'void', 
-                   [param('std::list< unsigned int > const &', 'packetlist')])
-    ## error-model.h (module 'network'): bool ns3::ListErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorrupt', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ResetBa(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('ResetBa', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ScheduleBar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, bool skipIfNoDataQueued=false) [member function]
+    cls.add_method('ScheduleBar', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAccessCategory(ns3::AcIndex ac) [member function]
+    cls.add_method('SetAccessCategory', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAddBaResponseTimeout(ns3::Time addBaResponseTimeout) [member function]
+    cls.add_method('SetAddBaResponseTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'addBaResponseTimeout')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckInactivityTimeout(uint16_t timeout) [member function]
+    cls.add_method('SetBlockAckInactivityTimeout', 
+                   'void', 
+                   [param('uint16_t', 'timeout')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckThreshold(uint8_t threshold) [member function]
+    cls.add_method('SetBlockAckThreshold', 
+                   'void', 
+                   [param('uint8_t', 'threshold')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetDroppedMpduCallback(ns3::Txop::DroppedMpdu callback) [member function]
+    cls.add_method('SetDroppedMpduCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetFailedAddBaTimeout(ns3::Time failedAddBaTimeout) [member function]
+    cls.add_method('SetFailedAddBaTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'failedAddBaTimeout')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosFrameExchangeManager(ns3::Ptr<ns3::QosFrameExchangeManager> const qosFem) [member function]
+    cls.add_method('SetQosFrameExchangeManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::QosFrameExchangeManager > const', 'qosFem')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetQosQueueSize(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('SetQosQueueSize', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
+                   is_virtual=True)
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::UseExplicitBarAfterMissedBlockAck() const [member function]
+    cls.add_method('UseExplicitBarAfterMissedBlockAck', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): void ns3::ListErrorModel::DoReset() [member function]
-    cls.add_method('DoReset', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3LogDistancePropagationLossModel_methods(root_module, cls):
-    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::LogDistancePropagationLossModel::GetTypeId() [member function]
+def register_Ns3Queue__Ns3Packet_methods(root_module, cls):
+    ## queue.h (module 'network'): static ns3::TypeId ns3::Queue<ns3::Packet>::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## propagation-loss-model.h (module 'propagation'): ns3::LogDistancePropagationLossModel::LogDistancePropagationLossModel() [constructor]
+    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Queue() [constructor]
     cls.add_constructor([])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::LogDistancePropagationLossModel::SetPathLossExponent(double n) [member function]
-    cls.add_method('SetPathLossExponent', 
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::Enqueue(ns3::Ptr<ns3::Packet> item) [member function]
+    cls.add_method('Enqueue', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'item')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::Dequeue() [member function]
+    cls.add_method('Dequeue', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::Remove() [member function]
+    cls.add_method('Remove', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<const ns3::Packet> ns3::Queue<ns3::Packet>::Peek() const [member function]
+    cls.add_method('Peek', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::Flush() [member function]
+    cls.add_method('Flush', 
                    'void', 
-                   [param('double', 'n')])
-    ## propagation-loss-model.h (module 'propagation'): double ns3::LogDistancePropagationLossModel::GetPathLossExponent() const [member function]
-    cls.add_method('GetPathLossExponent', 
-                   'double', 
+                   [])
+    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Queue(ns3::Queue<ns3::Packet> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Queue< ns3::Packet > const &', 'arg0')])
+    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::ConstIterator ns3::Queue<ns3::Packet>::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::Queue< ns3::Packet > ConstIterator', 
                    [], 
-                   is_const=True)
-    ## propagation-loss-model.h (module 'propagation'): void ns3::LogDistancePropagationLossModel::SetReference(double referenceDistance, double referenceLoss) [member function]
-    cls.add_method('SetReference', 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Iterator ns3::Queue<ns3::Packet>::begin() [member function]
+    cls.add_method('begin', 
+                   'ns3::Queue< ns3::Packet > Iterator', 
+                   [], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::ConstIterator ns3::Queue<ns3::Packet>::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::Queue< ns3::Packet > ConstIterator', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Iterator ns3::Queue<ns3::Packet>::end() [member function]
+    cls.add_method('end', 
+                   'ns3::Queue< ns3::Packet > Iterator', 
+                   [], 
+                   visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item, ns3::Queue<ns3::Packet>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item'), param('ns3::Queue< ns3::Packet > Iterator &', 'ret')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
+    cls.add_method('DoDequeue', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoRemove(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
+    cls.add_method('DoRemove', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<const ns3::Packet> ns3::Queue<ns3::Packet>::DoPeek(ns3::Queue<ns3::Packet>::ConstIterator pos) const [member function]
+    cls.add_method('DoPeek', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos')], 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DropBeforeEnqueue(ns3::Ptr<ns3::Packet> item) [member function]
+    cls.add_method('DropBeforeEnqueue', 
                    'void', 
-                   [param('double', 'referenceDistance'), param('double', 'referenceLoss')])
-    ## propagation-loss-model.h (module 'propagation'): double ns3::LogDistancePropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::LogDistancePropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
+                   [param('ns3::Ptr< ns3::Packet >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DropAfterDequeue(ns3::Ptr<ns3::Packet> item) [member function]
+    cls.add_method('DropAfterDequeue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
-def register_Ns3LogNormalRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::LogNormalRandomVariable::GetTypeId() [member function]
+def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
+    ## queue.h (module 'network'): static ns3::TypeId ns3::Queue<ns3::QueueDiscItem>::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable::LogNormalRandomVariable() [constructor]
+    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Queue() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetMu() const [member function]
-    cls.add_method('GetMu', 
-                   'double', 
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::Enqueue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
+    cls.add_method('Enqueue', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::Dequeue() [member function]
+    cls.add_method('Dequeue', 
+                   'ns3::Ptr< ns3::QueueDiscItem >', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetSigma() const [member function]
-    cls.add_method('GetSigma', 
-                   'double', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::Remove() [member function]
+    cls.add_method('Remove', 
+                   'ns3::Ptr< ns3::QueueDiscItem >', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue(double mu, double sigma) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'mu'), param('double', 'sigma')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger(uint32_t mu, uint32_t sigma) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'mu'), param('uint32_t', 'sigma')])
-    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<const ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::Peek() const [member function]
+    cls.add_method('Peek', 
+                   'ns3::Ptr< ns3::QueueDiscItem const >', 
                    [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::Flush() [member function]
+    cls.add_method('Flush', 
+                   'void', 
+                   [])
+    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Queue(ns3::Queue<ns3::QueueDiscItem> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Queue< ns3::QueueDiscItem > const &', 'arg0')])
+    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::ConstIterator ns3::Queue<ns3::QueueDiscItem>::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::Queue< ns3::QueueDiscItem > ConstIterator', 
                    [], 
-                   is_virtual=True)
-    return
-
-def register_Ns3Mac48AddressChecker_methods(root_module, cls):
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
-    cls.add_constructor([])
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
-    return
-
-def register_Ns3Mac48AddressValue_methods(root_module, cls):
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
-    cls.add_constructor([])
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
-    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
-    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
-    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Iterator ns3::Queue<ns3::QueueDiscItem>::begin() [member function]
+    cls.add_method('begin', 
+                   'ns3::Queue< ns3::QueueDiscItem > Iterator', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Mac48Address', 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::ConstIterator ns3::Queue<ns3::QueueDiscItem>::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::Queue< ns3::QueueDiscItem > ConstIterator', 
                    [], 
-                   is_const=True)
-    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::Mac48Address const &', 'value')])
-    return
-
-def register_Ns3MacLow_methods(root_module, cls):
-    ## mac-low.h (module 'wifi'): ns3::MacLow::MacLow(ns3::MacLow const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacLow const &', 'arg0')])
-    ## mac-low.h (module 'wifi'): ns3::MacLow::MacLow() [constructor]
-    cls.add_constructor([])
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateOverallTxTime(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const * hdr, ns3::MacLowTransmissionParameters const & params, uint32_t fragmentSize=0) const [member function]
-    cls.add_method('CalculateOverallTxTime', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters const &', 'params'), param('uint32_t', 'fragmentSize', default_value='0')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateOverheadTxTime(ns3::Ptr<const ns3::WifiMacQueueItem> item, ns3::MacLowTransmissionParameters const & params) const [member function]
-    cls.add_method('CalculateOverheadTxTime', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item'), param('ns3::MacLowTransmissionParameters const &', 'params')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateTransmissionTime(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const * hdr, ns3::MacLowTransmissionParameters const & parameters) const [member function]
-    cls.add_method('CalculateTransmissionTime', 
-                   'ns3::Time', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters const &', 'parameters')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::CanTransmitNextCfFrame() const [member function]
-    cls.add_method('CanTransmitNextCfFrame', 
-                   'bool', 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Iterator ns3::Queue<ns3::QueueDiscItem>::end() [member function]
+    cls.add_method('end', 
+                   'ns3::Queue< ns3::QueueDiscItem > Iterator', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::CreateBlockAckAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address originator, uint16_t startingSeq) [member function]
-    cls.add_method('CreateBlockAckAgreement', 
+                   visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item, ns3::Queue<ns3::QueueDiscItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item'), param('ns3::Queue< ns3::QueueDiscItem > Iterator &', 'ret')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
+    cls.add_method('DoDequeue', 
+                   'ns3::Ptr< ns3::QueueDiscItem >', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoRemove(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
+    cls.add_method('DoRemove', 
+                   'ns3::Ptr< ns3::QueueDiscItem >', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<const ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoPeek(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) const [member function]
+    cls.add_method('DoPeek', 
+                   'ns3::Ptr< ns3::QueueDiscItem const >', 
+                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos')], 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DropBeforeEnqueue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
+    cls.add_method('DropBeforeEnqueue', 
                    'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'originator'), param('uint16_t', 'startingSeq')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DeaggregateAmpduAndReceive(ns3::Ptr<ns3::WifiPsdu> aggregatedPacket, double rxSnr, ns3::WifiTxVector txVector, std::vector<bool, std::allocator<bool> > statusPerMpdu) [member function]
-    cls.add_method('DeaggregateAmpduAndReceive', 
+                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DropAfterDequeue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
+    cls.add_method('DropAfterDequeue', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'aggregatedPacket'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('std::vector< bool >', 'statusPerMpdu')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DestroyBlockAckAgreement(ns3::Mac48Address originator, uint8_t tid) [member function]
-    cls.add_method('DestroyBlockAckAgreement', 
+                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')])
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::DoNavStartNow(ns3::Time duration) [member function]
-    cls.add_method('DoNavStartNow', 
-                   'bool', 
-                   [param('ns3::Time', 'duration')])
-    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLow::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetBeaconInterval() const [member function]
-    cls.add_method('GetBeaconInterval', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLow::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetCfpMaxDuration() const [member function]
-    cls.add_method('GetCfpMaxDuration', 
-                   'ns3::Time', 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3Queue__Ns3WifiMacQueueItem_methods(root_module, cls):
+    ## queue.h (module 'network'): static ns3::TypeId ns3::Queue<ns3::WifiMacQueueItem>::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::GetCtsToSelfSupported() const [member function]
-    cls.add_method('GetCtsToSelfSupported', 
+                   is_static=True)
+    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::Queue() [constructor]
+    cls.add_constructor([])
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::WifiMacQueueItem>::Enqueue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    cls.add_method('Enqueue', 
                    'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::Dequeue() [member function]
+    cls.add_method('Dequeue', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::WifiTxVector ns3::MacLow::GetDataTxVector(ns3::Ptr<const ns3::WifiMacQueueItem> item) const [member function]
-    cls.add_method('GetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'item')], 
-                   is_const=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::MacLow::GetEdca(uint8_t tid) const [member function]
-    cls.add_method('GetEdca', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MpduAggregator> ns3::MacLow::GetMpduAggregator() const [member function]
-    cls.add_method('GetMpduAggregator', 
-                   'ns3::Ptr< ns3::MpduAggregator >', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::MsduAggregator> ns3::MacLow::GetMsduAggregator() const [member function]
-    cls.add_method('GetMsduAggregator', 
-                   'ns3::Ptr< ns3::MsduAggregator >', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::MacLow::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetPifs() const [member function]
-    cls.add_method('GetPifs', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetRemainingCfpDuration() const [member function]
-    cls.add_method('GetRemainingCfpDuration', 
-                   'ns3::Time', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::Remove() [member function]
+    cls.add_method('Remove', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetSifs() const [member function]
-    cls.add_method('GetSifs', 
-                   'ns3::Time', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::Peek() const [member function]
+    cls.add_method('Peek', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetSlotTime() const [member function]
-    cls.add_method('GetSlotTime', 
-                   'ns3::Time', 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::Flush() [member function]
+    cls.add_method('Flush', 
+                   'void', 
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::Queue(ns3::Queue<ns3::WifiMacQueueItem> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Queue< ns3::WifiMacQueueItem > const &', 'arg0')])
+    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::Queue<ns3::WifiMacQueueItem>::begin() const [member function]
+    cls.add_method('begin', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): static ns3::TypeId ns3::MacLow::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::Iterator ns3::Queue<ns3::WifiMacQueueItem>::begin() [member function]
+    cls.add_method('begin', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > Iterator', 
                    [], 
-                   is_static=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsCfPeriod() const [member function]
-    cls.add_method('IsCfPeriod', 
-                   'bool', 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::Queue<ns3::WifiMacQueueItem>::end() const [member function]
+    cls.add_method('end', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsPromisc() const [member function]
-    cls.add_method('IsPromisc', 
-                   'bool', 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::Iterator ns3::Queue<ns3::WifiMacQueueItem>::end() [member function]
+    cls.add_method('end', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > Iterator', 
                    [], 
-                   is_const=True)
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsWithinSizeAndTimeLimits(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector txVector, uint32_t ampduSize, ns3::Time ppduDurationLimit) [member function]
-    cls.add_method('IsWithinSizeAndTimeLimits', 
+                   visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::WifiMacQueueItem>::DoEnqueue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    cls.add_method('DoEnqueue', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize'), param('ns3::Time', 'ppduDurationLimit')])
-    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsWithinSizeAndTimeLimits(uint32_t mpduSize, ns3::Mac48Address receiver, uint8_t tid, ns3::WifiTxVector txVector, uint32_t ampduSize, ns3::Time ppduDurationLimit) [member function]
-    cls.add_method('IsWithinSizeAndTimeLimits', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): bool ns3::Queue<ns3::WifiMacQueueItem>::DoEnqueue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item, ns3::Queue<ns3::WifiMacQueueItem>::Iterator & ret) [member function]
+    cls.add_method('DoEnqueue', 
                    'bool', 
-                   [param('uint32_t', 'mpduSize'), param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize'), param('ns3::Time', 'ppduDurationLimit')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifyOffNow() [member function]
-    cls.add_method('NotifyOffNow', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifySleepNow() [member function]
-    cls.add_method('NotifySleepNow', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifySwitchingStartNow(ns3::Time duration) [member function]
-    cls.add_method('NotifySwitchingStartNow', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveError(ns3::Ptr<ns3::WifiPsdu> psdu) [member function]
-    cls.add_method('ReceiveError', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, double rxSnr, ns3::WifiTxVector txVector, bool ampduSubframe) [member function]
-    cls.add_method('ReceiveOk', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('double', 'rxSnr'), param('ns3::WifiTxVector', 'txVector'), param('bool', 'ampduSubframe')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterChannelAccessManager(ns3::Ptr<ns3::ChannelAccessManager> channelAccessManager) [member function]
-    cls.add_method('RegisterChannelAccessManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ChannelAccessManager >', 'channelAccessManager')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterEdcaForAc(ns3::AcIndex ac, ns3::Ptr<ns3::QosTxop> edca) [member function]
-    cls.add_method('RegisterEdcaForAc', 
-                   'void', 
-                   [param('ns3::AcIndex', 'ac'), param('ns3::Ptr< ns3::QosTxop >', 'edca')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::ResetPhy() [member function]
-    cls.add_method('ResetPhy', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::RxStartIndication(ns3::WifiTxVector txVector, ns3::Time psduDuration) [member function]
-    cls.add_method('RxStartIndication', 
-                   'void', 
-                   [param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'psduDuration')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetAddress(ns3::Mac48Address ad) [member function]
-    cls.add_method('SetAddress', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'ad')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetBeaconInterval(ns3::Time interval) [member function]
-    cls.add_method('SetBeaconInterval', 
-                   'void', 
-                   [param('ns3::Time', 'interval')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetBssid(ns3::Mac48Address ad) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'ad')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCfpMaxDuration(ns3::Time duration) [member function]
-    cls.add_method('SetCfpMaxDuration', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCtsToSelfSupported(bool enable) [member function]
-    cls.add_method('SetCtsToSelfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetMpduAggregator(ns3::Ptr<ns3::MpduAggregator> const aggr) [member function]
-    cls.add_method('SetMpduAggregator', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MpduAggregator > const', 'aggr')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetMsduAggregator(ns3::Ptr<ns3::MsduAggregator> const aggr) [member function]
-    cls.add_method('SetMsduAggregator', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MsduAggregator > const', 'aggr')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
-                   'void', 
-                   [])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetRxCallback(ns3::Callback<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetRxCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const manager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item'), param('ns3::Queue< ns3::WifiMacQueueItem > Iterator &', 'ret')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoDequeue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
+    cls.add_method('DoDequeue', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoRemove(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
+    cls.add_method('DoRemove', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoPeek(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) const [member function]
+    cls.add_method('DoPeek', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')], 
+                   is_const=True, visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::DropBeforeEnqueue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    cls.add_method('DropBeforeEnqueue', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'manager')])
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::StartTransmission(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::MacLowTransmissionParameters parameters, ns3::Ptr<ns3::Txop> txop) [member function]
-    cls.add_method('StartTransmission', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::DropAfterDequeue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    cls.add_method('DropAfterDequeue', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::Ptr< ns3::Txop >', 'txop')], 
-                   is_virtual=True)
-    ## mac-low.h (module 'wifi'): void ns3::MacLow::DoDispose() [member function]
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
+                   visibility='protected')
+    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3MacRxMiddle_methods(root_module, cls):
-    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle::MacRxMiddle(ns3::MacRxMiddle const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacRxMiddle const &', 'arg0')])
-    ## mac-rx-middle.h (module 'wifi'): ns3::MacRxMiddle::MacRxMiddle() [constructor]
-    cls.add_constructor([])
-    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::SetForwardCallback(ns3::MacRxMiddle::ForwardUpCallback callback) [member function]
-    cls.add_method('SetForwardCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## mac-rx-middle.h (module 'wifi'): void ns3::MacRxMiddle::SetPcfCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetPcfCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+                   is_virtual=True, visibility='protected')
     return
 
-def register_Ns3MacTxMiddle_methods(root_module, cls):
-    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle(ns3::MacTxMiddle const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MacTxMiddle const &', 'arg0')])
-    ## mac-tx-middle.h (module 'wifi'): ns3::MacTxMiddle::MacTxMiddle() [constructor]
-    cls.add_constructor([])
-    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSeqNumberByTidAndAddress(uint8_t tid, ns3::Mac48Address addr) const [member function]
-    cls.add_method('GetNextSeqNumberByTidAndAddress', 
-                   'uint16_t', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'addr')], 
+def register_Ns3QueueItem_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## queue-item.h (module 'network'): ns3::QueueItem::QueueItem(ns3::Ptr<ns3::Packet> p) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'p')])
+    ## queue-item.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::QueueItem::GetPacket() const [member function]
+    cls.add_method('GetPacket', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [], 
                    is_const=True)
-    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('GetNextSequenceNumberFor', 
-                   'uint16_t', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## mac-tx-middle.h (module 'wifi'): uint16_t ns3::MacTxMiddle::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('PeekNextSequenceNumberFor', 
-                   'uint16_t', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
-    return
-
-def register_Ns3MatrixPropagationLossModel_methods(root_module, cls):
-    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::MatrixPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## queue-item.h (module 'network'): uint32_t ns3::QueueItem::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
                    [], 
-                   is_static=True)
-    ## propagation-loss-model.h (module 'propagation'): ns3::MatrixPropagationLossModel::MatrixPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::MatrixPropagationLossModel::SetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b, double loss, bool symmetric=true) [member function]
-    cls.add_method('SetLoss', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b'), param('double', 'loss'), param('bool', 'symmetric', default_value='true')])
-    ## propagation-loss-model.h (module 'propagation'): void ns3::MatrixPropagationLossModel::SetDefaultLoss(double defaultLoss) [member function]
-    cls.add_method('SetDefaultLoss', 
-                   'void', 
-                   [param('double', 'defaultLoss')])
-    ## propagation-loss-model.h (module 'propagation'): double ns3::MatrixPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::MatrixPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
+                   is_const=True, is_virtual=True)
+    ## queue-item.h (module 'network'): bool ns3::QueueItem::GetUint8Value(ns3::QueueItem::Uint8Values field, uint8_t & value) const [member function]
+    cls.add_method('GetUint8Value', 
+                   'bool', 
+                   [param('ns3::QueueItem::Uint8Values', 'field'), param('uint8_t &', 'value')], 
+                   is_const=True, is_virtual=True)
+    ## queue-item.h (module 'network'): void ns3::QueueItem::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
     return
 
-def register_Ns3MgtBeaconHeader_methods(root_module, cls):
-    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader() [constructor]
+def register_Ns3QueueSizeChecker_methods(root_module, cls):
+    ## queue-size.h (module 'network'): ns3::QueueSizeChecker::QueueSizeChecker() [constructor]
     cls.add_constructor([])
-    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader(ns3::MgtBeaconHeader const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MgtBeaconHeader const &', 'arg0')])
-    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtBeaconHeader::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## queue-size.h (module 'network'): ns3::QueueSizeChecker::QueueSizeChecker(ns3::QueueSizeChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::QueueSizeChecker const &', 'arg0')])
+    return
+
+def register_Ns3QueueSizeValue_methods(root_module, cls):
+    ## queue-size.h (module 'network'): ns3::QueueSizeValue::QueueSizeValue() [constructor]
+    cls.add_constructor([])
+    ## queue-size.h (module 'network'): ns3::QueueSizeValue::QueueSizeValue(ns3::QueueSize const & value) [constructor]
+    cls.add_constructor([param('ns3::QueueSize const &', 'value')])
+    ## queue-size.h (module 'network'): ns3::QueueSizeValue::QueueSizeValue(ns3::QueueSizeValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::QueueSizeValue const &', 'arg0')])
+    ## queue-size.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::QueueSizeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_static=True)
+                   is_const=True, is_virtual=True)
+    ## queue-size.h (module 'network'): bool ns3::QueueSizeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## queue-size.h (module 'network'): ns3::QueueSize ns3::QueueSizeValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::QueueSize', 
+                   [], 
+                   is_const=True)
+    ## queue-size.h (module 'network'): std::string ns3::QueueSizeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## queue-size.h (module 'network'): void ns3::QueueSizeValue::Set(ns3::QueueSize const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::QueueSize const &', 'value')])
     return
 
-def register_Ns3MinstrelHtWifiManager_methods(root_module, cls):
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtWifiManager::MinstrelHtWifiManager(ns3::MinstrelHtWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MinstrelHtWifiManager const &', 'arg0')])
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::MinstrelHtWifiManager::MinstrelHtWifiManager() [constructor]
+def register_Ns3RateErrorModel_methods(root_module, cls):
+    ## error-model.h (module 'network'): ns3::RateErrorModel::RateErrorModel(ns3::RateErrorModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RateErrorModel const &', 'arg0')])
+    ## error-model.h (module 'network'): ns3::RateErrorModel::RateErrorModel() [constructor]
     cls.add_constructor([])
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): int64_t ns3::MinstrelHtWifiManager::AssignStreams(int64_t stream) [member function]
+    ## error-model.h (module 'network'): int64_t ns3::RateErrorModel::AssignStreams(int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')])
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::MinstrelHtWifiManager::GetTypeId() [member function]
+    ## error-model.h (module 'network'): double ns3::RateErrorModel::GetRate() const [member function]
+    cls.add_method('GetRate', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## error-model.h (module 'network'): static ns3::TypeId ns3::RateErrorModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetupMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
-                   is_virtual=True)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::MinstrelHtWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+    ## error-model.h (module 'network'): ns3::RateErrorModel::ErrorUnit ns3::RateErrorModel::GetUnit() const [member function]
+    cls.add_method('GetUnit', 
+                   'ns3::RateErrorModel::ErrorUnit', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelHtWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelHtWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   is_const=True)
+    ## error-model.h (module 'network'): void ns3::RateErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+    cls.add_method('SetRandomVariable', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): bool ns3::MinstrelHtWifiManager::DoNeedRetransmission(ns3::WifiRemoteStation * st, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
-    cls.add_method('DoNeedRetransmission', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation *', 'st'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportAmpduTxStatus', 
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
+    ## error-model.h (module 'network'): void ns3::RateErrorModel::SetRate(double rate) [member function]
+    cls.add_method('SetRate', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('uint8_t', 'nSuccessfulMpdus'), param('uint8_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
+                   [param('double', 'rate')])
+    ## error-model.h (module 'network'): void ns3::RateErrorModel::SetUnit(ns3::RateErrorModel::ErrorUnit error_unit) [member function]
+    cls.add_method('SetUnit', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   [param('ns3::RateErrorModel::ErrorUnit', 'error_unit')])
+    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorrupt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
                    is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorruptBit(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorruptBit', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
                    is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
+    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorruptByte(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorruptByte', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
                    is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
+    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorruptPkt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorruptPkt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
                    is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+    ## error-model.h (module 'network'): void ns3::RateErrorModel::DoReset() [member function]
+    cls.add_method('DoReset', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   [], 
                    is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+    return
+
+def register_Ns3ReceiveListErrorModel_methods(root_module, cls):
+    ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel(ns3::ReceiveListErrorModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
+    ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
+    cls.add_constructor([])
+    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
+    cls.add_method('GetList', 
+                   'std::list< unsigned int >', 
+                   [], 
+                   is_const=True)
+    ## error-model.h (module 'network'): static ns3::TypeId ns3::ReceiveListErrorModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
+    cls.add_method('SetList', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   [param('std::list< unsigned int > const &', 'packetlist')])
+    ## error-model.h (module 'network'): bool ns3::ReceiveListErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorrupt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
                    is_virtual=True, visibility='private')
-    ## minstrel-ht-wifi-manager.h (module 'wifi'): void ns3::MinstrelHtWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::DoReset() [member function]
+    cls.add_method('DoReset', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   [], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3MinstrelWifiManager_methods(root_module, cls):
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::MinstrelWifiManager::MinstrelWifiManager(ns3::MinstrelWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MinstrelWifiManager const &', 'arg0')])
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::MinstrelWifiManager::MinstrelWifiManager() [constructor]
-    cls.add_constructor([])
-    ## minstrel-wifi-manager.h (module 'wifi'): int64_t ns3::MinstrelWifiManager::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::CheckInit(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('CheckInit', 
-                   'void', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): uint32_t ns3::MinstrelWifiManager::CountRetries(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('CountRetries', 
-                   'uint32_t', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): uint16_t ns3::MinstrelWifiManager::FindRate(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('FindRate', 
-                   'uint16_t', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::GetDataTxVector(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('GetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::GetRtsTxVector(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('GetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::MinstrelWifiManager::GetTypeId() [member function]
+def register_Ns3RegularWifiMac_methods(root_module, cls):
+    ## regular-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::RegularWifiMac::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::InitSampleTable(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('InitSampleTable', 
-                   'void', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetupMac', 
+                   is_static=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac::RegularWifiMac() [constructor]
+    cls.add_constructor([])
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetShortSlotTimeSupported(bool enable) [member function]
+    cls.add_method('SetShortSlotTimeSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetShortSlotTimeSupported() const [member function]
+    cls.add_method('GetShortSlotTimeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ssid ns3::RegularWifiMac::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
                    is_virtual=True)
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetWifiPhy', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
                    is_virtual=True)
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdatePacketCounters(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('UpdatePacketCounters', 
-                   'void', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdateRate(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('UpdateRate', 
-                   'void', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdateRetry(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('UpdateRetry', 
-                   'void', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::UpdateStats(ns3::MinstrelWifiRemoteStation * station) [member function]
-    cls.add_method('UpdateStats', 
-                   'void', 
-                   [param('ns3::MinstrelWifiRemoteStation *', 'station')])
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::MinstrelWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::RegularWifiMac::GetWifiPhy() const [member function]
+    cls.add_method('GetWifiPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::MinstrelWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ResetWifiPhy() [member function]
+    cls.add_method('ResetWifiPhy', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): bool ns3::MinstrelWifiManager::DoNeedRetransmission(ns3::WifiRemoteStation * st, ns3::Ptr<const ns3::Packet> packet, bool normally) [member function]
-    cls.add_method('DoNeedRetransmission', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation *', 'st'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
+                   [param('ns3::WifiStandard', 'standard')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::TypeOfStation ns3::RegularWifiMac::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::WifiMac::ForwardUpCallback upCallback) [member function]
+    cls.add_method('SetForwardUpCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
+    cls.add_method('GetWifiRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## minstrel-wifi-manager.h (module 'wifi'): void ns3::MinstrelWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::FrameExchangeManager> ns3::RegularWifiMac::GetFrameExchangeManager() const [member function]
+    cls.add_method('GetFrameExchangeManager', 
+                   'ns3::Ptr< ns3::FrameExchangeManager >', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3MobilityModel_methods(root_module, cls):
-    ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel(ns3::MobilityModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MobilityModel const &', 'arg0')])
-    ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel() [constructor]
-    cls.add_constructor([])
-    ## mobility-model.h (module 'mobility'): int64_t ns3::MobilityModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetDistanceFrom(ns3::Ptr<const ns3::MobilityModel> position) const [member function]
-    cls.add_method('GetDistanceFrom', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'position')], 
+                   [param('bool', 'enable')])
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')])
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
+    cls.add_method('GetTxop', 
+                   'ns3::Ptr< ns3::Txop >', 
+                   [], 
                    is_const=True)
-    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPosition() const [member function]
-    cls.add_method('GetPosition', 
-                   'ns3::Vector', 
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetQosTxop(uint8_t tid) const [member function]
+    cls.add_method('GetQosTxop', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
+    cls.add_method('GetExtendedCapabilities', 
+                   'ns3::ExtendedCapabilities', 
                    [], 
                    is_const=True)
-    ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetRelativeSpeed(ns3::Ptr<const ns3::MobilityModel> other) const [member function]
-    cls.add_method('GetRelativeSpeed', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'other')], 
+    ## regular-wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::RegularWifiMac::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
                    is_const=True)
-    ## mobility-model.h (module 'mobility'): static ns3::TypeId ns3::MobilityModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## regular-wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::RegularWifiMac::GetVhtCapabilities() const [member function]
+    cls.add_method('GetVhtCapabilities', 
+                   'ns3::VhtCapabilities', 
                    [], 
-                   is_static=True)
-    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetVelocity() const [member function]
-    cls.add_method('GetVelocity', 
-                   'ns3::Vector', 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::RegularWifiMac::GetHeCapabilities() const [member function]
+    cls.add_method('GetHeCapabilities', 
+                   'ns3::HeCapabilities', 
                    [], 
                    is_const=True)
-    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::SetPosition(ns3::Vector const & position) [member function]
-    cls.add_method('SetPosition', 
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Vector const &', 'position')])
-    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::NotifyCourseChange() const [member function]
-    cls.add_method('NotifyCourseChange', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   is_virtual=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::QosTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
+    cls.add_method('ConfigureContentionWindow', 
+                   'void', 
+                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
+    cls.add_method('SetQosSupported', 
                    'void', 
+                   [param('bool', 'enable')], 
+                   is_virtual=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
                    [], 
                    is_const=True, visibility='protected')
-    ## mobility-model.h (module 'mobility'): int64_t ns3::MobilityModel::DoAssignStreams(int64_t start) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'start')], 
-                   is_virtual=True, visibility='private')
-    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPosition() const [member function]
-    cls.add_method('DoGetPosition', 
-                   'ns3::Vector', 
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetupFrameExchangeManager() [member function]
+    cls.add_method('SetupFrameExchangeManager', 
+                   'void', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetVelocity() const [member function]
-    cls.add_method('DoGetVelocity', 
-                   'ns3::Vector', 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
-    cls.add_method('DoSetPosition', 
-                   'void', 
-                   [param('ns3::Vector const &', 'position')], 
-                   is_pure_virtual=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3MpduAggregator_methods(root_module, cls):
-    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator(ns3::MpduAggregator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MpduAggregator const &', 'arg0')])
-    ## mpdu-aggregator.h (module 'wifi'): ns3::MpduAggregator::MpduAggregator() [constructor]
-    cls.add_constructor([])
-    ## mpdu-aggregator.h (module 'wifi'): static void ns3::MpduAggregator::Aggregate(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::Ptr<ns3::Packet> ampdu, bool isSingle) [member function]
-    cls.add_method('Aggregate', 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetErpSupported(bool enable) [member function]
+    cls.add_method('SetErpSupported', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::Ptr< ns3::Packet >', 'ampdu'), param('bool', 'isSingle')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): static uint8_t ns3::MpduAggregator::CalculatePadding(uint32_t ampduSize) [member function]
-    cls.add_method('CalculatePadding', 
-                   'uint8_t', 
-                   [param('uint32_t', 'ampduSize')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): static ns3::AmpduSubframeHeader ns3::MpduAggregator::GetAmpduSubframeHeader(uint16_t mpduSize, bool isSingle) [member function]
-    cls.add_method('GetAmpduSubframeHeader', 
-                   'ns3::AmpduSubframeHeader', 
-                   [param('uint16_t', 'mpduSize'), param('bool', 'isSingle')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): uint32_t ns3::MpduAggregator::GetMaxAmpduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
-    cls.add_method('GetMaxAmpduSize', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
-                   is_const=True)
-    ## mpdu-aggregator.h (module 'wifi'): std::vector<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > ns3::MpduAggregator::GetNextAmpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector txVector, ns3::Time ppduDurationLimit=ns3::Time::Min()) const [member function]
-    cls.add_method('GetNextAmpdu', 
-                   'std::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxVector', 'txVector'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')], 
-                   is_const=True)
-    ## mpdu-aggregator.h (module 'wifi'): static uint32_t ns3::MpduAggregator::GetSizeIfAggregated(uint32_t mpduSize, uint32_t ampduSize) [member function]
-    cls.add_method('GetSizeIfAggregated', 
-                   'uint32_t', 
-                   [param('uint32_t', 'mpduSize'), param('uint32_t', 'ampduSize')], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MpduAggregator::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## mpdu-aggregator.h (module 'wifi'): void ns3::MpduAggregator::SetEdcaQueues(ns3::MpduAggregator::EdcaQueues edcaQueues) [member function]
-    cls.add_method('SetEdcaQueues', 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetDsssSupported(bool enable) [member function]
+    cls.add_method('SetDsssSupported', 
                    'void', 
-                   [param('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'edcaQueues')])
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
     return
 
-def register_Ns3MsduAggregator_methods(root_module, cls):
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator(ns3::MsduAggregator const & arg0) [constructor]
-    cls.add_constructor([param('ns3::MsduAggregator const &', 'arg0')])
-    ## msdu-aggregator.h (module 'wifi'): ns3::MsduAggregator::MsduAggregator() [constructor]
+def register_Ns3RrMultiUserScheduler_methods(root_module, cls):
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::RrMultiUserScheduler::RrMultiUserScheduler(ns3::RrMultiUserScheduler const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RrMultiUserScheduler const &', 'arg0')])
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::RrMultiUserScheduler::RrMultiUserScheduler() [constructor]
     cls.add_constructor([])
-    ## msdu-aggregator.h (module 'wifi'): static uint8_t ns3::MsduAggregator::CalculatePadding(uint16_t amsduSize) [member function]
-    cls.add_method('CalculatePadding', 
-                   'uint8_t', 
-                   [param('uint16_t', 'amsduSize')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): static ns3::MsduAggregator::DeaggregatedMsdus ns3::MsduAggregator::Deaggregate(ns3::Ptr<ns3::Packet> aggregatedPacket) [member function]
-    cls.add_method('Deaggregate', 
-                   'ns3::MsduAggregator::DeaggregatedMsdus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): uint16_t ns3::MsduAggregator::GetMaxAmsduSize(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
-    cls.add_method('GetMaxAmsduSize', 
-                   'uint16_t', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
-                   is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::MsduAggregator::GetNextAmsdu(ns3::Mac48Address recipient, uint8_t tid, ns3::WifiTxVector txVector, uint32_t ampduSize=0, ns3::Time ppduDurationLimit=ns3::Time::Min()) const [member function]
-    cls.add_method('GetNextAmsdu', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::WifiTxVector', 'txVector'), param('uint32_t', 'ampduSize', default_value='0'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')], 
-                   is_const=True)
-    ## msdu-aggregator.h (module 'wifi'): static uint16_t ns3::MsduAggregator::GetSizeIfAggregated(uint16_t msduSize, uint16_t amsduSize) [member function]
-    cls.add_method('GetSizeIfAggregated', 
-                   'uint16_t', 
-                   [param('uint16_t', 'msduSize'), param('uint16_t', 'amsduSize')], 
-                   is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): static ns3::TypeId ns3::MsduAggregator::GetTypeId() [member function]
+    ## rr-multi-user-scheduler.h (module 'wifi'): static ns3::TypeId ns3::RrMultiUserScheduler::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## msdu-aggregator.h (module 'wifi'): void ns3::MsduAggregator::SetEdcaQueues(ns3::MsduAggregator::EdcaQueues map) [member function]
-    cls.add_method('SetEdcaQueues', 
+    ## rr-multi-user-scheduler.h (module 'wifi'): void ns3::RrMultiUserScheduler::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('std::map< ns3::AcIndex, ns3::Ptr< ns3::QosTxop > >', 'map')])
-    return
-
-def register_Ns3NakagamiPropagationLossModel_methods(root_module, cls):
-    ## propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::NakagamiPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## propagation-loss-model.h (module 'propagation'): ns3::NakagamiPropagationLossModel::NakagamiPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## propagation-loss-model.h (module 'propagation'): double ns3::NakagamiPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## propagation-loss-model.h (module 'propagation'): int64_t ns3::NakagamiPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3NetDevice_methods(root_module, cls):
-    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
-    cls.add_constructor([])
-    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [constructor]
-    cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
-    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('AddLinkChangeCallback', 
+                   is_virtual=True, visibility='protected')
+    ## rr-multi-user-scheduler.h (module 'wifi'): void ns3::RrMultiUserScheduler::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Address', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetBroadcast() const [member function]
-    cls.add_method('GetBroadcast', 
-                   'ns3::Address', 
+                   is_virtual=True, visibility='protected')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::DlMuInfo ns3::RrMultiUserScheduler::ComputeDlMuInfo() [member function]
+    cls.add_method('ComputeDlMuInfo', 
+                   'ns3::MultiUserScheduler::DlMuInfo', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): ns3::Ptr<ns3::Channel> ns3::NetDevice::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::Channel >', 
+                   is_virtual=True, visibility='private')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::UlMuInfo ns3::RrMultiUserScheduler::ComputeUlMuInfo() [member function]
+    cls.add_method('ComputeUlMuInfo', 
+                   'ns3::MultiUserScheduler::UlMuInfo', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): uint32_t ns3::NetDevice::GetIfIndex() const [member function]
-    cls.add_method('GetIfIndex', 
-                   'uint32_t', 
+                   is_virtual=True, visibility='private')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::RrMultiUserScheduler::SelectTxFormat() [member function]
+    cls.add_method('SelectTxFormat', 
+                   'ns3::MultiUserScheduler::TxFormat', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): uint16_t ns3::NetDevice::GetMtu() const [member function]
-    cls.add_method('GetMtu', 
-                   'uint16_t', 
+                   is_virtual=True, visibility='private')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::RrMultiUserScheduler::TrySendingBasicTf() [member function]
+    cls.add_method('TrySendingBasicTf', 
+                   'ns3::MultiUserScheduler::TxFormat', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
-    cls.add_method('GetMulticast', 
-                   'ns3::Address', 
-                   [param('ns3::Ipv4Address', 'multicastGroup')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
-    cls.add_method('GetMulticast', 
-                   'ns3::Address', 
-                   [param('ns3::Ipv6Address', 'addr')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NetDevice::GetNode() const [member function]
-    cls.add_method('GetNode', 
-                   'ns3::Ptr< ns3::Node >', 
+                   is_virtual=True, visibility='private')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::RrMultiUserScheduler::TrySendingBsrpTf() [member function]
+    cls.add_method('TrySendingBsrpTf', 
+                   'ns3::MultiUserScheduler::TxFormat', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): static ns3::TypeId ns3::NetDevice::GetTypeId() [member function]
+                   is_virtual=True, visibility='private')
+    ## rr-multi-user-scheduler.h (module 'wifi'): ns3::MultiUserScheduler::TxFormat ns3::RrMultiUserScheduler::TrySendingDlMuPpdu() [member function]
+    cls.add_method('TrySendingDlMuPpdu', 
+                   'ns3::MultiUserScheduler::TxFormat', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3RraaWifiManager_methods(root_module, cls):
+    ## rraa-wifi-manager.h (module 'wifi'): ns3::RraaWifiManager::RraaWifiManager(ns3::RraaWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RraaWifiManager const &', 'arg0')])
+    ## rraa-wifi-manager.h (module 'wifi'): ns3::RraaWifiManager::RraaWifiManager() [constructor]
+    cls.add_constructor([])
+    ## rraa-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::RraaWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBridge() const [member function]
-    cls.add_method('IsBridge', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBroadcast() const [member function]
-    cls.add_method('IsBroadcast', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::IsLinkUp() const [member function]
-    cls.add_method('IsLinkUp', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::IsMulticast() const [member function]
-    cls.add_method('IsMulticast', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::IsPointToPoint() const [member function]
-    cls.add_method('IsPointToPoint', 
-                   'bool', 
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetupMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## rraa-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::RraaWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::NeedsArp() const [member function]
-    cls.add_method('NeedsArp', 
-                   'bool', 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RraaWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RraaWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
-    cls.add_method('Send', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
-    cls.add_method('SendFrom', 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): bool ns3::RraaWifiManager::DoNeedRts(ns3::WifiRemoteStation * st, uint32_t size, bool normally) [member function]
+    cls.add_method('DoNeedRts', 
                    'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): void ns3::NetDevice::SetAddress(ns3::Address address) [member function]
-    cls.add_method('SetAddress', 
+                   [param('ns3::WifiRemoteStation *', 'st'), param('uint32_t', 'size'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [param('ns3::Address', 'address')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): void ns3::NetDevice::SetIfIndex(uint32_t const index) [member function]
-    cls.add_method('SetIfIndex', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('uint32_t const', 'index')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::SetMtu(uint16_t const mtu) [member function]
-    cls.add_method('SetMtu', 
-                   'bool', 
-                   [param('uint16_t const', 'mtu')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): void ns3::NetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('SetNode', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): void ns3::NetDevice::SetPromiscReceiveCallback(ns3::NetDevice::PromiscReceiveCallback cb) [member function]
-    cls.add_method('SetPromiscReceiveCallback', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): void ns3::NetDevice::SetReceiveCallback(ns3::NetDevice::ReceiveCallback cb) [member function]
-    cls.add_method('SetReceiveCallback', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
                    'void', 
-                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## net-device.h (module 'network'): bool ns3::NetDevice::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3NeverLosChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::NeverLosChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::NeverLosChannelConditionModel::NeverLosChannelConditionModel() [constructor]
+def register_Ns3RrpaaWifiManager_methods(root_module, cls):
+    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::RrpaaWifiManager::RrpaaWifiManager(ns3::RrpaaWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::RrpaaWifiManager const &', 'arg0')])
+    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::RrpaaWifiManager::RrpaaWifiManager() [constructor]
     cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::NeverLosChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetChannelCondition', 
-                   'ns3::Ptr< ns3::ChannelCondition >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True)
-    ## channel-condition-model.h (module 'propagation'): int64_t ns3::NeverLosChannelConditionModel::AssignStreams(int64_t stream) [member function]
+    ## rrpaa-wifi-manager.h (module 'wifi'): int64_t ns3::RrpaaWifiManager::AssignStreams(int64_t stream) [member function]
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('int64_t', 'stream')], 
                    is_virtual=True)
-    return
-
-def register_Ns3NeverLosVehicleChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::NeverLosVehicleChannelConditionModel::GetTypeId() [member function]
+    ## rrpaa-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::RrpaaWifiManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::NeverLosVehicleChannelConditionModel::NeverLosVehicleChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::NeverLosVehicleChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetChannelCondition', 
-                   'ns3::Ptr< ns3::ChannelCondition >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True)
-    ## channel-condition-model.h (module 'propagation'): int64_t ns3::NeverLosVehicleChannelConditionModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetupMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetupPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
                    is_virtual=True)
+    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::RrpaaWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RrpaaWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RrpaaWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): bool ns3::RrpaaWifiManager::DoNeedRts(ns3::WifiRemoteStation * st, uint32_t size, bool normally) [member function]
+    cls.add_method('DoNeedRts', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'st'), param('uint32_t', 'size'), param('bool', 'normally')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3NistErrorRateModel_methods(root_module, cls):
-    ## nist-error-rate-model.h (module 'wifi'): ns3::NistErrorRateModel::NistErrorRateModel(ns3::NistErrorRateModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::NistErrorRateModel const &', 'arg0')])
-    ## nist-error-rate-model.h (module 'wifi'): ns3::NistErrorRateModel::NistErrorRateModel() [constructor]
+def register_Ns3SimpleFrameCaptureModel_methods(root_module, cls):
+    ## simple-frame-capture-model.h (module 'wifi'): ns3::SimpleFrameCaptureModel::SimpleFrameCaptureModel(ns3::SimpleFrameCaptureModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SimpleFrameCaptureModel const &', 'arg0')])
+    ## simple-frame-capture-model.h (module 'wifi'): ns3::SimpleFrameCaptureModel::SimpleFrameCaptureModel() [constructor]
     cls.add_constructor([])
-    ## nist-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::NistErrorRateModel::GetTypeId() [member function]
+    ## simple-frame-capture-model.h (module 'wifi'): bool ns3::SimpleFrameCaptureModel::CaptureNewFrame(ns3::Ptr<ns3::Event> currentEvent, ns3::Ptr<ns3::Event> newEvent) const [member function]
+    cls.add_method('CaptureNewFrame', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Event >', 'currentEvent'), param('ns3::Ptr< ns3::Event >', 'newEvent')], 
+                   is_const=True, is_virtual=True)
+    ## simple-frame-capture-model.h (module 'wifi'): double ns3::SimpleFrameCaptureModel::GetMargin() const [member function]
+    cls.add_method('GetMargin', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## simple-frame-capture-model.h (module 'wifi'): static ns3::TypeId ns3::SimpleFrameCaptureModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## nist-error-rate-model.h (module 'wifi'): double ns3::NistErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint64_t nbits) const [member function]
-    cls.add_method('DoGetChunkSuccessRate', 
-                   'double', 
-                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## simple-frame-capture-model.h (module 'wifi'): void ns3::SimpleFrameCaptureModel::SetMargin(double margin) [member function]
+    cls.add_method('SetMargin', 
+                   'void', 
+                   [param('double', 'margin')])
     return
 
-def register_Ns3NixVector_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
+def register_Ns3SpectrumChannel_methods(root_module, cls):
+    ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel(ns3::SpectrumChannel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SpectrumChannel const &', 'arg0')])
+    ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
     cls.add_constructor([])
-    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector(ns3::NixVector const & o) [constructor]
-    cls.add_constructor([param('ns3::NixVector const &', 'o')])
-    ## nix-vector.h (module 'network'): void ns3::NixVector::AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits) [member function]
-    cls.add_method('AddNeighborIndex', 
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
+    cls.add_method('AddPropagationLossModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PropagationLossModel >', 'loss')])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
+    cls.add_method('AddRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddSpectrumPropagationLossModel(ns3::Ptr<ns3::SpectrumPropagationLossModel> loss) [member function]
+    cls.add_method('AddSpectrumPropagationLossModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumPropagationLossModel >', 'loss')])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
                    'void', 
-                   [param('uint32_t', 'newBits'), param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::BitCount(uint32_t numberOfNeighbors) const [member function]
-    cls.add_method('BitCount', 
-                   'uint32_t', 
-                   [param('uint32_t', 'numberOfNeighbors')], 
-                   is_const=True)
-    ## nix-vector.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::NixVector::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::NixVector >', 
                    [], 
-                   is_const=True)
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::ExtractNeighborIndex(uint32_t numberOfBits) [member function]
-    cls.add_method('ExtractNeighborIndex', 
-                   'uint32_t', 
-                   [param('uint32_t', 'numberOfBits')])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
-    cls.add_method('GetRemainingBits', 
-                   'uint32_t', 
+                   is_virtual=True)
+    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PropagationLossModel> ns3::SpectrumChannel::GetPropagationLossModel() [member function]
+    cls.add_method('GetPropagationLossModel', 
+                   'ns3::Ptr< ns3::PropagationLossModel >', 
                    [])
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
+    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumPropagationLossModel> ns3::SpectrumChannel::GetSpectrumPropagationLossModel() [member function]
+    cls.add_method('GetSpectrumPropagationLossModel', 
+                   'ns3::Ptr< ns3::SpectrumPropagationLossModel >', 
+                   [])
+    ## spectrum-channel.h (module 'spectrum'): static ns3::TypeId ns3::SpectrumChannel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   'uint32_t', 
-                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
-                   is_const=True)
+                   is_static=True)
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
+    cls.add_method('SetPropagationDelayModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PropagationDelayModel >', 'delay')])
+    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::StartTx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params')], 
+                   is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3Node_methods(root_module, cls):
-    ## node.h (module 'network'): ns3::Node::Node(ns3::Node const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Node const &', 'arg0')])
-    ## node.h (module 'network'): ns3::Node::Node() [constructor]
+def register_Ns3SpectrumWifiPhy_methods(root_module, cls):
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::SpectrumWifiPhy::SpectrumWifiPhy(ns3::SpectrumWifiPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SpectrumWifiPhy const &', 'arg0')])
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::SpectrumWifiPhy::SpectrumWifiPhy() [constructor]
     cls.add_constructor([])
-    ## node.h (module 'network'): ns3::Node::Node(uint32_t systemId) [constructor]
-    cls.add_constructor([param('uint32_t', 'systemId')])
-    ## node.h (module 'network'): uint32_t ns3::Node::AddApplication(ns3::Ptr<ns3::Application> application) [member function]
-    cls.add_method('AddApplication', 
-                   'uint32_t', 
-                   [param('ns3::Ptr< ns3::Application >', 'application')])
-    ## node.h (module 'network'): uint32_t ns3::Node::AddDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
-    cls.add_method('AddDevice', 
-                   'uint32_t', 
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
+    cls.add_method('ConfigureStandardAndBand', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::CreateWifiSpectrumPhyInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('CreateWifiSpectrumPhyInterface', 
+                   'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'device')])
-    ## node.h (module 'network'): static bool ns3::Node::ChecksumEnabled() [member function]
-    cls.add_method('ChecksumEnabled', 
-                   'bool', 
-                   [], 
-                   is_static=True)
-    ## node.h (module 'network'): ns3::Ptr<ns3::Application> ns3::Node::GetApplication(uint32_t index) const [member function]
-    cls.add_method('GetApplication', 
-                   'ns3::Ptr< ns3::Application >', 
-                   [param('uint32_t', 'index')], 
-                   is_const=True)
-    ## node.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Node::GetDevice(uint32_t index) const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [param('uint32_t', 'index')], 
-                   is_const=True)
-    ## node.h (module 'network'): uint32_t ns3::Node::GetId() const [member function]
-    cls.add_method('GetId', 
+    ## spectrum-wifi-phy.h (module 'wifi'): uint32_t ns3::SpectrumWifiPhy::GetBandBandwidth() const [member function]
+    cls.add_method('GetBandBandwidth', 
                    'uint32_t', 
                    [], 
                    is_const=True)
-    ## node.h (module 'network'): ns3::Time ns3::Node::GetLocalTime() const [member function]
-    cls.add_method('GetLocalTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## node.h (module 'network'): uint32_t ns3::Node::GetNApplications() const [member function]
-    cls.add_method('GetNApplications', 
-                   'uint32_t', 
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::SpectrumWifiPhy::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
                    [], 
-                   is_const=True)
-    ## node.h (module 'network'): uint32_t ns3::Node::GetNDevices() const [member function]
-    cls.add_method('GetNDevices', 
-                   'uint32_t', 
+                   is_const=True, is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): uint16_t ns3::SpectrumWifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
+    cls.add_method('GetGuardBandwidth', 
+                   'uint16_t', 
+                   [param('uint16_t', 'currentChannelWidth')], 
+                   is_const=True, is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumWifiPhy::GetRxAntenna() const [member function]
+    cls.add_method('GetRxAntenna', 
+                   'ns3::Ptr< ns3::AntennaModel >', 
                    [], 
                    is_const=True)
-    ## node.h (module 'network'): uint32_t ns3::Node::GetSystemId() const [member function]
-    cls.add_method('GetSystemId', 
-                   'uint32_t', 
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<const ns3::SpectrumModel> ns3::SpectrumWifiPhy::GetRxSpectrumModel() [member function]
+    cls.add_method('GetRxSpectrumModel', 
+                   'ns3::Ptr< ns3::SpectrumModel const >', 
+                   [])
+    ## spectrum-wifi-phy.h (module 'wifi'): std::tuple<double, double, double> ns3::SpectrumWifiPhy::GetTxMaskRejectionParams() const [member function]
+    cls.add_method('GetTxMaskRejectionParams', 
+                   'std::tuple< double, double, double >', 
                    [], 
-                   is_const=True)
-    ## node.h (module 'network'): static ns3::TypeId ns3::Node::GetTypeId() [member function]
+                   is_const=True, is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::SpectrumWifiPhy::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## node.h (module 'network'): void ns3::Node::RegisterDeviceAdditionListener(ns3::Node::DeviceAdditionListener listener) [member function]
-    cls.add_method('RegisterDeviceAdditionListener', 
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetAntenna(ns3::Ptr<ns3::AntennaModel> const antenna) [member function]
+    cls.add_method('SetAntenna', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
-    ## node.h (module 'network'): void ns3::Node::RegisterProtocolHandler(ns3::Node::ProtocolHandler handler, uint16_t protocolType, ns3::Ptr<ns3::NetDevice> device, bool promiscuous=false) [member function]
-    cls.add_method('RegisterProtocolHandler', 
+                   [param('ns3::Ptr< ns3::AntennaModel > const', 'antenna')])
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> const channel) [member function]
+    cls.add_method('SetChannel', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler'), param('uint16_t', 'protocolType'), param('ns3::Ptr< ns3::NetDevice >', 'device'), param('bool', 'promiscuous', default_value='false')])
-    ## node.h (module 'network'): void ns3::Node::UnregisterDeviceAdditionListener(ns3::Node::DeviceAdditionListener listener) [member function]
-    cls.add_method('UnregisterDeviceAdditionListener', 
+                   [param('ns3::Ptr< ns3::SpectrumChannel > const', 'channel')])
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannelNumber(uint8_t id) [member function]
+    cls.add_method('SetChannelNumber', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
-    ## node.h (module 'network'): void ns3::Node::UnregisterProtocolHandler(ns3::Node::ProtocolHandler handler) [member function]
-    cls.add_method('UnregisterProtocolHandler', 
+                   [param('uint8_t', 'id')], 
+                   is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannelWidth(uint16_t channelwidth) [member function]
+    cls.add_method('SetChannelWidth', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler')])
-    ## node.h (module 'network'): void ns3::Node::DoDispose() [member function]
+                   [param('uint16_t', 'channelwidth')], 
+                   is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetFrequency(uint16_t freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('uint16_t', 'freq')], 
+                   is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> rxParams) [member function]
+    cls.add_method('StartRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'rxParams')])
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_virtual=True)
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::Transmit(ns3::Ptr<ns3::WifiSpectrumSignalParameters> txParams) [member function]
+    cls.add_method('Transmit', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiSpectrumSignalParameters >', 'txParams')])
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## node.h (module 'network'): void ns3::Node::DoInitialize() [member function]
+    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::SpectrumWifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
+    cls.add_method('GetBand', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_virtual=True, visibility='protected')
+    ## spectrum-wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::SpectrumWifiPhy::ConvertHeRuSubcarriers(uint16_t bandWidth, uint16_t guardBandwidth, ns3::HeRu::SubcarrierRange range, uint8_t bandIndex=0) const [member function]
+    cls.add_method('ConvertHeRuSubcarriers', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('uint16_t', 'bandWidth'), param('uint16_t', 'guardBandwidth'), param('std::pair< short, short >', 'range'), param('uint8_t', 'bandIndex', default_value='0')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3NormalRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::INFINITE_VALUE [variable]
-    cls.add_static_attribute('INFINITE_VALUE', 'double const', is_const=True)
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::NormalRandomVariable::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::NormalRandomVariable() [constructor]
+def register_Ns3Ssid_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(ns3::Ssid const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ssid const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetMean() const [member function]
-    cls.add_method('GetMean', 
-                   'double', 
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(std::string s) [constructor]
+    cls.add_constructor([param('std::string', 's')])
+    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## ssid.h (module 'wifi'): ns3::WifiInformationElementId ns3::Ssid::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetVariance() const [member function]
-    cls.add_method('GetVariance', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetBound() const [member function]
-    cls.add_method('GetBound', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue(double mean, double variance, double bound=ns3::NormalRandomVariable::INFINITE_VALUE) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'mean'), param('double', 'variance'), param('double', 'bound', default_value='ns3::NormalRandomVariable::INFINITE_VALUE')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger(uint32_t mean, uint32_t variance, uint32_t bound) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'mean'), param('uint32_t', 'variance'), param('uint32_t', 'bound')])
-    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [], 
-                   is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsEqual(ns3::Ssid const & o) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ssid const &', 'o')], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): char * ns3::Ssid::PeekString() const [member function]
+    cls.add_method('PeekString', 
+                   'char *', 
                    [], 
-                   is_virtual=True)
+                   is_const=True)
+    ## ssid.h (module 'wifi'): void ns3::Ssid::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
     return
 
-def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
+def register_Ns3SsidChecker_methods(root_module, cls):
+    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker() [constructor]
     cls.add_constructor([])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker(ns3::ObjectFactoryChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ObjectFactoryChecker const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker(ns3::SsidChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SsidChecker const &', 'arg0')])
     return
 
-def register_Ns3ObjectFactoryValue_methods(root_module, cls):
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue() [constructor]
+def register_Ns3SsidValue_methods(root_module, cls):
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue() [constructor]
     cls.add_constructor([])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactory const & value) [constructor]
-    cls.add_constructor([param('ns3::ObjectFactory const &', 'value')])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactoryValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ObjectFactoryValue const &', 'arg0')])
-    ## object-factory.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::ObjectFactoryValue::Copy() const [member function]
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::Ssid const & value) [constructor]
+    cls.add_constructor([param('ns3::Ssid const &', 'value')])
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::SsidValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SsidValue const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::SsidValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## object-factory.h (module 'core'): bool ns3::ObjectFactoryValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    ## ssid.h (module 'wifi'): bool ns3::SsidValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## object-factory.h (module 'core'): ns3::ObjectFactory ns3::ObjectFactoryValue::Get() const [member function]
+    ## ssid.h (module 'wifi'): ns3::Ssid ns3::SsidValue::Get() const [member function]
     cls.add_method('Get', 
-                   'ns3::ObjectFactory', 
+                   'ns3::Ssid', 
                    [], 
                    is_const=True)
-    ## object-factory.h (module 'core'): std::string ns3::ObjectFactoryValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    ## ssid.h (module 'wifi'): std::string ns3::SsidValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## object-factory.h (module 'core'): void ns3::ObjectFactoryValue::Set(ns3::ObjectFactory const & value) [member function]
+    ## ssid.h (module 'wifi'): void ns3::SsidValue::Set(ns3::Ssid const & value) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('ns3::ObjectFactory const &', 'value')])
+                   [param('ns3::Ssid const &', 'value')])
     return
 
-def register_Ns3OkumuraHataPropagationLossModel_methods(root_module, cls):
-    ## okumura-hata-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::OkumuraHataPropagationLossModel::GetTypeId() [member function]
+def register_Ns3StaWifiMac_methods(root_module, cls):
+    ## sta-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::StaWifiMac::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## okumura-hata-propagation-loss-model.h (module 'propagation'): ns3::OkumuraHataPropagationLossModel::OkumuraHataPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## okumura-hata-propagation-loss-model.h (module 'propagation'): double ns3::OkumuraHataPropagationLossModel::GetLoss(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetLoss', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True)
-    ## okumura-hata-propagation-loss-model.h (module 'propagation'): double ns3::OkumuraHataPropagationLossModel::DoCalcRxPower(double txPowerDbm, ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b) const [member function]
-    cls.add_method('DoCalcRxPower', 
-                   'double', 
-                   [param('double', 'txPowerDbm'), param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## okumura-hata-propagation-loss-model.h (module 'propagation'): int64_t ns3::OkumuraHataPropagationLossModel::DoAssignStreams(int64_t stream) [member function]
-    cls.add_method('DoAssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3OnoeWifiManager_methods(root_module, cls):
-    ## onoe-wifi-manager.h (module 'wifi'): ns3::OnoeWifiManager::OnoeWifiManager(ns3::OnoeWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::OnoeWifiManager const &', 'arg0')])
-    ## onoe-wifi-manager.h (module 'wifi'): ns3::OnoeWifiManager::OnoeWifiManager() [constructor]
+    ## sta-wifi-mac.h (module 'wifi'): ns3::StaWifiMac::StaWifiMac() [constructor]
     cls.add_constructor([])
-    ## onoe-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::OnoeWifiManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_virtual=True)
+    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_virtual=True)
+    ## sta-wifi-mac.h (module 'wifi'): bool ns3::StaWifiMac::IsAssociated() const [member function]
+    cls.add_method('IsAssociated', 
+                   'bool', 
                    [], 
-                   is_static=True)
-    ## onoe-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::OnoeWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+                   is_const=True)
+    ## sta-wifi-mac.h (module 'wifi'): uint16_t ns3::StaWifiMac::GetAssociationId() const [member function]
+    cls.add_method('GetAssociationId', 
+                   'uint16_t', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::OnoeWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::OnoeWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_const=True)
+    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
                    is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoInitialize() [member function]
+    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## onoe-wifi-manager.h (module 'wifi'): void ns3::OnoeWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3OutputStreamWrapper_methods(root_module, cls):
-    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(ns3::OutputStreamWrapper const & arg0) [constructor]
-    cls.add_constructor([param('ns3::OutputStreamWrapper const &', 'arg0')])
-    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(std::string filename, std::ios_base::openmode filemode) [constructor]
-    cls.add_constructor([param('std::string', 'filename'), param('std::ios_base::openmode', 'filemode')])
-    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(std::ostream * os) [constructor]
-    cls.add_constructor([param('std::ostream *', 'os')])
-    ## output-stream-wrapper.h (module 'network'): std::ostream * ns3::OutputStreamWrapper::GetStream() [member function]
-    cls.add_method('GetStream', 
-                   'std::ostream *', 
-                   [])
     return
 
-def register_Ns3Packet_methods(root_module, cls):
+def register_Ns3SupportedRates_methods(root_module, cls):
     cls.add_output_stream_operator()
-    ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates() [constructor]
     cls.add_constructor([])
-    ## packet.h (module 'network'): ns3::Packet::Packet(ns3::Packet const & o) [constructor]
-    cls.add_constructor([param('ns3::Packet const &', 'o')])
-    ## packet.h (module 'network'): ns3::Packet::Packet(uint32_t size) [constructor]
-    cls.add_constructor([param('uint32_t', 'size')])
-    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size, bool magic) [constructor]
-    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size'), param('bool', 'magic')])
-    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size) [constructor]
-    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
-    ## packet.h (module 'network'): void ns3::Packet::AddAtEnd(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('AddAtEnd', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag) const [member function]
-    cls.add_method('AddByteTag', 
-                   'void', 
-                   [param('ns3::Tag const &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag, uint32_t start, uint32_t end) const [member function]
-    cls.add_method('AddByteTag', 
-                   'void', 
-                   [param('ns3::Tag const &', 'tag'), param('uint32_t', 'start'), param('uint32_t', 'end')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::AddHeader(ns3::Header const & header) [member function]
-    cls.add_method('AddHeader', 
-                   'void', 
-                   [param('ns3::Header const &', 'header')])
-    ## packet.h (module 'network'): void ns3::Packet::AddPacketTag(ns3::Tag const & tag) const [member function]
-    cls.add_method('AddPacketTag', 
-                   'void', 
-                   [param('ns3::Tag const &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::AddPaddingAtEnd(uint32_t size) [member function]
-    cls.add_method('AddPaddingAtEnd', 
-                   'void', 
-                   [param('uint32_t', 'size')])
-    ## packet.h (module 'network'): void ns3::Packet::AddTrailer(ns3::Trailer const & trailer) [member function]
-    cls.add_method('AddTrailer', 
-                   'void', 
-                   [param('ns3::Trailer const &', 'trailer')])
-    ## packet.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::Packet::BeginItem() const [member function]
-    cls.add_method('BeginItem', 
-                   'ns3::PacketMetadata::ItemIterator', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::CopyData(uint8_t * buffer, uint32_t size) const [member function]
-    cls.add_method('CopyData', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::CopyData(std::ostream * os, uint32_t size) const [member function]
-    cls.add_method('CopyData', 
-                   'void', 
-                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::CreateFragment(uint32_t start, uint32_t length) const [member function]
-    cls.add_method('CreateFragment', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
-                   is_const=True)
-    ## packet.h (module 'network'): static void ns3::Packet::EnableChecking() [member function]
-    cls.add_method('EnableChecking', 
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates(ns3::SupportedRates const & rates) [constructor]
+    cls.add_constructor([param('ns3::SupportedRates const &', 'rates')])
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::AddBssMembershipSelectorRate(uint64_t bs) [member function]
+    cls.add_method('AddBssMembershipSelectorRate', 
                    'void', 
-                   [], 
-                   is_static=True)
-    ## packet.h (module 'network'): static void ns3::Packet::EnablePrinting() [member function]
-    cls.add_method('EnablePrinting', 
+                   [param('uint64_t', 'bs')])
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::AddSupportedRate(uint64_t bs) [member function]
+    cls.add_method('AddSupportedRate', 
                    'void', 
+                   [param('uint64_t', 'bs')])
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## supported-rates.h (module 'wifi'): ns3::WifiInformationElementId ns3::SupportedRates::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_static=True)
-    ## packet.h (module 'network'): bool ns3::Packet::FindFirstMatchingByteTag(ns3::Tag & tag) const [member function]
-    cls.add_method('FindFirstMatchingByteTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::ByteTagIterator ns3::Packet::GetByteTagIterator() const [member function]
-    cls.add_method('GetByteTagIterator', 
-                   'ns3::ByteTagIterator', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::Packet::GetNixVector() const [member function]
-    cls.add_method('GetNixVector', 
-                   'ns3::Ptr< ns3::NixVector >', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): ns3::PacketTagIterator ns3::Packet::GetPacketTagIterator() const [member function]
-    cls.add_method('GetPacketTagIterator', 
-                   'ns3::PacketTagIterator', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSize() const [member function]
-    cls.add_method('GetSize', 
-                   'uint32_t', 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
-                   is_const=True)
-    ## packet.h (module 'network'): uint64_t ns3::Packet::GetUid() const [member function]
-    cls.add_method('GetUid', 
-                   'uint64_t', 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::GetNRates() const [member function]
+    cls.add_method('GetNRates', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
-    cls.add_method('PeekHeader', 
+    ## supported-rates.h (module 'wifi'): uint32_t ns3::SupportedRates::GetRate(uint8_t i) const [member function]
+    cls.add_method('GetRate', 
                    'uint32_t', 
-                   [param('ns3::Header &', 'header')], 
+                   [param('uint8_t', 'i')], 
                    is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header, uint32_t size) const [member function]
-    cls.add_method('PeekHeader', 
-                   'uint32_t', 
-                   [param('ns3::Header &', 'header'), param('uint32_t', 'size')], 
+    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsBasicRate(uint64_t bs) const [member function]
+    cls.add_method('IsBasicRate', 
+                   'bool', 
+                   [param('uint64_t', 'bs')], 
                    is_const=True)
-    ## packet.h (module 'network'): bool ns3::Packet::PeekPacketTag(ns3::Tag & tag) const [member function]
-    cls.add_method('PeekPacketTag', 
+    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsBssMembershipSelectorRate(uint64_t bs) const [member function]
+    cls.add_method('IsBssMembershipSelectorRate', 
                    'bool', 
-                   [param('ns3::Tag &', 'tag')], 
+                   [param('uint64_t', 'bs')], 
                    is_const=True)
-    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekTrailer(ns3::Trailer & trailer) [member function]
-    cls.add_method('PeekTrailer', 
-                   'uint32_t', 
-                   [param('ns3::Trailer &', 'trailer')])
-    ## packet.h (module 'network'): void ns3::Packet::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
+    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsSupportedRate(uint64_t bs) const [member function]
+    cls.add_method('IsSupportedRate', 
+                   'bool', 
+                   [param('uint64_t', 'bs')], 
                    is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::PrintByteTags(std::ostream & os) const [member function]
-    cls.add_method('PrintByteTags', 
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
                    'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::PrintPacketTags(std::ostream & os) const [member function]
-    cls.add_method('PrintPacketTags', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::SetBasicRate(uint64_t bs) [member function]
+    cls.add_method('SetBasicRate', 
                    'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAllByteTags() [member function]
-    cls.add_method('RemoveAllByteTags', 
+                   [param('uint64_t', 'bs')])
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::MAX_SUPPORTED_RATES [variable]
+    cls.add_static_attribute('MAX_SUPPORTED_RATES', 'uint8_t const', is_const=True)
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::extended [variable]
+    cls.add_instance_attribute('extended', 'ns3::ExtendedSupportedRatesIE', is_const=False)
+    return
+
+def register_Ns3TableBasedErrorRateModel_methods(root_module, cls):
+    ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel::TableBasedErrorRateModel(ns3::TableBasedErrorRateModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::TableBasedErrorRateModel const &', 'arg0')])
+    ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel::TableBasedErrorRateModel() [constructor]
+    cls.add_constructor([])
+    ## table-based-error-rate-model.h (module 'wifi'): static uint8_t ns3::TableBasedErrorRateModel::GetMcsForMode(ns3::WifiMode mode) [member function]
+    cls.add_method('GetMcsForMode', 
+                   'uint8_t', 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_static=True)
+    ## table-based-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::TableBasedErrorRateModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## table-based-error-rate-model.h (module 'wifi'): double ns3::TableBasedErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector const & txVector, double snr, uint64_t nbits, uint8_t numRxAntennas, ns3::WifiPpduField field, uint16_t staId) const [member function]
+    cls.add_method('DoGetChunkSuccessRate', 
+                   'double', 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits'), param('uint8_t', 'numRxAntennas'), param('ns3::WifiPpduField', 'field'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThompsonSamplingWifiManager_methods(root_module, cls):
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): ns3::ThompsonSamplingWifiManager::ThompsonSamplingWifiManager(ns3::ThompsonSamplingWifiManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ThompsonSamplingWifiManager const &', 'arg0')])
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): ns3::ThompsonSamplingWifiManager::ThompsonSamplingWifiManager() [constructor]
+    cls.add_constructor([])
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): int64_t ns3::ThompsonSamplingWifiManager::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ThompsonSamplingWifiManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ThompsonSamplingWifiManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ThompsonSamplingWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ThompsonSamplingWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportAmpduTxStatus(ns3::WifiRemoteStation * station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportAmpduTxStatus', 
                    'void', 
-                   [])
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAllPacketTags() [member function]
-    cls.add_method('RemoveAllPacketTags', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint16_t', 'nSuccessfulMpdus'), param('uint16_t', 'nFailedMpdus'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
                    'void', 
-                   [])
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAtEnd(uint32_t size) [member function]
-    cls.add_method('RemoveAtEnd', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
+    cls.add_method('DoReportDataOk', 
                    'void', 
-                   [param('uint32_t', 'size')])
-    ## packet.h (module 'network'): void ns3::Packet::RemoveAtStart(uint32_t size) [member function]
-    cls.add_method('RemoveAtStart', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
                    'void', 
-                   [param('uint32_t', 'size')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header) [member function]
-    cls.add_method('RemoveHeader', 
-                   'uint32_t', 
-                   [param('ns3::Header &', 'header')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header, uint32_t size) [member function]
-    cls.add_method('RemoveHeader', 
-                   'uint32_t', 
-                   [param('ns3::Header &', 'header'), param('uint32_t', 'size')])
-    ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
-    cls.add_method('RemovePacketTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
-    cls.add_method('RemoveTrailer', 
-                   'uint32_t', 
-                   [param('ns3::Trailer &', 'trailer')])
-    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
-    cls.add_method('ReplacePacketTag', 
-                   'bool', 
-                   [param('ns3::Tag &', 'tag')])
-    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
-    cls.add_method('Serialize', 
-                   'uint32_t', 
-                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
-                   is_const=True)
-    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> nixVector) [member function]
-    cls.add_method('SetNixVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NixVector >', 'nixVector')])
-    ## packet.h (module 'network'): std::string ns3::Packet::ToString() const [member function]
-    cls.add_method('ToString', 
-                   'std::string', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_virtual=True, visibility='private')
+    ## thompson-sampling-wifi-manager.h (module 'wifi'): void ns3::ThompsonSamplingWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppChannelConditionModel::ThreeGppChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): int64_t ns3::ThreeGppChannelConditionModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::ThreeGppChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetChannelCondition', 
+                   'ns3::Ptr< ns3::ChannelCondition >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True)
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): static double ns3::ThreeGppChannelConditionModel::Calculate2dDistance(ns3::Vector const & a, ns3::Vector const & b) [member function]
+    cls.add_method('Calculate2dDistance', 
+                   'double', 
+                   [param('ns3::Vector const &', 'a'), param('ns3::Vector const &', 'b')], 
+                   is_static=True, visibility='protected')
+    ## channel-condition-model.h (module 'propagation'): void ns3::ThreeGppChannelConditionModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppChannelConditionModel::ComputePnlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePnlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppIndoorMixedOfficeChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppIndoorMixedOfficeChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppIndoorMixedOfficeChannelConditionModel::ThreeGppIndoorMixedOfficeChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppIndoorMixedOfficeChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppIndoorOfficePropagationLossModel_methods(root_module, cls):
+    ## three-gpp-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppIndoorOfficePropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## three-gpp-propagation-loss-model.h (module 'propagation'): ns3::ThreeGppIndoorOfficePropagationLossModel::ThreeGppIndoorOfficePropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetLossLos(double distance2D, double distance3D, double hUt, double hBs) const [member function]
+    cls.add_method('GetLossLos', 
+                   'double', 
+                   [param('double', 'distance2D'), param('double', 'distance3D'), param('double', 'hUt'), param('double', 'hBs')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetLossNlos(double distance2D, double distance3D, double hUt, double hBs) const [member function]
+    cls.add_method('GetLossNlos', 
+                   'double', 
+                   [param('double', 'distance2D'), param('double', 'distance3D'), param('double', 'hUt'), param('double', 'hBs')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetShadowingStd(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b, ns3::ChannelCondition::LosConditionValue cond) const [member function]
+    cls.add_method('GetShadowingStd', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b'), param('ns3::ChannelCondition::LosConditionValue', 'cond')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetShadowingCorrelationDistance(ns3::ChannelCondition::LosConditionValue cond) const [member function]
+    cls.add_method('GetShadowingCorrelationDistance', 
+                   'double', 
+                   [param('ns3::ChannelCondition::LosConditionValue', 'cond')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppIndoorOpenOfficeChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppIndoorOpenOfficeChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppIndoorOpenOfficeChannelConditionModel::ThreeGppIndoorOpenOfficeChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppIndoorOpenOfficeChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3ParetoRandomVariable_methods(root_module, cls):
-    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ParetoRandomVariable::GetTypeId() [member function]
+def register_Ns3ThreeGppRmaChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppRmaChannelConditionModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable::ParetoRandomVariable() [constructor]
+    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppRmaChannelConditionModel::ThreeGppRmaChannelConditionModel() [constructor]
     cls.add_constructor([])
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetScale() const [member function]
-    cls.add_method('GetScale', 
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppRmaChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
                    'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppUmaChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppUmaChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetShape() const [member function]
-    cls.add_method('GetShape', 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppUmaChannelConditionModel::ThreeGppUmaChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppUmaChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
                    'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppUmiStreetCanyonChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppUmiStreetCanyonChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetBound() const [member function]
-    cls.add_method('GetBound', 
+                   is_static=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppUmiStreetCanyonChannelConditionModel::ThreeGppUmiStreetCanyonChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppUmiStreetCanyonChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
                    'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ThreeGppV2vHighwayPropagationLossModel_methods(root_module, cls):
+    ## three-gpp-v2v-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppV2vHighwayPropagationLossModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue(double scale, double shape, double bound) [member function]
-    cls.add_method('GetValue', 
-                   'double', 
-                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
-                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
-    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue() [member function]
-    cls.add_method('GetValue', 
+                   is_static=True)
+    ## three-gpp-v2v-propagation-loss-model.h (module 'propagation'): ns3::ThreeGppV2vHighwayPropagationLossModel::ThreeGppV2vHighwayPropagationLossModel() [constructor]
+    cls.add_constructor([])
+    ## three-gpp-v2v-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppV2vHighwayPropagationLossModel::GetLossLos(double distance2D, double distance3D, double hUt, double hBs) const [member function]
+    cls.add_method('GetLossLos', 
                    'double', 
+                   [param('double', 'distance2D'), param('double', 'distance3D'), param('double', 'hUt'), param('double', 'hBs')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3TimeValue_methods(root_module, cls):
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::Time const & value) [constructor]
+    cls.add_constructor([param('ns3::Time const &', 'value')])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::TimeValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::TimeValue const &', 'arg0')])
+    ## nstime.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TimeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): bool ns3::TimeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger() [member function]
-    cls.add_method('GetInteger', 
-                   'uint32_t', 
+    ## nstime.h (module 'core'): ns3::Time ns3::TimeValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Time', 
                    [], 
-                   is_virtual=True)
+                   is_const=True)
+    ## nstime.h (module 'core'): std::string ns3::TimeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): void ns3::TimeValue::Set(ns3::Time const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Time const &', 'value')])
     return
 
-def register_Ns3ParfWifiManager_methods(root_module, cls):
-    ## parf-wifi-manager.h (module 'wifi'): ns3::ParfWifiManager::ParfWifiManager(ns3::ParfWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ParfWifiManager const &', 'arg0')])
-    ## parf-wifi-manager.h (module 'wifi'): ns3::ParfWifiManager::ParfWifiManager() [constructor]
+def register_Ns3TypeIdChecker_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
     cls.add_constructor([])
-    ## parf-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::ParfWifiManager::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker(ns3::TypeIdChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::TypeIdChecker const &', 'arg0')])
+    return
+
+def register_Ns3TypeIdValue_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeId const & value) [constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'value')])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeIdValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::TypeIdValue const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TypeIdValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_static=True)
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): bool ns3::TypeIdValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## parf-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::ParfWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeIdValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ParfWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::ParfWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeIdValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): void ns3::TypeIdValue::Set(ns3::TypeId const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
+                   [param('ns3::TypeId const &', 'value')])
+    return
+
+def register_Ns3UintegerValue_methods(root_module, cls):
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue() [constructor]
+    cls.add_constructor([])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(uint64_t const & value) [constructor]
+    cls.add_constructor([param('uint64_t const &', 'value')])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(ns3::UintegerValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::UintegerValue const &', 'arg0')])
+    ## uinteger.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::UintegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): bool ns3::UintegerValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## uinteger.h (module 'core'): uint64_t ns3::UintegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## uinteger.h (module 'core'): std::string ns3::UintegerValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): void ns3::UintegerValue::Set(uint64_t const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## parf-wifi-manager.h (module 'wifi'): void ns3::ParfWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('uint64_t const &', 'value')])
+    return
+
+def register_Ns3Vector2DChecker_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker(ns3::Vector2DChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Vector2DChecker const &', 'arg0')])
+    return
+
+def register_Ns3Vector2DValue_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2D const & value) [constructor]
+    cls.add_constructor([param('ns3::Vector2D const &', 'value')])
+    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2DValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Vector2DValue const &', 'arg0')])
+    ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector2DValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): bool ns3::Vector2DValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vector.h (module 'core'): ns3::Vector2D ns3::Vector2DValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Vector2D', 
+                   [], 
+                   is_const=True)
+    ## vector.h (module 'core'): std::string ns3::Vector2DValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): void ns3::Vector2DValue::Set(ns3::Vector2D const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
+                   [param('ns3::Vector2D const &', 'value')])
     return
 
-def register_Ns3QosBlockedDestinations_methods(root_module, cls):
-    ## qos-blocked-destinations.h (module 'wifi'): ns3::QosBlockedDestinations::QosBlockedDestinations(ns3::QosBlockedDestinations const & arg0) [constructor]
-    cls.add_constructor([param('ns3::QosBlockedDestinations const &', 'arg0')])
-    ## qos-blocked-destinations.h (module 'wifi'): ns3::QosBlockedDestinations::QosBlockedDestinations() [constructor]
+def register_Ns3Vector3DChecker_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker() [constructor]
     cls.add_constructor([])
-    ## qos-blocked-destinations.h (module 'wifi'): void ns3::QosBlockedDestinations::Block(ns3::Mac48Address dest, uint8_t tid) [member function]
-    cls.add_method('Block', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'dest'), param('uint8_t', 'tid')])
-    ## qos-blocked-destinations.h (module 'wifi'): bool ns3::QosBlockedDestinations::IsBlocked(ns3::Mac48Address dest, uint8_t tid) const [member function]
-    cls.add_method('IsBlocked', 
+    ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker(ns3::Vector3DChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Vector3DChecker const &', 'arg0')])
+    return
+
+def register_Ns3Vector3DValue_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3D const & value) [constructor]
+    cls.add_constructor([param('ns3::Vector3D const &', 'value')])
+    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3DValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Vector3DValue const &', 'arg0')])
+    ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector3DValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): bool ns3::Vector3DValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
                    'bool', 
-                   [param('ns3::Mac48Address', 'dest'), param('uint8_t', 'tid')], 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vector.h (module 'core'): ns3::Vector3D ns3::Vector3DValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Vector3D', 
+                   [], 
                    is_const=True)
-    ## qos-blocked-destinations.h (module 'wifi'): void ns3::QosBlockedDestinations::Unblock(ns3::Mac48Address dest, uint8_t tid) [member function]
-    cls.add_method('Unblock', 
+    ## vector.h (module 'core'): std::string ns3::Vector3DValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): void ns3::Vector3DValue::Set(ns3::Vector3D const & value) [member function]
+    cls.add_method('Set', 
                    'void', 
-                   [param('ns3::Mac48Address', 'dest'), param('uint8_t', 'tid')])
+                   [param('ns3::Vector3D const &', 'value')])
     return
 
-def register_Ns3QosTxop_methods(root_module, cls):
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::QosTxop const & arg0) [constructor]
-    cls.add_constructor([param('ns3::QosTxop const &', 'arg0')])
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop() [constructor]
+def register_Ns3VhtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities(ns3::VhtCapabilities const & arg0) [constructor]
+    cls.add_constructor([param('ns3::VhtCapabilities const &', 'arg0')])
+    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities() [constructor]
     cls.add_constructor([])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::BaTxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('BaTxFailed', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::BaTxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('BaTxOk', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteConfig() [member function]
-    cls.add_method('CompleteConfig', 
-                   'void', 
-                   [])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::CompleteMpduTx(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('CompleteMpduTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::QosTxop::DequeuePeekedFrame(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxVector txVector, bool aggregate=true, uint32_t ampduSize=0, ns3::Time ppduDurationLimit=ns3::Time::Min()) [member function]
-    cls.add_method('DequeuePeekedFrame', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxVector', 'txVector'), param('bool', 'aggregate', default_value='true'), param('uint32_t', 'ampduSize', default_value='0'), param('ns3::Time', 'ppduDurationLimit', default_value='ns3::Time::Min()')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::EndTxNoAck() [member function]
-    cls.add_method('EndTxNoAck', 
-                   'void', 
-                   [], 
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
                    is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiAckPolicySelector> ns3::QosTxop::GetAckPolicySelector() const [member function]
-    cls.add_method('GetAckPolicySelector', 
-                   'ns3::Ptr< ns3::WifiAckPolicySelector >', 
+    ## vht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetAddBaResponseTimeout() const [member function]
-    cls.add_method('GetAddBaResponseTimeout', 
-                   'ns3::Time', 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetMaxAmpduLength() const [member function]
+    cls.add_method('GetMaxAmpduLength', 
+                   'uint32_t', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetAmpduExist(ns3::Mac48Address dest) const [member function]
-    cls.add_method('GetAmpduExist', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'dest')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetBaAgreementEstablished(ns3::Mac48Address address, uint8_t tid) const [member function]
-    cls.add_method('GetBaAgreementEstablished', 
-                   'bool', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBaBufferSize(ns3::Mac48Address address, uint8_t tid) const [member function]
-    cls.add_method('GetBaBufferSize', 
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetMaxMpduLength() const [member function]
+    cls.add_method('GetMaxMpduLength', 
                    'uint16_t', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
+                   [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetBaStartingSequence(ns3::Mac48Address address, uint8_t tid) const [member function]
-    cls.add_method('GetBaStartingSequence', 
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxHighestSupportedLgiDataRate() const [member function]
+    cls.add_method('GetRxHighestSupportedLgiDataRate', 
                    'uint16_t', 
-                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'tid')], 
+                   [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetBlockAckThreshold() const [member function]
-    cls.add_method('GetBlockAckThreshold', 
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxLdpc() const [member function]
+    cls.add_method('GetRxLdpc', 
                    'uint8_t', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetFailedAddBaTimeout() const [member function]
-    cls.add_method('GetFailedAddBaTimeout', 
-                   'ns3::Time', 
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxStbc() const [member function]
+    cls.add_method('GetRxStbc', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::QosTxop::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
-    cls.add_method('GetFragmentPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('ns3::WifiMacHeader *', 'hdr')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::GetNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('GetNextSequenceNumberFor', 
+    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
                    'uint16_t', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::MacLowTransmissionParameters ns3::QosTxop::GetTransmissionParameters(ns3::Ptr<const ns3::WifiMacQueueItem> frame) const [member function]
-    cls.add_method('GetTransmissionParameters', 
-                   'ns3::MacLowTransmissionParameters', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'frame')], 
-                   is_const=True)
-    ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetTxopRemaining() const [member function]
-    cls.add_method('GetTxopRemaining', 
-                   'ns3::Time', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): static ns3::TypeId ns3::QosTxop::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
+    cls.add_method('GetSupportedChannelWidthSet', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## qos-txop.h (module 'wifi'): ns3::TypeOfStation ns3::QosTxop::GetTypeOfStation() const [member function]
-    cls.add_method('GetTypeOfStation', 
-                   'ns3::TypeOfStation', 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint64_t ns3::VhtCapabilities::GetSupportedMcsAndNssSet() const [member function]
+    cls.add_method('GetSupportedMcsAndNssSet', 
+                   'uint64_t', 
                    [], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAck() [member function]
-    cls.add_method('GotAck', 
-                   'void', 
+    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetTxStbc() const [member function]
+    cls.add_method('GetTxStbc', 
+                   'uint8_t', 
                    [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotAddBaResponse(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
-    cls.add_method('GotAddBaResponse', 
-                   'void', 
-                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient, double rxSnr, double dataSnr, ns3::WifiTxVector dataTxVector) [member function]
-    cls.add_method('GotBlockAck', 
-                   'void', 
-                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('double', 'rxSnr'), param('double', 'dataSnr'), param('ns3::WifiTxVector', 'dataTxVector')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::GotDelBaFrame(ns3::MgtDelBaHeader const * delBaHdr, ns3::Mac48Address recipient) [member function]
-    cls.add_method('GotDelBaFrame', 
-                   'void', 
-                   [param('ns3::MgtDelBaHeader const *', 'delBaHdr'), param('ns3::Mac48Address', 'recipient')])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::HasFramesToTransmit() [member function]
-    cls.add_method('HasFramesToTransmit', 
-                   'bool', 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetVhtCapabilitiesInfo() const [member function]
+    cls.add_method('GetVhtCapabilitiesInfo', 
+                   'uint32_t', 
                    [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsQosTxop() const [member function]
-    cls.add_method('IsQosTxop', 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedMcs(uint8_t mcs, uint8_t nss) const [member function]
+    cls.add_method('IsSupportedMcs', 
                    'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): ns3::Mac48Address ns3::QosTxop::MapDestAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('MapDestAddressForAggregation', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Mac48Address ns3::QosTxop::MapSrcAddressForAggregation(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('MapSrcAddressForAggregation', 
-                   'ns3::Mac48Address', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::MissedAck() [member function]
-    cls.add_method('MissedAck', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::MissedBlockAck(uint8_t nMpdus) [member function]
-    cls.add_method('MissedBlockAck', 
-                   'void', 
-                   [param('uint8_t', 'nMpdus')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::NeedBarRetransmission() [member function]
-    cls.add_method('NeedBarRetransmission', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedRxMcs', 
                    'bool', 
-                   [])
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::NeedFragmentation() const [member function]
-    cls.add_method('NeedFragmentation', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True)
+    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
+    cls.add_method('IsSupportedTxMcs', 
                    'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyAccessGranted() [member function]
-    cls.add_method('NotifyAccessGranted', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyInternalCollision() [member function]
-    cls.add_method('NotifyInternalCollision', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyMissedCts(std::list<ns3::Ptr<ns3::WifiMacQueueItem>, std::allocator<ns3::Ptr<ns3::WifiMacQueueItem> > > mpduList) [member function]
-    cls.add_method('NotifyMissedCts', 
-                   'void', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > >', 'mpduList')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextFrame(uint8_t tid=8, ns3::Mac48Address recipient=ns3::Mac48Address::GetBroadcast()) [member function]
-    cls.add_method('PeekNextFrame', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('uint8_t', 'tid', default_value='8'), param('ns3::Mac48Address', 'recipient', default_value='ns3::Mac48Address::GetBroadcast()')])
-    ## qos-txop.h (module 'wifi'): uint16_t ns3::QosTxop::PeekNextSequenceNumberFor(ns3::WifiMacHeader const * hdr) [member function]
-    cls.add_method('PeekNextSequenceNumberFor', 
-                   'uint16_t', 
-                   [param('ns3::WifiMacHeader const *', 'hdr')])
-    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PrepareBlockAckRequest(ns3::Mac48Address recipient, uint8_t tid) const [member function]
-    cls.add_method('PrepareBlockAckRequest', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   [param('uint8_t', 'mcs')], 
                    is_const=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::PushFront(ns3::Ptr<const ns3::Packet> packet, ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('PushFront', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::RestartAccessIfNeeded() [member function]
-    cls.add_method('RestartAccessIfNeeded', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::ScheduleBar(ns3::Ptr<const ns3::WifiMacQueueItem> bar, bool skipIfNoDataQueued=false) [member function]
-    cls.add_method('ScheduleBar', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
-    cls.add_method('SendDelbaFrame', 
+    ## vht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
                    'void', 
-                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAccessCategory(ns3::AcIndex ac) [member function]
-    cls.add_method('SetAccessCategory', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxAmpduLength(uint32_t maxAmpduLength) [member function]
+    cls.add_method('SetMaxAmpduLength', 
                    'void', 
-                   [param('ns3::AcIndex', 'ac')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAckPolicySelector(ns3::Ptr<ns3::WifiAckPolicySelector> ackSelector) [member function]
-    cls.add_method('SetAckPolicySelector', 
+                   [param('uint32_t', 'maxAmpduLength')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxMpduLength(uint16_t length) [member function]
+    cls.add_method('SetMaxMpduLength', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiAckPolicySelector >', 'ackSelector')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAddBaResponseTimeout(ns3::Time addBaResponseTimeout) [member function]
-    cls.add_method('SetAddBaResponseTimeout', 
+                   [param('uint16_t', 'length')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxHighestSupportedLgiDataRate(uint16_t supportedDatarate) [member function]
+    cls.add_method('SetRxHighestSupportedLgiDataRate', 
                    'void', 
-                   [param('ns3::Time', 'addBaResponseTimeout')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetAmpduExist(ns3::Mac48Address dest, bool enableAmpdu) [member function]
-    cls.add_method('SetAmpduExist', 
+                   [param('uint16_t', 'supportedDatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxLdpc(uint8_t rxLdpc) [member function]
+    cls.add_method('SetRxLdpc', 
                    'void', 
-                   [param('ns3::Mac48Address', 'dest'), param('bool', 'enableAmpdu')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckInactivityTimeout(uint16_t timeout) [member function]
-    cls.add_method('SetBlockAckInactivityTimeout', 
+                   [param('uint8_t', 'rxLdpc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetRxMcsMap', 
                    'void', 
-                   [param('uint16_t', 'timeout')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetBlockAckThreshold(uint8_t threshold) [member function]
-    cls.add_method('SetBlockAckThreshold', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxStbc(uint8_t rxStbc) [member function]
+    cls.add_method('SetRxStbc', 
                    'void', 
-                   [param('uint8_t', 'threshold')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetFailedAddBaTimeout(ns3::Time failedAddBaTimeout) [member function]
-    cls.add_method('SetFailedAddBaTimeout', 
+                   [param('uint8_t', 'rxStbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor160Mhz(uint8_t shortGuardInterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor160Mhz', 
                    'void', 
-                   [param('ns3::Time', 'failedAddBaTimeout')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
+                   [param('uint8_t', 'shortGuardInterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor80Mhz(uint8_t shortGuardInterval) [member function]
+    cls.add_method('SetShortGuardIntervalFor80Mhz', 
                    'void', 
-                   [param('ns3::TypeOfStation', 'type')])
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
+                   [param('uint8_t', 'shortGuardInterval')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedChannelWidthSet(uint8_t channelWidthSet) [member function]
+    cls.add_method('SetSupportedChannelWidthSet', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartAccessIfNeeded() [member function]
-    cls.add_method('StartAccessIfNeeded', 
+                   [param('uint8_t', 'channelWidthSet')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedMcsAndNssSet(uint64_t ctrl) [member function]
+    cls.add_method('SetSupportedMcsAndNssSet', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartNextPacket() [member function]
-    cls.add_method('StartNextPacket', 
+                   [param('uint64_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxHighestSupportedLgiDataRate(uint16_t supportedDatarate) [member function]
+    cls.add_method('SetTxHighestSupportedLgiDataRate', 
                    'void', 
-                   [], 
-                   is_virtual=True)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::UpdateCurrentPacket(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('UpdateCurrentPacket', 
+                   [param('uint16_t', 'supportedDatarate')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint8_t mcs, uint8_t nss) [member function]
+    cls.add_method('SetTxMcsMap', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::m_aMpduEnabled [variable]
-    cls.add_instance_attribute('m_aMpduEnabled', 'std::map< ns3::Mac48Address, bool >', is_const=False)
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxStbc(uint8_t txStbc) [member function]
+    cls.add_method('SetTxStbc', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   [param('uint8_t', 'txStbc')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtCapabilitiesInfo(uint32_t ctrl) [member function]
+    cls.add_method('SetVhtCapabilitiesInfo', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetFragmentOffset() const [member function]
-    cls.add_method('GetFragmentOffset', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetFragmentSize() const [member function]
-    cls.add_method('GetFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetNextFragmentSize() const [member function]
-    cls.add_method('GetNextFragmentSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsLastFragment() const [member function]
-    cls.add_method('IsLastFragment', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::TerminateTxop() [member function]
-    cls.add_method('TerminateTxop', 
+                   [param('uint32_t', 'ctrl')])
+    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtSupported(uint8_t vhtSupported) [member function]
+    cls.add_method('SetVhtSupported', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
+                   [param('uint8_t', 'vhtSupported')])
     return
 
-def register_Ns3Queue__Ns3Packet_methods(root_module, cls):
-    ## queue.h (module 'network'): static ns3::TypeId ns3::Queue<ns3::Packet>::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Queue() [constructor]
+def register_Ns3VhtOperation_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## vht-operation.h (module 'wifi'): ns3::VhtOperation::VhtOperation(ns3::VhtOperation const & arg0) [constructor]
+    cls.add_constructor([param('ns3::VhtOperation const &', 'arg0')])
+    ## vht-operation.h (module 'wifi'): ns3::VhtOperation::VhtOperation() [constructor]
     cls.add_constructor([])
-    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::Enqueue(ns3::Ptr<ns3::Packet> item) [member function]
-    cls.add_method('Enqueue', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'item')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::Dequeue() [member function]
-    cls.add_method('Dequeue', 
-                   'ns3::Ptr< ns3::Packet >', 
+    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## vht-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtOperation::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::Remove() [member function]
-    cls.add_method('Remove', 
-                   'ns3::Ptr< ns3::Packet >', 
+                   is_const=True, is_virtual=True)
+    ## vht-operation.h (module 'wifi'): uint16_t ns3::VhtOperation::GetBasicVhtMcsAndNssSet() const [member function]
+    cls.add_method('GetBasicVhtMcsAndNssSet', 
+                   'uint16_t', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<const ns3::Packet> ns3::Queue<ns3::Packet>::Peek() const [member function]
-    cls.add_method('Peek', 
-                   'ns3::Ptr< ns3::Packet const >', 
+                   is_const=True)
+    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetChannelCenterFrequencySegment0() const [member function]
+    cls.add_method('GetChannelCenterFrequencySegment0', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::Flush() [member function]
-    cls.add_method('Flush', 
-                   'void', 
-                   [])
-    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Queue(ns3::Queue<ns3::Packet> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Queue< ns3::Packet > const &', 'arg0')])
-    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::ConstIterator ns3::Queue<ns3::Packet>::begin() const [member function]
-    cls.add_method('begin', 
-                   'ns3::Queue< ns3::Packet > ConstIterator', 
+                   is_const=True)
+    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetChannelCenterFrequencySegment1() const [member function]
+    cls.add_method('GetChannelCenterFrequencySegment1', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Iterator ns3::Queue<ns3::Packet>::begin() [member function]
-    cls.add_method('begin', 
-                   'ns3::Queue< ns3::Packet > Iterator', 
+                   is_const=True)
+    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint8_t', 
                    [], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::ConstIterator ns3::Queue<ns3::Packet>::end() const [member function]
-    cls.add_method('end', 
-                   'ns3::Queue< ns3::Packet > ConstIterator', 
+                   is_const=True)
+    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::Packet>::Iterator ns3::Queue<ns3::Packet>::end() [member function]
-    cls.add_method('end', 
-                   'ns3::Queue< ns3::Packet > Iterator', 
+                   is_const=True, is_virtual=True)
+    ## vht-operation.h (module 'wifi'): uint16_t ns3::VhtOperation::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
                    [], 
-                   visibility='protected')
-    ## queue.h (module 'network'): bool ns3::Queue<ns3::Packet>::DoEnqueue(ns3::Queue<ns3::Packet>::ConstIterator pos, ns3::Ptr<ns3::Packet> item) [member function]
-    cls.add_method('DoEnqueue', 
-                   'bool', 
-                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos'), param('ns3::Ptr< ns3::Packet >', 'item')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoDequeue(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
-    cls.add_method('DoDequeue', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Queue<ns3::Packet>::DoRemove(ns3::Queue<ns3::Packet>::ConstIterator pos) [member function]
-    cls.add_method('DoRemove', 
-                   'ns3::Ptr< ns3::Packet >', 
-                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<const ns3::Packet> ns3::Queue<ns3::Packet>::DoPeek(ns3::Queue<ns3::Packet>::ConstIterator pos) const [member function]
-    cls.add_method('DoPeek', 
-                   'ns3::Ptr< ns3::Packet const >', 
-                   [param('std::list< ns3::Ptr< ns3::Packet > > const_iterator', 'pos')], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DropBeforeEnqueue(ns3::Ptr<ns3::Packet> item) [member function]
-    cls.add_method('DropBeforeEnqueue', 
+                   is_const=True, is_virtual=True)
+    ## vht-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'item')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): void ns3::Queue<ns3::Packet>::DropAfterDequeue(ns3::Ptr<ns3::Packet> item) [member function]
-    cls.add_method('DropAfterDequeue', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetBasicVhtMcsAndNssSet(uint16_t basicVhtMcsAndNssSet) [member function]
+    cls.add_method('SetBasicVhtMcsAndNssSet', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'item')], 
-                   visibility='protected')
+                   [param('uint16_t', 'basicVhtMcsAndNssSet')])
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetChannelCenterFrequencySegment0(uint8_t channelCenterFrequencySegment0) [member function]
+    cls.add_method('SetChannelCenterFrequencySegment0', 
+                   'void', 
+                   [param('uint8_t', 'channelCenterFrequencySegment0')])
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetChannelCenterFrequencySegment1(uint8_t channelCenterFrequencySegment1) [member function]
+    cls.add_method('SetChannelCenterFrequencySegment1', 
+                   'void', 
+                   [param('uint8_t', 'channelCenterFrequencySegment1')])
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetChannelWidth(uint8_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint8_t', 'channelWidth')])
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetMaxVhtMcsPerNss(uint8_t nss, uint8_t maxVhtMcs) [member function]
+    cls.add_method('SetMaxVhtMcsPerNss', 
+                   'void', 
+                   [param('uint8_t', 'nss'), param('uint8_t', 'maxVhtMcs')])
+    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetVhtSupported(uint8_t vhtSupported) [member function]
+    cls.add_method('SetVhtSupported', 
+                   'void', 
+                   [param('uint8_t', 'vhtSupported')])
     return
 
-def register_Ns3Queue__Ns3QueueDiscItem_methods(root_module, cls):
-    ## queue.h (module 'network'): static ns3::TypeId ns3::Queue<ns3::QueueDiscItem>::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3VhtPpdu_methods(root_module, cls):
+    ## vht-ppdu.h (module 'wifi'): ns3::VhtPpdu::VhtPpdu(ns3::VhtPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::VhtPpdu const &', 'arg0')])
+    ## vht-ppdu.h (module 'wifi'): ns3::VhtPpdu::VhtPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid')])
+    ## vht-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::VhtPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
-                   is_static=True)
-    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Queue() [constructor]
-    cls.add_constructor([])
-    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::Enqueue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
-    cls.add_method('Enqueue', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::Dequeue() [member function]
-    cls.add_method('Dequeue', 
-                   'ns3::Ptr< ns3::QueueDiscItem >', 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): ns3::Time ns3::VhtPpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::Remove() [member function]
-    cls.add_method('Remove', 
-                   'ns3::Ptr< ns3::QueueDiscItem >', 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): ns3::WifiPpduType ns3::VhtPpdu::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::WifiPpduType', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<const ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::Peek() const [member function]
-    cls.add_method('Peek', 
-                   'ns3::Ptr< ns3::QueueDiscItem const >', 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::VhtPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::Flush() [member function]
-    cls.add_method('Flush', 
-                   'void', 
-                   [])
-    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Queue(ns3::Queue<ns3::QueueDiscItem> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Queue< ns3::QueueDiscItem > const &', 'arg0')])
-    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::ConstIterator ns3::Queue<ns3::QueueDiscItem>::begin() const [member function]
-    cls.add_method('begin', 
-                   'ns3::Queue< ns3::QueueDiscItem > ConstIterator', 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3VhtPpduVhtSigHeader_methods(root_module, cls):
+    ## vht-ppdu.h (module 'wifi'): ns3::VhtPpdu::VhtSigHeader::VhtSigHeader(ns3::VhtPpdu::VhtSigHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::VhtPpdu::VhtSigHeader const &', 'arg0')])
+    ## vht-ppdu.h (module 'wifi'): ns3::VhtPpdu::VhtSigHeader::VhtSigHeader() [constructor]
+    cls.add_constructor([])
+    ## vht-ppdu.h (module 'wifi'): uint32_t ns3::VhtPpdu::VhtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): uint16_t ns3::VhtPpdu::VhtSigHeader::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint16_t', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Iterator ns3::Queue<ns3::QueueDiscItem>::begin() [member function]
-    cls.add_method('begin', 
-                   'ns3::Queue< ns3::QueueDiscItem > Iterator', 
+                   is_const=True)
+    ## vht-ppdu.h (module 'wifi'): ns3::TypeId ns3::VhtPpdu::VhtSigHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::ConstIterator ns3::Queue<ns3::QueueDiscItem>::end() const [member function]
-    cls.add_method('end', 
-                   'ns3::Queue< ns3::QueueDiscItem > ConstIterator', 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): uint8_t ns3::VhtPpdu::VhtSigHeader::GetNStreams() const [member function]
+    cls.add_method('GetNStreams', 
+                   'uint8_t', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::QueueDiscItem>::Iterator ns3::Queue<ns3::QueueDiscItem>::end() [member function]
-    cls.add_method('end', 
-                   'ns3::Queue< ns3::QueueDiscItem > Iterator', 
+                   is_const=True)
+    ## vht-ppdu.h (module 'wifi'): uint32_t ns3::VhtPpdu::VhtSigHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
-                   visibility='protected')
-    ## queue.h (module 'network'): bool ns3::Queue<ns3::QueueDiscItem>::DoEnqueue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos, ns3::Ptr<ns3::QueueDiscItem> item) [member function]
-    cls.add_method('DoEnqueue', 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): bool ns3::VhtPpdu::VhtSigHeader::GetShortGuardInterval() const [member function]
+    cls.add_method('GetShortGuardInterval', 
                    'bool', 
-                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoDequeue(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
-    cls.add_method('DoDequeue', 
-                   'ns3::Ptr< ns3::QueueDiscItem >', 
-                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoRemove(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) [member function]
-    cls.add_method('DoRemove', 
-                   'ns3::Ptr< ns3::QueueDiscItem >', 
-                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<const ns3::QueueDiscItem> ns3::Queue<ns3::QueueDiscItem>::DoPeek(ns3::Queue<ns3::QueueDiscItem>::ConstIterator pos) const [member function]
-    cls.add_method('DoPeek', 
-                   'ns3::Ptr< ns3::QueueDiscItem const >', 
-                   [param('std::list< ns3::Ptr< ns3::QueueDiscItem > > const_iterator', 'pos')], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DropBeforeEnqueue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
-    cls.add_method('DropBeforeEnqueue', 
+                   [], 
+                   is_const=True)
+    ## vht-ppdu.h (module 'wifi'): bool ns3::VhtPpdu::VhtSigHeader::GetShortGuardIntervalDisambiguation() const [member function]
+    cls.add_method('GetShortGuardIntervalDisambiguation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## vht-ppdu.h (module 'wifi'): uint8_t ns3::VhtPpdu::VhtSigHeader::GetSuMcs() const [member function]
+    cls.add_method('GetSuMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vht-ppdu.h (module 'wifi'): static ns3::TypeId ns3::VhtPpdu::VhtSigHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): void ns3::Queue<ns3::QueueDiscItem>::DropAfterDequeue(ns3::Ptr<ns3::QueueDiscItem> item) [member function]
-    cls.add_method('DropAfterDequeue', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::QueueDiscItem >', 'item')], 
-                   visibility='protected')
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')])
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::SetMuFlag(bool mu) [member function]
+    cls.add_method('SetMuFlag', 
+                   'void', 
+                   [param('bool', 'mu')])
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::SetNStreams(uint8_t nStreams) [member function]
+    cls.add_method('SetNStreams', 
+                   'void', 
+                   [param('uint8_t', 'nStreams')])
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::SetShortGuardInterval(bool sgi) [member function]
+    cls.add_method('SetShortGuardInterval', 
+                   'void', 
+                   [param('bool', 'sgi')])
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::SetShortGuardIntervalDisambiguation(bool disambiguation) [member function]
+    cls.add_method('SetShortGuardIntervalDisambiguation', 
+                   'void', 
+                   [param('bool', 'disambiguation')])
+    ## vht-ppdu.h (module 'wifi'): void ns3::VhtPpdu::VhtSigHeader::SetSuMcs(uint8_t mcs) [member function]
+    cls.add_method('SetSuMcs', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
     return
 
-def register_Ns3Queue__Ns3WifiMacQueueItem_methods(root_module, cls):
-    ## queue.h (module 'network'): static ns3::TypeId ns3::Queue<ns3::WifiMacQueueItem>::GetTypeId() [member function]
+def register_Ns3WifiDefaultProtectionManager_methods(root_module, cls):
+    ## wifi-default-protection-manager.h (module 'wifi'): ns3::WifiDefaultProtectionManager::WifiDefaultProtectionManager(ns3::WifiDefaultProtectionManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiDefaultProtectionManager const &', 'arg0')])
+    ## wifi-default-protection-manager.h (module 'wifi'): ns3::WifiDefaultProtectionManager::WifiDefaultProtectionManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-default-protection-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiDefaultProtectionManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::Queue() [constructor]
+    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiDefaultProtectionManager::TryAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAddMpdu', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True)
+    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiDefaultProtectionManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_virtual=True)
+    ## wifi-default-protection-manager.h (module 'wifi'): std::unique_ptr<ns3::WifiProtection, std::default_delete<ns3::WifiProtection> > ns3::WifiDefaultProtectionManager::GetPsduProtection(ns3::WifiMacHeader const & hdr, uint32_t size, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetPsduProtection', 
+                   'std::unique_ptr< ns3::WifiProtection, std::default_delete< ns3::WifiProtection > >', 
+                   [param('ns3::WifiMacHeader const &', 'hdr'), param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3WifiMacQueue_methods(root_module, cls):
+    ## wifi-mac-queue.h (module 'wifi'): static ns3::TypeId ns3::WifiMacQueue::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue() [constructor]
     cls.add_constructor([])
-    ## queue.h (module 'network'): bool ns3::Queue<ns3::WifiMacQueueItem>::Enqueue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::SetMaxDelay(ns3::Time delay) [member function]
+    cls.add_method('SetMaxDelay', 
+                   'void', 
+                   [param('ns3::Time', 'delay')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Time ns3::WifiMacQueue::GetMaxDelay() const [member function]
+    cls.add_method('GetMaxDelay', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Enqueue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
     cls.add_method('Enqueue', 
                    'bool', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::Dequeue() [member function]
+                   is_virtual=True)
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::PushFront(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    cls.add_method('PushFront', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Insert(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
+    cls.add_method('Insert', 
+                   'bool', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Dequeue() [member function]
     cls.add_method('Dequeue', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::Remove() [member function]
-    cls.add_method('Remove', 
+                   is_virtual=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueByAddress(ns3::Mac48Address dest) [member function]
+    cls.add_method('DequeueByAddress', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::Peek() const [member function]
-    cls.add_method('Peek', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True)
-    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::Flush() [member function]
-    cls.add_method('Flush', 
-                   'void', 
-                   [])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::Queue(ns3::Queue<ns3::WifiMacQueueItem> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Queue< ns3::WifiMacQueueItem > const &', 'arg0')])
-    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::Queue<ns3::WifiMacQueueItem>::begin() const [member function]
-    cls.add_method('begin', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::Iterator ns3::Queue<ns3::WifiMacQueueItem>::begin() [member function]
-    cls.add_method('begin', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > Iterator', 
-                   [], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::Queue<ns3::WifiMacQueueItem>::end() const [member function]
-    cls.add_method('end', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): ns3::Queue<ns3::WifiMacQueueItem>::Iterator ns3::Queue<ns3::WifiMacQueueItem>::end() [member function]
-    cls.add_method('end', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > Iterator', 
-                   [], 
-                   visibility='protected')
-    ## queue.h (module 'network'): bool ns3::Queue<ns3::WifiMacQueueItem>::DoEnqueue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('DoEnqueue', 
-                   'bool', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoDequeue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
-    cls.add_method('DoDequeue', 
+                   [param('ns3::Mac48Address', 'dest')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueByTid(uint8_t tid) [member function]
+    cls.add_method('DequeueByTid', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoRemove(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
-    cls.add_method('DoRemove', 
+                   [param('uint8_t', 'tid')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueByTidAndAddress(uint8_t tid, ns3::Mac48Address dest) [member function]
+    cls.add_method('DequeueByTidAndAddress', 
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::Queue<ns3::WifiMacQueueItem>::DoPeek(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) const [member function]
-    cls.add_method('DoPeek', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr) [member function]
+    cls.add_method('DequeueFirstAvailable', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Dequeue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
+    cls.add_method('Dequeue', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::Peek() const [member function]
+    cls.add_method('Peek', 
                    'ns3::Ptr< ns3::WifiMacQueueItem const >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')], 
-                   is_const=True, visibility='protected')
-    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::DropBeforeEnqueue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('DropBeforeEnqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
-                   visibility='protected')
-    ## queue.h (module 'network'): void ns3::Queue<ns3::WifiMacQueueItem>::DropAfterDequeue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('DropAfterDequeue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
-                   visibility='protected')
-    return
-
-def register_Ns3QueueItem_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## queue-item.h (module 'network'): ns3::QueueItem::QueueItem(ns3::Ptr<ns3::Packet> p) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'p')])
-    ## queue-item.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::QueueItem::GetPacket() const [member function]
-    cls.add_method('GetPacket', 
-                   'ns3::Ptr< ns3::Packet >', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByAddress(ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    cls.add_method('PeekByAddress', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
+                   [param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTid(uint8_t tid, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    cls.add_method('PeekByTid', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
+                   [param('uint8_t', 'tid'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTidAndAddress(uint8_t tid, ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    cls.add_method('PeekByTidAndAddress', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
+    cls.add_method('PeekFirstAvailable', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
+                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Remove() [member function]
+    cls.add_method('Remove', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [], 
+                   is_virtual=True)
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Remove(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('Remove', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::Remove(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, bool removeExpired=false) [member function]
+    cls.add_method('Remove', 
+                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('bool', 'removeExpired', default_value='false')])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByAddress(ns3::Mac48Address dest) [member function]
+    cls.add_method('GetNPacketsByAddress', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'dest')])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByTidAndAddress(uint8_t tid, ns3::Mac48Address dest) [member function]
+    cls.add_method('GetNPacketsByTidAndAddress', 
+                   'uint32_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPackets(uint8_t tid, ns3::Mac48Address dest) const [member function]
+    cls.add_method('GetNPackets', 
+                   'uint32_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')], 
                    is_const=True)
-    ## queue-item.h (module 'network'): uint32_t ns3::QueueItem::GetSize() const [member function]
-    cls.add_method('GetSize', 
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNBytes(uint8_t tid, ns3::Mac48Address dest) const [member function]
+    cls.add_method('GetNBytes', 
                    'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## queue-item.h (module 'network'): bool ns3::QueueItem::GetUint8Value(ns3::QueueItem::Uint8Values field, uint8_t & value) const [member function]
-    cls.add_method('GetUint8Value', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::IsEmpty() [member function]
+    cls.add_method('IsEmpty', 
                    'bool', 
-                   [param('ns3::QueueItem::Uint8Values', 'field'), param('uint8_t &', 'value')], 
-                   is_const=True, is_virtual=True)
-    ## queue-item.h (module 'network'): void ns3::QueueItem::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPackets() [member function]
+    cls.add_method('GetNPackets', 
+                   'uint32_t', 
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNBytes() [member function]
+    cls.add_method('GetNBytes', 
+                   'uint32_t', 
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::EMPTY [variable]
+    cls.add_static_attribute('EMPTY', 'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator const', is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::WifiMacQueue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiMacQueue const &', 'arg0')])
     return
 
-def register_Ns3QueueSizeChecker_methods(root_module, cls):
-    ## queue-size.h (module 'network'): ns3::QueueSizeChecker::QueueSizeChecker() [constructor]
+def register_Ns3WifiModeChecker_methods(root_module, cls):
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker() [constructor]
     cls.add_constructor([])
-    ## queue-size.h (module 'network'): ns3::QueueSizeChecker::QueueSizeChecker(ns3::QueueSizeChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::QueueSizeChecker const &', 'arg0')])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker(ns3::WifiModeChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiModeChecker const &', 'arg0')])
     return
 
-def register_Ns3QueueSizeValue_methods(root_module, cls):
-    ## queue-size.h (module 'network'): ns3::QueueSizeValue::QueueSizeValue() [constructor]
+def register_Ns3WifiModeValue_methods(root_module, cls):
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue() [constructor]
     cls.add_constructor([])
-    ## queue-size.h (module 'network'): ns3::QueueSizeValue::QueueSizeValue(ns3::QueueSize const & value) [constructor]
-    cls.add_constructor([param('ns3::QueueSize const &', 'value')])
-    ## queue-size.h (module 'network'): ns3::QueueSizeValue::QueueSizeValue(ns3::QueueSizeValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::QueueSizeValue const &', 'arg0')])
-    ## queue-size.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::QueueSizeValue::Copy() const [member function]
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiMode const & value) [constructor]
+    cls.add_constructor([param('ns3::WifiMode const &', 'value')])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiModeValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiModeValue const &', 'arg0')])
+    ## wifi-mode.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::WifiModeValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## queue-size.h (module 'network'): bool ns3::QueueSizeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiModeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## queue-size.h (module 'network'): ns3::QueueSize ns3::QueueSizeValue::Get() const [member function]
+    ## wifi-mode.h (module 'wifi'): ns3::WifiMode ns3::WifiModeValue::Get() const [member function]
     cls.add_method('Get', 
-                   'ns3::QueueSize', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True)
-    ## queue-size.h (module 'network'): std::string ns3::QueueSizeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    ## wifi-mode.h (module 'wifi'): std::string ns3::WifiModeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## queue-size.h (module 'network'): void ns3::QueueSizeValue::Set(ns3::QueueSize const & value) [member function]
+    ## wifi-mode.h (module 'wifi'): void ns3::WifiModeValue::Set(ns3::WifiMode const & value) [member function]
     cls.add_method('Set', 
                    'void', 
-                   [param('ns3::QueueSize const &', 'value')])
+                   [param('ns3::WifiMode const &', 'value')])
     return
 
-def register_Ns3RateErrorModel_methods(root_module, cls):
-    ## error-model.h (module 'network'): ns3::RateErrorModel::RateErrorModel(ns3::RateErrorModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::RateErrorModel const &', 'arg0')])
-    ## error-model.h (module 'network'): ns3::RateErrorModel::RateErrorModel() [constructor]
-    cls.add_constructor([])
-    ## error-model.h (module 'network'): int64_t ns3::RateErrorModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## error-model.h (module 'network'): double ns3::RateErrorModel::GetRate() const [member function]
-    cls.add_method('GetRate', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## error-model.h (module 'network'): static ns3::TypeId ns3::RateErrorModel::GetTypeId() [member function]
+def register_Ns3WifiNetDevice_methods(root_module, cls):
+    ## wifi-net-device.h (module 'wifi'): static ns3::TypeId ns3::WifiNetDevice::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): ns3::RateErrorModel::ErrorUnit ns3::RateErrorModel::GetUnit() const [member function]
-    cls.add_method('GetUnit', 
-                   'ns3::RateErrorModel::ErrorUnit', 
-                   [], 
-                   is_const=True)
-    ## error-model.h (module 'network'): void ns3::RateErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
-    cls.add_method('SetRandomVariable', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
-    ## error-model.h (module 'network'): void ns3::RateErrorModel::SetRate(double rate) [member function]
-    cls.add_method('SetRate', 
+    ## wifi-net-device.h (module 'wifi'): ns3::WifiNetDevice::WifiNetDevice() [constructor]
+    cls.add_constructor([])
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
+    cls.add_method('SetMac', 
                    'void', 
-                   [param('double', 'rate')])
-    ## error-model.h (module 'network'): void ns3::RateErrorModel::SetUnit(ns3::RateErrorModel::ErrorUnit error_unit) [member function]
-    cls.add_method('SetUnit', 
+                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')])
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
+    cls.add_method('SetPhy', 
                    'void', 
-                   [param('ns3::RateErrorModel::ErrorUnit', 'error_unit')])
-    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorrupt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorruptBit(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorruptBit', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorruptByte(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorruptByte', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): bool ns3::RateErrorModel::DoCorruptPkt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorruptPkt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): void ns3::RateErrorModel::DoReset() [member function]
-    cls.add_method('DoReset', 
+                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')])
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const manager) [member function]
+    cls.add_method('SetRemoteStationManager', 
                    'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'manager')])
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiNetDevice::GetMac() const [member function]
+    cls.add_method('GetMac', 
+                   'ns3::Ptr< ns3::WifiMac >', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3ReceiveListErrorModel_methods(root_module, cls):
-    ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel(ns3::ReceiveListErrorModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::ReceiveListErrorModel const &', 'arg0')])
-    ## error-model.h (module 'network'): ns3::ReceiveListErrorModel::ReceiveListErrorModel() [constructor]
-    cls.add_constructor([])
-    ## error-model.h (module 'network'): std::list<unsigned int, std::allocator<unsigned int> > ns3::ReceiveListErrorModel::GetList() const [member function]
-    cls.add_method('GetList', 
-                   'std::list< unsigned int >', 
+                   is_const=True)
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiNetDevice::GetPhy() const [member function]
+    cls.add_method('GetPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
                    [], 
                    is_const=True)
-    ## error-model.h (module 'network'): static ns3::TypeId ns3::ReceiveListErrorModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiNetDevice::GetRemoteStationManager() const [member function]
+    cls.add_method('GetRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
                    [], 
-                   is_static=True)
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::SetList(std::list<unsigned int, std::allocator<unsigned int> > const & packetlist) [member function]
-    cls.add_method('SetList', 
-                   'void', 
-                   [param('std::list< unsigned int > const &', 'packetlist')])
-    ## error-model.h (module 'network'): bool ns3::ReceiveListErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorrupt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): void ns3::ReceiveListErrorModel::DoReset() [member function]
-    cls.add_method('DoReset', 
+                   is_const=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetHtConfiguration(ns3::Ptr<ns3::HtConfiguration> htConfiguration) [member function]
+    cls.add_method('SetHtConfiguration', 
                    'void', 
+                   [param('ns3::Ptr< ns3::HtConfiguration >', 'htConfiguration')])
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiNetDevice::GetHtConfiguration() const [member function]
+    cls.add_method('GetHtConfiguration', 
+                   'ns3::Ptr< ns3::HtConfiguration >', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3RegularWifiMac_methods(root_module, cls):
-    ## regular-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::RegularWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_const=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetVhtConfiguration(ns3::Ptr<ns3::VhtConfiguration> vhtConfiguration) [member function]
+    cls.add_method('SetVhtConfiguration', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::VhtConfiguration >', 'vhtConfiguration')])
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiNetDevice::GetVhtConfiguration() const [member function]
+    cls.add_method('GetVhtConfiguration', 
+                   'ns3::Ptr< ns3::VhtConfiguration >', 
                    [], 
-                   is_static=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac::RegularWifiMac() [constructor]
-    cls.add_constructor([])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetShortSlotTimeSupported(bool enable) [member function]
-    cls.add_method('SetShortSlotTimeSupported', 
+                   is_const=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetHeConfiguration(ns3::Ptr<ns3::HeConfiguration> heConfiguration) [member function]
+    cls.add_method('SetHeConfiguration', 
                    'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSsid(ns3::Ssid ssid) [member function]
-    cls.add_method('SetSsid', 
+                   [param('ns3::Ptr< ns3::HeConfiguration >', 'heConfiguration')])
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiNetDevice::GetHeConfiguration() const [member function]
+    cls.add_method('GetHeConfiguration', 
+                   'ns3::Ptr< ns3::HeConfiguration >', 
+                   [], 
+                   is_const=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetIfIndex(uint32_t const index) [member function]
+    cls.add_method('SetIfIndex', 
                    'void', 
-                   [param('ns3::Ssid', 'ssid')], 
+                   [param('uint32_t const', 'index')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    ## wifi-net-device.h (module 'wifi'): uint32_t ns3::WifiNetDevice::GetIfIndex() const [member function]
+    cls.add_method('GetIfIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::WifiNetDevice::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetAddress(ns3::Address address) [member function]
     cls.add_method('SetAddress', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')], 
+                   [param('ns3::Address', 'address')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPromisc() [member function]
-    cls.add_method('SetPromisc', 
-                   'void', 
+    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
                    [], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetShortSlotTimeSupported() const [member function]
-    cls.add_method('GetShortSlotTimeSupported', 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::SetMtu(uint16_t const mtu) [member function]
+    cls.add_method('SetMtu', 
                    'bool', 
+                   [param('uint16_t const', 'mtu')], 
+                   is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): uint16_t ns3::WifiNetDevice::GetMtu() const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ssid ns3::RegularWifiMac::GetSsid() const [member function]
-    cls.add_method('GetSsid', 
-                   'ns3::Ssid', 
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsLinkUp() const [member function]
+    cls.add_method('IsLinkUp', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Mac48Address', 
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('AddLinkChangeCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetBssid() const [member function]
-    cls.add_method('GetBssid', 
-                   'ns3::Mac48Address', 
+    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetBroadcast() const [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Address', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetWifiPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::RegularWifiMac::GetWifiPhy() const [member function]
-    cls.add_method('GetWifiPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
+    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv4Address', 'multicastGroup')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsPointToPoint() const [member function]
+    cls.add_method('IsPointToPoint', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ResetWifiPhy() [member function]
-    cls.add_method('ResetWifiPhy', 
-                   'void', 
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsBridge() const [member function]
+    cls.add_method('IsBridge', 
+                   'bool', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
-                   is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureStandard(ns3::WifiStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
+    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::Node> ns3::WifiNetDevice::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetNode(ns3::Ptr<ns3::Node> const node) [member function]
+    cls.add_method('SetNode', 
                    'void', 
-                   [param('ns3::WifiStandard', 'standard')], 
+                   [param('ns3::Ptr< ns3::Node > const', 'node')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::RegularWifiMac::ForwardUpCallback upCallback) [member function]
-    cls.add_method('SetForwardUpCallback', 
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::NeedsArp() const [member function]
+    cls.add_method('NeedsArp', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetReceiveCallback(ns3::NetDevice::ReceiveCallback cb) [member function]
+    cls.add_method('SetReceiveCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('SendFrom', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
-    cls.add_method('SetLinkDownCallback', 
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetPromiscReceiveCallback(ns3::NetDevice::PromiscReceiveCallback cb) [member function]
+    cls.add_method('SetPromiscReceiveCallback', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
                    is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
-    cls.add_method('SetCtsToSelfSupported', 
-                   'void', 
-                   [param('bool', 'enable')])
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
-    cls.add_method('SetBssid', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'bssid')])
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
-    cls.add_method('GetWifiRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
-    cls.add_method('GetExtendedCapabilities', 
-                   'ns3::ExtendedCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HtCapabilities ns3::RegularWifiMac::GetHtCapabilities() const [member function]
-    cls.add_method('GetHtCapabilities', 
-                   'ns3::HtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::VhtCapabilities ns3::RegularWifiMac::GetVhtCapabilities() const [member function]
-    cls.add_method('GetVhtCapabilities', 
-                   'ns3::VhtCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): ns3::HeCapabilities ns3::RegularWifiMac::GetHeCapabilities() const [member function]
-    cls.add_method('GetHeCapabilities', 
-                   'ns3::HeCapabilities', 
-                   [], 
-                   is_const=True)
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoDispose() [member function]
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::Txop> ns3::RegularWifiMac::GetTxop() const [member function]
-    cls.add_method('GetTxop', 
-                   'ns3::Ptr< ns3::Txop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVOQueue() const [member function]
-    cls.add_method('GetVOQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetVIQueue() const [member function]
-    cls.add_method('GetVIQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBEQueue() const [member function]
-    cls.add_method('GetBEQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::QosTxop> ns3::RegularWifiMac::GetBKQueue() const [member function]
-    cls.add_method('GetBKQueue', 
-                   'ns3::Ptr< ns3::QosTxop >', 
-                   [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax) [member function]
-    cls.add_method('ConfigureContentionWindow', 
-                   'void', 
-                   [param('uint32_t', 'cwMin'), param('uint32_t', 'cwMax')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
-    cls.add_method('SetTypeOfStation', 
-                   'void', 
-                   [param('ns3::TypeOfStation', 'type')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxOk', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxFailed', 
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
                    'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   [], 
                    is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
     cls.add_method('ForwardUp', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
                    visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('DeaggregateAmsduAndForward', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SendAddBaResponse(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address originator) [member function]
-    cls.add_method('SendAddBaResponse', 
-                   'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'originator')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
-    cls.add_method('SetQosSupported', 
+    return
+
+def register_Ns3WifiRadioEnergyModel_methods(root_module, cls):
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel(ns3::WifiRadioEnergyModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::WifiRadioEnergyModel const &', 'arg0')])
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel() [constructor]
+    cls.add_constructor([])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::ChangeState(int newState) [member function]
+    cls.add_method('ChangeState', 
                    'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
-    cls.add_method('GetQosSupported', 
-                   'bool', 
+                   [param('int', 'newState')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetCcaBusyCurrentA() const [member function]
+    cls.add_method('GetCcaBusyCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): WifiPhyState ns3::WifiRadioEnergyModel::GetCurrentState() const [member function]
+    cls.add_method('GetCurrentState', 
+                   'WifiPhyState', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
-    cls.add_method('GetHtSupported', 
-                   'bool', 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetIdleCurrentA() const [member function]
+    cls.add_method('GetIdleCurrentA', 
+                   'double', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
-    cls.add_method('GetVhtSupported', 
-                   'bool', 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::Time ns3::WifiRadioEnergyModel::GetMaximumTimeInState(int state) const [member function]
+    cls.add_method('GetMaximumTimeInState', 
+                   'ns3::Time', 
+                   [param('int', 'state')], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener * ns3::WifiRadioEnergyModel::GetPhyListener() [member function]
+    cls.add_method('GetPhyListener', 
+                   'ns3::WifiRadioEnergyModelPhyListener *', 
+                   [])
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetRxCurrentA() const [member function]
+    cls.add_method('GetRxCurrentA', 
+                   'double', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetErpSupported(bool enable) [member function]
-    cls.add_method('SetErpSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
-    cls.add_method('GetErpSupported', 
-                   'bool', 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetSleepCurrentA() const [member function]
+    cls.add_method('GetSleepCurrentA', 
+                   'double', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetDsssSupported(bool enable) [member function]
-    cls.add_method('SetDsssSupported', 
-                   'void', 
-                   [param('bool', 'enable')], 
-                   visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
-    cls.add_method('GetDsssSupported', 
-                   'bool', 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetSwitchingCurrentA() const [member function]
+    cls.add_method('GetSwitchingCurrentA', 
+                   'double', 
                    [], 
-                   is_const=True, visibility='protected')
-    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
-    cls.add_method('GetHeSupported', 
-                   'bool', 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetTotalEnergyConsumption() const [member function]
+    cls.add_method('GetTotalEnergyConsumption', 
+                   'double', 
                    [], 
-                   is_const=True, visibility='protected')
-    return
-
-def register_Ns3RraaWifiManager_methods(root_module, cls):
-    ## rraa-wifi-manager.h (module 'wifi'): ns3::RraaWifiManager::RraaWifiManager(ns3::RraaWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::RraaWifiManager const &', 'arg0')])
-    ## rraa-wifi-manager.h (module 'wifi'): ns3::RraaWifiManager::RraaWifiManager() [constructor]
-    cls.add_constructor([])
-    ## rraa-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::RraaWifiManager::GetTypeId() [member function]
+                   is_const=True, is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetTxCurrentA() const [member function]
+    cls.add_method('GetTxCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): static ns3::TypeId ns3::WifiRadioEnergyModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetupMac', 
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyChanged() [member function]
+    cls.add_method('HandleEnergyChanged', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
+                   [], 
                    is_virtual=True)
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyDepletion() [member function]
+    cls.add_method('HandleEnergyDepletion', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## rraa-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::RraaWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
                    [], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RraaWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RraaWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyRecharged() [member function]
+    cls.add_method('HandleEnergyRecharged', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): bool ns3::RraaWifiManager::DoNeedRts(ns3::WifiRemoteStation * st, uint32_t size, bool normally) [member function]
-    cls.add_method('DoNeedRts', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation *', 'st'), param('uint32_t', 'size'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetCcaBusyCurrentA(double ccaBusyCurrentA) [member function]
+    cls.add_method('SetCcaBusyCurrentA', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
+                   [param('double', 'ccaBusyCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergyDepletionCallback(ns3::WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback callback) [member function]
+    cls.add_method('SetEnergyDepletionCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergyRechargedCallback(ns3::WifiRadioEnergyModel::WifiRadioEnergyRechargedCallback callback) [member function]
+    cls.add_method('SetEnergyRechargedCallback', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> const source) [member function]
+    cls.add_method('SetEnergySource', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('ns3::Ptr< ns3::EnergySource > const', 'source')], 
+                   is_virtual=True)
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetIdleCurrentA(double idleCurrentA) [member function]
+    cls.add_method('SetIdleCurrentA', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('double', 'idleCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetRxCurrentA(double rxCurrentA) [member function]
+    cls.add_method('SetRxCurrentA', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## rraa-wifi-manager.h (module 'wifi'): void ns3::RraaWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('double', 'rxCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetSleepCurrentA(double sleepCurrentA) [member function]
+    cls.add_method('SetSleepCurrentA', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   [param('double', 'sleepCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetSwitchingCurrentA(double switchingCurrentA) [member function]
+    cls.add_method('SetSwitchingCurrentA', 
+                   'void', 
+                   [param('double', 'switchingCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentA(double txCurrentA) [member function]
+    cls.add_method('SetTxCurrentA', 
+                   'void', 
+                   [param('double', 'txCurrentA')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentFromModel(double txPowerDbm) [member function]
+    cls.add_method('SetTxCurrentFromModel', 
+                   'void', 
+                   [param('double', 'txPowerDbm')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentModel(ns3::Ptr<ns3::WifiTxCurrentModel> const model) [member function]
+    cls.add_method('SetTxCurrentModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiTxCurrentModel > const', 'model')])
+    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
                    is_virtual=True, visibility='private')
+    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::DoGetCurrentA() const [member function]
+    cls.add_method('DoGetCurrentA', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3RrpaaWifiManager_methods(root_module, cls):
-    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::RrpaaWifiManager::RrpaaWifiManager(ns3::RrpaaWifiManager const & arg0) [constructor]
-    cls.add_constructor([param('ns3::RrpaaWifiManager const &', 'arg0')])
-    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::RrpaaWifiManager::RrpaaWifiManager() [constructor]
+def register_Ns3YansErrorRateModel_methods(root_module, cls):
+    ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel::YansErrorRateModel(ns3::YansErrorRateModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::YansErrorRateModel const &', 'arg0')])
+    ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel::YansErrorRateModel() [constructor]
     cls.add_constructor([])
-    ## rrpaa-wifi-manager.h (module 'wifi'): int64_t ns3::RrpaaWifiManager::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## rrpaa-wifi-manager.h (module 'wifi'): static ns3::TypeId ns3::RrpaaWifiManager::GetTypeId() [member function]
+    ## yans-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::YansErrorRateModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::SetupMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetupMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')], 
-                   is_virtual=True)
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetupPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::RrpaaWifiManager::DoCreateStation() const [member function]
-    cls.add_method('DoCreateStation', 
-                   'ns3::WifiRemoteStation *', 
-                   [], 
+    ## yans-error-rate-model.h (module 'wifi'): double ns3::YansErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector const & txVector, double snr, uint64_t nbits, uint8_t numRxAntennas, ns3::WifiPpduField field, uint16_t staId) const [member function]
+    cls.add_method('DoGetChunkSuccessRate', 
+                   'double', 
+                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector const &', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits'), param('uint8_t', 'numRxAntennas'), param('ns3::WifiPpduField', 'field'), param('uint16_t', 'staId')], 
                    is_const=True, is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RrpaaWifiManager::DoGetDataTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetDataTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): ns3::WifiTxVector ns3::RrpaaWifiManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoGetRtsTxVector', 
-                   'ns3::WifiTxVector', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): bool ns3::RrpaaWifiManager::DoNeedRts(ns3::WifiRemoteStation * st, uint32_t size, bool normally) [member function]
-    cls.add_method('DoNeedRts', 
-                   'bool', 
-                   [param('ns3::WifiRemoteStation *', 'st'), param('uint32_t', 'size'), param('bool', 'normally')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) [member function]
-    cls.add_method('DoReportDataOk', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr'), param('uint16_t', 'dataChannelWidth'), param('uint8_t', 'dataNss')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalDataFailed', 
-                   'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportFinalRtsFailed', 
+    return
+
+def register_Ns3YansWifiChannel_methods(root_module, cls):
+    ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel::YansWifiChannel(ns3::YansWifiChannel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::YansWifiChannel const &', 'arg0')])
+    ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel::YansWifiChannel() [constructor]
+    cls.add_constructor([])
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Add(ns3::Ptr<ns3::YansWifiPhy> phy) [member function]
+    cls.add_method('Add', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
-    cls.add_method('DoReportRtsFailed', 
+                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'phy')])
+    ## yans-wifi-channel.h (module 'wifi'): int64_t ns3::YansWifiChannel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## yans-wifi-channel.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::YansWifiChannel::GetDevice(std::size_t i) const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('std::size_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-channel.h (module 'wifi'): std::size_t ns3::YansWifiChannel::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'std::size_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-channel.h (module 'wifi'): static ns3::TypeId ns3::YansWifiChannel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<const ns3::WifiPpdu> ppdu, double txPowerDbm) const [member function]
+    cls.add_method('Send', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
-    cls.add_method('DoReportRtsOk', 
+                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('double', 'txPowerDbm')], 
+                   is_const=True)
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> const delay) [member function]
+    cls.add_method('SetPropagationDelayModel', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
-                   is_virtual=True, visibility='private')
-    ## rrpaa-wifi-manager.h (module 'wifi'): void ns3::RrpaaWifiManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
-    cls.add_method('DoReportRxOk', 
+                   [param('ns3::Ptr< ns3::PropagationDelayModel > const', 'delay')])
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> const loss) [member function]
+    cls.add_method('SetPropagationLossModel', 
                    'void', 
-                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
-                   is_virtual=True, visibility='private')
+                   [param('ns3::Ptr< ns3::PropagationLossModel > const', 'loss')])
     return
 
-def register_Ns3SimpleFrameCaptureModel_methods(root_module, cls):
-    ## simple-frame-capture-model.h (module 'wifi'): ns3::SimpleFrameCaptureModel::SimpleFrameCaptureModel(ns3::SimpleFrameCaptureModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SimpleFrameCaptureModel const &', 'arg0')])
-    ## simple-frame-capture-model.h (module 'wifi'): ns3::SimpleFrameCaptureModel::SimpleFrameCaptureModel() [constructor]
+def register_Ns3AddressChecker_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
     cls.add_constructor([])
-    ## simple-frame-capture-model.h (module 'wifi'): bool ns3::SimpleFrameCaptureModel::CaptureNewFrame(ns3::Ptr<ns3::Event> currentEvent, ns3::Ptr<ns3::Event> newEvent) const [member function]
-    cls.add_method('CaptureNewFrame', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Event >', 'currentEvent'), param('ns3::Ptr< ns3::Event >', 'newEvent')], 
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker(ns3::AddressChecker const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3AddressValue_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Address const &', 'value')])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::AddressValue const & arg0) [constructor]
+    cls.add_constructor([param('ns3::AddressValue const &', 'arg0')])
+    ## address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## simple-frame-capture-model.h (module 'wifi'): double ns3::SimpleFrameCaptureModel::GetMargin() const [member function]
-    cls.add_method('GetMargin', 
-                   'double', 
+    ## address.h (module 'network'): bool ns3::AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## address.h (module 'network'): ns3::Address ns3::AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Address', 
                    [], 
                    is_const=True)
-    ## simple-frame-capture-model.h (module 'wifi'): static ns3::TypeId ns3::SimpleFrameCaptureModel::GetTypeId() [member function]
+    ## address.h (module 'network'): std::string ns3::AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): void ns3::AddressValue::Set(ns3::Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Address const &', 'value')])
+    return
+
+def register_Ns3AdhocWifiMac_methods(root_module, cls):
+    ## adhoc-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::AdhocWifiMac::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## simple-frame-capture-model.h (module 'wifi'): void ns3::SimpleFrameCaptureModel::SetMargin(double margin) [member function]
-    cls.add_method('SetMargin', 
-                   'void', 
-                   [param('double', 'margin')])
-    return
-
-def register_Ns3SpectrumChannel_methods(root_module, cls):
-    ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel(ns3::SpectrumChannel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SpectrumChannel const &', 'arg0')])
-    ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
+    ## adhoc-wifi-mac.h (module 'wifi'): ns3::AdhocWifiMac::AdhocWifiMac() [constructor]
     cls.add_constructor([])
-    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
-    cls.add_method('AddPropagationLossModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::PropagationLossModel >', 'loss')])
-    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddRx(ns3::Ptr<ns3::SpectrumPhy> phy) [member function]
-    cls.add_method('AddRx', 
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
                    'void', 
-                   [param('ns3::Ptr< ns3::SpectrumPhy >', 'phy')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::AddSpectrumPropagationLossModel(ns3::Ptr<ns3::SpectrumPropagationLossModel> loss) [member function]
-    cls.add_method('AddSpectrumPropagationLossModel', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
                    'void', 
-                   [param('ns3::Ptr< ns3::SpectrumPropagationLossModel >', 'loss')])
-    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
                    'void', 
-                   [], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
                    is_virtual=True)
-    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::PropagationLossModel> ns3::SpectrumChannel::GetPropagationLossModel() [member function]
-    cls.add_method('GetPropagationLossModel', 
-                   'ns3::Ptr< ns3::PropagationLossModel >', 
-                   [])
-    ## spectrum-channel.h (module 'spectrum'): ns3::Ptr<ns3::SpectrumPropagationLossModel> ns3::SpectrumChannel::GetSpectrumPropagationLossModel() [member function]
-    cls.add_method('GetSpectrumPropagationLossModel', 
-                   'ns3::Ptr< ns3::SpectrumPropagationLossModel >', 
-                   [])
-    ## spectrum-channel.h (module 'spectrum'): static ns3::TypeId ns3::SpectrumChannel::GetTypeId() [member function]
+    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    return
+
+def register_Ns3AlwaysLosChannelConditionModel_methods(root_module, cls):
+    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::AlwaysLosChannelConditionModel::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
-    cls.add_method('SetPropagationDelayModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::PropagationDelayModel >', 'delay')])
-    ## spectrum-channel.h (module 'spectrum'): void ns3::SpectrumChannel::StartTx(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
-    cls.add_method('StartTx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params')], 
-                   is_pure_virtual=True, is_virtual=True)
+    ## channel-condition-model.h (module 'propagation'): ns3::AlwaysLosChannelConditionModel::AlwaysLosChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::AlwaysLosChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('GetChannelCondition', 
+                   'ns3::Ptr< ns3::ChannelCondition >', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True)
+    ## channel-condition-model.h (module 'propagation'): int64_t ns3::AlwaysLosChannelConditionModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
     return
 
-def register_Ns3SpectrumWifiPhy_methods(root_module, cls):
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::SpectrumWifiPhy::SpectrumWifiPhy(ns3::SpectrumWifiPhy const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SpectrumWifiPhy const &', 'arg0')])
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::SpectrumWifiPhy::SpectrumWifiPhy() [constructor]
+def register_Ns3ApWifiMac_methods(root_module, cls):
+    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac::ApWifiMac() [constructor]
     cls.add_constructor([])
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::ConfigureStandardAndBand(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [member function]
-    cls.add_method('ConfigureStandardAndBand', 
+    ## ap-wifi-mac.h (module 'wifi'): int64_t ns3::ApWifiMac::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
                    is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::CreateWifiSpectrumPhyInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
-    cls.add_method('CreateWifiSpectrumPhyInterface', 
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
-    ## spectrum-wifi-phy.h (module 'wifi'): uint32_t ns3::SpectrumWifiPhy::GetBandBandwidth() const [member function]
-    cls.add_method('GetBandBandwidth', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): uint16_t ns3::SpectrumWifiPhy::GetCenterFrequencyForChannelWidth(ns3::WifiTxVector txVector) const [member function]
-    cls.add_method('GetCenterFrequencyForChannelWidth', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetAssociationId(ns3::Mac48Address addr) const [member function]
+    cls.add_method('GetAssociationId', 
                    'uint16_t', 
-                   [param('ns3::WifiTxVector', 'txVector')], 
+                   [param('ns3::Mac48Address', 'addr')], 
                    is_const=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::SpectrumWifiPhy::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::Channel >', 
+    ## ap-wifi-mac.h (module 'wifi'): ns3::Time ns3::ApWifiMac::GetBeaconInterval() const [member function]
+    cls.add_method('GetBeaconInterval', 
+                   'ns3::Time', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): uint16_t ns3::SpectrumWifiPhy::GetGuardBandwidth(uint16_t currentChannelWidth) const [member function]
-    cls.add_method('GetGuardBandwidth', 
-                   'uint16_t', 
-                   [param('uint16_t', 'currentChannelWidth')], 
                    is_const=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::AntennaModel> ns3::SpectrumWifiPhy::GetRxAntenna() const [member function]
-    cls.add_method('GetRxAntenna', 
-                   'ns3::Ptr< ns3::AntennaModel >', 
+    ## ap-wifi-mac.h (module 'wifi'): uint8_t ns3::ApWifiMac::GetBufferStatus(uint8_t tid, ns3::Mac48Address address) const [member function]
+    cls.add_method('GetBufferStatus', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): uint8_t ns3::ApWifiMac::GetMaxBufferStatus(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetMaxBufferStatus', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): std::map<unsigned short, ns3::Mac48Address, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Mac48Address> > > const & ns3::ApWifiMac::GetStaList() const [member function]
+    cls.add_method('GetStaList', 
+                   'std::map< unsigned short, ns3::Mac48Address > const &', 
                    [], 
                    is_const=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::Ptr<const ns3::SpectrumModel> ns3::SpectrumWifiPhy::GetRxSpectrumModel() [member function]
-    cls.add_method('GetRxSpectrumModel', 
-                   'ns3::Ptr< ns3::SpectrumModel const >', 
-                   [])
-    ## spectrum-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::SpectrumWifiPhy::GetTypeId() [member function]
+    ## ap-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::ApWifiMac::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetAntenna(ns3::Ptr<ns3::AntennaModel> const antenna) [member function]
-    cls.add_method('SetAntenna', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::AntennaModel > const', 'antenna')])
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannel(ns3::Ptr<ns3::SpectrumChannel> const channel) [member function]
-    cls.add_method('SetChannel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumChannel > const', 'channel')])
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannelNumber(uint8_t id) [member function]
-    cls.add_method('SetChannelNumber', 
+    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetVhtOperationalChannelWidth() const [member function]
+    cls.add_method('GetVhtOperationalChannelWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
                    'void', 
-                   [param('uint8_t', 'id')], 
+                   [param('ns3::Mac48Address', 'address')], 
                    is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetChannelWidth(uint16_t channelwidth) [member function]
-    cls.add_method('SetChannelWidth', 
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBeaconInterval(ns3::Time interval) [member function]
+    cls.add_method('SetBeaconInterval', 
+                   'void', 
+                   [param('ns3::Time', 'interval')])
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBufferStatus(uint8_t tid, ns3::Mac48Address address, uint8_t size) [member function]
+    cls.add_method('SetBufferStatus', 
                    'void', 
-                   [param('uint16_t', 'channelwidth')], 
-                   is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::SetFrequency(uint16_t freq) [member function]
-    cls.add_method('SetFrequency', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'address'), param('uint8_t', 'size')])
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
                    'void', 
-                   [param('uint16_t', 'freq')], 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
                    is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::StartRx(ns3::Ptr<ns3::SpectrumSignalParameters> rxParams) [member function]
-    cls.add_method('StartRx', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'rxParams')])
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
-    cls.add_method('StartTx', 
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
                    is_virtual=True)
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::DoDispose() [member function]
+    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## spectrum-wifi-phy.h (module 'wifi'): void ns3::SpectrumWifiPhy::DoInitialize() [member function]
+                   is_virtual=True, visibility='private')
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::SpectrumWifiPhy::GetBand(uint16_t bandWidth, uint8_t bandIndex=0) [member function]
-    cls.add_method('GetBand', 
-                   'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'bandWidth'), param('uint8_t', 'bandIndex', default_value='0')], 
-                   is_virtual=True, visibility='protected')
-    ## spectrum-wifi-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::SpectrumWifiPhy::ConvertHeRuSubcarriers(uint16_t channelWidth, ns3::HeRu::SubcarrierRange range) const [member function]
-    cls.add_method('ConvertHeRuSubcarriers', 
-                   'ns3::WifiSpectrumBand', 
-                   [param('uint16_t', 'channelWidth'), param('std::pair< short, short >', 'range')], 
-                   is_const=True, is_virtual=True, visibility='private')
+                   is_virtual=True, visibility='private')
+    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3Ssid_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(ns3::Ssid const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ssid const &', 'arg0')])
-    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid() [constructor]
+def register_Ns3BinaryErrorModel_methods(root_module, cls):
+    ## error-model.h (module 'network'): ns3::BinaryErrorModel::BinaryErrorModel(ns3::BinaryErrorModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BinaryErrorModel const &', 'arg0')])
+    ## error-model.h (module 'network'): ns3::BinaryErrorModel::BinaryErrorModel() [constructor]
     cls.add_constructor([])
-    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(std::string s) [constructor]
-    cls.add_constructor([param('std::string', 's')])
-    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## ssid.h (module 'wifi'): ns3::WifiInformationElementId ns3::Ssid::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsBroadcast() const [member function]
-    cls.add_method('IsBroadcast', 
-                   'bool', 
+    ## error-model.h (module 'network'): static ns3::TypeId ns3::BinaryErrorModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
-                   is_const=True)
-    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsEqual(ns3::Ssid const & o) const [member function]
-    cls.add_method('IsEqual', 
+                   is_static=True)
+    ## error-model.h (module 'network'): bool ns3::BinaryErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorrupt', 
                    'bool', 
-                   [param('ns3::Ssid const &', 'o')], 
-                   is_const=True)
-    ## ssid.h (module 'wifi'): char * ns3::Ssid::PeekString() const [member function]
-    cls.add_method('PeekString', 
-                   'char *', 
-                   [], 
-                   is_const=True)
-    ## ssid.h (module 'wifi'): void ns3::Ssid::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
+                   is_virtual=True, visibility='private')
+    ## error-model.h (module 'network'): void ns3::BinaryErrorModel::DoReset() [member function]
+    cls.add_method('DoReset', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    return
-
-def register_Ns3SsidChecker_methods(root_module, cls):
-    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker() [constructor]
-    cls.add_constructor([])
-    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker(ns3::SsidChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SsidChecker const &', 'arg0')])
+                   [], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3SsidValue_methods(root_module, cls):
-    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue() [constructor]
+def register_Ns3BurstErrorModel_methods(root_module, cls):
+    ## error-model.h (module 'network'): ns3::BurstErrorModel::BurstErrorModel(ns3::BurstErrorModel const & arg0) [constructor]
+    cls.add_constructor([param('ns3::BurstErrorModel const &', 'arg0')])
+    ## error-model.h (module 'network'): ns3::BurstErrorModel::BurstErrorModel() [constructor]
     cls.add_constructor([])
-    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::Ssid const & value) [constructor]
-    cls.add_constructor([param('ns3::Ssid const &', 'value')])
-    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::SsidValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SsidValue const &', 'arg0')])
-    ## ssid.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::SsidValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## ssid.h (module 'wifi'): bool ns3::SsidValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## ssid.h (module 'wifi'): ns3::Ssid ns3::SsidValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Ssid', 
+    ## error-model.h (module 'network'): int64_t ns3::BurstErrorModel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## error-model.h (module 'network'): double ns3::BurstErrorModel::GetBurstRate() const [member function]
+    cls.add_method('GetBurstRate', 
+                   'double', 
                    [], 
                    is_const=True)
-    ## ssid.h (module 'wifi'): std::string ns3::SsidValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## ssid.h (module 'wifi'): void ns3::SsidValue::Set(ns3::Ssid const & value) [member function]
-    cls.add_method('Set', 
+    ## error-model.h (module 'network'): static ns3::TypeId ns3::BurstErrorModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetBurstRate(double rate) [member function]
+    cls.add_method('SetBurstRate', 
                    'void', 
-                   [param('ns3::Ssid const &', 'value')])
+                   [param('double', 'rate')])
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> burstSz) [member function]
+    cls.add_method('SetRandomBurstSize', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'burstSz')])
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> ranVar) [member function]
+    cls.add_method('SetRandomVariable', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'ranVar')])
+    ## error-model.h (module 'network'): bool ns3::BurstErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
+    cls.add_method('DoCorrupt', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
+                   is_virtual=True, visibility='private')
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::DoReset() [member function]
+    cls.add_method('DoReset', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
     return
 
-def register_Ns3SupportedRates_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates() [constructor]
+def register_Ns3CallbackImpl__Bool_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates(ns3::SupportedRates const & arg0) [constructor]
-    cls.add_constructor([param('ns3::SupportedRates const &', 'arg0')])
-    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::AddBssMembershipSelectorRate(uint64_t bs) [member function]
-    cls.add_method('AddBssMembershipSelectorRate', 
-                   'void', 
-                   [param('uint64_t', 'bs')])
-    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::AddSupportedRate(uint64_t bs) [member function]
-    cls.add_method('AddSupportedRate', 
-                   'void', 
-                   [param('uint64_t', 'bs')])
-    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## supported-rates.h (module 'wifi'): ns3::WifiInformationElementId ns3::SupportedRates::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::GetNRates() const [member function]
-    cls.add_method('GetNRates', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## supported-rates.h (module 'wifi'): uint32_t ns3::SupportedRates::GetRate(uint8_t i) const [member function]
-    cls.add_method('GetRate', 
-                   'uint32_t', 
-                   [param('uint8_t', 'i')], 
-                   is_const=True)
-    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsBasicRate(uint64_t bs) const [member function]
-    cls.add_method('IsBasicRate', 
-                   'bool', 
-                   [param('uint64_t', 'bs')], 
-                   is_const=True)
-    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsBssMembershipSelectorRate(uint64_t bs) const [member function]
-    cls.add_method('IsBssMembershipSelectorRate', 
-                   'bool', 
-                   [param('uint64_t', 'bs')], 
-                   is_const=True)
-    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsSupportedRate(uint64_t bs) const [member function]
-    cls.add_method('IsSupportedRate', 
+    ## callback.h (module 'core'): bool ns3::CallbackImpl<bool, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, unsigned char arg1) [member operator]
+    cls.add_method('operator()', 
                    'bool', 
-                   [param('uint64_t', 'bs')], 
-                   is_const=True)
-    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, is_virtual=True)
-    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::SetBasicRate(uint64_t bs) [member function]
-    cls.add_method('SetBasicRate', 
-                   'void', 
-                   [param('uint64_t', 'bs')])
-    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::MAX_SUPPORTED_RATES [variable]
-    cls.add_static_attribute('MAX_SUPPORTED_RATES', 'uint8_t const', is_const=True)
-    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::extended [variable]
-    cls.add_instance_attribute('extended', 'ns3::ExtendedSupportedRatesIE', is_const=False)
+                   [param('short unsigned int', 'arg0'), param('unsigned char', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): ns3::ObjectBase * ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'ns3::ObjectBase *', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3TableBasedErrorRateModel_methods(root_module, cls):
-    ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel::TableBasedErrorRateModel(ns3::TableBasedErrorRateModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::TableBasedErrorRateModel const &', 'arg0')])
-    ## table-based-error-rate-model.h (module 'wifi'): ns3::TableBasedErrorRateModel::TableBasedErrorRateModel() [constructor]
+def register_Ns3CallbackImpl__Unsigned_long_Const_ns3WifiTxVector___amp___Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## table-based-error-rate-model.h (module 'wifi'): double ns3::TableBasedErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint64_t nbits) const [member function]
-    cls.add_method('DoGetChunkSuccessRate', 
-                   'double', 
-                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits')], 
-                   is_const=True, is_virtual=True)
-    ## table-based-error-rate-model.h (module 'wifi'): static uint8_t ns3::TableBasedErrorRateModel::GetMcsForMode(ns3::WifiMode mode) [member function]
-    cls.add_method('GetMcsForMode', 
-                   'uint8_t', 
-                   [param('ns3::WifiMode', 'mode')], 
-                   is_static=True)
-    ## table-based-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::TableBasedErrorRateModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, ns3::WifiTxVector const &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, const ns3::WifiTxVector &, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector const & arg0, short unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('ns3::WifiTxVector const &', 'arg0'), param('short unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppChannelConditionModel::ThreeGppChannelConditionModel() [constructor]
+def register_Ns3CallbackImpl__Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): int64_t ns3::ThreeGppChannelConditionModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::ThreeGppChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetChannelCondition', 
-                   'ns3::Ptr< ns3::ChannelCondition >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True)
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): static double ns3::ThreeGppChannelConditionModel::Calculate2dDistance(ns3::Vector const & a, ns3::Vector const & b) [member function]
-    cls.add_method('Calculate2dDistance', 
-                   'double', 
-                   [param('ns3::Vector const &', 'a'), param('ns3::Vector const &', 'b')], 
-                   is_static=True, visibility='protected')
-    ## channel-condition-model.h (module 'propagation'): void ns3::ThreeGppChannelConditionModel::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppChannelConditionModel::ComputePnlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePnlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppIndoorMixedOfficeChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppIndoorMixedOfficeChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Unsigned_long_Unsigned_short_Unsigned_short_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppIndoorMixedOfficeChannelConditionModel::ThreeGppIndoorMixedOfficeChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppIndoorMixedOfficeChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): long unsigned int ns3::CallbackImpl<unsigned long, unsigned short, unsigned short, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, short unsigned int arg1, unsigned char arg2) [member operator]
+    cls.add_method('operator()', 
+                   'long unsigned int', 
+                   [param('short unsigned int', 'arg0'), param('short unsigned int', 'arg1'), param('unsigned char', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppIndoorOfficePropagationLossModel_methods(root_module, cls):
-    ## three-gpp-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppIndoorOfficePropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## three-gpp-propagation-loss-model.h (module 'propagation'): ns3::ThreeGppIndoorOfficePropagationLossModel::ThreeGppIndoorOfficePropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetLossLos(double distance2D, double distance3D, double hUt, double hBs) const [member function]
-    cls.add_method('GetLossLos', 
-                   'double', 
-                   [param('double', 'distance2D'), param('double', 'distance3D'), param('double', 'hUt'), param('double', 'hBs')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetLossNlos(double distance2D, double distance3D, double hUt, double hBs) const [member function]
-    cls.add_method('GetLossNlos', 
-                   'double', 
-                   [param('double', 'distance2D'), param('double', 'distance3D'), param('double', 'hUt'), param('double', 'hBs')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetShadowingStd(ns3::Ptr<ns3::MobilityModel> a, ns3::Ptr<ns3::MobilityModel> b, ns3::ChannelCondition::LosConditionValue cond) const [member function]
-    cls.add_method('GetShadowingStd', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel >', 'a'), param('ns3::Ptr< ns3::MobilityModel >', 'b'), param('ns3::ChannelCondition::LosConditionValue', 'cond')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## three-gpp-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppIndoorOfficePropagationLossModel::GetShadowingCorrelationDistance(ns3::ChannelCondition::LosConditionValue cond) const [member function]
-    cls.add_method('GetShadowingCorrelationDistance', 
-                   'double', 
-                   [param('ns3::ChannelCondition::LosConditionValue', 'cond')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): short unsigned int ns3::CallbackImpl<unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
+                   'short unsigned int', 
+                   [], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppIndoorOpenOfficeChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppIndoorOpenOfficeChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Void_Bool_Unsigned_int_Double_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppIndoorOpenOfficeChannelConditionModel::ThreeGppIndoorOpenOfficeChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppIndoorOpenOfficeChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(bool arg0, unsigned int arg1, double arg2, ns3::Time arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('bool', 'arg0'), param('unsigned int', 'arg1'), param('double', 'arg2'), param('ns3::Time', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppRmaChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppRmaChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppRmaChannelConditionModel::ThreeGppRmaChannelConditionModel() [constructor]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiMacHeader const & arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Double_Double_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppRmaChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(double arg0, double arg1, ns3::Mac48Address arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('double', 'arg0'), param('double', 'arg1'), param('ns3::Mac48Address', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppUmaChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppUmaChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Void_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppUmaChannelConditionModel::ThreeGppUmaChannelConditionModel() [constructor]
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(double arg0, double arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('double', 'arg0'), param('double', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppUmaChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(double arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('double', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppUmiStreetCanyonChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppUmiStreetCanyonChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Void_Int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::ThreeGppUmiStreetCanyonChannelConditionModel::ThreeGppUmiStreetCanyonChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): double ns3::ThreeGppUmiStreetCanyonChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(int arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('int', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3ThreeGppV2vHighwayPropagationLossModel_methods(root_module, cls):
-    ## three-gpp-v2v-propagation-loss-model.h (module 'propagation'): static ns3::TypeId ns3::ThreeGppV2vHighwayPropagationLossModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Void_Ns3DataRate_Ns3DataRate_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## three-gpp-v2v-propagation-loss-model.h (module 'propagation'): ns3::ThreeGppV2vHighwayPropagationLossModel::ThreeGppV2vHighwayPropagationLossModel() [constructor]
-    cls.add_constructor([])
-    ## three-gpp-v2v-propagation-loss-model.h (module 'propagation'): double ns3::ThreeGppV2vHighwayPropagationLossModel::GetLossLos(double distance2D, double distance3D, double hUt, double hBs) const [member function]
-    cls.add_method('GetLossLos', 
-                   'double', 
-                   [param('double', 'distance2D'), param('double', 'distance3D'), param('double', 'hUt'), param('double', 'hBs')], 
-                   is_const=True, is_virtual=True, visibility='private')
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::DataRate arg0, ns3::DataRate arg1, ns3::Mac48Address arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::DataRate', 'arg0'), param('ns3::DataRate', 'arg1'), param('ns3::Mac48Address', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3TimeValue_methods(root_module, cls):
-    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3HeSigAParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::Time const & value) [constructor]
-    cls.add_constructor([param('ns3::Time const &', 'value')])
-    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::TimeValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::TimeValue const &', 'arg0')])
-    ## nstime.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TimeValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## nstime.h (module 'core'): bool ns3::TimeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## nstime.h (module 'core'): ns3::Time ns3::TimeValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Time', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## nstime.h (module 'core'): std::string ns3::TimeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## nstime.h (module 'core'): void ns3::TimeValue::Set(ns3::Time const & value) [member function]
-    cls.add_method('Set', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::HeSigAParameters arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Time const &', 'value')])
+                   [param('ns3::HeSigAParameters', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3TypeIdChecker_methods(root_module, cls):
-    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker(ns3::TypeIdChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::TypeIdChecker const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Mac48Address arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3TypeIdValue_methods(root_module, cls):
-    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Ptr__lt__const_ns3MobilityModel__gt___Double_Double_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeId const & value) [constructor]
-    cls.add_constructor([param('ns3::TypeId const &', 'value')])
-    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeIdValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::TypeIdValue const &', 'arg0')])
-    ## type-id.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TypeIdValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## type-id.h (module 'core'): bool ns3::TypeIdValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeIdValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::TypeId', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::MobilityModel const >, ns3::Ptr< ns3::MobilityModel const >, double, double, double, double, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## type-id.h (module 'core'): std::string ns3::TypeIdValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## type-id.h (module 'core'): void ns3::TypeIdValue::Set(ns3::TypeId const & value) [member function]
-    cls.add_method('Set', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::MobilityModel> arg0, ns3::Ptr<const ns3::MobilityModel> arg1, double arg2, double arg3, double arg4, double arg5) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::TypeId const &', 'value')])
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'arg0'), param('ns3::Ptr< ns3::MobilityModel const >', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4'), param('double', 'arg5')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3UintegerValue_methods(root_module, cls):
-    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(uint64_t const & value) [constructor]
-    cls.add_constructor([param('uint64_t const &', 'value')])
-    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(ns3::UintegerValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::UintegerValue const &', 'arg0')])
-    ## uinteger.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::UintegerValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## uinteger.h (module 'core'): bool ns3::UintegerValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## uinteger.h (module 'core'): uint64_t ns3::UintegerValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'uint64_t', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::MobilityModel const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## uinteger.h (module 'core'): std::string ns3::UintegerValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## uinteger.h (module 'core'): void ns3::UintegerValue::Set(uint64_t const & value) [member function]
-    cls.add_method('Set', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::MobilityModel> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint64_t const &', 'value')])
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3Vector2DChecker_methods(root_module, cls):
-    ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Double_Ns3WifiMode_Ns3WifiPreamble_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker(ns3::Vector2DChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Vector2DChecker const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, double arg1, ns3::WifiMode arg2, ns3::WifiPreamble arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('double', 'arg1'), param('ns3::WifiMode', 'arg2'), param('ns3::WifiPreamble', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3Vector2DValue_methods(root_module, cls):
-    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2D const & value) [constructor]
-    cls.add_constructor([param('ns3::Vector2D const &', 'value')])
-    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2DValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Vector2DValue const &', 'arg0')])
-    ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector2DValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## vector.h (module 'core'): bool ns3::Vector2DValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## vector.h (module 'core'): ns3::Vector2D ns3::Vector2DValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Vector2D', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vector.h (module 'core'): std::string ns3::Vector2DValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## vector.h (module 'core'): void ns3::Vector2DValue::Set(ns3::Vector2D const & value) [member function]
-    cls.add_method('Set', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, double arg1) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Vector2D const &', 'value')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('double', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3Vector3DChecker_methods(root_module, cls):
-    ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker(ns3::Vector3DChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Vector3DChecker const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::Mac48Address arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::Mac48Address', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3Vector3DValue_methods(root_module, cls):
-    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiMode_Ns3WifiPreamble_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3D const & value) [constructor]
-    cls.add_constructor([param('ns3::Vector3D const &', 'value')])
-    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3DValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Vector3DValue const &', 'arg0')])
-    ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector3DValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## vector.h (module 'core'): bool ns3::Vector3DValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## vector.h (module 'core'): ns3::Vector3D ns3::Vector3DValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Vector3D', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vector.h (module 'core'): std::string ns3::Vector3DValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## vector.h (module 'core'): void ns3::Vector3DValue::Set(ns3::Vector3D const & value) [member function]
-    cls.add_method('Set', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::WifiMode arg1, ns3::WifiPreamble arg2, unsigned char arg3) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Vector3D const &', 'value')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::WifiMode', 'arg1'), param('ns3::WifiPreamble', 'arg2'), param('unsigned char', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3VhtCapabilities_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities(ns3::VhtCapabilities const & arg0) [constructor]
-    cls.add_constructor([param('ns3::VhtCapabilities const &', 'arg0')])
-    ## vht-capabilities.h (module 'wifi'): ns3::VhtCapabilities::VhtCapabilities() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiPhyRxfailureReason_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## vht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtCapabilities::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetMaxAmpduLength() const [member function]
-    cls.add_method('GetMaxAmpduLength', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetMaxMpduLength() const [member function]
-    cls.add_method('GetMaxMpduLength', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetRxHighestSupportedLgiDataRate() const [member function]
-    cls.add_method('GetRxHighestSupportedLgiDataRate', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxLdpc() const [member function]
-    cls.add_method('GetRxLdpc', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetRxStbc() const [member function]
-    cls.add_method('GetRxStbc', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint16_t ns3::VhtCapabilities::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetSupportedChannelWidthSet() const [member function]
-    cls.add_method('GetSupportedChannelWidthSet', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint64_t ns3::VhtCapabilities::GetSupportedMcsAndNssSet() const [member function]
-    cls.add_method('GetSupportedMcsAndNssSet', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint8_t ns3::VhtCapabilities::GetTxStbc() const [member function]
-    cls.add_method('GetTxStbc', 
-                   'uint8_t', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::WifiPhyRxfailureReason arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::WifiPhyRxfailureReason', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): uint32_t ns3::VhtCapabilities::GetVhtCapabilitiesInfo() const [member function]
-    cls.add_method('GetVhtCapabilitiesInfo', 
-                   'uint32_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedMcs(uint8_t mcs, uint8_t nss) const [member function]
-    cls.add_method('IsSupportedMcs', 
-                   'bool', 
-                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedRxMcs(uint8_t mcs) const [member function]
-    cls.add_method('IsSupportedRxMcs', 
-                   'bool', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): bool ns3::VhtCapabilities::IsSupportedTxMcs(uint8_t mcs) const [member function]
-    cls.add_method('IsSupportedTxMcs', 
-                   'bool', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
-                   'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxAmpduLength(uint32_t maxAmpduLength) [member function]
-    cls.add_method('SetMaxAmpduLength', 
-                   'void', 
-                   [param('uint32_t', 'maxAmpduLength')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetMaxMpduLength(uint16_t length) [member function]
-    cls.add_method('SetMaxMpduLength', 
-                   'void', 
-                   [param('uint16_t', 'length')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxHighestSupportedLgiDataRate(uint16_t supportedDatarate) [member function]
-    cls.add_method('SetRxHighestSupportedLgiDataRate', 
-                   'void', 
-                   [param('uint16_t', 'supportedDatarate')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxLdpc(uint8_t rxLdpc) [member function]
-    cls.add_method('SetRxLdpc', 
-                   'void', 
-                   [param('uint8_t', 'rxLdpc')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxMcsMap(uint8_t mcs, uint8_t nss) [member function]
-    cls.add_method('SetRxMcsMap', 
-                   'void', 
-                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetRxStbc(uint8_t rxStbc) [member function]
-    cls.add_method('SetRxStbc', 
-                   'void', 
-                   [param('uint8_t', 'rxStbc')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor160Mhz(uint8_t shortGuardInterval) [member function]
-    cls.add_method('SetShortGuardIntervalFor160Mhz', 
-                   'void', 
-                   [param('uint8_t', 'shortGuardInterval')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetShortGuardIntervalFor80Mhz(uint8_t shortGuardInterval) [member function]
-    cls.add_method('SetShortGuardIntervalFor80Mhz', 
-                   'void', 
-                   [param('uint8_t', 'shortGuardInterval')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedChannelWidthSet(uint8_t channelWidthSet) [member function]
-    cls.add_method('SetSupportedChannelWidthSet', 
-                   'void', 
-                   [param('uint8_t', 'channelWidthSet')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetSupportedMcsAndNssSet(uint64_t ctrl) [member function]
-    cls.add_method('SetSupportedMcsAndNssSet', 
-                   'void', 
-                   [param('uint64_t', 'ctrl')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxHighestSupportedLgiDataRate(uint16_t supportedDatarate) [member function]
-    cls.add_method('SetTxHighestSupportedLgiDataRate', 
-                   'void', 
-                   [param('uint16_t', 'supportedDatarate')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxMcsMap(uint8_t mcs, uint8_t nss) [member function]
-    cls.add_method('SetTxMcsMap', 
-                   'void', 
-                   [param('uint8_t', 'mcs'), param('uint8_t', 'nss')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetTxStbc(uint8_t txStbc) [member function]
-    cls.add_method('SetTxStbc', 
-                   'void', 
-                   [param('uint8_t', 'txStbc')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtCapabilitiesInfo(uint32_t ctrl) [member function]
-    cls.add_method('SetVhtCapabilitiesInfo', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint32_t', 'ctrl')])
-    ## vht-capabilities.h (module 'wifi'): void ns3::VhtCapabilities::SetVhtSupported(uint8_t vhtSupported) [member function]
-    cls.add_method('SetVhtSupported', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, std::map< std::pair< unsigned int, unsigned int >, double >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > > arg1) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint8_t', 'vhtSupported')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
     return
 
-def register_Ns3VhtOperation_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## vht-operation.h (module 'wifi'): ns3::VhtOperation::VhtOperation(ns3::VhtOperation const & arg0) [constructor]
-    cls.add_constructor([param('ns3::VhtOperation const &', 'arg0')])
-    ## vht-operation.h (module 'wifi'): ns3::VhtOperation::VhtOperation() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Ns3SignalNoiseDbm_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
-    cls.add_method('DeserializeInformationField', 
-                   'uint8_t', 
-                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
-                   is_virtual=True)
-    ## vht-operation.h (module 'wifi'): ns3::WifiInformationElementId ns3::VhtOperation::ElementId() const [member function]
-    cls.add_method('ElementId', 
-                   'ns3::WifiInformationElementId', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## vht-operation.h (module 'wifi'): uint16_t ns3::VhtOperation::GetBasicVhtMcsAndNssSet() const [member function]
-    cls.add_method('GetBasicVhtMcsAndNssSet', 
-                   'uint16_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetChannelCenterFrequencySegment0() const [member function]
-    cls.add_method('GetChannelCenterFrequencySegment0', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, short unsigned int arg1, ns3::WifiTxVector arg2, ns3::MpduInfo arg3, ns3::SignalNoiseDbm arg4, short unsigned int arg5) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('short unsigned int', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('ns3::MpduInfo', 'arg3'), param('ns3::SignalNoiseDbm', 'arg4'), param('short unsigned int', 'arg5')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetChannelCenterFrequencySegment1() const [member function]
-    cls.add_method('GetChannelCenterFrequencySegment1', 
-                   'uint8_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetChannelWidth() const [member function]
-    cls.add_method('GetChannelWidth', 
-                   'uint8_t', 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, short unsigned int arg1, ns3::WifiTxVector arg2, ns3::MpduInfo arg3, short unsigned int arg4) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('short unsigned int', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('ns3::MpduInfo', 'arg3'), param('short unsigned int', 'arg4')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3QueueDiscItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::QueueDiscItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## vht-operation.h (module 'wifi'): uint8_t ns3::VhtOperation::GetInformationFieldSize() const [member function]
-    cls.add_method('GetInformationFieldSize', 
-                   'uint8_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## vht-operation.h (module 'wifi'): uint16_t ns3::VhtOperation::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint16_t', 
-                   [], 
-                   is_const=True)
-    ## vht-operation.h (module 'wifi'): ns3::Buffer::Iterator ns3::VhtOperation::Serialize(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('Serialize', 
-                   'ns3::Buffer::Iterator', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True)
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
-    cls.add_method('SerializeInformationField', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::QueueDiscItem> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
+                   [param('ns3::Ptr< ns3::QueueDiscItem const >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3SpectrumPhy__gt___Ns3Ptr__lt__const_ns3SpectrumPhy__gt___Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::SpectrumPhy const >, ns3::Ptr< ns3::SpectrumPhy const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetBasicVhtMcsAndNssSet(uint16_t basicVhtMcsAndNssSet) [member function]
-    cls.add_method('SetBasicVhtMcsAndNssSet', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::SpectrumPhy> arg0, ns3::Ptr<const ns3::SpectrumPhy> arg1, double arg2) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint16_t', 'basicVhtMcsAndNssSet')])
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetChannelCenterFrequencySegment0(uint8_t channelCenterFrequencySegment0) [member function]
-    cls.add_method('SetChannelCenterFrequencySegment0', 
+                   [param('ns3::Ptr< ns3::SpectrumPhy const >', 'arg0'), param('ns3::Ptr< ns3::SpectrumPhy const >', 'arg1'), param('double', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::WifiMacQueueItem> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint8_t', 'channelCenterFrequencySegment0')])
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetChannelCenterFrequencySegment1(uint8_t channelCenterFrequencySegment1) [member function]
-    cls.add_method('SetChannelCenterFrequencySegment1', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::NetDevice> arg0, ns3::Ptr<const ns3::Packet> arg1, short unsigned int arg2, ns3::Address const & arg3, ns3::Address const & arg4, ns3::NetDevice::PacketType arg5) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint8_t', 'channelCenterFrequencySegment1')])
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetChannelWidth(uint8_t channelWidth) [member function]
-    cls.add_method('SetChannelWidth', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('short unsigned int', 'arg2'), param('ns3::Address const &', 'arg3'), param('ns3::Address const &', 'arg4'), param('ns3::NetDevice::PacketType', 'arg5')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::NetDevice> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint8_t', 'channelWidth')])
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetMaxVhtMcsPerNss(uint8_t nss, uint8_t maxVhtMcs) [member function]
-    cls.add_method('SetMaxVhtMcsPerNss', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3SpectrumSignalParameters__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::SpectrumSignalParameters >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::SpectrumSignalParameters> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint8_t', 'nss'), param('uint8_t', 'maxVhtMcs')])
-    ## vht-operation.h (module 'wifi'): void ns3::VhtOperation::SetVhtSupported(uint8_t vhtSupported) [member function]
-    cls.add_method('SetVhtSupported', 
+                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiMacQueueItem> arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('uint8_t', 'vhtSupported')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3WifiMacQueue_methods(root_module, cls):
-    ## wifi-mac-queue.h (module 'wifi'): static ns3::TypeId ns3::WifiMacQueue::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3RxSignalInfo_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::SetMaxDelay(ns3::Time delay) [member function]
-    cls.add_method('SetMaxDelay', 
-                   'void', 
-                   [param('ns3::Time', 'delay')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Time ns3::WifiMacQueue::GetMaxDelay() const [member function]
-    cls.add_method('GetMaxDelay', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Enqueue(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('Enqueue', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')], 
-                   is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::PushFront(ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('PushFront', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Insert(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, ns3::Ptr<ns3::WifiMacQueueItem> item) [member function]
-    cls.add_method('Insert', 
-                   'bool', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('ns3::Ptr< ns3::WifiMacQueueItem >', 'item')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Dequeue() [member function]
-    cls.add_method('Dequeue', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueByAddress(ns3::Mac48Address dest) [member function]
-    cls.add_method('DequeueByAddress', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Mac48Address', 'dest')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueByTid(uint8_t tid) [member function]
-    cls.add_method('DequeueByTid', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('uint8_t', 'tid')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueByTidAndAddress(uint8_t tid, ns3::Mac48Address dest) [member function]
-    cls.add_method('DequeueByTidAndAddress', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::DequeueFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr) [member function]
-    cls.add_method('DequeueFirstAvailable', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Dequeue(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos) [member function]
-    cls.add_method('Dequeue', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::WifiMacQueue::Peek() const [member function]
-    cls.add_method('Peek', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem const >', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByAddress(ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
-    cls.add_method('PeekByAddress', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
-                   is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTid(uint8_t tid, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
-    cls.add_method('PeekByTid', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('uint8_t', 'tid'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
-                   is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekByTidAndAddress(uint8_t tid, ns3::Mac48Address dest, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
-    cls.add_method('PeekByTidAndAddress', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
-                   is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::PeekFirstAvailable(ns3::Ptr<ns3::QosBlockedDestinations> const blockedPackets=nullptr, ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos=ns3::WifiMacQueue::EMPTY) const [member function]
-    cls.add_method('PeekFirstAvailable', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('ns3::Ptr< ns3::QosBlockedDestinations > const', 'blockedPackets', default_value='nullptr'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos', default_value='ns3::WifiMacQueue::EMPTY')], 
-                   is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::WifiMacQueue::Remove() [member function]
-    cls.add_method('Remove', 
-                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
-                   [], 
-                   is_virtual=True)
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Remove(ns3::Ptr<const ns3::Packet> packet) [member function]
-    cls.add_method('Remove', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator ns3::WifiMacQueue::Remove(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator pos, bool removeExpired=false) [member function]
-    cls.add_method('Remove', 
-                   'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator', 
-                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'pos'), param('bool', 'removeExpired', default_value='false')])
-    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByAddress(ns3::Mac48Address dest) [member function]
-    cls.add_method('GetNPacketsByAddress', 
-                   'uint32_t', 
-                   [param('ns3::Mac48Address', 'dest')])
-    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByTidAndAddress(uint8_t tid, ns3::Mac48Address dest) [member function]
-    cls.add_method('GetNPacketsByTidAndAddress', 
-                   'uint32_t', 
-                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'dest')])
-    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::IsEmpty() [member function]
-    cls.add_method('IsEmpty', 
-                   'bool', 
-                   [])
-    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPackets() [member function]
-    cls.add_method('GetNPackets', 
-                   'uint32_t', 
-                   [])
-    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNBytes() [member function]
-    cls.add_method('GetNBytes', 
-                   'uint32_t', 
-                   [])
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::EMPTY [variable]
-    cls.add_static_attribute('EMPTY', 'ns3::Queue< ns3::WifiMacQueueItem > ConstIterator const', is_const=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::WifiMacQueue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiMacQueue const &', 'arg0')])
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::RxSignalInfo, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, ns3::RxSignalInfo arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('ns3::RxSignalInfo', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
     return
 
-def register_Ns3WifiModeChecker_methods(root_module, cls):
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker(ns3::WifiModeChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiModeChecker const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3WifiModeValue_methods(root_module, cls):
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue() [constructor]
+def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiMode const & value) [constructor]
-    cls.add_constructor([param('ns3::WifiMode const &', 'value')])
-    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiModeValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiModeValue const &', 'arg0')])
-    ## wifi-mode.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::WifiModeValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-mode.h (module 'wifi'): bool ns3::WifiModeValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## wifi-mode.h (module 'wifi'): ns3::WifiMode ns3::WifiModeValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::WifiMode', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Mac48Address arg1, unsigned char arg2, ns3::OriginatorBlockAckAgreement::State arg3) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Time', 'arg0'), param('ns3::Mac48Address', 'arg1'), param('unsigned char', 'arg2'), param('ns3::OriginatorBlockAckAgreement::State', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-mode.h (module 'wifi'): std::string ns3::WifiModeValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
                    'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## wifi-mode.h (module 'wifi'): void ns3::WifiModeValue::Set(ns3::WifiMode const & value) [member function]
-    cls.add_method('Set', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Time arg1, WifiPhyState arg2) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::WifiMode const &', 'value')])
+                   [param('ns3::Time', 'arg0'), param('ns3::Time', 'arg1'), param('WifiPhyState', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3WifiNetDevice_methods(root_module, cls):
-    ## wifi-net-device.h (module 'wifi'): static ns3::TypeId ns3::WifiNetDevice::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
                    is_static=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::WifiNetDevice::WifiNetDevice() [constructor]
-    cls.add_constructor([])
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetMac(ns3::Ptr<ns3::WifiMac> const mac) [member function]
-    cls.add_method('SetMac', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMac > const', 'mac')])
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetPhy', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')])
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const manager) [member function]
-    cls.add_method('SetRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'manager')])
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiNetDevice::GetMac() const [member function]
-    cls.add_method('GetMac', 
-                   'ns3::Ptr< ns3::WifiMac >', 
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiNetDevice::GetPhy() const [member function]
-    cls.add_method('GetPhy', 
-                   'ns3::Ptr< ns3::WifiPhy >', 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Time arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::Time', 'arg0'), param('ns3::Time', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::WifiNetDevice::GetRemoteStationManager() const [member function]
-    cls.add_method('GetRemoteStationManager', 
-                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetHtConfiguration(ns3::Ptr<ns3::HtConfiguration> htConfiguration) [member function]
-    cls.add_method('SetHtConfiguration', 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Ptr< ns3::HtConfiguration >', 'htConfiguration')])
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::HtConfiguration> ns3::WifiNetDevice::GetHtConfiguration() const [member function]
-    cls.add_method('GetHtConfiguration', 
-                   'ns3::Ptr< ns3::HtConfiguration >', 
+                   [param('ns3::Time', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3WifiMacDropReason_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiMacDropReason, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetVhtConfiguration(ns3::Ptr<ns3::VhtConfiguration> vhtConfiguration) [member function]
-    cls.add_method('SetVhtConfiguration', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::VhtConfiguration >', 'vhtConfiguration')])
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::VhtConfiguration> ns3::WifiNetDevice::GetVhtConfiguration() const [member function]
-    cls.add_method('GetVhtConfiguration', 
-                   'ns3::Ptr< ns3::VhtConfiguration >', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetHeConfiguration(ns3::Ptr<ns3::HeConfiguration> heConfiguration) [member function]
-    cls.add_method('SetHeConfiguration', 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::WifiMacDropReason, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiMacDropReason arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Ptr< ns3::HeConfiguration >', 'heConfiguration')])
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::HeConfiguration> ns3::WifiNetDevice::GetHeConfiguration() const [member function]
-    cls.add_method('GetHeConfiguration', 
-                   'ns3::Ptr< ns3::HeConfiguration >', 
+                   [param('ns3::WifiMacDropReason', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetIfIndex(uint32_t const index) [member function]
-    cls.add_method('SetIfIndex', 
-                   'void', 
-                   [param('uint32_t const', 'index')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): uint32_t ns3::WifiNetDevice::GetIfIndex() const [member function]
-    cls.add_method('GetIfIndex', 
-                   'uint32_t', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::Channel> ns3::WifiNetDevice::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::Channel >', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector arg0, ns3::Time arg1) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('ns3::WifiTxVector', 'arg0'), param('ns3::Time', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetAddress(ns3::Address address) [member function]
-    cls.add_method('SetAddress', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Address', 'address')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Address', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::SetMtu(uint16_t const mtu) [member function]
-    cls.add_method('SetMtu', 
-                   'bool', 
-                   [param('uint16_t const', 'mtu')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): uint16_t ns3::WifiNetDevice::GetMtu() const [member function]
-    cls.add_method('GetMtu', 
-                   'uint16_t', 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsLinkUp() const [member function]
-    cls.add_method('IsLinkUp', 
-                   'bool', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('AddLinkChangeCallback', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > > arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsBroadcast() const [member function]
-    cls.add_method('IsBroadcast', 
-                   'bool', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'arg0'), param('ns3::WifiTxVector', 'arg1'), param('double', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Double_Bool_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetBroadcast() const [member function]
-    cls.add_method('GetBroadcast', 
-                   'ns3::Address', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsMulticast() const [member function]
-    cls.add_method('IsMulticast', 
-                   'bool', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, double arg1, bool arg2, double arg3, double arg4) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('double', 'arg1'), param('bool', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
-    cls.add_method('GetMulticast', 
-                   'ns3::Address', 
-                   [param('ns3::Ipv4Address', 'multicastGroup')], 
-                   is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsPointToPoint() const [member function]
-    cls.add_method('IsPointToPoint', 
-                   'bool', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::IsBridge() const [member function]
-    cls.add_method('IsBridge', 
-                   'bool', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiMacQueueItem>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiMacQueueItem> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
+                   'void', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_Ns3Ptr__lt__const_ns3WifiPsdu__gt___Const_ns3WifiTxVector___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, ns3::Ptr< ns3::WifiPsdu const >, ns3::WifiTxVector const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
-    cls.add_method('Send', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Ptr<ns3::Node> ns3::WifiNetDevice::GetNode() const [member function]
-    cls.add_method('GetNode', 
-                   'ns3::Ptr< ns3::Node >', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetNode(ns3::Ptr<ns3::Node> const node) [member function]
-    cls.add_method('SetNode', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, ns3::Ptr<const ns3::WifiPsdu>, const ns3::WifiTxVector &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, ns3::Ptr<const ns3::WifiPsdu> arg1, ns3::WifiTxVector const & arg2) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node > const', 'node')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::NeedsArp() const [member function]
-    cls.add_method('NeedsArp', 
-                   'bool', 
+                   [param('unsigned char', 'arg0'), param('ns3::Ptr< ns3::WifiPsdu const >', 'arg1'), param('ns3::WifiTxVector const &', 'arg2')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_char_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__ns3WifiPsdu__gt_____gt_____gt_____gt_____star___Const_stdSet__lt__ns3Mac48Address__stdLess__lt__ns3Mac48Address__gt____stdAllocator__lt__ns3Mac48Address__gt_____gt_____star___Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu >, std::hash< unsigned short >, std::equal_to< unsigned short >, std::allocator< std::pair< unsigned short const, ns3::Ptr< ns3::WifiPsdu > > > > *, std::set< ns3::Mac48Address, std::less< ns3::Mac48Address >, std::allocator< ns3::Mac48Address > > const, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetReceiveCallback(ns3::NetDevice::ReceiveCallback cb) [member function]
-    cls.add_method('SetReceiveCallback', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > *, const std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > *, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, std::unordered_map<unsigned short, ns3::Ptr<ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<ns3::WifiPsdu> > > > * arg1, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * arg2, long unsigned int arg3) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): ns3::Address ns3::WifiNetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
-    cls.add_method('GetMulticast', 
-                   'ns3::Address', 
-                   [param('ns3::Ipv6Address', 'addr')], 
+                   [param('unsigned char', 'arg0'), param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > > *', 'arg1'), param('std::set< ns3::Mac48Address > const *', 'arg2'), param('long unsigned int', 'arg3')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    cls.add_copy_constructor()
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
-    cls.add_method('SendFrom', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::SetPromiscReceiveCallback(ns3::NetDevice::PromiscReceiveCallback cb) [member function]
-    cls.add_method('SetPromiscReceiveCallback', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned int arg0) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
-                   is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): bool ns3::WifiNetDevice::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
+                   [param('unsigned int', 'arg0')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned int arg0, unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
                    'void', 
+                   [param('unsigned int', 'arg0'), param('unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
-                   'void', 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
                    [], 
-                   is_virtual=True, visibility='protected')
-    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::ForwardUp(ns3::Ptr<const ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
-    cls.add_method('ForwardUp', 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(long unsigned int arg0, long unsigned int arg1) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
-                   visibility='protected')
+                   [param('long unsigned int', 'arg0'), param('long unsigned int', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3WifiRadioEnergyModel_methods(root_module, cls):
-    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel(ns3::WifiRadioEnergyModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::WifiRadioEnergyModel const &', 'arg0')])
-    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModel::WifiRadioEnergyModel() [constructor]
+def register_Ns3CallbackImpl__Void_Unsigned_short_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
     cls.add_constructor([])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::ChangeState(int newState) [member function]
-    cls.add_method('ChangeState', 
+    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
+    cls.add_method('GetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned short, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(short unsigned int arg0, ns3::Mac48Address arg1) [member operator]
+    cls.add_method('operator()', 
                    'void', 
-                   [param('int', 'newState')], 
+                   [param('short unsigned int', 'arg0'), param('ns3::Mac48Address', 'arg1')], 
+                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3DsssPhy_methods(root_module, cls):
+    ## dsss-phy.h (module 'wifi'): ns3::DsssPhy::DsssPhy(ns3::DsssPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::DsssPhy const &', 'arg0')])
+    ## dsss-phy.h (module 'wifi'): ns3::DsssPhy::DsssPhy() [constructor]
+    cls.add_constructor([])
+    ## dsss-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::DsssPhy::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
                    is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetCcaBusyCurrentA() const [member function]
-    cls.add_method('GetCcaBusyCurrentA', 
-                   'double', 
+    ## dsss-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::DsssPhy::GetCodeRate(std::string const & name) [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('std::string const &', 'name')], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static uint16_t ns3::DsssPhy::GetConstellationSize(std::string const & name) [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint16_t', 
+                   [param('std::string const &', 'name')], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static uint64_t ns3::DsssPhy::GetDataRate(std::string const & name, ns3::WifiModulationClass modClass, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [param('std::string const &', 'name'), param('ns3::WifiModulationClass', 'modClass'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static uint64_t ns3::DsssPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetDataRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static ns3::WifiMode ns3::DsssPhy::GetDsssRate(uint64_t rate) [member function]
+    cls.add_method('GetDsssRate', 
+                   'ns3::WifiMode', 
+                   [param('uint64_t', 'rate')], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static ns3::WifiMode ns3::DsssPhy::GetDsssRate11Mbps() [member function]
+    cls.add_method('GetDsssRate11Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): WifiPhyState ns3::WifiRadioEnergyModel::GetCurrentState() const [member function]
-    cls.add_method('GetCurrentState', 
-                   'WifiPhyState', 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static ns3::WifiMode ns3::DsssPhy::GetDsssRate1Mbps() [member function]
+    cls.add_method('GetDsssRate1Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetIdleCurrentA() const [member function]
-    cls.add_method('GetIdleCurrentA', 
-                   'double', 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static ns3::WifiMode ns3::DsssPhy::GetDsssRate2Mbps() [member function]
+    cls.add_method('GetDsssRate2Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): ns3::Time ns3::WifiRadioEnergyModel::GetMaximumTimeInState(int state) const [member function]
-    cls.add_method('GetMaximumTimeInState', 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static ns3::WifiMode ns3::DsssPhy::GetDsssRate5_5Mbps() [member function]
+    cls.add_method('GetDsssRate5_5Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): ns3::Time ns3::DsssPhy::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
                    'ns3::Time', 
-                   [param('int', 'state')], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): ns3::WifiRadioEnergyModelPhyListener * ns3::WifiRadioEnergyModel::GetPhyListener() [member function]
-    cls.add_method('GetPhyListener', 
-                   'ns3::WifiRadioEnergyModelPhyListener *', 
-                   [])
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetRxCurrentA() const [member function]
-    cls.add_method('GetRxCurrentA', 
-                   'double', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-phy.h (module 'wifi'): uint32_t ns3::DsssPhy::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetSleepCurrentA() const [member function]
-    cls.add_method('GetSleepCurrentA', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## dsss-phy.h (module 'wifi'): ns3::Time ns3::DsssPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) const [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-phy.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::DsssPhy::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
                    [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetSwitchingCurrentA() const [member function]
-    cls.add_method('GetSwitchingCurrentA', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## dsss-phy.h (module 'wifi'): ns3::WifiMode ns3::DsssPhy::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## dsss-phy.h (module 'wifi'): static void ns3::DsssPhy::InitializeModes() [member function]
+    cls.add_method('InitializeModes', 
+                   'void', 
                    [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetTotalEnergyConsumption() const [member function]
-    cls.add_method('GetTotalEnergyConsumption', 
-                   'double', 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): static bool ns3::DsssPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsModeAllowed', 
+                   'bool', 
+                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## dsss-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::DsssPhy::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='private')
+    ## dsss-phy.h (module 'wifi'): uint16_t ns3::DsssPhy::GetRxChannelWidth(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetRxChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## dsss-phy.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::DsssPhy::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3ErpOfdmPpdu_methods(root_module, cls):
+    ## erp-ofdm-ppdu.h (module 'wifi'): ns3::ErpOfdmPpdu::ErpOfdmPpdu(ns3::ErpOfdmPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ErpOfdmPpdu const &', 'arg0')])
+    ## erp-ofdm-ppdu.h (module 'wifi'): ns3::ErpOfdmPpdu::ErpOfdmPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid')])
+    ## erp-ofdm-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::ErpOfdmPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::GetTxCurrentA() const [member function]
-    cls.add_method('GetTxCurrentA', 
-                   'double', 
-                   [], 
-                   is_const=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): static ns3::TypeId ns3::WifiRadioEnergyModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## erp-ofdm-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::ErpOfdmPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
-                   is_static=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyChanged() [member function]
-    cls.add_method('HandleEnergyChanged', 
-                   'void', 
+                   is_const=True, is_virtual=True, visibility='private')
+    return
+
+def register_Ns3HePpdu_methods(root_module, cls):
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HePpdu(ns3::HePpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HePpdu const &', 'arg0')])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HePpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid')])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HePpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid, ns3::HePpdu::TxPsdFlag flag) [constructor]
+    cls.add_constructor([param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid'), param('ns3::HePpdu::TxPsdFlag', 'flag')])
+    ## he-ppdu.h (module 'wifi'): bool ns3::HePpdu::CanBeReceived(uint16_t txCenterFreq, uint16_t p20MinFreq, uint16_t p20MaxFreq) const [member function]
+    cls.add_method('CanBeReceived', 
+                   'bool', 
+                   [param('uint16_t', 'txCenterFreq'), param('uint16_t', 'p20MinFreq'), param('uint16_t', 'p20MaxFreq')], 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::HePpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyDepletion() [member function]
-    cls.add_method('HandleEnergyDepletion', 
-                   'void', 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::HePpdu::GetPsdu(uint8_t bssColor, uint16_t staId=65535) const [member function]
+    cls.add_method('GetPsdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
+                   [param('uint8_t', 'bssColor'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): uint16_t ns3::HePpdu::GetStaId() const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
                    [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::HandleEnergyRecharged() [member function]
-    cls.add_method('HandleEnergyRecharged', 
-                   'void', 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): uint16_t ns3::HePpdu::GetTransmissionChannelWidth() const [member function]
+    cls.add_method('GetTransmissionChannelWidth', 
+                   'uint16_t', 
                    [], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetCcaBusyCurrentA(double ccaBusyCurrentA) [member function]
-    cls.add_method('SetCcaBusyCurrentA', 
-                   'void', 
-                   [param('double', 'ccaBusyCurrentA')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergyDepletionCallback(ns3::WifiRadioEnergyModel::WifiRadioEnergyDepletionCallback callback) [member function]
-    cls.add_method('SetEnergyDepletionCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergyRechargedCallback(ns3::WifiRadioEnergyModel::WifiRadioEnergyRechargedCallback callback) [member function]
-    cls.add_method('SetEnergyRechargedCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetEnergySource(ns3::Ptr<ns3::EnergySource> const source) [member function]
-    cls.add_method('SetEnergySource', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::EnergySource > const', 'source')], 
-                   is_virtual=True)
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetIdleCurrentA(double idleCurrentA) [member function]
-    cls.add_method('SetIdleCurrentA', 
-                   'void', 
-                   [param('double', 'idleCurrentA')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetRxCurrentA(double rxCurrentA) [member function]
-    cls.add_method('SetRxCurrentA', 
-                   'void', 
-                   [param('double', 'rxCurrentA')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetSleepCurrentA(double sleepCurrentA) [member function]
-    cls.add_method('SetSleepCurrentA', 
-                   'void', 
-                   [param('double', 'sleepCurrentA')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetSwitchingCurrentA(double switchingCurrentA) [member function]
-    cls.add_method('SetSwitchingCurrentA', 
-                   'void', 
-                   [param('double', 'switchingCurrentA')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentA(double txCurrentA) [member function]
-    cls.add_method('SetTxCurrentA', 
-                   'void', 
-                   [param('double', 'txCurrentA')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentFromModel(double txPowerDbm) [member function]
-    cls.add_method('SetTxCurrentFromModel', 
-                   'void', 
-                   [param('double', 'txPowerDbm')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::SetTxCurrentModel(ns3::Ptr<ns3::WifiTxCurrentModel> const model) [member function]
-    cls.add_method('SetTxCurrentModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiTxCurrentModel > const', 'model')])
-    ## wifi-radio-energy-model.h (module 'wifi'): void ns3::WifiRadioEnergyModel::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): ns3::Time ns3::HePpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::TxPsdFlag ns3::HePpdu::GetTxPsdFlag() const [member function]
+    cls.add_method('GetTxPsdFlag', 
+                   'ns3::HePpdu::TxPsdFlag', 
+                   [], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): ns3::WifiPpduType ns3::HePpdu::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::WifiPpduType', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::SetTxPsdFlag(ns3::HePpdu::TxPsdFlag flag) [member function]
+    cls.add_method('SetTxPsdFlag', 
                    'void', 
+                   [param('ns3::HePpdu::TxPsdFlag', 'flag')])
+    ## he-ppdu.h (module 'wifi'): bool ns3::HePpdu::IsDlMu() const [member function]
+    cls.add_method('IsDlMu', 
+                   'bool', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## wifi-radio-energy-model.h (module 'wifi'): double ns3::WifiRadioEnergyModel::DoGetCurrentA() const [member function]
-    cls.add_method('DoGetCurrentA', 
-                   'double', 
+                   is_const=True, visibility='protected')
+    ## he-ppdu.h (module 'wifi'): bool ns3::HePpdu::IsMu() const [member function]
+    cls.add_method('IsMu', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## he-ppdu.h (module 'wifi'): bool ns3::HePpdu::IsUlMu() const [member function]
+    cls.add_method('IsUlMu', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## he-ppdu.h (module 'wifi'): std::string ns3::HePpdu::PrintPayload() const [member function]
+    cls.add_method('PrintPayload', 
+                   'std::string', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::HePpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
                    [], 
                    is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3YansErrorRateModel_methods(root_module, cls):
-    ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel::YansErrorRateModel(ns3::YansErrorRateModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::YansErrorRateModel const &', 'arg0')])
-    ## yans-error-rate-model.h (module 'wifi'): ns3::YansErrorRateModel::YansErrorRateModel() [constructor]
+def register_Ns3HePpduHeSigHeader_methods(root_module, cls):
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HeSigHeader::HeSigHeader(ns3::HePpdu::HeSigHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HePpdu::HeSigHeader const &', 'arg0')])
+    ## he-ppdu.h (module 'wifi'): ns3::HePpdu::HeSigHeader::HeSigHeader() [constructor]
     cls.add_constructor([])
-    ## yans-error-rate-model.h (module 'wifi'): static ns3::TypeId ns3::YansErrorRateModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
+    ## he-ppdu.h (module 'wifi'): uint32_t ns3::HePpdu::HeSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): uint8_t ns3::HePpdu::HeSigHeader::GetBssColor() const [member function]
+    cls.add_method('GetBssColor', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): uint16_t ns3::HePpdu::HeSigHeader::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): uint16_t ns3::HePpdu::HeSigHeader::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): ns3::TypeId ns3::HePpdu::HeSigHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## yans-error-rate-model.h (module 'wifi'): double ns3::YansErrorRateModel::DoGetChunkSuccessRate(ns3::WifiMode mode, ns3::WifiTxVector txVector, double snr, uint64_t nbits) const [member function]
-    cls.add_method('DoGetChunkSuccessRate', 
-                   'double', 
-                   [param('ns3::WifiMode', 'mode'), param('ns3::WifiTxVector', 'txVector'), param('double', 'snr'), param('uint64_t', 'nbits')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3YansWifiChannel_methods(root_module, cls):
-    ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel::YansWifiChannel(ns3::YansWifiChannel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::YansWifiChannel const &', 'arg0')])
-    ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel::YansWifiChannel() [constructor]
-    cls.add_constructor([])
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Add(ns3::Ptr<ns3::YansWifiPhy> phy) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'phy')])
-    ## yans-wifi-channel.h (module 'wifi'): int64_t ns3::YansWifiChannel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## yans-wifi-channel.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::YansWifiChannel::GetDevice(std::size_t i) const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::NetDevice >', 
-                   [param('std::size_t', 'i')], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-channel.h (module 'wifi'): std::size_t ns3::YansWifiChannel::GetNDevices() const [member function]
-    cls.add_method('GetNDevices', 
-                   'std::size_t', 
+    ## he-ppdu.h (module 'wifi'): uint8_t ns3::HePpdu::HeSigHeader::GetMcs() const [member function]
+    cls.add_method('GetMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): uint8_t ns3::HePpdu::HeSigHeader::GetNStreams() const [member function]
+    cls.add_method('GetNStreams', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## he-ppdu.h (module 'wifi'): uint32_t ns3::HePpdu::HeSigHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-channel.h (module 'wifi'): static ns3::TypeId ns3::YansWifiChannel::GetTypeId() [member function]
+    ## he-ppdu.h (module 'wifi'): static ns3::TypeId ns3::HePpdu::HeSigHeader::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<const ns3::WifiPpdu> ppdu, double txPowerDbm) const [member function]
-    cls.add_method('Send', 
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('double', 'txPowerDbm')], 
-                   is_const=True)
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> const delay) [member function]
-    cls.add_method('SetPropagationDelayModel', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::PropagationDelayModel > const', 'delay')])
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> const loss) [member function]
-    cls.add_method('SetPropagationLossModel', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::SetBssColor(uint8_t bssColor) [member function]
+    cls.add_method('SetBssColor', 
                    'void', 
-                   [param('ns3::Ptr< ns3::PropagationLossModel > const', 'loss')])
-    return
-
-def register_Ns3AddressChecker_methods(root_module, cls):
-    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
-    cls.add_constructor([])
-    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker(ns3::AddressChecker const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AddressChecker const &', 'arg0')])
+                   [param('uint8_t', 'bssColor')])
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
+                   'void', 
+                   [param('uint16_t', 'channelWidth')])
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::SetGuardIntervalAndLtfSize(uint16_t gi, uint8_t ltf) [member function]
+    cls.add_method('SetGuardIntervalAndLtfSize', 
+                   'void', 
+                   [param('uint16_t', 'gi'), param('uint8_t', 'ltf')])
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::SetMcs(uint8_t mcs) [member function]
+    cls.add_method('SetMcs', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::SetMuFlag(bool mu) [member function]
+    cls.add_method('SetMuFlag', 
+                   'void', 
+                   [param('bool', 'mu')])
+    ## he-ppdu.h (module 'wifi'): void ns3::HePpdu::HeSigHeader::SetNStreams(uint8_t nStreams) [member function]
+    cls.add_method('SetNStreams', 
+                   'void', 
+                   [param('uint8_t', 'nStreams')])
     return
 
-def register_Ns3AddressValue_methods(root_module, cls):
-    ## address.h (module 'network'): ns3::AddressValue::AddressValue() [constructor]
+def register_Ns3HtFrameExchangeManager_methods(root_module, cls):
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::HtFrameExchangeManager::HtFrameExchangeManager(ns3::HtFrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtFrameExchangeManager const &', 'arg0')])
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::HtFrameExchangeManager::HtFrameExchangeManager() [constructor]
     cls.add_constructor([])
-    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::Address const & value) [constructor]
-    cls.add_constructor([param('ns3::Address const &', 'value')])
-    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::AddressValue const & arg0) [constructor]
-    cls.add_constructor([param('ns3::AddressValue const &', 'arg0')])
-    ## address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::AddressValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::CalculateAcknowledgmentTime(ns3::WifiAcknowledgment * acknowledgment) const [member function]
+    cls.add_method('CalculateAcknowledgmentTime', 
+                   'void', 
+                   [param('ns3::WifiAcknowledgment *', 'acknowledgment')], 
                    is_const=True, is_virtual=True)
-    ## address.h (module 'network'): bool ns3::AddressValue::DeserializeFromString(std::string value, ns3::Ptr<const ns3::AttributeChecker> checker) [member function]
-    cls.add_method('DeserializeFromString', 
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::CreateBlockAckAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address originator, uint16_t startingSeq) [member function]
+    cls.add_method('CreateBlockAckAgreement', 
+                   'void', 
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'originator'), param('uint16_t', 'startingSeq')])
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::DestroyBlockAckAgreement(ns3::Mac48Address originator, uint8_t tid) [member function]
+    cls.add_method('DestroyBlockAckAgreement', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')])
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::GetBaAgreementEstablished(ns3::Mac48Address originator, uint8_t tid) const [member function]
+    cls.add_method('GetBaAgreementEstablished', 
                    'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## address.h (module 'network'): ns3::Address ns3::AddressValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::Address', 
+                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::BlockAckType ns3::HtFrameExchangeManager::GetBlockAckType(ns3::Mac48Address originator, uint8_t tid) const [member function]
+    cls.add_method('GetBlockAckType', 
+                   'ns3::BlockAckType', 
+                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::MpduAggregator> ns3::HtFrameExchangeManager::GetMpduAggregator() const [member function]
+    cls.add_method('GetMpduAggregator', 
+                   'ns3::Ptr< ns3::MpduAggregator >', 
                    [], 
                    is_const=True)
-    ## address.h (module 'network'): std::string ns3::AddressValue::SerializeToString(ns3::Ptr<const ns3::AttributeChecker> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::MsduAggregator> ns3::HtFrameExchangeManager::GetMsduAggregator() const [member function]
+    cls.add_method('GetMsduAggregator', 
+                   'ns3::Ptr< ns3::MsduAggregator >', 
+                   [], 
+                   is_const=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): uint16_t ns3::HtFrameExchangeManager::GetSupportedBaBufferSize() const [member function]
+    cls.add_method('GetSupportedBaBufferSize', 
+                   'uint16_t', 
+                   [], 
                    is_const=True, is_virtual=True)
-    ## address.h (module 'network'): void ns3::AddressValue::Set(ns3::Address const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::Address const &', 'value')])
-    return
-
-def register_Ns3AdhocWifiMac_methods(root_module, cls):
-    ## adhoc-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::AdhocWifiMac::GetTypeId() [member function]
+    ## ht-frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::HtFrameExchangeManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): ns3::AdhocWifiMac::AdhocWifiMac() [constructor]
-    cls.add_constructor([])
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::IsWithinAmpduSizeLimit(uint32_t ampduSize, ns3::Mac48Address receiver, uint8_t tid, ns3::WifiModulationClass modulation) const [member function]
+    cls.add_method('IsWithinAmpduSizeLimit', 
+                   'bool', 
+                   [param('uint32_t', 'ampduSize'), param('ns3::Mac48Address', 'receiver'), param('uint8_t', 'tid'), param('ns3::WifiModulationClass', 'modulation')], 
+                   is_const=True, is_virtual=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::IsWithinLimitsIfAddMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters const & txParams, ns3::Time ppduDurationLimit) const [member function]
+    cls.add_method('IsWithinLimitsIfAddMpdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Time', 'ppduDurationLimit')], 
+                   is_const=True, is_virtual=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::IsWithinLimitsIfAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters const & txParams, ns3::Time ppduDurationLimit) const [member function]
+    cls.add_method('IsWithinLimitsIfAggregateMsdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters const &', 'txParams'), param('ns3::Time', 'ppduDurationLimit')], 
+                   is_const=True, is_virtual=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendAddBaResponse(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address originator) [member function]
+    cls.add_method('SendAddBaResponse', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')], 
-                   is_virtual=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'originator')])
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
                    is_virtual=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::StartFrameExchange(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('StartFrameExchange', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
                    is_virtual=True)
-    ## adhoc-wifi-mac.h (module 'wifi'): void ns3::AdhocWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::TryAggregateMsdu(ns3::Ptr<const ns3::WifiMacQueueItem> msdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime) const [member function]
+    cls.add_method('TryAggregateMsdu', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'msdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime')], 
+                   is_const=True, is_virtual=True)
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::BlockAckTimeout(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('BlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::CtsTimeout(ns3::Ptr<ns3::WifiMacQueueItem> rts, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('CtsTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'rts'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::DequeueMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DequeueMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::DequeuePsdu(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
+    cls.add_method('DequeuePsdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')], 
+                   visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    cls.add_method('EndReceiveAmpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::ForwardMpduDown(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector & txVector) [member function]
+    cls.add_method('ForwardMpduDown', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::ForwardPsduDown(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector & txVector) [member function]
+    cls.add_method('ForwardPsduDown', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::BlockAckManager> ns3::HtFrameExchangeManager::GetBaManager(uint8_t tid) const [member function]
+    cls.add_method('GetBaManager', 
+                   'ns3::Ptr< ns3::BlockAckManager >', 
+                   [param('uint8_t', 'tid')], 
+                   is_const=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::HtFrameExchangeManager::GetPsduDurationId(ns3::Time txDuration, ns3::WifiTxParameters const & txParams) const [member function]
+    cls.add_method('GetPsduDurationId', 
+                   'ns3::Time', 
+                   [param('ns3::Time', 'txDuration'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPsdu> ns3::HtFrameExchangeManager::GetWifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetWifiPsdu', 
+                   'ns3::Ptr< ns3::WifiPsdu >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::MissedBlockAck(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, bool & resetCw) [member function]
+    cls.add_method('MissedBlockAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('bool &', 'resetCw')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::NeedSetupBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('NeedSetupBlockAck', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::NotifyPacketDiscarded(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyPacketDiscarded', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::NotifyReceivedNormalAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('NotifyReceivedNormalAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::NotifyTxToEdca(ns3::Ptr<const ns3::WifiPsdu> psdu) const [member function]
+    cls.add_method('NotifyTxToEdca', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::ReceiveMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector const & txVector, bool inAmpdu) [member function]
+    cls.add_method('ReceiveMpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::RetransmitMpduAfterMissedAck(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedAck', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::RetransmitMpduAfterMissedCts(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) const [member function]
+    cls.add_method('RetransmitMpduAfterMissedCts', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendAddBaRequest(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq, uint16_t timeout, bool immediateBAck) [member function]
+    cls.add_method('SendAddBaRequest', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq'), param('uint16_t', 'timeout'), param('bool', 'immediateBAck')], 
+                   visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendBlockAck(ns3::RecipientBlockAckAgreement const & agreement, ns3::Time durationId, ns3::WifiTxVector & blockAckTxVector, double rxSnr) [member function]
+    cls.add_method('SendBlockAck', 
+                   'void', 
+                   [param('ns3::RecipientBlockAckAgreement const &', 'agreement'), param('ns3::Time', 'durationId'), param('ns3::WifiTxVector &', 'blockAckTxVector'), param('double', 'rxSnr')], 
+                   visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::SendDataFrame(ns3::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('SendDataFrame', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
+    cls.add_method('SendDelbaFrame', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')], 
+                   visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): bool ns3::HtFrameExchangeManager::SendMpduFromBaManager(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('SendMpduFromBaManager', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::SendPsduWithProtection(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiTxParameters & txParams) [member function]
+    cls.add_method('SendPsduWithProtection', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiTxParameters &', 'txParams')], 
+                   visibility='protected')
+    ## ht-frame-exchange-manager.h (module 'wifi'): void ns3::HtFrameExchangeManager::TransmissionSucceeded() [member function]
+    cls.add_method('TransmissionSucceeded', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
-def register_Ns3AlwaysLosChannelConditionModel_methods(root_module, cls):
-    ## channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::AlwaysLosChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3HtPpdu_methods(root_module, cls):
+    ## ht-ppdu.h (module 'wifi'): ns3::HtPpdu::HtPpdu(ns3::HtPpdu const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtPpdu const &', 'arg0')])
+    ## ht-ppdu.h (module 'wifi'): ns3::HtPpdu::HtPpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration, ns3::WifiPhyBand band, uint64_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band'), param('uint64_t', 'uid')])
+    ## ht-ppdu.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::HtPpdu::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
                    [], 
-                   is_static=True)
-    ## channel-condition-model.h (module 'propagation'): ns3::AlwaysLosChannelConditionModel::AlwaysLosChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## channel-condition-model.h (module 'propagation'): ns3::Ptr<ns3::ChannelCondition> ns3::AlwaysLosChannelConditionModel::GetChannelCondition(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('GetChannelCondition', 
-                   'ns3::Ptr< ns3::ChannelCondition >', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
                    is_const=True, is_virtual=True)
-    ## channel-condition-model.h (module 'propagation'): int64_t ns3::AlwaysLosChannelConditionModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
-                   is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): ns3::Time ns3::HtPpdu::GetTxDuration() const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): ns3::WifiTxVector ns3::HtPpdu::DoGetTxVector() const [member function]
+    cls.add_method('DoGetTxVector', 
+                   'ns3::WifiTxVector', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3BinaryErrorModel_methods(root_module, cls):
-    ## error-model.h (module 'network'): ns3::BinaryErrorModel::BinaryErrorModel(ns3::BinaryErrorModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BinaryErrorModel const &', 'arg0')])
-    ## error-model.h (module 'network'): ns3::BinaryErrorModel::BinaryErrorModel() [constructor]
+def register_Ns3HtPpduHtSigHeader_methods(root_module, cls):
+    ## ht-ppdu.h (module 'wifi'): ns3::HtPpdu::HtSigHeader::HtSigHeader(ns3::HtPpdu::HtSigHeader const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtPpdu::HtSigHeader const &', 'arg0')])
+    ## ht-ppdu.h (module 'wifi'): ns3::HtPpdu::HtSigHeader::HtSigHeader() [constructor]
     cls.add_constructor([])
-    ## error-model.h (module 'network'): static ns3::TypeId ns3::BinaryErrorModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
+    ## ht-ppdu.h (module 'wifi'): uint32_t ns3::HtPpdu::HtSigHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): bool ns3::HtPpdu::HtSigHeader::GetAggregation() const [member function]
+    cls.add_method('GetAggregation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ht-ppdu.h (module 'wifi'): uint16_t ns3::HtPpdu::HtSigHeader::GetChannelWidth() const [member function]
+    cls.add_method('GetChannelWidth', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-ppdu.h (module 'wifi'): uint16_t ns3::HtPpdu::HtSigHeader::GetHtLength() const [member function]
+    cls.add_method('GetHtLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-ppdu.h (module 'wifi'): ns3::TypeId ns3::HtPpdu::HtSigHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
                    'ns3::TypeId', 
                    [], 
-                   is_static=True)
-    ## error-model.h (module 'network'): bool ns3::BinaryErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorrupt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): void ns3::BinaryErrorModel::DoReset() [member function]
-    cls.add_method('DoReset', 
-                   'void', 
+                   is_const=True, is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): uint8_t ns3::HtPpdu::HtSigHeader::GetMcs() const [member function]
+    cls.add_method('GetMcs', 
+                   'uint8_t', 
                    [], 
-                   is_virtual=True, visibility='private')
-    return
-
-def register_Ns3BurstErrorModel_methods(root_module, cls):
-    ## error-model.h (module 'network'): ns3::BurstErrorModel::BurstErrorModel(ns3::BurstErrorModel const & arg0) [constructor]
-    cls.add_constructor([param('ns3::BurstErrorModel const &', 'arg0')])
-    ## error-model.h (module 'network'): ns3::BurstErrorModel::BurstErrorModel() [constructor]
-    cls.add_constructor([])
-    ## error-model.h (module 'network'): int64_t ns3::BurstErrorModel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## error-model.h (module 'network'): double ns3::BurstErrorModel::GetBurstRate() const [member function]
-    cls.add_method('GetBurstRate', 
-                   'double', 
+                   is_const=True)
+    ## ht-ppdu.h (module 'wifi'): uint32_t ns3::HtPpdu::HtSigHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): bool ns3::HtPpdu::HtSigHeader::GetShortGuardInterval() const [member function]
+    cls.add_method('GetShortGuardInterval', 
+                   'bool', 
                    [], 
                    is_const=True)
-    ## error-model.h (module 'network'): static ns3::TypeId ns3::BurstErrorModel::GetTypeId() [member function]
+    ## ht-ppdu.h (module 'wifi'): static ns3::TypeId ns3::HtPpdu::HtSigHeader::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetBurstRate(double rate) [member function]
-    cls.add_method('SetBurstRate', 
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
                    'void', 
-                   [param('double', 'rate')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> burstSz) [member function]
-    cls.add_method('SetRandomBurstSize', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'burstSz')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> ranVar) [member function]
-    cls.add_method('SetRandomVariable', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::SetAggregation(bool aggregation) [member function]
+    cls.add_method('SetAggregation', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'ranVar')])
-    ## error-model.h (module 'network'): bool ns3::BurstErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
-    cls.add_method('DoCorrupt', 
-                   'bool', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p')], 
-                   is_virtual=True, visibility='private')
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::DoReset() [member function]
-    cls.add_method('DoReset', 
+                   [param('bool', 'aggregation')])
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::SetChannelWidth(uint16_t channelWidth) [member function]
+    cls.add_method('SetChannelWidth', 
                    'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
+                   [param('uint16_t', 'channelWidth')])
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::SetHtLength(uint16_t length) [member function]
+    cls.add_method('SetHtLength', 
+                   'void', 
+                   [param('uint16_t', 'length')])
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::SetMcs(uint8_t mcs) [member function]
+    cls.add_method('SetMcs', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
+    ## ht-ppdu.h (module 'wifi'): void ns3::HtPpdu::HtSigHeader::SetShortGuardInterval(bool sgi) [member function]
+    cls.add_method('SetShortGuardInterval', 
+                   'void', 
+                   [param('bool', 'sgi')])
     return
 
-def register_Ns3CallbackImpl__Ns3ObjectBase___star___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+def register_Ns3OfdmPhy_methods(root_module, cls):
+    ## ofdm-phy.h (module 'wifi'): ns3::OfdmPhy::OfdmPhy(ns3::OfdmPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::OfdmPhy const &', 'arg0')])
+    ## ofdm-phy.h (module 'wifi'): ns3::OfdmPhy::OfdmPhy(ns3::OfdmPhyVariant variant=::ns3::OfdmPhyVariant::OFDM_PHY_DEFAULT, bool buildModeList=true) [constructor]
+    cls.add_constructor([param('ns3::OfdmPhyVariant', 'variant', default_value='::ns3::OfdmPhyVariant::OFDM_PHY_DEFAULT'), param('bool', 'buildModeList', default_value='true')])
+    ## ofdm-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::OfdmPhy::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
+                   is_virtual=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::OfdmPhy::GetCodeRate(std::string const & name) [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('std::string const &', 'name')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static uint16_t ns3::OfdmPhy::GetConstellationSize(std::string const & name) [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint16_t', 
+                   [param('std::string const &', 'name')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetDataRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetDataRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): ns3::Time ns3::OfdmPhy::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate(uint64_t rate, uint16_t bw=20) [member function]
+    cls.add_method('GetOfdmRate', 
+                   'ns3::WifiMode', 
+                   [param('uint64_t', 'rate'), param('uint16_t', 'bw', default_value='20')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate12Mbps() [member function]
+    cls.add_method('GetOfdmRate12Mbps', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate12MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): ns3::ObjectBase * ns3::CallbackImpl<ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
-    cls.add_method('operator()', 
-                   'ns3::ObjectBase *', 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate12MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
+                   'ns3::WifiMode', 
                    [], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Bool_Unsigned_int_Double_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate18Mbps() [member function]
+    cls.add_method('GetOfdmRate18Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, bool, unsigned int, double, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(bool arg0, unsigned int arg1, double arg2, ns3::Time arg3) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('bool', 'arg0'), param('unsigned int', 'arg1'), param('double', 'arg2'), param('ns3::Time', 'arg3')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Const_ns3WifiMacHeader___amp___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate18MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate24Mbps() [member function]
+    cls.add_method('GetOfdmRate24Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate24MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate27MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate36Mbps() [member function]
+    cls.add_method('GetOfdmRate36Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate3MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate3MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate48Mbps() [member function]
+    cls.add_method('GetOfdmRate48Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate54Mbps() [member function]
+    cls.add_method('GetOfdmRate54Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate6Mbps() [member function]
+    cls.add_method('GetOfdmRate6Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate6MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, const ns3::WifiMacHeader &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiMacHeader const & arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::WifiMacHeader const &', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Double_Double_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate6MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate9Mbps() [member function]
+    cls.add_method('GetOfdmRate9Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, double, double, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(double arg0, double arg1, ns3::Mac48Address arg2) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('double', 'arg0'), param('double', 'arg1'), param('ns3::Mac48Address', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate9MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::OfdmPhy::GetOfdmRate9MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
+                   'ns3::WifiMode', 
                    [], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): ns3::Time ns3::OfdmPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) const [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(double arg0, double arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('double', 'arg0'), param('double', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetPhyRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetPhyRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::OfdmPhy::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(double arg0) [member operator]
-    cls.add_method('operator()', 
+    ## ofdm-phy.h (module 'wifi'): ns3::WifiMode ns3::OfdmPhy::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## ofdm-phy.h (module 'wifi'): static void ns3::OfdmPhy::InitializeModes() [member function]
+    cls.add_method('InitializeModes', 
                    'void', 
-                   [param('double', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ofdm-phy.h (module 'wifi'): static bool ns3::OfdmPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsModeAllowed', 
+                   'bool', 
+                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::CalculateDataRate(ns3::WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('CalculateDataRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'codeRate'), param('uint16_t', 'constellationSize'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::CalculateDataRate(double symbolDuration, uint16_t guardInterval, uint16_t usableSubCarriers, uint16_t numberOfBitsPerSubcarrier, double codingRate) [member function]
+    cls.add_method('CalculateDataRate', 
+                   'uint64_t', 
+                   [param('double', 'symbolDuration'), param('uint16_t', 'guardInterval'), param('uint16_t', 'usableSubCarriers'), param('uint16_t', 'numberOfBitsPerSubcarrier'), param('double', 'codingRate')], 
+                   is_static=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): static uint64_t ns3::OfdmPhy::CalculatePhyRate(ns3::WifiCodeRate codeRate, uint64_t dataRate) [member function]
+    cls.add_method('CalculatePhyRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'codeRate'), param('uint64_t', 'dataRate')], 
+                   is_static=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::OfdmPhy::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::OfdmPhy::EndReceiveHeader(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceiveHeader', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): static double ns3::OfdmPhy::GetCodeRatio(ns3::WifiCodeRate codeRate) [member function]
+    cls.add_method('GetCodeRatio', 
+                   'double', 
+                   [param('uint16_t', 'codeRate')], 
+                   is_static=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::Time ns3::OfdmPhy::GetHeaderDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetHeaderDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::WifiMode ns3::OfdmPhy::GetHeaderMode(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): uint32_t ns3::OfdmPhy::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(int arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('int', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): uint8_t ns3::OfdmPhy::GetNumberServiceBits() const [member function]
+    cls.add_method('GetNumberServiceBits', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::Time ns3::OfdmPhy::GetPreambleDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetPreambleDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::Time ns3::OfdmPhy::GetSignalExtension(ns3::WifiPhyBand band) const [member function]
+    cls.add_method('GetSignalExtension', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPhyBand', 'band')], 
+                   is_const=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::OfdmPhy::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): bool ns3::OfdmPhy::IsAllConfigSupported(ns3::WifiPpduField field, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsAllConfigSupported', 
+                   'bool', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ofdm-phy.h (module 'wifi'): bool ns3::OfdmPhy::IsChannelWidthSupported(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsChannelWidthSupported', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     return
 
-def register_Ns3CallbackImpl__Void_Ns3DataRate_Ns3DataRate_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+def register_Ns3ProbabilisticV2vHighwayChannelConditionModel_methods(root_module, cls):
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ProbabilisticV2vHighwayChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::DataRate, ns3::DataRate, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::DataRate arg0, ns3::DataRate arg1, ns3::Mac48Address arg2) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::DataRate', 'arg0'), param('ns3::DataRate', 'arg1'), param('ns3::Mac48Address', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vHighwayChannelConditionModel::ProbabilisticV2vHighwayChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vHighwayChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vHighwayChannelConditionModel::ComputePnlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePnlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3CallbackImpl__Void_Ns3HePreambleParameters_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+def register_Ns3ProbabilisticV2vUrbanChannelConditionModel_methods(root_module, cls):
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ProbabilisticV2vUrbanChannelConditionModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::HePreambleParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::HePreambleParameters arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::HePreambleParameters', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vUrbanChannelConditionModel::ProbabilisticV2vUrbanChannelConditionModel() [constructor]
+    cls.add_constructor([])
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vUrbanChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vUrbanChannelConditionModel::ComputePnlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
+    cls.add_method('ComputePnlos', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+def register_Ns3QueueDiscItem_methods(root_module, cls):
+    ## queue-item.h (module 'network'): ns3::QueueDiscItem::QueueDiscItem(ns3::Ptr<ns3::Packet> p, ns3::Address const & addr, uint16_t protocol) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Address const &', 'addr'), param('uint16_t', 'protocol')])
+    ## queue-item.h (module 'network'): ns3::Address ns3::QueueDiscItem::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
                    [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## queue-item.h (module 'network'): uint16_t ns3::QueueDiscItem::GetProtocol() const [member function]
+    cls.add_method('GetProtocol', 
+                   'uint16_t', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Mac48Address arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Mac48Address', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Ptr__lt__const_ns3MobilityModel__gt___Double_Double_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::MobilityModel const >, ns3::Ptr< ns3::MobilityModel const >, double, double, double, double, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## queue-item.h (module 'network'): uint8_t ns3::QueueDiscItem::GetTxQueueIndex() const [member function]
+    cls.add_method('GetTxQueueIndex', 
+                   'uint8_t', 
                    [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+                   is_const=True)
+    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::SetTxQueueIndex(uint8_t txq) [member function]
+    cls.add_method('SetTxQueueIndex', 
+                   'void', 
+                   [param('uint8_t', 'txq')])
+    ## queue-item.h (module 'network'): ns3::Time ns3::QueueDiscItem::GetTimeStamp() const [member function]
+    cls.add_method('GetTimeStamp', 
+                   'ns3::Time', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::Ptr<const ns3::MobilityModel>, double, double, double, double, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::MobilityModel> arg0, ns3::Ptr<const ns3::MobilityModel> arg1, double arg2, double arg3, double arg4, double arg5) [member operator]
-    cls.add_method('operator()', 
+                   is_const=True)
+    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::SetTimeStamp(ns3::Time t) [member function]
+    cls.add_method('SetTimeStamp', 
+                   'void', 
+                   [param('ns3::Time', 't')])
+    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::AddHeader() [member function]
+    cls.add_method('AddHeader', 
                    'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'arg0'), param('ns3::Ptr< ns3::MobilityModel const >', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4'), param('double', 'arg5')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3MobilityModel__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::MobilityModel const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
                    [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## queue-item.h (module 'network'): bool ns3::QueueDiscItem::Mark() [member function]
+    cls.add_method('Mark', 
+                   'bool', 
                    [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## queue-item.h (module 'network'): uint32_t ns3::QueueDiscItem::Hash(uint32_t perturbation=0) const [member function]
+    cls.add_method('Hash', 
+                   'uint32_t', 
+                   [param('uint32_t', 'perturbation', default_value='0')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::MobilityModel>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::MobilityModel> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Double_Ns3WifiMode_Ns3WifiPreamble_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3VhtFrameExchangeManager_methods(root_module, cls):
+    ## vht-frame-exchange-manager.h (module 'wifi'): ns3::VhtFrameExchangeManager::VhtFrameExchangeManager(ns3::VhtFrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::VhtFrameExchangeManager const &', 'arg0')])
+    ## vht-frame-exchange-manager.h (module 'wifi'): ns3::VhtFrameExchangeManager::VhtFrameExchangeManager() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+    ## vht-frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::VhtFrameExchangeManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, double arg1, ns3::WifiMode arg2, ns3::WifiPreamble arg3) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('double', 'arg1'), param('ns3::WifiMode', 'arg2'), param('ns3::WifiPreamble', 'arg3')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+    ## vht-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiPsdu> ns3::VhtFrameExchangeManager::GetWifiPsdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetWifiPsdu', 
+                   'ns3::Ptr< ns3::WifiPsdu >', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
+def register_Ns3ErpOfdmPhy_methods(root_module, cls):
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::ErpOfdmPhy::ErpOfdmPhy(ns3::ErpOfdmPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::ErpOfdmPhy const &', 'arg0')])
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::ErpOfdmPhy::ErpOfdmPhy() [constructor]
+    cls.add_constructor([])
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::ErpOfdmPhy::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
+                   is_virtual=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::ErpOfdmPhy::GetCodeRate(std::string const & name) [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('std::string const &', 'name')], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## erp-ofdm-phy.h (module 'wifi'): static uint16_t ns3::ErpOfdmPhy::GetConstellationSize(std::string const & name) [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint16_t', 
+                   [param('std::string const &', 'name')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetDataRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetDataRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate(uint64_t rate) [member function]
+    cls.add_method('GetErpOfdmRate', 
+                   'ns3::WifiMode', 
+                   [param('uint64_t', 'rate')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate12Mbps() [member function]
+    cls.add_method('GetErpOfdmRate12Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, double arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('double', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Mac48Address_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate18Mbps() [member function]
+    cls.add_method('GetErpOfdmRate18Mbps', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate24Mbps() [member function]
+    cls.add_method('GetErpOfdmRate24Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::Mac48Address arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::Mac48Address', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiMode_Ns3WifiPreamble_Unsigned_char_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate36Mbps() [member function]
+    cls.add_method('GetErpOfdmRate36Mbps', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate48Mbps() [member function]
+    cls.add_method('GetErpOfdmRate48Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiMode, ns3::WifiPreamble, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::WifiMode arg1, ns3::WifiPreamble arg2, unsigned char arg3) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::WifiMode', 'arg1'), param('ns3::WifiPreamble', 'arg2'), param('unsigned char', 'arg3')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3WifiPhyRxfailureReason_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate54Mbps() [member function]
+    cls.add_method('GetErpOfdmRate54Mbps', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate6Mbps() [member function]
+    cls.add_method('GetErpOfdmRate6Mbps', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::WifiPhyRxfailureReason, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::WifiPhyRxfailureReason arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('ns3::WifiPhyRxfailureReason', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static ns3::WifiMode ns3::ErpOfdmPhy::GetErpOfdmRate9Mbps() [member function]
+    cls.add_method('GetErpOfdmRate9Mbps', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## erp-ofdm-phy.h (module 'wifi'): uint32_t ns3::ErpOfdmPhy::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0) [member operator]
-    cls.add_method('operator()', 
+    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetPhyRate(std::string const & name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('std::string const &', 'name'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static uint64_t ns3::ErpOfdmPhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetPhyRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static void ns3::ErpOfdmPhy::InitializeModes() [member function]
+    cls.add_method('InitializeModes', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+                   [], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): static bool ns3::ErpOfdmPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsModeAllowed', 
+                   'bool', 
+                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::Time ns3::ErpOfdmPhy::GetHeaderDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetHeaderDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::WifiMode ns3::ErpOfdmPhy::GetHeaderMode(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## erp-ofdm-phy.h (module 'wifi'): ns3::Time ns3::ErpOfdmPhy::GetPreambleDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetPreambleDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___StdMap__lt__stdPair__lt__unsigned_int__unsigned_int__gt____double__stdLess__lt__stdPair__lt__unsigned_int__unsigned_int__gt_____gt____stdAllocator__lt__stdPair__lt__const_stdPair__lt__unsigned_int__unsigned_int__gt____double__gt_____gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
+def register_Ns3HeFrameExchangeManager_methods(root_module, cls):
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::HeFrameExchangeManager::HeFrameExchangeManager(ns3::HeFrameExchangeManager const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HeFrameExchangeManager const &', 'arg0')])
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::HeFrameExchangeManager::HeFrameExchangeManager() [constructor]
     cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, std::map< std::pair< unsigned int, unsigned int >, double >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::CalculateAcknowledgmentTime(ns3::WifiAcknowledgment * acknowledgment) const [member function]
+    cls.add_method('CalculateAcknowledgmentTime', 
+                   'void', 
+                   [param('ns3::WifiAcknowledgment *', 'acknowledgment')], 
+                   is_const=True, is_virtual=True)
+    ## he-frame-exchange-manager.h (module 'wifi'): static ns3::Ptr<ns3::WifiPsdu> ns3::HeFrameExchangeManager::GetPsduTo(ns3::Mac48Address to, ns3::WifiPsduMap const & psduMap) [member function]
+    cls.add_method('GetPsduTo', 
+                   'ns3::Ptr< ns3::WifiPsdu >', 
+                   [param('ns3::Mac48Address', 'to'), param('ns3::WifiPsduMap const &', 'psduMap')], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## he-frame-exchange-manager.h (module 'wifi'): uint16_t ns3::HeFrameExchangeManager::GetSupportedBaBufferSize() const [member function]
+    cls.add_method('GetSupportedBaBufferSize', 
+                   'uint16_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, std::map<std::pair<unsigned int, unsigned int>, double, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<const std::pair<unsigned int, unsigned int>, double> > > arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    cls.add_copy_constructor()
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Ns3SignalNoiseDbm_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+    ## he-frame-exchange-manager.h (module 'wifi'): static ns3::TypeId ns3::HeFrameExchangeManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SetMultiUserScheduler(ns3::Ptr<ns3::MultiUserScheduler> const muScheduler) [member function]
+    cls.add_method('SetMultiUserScheduler', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MultiUserScheduler > const', 'muScheduler')])
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SetTargetRssi(ns3::CtrlTriggerHeader & trigger) const [member function]
+    cls.add_method('SetTargetRssi', 
+                   'void', 
+                   [param('ns3::CtrlTriggerHeader &', 'trigger')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, ns3::SignalNoiseDbm, unsigned short, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, short unsigned int arg1, ns3::WifiTxVector arg2, ns3::MpduInfo arg3, ns3::SignalNoiseDbm arg4, short unsigned int arg5) [member operator]
-    cls.add_method('operator()', 
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
+                   is_virtual=True)
+    ## he-frame-exchange-manager.h (module 'wifi'): bool ns3::HeFrameExchangeManager::StartFrameExchange(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('StartFrameExchange', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
+                   is_virtual=True)
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::BlockAckAfterTbPpduTimeout(ns3::Ptr<ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('BlockAckAfterTbPpduTimeout', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::BlockAcksInTbPpduTimeout(ns3::WifiPsduMap * psduMap, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * staMissedBlockAckFrom, std::size_t nSolicitedStations) [member function]
+    cls.add_method('BlockAcksInTbPpduTimeout', 
+                   'void', 
+                   [param('ns3::WifiPsduMap *', 'psduMap'), param('std::set< ns3::Mac48Address > const *', 'staMissedBlockAckFrom'), param('std::size_t', 'nSolicitedStations')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::EndReceiveAmpdu(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxSignalInfo const & rxSignalInfo, ns3::WifiTxVector const & txVector, std::vector<bool, std::allocator<bool> > const & perMpduStatus) [member function]
+    cls.add_method('EndReceiveAmpdu', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxSignalInfo const &', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('std::vector< bool > const &', 'perMpduStatus')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::ForwardPsduMapDown(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector & txVector) [member function]
+    cls.add_method('ForwardPsduMapDown', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector &', 'txVector')], 
+                   visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::WifiTxVector ns3::HeFrameExchangeManager::GetHeTbTxVector(ns3::CtrlTriggerHeader trigger, ns3::Mac48Address triggerSender) const [member function]
+    cls.add_method('GetHeTbTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::CtrlTriggerHeader', 'trigger'), param('ns3::Mac48Address', 'triggerSender')], 
+                   is_const=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::Time ns3::HeFrameExchangeManager::GetTxDuration(uint32_t ppduPayloadSize, ns3::Mac48Address receiver, ns3::WifiTxParameters const & txParams) const [member function]
+    cls.add_method('GetTxDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'ppduPayloadSize'), param('ns3::Mac48Address', 'receiver'), param('ns3::WifiTxParameters const &', 'txParams')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueueItem> ns3::HeFrameExchangeManager::PrepareMuBar(ns3::WifiTxVector const & responseTxVector, std::map<unsigned short, ns3::CtrlBAckRequestHeader, std::less<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::CtrlBAckRequestHeader> > > recipients) const [member function]
+    cls.add_method('PrepareMuBar', 
+                   'ns3::Ptr< ns3::WifiMacQueueItem >', 
+                   [param('ns3::WifiTxVector const &', 'responseTxVector'), param('std::map< unsigned short, ns3::CtrlBAckRequestHeader >', 'recipients')], 
+                   is_const=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::ReceiveMpdu(ns3::Ptr<ns3::WifiMacQueueItem> mpdu, ns3::RxSignalInfo rxSignalInfo, ns3::WifiTxVector const & txVector, bool inAmpdu) [member function]
+    cls.add_method('ReceiveMpdu', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('short unsigned int', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('ns3::MpduInfo', 'arg3'), param('ns3::SignalNoiseDbm', 'arg4'), param('short unsigned int', 'arg5')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::RxSignalInfo', 'rxSignalInfo'), param('ns3::WifiTxVector const &', 'txVector'), param('bool', 'inAmpdu')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): bool ns3::HeFrameExchangeManager::SendMpduFromBaManager(ns3::Ptr<ns3::QosTxop> edca, ns3::Time availableTime, bool initialFrame) [member function]
+    cls.add_method('SendMpduFromBaManager', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::QosTxop >', 'edca'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame')], 
+                   is_virtual=True, visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SendMultiStaBlockAck(ns3::WifiTxParameters const & txParams) [member function]
+    cls.add_method('SendMultiStaBlockAck', 
+                   'void', 
+                   [param('ns3::WifiTxParameters const &', 'txParams')], 
+                   visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SendPsduMapWithProtection(ns3::WifiPsduMap psduMap, ns3::WifiTxParameters & txParams) [member function]
+    cls.add_method('SendPsduMapWithProtection', 
+                   'void', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu > >', 'psduMap'), param('ns3::WifiTxParameters &', 'txParams')], 
+                   visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::SendQosNullFramesInTbPpdu(ns3::CtrlTriggerHeader const & trigger, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('SendQosNullFramesInTbPpdu', 
+                   'void', 
+                   [param('ns3::CtrlTriggerHeader const &', 'trigger'), param('ns3::WifiMacHeader const &', 'hdr')], 
+                   visibility='protected')
+    ## he-frame-exchange-manager.h (module 'wifi'): void ns3::HeFrameExchangeManager::TbPpduTimeout(ns3::WifiPsduMap * psduMap, std::set<ns3::Mac48Address, std::less<ns3::Mac48Address>, std::allocator<ns3::Mac48Address> > const * staMissedTbPpduFrom, std::size_t nSolicitedStations) [member function]
+    cls.add_method('TbPpduTimeout', 
+                   'void', 
+                   [param('ns3::WifiPsduMap *', 'psduMap'), param('std::set< ns3::Mac48Address > const *', 'staMissedTbPpduFrom'), param('std::size_t', 'nSolicitedStations')], 
+                   is_virtual=True, visibility='protected')
     return
 
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Ns3WifiTxVector_Ns3MpduInfo_Unsigned_short_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+def register_Ns3HtPhy_methods(root_module, cls):
+    ## ht-phy.h (module 'wifi'): ns3::HtPhy::HtPhy(ns3::HtPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HtPhy const &', 'arg0')])
+    ## ht-phy.h (module 'wifi'): ns3::HtPhy::HtPhy(uint8_t maxNss=1, bool buildModeList=true) [constructor]
+    cls.add_constructor([param('uint8_t', 'maxNss', default_value='1'), param('bool', 'buildModeList', default_value='true')])
+    ## ht-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::HtPhy::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
+                   is_virtual=True)
+    ## ht-phy.h (module 'wifi'): uint8_t ns3::HtPhy::GetBssMembershipSelector() const [member function]
+    cls.add_method('GetBssMembershipSelector', 
+                   'uint8_t', 
                    [], 
+                   is_const=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::HtPhy::GetCodeRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('uint8_t', 'mcsValue')], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
+    ## ht-phy.h (module 'wifi'): static uint16_t ns3::HtPhy::GetConstellationSize(uint8_t mcsValue) [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint16_t', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::GetDataRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetDataRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): ns3::Time ns3::HtPhy::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::Packet>, unsigned short, ns3::WifiTxVector, ns3::MpduInfo, unsigned short, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, short unsigned int arg1, ns3::WifiTxVector arg2, ns3::MpduInfo arg3, short unsigned int arg4) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'arg0'), param('short unsigned int', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('ns3::MpduInfo', 'arg3'), param('short unsigned int', 'arg4')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3QueueDiscItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::QueueDiscItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::HtPhy::GetHtCodeRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetHtCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static uint16_t ns3::HtPhy::GetHtConstellationSize(uint8_t mcsValue) [member function]
+    cls.add_method('GetHtConstellationSize', 
+                   'uint16_t', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs(uint8_t index) [member function]
+    cls.add_method('GetHtMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs0() [member function]
+    cls.add_method('GetHtMcs0', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs1() [member function]
+    cls.add_method('GetHtMcs1', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::QueueDiscItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::QueueDiscItem> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::QueueDiscItem const >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3SpectrumPhy__gt___Ns3Ptr__lt__const_ns3SpectrumPhy__gt___Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::SpectrumPhy const >, ns3::Ptr< ns3::SpectrumPhy const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs10() [member function]
+    cls.add_method('GetHtMcs10', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs11() [member function]
+    cls.add_method('GetHtMcs11', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::SpectrumPhy>, ns3::Ptr<const ns3::SpectrumPhy>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::SpectrumPhy> arg0, ns3::Ptr<const ns3::SpectrumPhy> arg1, double arg2) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumPhy const >', 'arg0'), param('ns3::Ptr< ns3::SpectrumPhy const >', 'arg1'), param('double', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__const_ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiMacQueueItem const >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs12() [member function]
+    cls.add_method('GetHtMcs12', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs13() [member function]
+    cls.add_method('GetHtMcs13', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<const ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::WifiMacQueueItem> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Ptr__lt__const_ns3Packet__gt___Unsigned_short_Const_ns3Address___amp___Const_ns3Address___amp___Ns3NetDevicePacketType_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs14() [member function]
+    cls.add_method('GetHtMcs14', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs15() [member function]
+    cls.add_method('GetHtMcs15', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<const ns3::Packet>, unsigned short, const ns3::Address &, const ns3::Address &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::NetDevice> arg0, ns3::Ptr<const ns3::Packet> arg1, short unsigned int arg2, ns3::Address const & arg3, ns3::Address const & arg4, ns3::NetDevice::PacketType arg5) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'arg0'), param('ns3::Ptr< ns3::Packet const >', 'arg1'), param('short unsigned int', 'arg2'), param('ns3::Address const &', 'arg3'), param('ns3::Address const &', 'arg4'), param('ns3::NetDevice::PacketType', 'arg5')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3NetDevice__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs16() [member function]
+    cls.add_method('GetHtMcs16', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs17() [member function]
+    cls.add_method('GetHtMcs17', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::NetDevice>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::NetDevice> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3SpectrumSignalParameters__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::SpectrumSignalParameters >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs18() [member function]
+    cls.add_method('GetHtMcs18', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs19() [member function]
+    cls.add_method('GetHtMcs19', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::SpectrumSignalParameters>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::SpectrumSignalParameters> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiMacQueueItem__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiMacQueueItem >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs2() [member function]
+    cls.add_method('GetHtMcs2', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs20() [member function]
+    cls.add_method('GetHtMcs20', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiMacQueueItem>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiMacQueueItem> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Double_Ns3WifiTxVector_StdVector__lt__bool__stdAllocator__lt__bool__gt_____gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, double, ns3::WifiTxVector, std::vector< bool >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs21() [member function]
+    cls.add_method('GetHtMcs21', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs22() [member function]
+    cls.add_method('GetHtMcs22', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, double, ns3::WifiTxVector, std::vector<bool, std::allocator<bool> >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0, double arg1, ns3::WifiTxVector arg2, std::vector<bool, std::allocator<bool> > arg3) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0'), param('double', 'arg1'), param('ns3::WifiTxVector', 'arg2'), param('std::vector< bool >', 'arg3')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    cls.add_copy_constructor()
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Ptr__lt__ns3WifiPsdu__gt___Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ptr< ns3::WifiPsdu >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs23() [member function]
+    cls.add_method('GetHtMcs23', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs24() [member function]
+    cls.add_method('GetHtMcs24', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Ptr<ns3::WifiPsdu>, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::WifiPsdu> arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiPsdu >', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Mac48Address_Unsigned_char_Ns3OriginatorBlockAckAgreementState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs25() [member function]
+    cls.add_method('GetHtMcs25', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs26() [member function]
+    cls.add_method('GetHtMcs26', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Mac48Address, unsigned char, ns3::OriginatorBlockAckAgreement::State, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Mac48Address arg1, unsigned char arg2, ns3::OriginatorBlockAckAgreement::State arg3) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Time', 'arg0'), param('ns3::Mac48Address', 'arg1'), param('unsigned char', 'arg2'), param('ns3::OriginatorBlockAckAgreement::State', 'arg3')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_WifiPhyState_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs27() [member function]
+    cls.add_method('GetHtMcs27', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs28() [member function]
+    cls.add_method('GetHtMcs28', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Time, WifiPhyState, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Time arg1, WifiPhyState arg2) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Time', 'arg0'), param('ns3::Time', 'arg1'), param('WifiPhyState', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs29() [member function]
+    cls.add_method('GetHtMcs29', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs3() [member function]
+    cls.add_method('GetHtMcs3', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0, ns3::Time arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Time', 'arg0'), param('ns3::Time', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs30() [member function]
+    cls.add_method('GetHtMcs30', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs31() [member function]
+    cls.add_method('GetHtMcs31', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Time arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::Time', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3WifiTxVector_Ns3Time_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs4() [member function]
+    cls.add_method('GetHtMcs4', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs5() [member function]
+    cls.add_method('GetHtMcs5', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::WifiTxVector, ns3::Time, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::WifiTxVector arg0, ns3::Time arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('ns3::WifiTxVector', 'arg0'), param('ns3::Time', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs6() [member function]
+    cls.add_method('GetHtMcs6', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs7() [member function]
+    cls.add_method('GetHtMcs7', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()() [member operator]
-    cls.add_method('operator()', 
-                   'void', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs8() [member function]
+    cls.add_method('GetHtMcs8', 
+                   'ns3::WifiMode', 
                    [], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_StdUnordered_map__lt__unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt____stdHash__lt__unsigned_short__gt____stdEqual_to__lt__unsigned_short__gt____stdAllocator__lt__stdPair__lt__const_unsigned_short__ns3Ptr__lt__const_ns3WifiPsdu__gt_____gt_____gt_____gt___Ns3WifiTxVector_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetHtMcs9() [member function]
+    cls.add_method('GetHtMcs9', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): ns3::Time ns3::HtPhy::GetHtSigDuration() const [member function]
+    cls.add_method('GetHtSigDuration', 
+                   'ns3::Time', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > >, ns3::WifiTxVector, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(std::unordered_map<unsigned short, ns3::Ptr<const ns3::WifiPsdu>, std::hash<unsigned short>, std::equal_to<unsigned short>, std::allocator<std::pair<const unsigned short, ns3::Ptr<const ns3::WifiPsdu> > > > arg0, ns3::WifiTxVector arg1, double arg2) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'arg0'), param('ns3::WifiTxVector', 'arg1'), param('double', 'arg2')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    cls.add_copy_constructor()
-    return
-
-def register_Ns3CallbackImpl__Void_Unsigned_char_Double_Bool_Double_Double_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
-                   is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): ns3::WifiMode ns3::HtPhy::GetHtSigMode() const [member function]
+    cls.add_method('GetHtSigMode', 
+                   'ns3::WifiMode', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned char, double, bool, double, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned char arg0, double arg1, bool arg2, double arg3, double arg4) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('unsigned char', 'arg0'), param('double', 'arg1'), param('bool', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): ns3::Time ns3::HtPhy::GetLSigDuration(ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetLSigDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True, is_virtual=True)
+    ## ht-phy.h (module 'wifi'): static ns3::WifiMode ns3::HtPhy::GetLSigMode() [member function]
+    cls.add_method('GetLSigMode', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): uint8_t ns3::HtPhy::GetMaxSupportedMcsIndexPerSs() const [member function]
+    cls.add_method('GetMaxSupportedMcsIndexPerSs', 
+                   'uint8_t', 
                    [], 
+                   is_const=True)
+    ## ht-phy.h (module 'wifi'): ns3::WifiMode ns3::HtPhy::GetMcs(uint8_t index) const [member function]
+    cls.add_method('GetMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned int arg0) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('unsigned int', 'arg0')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Unsigned_int_Unsigned_int_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
-                   [], 
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::GetNonHtReferenceRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetNonHtReferenceRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue')], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
+    ## ht-phy.h (module 'wifi'): ns3::Time ns3::HtPhy::GetPayloadDuration(uint32_t size, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band, ns3::MpduType mpdutype, bool incFlag, uint32_t & totalAmpduSize, double & totalAmpduNumSymbols, uint16_t staId) const [member function]
+    cls.add_method('GetPayloadDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band'), param('ns3::MpduType', 'mpdutype'), param('bool', 'incFlag'), param('uint32_t &', 'totalAmpduSize'), param('double &', 'totalAmpduNumSymbols'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True)
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::GetPhyRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetPhyRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## ht-phy.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::HtPhy::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-phy.h (module 'wifi'): ns3::WifiMode ns3::HtPhy::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## ht-phy.h (module 'wifi'): ns3::Time ns3::HtPhy::GetTrainingDuration(ns3::WifiTxVector const & txVector, uint8_t nDataLtf, uint8_t nExtensionLtf=0) const [member function]
+    cls.add_method('GetTrainingDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint8_t', 'nDataLtf'), param('uint8_t', 'nExtensionLtf', default_value='0')], 
+                   is_const=True, is_virtual=True)
+    ## ht-phy.h (module 'wifi'): bool ns3::HtPhy::HandlesMcsModes() const [member function]
+    cls.add_method('HandlesMcsModes', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned int, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(unsigned int arg0, unsigned int arg1) [member operator]
-    cls.add_method('operator()', 
+    ## ht-phy.h (module 'wifi'): static void ns3::HtPhy::InitializeModes() [member function]
+    cls.add_method('InitializeModes', 
                    'void', 
-                   [param('unsigned int', 'arg0'), param('unsigned int', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3CallbackImpl__Void_Unsigned_long_Unsigned_long_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_Ns3Empty_methods(root_module, cls):
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl() [constructor]
-    cls.add_constructor([])
-    ## callback.h (module 'core'): ns3::CallbackImpl<void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::CallbackImpl(ns3::CallbackImpl<void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::CallbackImpl< void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
-    ## callback.h (module 'core'): static std::string ns3::CallbackImpl<void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::DoGetTypeid() [member function]
-    cls.add_method('DoGetTypeid', 
-                   'std::string', 
                    [], 
                    is_static=True)
-    ## callback.h (module 'core'): std::string ns3::CallbackImpl<void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::GetTypeid() const [member function]
-    cls.add_method('GetTypeid', 
-                   'std::string', 
-                   [], 
+    ## ht-phy.h (module 'wifi'): bool ns3::HtPhy::IsMcsSupported(uint8_t index) const [member function]
+    cls.add_method('IsMcsSupported', 
+                   'bool', 
+                   [param('uint8_t', 'index')], 
                    is_const=True, is_virtual=True)
-    ## callback.h (module 'core'): void ns3::CallbackImpl<void, unsigned long, unsigned long, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(long unsigned int arg0, long unsigned int arg1) [member operator]
-    cls.add_method('operator()', 
-                   'void', 
-                   [param('long unsigned int', 'arg0'), param('long unsigned int', 'arg1')], 
-                   custom_name='__call__', is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3InfrastructureWifiMac_methods(root_module, cls):
-    ## infrastructure-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::InfrastructureWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
+    ## ht-phy.h (module 'wifi'): static bool ns3::HtPhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsModeAllowed', 
+                   'bool', 
+                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
                    is_static=True)
-    ## infrastructure-wifi-mac.h (module 'wifi'): ns3::InfrastructureWifiMac::InfrastructureWifiMac() [constructor]
-    cls.add_constructor([])
-    ## infrastructure-wifi-mac.h (module 'wifi'): void ns3::InfrastructureWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## infrastructure-wifi-mac.h (module 'wifi'): void ns3::InfrastructureWifiMac::SetQosSupported(bool enable) [member function]
-    cls.add_method('SetQosSupported', 
+    ## ht-phy.h (module 'wifi'): void ns3::HtPhy::SetMaxSupportedMcsIndexPerSs(uint8_t maxIndex) [member function]
+    cls.add_method('SetMaxSupportedMcsIndexPerSs', 
                    'void', 
-                   [param('bool', 'enable')], 
-                   is_virtual=True)
-    ## infrastructure-wifi-mac.h (module 'wifi'): void ns3::InfrastructureWifiMac::SetPcfSupported(bool enable) [member function]
-    cls.add_method('SetPcfSupported', 
+                   [param('uint8_t', 'maxIndex')])
+    ## ht-phy.h (module 'wifi'): void ns3::HtPhy::SetMaxSupportedNss(uint8_t maxNss) [member function]
+    cls.add_method('SetMaxSupportedNss', 
+                   'void', 
+                   [param('uint8_t', 'maxNss')])
+    ## ht-phy.h (module 'wifi'): void ns3::HtPhy::BuildModeList() [member function]
+    cls.add_method('BuildModeList', 
                    'void', 
-                   [param('bool', 'enable')])
-    ## infrastructure-wifi-mac.h (module 'wifi'): bool ns3::InfrastructureWifiMac::GetPcfSupported() const [member function]
-    cls.add_method('GetPcfSupported', 
-                   'bool', 
                    [], 
-                   is_const=True)
+                   is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::CalculateDataRate(double symbolDuration, uint16_t guardInterval, uint16_t usableSubCarriers, uint16_t numberOfBitsPerSubcarrier, double codingRate, uint8_t nss) [member function]
+    cls.add_method('CalculateDataRate', 
+                   'uint64_t', 
+                   [param('double', 'symbolDuration'), param('uint16_t', 'guardInterval'), param('uint16_t', 'usableSubCarriers'), param('uint16_t', 'numberOfBitsPerSubcarrier'), param('double', 'codingRate'), param('uint8_t', 'nss')], 
+                   is_static=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::CalculateNonHtReferenceRate(ns3::WifiCodeRate codeRate, uint16_t constellationSize) [member function]
+    cls.add_method('CalculateNonHtReferenceRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'codeRate'), param('uint16_t', 'constellationSize')], 
+                   is_static=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): static uint64_t ns3::HtPhy::CalculatePhyRate(ns3::WifiCodeRate codeRate, uint64_t dataRate) [member function]
+    cls.add_method('CalculatePhyRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'codeRate'), param('uint64_t', 'dataRate')], 
+                   is_static=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::HtPhy::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): static double ns3::HtPhy::GetCodeRatio(ns3::WifiCodeRate codeRate) [member function]
+    cls.add_method('GetCodeRatio', 
+                   'double', 
+                   [param('uint16_t', 'codeRate')], 
+                   is_static=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): uint32_t ns3::HtPhy::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): uint8_t ns3::HtPhy::GetNumberBccEncoders(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetNumberBccEncoders', 
+                   'uint8_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): ns3::Time ns3::HtPhy::GetSymbolDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSymbolDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::HtPhy::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): static uint16_t ns3::HtPhy::GetUsableSubcarriers(uint16_t channelWidth) [member function]
+    cls.add_method('GetUsableSubcarriers', 
+                   'uint16_t', 
+                   [param('uint16_t', 'channelWidth')], 
+                   is_static=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): bool ns3::HtPhy::IsAllConfigSupported(ns3::WifiPpduField field, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsAllConfigSupported', 
+                   'bool', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## ht-phy.h (module 'wifi'): bool ns3::HtPhy::IsConfigSupported(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsConfigSupported', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
     return
 
-def register_Ns3ProbabilisticV2vHighwayChannelConditionModel_methods(root_module, cls):
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ProbabilisticV2vHighwayChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+def register_Ns3VhtPhy_methods(root_module, cls):
+    ## vht-phy.h (module 'wifi'): ns3::VhtPhy::VhtPhy(ns3::VhtPhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::VhtPhy const &', 'arg0')])
+    ## vht-phy.h (module 'wifi'): ns3::VhtPhy::VhtPhy(bool buildModeList=true) [constructor]
+    cls.add_constructor([param('bool', 'buildModeList', default_value='true')])
+    ## vht-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::VhtPhy::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
+                   is_virtual=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::VhtPhy::GetCodeRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static uint16_t ns3::VhtPhy::GetConstellationSize(uint8_t mcsValue) [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint16_t', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static uint64_t ns3::VhtPhy::GetDataRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static uint64_t ns3::VhtPhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetDataRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): ns3::Time ns3::VhtPhy::GetDuration(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::Time ns3::VhtPhy::GetLSigDuration(ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetLSigDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): static uint64_t ns3::VhtPhy::GetNonHtReferenceRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetNonHtReferenceRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static uint64_t ns3::VhtPhy::GetPhyRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static uint64_t ns3::VhtPhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId) [member function]
+    cls.add_method('GetPhyRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::VhtPhy::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::Time ns3::VhtPhy::GetSigADuration(ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetSigADuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::WifiMode ns3::VhtPhy::GetSigAMode() const [member function]
+    cls.add_method('GetSigAMode', 
+                   'ns3::WifiMode', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::Time ns3::VhtPhy::GetSigBDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigBDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::WifiMode ns3::VhtPhy::GetSigBMode(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigBMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::WifiMode ns3::VhtPhy::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): ns3::Time ns3::VhtPhy::GetTrainingDuration(ns3::WifiTxVector const & txVector, uint8_t nDataLtf, uint8_t nExtensionLtf=0) const [member function]
+    cls.add_method('GetTrainingDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint8_t', 'nDataLtf'), param('uint8_t', 'nExtensionLtf', default_value='0')], 
+                   is_const=True, is_virtual=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs(uint8_t index) [member function]
+    cls.add_method('GetVhtMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
                    is_static=True)
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vHighwayChannelConditionModel::ProbabilisticV2vHighwayChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vHighwayChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vHighwayChannelConditionModel::ComputePnlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePnlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3ProbabilisticV2vUrbanChannelConditionModel_methods(root_module, cls):
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): static ns3::TypeId ns3::ProbabilisticV2vUrbanChannelConditionModel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs0() [member function]
+    cls.add_method('GetVhtMcs0', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): ns3::ProbabilisticV2vUrbanChannelConditionModel::ProbabilisticV2vUrbanChannelConditionModel() [constructor]
-    cls.add_constructor([])
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vUrbanChannelConditionModel::ComputePlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    ## probabilistic-v2v-channel-condition-model.h (module 'propagation'): double ns3::ProbabilisticV2vUrbanChannelConditionModel::ComputePnlos(ns3::Ptr<const ns3::MobilityModel> a, ns3::Ptr<const ns3::MobilityModel> b) const [member function]
-    cls.add_method('ComputePnlos', 
-                   'double', 
-                   [param('ns3::Ptr< ns3::MobilityModel const >', 'a'), param('ns3::Ptr< ns3::MobilityModel const >', 'b')], 
-                   is_const=True, is_virtual=True, visibility='private')
-    return
-
-def register_Ns3QueueDiscItem_methods(root_module, cls):
-    ## queue-item.h (module 'network'): ns3::QueueDiscItem::QueueDiscItem(ns3::Ptr<ns3::Packet> p, ns3::Address const & addr, uint16_t protocol) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Address const &', 'addr'), param('uint16_t', 'protocol')])
-    ## queue-item.h (module 'network'): ns3::Address ns3::QueueDiscItem::GetAddress() const [member function]
-    cls.add_method('GetAddress', 
-                   'ns3::Address', 
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs1() [member function]
+    cls.add_method('GetVhtMcs1', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## queue-item.h (module 'network'): uint16_t ns3::QueueDiscItem::GetProtocol() const [member function]
-    cls.add_method('GetProtocol', 
-                   'uint16_t', 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs2() [member function]
+    cls.add_method('GetVhtMcs2', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## queue-item.h (module 'network'): uint8_t ns3::QueueDiscItem::GetTxQueueIndex() const [member function]
-    cls.add_method('GetTxQueueIndex', 
-                   'uint8_t', 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs3() [member function]
+    cls.add_method('GetVhtMcs3', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::SetTxQueueIndex(uint8_t txq) [member function]
-    cls.add_method('SetTxQueueIndex', 
-                   'void', 
-                   [param('uint8_t', 'txq')])
-    ## queue-item.h (module 'network'): ns3::Time ns3::QueueDiscItem::GetTimeStamp() const [member function]
-    cls.add_method('GetTimeStamp', 
-                   'ns3::Time', 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs4() [member function]
+    cls.add_method('GetVhtMcs4', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::SetTimeStamp(ns3::Time t) [member function]
-    cls.add_method('SetTimeStamp', 
-                   'void', 
-                   [param('ns3::Time', 't')])
-    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::AddHeader() [member function]
-    cls.add_method('AddHeader', 
-                   'void', 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs5() [member function]
+    cls.add_method('GetVhtMcs5', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue-item.h (module 'network'): void ns3::QueueDiscItem::Print(std::ostream & os) const [member function]
-    cls.add_method('Print', 
-                   'void', 
-                   [param('std::ostream &', 'os')], 
-                   is_const=True, is_virtual=True)
-    ## queue-item.h (module 'network'): bool ns3::QueueDiscItem::Mark() [member function]
-    cls.add_method('Mark', 
-                   'bool', 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs6() [member function]
+    cls.add_method('GetVhtMcs6', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## queue-item.h (module 'network'): uint32_t ns3::QueueDiscItem::Hash(uint32_t perturbation=0) const [member function]
-    cls.add_method('Hash', 
-                   'uint32_t', 
-                   [param('uint32_t', 'perturbation', default_value='0')], 
-                   is_const=True, is_virtual=True)
-    return
-
-def register_Ns3StaWifiMac_methods(root_module, cls):
-    ## sta-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::StaWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs7() [member function]
+    cls.add_method('GetVhtMcs7', 
+                   'ns3::WifiMode', 
                    [], 
                    is_static=True)
-    ## sta-wifi-mac.h (module 'wifi'): ns3::StaWifiMac::StaWifiMac() [constructor]
-    cls.add_constructor([])
-    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
-                   is_virtual=True)
-    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_virtual=True)
-    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> const phy) [member function]
-    cls.add_method('SetWifiPhy', 
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs8() [member function]
+    cls.add_method('GetVhtMcs8', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static ns3::WifiMode ns3::VhtPhy::GetVhtMcs9() [member function]
+    cls.add_method('GetVhtMcs9', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static void ns3::VhtPhy::InitializeModes() [member function]
+    cls.add_method('InitializeModes', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiPhy > const', 'phy')], 
-                   is_virtual=True)
-    ## sta-wifi-mac.h (module 'wifi'): bool ns3::StaWifiMac::IsAssociated() const [member function]
-    cls.add_method('IsAssociated', 
+                   [], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static bool ns3::VhtPhy::IsModeAllowed(uint8_t mcsValue, uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsModeAllowed', 
                    'bool', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## vht-phy.h (module 'wifi'): static uint64_t ns3::VhtPhy::CalculateNonHtReferenceRate(ns3::WifiCodeRate codeRate, uint16_t constellationSize) [member function]
+    cls.add_method('CalculateNonHtReferenceRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'codeRate'), param('uint16_t', 'constellationSize')], 
+                   is_static=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::VhtPhy::DoEndReceiveField(ns3::WifiPpduField field, ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoEndReceiveField', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::VhtPhy::EndReceiveSigA(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceiveSigA', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::VhtPhy::EndReceiveSigB(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('EndReceiveSigB', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::Time ns3::VhtPhy::GetHtSigDuration() const [member function]
+    cls.add_method('GetHtSigDuration', 
+                   'ns3::Time', 
                    [], 
-                   is_const=True)
-    ## sta-wifi-mac.h (module 'wifi'): uint16_t ns3::StaWifiMac::GetAssociationId() const [member function]
-    cls.add_method('GetAssociationId', 
-                   'uint16_t', 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::WifiMode ns3::VhtPhy::GetHtSigMode() const [member function]
+    cls.add_method('GetHtSigMode', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    ## sta-wifi-mac.h (module 'wifi'): void ns3::StaWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): uint32_t ns3::VhtPhy::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): uint8_t ns3::VhtPhy::GetNumberBccEncoders(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetNumberBccEncoders', 
+                   'uint8_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): static uint16_t ns3::VhtPhy::GetUsableSubcarriers(uint16_t channelWidth) [member function]
+    cls.add_method('GetUsableSubcarriers', 
+                   'uint16_t', 
+                   [param('uint16_t', 'channelWidth')], 
+                   is_static=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): bool ns3::VhtPhy::IsAllConfigSupported(ns3::WifiPpduField field, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsAllConfigSupported', 
+                   'bool', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::VhtPhy::ProcessSigA(ns3::Ptr<ns3::Event> event, ns3::PhyEntity::PhyFieldRxStatus status) [member function]
+    cls.add_method('ProcessSigA', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::PhyEntity::PhyFieldRxStatus', 'status')], 
+                   is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::VhtPhy::ProcessSigB(ns3::Ptr<ns3::Event> event, ns3::PhyEntity::PhyFieldRxStatus status) [member function]
+    cls.add_method('ProcessSigB', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::PhyEntity::PhyFieldRxStatus', 'status')], 
+                   is_virtual=True, visibility='protected')
+    ## vht-phy.h (module 'wifi'): void ns3::VhtPhy::BuildModeList() [member function]
+    cls.add_method('BuildModeList', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
     return
 
-def register_Ns3ApWifiMac_methods(root_module, cls):
-    ## ap-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::ApWifiMac::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## ap-wifi-mac.h (module 'wifi'): ns3::ApWifiMac::ApWifiMac() [constructor]
-    cls.add_constructor([])
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const stationManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'stationManager')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
-    cls.add_method('SetLinkUpCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], 
-                   is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Enqueue(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
-    cls.add_method('Enqueue', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+def register_Ns3HePhy_methods(root_module, cls):
+    ## he-phy.h (module 'wifi'): ns3::HePhy::HePhy(ns3::HePhy const & arg0) [constructor]
+    cls.add_constructor([param('ns3::HePhy const &', 'arg0')])
+    ## he-phy.h (module 'wifi'): ns3::HePhy::HePhy(bool buildModeList=true) [constructor]
+    cls.add_constructor([param('bool', 'buildModeList', default_value='true')])
+    ## he-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiPpdu> ns3::HePhy::BuildPpdu(ns3::WifiConstPsduMap const & psdus, ns3::WifiTxVector const & txVector, ns3::Time ppduDuration) [member function]
+    cls.add_method('BuildPpdu', 
+                   'ns3::Ptr< ns3::WifiPpdu >', 
+                   [param('ns3::WifiConstPsduMap const &', 'psdus'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'ppduDuration')], 
                    is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::SupportsSendFrom() const [member function]
-    cls.add_method('SupportsSendFrom', 
-                   'bool', 
-                   [], 
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::CalculateNonOfdmaDurationForHeTb(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('CalculateNonOfdmaDurationForHeTb', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True)
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::CalculateTxDuration(ns3::WifiConstPsduMap psduMap, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) const [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('std::unordered_map< unsigned short, ns3::Ptr< ns3::WifiPsdu const > >', 'psduMap'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
                    is_const=True, is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetAddress(ns3::Mac48Address address) [member function]
-    cls.add_method('SetAddress', 
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::CancelAllEvents() [member function]
+    cls.add_method('CancelAllEvents', 
                    'void', 
-                   [param('ns3::Mac48Address', 'address')], 
+                   [], 
                    is_virtual=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetBeaconInterval(ns3::Time interval) [member function]
-    cls.add_method('SetBeaconInterval', 
-                   'void', 
-                   [param('ns3::Time', 'interval')])
-    ## ap-wifi-mac.h (module 'wifi'): ns3::Time ns3::ApWifiMac::GetBeaconInterval() const [member function]
-    cls.add_method('GetBeaconInterval', 
+    ## he-phy.h (module 'wifi'): static uint16_t ns3::HePhy::ConvertHeTbPpduDurationToLSigLength(ns3::Time ppduDuration, ns3::WifiPhyBand band) [member function]
+    cls.add_method('ConvertHeTbPpduDurationToLSigLength', 
+                   'uint16_t', 
+                   [param('ns3::Time', 'ppduDuration'), param('ns3::WifiPhyBand', 'band')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::Time ns3::HePhy::ConvertLSigLengthToHeTbPpduDuration(uint16_t length, ns3::WifiTxVector const & txVector, ns3::WifiPhyBand band) [member function]
+    cls.add_method('ConvertLSigLengthToHeTbPpduDuration', 
                    'ns3::Time', 
+                   [param('uint16_t', 'length'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::WifiPhyBand', 'band')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): ns3::Ptr<const ns3::WifiPsdu> ns3::HePhy::GetAddressedPsduInPpdu(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetAddressedPsduInPpdu', 
+                   'ns3::Ptr< ns3::WifiPsdu const >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): uint8_t ns3::HePhy::GetBssColor() const [member function]
+    cls.add_method('GetBssColor', 
+                   'uint8_t', 
                    [], 
                    is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::SetCfpMaxDuration(ns3::Time duration) [member function]
-    cls.add_method('SetCfpMaxDuration', 
-                   'void', 
-                   [param('ns3::Time', 'duration')])
-    ## ap-wifi-mac.h (module 'wifi'): ns3::Time ns3::ApWifiMac::GetCfpMaxDuration() const [member function]
-    cls.add_method('GetCfpMaxDuration', 
-                   'ns3::Time', 
-                   [], 
+    ## he-phy.h (module 'wifi'): uint16_t ns3::HePhy::GetCenterFrequencyForNonOfdmaPart(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetCenterFrequencyForNonOfdmaPart', 
+                   'uint16_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
                    is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::GetShortSlotTimeEnabled() const [member function]
-    cls.add_method('GetShortSlotTimeEnabled', 
-                   'bool', 
+    ## he-phy.h (module 'wifi'): static ns3::WifiCodeRate ns3::HePhy::GetCodeRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static uint16_t ns3::HePhy::GetConstellationSize(uint8_t mcsValue) [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint16_t', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): uint64_t ns3::HePhy::GetCurrentHeTbPpduUid() const [member function]
+    cls.add_method('GetCurrentHeTbPpduUid', 
+                   'uint64_t', 
                    [], 
                    is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::GetShortPreambleEnabled() const [member function]
-    cls.add_method('GetShortPreambleEnabled', 
-                   'bool', 
+    ## he-phy.h (module 'wifi'): static uint64_t ns3::HePhy::GetDataRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static uint64_t ns3::HePhy::GetDataRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId=65535) [member function]
+    cls.add_method('GetDataRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs(uint8_t index) [member function]
+    cls.add_method('GetHeMcs', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'index')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs0() [member function]
+    cls.add_method('GetHeMcs0', 
+                   'ns3::WifiMode', 
                    [], 
-                   is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): bool ns3::ApWifiMac::IsNonGfHtStasPresent() const [member function]
-    cls.add_method('IsNonGfHtStasPresent', 
-                   'bool', 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs1() [member function]
+    cls.add_method('GetHeMcs1', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs10() [member function]
+    cls.add_method('GetHeMcs10', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs11() [member function]
+    cls.add_method('GetHeMcs11', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs2() [member function]
+    cls.add_method('GetHeMcs2', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs3() [member function]
+    cls.add_method('GetHeMcs3', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs4() [member function]
+    cls.add_method('GetHeMcs4', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs5() [member function]
+    cls.add_method('GetHeMcs5', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs6() [member function]
+    cls.add_method('GetHeMcs6', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs7() [member function]
+    cls.add_method('GetHeMcs7', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs8() [member function]
+    cls.add_method('GetHeMcs8', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static ns3::WifiMode ns3::HePhy::GetHeMcs9() [member function]
+    cls.add_method('GetHeMcs9', 
+                   'ns3::WifiMode', 
                    [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::GetLSigDuration(ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetLSigDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): uint16_t ns3::HePhy::GetMeasurementChannelWidth(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetMeasurementChannelWidth', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): static uint64_t ns3::HePhy::GetNonHtReferenceRate(uint8_t mcsValue) [member function]
+    cls.add_method('GetNonHtReferenceRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::HePhy::GetNonOfdmaBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetNonOfdmaBand', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
                    is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): uint16_t ns3::ApWifiMac::GetVhtOperationalChannelWidth() const [member function]
-    cls.add_method('GetVhtOperationalChannelWidth', 
+    ## he-phy.h (module 'wifi'): uint16_t ns3::HePhy::GetNonOfdmaWidth(ns3::HeRu::RuSpec ru) const [member function]
+    cls.add_method('GetNonOfdmaWidth', 
                    'uint16_t', 
+                   [param('ns3::HeRu::RuSpec', 'ru')], 
+                   is_const=True)
+    ## he-phy.h (module 'wifi'): static uint64_t ns3::HePhy::GetPhyRate(uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [param('uint8_t', 'mcsValue'), param('uint16_t', 'channelWidth'), param('uint16_t', 'guardInterval'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static uint64_t ns3::HePhy::GetPhyRateFromTxVector(ns3::WifiTxVector const & txVector, uint16_t staId=65535) [member function]
+    cls.add_method('GetPhyRateFromTxVector', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId', default_value='65535')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): ns3::PhyEntity::PpduFormats const & ns3::HePhy::GetPpduFormats() const [member function]
+    cls.add_method('GetPpduFormats', 
+                   'ns3::PhyEntity::PpduFormats const &', 
                    [], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::HePhy::GetRuBandForRx(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetRuBandForRx', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
                    is_const=True)
-    ## ap-wifi-mac.h (module 'wifi'): int64_t ns3::ApWifiMac::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::Receive(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('Receive', 
+    ## he-phy.h (module 'wifi'): ns3::WifiSpectrumBand ns3::HePhy::GetRuBandForTx(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetRuBandForTx', 
+                   'ns3::WifiSpectrumBand', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_const=True)
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::GetSigADuration(ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('GetSigADuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): ns3::WifiMode ns3::HePhy::GetSigAMode() const [member function]
+    cls.add_method('GetSigAMode', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::GetSigBDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigBDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): ns3::WifiMode ns3::HePhy::GetSigBMode(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigBMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): ns3::WifiMode ns3::HePhy::GetSigMode(ns3::WifiPpduField field, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSigMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiPpduField', 'field'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): uint16_t ns3::HePhy::GetStaId(ns3::Ptr<const ns3::WifiPpdu> const ppdu) const [member function]
+    cls.add_method('GetStaId', 
+                   'uint16_t', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const > const', 'ppdu')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::GetTrainingDuration(ns3::WifiTxVector const & txVector, uint8_t nDataLtf, uint8_t nExtensionLtf=0) const [member function]
+    cls.add_method('GetTrainingDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint8_t', 'nDataLtf'), param('uint8_t', 'nExtensionLtf', default_value='0')], 
+                   is_const=True, is_virtual=True)
+    ## he-phy.h (module 'wifi'): static void ns3::HePhy::InitializeModes() [member function]
+    cls.add_method('InitializeModes', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::TxOk(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxOk', 
+                   [], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): static bool ns3::HePhy::IsModeAllowed(uint16_t channelWidth, uint8_t nss) [member function]
+    cls.add_method('IsModeAllowed', 
+                   'bool', 
+                   [param('uint16_t', 'channelWidth'), param('uint8_t', 'nss')], 
+                   is_static=True)
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::NotifyEndOfHeSigA(ns3::HeSigAParameters params) [member function]
+    cls.add_method('NotifyEndOfHeSigA', 
                    'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::TxFailed(ns3::WifiMacHeader const & hdr) [member function]
-    cls.add_method('TxFailed', 
+                   [param('ns3::HeSigAParameters', 'params')])
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::SetEndOfHeSigACallback(ns3::HePhy::EndOfHeSigACallback callback) [member function]
+    cls.add_method('SetEndOfHeSigACallback', 
                    'void', 
-                   [param('ns3::WifiMacHeader const &', 'hdr')], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('DeaggregateAmsduAndForward', 
+                   [param('ns3::Callback< void, ns3::HeSigAParameters, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::StartReceivePreamble(ns3::Ptr<ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW, ns3::Time rxDuration) [member function]
+    cls.add_method('StartReceivePreamble', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoDispose() [member function]
-    cls.add_method('DoDispose', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')], 
+                   is_virtual=True)
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::StartTx(ns3::Ptr<ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('StartTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu')], 
+                   is_virtual=True)
+    ## he-phy.h (module 'wifi'): static uint64_t ns3::HePhy::CalculateNonHtReferenceRate(ns3::WifiCodeRate codeRate, uint16_t constellationSize) [member function]
+    cls.add_method('CalculateNonHtReferenceRate', 
+                   'uint64_t', 
+                   [param('uint16_t', 'codeRate'), param('uint16_t', 'constellationSize')], 
+                   is_static=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::DoAbortCurrentReception(ns3::WifiPhyRxfailureReason reason) [member function]
+    cls.add_method('DoAbortCurrentReception', 
+                   'void', 
+                   [param('ns3::WifiPhyRxfailureReason', 'reason')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::DoEndReceivePayload(ns3::Ptr<const ns3::WifiPpdu> ppdu) [member function]
+    cls.add_method('DoEndReceivePayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): ns3::Ptr<ns3::Event> ns3::HePhy::DoGetEvent(ns3::Ptr<const ns3::WifiPpdu> ppdu, ns3::RxPowerWattPerChannelBand rxPowersW) [member function]
+    cls.add_method('DoGetEvent', 
+                   'ns3::Ptr< ns3::Event >', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::DoResetReceive(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoResetReceive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::DoStartReceivePayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('DoStartReceivePayload', 
                    'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): std::pair<unsigned short, std::pair<unsigned int, unsigned int> > ns3::HePhy::GetChannelWidthAndBand(ns3::WifiTxVector const & txVector, uint16_t staId) const [member function]
+    cls.add_method('GetChannelWidthAndBand', 
+                   'std::pair< unsigned short, std::pair< unsigned int, unsigned int > >', 
+                   [param('ns3::WifiTxVector const &', 'txVector'), param('uint16_t', 'staId')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): uint32_t ns3::HePhy::GetMaxPsduSize() const [member function]
+    cls.add_method('GetMaxPsduSize', 
+                   'uint32_t', 
                    [], 
-                   is_virtual=True, visibility='private')
-    ## ap-wifi-mac.h (module 'wifi'): void ns3::ApWifiMac::DoInitialize() [member function]
-    cls.add_method('DoInitialize', 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): ns3::Ptr<ns3::SpectrumValue> ns3::HePhy::GetTxPowerSpectralDensity(double txPowerW, ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('GetTxPowerSpectralDensity', 
+                   'ns3::Ptr< ns3::SpectrumValue >', 
+                   [param('double', 'txPowerW'), param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): static uint16_t ns3::HePhy::GetUsableSubcarriers(uint16_t channelWidth) [member function]
+    cls.add_method('GetUsableSubcarriers', 
+                   'uint16_t', 
+                   [param('uint16_t', 'channelWidth')], 
+                   is_static=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): ns3::WifiConstPsduMap ns3::HePhy::GetWifiConstPsduMap(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetWifiConstPsduMap', 
+                   'ns3::WifiConstPsduMap', 
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): bool ns3::HePhy::IsConfigSupported(ns3::Ptr<const ns3::WifiPpdu> ppdu) const [member function]
+    cls.add_method('IsConfigSupported', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu')], 
+                   is_const=True, is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): uint64_t ns3::HePhy::ObtainNextUid(ns3::WifiTxVector const & txVector) [member function]
+    cls.add_method('ObtainNextUid', 
+                   'uint64_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::HePhy::ProcessSigA(ns3::Ptr<ns3::Event> event, ns3::PhyEntity::PhyFieldRxStatus status) [member function]
+    cls.add_method('ProcessSigA', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::PhyEntity::PhyFieldRxStatus', 'status')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): ns3::PhyEntity::PhyFieldRxStatus ns3::HePhy::ProcessSigB(ns3::Ptr<ns3::Event> event, ns3::PhyEntity::PhyFieldRxStatus status) [member function]
+    cls.add_method('ProcessSigB', 
+                   'ns3::PhyEntity::PhyFieldRxStatus', 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::PhyEntity::PhyFieldRxStatus', 'status')], 
+                   is_virtual=True, visibility='protected')
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::StartReceiveOfdmaPayload(ns3::Ptr<ns3::Event> event) [member function]
+    cls.add_method('StartReceiveOfdmaPayload', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Event >', 'event')], 
+                   visibility='protected')
+    ## he-phy.h (module 'wifi'): void ns3::HePhy::BuildModeList() [member function]
+    cls.add_method('BuildModeList', 
                    'void', 
                    [], 
                    is_virtual=True, visibility='private')
+    ## he-phy.h (module 'wifi'): uint8_t ns3::HePhy::GetNumberBccEncoders(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetNumberBccEncoders', 
+                   'uint8_t', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## he-phy.h (module 'wifi'): ns3::Time ns3::HePhy::GetSymbolDuration(ns3::WifiTxVector const & txVector) const [member function]
+    cls.add_method('GetSymbolDuration', 
+                   'ns3::Time', 
+                   [param('ns3::WifiTxVector const &', 'txVector')], 
+                   is_const=True, is_virtual=True, visibility='private')
     return
 
 def register_Ns3HashImplementation_methods(root_module, cls):
@@ -23334,10 +27311,10 @@
     module.add_function('GetAckSize', 
                         'uint32_t', 
                         [])
-    ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetBlockAckRequestSize(ns3::BlockAckType type) [free function]
+    ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetBlockAckRequestSize(ns3::BlockAckReqType type) [free function]
     module.add_function('GetBlockAckRequestSize', 
                         'uint32_t', 
-                        [param('ns3::BlockAckType', 'type')])
+                        [param('ns3::BlockAckReqType', 'type')])
     ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetBlockAckSize(ns3::BlockAckType type) [free function]
     module.add_function('GetBlockAckSize', 
                         'uint32_t', 
@@ -23350,14 +27327,30 @@
     module.add_function('GetCtsSize', 
                         'uint32_t', 
                         [])
+    ## wifi-standards.h (module 'wifi'): uint16_t ns3::GetDefaultChannelWidth(ns3::WifiPhyStandard standard, ns3::WifiPhyBand band) [free function]
+    module.add_function('GetDefaultChannelWidth', 
+                        'uint16_t', 
+                        [param('ns3::WifiPhyStandard', 'standard'), param('ns3::WifiPhyBand', 'band')])
+    ## wifi-standards.h (module 'wifi'): ns3::FrequencyChannelType ns3::GetFrequencyChannelType(ns3::WifiPhyStandard standard) [free function]
+    module.add_function('GetFrequencyChannelType', 
+                        'ns3::FrequencyChannelType', 
+                        [param('ns3::WifiPhyStandard', 'standard')])
+    ## wifi-standards.h (module 'wifi'): uint16_t ns3::GetMaximumChannelWidth(ns3::WifiPhyStandard standard) [free function]
+    module.add_function('GetMaximumChannelWidth', 
+                        'uint16_t', 
+                        [param('ns3::WifiPhyStandard', 'standard')])
+    ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetMuBarSize(std::list<ns3::BlockAckReqType, std::allocator<ns3::BlockAckReqType> > types) [free function]
+    module.add_function('GetMuBarSize', 
+                        'uint32_t', 
+                        [param('std::list< ns3::BlockAckReqType >', 'types')])
     ## wifi-utils.h (module 'wifi'): ns3::Time ns3::GetPpduMaxTime(ns3::WifiPreamble preamble) [free function]
     module.add_function('GetPpduMaxTime', 
                         'ns3::Time', 
                         [param('ns3::WifiPreamble', 'preamble')])
-    ## wifi-utils.h (module 'wifi'): ns3::WifiPreamble ns3::GetPreambleForTransmission(ns3::WifiModulationClass modulation, bool useShortPreamble, bool useGreenfield) [free function]
+    ## wifi-utils.h (module 'wifi'): ns3::WifiPreamble ns3::GetPreambleForTransmission(ns3::WifiModulationClass modulation, bool useShortPreamble) [free function]
     module.add_function('GetPreambleForTransmission', 
                         'ns3::WifiPreamble', 
-                        [param('ns3::WifiModulationClass', 'modulation'), param('bool', 'useShortPreamble'), param('bool', 'useGreenfield')])
+                        [param('ns3::WifiModulationClass', 'modulation'), param('bool', 'useShortPreamble')])
     ## wifi-utils.h (module 'wifi'): uint32_t ns3::GetRtsSize() [free function]
     module.add_function('GetRtsSize', 
                         'uint32_t', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/doc/Makefile ns-3.34/src/wifi/doc/Makefile
--- ns-3.33/src/wifi/doc/Makefile	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/doc/Makefile	2021-07-14 10:31:07.000000000 -0700
@@ -10,13 +10,19 @@
 
 IMAGES_DIA = \
 	$(FIGURES)/snir.dia \
-	$(FIGURES)/WifiArchitecture.dia
+	$(FIGURES)/WifiArchitecture.dia \
+	$(FIGURES)/PhyEntityHierarchy.dia \
+	$(FIGURES)/WifiPpduHierarchy.dia \
+	$(FIGURES)/FemHierarchy.dia
 
 # specify eps figures from which .png and .pdf figures need to be built
 
 IMAGES_EPS = \
 	$(FIGURES)/snir.eps \
 	$(FIGURES)/WifiArchitecture.eps \
+	$(FIGURES)/PhyEntityHierarchy.eps \
+	$(FIGURES)/WifiPpduHierarchy.eps \
+	$(FIGURES)/FemHierarchy.eps \
         $(FIGURES)/clear-channel.eps \
         $(FIGURES)/nist-frame-success-rate.eps \
         $(FIGURES)/nist-frame-success-rate-n.eps \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/doc/source/figures/ack-su-format.pdf ns-3.34/src/wifi/doc/source/figures/ack-su-format.pdf
--- ns-3.33/src/wifi/doc/source/figures/ack-su-format.pdf	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/doc/source/figures/ack-su-format.pdf	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,122 @@
+%PDF-1.5
+%�쏢
+%%Invocation: gs -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true -dAutoRotatePages#/None -
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x��};�-9���V�2�k�?�J�YB��mcY���Ǐ�#"�S3]f���"�=p8�������������)����S���տ�ǟ�s]��������_���X�S��*��V���3�\�����/�'��?��ӿ����S*eM2��G�M�#?���>-{��Z�!����?����)U�|���Z����������⹞O���g#��Oj�U��P����L4��sQC��g��iWqd-�\�Z�V?�}�]>�:��笯�?k����2�����:�sP�6(k����;�ÑS>��;��^h�k�Sר�^\��3%�Ց�@*��(�U�x����N�g�	9�g,�������*ӑ���D��v��kZE�S�W<A����U2N��;���r�����ZX��&�ԛx�����}�����ً���������˔���\5R�S���i�'y�υ�B�F���PqU��_��1(g-%��ރ�,��@��i4��l��/����9R>u}m���3��B���sxrR�Un
+j�=0b��T4�E90����C{De�ѩ0hNKA�:�I������i����g]-
+Ui�.�����2>���hT�%(e��nWCS�R��d�;�LC�Z��U��k�xT��$H4A�jmzr3����;եq��k;�x��f!�G#�oi5a��WCj�4�]n�:&�:���u�4��Bڕ�KZ�j8A��`�
J��@��͸�4�
+ͩ5�4�2�w;��y��sx�_�$��
��C>�LLu�2%['r��34))7M��<�q{
Gʅ�?�l'�F����߳+����N��b���h�b�,�}�8��Ԏ��� JA�U���e��N�ۑ�
��}��C��W�d�,���*�W ��r��|�44��'��B���I\�q?sF��2�f�\�缼�RԤ2Tڃv&W�Z ��5�R&�P�;�\�~k�!QC�����ڼ�败����<edi5L�BEx4���N{���6��e9���*H�׌_���h0�_��9�Aw�zCh`���/@�u�k�:iQ���-�Otm�9�O��В1E�#fX��UF5T��2��c��`Z��}�y�Fŭ#ވ5 �+$/�TƋ���'� \�,h9���B�����O�&�Wx�*3�����s��V�\pC�c��T�G���#�.\/��V0���Pk��ң�d��%������E��h&P}�ɩ��"����:|s���t:��hq$W=�ŕAz�x����Z\įm��F��ŕN����+�v-.d��-��f~X����t⓺C�+���]�A�3�kqT�K!Z\Ȧ�%�&z�,ZɴۨI����O��;�=��g��N��Z)��*��QKQg���R�u�P}(m��iq�v�'��q���5�䅽��qԺ�W����8*�I*��o%�����<8��W
~�=�lNY��1֪/���\�3ѕ8D�����ڮ�ѻi�դ�Q+/.�+qT~Z���o|dXd�lj\ 2��	:�XY��2�U��R^	�w;�̱<b�}�����.���C�s�:y�БXKG��}#�kl[6�H(���7�P�E3��{Ǯ�,��~{ԂN�o=�\�I\��
���
+0d0'����U��W4Vf�v\:�������c��O���&LK=��S6M���a���YX���kU�GJ�}TR��Ԧj�%+��ޡ2�Xs��E��u6��5!wV�񔌱E�@���r�,����A�_S�+���º�Q���/_���m&*�h��i$
+���0
!ڇ#4��`�y�+�بr?�Z%��f�m<�K�(��h�EW�w(���M�jl�j��V��=Ui�kVf�F*:���;�bVt<� =�9�R�
+wЖ�s	y,�aA�Z;�u1/�Čػ�8Uu��<�Q�B�L	�ЕڂB%��GR��Lj�/3
��:�s��D�<������ ̶���'G���5]TStK�׿�%�Hc �
+��Z`>�u���鴧�͐�k~�g$%�b��Ўea�'����$2�{���g��N�p�gߪ�O�����8�ס}��e�V��zz��w8R;-�y�Q�d�WV�Φ�o�A�u��AÑ�:��*����e�C�jG`ՠ%�0ЀK��"l.&�� Jq�rC�T<s~Ҟ��<�h�i�^d�BFÕ�V�J�ZɊ~�h%
XP��x�|�h[T�=����5
�y�/z�B�@{b���m.���>�|l�!�
GH�lN�U�@�3�v��2���������\��C�wcSm l˲�V�����k+%8���Jh��:������5�M��Z�J�ϖ�Wh	��$.7��$��0n���S�.��������_%��\�i�����}��k<'���>��Ҿ�qѹUo�,�Oy��l8��J�{�ϳ8ܠ��o�)nЎ-�x�Y2�
+���+�j,uPB1�q1Q]���
��:����mb���#M9��R[.�zk�Uo
0�l���sȱQBhs	#iH�ݐ�S:5�0ܒ�U3��$E��ܔXp`E��|䲦ā�aF�+�Eq9�98��-
�-��	��<���	�d�~h�5I��K�}��`�E츖��
�
փm���I��
+@&ɲ�#Ga�6���%����:�^�n�ɤ���9�#���Ec�b�B�(+A�w���x�`�_��[�T+`�]�}��yMke22��f�X]?hw������sexo51�܁F{n4�H������
�Q;�!l��6S�:c��M��f뼪$)�r:�$�1�ї��W3p�ɿ+e}A�YI+3䟪e�B�Y�Z�"�!���"d���HyϽ+f�W���[����8��ުy���jYW�ɠ�o����<����t5�`ǾI$���׀��c���hy�έud�l��%9����Gh�.ҪH�x%6��2HW"��{x��bb�D���"SL�T�3�����Ç�$_�s�:&wg��N�d��tBq���@"ؖ/��>.�N���i�ϫy�1�S3�nT�V�����3��/�BU�tث��ϟI<X�'�D[�K�&��+-J��}����!ðV�U�ԇD�@�(���SrH!��O<R����:����yn�3�LDKE���qk� 3�S��HW� ��v
9�0E`-�x��k�&�
+�3�c<QwҺ�j�7=6O��ÏrC*�R�	���K��14h���}������֜��l�oaN��0�8�\�˸�J��LfD��k�9�qsr%R�r���g����Z`Z9��8���t��\o�$�z<�ζ�+L�+���;�cޱ�
+��w$ez<����
+[?��.v��FE����C&�9`�����j8�$=*�Ĵ">'_�g�Ml0��*ut�D2Y����%��f;\�	���	36��6�L�w��`))�܃�F��!S{��:rx �ؾ`Ϳf�:ѐm4�*[
+'R
+!�TRc�̛��&F��0�����mi�ϫu�/F;Ԍm_�[\��+hq�7`�Ԑ	�����̈́�l�C����_���xB��C��s���H]o�/���"���֌W@�ےC
+Q'()��V3���߯�ߚ�
+���P��n\��u-#8K��p�A]m�H�e��Ssgpw������_%�Lm�&�J+�(�3Z���|೙07�+F�F����J�����@����Wy�IqtSx�O�>����G�C�(E�g%ܿ�I��s��0I��0�3�����\�'�_�:I��׵�����.=���~	#d��_*��/q�K�5�_���?��zOv�$ƺ�c���br��8�Hj���R��~�Hr�p �9[��\r���7]����n��"�\9���/Q�}s���x��7�!���d��R[o�����X1��%������n%�_Ҭ����_���/-�9W���!>IjK&yO�����/�~9/>�s�ʉ%y�[v����I7�fr��ڵn^���%6UWr�T9�_Z
+s�49{�_j���~i�2wK��,9@2�K����l9q�K��%�˱�����%6�#�_��-w�1�_���~���_Ң��sP��p��L��9��&u:��&�����I���.�
+�
+�K�vG�Kdܻ&��qL��S�aU|$L���;`*�$L���T�=,�lI�8ڸ�`b����R���Iы��,����\0���=�w�T�,�_���n.���p'L}��C��W��.�Z��9��̛&6�;�`�<5�E���i	�S���`�1�`b֝�rI\	�l�R�����o$j�p��`�����uL�Y=,�.z��"<���I� j�\0I.���u�.A"�:\����ι^���\0�`Gs��v0Lo's�����H.�8��7�1�D;\0i�&�_�	�%L������J��̛4*n�F���:�$Lw�QK0�M�Ir��uğ�Mf��&5L�],u��&��+\0���:�\0'����"��&^ڳ��E�).�ګQ�i~�@i)���`rj7C��/�wL��r���S59w�tM�]0U�sL����59w���`��\Ȧ�"���`�R�.��ɹ�kr��;X�&�kr����nt�ɹ�kr�i��.�����o.��B]0U�sL����
+e.���%Y59w�tU�]0U�sLU���U9w�TU�]0uҙ�OJs����SU9w�4UΝ0u�P'K��\4E����	S�8w�tEΝ0]�s'Le4w�TM.dS����N�����)s���Q�Ν0]�{Nƻ��;�	3t"G|55��_�e.�o$�E{��\�	��9aFFs�L�:aF!�	3!ꄙ
+�<�q�ԗ���ss4i��	S��9����r��ܼ1�;?�u����v���1Qᢧ��/ذ|3]r��.a�f��M�7��:�.^R�n���f��bm}�
+��ԥ`��,Me����c�eTv�����;��+2;n��$���>��`��\�7m��Efu>Bt'F�QHzx�RB�hl{:\w��l���k����5���	�1�4.ʾ����joxKA�/�T��~ķ���EGTV,�ȴ�g���]��Q�QW���{ʋ��x����YD�g��qd�척�R�y
���ofT�_�X��M�ړQ�$K���w3��s���n�����m����D���f�}x�$3�"�̨���B
�fF�y湙񔊆q#"�Q`�sƃ�͌p�(-̌�/��lfF��Q�dfTg�dT���%3�a��I c�n�M����P7"��i�uQl)����+D�~,[����x:���x����M���������Ь�g��ܭ�*'+��0��3�L�{BU�k�je<�����-5��_�̸3�����,'��̸'��n/�g�af�c�m>73n�.�03nj-�NnfT9�-���`�233�Y��PfVd�^�����VF����⻕qˡ�[7\fj�2©h��2���ƺ�Q�dg�fh�ĩag�}�%&74n9�u;��|O�Ge�diD��F<
+��ҨC$Y�7�7��xp�`�i��������,�:���xh<�r��UT[��h���I�����nlT�I�Fg �ڕ�%��V	�`�Գ��N{��6*��;��΍ϒݬ�8l�p�Y�-����P�%�&;��t:��qcgw�ڨ��w���*��ڨ�J�Fp�>�d���Njm��jF:��nm�fm�q��F�v�qs��A��DP�ɲ*��7ܔ�F�*�7��Q��W��=��*.{��b<��nr<�#�M��$�#�ϹA"�Ad��\/}6�
�zTm��ft��2�c�غ'`�_��n��V�M|�K�:��䢷X!�UL1�����B�L�dkުQw�7bm�����e�duT�m�`W�p ��S�H;"�?�����jvGO�fE��!��L2<BQhn#�2>jq�;,r-�����]�;�*�4����[�R"'���0���w1�M/�>��w�����z] �ٹ�Q5;�:�f�VG����z�[]�s���P��jv!�f�hvnu�eۭ��ٹ��5;7;�f�FE��B6�.Q��p����]�s�����������=��U�s��kvnv�B��Q4�M�s���vnuT�έ��ڹ��U;�:�j�VG�rfv�IivGKa�GQ���誝m�Pˢjv.�b��unyT��-��ع��;�<*��]Q5��M�DF�[U}sӣ+wn{�6�T�s�+x�9y7>������"9�몙A<���H(���7⹲�q�KWl3>FF3>&D��QH3>&D���j|L���?��܌�����d|T$iצ�����Pm��!Q�]$��9�R�kc��������sh�K�0�$V��،بy���j�8��1_OmN�@��%��]K�}
�&��Ӏ9\�uJ�4��+��}��Ӭ�*nJS�\���)}�4�����sK#ܜv��߅�r���K�� s6���d�i:<����]8P�'<���p�i����R����&~OS�����G�ƷS�����4��\/j�g_`�s�r�g_��%�\�=��ju#���)��N�4��z�-
�wI���b>�$XEƮ)M��ʜ��L�I!b���8��A�"�� �O�4�'��i
+���<���/b���1
{|Ћ��<1�EL�]�"���@t�0���i�3\�4���-b���1
k|P���41�EL�Y�"�� 
d�0f�1��f 0�i�����pH�4������wmw?�oH�z<Y,SS��NR4���W�@~����D��s��1DðF�
+��X+z8�L�M)H�����E6>W?Ȅ�0N�%&_�l|�~<�Jȥ��H��M�C!T�r��
	�5�E��Z,�%��;B&V(]r("@ڐC$A��FʛJ���6���Qf�czL�q�O������=��E��[k��!�Ǟ#G����#U:W��
��P�K�
�2��{҄lވ�7'U�#�,>�y���x^�$FZ�b4q�BH<�(�T-�!�����З�
+#Z��'�
�����漢C���ơ��__�/��>�b�Lnr�1Ewj�<N�*s����幓��1������ی��A�=���)�ӳ8ܜ�k�Yt'�75��Fnj�
lѝ��T���St^Z_�O('�[w���[��5�u!����膫�[#�I����YlȨ��� ����=1��
+�Z6���:!V	9�,NS�<S����`r�9�v���Ik[�Y��x��m����H��8�W("������(h�}��o��@T���x'�#a��ܓ�8����B��i<,F�b4q��j����0,zrp�v/d��`IO3
+���U���:{���&�w�*��ơ����kC擥�|CB/u�	�-x䲙�Ԏ�/�W�\�rGE����Wz{̵4�c�8"�(�a*�}rI�d[uĘ�.�P���0��5x����!��
������~�T�ρ�I�<!����O �՜v]]� ��A��
�,l��;<ߔ��T.	�/��o;�\y�Y�`^H�A/v�9.��IL24�V�*��U�!S��-J
����2r���N9E����I����$��V?)Bؐ煺�͏UC<�:�nZM����D��fS��� �C
����$�B.�j\NjnX�������)�Z�lt��\��%1�0��f&�S�*$�78� �J,�t�tE!�X|xpK�B9��,�k�G%-@�\4�x�"���<j]>�8"#�ᤓ�!��y@H�>O�C�w�@�3&��k:�P��[v{�]p����Ff[��z#���G��-zxAt���OBj��v�z#�����%��/���?�/H*�>��x	Q��l$w&sD�r��d�<��dX��2�LG���p�<�EĞI\'ӝ�B6&D��"�D&�P0oLV�.��.Q̌ɪ:��l\��FÇ�Y�K���Pwր��*��HdVGq2Ý_^�,<.��*�)ֹ���VR�j�2
+��llFm'���`.#I<��jY��Ff��]�UD��J���d�;�s��dV�%����G��a?�1���\v23��EGp����*�_�3Ȭ6932ð�kJf!�9�dV�^$P��x	��p�]SA�er�?s�cB�,E��*��ӱ���5%�5��d�ԡ�V�0=�G�t�Nғ:�=����R �-=s�ðt��qL �1�Gu�!Y�՝d:���J2�
+�	���_��$ӡ��~NI�Ѐ�qP���#J2�ʇP���5qL�j��mCŔ���1$�F�8&��1��|�P�fs���D��V���^8�K��0HǢ=�Q��p�HQd?�$���7F2Mϥ�0n�2!;� �%o�f�9؜���s�D�5��;N��5NִKZ�n�l����ƿ��вB3�+��h��h�g:T ��3!�8�<ӡ}��!DCe��74�����Dӡ`���!��J$D�d%�@dp[H��)mS��h<C�hB$�@��
˧$�y�J	gT��Gh��[T@S5p��󼑬2ujA�>�2��'���b
+R�z#� �r���/u���b��HV�:"�'.Q����JdjyMD�a� 2�x
+�A���t����^�wP"و,!��%��>e2�+�7&�.�����X��dD��2e����Q�0�~c2(�K2&C�[����+�X%�Ƞ՚RT��mDV+_�HDm�%"�Ew�Jd.�u��}$"���D	��/!�(��"�%2�p%���o�Ld�[R�9��Ǡ����y�L>T&<�����c.;�b<�c������o<��U:�A�܉�jQ%Ky,d�1G���3�F{
��bˌ��F��Y��w�VH؁�b�����/�ءC�'�� ��#
v�)��,�I�s�$u��+%�j���߬�$~ځ:�R��=��Ҝg/#W
+�o��R��.�A	��='A��{��D?�wKbM���F�#i@B����*��q��b�� 4Z���{��ȷN(�yv��gN�̣.	���P��[i�{�=�ੑ������jr�ԓ�]8l�'��l�4r�"�\r� %�KC�fu���T�{�i��)̈́�aI�}p����袗4.p�hp|����$4���]���kH����v$Ma�l�'�c6�H��1�����dG�Tv��!y2;�ّ4���lb�Ўٌv Mi�|N;�&�c>�I�ڰ�׎����lG��6��ir;f�ہ4�
���H����w$Mq��7$Or�b����Bi��'�a>�
�S]�4�
ɓݰ��ܦ�a1�
�ް��ܦ�a>�
H�ޏ�:�h������:���3K>D����zbf�g.�T�r���(�&�6�@��q�b��0�5o�}d��>A/��}�"�	�_6���'��|� %�E�%�Ip�7	��&a���c�D��M���W�l��jq6�����$�#�l{GT��KQ�e���Cy�/֙�{K��M��G�Եlg�S�xm���ni���
+�է��.��峧�GpD��A/�w�Z�#l	x�ܕⱭ{T�
+�����!�^F�0b��K�wQd��.7�^���}�`���Z��6�a�]�^ENc|��+���.���p�K�v	��.�F�8�w艂�p��wњ�Ƒ�@���#�%<�l�ϰ+f���~�wV��Fn�V��\���ܸ�yވ7�%N]o ���"�s�H6v����*�Ã;�
�Uf�ȿ)G�Nd�iW�e����
���`L5}1��lL�0��t����'��T|�hLF�2h�ʨ̗��0�%Y�,a�Q�[H�l��|�O�l@	�'s�a��v�B Fd����_/[Nd$�5'2��:ih�`�"2��lD6�
+:W"�@����3���|�DF�j�`"�bm5V0Mq�����=�=�Zj*�1�a������DFc�}�j�ј�b�}���Y�^X�ՔŨ���O�Ũ]ƥ�U��)��X������
�
j�*׏�Ĩ8L����$F2��Ab�����JPO>���Ȱr�WG�ku,\�!����_|hoI؇��r�~���f}!�����E;���.��F;���yf
L�H2N�?/�܁�"~p�F;�z�Cu���цl~����hGc�F;���G4�G;�ih>�?��9:���цl~�������nɇ��u�2?ځ�ćp�G;0�ţ���>4*����m�no��E��7��u���|W�
@��pq���DV�Zk��������cn���،�1d�M�h��G�0?�(���F!�b^s�}T<��;�z��Q^$ٗ�Y	�=�+N�!��2D�h��V�{�>�%+�o=}���5Ś�.2��;����~�@��I�\M?:�.o>���ps�����Ջv���q�0��z�N��L���c��@u���ؕ�hB�mt%H"��͉���iN����@��݉�J�,͉v �a��S �D;��`�D;��K�hY�.�
D�hI���E;��y��M}3/T^� �m��F���!�PоmdBv��cŐ4洟�Hr�
�T�8��^�ͣ ��\yg��;AL=�7���<i��3	��v�	�x҆l����'�@��+J�2O�g]ޞ�c� �	5af?���g���Cg}��$��<s�\���Ī��Jf���f*	�L%�\6�o��K�b8�[�|J�[X��6f����2`��a�=���9���X
+�k�m�˾�pD�[n}�6�������Y��mn��c�n3�Q7�f�l�GT��!��.c�K
(��@�����2�hآ���SY�|�Ð|����f�\�n�B�.�>�x���pD�\t�K�=(�3�R���>���c/�&�}	�N)�����9٥v �Y�f��Qg�3\���!��8ү��@L$w�Ӏ��1|�Kk����2�|���4ѝLZ5�?����X�`]�R�(��Dv����cR
+眞m%_��	`fGܨ Yb���6:�BT�ۈ+�I1�H�z#f��	�s�D���;#����7�-%�֞�"4�2τ�f)r��i����5��&�-l!�u�e��#��G=��B6Dhl^C]e�N8<����	�D�r�b-�2�g�p��bIVDc���y���*��1B�|�\hl"�T
����M����K	�Rh�r��7��&l;
+�?RH������%�1�i�D�Φ�d}g㇞�r��v���yi4O�1�����0��<ƃ��a<FM[��x)f�Xx,d�1G��&L5��;���xl^���	CN�1�����tYy,��t�ڢ�f�x��qqs[
+GJd������_��� {;��ّt���0'́�	��90=a N��f�	s`v�H�0f'̎����9�8a�O�]L'́�	sq�옝0'́�H�0;�'́�	s`v�H�0;f'��	s`z�@�0;�'́�	s`v�H�0'̎�f���ّ8a6(N�I'̎�	��ٰ8av$�0;�'̆�f���ّt�옟0�O��f��O�����k�I;��ܛߎ�57)��<&=��_V�������+󳚄�%":�wO� ��TU�`�DP�݃��!�B&,���|���i:�^#M�8��	�/91����Qz�Q?�\�+�	�+"X�����ം�3,|3?�`[�m����U�Z:�#]]��#;�ج��V�F�����dW;�D=Cq9���i��8���S4��H��W~��o,�����&��:GCD4Бd��rDG{���.�{����F��uC�p[j[G�)�b/�*��@*���+���X7>m��A`q�\����@�K	�yk�B��g�4|��z�����
A,�D���3.�����#���?��W�'�2E��ʎ����SZ8�!� w|!�0���ar�{G� ���<"��.����@¶�^����I�C,�/�ǂC<d�/4ePe�]*XTp�o�n|����w��uیn����y���3���UXu��}h�U>s�)p}v��������]�W|���Ě��@Ͻ%�M��(V��Z� sҠG�}|[�#�R,�2�ᳩp�?�������5^���8��8�1f#5��t�4�)�=@��r�����_���b����D�?.�w��A����;��K�E��*�
+,��a�2O�
�Z>K��#�����{i�t�588F�":���NШ�<���c�9 -��� ��>�@6��_ӑ�Q�\��?<��	[�!!�8��<�ҽ����w���őB���^�E�N��l�Q�	�`�Q�������`�۱��\BcT�.��y�y��"ɲr&p!8��(��=wxmVx��)����Ę�D�:�!n� �C��~���qfĞ�0���yO�`��n��q�G˳p7��g�Y{t-4�����>]~�t��1<�5���%/Q��3�����GѦ�e�����Ds=��U�T�7���?�Ob��N:��s��2.�g
�OP��qu��]�*���v����|G,g�e�79X�S(�w�D�z	����"`,oe2V�L�$ys�`yC�屽/�Ee�Ρ$��<
+�9b��|ǱL�J��V��(4orм�P��K��v��M�A���#���>�*#��^��;��!��L��P(�� 	��0_�%�hxX���?�`2��iyEt�c�.qO`�79��S�8��yv#z����)y�yl��U�4/��F���<J�o�W)^���\A�0�.	�%4ٌ�"44��h>�]i>=Fi����,L����sΑhސ�y	����b$�F�?$�2�C��|P��d�yz5T�ZlS���v����x�vS8�b�r�>P��׵��<ٻYeZ"���*���ط�Tצ��$����Չ{'���	kM��#��
�B�M�66^&����������8c�����z�e|�1�;�#�(�D3�2zb�+��vԅ�뼙������Y��N�%����a�L*G�{
+�A����H]���'�#�n�Y�$B{OjPD�Ƨ�hq�jp�pe��_��ɗ�|����7*@v���.1�1�e��cN���(�������@�!r_��qb�빑i�爬"�|��72�����X�
�՚m|'vpejhz��続�"�f�ռ�%[���zE!c5/�)��7�Gl�@�0��b�Z��H�`y���m�vl���pY��K̺�o�m�*�_i֍�5��H���nE�5[�g���$�i
7$�p9�Y��D��'il�F�m�wj8?�������>����k����[�zl���d1�e���n�*��p����h�`��TX�pt���5܆F���$��u
G�Zc�6����|nK��\�pbbo���K���у�7�t	�i�����E� f����;	���|�~�)�.�o��Јi��B"W,�64b���|��,�^>[��}Z���i�]���?Ϣ�~��V�ob���S��,we�)���c��d�)�-Y�"�*�0.g�J���dC�0_P=dY	�Z�a2�;�	<��L2���O�j
+��*��PD�W*�:��"V�ZHC�`�96����$�f}�⶷	���N��e�7L.��t��
+S�n۳�B㽳mD�p���>t�U x8��]���_eD�.4Ԫ��A��6���s�z
+�=
+���%������DB?A��O[;�hJ�ol��h��F7��:ol6��|ЩM���)�bx��S-i��eȡ��Ea�b�+\��1���9��r��Q�`%_7��u.�؋�^��.wϸ�Ӱy�Y�|�,9ƕ�4d���|S���1.s�{�����G��T���q�1Ǹg.{إ�zݣ$�(!Y��ģ�"�̌�Tߔ����x�ԋ���/RΖz�GI9�/)�~�#>'��y�"%��3u�OEX�A�()�Xr�����e�K	�[>��.%IV��@�{�"<�
+ϸ�O��|��q�.D��V�h��	�	���R,	�%�TC��샼gj�P)G��n$ds)�/֥$?	a��ƍ���K9<�E���Ex���W��
+�"��F*�<�n�����CIE���FB6�Gԡ�"����PRq����J����s(��m��PBr��?I��N�~n�w�SB�7I�x��!�&�|��$��(��E=.�
�-�"bWͷ�q2��F�s\�h���7�
�g��'�gz�W�-�D��F�Ie����Wq�y�o�_	Q�I`��Uĝ9Vn��$&��X�3I�V���2���T��*֥$���uDH�b�L7]k�x��aQ�	�9G�W�0X�K尐��QC`��8������a�:�t�ĸ;H�B�M�sQ�#�]��^u»�d�$�V�'�T(�å��a!{�\l2F�@$^.�#��BU���Jb��!��Bb�O\�Ў�S\��瀺����ᰝ+��Q�~��apbC�0���1C��݂���DRn����d�}Mᰊ��rQ9���+<yy����� ���!dyi}�&$�������Xendstream
+endobj
+6 0 obj
+14940
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 667 206]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1175>>stream
+<?xpacket begin='﻿' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.53.3'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2021-05-23T23:08:22+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2021-05-23T23:08:22+02:00</xmp:CreateDate>
+<xmp:CreatorTool>LibreOffice 7.0</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:8e401eb9-f427-11f6-0000-7e0dba3b92b7'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>none</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+                                                                        
+                                                                        
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.53.3)
+/CreationDate(D:20210523230822+02'00')
+/ModDate(D:20210523230822+02'00')
+/Creator(LibreOffice 7.0)
+/Title(none)>>endobj
+xref
+0 8
+0000000000 65535 f 
+0000015432 00000 n 
+0000016747 00000 n 
+0000015373 00000 n 
+0000015259 00000 n 
+0000000228 00000 n 
+0000015238 00000 n 
+0000015496 00000 n 
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<AE7439A51C95B82BFD8C6B16425D277A><AE7439A51C95B82BFD8C6B16425D277A>]
+>>
+startxref
+16911
+%%EOF
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/doc/source/figures/aggr-mu-bar.pdf ns-3.34/src/wifi/doc/source/figures/aggr-mu-bar.pdf
--- ns-3.33/src/wifi/doc/source/figures/aggr-mu-bar.pdf	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/doc/source/figures/aggr-mu-bar.pdf	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,131 @@
+%PDF-1.5
+%�쏢
+%%Invocation: gs -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true -dAutoRotatePages#/None -
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x��}ˎ$�r徾"׳8���J�|BRC�ZH��������
t�Y8�N��s���u��ׅ�����_�u�����_猯�u���������?������$�s���S�/�Fs��y��_{�W���4e�W�������{I{����q�����r�y�IIƫ�A���^{׼]SJۯ�H�j��'M��������ϯrQ�������ӯW�v���R�U�+ަ�
+���
+�W��&}d���׳���O���������Z�j���/j�i޿֡W~
׬�^���k�=]���_��k�������T�s�kS�J{5�z�.j\MrT'0M����^�~)W?4�֢��WD�����0L�v�i�5ǄF�Px��rա7�/
+��Րh�W5k���׬�_WG��6$�7����kYV�a��g�x��Q���朗�u����'u�j'��>jԙ��=��6�ro�C�L/��A������t�^K����rYnT"�z�H
�m�S�&��V4>�6��V��N���T����ѧί���㡬z��Z��$��.5�[���^צR���>�!������Ӱ�K�	L��P7����p���+����#M��f���7�L݃v��s����W(�u"���gΤ�.ʁ��E���}7�_�5�u��zj�
��B���S�g�B%V��%��-�}�9��S�3I^��N��H[�	���I�i�"냷=�scm���뢱G���ѓT�@Q&�[���^��K���_��@x9<R�`r7��0ͯ"�nwL�
���Tn=���F�$�^��44�镠ƥ#v�o���>�/��xB���˭�d�>���Ϧ�N�
��M�m�d�(5p���(�!��������ihN�T�D���Yn�n?��w��n����5a��l��v�e����Zx���⢘�M���V�f#��F����k���+�\4Lx)6�N�R���|�� ��&r�0�Oz�����\��鑭$�IC6��

�
�e��$����2�
���H�0��#*����Ii��YK�d��B	��09j���Ľo��+9#uw�ԫE���\-��I?���WG��
+��J��B�Mo�~Sc���|�/��y����=YMʂ����T�j�����-�'Ƚ���%*;�s�'gj��k�T�DE��+Tޡ�KI�
+ʦ���C����9Z+WX5�6��li�F
q�`�%���ڰ��d�U��Qk�߻��p�2+=A���5�=a�sS�JА�9e��J��M���u�id[�hm���(�n��=AFi����QM2���\�?8�i�
t��t�Ĥ�%���bE��b�v2<=��;�ׄO�t23-U�S�{ԳW+�[W1��<�a�&��p�Ζ.V
���\�%|��e���G'7�%�am"���ر3ݜ����L]E����^���
+��7�d�@=r�'P�
+	��
+95K50���5Z�"r�9�w��;%����K��|����{^k:�ai��"
]M���f�����&
�1�G�x�׵�F��2�ԇ�>�m�C0��9�L��D��Q?�e�Q�B4��
+�E(�E�,�]�ڍ:����f�'F�5�5�V� g�Z���D
+�DGt��4��W������Z�
+�&YCkf�:�k�2�&�<C���F4���G��߼̙+B��\�#Tĭ?P�X����A�:�4s�*��+��Z�&6��w�%�_4�_�s���1�;T����8�6y����7e)�KX��O��3P9�x�D�r�A��ފo
+��b�����oW����%�V<*u�"Y���������yQ?����jj�
��<i��2+�"��q�Q��3(��Q��Q�0�ӼY���3l-7�Pѱ4�������-Y �``�}��ڮd���VKO`�k��j/�)bg?���YnUH���11�L�w����dhjol��6M��g���j�����Ea��m����ℛ���(RLʦ\0wQgj6�1���;�h���^��/Zv��b,�1�/�
Wu��2�7- �B5�����%m�9Aet��.�bS+�� ۻy���c�C���j6l��v�uߎ,TCfj,nX�mo!9��46N}�44�|-	� Cr�u�2�:���1 T��>�m��"�o�ș����#x���M� �8�J��Nϳ�Jz�2���w�#��ٹ��^��A%ԢSG���H�)�%f&5om^�mZ�:��-ߋ�@.�a��qOrѪ�é���-�o�X%T¿����Q%�ߏ�,����o��y�����5��T9�����H���D�c]�5dkvN���SNKءY�4��������[]i��*�)��ؒ�F�f�h�q�P����#������Vݔ�khZ�\�������>�\�M�i��*��S��a�(���%�[�Ӆ��x`���m^��&G�T�����8M�-a�٥˱�p���'<�,�S�8k��3��Z�)��O���PM��'?A�/�A��E�hg�VUĄ�3H�
�q�����S���BY������2*G�:��!���R(�%A"�X�,#x2%{�H0�".P9��&����9��$��]w�� R�������H���ލ�5���r���?�����EqBʙ{.k����l�������D?efT����ho���5��W��V4�r� ^a�A���R�&Z-�m��������R]��0��^V��_���/��7��.�Qrv��=-����g�d�4�8���;��m�	]�+�֤�o8�5
�֚DhLQi��n+B�@�7M�������
+wf�8�r�գ�h�j�����J{������^=~ʫO>|4
%툭
�Tl�q�A}�3��z�R�N5�.�А����jr�A�d�Y;��W�E]A���S;�޸_4hI^���1ˋυN��Ʋ��H�RR]p�F�(�)�Z~bO;��*�I �R��EZk�9��,�ĮĞ�sW���N����D�����E�N=�߮I�cs1o�u��6��!g��p���t�]o�o�7�r�2m3�_��},i5�J&?"rT���S�F��
���jl�l%2�7Ȯ��Ds��h�n8̓V� 
�,ru/��9�hQu�S��Qo�r@侢ô����T�?�lq|�B���UR�)4p�ES�쩉T��9ՇƂ?��Sc�@Ґ���I��+9H��0�>���w�$�Ȳ?`M>p�Ŷ�F7R(����N�%yJ�N"y$7�J�Zl		��g֎����^��ۻxjRL�N�"B�WF��t��]e+r��i��/� :�J�-w���n���O��ɋwnH 
+���	[�����buG��J�G��l=���eZ+i�����Ro�o���׫���Zz�S���Kb�ؽ��{۹��EB�&m�Qe�h���x[[qV�pA�����ї�A�nzdp��1�����h�\��L�H�hG��b�Q�p������"u�⼫�EH渌�E\v��k4@E��-��EH.��\�>�&
+����U`;��ϓ�c�̞�Q6�͸�vl.����%x�.��
+aY�.R9��\�4r�p�;e��!�R���/9��U[n�l�[ˑ�
+���P�*��Ò_G���+v�{ˉ�F�\6��+̑��F9X�*p�g�N�	=��`(z�+&�"�%'���!Z$4��.��p�
+�������c���,�9ňb(%MO�fh�Ic�4�Z��Ii��|j���e?5����.x�'�
+�ݟ�|�@.~�s���$0U��U�Q�Cc�vfV�n~!܎1cg�Qx�
����V�agWG�4X:�"�^�3��Z��?��
������VQ9�SM+��14h�
d�ɦT~�Zw�Ѓ���@NEZ404�97���;x�`N�S�ae��hN@�C[6��&���2�]��\��0Ւ��0ܪ��cr��O�^P��&�R
@�H֮�@(u�D8A��g�Tƒ}7�L(A�E��
F��p���"K;���.M�v����V4��R��,��)�D�E��FtR=yAKC��p��xA���j�X��|�E��s���H�T�%�/C���3�%)TC��p_hKy�
+|PlHW�b�m��f�q���S��y��'�đ�����_T������-9�#�p:H/�4oא���߿�5�9��&��ș���c�%�T�#��0<�y�Ec��E��ԤT9�|��@�xr˃5�&�i�?��抆�1���;��*���0�mv�����i� n9�;d2�]&�ixP-dxoNk��4�c[��
)�b`�OƉV�����Y��C�� �*�^�(��u"�8��4+RF�SE���~ۥsd�Vv�B�L���.{_����]^8p���@?���Sn�t4ڱj�o��3
� 6��xPz	�&4�#:��oܚ�/8\!]n��B�XO��۫z�8$/<�0�0&VAm�7A��G�sg�]sgphvK�'\����B���đw��&S
�6�H��V��#�3�R���D�c7�Ԛy���yz����%Ź8�4�*��O����!s�����>ܟ�'u&a6���j��H��,�{>�O�-�R��b��m�J�D�<5��3�aY�{���3��b����u��<5��#���Rp&���(-�	J�i��B2Y�픖B.APZ
+�u�Ig���J�4΋�P
"ߴ|;��5�Ԣrb��&h-�b��zG�>ek�_�Z���a;͉��#���)+��# �2Zǋ@h6��<-��P���^wV��Zb��K�&��B^o���b�Zm�i�0VK#Ek��ZTN�{�h+
����h�k�X*ʈ-�{:��d���%^�[H#�r��Da��r��� ���WGg&Tڋ���Kz�x-�VaQ)��䁷j�����(��d�l�P	������UR^�|�f�jT{1x�x-�	^K�	�o�k�R@�3^ׁ�Z��C�m5^��6^���k�'�����5Jla��P:��B��J���c�r�/y�����Zx�b��o�2nK�^���\��RC�\��,��Dnr�ZAn��]-�-*'r�=aC�'q[�h}N��E�NP[�9/EN[A���dZR9,�V.�OIj��7�^	7����<���Ψ-�0j�*���Ȯ��b��*:��[j-�r���Y�;�E䖂�ܞ�-6���b�Uy!1���0��ƴ�[(���P��[x��W�+���I�:%z���<5�׈]2��MOo��_c���_����3MT㣋o��v#�`���j)���Vq��Ҋ*��<y�8k����;'��&H.���H),�ZB�2M���*Ɂl�-���G3o4�����4ռ�Ʀ����-E�\R�*�%ބk(��X��"W�(Qc�X}���[� ��� �Tx	%H.*'��?!$���5�"9�+�\R���TH�A��&�Z����(.��R\*�l�YWB������G�(.�J`68.\]D����p\*��g��j���q\RS���MQ�:�d�Ca똆�0�ܔ����!a?��OX������b6�I.��OKe�p��5L�`���a��,u&G�L#^B�%4�
9q]�	!�p�qC���:�/�Nw�Yk|�����ql��۬5v��
+���ht�?h�7�8�Fw��m�U���Aw�'�̢�q��&�K���]�
+�ER��hlg�vI#Q�.�]
+ox��]xe���5����s]��%^�iԿLl���v���l����v���[Ɵ�d������c�x���zH�.��Q;H�-�;�%:�:��Hl�\�����/�ԅ���w�PZ3��U�O�Dv1��.�PY"�}�w
�����xoD&������V~9�Ŗ,&��u�F��*��b�ܸ.iP(��G�r]0(��a���)�6���r#oĘP�K<!\��hJua7U�Ju1MP]|�+�ō�5+̷R]�	���^ؘ.l
+2���[x	Y+��^�?_T&���t�Dt��׈.f�|M0��?!�wy\�2��޸.<����.pS���
���0��?�\�z
+C�\��+�.xVt�R]lF����P/����ؚ_ݩ-$7��e+T�Q��(��߼R]��8�����ۤ�L���D倛�͵�\|�47�墊 ��"�~�KL���ɧ��\�	���t��qQ]n�k�ԩNr1Cn$Vm��Br�1s�M�$�L���b?��G�jԓ4��\%���6��=��ZsP������(�4�pI��"Q� ��
+⌖�"�W�$��\��l%��%�Q��C�k�qZ��,s\��uw�����Myhd\�ŢF���Q\�	��خ�(.`0���¢��m�� g�<5�׈��<���1�s�'��bMq�+f���G'ߘ.�]'�.�x��Fưy���%��c#�� U��*��B"��Fs��וUR�6�4�|��X۠������m/���O�XHř,�_�2����d�����4l�$�r]Z��q]��8���#ޕ�e�:7s;���'�����4�vQ��]Pyf�(��#�媠�;�-8a��˗ ^\S�8� ��W�ET�PUޚVB��^Im�7C��G��b�����:Ś�~Vh��b����2Z�i�.1�iJ]���(�b��5��]x���.1a���u��ad��(�%%�KR0��
+~?���.����4�vie����>�.����4�v1�1W
+F��I�
�C#+�;i�b(��]H�p��]�'��=���̨.�i/Au���R]ؗ��M+�E|�t��uMg�Ĺ�1]��։,8�L�d�k"D9t���#��-1�K�x���<�v�J:q��%��]�F�.fn���pP6��[3��֛i5�����H�J<
,�(�Zz�T�~���s�0x�\,rn,_�\��qht!��-VF�#�ī1�B�@�+��B�!G����s@�#����g[�Lf;ÃM�i@\�F*OMJ���?h,�������
&�2]�ER�Kr���OӅe�ּ���N� ���Xd֨.�S�K����X7JCBv'�5�x��S�b����lP]T�TL��|���]�4�w�27�K���O��2p��J�kt����xoč�۪�uQ��Y̍9�5
��x�7E��H+��҃RM�rt�i���V�wދ�I\c�x/�'qދ�I���x�(\�y/(qދ=a�[D\6@�kPb��,�%%F}	@�Q_Pb���l�����%�^@�1_Pb��W	��7�J}I[D���B}� �1_Pb̗�ҥ�_%�|	@�1_Pb���Ţ��|I��0_Pb��u�|I�R�/�0_Ob�Ǔ����Jl� TȆ'	�86�|18�1_Ҷ��/�'q��Z5'�(��eǓ�F�$FQ���_N��B��&���p���xg��ϒ�/�׸Ɨnc��A����Ը�e�?�&�_b��Of엤P����/Qc���·?�B�/�S��J������/�1p��o>S9�E8�-t����.^�C��'<]d�2Q���.x��w� �3}�k@��9����;?d
8U46�,ݭ��'c�)YBϿ*#WI.�
)�.2�w��X!��
+��
,�Ñ-�97C�B�A���`���y$�v7e�,���Fy#����~�Cp�4��.�V>�%�*��Sg�S�+��z):� �(���2�F5d8*�Fe�[&*bɮouK��.FK�U�v�����\���8��t��:Ѽ����q�@4��EBA/�;o7�?5��#�`�q^�@�"0�8͑a���}d��`���1ЪIh�8ztr`�ǘr���1qWY`�yL#��?����n=�9Z儁VM�@w�{0*Z�Px�=&o�Gڷ��Ccf�8�y�}���G��,:4��S`h�^��ߟպ����~g�h
=�\n �q�;J �I?ո��in;@�*'�=a�y����J�196�h�+��@c�0k�1��Z=��i�ј�r=bs��w�`���OKz�&�QA�"�{A��obr����=
+��=ʒ�����R�����s�hS���VMBA���v�����Zp-
��遂�ԩԧ��V9���	CAcހem(h��֯0h���a �Q���2#CӇ��=�)�Ac��(2���N0�!�9�
+�$b�]�?��*�����;P�*'�=჈��L0h�[�S��V��p�n�Ǭ�9�b��M��0or��RQ�A
���&���&�f7(����v�g`eW�Yu;.e����.��Sk�����*ݡ�ښ��-�cTW�t$��X���v$�? Hh֎��}������!��G����%���8?5�W�er��Ok�O`�A�r�v�l�2ET�wo(��q�1c�k~�?MR=6RQ���F�mE�!yK�|Y����~�ʪI(h�׷b-�*�+	9�4
N��Eԝ*G"Z�ϓ�f�PЃ��󬚄��I��
+O8�ԧ�z�wa�q�^?m�|*nU6�n��4Q!�9?5j���ve��(�Xz��Ph�ڟ��m>&����s��
+t~j�Y���C�Ѓᨊ���`��b�b�8(�v��ۏ��c����2�d�b�u��X|ڞ0�V�@s-
'l-P���@��Ȗ�&�=���6
V�@>�A0�p��֒kqt�j�����|�T�I��gd����H�|�'�<ʑcv��]�a� 2�.��i�TN�gB����Nm�����[��c��9��ib�Z���6Q
����kb�� o����B��%$pE>���������#Y�Մ{NuT�SQ�3x�Wс�6��р����q�k!OZ�$�*��?��|�7h��x��Q�2!�m�򙧡u��283f��I�"v]S�����n<G�(��ЪY��Y��x���Nxj��Y
U�<�&:J�p!7r	�o󌩾f`�U̳?��f��d_�]3�,��7�3�S�	S����Y�&�<Ú����c��
+z�wn�`
+w���Pf���f�qkk���1��O(����hg���[0��j��漡�� {��d�ٟP��nz�0��r;��f,�&���</�w}I���ζ�����W,�w�'�l~��R����;�Î�
+�O}axg
+v�QaHg�MQ�Hx%�3��o���w�笳�qβ�vUH�}z�c �Q'�+�K"ǡ�1�
+���r�9�A!0g
+s��9c��o��rN�ζO3�3���~е�j����XYfs��O;�t1��=aPf�P��.�bxo�4�
�F���X��~�@�Έ\]�F�2V�ZNc�'��bIsߨ�hhg��v��mhg{�_��`hg�ߏ1|C;�b�f
w$����o~jbY5�s�(�y����񀢛�X���Ԥ�
+�9=rk��쎁kl
+�y�0��=���gB!ϺwȳG�4K$!Dݲ�»���O�7��#�Y����'���	C3[;\�j�"*�ѿw�3&��	�;9LN��?h,Q�;�8v�s�Q<����zK��8�TlqU�ȡ�3� ]'�M�/
+
`x�m��-��xg
�8�����G@s������ٕ�����T���z���_ߌ�=�}���wo�^Լ�����#��F�Īq�1j_���Cv�	����t����T��G�v����i�z�	��yd������R���P����{�X54d��|��(^Y5�g��2w�q��4�a���(�B��5�#�1��tC<ǔ1�s�(�9�a�Cc��JA�I#�g-����
���PB=�&P���b&�D=�ӟPϪI�g�8�yP�
+�L���Y$�Y#W��y�Q];P��{��Q�ܭm�g8��|������U�O_q��s�� �XK���ց�zX��f��$Rc�VZ��С�fV�fŀ�1NL-�����KJ�g���9�A��F��fz�</�5���Cbf	�lvְ�zʚ䪤�HH1F�Tӫ����!w�����Y#�m�e�e�%�F���ce��1dr��.#d������F��c��F�ex����w������!'��k��v�MJ�X�?h,������2��w����Q�ٟP�3d ɭ��L}�	��J�g
�:�Y"y�}�@�C��g�BiD�&nuxjRD�A�����C�1%j�}̸F/M�����J=�i�\n�5$��4г�0U�w�}U�;�����ą����hg}�Q�m�
��,;��.G��F�`鵂M���7�4b�쬸;;n��Ίq���B���;�e�e�d��B�#�u֭�c�8�Xg�8�Y�#�dV�H�I�&
Q��G���;ۦJ�ζ�3�sl
��O(�Ych�vv�����R�vV����8�hg�8�Y�#�v�X����WT��G�l�M��1
��(�Yq#�vv܈Ým;i`f
F�l��Ш?�xg��8��wUwv܈ÝՔ9�Yp#!n$4�1���B��G;�6�$0�pg��|��;�Y��wO�5�V���H���&�-+���T��[<{:G<'�B���y�Z�9����Qгo>�s=���AϾ/pг�>Sŝ�Sv\f;]����󏚉%�1եʹd�=K�ኣƷ��٦�d����4j>kǯ�Ȏ�����?��u�UO�ğn��~1ۓ��@�6�Ι<D�����`fg���)d�3�u��Y��ٴL���.D�\��~���ڔ��&�!��0�/� ��h
+V0猜f4N���w�J��&)����˅c��q��f��>Q��&��CB�Q̮i�}l�H|�5>�j`1]T�D(��qv�L�k@Y�*������e|�"�
�z�G��H��b=�vKƑU�F!D��Y6� R9c
��3\F�"�\�Ԍ�!��ta�H7`����򥛘�;�G�9�м��y�
]f�0ɽBύƇ$���B�n(W���U\�߯�~��&�\�p�qnxb�Ő+�IB�:|~�2�J�Th���08KPɨL9���x?�¹�/�j�2�Kq��
+��/xЊB�=���Qi7t�`�̃ᒫ��	>�a�$���~LFY1vJh��Hf(�o�y�FiK�H��x*dޛ��88Ĝ�,׼��F�0<�S�{��{;`�Rx�{��z�������x���+��K�b�+g���Q+6@��ي�k���Պ|�����e��E'�
+#f��0S�	��w8�	���F�M��-���
+Ղ�I� �E�`�1{1fL�Z0�}���́�,�`������W8��9iK&lT&�	��,�
ö�	uV�v6,d�ap�Gh�Y#6�>� jİs-1l?���F^�\�%Vj�}�C ��OLm��1���VX�cdBw;�z�v��c�Q;�m'c�Ԏ��َ�Q��ٱ����î��E�b.�s��1t���J
��c�c�+�ܱ't�s����t��߮�{�/�/����k6�
��a�K5MJ��� �_�r��?v��{3���߷��L����1�"���I�>r�g�d��8e_�1����%^e[�/��N�L��M㋼����|^!��f�h:�`��l&ܜB�d���/��l:�I���N
�}ŗm�:�M� �Z�!���K��t0���^�!,V�Z�!���o�19>dc���s�[��_q
�%b��+0I�߉1�}G�H?4�Σ~������_��8��;dD�������ǿe��/W`��r���焴��2o��ߏ���hL�/�?ʶ~�/�d�|��4����k��1�j��M�E�d`�j	&~?�u��
@����[6i��l�F�e�ƅ~�&i�[6y�Ix$k�[6V��Q��-�K�-�ķl:�P���D���߿�ꭕ�����[@aN���#ߟ|f{��m0ՄEţs�d?����#�Ƣb\����4nQMau�9��9*Y\
�d�Pw:9�>B&Od͚�d�cw�
+���)Ġ"�>�L��ڧ�E�9x�.b>O��h��UA,�p�?�%u��:ɢ.x�p���Q�-��aQM�~tn� �QV#Y�5�F>��Bm�*̔�򠨩��s��) ���˅O˞rne$s
+��mI��*iE]���:��5M����6���hx��s�)�u�0�Y!��4f,'3tf�4��Zɜ�=�mKV�a���^7{�3��g��i��=���iT�=M��yʉ=���V��Q�dOm*�=5M�S�f�{��=Že`���@ ����}eM��D�n.�ﯜK�L�Q.}��w�����B��Z�֒}�r!"���~���uo����E�;��[.�IP�'�\E�|uMYE�v����-�����[�@��a�!9�-D8�r98^y��+�s���������Y]@��!�r���?��Ѿ����.�,(7ðH�?̥ន\����ޝ���̽3?�;��\���-�k�G��~.8��j���a�p���-\�T6�y7y3�O˥��r�%['c��K��m��f
G�@".C>��K<�}�Д��)�T�j-Y�iU����:��=�8�Ƈ�Iy��P\ÐB�����9ߏTv8�?p�/�����0\Wm�v�4�Y�ZIn�:�
p�4�DqF����ns���r��]XKy�)`��9�r��0�|#��8��_E��&zӚ��D��J:�Y��2
.�yh�mx��%��jP
��1����Xȋ?���j�����X/B��G�$e�ʳ}���L�C�z)#������8'�8���%z�|�K�Od*��G>_�c�d���C�a�S��	��ex[Lwv
�
����e22�o���*�\?Tx߃��"_:C���6��b>�ch�p� &�ȗD�qa��D����3��~���l�[��DC���*�W��m.�J�9��*���r,�9Q|��[D\
+�yaU��i����V���=
+v��N�4
n"˲Ѭ×}p zG)���(w��~���/R)�L�d(�~q�����<2�	>֦"�����$FK��q���l ςJ�x���=�
�����Yu4�7�ɨ|�e��{x�N��0o��e�t�Ha����LS�a��06/8�Ğ�p�͐1&.���:�0y&�W*��|NH������fM�᳅�g?Nhޡ9��Bhi�7��D*�G�~|h��)�^Kj"c�ns���݋7���:���|"u�1FOh��R�O8R&��)�~T�-��ҵL�c���5]ç�|}�d,�R[�S�:�q�Β��X�\.
+U [�����7DlT�e
+7R�Oj�m��\d��uM5Z�^��Of�"�:��ـYş�7�a!_��T4�?_�E���
+�MwQ'�
+@�6�퓣�8�B��Q��*S|�g�=���.8���p����>���;��S`�`����>��
>3�GM�������'�����X�p�#�
+��&
+��m�[¤|���7�T�0
3�G�a���v�O�� Q��G_��l���TfϏ�	5�`�f�\�&���֜���Ev�e�o��=1�r����6j�㘧���_�rendstream
+endobj
+6 0 obj
+13747
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 418 171]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1175>>stream
+<?xpacket begin='﻿' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.53.3'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2021-05-24T00:05:42+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2021-05-24T00:05:42+02:00</xmp:CreateDate>
+<xmp:CreatorTool>LibreOffice 7.0</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:90a676db-f42f-11f6-0000-a49dbe905642'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>none</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+                                                                        
+                                                                        
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.53.3)
+/CreationDate(D:20210524000542+02'00')
+/ModDate(D:20210524000542+02'00')
+/Creator(LibreOffice 7.0)
+/Title(none)>>endobj
+xref
+0 8
+0000000000 65535 f 
+0000014239 00000 n 
+0000015554 00000 n 
+0000014180 00000 n 
+0000014066 00000 n 
+0000000228 00000 n 
+0000014045 00000 n 
+0000014303 00000 n 
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<9AF58D86339FCDEFF5645984AF3CBCF2><9AF58D86339FCDEFF5645984AF3CBCF2>]
+>>
+startxref
+15718
+%%EOF
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/doc/source/figures/default-table-based-error-model-validation.eps ns-3.34/src/wifi/doc/source/figures/default-table-based-error-model-validation.eps
--- ns-3.33/src/wifi/doc/source/figures/default-table-based-error-model-validation.eps	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/doc/source/figures/default-table-based-error-model-validation.eps	2021-07-14 10:31:07.000000000 -0700
@@ -1,10737 +1,4106 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%BoundingBox: 42 16 565 409
-%%HiResBoundingBox: 42.000000 16.500000 565.000000 409.000000
-%%Creator: GPL Ghostscript 926 (ps2write)
-%%LanguageLevel: 2
-%%CreationDate: D:20200808111628-07'00'
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: (MATLAB, The Mathworks, Inc. Version 9.9.0.1467703 \(R2020b\). Operating System: Mac OS X)
+%%Title: (/Users/sianjin/Documents/2020summer/ns-3/Code/AWGN/my code/Comparison of table-based OFDM Error Model with TGax results.eps)
+%%CreationDate: 2021-03-02T23:00:48
+%%Pages: (atend)
+%%BoundingBox:     0     0   560   420
+%%LanguageLevel: 3
 %%EndComments
-% EPSF created by ps2eps 1.68
 %%BeginProlog
-save
-countdictstack
-mark
-newpath
-/showpage {} def
-/setpagedevice {pop} def
-%%EndProlog
-%%Page 1 1
-%%BeginProlog
-/DSC_OPDFREAD true def
-/SetPageSize true def
-/EPS2Write false def
-currentdict/DSC_OPDFREAD known{
-currentdict/DSC_OPDFREAD get
-}{
-false
-}ifelse
-10 dict begin
-/DSC_OPDFREAD exch def
-/this currentdict def
-/y 720 def
-/ebuf 200 string def
-/prnt{
-36//this/y get moveto//ebuf cvs show
-//this/y 2 copy get 12 sub put
-}bind def
-/newline{
-36//this/y get moveto
-//this/y 2 copy get 12 sub put
-}bind def
-errordict/handleerror
-{systemdict begin
-$error begin
-newerror
-{(%%[ Error handled by opdfread.ps : )print errorname//ebuf cvs print(; OffendingCommand: )
-print/command load//ebuf cvs print( ]%%)= flush
-/newerror false store vmstatus pop pop 0 ne
-{grestoreall
-}if
-errorname(VMerror)ne
-{showpage
-}if
-initgraphics
-0 720 moveto
-errorname(VMerror)eq
-{//this/ehsave known
-{clear//this/ehsave get restore 2 vmreclaim
-}if
-vmstatus exch pop exch pop
-}
-/Courier 12 selectfont
-{
-(ERROR: )//prnt exec errorname//prnt exec
-(OFFENDING COMMAND: )//prnt exec
-/command load//prnt exec
-$error/ostack known{
-(%%[STACK:)=
-(STACK:)//prnt exec
-$error/ostack get aload length{
-//newline exec
-dup mark eq{
-(-mark-)dup = show
-}{
-dup type/nametype eq{
-dup xcheck not{
-(/)show
-(/)print
-}if
-}if
-dup =//ebuf cvs show
-}ifelse
-}repeat
-}if
-}ifelse
-(%%]%)=
-//systemdict/showpage get exec
-quit
-}if
-end
-end
-}bind readonly put
-end
-50 dict begin
-/DefaultSwitch
-{
-dup where{
-pop pop
-}{
-false def
-}ifelse
-}bind def
-/=string 256 string def
-/=only{
-//=string cvs print
-}bind def
-/HexDigits(0123456789ABCDEF)readonly def
-/PrintHex
-{8{
-dup -28 bitshift 15 and//HexDigits exch 1 getinterval//=only exec
-4 bitshift
-}repeat
-pop
-}bind def
-/PDFR_DEBUG DefaultSwitch
-/PDFR_DUMP DefaultSwitch
-/PDFR_STREAM DefaultSwitch
-/TTFDEBUG DefaultSwitch
-/RotatePages DefaultSwitch
-/FitPages DefaultSwitch
-/CenterPages DefaultSwitch
-/SetPageSize DefaultSwitch
-/error
-{
-counttomark 1 sub -1 0{
-index dup type/arraytype eq{==}{=only}ifelse
-}for
-()=
-cleartomark
-....Undefined
-}bind def
-//SetPageSize{
-//RotatePages//FitPages or//CenterPages or{
-mark(/RotatePages, /FitPages and CenterPages are not allowed with /SetPageSize)//error exec
-}if
-}
-{
-//FitPages//CenterPages and{
-mark(CenterPages is not allowed with /FitPages)//error exec
-}if
-}
-ifelse
-/knownget
-{
-2 copy known{
-get true
-}{
-pop pop false
-}ifelse
-}bind def
-/IsUpper
-{dup(A)0 get ge exch(Z)0 get le and
-}bind def
-/cpa2g{
-dup length array
-0 1 2 index length 1 sub{
-dup 3 index exch get cp2g
-3 copy put pop pop
-}for
-exch pop
-}bind def
-/cpd2g{
-dup length dict exch{
-cp2g 2 index 3 1 roll put
-}forall
-}bind def
-/cps2g{
-dup length string copy
-}bind def
-/cp2gprocs
-<</arraytype//cpa2g/dicttype//cpd2g/packedarraytype//cpa2g/stringtype//cps2g >>
-def
-/cp2g{
-dup gcheck not{
-dup//cp2gprocs 1 index type
-2 copy known{
-get currentglobal 3 1 roll true setglobal exec exch setglobal
-1 index wcheck not{readonly}if
-1 index xcheck{cvx}if
-exch pop
-}{
-pop pop
-}ifelse
-}if
-}bind def
-/BlockBuffer 65535 string def
-/PDFReader currentdict def
-/ObjectRegistryMaxLength 50000 def
-/ObjectRegistry 10 dict def
-ObjectRegistry
-begin
-0 ObjectRegistryMaxLength dict def
-end
-/CurrentObject null def
-/DoneDocumentStructure false def
-/GraphicState 20 dict begin
-/InitialTextMatrix matrix def
-/InitialMatrix matrix currentmatrix def
-currentdict end def
-/TempMatrix matrix def
-/GraphicStateStack 20 array def
-/GraphicStateStackPointer 0 def
-/InitialTextMatrixStack 20 array def
-/InitialTextMatrixStackPointer 0 def
-/PDFColorSpaces 50 dict def
-/InstalledFonts 50 dict def
-/MacRomanEncodingInverse null def
-currentglobal false setglobal
-userdict/PDFR_InitialGS gstate put
-userdict/PDFR_Patterns 50 dict put
-userdict/FuncDataReader 10 dict put
-setglobal
-/InitialExtGState 20 dict begin
-/BG2 currentblackgeneration cp2g def
-/UCR2 currentundercolorremoval cp2g def
-/TR2 currentglobal false setglobal[currentcolortransfer]exch setglobal cp2g def
-/HT currenthalftone cp2g def
-currentdict end readonly def
-/InitialGraphicState 20 dict begin
-/FontSize 0 def
-/CharacterSpacing 0 def
-/TextLeading 0 def
-/TextRenderingMode 0 def
-/WordSpacing 0 def
-currentdict end readonly def
-/SimpleColorSpaceNames 15 dict begin
-/DeviceGray true def
-/DeviceRGB true def
-/DeviceCMYK true def
-currentdict end readonly def
-/1_24_bitshift_1_sub 1 24 bitshift 1 sub def
-/ReadFontProcs 10 dict def
-/GetObject
-{
-dup ObjectRegistryMaxLength idiv
-//PDFReader/ObjectRegistry get exch knownget{
-exch knownget
-}{
-pop false
-}ifelse
-}bind def
-/PutObject
-{
-1 index ObjectRegistryMaxLength idiv
-//PDFReader/ObjectRegistry get 1 index knownget{
-exch pop
-3 1 roll put
-}{
-//PDFReader/ObjectRegistry get dup
-begin
-1 index ObjectRegistryMaxLength dict def
-end
-exch get
-3 1 roll put
-}ifelse
-}bind def
-/Register
-{
-1 index GetObject{
-dup xcheck{
-4 3 roll pop
-//PDFR_DEBUG{
-(Have a daemon for )print 2 index ==
-}if
-exec
-}{
-dup null ne{
-mark(The object )4 index(is already defined : )4 index//error exec
-}{
-pop
-}ifelse
-3 2 roll
-exec
-}ifelse
-}{
-3 2 roll
-exec
-}ifelse
-PutObject
-}bind def
-/IsRegistered
-{
-GetObject{
-null ne
-}{
-false
-}ifelse
-}bind def
-/GetRegistered
-{
-dup GetObject not{
-exch mark exch(Object )exch( isn't defined before needed (1).)//error exec
-}if
-dup xcheck{
-exch mark exch(Object )exch( isn't defined before needed (2).)//error exec
-}{
-dup null eq{
-exch mark exch(Object )exch( isn't defined before needed (3).)//error exec
-}if
-exch pop
-}ifelse
-}bind def
-/StandardFontNames<<
-/Times-Roman true
-/Helvetica true
-/Courier true
-/Symbol true
-/Times-Bold true
-/Helvetica-Bold true
-/Courier-Bold true
-/ZapfDingbats true
-/Times-Italic true
-/Helvetica-Oblique true
-/Courier-Oblique true
-/Times-BoldItalic true
-/Helvetica-BoldOblique true
-/Courier-BoldOblique true
->>def
-/CleanAllResources
-{//PDFR_DEBUG{
-(CleanAllResources beg)=
-}if
-//PDFReader/ObjectRegistry get{
-dup length 0 exch 1 exch 1 sub{
-2 copy get dup xcheck{
-pop pop
-}{
-dup null eq{
-pop pop
-}{
-dup type/dicttype eq{/.Global known}{pop false}ifelse{
-pop
-}{
-//PDFR_DEBUG{
-(Dropping )print dup =
-}if
-1 index exch/DroppedObject put
-}ifelse
-}ifelse
-}ifelse
-}for
-pop
-}forall
-FontDirectory length dict begin
-FontDirectory{
-pop
-dup//StandardFontNames exch known not{
-dup null def
-}if
-pop
-}forall
-currentdict
-end{
-pop
-//PDFR_DEBUG{
-(Undefining font )print dup =
-}if
-undefinefont
-}forall
-//PDFR_DEBUG{
-(CleanAllResources end)=
-}if
-}bind def
-/PrintReference
-{
-//PDFR_DEBUG{
-({ )print
-dup{
-=only( )print
-}forall
-( })=
-}if
-}bind def
-/R
-{
-0 ne{
-exch mark exch(A referred object generation )exch( isn't 0.)//error exec
-}if
-[
-exch//GetRegistered/exec load
-]cvx
-//PrintReference exec
-}bind def
-/IsObjRef
-{
-dup type/arraytype eq{
-dup length 3 eq{
-dup xcheck exch
-dup 0 get type/integertype eq 3 2 roll and exch
-dup 1 get//GetRegistered eq 3 2 roll and exch
-2 get/exec load eq and
-}{
-pop false
-}ifelse
-}{
-pop false
-}ifelse
-}bind def
-/DoNothing
-{
-}def
-/RunTypeDaemon
-{
-dup type/dicttype eq{
-dup/Type//knownget exec{
-//PDFReader/TypeDaemons get exch
-//knownget exec{
-exec
-}if
-}if
-}if
-}bind def
-/obj
-{
-//PDFR_DEBUG{
-(Defining )print 1 index =only( )print dup =only( obj)=
-}if
-0 ne{
-exch mark exch(An object generation )exch( isn't 0.)//error exec
-}if
-}bind def
-/endobj
-{
-//PDFR_DEBUG{
-(endobj )=
-}if
-count 1 eq{
-pop
-}{
-dup type/dicttype eq{
-dup/.endobj_daemon//knownget exec{
-//PDFR_DEBUG{(.endobj_daemon for )print 2 index =}if
-exec
-}if
-}if
-dup type/dicttype eq{dup/ImmediateExec known}{false}ifelse{
-pop pop
-}{
-//PDFR_DEBUG{
-(Storing )print 1 index =
-}if
-//RunTypeDaemon exec
-//DoNothing 3 1 roll//Register exec
-}ifelse
-}ifelse
-}bind def
-/StoreBlock
-{
-//PDFR_DEBUG{
-(StoreBlock )print//PDFReader/BlockCount get =only(, Length = )print dup length =
-}if
-dup length string copy
-//PDFReader/BlockCount get exch
-//PDFReader/CurrentObject get 3 1 roll
-put
-//PDFReader/BlockCount get 1 add
-//PDFReader exch/BlockCount exch put
-}bind def
-/CheckLength
-{dup type/integertype ne{
-mark(Object length isn't an integer.)//error exec
-}if
-}bind def
-/ResolveD
-{
-3 copy pop get
-dup//IsObjRef exec{
-//PDFR_DEBUG{
-(Resolving )print//PrintReference exec
-}if
-exec
-exch exec
-}{
-exch pop
-}ifelse
-dup 4 1 roll
-put
-}bind def
-/ResolveA
-{2 index 2 index get
-dup//IsObjRef exec{
-exec
-exch exec
-3 copy put
-}{
-exch pop
-}ifelse
-exch pop exch pop
-}bind def
-/StoreStream
-{
-dup//PDFReader exch/CurrentObject exch put
-//PDFReader/BlockCount 0 put
-dup/Length//CheckLength//ResolveD exec
-//PDFR_DEBUG{
-(StoreStream Length = )print dup =
-}if
-currentfile exch()/SubFileDecode filter
-{dup//BlockBuffer readstring{
-//StoreBlock exec
-}{
-//StoreBlock exec
-exit
-}ifelse
-}loop
-pop
-//PDFReader/CurrentObject null put
-//PDFR_DEBUG{
-(StoreStream end.)=
-}if
-}bind def
-/MakeStreamDumper
-{
-//PDFR_DEBUG{
-(MakeStreamDumper beg.)=
-}if
-currentglobal exch dup gcheck setglobal
-[exch
-1 dict dup/c 0 put exch
-1024 string
-{readstring pop
-(StreamDumper )print 1 index/c get =string cvs print( )print
-dup length =string cvs print( <)print dup print(>\n)print
-dup length
-3 2 roll
-dup/c get
-3 2 roll
-add/c exch put
-}/exec load
-]
-cvx 0()/SubFileDecode filter
-exch setglobal
-//PDFR_DEBUG{
-(MakeStreamDumper end.)=
-}if
-}bind def
-/ShortFilterNames 15 dict begin
-/AHx/ASCIIHexDecode def
-/A85/ASCII85Decode def
-/LZW/LZWDecode def
-/Fl/FlateDecode def
-/RL/RunLengthDecode def
-/CCF/CCITTFaxDecode def
-/DCT/DCTDecode def
-currentdict end readonly def
-/AppendFilters
-{
-//PDFR_DEBUG{
-(AppendFilters beg.)=
-}if
-dup 3 1 roll
-/Filter//knownget exec{
-dup type/nametype eq{
-dup//ShortFilterNames exch//knownget exec{
-exch pop
-}if
-2 index/DecodeParms//knownget exec{
-exch
-}if
-filter
-}{
-dup 0 exch 1 exch length 1 sub{
-2 copy get
-dup//ShortFilterNames exch//knownget exec{
-exch pop
-}if
-3 1 roll
-4 index/DecodeParms//knownget exec{
-exch get
-}{
-pop null
-}ifelse
-dup null eq{
-pop 3 1 roll filter exch
-}{
-3 1 roll
-4 1 roll filter exch
-}ifelse
-}for
-pop
-}ifelse
-//PDFR_DEBUG//PDFR_DUMP and{
-//MakeStreamDumper exec
-}if
-}if
-exch pop
-//PDFR_DEBUG{
-(AppendFilters end.)=
-}if
-}bind def
-/ExecuteStream
-{
-dup//PDFReader exch/CurrentObject exch put
-dup/Length//CheckLength//ResolveD exec
-//PDFR_DEBUG{
-(ExecuteStream id = )print 2 index =only( Length = )print dup =
-}if
-//PDFReader/InitialGraphicState get
-//PDFReader/GraphicState get copy pop
-//PDFReader/Operators get begin
-currentfile exch()/SubFileDecode filter
-1 index//AppendFilters exec
-cvx mark exch
-exec
-counttomark 0 ne{
-mark(Data left on ostack after an immediate stream execution.)//error exec
-}if
-cleartomark
-end
-//PDFR_DEBUG{
-(ExecuteStream end.)=
-}if
-//PDFReader/CurrentObject null put
-dup/IsPage known{
-dup/Context get/NumCopies//knownget exec{
-1 sub{
-copypage
-}repeat
-}if
-EPS2Write not{showpage}if
-pagesave restore
-}if
-}bind def
-/stream
-{
-//PDFR_DEBUG{
-1 index =only( stream)=
-}if
-1 index GetObject{
-dup xcheck{
-exec
-1 index null PutObject
-}{
-pop
-}ifelse
-}if
-dup/ImmediateExec known{
-dup/GlobalExec//knownget exec{
-currentglobal 4 1 roll
-setglobal
-//ExecuteStream exec
-3 2 roll setglobal
-}{
-//ExecuteStream exec
-}ifelse
-}{
-//StoreStream exec
-}ifelse
-dup/.CleanResources//knownget exec{
-/All eq{
-//CleanAllResources exec
-}if
-}if
-}bind def
-/HookFont
-{
-//PDFR_DEBUG{
-(Loaded the font )print dup/FontName get =
-}if
-{
-dup/FontFileType get dup/Type1 eq exch/MMType1 eq or{
-dup/FontName get
-//PDFReader/RemoveFontNamePrefix get exec
-findfont
+%%BeginResource: procset (Apache XML Graphics Std ProcSet) 1.2 0
+%%Version: 1.2 0
+%%Copyright: (Copyright 2001-2003,2010 The Apache Software Foundation. License terms: http://www.apache.org/licenses/LICENSE-2.0)
+/bd{bind def}bind def
+/ld{load def}bd
+/GR/grestore ld
+/GS/gsave ld
+/RM/rmoveto ld
+/C/curveto ld
+/t/show ld
+/L/lineto ld
+/ML/setmiterlimit ld
+/CT/concat ld
+/f/fill ld
+/N/newpath ld
+/S/stroke ld
+/CC/setcmykcolor ld
+/A/ashow ld
+/cp/closepath ld
+/RC/setrgbcolor ld
+/LJ/setlinejoin ld
+/GC/setgray ld
+/LW/setlinewidth ld
+/M/moveto ld
+/re {4 2 roll M
+1 index 0 rlineto
+0 exch rlineto
+neg 0 rlineto
+cp } bd
+/_ctm matrix def
+/_tm matrix def
+/BT { _ctm currentmatrix pop matrix _tm copy pop 0 0 moveto } bd
+/ET { _ctm setmatrix } bd
+/iTm { _ctm setmatrix _tm concat } bd
+/Tm { _tm astore pop iTm 0 0 moveto } bd
+/ux 0.0 def
+/uy 0.0 def
+/F {
+  /Tp exch def
+  /Tf exch def
+  Tf findfont Tp scalefont setfont
+  /cf Tf def  /cs Tp def
+} bd
+/ULS {currentpoint /uy exch def /ux exch def} bd
+/ULE {
+  /Tcx currentpoint pop def
+  gsave
+  newpath
+  cf findfont cs scalefont dup
+  /FontMatrix get 0 get /Ts exch def /FontInfo get dup
+  /UnderlinePosition get Ts mul /To exch def
+  /UnderlineThickness get Ts mul /Tt exch def
+  ux uy To add moveto  Tcx uy To add lineto
+  Tt setlinewidth stroke
+  grestore
+} bd
+/OLE {
+  /Tcx currentpoint pop def
+  gsave
+  newpath
+  cf findfont cs scalefont dup
+  /FontMatrix get 0 get /Ts exch def /FontInfo get dup
+  /UnderlinePosition get Ts mul /To exch def
+  /UnderlineThickness get Ts mul /Tt exch def
+  ux uy To add cs add moveto Tcx uy To add cs add lineto
+  Tt setlinewidth stroke
+  grestore
+} bd
+/SOE {
+  /Tcx currentpoint pop def
+  gsave
+  newpath
+  cf findfont cs scalefont dup
+  /FontMatrix get 0 get /Ts exch def /FontInfo get dup
+  /UnderlinePosition get Ts mul /To exch def
+  /UnderlineThickness get Ts mul /Tt exch def
+  ux uy To add cs 10 mul 26 idiv add moveto Tcx uy To add cs 10 mul 26 idiv add lineto
+  Tt setlinewidth stroke
+  grestore
+} bd
+/QT {
+/Y22 exch store
+/X22 exch store
+/Y21 exch store
+/X21 exch store
+currentpoint
+/Y21 load 2 mul add 3 div exch
+/X21 load 2 mul add 3 div exch
+/X21 load 2 mul /X22 load add 3 div
+/Y21 load 2 mul /Y22 load add 3 div
+/X22 load /Y22 load curveto
+} bd
+/SSPD {
+dup length /d exch dict def
+{
+/v exch def
+/k exch def
+currentpagedevice k known {
+/cpdv currentpagedevice k get def
+v cpdv ne {
+/upd false def
+/nullv v type /nulltype eq def
+/nullcpdv cpdv type /nulltype eq def
+nullv nullcpdv or
+{
+/upd true def
+} {
+/sametype v type cpdv type eq def
+sametype {
+v type /arraytype eq {
+/vlen v length def
+/cpdvlen cpdv length def
+vlen cpdvlen eq {
+0 1 vlen 1 sub {
+/i exch def
+/obj v i get def
+/cpdobj cpdv i get def
+obj cpdobj ne {
+/upd true def
 exit
-}if
-dup/FontFileType get/TrueType eq{
-//PDFReader/MakeType42 get exec
-//PDFR_DEBUG{
-(Font dict <<)=
-dup{
-1 index/sfnts eq{
-exch pop
-(/sfnts [)print
-{
-(-string\()print length//=only exec(\)- )=
-}forall
-(])=
-}{
-exch//=only exec( )print ==
-}ifelse
-}forall
-(>>)=
-}if
-dup/FontName get exch definefont
+} if
+} for
+} {
+/upd true def
+} ifelse
+} {
+v type /dicttype eq {
+v {
+/dv exch def
+/dk exch def
+/cpddv cpdv dk get def
+dv cpddv ne {
+/upd true def
 exit
-}if
-mark(FontHook has no proc for )2 index/FontFileType get//error exec
-}loop
-/Font exch put
-}bind def
-/endstream
-{
-}bind def
-/xref
-{
-//PDFR_DEBUG{
-(xref)=
-//PDFR_DUMP{
-//PDFReader/ObjectRegistry get ==
-}if
-}if
+} if
+} forall
+} {
+/upd true def
+} ifelse
+} ifelse
+} if
+} ifelse
+upd true eq {
+d k v put
+} if
+} if
+} if
+} forall
+d length 0 gt {
+d setpagedevice
+} if
+} bd
+/RE { % /NewFontName [NewEncodingArray] /FontName RE -
+  findfont dup length dict begin
+  {
+    1 index /FID ne
+    {def} {pop pop} ifelse
+  } forall
+  /Encoding exch def
+  /FontName 1 index def
+  currentdict definefont pop
+  end
+} bind def
+%%EndResource
+%%BeginResource: procset (Apache XML Graphics EPS ProcSet) 1.0 0
+%%Version: 1.0 0
+%%Copyright: (Copyright 2002-2003 The Apache Software Foundation. License terms: http://www.apache.org/licenses/LICENSE-2.0)
+/BeginEPSF { %def
+/b4_Inc_state save def         % Save state for cleanup
+/dict_count countdictstack def % Count objects on dict stack
+/op_count count 1 sub def      % Count objects on operand stack
+userdict begin                 % Push userdict on dict stack
+/showpage { } def              % Redefine showpage, { } = null proc
+0 setgray 0 setlinecap         % Prepare graphics state
+1 setlinewidth 0 setlinejoin
+10 setmiterlimit [ ] 0 setdash newpath
+/languagelevel where           % If level not equal to 1 then
+{pop languagelevel             % set strokeadjust and
+1 ne                           % overprint to their defaults.
+{false setstrokeadjust false setoverprint
+} if
+} if
+} bd
+/EndEPSF { %def
+count op_count sub {pop} repeat            % Clean up stacks
+countdictstack dict_count sub {end} repeat
+b4_Inc_state restore
+} bd
+%%EndResource
+%FOPBeginFontDict
+%%IncludeResource: font Courier-Oblique
+%%IncludeResource: font Courier-BoldOblique
+%%IncludeResource: font Courier-Bold
+%%IncludeResource: font ZapfDingbats
+%%IncludeResource: font Symbol
+%%IncludeResource: font Helvetica
+%%IncludeResource: font Helvetica-Oblique
+%%IncludeResource: font Helvetica-Bold
+%%IncludeResource: font Helvetica-BoldOblique
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font Times-Italic
+%%IncludeResource: font Times-Bold
+%%IncludeResource: font Times-BoldItalic
+%%IncludeResource: font Courier
+%FOPEndFontDict
+%%BeginResource: encoding WinAnsiEncoding
+/WinAnsiEncoding [
+/.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /space /exclam /quotedbl
+/numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma
+/hyphen /period /slash /zero /one
+/two /three /four /five /six
+/seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at
+/A /B /C /D /E
+/F /G /H /I /J
+/K /L /M /N /O
+/P /Q /R /S /T
+/U /V /W /X /Y
+/Z /bracketleft /backslash /bracketright /asciicircum
+/underscore /quoteleft /a /b /c
+/d /e /f /g /h
+/i /j /k /l /m
+/n /o /p /q /r
+/s /t /u /v /w
+/x /y /z /braceleft /bar
+/braceright /asciitilde /bullet /Euro /bullet
+/quotesinglbase /florin /quotedblbase /ellipsis /dagger
+/daggerdbl /circumflex /perthousand /Scaron /guilsinglleft
+/OE /bullet /Zcaron /bullet /bullet
+/quoteleft /quoteright /quotedblleft /quotedblright /bullet
+/endash /emdash /asciitilde /trademark /scaron
+/guilsinglright /oe /bullet /zcaron /Ydieresis
+/space /exclamdown /cent /sterling /currency
+/yen /brokenbar /section /dieresis /copyright
+/ordfeminine /guillemotleft /logicalnot /sfthyphen /registered
+/macron /degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /middot /cedilla
+/onesuperior /ordmasculine /guillemotright /onequarter /onehalf
+/threequarters /questiondown /Agrave /Aacute /Acircumflex
+/Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave
+/Iacute /Icircumflex /Idieresis /Eth /Ntilde
+/Ograve /Oacute /Ocircumflex /Otilde /Odieresis
+/multiply /Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls /agrave
+/aacute /acircumflex /atilde /adieresis /aring
+/ae /ccedilla /egrave /eacute /ecircumflex
+/edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex
+/otilde /odieresis /divide /oslash /ugrave
+/uacute /ucircumflex /udieresis /yacute /thorn
+/ydieresis
+] def
+%%EndResource
+%FOPBeginFontReencode
+/Courier-Oblique findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding WinAnsiEncoding def
+  currentdict
 end
-count 0 ne{
-mark(Excessive data on estack at the end of the interpretation.)//error exec
-}if
-currentfile 1(%%EOF)/SubFileDecode filter
-flushfile
-cleardictstack
-}bind def
-/ResolveDict
-{dup{
-pop 1 index exch
-//DoNothing//ResolveD exec
-pop
-}forall
-pop
-}bind def
-/SetupPageView
-{
-//PDFR_DEBUG{
-(SetupPageView beg)=
-}if
-//DSC_OPDFREAD not{
-//GraphicState/InitialMatrix get setmatrix
-}if
-/MediaBox get aload pop
-3 index neg 3 index neg translate
-3 -1 roll sub 3 1 roll exch sub exch
-userdict/.HWMargins//knownget exec{
-aload pop
-}{
-currentpagedevice/.HWMargins//knownget exec{
-aload pop
-}{
-0 0 0 0
-}ifelse
-}ifelse
-currentpagedevice/PageSize get aload pop
-3 -1 roll sub 3 1 roll exch sub exch
-exch 3 index sub exch 3 index sub
-//SetPageSize{
-//PDFR_DEBUG{
-(Setting page size to )print 1 index//=only exec( )print dup =
-}if
-pop pop 3 index 3 index 2 copy
-currentglobal false setglobal 3 1 roll
-currentpagedevice dup/PageSize known{
-/PageSize get aload pop
-}{
-0 0
-}ifelse
-round cvi 2 index round cvi eq
-exch round cvi 3 index round cvi eq and
-{
-//PDFR_DEBUG{(PageSize matches request)== flush}if
-pop pop
-}{
-/MediaRequested where{
-//PDFR_DEBUG{(MediaRequested is true, check against new request)== flush}if
-/MediaRequested get aload pop
-round cvi 2 index round cvi eq
-exch round cvi 3 index round cvi eq and
-{
-//PDFR_DEBUG{(MediaRequested same as current request, ignore)== flush}if
-pop pop false
-}{
-//PDFR_DEBUG{(MediaRequested different to current request)== flush}if
-true
-}ifelse
-}{
-//PDFR_DEBUG{(No MediaRequested yet)== flush}if
-true
-}ifelse
-{
-//PDFR_DEBUG{(Setting pagesize)== flush}if
-2 array astore
-dup/MediaRequested exch def
-<< exch/PageSize exch >>setpagedevice
-}if
-}ifelse
-userdict/PDFR_InitialGS gstate put
-setglobal
-}if
-//RotatePages{
-2 copy gt 6 index 6 index gt ne{
-1 index 5 index le 1 index 5 index le and not
-}{
-false
-}ifelse
-}{
-false
-}ifelse
-{//CenterPages{
-//PDFR_DEBUG{
-(Rotating page, and then centering it)==
-}if
-90 rotate
-0 5 index neg translate
-5 index 1 index exch sub 2 div
-2 index 6 index sub 2 div neg
-translate
-}{
-//FitPages{
-1 index 5 index div 1 index 7 index div
-2 copy gt{
-exch
-}if
-pop dup scale
-}if
-90 rotate
-0 5 index neg translate
-}ifelse
-}{
-//CenterPages{
-//PDFR_DEBUG{
-(Ccentering page)==
-}if
-1 index 6 index sub 2 div
-1 index 6 index sub 2 div
-translate
-}{
-//FitPages{
-1 index 6 index div 1 index 6 index div
-2 copy gt{
-exch
-}if
-pop dup scale
-}if
-}ifelse
-}ifelse
-pop pop
-translate
-pop pop
-//PDFR_DEBUG{
-(SetupPageView end)=
-}if
-}bind def
-/PageContentsDaemon
-{
-//PDFR_DEBUG{
-(Executing PageContentsDaemon for )print 2 index =
-}if
-1 index exch/Context exch put
-dup/ImmediateExec true put
-dup/IsPage true put
-SetPageSize{dup/Context get//SetupPageView exec}if
-/pagesave save def
-}bind def
-/FontFileDaemon
-{
-//PDFR_DEBUG{
-(Executing FontFileDaemon for )print 2 index =
-}if
-dup/FontFileType get
-2 index exch
-dup//ReadFontProcs exch//knownget exec{
-exch pop exec
-}{
-mark(FontFile reader for )2 index( isn't implemented yet.)//error exec
-}ifelse
-//PDFR_DEBUG{
-(FontFileDaemon end)=
-}if
-pop
-}bind def
-/FontDescriptorDaemon
-{
-//PDFR_DEBUG{
-(Executing FontDescriptorDaemon for )print 2 index =
-}if
-2 copy/FontResource exch put
-/Subtype get 1 index exch/FontFileType exch put
-}bind def
-/UnPDFEscape{
-dup dup length string cvs
-dup(#)search{
-{
-pop
-(16#--)2 index 0 2 getinterval
-1 index 3 2 getinterval copy pop
-cvi
-0 exch put
-0
-1 index 2 1 index length 2 sub getinterval
-3 copy putinterval
-length
-3 copy exch put
-getinterval
-(#)search not{
-pop exit
-}if
-}loop
-(\0)search pop exch pop exch pop
-cvn
-exch pop
-}{
-pop pop
-}ifelse
-}bind def
-/TypeDaemons<<
-/Page
-{//PDFR_DEBUG{
-(Recognized a page.)=
-}if
-dup/Contents//knownget exec{
-0 get//DoNothing exch
-[
-3 index//PageContentsDaemon/exec load
-]cvx
-//Register exec
-}{
-(fixme: page with no Contents won't be printed.)=
-}ifelse
-}bind
-/FontDescriptor
-{//PDFR_DEBUG{
-(Recognized a font descriptor.)=
-}if
-dup/FontName//knownget exec{
-1 index/FontName 3 -1 roll//UnPDFEscape exec put
-}if
-dup dup/FontFile known{/FontFile}{/FontFile2}ifelse
-//knownget exec{
-0 get//DoNothing exch
-[
-3 index//FontFileDaemon/exec load
-]cvx
-//Register exec
-}{
-(Font descriptor )print 1 index =only( has no FontFile.)=
-}ifelse
-}bind
-/Font
-{//PDFR_DEBUG{
-(Recognized a font resource.)=
-}if
-dup/BaseFont//knownget exec{
-//UnPDFEscape exec 2 copy/BaseFont exch put
-//PDFReader/RemoveFontNamePrefix get exec
-currentglobal exch
-dup/Font resourcestatus{
-pop pop
-//PDFReader/GetInstalledFont get exec pop
-}{
-pop
-}ifelse
-setglobal
-}if
-dup/FontDescriptor//knownget exec{
-0 get
-dup//IsRegistered exec{
-//PDFR_DEBUG{
-(already registered )print dup =
-}if
-pop
-}{
-//DoNothing exch
-[
-3 index//FontDescriptorDaemon/exec load
-]cvx
-//Register exec
-}ifelse
-}if
-}bind
->>def
-/MakeStreamReader
-{dup
-[
-exch
-//PDFR_DEBUG{
-(Stream proc )
-/print load
-//PDFR_STREAM{
-(<)
-/print load
-}if
-}if
-1 dict dup/i -1 put
-/dup load
-/i
-/get load
-1
-/add load
-/dup load
-3
-1
-/roll load
-/i
-/exch load
-/put load
-//knownget
-/exec load
-/not load
-{()}
-/if load
-//PDFR_DEBUG{
-//PDFR_STREAM{
-/dup load
-/print load
-(>)
-/print load
-}if
-( end of stream proc.\n)
-/print load
-}if
-]cvx
-//PDFR_DEBUG{
-(Stream reader )print dup ==
-}if
-0()/SubFileDecode filter
-exch//AppendFilters exec
-}bind def
-/RunDelayedStream
-{
-//GraphicState/InitialTextMatrix get
-//InitialTextMatrixStack//PDFReader/InitialTextMatrixStackPointer get
-2 copy get null eq{
-2 copy currentglobal true setglobal matrix exch setglobal put
-}if
-get copy pop
-//PDFReader/InitialTextMatrixStackPointer 2 copy get 1 add put
-//MakeStreamReader exec
-mark exch
-cvx exec
-counttomark 0 ne{
-mark(Data left on ostack after a delayed stream execution.)//error exec
-}if
-cleartomark
-//PDFReader/InitialTextMatrixStackPointer 2 copy get 1 sub put
-//InitialTextMatrixStack//PDFReader/InitialTextMatrixStackPointer get get
-//GraphicState/InitialTextMatrix get
-copy pop
-}bind def
-//ReadFontProcs begin
-/Type1
-{//PDFR_DEBUG{
-(ReadFontProcs.Type1)=
-}if
-dup/.endobj_daemon[4 index//HookFont/exec load]cvx put
-dup/ImmediateExec true put
-/GlobalExec true put
-}bind def
-/MMType1//Type1 def
-/TrueType
-{//PDFR_DEBUG{
-(ReadFontProcs.TrueType)=
-}if
-dup/.endobj_daemon[4 index//HookFont/exec load]cvx put
-pop
-}bind def
+/Courier-Oblique exch definefont pop
+/Courier-BoldOblique findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding WinAnsiEncoding def
+  currentdict
 end
-/.opdloadttfontdict 50 dict def
-.opdloadttfontdict begin
-/maxstring 65400 def
+/Courier-BoldOblique exch definefont pop
+/Courier-Bold findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding WinAnsiEncoding def
+  currentdict
 end
-/.InsertionSort
-{
-/CompareProc exch def
-/Array exch def
-1 1 Array length 1 sub
-{
-/Ix exch def
-/Value1 Array Ix get def
-/Jx Ix 1 sub def
-{
-Jx 0 lt{
-exit
-}if
-/Value2 Array Jx get def
-Value1 Value2 CompareProc{
-exit
-}if
-Array Jx 1 add Value2 put
-/Jx Jx 1 sub def
-}loop
-Array Jx 1 add Value1 put
-}for
-Array
-}bind def
-/putu16{
-3 copy -8 bitshift put
-exch 1 add exch 16#ff and put
-}bind def
-/putu32{
-3 copy -16 bitshift putu16
-exch 2 add exch 16#ffff and putu16
-}bind def
-/.readtable{
-dup dup 1 and add string
-dup 0 4 -1 roll getinterval
-3 -1 roll exch
-dup()ne{readstring}if pop pop
-}bind def
-/.readbigtable{
-dup maxstring lt{
-.readtable
-}{
-currentuserparams/VMReclaim get -2 vmreclaim
-[4 2 roll{
-dup maxstring le{exit}if
-1 index maxstring string readstring pop 3 1 roll maxstring sub
-}loop .readtable]
-exch vmreclaim
-}ifelse
-}bind def
-/ReadTTF
-{
-.opdloadttfontdict begin
-/TTFontFile exch def
-/TableDir TTFontFile 12 string readstring pop def
-/tables TTFontFile TableDir 4 getu16 16 mul string readstring pop def
-/tabarray tables length 16 idiv array def
-TableDir 0 4 getinterval(ttcf)eq{
-QUIET not{(Can't handle TrueType font Collections.)=}if
-/.loadttfonttables cvx/invalidfont signalerror
-}{
-0 16 tables length 1 sub{
-dup
-tables exch 16 getinterval
-exch 16 div cvi exch
-tabarray 3 1 roll put
-}for
-}ifelse
-tabarray{exch 8 getu32 exch 8 getu32 gt}.InsertionSort pop
-/Read TableDir length tables length add def
-/tabs[
-tabarray{
-dup 8 getu32
-Read sub
-dup 0 gt{
-dup string TTFontFile exch readstring pop pop
-Read add/Read exch def
-}{
-pop
-}ifelse
-12 getu32
-dup Read add
-/Read exch def
-TTFontFile exch .readbigtable
-}forall
-]def
+/Courier-Bold exch definefont pop
+/Helvetica findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding WinAnsiEncoding def
+  currentdict
 end
-}bind def
-/GetLocaType
-{
-0 1 tabarray length 1 sub{
-dup tabarray exch get
-0 4 getinterval(head)eq{
-tabs exch get
-50 gets16
-/LocaType exch def
-exit
-}{
-pop
-}ifelse
-}for
-}bind def
-/GetNumGlyphs
-{
-0 1 tabarray length 1 sub{
-dup tabarray exch get
-0 4 getinterval(maxp)eq{
-tabs exch get
-4 getu16
-/NumGlyphs exch def
-exit
-}{
-pop
-}ifelse
-}for
-}bind def
-/StringToLoca
-{
-/LocaIndex exch def
-/StringOffset 0 def
-{
-dup length StringOffset gt{
-dup
-LocaType 1 eq{
-StringOffset getu32
-LocaArray LocaIndex 3 -1 roll put
-/LocaIndex LocaIndex 1 add def
-/StringOffset StringOffset 4 add
-def
-}{
-StringOffset getu16 2 mul
-LocaArray length LocaIndex gt{
-LocaArray LocaIndex 3 -1 roll put
-}{
-pop
-}ifelse
-/LocaIndex LocaIndex 1 add def
-/StringOffset StringOffset 2 add
-def
-}ifelse
-}{
-pop
-LocaIndex
-exit
-}ifelse
-}loop
-}bind def
-/GetSortedLoca
-{
-NumGlyphs 1 add array/LocaArray exch def
-0 1 tabarray length 1 sub{
-dup tabarray exch get
-0 4 getinterval(loca)eq{
-tabs exch get
-exit
-}{
-pop
-}ifelse
-}for
-dup type/stringtype eq{
-0 StringToLoca pop
-}{
-0 exch
-{
-exch StringToLoca
-}forall
-pop
-}ifelse
-LocaArray{gt}.InsertionSort pop
-}bind def
-/GetWorkingString
-{
-WorkString 0
-GlyfArray GlyfStringIndex get
-putinterval
-/WorkBytes GlyfArray GlyfStringIndex get length def
-/GlyfStringIndex GlyfStringIndex 1 add def
-}bind def
-/GetWorkingBytes
-{
-/BytesToRead exch def
-WorkString 0 BytesToRead getinterval
-dup length string copy
-WorkString BytesToRead WorkBytes BytesToRead sub getinterval
-dup length string copy
-WorkString 0 3 -1 roll putinterval
-/WorkBytes WorkBytes BytesToRead sub def
-}bind def
-/GetGlyfBytes
-{
-/ToRead exch def
-WorkBytes 0 eq{
-GetWorkingString
-}if
-WorkBytes ToRead ge{
-ToRead string dup 0
-ToRead GetWorkingBytes putinterval
-}{
-ToRead string
-dup
-0
-WorkString 0 WorkBytes getinterval
-putinterval
-dup
-WorkBytes
-ToRead WorkBytes sub
-GetWorkingString
-GetWorkingBytes
-putinterval
-}ifelse
-}bind def
-/SplitGlyf
-{
-/GlyfArray exch def
-/DestArray GlyfArray length 2 mul array def
-/DestArrayIndex 0 def
-/LastLoca 0 def
-/NextLocaIndex 0 def
-/LastLocaIndex 0 def
-/GlyfStringIndex 0 def
-/WorkString maxstring string def
-/WorkBytes 0 def
-{
-LocaArray NextLocaIndex get
-LastLoca sub maxstring gt
-{
-LocaArray LastLocaIndex get LastLoca sub
-GetGlyfBytes
-DestArray DestArrayIndex 3 -1 roll put
-/DestArrayIndex DestArrayIndex 1 add def
-LocaArray LastLocaIndex get/LastLoca exch def
-}{
-/LastLocaIndex NextLocaIndex def
-/NextLocaIndex NextLocaIndex 1 add def
-NextLocaIndex NumGlyphs gt
-{
-WorkBytes
-GlyfStringIndex GlyfArray length lt{
-GlyfArray GlyfStringIndex get length
-add string dup
-0
-WorkString 0 WorkBytes getinterval
-putinterval
-dup
-WorkBytes
-GetWorkingString
-WorkString 0 WorkBytes getinterval
-putinterval
-}{
-pop
-WorkString 0 WorkBytes getinterval
-}ifelse
-dup length string copy
-DestArray DestArrayIndex 3 -1 roll put
-exit
-}if
-}ifelse
-}loop
-DestArray
-}bind def
-/ProcessTTData
-{
-.opdloadttfontdict begin
-0 1 tabarray length 1 sub{
-/ix exch def
-tabarray ix get
-12 getu32 dup maxstring le{
-dup 4 mod 0 ne{
-4 div cvi 1 add 4 mul string/newstring exch def
-/oldstring tabs ix get def
-newstring 0 oldstring putinterval
-0 1 newstring length oldstring length sub 1 sub{
-newstring exch oldstring length add 0 put
-}for
-tabs ix newstring put
-}{
-pop
-}ifelse
-}{
-dup 4 mod 0 ne{
-dup maxstring idiv maxstring mul sub
-4 idiv 1 add 4 mul string/newstring exch def
-tabs ix get
-dup length 1 sub dup/iy exch def get/oldstring exch def
-newstring 0 oldstring putinterval
-0 1 newstring length oldstring length sub 1 sub{
-newstring exch oldstring length add 0 put
-}for
-tabs ix get iy newstring put
-}{
-pop
-}ifelse
-}ifelse
-}for
-0 1 tabarray length 1 sub{
-dup tabarray exch get
-dup 12 getu32 maxstring gt{
-0 4 getinterval dup(glyf)eq{
-pop
-GetLocaType
-GetNumGlyphs
-GetSortedLoca
-dup tabs exch get
-SplitGlyf
-tabs 3 1 roll put
-}{
-(Warning, table )print print( > 64Kb\n)print
-pop
-}ifelse
-}{
-pop
-pop
-}ifelse
-}for
+/Helvetica exch definefont pop
+/Helvetica-Oblique findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding WinAnsiEncoding def
+  currentdict
 end
-}bind def
-/Makesfnts
-{
-.opdloadttfontdict begin
-0
-tabs{
-dup type/stringtype eq{
-pop
-1 add
-}{
-{
-type/stringtype eq{
-1 add
-}if
-}forall
-}ifelse
-}forall
-1 add
-/TTOffset
-TableDir length
-tabarray length 16 mul add
-def
-0
-tabarray{
-exch dup 1 add
-3 1 roll
-dup
-tabs exch get
-dup type/stringtype eq{
-length
-2 index exch
-TTOffset
-dup 3 1 roll add
-/TTOffset exch def
-8 exch putu32
-exch tabarray 3 1 roll
-put
-}{
-0 exch
-{
-dup type/stringtype eq{
-length add
-}{
-pop
-}ifelse
-}forall
-2 index exch
-TTOffset
-dup 3 1 roll add
-/TTOffset exch def
-8 exch putu32
-exch tabarray 3 1 roll
-put
-}ifelse
-}forall
-pop
-array
-dup 0
-TableDir length
-tables length add
-string
-dup 0 TableDir putinterval
-dup 12 tables putinterval
-put
-dup
-/ix 1 def
-tabs{
-dup type/stringtype eq{
-ix exch
-put dup
-/ix ix 1 add def
-}{
-{
-dup type/stringtype eq{
-ix exch put dup
-/ix ix 1 add def
-}{
-pop
-}ifelse
-}forall
-}ifelse
-}forall
-pop
+/Helvetica-Oblique exch definefont pop
+/Helvetica-Bold findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding WinAnsiEncoding def
+  currentdict
 end
-}bind def
-/MakeType42
-{
-//PDFR_DEBUG{
-(MakeType42 beg)=
-}if
-10 dict begin
-/FontName 1 index/FontName get def
-/FontType 42 def
-/FontMatrix[1 0 0 1 0 0]def
-/FontBBox 1 index/FontBBox get def
-dup/FontResource get
-dup/Encoding known{
-//PDFReader/ObtainEncoding get exec
-/Encoding get
-}{
-pop null
-}ifelse
-/PDFEncoding exch def
-/CharStrings 2 index//PDFReader/MakeTTCharStrings get exec def
-/sfnts 2 index//MakeStreamReader exec
-ReadTTF
-ProcessTTData
-Makesfnts
-def
-/Encoding StandardEncoding def
-/PaintType 0 def
-currentdict end
-//PDFR_DEBUG{
-(MakeType42 end)=
-}if
-}bind def
-/GetInstalledFont
-{
-dup//InstalledFonts exch knownget{
-exch pop
-}{
-dup findfont dup 3 1 roll
-//InstalledFonts 3 1 roll put
-}ifelse
-}bind def
-/RemoveFontNamePrefix
-{//=string cvs true
-0 1 5{
-2 index exch get//IsUpper exec not{
-pop false exit
-}if
-}for
-{(+)search{
-pop pop
-}if
-}if
-cvn
-}bind def
-/CheckFont
-{dup/Type get/Font ne{
-mark(Resource )3 index( must have /Type/Font .)//error exec
-}if
-}bind def
-/CheckEncoding
-{dup type/nametype ne{
-dup/Type get/Encoding ne{
-mark(Resource )3 index( must have /Type/Encoding .)//error exec
-}if
-}if
-}bind def
-/ObtainEncoding
-{dup/Encoding known{
-dup dup/Encoding//CheckEncoding//ResolveD exec
-dup type dup/arraytype eq exch/packedarraytype eq or{
-pop pop
-}{
-dup type/nametype eq{
-/Encoding findresource
-}{
-dup/BaseEncoding//knownget exec not{
-/StandardEncoding
-}if
-/Encoding findresource
-exch
-/Differences//knownget exec{
-exch dup length array copy exch
-0 exch
-{
-dup type/integertype eq{
-exch pop
-}{
-3 copy put pop
-1 add
-}ifelse
-}forall
-pop
-}if
-}ifelse
-/Encoding exch put
-}ifelse
-}{
-dup/Encoding/StandardEncoding/Encoding findresource put
-}ifelse
-}bind def
-/ObtainMetrics
-{dup/Widths//knownget exec{
-1 index/Encoding get
-256 dict
-3 index/Subtype get/TrueType eq{
-1000
-}{
-1
-}ifelse
-4 index/MissingWidth//knownget exec not{
-0
-}if
-5 index/FirstChar//knownget exec not{
-0
-}if
-6 5 roll
-dup 0 exch 1 exch length 1 sub{
-2 copy get
-exch 3 index add
-7 index exch get
-dup dup null ne exch/.notdef ne and{
-6 index 3 1 roll exch
-6 index div
-3 copy pop//knownget exec{
-0 eq
-}{
-true
-}ifelse
-{put
-}{
-pop pop pop
-}ifelse
-}{
-pop pop
-}ifelse
-}for
-pop pop pop pop exch pop
-1 index exch/Metrics exch put
-}{
-dup/MissingWidth//knownget exec{
-256 dict
-2 index/Encoding get{
-dup null ne{
-3 copy 3 2 roll put
-}if
-pop
-}forall
-exch pop
-1 index exch/Metrics exch put
-}if
-}ifelse
-}bind def
-/NotDef
-{
-FontMatrix aload pop pop pop exch pop exch pop
-1 exch div exch
-1 exch div exch
-1 index 0 setcharwidth
-0 setlinewidth
-0 0 moveto
-2 copy rlineto
-1 index 0 rlineto
-neg exch neg exch rlineto
-closepath stroke
-}bind def
-/SaveResourcesToStack
-{
-[
-//PDFReader/OldResources known{
-//PDFReader/OldResources get
-}{
-null
-}ifelse
-//PDFReader/CurrentObject get/Context get/Resources get
-]
-//PDFReader/OldResources 3 -1 roll put
-}bind def
-/RestoreResourcesFromStack
-{
-//PDFReader/OldResources get dup
-0 get//PDFReader/OldResources 3 -1 roll put
-1 get//PDFReader/CurrentObject get/Context get/Resources 3 -1 roll put
-}bind def
-/BuildChar
-{//PDFR_DEBUG{
-(BuildChar )print dup//=only exec( )print
-}if
-exch begin
-Encoding exch get
-//PDFR_DEBUG{
-dup =
-}if
-dup null eq{
-pop//NotDef exec
-}
-{
-CharProcs exch//knownget exec
-{
-currentfont/Font get/Resources//knownget exec{
-exec
-SaveResourcesToStack
-//PDFReader/CurrentObject get/Context get
-/Resources 3 -1 roll put
-//RunDelayedStream exec
-RestoreResourcesFromStack
-}{
-//RunDelayedStream exec
-}ifelse
-}
-{
-//NotDef exec
-}ifelse
-}ifelse
+/Helvetica-Bold exch definefont pop
+/Helvetica-BoldOblique findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding WinAnsiEncoding def
+  currentdict
 end
-}bind def
-/printdict
-{(<<)=
-{exch = ==}forall
-(>>)=
-}bind def
-/printfont
-{
-dup{
-exch dup =
-dup/Encoding eq{
-pop =
-}{
-dup/FontInfo eq exch/Private eq or{
-//printdict exec
-}{
-==
-}ifelse
-}ifelse
-}forall
-}bind def
-/ScaleMetrics
-{1 index{
-2 index div
-3 index
-3 1 roll put
-}forall
-pop
-}bind def
-/ResolveAndSetFontAux
-{exch dup
-//PDFReader/CurrentObject get/Context get/Resources get
-/Font//DoNothing//ResolveD exec
-exch//CheckFont//ResolveD exec
-dup/Font//knownget exec{
-exch pop exch pop
-}{
-{
-dup/Subtype get dup dup/Type1 eq exch/TrueType eq or exch/MMType1 eq or{
-exch pop
-dup/BaseFont get
-//RemoveFontNamePrefix exec
-//PDFR_DEBUG{
-(Font )print dup =
-}if
-1 index/FontDescriptor known{
-//PDFR_DEBUG{
-(Font from a font descriptor.)=
-}if
-1 index
-/FontDescriptor//DoNothing//ResolveD exec
-/Font//knownget exec{
-exch pop
-}{
-//PDFR_DEBUG{
-(Font descriptor has no Font resolved.)=
-}if
-//GetInstalledFont exec
-}ifelse
-}{
-//GetInstalledFont exec
-}ifelse
-exch
-dup/Encoding known not{
-1 index/Encoding get 1 index exch/Encoding exch put
-}if
-//ObtainEncoding exec
-//ObtainMetrics exec
-exch
-dup length dict copy
-dup 2 index/Encoding get
-/Encoding exch put
-1 index/Metrics//knownget exec{
-2 index/Subtype get/TrueType ne{
-1 index/FontMatrix get 0 get
-dup 0 eq{
-pop
-1 index/FontMatrix get 1 get
-dup 0 eq{pop 1}if
-}if
-0.001 div
-//ScaleMetrics exec
-}{
-1 index/sfnts known not{
-1 index/FontMatrix get 0 get
-dup 0 eq{
-pop
-1 index/FontMatrix get 1 get
-dup 0 eq{pop 1}if
-}if
-//ScaleMetrics exec
-}if
-}ifelse
-1 index exch/Metrics exch put
-}if
-1 index/BaseFont get
-exch
-dup/FID undef
-dup/UniqueID undef
-definefont
-dup 3 1 roll
-/Font exch put
-exit
-}if
-dup/Subtype get/Type3 eq{
-//ObtainEncoding exec
-2 copy exch/FontName exch put
-dup/CharProcs get//ResolveDict exec
-dup/FontType 3 put
-dup/BuildChar//BuildChar put
-dup dup/Font exch put
-dup 3 1 roll
-definefont
-2 copy ne{
-2 copy/Font exch put
-}if
-exch pop
-exit
-}if
-dup/Subtype get/Type0 eq{
-}if
-dup/Subtype get/CIDFontType0 eq{
-}if
-dup/Subtype get/CIDFontType2 eq{
-}if
-mark(Unknown font type )2 index/Subtype get//error exec
-}loop
-}ifelse
-exch scalefont setfont
-}bind def
-/ResolveAndSetFont
-{
-//ResolveAndSetFontAux exec
-}bind def
-/.knownget
-{2 copy known{
-get true
-}{
-pop pop false
-}ifelse
-}bind def
-/.min
-{2 copy lt{
-exch
-}if
-pop
-}bind def
-/.max
-{2 copy gt{
-exch
-}if
-pop
-}bind def
-/.dicttomark
-{>>
-}bind def
-/getu16{
-2 copy get 8 bitshift 3 1 roll 1 add get add
-}bind def
-/gets16{
-getu16 16#8000 xor 16#8000 sub
-}bind def
-/getu32{
-2 copy getu16 16 bitshift 3 1 roll 2 add getu16 add
-}bind def
-/gets32{
-2 copy gets16 16 bitshift 3 1 roll 2 add getu16 add
-}bind def
-/cmapformats mark
-0{
-6 256 getinterval{}forall 256 packedarray
-}bind
-2{
-/sHK_sz 2 def
-/sH_sz 8 def
-dup 2 getu16/cmapf2_tblen exch def
-dup 4 getu16/cmapf2_lang exch def
-dup 6 256 sHK_sz mul getinterval/sHKs exch def
-0
-0 1 255{
-sHKs exch
-2 mul getu16
-1 index
-1 index
-lt{exch}if pop
-}for
-/sH_len exch def
-dup 6 256 sHK_sz mul add
-cmapf2_tblen 1 index sub getinterval
-/sH_gIA exch def
-/cmapf2_glyph_array 65535 array def
-/.cmapf2_putGID{
-/cmapf2_ch cmapf2_ch_hi 8 bitshift cmapf2_ch_lo add def
-firstCode cmapf2_ch_lo le
-cmapf2_ch_lo firstCode entryCount add lt
-and{
-sH_offset idRangeOffset add
-cmapf2_ch_lo firstCode sub 2 mul
-add 6 add
-sH_gIA exch getu16
-dup 0 gt{
-idDelta add
-cmapf2_glyph_array exch cmapf2_ch exch put
-}{
-pop
-}ifelse
-}{
-}ifelse
-}def
-16#00 1 16#ff{
-/cmapf2_ch_hi exch def
-sHKs cmapf2_ch_hi sHK_sz mul getu16
-/sH_offset exch def
-sH_gIA sH_offset sH_sz getinterval
-dup 0 getu16/firstCode exch def
-dup 2 getu16/entryCount exch def
-dup 4 gets16/idDelta exch def
-dup 6 getu16/idRangeOffset exch def
-pop
-sH_offset 0 eq{
-/cmapf2_ch_lo cmapf2_ch_hi def
-/cmapf2_ch_hi 0 def
-.cmapf2_putGID
-}{
-16#00 1 16#ff{
-/cmapf2_ch_lo exch def
-.cmapf2_putGID
-}for
-}ifelse
-}for
-pop
-0 1 cmapf2_glyph_array length 1 sub{
-dup cmapf2_glyph_array exch get
-null eq{cmapf2_glyph_array exch 0 put}{pop}ifelse
-}for
-cmapf2_glyph_array
-}bind
-4{
-/etab exch def
-/nseg2 etab 6 getu16 def
-14/endc etab 2 index nseg2 getinterval def
-2 add
-nseg2 add/startc etab 2 index nseg2 getinterval def
-nseg2 add/iddelta etab 2 index nseg2 getinterval def
-nseg2 add/idroff etab 2 index nseg2 getinterval def
-pop
-/firstcode startc 0 getu16 16#ff00 and dup 16#f000 ne{pop 0}if def
-/lastcode firstcode def
-/striptopbyte false def
-/putglyph{
-glyphs code 3 -1 roll put/code code 1 add def
-}bind def
-/numcodes 0 def/glyphs 0 0 2 nseg2 3 sub{
-/i2 exch def
-/scode startc i2 getu16 def
-/ecode endc i2 getu16 def
-ecode lastcode gt{
-/lastcode ecode def
-}if
-}for pop
-firstcode 16#f000 ge lastcode firstcode sub 255 le and{
-lastcode 255 and
-/striptopbyte true def
-}{
-lastcode
-}ifelse
-1 add
-array def
-glyphs length 1024 ge{
-.array1024z 0 1024 glyphs length 1023 sub{glyphs exch 2 index putinterval}for
-glyphs dup length 1024 sub 3 -1 roll
-putinterval
-}{
-0 1 glyphs length 1 sub{glyphs exch 0 put}for
-}ifelse
-/numcodes 0 def/code 0 def
-0 2 nseg2 3 sub{
-/i2 exch def
-/scode startc i2 getu16 def
-/ecode endc i2 getu16 def
-numcodes scode firstcode sub
-exch sub 0 .max dup/code exch code exch add def
-ecode scode sub 1 add add numcodes add/numcodes exch def
-/delta iddelta i2 gets16 def
-TTFDEBUG{
-(scode=)print scode =only
-( ecode=)print ecode =only
-( delta=)print delta =only
-( droff=)print idroff i2 getu16 =
-}if
-idroff i2 getu16 dup 0 eq{
-pop scode delta add 65535 and 1 ecode delta add 65535 and
-striptopbyte{
-/code scode 255 and def
-}{
-/code scode def
-}ifelse
-{putglyph}for
-}{
-/gloff exch 14 nseg2 3 mul add 2 add i2 add add def
-striptopbyte{
-/code scode 255 and def
-}{
-/code scode def
-}ifelse
-0 1 ecode scode sub{
-2 mul gloff add etab exch getu16
-dup 0 ne{delta add 65535 and}if putglyph
-}for
-}ifelse
-}for glyphs/glyphs null def
-}bind
-6{
-dup 6 getu16/firstcode exch def dup 8 getu16/ng exch def
-firstcode ng add array
-0 1 firstcode 1 sub{2 copy 0 put pop}for
-dup firstcode ng getinterval
-0 1 ng 1 sub{
-dup 2 mul 10 add 4 index exch getu16 3 copy put pop pop
-}for pop exch pop
-}bind
-.dicttomark readonly def
-/cmaparray{
-dup 0 getu16 cmapformats exch .knownget{
-TTFDEBUG{
-(cmap: format )print 1 index 0 getu16 = flush
-}if exec
-}{
-(Can't handle format )print 0 getu16 = flush
-0 1 255{}for 256 packedarray
-}ifelse
-TTFDEBUG{
-(cmap: length=)print dup length = dup ==
-}if
-}bind def
-/postremap mark
-/Cdot/Cdotaccent
-/Edot/Edotaccent
-/Eoverdot/Edotaccent
-/Gdot/Gdotaccent
-/Ldot/Ldotaccent
-/Zdot/Zdotaccent
-/cdot/cdotaccent
-/edot/edotaccent
-/eoverdot/edotaccent
-/gdot/gdotaccent
-/ldot/ldotaccent
-/zdot/zdotaccent
-.dicttomark readonly def
-/get_from_stringarray
-{1 index type/stringtype eq{
-get
-}{
-exch{
-2 copy length ge{
-length sub
-}{
-exch get exit
-}ifelse
-}forall
-}ifelse
-}bind def
-/getinterval_from_stringarray
-{
-2 index type/stringtype eq{
-getinterval
-}{
-string exch 0
-4 3 roll{
-dup length
-dup 4 index lt{
-3 index exch sub
-exch pop 3 1 roll exch pop
-}{
-dup 3 1 roll
-4 index sub
-5 index length 4 index sub
-2 copy gt{exch}if pop
-dup 3 1 roll
-5 index exch getinterval
-5 index 4 index 3 index
-getinterval
-copy pop
-exch pop add exch pop 0 exch
-dup 3 index length ge{exit}if
-}ifelse
-}forall
-pop pop
-}ifelse
-}bind def
-/string_array_size
-{dup type/stringtype eq{
-length
-}{
-0 exch{length add}forall
-}ifelse
-}bind def
-/postformats mark
-16#00010000{
-pop MacGlyphEncoding
-}
-16#00020000{
-dup dup type/arraytype eq{0 get}if length 36 lt{
-TTFDEBUG{(post format 2.0 invalid.)= flush}if
-pop[]
-}{
-/postglyphs exch def
-/post_first postglyphs dup type/arraytype eq{0 get}if def
-post_first 32 getu16/numglyphs exch def
-/glyphnames numglyphs 2 mul 34 add def
-/postpos glyphnames def
-/total_length postglyphs//string_array_size exec def
-numglyphs array 0 1 numglyphs 1 sub{
-postpos total_length ge{
-1 numglyphs 1 sub{1 index exch/.notdef put}for
-exit
-}if
-postglyphs postpos//get_from_stringarray exec
-postglyphs postpos 1 add 2 index//getinterval_from_stringarray exec cvn
-exch postpos add 1 add/postpos exch def
-2 index 3 1 roll
-put
-}for
-/postnames exch def
-numglyphs array 0 1 numglyphs 1 sub{
-dup 2 mul 34 add postglyphs exch 2//getinterval_from_stringarray exec
-dup 0 get 8 bitshift exch 1 get add dup 258 lt{
-MacGlyphEncoding exch get
-}{
-dup 32768 ge{
-pop/.notdef
-}{
-258 sub dup postnames length ge{
-TTFDEBUG{(   *** warning: glyph index past end of 'post' table)= flush}if
-pop
-exit
-}if
-postnames exch get
-postremap 1 index .knownget{exch pop}if
-}ifelse
-}ifelse
-2 index 3 1 roll put
-}for
-}
-ifelse
-}bind
-16#00030000{
-pop[]
-}bind
-.dicttomark readonly def
-/first_post_string
-{
-post dup type/arraytype eq{0 get}if
-}bind def
-/.getpost{
-/glyphencoding post null eq{
-TTFDEBUG{(post missing)= flush}if[]
-}{
-postformats first_post_string 0 getu32 .knownget{
-TTFDEBUG{
-(post: format )print
-first_post_string
-dup 0 getu16 =only(,)print 2 getu16 = flush
-}if
-post exch exec
-}{
-TTFDEBUG{(post: unknown format )print post 0 getu32 = flush}if[]
-}ifelse
-}ifelse def
-}bind def
-/MacRomanEncoding[
-StandardEncoding 0 39 getinterval aload pop
-/quotesingle
-StandardEncoding 40 56 getinterval aload pop
-/grave
-StandardEncoding 97 31 getinterval aload pop
-/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
-/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
-/ecircumflex/edieresis/iacute/igrave
-/icircumflex/idieresis/ntilde/oacute
-/ograve/ocircumflex/odieresis/otilde
-/uacute/ugrave/ucircumflex/udieresis
-/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
-/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
-/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
-/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
-/questiondown/exclamdown/logicalnot/.notdef
-/florin/.notdef/.notdef/guillemotleft
-/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
-/endash/emdash/quotedblleft/quotedblright
-/quoteleft/quoteright/divide/.notdef
-/ydieresis/Ydieresis/fraction/currency
-/guilsinglleft/guilsinglright/fi/fl
-/daggerdbl/periodcentered/quotesinglbase/quotedblbase
-/perthousand/Acircumflex/Ecircumflex/Aacute
-/Edieresis/Egrave/Iacute/Icircumflex
-/Idieresis/Igrave/Oacute/Ocircumflex
-/.notdef/Ograve/Uacute/Ucircumflex
-/Ugrave/dotlessi/circumflex/tilde
-/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
-]/Encoding defineresource pop
-/TTParser<<
-/Pos 0
-/post null
->>def
-/readu8
-{read not{
-mark(Insufficient data in the stream.)//error exec
-}if
-}bind def
-/readu16
-{dup//readu8 exec 8 bitshift exch//readu8 exec or
-}bind def
-/reads16
-{//readu16 exec 16#8000 xor 16#8000 sub
-}bind def
-/readu32
-{dup//readu16 exec 16 bitshift exch//readu16 exec or
-}bind def
-/reads32
-{dup//reads16 exec 16 bitshift exch//readu16 exec or
-}bind def
-/SkipToPosition
-{dup//TTParser/Pos get
-exch//TTParser exch/Pos exch put
-sub
-//PDFR_DEBUG{
-(Skipping )print dup//=only exec( bytes.)=
-}if
-dup 0 eq{
-pop pop
-}{
-dup 3 1 roll
-()/SubFileDecode filter
-exch
-{1 index//BlockBuffer readstring pop length
-dup 0 eq{pop exch pop exit}if
-sub
-}loop
-0 ne{
-mark(Insufficient data in the stream for SkipToPosition.)//error exec
-}if
-}ifelse
-}bind def
-/TagBuffer 4 string def
-/ParseTTTableDirectory
-{//PDFR_DEBUG{
-(ParseTTTableDirectory beg)=
-}if
-15 dict begin
-dup//readu32 exec 16#00010000 ne{
-mark(Unknown True Type version.)//error exec
-}if
-dup//readu16 exec/NumTables exch def
-dup//readu16 exec/SearchRange exch def
-dup//readu16 exec/EntrySelector exch def
-dup//readu16 exec/RangeShift exch def
-//PDFR_DEBUG{
-(NumTables = )print NumTables =
-}if
-NumTables{
-dup//TagBuffer readstring not{
-mark(Could not read TT tag.)//error exec
-}if
-cvn
-[2 index//readu32 exec pop
-2 index//readu32 exec
-3 index//readu32 exec
-]
-//PDFR_DEBUG{
-2 copy exch//=only exec( )print ==
-}if
-def
-}repeat
-pop
-//TTParser/Pos 12 NumTables 16 mul add put
-currentdict end
-//PDFR_DEBUG{
-(ParseTTTableDirectory end)=
-}if
-}bind def
-/ParseTTcmap
-{//PDFR_DEBUG{
-(ParseTTcmap beg)=
-}if
-/cmap get aload pop
-3 1 roll
-7 dict begin
-//PDFR_DEBUG{
-(Current position = )print//TTParser/Pos get =
-(cmap position = )print dup =
-}if
-1 index exch//SkipToPosition exec
-//TTParser/Pos get/TablePos exch def
-dup//readu16 exec pop
-dup//readu16 exec/NumEncodings exch def
-//PDFR_DEBUG{
-(NumEncodings = )print NumEncodings =
-}if
-null
-NumEncodings{
-1 index//readu32 exec
-2 index//readu32 exec
-3 array dup 3 2 roll 0 exch put
-2 index null ne{
-dup 0 get 3 index 0 get sub
-3 index exch 1 exch put
-}if
-dup 4 3 roll pop 3 1 roll
-def
-}repeat
-dup 0 get
-4 3 roll exch sub
-1 exch put
-//PDFR_DEBUG{
-currentdict{
-exch dup type/integertype eq{
-//PrintHex exec( )print ==
-}{
-pop pop
-}ifelse
-}forall
-}if
-4 NumEncodings 8 mul add/HeaderLength exch def
-//TTParser/Pos//TTParser/Pos get HeaderLength add put
-0
-NumEncodings{
-16#7FFFFFF null
-currentdict{
-1 index type/integertype eq{
-exch pop dup 0 get
-dup 5 index gt{
-dup 4 index lt{
-4 1 roll
-exch pop exch pop
-}{
-pop pop
-}ifelse
-}{
-pop pop
-}ifelse
-}{
-pop pop
-}ifelse
-}forall
-//PDFR_DEBUG{
-(Obtaining subtable for )print dup ==
-}if
-3 2 roll pop
-3 copy pop
-TablePos add//SkipToPosition exec
-3 copy exch pop 1 get
-//TTParser/Pos//TTParser/Pos get 3 index add put
-string
-readstring not{
-mark(Can't read a cmap subtable.)//error exec
-}if
-2 exch put
-}repeat
-pop pop
-currentdict end
-//PDFR_DEBUG{
-(ParseTTcmap end)=
-}if
-}bind def
-/GetTTEncoding
-{//PDFR_DEBUG{
-(GetTTEncoding beg)=
-}if
-get
-exch pop
-2 get
-10 dict begin
-/TTFDEBUG//PDFR_DEBUG def
-//cmaparray exec
+/Helvetica-BoldOblique exch definefont pop
+/Times-Roman findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding WinAnsiEncoding def
+  currentdict
 end
-//PDFR_DEBUG{
-(GetTTEncoding end)=
-dup ==
-}if
-}bind def
-/InverseEncoding
-{
-256 dict begin
-dup length 1 sub -1 0{
-2 copy get
-exch
-1 index currentdict exch//knownget exec{
-dup type/arraytype eq{
-aload length 1 add array astore
-}{
-2 array astore
-}ifelse
-}if
-def
-}for
-pop
-currentdict end
-}bind def
-/GetMacRomanEncodingInverse
-{//PDFReader/MacRomanEncodingInverse get
-dup null eq{
-pop
-MacRomanEncoding//InverseEncoding exec
-dup//PDFReader exch/MacRomanEncodingInverse exch put
-}if
-}bind def
-/PutCharStringSingle
-{
-dup 3 index length lt{
-2 index exch get
-dup 0 ne{
-def
-}{
-pop pop
-}ifelse
-}{
-pop pop
-}ifelse
-}bind def
-/PutCharString
-{1 index type/nametype ne{
-mark(Bad charstring name)//error exec
-}if
-dup type/arraytype eq{
-{
-3 copy//PutCharStringSingle exec
-pop pop
-}forall
-pop
-}{
-//PutCharStringSingle exec
-}ifelse
-}bind def
-/ComposeCharStrings
-{
-//PDFR_DEBUG{
-(ComposeCharStrings beg)=
-}if
-1 index length 1 add dict begin
-/.notdef 0 def
-exch
-//TTParser/post get
-dup null ne{
-exch
-1 index length 1 sub -1 0{
-dup 3 index exch get exch
-dup 0 eq 2 index/.notdef eq or{
-pop pop
-}{
-def
-}ifelse
-}for
-}if
-exch pop exch
-{
-//PutCharString exec
-}forall
-pop
-currentdict end
-//PDFR_DEBUG{
-(ComposeCharStrings end)=
-}if
-}bind def
-/ParseTTpost
-{
-//PDFR_DEBUG{
-(ParseTTpost beg)=
-}if
-/post get aload pop
-3 1 roll
-//PDFR_DEBUG{
-(Current position = )print//TTParser/Pos get =
-(post position = )print dup =
-}if
-1 index exch//SkipToPosition exec
-//TTParser/Pos//TTParser/Pos get 4 index add put
-exch dup 65535 le{
-string
-readstring not{
-mark(Insufficient data in the stream for ParseTTpost.)//error exec
-}if
-}{
-[3 1 roll
-dup 16384 div floor cvi
-exch 1 index 16384 mul
-sub exch
-1 sub 0 1 3 -1 roll
-{
-1 add index
-16384 string readstring not{
-mark(Insufficient data in the stream for ParseTTpost.)//error exec
-}if
-}for
-counttomark -2 roll
-string readstring not{
-mark(Insufficient data in the stream for ParseTTpost.)//error exec
-}if
-]
-}ifelse
-1 dict begin
-/post exch def
-//.getpost exec
-//TTParser/post glyphencoding put
-//PDFR_DEBUG{
-(ParseTTpost end)=
-glyphencoding ==
-}if
+/Times-Roman exch definefont pop
+/Times-Italic findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding WinAnsiEncoding def
+  currentdict
 end
-}bind def
-/MakeTTCharStrings
-{//MakeStreamReader exec
-dup dup//ParseTTTableDirectory exec
-//TTParser/post null put
-dup/post//knownget exec{
-0 get
-1 index/cmap get 0 get
-lt{
-2 copy//ParseTTpost exec
-//ParseTTcmap exec
-}{
-2 copy//ParseTTcmap exec
-3 1 roll
-//ParseTTpost exec
-}ifelse
-}{
-//ParseTTcmap exec
-}ifelse
-{
-dup 16#00030001 known{
-//PDFR_DEBUG{
-(Using the TT cmap encoding for Windows Unicode.)=
-}if
-16#00030001//GetTTEncoding exec
-AdobeGlyphList//ComposeCharStrings exec
-exit
-}if
-dup 16#00010000 known{
-//PDFR_DEBUG{
-(Using the TT cmap encoding for Macintosh Roman.)=
-}if
-16#00010000//GetTTEncoding exec
-PDFEncoding dup null eq{
-pop//GetMacRomanEncodingInverse exec
-}{
-//InverseEncoding exec
-}ifelse
-//ComposeCharStrings exec
-exit
-}if
-dup 16#00030000 known{
-//PDFR_DEBUG{
-(Using the TT cmap encoding 3.0 - not sure why Ghostscript writes it since old versions.)=
-}if
-16#00030000//GetTTEncoding exec
-PDFEncoding dup null eq{
-pop//GetMacRomanEncodingInverse exec
-}{
-//InverseEncoding exec
-}ifelse
-//ComposeCharStrings exec
-exit
-}if
-mark(True Type cmap has no useful encodings.)//error exec
-}loop
-//PDFR_DEBUG{
-(CharStrings <<)=
-dup{
-exch
-dup type/nametype eq{
-//=only exec
-}{
-==
-}ifelse
-( )print ==
-}forall
-(>>)=
-}if
-}bind def
-/ScaleVal
-{
-aload pop
-1 index sub
-3 2 roll mul add
-}bind def
-/ScaleArg
-{
-aload pop
-1 index sub
-3 1 roll
-sub exch div
-}bind def
-/ScaleArgN
-{
-dup length 2 sub -2 0{
-2
-2 index 3 1 roll getinterval
-3 2 roll
-exch//ScaleArg exec
-1 index length 2 idiv 1 add 1 roll
-}for
-pop
-}bind def
-/ComputeFunction_10
-{
-//PDFR_DEBUG{
-(ComputeFunction_10 beg )print 1 index//=only exec( stack=)print count =
-}if
-exch
-dup 1 eq{
-pop dup length 1 sub get
-}{
-1 index length 1 sub mul
-dup dup floor sub
-dup 0 eq{
-pop cvi get
-}{
-3 1 roll floor cvi
-2 getinterval
-aload pop
-2 index mul 3 2 roll 1 exch sub 3 2 roll mul add
-}ifelse
-}ifelse
-//PDFR_DEBUG{
-(ComputeFunction_10 end )print dup//=only exec( stack=)print count =
-}if
-}bind def
-/ComputeFunction_n0
-{
-//PDFR_DEBUG{
-(ComputeFunction_n0 beg N=)print dup//=only exec( stack=)print count =
-}if
-dup 0 eq{
-pop
-}{
-dup 2 add -1 roll
-dup 3 index length 1 sub ge{
-pop 1 sub
-exch dup length 1 sub get exch
-//PDFReader/ComputeFunction_n0 get exec
-}{
-dup floor cvi dup
-4 index exch get
-3 index dup
-5 add copy
-6 2 roll
-pop pop pop pop
-1 sub
-//PDFReader/ComputeFunction_n0 get exec
-3 2 roll pop
-exch
-4 3 roll exch
-4 add 2 roll 1 add
-3 2 roll exch get
-exch 1 sub
-//PDFReader/ComputeFunction_n0 get exec
-1 index mul
-3 1 roll
-1 exch sub mul add
-}ifelse
-}ifelse
-//PDFR_DEBUG{
-(ComputeFunction_n0 end )print dup//=only exec( stack=)print count =
-}if
-}bind def
-/FunctionToProc_x01
-{
-dup/Domain get exch
-dup/Data get 0 get exch
-/Size get length
-[4 1 roll
-//PDFR_DEBUG{
-{(function beg, stack =)print count//=only exec(\n)print}/exec load
-5 2 roll
-}if
-dup 1 gt{
-{mark exch
-3 add 2 roll
-//ScaleArgN exec
-counttomark dup
-3 add -2 roll
-pop exch
-//ComputeFunction_n0 exec
-}/exec load
-}{
-pop
-3 1/roll load//ScaleArg/exec load
-/exch load
-//ComputeFunction_10/exec load
-}ifelse
-//PDFR_DEBUG{
-(function end, stack =)/print load/count load//=only/exec load(\n)/print load
-}if
-]cvx
-//PDFR_DEBUG{
-(Made a procedure for the 1-result function :)=
-dup ==
-}if
-}bind def
-/FunctionProcDebugBeg
-{(FunctionProcDebugBeg )print count =
-}bind def
-/FunctionProcDebugEnd
-{(FunctionProcDebugEnd )print count =
-}bind def
-/FunctionToProc_x0n
-{
-PDFR_DEBUG{
-(FunctionToProc_x0n beg m=)print dup =
-}if
-1 index/Size get length exch
-dup 7 mul 2 add array
-PDFR_DEBUG{
-dup 0//FunctionProcDebugBeg put
-}{
-dup 0//DoNothing put
-}ifelse
-dup 1/exec load put
-dup 2 5 index/Domain get put
-2 index 1 eq{
-dup 3//ScaleArg put
-}{
-dup 3//ScaleArgN put
-}ifelse
-dup 4/exec load put
-1 index 1 sub 0 exch 1 exch{
-dup 7 mul 5 add
-1 index 4 index 1 sub ne{
-dup 3 index exch 6 index put 1 add
-dup 3 index exch/copy load put 1 add
-}if
-[
-6 index/Data get 3 index get
-6 index 1 eq{
-//ComputeFunction_10/exec load
-}{
-6 index
-//ComputeFunction_n0/exec load
-}ifelse
-]cvx
-3 index exch 2 index exch put 1 add
-2 index 1 index/exec load put 1 add
-1 index 4 index 1 sub ne{
-2 index 1 index 6 index 1 add put 1 add
-2 index 1 index 1 put 1 add
-2 index 1 index/roll load put
-}if
-pop pop
-}for
-PDFR_DEBUG{
-dup dup length 2 sub//FunctionProcDebugEnd put
-}{
-dup dup length 2 sub//DoNothing put
-}ifelse
-dup dup length 1 sub/exec load put
-cvx exch pop exch pop exch pop
-//PDFR_DEBUG{
-(Made a procedure for the n-argument function :)=
-dup ==
-}if
-PDFR_DEBUG{
-(FunctionToProc_x0n end)=
-}if
-}bind def
-/MakeTableRec
-{
-0
-exec
-}bind def
-/MakeTable
-{//PDFR_DEBUG{
-(MakeTable beg )print count =
-}if
-1 index/Size get exch
-1 sub dup
-3 1 roll
-get
-array
-1 index 0 eq{
-exch pop exch pop
-}{
-dup length 1 sub -1 0{
-3 index 3 index//MakeTableRec exec
-2 index 3 1 roll put
-}for
-exch pop exch pop
-}ifelse
-//PDFR_DEBUG{
-(MakeTable end )print count =
-}if
-}bind def
-//MakeTableRec 0//MakeTable put
-/StoreSample
-{
-1 sub
-dup 0 eq{
-pop
-}{
--1 1{
-I exch get get
-}for
-}ifelse
-I 0 get 3 2 roll put
-}bind def
-/ReadSample32
-{
-4{
-File read not{
-mark(Insufficient data for function.)//error exec
-}if
-}repeat
-pop
-3 1 roll exch
-256 mul add 256 mul add
-//1_24_bitshift_1_sub div
-}bind def
-/ReadSample
-{
-Buffer BitsLeft BitsPerSample
-{2 copy ge{
-exit
-}if
-3 1 roll
-8 add 3 1 roll
-256 mul File read not{
-mark(Insufficient data for function.)//error exec
-}if
-add
-3 1 roll
-}loop
-sub dup
-2 index exch
-neg bitshift
-2 copy exch bitshift
-4 3 roll exch sub
-/Buffer exch def
-exch/BitsLeft exch def
-Div div
-}bind def
-/ReadSamplesRec
-{0
-exec
-}bind def
-/ReadSamples
-{
-//PDFR_DEBUG{
-(ReadSamples beg )print count =
-}if
-dup 1 eq{
-pop
-0 1 Size 0 get 1 sub{
-I exch 0 exch put
-0 1 M 1 sub{
-dup Range exch 2 mul 2 getinterval
-//PDFR_DEBUG{
-(Will read a sample ... )print
-}if
-BitsPerSample 32 eq{//ReadSample32}{//ReadSample}ifelse
-exec exch//ScaleVal exec
-//PDFR_DEBUG{
-(value=)print dup =
-}if
-exch Table exch get
-Size length//StoreSample exec
-}for
-}for
-}{
-1 sub
-dup Size exch get 0 exch 1 exch 1 sub{
-I exch 2 index exch put
-dup//ReadSamplesRec exec
-}for
-pop
-}ifelse
-//PDFR_DEBUG{
-(ReadSamples end )print count =
-}if
-}bind def
-//ReadSamplesRec 0//ReadSamples put
-/StreamToArray
-{//PDFR_DEBUG{
-(StreamToArray beg )print count =
-}if
-userdict/FuncDataReader get begin
-dup/BitsPerSample get/BitsPerSample exch def
-dup/Size get length/N exch def
-dup/Range get length 2 idiv/M exch def
-1 BitsPerSample bitshift 1 sub/Div exch def
-/BitsLeft 0 def
-/Buffer 0 def
-dup/Size get/Size exch def
-dup/Range get/Range exch def
-/File 1 index//MakeStreamReader exec def
-/I[N{0}repeat]def
-M array
-dup length 1 sub -1 0{
-2 index N//MakeTable exec
-2 index 3 1 roll put
-}for
-/Table exch def
-N//ReadSamples exec
-PDFR_DEBUG{
-(Table = )print Table ==
-}if
-/Data Table put
+/Times-Italic exch definefont pop
+/Times-Bold findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding WinAnsiEncoding def
+  currentdict
 end
-//PDFR_DEBUG{
-(StreamToArray end )print count =
-}if
-}bind def
-/FunctionToProc10
-{
-PDFR_DEBUG{
-(FunctionToProc10 beg, Range = )print dup/Range get ==
-}if
-dup/Order//knownget exec{
-1 ne{
-(Underimplemented function Type 0 Order 3.)=
-}if
-}if
-dup//StreamToArray exec
-dup/Range get length dup 2 eq{
-pop//FunctionToProc_x01 exec
-}{
-2 idiv//FunctionToProc_x0n exec
-}ifelse
-PDFR_DEBUG{
-(FunctionToProc10 end)=
-}if
-}bind def
-/FunctionToProc12
-{begin
-currentdict/C0//knownget exec{length 1 eq}{true}ifelse{
-N
-currentdict/C0//knownget exec{
-0 get
-}{
-0
-}ifelse
-currentdict/C1//knownget exec{
-0 get
-}{
-1
-}ifelse
-1 index sub
-[4 1 roll
-{
-4 2 roll
-exp mul add
-}aload pop
-]cvx
-}{
-[
-0 1 C0 length 1 sub{
-N
-C0 2 index get
-C1 3 index get
-4 3 roll pop
-1 index sub
-[/dup load
-5 2 roll
-{
-4 2 roll
-exp mul add
-exch
-}aload pop
-]cvx
-/exec load
-}for
-/pop load
-]cvx
-}ifelse
+/Times-Bold exch definefont pop
+/Times-BoldItalic findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding WinAnsiEncoding def
+  currentdict
 end
-//PDFR_DEBUG{
-(FunctionType2Proc : )print dup ==
-}if
-}bind def
-/FunctionToProc14
-{//MakeStreamReader exec cvx exec
-//PDFR_DEBUG{
-(FunctionType4Proc : )print dup ==
-}if
-}bind def
-/FunctionToProc1
-{
-dup/FunctionType get
-{dup 0 eq{
-pop//FunctionToProc10 exec exit
-}if
-dup 2 eq{
-pop//FunctionToProc12 exec exit
-}if
-dup 4 eq{
-pop//FunctionToProc14 exec exit
-}if
-mark exch(Function type )exch( isn't implemented yet.)//error exec
-}loop
-}bind def
-/FunctionToProc20
-{
-PDFR_DEBUG{
-(FunctionToProc20, Range = )print dup/Range get ==
-}if
-dup/Order//knownget exec{
-1 ne{
-(Underimplemented function Type 0 Order 3.)=
-}if
-}if
-dup//StreamToArray exec
-dup/Range get length dup 2 eq{
-pop//FunctionToProc_x01 exec
-}{
-2 idiv//FunctionToProc_x0n exec
-}ifelse
-}bind def
-/FunctionToProc
-{//PDFR_DEBUG{
-(FunctionToProc beg )print count =
-}if
-dup type/dicttype eq{
-dup/Domain get length 2 idiv
-{
-dup 1 eq{
-pop//FunctionToProc1 exec exit
-}if
-dup 2 eq{
-pop//FunctionToProc20 exec exit
-}if
-mark(Functions with many arguments aren't implemented yet.)//error exec
-}loop
-}{
-//PDFR_DEBUG{(Not a function dict, assume already a procedure.)print}if
-}ifelse
-//PDFR_DEBUG{
-(FunctionToProc end )print count =
-}if
-}bind def
-/spotfunctions mark
-/Round{
-abs exch abs 2 copy add 1 le{
-dup mul exch dup mul add 1 exch sub
-}{
-1 sub dup mul exch 1 sub dup mul add 1 sub
-}ifelse
-}
-/Diamond{
-abs exch abs 2 copy add .75 le{
-dup mul exch dup mul add 1 exch sub
-}{
-2 copy add 1.23 le{
-.85 mul add 1 exch sub
-}{
-1 sub dup mul exch 1 sub dup mul add 1 sub
-}ifelse
-}ifelse
-}
-/Ellipse{
-abs exch abs 2 copy 3 mul exch 4 mul add 3 sub dup 0 lt{
-pop dup mul exch .75 div dup mul add 4 div 1 exch sub
-}{
-dup 1 gt{
-pop 1 exch sub dup mul exch 1 exch sub
-.75 div dup mul add 4 div 1 sub
-}{
-.5 exch sub exch pop exch pop
-}ifelse
-}ifelse
-}
-/EllipseA{dup mul .9 mul exch dup mul add 1 exch sub}
-/InvertedEllipseA{dup mul .9 mul exch dup mul add 1 sub}
-/EllipseB{dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub}
-/EllipseC{dup mul .9 mul exch dup mul add 1 exch sub}
-/InvertedEllipseC{dup mul .9 mul exch dup mul add 1 sub}
-/Line{exch pop abs neg}
-/LineX{pop}
-/LineY{exch pop}
-/Square{abs exch abs 2 copy lt{exch}if pop neg}
-/Cross{abs exch abs 2 copy gt{exch}if pop neg}
-/Rhomboid{abs exch abs 0.9 mul add 2 div}
-/DoubleDot{2{360 mul sin 2 div exch}repeat add}
-/InvertedDoubleDot{2{360 mul sin 2 div exch}repeat add neg}
-/SimpleDot{dup mul exch dup mul add 1 exch sub}
-/InvertedSimpleDot{dup mul exch dup mul add 1 sub}
-/CosineDot{180 mul cos exch 180 mul cos add 2 div}
-/Double{exch 2 div exch 2{360 mul sin 2 div exch}repeat add}
-/InvertedDouble{
-exch 2 div exch 2{360 mul sin 2 div exch}repeat add neg
-}
-.dicttomark readonly def
-/CheckColorSpace
-{
-dup type/arraytype ne{
-mark(Resource )3 index( must be an array.)//error exec
-}if
-}bind def
-/SubstitutePDFColorSpaceRec
-{0
-exec
-}bind def
-/SubstitutePDFColorSpace
-{
-{
-dup 0 get/Pattern eq{
-dup length 1 gt{
-dup dup 1//CheckColorSpace//ResolveA exec
-dup type/nametype ne{
-//SubstitutePDFColorSpaceRec exec
-}if
-1 exch put
-}if
-exit
-}if
-dup 0 get/Indexed eq{
-exit
-}if
-dup 0 get/Separation eq{
-dup dup 2//CheckColorSpace//ResolveA exec
-dup type/nametype ne{
-//SubstitutePDFColorSpaceRec exec
-}if
-2 exch put
-exit
-}if
-dup 0 get/CalGray eq{
-1 get
-dup/Gamma//knownget exec{
-[exch[exch/exp load]cvx dup dup]
-1 index exch/DecodeLMN exch put
-}if
-[exch/CIEBasedA exch]
-exit
-}if
-dup 0 get/CalRGB eq{
-1 get
-dup/Matrix//knownget exec{
-1 index exch/MatrixLMN exch put
-}if
-dup/Gamma//knownget exec{
-aload pop
-[exch/exp load]cvx
-3 1 roll
-[exch/exp load]cvx
-3 1 roll
-[exch/exp load]cvx
-3 1 roll
-3 array astore
-1 index exch/DecodeLMN exch put
-}if
-[exch/CIEBasedABC exch]
-exit
-}if
-dup 0 get/Lab eq{
-1 get
-begin
-currentdict/Range//knownget exec{aload pop}{-100 100 -100 100}ifelse
-0 100 6 2 roll 6 array astore
-/RangeABC exch def
-/DecodeABC[{16 add 116 div}bind{500 div}bind{200 div}bind]def
-/MatrixABC[1 1 1 1 0 0 0 0 -1]def
-{dup 6 29 div ge{dup dup mul mul}{4 29 div sub 108 841 div mul}ifelse}
-/DecodeLMN[
-[3 index aload pop WhitePoint 0 get/mul load]cvx
-[4 index aload pop WhitePoint 1 get/mul load]cvx
-[5 index aload pop WhitePoint 2 get/mul load]cvx
-]def pop
-//PDFR_DEBUG{
-(Constructed from Lab <<)=
-currentdict{exch = ==}forall
-(>>)=
-}if
-[/CIEBasedABC currentdict]
+/Times-BoldItalic exch definefont pop
+/Courier findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding WinAnsiEncoding def
+  currentdict
 end
-exit
-pop
-}if
-dup 0 get/CIEBasedA eq{exit}if
-dup 0 get/CIEBasedABC eq{exit}if
-mark exch(Unimplemented color space )exch//error exec
-}loop
-}bind def
-//SubstitutePDFColorSpaceRec 0//SubstitutePDFColorSpace put
-/ResolveArrayElement
-{2 copy get
-dup type dup/arraytype eq exch
-/packedarraytype eq or{
-dup length 1 ge exch xcheck and{
-2 copy get
-dup 0 get type/integertype eq
-1 index 1 get type dup/arraytype
-eq exch
-/packedarraytype eq or
-and{
-exec
-2 index 4 1 roll put
-}{
-pop pop
-}ifelse
-}{
-pop
-}ifelse
-}{
-pop pop
-}ifelse
-}bind def
-/ResolveColorSpaceArrayRec
-{0
-exec
-}bind def
-/SetColorSpaceSafe
-{
-PDFR_DEBUG{
-(SetColorSpaceSafe beg)=
-}if
-currentcolorspace dup type/arraytype eq{
-1 index type/arraytype eq{
-dup length 2 index length eq{
-false exch
-dup length 0 exch 1 exch 1 sub{
-dup
-4 index exch get exch
-2 index exch get
-ne{
-exch pop true exch exit
-}if
-}for
-pop
-{
-setcolorspace
-}{
-pop
-}ifelse
-}{
-pop setcolorspace
-}ifelse
-}{
-pop setcolorspace
-}ifelse
-}{
-pop setcolorspace
-}ifelse
-PDFR_DEBUG{
-(SetColorSpaceSafe end)=
-}if
-}bind def
-/ResolveColorSpaceArray
-{
-//PDFR_DEBUG{
-(ResolveColorSpaceArray beg )print dup ==
-}if
-dup 0 get/Indexed eq{
-1//ResolveArrayElement exec
-dup dup 1 get
-dup type/arraytype eq{
-//SubstitutePDFColorSpace exec
-//ResolveColorSpaceArrayRec exec
-1 exch put
-}{
-pop pop
-}ifelse
-}if
-dup 0 get/Separation eq{
-dup dup 1 get UnPDFEscape 1 exch put
-3//ResolveArrayElement exec
-dup 3 get//FunctionToProc exec
-2 copy 3 exch put
-pop
-}if
-dup 0 get/Pattern eq{
-dup length 1 gt{
-dup 1 get dup type/arraytype eq{
-ResolveColorSpaceArray
-1 index 1 3 -1 roll put
-}{
-pop
-}ifelse
-}if
-}if
-PDFR_DEBUG{
-(Construcrted color space :)=
-dup ==
-}if
-//PDFR_DEBUG{
-(ResolveColorSpaceArray end )print dup ==
-}if
-}bind def
-//ResolveColorSpaceArrayRec 0//ResolveColorSpaceArray put
-/ResolveColorSpace
-{
-//PDFR_DEBUG{
-(ResolveColorSpace beg )print dup =
-}if
-dup//SimpleColorSpaceNames exch known not{
-dup//PDFColorSpaces exch//knownget exec{
-exch pop
-//PDFR_DEBUG{
-(ResolveColorSpace known )=
-}if
-}{
-dup
-//PDFReader/CurrentObject get/Context get/Resources get
-/ColorSpace//DoNothing//ResolveD exec
-exch//CheckColorSpace//ResolveD exec
-dup type/arraytype eq{
-//SubstitutePDFColorSpace exec
-//ResolveColorSpaceArray exec
-dup//PDFColorSpaces 4 2 roll put
-}if
-}ifelse
-}if
-//PDFR_DEBUG{
-(ResolveColorSpace end )print dup ==
-}if
-}bind def
-/CheckPattern
-{
-dup/PatternType//knownget exec{
-dup 1 ne{
-mark(Resource )4 index( is a shading, which can't be handled at level 2. )//error exec
-}if
-pop
-}if
-dup/Type knownget{
-/Pattern ne{
-mark(Resource )4 index( must have /Type/Pattern .)//error exec
-}if
-}if
-}bind def
-/PaintProc
-{/Context get
-//RunDelayedStream exec
-}bind def
-/ResolvePattern
-{
-dup
-userdict/PDFR_Patterns get
-exch//knownget exec{
-exch pop
-}{
-dup
-//PDFReader/CurrentObject get/Context get/Resources get
-/Pattern//DoNothing//ResolveD exec
-exch//CheckPattern//ResolveD exec
-dup dup/Context exch put
-dup/Resources//DoNothing//ResolveD exec pop
-dup/PaintProc//PaintProc put
-gsave userdict/PDFR_InitialGS get setgstate
-currentglobal exch false setglobal
-dup/Matrix get
-makepattern
-exch setglobal
-grestore
-dup userdict/PDFR_Patterns get
-4 2 roll
-put
-}ifelse
-}bind def
-/SetColor
-{//PDFR_DEBUG{
-(SetColor beg)=
-}if
-currentcolorspace dup type/nametype eq{
-pop setcolor
-}{
-0 get/Pattern eq{
-//ResolvePattern exec setpattern
-}{
-setcolor
-}ifelse
-}ifelse
-//PDFR_DEBUG{
-(SetColor end)=
-}if
-}bind def
-/ImageKeys 15 dict begin
-/BPC/BitsPerComponent def
-/CS/ColorSpace def
-/D/Decode def
-/DP/DecodeParms def
-/F/Filter def
-/H/Height def
-/IM/ImageMask def
-/I/Interpolate def
-/W/Width def
-currentdict end readonly def
-/ImageValues 15 dict begin
-/G/DeviceGray def
-/RGB/DeviceRGB def
-/CMYK/DeviceCMYK def
-/I/Indexed def
-/AHx/ASCIIHexDecode def
-/A85/ASCII85Decode def
-/LZW/LZWDecode def
-/Fl/FlateDecode def
-/RL/RunLengthDecode def
-/CCF/CCITTFaxDecode def
-/DCT/DCTDecode def
-currentdict end readonly def
-/GetColorSpaceRange
-{2 index/ColorSpace get
-dup type/arraytype eq{
-1 get
-}if
-exch//knownget exec{
-exch pop
-}if
-}bind def
-/DecodeArrays 15 dict begin
-/DeviceGray{[0 1]}def
-/DeviceRGB{[0 1 0 1 0 1]}def
-/DeviceCMYK{[0 1 0 1 0 1 0 1]}def
-/Indexed{
-dup/BitsPerComponent get 1 exch bitshift 1 sub[exch 0 exch]
-}def
-/Separation{[0 1]}def
-/CIEBasedA{[0 1]/RangeA//GetColorSpaceRange exec}def
-/CIEBasedABC{[0 1 0 1 0 1]/RangeABC//GetColorSpaceRange exec}def
-currentdict end readonly def
-/Substitute
-{1 index//knownget exec{
-exch pop
-}if
-}bind def
-/DebugImagePrinting
-{
-//PDFR_DEBUG{
-(Image :)=
-dup{exch//=only exec( )print ==
-}forall
-}if
-}bind def
-/CompleteImage
-{
-dup/ColorSpace known{
-dup/ColorSpace//CheckColorSpace//ResolveD exec pop
-}if
-dup/Decode known not{
-dup/ColorSpace//knownget exec{
-dup type/arraytype eq{
-0 get
-}if
-//DecodeArrays exch get exec
-}{
-[0 1]
-}ifelse
-1 index exch/Decode exch put
-}if
-dup/ImageMatrix[2 index/Width get 0 0 5 index/Height get neg
-0 7 index/Height get]put
-//DebugImagePrinting exec
-}bind def
-/CompleteInlineImage
-{
-//PDFR_DEBUG{
-(CompleteInlineImage beg)=
-}if
-dup/ImageType known not{
-dup/ImageType 1 put
-}if
-dup length dict exch{
-exch//ImageKeys//Substitute exec
-dup/Filter eq{
-exch//ImageValues//Substitute exec exch
-}if
-dup/ColorSpace eq{
-exch
-dup//ImageValues exch//knownget exec{
-exch pop
-}{
-//ResolveColorSpace exec
-}ifelse
-exch
-}if
-exch
-2 index 3 1 roll put
-}forall
-//CompleteImage exec
-dup/DataSource 2 copy get
-2 index//AppendFilters exec put
-//PDFR_DEBUG{
-(CompleteInlineImage end)=
-}if
-}bind def
-/CompleteOutlineImage
-{
-currentglobal exch dup gcheck setglobal
-//PDFR_DEBUG{
-(CompleteOutlineImage beg)=
-}if
-dup dup//MakeStreamReader exec/DataSource exch put
-dup/ImageType known not{
-//CompleteImage exec
-dup/ImageType 1 put
-dup/ColorSpace known{
-dup/ColorSpace//CheckColorSpace//ResolveD exec
-dup type/arraytype eq{
-//ResolveColorSpaceArray exec
-//SubstitutePDFColorSpace exec
-1 index exch/ColorSpace exch put
-}{
-pop
-}ifelse
-}if
-}if
-//PDFR_DEBUG{
-(CompleteOutlineImage end)=
-}if
-exch setglobal
-}bind def
-/DoImage
-{
-//PDFR_DEBUG{
-(DoImage beg)=
-}if
-gsave
-dup/ColorSpace//knownget exec{setcolorspace}if
-dup/ImageMask//knownget exec not{false}if
-{imagemask}{image}ifelse
-grestore
-//PDFR_DEBUG{
-(DoImage end)=
-}if
-}bind def
-/GSave
-{
-gsave
-//PDFReader/GraphicStateStackPointer get
-dup//GraphicStateStack exch get null eq{
-dup//GraphicStateStack exch//InitialGraphicState length dict put
-}if
-dup//GraphicStateStack exch get
-//GraphicState exch copy pop
-1 add//PDFReader exch/GraphicStateStackPointer exch put
-}bind def
-/GRestore
-{
-grestore
-//PDFReader/GraphicStateStackPointer get
-1 sub dup
-//PDFReader exch/GraphicStateStackPointer exch put
-//GraphicStateStack exch get
-//GraphicState copy pop
-}bind def
-/SetFont
-{dup//GraphicState exch/FontSize exch put
-//ResolveAndSetFont exec
-//GraphicState/FontMatrixNonHV currentfont/FontMatrix get 1 get 0 ne put
-}bind def
-/ShowText
-{//GraphicState/TextRenderingMode get 0 eq{
-//GraphicState/WordSpacing get 0
-32
-//GraphicState/CharacterSpacing get 0
-6 5 roll
-//GraphicState/FontMatrixNonHV get{
-[
-7 -2 roll pop
-5 -2 roll pop
-5 -1 roll
-{
-exch
-pop
-3 index add
-exch 2 index eq{3 index add}if
-4 1 roll
-}
-currentfont/FontMatrix get 0 get 0 ne{
-1 1 index length 1 sub getinterval cvx
-}if
-5 index
-cshow
-pop pop pop]
-xshow
-}{
-awidthshow
-}ifelse
-}{
-//GraphicState/CharacterSpacing get 0 eq
-//GraphicState/FontMatrixNonHV get not and
-//GraphicState/WordSpacing get 0 eq and{
-true charpath
-}{
-{
-exch
-pop 0
-currentpoint 5 4 roll
-( )dup 0 3 index put true charpath
-5 1 roll
-moveto rmoveto
-//GraphicState/CharacterSpacing get 0 rmoveto
-32 eq{
-//GraphicState/WordSpacing get 0 rmoveto
-}if
-}
-//GraphicState/FontMatrixNonHV get dup not exch{
-pop currentfont/FontMatrix get 0 get 0 ne
-}if{
-1 1 index length 1 sub getinterval cvx
-}if
-exch cshow
-}ifelse
-}ifelse
-}bind def
-/ShowTextBeg
-{//GraphicState/TextRenderingMode get 0 ne{
-currentpoint newpath moveto
-}if
-}bind def
-/ShowTextEnd
-{//GraphicState/TextRenderingMode get
-{dup 1 eq{
-stroke exit
-}if
-dup 2 eq{
-gsave fill grestore stroke exit
-}if
-dup 3 eq{
-currentpoint newpath moveto
-}if
-dup 4 eq{
-gsave fill grestore clip exit
-}if
-dup 5 eq{
-gsave stroke grestore clip exit
-}if
-dup 6 eq{
-gsave fill grestore gsave stroke grestore fill exit
-}if
-dup 7 eq{
-clip exit
-}if
-exit
-}loop
-pop
-}bind def
-/ShowTextWithGlyphPositioning
-{//ShowTextBeg exec
-{dup type/stringtype eq{
-//ShowText exec
-}{
-neg 1000 div//GraphicState/FontSize get mul 0 rmoveto
-}ifelse
-}forall
-//ShowTextEnd exec
-}bind def
-/CheckFont
-{dup/Type get/ExtGState ne{
-mark(Resource )3 index( must have /Type/ExtGState.)//error exec
-}if
-}bind def
-/SetTransfer
-{
-//PDFR_DEBUG{(SetTransfer beg )print count =}if
-dup type/arraytype eq 1 index xcheck not and{
-0 4 getinterval aload pop
-setcolortransfer
-}{
-settransfer
-}ifelse
-//PDFR_DEBUG{(SetTransfer end )print count =}if
-}bind def
-/CheckExtGState
-{dup/Type get/ExtGState ne{
-mark(Resource )3 index( must have /Type/ExtGState.)//error exec
-}if
-}bind def
-/CheckHalftone
-{dup/HalftoneType known not{
-mark(Resource )3 index( must have /HalftoneType.)//error exec
-}if
-}bind def
-/ResolveFunction
-{
-//PDFR_DEBUG{(ResolveFunction beg )print dup = count =}if
-2 copy get//IsObjRef exec{
-2 copy//DoNothing//ResolveD exec
-3 copy put pop
-}if
-2 copy get dup type/arraytype eq exch xcheck and not{
-2 copy get
-dup type/arraytype eq 1 index xcheck not and{
-dup length 1 sub -1 0{
-2 copy//DoNothing ResolveA
-dup/Identity eq{
-pop 2 copy{}put
-}{
-//FunctionToProc exec
-3 copy put pop
-}ifelse
-pop
-}for
-}{
-dup/Default eq{
-}{
-dup/Identity eq{
-pop{}
-}{dup type/nametype eq{
-//spotfunctions exch get
-}{
-//FunctionToProc exec
-}ifelse
-}ifelse
-}ifelse
-}ifelse
-3 copy put
-exch pop
-}{
-1 index exch get
-}ifelse
-//PDFR_DEBUG{(ResolveFunction end )print dup == count =}if
-}bind def
-/ResolveFunctionSafe
-{2 copy known{
-//ResolveFunction exec
-}if
-pop
-}bind def
-/CreateHalftoneThresholds
-{
-dup/Thresholds known not{
-dup/HalftoneType get 10 eq{
-dup dup//MakeStreamReader exec
-/Thresholds exch put
-}if
-dup/HalftoneType get dup 3 eq exch 6 eq or{
-dup dup//MakeStreamReader exec
-//BlockBuffer readstring pop
-dup length
-dup 0 eq{
-mark(Could not read Thresholds)//error exec
-}if
-string copy/Thresholds exch put
-dup/HalftoneType 3 put
-}if
-}if
-}bind def
-/SetExtGState
-{
-//PDFReader/CurrentObject get/Context get/Resources get
-/ExtGState//DoNothing//ResolveD exec
-exch//CheckExtGState//ResolveD exec
-dup/LW//knownget exec{
-setlinewidth
-}if
-dup/LC//knownget exec{
-setlinecap
-}if
-dup/LJ//knownget exec{
-setlinejoin
-}if
-dup/ML//knownget exec{
-setmeterlimit
-}if
-dup/D//knownget exec{
-setdash
-}if
-dup/RI//knownget exec{
-mark(Unimplemented ExtGState.RI)//error exec
-}if
-dup/OP//knownget exec{
-setoverprint
-}if
-dup/op//knownget exec{
-setoverprint
-}if
-dup/OPM//knownget exec{
-mark(Unimplemented ExtGState.OPM)//error exec
-}if
-dup/Font//knownget exec{
-mark(Unimplemented ExtGState.Font)//error exec
-}if
-dup/BG known{
-/BG//ResolveFunction exec
-setblackgeneration
-}if
-dup/BG2 known{
-/BG2//ResolveFunction exec
-dup/Default eq{
-//InitialExtGState/BG2 get
-}if
-setblackgeneration
-}if
-dup/UCR known{
-/UCR//ResolveFunction exec
-setundercolorremoval
-}if
-dup/UCR2 known{
-/UCR2//ResolveFunction exec
-dup/Default eq{
-//InitialExtGState/UCR2 get
-}if
-setundercolorremoval
-}if
-dup/TR known{
-/TR//ResolveFunction exec
-//SetTransfer exec
-}if
-dup/TR2 known{
-/TR2//ResolveFunction exec
-dup/Default eq{
-pop//InitialExtGState/TR2 get
-aload pop setcolortransfer
-}{
-//SetTransfer exec
-}ifelse
-}if
-dup/HT//knownget exec{
-dup/Default eq{
-pop//InitialExtGState/HT get
-sethalftone
-}{
-//PDFR_DEBUG{(Ht beg)=}if
-pop dup/HT//CheckHalftone//ResolveD exec
-/SpotFunction//ResolveFunctionSafe exec
-/TransferFunction//ResolveFunctionSafe exec
-null exch
-dup/HalftoneType get dup 5 eq exch dup 4 eq exch 2 eq or or{
-dup{
-dup//IsObjRef exec{
-pop
-1 index exch//CheckHalftone ResolveD
-}if
-dup type/dicttype eq{
-dup/SpotFunction//ResolveFunctionSafe exec
-/TransferFunction//ResolveFunctionSafe exec
-//CreateHalftoneThresholds exec
-dup/HalftoneType get 5 gt{
-4 3 roll pop
-dup 4 1 roll
-}if
-}if
-pop pop
-}forall
-}if
-//CreateHalftoneThresholds exec
-//PDFR_DEBUG{
-(HT:)=
-dup{
-1 index/Default eq{
-(Default <<)=
-exch pop
-{exch = ==}forall
-(>>)=
-}{
-exch = ==
-}ifelse
-}forall
-(HT end)= flush
-}if
-exch dup null ne{
-(Warning: Ignoring a halftone with a Level 3 component halftone Type )print dup/HalftoneType get =
-pop pop
-}{
-pop
-dup/HalftoneType get 5 gt{
-(Warning: Ignoring a Level 3 halftone Type )print dup/HalftoneType get =
-pop
-}{
-sethalftone
-}ifelse
-}ifelse
-//PDFR_DEBUG{(HT set)= flush}if
-}ifelse
-}if
-dup/FL//knownget exec{
-setflattness
-}if
-dup/SM//knownget exec{
-setsmoothness
-}if
-dup/SA//knownget exec{
-setstrokeadjust
-}if
-dup/BM//knownget exec{
-mark(Unimplemented ExtGState.BM)//error exec
-}if
-dup/SMask//knownget exec{
-mark(Unimplemented ExtGState.SMask)//error exec
-}if
-dup/CA//knownget exec{
-mark(Unimplemented ExtGState.CA)//error exec
-}if
-dup/ca//knownget exec{
-mark(Unimplemented ExtGState.ca)//error exec
-}if
-dup/AIS//knownget exec{
-mark(Unimplemented ExtGState.AIS)//error exec
-}if
-dup/TK//knownget exec{
-mark(Unimplemented ExtGState.TK)//error exec
-}if
-pop
-}bind def
-/CheckXObject
-{dup/Subtype get dup/Image ne exch dup/Form ne exch/PS ne and and{
-mark(Resource )3 index( must have /Subtype /Image or /Form or /PS.)//error exec
-}if
-}bind def
-/DoXObject
-{
-//PDFReader/CurrentObject get/Context get/Resources get
-/XObject//DoNothing//ResolveD exec
-exch//CheckXObject//ResolveD exec
-dup/Subtype get
-dup/Image eq{
-pop
-//CompleteOutlineImage exec
-//DoImage exec
-}{
-dup/PS eq{
-PDFR_DEBUG{
-(Executing a PS Xobject)=
-}if
-pop
-//RunDelayedStream exec
-}{
-dup/Form eq{
-pop
-PDFR_DEBUG{
-(Executing a Form XObject)=
-}if
-//PDFReader/CurrentObject get exch
-dup//PDFReader exch<< exch/Context exch >>/CurrentObject exch put
-dup/Matrix get concat
-dup/BBox get aload pop exch 3 index sub exch 2 index sub rectclip
-//RunDelayedStream exec
-//PDFReader exch/CurrentObject exch put
-}{
-mark exch(unimplemented XObject type )exch//error exec
-}ifelse
-}ifelse
-}ifelse
-}bind def
-/Operators 50 dict begin
-/q{//GSave exec}bind def
-/Q{//GRestore exec}bind def
-/cm{//TempMatrix astore concat}bind def
-/i{1 .min setflat}bind def
-/J/setlinecap load def
-/d/setdash load def
-/j/setlinejoin load def
-/w/setlinewidth load def
-/M/setmiterlimit load def
-/gs{SetExtGState}bind def
-/g/setgray load def
-/rg/setrgbcolor load def
-/k/setcmykcolor load def
-/cs{//ResolveColorSpace exec//SetColorSpaceSafe exec
-}bind def
-/sc/setcolor load def
-/scn{//SetColor exec}bind def
-/G/setgray load def
-/RG/setrgbcolor load def
-/K/setcmykcolor load def
-/CS//cs def
-/ri{SetColorRenderingIntent}bind def
-/SC/setcolor load def
-/SCN{//SetColor exec}bind def
-/m/moveto load def
-/l/lineto load def
-/c/curveto load def
-/v{currentpoint 6 2 roll curveto}bind def
-/y{2 copy curveto}bind def
-/re{
-4 2 roll moveto exch dup 0 rlineto 0 3 -1 roll rlineto neg 0 rlineto
-closepath
-}def
-/h/closepath load def
-/n/newpath load def
-/S/stroke load def
-/s{closepath stroke}bind def
-/f/fill load def
-/f*/eofill load def
-/B{gsave fill grestore stroke}bind def
-/b{closepath gsave fill grestore stroke}bind def
-/B*{gsave eofill grestore stroke}bind def
-/b*{closepath gsave eofill grestore stroke}bind def
-/W/clip load def
-/W*/eoclip load def
-/sh{
-ResolveShading
-dup/Background known{
-gsave
-dup/ColorSpace get setcolorspace
-dup/Background get aload pop setcolor
-pathbbox
-2 index sub exch 3 index sub exch
-rectfill
-grestore
-}if
-shfill
-}bind def
-/Do{//DoXObject exec}bind def
-/BI{currentglobal false setglobal<<}bind def
-/ID{>>
-dup/DataSource currentfile
-2 index/F//knownget exec{
-/A85 eq{
-0(~>)/SubFileDecode filter
-}if
-}if
-put
-//CompleteInlineImage exec
-exch setglobal
-//DoImage exec
-}bind def
-/EI{}bind def
-/BT{gsave//GraphicState/InitialTextMatrix get currentmatrix pop}bind def
-/ET{grestore}bind def
-/Tc{//GraphicState exch/CharacterSpacing exch put}bind def
-/TL{//GraphicState exch/TextLeading exch put}bind def
-/Tr{//GraphicState exch/TextRenderingMode exch put}bind def
-/Ts{
-mark(Unimplemented SetTextRise)//error exec
-}bind def
-/Tw{//GraphicState exch/WordSpacing exch put}bind def
-/Tz{
-mark(Unimplemented SetHorizontalTextScaling)//error exec
-}bind def
-/Td{translate 0 0 moveto}bind def
-/TD{dup neg//TL exec//Td exec}bind def
-/Tm{//GraphicState/InitialTextMatrix get setmatrix
-//TempMatrix astore concat
-0 0 moveto}bind def
-/T*{0//GraphicState/TextLeading get neg//Td exec}bind def
-/Tj{//ShowTextBeg exec//ShowText exec//ShowTextEnd exec}bind def
-/'{//T* exec//ShowText exec//ShowTextEnd exec}bind def
-/"{3 2 roll//Tw exec exch//Tc exec//' exec}bind def
-/TJ//ShowTextWithGlyphPositioning def
-/Tf//SetFont def
-/d0/setcharwidth load def
-/d1/setcachedevice load def
-/BDC{pop pop}bind def
-/BMC{pop}bind def
-/EMC{}bind def
-/BX{BeginCompatibilitySection}bind def
-/EX{EndCompatibilitySection}bind def
-/DP{DefineMarkedContentPointWithPropertyList}bind def
-/MP{DefineMarkedContentPoint}bind def
-/PS{cvx exec}bind def
-currentdict end def
-//PDFR_STREAM{
-//Operators length dict begin
-//Operators{
-exch dup
-[exch//=only/exec load
-( )/print load
-8 7 roll
-dup type/arraytype eq{
-/exec load
-}if
-( )/print load
-]cvx
-def
-}forall
-currentdict end/Operators exch def
-}if
-/.registerencoding
-{pop pop
-}bind def
-/.defineencoding
-{def
-}bind def
-/.findencoding
-{load
-}bind def
-/currentglobal where
-{pop currentglobal{setglobal}true setglobal}
-{{}}
-ifelse
-/MacRomanEncoding
-StandardEncoding 0 39 getinterval aload pop
-/quotesingle
-StandardEncoding 40 56 getinterval aload pop
-/grave
-StandardEncoding 97 31 getinterval aload pop
-/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
-/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
-/ecircumflex/edieresis/iacute/igrave
-/icircumflex/idieresis/ntilde/oacute
-/ograve/ocircumflex/odieresis/otilde
-/uacute/ugrave/ucircumflex/udieresis
-/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
-/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
-/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
-/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
-/questiondown/exclamdown/logicalnot/.notdef
-/florin/.notdef/.notdef/guillemotleft
-/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
-/endash/emdash/quotedblleft/quotedblright
-/quoteleft/quoteright/divide/.notdef
-/ydieresis/Ydieresis/fraction/currency
-/guilsinglleft/guilsinglright/fi/fl
-/daggerdbl/periodcentered/quotesinglbase/quotedblbase
-/perthousand/Acircumflex/Ecircumflex/Aacute
-/Edieresis/Egrave/Iacute/Icircumflex
-/Idieresis/Igrave/Oacute/Ocircumflex
-/.notdef/Ograve/Uacute/Ucircumflex
-/Ugrave/dotlessi/circumflex/tilde
-/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
-256 packedarray
-5 1 index .registerencoding
-.defineencoding
-exec
-/AdobeGlyphList mark
-/A 16#0041
-/AE 16#00c6
-/AEacute 16#01fc
-/AEmacron 16#01e2
-/AEsmall 16#f7e6
-/Aacute 16#00c1
-/Aacutesmall 16#f7e1
-/Abreve 16#0102
-/Abreveacute 16#1eae
-/Abrevecyrillic 16#04d0
-/Abrevedotbelow 16#1eb6
-/Abrevegrave 16#1eb0
-/Abrevehookabove 16#1eb2
-/Abrevetilde 16#1eb4
-/Acaron 16#01cd
-/Acircle 16#24b6
-/Acircumflex 16#00c2
-/Acircumflexacute 16#1ea4
-/Acircumflexdotbelow 16#1eac
-/Acircumflexgrave 16#1ea6
-/Acircumflexhookabove 16#1ea8
-/Acircumflexsmall 16#f7e2
-/Acircumflextilde 16#1eaa
-/Acute 16#f6c9
-/Acutesmall 16#f7b4
-/Acyrillic 16#0410
-/Adblgrave 16#0200
-/Adieresis 16#00c4
-/Adieresiscyrillic 16#04d2
-/Adieresismacron 16#01de
-/Adieresissmall 16#f7e4
-/Adotbelow 16#1ea0
-/Adotmacron 16#01e0
-/Agrave 16#00c0
-/Agravesmall 16#f7e0
-/Ahookabove 16#1ea2
-/Aiecyrillic 16#04d4
-/Ainvertedbreve 16#0202
-/Alpha 16#0391
-/Alphatonos 16#0386
-/Amacron 16#0100
-/Amonospace 16#ff21
-/Aogonek 16#0104
-/Aring 16#00c5
-/Aringacute 16#01fa
-/Aringbelow 16#1e00
-/Aringsmall 16#f7e5
-/Asmall 16#f761
-/Atilde 16#00c3
-/Atildesmall 16#f7e3
-/Aybarmenian 16#0531
-/B 16#0042
-/Bcircle 16#24b7
-/Bdotaccent 16#1e02
-/Bdotbelow 16#1e04
-/Becyrillic 16#0411
-/Benarmenian 16#0532
-/Beta 16#0392
-/Bhook 16#0181
-/Blinebelow 16#1e06
-/Bmonospace 16#ff22
-/Brevesmall 16#f6f4
-/Bsmall 16#f762
-/Btopbar 16#0182
-/C 16#0043
-/Caarmenian 16#053e
-/Cacute 16#0106
-/Caron 16#f6ca
-/Caronsmall 16#f6f5
-/Ccaron 16#010c
-/Ccedilla 16#00c7
-/Ccedillaacute 16#1e08
-/Ccedillasmall 16#f7e7
-/Ccircle 16#24b8
-/Ccircumflex 16#0108
-/Cdot 16#010a
-/Cdotaccent 16#010a
-/Cedillasmall 16#f7b8
-/Chaarmenian 16#0549
-/Cheabkhasiancyrillic 16#04bc
-/Checyrillic 16#0427
-/Chedescenderabkhasiancyrillic 16#04be
-/Chedescendercyrillic 16#04b6
-/Chedieresiscyrillic 16#04f4
-/Cheharmenian 16#0543
-/Chekhakassiancyrillic 16#04cb
-/Cheverticalstrokecyrillic 16#04b8
-/Chi 16#03a7
-/Chook 16#0187
-/Circumflexsmall 16#f6f6
-/Cmonospace 16#ff23
-/Coarmenian 16#0551
-/Csmall 16#f763
-/D 16#0044
-/DZ 16#01f1
-/DZcaron 16#01c4
-/Daarmenian 16#0534
-/Dafrican 16#0189
-/Dcaron 16#010e
-/Dcedilla 16#1e10
-/Dcircle 16#24b9
-/Dcircumflexbelow 16#1e12
-/Dcroat 16#0110
-/Ddotaccent 16#1e0a
-/Ddotbelow 16#1e0c
-/Decyrillic 16#0414
-/Deicoptic 16#03ee
-/Delta 16#2206
-/Deltagreek 16#0394
-/Dhook 16#018a
-/Dieresis 16#f6cb
-/DieresisAcute 16#f6cc
-/DieresisGrave 16#f6cd
-/Dieresissmall 16#f7a8
-/Digammagreek 16#03dc
-/Djecyrillic 16#0402
-/Dlinebelow 16#1e0e
-/Dmonospace 16#ff24
-/Dotaccentsmall 16#f6f7
-/Dslash 16#0110
-/Dsmall 16#f764
-/Dtopbar 16#018b
-/Dz 16#01f2
-/Dzcaron 16#01c5
-/Dzeabkhasiancyrillic 16#04e0
-/Dzecyrillic 16#0405
-/Dzhecyrillic 16#040f
-/E 16#0045
-/Eacute 16#00c9
-/Eacutesmall 16#f7e9
-/Ebreve 16#0114
-/Ecaron 16#011a
-/Ecedillabreve 16#1e1c
-/Echarmenian 16#0535
-/Ecircle 16#24ba
-/Ecircumflex 16#00ca
-/Ecircumflexacute 16#1ebe
-/Ecircumflexbelow 16#1e18
-/Ecircumflexdotbelow 16#1ec6
-/Ecircumflexgrave 16#1ec0
-/Ecircumflexhookabove 16#1ec2
-/Ecircumflexsmall 16#f7ea
-/Ecircumflextilde 16#1ec4
-/Ecyrillic 16#0404
-/Edblgrave 16#0204
-/Edieresis 16#00cb
-/Edieresissmall 16#f7eb
-/Edot 16#0116
-/Edotaccent 16#0116
-/Edotbelow 16#1eb8
-/Efcyrillic 16#0424
-/Egrave 16#00c8
-/Egravesmall 16#f7e8
-/Eharmenian 16#0537
-/Ehookabove 16#1eba
-/Eightroman 16#2167
-/Einvertedbreve 16#0206
-/Eiotifiedcyrillic 16#0464
-/Elcyrillic 16#041b
-/Elevenroman 16#216a
-/Emacron 16#0112
-/Emacronacute 16#1e16
-/Emacrongrave 16#1e14
-/Emcyrillic 16#041c
-/Emonospace 16#ff25
-/Encyrillic 16#041d
-/Endescendercyrillic 16#04a2
-/Eng 16#014a
-/Enghecyrillic 16#04a4
-/Enhookcyrillic 16#04c7
-/Eogonek 16#0118
-/Eopen 16#0190
-/Epsilon 16#0395
-/Epsilontonos 16#0388
-/Ercyrillic 16#0420
-/Ereversed 16#018e
-/Ereversedcyrillic 16#042d
-/Escyrillic 16#0421
-/Esdescendercyrillic 16#04aa
-/Esh 16#01a9
-/Esmall 16#f765
-/Eta 16#0397
-/Etarmenian 16#0538
-/Etatonos 16#0389
-/Eth 16#00d0
-/Ethsmall 16#f7f0
-/Etilde 16#1ebc
-/Etildebelow 16#1e1a
-/Euro 16#20ac
-/Ezh 16#01b7
-/Ezhcaron 16#01ee
-/Ezhreversed 16#01b8
-/F 16#0046
-/Fcircle 16#24bb
-/Fdotaccent 16#1e1e
-/Feharmenian 16#0556
-/Feicoptic 16#03e4
-/Fhook 16#0191
-/Fitacyrillic 16#0472
-/Fiveroman 16#2164
-/Fmonospace 16#ff26
-/Fourroman 16#2163
-/Fsmall 16#f766
-/G 16#0047
-/GBsquare 16#3387
-/Gacute 16#01f4
-/Gamma 16#0393
-/Gammaafrican 16#0194
-/Gangiacoptic 16#03ea
-/Gbreve 16#011e
-/Gcaron 16#01e6
-/Gcedilla 16#0122
-/Gcircle 16#24bc
-/Gcircumflex 16#011c
-/Gcommaaccent 16#0122
-/Gdot 16#0120
-/Gdotaccent 16#0120
-/Gecyrillic 16#0413
-/Ghadarmenian 16#0542
-/Ghemiddlehookcyrillic 16#0494
-/Ghestrokecyrillic 16#0492
-/Gheupturncyrillic 16#0490
-/Ghook 16#0193
-/Gimarmenian 16#0533
-/Gjecyrillic 16#0403
-/Gmacron 16#1e20
-/Gmonospace 16#ff27
-/Grave 16#f6ce
-/Gravesmall 16#f760
-/Gsmall 16#f767
-/Gsmallhook 16#029b
-/Gstroke 16#01e4
-/H 16#0048
-/H18533 16#25cf
-/H18543 16#25aa
-/H18551 16#25ab
-/H22073 16#25a1
-/HPsquare 16#33cb
-/Haabkhasiancyrillic 16#04a8
-/Hadescendercyrillic 16#04b2
-/Hardsigncyrillic 16#042a
-/Hbar 16#0126
-/Hbrevebelow 16#1e2a
-/Hcedilla 16#1e28
-/Hcircle 16#24bd
-/Hcircumflex 16#0124
-/Hdieresis 16#1e26
-/Hdotaccent 16#1e22
-/Hdotbelow 16#1e24
-/Hmonospace 16#ff28
-/Hoarmenian 16#0540
-/Horicoptic 16#03e8
-/Hsmall 16#f768
-/Hungarumlaut 16#f6cf
-/Hungarumlautsmall 16#f6f8
-/Hzsquare 16#3390
-/I 16#0049
-/IAcyrillic 16#042f
-/IJ 16#0132
-/IUcyrillic 16#042e
-/Iacute 16#00cd
-/Iacutesmall 16#f7ed
-/Ibreve 16#012c
-/Icaron 16#01cf
-/Icircle 16#24be
-/Icircumflex 16#00ce
-/Icircumflexsmall 16#f7ee
-/Icyrillic 16#0406
-/Idblgrave 16#0208
-/Idieresis 16#00cf
-/Idieresisacute 16#1e2e
-/Idieresiscyrillic 16#04e4
-/Idieresissmall 16#f7ef
-/Idot 16#0130
-/Idotaccent 16#0130
-/Idotbelow 16#1eca
-/Iebrevecyrillic 16#04d6
-/Iecyrillic 16#0415
-/Ifraktur 16#2111
-/Igrave 16#00cc
-/Igravesmall 16#f7ec
-/Ihookabove 16#1ec8
-/Iicyrillic 16#0418
-/Iinvertedbreve 16#020a
-/Iishortcyrillic 16#0419
-/Imacron 16#012a
-/Imacroncyrillic 16#04e2
-/Imonospace 16#ff29
-/Iniarmenian 16#053b
-/Iocyrillic 16#0401
-/Iogonek 16#012e
-/Iota 16#0399
-/Iotaafrican 16#0196
-/Iotadieresis 16#03aa
-/Iotatonos 16#038a
-/Ismall 16#f769
-/Istroke 16#0197
-/Itilde 16#0128
-/Itildebelow 16#1e2c
-/Izhitsacyrillic 16#0474
-/Izhitsadblgravecyrillic 16#0476
-/J 16#004a
-/Jaarmenian 16#0541
-/Jcircle 16#24bf
-/Jcircumflex 16#0134
-/Jecyrillic 16#0408
-/Jheharmenian 16#054b
-/Jmonospace 16#ff2a
-/Jsmall 16#f76a
-/K 16#004b
-/KBsquare 16#3385
-/KKsquare 16#33cd
-/Kabashkircyrillic 16#04a0
-/Kacute 16#1e30
-/Kacyrillic 16#041a
-/Kadescendercyrillic 16#049a
-/Kahookcyrillic 16#04c3
-/Kappa 16#039a
-/Kastrokecyrillic 16#049e
-/Kaverticalstrokecyrillic 16#049c
-/Kcaron 16#01e8
-/Kcedilla 16#0136
-/Kcircle 16#24c0
-/Kcommaaccent 16#0136
-/Kdotbelow 16#1e32
-/Keharmenian 16#0554
-/Kenarmenian 16#053f
-/Khacyrillic 16#0425
-/Kheicoptic 16#03e6
-/Khook 16#0198
-/Kjecyrillic 16#040c
-/Klinebelow 16#1e34
-/Kmonospace 16#ff2b
-/Koppacyrillic 16#0480
-/Koppagreek 16#03de
-/Ksicyrillic 16#046e
-/Ksmall 16#f76b
-/L 16#004c
-/LJ 16#01c7
-/LL 16#f6bf
-/Lacute 16#0139
-/Lambda 16#039b
-/Lcaron 16#013d
-/Lcedilla 16#013b
-/Lcircle 16#24c1
-/Lcircumflexbelow 16#1e3c
-/Lcommaaccent 16#013b
-/Ldot 16#013f
-/Ldotaccent 16#013f
-/Ldotbelow 16#1e36
-/Ldotbelowmacron 16#1e38
-/Liwnarmenian 16#053c
-/Lj 16#01c8
-/Ljecyrillic 16#0409
-/Llinebelow 16#1e3a
-/Lmonospace 16#ff2c
-/Lslash 16#0141
-/Lslashsmall 16#f6f9
-/Lsmall 16#f76c
-/M 16#004d
-/MBsquare 16#3386
-/Macron 16#f6d0
-/Macronsmall 16#f7af
-/Macute 16#1e3e
-/Mcircle 16#24c2
-/Mdotaccent 16#1e40
-/Mdotbelow 16#1e42
-/Menarmenian 16#0544
-/Mmonospace 16#ff2d
-/Msmall 16#f76d
-/Mturned 16#019c
-/Mu 16#039c
-/N 16#004e
-/NJ 16#01ca
-/Nacute 16#0143
-/Ncaron 16#0147
-/Ncedilla 16#0145
-/Ncircle 16#24c3
-/Ncircumflexbelow 16#1e4a
-/Ncommaaccent 16#0145
-/Ndotaccent 16#1e44
-/Ndotbelow 16#1e46
-/Nhookleft 16#019d
-/Nineroman 16#2168
-/Nj 16#01cb
-/Njecyrillic 16#040a
-/Nlinebelow 16#1e48
-/Nmonospace 16#ff2e
-/Nowarmenian 16#0546
-/Nsmall 16#f76e
-/Ntilde 16#00d1
-/Ntildesmall 16#f7f1
-/Nu 16#039d
-/O 16#004f
-/OE 16#0152
-/OEsmall 16#f6fa
-/Oacute 16#00d3
-/Oacutesmall 16#f7f3
-/Obarredcyrillic 16#04e8
-/Obarreddieresiscyrillic 16#04ea
-/Obreve 16#014e
-/Ocaron 16#01d1
-/Ocenteredtilde 16#019f
-/Ocircle 16#24c4
-/Ocircumflex 16#00d4
-/Ocircumflexacute 16#1ed0
-/Ocircumflexdotbelow 16#1ed8
-/Ocircumflexgrave 16#1ed2
-/Ocircumflexhookabove 16#1ed4
-/Ocircumflexsmall 16#f7f4
-/Ocircumflextilde 16#1ed6
-/Ocyrillic 16#041e
-/Odblacute 16#0150
-/Odblgrave 16#020c
-/Odieresis 16#00d6
-/Odieresiscyrillic 16#04e6
-/Odieresissmall 16#f7f6
-/Odotbelow 16#1ecc
-/Ogoneksmall 16#f6fb
-/Ograve 16#00d2
-/Ogravesmall 16#f7f2
-/Oharmenian 16#0555
-/Ohm 16#2126
-/Ohookabove 16#1ece
-/Ohorn 16#01a0
-/Ohornacute 16#1eda
-/Ohorndotbelow 16#1ee2
-/Ohorngrave 16#1edc
-/Ohornhookabove 16#1ede
-/Ohorntilde 16#1ee0
-/Ohungarumlaut 16#0150
-/Oi 16#01a2
-/Oinvertedbreve 16#020e
-/Omacron 16#014c
-/Omacronacute 16#1e52
-/Omacrongrave 16#1e50
-/Omega 16#2126
-/Omegacyrillic 16#0460
-/Omegagreek 16#03a9
-/Omegaroundcyrillic 16#047a
-/Omegatitlocyrillic 16#047c
-/Omegatonos 16#038f
-/Omicron 16#039f
-/Omicrontonos 16#038c
-/Omonospace 16#ff2f
-/Oneroman 16#2160
-/Oogonek 16#01ea
-/Oogonekmacron 16#01ec
-/Oopen 16#0186
-/Oslash 16#00d8
-/Oslashacute 16#01fe
-/Oslashsmall 16#f7f8
-/Osmall 16#f76f
-/Ostrokeacute 16#01fe
-/Otcyrillic 16#047e
-/Otilde 16#00d5
-/Otildeacute 16#1e4c
-/Otildedieresis 16#1e4e
-/Otildesmall 16#f7f5
-/P 16#0050
-/Pacute 16#1e54
-/Pcircle 16#24c5
-/Pdotaccent 16#1e56
-/Pecyrillic 16#041f
-/Peharmenian 16#054a
-/Pemiddlehookcyrillic 16#04a6
-/Phi 16#03a6
-/Phook 16#01a4
-/Pi 16#03a0
-/Piwrarmenian 16#0553
-/Pmonospace 16#ff30
-/Psi 16#03a8
-/Psicyrillic 16#0470
-/Psmall 16#f770
-/Q 16#0051
-/Qcircle 16#24c6
-/Qmonospace 16#ff31
-/Qsmall 16#f771
-/R 16#0052
-/Raarmenian 16#054c
-/Racute 16#0154
-/Rcaron 16#0158
-/Rcedilla 16#0156
-/Rcircle 16#24c7
-/Rcommaaccent 16#0156
-/Rdblgrave 16#0210
-/Rdotaccent 16#1e58
-/Rdotbelow 16#1e5a
-/Rdotbelowmacron 16#1e5c
-/Reharmenian 16#0550
-/Rfraktur 16#211c
-/Rho 16#03a1
-/Ringsmall 16#f6fc
-/Rinvertedbreve 16#0212
-/Rlinebelow 16#1e5e
-/Rmonospace 16#ff32
-/Rsmall 16#f772
-/Rsmallinverted 16#0281
-/Rsmallinvertedsuperior 16#02b6
-/S 16#0053
-/SF010000 16#250c
-/SF020000 16#2514
-/SF030000 16#2510
-/SF040000 16#2518
-/SF050000 16#253c
-/SF060000 16#252c
-/SF070000 16#2534
-/SF080000 16#251c
-/SF090000 16#2524
-/SF100000 16#2500
-/SF110000 16#2502
-/SF190000 16#2561
-/SF200000 16#2562
-/SF210000 16#2556
-/SF220000 16#2555
-/SF230000 16#2563
-/SF240000 16#2551
-/SF250000 16#2557
-/SF260000 16#255d
-/SF270000 16#255c
-/SF280000 16#255b
-/SF360000 16#255e
-/SF370000 16#255f
-/SF380000 16#255a
-/SF390000 16#2554
-/SF400000 16#2569
-/SF410000 16#2566
-/SF420000 16#2560
-/SF430000 16#2550
-/SF440000 16#256c
-/SF450000 16#2567
-/SF460000 16#2568
-/SF470000 16#2564
-/SF480000 16#2565
-/SF490000 16#2559
-/SF500000 16#2558
-/SF510000 16#2552
-/SF520000 16#2553
-/SF530000 16#256b
-/SF540000 16#256a
-/Sacute 16#015a
-/Sacutedotaccent 16#1e64
-/Sampigreek 16#03e0
-/Scaron 16#0160
-/Scarondotaccent 16#1e66
-/Scaronsmall 16#f6fd
-/Scedilla 16#015e
-/Schwa 16#018f
-/Schwacyrillic 16#04d8
-/Schwadieresiscyrillic 16#04da
-/Scircle 16#24c8
-/Scircumflex 16#015c
-/Scommaaccent 16#0218
-/Sdotaccent 16#1e60
-/Sdotbelow 16#1e62
-/Sdotbelowdotaccent 16#1e68
-/Seharmenian 16#054d
-/Sevenroman 16#2166
-/Shaarmenian 16#0547
-/Shacyrillic 16#0428
-/Shchacyrillic 16#0429
-/Sheicoptic 16#03e2
-/Shhacyrillic 16#04ba
-/Shimacoptic 16#03ec
-/Sigma 16#03a3
-/Sixroman 16#2165
-/Smonospace 16#ff33
-/Softsigncyrillic 16#042c
-/Ssmall 16#f773
-/Stigmagreek 16#03da
-/T 16#0054
-/Tau 16#03a4
-/Tbar 16#0166
-/Tcaron 16#0164
-/Tcedilla 16#0162
-/Tcircle 16#24c9
-/Tcircumflexbelow 16#1e70
-/Tcommaaccent 16#0162
-/Tdotaccent 16#1e6a
-/Tdotbelow 16#1e6c
-/Tecyrillic 16#0422
-/Tedescendercyrillic 16#04ac
-/Tenroman 16#2169
-/Tetsecyrillic 16#04b4
-/Theta 16#0398
-/Thook 16#01ac
-/Thorn 16#00de
-/Thornsmall 16#f7fe
-/Threeroman 16#2162
-/Tildesmall 16#f6fe
-/Tiwnarmenian 16#054f
-/Tlinebelow 16#1e6e
-/Tmonospace 16#ff34
-/Toarmenian 16#0539
-/Tonefive 16#01bc
-/Tonesix 16#0184
-/Tonetwo 16#01a7
-/Tretroflexhook 16#01ae
-/Tsecyrillic 16#0426
-/Tshecyrillic 16#040b
-/Tsmall 16#f774
-/Twelveroman 16#216b
-/Tworoman 16#2161
-/U 16#0055
-/Uacute 16#00da
-/Uacutesmall 16#f7fa
-/Ubreve 16#016c
-/Ucaron 16#01d3
-/Ucircle 16#24ca
-/Ucircumflex 16#00db
-/Ucircumflexbelow 16#1e76
-/Ucircumflexsmall 16#f7fb
-/Ucyrillic 16#0423
-/Udblacute 16#0170
-/Udblgrave 16#0214
-/Udieresis 16#00dc
-/Udieresisacute 16#01d7
-/Udieresisbelow 16#1e72
-/Udieresiscaron 16#01d9
-/Udieresiscyrillic 16#04f0
-/Udieresisgrave 16#01db
-/Udieresismacron 16#01d5
-/Udieresissmall 16#f7fc
-/Udotbelow 16#1ee4
-/Ugrave 16#00d9
-/Ugravesmall 16#f7f9
-/Uhookabove 16#1ee6
-/Uhorn 16#01af
-/Uhornacute 16#1ee8
-/Uhorndotbelow 16#1ef0
-/Uhorngrave 16#1eea
-/Uhornhookabove 16#1eec
-/Uhorntilde 16#1eee
-/Uhungarumlaut 16#0170
-/Uhungarumlautcyrillic 16#04f2
-/Uinvertedbreve 16#0216
-/Ukcyrillic 16#0478
-/Umacron 16#016a
-/Umacroncyrillic 16#04ee
-/Umacrondieresis 16#1e7a
-/Umonospace 16#ff35
-/Uogonek 16#0172
-/Upsilon 16#03a5
-/Upsilon1 16#03d2
-/Upsilonacutehooksymbolgreek 16#03d3
-/Upsilonafrican 16#01b1
-/Upsilondieresis 16#03ab
-/Upsilondieresishooksymbolgreek 16#03d4
-/Upsilonhooksymbol 16#03d2
-/Upsilontonos 16#038e
-/Uring 16#016e
-/Ushortcyrillic 16#040e
-/Usmall 16#f775
-/Ustraightcyrillic 16#04ae
-/Ustraightstrokecyrillic 16#04b0
-/Utilde 16#0168
-/Utildeacute 16#1e78
-/Utildebelow 16#1e74
-/V 16#0056
-/Vcircle 16#24cb
-/Vdotbelow 16#1e7e
-/Vecyrillic 16#0412
-/Vewarmenian 16#054e
-/Vhook 16#01b2
-/Vmonospace 16#ff36
-/Voarmenian 16#0548
-/Vsmall 16#f776
-/Vtilde 16#1e7c
-/W 16#0057
-/Wacute 16#1e82
-/Wcircle 16#24cc
-/Wcircumflex 16#0174
-/Wdieresis 16#1e84
-/Wdotaccent 16#1e86
-/Wdotbelow 16#1e88
-/Wgrave 16#1e80
-/Wmonospace 16#ff37
-/Wsmall 16#f777
-/X 16#0058
-/Xcircle 16#24cd
-/Xdieresis 16#1e8c
-/Xdotaccent 16#1e8a
-/Xeharmenian 16#053d
-/Xi 16#039e
-/Xmonospace 16#ff38
-/Xsmall 16#f778
-/Y 16#0059
-/Yacute 16#00dd
-/Yacutesmall 16#f7fd
-/Yatcyrillic 16#0462
-/Ycircle 16#24ce
-/Ycircumflex 16#0176
-/Ydieresis 16#0178
-/Ydieresissmall 16#f7ff
-/Ydotaccent 16#1e8e
-/Ydotbelow 16#1ef4
-/Yericyrillic 16#042b
-/Yerudieresiscyrillic 16#04f8
-/Ygrave 16#1ef2
-/Yhook 16#01b3
-/Yhookabove 16#1ef6
-/Yiarmenian 16#0545
-/Yicyrillic 16#0407
-/Yiwnarmenian 16#0552
-/Ymonospace 16#ff39
-/Ysmall 16#f779
-/Ytilde 16#1ef8
-/Yusbigcyrillic 16#046a
-/Yusbigiotifiedcyrillic 16#046c
-/Yuslittlecyrillic 16#0466
-/Yuslittleiotifiedcyrillic 16#0468
-/Z 16#005a
-/Zaarmenian 16#0536
-/Zacute 16#0179
-/Zcaron 16#017d
-/Zcaronsmall 16#f6ff
-/Zcircle 16#24cf
-/Zcircumflex 16#1e90
-/Zdot 16#017b
-/Zdotaccent 16#017b
-/Zdotbelow 16#1e92
-/Zecyrillic 16#0417
-/Zedescendercyrillic 16#0498
-/Zedieresiscyrillic 16#04de
-/Zeta 16#0396
-/Zhearmenian 16#053a
-/Zhebrevecyrillic 16#04c1
-/Zhecyrillic 16#0416
-/Zhedescendercyrillic 16#0496
-/Zhedieresiscyrillic 16#04dc
-/Zlinebelow 16#1e94
-/Zmonospace 16#ff3a
-/Zsmall 16#f77a
-/Zstroke 16#01b5
-/a 16#0061
-/aabengali 16#0986
-/aacute 16#00e1
-/aadeva 16#0906
-/aagujarati 16#0a86
-/aagurmukhi 16#0a06
-/aamatragurmukhi 16#0a3e
-/aarusquare 16#3303
-/aavowelsignbengali 16#09be
-/aavowelsigndeva 16#093e
-/aavowelsigngujarati 16#0abe
-/abbreviationmarkarmenian 16#055f
-/abbreviationsigndeva 16#0970
-/abengali 16#0985
-/abopomofo 16#311a
-/abreve 16#0103
-/abreveacute 16#1eaf
-/abrevecyrillic 16#04d1
-/abrevedotbelow 16#1eb7
-/abrevegrave 16#1eb1
-/abrevehookabove 16#1eb3
-/abrevetilde 16#1eb5
-/acaron 16#01ce
-/acircle 16#24d0
-/acircumflex 16#00e2
-/acircumflexacute 16#1ea5
-/acircumflexdotbelow 16#1ead
-/acircumflexgrave 16#1ea7
-/acircumflexhookabove 16#1ea9
-/acircumflextilde 16#1eab
-/acute 16#00b4
-/acutebelowcmb 16#0317
-/acutecmb 16#0301
-/acutecomb 16#0301
-/acutedeva 16#0954
-/acutelowmod 16#02cf
-/acutetonecmb 16#0341
-/acyrillic 16#0430
-/adblgrave 16#0201
-/addakgurmukhi 16#0a71
-/adeva 16#0905
-/adieresis 16#00e4
-/adieresiscyrillic 16#04d3
-/adieresismacron 16#01df
-/adotbelow 16#1ea1
-/adotmacron 16#01e1
-/ae 16#00e6
-/aeacute 16#01fd
-/aekorean 16#3150
-/aemacron 16#01e3
-/afii00208 16#2015
-/afii08941 16#20a4
-/afii10017 16#0410
-/afii10018 16#0411
-/afii10019 16#0412
-/afii10020 16#0413
-/afii10021 16#0414
-/afii10022 16#0415
-/afii10023 16#0401
-/afii10024 16#0416
-/afii10025 16#0417
-/afii10026 16#0418
-/afii10027 16#0419
-/afii10028 16#041a
-/afii10029 16#041b
-/afii10030 16#041c
-/afii10031 16#041d
-/afii10032 16#041e
-/afii10033 16#041f
-/afii10034 16#0420
-/afii10035 16#0421
-/afii10036 16#0422
-/afii10037 16#0423
-/afii10038 16#0424
-/afii10039 16#0425
-/afii10040 16#0426
-/afii10041 16#0427
-/afii10042 16#0428
-/afii10043 16#0429
-/afii10044 16#042a
-/afii10045 16#042b
-/afii10046 16#042c
-/afii10047 16#042d
-/afii10048 16#042e
-/afii10049 16#042f
-/afii10050 16#0490
-/afii10051 16#0402
-/afii10052 16#0403
-/afii10053 16#0404
-/afii10054 16#0405
-/afii10055 16#0406
-/afii10056 16#0407
-/afii10057 16#0408
-/afii10058 16#0409
-/afii10059 16#040a
-/afii10060 16#040b
-/afii10061 16#040c
-/afii10062 16#040e
-/afii10063 16#f6c4
-/afii10064 16#f6c5
-/afii10065 16#0430
-/afii10066 16#0431
-/afii10067 16#0432
-/afii10068 16#0433
-/afii10069 16#0434
-/afii10070 16#0435
-/afii10071 16#0451
-/afii10072 16#0436
-/afii10073 16#0437
-/afii10074 16#0438
-/afii10075 16#0439
-/afii10076 16#043a
-/afii10077 16#043b
-/afii10078 16#043c
-/afii10079 16#043d
-/afii10080 16#043e
-/afii10081 16#043f
-/afii10082 16#0440
-/afii10083 16#0441
-/afii10084 16#0442
-/afii10085 16#0443
-/afii10086 16#0444
-/afii10087 16#0445
-/afii10088 16#0446
-/afii10089 16#0447
-/afii10090 16#0448
-/afii10091 16#0449
-/afii10092 16#044a
-/afii10093 16#044b
-/afii10094 16#044c
-/afii10095 16#044d
-/afii10096 16#044e
-/afii10097 16#044f
-/afii10098 16#0491
-/afii10099 16#0452
-/afii10100 16#0453
-/afii10101 16#0454
-/afii10102 16#0455
-/afii10103 16#0456
-/afii10104 16#0457
-/afii10105 16#0458
-/afii10106 16#0459
-/afii10107 16#045a
-/afii10108 16#045b
-/afii10109 16#045c
-/afii10110 16#045e
-/afii10145 16#040f
-/afii10146 16#0462
-/afii10147 16#0472
-/afii10148 16#0474
-/afii10192 16#f6c6
-/afii10193 16#045f
-/afii10194 16#0463
-/afii10195 16#0473
-/afii10196 16#0475
-/afii10831 16#f6c7
-/afii10832 16#f6c8
-/afii10846 16#04d9
-/afii299 16#200e
-/afii300 16#200f
-/afii301 16#200d
-/afii57381 16#066a
-/afii57388 16#060c
-/afii57392 16#0660
-/afii57393 16#0661
-/afii57394 16#0662
-/afii57395 16#0663
-/afii57396 16#0664
-/afii57397 16#0665
-/afii57398 16#0666
-/afii57399 16#0667
-/afii57400 16#0668
-/afii57401 16#0669
-/afii57403 16#061b
-/afii57407 16#061f
-/afii57409 16#0621
-/afii57410 16#0622
-/afii57411 16#0623
-/afii57412 16#0624
-/afii57413 16#0625
-/afii57414 16#0626
-/afii57415 16#0627
-/afii57416 16#0628
-/afii57417 16#0629
-/afii57418 16#062a
-/afii57419 16#062b
-/afii57420 16#062c
-/afii57421 16#062d
-/afii57422 16#062e
-/afii57423 16#062f
-/afii57424 16#0630
-/afii57425 16#0631
-/afii57426 16#0632
-/afii57427 16#0633
-/afii57428 16#0634
-/afii57429 16#0635
-/afii57430 16#0636
-/afii57431 16#0637
-/afii57432 16#0638
-/afii57433 16#0639
-/afii57434 16#063a
-/afii57440 16#0640
-/afii57441 16#0641
-/afii57442 16#0642
-/afii57443 16#0643
-/afii57444 16#0644
-/afii57445 16#0645
-/afii57446 16#0646
-/afii57448 16#0648
-/afii57449 16#0649
-/afii57450 16#064a
-/afii57451 16#064b
-/afii57452 16#064c
-/afii57453 16#064d
-/afii57454 16#064e
-/afii57455 16#064f
-/afii57456 16#0650
-/afii57457 16#0651
-/afii57458 16#0652
-/afii57470 16#0647
-/afii57505 16#06a4
-/afii57506 16#067e
-/afii57507 16#0686
-/afii57508 16#0698
-/afii57509 16#06af
-/afii57511 16#0679
-/afii57512 16#0688
-/afii57513 16#0691
-/afii57514 16#06ba
-/afii57519 16#06d2
-/afii57534 16#06d5
-/afii57636 16#20aa
-/afii57645 16#05be
-/afii57658 16#05c3
-/afii57664 16#05d0
-/afii57665 16#05d1
-/afii57666 16#05d2
-/afii57667 16#05d3
-/afii57668 16#05d4
-/afii57669 16#05d5
-/afii57670 16#05d6
-/afii57671 16#05d7
-/afii57672 16#05d8
-/afii57673 16#05d9
-/afii57674 16#05da
-/afii57675 16#05db
-/afii57676 16#05dc
-/afii57677 16#05dd
-/afii57678 16#05de
-/afii57679 16#05df
-/afii57680 16#05e0
-/afii57681 16#05e1
-/afii57682 16#05e2
-/afii57683 16#05e3
-/afii57684 16#05e4
-/afii57685 16#05e5
-/afii57686 16#05e6
-/afii57687 16#05e7
-/afii57688 16#05e8
-/afii57689 16#05e9
-/afii57690 16#05ea
-/afii57694 16#fb2a
-/afii57695 16#fb2b
-/afii57700 16#fb4b
-/afii57705 16#fb1f
-/afii57716 16#05f0
-/afii57717 16#05f1
-/afii57718 16#05f2
-/afii57723 16#fb35
-/afii57793 16#05b4
-/afii57794 16#05b5
-/afii57795 16#05b6
-/afii57796 16#05bb
-/afii57797 16#05b8
-/afii57798 16#05b7
-/afii57799 16#05b0
-/afii57800 16#05b2
-/afii57801 16#05b1
-/afii57802 16#05b3
-/afii57803 16#05c2
-/afii57804 16#05c1
-/afii57806 16#05b9
-/afii57807 16#05bc
-/afii57839 16#05bd
-/afii57841 16#05bf
-/afii57842 16#05c0
-/afii57929 16#02bc
-/afii61248 16#2105
-/afii61289 16#2113
-/afii61352 16#2116
-/afii61573 16#202c
-/afii61574 16#202d
-/afii61575 16#202e
-/afii61664 16#200c
-/afii63167 16#066d
-/afii64937 16#02bd
-/agrave 16#00e0
-/agujarati 16#0a85
-/agurmukhi 16#0a05
-/ahiragana 16#3042
-/ahookabove 16#1ea3
-/aibengali 16#0990
-/aibopomofo 16#311e
-/aideva 16#0910
-/aiecyrillic 16#04d5
-/aigujarati 16#0a90
-/aigurmukhi 16#0a10
-/aimatragurmukhi 16#0a48
-/ainarabic 16#0639
-/ainfinalarabic 16#feca
-/aininitialarabic 16#fecb
-/ainmedialarabic 16#fecc
-/ainvertedbreve 16#0203
-/aivowelsignbengali 16#09c8
-/aivowelsigndeva 16#0948
-/aivowelsigngujarati 16#0ac8
-/akatakana 16#30a2
-/akatakanahalfwidth 16#ff71
-/akorean 16#314f
-/alef 16#05d0
-/alefarabic 16#0627
-/alefdageshhebrew 16#fb30
-/aleffinalarabic 16#fe8e
-/alefhamzaabovearabic 16#0623
-/alefhamzaabovefinalarabic 16#fe84
-/alefhamzabelowarabic 16#0625
-/alefhamzabelowfinalarabic 16#fe88
-/alefhebrew 16#05d0
-/aleflamedhebrew 16#fb4f
-/alefmaddaabovearabic 16#0622
-/alefmaddaabovefinalarabic 16#fe82
-/alefmaksuraarabic 16#0649
-/alefmaksurafinalarabic 16#fef0
-/alefmaksurainitialarabic 16#fef3
-/alefmaksuramedialarabic 16#fef4
-/alefpatahhebrew 16#fb2e
-/alefqamatshebrew 16#fb2f
-/aleph 16#2135
-/allequal 16#224c
-/alpha 16#03b1
-/alphatonos 16#03ac
-/amacron 16#0101
-/amonospace 16#ff41
-/ampersand 16#0026
-/ampersandmonospace 16#ff06
-/ampersandsmall 16#f726
-/amsquare 16#33c2
-/anbopomofo 16#3122
-/angbopomofo 16#3124
-/angkhankhuthai 16#0e5a
-/angle 16#2220
-/anglebracketleft 16#3008
-/anglebracketleftvertical 16#fe3f
-/anglebracketright 16#3009
-/anglebracketrightvertical 16#fe40
-/angleleft 16#2329
-/angleright 16#232a
-/angstrom 16#212b
-/anoteleia 16#0387
-/anudattadeva 16#0952
-/anusvarabengali 16#0982
-/anusvaradeva 16#0902
-/anusvaragujarati 16#0a82
-/aogonek 16#0105
-/apaatosquare 16#3300
-/aparen 16#249c
-/apostrophearmenian 16#055a
-/apostrophemod 16#02bc
-/apple 16#f8ff
-/approaches 16#2250
-/approxequal 16#2248
-/approxequalorimage 16#2252
-/approximatelyequal 16#2245
-/araeaekorean 16#318e
-/araeakorean 16#318d
-/arc 16#2312
-/arighthalfring 16#1e9a
-/aring 16#00e5
-/aringacute 16#01fb
-/aringbelow 16#1e01
-/arrowboth 16#2194
-/arrowdashdown 16#21e3
-/arrowdashleft 16#21e0
-/arrowdashright 16#21e2
-/arrowdashup 16#21e1
-/arrowdblboth 16#21d4
-/arrowdbldown 16#21d3
-/arrowdblleft 16#21d0
-/arrowdblright 16#21d2
-/arrowdblup 16#21d1
-/arrowdown 16#2193
-/arrowdownleft 16#2199
-/arrowdownright 16#2198
-/arrowdownwhite 16#21e9
-/arrowheaddownmod 16#02c5
-/arrowheadleftmod 16#02c2
-/arrowheadrightmod 16#02c3
-/arrowheadupmod 16#02c4
-/arrowhorizex 16#f8e7
-/arrowleft 16#2190
-/arrowleftdbl 16#21d0
-/arrowleftdblstroke 16#21cd
-/arrowleftoverright 16#21c6
-/arrowleftwhite 16#21e6
-/arrowright 16#2192
-/arrowrightdblstroke 16#21cf
-/arrowrightheavy 16#279e
-/arrowrightoverleft 16#21c4
-/arrowrightwhite 16#21e8
-/arrowtableft 16#21e4
-/arrowtabright 16#21e5
-/arrowup 16#2191
-/arrowupdn 16#2195
-/arrowupdnbse 16#21a8
-/arrowupdownbase 16#21a8
-/arrowupleft 16#2196
-/arrowupleftofdown 16#21c5
-/arrowupright 16#2197
-/arrowupwhite 16#21e7
-/arrowvertex 16#f8e6
-/asciicircum 16#005e
-/asciicircummonospace 16#ff3e
-/asciitilde 16#007e
-/asciitildemonospace 16#ff5e
-/ascript 16#0251
-/ascriptturned 16#0252
-/asmallhiragana 16#3041
-/asmallkatakana 16#30a1
-/asmallkatakanahalfwidth 16#ff67
-/asterisk 16#002a
-/asteriskaltonearabic 16#066d
-/asteriskarabic 16#066d
-/asteriskmath 16#2217
-/asteriskmonospace 16#ff0a
-/asterisksmall 16#fe61
-/asterism 16#2042
-/asuperior 16#f6e9
-/asymptoticallyequal 16#2243
-/at 16#0040
-/atilde 16#00e3
-/atmonospace 16#ff20
-/atsmall 16#fe6b
-/aturned 16#0250
-/aubengali 16#0994
-/aubopomofo 16#3120
-/audeva 16#0914
-/augujarati 16#0a94
-/augurmukhi 16#0a14
-/aulengthmarkbengali 16#09d7
-/aumatragurmukhi 16#0a4c
-/auvowelsignbengali 16#09cc
-/auvowelsigndeva 16#094c
-/auvowelsigngujarati 16#0acc
-/avagrahadeva 16#093d
-/aybarmenian 16#0561
-/ayin 16#05e2
-/ayinaltonehebrew 16#fb20
-/ayinhebrew 16#05e2
-/b 16#0062
-/babengali 16#09ac
-/backslash 16#005c
-/backslashmonospace 16#ff3c
-/badeva 16#092c
-/bagujarati 16#0aac
-/bagurmukhi 16#0a2c
-/bahiragana 16#3070
-/bahtthai 16#0e3f
-/bakatakana 16#30d0
-/bar 16#007c
-/barmonospace 16#ff5c
-/bbopomofo 16#3105
-/bcircle 16#24d1
-/bdotaccent 16#1e03
-/bdotbelow 16#1e05
-/beamedsixteenthnotes 16#266c
-/because 16#2235
-/becyrillic 16#0431
-/beharabic 16#0628
-/behfinalarabic 16#fe90
-/behinitialarabic 16#fe91
-/behiragana 16#3079
-/behmedialarabic 16#fe92
-/behmeeminitialarabic 16#fc9f
-/behmeemisolatedarabic 16#fc08
-/behnoonfinalarabic 16#fc6d
-/bekatakana 16#30d9
-/benarmenian 16#0562
-/bet 16#05d1
-/beta 16#03b2
-/betasymbolgreek 16#03d0
-/betdagesh 16#fb31
-/betdageshhebrew 16#fb31
-/bethebrew 16#05d1
-/betrafehebrew 16#fb4c
-/bhabengali 16#09ad
-/bhadeva 16#092d
-/bhagujarati 16#0aad
-/bhagurmukhi 16#0a2d
-/bhook 16#0253
-/bihiragana 16#3073
-/bikatakana 16#30d3
-/bilabialclick 16#0298
-/bindigurmukhi 16#0a02
-/birusquare 16#3331
-/blackcircle 16#25cf
-/blackdiamond 16#25c6
-/blackdownpointingtriangle 16#25bc
-/blackleftpointingpointer 16#25c4
-/blackleftpointingtriangle 16#25c0
-/blacklenticularbracketleft 16#3010
-/blacklenticularbracketleftvertical 16#fe3b
-/blacklenticularbracketright 16#3011
-/blacklenticularbracketrightvertical 16#fe3c
-/blacklowerlefttriangle 16#25e3
-/blacklowerrighttriangle 16#25e2
-/blackrectangle 16#25ac
-/blackrightpointingpointer 16#25ba
-/blackrightpointingtriangle 16#25b6
-/blacksmallsquare 16#25aa
-/blacksmilingface 16#263b
-/blacksquare 16#25a0
-/blackstar 16#2605
-/blackupperlefttriangle 16#25e4
-/blackupperrighttriangle 16#25e5
-/blackuppointingsmalltriangle 16#25b4
-/blackuppointingtriangle 16#25b2
-/blank 16#2423
-/blinebelow 16#1e07
-/block 16#2588
-/bmonospace 16#ff42
-/bobaimaithai 16#0e1a
-/bohiragana 16#307c
-/bokatakana 16#30dc
-/bparen 16#249d
-/bqsquare 16#33c3
-/braceex 16#f8f4
-/braceleft 16#007b
-/braceleftbt 16#f8f3
-/braceleftmid 16#f8f2
-/braceleftmonospace 16#ff5b
-/braceleftsmall 16#fe5b
-/bracelefttp 16#f8f1
-/braceleftvertical 16#fe37
-/braceright 16#007d
-/bracerightbt 16#f8fe
-/bracerightmid 16#f8fd
-/bracerightmonospace 16#ff5d
-/bracerightsmall 16#fe5c
-/bracerighttp 16#f8fc
-/bracerightvertical 16#fe38
-/bracketleft 16#005b
-/bracketleftbt 16#f8f0
-/bracketleftex 16#f8ef
-/bracketleftmonospace 16#ff3b
-/bracketlefttp 16#f8ee
-/bracketright 16#005d
-/bracketrightbt 16#f8fb
-/bracketrightex 16#f8fa
-/bracketrightmonospace 16#ff3d
-/bracketrighttp 16#f8f9
-/breve 16#02d8
-/brevebelowcmb 16#032e
-/brevecmb 16#0306
-/breveinvertedbelowcmb 16#032f
-/breveinvertedcmb 16#0311
-/breveinverteddoublecmb 16#0361
-/bridgebelowcmb 16#032a
-/bridgeinvertedbelowcmb 16#033a
-/brokenbar 16#00a6
-/bstroke 16#0180
-/bsuperior 16#f6ea
-/btopbar 16#0183
-/buhiragana 16#3076
-/bukatakana 16#30d6
-/bullet 16#2022
-/bulletinverse 16#25d8
-/bulletoperator 16#2219
-/bullseye 16#25ce
-/c 16#0063
-/caarmenian 16#056e
-/cabengali 16#099a
-/cacute 16#0107
-/cadeva 16#091a
-/cagujarati 16#0a9a
-/cagurmukhi 16#0a1a
-/calsquare 16#3388
-/candrabindubengali 16#0981
-/candrabinducmb 16#0310
-/candrabindudeva 16#0901
-/candrabindugujarati 16#0a81
-/capslock 16#21ea
-/careof 16#2105
-/caron 16#02c7
-/caronbelowcmb 16#032c
-/caroncmb 16#030c
-/carriagereturn 16#21b5
-/cbopomofo 16#3118
-/ccaron 16#010d
-/ccedilla 16#00e7
-/ccedillaacute 16#1e09
-/ccircle 16#24d2
-/ccircumflex 16#0109
-/ccurl 16#0255
-/cdot 16#010b
-/cdotaccent 16#010b
-/cdsquare 16#33c5
-/cedilla 16#00b8
-/cedillacmb 16#0327
-/cent 16#00a2
-/centigrade 16#2103
-/centinferior 16#f6df
-/centmonospace 16#ffe0
-/centoldstyle 16#f7a2
-/centsuperior 16#f6e0
-/chaarmenian 16#0579
-/chabengali 16#099b
-/chadeva 16#091b
-/chagujarati 16#0a9b
-/chagurmukhi 16#0a1b
-/chbopomofo 16#3114
-/cheabkhasiancyrillic 16#04bd
-/checkmark 16#2713
-/checyrillic 16#0447
-/chedescenderabkhasiancyrillic 16#04bf
-/chedescendercyrillic 16#04b7
-/chedieresiscyrillic 16#04f5
-/cheharmenian 16#0573
-/chekhakassiancyrillic 16#04cc
-/cheverticalstrokecyrillic 16#04b9
-/chi 16#03c7
-/chieuchacirclekorean 16#3277
-/chieuchaparenkorean 16#3217
-/chieuchcirclekorean 16#3269
-/chieuchkorean 16#314a
-/chieuchparenkorean 16#3209
-/chochangthai 16#0e0a
-/chochanthai 16#0e08
-/chochingthai 16#0e09
-/chochoethai 16#0e0c
-/chook 16#0188
-/cieucacirclekorean 16#3276
-/cieucaparenkorean 16#3216
-/cieuccirclekorean 16#3268
-/cieuckorean 16#3148
-/cieucparenkorean 16#3208
-/cieucuparenkorean 16#321c
-/circle 16#25cb
-/circlemultiply 16#2297
-/circleot 16#2299
-/circleplus 16#2295
-/circlepostalmark 16#3036
-/circlewithlefthalfblack 16#25d0
-/circlewithrighthalfblack 16#25d1
-/circumflex 16#02c6
-/circumflexbelowcmb 16#032d
-/circumflexcmb 16#0302
-/clear 16#2327
-/clickalveolar 16#01c2
-/clickdental 16#01c0
-/clicklateral 16#01c1
-/clickretroflex 16#01c3
-/club 16#2663
-/clubsuitblack 16#2663
-/clubsuitwhite 16#2667
-/cmcubedsquare 16#33a4
-/cmonospace 16#ff43
-/cmsquaredsquare 16#33a0
-/coarmenian 16#0581
-/colon 16#003a
-/colonmonetary 16#20a1
-/colonmonospace 16#ff1a
-/colonsign 16#20a1
-/colonsmall 16#fe55
-/colontriangularhalfmod 16#02d1
-/colontriangularmod 16#02d0
-/comma 16#002c
-/commaabovecmb 16#0313
-/commaaboverightcmb 16#0315
-/commaaccent 16#f6c3
-/commaarabic 16#060c
-/commaarmenian 16#055d
-/commainferior 16#f6e1
-/commamonospace 16#ff0c
-/commareversedabovecmb 16#0314
-/commareversedmod 16#02bd
-/commasmall 16#fe50
-/commasuperior 16#f6e2
-/commaturnedabovecmb 16#0312
-/commaturnedmod 16#02bb
-/compass 16#263c
-/congruent 16#2245
-/contourintegral 16#222e
-/control 16#2303
-/controlACK 16#0006
-/controlBEL 16#0007
-/controlBS 16#0008
-/controlCAN 16#0018
-/controlCR 16#000d
-/controlDC1 16#0011
-/controlDC2 16#0012
-/controlDC3 16#0013
-/controlDC4 16#0014
-/controlDEL 16#007f
-/controlDLE 16#0010
-/controlEM 16#0019
-/controlENQ 16#0005
-/controlEOT 16#0004
-/controlESC 16#001b
-/controlETB 16#0017
-/controlETX 16#0003
-/controlFF 16#000c
-/controlFS 16#001c
-/controlGS 16#001d
-/controlHT 16#0009
-/controlLF 16#000a
-/controlNAK 16#0015
-/controlRS 16#001e
-/controlSI 16#000f
-/controlSO 16#000e
-/controlSOT 16#0002
-/controlSTX 16#0001
-/controlSUB 16#001a
-/controlSYN 16#0016
-/controlUS 16#001f
-/controlVT 16#000b
-/copyright 16#00a9
-/copyrightsans 16#f8e9
-/copyrightserif 16#f6d9
-/cornerbracketleft 16#300c
-/cornerbracketlefthalfwidth 16#ff62
-/cornerbracketleftvertical 16#fe41
-/cornerbracketright 16#300d
-/cornerbracketrighthalfwidth 16#ff63
-/cornerbracketrightvertical 16#fe42
-/corporationsquare 16#337f
-/cosquare 16#33c7
-/coverkgsquare 16#33c6
-/cparen 16#249e
-/cruzeiro 16#20a2
-/cstretched 16#0297
-/curlyand 16#22cf
-/curlyor 16#22ce
-/currency 16#00a4
-/cyrBreve 16#f6d1
-/cyrFlex 16#f6d2
-/cyrbreve 16#f6d4
-/cyrflex 16#f6d5
-/d 16#0064
-/daarmenian 16#0564
-/dabengali 16#09a6
-/dadarabic 16#0636
-/dadeva 16#0926
-/dadfinalarabic 16#febe
-/dadinitialarabic 16#febf
-/dadmedialarabic 16#fec0
-/dagesh 16#05bc
-/dageshhebrew 16#05bc
-/dagger 16#2020
-/daggerdbl 16#2021
-/dagujarati 16#0aa6
-/dagurmukhi 16#0a26
-/dahiragana 16#3060
-/dakatakana 16#30c0
-/dalarabic 16#062f
-/dalet 16#05d3
-/daletdagesh 16#fb33
-/daletdageshhebrew 16#fb33
-/dalethebrew 16#05d3
-/dalfinalarabic 16#feaa
-/dammaarabic 16#064f
-/dammalowarabic 16#064f
-/dammatanaltonearabic 16#064c
-/dammatanarabic 16#064c
-/danda 16#0964
-/dargahebrew 16#05a7
-/dargalefthebrew 16#05a7
-/dasiapneumatacyrilliccmb 16#0485
-/dblGrave 16#f6d3
-/dblanglebracketleft 16#300a
-/dblanglebracketleftvertical 16#fe3d
-/dblanglebracketright 16#300b
-/dblanglebracketrightvertical 16#fe3e
-/dblarchinvertedbelowcmb 16#032b
-/dblarrowleft 16#21d4
-/dblarrowright 16#21d2
-/dbldanda 16#0965
-/dblgrave 16#f6d6
-/dblgravecmb 16#030f
-/dblintegral 16#222c
-/dbllowline 16#2017
-/dbllowlinecmb 16#0333
-/dbloverlinecmb 16#033f
-/dblprimemod 16#02ba
-/dblverticalbar 16#2016
-/dblverticallineabovecmb 16#030e
-/dbopomofo 16#3109
-/dbsquare 16#33c8
-/dcaron 16#010f
-/dcedilla 16#1e11
-/dcircle 16#24d3
-/dcircumflexbelow 16#1e13
-/dcroat 16#0111
-/ddabengali 16#09a1
-/ddadeva 16#0921
-/ddagujarati 16#0aa1
-/ddagurmukhi 16#0a21
-/ddalarabic 16#0688
-/ddalfinalarabic 16#fb89
-/dddhadeva 16#095c
-/ddhabengali 16#09a2
-/ddhadeva 16#0922
-/ddhagujarati 16#0aa2
-/ddhagurmukhi 16#0a22
-/ddotaccent 16#1e0b
-/ddotbelow 16#1e0d
-/decimalseparatorarabic 16#066b
-/decimalseparatorpersian 16#066b
-/decyrillic 16#0434
-/degree 16#00b0
-/dehihebrew 16#05ad
-/dehiragana 16#3067
-/deicoptic 16#03ef
-/dekatakana 16#30c7
-/deleteleft 16#232b
-/deleteright 16#2326
-/delta 16#03b4
-/deltaturned 16#018d
-/denominatorminusonenumeratorbengali 16#09f8
-/dezh 16#02a4
-/dhabengali 16#09a7
-/dhadeva 16#0927
-/dhagujarati 16#0aa7
-/dhagurmukhi 16#0a27
-/dhook 16#0257
-/dialytikatonos 16#0385
-/dialytikatonoscmb 16#0344
-/diamond 16#2666
-/diamondsuitwhite 16#2662
-/dieresis 16#00a8
-/dieresisacute 16#f6d7
-/dieresisbelowcmb 16#0324
-/dieresiscmb 16#0308
-/dieresisgrave 16#f6d8
-/dieresistonos 16#0385
-/dihiragana 16#3062
-/dikatakana 16#30c2
-/dittomark 16#3003
-/divide 16#00f7
-/divides 16#2223
-/divisionslash 16#2215
-/djecyrillic 16#0452
-/dkshade 16#2593
-/dlinebelow 16#1e0f
-/dlsquare 16#3397
-/dmacron 16#0111
-/dmonospace 16#ff44
-/dnblock 16#2584
-/dochadathai 16#0e0e
-/dodekthai 16#0e14
-/dohiragana 16#3069
-/dokatakana 16#30c9
-/dollar 16#0024
-/dollarinferior 16#f6e3
-/dollarmonospace 16#ff04
-/dollaroldstyle 16#f724
-/dollarsmall 16#fe69
-/dollarsuperior 16#f6e4
-/dong 16#20ab
-/dorusquare 16#3326
-/dotaccent 16#02d9
-/dotaccentcmb 16#0307
-/dotbelowcmb 16#0323
-/dotbelowcomb 16#0323
-/dotkatakana 16#30fb
-/dotlessi 16#0131
-/dotlessj 16#f6be
-/dotlessjstrokehook 16#0284
-/dotmath 16#22c5
-/dottedcircle 16#25cc
-/doubleyodpatah 16#fb1f
-/doubleyodpatahhebrew 16#fb1f
-/downtackbelowcmb 16#031e
-/downtackmod 16#02d5
-/dparen 16#249f
-/dsuperior 16#f6eb
-/dtail 16#0256
-/dtopbar 16#018c
-/duhiragana 16#3065
-/dukatakana 16#30c5
-/dz 16#01f3
-/dzaltone 16#02a3
-/dzcaron 16#01c6
-/dzcurl 16#02a5
-/dzeabkhasiancyrillic 16#04e1
-/dzecyrillic 16#0455
-/dzhecyrillic 16#045f
-/e 16#0065
-/eacute 16#00e9
-/earth 16#2641
-/ebengali 16#098f
-/ebopomofo 16#311c
-/ebreve 16#0115
-/ecandradeva 16#090d
-/ecandragujarati 16#0a8d
-/ecandravowelsigndeva 16#0945
-/ecandravowelsigngujarati 16#0ac5
-/ecaron 16#011b
-/ecedillabreve 16#1e1d
-/echarmenian 16#0565
-/echyiwnarmenian 16#0587
-/ecircle 16#24d4
-/ecircumflex 16#00ea
-/ecircumflexacute 16#1ebf
-/ecircumflexbelow 16#1e19
-/ecircumflexdotbelow 16#1ec7
-/ecircumflexgrave 16#1ec1
-/ecircumflexhookabove 16#1ec3
-/ecircumflextilde 16#1ec5
-/ecyrillic 16#0454
-/edblgrave 16#0205
-/edeva 16#090f
-/edieresis 16#00eb
-/edot 16#0117
-/edotaccent 16#0117
-/edotbelow 16#1eb9
-/eegurmukhi 16#0a0f
-/eematragurmukhi 16#0a47
-/efcyrillic 16#0444
-/egrave 16#00e8
-/egujarati 16#0a8f
-/eharmenian 16#0567
-/ehbopomofo 16#311d
-/ehiragana 16#3048
-/ehookabove 16#1ebb
-/eibopomofo 16#311f
-/eight 16#0038
-/eightarabic 16#0668
-/eightbengali 16#09ee
-/eightcircle 16#2467
-/eightcircleinversesansserif 16#2791
-/eightdeva 16#096e
-/eighteencircle 16#2471
-/eighteenparen 16#2485
-/eighteenperiod 16#2499
-/eightgujarati 16#0aee
-/eightgurmukhi 16#0a6e
-/eighthackarabic 16#0668
-/eighthangzhou 16#3028
-/eighthnotebeamed 16#266b
-/eightideographicparen 16#3227
-/eightinferior 16#2088
-/eightmonospace 16#ff18
-/eightoldstyle 16#f738
-/eightparen 16#247b
-/eightperiod 16#248f
-/eightpersian 16#06f8
-/eightroman 16#2177
-/eightsuperior 16#2078
-/eightthai 16#0e58
-/einvertedbreve 16#0207
-/eiotifiedcyrillic 16#0465
-/ekatakana 16#30a8
-/ekatakanahalfwidth 16#ff74
-/ekonkargurmukhi 16#0a74
-/ekorean 16#3154
-/elcyrillic 16#043b
-/element 16#2208
-/elevencircle 16#246a
-/elevenparen 16#247e
-/elevenperiod 16#2492
-/elevenroman 16#217a
-/ellipsis 16#2026
-/ellipsisvertical 16#22ee
-/emacron 16#0113
-/emacronacute 16#1e17
-/emacrongrave 16#1e15
-/emcyrillic 16#043c
-/emdash 16#2014
-/emdashvertical 16#fe31
-/emonospace 16#ff45
-/emphasismarkarmenian 16#055b
-/emptyset 16#2205
-/enbopomofo 16#3123
-/encyrillic 16#043d
-/endash 16#2013
-/endashvertical 16#fe32
-/endescendercyrillic 16#04a3
-/eng 16#014b
-/engbopomofo 16#3125
-/enghecyrillic 16#04a5
-/enhookcyrillic 16#04c8
-/enspace 16#2002
-/eogonek 16#0119
-/eokorean 16#3153
-/eopen 16#025b
-/eopenclosed 16#029a
-/eopenreversed 16#025c
-/eopenreversedclosed 16#025e
-/eopenreversedhook 16#025d
-/eparen 16#24a0
-/epsilon 16#03b5
-/epsilontonos 16#03ad
-/equal 16#003d
-/equalmonospace 16#ff1d
-/equalsmall 16#fe66
-/equalsuperior 16#207c
-/equivalence 16#2261
-/erbopomofo 16#3126
-/ercyrillic 16#0440
-/ereversed 16#0258
-/ereversedcyrillic 16#044d
-/escyrillic 16#0441
-/esdescendercyrillic 16#04ab
-/esh 16#0283
-/eshcurl 16#0286
-/eshortdeva 16#090e
-/eshortvowelsigndeva 16#0946
-/eshreversedloop 16#01aa
-/eshsquatreversed 16#0285
-/esmallhiragana 16#3047
-/esmallkatakana 16#30a7
-/esmallkatakanahalfwidth 16#ff6a
-/estimated 16#212e
-/esuperior 16#f6ec
-/eta 16#03b7
-/etarmenian 16#0568
-/etatonos 16#03ae
-/eth 16#00f0
-/etilde 16#1ebd
-/etildebelow 16#1e1b
-/etnahtafoukhhebrew 16#0591
-/etnahtafoukhlefthebrew 16#0591
-/etnahtahebrew 16#0591
-/etnahtalefthebrew 16#0591
-/eturned 16#01dd
-/eukorean 16#3161
-/euro 16#20ac
-/evowelsignbengali 16#09c7
-/evowelsigndeva 16#0947
-/evowelsigngujarati 16#0ac7
-/exclam 16#0021
-/exclamarmenian 16#055c
-/exclamdbl 16#203c
-/exclamdown 16#00a1
-/exclamdownsmall 16#f7a1
-/exclammonospace 16#ff01
-/exclamsmall 16#f721
-/existential 16#2203
-/ezh 16#0292
-/ezhcaron 16#01ef
-/ezhcurl 16#0293
-/ezhreversed 16#01b9
-/ezhtail 16#01ba
-/f 16#0066
-/fadeva 16#095e
-/fagurmukhi 16#0a5e
-/fahrenheit 16#2109
-/fathaarabic 16#064e
-/fathalowarabic 16#064e
-/fathatanarabic 16#064b
-/fbopomofo 16#3108
-/fcircle 16#24d5
-/fdotaccent 16#1e1f
-/feharabic 16#0641
-/feharmenian 16#0586
-/fehfinalarabic 16#fed2
-/fehinitialarabic 16#fed3
-/fehmedialarabic 16#fed4
-/feicoptic 16#03e5
-/female 16#2640
-/ff 16#fb00
-/ffi 16#fb03
-/ffl 16#fb04
-/fi 16#fb01
-/fifteencircle 16#246e
-/fifteenparen 16#2482
-/fifteenperiod 16#2496
-/figuredash 16#2012
-/filledbox 16#25a0
-/filledrect 16#25ac
-/finalkaf 16#05da
-/finalkafdagesh 16#fb3a
-/finalkafdageshhebrew 16#fb3a
-/finalkafhebrew 16#05da
-/finalmem 16#05dd
-/finalmemhebrew 16#05dd
-/finalnun 16#05df
-/finalnunhebrew 16#05df
-/finalpe 16#05e3
-/finalpehebrew 16#05e3
-/finaltsadi 16#05e5
-/finaltsadihebrew 16#05e5
-/firsttonechinese 16#02c9
-/fisheye 16#25c9
-/fitacyrillic 16#0473
-/five 16#0035
-/fivearabic 16#0665
-/fivebengali 16#09eb
-/fivecircle 16#2464
-/fivecircleinversesansserif 16#278e
-/fivedeva 16#096b
-/fiveeighths 16#215d
-/fivegujarati 16#0aeb
-/fivegurmukhi 16#0a6b
-/fivehackarabic 16#0665
-/fivehangzhou 16#3025
-/fiveideographicparen 16#3224
-/fiveinferior 16#2085
-/fivemonospace 16#ff15
-/fiveoldstyle 16#f735
-/fiveparen 16#2478
-/fiveperiod 16#248c
-/fivepersian 16#06f5
-/fiveroman 16#2174
-/fivesuperior 16#2075
-/fivethai 16#0e55
-/fl 16#fb02
-/florin 16#0192
-/fmonospace 16#ff46
-/fmsquare 16#3399
-/fofanthai 16#0e1f
-/fofathai 16#0e1d
-/fongmanthai 16#0e4f
-/forall 16#2200
-/four 16#0034
-/fourarabic 16#0664
-/fourbengali 16#09ea
-/fourcircle 16#2463
-/fourcircleinversesansserif 16#278d
-/fourdeva 16#096a
-/fourgujarati 16#0aea
-/fourgurmukhi 16#0a6a
-/fourhackarabic 16#0664
-/fourhangzhou 16#3024
-/fourideographicparen 16#3223
-/fourinferior 16#2084
-/fourmonospace 16#ff14
-/fournumeratorbengali 16#09f7
-/fouroldstyle 16#f734
-/fourparen 16#2477
-/fourperiod 16#248b
-/fourpersian 16#06f4
-/fourroman 16#2173
-/foursuperior 16#2074
-/fourteencircle 16#246d
-/fourteenparen 16#2481
-/fourteenperiod 16#2495
-/fourthai 16#0e54
-/fourthtonechinese 16#02cb
-/fparen 16#24a1
-/fraction 16#2044
-/franc 16#20a3
-/g 16#0067
-/gabengali 16#0997
-/gacute 16#01f5
-/gadeva 16#0917
-/gafarabic 16#06af
-/gaffinalarabic 16#fb93
-/gafinitialarabic 16#fb94
-/gafmedialarabic 16#fb95
-/gagujarati 16#0a97
-/gagurmukhi 16#0a17
-/gahiragana 16#304c
-/gakatakana 16#30ac
-/gamma 16#03b3
-/gammalatinsmall 16#0263
-/gammasuperior 16#02e0
-/gangiacoptic 16#03eb
-/gbopomofo 16#310d
-/gbreve 16#011f
-/gcaron 16#01e7
-/gcedilla 16#0123
-/gcircle 16#24d6
-/gcircumflex 16#011d
-/gcommaaccent 16#0123
-/gdot 16#0121
-/gdotaccent 16#0121
-/gecyrillic 16#0433
-/gehiragana 16#3052
-/gekatakana 16#30b2
-/geometricallyequal 16#2251
-/gereshaccenthebrew 16#059c
-/gereshhebrew 16#05f3
-/gereshmuqdamhebrew 16#059d
-/germandbls 16#00df
-/gershayimaccenthebrew 16#059e
-/gershayimhebrew 16#05f4
-/getamark 16#3013
-/ghabengali 16#0998
-/ghadarmenian 16#0572
-/ghadeva 16#0918
-/ghagujarati 16#0a98
-/ghagurmukhi 16#0a18
-/ghainarabic 16#063a
-/ghainfinalarabic 16#fece
-/ghaininitialarabic 16#fecf
-/ghainmedialarabic 16#fed0
-/ghemiddlehookcyrillic 16#0495
-/ghestrokecyrillic 16#0493
-/gheupturncyrillic 16#0491
-/ghhadeva 16#095a
-/ghhagurmukhi 16#0a5a
-/ghook 16#0260
-/ghzsquare 16#3393
-/gihiragana 16#304e
-/gikatakana 16#30ae
-/gimarmenian 16#0563
-/gimel 16#05d2
-/gimeldagesh 16#fb32
-/gimeldageshhebrew 16#fb32
-/gimelhebrew 16#05d2
-/gjecyrillic 16#0453
-/glottalinvertedstroke 16#01be
-/glottalstop 16#0294
-/glottalstopinverted 16#0296
-/glottalstopmod 16#02c0
-/glottalstopreversed 16#0295
-/glottalstopreversedmod 16#02c1
-/glottalstopreversedsuperior 16#02e4
-/glottalstopstroke 16#02a1
-/glottalstopstrokereversed 16#02a2
-/gmacron 16#1e21
-/gmonospace 16#ff47
-/gohiragana 16#3054
-/gokatakana 16#30b4
-/gparen 16#24a2
-/gpasquare 16#33ac
-/gradient 16#2207
-/grave 16#0060
-/gravebelowcmb 16#0316
-/gravecmb 16#0300
-/gravecomb 16#0300
-/gravedeva 16#0953
-/gravelowmod 16#02ce
-/gravemonospace 16#ff40
-/gravetonecmb 16#0340
-/greater 16#003e
-/greaterequal 16#2265
-/greaterequalorless 16#22db
-/greatermonospace 16#ff1e
-/greaterorequivalent 16#2273
-/greaterorless 16#2277
-/greateroverequal 16#2267
-/greatersmall 16#fe65
-/gscript 16#0261
-/gstroke 16#01e5
-/guhiragana 16#3050
-/guillemotleft 16#00ab
-/guillemotright 16#00bb
-/guilsinglleft 16#2039
-/guilsinglright 16#203a
-/gukatakana 16#30b0
-/guramusquare 16#3318
-/gysquare 16#33c9
-/h 16#0068
-/haabkhasiancyrillic 16#04a9
-/haaltonearabic 16#06c1
-/habengali 16#09b9
-/hadescendercyrillic 16#04b3
-/hadeva 16#0939
-/hagujarati 16#0ab9
-/hagurmukhi 16#0a39
-/haharabic 16#062d
-/hahfinalarabic 16#fea2
-/hahinitialarabic 16#fea3
-/hahiragana 16#306f
-/hahmedialarabic 16#fea4
-/haitusquare 16#332a
-/hakatakana 16#30cf
-/hakatakanahalfwidth 16#ff8a
-/halantgurmukhi 16#0a4d
-/hamzaarabic 16#0621
-/hamzalowarabic 16#0621
-/hangulfiller 16#3164
-/hardsigncyrillic 16#044a
-/harpoonleftbarbup 16#21bc
-/harpoonrightbarbup 16#21c0
-/hasquare 16#33ca
-/hatafpatah 16#05b2
-/hatafpatah16 16#05b2
-/hatafpatah23 16#05b2
-/hatafpatah2f 16#05b2
-/hatafpatahhebrew 16#05b2
-/hatafpatahnarrowhebrew 16#05b2
-/hatafpatahquarterhebrew 16#05b2
-/hatafpatahwidehebrew 16#05b2
-/hatafqamats 16#05b3
-/hatafqamats1b 16#05b3
-/hatafqamats28 16#05b3
-/hatafqamats34 16#05b3
-/hatafqamatshebrew 16#05b3
-/hatafqamatsnarrowhebrew 16#05b3
-/hatafqamatsquarterhebrew 16#05b3
-/hatafqamatswidehebrew 16#05b3
-/hatafsegol 16#05b1
-/hatafsegol17 16#05b1
-/hatafsegol24 16#05b1
-/hatafsegol30 16#05b1
-/hatafsegolhebrew 16#05b1
-/hatafsegolnarrowhebrew 16#05b1
-/hatafsegolquarterhebrew 16#05b1
-/hatafsegolwidehebrew 16#05b1
-/hbar 16#0127
-/hbopomofo 16#310f
-/hbrevebelow 16#1e2b
-/hcedilla 16#1e29
-/hcircle 16#24d7
-/hcircumflex 16#0125
-/hdieresis 16#1e27
-/hdotaccent 16#1e23
-/hdotbelow 16#1e25
-/he 16#05d4
-/heart 16#2665
-/heartsuitblack 16#2665
-/heartsuitwhite 16#2661
-/hedagesh 16#fb34
-/hedageshhebrew 16#fb34
-/hehaltonearabic 16#06c1
-/heharabic 16#0647
-/hehebrew 16#05d4
-/hehfinalaltonearabic 16#fba7
-/hehfinalalttwoarabic 16#feea
-/hehfinalarabic 16#feea
-/hehhamzaabovefinalarabic 16#fba5
-/hehhamzaaboveisolatedarabic 16#fba4
-/hehinitialaltonearabic 16#fba8
-/hehinitialarabic 16#feeb
-/hehiragana 16#3078
-/hehmedialaltonearabic 16#fba9
-/hehmedialarabic 16#feec
-/heiseierasquare 16#337b
-/hekatakana 16#30d8
-/hekatakanahalfwidth 16#ff8d
-/hekutaarusquare 16#3336
-/henghook 16#0267
-/herutusquare 16#3339
-/het 16#05d7
-/hethebrew 16#05d7
-/hhook 16#0266
-/hhooksuperior 16#02b1
-/hieuhacirclekorean 16#327b
-/hieuhaparenkorean 16#321b
-/hieuhcirclekorean 16#326d
-/hieuhkorean 16#314e
-/hieuhparenkorean 16#320d
-/hihiragana 16#3072
-/hikatakana 16#30d2
-/hikatakanahalfwidth 16#ff8b
-/hiriq 16#05b4
-/hiriq14 16#05b4
-/hiriq21 16#05b4
-/hiriq2d 16#05b4
-/hiriqhebrew 16#05b4
-/hiriqnarrowhebrew 16#05b4
-/hiriqquarterhebrew 16#05b4
-/hiriqwidehebrew 16#05b4
-/hlinebelow 16#1e96
-/hmonospace 16#ff48
-/hoarmenian 16#0570
-/hohipthai 16#0e2b
-/hohiragana 16#307b
-/hokatakana 16#30db
-/hokatakanahalfwidth 16#ff8e
-/holam 16#05b9
-/holam19 16#05b9
-/holam26 16#05b9
-/holam32 16#05b9
-/holamhebrew 16#05b9
-/holamnarrowhebrew 16#05b9
-/holamquarterhebrew 16#05b9
-/holamwidehebrew 16#05b9
-/honokhukthai 16#0e2e
-/hookabovecomb 16#0309
-/hookcmb 16#0309
-/hookpalatalizedbelowcmb 16#0321
-/hookretroflexbelowcmb 16#0322
-/hoonsquare 16#3342
-/horicoptic 16#03e9
-/horizontalbar 16#2015
-/horncmb 16#031b
-/hotsprings 16#2668
-/house 16#2302
-/hparen 16#24a3
-/hsuperior 16#02b0
-/hturned 16#0265
-/huhiragana 16#3075
-/huiitosquare 16#3333
-/hukatakana 16#30d5
-/hukatakanahalfwidth 16#ff8c
-/hungarumlaut 16#02dd
-/hungarumlautcmb 16#030b
-/hv 16#0195
-/hyphen 16#002d
-/hypheninferior 16#f6e5
-/hyphenmonospace 16#ff0d
-/hyphensmall 16#fe63
-/hyphensuperior 16#f6e6
-/hyphentwo 16#2010
-/i 16#0069
-/iacute 16#00ed
-/iacyrillic 16#044f
-/ibengali 16#0987
-/ibopomofo 16#3127
-/ibreve 16#012d
-/icaron 16#01d0
-/icircle 16#24d8
-/icircumflex 16#00ee
-/icyrillic 16#0456
-/idblgrave 16#0209
-/ideographearthcircle 16#328f
-/ideographfirecircle 16#328b
-/ideographicallianceparen 16#323f
-/ideographiccallparen 16#323a
-/ideographiccentrecircle 16#32a5
-/ideographicclose 16#3006
-/ideographiccomma 16#3001
-/ideographiccommaleft 16#ff64
-/ideographiccongratulationparen 16#3237
-/ideographiccorrectcircle 16#32a3
-/ideographicearthparen 16#322f
-/ideographicenterpriseparen 16#323d
-/ideographicexcellentcircle 16#329d
-/ideographicfestivalparen 16#3240
-/ideographicfinancialcircle 16#3296
-/ideographicfinancialparen 16#3236
-/ideographicfireparen 16#322b
-/ideographichaveparen 16#3232
-/ideographichighcircle 16#32a4
-/ideographiciterationmark 16#3005
-/ideographiclaborcircle 16#3298
-/ideographiclaborparen 16#3238
-/ideographicleftcircle 16#32a7
-/ideographiclowcircle 16#32a6
-/ideographicmedicinecircle 16#32a9
-/ideographicmetalparen 16#322e
-/ideographicmoonparen 16#322a
-/ideographicnameparen 16#3234
-/ideographicperiod 16#3002
-/ideographicprintcircle 16#329e
-/ideographicreachparen 16#3243
-/ideographicrepresentparen 16#3239
-/ideographicresourceparen 16#323e
-/ideographicrightcircle 16#32a8
-/ideographicsecretcircle 16#3299
-/ideographicselfparen 16#3242
-/ideographicsocietyparen 16#3233
-/ideographicspace 16#3000
-/ideographicspecialparen 16#3235
-/ideographicstockparen 16#3231
-/ideographicstudyparen 16#323b
-/ideographicsunparen 16#3230
-/ideographicsuperviseparen 16#323c
-/ideographicwaterparen 16#322c
-/ideographicwoodparen 16#322d
-/ideographiczero 16#3007
-/ideographmetalcircle 16#328e
-/ideographmooncircle 16#328a
-/ideographnamecircle 16#3294
-/ideographsuncircle 16#3290
-/ideographwatercircle 16#328c
-/ideographwoodcircle 16#328d
-/ideva 16#0907
-/idieresis 16#00ef
-/idieresisacute 16#1e2f
-/idieresiscyrillic 16#04e5
-/idotbelow 16#1ecb
-/iebrevecyrillic 16#04d7
-/iecyrillic 16#0435
-/ieungacirclekorean 16#3275
-/ieungaparenkorean 16#3215
-/ieungcirclekorean 16#3267
-/ieungkorean 16#3147
-/ieungparenkorean 16#3207
-/igrave 16#00ec
-/igujarati 16#0a87
-/igurmukhi 16#0a07
-/ihiragana 16#3044
-/ihookabove 16#1ec9
-/iibengali 16#0988
-/iicyrillic 16#0438
-/iideva 16#0908
-/iigujarati 16#0a88
-/iigurmukhi 16#0a08
-/iimatragurmukhi 16#0a40
-/iinvertedbreve 16#020b
-/iishortcyrillic 16#0439
-/iivowelsignbengali 16#09c0
-/iivowelsigndeva 16#0940
-/iivowelsigngujarati 16#0ac0
-/ij 16#0133
-/ikatakana 16#30a4
-/ikatakanahalfwidth 16#ff72
-/ikorean 16#3163
-/ilde 16#02dc
-/iluyhebrew 16#05ac
-/imacron 16#012b
-/imacroncyrillic 16#04e3
-/imageorapproximatelyequal 16#2253
-/imatragurmukhi 16#0a3f
-/imonospace 16#ff49
-/increment 16#2206
-/infinity 16#221e
-/iniarmenian 16#056b
-/integral 16#222b
-/integralbottom 16#2321
-/integralbt 16#2321
-/integralex 16#f8f5
-/integraltop 16#2320
-/integraltp 16#2320
-/intersection 16#2229
-/intisquare 16#3305
-/invbullet 16#25d8
-/invcircle 16#25d9
-/invsmileface 16#263b
-/iocyrillic 16#0451
-/iogonek 16#012f
-/iota 16#03b9
-/iotadieresis 16#03ca
-/iotadieresistonos 16#0390
-/iotalatin 16#0269
-/iotatonos 16#03af
-/iparen 16#24a4
-/irigurmukhi 16#0a72
-/ismallhiragana 16#3043
-/ismallkatakana 16#30a3
-/ismallkatakanahalfwidth 16#ff68
-/issharbengali 16#09fa
-/istroke 16#0268
-/isuperior 16#f6ed
-/iterationhiragana 16#309d
-/iterationkatakana 16#30fd
-/itilde 16#0129
-/itildebelow 16#1e2d
-/iubopomofo 16#3129
-/iucyrillic 16#044e
-/ivowelsignbengali 16#09bf
-/ivowelsigndeva 16#093f
-/ivowelsigngujarati 16#0abf
-/izhitsacyrillic 16#0475
-/izhitsadblgravecyrillic 16#0477
-/j 16#006a
-/jaarmenian 16#0571
-/jabengali 16#099c
-/jadeva 16#091c
-/jagujarati 16#0a9c
-/jagurmukhi 16#0a1c
-/jbopomofo 16#3110
-/jcaron 16#01f0
-/jcircle 16#24d9
-/jcircumflex 16#0135
-/jcrossedtail 16#029d
-/jdotlessstroke 16#025f
-/jecyrillic 16#0458
-/jeemarabic 16#062c
-/jeemfinalarabic 16#fe9e
-/jeeminitialarabic 16#fe9f
-/jeemmedialarabic 16#fea0
-/jeharabic 16#0698
-/jehfinalarabic 16#fb8b
-/jhabengali 16#099d
-/jhadeva 16#091d
-/jhagujarati 16#0a9d
-/jhagurmukhi 16#0a1d
-/jheharmenian 16#057b
-/jis 16#3004
-/jmonospace 16#ff4a
-/jparen 16#24a5
-/jsuperior 16#02b2
-/k 16#006b
-/kabashkircyrillic 16#04a1
-/kabengali 16#0995
-/kacute 16#1e31
-/kacyrillic 16#043a
-/kadescendercyrillic 16#049b
-/kadeva 16#0915
-/kaf 16#05db
-/kafarabic 16#0643
-/kafdagesh 16#fb3b
-/kafdageshhebrew 16#fb3b
-/kaffinalarabic 16#feda
-/kafhebrew 16#05db
-/kafinitialarabic 16#fedb
-/kafmedialarabic 16#fedc
-/kafrafehebrew 16#fb4d
-/kagujarati 16#0a95
-/kagurmukhi 16#0a15
-/kahiragana 16#304b
-/kahookcyrillic 16#04c4
-/kakatakana 16#30ab
-/kakatakanahalfwidth 16#ff76
-/kappa 16#03ba
-/kappasymbolgreek 16#03f0
-/kapyeounmieumkorean 16#3171
-/kapyeounphieuphkorean 16#3184
-/kapyeounpieupkorean 16#3178
-/kapyeounssangpieupkorean 16#3179
-/karoriisquare 16#330d
-/kashidaautoarabic 16#0640
-/kashidaautonosidebearingarabic 16#0640
-/kasmallkatakana 16#30f5
-/kasquare 16#3384
-/kasraarabic 16#0650
-/kasratanarabic 16#064d
-/kastrokecyrillic 16#049f
-/katahiraprolongmarkhalfwidth 16#ff70
-/kaverticalstrokecyrillic 16#049d
-/kbopomofo 16#310e
-/kcalsquare 16#3389
-/kcaron 16#01e9
-/kcedilla 16#0137
-/kcircle 16#24da
-/kcommaaccent 16#0137
-/kdotbelow 16#1e33
-/keharmenian 16#0584
-/kehiragana 16#3051
-/kekatakana 16#30b1
-/kekatakanahalfwidth 16#ff79
-/kenarmenian 16#056f
-/kesmallkatakana 16#30f6
-/kgreenlandic 16#0138
-/khabengali 16#0996
-/khacyrillic 16#0445
-/khadeva 16#0916
-/khagujarati 16#0a96
-/khagurmukhi 16#0a16
-/khaharabic 16#062e
-/khahfinalarabic 16#fea6
-/khahinitialarabic 16#fea7
-/khahmedialarabic 16#fea8
-/kheicoptic 16#03e7
-/khhadeva 16#0959
-/khhagurmukhi 16#0a59
-/khieukhacirclekorean 16#3278
-/khieukhaparenkorean 16#3218
-/khieukhcirclekorean 16#326a
-/khieukhkorean 16#314b
-/khieukhparenkorean 16#320a
-/khokhaithai 16#0e02
-/khokhonthai 16#0e05
-/khokhuatthai 16#0e03
-/khokhwaithai 16#0e04
-/khomutthai 16#0e5b
-/khook 16#0199
-/khorakhangthai 16#0e06
-/khzsquare 16#3391
-/kihiragana 16#304d
-/kikatakana 16#30ad
-/kikatakanahalfwidth 16#ff77
-/kiroguramusquare 16#3315
-/kiromeetorusquare 16#3316
-/kirosquare 16#3314
-/kiyeokacirclekorean 16#326e
-/kiyeokaparenkorean 16#320e
-/kiyeokcirclekorean 16#3260
-/kiyeokkorean 16#3131
-/kiyeokparenkorean 16#3200
-/kiyeoksioskorean 16#3133
-/kjecyrillic 16#045c
-/klinebelow 16#1e35
-/klsquare 16#3398
-/kmcubedsquare 16#33a6
-/kmonospace 16#ff4b
-/kmsquaredsquare 16#33a2
-/kohiragana 16#3053
-/kohmsquare 16#33c0
-/kokaithai 16#0e01
-/kokatakana 16#30b3
-/kokatakanahalfwidth 16#ff7a
-/kooposquare 16#331e
-/koppacyrillic 16#0481
-/koreanstandardsymbol 16#327f
-/koroniscmb 16#0343
-/kparen 16#24a6
-/kpasquare 16#33aa
-/ksicyrillic 16#046f
-/ktsquare 16#33cf
-/kturned 16#029e
-/kuhiragana 16#304f
-/kukatakana 16#30af
-/kukatakanahalfwidth 16#ff78
-/kvsquare 16#33b8
-/kwsquare 16#33be
-/l 16#006c
-/labengali 16#09b2
-/lacute 16#013a
-/ladeva 16#0932
-/lagujarati 16#0ab2
-/lagurmukhi 16#0a32
-/lakkhangyaothai 16#0e45
-/lamaleffinalarabic 16#fefc
-/lamalefhamzaabovefinalarabic 16#fef8
-/lamalefhamzaaboveisolatedarabic 16#fef7
-/lamalefhamzabelowfinalarabic 16#fefa
-/lamalefhamzabelowisolatedarabic 16#fef9
-/lamalefisolatedarabic 16#fefb
-/lamalefmaddaabovefinalarabic 16#fef6
-/lamalefmaddaaboveisolatedarabic 16#fef5
-/lamarabic 16#0644
-/lambda 16#03bb
-/lambdastroke 16#019b
-/lamed 16#05dc
-/lameddagesh 16#fb3c
-/lameddageshhebrew 16#fb3c
-/lamedhebrew 16#05dc
-/lamfinalarabic 16#fede
-/lamhahinitialarabic 16#fcca
-/laminitialarabic 16#fedf
-/lamjeeminitialarabic 16#fcc9
-/lamkhahinitialarabic 16#fccb
-/lamlamhehisolatedarabic 16#fdf2
-/lammedialarabic 16#fee0
-/lammeemhahinitialarabic 16#fd88
-/lammeeminitialarabic 16#fccc
-/largecircle 16#25ef
-/lbar 16#019a
-/lbelt 16#026c
-/lbopomofo 16#310c
-/lcaron 16#013e
-/lcedilla 16#013c
-/lcircle 16#24db
-/lcircumflexbelow 16#1e3d
-/lcommaaccent 16#013c
-/ldot 16#0140
-/ldotaccent 16#0140
-/ldotbelow 16#1e37
-/ldotbelowmacron 16#1e39
-/leftangleabovecmb 16#031a
-/lefttackbelowcmb 16#0318
-/less 16#003c
-/lessequal 16#2264
-/lessequalorgreater 16#22da
-/lessmonospace 16#ff1c
-/lessorequivalent 16#2272
-/lessorgreater 16#2276
-/lessoverequal 16#2266
-/lesssmall 16#fe64
-/lezh 16#026e
-/lfblock 16#258c
-/lhookretroflex 16#026d
-/lira 16#20a4
-/liwnarmenian 16#056c
-/lj 16#01c9
-/ljecyrillic 16#0459
-/ll 16#f6c0
-/lladeva 16#0933
-/llagujarati 16#0ab3
-/llinebelow 16#1e3b
-/llladeva 16#0934
-/llvocalicbengali 16#09e1
-/llvocalicdeva 16#0961
-/llvocalicvowelsignbengali 16#09e3
-/llvocalicvowelsigndeva 16#0963
-/lmiddletilde 16#026b
-/lmonospace 16#ff4c
-/lmsquare 16#33d0
-/lochulathai 16#0e2c
-/logicaland 16#2227
-/logicalnot 16#00ac
-/logicalnotreversed 16#2310
-/logicalor 16#2228
-/lolingthai 16#0e25
-/longs 16#017f
-/lowlinecenterline 16#fe4e
-/lowlinecmb 16#0332
-/lowlinedashed 16#fe4d
-/lozenge 16#25ca
-/lparen 16#24a7
-/lslash 16#0142
-/lsquare 16#2113
-/lsuperior 16#f6ee
-/ltshade 16#2591
-/luthai 16#0e26
-/lvocalicbengali 16#098c
-/lvocalicdeva 16#090c
-/lvocalicvowelsignbengali 16#09e2
-/lvocalicvowelsigndeva 16#0962
-/lxsquare 16#33d3
-/m 16#006d
-/mabengali 16#09ae
-/macron 16#00af
-/macronbelowcmb 16#0331
-/macroncmb 16#0304
-/macronlowmod 16#02cd
-/macronmonospace 16#ffe3
-/macute 16#1e3f
-/madeva 16#092e
-/magujarati 16#0aae
-/magurmukhi 16#0a2e
-/mahapakhhebrew 16#05a4
-/mahapakhlefthebrew 16#05a4
-/mahiragana 16#307e
-/maichattawalowleftthai 16#f895
-/maichattawalowrightthai 16#f894
-/maichattawathai 16#0e4b
-/maichattawaupperleftthai 16#f893
-/maieklowleftthai 16#f88c
-/maieklowrightthai 16#f88b
-/maiekthai 16#0e48
-/maiekupperleftthai 16#f88a
-/maihanakatleftthai 16#f884
-/maihanakatthai 16#0e31
-/maitaikhuleftthai 16#f889
-/maitaikhuthai 16#0e47
-/maitholowleftthai 16#f88f
-/maitholowrightthai 16#f88e
-/maithothai 16#0e49
-/maithoupperleftthai 16#f88d
-/maitrilowleftthai 16#f892
-/maitrilowrightthai 16#f891
-/maitrithai 16#0e4a
-/maitriupperleftthai 16#f890
-/maiyamokthai 16#0e46
-/makatakana 16#30de
-/makatakanahalfwidth 16#ff8f
-/male 16#2642
-/mansyonsquare 16#3347
-/maqafhebrew 16#05be
-/mars 16#2642
-/masoracirclehebrew 16#05af
-/masquare 16#3383
-/mbopomofo 16#3107
-/mbsquare 16#33d4
-/mcircle 16#24dc
-/mcubedsquare 16#33a5
-/mdotaccent 16#1e41
-/mdotbelow 16#1e43
-/meemarabic 16#0645
-/meemfinalarabic 16#fee2
-/meeminitialarabic 16#fee3
-/meemmedialarabic 16#fee4
-/meemmeeminitialarabic 16#fcd1
-/meemmeemisolatedarabic 16#fc48
-/meetorusquare 16#334d
-/mehiragana 16#3081
-/meizierasquare 16#337e
-/mekatakana 16#30e1
-/mekatakanahalfwidth 16#ff92
-/mem 16#05de
-/memdagesh 16#fb3e
-/memdageshhebrew 16#fb3e
-/memhebrew 16#05de
-/menarmenian 16#0574
-/merkhahebrew 16#05a5
-/merkhakefulahebrew 16#05a6
-/merkhakefulalefthebrew 16#05a6
-/merkhalefthebrew 16#05a5
-/mhook 16#0271
-/mhzsquare 16#3392
-/middledotkatakanahalfwidth 16#ff65
-/middot 16#00b7
-/mieumacirclekorean 16#3272
-/mieumaparenkorean 16#3212
-/mieumcirclekorean 16#3264
-/mieumkorean 16#3141
-/mieumpansioskorean 16#3170
-/mieumparenkorean 16#3204
-/mieumpieupkorean 16#316e
-/mieumsioskorean 16#316f
-/mihiragana 16#307f
-/mikatakana 16#30df
-/mikatakanahalfwidth 16#ff90
-/minus 16#2212
-/minusbelowcmb 16#0320
-/minuscircle 16#2296
-/minusmod 16#02d7
-/minusplus 16#2213
-/minute 16#2032
-/miribaarusquare 16#334a
-/mirisquare 16#3349
-/mlonglegturned 16#0270
-/mlsquare 16#3396
-/mmcubedsquare 16#33a3
-/mmonospace 16#ff4d
-/mmsquaredsquare 16#339f
-/mohiragana 16#3082
-/mohmsquare 16#33c1
-/mokatakana 16#30e2
-/mokatakanahalfwidth 16#ff93
-/molsquare 16#33d6
-/momathai 16#0e21
-/moverssquare 16#33a7
-/moverssquaredsquare 16#33a8
-/mparen 16#24a8
-/mpasquare 16#33ab
-/mssquare 16#33b3
-/msuperior 16#f6ef
-/mturned 16#026f
-/mu 16#00b5
-/mu1 16#00b5
-/muasquare 16#3382
-/muchgreater 16#226b
-/muchless 16#226a
-/mufsquare 16#338c
-/mugreek 16#03bc
-/mugsquare 16#338d
-/muhiragana 16#3080
-/mukatakana 16#30e0
-/mukatakanahalfwidth 16#ff91
-/mulsquare 16#3395
-/multiply 16#00d7
-/mumsquare 16#339b
-/munahhebrew 16#05a3
-/munahlefthebrew 16#05a3
-/musicalnote 16#266a
-/musicalnotedbl 16#266b
-/musicflatsign 16#266d
-/musicsharpsign 16#266f
-/mussquare 16#33b2
-/muvsquare 16#33b6
-/muwsquare 16#33bc
-/mvmegasquare 16#33b9
-/mvsquare 16#33b7
-/mwmegasquare 16#33bf
-/mwsquare 16#33bd
-/n 16#006e
-/nabengali 16#09a8
-/nabla 16#2207
-/nacute 16#0144
-/nadeva 16#0928
-/nagujarati 16#0aa8
-/nagurmukhi 16#0a28
-/nahiragana 16#306a
-/nakatakana 16#30ca
-/nakatakanahalfwidth 16#ff85
-/napostrophe 16#0149
-/nasquare 16#3381
-/nbopomofo 16#310b
-/nbspace 16#00a0
-/ncaron 16#0148
-/ncedilla 16#0146
-/ncircle 16#24dd
-/ncircumflexbelow 16#1e4b
-/ncommaaccent 16#0146
-/ndotaccent 16#1e45
-/ndotbelow 16#1e47
-/nehiragana 16#306d
-/nekatakana 16#30cd
-/nekatakanahalfwidth 16#ff88
-/newsheqelsign 16#20aa
-/nfsquare 16#338b
-/ngabengali 16#0999
-/ngadeva 16#0919
-/ngagujarati 16#0a99
-/ngagurmukhi 16#0a19
-/ngonguthai 16#0e07
-/nhiragana 16#3093
-/nhookleft 16#0272
-/nhookretroflex 16#0273
-/nieunacirclekorean 16#326f
-/nieunaparenkorean 16#320f
-/nieuncieuckorean 16#3135
-/nieuncirclekorean 16#3261
-/nieunhieuhkorean 16#3136
-/nieunkorean 16#3134
-/nieunpansioskorean 16#3168
-/nieunparenkorean 16#3201
-/nieunsioskorean 16#3167
-/nieuntikeutkorean 16#3166
-/nihiragana 16#306b
-/nikatakana 16#30cb
-/nikatakanahalfwidth 16#ff86
-/nikhahitleftthai 16#f899
-/nikhahitthai 16#0e4d
-/nine 16#0039
-/ninearabic 16#0669
-/ninebengali 16#09ef
-/ninecircle 16#2468
-/ninecircleinversesansserif 16#2792
-/ninedeva 16#096f
-/ninegujarati 16#0aef
-/ninegurmukhi 16#0a6f
-/ninehackarabic 16#0669
-/ninehangzhou 16#3029
-/nineideographicparen 16#3228
-/nineinferior 16#2089
-/ninemonospace 16#ff19
-/nineoldstyle 16#f739
-/nineparen 16#247c
-/nineperiod 16#2490
-/ninepersian 16#06f9
-/nineroman 16#2178
-/ninesuperior 16#2079
-/nineteencircle 16#2472
-/nineteenparen 16#2486
-/nineteenperiod 16#249a
-/ninethai 16#0e59
-/nj 16#01cc
-/njecyrillic 16#045a
-/nkatakana 16#30f3
-/nkatakanahalfwidth 16#ff9d
-/nlegrightlong 16#019e
-/nlinebelow 16#1e49
-/nmonospace 16#ff4e
-/nmsquare 16#339a
-/nnabengali 16#09a3
-/nnadeva 16#0923
-/nnagujarati 16#0aa3
-/nnagurmukhi 16#0a23
-/nnnadeva 16#0929
-/nohiragana 16#306e
-/nokatakana 16#30ce
-/nokatakanahalfwidth 16#ff89
-/nonbreakingspace 16#00a0
-/nonenthai 16#0e13
-/nonuthai 16#0e19
-/noonarabic 16#0646
-/noonfinalarabic 16#fee6
-/noonghunnaarabic 16#06ba
-/noonghunnafinalarabic 16#fb9f
-/nooninitialarabic 16#fee7
-/noonjeeminitialarabic 16#fcd2
-/noonjeemisolatedarabic 16#fc4b
-/noonmedialarabic 16#fee8
-/noonmeeminitialarabic 16#fcd5
-/noonmeemisolatedarabic 16#fc4e
-/noonnoonfinalarabic 16#fc8d
-/notcontains 16#220c
-/notelement 16#2209
-/notelementof 16#2209
-/notequal 16#2260
-/notgreater 16#226f
-/notgreaternorequal 16#2271
-/notgreaternorless 16#2279
-/notidentical 16#2262
-/notless 16#226e
-/notlessnorequal 16#2270
-/notparallel 16#2226
-/notprecedes 16#2280
-/notsubset 16#2284
-/notsucceeds 16#2281
-/notsuperset 16#2285
-/nowarmenian 16#0576
-/nparen 16#24a9
-/nssquare 16#33b1
-/nsuperior 16#207f
-/ntilde 16#00f1
-/nu 16#03bd
-/nuhiragana 16#306c
-/nukatakana 16#30cc
-/nukatakanahalfwidth 16#ff87
-/nuktabengali 16#09bc
-/nuktadeva 16#093c
-/nuktagujarati 16#0abc
-/nuktagurmukhi 16#0a3c
-/numbersign 16#0023
-/numbersignmonospace 16#ff03
-/numbersignsmall 16#fe5f
-/numeralsigngreek 16#0374
-/numeralsignlowergreek 16#0375
-/numero 16#2116
-/nun 16#05e0
-/nundagesh 16#fb40
-/nundageshhebrew 16#fb40
-/nunhebrew 16#05e0
-/nvsquare 16#33b5
-/nwsquare 16#33bb
-/nyabengali 16#099e
-/nyadeva 16#091e
-/nyagujarati 16#0a9e
-/nyagurmukhi 16#0a1e
-/o 16#006f
-/oacute 16#00f3
-/oangthai 16#0e2d
-/obarred 16#0275
-/obarredcyrillic 16#04e9
-/obarreddieresiscyrillic 16#04eb
-/obengali 16#0993
-/obopomofo 16#311b
-/obreve 16#014f
-/ocandradeva 16#0911
-/ocandragujarati 16#0a91
-/ocandravowelsigndeva 16#0949
-/ocandravowelsigngujarati 16#0ac9
-/ocaron 16#01d2
-/ocircle 16#24de
-/ocircumflex 16#00f4
-/ocircumflexacute 16#1ed1
-/ocircumflexdotbelow 16#1ed9
-/ocircumflexgrave 16#1ed3
-/ocircumflexhookabove 16#1ed5
-/ocircumflextilde 16#1ed7
-/ocyrillic 16#043e
-/odblacute 16#0151
-/odblgrave 16#020d
-/odeva 16#0913
-/odieresis 16#00f6
-/odieresiscyrillic 16#04e7
-/odotbelow 16#1ecd
-/oe 16#0153
-/oekorean 16#315a
-/ogonek 16#02db
-/ogonekcmb 16#0328
-/ograve 16#00f2
-/ogujarati 16#0a93
-/oharmenian 16#0585
-/ohiragana 16#304a
-/ohookabove 16#1ecf
-/ohorn 16#01a1
-/ohornacute 16#1edb
-/ohorndotbelow 16#1ee3
-/ohorngrave 16#1edd
-/ohornhookabove 16#1edf
-/ohorntilde 16#1ee1
-/ohungarumlaut 16#0151
-/oi 16#01a3
-/oinvertedbreve 16#020f
-/okatakana 16#30aa
-/okatakanahalfwidth 16#ff75
-/okorean 16#3157
-/olehebrew 16#05ab
-/omacron 16#014d
-/omacronacute 16#1e53
-/omacrongrave 16#1e51
-/omdeva 16#0950
-/omega 16#03c9
-/omega1 16#03d6
-/omegacyrillic 16#0461
-/omegalatinclosed 16#0277
-/omegaroundcyrillic 16#047b
-/omegatitlocyrillic 16#047d
-/omegatonos 16#03ce
-/omgujarati 16#0ad0
-/omicron 16#03bf
-/omicrontonos 16#03cc
-/omonospace 16#ff4f
-/one 16#0031
-/onearabic 16#0661
-/onebengali 16#09e7
-/onecircle 16#2460
-/onecircleinversesansserif 16#278a
-/onedeva 16#0967
-/onedotenleader 16#2024
-/oneeighth 16#215b
-/onefitted 16#f6dc
-/onegujarati 16#0ae7
-/onegurmukhi 16#0a67
-/onehackarabic 16#0661
-/onehalf 16#00bd
-/onehangzhou 16#3021
-/oneideographicparen 16#3220
-/oneinferior 16#2081
-/onemonospace 16#ff11
-/onenumeratorbengali 16#09f4
-/oneoldstyle 16#f731
-/oneparen 16#2474
-/oneperiod 16#2488
-/onepersian 16#06f1
-/onequarter 16#00bc
-/oneroman 16#2170
-/onesuperior 16#00b9
-/onethai 16#0e51
-/onethird 16#2153
-/oogonek 16#01eb
-/oogonekmacron 16#01ed
-/oogurmukhi 16#0a13
-/oomatragurmukhi 16#0a4b
-/oopen 16#0254
-/oparen 16#24aa
-/openbullet 16#25e6
-/option 16#2325
-/ordfeminine 16#00aa
-/ordmasculine 16#00ba
-/orthogonal 16#221f
-/oshortdeva 16#0912
-/oshortvowelsigndeva 16#094a
-/oslash 16#00f8
-/oslashacute 16#01ff
-/osmallhiragana 16#3049
-/osmallkatakana 16#30a9
-/osmallkatakanahalfwidth 16#ff6b
-/ostrokeacute 16#01ff
-/osuperior 16#f6f0
-/otcyrillic 16#047f
-/otilde 16#00f5
-/otildeacute 16#1e4d
-/otildedieresis 16#1e4f
-/oubopomofo 16#3121
-/overline 16#203e
-/overlinecenterline 16#fe4a
-/overlinecmb 16#0305
-/overlinedashed 16#fe49
-/overlinedblwavy 16#fe4c
-/overlinewavy 16#fe4b
-/overscore 16#00af
-/ovowelsignbengali 16#09cb
-/ovowelsigndeva 16#094b
-/ovowelsigngujarati 16#0acb
-/p 16#0070
-/paampssquare 16#3380
-/paasentosquare 16#332b
-/pabengali 16#09aa
-/pacute 16#1e55
-/padeva 16#092a
-/pagedown 16#21df
-/pageup 16#21de
-/pagujarati 16#0aaa
-/pagurmukhi 16#0a2a
-/pahiragana 16#3071
-/paiyannoithai 16#0e2f
-/pakatakana 16#30d1
-/palatalizationcyrilliccmb 16#0484
-/palochkacyrillic 16#04c0
-/pansioskorean 16#317f
-/paragraph 16#00b6
-/parallel 16#2225
-/parenleft 16#0028
-/parenleftaltonearabic 16#fd3e
-/parenleftbt 16#f8ed
-/parenleftex 16#f8ec
-/parenleftinferior 16#208d
-/parenleftmonospace 16#ff08
-/parenleftsmall 16#fe59
-/parenleftsuperior 16#207d
-/parenlefttp 16#f8eb
-/parenleftvertical 16#fe35
-/parenright 16#0029
-/parenrightaltonearabic 16#fd3f
-/parenrightbt 16#f8f8
-/parenrightex 16#f8f7
-/parenrightinferior 16#208e
-/parenrightmonospace 16#ff09
-/parenrightsmall 16#fe5a
-/parenrightsuperior 16#207e
-/parenrighttp 16#f8f6
-/parenrightvertical 16#fe36
-/partialdiff 16#2202
-/paseqhebrew 16#05c0
-/pashtahebrew 16#0599
-/pasquare 16#33a9
-/patah 16#05b7
-/patah11 16#05b7
-/patah1d 16#05b7
-/patah2a 16#05b7
-/patahhebrew 16#05b7
-/patahnarrowhebrew 16#05b7
-/patahquarterhebrew 16#05b7
-/patahwidehebrew 16#05b7
-/pazerhebrew 16#05a1
-/pbopomofo 16#3106
-/pcircle 16#24df
-/pdotaccent 16#1e57
-/pe 16#05e4
-/pecyrillic 16#043f
-/pedagesh 16#fb44
-/pedageshhebrew 16#fb44
-/peezisquare 16#333b
-/pefinaldageshhebrew 16#fb43
-/peharabic 16#067e
-/peharmenian 16#057a
-/pehebrew 16#05e4
-/pehfinalarabic 16#fb57
-/pehinitialarabic 16#fb58
-/pehiragana 16#307a
-/pehmedialarabic 16#fb59
-/pekatakana 16#30da
-/pemiddlehookcyrillic 16#04a7
-/perafehebrew 16#fb4e
-/percent 16#0025
-/percentarabic 16#066a
-/percentmonospace 16#ff05
-/percentsmall 16#fe6a
-/period 16#002e
-/periodarmenian 16#0589
-/periodcentered 16#00b7
-/periodhalfwidth 16#ff61
-/periodinferior 16#f6e7
-/periodmonospace 16#ff0e
-/periodsmall 16#fe52
-/periodsuperior 16#f6e8
-/perispomenigreekcmb 16#0342
-/perpendicular 16#22a5
-/perthousand 16#2030
-/peseta 16#20a7
-/pfsquare 16#338a
-/phabengali 16#09ab
-/phadeva 16#092b
-/phagujarati 16#0aab
-/phagurmukhi 16#0a2b
-/phi 16#03c6
-/phi1 16#03d5
-/phieuphacirclekorean 16#327a
-/phieuphaparenkorean 16#321a
-/phieuphcirclekorean 16#326c
-/phieuphkorean 16#314d
-/phieuphparenkorean 16#320c
-/philatin 16#0278
-/phinthuthai 16#0e3a
-/phisymbolgreek 16#03d5
-/phook 16#01a5
-/phophanthai 16#0e1e
-/phophungthai 16#0e1c
-/phosamphaothai 16#0e20
-/pi 16#03c0
-/pieupacirclekorean 16#3273
-/pieupaparenkorean 16#3213
-/pieupcieuckorean 16#3176
-/pieupcirclekorean 16#3265
-/pieupkiyeokkorean 16#3172
-/pieupkorean 16#3142
-/pieupparenkorean 16#3205
-/pieupsioskiyeokkorean 16#3174
-/pieupsioskorean 16#3144
-/pieupsiostikeutkorean 16#3175
-/pieupthieuthkorean 16#3177
-/pieuptikeutkorean 16#3173
-/pihiragana 16#3074
-/pikatakana 16#30d4
-/pisymbolgreek 16#03d6
-/piwrarmenian 16#0583
-/plus 16#002b
-/plusbelowcmb 16#031f
-/pluscircle 16#2295
-/plusminus 16#00b1
-/plusmod 16#02d6
-/plusmonospace 16#ff0b
-/plussmall 16#fe62
-/plussuperior 16#207a
-/pmonospace 16#ff50
-/pmsquare 16#33d8
-/pohiragana 16#307d
-/pointingindexdownwhite 16#261f
-/pointingindexleftwhite 16#261c
-/pointingindexrightwhite 16#261e
-/pointingindexupwhite 16#261d
-/pokatakana 16#30dd
-/poplathai 16#0e1b
-/postalmark 16#3012
-/postalmarkface 16#3020
-/pparen 16#24ab
-/precedes 16#227a
-/prescription 16#211e
-/primemod 16#02b9
-/primereversed 16#2035
-/product 16#220f
-/projective 16#2305
-/prolongedkana 16#30fc
-/propellor 16#2318
-/propersubset 16#2282
-/propersuperset 16#2283
-/proportion 16#2237
-/proportional 16#221d
-/psi 16#03c8
-/psicyrillic 16#0471
-/psilipneumatacyrilliccmb 16#0486
-/pssquare 16#33b0
-/puhiragana 16#3077
-/pukatakana 16#30d7
-/pvsquare 16#33b4
-/pwsquare 16#33ba
-/q 16#0071
-/qadeva 16#0958
-/qadmahebrew 16#05a8
-/qafarabic 16#0642
-/qaffinalarabic 16#fed6
-/qafinitialarabic 16#fed7
-/qafmedialarabic 16#fed8
-/qamats 16#05b8
-/qamats10 16#05b8
-/qamats1a 16#05b8
-/qamats1c 16#05b8
-/qamats27 16#05b8
-/qamats29 16#05b8
-/qamats33 16#05b8
-/qamatsde 16#05b8
-/qamatshebrew 16#05b8
-/qamatsnarrowhebrew 16#05b8
-/qamatsqatanhebrew 16#05b8
-/qamatsqatannarrowhebrew 16#05b8
-/qamatsqatanquarterhebrew 16#05b8
-/qamatsqatanwidehebrew 16#05b8
-/qamatsquarterhebrew 16#05b8
-/qamatswidehebrew 16#05b8
-/qarneyparahebrew 16#059f
-/qbopomofo 16#3111
-/qcircle 16#24e0
-/qhook 16#02a0
-/qmonospace 16#ff51
-/qof 16#05e7
-/qofdagesh 16#fb47
-/qofdageshhebrew 16#fb47
-/qofhebrew 16#05e7
-/qparen 16#24ac
-/quarternote 16#2669
-/qubuts 16#05bb
-/qubuts18 16#05bb
-/qubuts25 16#05bb
-/qubuts31 16#05bb
-/qubutshebrew 16#05bb
-/qubutsnarrowhebrew 16#05bb
-/qubutsquarterhebrew 16#05bb
-/qubutswidehebrew 16#05bb
-/question 16#003f
-/questionarabic 16#061f
-/questionarmenian 16#055e
-/questiondown 16#00bf
-/questiondownsmall 16#f7bf
-/questiongreek 16#037e
-/questionmonospace 16#ff1f
-/questionsmall 16#f73f
-/quotedbl 16#0022
-/quotedblbase 16#201e
-/quotedblleft 16#201c
-/quotedblmonospace 16#ff02
-/quotedblprime 16#301e
-/quotedblprimereversed 16#301d
-/quotedblright 16#201d
-/quoteleft 16#2018
-/quoteleftreversed 16#201b
-/quotereversed 16#201b
-/quoteright 16#2019
-/quoterightn 16#0149
-/quotesinglbase 16#201a
-/quotesingle 16#0027
-/quotesinglemonospace 16#ff07
-/r 16#0072
-/raarmenian 16#057c
-/rabengali 16#09b0
-/racute 16#0155
-/radeva 16#0930
-/radical 16#221a
-/radicalex 16#f8e5
-/radoverssquare 16#33ae
-/radoverssquaredsquare 16#33af
-/radsquare 16#33ad
-/rafe 16#05bf
-/rafehebrew 16#05bf
-/ragujarati 16#0ab0
-/ragurmukhi 16#0a30
-/rahiragana 16#3089
-/rakatakana 16#30e9
-/rakatakanahalfwidth 16#ff97
-/ralowerdiagonalbengali 16#09f1
-/ramiddlediagonalbengali 16#09f0
-/ramshorn 16#0264
-/ratio 16#2236
-/rbopomofo 16#3116
-/rcaron 16#0159
-/rcedilla 16#0157
-/rcircle 16#24e1
-/rcommaaccent 16#0157
-/rdblgrave 16#0211
-/rdotaccent 16#1e59
-/rdotbelow 16#1e5b
-/rdotbelowmacron 16#1e5d
-/referencemark 16#203b
-/reflexsubset 16#2286
-/reflexsuperset 16#2287
-/registered 16#00ae
-/registersans 16#f8e8
-/registerserif 16#f6da
-/reharabic 16#0631
-/reharmenian 16#0580
-/rehfinalarabic 16#feae
-/rehiragana 16#308c
-/rekatakana 16#30ec
-/rekatakanahalfwidth 16#ff9a
-/resh 16#05e8
-/reshdageshhebrew 16#fb48
-/reshhebrew 16#05e8
-/reversedtilde 16#223d
-/reviahebrew 16#0597
-/reviamugrashhebrew 16#0597
-/revlogicalnot 16#2310
-/rfishhook 16#027e
-/rfishhookreversed 16#027f
-/rhabengali 16#09dd
-/rhadeva 16#095d
-/rho 16#03c1
-/rhook 16#027d
-/rhookturned 16#027b
-/rhookturnedsuperior 16#02b5
-/rhosymbolgreek 16#03f1
-/rhotichookmod 16#02de
-/rieulacirclekorean 16#3271
-/rieulaparenkorean 16#3211
-/rieulcirclekorean 16#3263
-/rieulhieuhkorean 16#3140
-/rieulkiyeokkorean 16#313a
-/rieulkiyeoksioskorean 16#3169
-/rieulkorean 16#3139
-/rieulmieumkorean 16#313b
-/rieulpansioskorean 16#316c
-/rieulparenkorean 16#3203
-/rieulphieuphkorean 16#313f
-/rieulpieupkorean 16#313c
-/rieulpieupsioskorean 16#316b
-/rieulsioskorean 16#313d
-/rieulthieuthkorean 16#313e
-/rieultikeutkorean 16#316a
-/rieulyeorinhieuhkorean 16#316d
-/rightangle 16#221f
-/righttackbelowcmb 16#0319
-/righttriangle 16#22bf
-/rihiragana 16#308a
-/rikatakana 16#30ea
-/rikatakanahalfwidth 16#ff98
-/ring 16#02da
-/ringbelowcmb 16#0325
-/ringcmb 16#030a
-/ringhalfleft 16#02bf
-/ringhalfleftarmenian 16#0559
-/ringhalfleftbelowcmb 16#031c
-/ringhalfleftcentered 16#02d3
-/ringhalfright 16#02be
-/ringhalfrightbelowcmb 16#0339
-/ringhalfrightcentered 16#02d2
-/rinvertedbreve 16#0213
-/rittorusquare 16#3351
-/rlinebelow 16#1e5f
-/rlongleg 16#027c
-/rlonglegturned 16#027a
-/rmonospace 16#ff52
-/rohiragana 16#308d
-/rokatakana 16#30ed
-/rokatakanahalfwidth 16#ff9b
-/roruathai 16#0e23
-/rparen 16#24ad
-/rrabengali 16#09dc
-/rradeva 16#0931
-/rragurmukhi 16#0a5c
-/rreharabic 16#0691
-/rrehfinalarabic 16#fb8d
-/rrvocalicbengali 16#09e0
-/rrvocalicdeva 16#0960
-/rrvocalicgujarati 16#0ae0
-/rrvocalicvowelsignbengali 16#09c4
-/rrvocalicvowelsigndeva 16#0944
-/rrvocalicvowelsigngujarati 16#0ac4
-/rsuperior 16#f6f1
-/rtblock 16#2590
-/rturned 16#0279
-/rturnedsuperior 16#02b4
-/ruhiragana 16#308b
-/rukatakana 16#30eb
-/rukatakanahalfwidth 16#ff99
-/rupeemarkbengali 16#09f2
-/rupeesignbengali 16#09f3
-/rupiah 16#f6dd
-/ruthai 16#0e24
-/rvocalicbengali 16#098b
-/rvocalicdeva 16#090b
-/rvocalicgujarati 16#0a8b
-/rvocalicvowelsignbengali 16#09c3
-/rvocalicvowelsigndeva 16#0943
-/rvocalicvowelsigngujarati 16#0ac3
-/s 16#0073
-/sabengali 16#09b8
-/sacute 16#015b
-/sacutedotaccent 16#1e65
-/sadarabic 16#0635
-/sadeva 16#0938
-/sadfinalarabic 16#feba
-/sadinitialarabic 16#febb
-/sadmedialarabic 16#febc
-/sagujarati 16#0ab8
-/sagurmukhi 16#0a38
-/sahiragana 16#3055
-/sakatakana 16#30b5
-/sakatakanahalfwidth 16#ff7b
-/sallallahoualayhewasallamarabic 16#fdfa
-/samekh 16#05e1
-/samekhdagesh 16#fb41
-/samekhdageshhebrew 16#fb41
-/samekhhebrew 16#05e1
-/saraaathai 16#0e32
-/saraaethai 16#0e41
-/saraaimaimalaithai 16#0e44
-/saraaimaimuanthai 16#0e43
-/saraamthai 16#0e33
-/saraathai 16#0e30
-/saraethai 16#0e40
-/saraiileftthai 16#f886
-/saraiithai 16#0e35
-/saraileftthai 16#f885
-/saraithai 16#0e34
-/saraothai 16#0e42
-/saraueeleftthai 16#f888
-/saraueethai 16#0e37
-/saraueleftthai 16#f887
-/sarauethai 16#0e36
-/sarauthai 16#0e38
-/sarauuthai 16#0e39
-/sbopomofo 16#3119
-/scaron 16#0161
-/scarondotaccent 16#1e67
-/scedilla 16#015f
-/schwa 16#0259
-/schwacyrillic 16#04d9
-/schwadieresiscyrillic 16#04db
-/schwahook 16#025a
-/scircle 16#24e2
-/scircumflex 16#015d
-/scommaaccent 16#0219
-/sdotaccent 16#1e61
-/sdotbelow 16#1e63
-/sdotbelowdotaccent 16#1e69
-/seagullbelowcmb 16#033c
-/second 16#2033
-/secondtonechinese 16#02ca
-/section 16#00a7
-/seenarabic 16#0633
-/seenfinalarabic 16#feb2
-/seeninitialarabic 16#feb3
-/seenmedialarabic 16#feb4
-/segol 16#05b6
-/segol13 16#05b6
-/segol1f 16#05b6
-/segol2c 16#05b6
-/segolhebrew 16#05b6
-/segolnarrowhebrew 16#05b6
-/segolquarterhebrew 16#05b6
-/segoltahebrew 16#0592
-/segolwidehebrew 16#05b6
-/seharmenian 16#057d
-/sehiragana 16#305b
-/sekatakana 16#30bb
-/sekatakanahalfwidth 16#ff7e
-/semicolon 16#003b
-/semicolonarabic 16#061b
-/semicolonmonospace 16#ff1b
-/semicolonsmall 16#fe54
-/semivoicedmarkkana 16#309c
-/semivoicedmarkkanahalfwidth 16#ff9f
-/sentisquare 16#3322
-/sentosquare 16#3323
-/seven 16#0037
-/sevenarabic 16#0667
-/sevenbengali 16#09ed
-/sevencircle 16#2466
-/sevencircleinversesansserif 16#2790
-/sevendeva 16#096d
-/seveneighths 16#215e
-/sevengujarati 16#0aed
-/sevengurmukhi 16#0a6d
-/sevenhackarabic 16#0667
-/sevenhangzhou 16#3027
-/sevenideographicparen 16#3226
-/seveninferior 16#2087
-/sevenmonospace 16#ff17
-/sevenoldstyle 16#f737
-/sevenparen 16#247a
-/sevenperiod 16#248e
-/sevenpersian 16#06f7
-/sevenroman 16#2176
-/sevensuperior 16#2077
-/seventeencircle 16#2470
-/seventeenparen 16#2484
-/seventeenperiod 16#2498
-/seventhai 16#0e57
-/sfthyphen 16#00ad
-/shaarmenian 16#0577
-/shabengali 16#09b6
-/shacyrillic 16#0448
-/shaddaarabic 16#0651
-/shaddadammaarabic 16#fc61
-/shaddadammatanarabic 16#fc5e
-/shaddafathaarabic 16#fc60
-/shaddakasraarabic 16#fc62
-/shaddakasratanarabic 16#fc5f
-/shade 16#2592
-/shadedark 16#2593
-/shadelight 16#2591
-/shademedium 16#2592
-/shadeva 16#0936
-/shagujarati 16#0ab6
-/shagurmukhi 16#0a36
-/shalshelethebrew 16#0593
-/shbopomofo 16#3115
-/shchacyrillic 16#0449
-/sheenarabic 16#0634
-/sheenfinalarabic 16#feb6
-/sheeninitialarabic 16#feb7
-/sheenmedialarabic 16#feb8
-/sheicoptic 16#03e3
-/sheqel 16#20aa
-/sheqelhebrew 16#20aa
-/sheva 16#05b0
-/sheva115 16#05b0
-/sheva15 16#05b0
-/sheva22 16#05b0
-/sheva2e 16#05b0
-/shevahebrew 16#05b0
-/shevanarrowhebrew 16#05b0
-/shevaquarterhebrew 16#05b0
-/shevawidehebrew 16#05b0
-/shhacyrillic 16#04bb
-/shimacoptic 16#03ed
-/shin 16#05e9
-/shindagesh 16#fb49
-/shindageshhebrew 16#fb49
-/shindageshshindot 16#fb2c
-/shindageshshindothebrew 16#fb2c
-/shindageshsindot 16#fb2d
-/shindageshsindothebrew 16#fb2d
-/shindothebrew 16#05c1
-/shinhebrew 16#05e9
-/shinshindot 16#fb2a
-/shinshindothebrew 16#fb2a
-/shinsindot 16#fb2b
-/shinsindothebrew 16#fb2b
-/shook 16#0282
-/sigma 16#03c3
-/sigma1 16#03c2
-/sigmafinal 16#03c2
-/sigmalunatesymbolgreek 16#03f2
-/sihiragana 16#3057
-/sikatakana 16#30b7
-/sikatakanahalfwidth 16#ff7c
-/siluqhebrew 16#05bd
-/siluqlefthebrew 16#05bd
-/similar 16#223c
-/sindothebrew 16#05c2
-/siosacirclekorean 16#3274
-/siosaparenkorean 16#3214
-/sioscieuckorean 16#317e
-/sioscirclekorean 16#3266
-/sioskiyeokkorean 16#317a
-/sioskorean 16#3145
-/siosnieunkorean 16#317b
-/siosparenkorean 16#3206
-/siospieupkorean 16#317d
-/siostikeutkorean 16#317c
-/six 16#0036
-/sixarabic 16#0666
-/sixbengali 16#09ec
-/sixcircle 16#2465
-/sixcircleinversesansserif 16#278f
-/sixdeva 16#096c
-/sixgujarati 16#0aec
-/sixgurmukhi 16#0a6c
-/sixhackarabic 16#0666
-/sixhangzhou 16#3026
-/sixideographicparen 16#3225
-/sixinferior 16#2086
-/sixmonospace 16#ff16
-/sixoldstyle 16#f736
-/sixparen 16#2479
-/sixperiod 16#248d
-/sixpersian 16#06f6
-/sixroman 16#2175
-/sixsuperior 16#2076
-/sixteencircle 16#246f
-/sixteencurrencydenominatorbengali 16#09f9
-/sixteenparen 16#2483
-/sixteenperiod 16#2497
-/sixthai 16#0e56
-/slash 16#002f
-/slashmonospace 16#ff0f
-/slong 16#017f
-/slongdotaccent 16#1e9b
-/smileface 16#263a
-/smonospace 16#ff53
-/sofpasuqhebrew 16#05c3
-/softhyphen 16#00ad
-/softsigncyrillic 16#044c
-/sohiragana 16#305d
-/sokatakana 16#30bd
-/sokatakanahalfwidth 16#ff7f
-/soliduslongoverlaycmb 16#0338
-/solidusshortoverlaycmb 16#0337
-/sorusithai 16#0e29
-/sosalathai 16#0e28
-/sosothai 16#0e0b
-/sosuathai 16#0e2a
-/space 16#0020
-/spacehackarabic 16#0020
-/spade 16#2660
-/spadesuitblack 16#2660
-/spadesuitwhite 16#2664
-/sparen 16#24ae
-/squarebelowcmb 16#033b
-/squarecc 16#33c4
-/squarecm 16#339d
-/squarediagonalcrosshatchfill 16#25a9
-/squarehorizontalfill 16#25a4
-/squarekg 16#338f
-/squarekm 16#339e
-/squarekmcapital 16#33ce
-/squareln 16#33d1
-/squarelog 16#33d2
-/squaremg 16#338e
-/squaremil 16#33d5
-/squaremm 16#339c
-/squaremsquared 16#33a1
-/squareorthogonalcrosshatchfill 16#25a6
-/squareupperlefttolowerrightfill 16#25a7
-/squareupperrighttolowerleftfill 16#25a8
-/squareverticalfill 16#25a5
-/squarewhitewithsmallblack 16#25a3
-/srsquare 16#33db
-/ssabengali 16#09b7
-/ssadeva 16#0937
-/ssagujarati 16#0ab7
-/ssangcieuckorean 16#3149
-/ssanghieuhkorean 16#3185
-/ssangieungkorean 16#3180
-/ssangkiyeokkorean 16#3132
-/ssangnieunkorean 16#3165
-/ssangpieupkorean 16#3143
-/ssangsioskorean 16#3146
-/ssangtikeutkorean 16#3138
-/ssuperior 16#f6f2
-/sterling 16#00a3
-/sterlingmonospace 16#ffe1
-/strokelongoverlaycmb 16#0336
-/strokeshortoverlaycmb 16#0335
-/subset 16#2282
-/subsetnotequal 16#228a
-/subsetorequal 16#2286
-/succeeds 16#227b
-/suchthat 16#220b
-/suhiragana 16#3059
-/sukatakana 16#30b9
-/sukatakanahalfwidth 16#ff7d
-/sukunarabic 16#0652
-/summation 16#2211
-/sun 16#263c
-/superset 16#2283
-/supersetnotequal 16#228b
-/supersetorequal 16#2287
-/svsquare 16#33dc
-/syouwaerasquare 16#337c
-/t 16#0074
-/tabengali 16#09a4
-/tackdown 16#22a4
-/tackleft 16#22a3
-/tadeva 16#0924
-/tagujarati 16#0aa4
-/tagurmukhi 16#0a24
-/taharabic 16#0637
-/tahfinalarabic 16#fec2
-/tahinitialarabic 16#fec3
-/tahiragana 16#305f
-/tahmedialarabic 16#fec4
-/taisyouerasquare 16#337d
-/takatakana 16#30bf
-/takatakanahalfwidth 16#ff80
-/tatweelarabic 16#0640
-/tau 16#03c4
-/tav 16#05ea
-/tavdages 16#fb4a
-/tavdagesh 16#fb4a
-/tavdageshhebrew 16#fb4a
-/tavhebrew 16#05ea
-/tbar 16#0167
-/tbopomofo 16#310a
-/tcaron 16#0165
-/tccurl 16#02a8
-/tcedilla 16#0163
-/tcheharabic 16#0686
-/tchehfinalarabic 16#fb7b
-/tchehinitialarabic 16#fb7c
-/tchehmedialarabic 16#fb7d
-/tcircle 16#24e3
-/tcircumflexbelow 16#1e71
-/tcommaaccent 16#0163
-/tdieresis 16#1e97
-/tdotaccent 16#1e6b
-/tdotbelow 16#1e6d
-/tecyrillic 16#0442
-/tedescendercyrillic 16#04ad
-/teharabic 16#062a
-/tehfinalarabic 16#fe96
-/tehhahinitialarabic 16#fca2
-/tehhahisolatedarabic 16#fc0c
-/tehinitialarabic 16#fe97
-/tehiragana 16#3066
-/tehjeeminitialarabic 16#fca1
-/tehjeemisolatedarabic 16#fc0b
-/tehmarbutaarabic 16#0629
-/tehmarbutafinalarabic 16#fe94
-/tehmedialarabic 16#fe98
-/tehmeeminitialarabic 16#fca4
-/tehmeemisolatedarabic 16#fc0e
-/tehnoonfinalarabic 16#fc73
-/tekatakana 16#30c6
-/tekatakanahalfwidth 16#ff83
-/telephone 16#2121
-/telephoneblack 16#260e
-/telishagedolahebrew 16#05a0
-/telishaqetanahebrew 16#05a9
-/tencircle 16#2469
-/tenideographicparen 16#3229
-/tenparen 16#247d
-/tenperiod 16#2491
-/tenroman 16#2179
-/tesh 16#02a7
-/tet 16#05d8
-/tetdagesh 16#fb38
-/tetdageshhebrew 16#fb38
-/tethebrew 16#05d8
-/tetsecyrillic 16#04b5
-/tevirhebrew 16#059b
-/tevirlefthebrew 16#059b
-/thabengali 16#09a5
-/thadeva 16#0925
-/thagujarati 16#0aa5
-/thagurmukhi 16#0a25
-/thalarabic 16#0630
-/thalfinalarabic 16#feac
-/thanthakhatlowleftthai 16#f898
-/thanthakhatlowrightthai 16#f897
-/thanthakhatthai 16#0e4c
-/thanthakhatupperleftthai 16#f896
-/theharabic 16#062b
-/thehfinalarabic 16#fe9a
-/thehinitialarabic 16#fe9b
-/thehmedialarabic 16#fe9c
-/thereexists 16#2203
-/therefore 16#2234
-/theta 16#03b8
-/theta1 16#03d1
-/thetasymbolgreek 16#03d1
-/thieuthacirclekorean 16#3279
-/thieuthaparenkorean 16#3219
-/thieuthcirclekorean 16#326b
-/thieuthkorean 16#314c
-/thieuthparenkorean 16#320b
-/thirteencircle 16#246c
-/thirteenparen 16#2480
-/thirteenperiod 16#2494
-/thonangmonthothai 16#0e11
-/thook 16#01ad
-/thophuthaothai 16#0e12
-/thorn 16#00fe
-/thothahanthai 16#0e17
-/thothanthai 16#0e10
-/thothongthai 16#0e18
-/thothungthai 16#0e16
-/thousandcyrillic 16#0482
-/thousandsseparatorarabic 16#066c
-/thousandsseparatorpersian 16#066c
-/three 16#0033
-/threearabic 16#0663
-/threebengali 16#09e9
-/threecircle 16#2462
-/threecircleinversesansserif 16#278c
-/threedeva 16#0969
-/threeeighths 16#215c
-/threegujarati 16#0ae9
-/threegurmukhi 16#0a69
-/threehackarabic 16#0663
-/threehangzhou 16#3023
-/threeideographicparen 16#3222
-/threeinferior 16#2083
-/threemonospace 16#ff13
-/threenumeratorbengali 16#09f6
-/threeoldstyle 16#f733
-/threeparen 16#2476
-/threeperiod 16#248a
-/threepersian 16#06f3
-/threequarters 16#00be
-/threequartersemdash 16#f6de
-/threeroman 16#2172
-/threesuperior 16#00b3
-/threethai 16#0e53
-/thzsquare 16#3394
-/tihiragana 16#3061
-/tikatakana 16#30c1
-/tikatakanahalfwidth 16#ff81
-/tikeutacirclekorean 16#3270
-/tikeutaparenkorean 16#3210
-/tikeutcirclekorean 16#3262
-/tikeutkorean 16#3137
-/tikeutparenkorean 16#3202
-/tilde 16#02dc
-/tildebelowcmb 16#0330
-/tildecmb 16#0303
-/tildecomb 16#0303
-/tildedoublecmb 16#0360
-/tildeoperator 16#223c
-/tildeoverlaycmb 16#0334
-/tildeverticalcmb 16#033e
-/timescircle 16#2297
-/tipehahebrew 16#0596
-/tipehalefthebrew 16#0596
-/tippigurmukhi 16#0a70
-/titlocyrilliccmb 16#0483
-/tiwnarmenian 16#057f
-/tlinebelow 16#1e6f
-/tmonospace 16#ff54
-/toarmenian 16#0569
-/tohiragana 16#3068
-/tokatakana 16#30c8
-/tokatakanahalfwidth 16#ff84
-/tonebarextrahighmod 16#02e5
-/tonebarextralowmod 16#02e9
-/tonebarhighmod 16#02e6
-/tonebarlowmod 16#02e8
-/tonebarmidmod 16#02e7
-/tonefive 16#01bd
-/tonesix 16#0185
-/tonetwo 16#01a8
-/tonos 16#0384
-/tonsquare 16#3327
-/topatakthai 16#0e0f
-/tortoiseshellbracketleft 16#3014
-/tortoiseshellbracketleftsmall 16#fe5d
-/tortoiseshellbracketleftvertical 16#fe39
-/tortoiseshellbracketright 16#3015
-/tortoiseshellbracketrightsmall 16#fe5e
-/tortoiseshellbracketrightvertical 16#fe3a
-/totaothai 16#0e15
-/tpalatalhook 16#01ab
-/tparen 16#24af
-/trademark 16#2122
-/trademarksans 16#f8ea
-/trademarkserif 16#f6db
-/tretroflexhook 16#0288
-/triagdn 16#25bc
-/triaglf 16#25c4
-/triagrt 16#25ba
-/triagup 16#25b2
-/ts 16#02a6
-/tsadi 16#05e6
-/tsadidagesh 16#fb46
-/tsadidageshhebrew 16#fb46
-/tsadihebrew 16#05e6
-/tsecyrillic 16#0446
-/tsere 16#05b5
-/tsere12 16#05b5
-/tsere1e 16#05b5
-/tsere2b 16#05b5
-/tserehebrew 16#05b5
-/tserenarrowhebrew 16#05b5
-/tserequarterhebrew 16#05b5
-/tserewidehebrew 16#05b5
-/tshecyrillic 16#045b
-/tsuperior 16#f6f3
-/ttabengali 16#099f
-/ttadeva 16#091f
-/ttagujarati 16#0a9f
-/ttagurmukhi 16#0a1f
-/tteharabic 16#0679
-/ttehfinalarabic 16#fb67
-/ttehinitialarabic 16#fb68
-/ttehmedialarabic 16#fb69
-/tthabengali 16#09a0
-/tthadeva 16#0920
-/tthagujarati 16#0aa0
-/tthagurmukhi 16#0a20
-/tturned 16#0287
-/tuhiragana 16#3064
-/tukatakana 16#30c4
-/tukatakanahalfwidth 16#ff82
-/tusmallhiragana 16#3063
-/tusmallkatakana 16#30c3
-/tusmallkatakanahalfwidth 16#ff6f
-/twelvecircle 16#246b
-/twelveparen 16#247f
-/twelveperiod 16#2493
-/twelveroman 16#217b
-/twentycircle 16#2473
-/twentyhangzhou 16#5344
-/twentyparen 16#2487
-/twentyperiod 16#249b
-/two 16#0032
-/twoarabic 16#0662
-/twobengali 16#09e8
-/twocircle 16#2461
-/twocircleinversesansserif 16#278b
-/twodeva 16#0968
-/twodotenleader 16#2025
-/twodotleader 16#2025
-/twodotleadervertical 16#fe30
-/twogujarati 16#0ae8
-/twogurmukhi 16#0a68
-/twohackarabic 16#0662
-/twohangzhou 16#3022
-/twoideographicparen 16#3221
-/twoinferior 16#2082
-/twomonospace 16#ff12
-/twonumeratorbengali 16#09f5
-/twooldstyle 16#f732
-/twoparen 16#2475
-/twoperiod 16#2489
-/twopersian 16#06f2
-/tworoman 16#2171
-/twostroke 16#01bb
-/twosuperior 16#00b2
-/twothai 16#0e52
-/twothirds 16#2154
-/u 16#0075
-/uacute 16#00fa
-/ubar 16#0289
-/ubengali 16#0989
-/ubopomofo 16#3128
-/ubreve 16#016d
-/ucaron 16#01d4
-/ucircle 16#24e4
-/ucircumflex 16#00fb
-/ucircumflexbelow 16#1e77
-/ucyrillic 16#0443
-/udattadeva 16#0951
-/udblacute 16#0171
-/udblgrave 16#0215
-/udeva 16#0909
-/udieresis 16#00fc
-/udieresisacute 16#01d8
-/udieresisbelow 16#1e73
-/udieresiscaron 16#01da
-/udieresiscyrillic 16#04f1
-/udieresisgrave 16#01dc
-/udieresismacron 16#01d6
-/udotbelow 16#1ee5
-/ugrave 16#00f9
-/ugujarati 16#0a89
-/ugurmukhi 16#0a09
-/uhiragana 16#3046
-/uhookabove 16#1ee7
-/uhorn 16#01b0
-/uhornacute 16#1ee9
-/uhorndotbelow 16#1ef1
-/uhorngrave 16#1eeb
-/uhornhookabove 16#1eed
-/uhorntilde 16#1eef
-/uhungarumlaut 16#0171
-/uhungarumlautcyrillic 16#04f3
-/uinvertedbreve 16#0217
-/ukatakana 16#30a6
-/ukatakanahalfwidth 16#ff73
-/ukcyrillic 16#0479
-/ukorean 16#315c
-/umacron 16#016b
-/umacroncyrillic 16#04ef
-/umacrondieresis 16#1e7b
-/umatragurmukhi 16#0a41
-/umonospace 16#ff55
-/underscore 16#005f
-/underscoredbl 16#2017
-/underscoremonospace 16#ff3f
-/underscorevertical 16#fe33
-/underscorewavy 16#fe4f
-/union 16#222a
-/universal 16#2200
-/uogonek 16#0173
-/uparen 16#24b0
-/upblock 16#2580
-/upperdothebrew 16#05c4
-/upsilon 16#03c5
-/upsilondieresis 16#03cb
-/upsilondieresistonos 16#03b0
-/upsilonlatin 16#028a
-/upsilontonos 16#03cd
-/uptackbelowcmb 16#031d
-/uptackmod 16#02d4
-/uragurmukhi 16#0a73
-/uring 16#016f
-/ushortcyrillic 16#045e
-/usmallhiragana 16#3045
-/usmallkatakana 16#30a5
-/usmallkatakanahalfwidth 16#ff69
-/ustraightcyrillic 16#04af
-/ustraightstrokecyrillic 16#04b1
-/utilde 16#0169
-/utildeacute 16#1e79
-/utildebelow 16#1e75
-/uubengali 16#098a
-/uudeva 16#090a
-/uugujarati 16#0a8a
-/uugurmukhi 16#0a0a
-/uumatragurmukhi 16#0a42
-/uuvowelsignbengali 16#09c2
-/uuvowelsigndeva 16#0942
-/uuvowelsigngujarati 16#0ac2
-/uvowelsignbengali 16#09c1
-/uvowelsigndeva 16#0941
-/uvowelsigngujarati 16#0ac1
-/v 16#0076
-/vadeva 16#0935
-/vagujarati 16#0ab5
-/vagurmukhi 16#0a35
-/vakatakana 16#30f7
-/vav 16#05d5
-/vavdagesh 16#fb35
-/vavdagesh65 16#fb35
-/vavdageshhebrew 16#fb35
-/vavhebrew 16#05d5
-/vavholam 16#fb4b
-/vavholamhebrew 16#fb4b
-/vavvavhebrew 16#05f0
-/vavyodhebrew 16#05f1
-/vcircle 16#24e5
-/vdotbelow 16#1e7f
-/vecyrillic 16#0432
-/veharabic 16#06a4
-/vehfinalarabic 16#fb6b
-/vehinitialarabic 16#fb6c
-/vehmedialarabic 16#fb6d
-/vekatakana 16#30f9
-/venus 16#2640
-/verticalbar 16#007c
-/verticallineabovecmb 16#030d
-/verticallinebelowcmb 16#0329
-/verticallinelowmod 16#02cc
-/verticallinemod 16#02c8
-/vewarmenian 16#057e
-/vhook 16#028b
-/vikatakana 16#30f8
-/viramabengali 16#09cd
-/viramadeva 16#094d
-/viramagujarati 16#0acd
-/visargabengali 16#0983
-/visargadeva 16#0903
-/visargagujarati 16#0a83
-/vmonospace 16#ff56
-/voarmenian 16#0578
-/voicediterationhiragana 16#309e
-/voicediterationkatakana 16#30fe
-/voicedmarkkana 16#309b
-/voicedmarkkanahalfwidth 16#ff9e
-/vokatakana 16#30fa
-/vparen 16#24b1
-/vtilde 16#1e7d
-/vturned 16#028c
-/vuhiragana 16#3094
-/vukatakana 16#30f4
-/w 16#0077
-/wacute 16#1e83
-/waekorean 16#3159
-/wahiragana 16#308f
-/wakatakana 16#30ef
-/wakatakanahalfwidth 16#ff9c
-/wakorean 16#3158
-/wasmallhiragana 16#308e
-/wasmallkatakana 16#30ee
-/wattosquare 16#3357
-/wavedash 16#301c
-/wavyunderscorevertical 16#fe34
-/wawarabic 16#0648
-/wawfinalarabic 16#feee
-/wawhamzaabovearabic 16#0624
-/wawhamzaabovefinalarabic 16#fe86
-/wbsquare 16#33dd
-/wcircle 16#24e6
-/wcircumflex 16#0175
-/wdieresis 16#1e85
-/wdotaccent 16#1e87
-/wdotbelow 16#1e89
-/wehiragana 16#3091
-/weierstrass 16#2118
-/wekatakana 16#30f1
-/wekorean 16#315e
-/weokorean 16#315d
-/wgrave 16#1e81
-/whitebullet 16#25e6
-/whitecircle 16#25cb
-/whitecircleinverse 16#25d9
-/whitecornerbracketleft 16#300e
-/whitecornerbracketleftvertical 16#fe43
-/whitecornerbracketright 16#300f
-/whitecornerbracketrightvertical 16#fe44
-/whitediamond 16#25c7
-/whitediamondcontainingblacksmalldiamond 16#25c8
-/whitedownpointingsmalltriangle 16#25bf
-/whitedownpointingtriangle 16#25bd
-/whiteleftpointingsmalltriangle 16#25c3
-/whiteleftpointingtriangle 16#25c1
-/whitelenticularbracketleft 16#3016
-/whitelenticularbracketright 16#3017
-/whiterightpointingsmalltriangle 16#25b9
-/whiterightpointingtriangle 16#25b7
-/whitesmallsquare 16#25ab
-/whitesmilingface 16#263a
-/whitesquare 16#25a1
-/whitestar 16#2606
-/whitetelephone 16#260f
-/whitetortoiseshellbracketleft 16#3018
-/whitetortoiseshellbracketright 16#3019
-/whiteuppointingsmalltriangle 16#25b5
-/whiteuppointingtriangle 16#25b3
-/wihiragana 16#3090
-/wikatakana 16#30f0
-/wikorean 16#315f
-/wmonospace 16#ff57
-/wohiragana 16#3092
-/wokatakana 16#30f2
-/wokatakanahalfwidth 16#ff66
-/won 16#20a9
-/wonmonospace 16#ffe6
-/wowaenthai 16#0e27
-/wparen 16#24b2
-/wring 16#1e98
-/wsuperior 16#02b7
-/wturned 16#028d
-/wynn 16#01bf
-/x 16#0078
-/xabovecmb 16#033d
-/xbopomofo 16#3112
-/xcircle 16#24e7
-/xdieresis 16#1e8d
-/xdotaccent 16#1e8b
-/xeharmenian 16#056d
-/xi 16#03be
-/xmonospace 16#ff58
-/xparen 16#24b3
-/xsuperior 16#02e3
-/y 16#0079
-/yaadosquare 16#334e
-/yabengali 16#09af
-/yacute 16#00fd
-/yadeva 16#092f
-/yaekorean 16#3152
-/yagujarati 16#0aaf
-/yagurmukhi 16#0a2f
-/yahiragana 16#3084
-/yakatakana 16#30e4
-/yakatakanahalfwidth 16#ff94
-/yakorean 16#3151
-/yamakkanthai 16#0e4e
-/yasmallhiragana 16#3083
-/yasmallkatakana 16#30e3
-/yasmallkatakanahalfwidth 16#ff6c
-/yatcyrillic 16#0463
-/ycircle 16#24e8
-/ycircumflex 16#0177
-/ydieresis 16#00ff
-/ydotaccent 16#1e8f
-/ydotbelow 16#1ef5
-/yeharabic 16#064a
-/yehbarreearabic 16#06d2
-/yehbarreefinalarabic 16#fbaf
-/yehfinalarabic 16#fef2
-/yehhamzaabovearabic 16#0626
-/yehhamzaabovefinalarabic 16#fe8a
-/yehhamzaaboveinitialarabic 16#fe8b
-/yehhamzaabovemedialarabic 16#fe8c
-/yehinitialarabic 16#fef3
-/yehmedialarabic 16#fef4
-/yehmeeminitialarabic 16#fcdd
-/yehmeemisolatedarabic 16#fc58
-/yehnoonfinalarabic 16#fc94
-/yehthreedotsbelowarabic 16#06d1
-/yekorean 16#3156
-/yen 16#00a5
-/yenmonospace 16#ffe5
-/yeokorean 16#3155
-/yeorinhieuhkorean 16#3186
-/yerahbenyomohebrew 16#05aa
-/yerahbenyomolefthebrew 16#05aa
-/yericyrillic 16#044b
-/yerudieresiscyrillic 16#04f9
-/yesieungkorean 16#3181
-/yesieungpansioskorean 16#3183
-/yesieungsioskorean 16#3182
-/yetivhebrew 16#059a
-/ygrave 16#1ef3
-/yhook 16#01b4
-/yhookabove 16#1ef7
-/yiarmenian 16#0575
-/yicyrillic 16#0457
-/yikorean 16#3162
-/yinyang 16#262f
-/yiwnarmenian 16#0582
-/ymonospace 16#ff59
-/yod 16#05d9
-/yoddagesh 16#fb39
-/yoddageshhebrew 16#fb39
-/yodhebrew 16#05d9
-/yodyodhebrew 16#05f2
-/yodyodpatahhebrew 16#fb1f
-/yohiragana 16#3088
-/yoikorean 16#3189
-/yokatakana 16#30e8
-/yokatakanahalfwidth 16#ff96
-/yokorean 16#315b
-/yosmallhiragana 16#3087
-/yosmallkatakana 16#30e7
-/yosmallkatakanahalfwidth 16#ff6e
-/yotgreek 16#03f3
-/yoyaekorean 16#3188
-/yoyakorean 16#3187
-/yoyakthai 16#0e22
-/yoyingthai 16#0e0d
-/yparen 16#24b4
-/ypogegrammeni 16#037a
-/ypogegrammenigreekcmb 16#0345
-/yr 16#01a6
-/yring 16#1e99
-/ysuperior 16#02b8
-/ytilde 16#1ef9
-/yturned 16#028e
-/yuhiragana 16#3086
-/yuikorean 16#318c
-/yukatakana 16#30e6
-/yukatakanahalfwidth 16#ff95
-/yukorean 16#3160
-/yusbigcyrillic 16#046b
-/yusbigiotifiedcyrillic 16#046d
-/yuslittlecyrillic 16#0467
-/yuslittleiotifiedcyrillic 16#0469
-/yusmallhiragana 16#3085
-/yusmallkatakana 16#30e5
-/yusmallkatakanahalfwidth 16#ff6d
-/yuyekorean 16#318b
-/yuyeokorean 16#318a
-/yyabengali 16#09df
-/yyadeva 16#095f
-/z 16#007a
-/zaarmenian 16#0566
-/zacute 16#017a
-/zadeva 16#095b
-/zagurmukhi 16#0a5b
-/zaharabic 16#0638
-/zahfinalarabic 16#fec6
-/zahinitialarabic 16#fec7
-/zahiragana 16#3056
-/zahmedialarabic 16#fec8
-/zainarabic 16#0632
-/zainfinalarabic 16#feb0
-/zakatakana 16#30b6
-/zaqefgadolhebrew 16#0595
-/zaqefqatanhebrew 16#0594
-/zarqahebrew 16#0598
-/zayin 16#05d6
-/zayindagesh 16#fb36
-/zayindageshhebrew 16#fb36
-/zayinhebrew 16#05d6
-/zbopomofo 16#3117
-/zcaron 16#017e
-/zcircle 16#24e9
-/zcircumflex 16#1e91
-/zcurl 16#0291
-/zdot 16#017c
-/zdotaccent 16#017c
-/zdotbelow 16#1e93
-/zecyrillic 16#0437
-/zedescendercyrillic 16#0499
-/zedieresiscyrillic 16#04df
-/zehiragana 16#305c
-/zekatakana 16#30bc
-/zero 16#0030
-/zeroarabic 16#0660
-/zerobengali 16#09e6
-/zerodeva 16#0966
-/zerogujarati 16#0ae6
-/zerogurmukhi 16#0a66
-/zerohackarabic 16#0660
-/zeroinferior 16#2080
-/zeromonospace 16#ff10
-/zerooldstyle 16#f730
-/zeropersian 16#06f0
-/zerosuperior 16#2070
-/zerothai 16#0e50
-/zerowidthjoiner 16#feff
-/zerowidthnonjoiner 16#200c
-/zerowidthspace 16#200b
-/zeta 16#03b6
-/zhbopomofo 16#3113
-/zhearmenian 16#056a
-/zhebrevecyrillic 16#04c2
-/zhecyrillic 16#0436
-/zhedescendercyrillic 16#0497
-/zhedieresiscyrillic 16#04dd
-/zihiragana 16#3058
-/zikatakana 16#30b8
-/zinorhebrew 16#05ae
-/zlinebelow 16#1e95
-/zmonospace 16#ff5a
-/zohiragana 16#305e
-/zokatakana 16#30be
-/zparen 16#24b5
-/zretroflexhook 16#0290
-/zstroke 16#01b6
-/zuhiragana 16#305a
-/zukatakana 16#30ba
-.dicttomark readonly def
-/currentglobal where
-{pop currentglobal{setglobal}true setglobal}
-{{}}
-ifelse
-/MacRomanEncoding .findencoding
-/MacGlyphEncoding
-/.notdef/.null/CR
-4 index 32 95 getinterval aload pop
-99 index 128 45 getinterval aload pop
-/notequal/AE
-/Oslash/infinity/plusminus/lessequal/greaterequal
-/yen/mu1/partialdiff/summation/product
-/pi/integral/ordfeminine/ordmasculine/Ohm
-/ae/oslash/questiondown/exclamdown/logicalnot
-/radical/florin/approxequal/increment/guillemotleft
-/guillemotright/ellipsis/nbspace
-174 index 203 12 getinterval aload pop
-/lozenge
-187 index 216 24 getinterval aload pop
-/applelogo
-212 index 241 7 getinterval aload pop
-/overscore
-220 index 249 7 getinterval aload pop
-/Lslash/lslash/Scaron/scaron
-/Zcaron/zcaron/brokenbar/Eth/eth
-/Yacute/yacute/Thorn/thorn/minus
-/multiply/onesuperior/twosuperior/threesuperior/onehalf
-/onequarter/threequarters/franc/Gbreve/gbreve
-/Idotaccent/Scedilla/scedilla/Cacute/cacute
-/Ccaron/ccaron/dmacron
-260 -1 roll pop
-258 packedarray
-7 1 index .registerencoding
-.defineencoding
-exec
-%%BeginResource: procset (PDF Font obj_10)
-10 0 obj
-<</R6
-6 0 R/R8
-8 0 R>>
-endobj
-%%EndResource
-%%BeginResource: procset (PDF Font obj_6)
-6 0 obj
-<</BaseFont/MYPSFE+Helvetica/FontDescriptor 7 0 R/Type/Font
-/FirstChar 32/LastChar 120/Widths[
-278 0 0 0 0 0 0 0 333 333 0 0 0 333 0 0
-556 556 556 556 556 556 0 0 0 0 0 0 0 0 0 0
-0 0 667 0 0 667 0 778 0 0 0 0 0 833 722 0
-667 0 722 667 611 0 0 944 0 0 0 0 0 0 0 0
-0 556 556 0 556 0 0 0 0 0 0 0 222 0 556 556
-0 0 0 0 278 0 0 0 500]
-/Subtype/Type1>>
-endobj
-%%EndResource
-%%BeginResource: procset (PDF Font obj_8)
-8 0 obj
-<</BaseFont/JHZRWY+Helvetica-Bold/FontDescriptor 9 0 R/Type/Font
-/FirstChar 32/LastChar 122/Widths[
-278 0 0 0 0 0 0 0 0 0 0 0 278 0 278 0
-556 556 556 0 0 0 0 556 556 0 0 0 0 0 0 0
-0 0 722 722 0 667 0 0 722 0 0 0 0 833 722 0
-667 0 722 667 0 0 0 0 0 0 0 0 0 0 0 0
-0 556 0 556 0 556 333 0 0 278 0 0 0 889 611 611
-611 0 389 556 333 0 556 0 0 556 500]
-/Subtype/Type1>>
-endobj
-%%EndResource
-%%BeginResource: file (PDF FontDescriptor obj_7)
-7 0 obj
-<</Type/FontDescriptor/FontName/MYPSFE+Helvetica/FontBBox[0 -212 929 741]/Flags 131104
-/Ascent 741
-/CapHeight 741
-/Descent -212
-/ItalicAngle 0
-/StemV 139
-/MissingWidth 278
-/XHeight 539
-/CharSet(/B/E/G/M/N/P/R/S/T/W/a/b/d/five/four/hyphen/l/n/o/one/parenleft/parenright/space/t/three/two/x/zero)/FontFile 11 0 R>>
-endobj
-%%EndResource
-%%BeginResource: file (PDF FontFile obj_11)
-11 0 obj
-<</Filter[/ASCII85Decode
-/LZWDecode]
-/Length1 1019
-/Length2 7178
-/Length3 533/Length 6932>>stream
-J-eUh@sPTJ<'6ZZUCh1X>VI0(#mO=:fZJ:mR*6\HLr;PhN1C(U,:T/2D?UF+OCCekb\n%%A+CK4
-eDVX8alOd(H,/uk1muT$+[kmL5bU`,JqBsmY$;Zu`F?tHre!QL%#+irUl=jeV:0/O&QjR>ANA+3
-_>uN]b8*!39r;#HVESQI8kI%t_2QMZ'Nf)"$C+M9<i";^Fjh(T"_4N9XX8C#[a/p'>n332-/qfl
-0Ukc`_oXu-IhWQU-IWRVjrc+?9ufBYH;o#F)`6//#-1n0fPJ!_Hd0pY+?:<5-:fbQM4]Bj2g=e>
-:+I->R!I]^.CdB9O;j/OOf6nt@6#<d-]h0?5opmQAk0B'T/q3.),CGm5_*/W%Emcm1B[f1l8fHL
-!a[kf6R$=X#%<_n3K=1Kr;se(C`XKX_0d`nNPf5pO[-g[1n05UoK;auMF+Q\`8L]0R0DV;&i;5&
-`(^J*!Q4gu%&8to(e9^MErR8_r.tZ5Yit:4aDf@\)T>(:d,`;HPaMg]l$2JR7o>(W)8F'CdYgdS
--uAJYiY9iHL=//o2l>QH<$T\>!,`aj_JJc^a2*"k4GOL3TgDD(PmK2Ligg@XL#Sp84pBrYnf6)<
-e<ZSZ1^M&_L*;42j3qpk@6fg;"[`5@FXfHf8ho*BNm3\3[$ue"e,9,5%SN,MX7.($K*e:Ykb(-A
-fO0K8@0>=ufnf<m0"DHjR1S"&Z;s!l64i#O%q0-_<STmaO&3\N0Q%fF2>+-8=@lGcKHX-<[O;P5
-3Y$hHmrdV=f].5-15b*_aX^N>GfMJU"/8%8UeWTYKtT%ebn3/nd)n(o683!qL>jn-)2Q-X?m,_`
-(iCIO'I[o>A3n"A+U3N3j<4e\&7?^e68R_cggRhS+pTUMMA_.WY[SN,6,7LbLdE.H+ot"AC`3M0
-(ka)f+g?_ZL129A*!W+XA/g8T+CH@KTob2!LnYq_+GV-pDm!^%^gJ;:3UPBALH3kQ+pcoA$6k$s
--tArfqR5T1L@C"0+pS.?KGeP,2Go\'qhT;NL7J6b*!ek:K;6Q$pi4:&q3YV8n/L!o)[:X_een`I
-i+Fe6S_gq$X+>e4b6J'D+s?$!LklpFYi&rqklI\9*!fuOBHmdkQ=(kKhS=.M!C=M>]'P"cM5CQq
-%VN##gK)H?jC0l+P(p=Jeen8c0QH]?JfR8;&ntR"Ds<=92a[*;,DZQkZ0]+G@)uC6SSfSg]t//r
-%A#r:#[lW?2Rf(.>1bi]WeEcl#2[Ro.rKIR=`K*b?36_I_`Y%L,6UK?q:o(-#:IWaK3#_WT?p%3
-^qm?<'\;aT,VB@!kSZM'.a3JU3Ir=#ZorW3pg@bhL<c3]\Rt.?=j%k3@*QBmf"0P*1fS#/Xh2*I
-K]:nU>q8XR)MArTon!H*!DR.PVm_Hk@,kC?c+Wp8Zr62Fa>J7':)?%#bak?;=9d/(*.o$&hUAgJ
-Ku"Ms"#+bB6*'0Z03J"P[;spQKC*\&'stTNUrf0TPmC'b,!'oNo@`Fc#4Y,FK/`9.>q>DSXf9H!
-LLDaN#W?i9Sb"eUCnMkK8!e.R\cYuneY(ZNGg]Tn^,P?nJh&$ubq6)if1ll[N!4&-5tj/WlL%kT
-]6Fk'."b(]iEATdL5go8\S70FS_I;+O"C"KVGe?ON8nf8U%:V5pt+U9XEL9@l@`n('4\:NK9=kG
-5,`Rg,i`llc,:NNVPOfT*-R\[C#(R:PkQ1S:0hkh(ctf*<i':dC<Y7G2n-<R_CL:ObDmZ2@"_#j
-I)(cf=<b,Kf(L/4"pYhh)S@i51g=4-Q>];3_8cp0SC;ds%&p2?L5+\RMl(/]U_uF2V&:.DAHqP(
-O98'6ak<GQK5fq92Q3Sf>.[1]Nts%SVO8`73?4!Cg%.F/75(M?b#8RcVmWn_l):CGRIpb5\JM.V
-C76r!LWW@=3<9P=;b9]!RA(odP5h($0T(_gpfWDpbUc05FH%`X[pX7tTRE\"WaW"nk-V9pW'd/3
-a;[[IZjkJd2KKD*rQP(c/O>jWA?bL)[qUC>hGi\D&*^eupHl#jip-VD[L94h.+'./6DD\a1Vh&2
-i*TJAD=;&,<7\e6TPu]!cW1QX3Hkt-^%o*5g%de/!H'3aJ?Nr!4%X-;Rb?URKL"@`]8<.&?Ba#f
-P9n;W[b.9j9jMOPQ9;(RO'*suhdr&&n\.J"&=Ya/U68Nb2n&)O>`C1K9Zn9aB55Iioi&MAV6@9S
-[T8hf7)OQh!<WOjoH`b7InpPk6mic%g4Rn'3D,(8OG8*b7;[C3ePS,j:F0;!n<pNn4e]pAm3N$(
-H1-Rqb?.0ce]VfM)!R;BQbbGR$i>8<6<61&5<J$J$Yh>_Y<;QPl`L-GcP"hm29D%4'3n_DBi7*,
-Vn[<l94W9BjnpN0Wo[SfpW5)(Xh;.;Po]J=JSh7t+V^lu&EV>sA9#4_Cc)Zl,uT5:6D,(70[6\b
-H=\c*Znj26AJFGX9RBM"=i?d*5Z?]X%mF.NLPk[@>=Yr7Kq:$m;fCKmnnB`8dk3PcRc!PsEu)p[
-2CHKVXAnnFm<,bKRdC46b`cee/`\h@?P6d'hhB<]-F\>damr-aD/?J>]3'hck"QUd/jL>^kCf]O
-ZVIGMaeg:@m,9HfBR!L7KY%)_l"$k`JB`ri_+K,IT0E1Ubd$l`3#^3agH0^]c?(noQk<i/[;:g[
-RDb>%n=J[:Y&G8A_e-E*?PII]/X`iG@^c,G%-Y4#`QG^;C>GoU?[P\HX'Kqa(93mjRaPcoJ>^^D
-kEUBX+OU.t#c-QeV)?:U7gDNW\Gr073UQ0f-"1uu*cMgWE>76S>:-TB&o02?mi!g&rPp+N-6-Oe
-fuSgdW<la,:5NlugqAIYh:V+9ghr7E\OAU(RNtS(%Y!SB>);FrgIUlDlAJ'ET_4h],^&<jn4Db*
-_)cpR[.Q;N^3uso=gRDfXJ++*f07r)T*-Zil)Ug+I`g1/+CiiRg.BAbF&S#YC,4>9h%&(qUf)L#
-@#)epHHr%+%!6"AP^gl@H;$j18qMC;i(AcDK'atC.b^n7FF*,#Ig<uQkf.5<PiljBXes<U:(1a9
-(fRATUr^nZ#7/JmoSZ.5[SL.g#q2=(/7Z\C<9D\KMRnB&Lm,q)K*[XB-HL-WcA'J>]P:?^M8FXP
-H6]<@WMEFCKW(KbR_()GF_7.d-]I!o`p5"JXf,EOXhq-YQ7HjO9P$V;M<s]tW4>R`jJ5[P"QJCa
-1id3DDQD&q/UD$tGQn^%="3K`8@47#$A#ERIVA#.#(2sP#a/df:^<G)7k/?=:gIj[Ht;r]8:6Wh
-2MXbZGmDjd:.hW:o#HXSO[mE-LK8D1RVAWmHL!'SB9ms<b'HOcF%_rbU:,A^4D72ZdtU\1#F9!m
-n9!qH`eMR'agu?3d]Q'7%ccP@LmE(B#`\6PR492<%"+nkXAc%dB]X8F818+"U2,W"'+$X4b$LC4
-[/gP,I)k=GmJs7t,4LBKHRSH,M%o4Zph^:)\PA6DV7O<Q7&#XMD<F6.C^d:6P+:`p#7K+]0regk
-(27B"B?;E0W5sRFCE&!u&r+XSA]AY'=EWsj'Imd5#O5p$9$50!B88>3$<#r`R[b^nb(aa@VZRq'
-XF2ZAGfGhcl[H"V?C_Bi'*df&lV^L!0Z/^@A>gQ%LU(F4g1o`\cV'X@/$OE>p/`m'Pt/-6a;6"9
-Qpt_IRHJ1(C%R626KCm$JJ"'UVKhLuTQuLh$Oat*B^1@mA::@jcpn@hkNY4-k+]lVFGXIub!:f#
-[YS^0[Re\dB%1c)-;t4_L;o<qWFj-5GZQDEB:os5L2P866C)="Be7hG&Di449^2j@W$G8bL?N_,
-9MB(CMai)^8;;W7PmmuDA4NY6KgLKKqIt`_I8ARHdlms__M5#iGHAl19K84!U/Xl]cKW3AP>5eO
-hVr4;rMS0"kfBiao&%OVcE!DUVUT=[Ca5flG/h1s-?AfT!.%Bf+(a#`_rQ(I4EF-]JT=YA7`K+3
-Y&d1uC.:CE/?!V[E?GKMQjPCEW_@9LLht*)lK62SBCOS$A>Lb,cUQ]%VP()+CE$r&%EO46;'q-s
-h!Ba=L'L?=DA^\j/oG_5F=WSrVoJ4\5]k$bb`!h`7j+sPb`A_QLe$C/W_?CTBX9,RJr?F<86f\i
-1p=o@A;RC#:L'a?Rjd_2Cb2Z@`uoRR+IPcRd-3)m`H#YsGYTbI74tToa%1%/HD[\jR3U^'At"lt
-gH&u%i<V&@EMe5Y@^RH?B#gLcN_;,r$?Jb4B*]8d<.JkblETOoRHKlO9nPfF87VuS8ZeZ-Ve1Qo
-g/A_$.A]F[bSFI.\n>VU<$u"#83$m8aCRmPEXM/Mb(=>?BY$\"n&qBA:gfI+:6URhW$s3578FW[
-5X$c/`^cu4`lr$#2KS5q6to89om#rDa$f9i\*AAMa0KRP87X19AP<TUOC9!+g3CVLC.@K89Vd\]
-`EA/FCSl?e8;BFmW.1o$eWg2`j5OVtBP0,^0IB7a`n_6nV,Hb+B?Qs$-c.B%Aq=R2Hr4j0,.R:n
-i_IS[ecs3HCLhX/g3C[9JHi]HV^uK"6FoP<ABAFp#+"gN[.'(6@EGU+7t>XcQ@.n>mHrVF:`+54
-:il.lB2r!"8JFj4SqfoXHg)B`D_u6!DJA7[I7.]fL:Fm/L1LS1s!T@5DrPR$>bn:e\Z#(e-?a%A
-:3^ZBHGni1Uf)oj0!.c5;[F.LL7$uO/oA\(CoDbI_qP!q$>!cAC?FSr/g1frgq,=dDH7Tq9oa6e
-@!a7874C]NC]oGE!.LkiMGDZ&-<R!tWf9R/AT3&`kV/h[:hWNnV<<)=Lb>*OLg4UQ:o[-K-a[dT
-aZ$/'DT9,0VlIn'"QZSscUQJrPI>([Ank#4h*e2XArteh@#o$+5"G<\l6Kpf[X"/\+\)6eVgs4_
-4)q_XD26-2.?o`kcqZ"CM.V"O2,pSj'':O4<)L;bAp17k`hoecCWQ)Qk?*K&Uj-LEYAACBZk.ru
-cuk.rDQ8:=B7W"/$:QTRI-?lK':=Z1W:DAsCal]5a7*]Z3,>LlC8T709tEonH>_3&%S'usaRY@h
-5V#=Rmj:rLVtsplAo98#FX`no`]>W*W+j8B@HP4;k_+$=:?8E'HNrQC/PRY[aK6e4R7ULtLB;&L
-f-51&O&$%HBPN`dP:<s>B8&b>C/AQI\N(?]0BXP@->;n'p1/oLL9P.#=?7ssJotfQC<7g!#1ZpQ
-Qoq[#^Jr@VV\X/#d'B\&Ql(FAM*?#-6u:>>M.URW$MJoR`/f]_CD2m6cpa!Nc?4*s74jB`-$$R$
-jJ8\gQe".,8[*\87_7aj.jek=pqo-am)s-qqBO.Ha_&]ECq6qRouKh?B'R[C8L+@!Ins.5%';N!
-X'd`\Gm>a88$;,LRajr^j<ZjkBg2,=UeGC7DYDZ]k\=nqI"Y#.LZdri#&Rs&ZQI92R>8J5)4Y3V
-A:-1(Lh?]4VMQgdR+MfMoV/eTX*S;jC8Y`[O#'mhCd3pGFGPZe;/A7]W(b?4@3:3I]R!7gVOl.I
-OZGsnPK%!tZ<CdlB$Nt2$ST/L-D#qtW4#_>Bf+7n8aNnKn>VF#B]s8SMkH"5U2?pY`[U8&YuH.L
-:4-^4Hk:'5N"Bdsb.$hF0*sVDY&8lr5]p_,<(F$J99bHVR-GODC@K(Ek[@&[?@^4fHfN8/R?%lZ
-Ur.&pMPW$!#:O:72KXm[E[c/u/rJPfc>SH=Ija<*Y8$Ep!+^gc7&GG@L0mp1e<X]/C+UK_CS]L\
-::t2J!Xpc`L9cK1Q=RF"&-o=WZHJ/\?Fg?%Uo<-s.6Qn%rdbSbhkikdGm(&tjf)%OAN!qBVHE]8
-0RN>MkCP`Y7V]SJTP8/PE!Kd!-OP,;i,%O@\E5nia5CQDXCWgI"t+TT\jDo9R`DF/FPEC>Q_\g$
-N-"5/O%,LQ<Q7gHeuE?HUe/#qEcYUqg8IL#FG_AWkA"n9"HDQ<NUL>)7foL@)N%"N[>A"4L0A63
-I)s8,e&I&OY6e/Up>:3pM%^f+L<Ue%_?NNILkg#rLlQh;Z[la?P;W?k7^oKF;JX:R?"lG.L>HG[
-5\nMR]YJ@Pa/Dq>3e"$oGe#)OOY!K4_T^"bDR+RndlU(>:48P9kL:,p`iQ-%JL"io"%16Fb2Opp
-HRWS5C(<(u7fr1BrD[_jKWKs:-drGN&r4_AY3'nuVL'?jJ7b`8ChLt:Hoa`.6>X!,R`qk$R'0Ac
-1!kj^Hmk/dW/,,bV-&Q1G]Fq`WS,Qj1/k?54t&<g8"Sq#Uf?KQ]ue-3^k078Ar4_gT%D:A7`9/B
-':F_j$q=90;fl[80ULJFQEk:=B$tm>W$@SWB]i-3k4iNW:6*GZ,HB[H7^DYWCI"kU;N!eu9Vcie
-<eO8A_a[K[k]19k*psC-B-rd<&o>?RX0d[0FH<9R04'HJJ@Z<YT#SWn8M(+IW.a>fDtk7aM8O%%
-CfLAXcn)8BH8)m"Q,tZPI.<!:9S/(5.fpAbB#L/^k+$%bn7DuKWb?3nBK+.I79PA0RHClPk6T:(
-kc(OnRXJY,#+4Wq9UuSGK5mS_f8PT(WR&">E9e?sQ\p:HSm/_MAOk$n2=>BPjE;;tN@$i9#0*Sh
-EbgZeVH8dpB\mH[P\K=!;Z]"g7j<G?+10'U+j73"MkR*Z!fD_O`pG0mB5&]jW>.n@C%(J/VUWLV
-dS@gIK+h&>.3@ou'-i:uU'=)?>Ng>:Uh+6SI4Db2#fq@KNEbR4YmTW6Au]rcT+n/uJVK65qJ5#8
-?@hYT-_"eeL[Js-,!IA2D6=Pkb>.79rBLY&nn,b:2(Gn#dC]t1K;U&>W1*ij#]7TM8148Ve[NMP
-Ar(Q9VT)ejrQLnT.D-#N?;*h,L1Y#`<q'_Y`@da&0&Bj`6,fBf9*dI1WB2Be6K_sT8t+_h+7]@q
-p&BO;s1eIS!sfSN#m(8r@1\f*/f>+P6/g3.PYN#+MFHP:fX,6N*>h9+dMSL+74![[,gr&..)p'Y
-Qqg.=H+%*r"[G<~>
-endstream
-endobj
-%%EndResource
-%%BeginResource: file (PDF FontDescriptor obj_9)
-9 0 obj
-<</Type/FontDescriptor/FontName/JHZRWY+Helvetica-Bold/FontBBox[0 -219 824 741]/Flags 32
-/Ascent 741
-/CapHeight 741
-/Descent -219
-/ItalicAngle 0
-/StemV 123
-/MissingWidth 278
-/XHeight 549
-/CharSet(/B/C/E/H/M/N/P/R/S/a/c/comma/e/eight/f/i/m/n/o/one/p/period/r/s/seven/space/t/two/v/y/z/zero)/FontFile 12 0 R>>
-endobj
-%%EndResource
-%%BeginResource: file (PDF FontFile obj_12)
-12 0 obj
-<</Filter[/ASCII85Decode
-/LZWDecode]
-/Length1 1082
-/Length2 8521
-/Length3 533/Length 8168>>stream
-J-eUh@sPTJ<'6ZZUCh1X>VI0(#mO=:fZJ:mR*6c&&\Qb,"UmjE"!hF@+>Fa-k*'a4?Nbuo9u^[f
-J86Eo8IhX)7&jBB+e-a^PEDZdBTn<%1cd30:0\JJ8k!dYUfJu];Ws?[5_*B!(l]gHOTe(J<3$AE
-"@FW`N,B15X_(\?Z@m'M_1aX3.@OL:2oZ8<;#m?8;l\C61b.<B]jS)^XI+?'?KZ2^gb)XNXkrVj
-]pUOZi\?,?Bf7#(g2%n)S7smKNi+T49Yt[-k]Ck:WNb'V]O>s[*M1l$[#W3$=6mti5]SWI9TWOS
-o)14nSN%HPHql1.N5kZUm2'#bDD@XAVW0gaC,QV?:.HN8j:j9Z8B+#"\aDqQ1df&D162MSck$B>
-E887AT`F"3Ne?O\RLVSZaIRtbQt6C1@t;G4_9die$jMV$?M'5PBYtCAOW&H_4oosDU:jE7>S%*j
-`"5'?UQTBt`N[!]*5Mn2#p;^rX7-pcK=l[G84g+)(QN:*o,C:THk8'6M*-nKL=(g2/40HBDZg>e
-,'Y%tJU!)1"9H.nm`kjGc52>DXE588dsuEaMA,XE.8RdM&1Pm*bjQ:inA'*'N,sMYYY0)"@6':r
-[&,\.dqIK-;K+t]7]2(U7Mj2;$o!f=C#qn`X=up$:eGT$?BI]4oV#9>1YD(d#$!_+>D?(Doc#q%
-PGkcLXWt+uN$G'T!=N=f+%ea5c*!2`,3tia\mof^B"J=&KT<i8g):r$6"jjI9_=k-r8%I--"Pdi
-)g7SkkXu2Dgk('nQ=$Re5l=l=SYS3(@jnK:N.[o:KJ[0UlM7dN.)qI]TN3Y'+N$!3_@3Xkat\H6
-0P2M`i\5BjLr(QJ+U2BmDBRbdJ8cH=_8'S)#(dN`+UEZ2?m>kB1\mBi1QZ>q#:fe3)2;S(@N(%g
-^iCWT669/O!C@?7&r:!.MAV)b*5WSLJZs)3LEVas)@1nEL*D@=/p8FpH&.%lLr$gOTi"++Jf*.Q
-#\kQ=3]*'F#gk4&,(WO7@l\I3(B,G2nBb\i#6C@U)+:2WBpn=7i,^T,SR.6p#XSfLWQAFJEQdNJ
-pgPH;S1kWr#(*/_)$hCY?l=^2AlK]9!ZJsLoKg9,%1"up@Nl"Ts,7e4)PCfm#6G`W)@41sAY'02
-=3;M;J5C2(n/HV,,&766K:hO^[d1F/H$G9=R><^)l2Bd/:lGl+TL9&n^_f&LPZT%r#A%<Qf"I0$
-jT2u;I*,`>3adUN6,S'Uc5G<1#HIPc(cZ\5g$H1uL^aCo'S0'-]0&o#fit+9Epa7d0(r3BJ]j]u
-"bE!q\!%Cj+?+gF($u-;0%Sa,2eHr1[lOLunf^*H"p!bd4BA22Jf"iCN9R*"7uj..r"O,.e0)Nq
-Cm'@-Yun+Z)6#AZ&5V=AMi@K9//E'Q_3,^LJCUrXL;P/8S$RK4nhpV@%bdF41hOqEh1Q>qm_Q+n
-#/LU-56,TSS1B)*T]Orj2rG*NF:&5f^`*9O8Jbl`=9fBXjJ)iM%0<ssG_">3\J0&qS4ge@/ci%0
-pt5Z#r$G04\X(GE((>^l6$dJ+<&^/>q;g0`;,$Y,KMZE4gfqjA+W8)'QstEq;dt!qaot,!<8<&2
-B5]M]]#qI'&6YL`FNt'(KGEA,)a'a)N=&]5`o?#^;hbR]<Qhb;nMM8M8p>*k0S9VF4s`TNC,4oB
-\CjFJ>AM2j!>XrZ->n;@%39PO3^C@<p^P&urbE4b#!f^-qIm*&9[^&10$-Z1+No^Zcjcb^-hRMn
-\iEG;*VM8XEn?TbNH()"+uMf@&RobSEK)*F8_C4%AXi^8@1GCI-a;<r"IEdiMGM$rGk"^B5(Ls/
-<Q2u;pEucjBM[GQ<E%c7B>d)j'7H1^.(J"Hln=Pt/l"_Kg@H:@nVJpGrZdb(,Ci_+U='6ab"&dG
-e=9`W:LWM/(D-]%S+)_XQl%Y\B.>"8U2:>OS5&d]dg6CONN3g*\WCRWUMPU*!>YPkk'9hgMr]2c
-`Q0o<ZS*4)Z$@(IQnp7Kh1<5APOdtg`Hc_&/SHqUY3n@'$\;'hM^k,MEiQJ.M)X9Z>\9-fRBneq
-&"8D?Lb5II[U<PSA@"p`&F/nq\Eb^+<9-p<L&\X81?_NoIr>j[TK<@u+e]#lF0?IQQ1j4o)rt5-
-m0TIF2^8`>MSY#IdAOZ:k0MgGKoZhM)I,cNqb$a)_pA$("@o]O>,tS:&)%RWH"U,gN4bL<@IUcR
-B*Y>n,KGYG*4A[Y!hcCiFu/+.\&U-$A<SZk%9@L4FC>':@Z"pi`Ms[kRa7IeT6QGLnis*n.pqZ3
-BeKV`_l2Gb67O[C=BV@Yp2JSeF#'8Qq>/!POUe*`G/g_&@`*/*!ge;,b-FV[2"JD@<X]5Hbc1T`
-\&?grbTVW)_?%+?DV&I;ab<StnO")-bp%*_:\529iLG<\>pV4?NcIWOG#\DPKRn:Rp#+#P_\Lu8
-Dmd(Q^qcTX&tJm2WtuD>1hQ$30ai<<Z`6!k#KZM)].pTh?5RP37\-"fo7HC9b"6mVS=<K/B"*3L
--S)"W.`C^m:VjWZR$215lU'/U^!HmG*>R]:1fpr9Qo.ABc`AXJcnMIp5Pej4+WEPE%@O57(_8Z7
-U\`<=EPT&L=JbWuGQCUri&kY10H/DkU2'qA4N;,r=dqC1&&(iILEPe"EF>,0h_)6=jQW=>$?R*+
-lom=jpE,mKRnUsN1`"8c*K>SeR/-\HQ\sChF&Qd.IR(:Y8E^ur=Cs8O[:3h`6JYjNV%@7,aPAV$
-)snX"1?'h>9=Eb59M';cL`jc_,5No3KPkO1nMq>Afj`g1JC&k6>3Vl`g-`u,[)Y[2l-SHVNL>;k
-4f^XLZKg1<R\J$[9/GYGqqA5bf;_$?8]K^Ulnj90dcG\_f>c#sCM@N&3`I9#)8.0j\bT-uBYI;]
-&lXt,IpCt!6Prec)n*G1mM^:;mi)NMUJZ%h<LkLOT,_'n2jS?HnO[s\pY5keB5\[N4Z6K"-o,rm
-Aq-jlnYcS*k02Drk]"T/Nt0<d-H]"2FG:&*L$&G_#<q+b_UYPDXp<m4#rn`;l?DF*C$8HN-R*qO
-Pe9Nc>jnh79@Bmh6uND0J&M>'%0CAo88m_Wa3F$`D'#,L'VEEr\;"hL8=XI1qW(/.pLg:OjSniu
-Ef*Ak]M8*]K\0$qe8/\;P0Y%b-cSUc*0SU-r(7_mU:u>9>Z`1<[AcX7.5^kel=bpb[]jFqBE!8H
-;X;;RJVIKD`SPk)8?M%FJ*,%rX+mNG)Q!aiI*Htj/E3^C,.6gfGUG];BkDPNLj^UNF,S%QBKTuV
-hEPYK6VP^PKD9nSphidPF9di_`?'(+Uh-GROGNCTL@f)[%W3[Y>j--qklUg]G\m]4CF.iiB9I*]
-m!>IJl&].$-[o?Y@VsGmDT;*7-]i=];Jq6gKEg(VB->0Ic@(e%Bgu9Ta1cJ(e32uO"@g2h#./+/
-/tL#SKJ,Y[Va,/JY*9/6ShXRLD"=u*8:bFYT*Z/McE*lqUoLGd\*"<Z8\G_uW5ED"Ba0`cC<2!^
-\6#Ke[A_f--c0ri9P<WAO/[)C02d?*G1L:-B*]>uLB(p]D$l<?EUI.c09D*(Lf$\IQiuJt1!jXs
-<`/"`ZS8sac<+t@B+a@[;<Q#3VHEt78E6V8bN%HgmNdMp3,V4C-YFQZjC#SHZu1l3D<KPn8]n,k
-`+<OaE5uFP$%W+)2X9[OaG?AD-FS;WNj`R=k%oEl.ca/o,erO)OXUQWlVq]B[.j,FI&;(/ao%M1
-oVnq!CW?F>Numhh)%d>AD5PJ,LZFM/i3)M_N@:%+MjeCX]HftDRS.E2`Qj$)\-?ZA?3fVk.,oG@
-3gGl^qe+-u;-]Ec6<C3?FGLiP#<mEF\o4I2$0I,(-?sdU@#JW3EoqQ(17kK/@W+fsNTR<YWQ9P0
-(kcirN[J069^^R\n<YK;XN9<sn+(H'(FS`"DMRS/ldI)4Jplo89ZI]UmGs$p'VD8hQjN2QaMa7]
-],53ZNJ?*GDmjt(Ya5[#?07fO85s`/fS8Z^R]X/CVaBB7q&r7;D5OUdk1K6>T.Pe`Gp\3k-<+`7
-[X(T"Dhp$hE\`-I\;P.NBa]`3mo"$uct^RRO=Y-b%>&sUnC;4AQ&#Q\li;$^/9(tSq$,\lk>Z[2
-R!HgCBe:s88'#Br.W=J9`honc'2FI(Y\>GUCPh&8P^_5c#]tn9DWYKg`sg&+7"!$)i^hdgCXVo)
-@ZE($a[bbo7-q[%0()+%Hn3W_#@RDm#sbHYKP*9`j>><r]QgO3f;@hH#=s\K[*u'>M9r2:#Y@PQ
-5ddRn7L+Hbl[Ef+9%g1KP_u&NV'^McNeiWrb`W0YOE,YYi+f%D;Y'6hkIs/nY_)$6[AJ1kB'=U+
-U2Hk/QRLR&B^3qlfS!p;Q&%\Qns7[XG\W@eI3`itOs[+sqJZa!Lbqeed![reFMHl1$t\(@kS/Kc
-BY2<rG;\Z<l,ZQ=DKb4?,H))bnqcK7/oml,NWt%G8h@Pa_Kt=%9u^T\`q"K>N.410WTQt)ah2fZ
-ij\'AHt][,Bag>hG^\s%D$M^Ek(IISP(AAAP-@8e-Setm@X.6AEX*@]W#D$-I]EU:3X2]bca5on
-ifiN7AknY:-[9L0N,>eRF=>Rj#2G"e/oK0D:.dp-.DD5to4$h,S*U2X#3q$q,/C,*$\lZ7PG2a1
-o\rAcKh(M[0iDTfb_0WKN(0Co7q-($"EVQ-Y@k(>L5'JWhRtJcU<Y#cWZ:u9?CT!ZAg_JC-A6g,
-6>e;YRn.GfXs@b:X%;TELIoR;9oO()+tP(biPoPSkHLb>7[rUtT*BIecbQ0MX'960AuQ&O7_37=
-;KsX4[0L;rlCq@\(GMpMM8kS-VOm_s;U7,$LMcn59,R$YY%ku=Hm[(KkAGB2C5[la;s%h=MTI1o
-!gl@3nYo?C7a--,G\kKP/2diIb2R*U(E7'DD5Ql[/AGP5,hpKjC<Q[3#pa(.i0%*IDheIWP1"mc
-J8,>5^F:jRWAAha'%]jNUT`6_!lCff3,qh3oLRVX%T8qlCha8YkNN]Ha*)kVPbDpqMFL]k,MptK
-Jq1e`I4/R:-^0&"k)U;qJsM.+,"-#JH?6A7BZ=(jMr>Ytr+]q(/0m'VN[/PI#k=d4c5;eZ.\aIe
-!(SQ\IYNB9``igA)/ZQjS;0:S8PXA&*kBo!ZR35>p&\mJ[VTYsCGBGtmVL1&/o@M^WTc3H-n]r1
-T"QuIcnTKs8`OA6!cH*>1j2&r(B1fK&:>jX6*+C(`m.lTit'8[cZ^^NDnq^Yc@+/k0a<[:#(lft
-L2Tk"C?]>8kD;j/?tfjNHD^87VYGJ8<^#YGNi/(oVP+5!?@dsIHN_Q(l#;7:o'0e<AdeU'%)e$#
-*.I(,P3<J[DXaXsf%T9qi^Xc.Le)PX8;8p\/+)d?01+%4>/k52V@Fk_l5&]o3/9t0I4I(0aYn^L
-88q&.pkEp+#&B5gXK@91CkdP;DC"\,-@FJncA2\Sl#],OO)DuLE6&c3L4k[<=CkL(]EZf_[`\I2
-if?,:#)fQu7sK#%id$,BMG&Epkh=%_0QIXCaem@KBUiid9_GAKlFGDmkp1U&O`-!M*[]ojnN^Z@
-"FVWhK#QZWYN1n+#_?L\gF!,FVP&@"HRn5XL+cb&W,?[OpuZl8MFNZ)VZN,r3iYWoP:+Y4-=2.Y
-2J%qM5DSTI-?/3b>&e>H?3[QIa]t`[@[.`\gIRNAL=D#18q&+/j%pCu-E`H!PCD\,C6^-]#KMa]
-C0d.,L$#spn][j<pQ*VVHRKc#aV)anm,L]GJOnL.kQH+>Y/Te2H-Fk&)%+.B=dKsQ(,R(E&@lk:
-h6+"NP:_*WE&u1\@!^-t=GuV!8b"Dj=YWGd5KSFnV;>L>74/k.ac*gN]&[r!Hu@>O=MsSr0+d29
-^?_.'EMs\BWbQFL6E0-/Ios9tF:AS7i,T!YqY0L!XK[!s'Q3e=JIldQnQcmT")UMD/*R[[eW=^(
-ZMRU0+i[cMaCRH80[XQ(^oqTrb0$.8DFmB@Wj52@aC9P;Wb7N5YX[,]a,qm)p.^:sb7cec7]P]C
-%\IP3AX,5sM2!9GUiVVCp]cIdMk%;3B__mbLc.d.#Ci8C35>l^E""qdM5Nr.Y,]&oLM;!MaP(Rn
-_OJLZJ]=R"7dP*7&G7F=G'fmIGIYVHmV8Y]/1NnLC1,)]2b!*<A`j5"VN"302JU7OGp[@N$ik'S
--F1X/BXH]"VMiO:5oGGC_,?#b'*s7!Y=IbnP:"5RWO0</_RVD!3/UasW)Ah:oR2R.:<$7sk&+q5
-/h?\UD$m;=H%p1HnqJNO]B_5;A<f5pgmI=sMeZ@-W@lf$Ph"+@c]FDbVY/#E!iJMlLr@/IVuGgo
-Lq&S7D!#&r)9YDnfQfuMLA+N&Mn$P-Y(7"!S)"^?LZuPOc>,%FM?_(o;\X0WaDQ\RT0'i$#(mAn
-ja[P?a%QMVl\;/AF`Rr/BC2j:1Epmr\@&l!B2[84V0bbuK#]3@7b302)NuL![2b--FpH*.L/XMI
-e7hBtgPI2*\uqD>So+p)8I]1X<",_t2R^Y8TNBGFke_?hEbOc*GiiBuI%_gdAJf-#:\K4sDt]lP
-G-$J_G3h.B#9gO%en4(4rWki8bJ_&_??t(n3]@1Qki-B8Q.0GJJ&qu3XAmgC]T=aXChHH0nQ^I?
-PB,fMj9F"3Vh/mWJ49hbI&pYeIKXH-hTR=0Hg*_kjk.r%;MGBWR)p=p.CAs5MIrd1b;O<a*4JVU
-fSN/QgZ/"sOpl#q@hWKYPD4%saY-6/dm.N'(2"T'o^JHT*;cr80^Jas.6VKZhO6';_afQr720@4
-V;@1FnE^(Q1-5L)#_XonH>%A_B/kEGqK,E6eQXoVBM)-%P(2lX9*emN$#'5WBZ#RpJPf8<\65tQ
-e=;7kD!1.-!tg(uMF&GFL1E#i&9'HD&4j]IPSB'8,7I$d0u2k)5oPa(Ud>q9JhS&O#c(mn0Q@[D
-&>V[L'I[?U"V+!i.#?_R6lHKTK)rL/Cc37E7O)>u%#Qt`:^6Qd(sHYM*/u74&\u7i7?\0M",dn'
-WF?ji7Y>ujiYXQl&M(bg;&3\/V+:l8Gek#"=!A2b_ib;LKk_LSLEf\>ju>+88S$ms4Et<p)NdL>
-U'T1N2^+/0,Uq*m?pUT#aM^B$(hPXqlUMM<-@7`q_@C!u@M$[R8\pOb`$cK5-8u):`\Xbge7VLM
-%#.,UQBqoTcst-POu.8o5p9IR2t>-B.srN*UTdGn%i#>/n]55aY)@QRNt$MiN;g2%2]AI:MLHJ"
-_@g%g#,-tEb,\&O5l7NQd#.q0BHeK$0u8KD!XM+@B%$t*phh(`@?`mVV$]9EYq?GHKHZ*O\;:0`
-#]_-m1$qMDTeXjfN!1]8dVB/bWVC(c->S2b#mOh"E9N&F$7m%3Y`OITXYD?#[g'[[-5e1iqYn^3
-iQD/%.I\6R+iWgm7Yi^L$f\$NLr4hb#*3:?OJpFFC6lrd9#E9[J]JOkLo<BpM5cV`Y/2KkU;3^^
-@Bb^72[]2OOTrnl?l5f#>qDg&JeIXB#!n4V.g?AC]^2=,A8%(Gi[AkGL1nqSWWqF?AfA_upi-@j
-.U"#?LhqH,PD5)/D%<GiOuk>KTqqUG[480d`Q(eJZXsCC0T@V8c@o0/]_%qf'!l\LKW[<B]8l"Z
-8m8Cq0G+pKSAZmdg_tpr/UA80koIXnYY!!S,#o(-O;V,#r=NZH.Cq4o5P!`A^a+gPSQdA]>@n_N
-JfT*$;iouaq&td`XPKf\;o[ZS.=2O.2fHRL5?NK+;W0KJ</_Xu!Z\)h-)eF#E68[NJ>OP//3<&@
-MJS6'/TY3Xek(toXGJU)'-!LHLrGd3cf(,Lr?NkmjIS(TPiD&dMPef*,5&?[k,n&fRfis(UC%s6
-.2ZId]J:t^Z"iM)]Ugi[)OU?SZKdUW!DN&")'N`_R'tXGFKD64+ehZ2ZI2B@h2'N0nfm&]Rt.S%
-bpFN<Fb!Ks[%hd*&B.;$,,-8=80"M).ZR4bU9.L#*#M1<1UteSl1-Jtccjag-F&BTrfbfs-8;'d
-dl\V*/M3b`h(.+s=I6TV5`GN7aXCPP#8"S:90_cCM4p,3#f"_($S%#.b*E+=?<+7R3J8,"'Jsnt
-=sC^N"FS^kegOag6a$MdrXV<i5mUm5,D;/C(dZeK$=QmaKQ*Y$6MOsq@<=5YOOb)_BQ4GhS2l@d
-ar\IqI1RS:+9=ce2?m!p*.so&%C%09J>*)~>
-endstream
-endobj
-%%EndResource
-%%BeginResource: file (PDF object obj_1)
-1 0 obj
-<<>>endobj
-%%EndResource
+/Courier exch definefont pop
+%FOPEndFontReencode
 %%EndProlog
 %%Page: 1 1
-%%PageBoundingBox: 0 0 620 428
+%%PageBoundingBox: 0 0 560 420
 %%BeginPageSetup
-4 0 obj
-<</Type/Page/MediaBox [0 0 620 428]
-/Parent 3 0 R
-/Resources<</ProcSet[/PDF]
-/Font 10 0 R
->>
-/Contents 5 0 R
->>
-endobj
+[1 0 0 -1 0 420] CT
 %%EndPageSetup
-5 0 obj
-<</Length 34035>>stream
-q 0.1 0 0 0.1 0 0 cm
-1 G
-1 g
-0 0 6202.5 4282.5 re
-f
-0 0 6202.5 4282.5 re
+GS
+1 GC
+N
+0 0 560 420 re
 f
-810 472.5 4800 3487.5 re
+GR
+GS
+1 GC
+N
+0 0 560 420 re
 f
-5.0025 w
-1 j
-0.873047 g
-0.873047 G
-810 472.5 m
-810 3960 l
+GR
+GS
+1 GC
+N
+39.5 389.5 M
+554.5 389.5 L
+554.5 16 L
+39.5 16 L
+cp
+f
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+39.5 389.5 M
+39.5 16 L
 S
-1610 472.5 m
-1610 3960 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+103.875 389.5 M
+103.875 16 L
 S
-2410 472.5 m
-2410 3960 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+168.25 389.5 M
+168.25 16 L
 S
-3210 472.5 m
-3210 3960 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+232.625 389.5 M
+232.625 16 L
 S
-4010 472.5 m
-4010 3960 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+297 389.5 M
+297 16 L
 S
-4810 472.5 m
-4810 3960 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+361.375 389.5 M
+361.375 16 L
 S
-5610 472.5 m
-5610 3960 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+425.75 389.5 M
+425.75 16 L
 S
-[ 7.5 22.5 ] 0 d
-2 j
-0.775391 g
-0.775391 G
-5610 734.961 m
-810 734.961 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+490.125 389.5 M
+490.125 16 L
 S
-5610 888.488 m
-810 888.488 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+554.5 389.5 M
+554.5 16 L
 S
-5610 997.418 m
-810 997.418 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 367.013 M
+39.5 367.013 L
 S
-5610 1081.91 m
-810 1081.91 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 353.859 M
+39.5 353.859 L
 S
-5610 1150.95 m
-810 1150.95 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 344.526 M
+39.5 344.526 L
 S
-5610 1209.32 m
-810 1209.32 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 337.287 M
+39.5 337.287 L
 S
-5610 1259.88 m
-810 1259.88 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 331.372 M
+39.5 331.372 L
 S
-5610 1304.48 m
-810 1304.48 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 326.371 M
+39.5 326.371 L
 S
-5610 1606.84 m
-810 1606.84 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 322.039 M
+39.5 322.039 L
 S
-5610 1760.36 m
-810 1760.36 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 318.218 M
+39.5 318.218 L
 S
-5610 1869.29 m
-810 1869.29 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 314.8 M
+39.5 314.8 L
 S
-5610 1953.79 m
-810 1953.79 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 292.313 M
+39.5 292.313 L
 S
-5610 2022.82 m
-810 2022.82 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 279.159 M
+39.5 279.159 L
 S
-5610 2081.2 m
-810 2081.2 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 269.826 M
+39.5 269.826 L
 S
-5610 2131.75 m
-810 2131.75 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 262.587 M
+39.5 262.587 L
 S
-5610 2176.36 m
-810 2176.36 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 256.672 M
+39.5 256.672 L
 S
-5610 2478.71 m
-810 2478.71 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 251.671 M
+39.5 251.671 L
 S
-5610 2632.24 m
-810 2632.24 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 247.339 M
+39.5 247.339 L
 S
-5610 2741.17 m
-810 2741.17 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 243.518 M
+39.5 243.518 L
 S
-5610 2825.66 m
-810 2825.66 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 217.613 M
+39.5 217.613 L
 S
-5610 2894.7 m
-810 2894.7 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 204.459 M
+39.5 204.459 L
 S
-5610 2953.07 m
-810 2953.07 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 195.126 M
+39.5 195.126 L
 S
-5610 3003.63 m
-810 3003.63 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 187.887 M
+39.5 187.887 L
 S
-5610 3048.23 m
-810 3048.23 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 181.972 M
+39.5 181.972 L
 S
-5610 3350.59 m
-810 3350.59 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 176.971 M
+39.5 176.971 L
 S
-5610 3504.11 m
-810 3504.11 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 172.639 M
+39.5 172.639 L
 S
-5610 3613.04 m
-810 3613.04 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 168.818 M
+39.5 168.818 L
 S
-5610 3697.54 m
-810 3697.54 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 142.913 M
+39.5 142.913 L
 S
-5610 3766.57 m
-810 3766.57 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 129.759 M
+39.5 129.759 L
 S
-5610 3824.95 m
-810 3824.95 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 120.426 M
+39.5 120.426 L
 S
-5610 3875.5 m
-810 3875.5 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 113.187 M
+39.5 113.187 L
 S
-5610 3920.11 m
-810 3920.11 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 107.272 M
+39.5 107.272 L
 S
-[ ] 0 d
-1 j
-0.873047 g
-0.873047 G
-5610 472.5 m
-810 472.5 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 102.271 M
+39.5 102.271 L
 S
-5610 1344.38 m
-810 1344.38 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 97.939 M
+39.5 97.939 L
 S
-5610 2216.25 m
-810 2216.25 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 94.118 M
+39.5 94.118 L
 S
-5610 3088.13 m
-810 3088.13 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 68.213 M
+39.5 68.213 L
 S
-5610 3960 m
-810 3960 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 55.059 M
+39.5 55.059 L
 S
-2 J
-0.148926 g
-0.148926 G
-810 472.5 m
-5610 472.5 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 45.726 M
+39.5 45.726 L
 S
-810 3960 m
-5610 3960 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 38.487 M
+39.5 38.487 L
 S
-810 472.5 m
-810 520.5 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 32.572 M
+39.5 32.572 L
 S
-1610 472.5 m
-1610 520.5 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 27.571 M
+39.5 27.571 L
 S
-2410 472.5 m
-2410 520.5 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 23.239 M
+39.5 23.239 L
 S
-3210 472.5 m
-3210 520.5 l
+GR
+GS
+0.775 GC
+[1 3] 0 setdash
+2 LJ
+0.5 LW
+N
+554.5 19.418 M
+39.5 19.418 L
 S
-4010 472.5 m
-4010 520.5 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+554.5 389.5 M
+39.5 389.5 L
 S
-4810 472.5 m
-4810 520.5 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+554.5 314.8 M
+39.5 314.8 L
 S
-5610 472.5 m
-5610 520.5 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+554.5 240.1 M
+39.5 240.1 L
 S
-810 3960 m
-810 3912 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+554.5 165.4 M
+39.5 165.4 L
 S
-1610 3960 m
-1610 3912 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+554.5 90.7 M
+39.5 90.7 L
 S
-2410 3960 m
-2410 3912 l
+GR
+GS
+0.873 GC
+1 LJ
+0.5 LW
+N
+554.5 16 M
+39.5 16 L
 S
-3210 3960 m
-3210 3912 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 389.5 M
+554.5 389.5 L
 S
-4010 3960 m
-4010 3912 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 16 M
+554.5 16 L
 S
-4810 3960 m
-4810 3912 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 389.5 M
+39.5 384.35 L
 S
-5610 3960 m
-5610 3912 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+103.875 389.5 M
+103.875 384.35 L
 S
-q
-10 0 0 10 0 0 cm BT
-/R6 9.99975 Tf
-1 0 0 1 76.125 33.5 Tm
-[(-5)-7261.2(0)-7444.2(5)-7144.19(10)-6888.2(15)-6888.2(20)-6888.2(25)]TJ
-/R6 11.0002 Tf
-221.25 -14.5 Td
-(SNR\(dB\))Tj
-ET
-Q
-810 472.5 m
-810 3960 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+168.25 389.5 M
+168.25 384.35 L
 S
-5610 472.5 m
-5610 3960 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+232.625 389.5 M
+232.625 384.35 L
 S
-810 472.5 m
-858 472.5 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+297 389.5 M
+297 384.35 L
 S
-810 1344.38 m
-858 1344.38 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+361.375 389.5 M
+361.375 384.35 L
 S
-810 2216.25 m
-858 2216.25 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+425.75 389.5 M
+425.75 384.35 L
 S
-810 3088.13 m
-858 3088.13 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+490.125 389.5 M
+490.125 384.35 L
 S
-810 3960 m
-858 3960 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 389.5 M
+554.5 384.35 L
 S
-5610 472.5 m
-5562 472.5 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 16 M
+39.5 21.15 L
 S
-5610 1344.38 m
-5562 1344.38 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+103.875 16 M
+103.875 21.15 L
 S
-5610 2216.25 m
-5562 2216.25 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+168.25 16 M
+168.25 21.15 L
 S
-5610 3088.13 m
-5562 3088.13 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+232.625 16 M
+232.625 21.15 L
 S
-5610 3960 m
-5562 3960 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+297 16 M
+297 21.15 L
 S
-810 734.961 m
-834 734.961 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+361.375 16 M
+361.375 21.15 L
 S
-810 888.488 m
-834 888.488 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+425.75 16 M
+425.75 21.15 L
 S
-810 997.418 m
-834 997.418 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+490.125 16 M
+490.125 21.15 L
 S
-810 1081.91 m
-834 1081.91 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 16 M
+554.5 21.15 L
 S
-810 1150.95 m
-834 1150.95 l
+GR
+GS
+[1 0 0 1 39.5 393.5] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+-5 10 moveto 
+1 -1 scale
+(-5) t 
+GR
+GR
+GS
+[1 0 0 1 103.875 393.5] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+-3 10 moveto 
+1 -1 scale
+(0) t 
+GR
+GR
+GS
+[1 0 0 1 168.25 393.5] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+-3 10 moveto 
+1 -1 scale
+(5) t 
+GR
+GR
+GS
+[1 0 0 1 232.625 393.5] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+-6 10 moveto 
+1 -1 scale
+(10) t 
+GR
+GR
+GS
+[1 0 0 1 297 393.5] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+-6 10 moveto 
+1 -1 scale
+(15) t 
+GR
+GR
+GS
+[1 0 0 1 361.375 393.5] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+-6 10 moveto 
+1 -1 scale
+(20) t 
+GR
+GR
+GS
+[1 0 0 1 425.75 393.5] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+-6 10 moveto 
+1 -1 scale
+(25) t 
+GR
+GR
+GS
+[1 0 0 1 490.125 393.5] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+-6 10 moveto 
+1 -1 scale
+(30) t 
+GR
+GR
+GS
+[1 0 0 1 554.5 393.5] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+-6 10 moveto 
+1 -1 scale
+(35) t 
+GR
+GR
+GS
+[1 0 0 1 297.00024 407] CT
+0.149 GC
+/Helvetica 11 F
+GS
+[1 0 0 1 0 0] CT
+-23 11 moveto 
+1 -1 scale
+(SNR \(dB\)) t 
+GR
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 389.5 M
+39.5 16 L
 S
-810 1209.32 m
-834 1209.32 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 389.5 M
+554.5 16 L
 S
-810 1259.88 m
-834 1259.88 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 389.5 M
+44.65 389.5 L
 S
-810 1304.48 m
-834 1304.48 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 314.8 M
+44.65 314.8 L
 S
-810 1606.84 m
-834 1606.84 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 240.1 M
+44.65 240.1 L
 S
-810 1760.36 m
-834 1760.36 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 165.4 M
+44.65 165.4 L
 S
-810 1869.29 m
-834 1869.29 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 90.7 M
+44.65 90.7 L
 S
-810 1953.79 m
-834 1953.79 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 16 M
+44.65 16 L
 S
-810 2022.82 m
-834 2022.82 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 389.5 M
+549.35 389.5 L
 S
-810 2081.2 m
-834 2081.2 l
-S
-810 2131.75 m
-834 2131.75 l
-S
-810 2176.36 m
-834 2176.36 l
-S
-810 2478.71 m
-834 2478.71 l
-S
-810 2632.24 m
-834 2632.24 l
-S
-810 2741.17 m
-834 2741.17 l
-S
-810 2825.66 m
-834 2825.66 l
-S
-810 2894.7 m
-834 2894.7 l
-S
-810 2953.07 m
-834 2953.07 l
-S
-810 3003.63 m
-834 3003.63 l
-S
-810 3048.23 m
-834 3048.23 l
-S
-810 3350.59 m
-834 3350.59 l
-S
-810 3504.11 m
-834 3504.11 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 314.8 M
+549.35 314.8 L
 S
-810 3613.04 m
-834 3613.04 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 240.1 M
+549.35 240.1 L
 S
-810 3697.54 m
-834 3697.54 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 165.4 M
+549.35 165.4 L
 S
-810 3766.57 m
-834 3766.57 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 90.7 M
+549.35 90.7 L
 S
-810 3824.95 m
-834 3824.95 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 16 M
+549.35 16 L
 S
-810 3875.5 m
-834 3875.5 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 389.5 M
+42.075 389.5 L
 S
-810 3920.11 m
-834 3920.11 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 367.013 M
+42.075 367.013 L
 S
-5610 734.961 m
-5586 734.961 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 353.859 M
+42.075 353.859 L
 S
-5610 888.488 m
-5586 888.488 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 344.526 M
+42.075 344.526 L
 S
-5610 997.418 m
-5586 997.418 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 337.287 M
+42.075 337.287 L
 S
-5610 1081.91 m
-5586 1081.91 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 331.372 M
+42.075 331.372 L
 S
-5610 1150.95 m
-5586 1150.95 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 326.371 M
+42.075 326.371 L
 S
-5610 1209.32 m
-5586 1209.32 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 322.039 M
+42.075 322.039 L
 S
-5610 1259.88 m
-5586 1259.88 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 318.218 M
+42.075 318.218 L
 S
-5610 1304.48 m
-5586 1304.48 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 314.8 M
+42.075 314.8 L
 S
-5610 1606.84 m
-5586 1606.84 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 314.8 M
+42.075 314.8 L
 S
-5610 1760.36 m
-5586 1760.36 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 292.313 M
+42.075 292.313 L
 S
-5610 1869.29 m
-5586 1869.29 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 279.159 M
+42.075 279.159 L
 S
-5610 1953.79 m
-5586 1953.79 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 269.826 M
+42.075 269.826 L
 S
-5610 2022.82 m
-5586 2022.82 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 262.587 M
+42.075 262.587 L
 S
-5610 2081.2 m
-5586 2081.2 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 256.672 M
+42.075 256.672 L
 S
-5610 2131.75 m
-5586 2131.75 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 251.671 M
+42.075 251.671 L
 S
-5610 2176.36 m
-5586 2176.36 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 247.339 M
+42.075 247.339 L
 S
-5610 2478.71 m
-5586 2478.71 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 243.518 M
+42.075 243.518 L
 S
-5610 2632.24 m
-5586 2632.24 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 240.1 M
+42.075 240.1 L
 S
-5610 2741.17 m
-5586 2741.17 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 217.613 M
+42.075 217.613 L
 S
-5610 2825.66 m
-5586 2825.66 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 204.459 M
+42.075 204.459 L
 S
-5610 2894.7 m
-5586 2894.7 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 195.126 M
+42.075 195.126 L
 S
-5610 2953.07 m
-5586 2953.07 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 187.887 M
+42.075 187.887 L
 S
-5610 3003.63 m
-5586 3003.63 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 181.972 M
+42.075 181.972 L
 S
-5610 3048.23 m
-5586 3048.23 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 176.971 M
+42.075 176.971 L
 S
-5610 3350.59 m
-5586 3350.59 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 172.639 M
+42.075 172.639 L
 S
-5610 3504.11 m
-5586 3504.11 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 168.818 M
+42.075 168.818 L
 S
-5610 3613.04 m
-5586 3613.04 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 165.4 M
+42.075 165.4 L
 S
-5610 3697.54 m
-5586 3697.54 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 142.913 M
+42.075 142.913 L
 S
-5610 3766.57 m
-5586 3766.57 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 129.759 M
+42.075 129.759 L
 S
-5610 3824.95 m
-5586 3824.95 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 120.426 M
+42.075 120.426 L
 S
-5610 3875.5 m
-5586 3875.5 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 113.187 M
+42.075 113.187 L
 S
-5610 3920.11 m
-5586 3920.11 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 107.272 M
+42.075 107.272 L
 S
-q
-10 0 0 10 0 0 cm BT
-/R6 9.99975 Tf
-1 0 0 1 56.25 42 Tm
-(10)Tj
-/R6 8.00025 Tf
-12.75 4.5 Td
-(-4)Tj
-/R6 9.99975 Tf
--12.75 82.5 Td
-(10)Tj
-/R6 8.00025 Tf
-12.75 4.5 Td
-(-3)Tj
-/R6 9.99975 Tf
--12.75 82.5 Td
-(10)Tj
-/R6 8.00025 Tf
-12.75 4.5 Td
-(-2)Tj
-/R6 9.99975 Tf
--12.75 83.25 Td
-(10)Tj
-/R6 8.00025 Tf
-12.75 4.5 Td
-(-1)Tj
-/R6 9.99975 Tf
--9.75 82.5 Td
-(10)Tj
-/R6 8.00025 Tf
-12.75 4.5 Td
-(0)Tj
-/R6 11.0002 Tf
-0 1 -1 0 50 210.75 Tm
-(PER)Tj
-ET
-Q
-0 G
-0 g
-q
-10 0 0 10 0 0 cm BT
-/R8 11.0002 Tf
-1 0 0 1 108 401.063 Tm
-(802.11n PER vs SNR comparison for 20MHz, 1000 Bytes MCS 0 to 7)Tj
-ET
-Q
-30 w
-0 J
-0 0 1 rg
-0 0 1 RG
-1450 3960 m
-1514 3953.75 l
-1578 3896.75 l
-1642 3683.1 l
-1706 3285.92 l
-1770 2794.55 l
-1834 2265.33 l
-1898 1667.96 l
-1962 1023.67 l
-2026 541.637 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 102.271 M
+42.075 102.271 L
 S
-[ 120 120 ] 0 d
-2 j
-0 g
-0 G
-1450 3960 m
-1610 3600.38 l
-1770 2590.24 l
-1930 1351.88 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 97.939 M
+42.075 97.939 L
 S
-[ ] 0 d
-5.0025 w
-1 j
-1 0 0 rg
-1 0 0 RG
-1450 3960 m
-1450 3960 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 94.118 M
+42.075 94.118 L
 S
-1514 3948.98 m
-1514 3958.47 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 90.7 M
+42.075 90.7 L
 S
-1578 3881.92 m
-1578 3911.03 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 68.213 M
+42.075 68.213 L
 S
-1642 3655.38 m
-1642 3708.92 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 55.059 M
+42.075 55.059 L
 S
-1706 3250.48 m
-1706 3318.33 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 45.726 M
+42.075 45.726 L
 S
-1770 2756.45 m
-1770 2829.16 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 38.487 M
+42.075 38.487 L
 S
-1834 2226.51 m
-1834 2300.54 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 32.572 M
+42.075 32.572 L
 S
-1898 1582.57 m
-1898 1737.6 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 27.571 M
+42.075 27.571 L
 S
-1962 780.977 m
-1962 1170.38 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 23.239 M
+42.075 23.239 L
 S
-2026 472.148 m
-2026 783.563 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 19.418 M
+42.075 19.418 L
 S
-1440.4 3960 m
-1459.6 3960 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+39.5 16 M
+42.075 16 L
 S
-1504.4 3948.98 m
-1523.6 3948.98 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 389.5 M
+551.925 389.5 L
 S
-1568.4 3881.92 m
-1587.6 3881.92 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 367.013 M
+551.925 367.013 L
 S
-1632.4 3655.38 m
-1651.6 3655.38 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 353.859 M
+551.925 353.859 L
 S
-1696.4 3250.48 m
-1715.6 3250.48 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 344.526 M
+551.925 344.526 L
 S
-1760.4 2756.45 m
-1779.6 2756.45 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 337.287 M
+551.925 337.287 L
 S
-1824.4 2226.51 m
-1843.6 2226.51 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 331.372 M
+551.925 331.372 L
 S
-1888.4 1582.57 m
-1907.6 1582.57 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 326.371 M
+551.925 326.371 L
 S
-1952.4 780.977 m
-1971.6 780.977 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 322.039 M
+551.925 322.039 L
 S
-1440.4 3960 m
-1459.6 3960 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 318.218 M
+551.925 318.218 L
 S
-1504.4 3958.47 m
-1523.6 3958.47 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 314.8 M
+551.925 314.8 L
 S
-1568.4 3911.03 m
-1587.6 3911.03 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 314.8 M
+551.925 314.8 L
 S
-1632.4 3708.92 m
-1651.6 3708.92 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 292.313 M
+551.925 292.313 L
 S
-1696.4 3318.33 m
-1715.6 3318.33 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 279.159 M
+551.925 279.159 L
 S
-1760.4 2829.16 m
-1779.6 2829.16 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 269.826 M
+551.925 269.826 L
 S
-1824.4 2300.54 m
-1843.6 2300.54 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 262.587 M
+551.925 262.587 L
 S
-1888.4 1737.6 m
-1907.6 1737.6 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 256.672 M
+551.925 256.672 L
 S
-1952.4 1170.38 m
-1971.6 1170.38 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 251.671 M
+551.925 251.671 L
 S
-2016.4 783.563 m
-2035.6 783.563 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 247.339 M
+551.925 247.339 L
 S
-1460 3960 m
-1460 3954.48 1455.52 3950 1450 3950 c
-1444.48 3950 1440 3954.48 1440 3960 c
-1440 3965.52 1444.48 3970 1450 3970 c
-1455.52 3970 1460 3965.52 1460 3960 c
-f
-1524 3953.75 m
-1524 3948.23 1519.52 3943.76 1514 3943.76 c
-1508.48 3943.76 1504 3948.23 1504 3953.75 c
-1504 3959.27 1508.48 3963.75 1514 3963.75 c
-1519.52 3963.75 1524 3959.27 1524 3953.75 c
-f
-1588 3896.75 m
-1588 3891.23 1583.52 3886.75 1578 3886.75 c
-1572.48 3886.75 1568 3891.23 1568 3896.75 c
-1568 3902.27 1572.48 3906.75 1578 3906.75 c
-1583.52 3906.75 1588 3902.27 1588 3896.75 c
-f
-1652 3683.1 m
-1652 3677.58 1647.52 3673.1 1642 3673.1 c
-1636.48 3673.1 1632 3677.58 1632 3683.1 c
-1632 3688.62 1636.48 3693.1 1642 3693.1 c
-1647.52 3693.1 1652 3688.62 1652 3683.1 c
-f
-1716 3285.92 m
-1716 3280.4 1711.52 3275.93 1706 3275.93 c
-1700.48 3275.93 1696 3280.4 1696 3285.92 c
-1696 3291.44 1700.48 3295.92 1706 3295.92 c
-1711.52 3295.92 1716 3291.44 1716 3285.92 c
-f
-1780 2794.55 m
-1780 2789.03 1775.52 2784.55 1770 2784.55 c
-1764.48 2784.55 1760 2789.03 1760 2794.55 c
-1760 2800.07 1764.48 2804.55 1770 2804.55 c
-1775.52 2804.55 1780 2800.07 1780 2794.55 c
-f
-1844 2265.33 m
-1844 2259.81 1839.52 2255.34 1834 2255.34 c
-1828.48 2255.34 1824 2259.81 1824 2265.33 c
-1824 2270.85 1828.48 2275.33 1834 2275.33 c
-1839.52 2275.33 1844 2270.85 1844 2265.33 c
-f
-1908 1667.96 m
-1908 1662.44 1903.52 1657.96 1898 1657.96 c
-1892.48 1657.96 1888 1662.44 1888 1667.96 c
-1888 1673.48 1892.48 1677.96 1898 1677.96 c
-1903.52 1677.96 1908 1673.48 1908 1667.96 c
-f
-1972 1023.67 m
-1972 1018.15 1967.52 1013.67 1962 1013.67 c
-1956.48 1013.67 1952 1018.15 1952 1023.67 c
-1952 1029.19 1956.48 1033.67 1962 1033.67 c
-1967.52 1033.67 1972 1029.19 1972 1023.67 c
-f
-2036 541.633 m
-2036 536.113 2031.52 531.637 2026 531.637 c
-2020.48 531.637 2016 536.113 2016 541.633 c
-2016 547.152 2020.48 551.629 2026 551.629 c
-2031.52 551.629 2036 547.152 2036 541.633 c
-f
-30 w
-0 0 1 rg
-0 0 1 RG
-1930 3960 m
-1994 3960 l
-2058 3899.94 l
-2122 3677.63 l
-2186 3287.56 l
-2250 2823.61 l
-2314 2267.22 l
-2378 1765.02 l
-2442 1128.81 l
-2506 636.797 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 243.518 M
+551.925 243.518 L
 S
-[ 120 120 ] 0 d
-2 j
-0 g
-0 G
-1450 3960 m
-1930 3960 l
-2090 3618.25 l
-2250 2617.18 l
-2410 1344.38 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 240.1 M
+551.925 240.1 L
 S
-[ ] 0 d
-5.0025 w
-1 j
-1 0 0 rg
-1 0 0 RG
-1930 3960 m
-1930 3960 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 217.613 M
+551.925 217.613 L
 S
-1994 3960 m
-1994 3960 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 204.459 M
+551.925 204.459 L
 S
-2058 3885.46 m
-2058 3913.89 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 195.126 M
+551.925 195.126 L
 S
-2122 3649.72 m
-2122 3703.62 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 187.887 M
+551.925 187.887 L
 S
-2186 3252.13 m
-2186 3319.95 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 181.972 M
+551.925 181.972 L
 S
-2250 2785.58 m
-2250 2858.15 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 176.971 M
+551.925 176.971 L
 S
-2314 2228.4 m
-2314 2302.43 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 172.639 M
+551.925 172.639 L
 S
-2378 1691 m
-2378 1826.9 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 168.818 M
+551.925 168.818 L
 S
-2442 927.832 m
-2442 1259.4 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 165.4 M
+551.925 165.4 L
 S
-2506 472.148 m
-2506 857.004 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 142.913 M
+551.925 142.913 L
 S
-1920.4 3960 m
-1939.6 3960 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 129.759 M
+551.925 129.759 L
 S
-1984.4 3960 m
-2003.6 3960 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 120.426 M
+551.925 120.426 L
 S
-2048.4 3885.46 m
-2067.6 3885.46 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 113.187 M
+551.925 113.187 L
 S
-2112.4 3649.72 m
-2131.6 3649.72 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 107.272 M
+551.925 107.272 L
 S
-2176.4 3252.13 m
-2195.6 3252.13 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 102.271 M
+551.925 102.271 L
 S
-2240.4 2785.58 m
-2259.6 2785.58 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 97.939 M
+551.925 97.939 L
 S
-2304.4 2228.4 m
-2323.6 2228.4 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 94.118 M
+551.925 94.118 L
 S
-2368.4 1691 m
-2387.6 1691 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 90.7 M
+551.925 90.7 L
 S
-2432.4 927.832 m
-2451.6 927.832 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 68.213 M
+551.925 68.213 L
 S
-1920.4 3960 m
-1939.6 3960 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 55.059 M
+551.925 55.059 L
 S
-1984.4 3960 m
-2003.6 3960 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 45.726 M
+551.925 45.726 L
 S
-2048.4 3913.89 m
-2067.6 3913.89 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 38.487 M
+551.925 38.487 L
 S
-2112.4 3703.62 m
-2131.6 3703.62 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 32.572 M
+551.925 32.572 L
 S
-2176.4 3319.95 m
-2195.6 3319.95 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 27.571 M
+551.925 27.571 L
 S
-2240.4 2858.15 m
-2259.6 2858.15 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 23.239 M
+551.925 23.239 L
 S
-2304.4 2302.43 m
-2323.6 2302.43 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 19.418 M
+551.925 19.418 L
 S
-2368.4 1826.9 m
-2387.6 1826.9 l
+GR
+GS
+0.149 GC
+2 setlinecap
+1 LJ
+0.5 LW
+N
+554.5 16 M
+551.925 16 L
 S
-2432.4 1259.4 m
-2451.6 1259.4 l
+GR
+GS
+[1 0 0 1 16 395] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+0 0 moveto 
+1 -1 scale
+(10) t 
+GR
+GR
+GS
+[1 0 0 1 28 390] CT
+0.149 GC
+/Helvetica 8 F
+GS
+[1 0 0 1 0 0] CT
+0 0 moveto 
+1 -1 scale
+(-5) t 
+GR
+GR
+GS
+[1 0 0 1 16 320] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+0 0 moveto 
+1 -1 scale
+(10) t 
+GR
+GR
+GS
+[1 0 0 1 28 315] CT
+0.149 GC
+/Helvetica 8 F
+GS
+[1 0 0 1 0 0] CT
+0 0 moveto 
+1 -1 scale
+(-4) t 
+GR
+GR
+GS
+[1 0 0 1 16 245] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+0 0 moveto 
+1 -1 scale
+(10) t 
+GR
+GR
+GS
+[1 0 0 1 28 240] CT
+0.149 GC
+/Helvetica 8 F
+GS
+[1 0 0 1 0 0] CT
+0 0 moveto 
+1 -1 scale
+(-3) t 
+GR
+GR
+GS
+[1 0 0 1 16 170] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+0 0 moveto 
+1 -1 scale
+(10) t 
+GR
+GR
+GS
+[1 0 0 1 28 165] CT
+0.149 GC
+/Helvetica 8 F
+GS
+[1 0 0 1 0 0] CT
+0 0 moveto 
+1 -1 scale
+(-2) t 
+GR
+GR
+GS
+[1 0 0 1 16 96] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+0 0 moveto 
+1 -1 scale
+(10) t 
+GR
+GR
+GS
+[1 0 0 1 28 91] CT
+0.149 GC
+/Helvetica 8 F
+GS
+[1 0 0 1 0 0] CT
+0 0 moveto 
+1 -1 scale
+(-1) t 
+GR
+GR
+GS
+[1 0 0 1 19 21] CT
+0.149 GC
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+0 0 moveto 
+1 -1 scale
+(10) t 
+GR
+GR
+GS
+[1 0 0 1 31 16] CT
+0.149 GC
+/Helvetica 8 F
+GS
+[1 0 0 1 0 0] CT
+0 0 moveto 
+1 -1 scale
+(0) t 
+GR
+GR
+GS
+[0 -1 1 0 13 202.74982] CT
+0.149 GC
+/Helvetica 11 F
+GS
+[1 0 0 1 0 0] CT
+-11 -3 moveto 
+1 -1 scale
+(PER) t 
+GR
+GR
+GS
+[1 0 0 1 297.00027 14.62499] CT
+/Helvetica-Bold 11 F
+GS
+[1 0 0 1 0 0] CT
+-140 -3 moveto 
+1 -1 scale
+(PER VS SNR over AWGN channel, LDPC, MCS 0 to 11) t 
+GR
+GR
+GS
+1 0.075 0.651 RC
+1 LJ
+N
+84.563 16 M
+87.781 16.929 L
+91 32.271 L
+94.219 73.106 L
+97.438 128.721 L
+100.656 189.551 L
+103.875 243.518 L
+107.094 314.8 L
+110.313 324.133 L
+S
+GR
+GS
+[1 0 0 1 84.5625 16] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 87.78125 16.92885] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 91 32.27072] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 94.21875 73.10603] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 97.4375 128.72147] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 100.65625 189.55099] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 103.875 243.5181] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 107.09375 314.79999] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 110.3125 324.13293] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+1 0.075 0.651 RC
+1 LJ
+N
+123.188 16 M
+126.406 16.818 L
+129.625 30.835 L
+132.844 70.812 L
+136.063 125.014 L
+139.281 187.725 L
+142.5 245.372 L
+145.719 285.074 L
+S
+GR
+GS
+[1 0 0 1 123.1875 16] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 126.40625 16.81803] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 129.625 30.83515] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 132.84375 70.81249] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 136.0625 125.01402] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 139.28125 187.72513] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 142.5 245.37241] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 145.71875 285.07388] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+1 0.075 0.651 RC
+1 LJ
+N
+155.375 16 M
+158.594 16.569 L
+161.813 31.545 L
+165.031 78.378 L
+168.25 146.241 L
+171.469 209.101 L
+174.688 266.005 L
+S
+GR
+GS
+[1 0 0 1 155.375 16] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 158.59375 16.56862] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 161.8125 31.54499] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 165.03125 78.37844] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 168.25 146.24117] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 171.46875 209.10149] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 174.6875 266.00504] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+1 0.075 0.651 RC
+1 LJ
+N
+194 16.018 M
+197.219 17.932 L
+200.438 33.975 L
+203.656 69.597 L
+206.875 115.857 L
+210.094 168.017 L
+213.313 213.792 L
+216.531 262.587 L
+219.75 337.287 L
+S
+GR
+GS
+[1 0 0 1 194 16.01785] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 197.21875 17.9315] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 200.4375 33.97539] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 203.65625 69.5966] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 206.875 115.85674] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 210.09375 168.01701] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 213.3125 213.79196] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 216.53125 262.58694] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 219.75 337.28693] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+1 0.075 0.651 RC
+1 LJ
+N
+284.125 16 M
+287.344 16.058 L
+290.563 19.34 L
+293.781 38.408 L
+297 76.861 L
+300.219 128.048 L
+303.438 183.779 L
+306.656 255.348 L
+309.875 307.561 L
+S
+GR
+GS
+[1 0 0 1 284.125 16] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 287.34375 16.05844] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 290.5625 19.33977] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 293.78125 38.40755] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 297 76.86117] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 300.21875 128.04771] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 303.4375 183.77875] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 306.65625 255.34776] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 309.875 307.56082] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+1 0.075 0.651 RC
+1 LJ
+N
+303.438 16.002 M
+306.656 16.582 L
+309.875 25.75 L
+313.094 54.438 L
+316.313 99.593 L
+319.531 155.306 L
+322.75 207.282 L
+325.969 264.251 L
+329.188 314.8 L
+S
+GR
+GS
+[1 0 0 1 303.4375 16.00243] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 306.65625 16.58185] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 309.875 25.74977] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 313.09375 54.43781] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 316.3125 99.59255] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 319.53125 155.30559] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 322.75 207.28185] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 325.96875 264.25098] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 329.1875 314.79999] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+1 0.075 0.651 RC
+1 LJ
+N
+322.75 16.006 M
+325.969 16.782 L
+329.188 26.153 L
+332.406 52.844 L
+335.625 94.235 L
+338.844 144.748 L
+342.063 191.667 L
+345.281 250.533 L
+348.5 307.561 L
+S
+GR
+GS
+[1 0 0 1 322.75 16.00648] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 325.96875 16.78228] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 329.1875 26.15316] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 332.40625 52.84388] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 335.625 94.23546] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 338.84375 144.74832] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 342.0625 191.6675] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 345.28125 250.53275] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 348.5 307.56082] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+1 0.075 0.651 RC
+1 LJ
+N
+367.813 16 M
+371.031 16.089 L
+374.25 19.382 L
+377.469 35.718 L
+380.688 68.136 L
+383.906 112.72 L
+387.125 161.22 L
+390.344 213.792 L
+393.563 274.158 L
+396.781 324.133 L
+S
+GR
+GS
+[1 0 0 1 367.8125 16] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 371.03125 16.08934] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 374.25 19.38205] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 377.46875 35.71797] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 380.6875 68.13609] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 383.90625 112.71992] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 387.125 161.22044] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 390.34375 213.79196] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 393.5625 274.15811] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 396.78125 324.13293] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+1 0.075 0.651 RC
+1 LJ
+N
+390.344 16 M
+393.563 16.092 L
+396.781 18.856 L
+400 32.737 L
+403.219 61.346 L
+406.438 98.698 L
+409.656 144.705 L
+412.875 190.067 L
+416.094 236.279 L
+419.313 269.826 L
+S
+GR
+GS
+[1 0 0 1 390.34375 16] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 393.5625 16.09179] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 396.78125 18.85615] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 400 32.73742] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 403.21875 61.34584] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 406.4375 98.6982] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 409.65625 144.70541] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 412.875 190.06731] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 416.09375 236.2789] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 419.3125 269.82611] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+1 0.075 0.651 RC
+1 LJ
+N
+432.188 16 M
+435.406 16.062 L
+438.625 18.079 L
+441.844 29.334 L
+445.063 53.784 L
+448.281 88.971 L
+451.5 129.143 L
+454.719 172.437 L
+457.938 222.412 L
+S
+GR
+GS
+[1 0 0 1 432.1875 16] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 435.40625 16.06169] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 438.625 18.07903] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 441.84375 29.33416] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 445.0625 53.78406] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 448.28125 88.97073] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 451.5 129.14313] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 454.71875 172.43704] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 457.9375 222.41185] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+1 0.075 0.651 RC
+1 LJ
+N
+457.938 16 M
+461.156 16.04 L
+464.375 17.431 L
+467.594 26.209 L
+470.813 46.909 L
+474.031 77.768 L
+477.25 117.705 L
+480.469 158.684 L
+483.688 200.161 L
+S
+GR
+GS
+[1 0 0 1 457.9375 16] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 461.15625 16.03976] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 464.375 17.43096] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 467.59375 26.20866] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 470.8125 46.90925] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 474.03125 77.76842] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 477.25 117.70486] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 480.46875 158.6841] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 483.6875 200.16084] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+0 0 1 RC
+1 LJ
+2 LW
+N
+84.563 16 M
+87.781 16.674 L
+91 32.312 L
+94.219 73.39 L
+97.438 126.488 L
+100.656 185.753 L
+103.875 245.372 L
+107.094 289.221 L
+110.313 344.526 L
+S
+GR
+GS
+0 0 1 RC
+1 LJ
+2 LW
+N
+123.188 16 M
+126.406 16.832 L
+129.625 31.337 L
+132.844 70.593 L
+136.063 125.725 L
+139.281 184.677 L
+142.5 246.145 L
+145.719 301.646 L
+148.938 353.859 L
+S
+GR
+GS
+0 0 1 RC
+1 LJ
+2 LW
+N
+155.375 16 M
+158.594 16.419 L
+161.813 31.215 L
+165.031 75.858 L
+168.25 141.516 L
+171.469 210.897 L
+174.688 275.099 L
+177.906 353.859 L
+S
+GR
+GS
+0 0 1 RC
+1 LJ
+2 LW
+N
+194 16.065 M
+197.219 17.889 L
+200.438 33.731 L
+203.656 67.186 L
+206.875 114.225 L
+210.094 167.685 L
+213.313 220.142 L
+216.531 269.826 L
+219.75 311.708 L
+222.969 367.013 L
+S
+GR
+GS
+0 0 1 RC
+1 LJ
+2 LW
+N
+284.125 16 M
+287.344 16.097 L
+290.563 18.763 L
+293.781 36.118 L
+297 74.236 L
+300.219 123.046 L
+303.438 179.276 L
+306.656 239.777 L
+309.875 278.095 L
+313.094 337.287 L
+S
+GR
+GS
+0 0 1 RC
+1 LJ
+2 LW
+N
+303.438 16 M
+306.656 16.61 L
+309.875 25.799 L
+313.094 51.856 L
+316.313 97.344 L
+319.531 149.768 L
+322.75 207.4 L
+325.969 261.315 L
+329.188 337.287 L
+332.406 353.859 L
+S
+GR
+GS
+0 0 1 RC
+1 LJ
+2 LW
+N
+322.75 16 M
+325.969 16.737 L
+329.188 25.776 L
+332.406 51.781 L
+335.625 91.899 L
+338.844 140.08 L
+342.063 190.102 L
+345.281 244.618 L
+348.5 295.731 L
+351.719 353.859 L
+S
+GR
+GS
+0 0 1 RC
+1 LJ
+2 LW
+N
+367.813 16 M
+371.031 16.162 L
+374.25 19.528 L
+377.469 34.656 L
+380.688 66.755 L
+383.906 109.536 L
+387.125 160.323 L
+390.344 210.504 L
+393.563 271.49 L
+396.781 306.288 L
+400 344.526 L
+403.219 382.764 L
+S
+GR
+GS
+0 0 1 RC
+1 LJ
+2 LW
+N
+390.344 16 M
+393.563 16.032 L
+396.781 17.98 L
+400 30.684 L
+403.219 58.245 L
+406.438 95.233 L
+409.656 139.624 L
+412.875 188.082 L
+416.094 237.008 L
+419.313 277.065 L
+422.531 344.526 L
+S
+GR
+GS
+0 0 1 RC
+1 LJ
+2 LW
+N
+432.188 16 M
+435.406 16 L
+438.625 17.674 L
+441.844 28.2 L
+445.063 52.028 L
+448.281 85.827 L
+451.5 125.333 L
+454.719 169.658 L
+457.938 215.57 L
+461.156 260.09 L
+464.375 318.218 L
+467.594 367.013 L
+S
+GR
+GS
+0 0 1 RC
+1 LJ
+2 LW
+N
+457.938 16 M
+461.156 16 L
+464.375 17.705 L
+467.594 25.219 L
+470.813 45.538 L
+474.031 75.033 L
+477.25 112.237 L
+480.469 156.651 L
+483.688 198.634 L
+486.906 240.1 L
+490.125 289.221 L
+493.344 331.372 L
+S
+GR
+GS
+1 0.075 0.651 RC
+1 LJ
+N
+232.625 16.001 M
+235.844 16.427 L
+239.063 27.452 L
+242.281 64.159 L
+245.5 119.566 L
+248.719 184.355 L
+251.938 246.341 L
+255.156 307.561 L
+S
+GR
+GS
+[1 0 0 1 232.625 16.0008] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 235.84375 16.42697] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 239.0625 27.45206] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 242.28125 64.15851] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 245.5 119.56577] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 248.71875 184.3555] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 251.9375 246.34088] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+[1 0 0 1 255.15625 307.56082] CT
+1 0.075 0.651 RC
+10.0 ML
+N
+-2.828 -2.828 M
+2.828 2.828 L
+-2.828 2.828 M
+2.828 -2.828 L
+S
+GR
+GS
+0 0 1 RC
+1 LJ
+2 LW
+N
+232.625 16 M
+235.844 16.226 L
+239.063 27.16 L
+242.281 61.336 L
+245.5 115.182 L
+248.719 182.793 L
+251.938 243.16 L
+255.156 299.552 L
+258.375 353.859 L
+S
+GR
+GS
+1 0.075 0.651 RC
+1 LJ
+N
+490 46 M
+511 46 L
 S
-2496.4 857.004 m
-2515.6 857.004 l
+GR
+GS
+1 GC
+10.0 ML
+0.5 LW
+N
+510.56 74 M
+510.56 57 L
+523 57 L
+523 74 L
+cp
+S
+GR
+GS
+[1 0 0 1 515.56 60] CT
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+0 10 moveto 
+1 -1 scale
+(Matlab) t 
+GR
+GR
+GS
+[1 0 0 1 515.56 60] CT
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+0 23 moveto 
+1 -1 scale
+(WLAN) t 
+GR
+GR
+GS
+[1 0 0 1 515.56 60] CT
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+0 36 moveto 
+1 -1 scale
+(Toollbox) t 
+GR
+GR
+GS
+1 GC
+10.0 ML
+0.5 LW
+N
+511.56 54 M
+511.56 38 L
+524 38 L
+524 54 L
+cp
+S
+GR
+GS
+[1 0 0 1 516.56 41] CT
+/Helvetica 10 F
+GS
+[1 0 0 1 0 0] CT
+0 10 moveto 
+1 -1 scale
+(TGax) t 
+GR
+GR
+GS
+0 0 1 RC
+1 LJ
+2 LW
+N
+491 68 M
+511 68 L
 S
-1940 3960 m
-1940 3954.48 1935.52 3950 1930 3950 c
-1924.48 3950 1920 3954.48 1920 3960 c
-1920 3965.52 1924.48 3970 1930 3970 c
-1935.52 3970 1940 3965.52 1940 3960 c
-f
-2004 3960 m
-2004 3954.48 1999.52 3950 1994 3950 c
-1988.48 3950 1984 3954.48 1984 3960 c
-1984 3965.52 1988.48 3970 1994 3970 c
-1999.52 3970 2004 3965.52 2004 3960 c
-f
-2068 3899.94 m
-2068 3894.42 2063.52 3889.94 2058 3889.94 c
-2052.48 3889.94 2048 3894.42 2048 3899.94 c
-2048 3905.46 2052.48 3909.94 2058 3909.94 c
-2063.52 3909.94 2068 3905.46 2068 3899.94 c
-f
-2132 3677.63 m
-2132 3672.11 2127.52 3667.63 2122 3667.63 c
-2116.48 3667.63 2112 3672.11 2112 3677.63 c
-2112 3683.14 2116.48 3687.63 2122 3687.63 c
-2127.52 3687.63 2132 3683.14 2132 3677.63 c
-f
-2196 3287.55 m
-2196 3282.04 2191.52 3277.56 2186 3277.56 c
-2180.48 3277.56 2176 3282.04 2176 3287.55 c
-2176 3293.07 2180.48 3297.55 2186 3297.55 c
-2191.52 3297.55 2196 3293.07 2196 3287.55 c
-f
-2260 2823.61 m
-2260 2818.09 2255.52 2813.61 2250 2813.61 c
-2244.48 2813.61 2240 2818.09 2240 2823.61 c
-2240 2829.13 2244.48 2833.6 2250 2833.6 c
-2255.52 2833.6 2260 2829.13 2260 2823.61 c
-f
-2324 2267.22 m
-2324 2261.7 2319.52 2257.22 2314 2257.22 c
-2308.48 2257.22 2304 2261.7 2304 2267.22 c
-2304 2272.74 2308.48 2277.21 2314 2277.21 c
-2319.52 2277.21 2324 2272.74 2324 2267.22 c
-f
-2388 1765.02 m
-2388 1759.5 2383.52 1755.02 2378 1755.02 c
-2372.48 1755.02 2368 1759.5 2368 1765.02 c
-2368 1770.54 2372.48 1775.02 2378 1775.02 c
-2383.52 1775.02 2388 1770.54 2388 1765.02 c
-f
-2452 1128.8 m
-2452 1123.29 2447.52 1118.81 2442 1118.81 c
-2436.48 1118.81 2432 1123.29 2432 1128.8 c
-2432 1134.33 2436.48 1138.8 2442 1138.8 c
-2447.52 1138.8 2452 1134.33 2452 1128.8 c
-f
-2516 636.797 m
-2516 631.277 2511.52 626.797 2506 626.797 c
-2500.48 626.797 2496 631.277 2496 636.797 c
-2496 642.316 2500.48 646.793 2506 646.793 c
-2511.52 646.793 2516 642.316 2516 636.797 c
-f
-30 w
-0 0 1 rg
-0 0 1 RG
-2250 3960 m
-2378 3960 l
-2442 3904.87 l
-2506 3723.34 l
-2570 3351.11 l
-2634 2923.58 l
-2698 2430.73 l
-2762 1922.23 l
-2826 1413.6 l
-2890 975.262 l
-2932.68 472.148 l
-S
-[ 120 120 ] 0 d
-2 j
-0 g
-0 G
-1450 3960 m
-2250 3960 l
-2410 3908.87 l
-2570 3295.32 l
-2730 2304.96 l
-2890 1344.38 l
-S
-[ ] 0 d
-5.0025 w
-1 j
-1 0 0 rg
-1 0 0 RG
-2250 3960 m
-2250 3960 l
-S
-2314 3960 m
-2314 3960 l
-S
-2378 3960 m
-2378 3960 l
-S
-2442 3890.96 m
-2442 3918.29 l
-S
-2506 3697.16 m
-2506 3747.84 l
-S
-2570 3316.38 m
-2570 3382.92 l
-S
-2634 2885.88 m
-2634 2957.86 l
-S
-2698 2392.04 m
-2698 2465.83 l
-S
-2762 1863.29 m
-2762 1973.23 l
-S
-2826 1287.81 m
-2826 1507.86 l
-S
-2890 709.41 m
-2890 1129.91 l
-S
-2240.4 3960 m
-2259.6 3960 l
-S
-2304.4 3960 m
-2323.6 3960 l
-S
-2368.4 3960 m
-2387.6 3960 l
-S
-2432.4 3890.96 m
-2451.6 3890.96 l
-S
-2496.4 3697.16 m
-2515.6 3697.16 l
-S
-2560.4 3316.38 m
-2579.6 3316.38 l
-S
-2624.4 2885.88 m
-2643.6 2885.88 l
-S
-2688.4 2392.04 m
-2707.6 2392.04 l
-S
-2752.4 1863.29 m
-2771.6 1863.29 l
-S
-2816.4 1287.81 m
-2835.6 1287.81 l
-S
-2880.4 709.41 m
-2899.6 709.41 l
-S
-2240.4 3960 m
-2259.6 3960 l
-S
-2304.4 3960 m
-2323.6 3960 l
-S
-2368.4 3960 m
-2387.6 3960 l
-S
-2432.4 3918.29 m
-2451.6 3918.29 l
-S
-2496.4 3747.84 m
-2515.6 3747.84 l
-S
-2560.4 3382.92 m
-2579.6 3382.92 l
-S
-2624.4 2957.86 m
-2643.6 2957.86 l
-S
-2688.4 2465.83 m
-2707.6 2465.83 l
-S
-2752.4 1973.23 m
-2771.6 1973.23 l
-S
-2816.4 1507.86 m
-2835.6 1507.86 l
-S
-2880.4 1129.91 m
-2899.6 1129.91 l
-S
-2944.4 546.945 m
-2963.6 546.945 l
-S
-2260 3960 m
-2260 3954.48 2255.52 3950 2250 3950 c
-2244.48 3950 2240 3954.48 2240 3960 c
-2240 3965.52 2244.48 3970 2250 3970 c
-2255.52 3970 2260 3965.52 2260 3960 c
-f
-2324 3960 m
-2324 3954.48 2319.52 3950 2314 3950 c
-2308.48 3950 2304 3954.48 2304 3960 c
-2304 3965.52 2308.48 3970 2314 3970 c
-2319.52 3970 2324 3965.52 2324 3960 c
-f
-2388 3960 m
-2388 3954.48 2383.52 3950 2378 3950 c
-2372.48 3950 2368 3954.48 2368 3960 c
-2368 3965.52 2372.48 3970 2378 3970 c
-2383.52 3970 2388 3965.52 2388 3960 c
-f
-2452 3904.87 m
-2452 3899.35 2447.52 3894.87 2442 3894.87 c
-2436.48 3894.87 2432 3899.35 2432 3904.87 c
-2432 3910.39 2436.48 3914.87 2442 3914.87 c
-2447.52 3914.87 2452 3910.39 2452 3904.87 c
-f
-2516 3723.34 m
-2516 3717.82 2511.52 3713.35 2506 3713.35 c
-2500.48 3713.35 2496 3717.82 2496 3723.34 c
-2496 3728.86 2500.48 3733.34 2506 3733.34 c
-2511.52 3733.34 2516 3728.86 2516 3723.34 c
-f
-2580 3351.11 m
-2580 3345.59 2575.52 3341.11 2570 3341.11 c
-2564.48 3341.11 2560 3345.59 2560 3351.11 c
-2560 3356.63 2564.48 3361.11 2570 3361.11 c
-2575.52 3361.11 2580 3356.63 2580 3351.11 c
-f
-2644 2923.58 m
-2644 2918.06 2639.52 2913.58 2634 2913.58 c
-2628.48 2913.58 2624 2918.06 2624 2923.58 c
-2624 2929.1 2628.48 2933.58 2634 2933.58 c
-2639.52 2933.58 2644 2929.1 2644 2923.58 c
-f
-2708 2430.73 m
-2708 2425.21 2703.52 2420.73 2698 2420.73 c
-2692.48 2420.73 2688 2425.21 2688 2430.73 c
-2688 2436.25 2692.48 2440.73 2698 2440.73 c
-2703.52 2440.73 2708 2436.25 2708 2430.73 c
-f
-2772 1922.23 m
-2772 1916.71 2767.52 1912.23 2762 1912.23 c
-2756.48 1912.23 2752 1916.71 2752 1922.23 c
-2752 1927.75 2756.48 1932.23 2762 1932.23 c
-2767.52 1932.23 2772 1927.75 2772 1922.23 c
-f
-2836 1413.6 m
-2836 1408.08 2831.52 1403.61 2826 1403.61 c
-2820.48 1403.61 2816 1408.08 2816 1413.6 c
-2816 1419.12 2820.48 1423.6 2826 1423.6 c
-2831.52 1423.6 2836 1419.12 2836 1413.6 c
-f
-2900 975.262 m
-2900 969.742 2895.52 965.262 2890 965.262 c
-2884.48 965.262 2880 969.742 2880 975.262 c
-2880 980.781 2884.48 985.258 2890 985.258 c
-2895.52 985.258 2900 980.781 2900 975.262 c
-f
-30 w
-0 0 1 rg
-0 0 1 RG
-2730 3960 m
-2858 3960 l
-2922 3953.75 l
-2986 3870.64 l
-3050 3674.25 l
-3114 3336.98 l
-3178 2897.73 l
-3242 2401.65 l
-3306 1906.35 l
-3370 1408.16 l
-3434 776.039 l
-3461.44 472.148 l
-S
-[ 120 120 ] 0 d
-2 j
-0 g
-0 G
-1450 3960 m
-2730 3960 l
-2890 3898.1 l
-3050 3284.57 l
-3210 2391.13 l
-3370 1373.52 l
-S
-[ ] 0 d
-5.0025 w
-1 j
-1 0 0 rg
-1 0 0 RG
-2730 3960 m
-2730 3960 l
-S
-2794 3960 m
-2794 3960 l
-S
-2858 3960 m
-2858 3960 l
-S
-2922 3948.98 m
-2922 3958.47 l
-S
-2986 3853.22 m
-2986 3887.29 l
-S
-3050 3646.23 m
-3050 3700.34 l
-S
-3114 3302.08 m
-3114 3368.93 l
-S
-3178 2859.94 m
-3178 2932.09 l
-S
-3242 2362.93 m
-3242 2436.77 l
-S
-3306 1846.04 m
-3306 1958.36 l
-S
-3370 1281.29 m
-3370 1503.02 l
-S
-3434 472.148 m
-3434 967.102 l
-S
-2720.4 3960 m
-2739.6 3960 l
-S
-2784.4 3960 m
-2803.6 3960 l
-S
-2848.4 3960 m
-2867.6 3960 l
-S
-2912.4 3948.98 m
-2931.6 3948.98 l
-S
-2976.4 3853.22 m
-2995.6 3853.22 l
-S
-3040.4 3646.23 m
-3059.6 3646.23 l
-S
-3104.4 3302.08 m
-3123.6 3302.08 l
-S
-3168.4 2859.94 m
-3187.6 2859.94 l
-S
-3232.4 2362.93 m
-3251.6 2362.93 l
-S
-3296.4 1846.04 m
-3315.6 1846.04 l
-S
-3360.4 1281.29 m
-3379.6 1281.29 l
-S
-2720.4 3960 m
-2739.6 3960 l
-S
-2784.4 3960 m
-2803.6 3960 l
-S
-2848.4 3960 m
-2867.6 3960 l
-S
-2912.4 3958.47 m
-2931.6 3958.47 l
-S
-2976.4 3887.29 m
-2995.6 3887.29 l
-S
-3040.4 3700.34 m
-3059.6 3700.34 l
-S
-3104.4 3368.93 m
-3123.6 3368.93 l
-S
-3168.4 2932.09 m
-3187.6 2932.09 l
-S
-3232.4 2436.77 m
-3251.6 2436.77 l
-S
-3296.4 1958.36 m
-3315.6 1958.36 l
-S
-3360.4 1503.02 m
-3379.6 1503.02 l
-S
-3424.4 967.102 m
-3443.6 967.102 l
-S
-2740 3960 m
-2740 3954.48 2735.52 3950 2730 3950 c
-2724.48 3950 2720 3954.48 2720 3960 c
-2720 3965.52 2724.48 3970 2730 3970 c
-2735.52 3970 2740 3965.52 2740 3960 c
-f
-2804 3960 m
-2804 3954.48 2799.52 3950 2794 3950 c
-2788.48 3950 2784 3954.48 2784 3960 c
-2784 3965.52 2788.48 3970 2794 3970 c
-2799.52 3970 2804 3965.52 2804 3960 c
-f
-2868 3960 m
-2868 3954.48 2863.52 3950 2858 3950 c
-2852.48 3950 2848 3954.48 2848 3960 c
-2848 3965.52 2852.48 3970 2858 3970 c
-2863.52 3970 2868 3965.52 2868 3960 c
-f
-2932 3953.75 m
-2932 3948.23 2927.52 3943.76 2922 3943.76 c
-2916.48 3943.76 2912 3948.23 2912 3953.75 c
-2912 3959.27 2916.48 3963.75 2922 3963.75 c
-2927.52 3963.75 2932 3959.27 2932 3953.75 c
-f
-2996 3870.64 m
-2996 3865.12 2991.52 3860.64 2986 3860.64 c
-2980.48 3860.64 2976 3865.12 2976 3870.64 c
-2976 3876.16 2980.48 3880.64 2986 3880.64 c
-2991.52 3880.64 2996 3876.16 2996 3870.64 c
-f
-3060 3674.25 m
-3060 3668.73 3055.52 3664.25 3050 3664.25 c
-3044.48 3664.25 3040 3668.73 3040 3674.25 c
-3040 3679.77 3044.48 3684.25 3050 3684.25 c
-3055.52 3684.25 3060 3679.77 3060 3674.25 c
-f
-3124 3336.98 m
-3124 3331.46 3119.52 3326.98 3114 3326.98 c
-3108.48 3326.98 3104 3331.46 3104 3336.98 c
-3104 3342.5 3108.48 3346.97 3114 3346.97 c
-3119.52 3346.97 3124 3342.5 3124 3336.98 c
-f
-3188 2897.73 m
-3188 2892.21 3183.52 2887.73 3178 2887.73 c
-3172.48 2887.73 3168 2892.21 3168 2897.73 c
-3168 2903.25 3172.48 2907.73 3178 2907.73 c
-3183.52 2907.73 3188 2903.25 3188 2897.73 c
-f
-3252 2401.65 m
-3252 2396.13 3247.52 2391.65 3242 2391.65 c
-3236.48 2391.65 3232 2396.13 3232 2401.65 c
-3232 2407.17 3236.48 2411.64 3242 2411.64 c
-3247.52 2411.64 3252 2407.17 3252 2401.65 c
-f
-3316 1906.35 m
-3316 1900.83 3311.52 1896.35 3306 1896.35 c
-3300.48 1896.35 3296 1900.83 3296 1906.35 c
-3296 1911.87 3300.48 1916.34 3306 1916.34 c
-3311.52 1916.34 3316 1911.87 3316 1906.35 c
-f
-3380 1408.15 m
-3380 1402.63 3375.52 1398.16 3370 1398.16 c
-3364.48 1398.16 3360 1402.63 3360 1408.15 c
-3360 1413.67 3364.48 1418.15 3370 1418.15 c
-3375.52 1418.15 3380 1413.67 3380 1408.15 c
-f
-3444 776.043 m
-3444 770.523 3439.52 766.043 3434 766.043 c
-3428.48 766.043 3424 770.523 3424 776.043 c
-3424 781.563 3428.48 786.039 3434 786.039 c
-3439.52 786.039 3444 781.563 3444 776.043 c
-f
-30 w
-0 0 1 rg
-0 0 1 RG
-3370 3960 m
-3434 3943.7 l
-3498 3808.75 l
-3562 3535.47 l
-3626 3159.69 l
-3690 2750.87 l
-3754 2322.46 l
-3818 1872.43 l
-3882 1342.38 l
-3946 804.105 l
-3974.84 472.148 l
-S
-[ 120 120 ] 0 d
-2 j
-0 g
-0 G
-1450 3960 m
-3370 3960 l
-3530 3618.22 l
-3690 2825.66 l
-3850 1879.57 l
-S
-[ ] 0 d
-5.0025 w
-1 j
-1 0 0 rg
-1 0 0 RG
-3370 3960 m
-3370 3960 l
-S
-3434 3936.02 m
-3434 3951.24 l
-S
-3498 3786.82 m
-3498 3829.47 l
-S
-3562 3503.7 m
-3562 3564.78 l
-S
-3626 3123.19 m
-3626 3192.98 l
-S
-3690 2712.67 m
-3690 2785.57 l
-S
-3754 2283.68 m
-3754 2357.63 l
-S
-3818 1809.11 m
-3818 1926.66 l
-S
-3882 1201.56 m
-3882 1444.79 l
-S
-3946 472.148 m
-3946 989.668 l
-S
-3360.4 3960 m
-3379.6 3960 l
-S
-3424.4 3936.02 m
-3443.6 3936.02 l
-S
-3488.4 3786.82 m
-3507.6 3786.82 l
-S
-3552.4 3503.7 m
-3571.6 3503.7 l
-S
-3616.4 3123.19 m
-3635.6 3123.19 l
-S
-3680.4 2712.67 m
-3699.6 2712.67 l
-S
-3744.4 2283.68 m
-3763.6 2283.68 l
-S
-3808.4 1809.11 m
-3827.6 1809.11 l
-S
-3872.4 1201.56 m
-3891.6 1201.56 l
-S
-3360.4 3960 m
-3379.6 3960 l
-S
-3424.4 3951.24 m
-3443.6 3951.24 l
-S
-3488.4 3829.47 m
-3507.6 3829.47 l
-S
-3552.4 3564.78 m
-3571.6 3564.78 l
-S
-3616.4 3192.98 m
-3635.6 3192.98 l
-S
-3680.4 2785.57 m
-3699.6 2785.57 l
-S
-3744.4 2357.63 m
-3763.6 2357.63 l
-S
-3808.4 1926.66 m
-3827.6 1926.66 l
-S
-3872.4 1444.79 m
-3891.6 1444.79 l
-S
-3936.4 989.668 m
-3955.6 989.668 l
-S
-3380 3960 m
-3380 3954.48 3375.52 3950 3370 3950 c
-3364.48 3950 3360 3954.48 3360 3960 c
-3360 3965.52 3364.48 3970 3370 3970 c
-3375.52 3970 3380 3965.52 3380 3960 c
-f
-3444 3943.7 m
-3444 3938.18 3439.52 3933.71 3434 3933.71 c
-3428.48 3933.71 3424 3938.18 3424 3943.7 c
-3424 3949.22 3428.48 3953.7 3434 3953.7 c
-3439.52 3953.7 3444 3949.22 3444 3943.7 c
-f
-3508 3808.75 m
-3508 3803.23 3503.52 3798.75 3498 3798.75 c
-3492.48 3798.75 3488 3803.23 3488 3808.75 c
-3488 3814.27 3492.48 3818.75 3498 3818.75 c
-3503.52 3818.75 3508 3814.27 3508 3808.75 c
-f
-3572 3535.47 m
-3572 3529.95 3567.52 3525.47 3562 3525.47 c
-3556.48 3525.47 3552 3529.95 3552 3535.47 c
-3552 3540.99 3556.48 3545.47 3562 3545.47 c
-3567.52 3545.47 3572 3540.99 3572 3535.47 c
-f
-3636 3159.69 m
-3636 3154.17 3631.52 3149.69 3626 3149.69 c
-3620.48 3149.69 3616 3154.17 3616 3159.69 c
-3616 3165.21 3620.48 3169.69 3626 3169.69 c
-3631.52 3169.69 3636 3165.21 3636 3159.69 c
-f
-3700 2750.87 m
-3700 2745.35 3695.52 2740.88 3690 2740.88 c
-3684.48 2740.88 3680 2745.35 3680 2750.87 c
-3680 2756.39 3684.48 2760.87 3690 2760.87 c
-3695.52 2760.87 3700 2756.39 3700 2750.87 c
-f
-3764 2322.45 m
-3764 2316.93 3759.52 2312.46 3754 2312.46 c
-3748.48 2312.46 3744 2316.93 3744 2322.45 c
-3744 2327.97 3748.48 2332.45 3754 2332.45 c
-3759.52 2332.45 3764 2327.97 3764 2322.45 c
-f
-3828 1872.43 m
-3828 1866.91 3823.52 1862.43 3818 1862.43 c
-3812.48 1862.43 3808 1866.91 3808 1872.43 c
-3808 1877.95 3812.48 1882.43 3818 1882.43 c
-3823.52 1882.43 3828 1877.95 3828 1872.43 c
-f
-3892 1342.38 m
-3892 1336.86 3887.52 1332.38 3882 1332.38 c
-3876.48 1332.38 3872 1336.86 3872 1342.38 c
-3872 1347.9 3876.48 1352.38 3882 1352.38 c
-3887.52 1352.38 3892 1347.9 3892 1342.38 c
-f
-3956 804.105 m
-3956 798.586 3951.52 794.105 3946 794.105 c
-3940.48 794.105 3936 798.586 3936 804.105 c
-3936 809.625 3940.48 814.102 3946 814.102 c
-3951.52 814.102 3956 809.625 3956 804.105 c
-f
-30 w
-0 0 1 rg
-0 0 1 RG
-4010 3960 m
-4074 3919.09 l
-4138 3813.97 l
-4202 3597.35 l
-4266 3287.09 l
-4330 2961.25 l
-4394 2565.2 l
-4458 2179.34 l
-4522 1773.49 l
-4586 1254.59 l
-4650 957.645 l
-4714 483.262 l
-4715.05 472.148 l
-S
-[ 120 120 ] 0 d
-2 j
-0 g
-0 G
-1450 3960 m
-3850 3960 l
-4010 3930.4 l
-4170 3564.43 l
-4330 2891.66 l
-4490 2116.79 l
-S
-[ ] 0 d
-5.0025 w
-1 j
-1 0 0 rg
-1 0 0 RG
-4010 3960 m
-4010 3960 l
-S
-4074 3907.04 m
-4074 3930.78 l
-S
-4138 3792.37 m
-4138 3834.4 l
-S
-4202 3567.04 m
-4202 3625.43 l
-S
-4266 3251.66 m
-4266 3319.48 l
-S
-4330 2923.69 m
-4330 2995.42 l
-S
-4394 2526.68 m
-4394 2600.18 l
-S
-4458 2138.41 m
-4458 2216.26 l
-S
-4522 1700.38 m
-4522 1834.73 l
-S
-4586 1092.19 m
-4586 1367.88 l
-S
-4650 682.605 m
-4650 1115.27 l
-S
-4714 472.148 m
-4714 739.254 l
-S
-4000.4 3960 m
-4019.6 3960 l
-S
-4064.4 3907.04 m
-4083.6 3907.04 l
-S
-4128.4 3792.37 m
-4147.6 3792.37 l
-S
-4192.4 3567.04 m
-4211.6 3567.04 l
-S
-4256.4 3251.66 m
-4275.6 3251.66 l
-S
-4320.4 2923.69 m
-4339.6 2923.69 l
-S
-4384.4 2526.68 m
-4403.6 2526.68 l
-S
-4448.4 2138.41 m
-4467.6 2138.41 l
-S
-4512.4 1700.38 m
-4531.6 1700.38 l
-S
-4576.4 1092.19 m
-4595.6 1092.19 l
-S
-4640.4 682.605 m
-4659.6 682.605 l
-S
-4000.4 3960 m
-4019.6 3960 l
-S
-4064.4 3930.78 m
-4083.6 3930.78 l
-S
-4128.4 3834.4 m
-4147.6 3834.4 l
-S
-4192.4 3625.43 m
-4211.6 3625.43 l
-S
-4256.4 3319.48 m
-4275.6 3319.48 l
-S
-4320.4 2995.42 m
-4339.6 2995.42 l
-S
-4384.4 2600.18 m
-4403.6 2600.18 l
-S
-4448.4 2216.26 m
-4467.6 2216.26 l
-S
-4512.4 1834.73 m
-4531.6 1834.73 l
-S
-4576.4 1367.88 m
-4595.6 1367.88 l
-S
-4640.4 1115.27 m
-4659.6 1115.27 l
-S
-4704.4 739.254 m
-4723.6 739.254 l
-S
-4020 3960 m
-4020 3954.48 4015.52 3950 4010 3950 c
-4004.48 3950 4000 3954.48 4000 3960 c
-4000 3965.52 4004.48 3970 4010 3970 c
-4015.52 3970 4020 3965.52 4020 3960 c
-f
-4084 3919.09 m
-4084 3913.57 4079.52 3909.1 4074 3909.1 c
-4068.48 3909.1 4064 3913.57 4064 3919.09 c
-4064 3924.62 4068.48 3929.09 4074 3929.09 c
-4079.52 3929.09 4084 3924.62 4084 3919.09 c
-f
-4148 3813.96 m
-4148 3808.45 4143.52 3803.97 4138 3803.97 c
-4132.48 3803.97 4128 3808.45 4128 3813.96 c
-4128 3819.48 4132.48 3823.96 4138 3823.96 c
-4143.52 3823.96 4148 3819.48 4148 3813.96 c
-f
-4212 3597.36 m
-4212 3591.84 4207.52 3587.36 4202 3587.36 c
-4196.48 3587.36 4192 3591.84 4192 3597.36 c
-4192 3602.88 4196.48 3607.35 4202 3607.35 c
-4207.52 3607.35 4212 3602.88 4212 3597.36 c
-f
-4276 3287.09 m
-4276 3281.57 4271.52 3277.09 4266 3277.09 c
-4260.48 3277.09 4256 3281.57 4256 3287.09 c
-4256 3292.61 4260.48 3297.09 4266 3297.09 c
-4271.52 3297.09 4276 3292.61 4276 3287.09 c
-f
-4340 2961.25 m
-4340 2955.73 4335.52 2951.25 4330 2951.25 c
-4324.48 2951.25 4320 2955.73 4320 2961.25 c
-4320 2966.77 4324.48 2971.25 4330 2971.25 c
-4335.52 2971.25 4340 2966.77 4340 2961.25 c
-f
-4404 2565.21 m
-4404 2559.69 4399.52 2555.21 4394 2555.21 c
-4388.48 2555.21 4384 2559.69 4384 2565.21 c
-4384 2570.73 4388.48 2575.2 4394 2575.2 c
-4399.52 2575.2 4404 2570.73 4404 2565.21 c
-f
-4468 2179.34 m
-4468 2173.82 4463.52 2169.34 4458 2169.34 c
-4452.48 2169.34 4448 2173.82 4448 2179.34 c
-4448 2184.86 4452.48 2189.33 4458 2189.33 c
-4463.52 2189.33 4468 2184.86 4468 2179.34 c
-f
-4532 1773.48 m
-4532 1767.96 4527.52 1763.49 4522 1763.49 c
-4516.48 1763.49 4512 1767.96 4512 1773.48 c
-4512 1779.01 4516.48 1783.48 4522 1783.48 c
-4527.52 1783.48 4532 1779.01 4532 1773.48 c
-f
-4596 1254.59 m
-4596 1249.07 4591.52 1244.59 4586 1244.59 c
-4580.48 1244.59 4576 1249.07 4576 1254.59 c
-4576 1260.11 4580.48 1264.59 4586 1264.59 c
-4591.52 1264.59 4596 1260.11 4596 1254.59 c
-f
-4660 957.645 m
-4660 952.125 4655.52 947.648 4650 947.648 c
-4644.48 947.648 4640 952.125 4640 957.645 c
-4640 963.164 4644.48 967.641 4650 967.641 c
-4655.52 967.641 4660 963.164 4660 957.645 c
-f
-4724 483.262 m
-4724 477.742 4719.52 473.266 4714 473.266 c
-4708.48 473.266 4704 477.742 4704 483.262 c
-4704 488.781 4708.48 493.262 4714 493.262 c
-4719.52 493.262 4724 488.781 4724 483.262 c
-f
-30 w
-0 0 1 rg
-0 0 1 RG
-4170 3960 m
-4234 3953.75 l
-4298 3899.94 l
-4362 3787.87 l
-4426 3555.59 l
-4490 3229.78 l
-4554 2879.11 l
-4618 2523.35 l
-4682 2112.69 l
-4746 1767.15 l
-4810 1237.75 l
-4874 830.227 l
-4918.08 472.148 l
-S
-[ 120 120 ] 0 d
-2 j
-0 g
-0 G
-1450 3960 m
-4170 3960 l
-4330 3779.71 l
-4490 3252.29 l
-4650 2455.69 l
-4810 1589.4 l
-S
-[ ] 0 d
-5.0025 w
-1 j
-1 0 0 rg
-1 0 0 RG
-4170 3960 m
-4170 3960 l
-S
-4234 3948.98 m
-4234 3958.47 l
-S
-4298 3885.46 m
-4298 3913.89 l
-S
-4362 3764.74 m
-4362 3809.66 l
-S
-4426 3524.27 m
-4426 3584.52 l
-S
-4490 3193.82 m
-4490 3262.62 l
-S
-4554 2841.26 m
-4554 2913.52 l
-S
-4618 2484.76 m
-4618 2558.37 l
-S
-4682 2067.74 m
-4682 2152.87 l
-S
-4746 1693.37 m
-4746 1828.88 l
-S
-4810 1070.76 m
-4810 1353.24 l
-S
-4874 472.746 m
-4874 1010.78 l
-S
-4160.4 3960 m
-4179.6 3960 l
-S
-4224.4 3948.98 m
-4243.6 3948.98 l
-S
-4288.4 3885.46 m
-4307.6 3885.46 l
-S
-4352.4 3764.74 m
-4371.6 3764.74 l
-S
-4416.4 3524.27 m
-4435.6 3524.27 l
-S
-4480.4 3193.82 m
-4499.6 3193.82 l
-S
-4544.4 2841.26 m
-4563.6 2841.26 l
-S
-4608.4 2484.76 m
-4627.6 2484.76 l
-S
-4672.4 2067.74 m
-4691.6 2067.74 l
-S
-4736.4 1693.37 m
-4755.6 1693.37 l
-S
-4800.4 1070.76 m
-4819.6 1070.76 l
-S
-4864.4 472.746 m
-4883.6 472.746 l
-S
-4160.4 3960 m
-4179.6 3960 l
-S
-4224.4 3958.47 m
-4243.6 3958.47 l
-S
-4288.4 3913.89 m
-4307.6 3913.89 l
-S
-4352.4 3809.66 m
-4371.6 3809.66 l
-S
-4416.4 3584.52 m
-4435.6 3584.52 l
-S
-4480.4 3262.62 m
-4499.6 3262.62 l
-S
-4544.4 2913.52 m
-4563.6 2913.52 l
-S
-4608.4 2558.37 m
-4627.6 2558.37 l
-S
-4672.4 2152.87 m
-4691.6 2152.87 l
-S
-4736.4 1828.88 m
-4755.6 1828.88 l
-S
-4800.4 1353.24 m
-4819.6 1353.24 l
-S
-4864.4 1010.78 m
-4883.6 1010.78 l
-S
-4928.4 611.266 m
-4947.6 611.266 l
-S
-4180 3960 m
-4180 3954.48 4175.52 3950 4170 3950 c
-4164.48 3950 4160 3954.48 4160 3960 c
-4160 3965.52 4164.48 3970 4170 3970 c
-4175.52 3970 4180 3965.52 4180 3960 c
-f
-4244 3953.75 m
-4244 3948.23 4239.52 3943.76 4234 3943.76 c
-4228.48 3943.76 4224 3948.23 4224 3953.75 c
-4224 3959.27 4228.48 3963.75 4234 3963.75 c
-4239.52 3963.75 4244 3959.27 4244 3953.75 c
-f
-4308 3899.94 m
-4308 3894.42 4303.52 3889.94 4298 3889.94 c
-4292.48 3889.94 4288 3894.42 4288 3899.94 c
-4288 3905.46 4292.48 3909.94 4298 3909.94 c
-4303.52 3909.94 4308 3905.46 4308 3899.94 c
-f
-4372 3787.86 m
-4372 3782.34 4367.52 3777.87 4362 3777.87 c
-4356.48 3777.87 4352 3782.34 4352 3787.86 c
-4352 3793.38 4356.48 3797.86 4362 3797.86 c
-4367.52 3797.86 4372 3793.38 4372 3787.86 c
-f
-4436 3555.59 m
-4436 3550.07 4431.52 3545.59 4426 3545.59 c
-4420.48 3545.59 4416 3550.07 4416 3555.59 c
-4416 3561.11 4420.48 3565.59 4426 3565.59 c
-4431.52 3565.59 4436 3561.11 4436 3555.59 c
-f
-4500 3229.78 m
-4500 3224.26 4495.52 3219.79 4490 3219.79 c
-4484.48 3219.79 4480 3224.26 4480 3229.78 c
-4480 3235.3 4484.48 3239.78 4490 3239.78 c
-4495.52 3239.78 4500 3235.3 4500 3229.78 c
-f
-4564 2879.12 m
-4564 2873.6 4559.52 2869.12 4554 2869.12 c
-4548.48 2869.12 4544 2873.6 4544 2879.12 c
-4544 2884.64 4548.48 2889.11 4554 2889.11 c
-4559.52 2889.11 4564 2884.64 4564 2879.12 c
-f
-4628 2523.35 m
-4628 2517.83 4623.52 2513.35 4618 2513.35 c
-4612.48 2513.35 4608 2517.83 4608 2523.35 c
-4608 2528.87 4612.48 2533.35 4618 2533.35 c
-4623.52 2533.35 4628 2528.87 4628 2523.35 c
-f
-4692 2112.69 m
-4692 2107.17 4687.52 2102.69 4682 2102.69 c
-4676.48 2102.69 4672 2107.17 4672 2112.69 c
-4672 2118.21 4676.48 2122.69 4682 2122.69 c
-4687.52 2122.69 4692 2118.21 4692 2112.69 c
-f
-4756 1767.15 m
-4756 1761.63 4751.52 1757.16 4746 1757.16 c
-4740.48 1757.16 4736 1761.63 4736 1767.15 c
-4736 1772.67 4740.48 1777.15 4746 1777.15 c
-4751.52 1777.15 4756 1772.67 4756 1767.15 c
-f
-4820 1237.75 m
-4820 1232.23 4815.52 1227.76 4810 1227.76 c
-4804.48 1227.76 4800 1232.23 4800 1237.75 c
-4800 1243.27 4804.48 1247.75 4810 1247.75 c
-4815.52 1247.75 4820 1243.27 4820 1237.75 c
-f
-4884 830.23 m
-4884 824.711 4879.52 820.23 4874 820.23 c
-4868.48 820.23 4864 824.711 4864 830.23 c
-4864 835.75 4868.48 840.227 4874 840.227 c
-4879.52 840.227 4884 835.75 4884 830.23 c
-f
-30 w
-0 0 1 rg
-0 0 1 RG
-4330 3960 m
-4458 3960 l
-4522 3886.1 l
-4586 3708.89 l
-4650 3418.3 l
-4714 3104.03 l
-4778 2722.73 l
-4842 2368.91 l
-4906 1923.64 l
-4970 1598.34 l
-5034 1161.76 l
-5098 776.039 l
-5133.03 472.148 l
-S
-[ 120 120 ] 0 d
-2 j
-0 g
-0 G
-1450 3960 m
-4490 3960 l
-4650 3661.41 l
-4810 2837.89 l
-4970 1955.3 l
-S
-[ ] 0 d
-5.0025 w
-1 j
-1 0 0 rg
-1 0 0 RG
-4330 3960 m
-4330 3960 l
-S
-4394 3960 m
-4394 3960 l
-S
-4458 3960 m
-4458 3960 l
-S
-4522 3870.15 m
-4522 3901.42 l
-S
-4586 3682.12 m
-4586 3733.88 l
-S
-4650 3384.46 m
-4650 3449.35 l
-S
-4714 3067.18 m
-4714 3137.63 l
-S
-4778 2684.47 m
-4778 2757.48 l
-S
-4842 2330.17 m
-4842 2404.06 l
-S
-4906 1864.82 m
-4906 1974.55 l
-S
-4970 1503.58 m
-4970 1674.06 l
-S
-5034 971.918 m
-5034 1287.61 l
-S
-5098 472.148 m
-5098 967.102 l
-S
-4320.4 3960 m
-4339.6 3960 l
-S
-4384.4 3960 m
-4403.6 3960 l
-S
-4448.4 3960 m
-4467.6 3960 l
-S
-4512.4 3870.15 m
-4531.6 3870.15 l
-S
-4576.4 3682.12 m
-4595.6 3682.12 l
-S
-4640.4 3384.46 m
-4659.6 3384.46 l
-S
-4704.4 3067.18 m
-4723.6 3067.18 l
-S
-4768.4 2684.47 m
-4787.6 2684.47 l
-S
-4832.4 2330.17 m
-4851.6 2330.17 l
-S
-4896.4 1864.82 m
-4915.6 1864.82 l
-S
-4960.4 1503.58 m
-4979.6 1503.58 l
-S
-5024.4 971.918 m
-5043.6 971.918 l
-S
-4320.4 3960 m
-4339.6 3960 l
-S
-4384.4 3960 m
-4403.6 3960 l
-S
-4448.4 3960 m
-4467.6 3960 l
-S
-4512.4 3901.42 m
-4531.6 3901.42 l
-S
-4576.4 3733.88 m
-4595.6 3733.88 l
-S
-4640.4 3449.35 m
-4659.6 3449.35 l
-S
-4704.4 3137.63 m
-4723.6 3137.63 l
-S
-4768.4 2757.48 m
-4787.6 2757.48 l
-S
-4832.4 2404.06 m
-4851.6 2404.06 l
-S
-4896.4 1974.55 m
-4915.6 1974.55 l
-S
-4960.4 1674.06 m
-4979.6 1674.06 l
-S
-5024.4 1287.61 m
-5043.6 1287.61 l
-S
-5088.4 967.102 m
-5107.6 967.102 l
-S
-5152.4 546.945 m
-5171.6 546.945 l
-S
-4340 3960 m
-4340 3954.48 4335.52 3950 4330 3950 c
-4324.48 3950 4320 3954.48 4320 3960 c
-4320 3965.52 4324.48 3970 4330 3970 c
-4335.52 3970 4340 3965.52 4340 3960 c
-f
-4404 3960 m
-4404 3954.48 4399.52 3950 4394 3950 c
-4388.48 3950 4384 3954.48 4384 3960 c
-4384 3965.52 4388.48 3970 4394 3970 c
-4399.52 3970 4404 3965.52 4404 3960 c
-f
-4468 3960 m
-4468 3954.48 4463.52 3950 4458 3950 c
-4452.48 3950 4448 3954.48 4448 3960 c
-4448 3965.52 4452.48 3970 4458 3970 c
-4463.52 3970 4468 3965.52 4468 3960 c
-f
-4532 3886.11 m
-4532 3880.59 4527.52 3876.11 4522 3876.11 c
-4516.48 3876.11 4512 3880.59 4512 3886.11 c
-4512 3891.63 4516.48 3896.1 4522 3896.1 c
-4527.52 3896.1 4532 3891.63 4532 3886.11 c
-f
-4596 3708.89 m
-4596 3703.37 4591.52 3698.89 4586 3698.89 c
-4580.48 3698.89 4576 3703.37 4576 3708.89 c
-4576 3714.41 4580.48 3718.88 4586 3718.88 c
-4591.52 3718.88 4596 3714.41 4596 3708.89 c
-f
-4660 3418.3 m
-4660 3412.78 4655.52 3408.3 4650 3408.3 c
-4644.48 3408.3 4640 3412.78 4640 3418.3 c
-4640 3423.82 4644.48 3428.29 4650 3428.29 c
-4655.52 3428.29 4660 3423.82 4660 3418.3 c
-f
-4724 3104.04 m
-4724 3098.52 4719.52 3094.04 4714 3094.04 c
-4708.48 3094.04 4704 3098.52 4704 3104.04 c
-4704 3109.55 4708.48 3114.03 4714 3114.03 c
-4719.52 3114.03 4724 3109.55 4724 3104.04 c
-f
-4788 2722.73 m
-4788 2717.21 4783.52 2712.73 4778 2712.73 c
-4772.48 2712.73 4768 2717.21 4768 2722.73 c
-4768 2728.25 4772.48 2732.73 4778 2732.73 c
-4783.52 2732.73 4788 2728.25 4788 2722.73 c
-f
-4852 2368.91 m
-4852 2363.39 4847.52 2358.91 4842 2358.91 c
-4836.48 2358.91 4832 2363.39 4832 2368.91 c
-4832 2374.43 4836.48 2378.91 4842 2378.91 c
-4847.52 2378.91 4852 2374.43 4852 2368.91 c
-f
-4916 1923.64 m
-4916 1918.13 4911.52 1913.64 4906 1913.64 c
-4900.48 1913.64 4896 1918.13 4896 1923.64 c
-4896 1929.16 4900.48 1933.64 4906 1933.64 c
-4911.52 1933.64 4916 1929.16 4916 1923.64 c
-f
-4980 1598.34 m
-4980 1592.82 4975.52 1588.34 4970 1588.34 c
-4964.48 1588.34 4960 1592.82 4960 1598.34 c
-4960 1603.86 4964.48 1608.33 4970 1608.33 c
-4975.52 1608.33 4980 1603.86 4980 1598.34 c
-f
-5044 1161.76 m
-5044 1156.24 5039.52 1151.76 5034 1151.76 c
-5028.48 1151.76 5024 1156.24 5024 1161.76 c
-5024 1167.28 5028.48 1171.75 5034 1171.75 c
-5039.52 1171.75 5044 1167.28 5044 1161.76 c
-f
-5108 776.043 m
-5108 770.523 5103.52 766.043 5098 766.043 c
-5092.48 766.043 5088 770.523 5088 776.043 c
-5088 781.563 5092.48 786.039 5098 786.039 c
-5103.52 786.039 5108 781.563 5108 776.043 c
-f
-1 G
-1 g
-4725 3585 885 367.5 re
-f
-0 G
-0 g
-q
-10 0 0 10 0 0 cm BT
-/R6 9 Tf
-1 0 0 1 500.912 384.879 Tm
-(Matlab Wlan)Tj
-11.25 TL
-(Toolbox)'
-ET
-Q
-30 w
-0 0 1 rg
-0 0 1 RG
-4760.23 3826.29 m
-4986.5 3826.29 l
-S
-0 G
-0 g
-q
-10 0 0 10 0 0 cm BT
-/R6 9 Tf
-1 0 0 1 500.912 362.178 Tm
-(TGn)Tj
-ET
-Q
-[ 120 120 ] 0 d
-2 j
-4760.23 3655.53 m
-4986.5 3655.53 l
-S
-[ ] 0 d
-5.0025 w
-0 j
-0.148926 g
-0.148926 G
-4725 3585 885 367.5 re
-S
-Q
-endstream
-endobj
-%%Trailer
-end
+GR
 %%Trailer
-cleartomark
-countdictstack
-exch sub { end } repeat
-restore
+%%Pages: 1
 %%EOF
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/doc/source/figures/mu-bar.pdf ns-3.34/src/wifi/doc/source/figures/mu-bar.pdf
--- ns-3.33/src/wifi/doc/source/figures/mu-bar.pdf	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/doc/source/figures/mu-bar.pdf	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,116 @@
+%PDF-1.5
+%�쏢
+%%Invocation: gs -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true -dAutoRotatePages#/None -
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x��]K�l9n��*r�A��/��#�^Bv��7hOz���?�&�^�Wd^�(�")�??�G���?�����y��f���Gi�q������U��m|~������$��S���
+��ZVg�Σ���G��>}���c;���_��xmg/��im�����Q�j�6��x�:��9��\�y:���u��]�ÉR�5??���>�E/�������Q'�c_�;�mu�<�C]X��]h�=��D�����e����V���ϳ�O���X�<H��x~�UyF���߲;��Qi|k/W#�<�X�_�G-TǙ�1��:�1��,�Ej�]���ơ�^��1ҿ�"A�����k4��:��Oc���b�
�����C�P��z���Qj��k:gm�l�h�Z}��h!���뜋4�d�5X�ֆ�_�����RX�&�_�S磑
+�]%��$\ԃ��F�@��H��tZ��s��h�e��s�ʨk�����l��e>�Ͻ=J������2�]WwN{t��g?���lR_,Ř�}
+�x�x�Je�y\Τ6Nzп�
Ny�W���J�N���B�9I��u
+Jl����&��˚R�Ay�a�߅�Tw��.�
+�]�&~���$!����=zES�H����)��VNc���:�9$��H(�q��]h`<id��,L{;��,�z�����ݤ��9�e��(��D'��(.�ASE�WN�4\�b�j�ᴍ~B�.L"P	C�^�NSHU��FO��{�3����e-�t�T�lZi����C\X��
+��=x����*�,I�iN0�}p�XiI��$9��4d�H*�U ^6���y��Y�KQ�'�Wi�A���!(-�u����bc��҃���BKơ��p�}�B���"��_��3&a�b������C�V��pI�����	����q�� ���V�����uK��26���s�F�-���]�P��^K)r�]
+e���յ��ܡ� �F��!}e=_�� K�91:�����).����r�
 �s�P���D�,�u��P|	�BڳJ�`2�P���)'u�M�"��-��&���T�
+�3qj�1p:�m}ˉR4�Z���_���;s����h`m�]F���s=J˲���^I�l?���6�CX2v��!, #Sl�E�D9�f]lڀd�qg8�:hC��"4�ӡl.��MƝcBĜ5�;���oi�3�	�ԍ�H�u;y��m+G���e�&΋TY-i`#S��T���F��aKЊ�u�m_�Y�.�Y���"c�p��$l�M��f�o�sP�2�>4�Q��GM�,��Cz��>p���A|�
2#vI�]pĲc���&�)ɲ��EĲ+�C1ˍ0�R�ˮ�	�>�N�
�i��v��&����m����ɸ+�4l�d�Q��a�uz
+f�q�w�3��*;�wT��(�;�TAv��qɞjHߩ�8��^З�|A�����Ѭ�a�������c�e�����l�i�*h��4��M�q�ӎjž�u���b��CǏ�(ǅ����)�v�/�͘aG:��$�}c�*�ᆝ�n�9G
;����M��L�]�t��3Yv$\�3��,��Ķڬ���}ǂXfKm�tYj�Q7�z�T�̼#��f����zd�d��0�h�N��[>-�7�1.�ݝ��g�I���~�D)tr�����1���g㲆��������s��!��}҃�j&��X&���3�;N�d�Zq���%���C:Ȑ�pI�^�"��@t�����8W<&ԅ������H�*2�Ʋ�u���J�����E,(\p
+��5��	��k�ݝ�/�5�42�!�d��-g:�E؊��[��Y,��E3�/l�oZN�f<��J����2N6l�F�򺆔P55`ms�ǆϴ8�W>�s��M�31>"'V9;����(��_�"F��Ψ��H׿XSwF4��ce�y�K�&֮p��|~����l��W��MY�t��E�8|�"YQ1:̠"?�J�a�l�鋆C����&AtU;�й����=�3`n�9y�i�� pŊ�*�,�#gG�}�Ж��_�#�'*�4�r�BY��Pj�!lX�>�l� f�<�k��pɏ���I��j�>���a)(1	����휧s�r�����}c�2o���u��E�\��^�������>�P���=���!��O���î:��)��P��8�O�'�	�*w�$�>���!) U)��ȉ&v�M����Jtx�G�˅*��q�x8M[*��M�jj���zJ��i�m�
X�E���E�����ݱ:*�>5�b���4��&_�M�u�`-��2W�)��@9��3y7N����u�^'����`0��8�1�M�HtǤ``�.v����!ۅ�GG�
��ck�z@V|��A�A����0h�ך��"����!�<�
�$�w�8	�Y��@�ί��\�ڴ������7m��t�s�bɼ����ʄ�̡�7T;�Ġ=��+sJgz*��[̓��=���?,�A�A��ԡ�������+���K�-�v�oŧ8�4r|�8)>�i�5ǧ�/�^�_#��8��F
+K'��:̆��Rw��z����Q@
K#�RƱ��"��u��/�R�3IQ(���NcO�=G�%ʣQ�F�%�ãRJGTJ�*Q��bP�qlh$��9$�����Tp,$�8�S����Q�W=�-z�UF�{��RY���A-�
+���jd�\=G�L�B��3�PJ�0�}�q�Vq\�bMChq(Ą�`q(��šb",U�`�E����zFSel$�a�Z� cq(����q(����*�l5k��C����n�8�G��P�+�CQ�� q("�w)���BQ|&�(�5aQ(�ٶ�(���1��P&�8�2:�P��F�x����Q(v�עP,:B4�D��|qg���P4��OF�bo�(��H�BU���Q����x�dS��Q�]]�JJc�Z��Ze�����Na(�������[�A�})���e"�cQ$ex�	c�ҋM���7S"�\�����h�p8|�WC��̚�Pn�r����ca�F�0���D�ˊ0�N<�V\����u�5�#�0����0
+�N�P�\5v���P񁄡L�-E����P49�Z�	�]-�Ja(�
+C�91�6Yʖ��ְ���
2�P���'��&��0���RN
+Ca휗��7�(�A�;+��\�I`��*[�E�\�J��(T|!Q(���(��!�����Pđ�F���ӣPFG*�P��8�v]sN���q�s
+`�rJ�����tL*=�lW�
+LdG	�j*����`�h��u�'������x	AU<�A)���6��ij�3�����1(��hCh�A�&
+��h�s�Z���u�1(7���:�A�Y�!(7�<%f�G��h���u��/4Ĥv]�f�9G-;BٮmA���,���̲��YvA�e��<�����²� �����5�v
B��2�΂Pa�Y�{� ��u�r��bPn�Y��:AY�
+��BPf�Y�W���Ғ���]CPf�Y*�:A���&��6�.8b�Y��:A�Y�!(7�<�f�G�԰s�M���q�1(5�<�ƝŠ�� ��<���z|�A��bPa9�wU�8}��R��s�j���/�bP4I T*�A��� Tt҂P�#A��Be�����;9E�P@�2N��Ze���V��P%!�m��a��a��ဃl{��Ո/֋]�C��L�ׇE��-�
+�,8�A�/�Ƨ��6.�4�Z���iEVB-���
+�f�H�(p���I�IGŨ�䦊ju�
+�q۾��Lk��6��&9luI'����hb�c�ͩ|��
�h�������b4R��9KV�G�OqԵrX7�)ޙ���	��B'��+n�qMFC܂u�!��48�v�����{rӸz��c���Hy� !�x-&^�d��ه(!c8ٙ�ӻ�	�yS���$�\\�#)�䐄Kk�$��9V���#;G�~��WvF.�Fv=�9V�ڿ���p����T��"M�O�#��9���)A��\�c�.�Is|��I�=)A^�pE*#\����u|#}P�	9�э쇜��%5>8�HT�;��Fд��Ȯ�A�Ό�xk��P��ֳW��
+-�$ǩ�7����:��O��?�x��s�J�
+�ٝ�B&���]]��m�H����\�:PwI�[�4�$�_��iq�䠏���GX��53QלO����R��]�0���.I�Hl7�� 9�H�7:�$�sIXK5\�0�GN��^�Kr`�.����q��r�S&%��SRq���zvJ�H��ٝ��N��cNI��SҾ0�$�;d9�S�ܹ�S�[�		#�''%��d�$�)h�t�;�T%I>�!�f�I��Ǽ�c�}
%�,]Rf<t���xXq5e�+�\����ϼ4�.I������$����A��[���X�'r�%Y[RZ���v0��
_��ↄ���ݐ�m�%t���cnƁ\���
+JnH��r�@OEҨ7��׭[�nHNrC��[yٍ�����+�\w�����R�ؽ���6�B⌏â�q��m��O�����;'F�Ks���k҆�ֽ����m(N{ǌ�x��^_�ᕓ��� � {�TJ}��pȄ��K�;�b�6qH�٫�nH���!CV��/�
�I�W
7$h1�]�)�>w��(��drB��M���ҝ6MsN��:q��r��=;!��>F��%���@�#��W`3GZ�Ԝ��������s�s��ID���0^ܐ��yɄWN�2��c4�ˉ=�)r<67�Nm�!t�!���U`���9�	����:�W7�[r�K�ݐjɹ�-9�C�%�H���i���!���cTS�i��#Ɯ{!u�v/�s�tcν�j̹�Q���͘��M�CRcν�n̹��Ӽ���慌������z!՘s/�s^�R-9�B�)�nH7������!�	�C�)�~H5��i�N���*�i7?�r�tC����k��Q
��͐�r�K�ݐnɹ�-9wC�%�NF��4k�9jϹR�5�B�=g^H��4H�9�B�9��_��j�$/dG��]�|��p�������7ҿ����pQ!���9�T�ct�<����GkW܎F��Q|޺��s��}��	��8��y+�>GZ������.Y��ɖ��W�`}�.lX8�C��m�W%�����O�x�ȟKo,�����|�xc�8�h�8ü�qR������T�g-?�P9���
+�	gS��x���[�?q?U�ؘ���ǒ
+���$l
+��W�~�Z���y�BU�m��,�!�[�کL�_T5���L'���;Nt����߼�����%+�[��6��Ã�8!�����,��:q.��/*�/.ٜZ��
+Ϳ��/�d� ����QS��-���	Iö�0b �?|��s4�J{h��&MC�����J} F{����x�}�#�X�EN�!<= ����~��I3�%��]爥Z� �8��UNŦX,�o�}�y�,��"�#Ja����1��'� q��r�`W�dr~*\��S�-E�qdr�}��%7;��G�q:G��Ds�ŀU�O�x0��֨?�!-�eKx�qP��P׿�)qQ*�y.���ܑ� �^��}\�%p�84)�8��R�t��+��\�q��?$?C"o<�髜�ot9j�9�������3�(�Hޖ��6lI��:6��_�ѿJ�H.J0�1An��%�I�7��X/�Ξ�$�P�P����&�$��uKa��v��P�X"-38�}f���w�AJV_����,��m?o�aaN���/$lIS.@(5��	-l�?o�Ԋ��0}d��YW�'��È2�Ϥ���.܎nU\ĩ��P������������
�Sno�(P�\�s���:f�%�
+(:��GA�	Q8��/FE��U7����am���
r�3]���)�Ѳ"��c 5��VJ(G�G��-�U%�"eR����'i�Lэ�3�G�֥����U�d��D�,����B�i����y�$V�+fQ�0�]�b\B9�7�Yi���z���z	�I`-�}\��W=M�f_�� �S����وC�h&_1�]Rq,�.8�r#����!���i�����hѴ���
+��n|%歈�t!��N�;���������Ҝ6����8_�v�*E�O|Z��ny�������$�W`w��o1v&f"H��a5wN�r���r 0�pkf��}�}~��;o/�?
+W_1�*�'P����5U�Tl��+3N->���թ�*�N"	�ԉ!.�Я�B��-4zI�˻�}A�����N%^oi������OD����r��&��1h�<��Yo�,m��p�щ)u��%���h̓�r�5�2��,���S.�]�ک�".
V�77���M��7˜F*V/RB9�	���[UjS��T�L���
�֦x�+f��>�CY�k���h�-4�h>��oM���ϠY!4G8�B
;�]o��G�Lwa��2/v�b�v���gp e��f�n/�UIEk���;p�Kډr��Ӻl�Q��A�
+ߴŶ�Sr�D��!U��D������aTq?'s���+��!+��cH���	�!�LG)B���8�p?T^��/�d-	�i8���WJ��X+�=��!�G2
�p������QY�Ɯv3���Uy#PC�%�J:�a{�j��V��RW�j�|%��8��bp|�a�-0ְ��b
���w	7�OuK�6I�Ks�Ŝ�(��PWň�{!�bTk�d9����$� U�;	��SK���r>�)�A]8��a�Jx�a�v~h�PL�1c(�U����V���)�5�rj�0F�o�h�S�3�mQ{��z�PP���r��/LÜv{[����'.xj̈�Hk�*Q�n�k2�
+^�j;Q�1#꽔D�Kf��U�%]�QA��^�j�3}���A�ziz��OEV�=�>�ͬ��Syk��
�C��k��Ř�����Op}
+��k;����)�nE��pQ��W馳��F[�>A�8G
<����O��x��g�B�(��rߚ���yT�+E��Ӗ��(���"5zz�z��;E�g��M�C2���S`����S�P;	
+?�fT�9"h��R��lF��)ag]E]C?�
����uL�G���&y��?N;G��U5�W���LT`��C �d^
+<�%�#PІ@��gI�-/�^�fIlݪ��2R
+��}A��嚶[�U�'�����6�Ѝ���
+�3͊���CKVJp�f�Rw��L����9���oK��g����6��z�Ŝ�(��@1ܕ)a�����b�9�8��?��؀J��v��Y�I?:Gς|��b�~��D�T��_���3`�iX�Ɯv3��ߙ
�?���`-���VaL�0�*nӤ��u���~�j�8BP\���C\�>�K4Ă��`!������q�$(/��I�ʹ�O��7D�6z(��A�չ3���dg�}�S`_B�àab9
+�!��7s�0�Ü��FU
�u�;	��(AX�oZ,>���8��A��A�H����UA�:�y;�13��m-���Mu˃P�^�h'm�L84�O4�8��[͒���W�1{j	姜ZӃMS�{���*�bz���I��j�;�8!|%�g{��8�q�'����'�K9b�#N��z��M�/���Y��g<��9�7���wf�?��+�Y��?�����?ڄ�<���\�xé���Z��Sgd.��Sgܕ7��
'`��ko8a�W_�����q�7��g�:��e�g�����
�̑'���/(��xM֞XB��⋊�j.[i�L�wи���W\'��3N�/��h0�EI'Z�����:2��_��gy�b��I|�V�(�,e�<�d}���5]'�j�w��T�'k��7��֫�g�v���g��j�g�G�qJj��8e�<�K�3N�#�8Y��[�3N���'��3N��~>o�,��O�CZ+�ddD=��`N��	Po�T��<�h��,�rS��SA�T�濃���-a�qS�c�:%\��:G�g)R'�j�;�NN�A���fM�:	'q�� uqZ�pHE����@�����y��N���s�"�6ycLE�n�w���CH�����1Sq���Ks��F��yoƐUp�t$YA=?���V�P,[����g���O3f\"���9N�}L��rp�F���p��h.G�5j'�j��:,��_��gaL�O9�ο����5s���99�x:I�%�c�"⹖�֨5`�׭[/�:�<l�	Q�ZQDMEԤ���#��K	�f� �����'#���@T����sGB���'��#���ů{O~�!s`W��f%�ۛ����a��+�x���T��Yx�v�:��{�_	M�K
uJ��j�8,qp�c�U��2�K�ɑ�u���r%8ѳ�����/=)U_L��J.乾�..��� ��E�pG�)+��u������*��/�v�����J6�o3W��Ǐf�Aϒe����3���˵�����?����}�����J&�C5WD_�GKg6�-g�"=����Gwb�ghΏ���1N��B��G�t��+�A���.���/|׮�.8,��p�N�� m�/y�2�-S~GG.�)1<�m�x�o��������h�y�'0
��c�\L���Ǻ����%���󔤺�R�FS����l����V������>�i�J��*q��!�Տ��Gc��,>��k0�w\���0 �	b-y��9��	>��\zm��h��m�u$�'�iC�sbh$�d)�
+N��,ooo�a��p�ruN�M�0�Mc�7���̘O�@��&������e�ŧq;n�
+���Z�_~&o`,~���Ou�	S�#!x��g~�G�/��#o�����������AZC�0a^;
�J.��m�%
����`���L~'��\����a��왞|[wl�l3/�ҸVW���q�:(_b%L���:����>�_���b/��c]�
+�n8s�˷�8�Ln���S���c=~O�{�dN��T}��Al�6�_��R��%��0��I�'.j�E܍]�3��/{�Nu��$zů0�{\��/�smF��,~����v7�la�Cg�����<�����x>?�Nˏ����z�>C}V���b��8�֦�+��"��Z�/���G^�.|,�{|Z��dX�J�T�׸��	a$���V��w�X6��*�䫓|Ǌ0�����ԋ����&y�䇙V�38��!O6�V�w�(\��p8#zj:8�~�D)`�l�1�p�h,��(Ȏ_,����ݩ����Wp��8��㜪�%��?o���@'RZ�$Q��8pm~�~.yv�y+�{]��o�Ҋ8_�9�@8���!��0�ڹ�ӴSUٳ���4qP�8���S'om�Ѯ���C�˃�1:��R�vk���X����[�t���Y�8-�OZ�ہN�ʣ:���Vn�6L�0\�Ч�T��C�n�T�t\�+�G�;gg���IjB�Lz!�5���/�qh`����_}�8}�� �9��%���f2vd��T����JqB�w��:|�F�-�n%��r-mD�d`��騊T��à
�������-�η2�*Be;�i�~�S�7Ԁ��p	Uݯ�2�����z �endstream
+endobj
+6 0 obj
+9902
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 384 171]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1175>>stream
+<?xpacket begin='﻿' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.53.3'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2021-05-23T23:46:12+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2021-05-23T23:46:12+02:00</xmp:CreateDate>
+<xmp:CreatorTool>LibreOffice 7.0</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:d746a1cf-f42c-11f6-0000-da35ff748a54'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>none</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+                                                                        
+                                                                        
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.53.3)
+/CreationDate(D:20210523234612+02'00')
+/ModDate(D:20210523234612+02'00')
+/Creator(LibreOffice 7.0)
+/Title(none)>>endobj
+xref
+0 8
+0000000000 65535 f 
+0000010393 00000 n 
+0000011708 00000 n 
+0000010334 00000 n 
+0000010220 00000 n 
+0000000228 00000 n 
+0000010200 00000 n 
+0000010457 00000 n 
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<FAF886517717DC22B9A7717C8ED64C25><FAF886517717DC22B9A7717C8ED64C25>]
+>>
+startxref
+11872
+%%EOF
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/doc/source/figures/ul-ofdma.pdf ns-3.34/src/wifi/doc/source/figures/ul-ofdma.pdf
--- ns-3.33/src/wifi/doc/source/figures/ul-ofdma.pdf	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/doc/source/figures/ul-ofdma.pdf	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,156 @@
+%PDF-1.5
+%�쏢
+%%Invocation: gs -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true -dAutoRotatePages#/None -
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x�����%;���W�-�"�f~�,w�*B:1QmH�~��{gI��F��&�L&	X �?_������ϯ��Ƙ����������������z߻������������r�|6x����Z���X������ϯ������������_�{�1��O�j����ǯq��1����v��T��?�;��9���1���uÉZ�-�����W�����߿�ѩ;����W��y�q���>�Q��c�o8Q��_�pp��+���}����J+���ո�Gi�9�����8�������е}T8S�߿?O�v}��~�������h�ՠ��{K
��S�����y�}��>�����J�
+����s��s�k�E8�nON��?���cω0��Y�w��&�3��c6�A��e���9��yK��r��M�(j�X�ҟ��q��y��];_�OpV����C׏�T[�v��/�iYgxg�e��k�����}σ�u>�w9o`z~^����h|�3%�A�y~_���󮥡-ޤ}\x�q�z�fL�*�t&�Y��0g$0���zƧ�/�N����I���奄sM�Ʃ~4�����1I�X�G\�#Z� ��O'�E�p����	�3��i��Y��KQb���9pF�Pλ�Ze��ǵ�ScBp��e� �69����r��D��#~�D���q=z^�L���<�ȝ�{�Ӄr��m���X[^�L�9��|/1��ngќq>Mr�����d0��¸-��ٖt�<i$�x����}f��y����z�gG�"
v�ڠ>�t>V�gJ�3���}Z�A����Q��^e� ��	{�6ᬈ�4a�%l�,�������:��98�M��ŹΨ�,�֩"��Q�nf�t�>@)`�5�m���<.�	I2j'�d|���<cr�Bg�E9"�$�֙g��sf�.!�V;��|��N���� ���j�z�4k���Gd<7�{�?�9����r��E���lW,۾��=�&-�}���Q�,��&�:����r6?�����l�`���'8����h�*('��:�W�w�x�DZg��x�U���}����,�x�Sό�xd�{y<�-�2w�XP�W0��Y3�����
�&�1!o�>}�϶���%65��G)�g�qN_/�Vǖ�҅����/�w/����c.|�󍱽��q��+��'CE�W�yp�,�{rr-}�'��ϵ�6>�0r���8{ƓS�����3�(����đ�G1��P
+:g��Ru�� ��h��r��v�|�# v���h��r�y�-x�F�}��p��3��|a�п�:�c\G���ۄ���֜�q>X�s��t�R��S�m_�ڶ̬�X��:;֪�č^�4S�`�8a���w~���}{�����;��:
ot��ݜ#Mt�M��4�W����!����rҴ�(~����Q����c��Ꮧ�o����G*G��d�9k���G}��Ol�-�q�ʹ��Ҏ8�|�<��(GN��Ro����·�0#ݘQF�â�yrr��㽂���_�[�Z�3k�zR�~����rR?j���q��/1j�sE(������t��M�����St�
��	�8�I����ͻ�O���-(M/�83��
�&��;
+�v��ak�m.�hk'3IH����K��t��]�e�h�s���4�y�#,�:�*�v2���{�����W�N���5�N�V��Ig4�7�F�"o�L:�� o�J:�yX5+�I���#�!�h���[��D:d�6��<~R�S���Ƭ[�s!8��hHf!��ws�򤴷�@^n!�&���`&�v�D:4���H�^�B�D:m�3�N�6lݭq�$�������6�7����8�D��6�)�>���[H�Q���Ͼ������tƙ�V�t;
�nT�3�7����f1�N7��?g:v'����ϓ[*��F�#��>zY}��H�c�ȣ��,t��9�����T"��T�H�5��$9(0�z8o������a���u���s6��r�/{�t̑Q}�nH��93��>����m��_���K�x�.#d�?պӴXRou��6/��P����rN�	A3�s��2O�2	�L�.��q��ǀ�i����qV�Ѩq����qsl�琼pY@��:��gRz+�_�v/�b੅+�fK�pη��ǟ��W�<����?^��؆��g���y�s��l��,,��Xݓz�Y�g�7��y�:<GG�J
h#�5m�e�#���w���iw��J���2�^b�s�����NTĜ���8_����}8�};"�о���?-���׀�#NӺb2����T�c(G��z
�d�u�#����γ3��G�UѸՌ�ڄ$�ٮ~��P��R���Cେ���g'��#H2��BE����P��~�nq��p�Y�J������h���v��@�1h�g�� @�Q΄�	h�g��t���1'`L
5��4���q;�����P���@�HC�|��+<9�r�4�3%k	i@o������Q��8$t�˄<���&�1s�!oA���P��ѳ���0b���PC?6ˍϠPC���=A
��p�+�б7�*H��4�ς#`���r�Cc�	i��by���Ґ�#�	��Џ�t_5!
��<E�E׹�Gĝ���M䞷{���Wێ5��ͼb
ǚ>g;�����X�с5D	��Z�1khg{�]Ѱ�+|١�;�
�	��a+�3nhg�(�j
+7�h2��v:C_��
А�=�p��7x	��r���xC�Sy'��3��3)�ЎEM�h�-�$�����YG����
�#�*	o��;}R̡�%
+A�5��v�pK��>6*�:��Z�9����Y��&���� _0=�9$Y$��1Q�b���X�������1��$#�IF�u+c�?w�	sH�N��������l�2����!��s�F嘃=�Z6��џ��^%0�v�T��en��0_��O�Y1�(!��Oj�
��0,��)4��&�V��8�#(���w1��&|�ڻ�V�!J���bt�L9�o��:@�� 1w�2�?�Q��Τ7�P�2u0:P�T��������m��m�h%��׃���C��!J�10F��i�xw���Q1<9I�=9����cO�C�\��M���t`g�a�!Mi��N
^1�t�r�9�S#��Q0`���@ֆ9(� ��d�@�
4vC1�/o��9h�9x')@Q��#�ܬr���j�"��c�%)�0S��;T�v�%�����p8���+Ƒ����i$�����11��i�A毢tQB��hA�<Z���Kѹ�� >a���Є'�CO�^8�O����C��V� F��(��2ҭe�>����^)�{%�C<T��-E���	��[4����)'�Cф'���t���o���pC,ME�w`ܴ�l�pб��,<���@
�}A\T��
+8��
+f>:���m
+�F��j!�`�
!�
hP�p3�g#�p/�(��_N���5�g0#�p�0�g#Iq��GP�Ȱ���ֈy��F"��!
���`��!
�Q)�i0�H��0�i�	�`���a ���
f �`��
a �`��
.�lHb]��( `��G�6�}dh��_�%�}��G�1������6�}�hC�G�8��`x��GN��3��G�8��CXG�8D�?f9����2̈��8�q��C
_���j	���$9(0�NB�*K��!��"�#�C�"���C~� �#��=��џ�8t�TWK��qs�w�	r�"�9�g���.Z|�¡�y�ˀQ��MGF�u��-�
+0`2#��&�)S/-(�����Wi��t��^�[�^�N(��֡��m������wa�P�^~�MP8�MF[B�y�?����ꆇ⿱�-�TG|����t���O��q��E,���AD9_��5�]q�ǘ�� f�!7�pgWj�P8��~i�ᯢ�mC2��iؽ"�*{���6�l$���Αx�y�gg��"��3��2���Q�L�..�3��Z�i%r1�z��m��,�p�2Xc����wg>=�������Ѩ.�''j����>��n��r©��k#�🜨���Ʃ?�������q��1̩?�[���ԇKIV�9��2s���N����Y��>�V��̧�0���O����'|��f>*�d���Ga�̝<���,ɣ�8�7���6G��t����"������g(���ًGC��q`l���c����
�3����ݥ���$l�8.��Y�����Y#���)9e�u������pV��㣴������P��w.9P���4�X���Y����Ć=���	a��Rw�D��w���Ώ�·�t_�Ο��Ex�S�G�/
+r!��ث7�8�͟G��G�7��|�x�'���̟�W�:�'���[�3��p�{	u�s&�&��IY�`���TW�<�
+!�a��˟���ŕ��*7��'i$/�BX����|wn�椇g�Ӎ�ox���V��leܺz�/���Ƀ#�o��%��X�/^|�6���#>|��A?������Λ�e���D�� ���>e>�L�3l�I�M��#�x�wpӯ&�B�~r�
+Ы�qִџ�����U?a��gYp�����^ﴂՃ%ă�3Y=���c���GE*�c�Y����
+~��rҫǤ�z�}UڻĺU~�������3�~�
�;̼p�'�����s���>|�#ԅ�dx��wz���>@_^wr��i�:��W�:�A/`q��7:�QB���Si�4Nzsq��Q�''D�׃���?9����ϟK8�m��?t�d�*r���x8�M�}���_�J>�Wԁ����.�́�s�/@p
+���)݁����_\��j��tѯ"�Z���S�W
�*�"��c�?J�Co��HD����������z�����_�$�=(�x�-Dk�ȏ9� ��q?a�x!�mￋO>�+�H8�pi@z�}����4��E��?�C*�"��W���_��᫏���T2ҍe���Ɉ.	#�$��x�8�S��Q�%�
�N�)nt�J9���?�n1S�S5�X�6��QKP���:��,����~U9��z���S�
��>=@<�.�S�5��zq̫M��X���'\�a��������1W}Hts՛�c�z�m�W֏�꽄z�u�rҭ��c�z�~�U/֏����Q7�?�7��i7~�#v��U����>,�ӛ�a~zӊ�Oz��飀����Q?��=榏��[����17}X>�7����f����-�қ�c^z��O�[��Q@��f���>�қ�e>x3|�6��b���^��n��{>�s���o�w�{���f�{�=oV�����1�|�icf��n��,��7� ��a98ǕLs��I������g��Q#9���(ᜏj�Oqͧ�k>q�5�.���Ǽ=��ї옟@�FM�y�c~�er�{��̮!�D�&O�<Ы!&�������i`���.ˀ���o~=�����\y��΋O�+6��_��W�F�\1���ϯ$��|9����Q�n���
'�zm�/���1fY�X�ҕ��G��r�y0�8<p���Hu^��������S6���1����ƺsN�c.'��1�e��&�*)[���!��)q�����p
+�	a	�q�AD���Cg��8�������է�`���[:|>��% 5�s6.F@S��rr����6����g]n�Ěǔc���8�aw!>cA~=����g;x�a�f�G�;k���<�<l���l��O��<�Q�?�攣�x���>87�+�����{ɸhu� ���ˀ9���F��E}1	�?��:8���p ���C�|}���9p�é�G
`BAv@��r¨�CQ]���-�賸s���<!�{��-�3ݝ<��s�^`5�Aܧ��=7���U?��g+�|�*���pe��J��h�6�pX�rˁR,�>k�>k�◂��'�� ��L.}�֠~�t��k㠟��q&h��#�s1�F�n⠑�hb�Q$/1n]��I�-�@O�h�R�mP/q2	�D �tjJ���(2o��4��a'(d�@�E?�ř�p�:��p�4bya��*C]׆ct8��4���$^��1��M�Ax�)q���\`ȧ���/�X/?3�C�P�&8�m��/S�+���5���b����aX\���e(��N5�4zC[�[#�W��p�R�e0>���Y/8���9�p�C�����R~j6��:����ù��m�8.[�/� n?�@lT�՝�����JC��B���b��c��X�#�{E�] u��0��Y�%T&��"���7�m�R��Ue���z���AB���WE}�p:�m�K�嫜���	K����d��τ�tmt(7X���8
�K��@�[�@�o�|	gܲ�B]����4�ӒX��F*!�n�P5���!�4ΙO<�3tj�gh��d,�QU������{Y�9鯎����1ypT�2� �%^l����nX	��V�&���c�ֳ�@_�f4�s��UE���X���I���''a�޹�o8UM��זY&j�p�*6ц�5dԁ�KW�(;g ��Q��klh�*����nw��i%.I��פ���Y���sj�g�*��i�����g�1��^E"�6�3&�i^�1��
+��Ƴ�*���t����}廬�JT9~nʔ��bƑ�:Z�i�/��(i*��u�����!������C���i��Ik0k!���8�J�>�O�<�aԲd������.�W��D���PQ���-G��ĢT��Q�ݒK�u���S7�Q��Ӯ&�xm��њe���F��BӦ��K�φ�0���@�%��W��s�u���_���R�1ْ�"j)#���<9V�Ē/˖7�����)꿈ZO��b���kc`�	��E�\o��=�il�����8��IW��gz0�G5r�H�	�4ZT�Z	�����^|"*\�Uzt
��`�y�%�vԺ�@�cIf�Z9۩a�c�~%�U%�����M�B5�U�$�M�g� �
+��-)`h��3��q��)Z�Sv�.��"���|Wў���kHpҒ}��?��o���S��ƾ5�DW;
�A*ç��4R
�S���>�S9Z�sb@�-*�у�{�GI�xYu�l��#~q��:�#ǖ#�9}��l
X_��St	Xji�(Kf�[�,�5�"��ȕ�"����0˖�Ӿd��K�j�j����ECy�E�	{�-���C�c�Z�<^%[4D~f^4��E�]4h�NKB��X3���L�T�5����\ak�#g��<�:�"0���b�,&#I%�d�5�&-�X2�'bɬ�[�.�m�×��$5��F^1�d���GSW�Ӿb�#������C�2���h����b].^�:��
+���
+�
+ߚh���y(_뒩	�z��3�D���>e0��FeZ-[�|ZN����	1������S�{�L��^�T����N;_�;N[
+�m&��h�!QY?T��!�KE����>^����6��TkqH�q@|k��*X%��H�:��-���']��I>�������*�n�?�Q��E�U����">��]4D+qLH����9-��|<U͢M�;d�1B��/ɒ�
�5��-ў~�e��}�����i��<�*�4ϻ��9w���_�����x��}��y_�
��8.5^�_
�;H��c4mG�]K9_���D��ZNAl�(׃���8>�y����sU|y֓c=�Y1��2X|�('*��ɀ)�`�,|�̅������̀��P�����w��DQ+���)YZv
+ L'?E��j�+S�c������	BE|��/��xus��������� ����QSof�����>�/�~B���F�K"��#��$�cr���u�b�}8��2���^%�c�ty�{ �zs�ԩ��6t�C=�n�ʤ�{~S�W�73�	�z2���WdJ�U�����z>�l�JL�	�[�g;}>m��W����%�bm>�|C&���$�!������Jt	'���;o)���1(� �ė<rlEA�����A�I�ٱמ�oF���Ҽ���K(�k�!���lC2��Zb�.��.��glM]�%�l=�Đ��eC~��bR�@�����@0?�``��j`
+Nl~��!
+ҥ�n���s����h��H�5I{�t��T7��;}�I�ké�Ɯ~�A#.(��#���ч�e.�H��S}�!>���Wu|�Y4�3���<w�"�X��2Z}ϫ���.񂖥C�[9я)`�7��q�g<!����z�K�n�$m%6��HnV��e���1��-����t���-"���������=U��bf`�L�0G=�-"�j��V_��h�I"r۾"�)��Ԫ��&Ny�Ć�6�d���Ri�Q�O� Y�)�{wUq�H���$F����B����m(�W�n�Rݦ��8�)�b�����O���B�}�FՒ|���T�\|��QU)�w�Y(je[�e	�?��_�|(�(�RS	���P�p�Ȝ>ͷ,��yf�6���E��ZL�+_���D��Z��S��vq���nۢ�8�1�ﴵ�c�ж��'|>�)�g��	�j]�z�TG|<��:y$
+�C�
������9�K����O�r�s��%�襖F���WZ[r]�W�*��� �G��jYcPt�-���9��И�m0�s��ҝQ�c��.�&rGt=NR";
��Q�K�V/�.�/�*�4&�<�8��"�~ÅRLPC#� "�I��xI�
0"�C[j�:KZ�ً�k5Irc�5���q�*[����~��p�H���2'�hf�VW=Sέ����c#f�`+�%B��C��{AN�AsV;�$�4tg"KT�_����Jq�Qo��8M4�q�W�g�s#�);V:=��I��kAs��E������~I���b��10�1��4;H�)o���Bs�Æ�#S�@����l�
+lv�y��pԡ�~�C�"v�~5ʫ�q(I&�qd�wHYvaI��H�tJ��P[	�B��M�,��ǂ��B�X�5����*�K�p����sV���Zl\B�K��i�"�;�+q#�R�'Ǡ�/6�o8�m��;N궶��x)U�$˂#��ӝdY+�I9d��[sY�Go!���)A�
+��%YV��*˜vY��e�,&zU�U`�+�2x~�,���&Y�.Z�.˜vYfXG��&� v˲o$Y�_������-5˲��{2Y�I/!��Pϕ38�f�U�7�,3�E��W���QQV{�b�4��	2<��?d���$�ꮂ�� ����%�5u"�0a�,�0�V�1|3�AĘ�!Ɯ�bgZH�v�-�!�ꢱ���&��0dN� s�
+2�C\�CT��ρ�6T�9��m5�M����c�:5�Î��N�%�>ԩ��I�
+��S�T���%mj�<�I�
+�iSo�,�� ���J
+ �DD
��k'4���4�;�Q+�e�e�04`��(��*D�m�'8"��M�?cc�����8�]W�?6@s�3`"�y,�'h?�х>�P���g�T�\����p�XP��N쏐>!/e'�37�\�H��J�3P�r֥��Q�;��4��ɟkYT�?��3p��.����&ćG4`�S�s�0c6C��(�Z�Q��)#bNe�@4�
+!4����r҅PpD��>-s`��+I��Ml��D��_�С��0)�I������P��3����H
+�O#�BA�z_�b�a�7uj���0-�9�sx�''�S֩И:5pN>hWV�c�S�zrLy7��o9�m?\yN궶��du�H=f5
+i�8�JH�f�Fߘ4��<Vi6/�a5a^Y��K/ �ג}E�Y�&΂#�l�D{X�����OQA��4�P۫K�	�^.͂6i�f��l�{JEȤ��)k��"�&��5̾y�`g�қ��De���C	,2qv�|��e���l�8�����������8;�tR�١o�"M��.�N�6�I*�&��Z�,�0w�Z	D4�e�0ল��L����}��)&˜tY�e68ue��Ud�ɲI�i$Y6��o!��[�b��,�dYpd�s(��0we(IR�|�(�D��z���x�
b�����,�D�8_�)u�*3������I��Zf_҅���9���k2��g('�M<ʟq��Sp�vI?yg�:o���|ެcʹ�#�%���Sb�Ҿ�#E�<����h]�N��028��c*
�ܑSD��2�1*�r�Q*�Q�wF�o�;K���;��o�,oc �g�d���GO�d����g#��,�6�U�kh���8"�Ǥ$�$hZ��1N�G�r����~dN��wb��c�&������.�K.g�Sd�k��n[j���ˠ�@#�"�U��i���W6�7d��æ��
��z��s����Kz��D-~�����Us�o8r�$s �q�;�1�X���jr��KL=�%�?����gO����0:OP�q٩�B$$�$�e̚J��{�dbRA��֋Ǉ_I�|�bp5�~1����J���'�b�At�� �%�q�zr�D�f �-0MppF��">�����>M%_�(�!�V$�fF#��F��	��N�FӰx+qUb�U�ԣ!#E��y�j��]Eϸ���h5�eܪ�a���}��O�ɱ$�,��M(n4i�����p��]3,j<���-�5�EE|@s�҈a-�n�VA���9L�>%�g"�u�>U9�S���	Wב��c ݘ�����E$)��%Y�%����mF`J�-w�����!�����C�De�["j���k ����,`А"J9;�i�ma��Y��nbJ��~Bym��D��hѷ��ٟ�u]Uk���^��
ZLNY�I5ᨤ_G�Qӆ����鞾��Z`������X��@�\���%��&�63^8_�#�5�]!,�{��j�֣��$���'�kq�������>�U��pp��@p�I�#o�x�4^�R�R�-8̍d�z�
eh����le���y���M>ie޵�G-s1b.�&qm�
�����(���r&���A��Sia�`j*�6�ӡ~jS���E;'�[���H$9�)�ܒE3M1�lnH���8��"��1�Ȫڜ�+��H5����9C�P*T�������0bf��&L:�
+��������a�3L���G�jz�0��	�*6�E��"���\ڐP���F�X?1_��F2�]��mp�����|�G���x�> �5���f�B>��e<-3�ipp%�(͒e3s*�N)���o�Oz�6Ƒ��ހ<5� ��_�#�	�f1mV��#��H�S�LL\G��gX�����<�T9[�k��_���p�r��h�ŴEX)�bG΂��&uR%�
�v��o�Mwc�"Y��$��i�9��߶R�h��AN�?~Њ���J��V�I+��#q���?ln�r��R���Y+rx)q���D�Z���^[�������R+�5d��A+eЎʜ�$`�'�\E��8���~�
+u�k+������܈��+�r��=~�J���ĀQU~�Ȇ�΃˃��g/Xc��V�c�n!�P�ˈ��g���z��̣0~������������8���B
+�a���7r0!1r���Xuy��0�/;��V�q�Ο��z�����"*��/X��Z�tݱ0aq/G� ���E�Ǫ��g�%�sF-$E����OǼ��VEF�t,���|\�d�S��܏�K���J��AB�N�򇹀{��<*g'��UV�.���"��F,�`��;�����
Z�+�i)���W8I�,E�%}��)=�qb0�՞�x�o,��Q��'�yE��o����1VO��Ff��c�hܾ����g(���\�$`ȍ�����KA�/�a�Ҳ�� K
+�����9��eۂ��>�_�ҝ>5.�v�84_���<�N3A,l��9b�a!�:73�2ZX��x6�q�.=�-����.A������u?F��\r��Yc˔T� a`�Q��b���ȸ��F�\]1+�x��f*`�
h�;���AxrxD��Lz���:+�2��v	�C�H}K�`��<�<ЀD����E�\�tV9
�{�Cx�)��9G�gB�7.tңir���ֆ��j$�~2��/^��1O�^qխ)���W�!�2�Dmm��惜FD(]����%�]���a�t�W���I��qj �R���Op���a�"�͏��O���W�\B�9s���h7��.�nyɚј�Lz���p)W�U.����X�\���ar��5l|�F���e�W6q�'#�4�ԓ�O%׿����Ã��@N�H]�}Ȍ�z�Ґ�i��c�ѽ�՜��L^��?s�_�)8y���_��H�DⷸY�<WL��vΩ�6sn#��,*����C"҄.���Op�>���3�\~���^w�o��X�%��Q.�3�b��҈z��B�hgx����L"(�p	���orA�Y�n�f�W��%'u��2�@�t^��%;x���-��4���@d��d<-�;�?|�8����H��a�t�
��j�Ϋd���o\��X����-W��y/�&�����#�H�D�9
'���L%�(���צ�r2Cx(j5m;D�.������E�sTT!��\^D$o��h�Z$�����������b�~>&�_�s�&����9c4��7�s�)C|-�Azο�֢��I����ɟ�B�(������$�L������i+��/q�g̿3n� ��V�-1A?i�	��޴�D�Ȍ:���O��`���5�6�:�u��6�:W��ƹ�<�β�:��:p���-O7ΒZ�t��l���#�>�1�K�Ց�&wj�9g�Ͼ4���+�[fll��:�gy�,[&��M]�Ζ�.J+閵:�ӯ<�����?k��#.�-�?䩆�83�B���Y�2'�Ȃ�����(yӸ����G�xr��k�?5���v�{�jwΗs�^�@�|r��{�?	6+L�� �\@\��u�ܦ�����L^6w���p:�w��)��fw�H8Ђ����Gc�_���%bF��)%�����`t�0i�
+�+$��M���#�F��㹧�� �"�G��i�3�2��d��
+��&y,�sA�'�+����:F��~Gn�u����K�"	�`��\�,���vo���ZZ���!�p9��G9z����f��M�Uy�.�ڀ�8�H��9��؊�Y.�9
ʙBx|,�� 9���b�k<w���Z0j祦�p.�5���'�;M�m�/�K���:i�hX1b�GS�mt������0�'u���
+�������L��G�(�)��ݟ�4wK�6�ڀ�i�c}����/�Te�n��V�۲�$Φ/�4�?l�M���2^�P�p..^,6�P��p(_��f|k��{jD	��;f�ш�j�3�֐�e�p�[b�\��]�A��}X��&��&m���VU�ā���t��%�]A
<*I�d��.yh�O�~��h]�Hm�[�82�S6$g.:q�ij�z�8pU��S�V@�!1Q{��F0'#�
+�����p��C[.r;�-�N��Yp��*�|��������/��Flޝ��-ױD		s���ц��y[���`:M�r�Y��^����[f�q��\�%[�M�]�7�ȸi�z��I����Y�{�yN�Ԡ�܁�a�N|C���E���e9�a���:��No%����|�F�!'F��+ۨ~U�8���9&�1�p�S��wF>9��Z]}r�u�e�g1\$�h�xނw�e��8�I�f£
+Gt��q*����%Q�s���(!73�+�y���EY�}i6�[��\��^��;�v#86�+�-�XY�F޷*
�XF���	G�U�PJY�!�4�o��C�[ӄA�J��8�%Vz0�>�y�4���f�ܴprKR��ym����2��%�b܍C	4^87���u��6��T$��3�F�g�^J,�������ݭ2
�8p��)4N�Ќ*4m,��S���5>]��@?�3Fzu�����bni���H#�����J:O�?ߋIk�^�I������#�����k�q�����?�ںl�@��P�9����9�4M膮p�7�����]��g
+�wM�?�ڲ�'qz���H��࿽�	 ��o�;��u	U��iW✣��5�BO���]�5y	�(�;���sD���6�J}|y����P+�ph?��6T�t:=T9�����n���Vܺ�r	Jk@�4tʱ>X�Ƿ��P�I귘��ISW$�Nk�X]tF:�K2�|>��H)Ac@�A��[n��I紛h����#a��=S�����x,"�R7�cpcz�D�/��5���rR7��zr9Y^8p������4ĉ���f3f��0uY�2�d��9LF�Vd\-�O#Ct��n�wz�k�<�F
�7�/�wٍj���	��6�D&u����I��HW7�*Q͞��0��
�
+�+Wͧ���l_U\/���
+\28�����sԾ��D}��jI�U�U�-�WU�|5��tYr��}��W�QS���n`Ud��5X|m����&���|�H3ٳ����D��j`Ud��V
�
+�ީWE����"�3�f`Ud�#X�0�\�:5�X��
�
��k5�X�򨼘�g�/�G�,���:%�#���F�2Y�76�XN���5�*n<��ς
+wvU��"�J�U���yU��k���n^9G�=�o7�8�aN�yU��v�TBg��W���}��e���R<�I�i^�3����\�ɼ���JU�>>8I*곟���.Z��*WC�."�I{ٓp���ʩ�e�N����/�}x���n%�]������>$�g�*�a-�pG�3�c`�|�[%�m����2�G��%�Q95��Zʩ�H��C��q:&�q���n~�o*�?#T�}��i`�ӱ{�+C2��`�*,��4�*ˋ<�G[����:�,؛��e�PR��������I\ �HI�Y;��Fya�1���G�$B�^�:��-�B�$����*R��i��XC8:�+<�g4���|m����K�u��q��=���dtSΗp��7y*h
l0Ґ�tl�h�w��Δl�q���SBi�Y���k4�݂������9n9�<C�-|D<x=i��"I��>lqduJ[B~>����o0Ч�$2�	'�4��i�gON�zo�/�8�B��K�2\�m<z0���''j������:i	@kY#h
�+���cvX�H�i�&��kؼ�g�4�	�xct�g^B�1o�h@
+3�g�oC'�dص�#��,J~��:�d��	V����~����c�3C�0T�T��Օ'N=Ct4�s��5D^]��3�=����٨t��d
�>��с�E	Ǭ#qI����S��	����?&B��!A���_��<ӧx�h�w�s��m��hG�1�S��GV(M�΢� cނ�xD�;C'������<Í�w��ބ�&22=S86�;k��vft`g^�B�q��S��@�G_��9�4BJB��6{ g�+���	�QP�s�p��^��$8���D5zt9����4*7Û"Vϰ3,�.�������;c��r;V��i��1&RP'希�Ǩ���X���u|��|�+t���Bg^B�3�i����vw�\ǐ3�"g�t]���� ��rf�@�:�;�p����
9���Y�5�Ց3_n�����Y��rY���bgZM�F�(��b4�h����n��DB8�`��͐�p��.3�g��t�����}�$��&��g�)�T���ϼ��!^T��%��-��ǂ���HgH�Ae�	��ds�gQƠ�''�?�ʞƇ֝��(�|0�I	<��8��w�"c�p���Q��
+�x��6�L�������r�:�'��rR{r��!3�`3����
+1��K(l��A쟁d�"6Kc�6�6KSEA�4U��[b����	ܕ��,7-�ܒ�zr^Wl��8`�4�Ɓ�~�pxG�f��l:��f�=�Ak?�ѩ+�f��fج�Os�4Αlft�fQ��VGV���ª	6˯. �7�y�(ك�F^���ɕ�u�v����RNj\!�'��~�p�a��T،w�7��:}�;�f�y��������f���r�����Qh�H�}�2��sb����6s�נ��b��:m��1l��.#�IRDQ3/�����t(��Q��-���;d�,_�͌�m���dz�pTq5���Z/�|
�:րl��2�Z�;��
+/�Y���I�U�'��7�����4���0@,���Y�D�f��n�'�C�''�L9�3��������)f%�A�����)'uC�'��I��b��*���T�,�bf��`f�t23��Z�$̬��{:ff
(f����)�!�-q�'��dz��¶r��V���ie�Y�V��ie��N
+��ee�Y@̷7�Ͳr�ZV����l�YXV���ee��YV���e�[V�13�03�5s��@33�43��@�0�4���ie���V��E�3S��0�0�3��033�33��0�0�33�J13�犙%���Y���,+��ܴ2��I�̴2:L+�ie��M��²R�,+��̰2P�+�ݰr�N}���l2�,+�͢�L!��6��}9��f��63��fI�U��N�$ ٓ��>�ɉZ	6C�6`@���
+�eNU�wRa��Q�,w@`���̞���O��x����'`�>%���{%���1�*�v�晷�p��a��=��2���谋���QE���9}x#����ABڷ;Ѻ	p�0���6��sh���y:W0��S���C�6hE2!*$�f����w��U��F����Y儚 �p{�@M�����I��4m9y��Vl���y&�X	Zu�^,SdF��w���m��u����p��{��e��l*5a��O ��Ôx��0�8t�-[�OK\}�ЮM��.�np!���.��:���>���^�'p���M��OON�zo�P�l��x�r�G9p��@��NF�yo�?D!����5����	��6E7��L���h&Z�qx@{:�(�㘕сDy	ř��q�t	����q;v]�PT�(j"ެ�ˆ�Z��D_�(\�[�I.��z���U�K�FŢp۳v���3EP��P�iҭ1��ã@��.��XT���[0W�&(j�[��@Q�H{��#��u�^�({F@Q�T��V���'ԫ%0
+v�����YA�4��5yF3aOK`z��T?����=2�Y6�R�(cx#8�ǀ$��c�cs\)h�-�)�������Nçn�������I�3ß3x%�vH
+��aRkXH�aRkڙ��\(&�d�bRQB '��F���0�U%"�0)\��l^�I-h!-cRv��cŤӊlǠ&O����p	�rq)x�\z�J1)����0 ڣ���uŤ�4PL�K(&����8�Iif����K�I�-gQ��L��(e����s��I�8�j������,�aR���J�R1�(!��m`����
+JѐhJM�_�HM���B�����äl�&��_gƤr���	WC�<�h��9�����0)L\��I����9��&����}=fDja�H���O�	D�dt RQ��''vAß�^_.'Y��2��#���PP�û�%KѦ'�F�ܙ#k����:�220�( ��.['��*'uB�'�S.9C���R���5b���PT
+�6�;eK"P�4�oc�Q�4]�J�E9�%Vz0�>��I�i��r���-I�'�q�>l��J�n83�ʜ��h���$J�rd�T*Ay��
�KV��?3�R��U�`�3�^A)���������$��������S�i�J�4�:XON��o����&���rR�7}Á���¥���a�Ԣ\P
+�ugPjaǘ�g󌔀R��*:��RQBp��FJ�RK3Z.�>����R�\����`�C�s�n�ւ
+EX�(Qh�K(��-���qL
6�(z���
+5��)�x+������b
�2-����`×������t?q녶�|{��*�g�٫�ӓ�.��N�Q�jU9�`�сPE	��l�9�֚ѹ�==9�_ʱ~	>�U|*uK�(!��ҴwN[��N�P���YE��$N���N�,Tt*-\�����S�l�e+>�o�G���>EW��Sހ�S�PEA����Qplq''D��dzA���r�ZZ
+P��eUZ�P��e��Q�P��eU��:���r��Y�P�mU�Y�P��e��Y�?����Y�)�a	�`��!TnhBe��!TfFB��!TQB*3��rC��� TfhD��ATahD���!TfhB��!Tfh)B�b]�$����P��eUZQ�Vi�ZN��e3���)�U�Y�P��e��Y�?����Y�v�Q*3��
+3��(!S��,C���z[�/��r���)c8>��]E���J�F=9I4곟����yk6?��R=��2�������T�(<��/�T�<��z�M�0[�\	�2N�Sp��>��"
+N]]�A������k���d�����#-��]�����	!ǫp���r�'_����%�pp���~!Sy[�9_�)�#"~��8Q���/P�!��Į�K�`��/�����ђ3���Z�-���`,f��Y ��A�-9����\�fQ�K�[�馔;6?�"q/�#�T+3��ZN������]38G/ހAo����gٻ\=���'sI!r�Y(y�#� ������h}�Ŭe�-�c��p�/��\op�
>4c6�t��F�ԇR9_��Ň�|��u��9g�p�z7�8ܸ�sp�<4!��u�Cu�ω���+W����
���4��;����m/��AB!�g� ���^�%��K}7�?o�:"��3
ai/�Ŵ�`v��9�~L(��EϚ
�rN:�1 &Z�S�	�>�;%�'k�#��	�;���]�������L���D�z1I���ˬ׮�S��8�|�]�$�ҧ��xɭ��}�̟��o9�a��s6S�"i+�鍧�5n~%��=5�"7#@
�W������C�gNѷ�K�F�ĺ�VƑ @W:
��D�z�*y�o��ՠp3�>d�u�H�^�>5�[^	�%f�ی�֍t��ƈ+y���C� �>�w�10h�Kā�:d|���û&�d��3�
+��������8[�\L�>����ϼ����s��@L�H2"���|��������XQ���p�'o�Ŧ�}6������a<����u�|���1xx�	�6���g���	4�\P�[n[�o�q�9��j$�������(Nc�&
+$�'�(�2&&�,���b�z6sY�A	p
C��������E-�3��h}��z��6ɐ+�9���ɆW�Ȏ"ǩ�:��^J}�����>�8K��-י�̌�;��V�5�)v]�왗���Rp��xo��C��D�R|�"N�������K�Q���E?F3Y��ΐ�ǫ�0t���r��M���bt��||�'Ǿ�?���\5����/I�86���L،�O6&	�tC4:~�"��b�_"}%�߼�5��3����Q�ҟ�W�hE��۞JѬ%�9/�<,�pNA�~�)����e�O\���ĸ_E���ӝ���UjG�~.�Z6>13����5�Y���I�[_���w�'X�d�2�c�F�{��J�QrJ��j6��q��}kA�j�P��W�TPn��:d*�-�L_��?���ުQ~��Jm�M?o�
+O
Ҟ��x%tjo����i���~ÙS�yA��g�@��x�Ra~�H�-ɴ:���Z�2�-7v���Z7�0\������OFC+�8�*�lШ�C;�JZ�:-I}ͯǋs4�QSn野Ɔ�w*�
���x�O>���X�����U�
�ZO�բ�y
+��;����f�������.r��
��Z1Ȼ��K:�g㟼�z�R֠'��hZ{�]#�r��+����;X٘^	��999Vp.��,E22�E�`+!7A�e���-�P�y��1 s8J_t����k�nޣ�Y�vJC�h�]�a_�z<�:bE�`�k���|�0�7���E^nzr�J���1�(v�8�"���j���!�� ��4��-g�V�U������C�	�������Y�>����PLq:�G�*u2���"�"���W�TzGu��@ŷ�W�^96�'��i��װ�wo��@��%I�	���Ñ{�u��ݹK�,]/w���ˍ��b�>���`��Y0������
���f�"6�/��%'��.@a��r�
�smׯ7QB�d�_1��%Y3����`汶5s����^�v3[37.����f�BǍ/�{6fX�E�ulI�M2���9�&�`��~Sw�E��/�Ñ\��h
+�ej,��m�8Ǘ��\�A�:|>�h�^B�RN�����m�G�}���Ɵa��x��g%l>��sZWN0�t��.�����c�e���?���K4%�QkTo�Z>5���Ð]����+��Ѭ�Gވ\M��M�dw^L�F�ir����u�%���	�{v(��NV/c�,�K��,�ZH�J8_�gt[r�=9�[6]w�Z��N%(���GU����"1
+[��'���gɤ8%o�~��Ƿ��j�K��hV��+�1%}����Yp���U�V��Z��)O�|<S�\��$�.���TA�o�x�q�x�d-Tų �97EU<�!����7�U<y�ԝf".��=O��0�Tbm0œ�fS�Q�t2���k��/��vw�gݺm)�+qD~�Z�/S�`�K����� X�˹��w�<�ɱ�AV��y���e����[Α�<��0��vs�
]p�����~�N�u�K[�N�	'rp36s��JG���'5�*]�M0�C��,j�����t�����ۋb�/��HG �4^#,�ڀ`��%��K���ɩ�(!iu������p�3d𾜁�K�}4�������Xl�_jI�h�En���6�>\~�%��������L����SC��r
+��3�O�r� ub＆�ˡICE��p�@e���p�XN���98
+A��k���_�3��=�1��9��CvO1h��k�txl�i��Z&��M��"��C�GsK����ƑD.�`WOA:S�(}^�$�^9�P'� Ydx�[&	q�O���������$�CzƑp�j�_4��D���}��ԋ���d.���!�l�_�X�����7��m�,��ni����/����jՄ���M��w��NF�b~XAI�S�Q}���jL�n���?��xM؆�e6�P��`��H�9.0a����P�����H��7�5oKf(�#��o
+'ݙ�BP�9�k��Wp��t����gHo���NsY��uI4WlQ�N��\���'~��������9��L-:�J<�ֱ�Ht��KT�@e�y�!��\�J��
Ķ@�������ė-��S���
q��\"e�sl�y�?�h1H���T���k���l��n���9d0b�C��@5��$���0�?
��4`G��)l�Ji�C�8��ro��-׫1Ew{Ԥ�;�]̼&yf��(��-���jcb�`ډ�ԘcZE�{}]t���K\��m��\�r�a��G�D���I��v9�8���%J;�,���Z����ƭ[a|�,O����0�k	A�#>_��i�����=��XQ}�&�PT�N���[/��?�V���X�v�|%N�H�V�裸1ҧ8/��u�X��ā��Z�Xܼ�_����8�m�6����W�]%�u�`b��m����i�Q87�RE����p����;�#G���	%3Ƕ��V`=�n\���4
+���/.�A$��[�!����3�7d�����䅔�֐��xZWv��E��0��_�K�w��Jn���F�����8�;�+!/X%Ҧ�>��:��|Q�;�L_E�%G��8�,):-�<��=$��(ð���b���	�}�Ӥ9��z	(FC,V�F|H1�/�W8���9�,��8d�.M܈��p�Cv�s��L��L��Q�,����`v�.wS�^��ءӰveG�<ǁ]�xv��=h��@�^¦�b�Zв�>Qv3������cq.����
+����ʃaU�.�&�[�q�
3Ǆ3��ћܕu��5�5T��'�:�埴w�}0�kx��k�ĖsTl
��&��;ֹ~\n
�!�#r]2!�&����:�!��t�e�[����- ��g�5�mbe�5Fѩr��r�i�[�Q1���[c����[������r��I���(/rkT�V�I�Cn!�E��&�p.�JrA_|Q�[A����#�-��.ߧ�-D���rk\Sa�-f��S�$7rȭ�dgIn��w�[W�,�0��r�5���r��sTn�)	�Mn���Ǻ�U����a��D��D��.�����qIta��]�K����Y���i]o��/�|χ��Tijx���3��y�p3���⦻�t��Pgz��jN���Igj�&x5��L�1�齖5F�e%�>
Wdl�=
���:S+��§A3���Qu-ꔿl��w�v�?A�
+�H�v
�vD5�d�ɻj��}W	Ԡ��2U	��[�%P�&��#���D�]5:����.�A1��$+!`���DP#tp���WA
>��$�at]��)z>�K�D�j0w�i�
+�H��6Ԯ>uV�b�DD(�lp�="^�V�N�+w�X	�� N�
+&�8�F5�p��Pm(8"��;�2-S�)�8܂L5����j0��'M�8C&>ǁ]��y.j�J�vݦAH	�A"}�6���d��������_�g���U��85��Ƣ�S��d�$8�(E�'��Sk�b{r��g�V��]�f��<55��?���j��C�5�f�NC_I�AP}�Ź]����K{�z)�	T�9��9*�*���`�ef�����,�p���б��"Z!*��v����V`8l=�� E�~��w�OX��f��#6����y%XR}g	����^�Op'	�I�*���s�J��\+.���3$X��x�J0��-I0��I�[״}�`�1�E�a��Z0醚�"��v	��`��W�`��5���A���2OU�!�
5�`N�s��0�D�Y���k���¤�O"�aN�{[����	v����oߐ6��	�Lf`�2]�o���+q���A+}*&�a+L��Lm�g�@����J#��V
+��ĩ�M�G��U8_[i]�؟�Q�)������ܯ� 7��Sܼ|hMQ�V��ޯ�T�P�Y+ה-�8������p�4���g/D,u���^r��'��d��Â���-?h���C.��C��
+N+��&��8���O�4~Wɣ���gSw"�e��Cٵ��C\�?�q���F�$O�%]?[E���_������>�e���ߙ��
�FQ���8_~�o�xm�3���Z���i�%A;?h)V�K#-y���B\&q�W\7�Μ",�#��~�
+y��
+�Z����:����9�I��OZ)���:[��;9u&nI~i(�g�4�Fn�F�g�>Ѽ�b<�_�9��`��'Ce�R�yX�-h$K�?�
+"�z^C���������19��.�?�,IHf���^?�r��Q�B̏򗛢�B�%%q&�6�lpGG��K+�7�R��:�r����Z�o���#�endstream
+endobj
+6 0 obj
+24407
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 682 172]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1175>>stream
+<?xpacket begin='﻿' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.53.3'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2021-05-24T00:13:55+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2021-05-24T00:13:55+02:00</xmp:CreateDate>
+<xmp:CreatorTool>LibreOffice 7.0</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:b6804b60-f430-11f6-0000-e8d214bc6dd2'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>none</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+                                                                        
+                                                                        
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.53.3)
+/CreationDate(D:20210524001355+02'00')
+/ModDate(D:20210524001355+02'00')
+/Creator(LibreOffice 7.0)
+/Title(none)>>endobj
+xref
+0 8
+0000000000 65535 f 
+0000024899 00000 n 
+0000026214 00000 n 
+0000024840 00000 n 
+0000024726 00000 n 
+0000000228 00000 n 
+0000024705 00000 n 
+0000024963 00000 n 
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<EB928E36C6242C46E5E8E18A34920D3B><EB928E36C6242C46E5E8E18A34920D3B>]
+>>
+startxref
+26378
+%%EOF
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/doc/source/wifi-design.rst ns-3.34/src/wifi/doc/source/wifi-design.rst
--- ns-3.33/src/wifi/doc/source/wifi-design.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/doc/source/wifi-design.rst	2021-07-14 10:31:07.000000000 -0700
@@ -22,6 +22,7 @@
 * basic 802.11 DCF with **infrastructure** and **adhoc** modes
 * **802.11a**, **802.11b**, **802.11g**, **802.11n** (both 2.4 and 5 GHz bands), **802.11ac** and **802.11ax** (2.4, 5 and 6 GHz bands) physical layers
 * **MSDU aggregation** and **MPDU aggregation** extensions of 802.11n, and both can be combined together (two-level aggregation)
+* 802.11ax **DL OFDMA** and **UL OFDMA**
 * QoS-based EDCA and queueing extensions of **802.11e**
 * the ability to use different propagation loss models and propagation delay models,
   please see the chapter on :ref:`Propagation` for more detail
@@ -48,11 +49,12 @@
 
 The implementation is modular and provides roughly three sublayers of models:
 
-* the **PHY layer models**
+* the **PHY layer models**: they model amendment-specific and common
+  PHY layer operations and functions.
 * the so-called **MAC low models**: they model functions such as medium
-  access (DCF and EDCA), RTS/CTS and ACK.  In |ns3|, the lower-level MAC
-  is further subdivided into a **MAC low** and **MAC middle** sublayering,
-  with channel access grouped into the **MAC middle**.   
+  access (DCF and EDCA), frame protection (RTS/CTS) and acknowledgment (ACK/BlockAck).
+  In |ns3|, the lower-level MAC is comprised of a **Frame Exchange Manager** hierarchy,
+  a **Channel Access Manager** and a **MAC middle** entity.
 * the so-called **MAC high models**: they implement non-time-critical processes
   in Wifi such as the MAC-level beacon generation, probing, and association 
   state machines, and a set of **Rate control algorithms**.  In the literature,
@@ -66,7 +68,7 @@
 
 .. figure:: figures/WifiArchitecture.*
    
-   WifiNetDevice architecture.
+   *WifiNetDevice architecture*
 
 MAC high models
 ===============
@@ -90,11 +92,7 @@
 These three MAC high models share a common parent in
 ``ns3::RegularWifiMac``, which exposes, among other MAC
 configuration, an attribute ``QosSupported`` that allows
-configuration of 802.11e/WMM-style QoS support, an attribute
-``HtSupported`` that allows configuration of 802.11n High Throughput
-style support, an attribute ``VhtSupported`` that allows configuration
-of 802.11ac Very High Throughput style support and an attribute ``HeSupported``
-that allows configuration of 802.11ax High Efficiency style support.
+configuration of 802.11e/WMM-style QoS support.
 
 There are also several **rate control algorithms** that can be used by the
 MAC low layer.  A complete list of available rate control algorithms is 
@@ -105,17 +103,16 @@
 
 The **MAC low layer** is split into three main components:
 
-#. ``ns3::MacLow`` which takes care of RTS/CTS/DATA/ACK transactions and also
-   performs MPDU aggregation.
-#. ``ns3::ChannelAccessManager`` and ``ns3::DcfState`` which implements the DCF and EDCAF
+#. ``ns3::FrameExchangeManager`` a class hierarchy which implement the frame exchange
+   sequences introduced by the supported IEEE 802.11 amendments. It also handles
+   frame aggregation, frame retransmissions, protection and acknowledgment.
+#. ``ns3::ChannelAccessManager`` which implements the DCF and EDCAF
    functions.
-#. ``ns3::Txop`` and ``ns3::QosTxop`` which handle the packet queue,
-   packet fragmentation, and packet retransmissions if they are needed.
+#. ``ns3::Txop`` and ``ns3::QosTxop`` which handle the packet queue.
    The ``ns3::Txop`` object is used by high MACs that are not QoS-enabled,
    and for transmission of frames (e.g., of type Management)
    that the standard says should access the medium using the DCF. 
-   ``ns3::QosTxop`` is is used by QoS-enabled high MACs and also
-   performs MSDU aggregation.
+   ``ns3::QosTxop`` is used by QoS-enabled high MACs.
 
 PHY layer models
 ================
@@ -167,15 +164,13 @@
 when the SpectrumWifiPhy is used.
 The following details pertain to the physical layer and channel models:
 
-* 802.11ax OFDMA is not supported (but some code changes are progressively being added)
+* 802.11ax MU-RTS/CTS and the MU EDCA Parameter set are not yet supported
 * 802.11ac/ax MU-MIMO is not supported, and no more than 4 antennas can be configured
 * 802.11n/ac/ax beamforming is not supported
 * 802.11n RIFS is not supported
-* 802.11 HCF/HCCA are not implemented
-* 802.11 PCF implementation currently assumes a DTIM interval equal to the beacon interval
+* 802.11 PCF/HCF/HCCA are not implemented
 * Authentication and encryption are missing
 * Processing delays are not modeled
-* The current implementation assumes that secondary channels are always higher than primary channels
 * Channel bonding implementation only supports the use of the configured channel width
   and does not perform CCA on secondary channels
 * Cases where RTS/CTS and ACK are transmitted using HT/VHT/HE formats are not supported
@@ -189,6 +184,8 @@
 
 * BSSBasicRateSet for 802.11b has been assumed to be 1-2 Mbit/s
 * BSSBasicRateSet for 802.11a/g has been assumed to be 6-12-24 Mbit/s
+* OperationalRateSet is assumed to contain all mandatory rates (see
+  `issue 183 <https://gitlab.com/nsnam/ns-3-dev/-/issues/183>`_)
 * The wifi manager always selects the lowest basic rate for management frames.
 
 Design Details
@@ -251,12 +248,99 @@
 
 There are currently two implementations of the ``WifiPhy``: the
 ``ns3::YansWifiPhy`` and the ``ns3::SpectrumWifiPhy``.  They each work in 
-conjunction with three other objects:
+conjunction with five other objects:
 
+* **PhyEntity**: Contains the amendment-specific part of the PHY processing
+* **WifiPpdu**: Models the amendment-specific PHY protocol data unit (PPDU)
 * **WifiPhyStateHelper**:  Maintains the PHY state machine
 * **InterferenceHelper**:  Tracks all packets observed on the channel
 * **ErrorModel**:  Computes a probability of error for a given SNR
 
+PhyEntity
+##################################
+
+A bit of background
+-------------------
+
+Some restructuring of ``ns3::WifiPhy`` and ``ns3::WifiMode`` (among others) was necessary
+considering the size and complexity of the corresponding files.
+In addition, adding and maintaining new PHY amendments had become a complex
+task (especially those implemented inside other modules, e.g. DMG).
+The adopted solution was to have ``PhyEntity`` classes that contain the "clause"
+specific (i.e. HT/VHT/HE etc) parts of the PHY process.
+
+The notion of "PHY entity" is in the standard at the beginning of each PHY
+layer description clause, e.g. section 21.1.1 of IEEE 802.11-2016:
+
+::
+Clause 21 specifies the **PHY entity** for a very high throughput (VHT) orthogonal
+frequency division multiplexing (OFDM) system.
+
+*Note that there is already such a name inside the wave module
+(e.g. ``WaveNetDevice::AddPhy``) to designate the WifiPhys on each 11p channel,
+but the wording is only used within the classes and there is no file using
+that name, so no ambiguity in using the name for 802.11 amendments.*
+
+Architecture
+-------------------
+
+The abstract base class ``ns3::PhyEntity`` enables to have a unique set of APIs
+to be used by each PHY entity, corresponding to the different amendments of
+the IEEE 802.11 standard. The currently implemented PHY entities are:
+
+* ``ns3::DsssPhy``: PHY entity for DSSS and HR/DSSS (11b)
+* ``ns3::OfdmPhy``: PHY entity for OFDM (11a and 11p)
+* ``ns3::ErpOfdmPhy``: PHY entity for ERP-OFDM (11g)
+* ``ns3::HtPhy``: PHY entity for HT (11n)
+* ``ns3::VhtPhy``: PHY entity for VHT (11ac)
+* ``ns3::HePhy``: PHY entity for HE (11ax)
+
+Their inheritance diagram is given in Figure :ref:`phyentity-hierarchy` and
+closely follows the standard's logic, e.g. section 21.1.1 of IEEE 802.11-2016:
+
+::
+The VHT PHY is **based** on the HT PHY defined in Clause 19, which **in turn**
+is **based** on the OFDM PHY defined in Clause 17.
+
+.. _phyentity-hierarchy:
+
+.. figure:: figures/PhyEntityHierarchy.*
+
+   *PhyEntity hierarchy*
+
+Such an architecture enables to handle the following operations in an amendment-
+specific manner:
+
+* ``WifiMode`` handling and data/PHY rate computation,
+* PPDU field size and duration computation, and
+* Transmit and receive paths.
+
+WifiPpdu
+##################################
+
+In the same vein as ``PhyEntity``, the ``ns3::WifiPpdu`` base class has been
+specialized into the following amendment-specific PPDUs:
+
+* ``ns3::DsssPpdu``: PPDU for DSSS and HR/DSSS (11b)
+* ``ns3::OfdmPpdu``: PPDU for OFDM (11a and 11p)
+* ``ns3::ErpOfdmPpdu``: PPDU for ERP-OFDM (11g)
+* ``ns3::HtPpdu``: PPDU for HT (11n)
+* ``ns3::VhtPpdu``: PPDU for VHT (11ac)
+* ``ns3::HePpdu``: PPDU for HE (11ax)
+
+Their inheritance diagram is given in Figure :ref:`wifippdu-hierarchy` and
+closely follows the standard's logic, e.g. section 21.3.8.1 of IEEE 802.11-2016:
+
+::
+To maintain compatibility with non-VHT STAs, specific non-VHT fields are defined
+that can be received by non-VHT STAs compliant with **Clause 17** [OFDM] or **Clause 19** [HT].
+
+.. _wifippdu-hierarchy:
+
+.. figure:: figures/WifiPpduHierarchy.*
+
+   *WifiPpdu hierarchy*
+
 YansWifiPhy and WifiPhyStateHelper
 ##################################
 
@@ -290,7 +374,9 @@
 
 Packet reception works as follows.  For ``YansWifiPhy``, most of the logic
 is implemented in the ``WifiPhy`` base class.  The ``YansWifiChannel`` calls
-``WifiPhy::StartReceivePreamble ()`` to start packet reception, but first
+``WifiPhy::StartReceivePreamble ()``. The latter calls
+``PhyEntity::StartReceivePreamble ()`` of the appropriate PHY entity
+to start packet reception, but first
 there is a check of the packet's notional signal power level against a
 threshold value stored in the attribute ``WifiPhy::RxSensitivity``.  Any
 packet with a power lower than RxSensitivity will be dropped with no
@@ -310,19 +396,19 @@
 the PHY.  In the case that the PHY is transmitting, for instance, the
 packet will be dropped.  If the PHY is IDLE, or if the PHY is receiving and
 an optional FrameCaptureModel is being used (and the packet is within
-the capture window), then ``WifiPhy::StartRx ()`` is called next.
+the capture window), then ``PhyEntity::StartPreambleDetectionPeriod ()`` is called next.
 
-The ``WifiPhy::StartRx ()`` will typically schedule an event,
-``WifiPhy::StartReceiveHeader ()``, to occur at
+The ``PhyEntity::StartPreambleDetectionPeriod ()`` will typically schedule an event,
+``PhyEntity::EndPreambleDetectionPeriod ()``, to occur at
 the notional end of the first OFDM symbol, to check whether the preamble
 has been detected.  As of revisions to the model in ns-3.30, any state
 machine transitions from IDLE state are suppressed until after the preamble
 detection event.
 
-The ``StartReceiveHeader ()`` method will check, with a preamble detection
+The ``PhyEntity::EndPreambleDetectionPeriod ()`` method will check, with a preamble detection
 model, whether the signal is strong enough to be received, and if so,
-an event ``WifiPhy::ContinueReceiveHeader ()`` is scheduled for the end of the
-non-HT header and the PHY is put into the CCA_BUSY state. Currently, there is only a
+an event ``PhyEntity::EndReceiveField ()`` is scheduled for the end of the
+preamble and the PHY is put into the CCA_BUSY state. Currently, there is only a
 simple threshold-based preamble detection model in ns-3,
 called ``ThresholdPreambleDetectionModel``.  If there is no preamble detection
 model, the preamble is assumed to have been detected.  
@@ -335,13 +421,13 @@
 previously successful will now fail on this check.  More details on the
 modeling behind this change are provided in [lanante2019]_.
 
-The next event to schedule is ``StartReceivePayload ()`` for the time at which
-the remaining PHY header fields have been received and the payload is about to start.
-This event is scheduled only if the non-HT PHY headers have been successfully received,
+The ``PhyEntity::EndReceiveField ()`` method will check the correct reception
+of the current preamble and header field and, if so, calls ``PhyEntity::StartReceiveField ()``
+for the next field,
 otherwise the reception is aborted and PHY is put either in IDLE state or in CCA_BUSY state,
 depending on whether the measured energy is higher than the energy detection threshold.
 
-The next event at ``StartReceivePayload ()`` checks, using the interference
+The next event at ``PhyEntity::StartReceiveField ()`` checks, using the interference
 helper and error model, whether the header was successfully decoded, and if so,
 a ``PhyRxPayloadBegin`` callback (equivalent to the PHY-RXSTART primitive)
 is triggered. The PHY header is often transmitted
@@ -349,11 +435,12 @@
 corresponding to the PHY header is evaluated for probability of error
 based on the observed SNR.  The InterferenceHelper object returns a value
 for "probability of error (PER)" for this header based on the SNR that has
-been tracked by the InterferenceHelper.  The ``YansWifiPhy`` then draws
+been tracked by the InterferenceHelper.  The ``PhyEntity`` then draws
 a random number from a uniform distribution and compares it against the 
-PER and decides success or failure.  The process is again repeated after 
-the payload has been received.  If both the header and payload
-are successfully received, the packet is passed up to the ``MacLow`` object.
+PER and decides success or failure.
+
+This is iteratively performed up to the beginning of the data field
+upon which ``PhyEntity::StartReceivePayload ()`` is called.
 
 Even if packet objects received by the PHY are not part of the reception
 process, they are tracked by the InterferenceHelper object for purposes
@@ -404,7 +491,7 @@
 
 .. figure:: figures/snir.*
    
-   *SNIR function over time.*
+   *SNIR function over time*
 
 From the SNIR function we can derive the Bit Error Rate (BER) and Packet 
 Error Rate (PER) for
@@ -458,7 +545,8 @@
 current OFDM model is based on work published in [patidar2017]_, using
 link simulations results from the MATLAB WLAN Toolbox, and validated against
 IEEE TGn results [erceg2004]_.  For publications related to other error models,
-please refer to [pei80211ofdm]_, [pei80211b]_, [lacage2006yans]_, [Haccoun]_ and [Frenger]_ for a detailed description of the legacy PER models.
+please refer to [pei80211ofdm]_, [pei80211b]_, [lacage2006yans]_, [Haccoun]_,
+[hepner2015]_ and [Frenger]_ for a detailed description of the legacy PER models.
 
 The current |ns3| error rate models are for additive white gaussian
 noise channels (AWGN) only; any potential frequency-selective fading
@@ -507,12 +595,11 @@
 #. Phase tracking, phase correction, phase noise, carrier frequency offset, power amplifier non-linearities etc. are not considered.
 
 Several packets are simulated across the link to obtain PER, the number of packets needed to reliably
-estimate a PER value is computed using the consideration that ratio of the estimation error to the true
-value should be within 10 % with probability 0.95.
-For each SNR value (using 0.2 dB SNR resolution), simulations were run until either a minimum value
-of 400 unsuccessfully decoded packets were observed or a total of 40000 packets were simulated.
+estimate a PER value is computed using the consideration that the ratio of the estimation error to the
+true value should be within 10 % with probability 0.95.
+For each SNR value, simulations were run until a total of 40000 packets were simulated.
 
-The obtained results are very close to original TGn curves as shown in Figure
+The obtained results are very close to TGax curves as shown in Figure
 :ref:`default-table-based-error-model-validation`
 
 .. _default-table-based-error-model-validation:
@@ -520,7 +607,7 @@
 .. figure:: figures/default-table-based-error-model-validation.*
    :scale: 75%
   
-   *Comparison of table-based OFDM Error Model with TGn results.*
+   *Comparison of table-based OFDM Error Model with TGax results.*
 
 Legacy ErrorRateModels
 ######################
@@ -540,7 +627,7 @@
 were also compared against the CMU wireless network emulator, and details
 of the validation are provided in [pei80211ofdm]_.  Since OFDM modes use
 hard-decision of punctured codes, the coded BER is calculated using
-Chernoff bounds.
+Chernoff bounds [hepner2015]_.
 
 The 802.11b model was split from the OFDM model when the NIST error rate
 model was added, into a new model called DsssErrorRateModel.
@@ -580,7 +667,7 @@
 
 The current ``SpectrumWifiPhy`` class 
 reuses the existing interference manager and error rate models originally
-built for YansWifiPhy, but allows, as a first step, foreign (non Wi-Fi)
+built for ``YansWifiPhy``, but allows, as a first step, foreign (non Wi-Fi)
 signals to be treated as additive noise.
 
 Two main changes were needed to adapt the Spectrum framework to Wi-Fi.
@@ -593,7 +680,7 @@
 unintended Wi-Fi signals (perhaps from a different SSID or arriving
 late from a hidden node) are added to the noise.
 
-Unlike YansWifiPhy, where there are no foreign signals, CCA_BUSY state
+Unlike ``YansWifiPhy``, where there are no foreign signals, CCA_BUSY state
 will be raised for foreign signals that are higher than CcaEdThreshold
 (see section 16.4.8.5 in the 802.11-2012 standard for definition of
 CCA Mode 1).  The attribute ``WifiPhy::CcaEdThreshold`` therefore
@@ -758,6 +845,176 @@
 * MSDU aggregation,
 * etc.
 
+Frame Exchange Managers
+#######################
+As the IEEE 802.11 standard evolves, more and more features are added and it is
+more and more difficult to have a single component handling all of the allowed
+frame exchange sequences. A hierarchy of FrameExchangeManager classes has been
+introduced to make the code clean and scalable, while avoiding code duplication.
+Each FrameExchangeManager class handles the frame exchange sequences introduced
+by a given amendment. The FrameExchangeManager hierarchy is depicted in Figure
+:ref:`fem-hierarchy`.
+
+.. _fem-hierarchy:
+
+.. figure:: figures/FemHierarchy.*
+
+   *FrameExchangeManager hierarchy*
+
+The features supported by every FrameExchangeManager class are as follows:
+
+* ``FrameExchangeManager`` is the base class. It handles the basic sequences
+  for non-QoS stations: MPDU followed by Normal Ack, RTS/CTS and CTS-to-self,
+  NAV setting and resetting, MPDU fragmentation
+* ``QosFrameExchangeManager`` adds TXOP support: multiple protection setting,
+  TXOP truncation via CF-End, TXOP recovery, ignore NAV when responding to an
+  RTS sent by the TXOP holder
+* ``HtFrameExchangeManager`` adds support for Block Ack (compressed variant),
+  A-MSDU and A-MPDU aggregation, Implicit Block Ack Request policy
+* ``VhtFrameExchangeManager`` adds support for S-MPDUs
+* ``HeFrameExchangeManager`` adds support for the transmission and reception of
+  multi-user frames via DL OFDMA and UL OFDMA, as detailed below.
+
+.. _wifi-mu-ack-sequences:
+
+Multi-user transmissions
+########################
+
+Since the introduction of the IEEE 802.11ax amendment, multi-user (MU) transmissions are
+possible, both in downlink (DL) and uplink (UL), by using OFDMA and/or MU-MIMO. Currently,
+ns-3 only supports multi-user transmissions via OFDMA. Three acknowledgment sequences are
+implemented for DL OFDMA.
+
+The first acknowledgment sequence is made of multiple BlockAckRequest/BlockAck frames sent
+as single-user frames, as shown in Figure :ref:`fig-ack-su-format-80211ax`.
+
+.. _fig-ack-su-format-80211ax:
+
+.. figure:: figures/ack-su-format.*
+   :align: center
+
+   Acknowledgment of DL MU frames in single-user format
+
+For the second acknowledgment sequence, an MU-BAR Trigger Frame is sent (as a single-user
+frame) to solicit BlockAck responses sent in TB PPDUs, as shown in Figure :ref:`fig-mu-bar-80211ax`.
+
+.. _fig-mu-bar-80211ax:
+
+.. figure:: figures/mu-bar.*
+   :align: center
+
+   Acknowledgment of DL MU frames via MU-BAR Trigger Frame sent as single-user frame
+
+For the third acknowledgment sequence, an MU-BAR Trigger Frame is aggregated to every PSDU
+included in the DL MU PPDU and the BlockAck responses are sent in TB PPDUs, as shown in
+Figure :ref:`fig-aggr-mu-bar-80211ax`.
+
+.. _fig-aggr-mu-bar-80211ax:
+
+.. figure:: figures/aggr-mu-bar.*
+   :align: center
+
+   Acknowledgment of DL MU frames via aggregated MU-BAR Trigger Frames
+
+For UL OFDMA, both BSRP Trigger Frames and Basic Trigger Frames are supported, as shown in
+Figure :ref:`fig-ul-ofdma-80211ax`. A BSRP Trigger Frame is sent by an AP to solicit stations
+to send QoS Null frames containing Buffer Status Reports. A Basic Trigger Frame is sent by an AP
+to solicit stations to send data frames in TB PPDUs, which are acknowledged by the AP via a
+Multi-STA BlockAck frame.
+
+.. _fig-ul-ofdma-80211ax:
+
+.. figure:: figures/ul-ofdma.*
+   :align: center
+
+   Acknowledgment of DL MU frames via aggregated MU-BAR Trigger Frames
+
+Multi-User Scheduler
+####################
+
+A new component, named **MultiUserScheduler**, is in charge of determining what frame exchange
+sequence the aggregated AP has to perform when gaining a TXOP (DL OFDMA, UL OFDMA or BSRP Trigger
+Frame), along with the information needed to perform the selected frame exchange sequence (e.g.,
+the set of PSDUs to send in case of DL OFDMA). ``MultiUserScheduler`` is an abstract base class.
+Currently, the only available subclass is **RrMultiUserScheduler**. By default, no multi-user
+scheduler is aggregated to an AP (hence, OFDMA is not enabled).
+
+Round-robin Multi-User Scheduler
+################################
+The Round-robin Multi-User Scheduler dynamically assigns a priority to each station to ensure
+airtime fairness in the selection of stations for DL multi-user transmissions. The ``NStations``
+attribute enables to set the maximum number of stations that can be the recipients of a DL
+multi-user frame. Therefore, every time an HE AP accesses the channel to transmit a DL
+multi-user frame, the scheduler determines the number of stations the AP has frames to send
+to (capped at the value specified through the mentioned attribute) and attempts to allocate
+equal sized RUs to as many such stations as possible without leaving RUs of the same size
+unused. For instance, if the channel bandwidth is 40 MHz and the determined number of stations
+is 5, the first 4 stations (in order of priority) are allocated a 106-tone RU each (if 52-tone
+RUs were allocated, we would have three 52-tone RUs unused). If central 26-tone RUs can be
+allocated (as determined by the ``UseCentral26TonesRus`` attribute), possible stations that
+have not been allocated an RU are assigned one of such 26-tone RU. In the previous example,
+the fifth station would have been allocated one of the two available central 26-tone RUs.
+
+When UL OFDMA is enabled (via the ``EnableUlOfdma`` attribute), every DL OFDMA frame exchange
+is followed by an UL OFDMA frame exchange involving the same set of stations and the same RU
+allocation as the preceding DL multi-user frame. The transmission of a BSRP Trigger Frame can
+optionally (depending on the value of the ``EnableBsrp`` attribute) precede the transmission
+of a Basic Trigger Frame in order for the AP to collect information about the buffer status
+of the stations.
+
+Ack manager
+###########
+
+Since the introduction of the IEEE 802.11e amendment, multiple acknowledgment policies
+are available, which are coded in the Ack Policy subfield in the QoS Control field of
+QoS Data frames (see Section 9.2.4.5.4 of the IEEE 802.11-2016 standard). For instance,
+an A-MPDU can be sent with the *Normal Ack or Implicit Block Ack Request* policy, in which
+case the receiver replies with a Normal Ack or a Block Ack depending on whether the A-MPDU
+contains a single MPDU or multiple MPDUs, or with the *Block Ack* policy, in which case
+the receiver waits to receive a Block Ack Request in the future to which it replies with
+a Block Ack.
+
+``WifiAckManager`` is the abstract base class introduced to provide an interface
+for multiple ack managers. Currently, the default ack manager is
+the ``WifiDefaultAckManager``.
+
+WifiDefaultAckManager
+#####################
+
+The ``WifiDefaultAckManager`` allows to determine which acknowledgment policy
+to use depending on the value of its attributes:
+
+* ``UseExplicitBar``: used to determine the ack policy to use when a response is needed from
+  the recipient and the current transmission includes multiple frames (A-MPDU) or there are
+  frames transmitted previously for which an acknowledgment is needed. If this attribute is
+  true, the *Block Ack* policy is used. Otherwise, the *Implicit Block Ack Request* policy is used.
+* ``BaThreshold``: used to determine when the originator of a Block Ack agreement needs to
+  request a response from the recipient. A value of zero means that a response is requested
+  at every frame transmission. Otherwise, a non-zero value (less than or equal to 1) means
+  that a response is requested upon transmission of a frame whose sequence number is distant
+  at least BaThreshold multiplied by the transmit window size from the starting sequence
+  number of the transmit window.
+* ``DlMuAckSequenceType``: used to select the acknowledgment sequence for DL MU frames
+  (acknowledgment in single-user format, acknowledgment via MU-BAR Trigger Frame sent as
+  single-user frame, or acknowledgment via MU-BAR Trigger Frames aggregated to the data
+  frames).
+
+Protection manager
+##################
+
+The protection manager is in charge of determining the protection mechanism to use,
+if any, when sending a frame.
+
+``WifiProtectionManager`` is the abstract base class introduced to provide an interface
+for multiple protection managers. Currently, the default protection manager is
+the ``WifiDefaultProtectionManager``.
+
+WifiDefaultProtectionManager
+############################
+
+The ``WifiDefaultProtectionManager`` selects a protection mechanism based on the
+information provided by the remote station manager.
+
 Rate control algorithms
 #######################
 
@@ -784,6 +1041,7 @@
 * ``AarfcdWifiManager`` [maguolo2008aarfcd]_
 * ``ParfWifiManager`` [akella2007parf]_
 * ``AparfWifiManager`` [chevillat2005aparf]_
+* ``ThompsonSamplingWifiManager`` [krotov2020rate]_
 
 ConstantRateWifiManager
 #######################
@@ -846,6 +1104,42 @@
 smooth throughput decrease (whereas with 1e-5, better performance was seen further
 away, which is not "ideal").
 
+ThompsonSamplingWifiManager
+###########################
+
+Thompson Sampling (TS) is a classical solution to the Multi-Armed
+Bandit problem.  `ThompsonSamplingWifiManager` implements a rate
+control algorithm based on TS with the goal of providing a simple
+statistics-based algorithm with a low number of parameters.
+
+The algorithm maintains the number of successful transmissions
+:math:`\alpha_i` and the number of unsuccessful transmissions
+:math:`\beta_i` for each MCS :math:`i`, both of which are initially
+set to zero.
+
+To select MCS for a data frame, the algorithm draws a sample frame
+success rate :math:`q_i` from the beta distribution with shape
+parameters :math:`(1 + \alpha_i, 1 + \beta_i)` for each MCS and then
+selects MCS with the highest expected throughput calculated as the
+sample frame success rate multiplied by MCS rate.
+
+To account for changing channel conditions, exponential decay is
+applied to :math:`\alpha_i` and :math:`\beta_i`. The rate of
+exponential decay is controlled with the `Decay` attribute which is
+the inverse of the time constant. Default value of 1 Hz results in
+using exponential window with the time constant of 1 second.  Setting
+this value to zero effectively disables exponential decay and can be
+used in static scenarios.
+
+Control frames are always transmitted using the most robust MCS,
+except when the standard specifies otherwise, such as for ACK frames.
+
+As the main goal of this algorithm is to provide a stable baseline, it
+does not take into account backoff overhead, inter-frame spaces and
+aggregation for MCS rate calculation. For an example of a more complex
+statistics-based rate control algorithm used in real devices, consider
+Minstrel-HT described below.
+
 MinstrelWifiManager
 ###################
 
@@ -867,39 +1161,6 @@
 
 This is the extension of minstrel for 802.11n/ac/ax.
 
-Ack policy selection
-####################
-
-Since the introduction of the IEEE 802.11e amendment, multiple acknowledgment policies
-are available, which are coded in the Ack Policy subfield in the QoS Control field of
-QoS Data frames (see Section 9.2.4.5.4 of the IEEE 802.11-2016 standard). For instance,
-an A-MPDU can be sent with the *Normal Ack or Implicit Block Ack Request* policy, in which
-case the receiver replies with a Normal Ack or a Block Ack depending on whether the A-MPDU
-contains a single MPDU or multiple MPDUs, or with the *Block Ack* policy, in which case
-the receiver waits to receive a Block Ack Request in the future to which it replies with
-a Block Ack.
-
-``WifiAckPolicySelector`` is the abstract base class introduced to provide an interface
-for multiple ack policy selectors. Currently, the default ack policy selector is
-the ``ConstantWifiAckPolicySelector``.
-
-ConstantWifiAckPolicySelector
-#############################
-
-The ``ConstantWifiAckPolicySelector`` allows to determine which acknowledgment policy
-to use depending on the value of its attributes:
-
-* UseExplicitBar: used to determine the ack policy to use when a response is needed from
-  the recipient and the current transmission includes multiple frames (A-MPDU) or there are
-  frames transmitted previously for which an acknowledgment is needed. If this attribute is
-  true, the *Block Ack* policy is used. Otherwise, the *Implicit Block Ack Request* policy is used.
-* BaThreshold: used to determine when the originator of a Block Ack agreement needs to
-  request a response from the recipient. A value of zero means that a response is requested
-  at every frame transmission. Otherwise, a non-zero value (less than or equal to 1) means
-  that a response is requested upon transmission of a frame whose sequence number is distant
-  at least BaThreshold multiplied by the transmit window size from the starting sequence
-  number of the transmit window.
-
 802.11ax OBSS PD spatial reuse
 ##############################
 
@@ -947,8 +1208,7 @@
   ``mac-low.*`` to accomplish this.  Handling of control frames is performed in
   ``MacLow::ReceiveOk``.
 * MAC high modification. For example, handling new management frames (think beacon/probe), 
-  beacon/probe generation.  Users usually make changes to ``regular-wifi-mac.*``, 
-  ``infrastructure-wifi-mac.*``,``sta-wifi-mac.*``, ``ap-wifi-mac.*``, or ``adhoc-wifi-mac.*`` to accomplish this.
+  beacon/probe generation.  Users usually make changes to ``regular-wifi-mac.*``,``sta-wifi-mac.*``, ``ap-wifi-mac.*``, or ``adhoc-wifi-mac.*`` to accomplish this.
 * Wi-Fi queue management.  The files ``txop.*`` and ``qos-txop.*`` are of interest for this task.
 * Channel access management.  Users should modify the files ``channel-access-manager.*``, which grant access to
   ``Txop`` and ``QosTxop``.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/doc/source/wifi-references.rst ns-3.34/src/wifi/doc/source/wifi-references.rst
--- ns-3.33/src/wifi/doc/source/wifi-references.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/doc/source/wifi-references.rst	2021-07-14 10:31:07.000000000 -0700
@@ -58,3 +58,9 @@
 .. [erceg2004] \ V. Erceg and L. Schumacher and P. Kyritsi, "Tgn channel models", IEEE 802.11-03/940r4, 2004.
 
 .. [porat2016] \ R. Porat et al., "11ax Evaluation Methodology", IEE P802.11 Wireless LANs, 11-14-0571r3, 2016. 
+
+.. [krotov2020rate] \ A. Krotov, A. Kiryanov, E. Khorov., `Rate Control With Spatial Reuse for Wi-Fi 6 Dense Deployments <https://doi.org/10.1109/ACCESS.2020.3023552>`__, IEEE Access, September 2020
+
+.. [magrin2021mu] \ D. Magrin, S. Avallone, S. Roy, and M. Zorzi, 'Validation of the ns-3 802.11ax OFDMA implementation', in Proceedings of WNS3 2021.
+
+.. [avallone2021wcm] \ S. Avallone, P. Imputato, G. Redieteab, C. Ghosh and S. Roy, "Will OFDMA Improve the Performance of 802.11 WiFi Networks?", in IEEE Wireless Communications Magazine, DOI: 10.1109/MWC.001.2000332, to appear.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/doc/source/wifi-testing.rst ns-3.34/src/wifi/doc/source/wifi-testing.rst
--- ns-3.33/src/wifi/doc/source/wifi-testing.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/doc/source/wifi-testing.rst	2021-07-14 10:31:07.000000000 -0700
@@ -291,3 +291,12 @@
    :align: center
 
    Bianchi throughput validation results for 802.11g 6 Mbps in infrastructure configuration
+
+Multi-user transmissions validation
+***********************************
+
+The implementation of the OFDMA support has been validated against a theoretical model [magrin2021mu]_ .
+
+A preliminary evaluation of the usage of OFDMA in 802.11ax, in terms of latency in non-saturated
+conditions, throughput in saturated conditions and transmission range with UL OFDMA, is provided
+in [avallone2021wcm]_ .
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/doc/source/wifi-user.rst ns-3.34/src/wifi/doc/source/wifi-user.rst
--- ns-3.33/src/wifi/doc/source/wifi-user.rst	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/doc/source/wifi-user.rst	2021-07-14 10:31:07.000000000 -0700
@@ -256,7 +256,6 @@
   WIFI_STANDARD_80211b,
   WIFI_STANDARD_80211g,
   WIFI_STANDARD_80211p,
-  WIFI_STANDARD_holland,
   WIFI_STANDARD_80211n_2_4GHZ,
   WIFI_STANDARD_80211n_5GHZ,
   WIFI_STANDARD_80211ac,
@@ -342,54 +341,56 @@
 The following channel numbers are well-defined for 5 GHz standards:
 
 .. table:: 5 GHz channel numbers
-    :width: 30 70
-.. tabularcolumns:: |p{3cm}|p{10cm}|
-+------------------+-------------------------------------------+
-| ``ChannelWidth`` | ``ChannelNumber``                         |
-+------------------+-------------------------------------------+
-| 20 MHz           | 36, 40, 44, 48, 52, 56, 60, 64, 100,      |
-|                  | 104, 108, 112, 116, 120, 124,             |
-|                  | 128, 132, 136, 140, 144,                  |
-|                  | 149, 153, 161, 165, 169                   |
-+------------------+-------------------------------------------+
-| 40 MHz           | 38, 46, 54, 62, 102, 110, 118, 126,       |
-|                  | 134, 142, 151, 159                        |
-+------------------+-------------------------------------------+
-| 80 MHz           | 42, 58, 106, 122, 138, 155                |
-+------------------+-------------------------------------------+
-| 160 MHz          | 50, 114                                   |
-+------------------+-------------------------------------------+
-| 10 MHz (802.11p) | 172, 174, 176, 178, 180, 182, 184         |
-+------------------+-------------------------------------------+
-| 5 MHz (802.11p)  | 171, 173, 175, 177, 179, 181, 183         |
-+------------------+-------------------------------------------+
+   :widths: 20 70
+
+   +------------------+-------------------------------------------+
+   | ``ChannelWidth`` | ``ChannelNumber``                         |
+   +------------------+-------------------------------------------+
+   | 20 MHz           | 36, 40, 44, 48, 52, 56, 60, 64, 100,      |
+   |                  | 104, 108, 112, 116, 120, 124,             |
+   |                  | 128, 132, 136, 140, 144,                  |
+   |                  | 149, 153, 161, 165, 169                   |
+   +------------------+-------------------------------------------+
+   | 40 MHz           | 38, 46, 54, 62, 102, 110, 118, 126,       |
+   |                  | 134, 142, 151, 159                        |
+   +------------------+-------------------------------------------+
+   | 80 MHz           | 42, 58, 106, 122, 138, 155                |
+   +------------------+-------------------------------------------+
+   | 160 MHz          | 50, 114                                   |
+   +------------------+-------------------------------------------+
+   | 10 MHz (802.11p) | 172, 174, 176, 178, 180, 182, 184         |
+   +------------------+-------------------------------------------+
+   | 5 MHz (802.11p)  | 171, 173, 175, 177, 179, 181, 183         |
+   +------------------+-------------------------------------------+
+
 
 The following channel numbers are well-defined for 6 GHz standards (802.11ax only):
 
 .. table:: 6 GHz channel numbers
-    :width: 30 70
-.. tabularcolumns:: |p{3cm}|p{10cm}|
-+------------------+-------------------------------------------+
-| ``ChannelWidth`` | ``ChannelNumber``                         |
-+------------------+-------------------------------------------+
-| 20 MHz           | 1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41,  |
-|                  | 45, 49, 53, 57, 61, 65, 69, 73, 77, 81,   |
-|                  | 85, 89, 93, 97, 101, 105, 109, 113, 117,  |
-|                  | 121, 125, 129, 133, 137, 141, 145, 149,   |
-|                  | 153, 157, 161, 165, 169, 173, 177, 181,   |
-|                  | 185, 189, 193, 197, 201, 205, 209, 213,   |
-|                  | 217, 221, 225, 229, 233                   |
-+------------------+-------------------------------------------+
-| 40 MHz           | 3, 11, 19, 27, 35, 43, 51, 59, 67, 75,    |
-|                  | 83, 91, 99, 107, 115, 123, 131, 139, 147, |
-|                  | 155, 163, 171, 179, 187, 195, 203, 211,   |
-|                  | 219, 227                                  |
-+------------------+-------------------------------------------+
-| 80 MHz           | 7, 23, 39, 55, 71, 87, 103, 119, 135,     |
-|                  | 151, 167, 183, 199, 215                   |
-+------------------+-------------------------------------------+
-| 160 MHz          | 15, 47, 79, 111, 143, 175, 207            |
-+------------------+-------------------------------------------+
+   :widths: 20 70
+
+   +------------------+-------------------------------------------+
+   | ``ChannelWidth`` | ``ChannelNumber``                         |
+   +------------------+-------------------------------------------+
+   | 20 MHz           | 1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41,  |
+   |                  | 45, 49, 53, 57, 61, 65, 69, 73, 77, 81,   |
+   |                  | 85, 89, 93, 97, 101, 105, 109, 113, 117,  |
+   |                  | 121, 125, 129, 133, 137, 141, 145, 149,   |
+   |                  | 153, 157, 161, 165, 169, 173, 177, 181,   |
+   |                  | 185, 189, 193, 197, 201, 205, 209, 213,   |
+   |                  | 217, 221, 225, 229, 233                   |
+   +------------------+-------------------------------------------+
+   | 40 MHz           | 3, 11, 19, 27, 35, 43, 51, 59, 67, 75,    |
+   |                  | 83, 91, 99, 107, 115, 123, 131, 139, 147, |
+   |                  | 155, 163, 171, 179, 187, 195, 203, 211,   |
+   |                  | 219, 227                                  |
+   +------------------+-------------------------------------------+
+   | 80 MHz           | 7, 23, 39, 55, 71, 87, 103, 119, 135,     |
+   |                  | 151, 167, 183, 199, 215                   |
+   +------------------+-------------------------------------------+
+   | 160 MHz          | 15, 47, 79, 111, 143, 175, 207            |
+   +------------------+-------------------------------------------+
+
 
 The channel number may be set either before or after creation of the
 WifiPhy object.  
@@ -550,23 +551,6 @@
 
 To create ad-hoc MAC instances, simply use ``ns3::AdhocWifiMac`` instead of ``ns3::StaWifiMac`` or ``ns3::ApWifiMac``.
 
-In infrastructure mode without QoS enabled, it is also possible to enable PCF support.
-The following code shows how to create a CF-pollable station::
-
-  WifiMacHelper wifiMacHelper;
-  wifiMacHelper.SetType ("ns3::StaWifiMac",
-                         "Ssid", SsidValue (ssid),
-                         "PcfSupported", BooleanValue (true));
-
-PCF also supports an option to change the maximum duration of the contention-free period (which must be a multiple of 1024 microseconds).
-The following code shows how to create an AP with a custom PCF configuration::
-
-  WifiMacHelper wifiMacHelper;
-  wifiMacHelper.SetType ("ns3::ApWifiMac",
-                         "Ssid", SsidValue (ssid),
-                         "PcfSupported", BooleanValue (true),
-                         "CfpMaxDuration", TimeValue (MicroSeconds (20480)));
-
 With QoS-enabled MAC models it is possible to work with traffic belonging to
 four different Access Categories (ACs): **AC_VO** for voice traffic,
 **AC_VI** for video traffic, **AC_BE** for best-effort
@@ -615,6 +599,22 @@
                           "BE_MaxAmsduSize", UintegerValue (7935),
                           "ActiveProbing", BooleanValue (false));
 
+802.11ax APs support sending multi-user frames via DL OFDMA and UL OFDMA if a Multi-User Scheduler is
+aggregated to the wifi MAC (by default no scheduler is aggregated). WifiMacHelper enables to aggregate
+a Multi-User Scheduler to an AP and set its parameters::
+
+    WifiMacHelper wifiMacHelper;
+    wifiMacHelper.SetMultiUserScheduler ("ns3::RrMultiUserScheduler",
+                                        "EnableUlOfdma", BooleanValue (true),
+                                        "EnableBsrp", BooleanValue (false));
+
+The Ack Manager is in charge of selecting the acknowledgment method among the three
+available methods (see section :ref:`wifi-mu-ack-sequences` ). The default ack manager
+enables to select the acknowledgment method, e.g.::
+
+    Config::SetDefault ("ns3::WifiDefaultAckManager::DlMuAckSequenceType",
+                       EnumValue (WifiAcknowledgment::DL_MU_AGGREGATE_TF));
+
 Selection of the Access Category (AC)
 +++++++++++++++++++++++++++++++++++++
 
@@ -790,10 +790,6 @@
 
  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (true));
 
-Furthermore, 802.11n provides an optional mode (Greenfield mode) to reduce preamble durations and which is only compatible with 802.11n devices. This mode is enabled as follows::
-
- htConfiguration->SetGreenfieldSupported (true);
-
 VHT configuration
 =================
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/examples/reference/Bianchi11a.m ns-3.34/src/wifi/examples/reference/Bianchi11a.m
--- ns-3.33/src/wifi/examples/reference/Bianchi11a.m	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/examples/reference/Bianchi11a.m	2021-07-14 10:31:07.000000000 -0700
@@ -1,59 +1,89 @@
-function [bianchi_result] = Bianchi11a(data_rate, ack_rate, difs)
-nA = [5:5:50];
-CWmin = 15;
-CWmax = 1023;
-L_DATA = 1500 * 8; % data size in bits
-L_ACK = 14 * 8; % ACK size in bits
-B = 1/(CWmin+1);
-EP = L_DATA/(1-B);
-T_GI = 800e-9; % guard interval in seconds
-T_SYMBOL = 3.2e-6 + T_GI; % symbol duration in seconds
-T_LPHY = 20e-6; % PHY preamble & header duration in seconds
-L_SERVICE = 16; % service field length in bits
-L_TAIL = 6; % tail lengthh in bits
-L_MAC = (24 + 4) * 8; % MAC header size in bits
-L_APP_HDR = 8 * 6; % bits added by the upper layer(s)
-T_SIFS = 16e-6;
-T_DIFS = 34e-6;
-T_SLOT = 9e-6;
-delta = 1e-7;
-
-N_DBPS = data_rate * T_SYMBOL; % number of data bits per OFDM symbol
-N_SYMBOLS = ceil((L_SERVICE + L_MAC + L_DATA + L_APP_HDR + L_TAIL)/N_DBPS);
-T_DATA = T_LPHY + (T_SYMBOL * N_SYMBOLS);
-
-N_DBPS = ack_rate * T_SYMBOL; % number of data bits per OFDM symbol
-N_SYMBOLS = ceil((L_SERVICE + L_ACK + L_TAIL)/N_DBPS);
-T_ACK = T_LPHY + (T_SYMBOL * N_SYMBOLS);
-
-T_s = T_DATA + T_SIFS + T_ACK + T_DIFS;
-if difs == 1 %DIFS
-    T_C = T_DATA + T_DIFS;
-else %EIFS
-    T_s = T_DATA + T_SIFS + T_ACK + T_DIFS + delta;
-    T_C = T_DATA + T_DIFS + T_SIFS + T_ACK + delta;
-end
-T_S = T_s/(1-B) + T_SLOT;
-S_bianchi = zeros(size(nA));
-for j = 1:length(nA)
-    n = nA(j)*1;
-    W = CWmin + 1;
-    m = log2((CWmax + 1)/(CWmin + 1));
-    tau1 = linspace(0, 1, 1e4);
-    p = 1 - (1 - tau1).^(n - 1);
-    ps = p*0;
-
-    for i = 0:m-1
-        ps = ps + (2*p).^i;
-    end
-    taup = 2./(1 + W + p.*W.*ps);
-    [a,b] = min(abs(tau1 - taup));
-    tau = taup(b);
-
-    Ptr = 1 - (1 - tau)^n;
-    Ps = n*tau*(1 - tau)^(n - 1)/Ptr;
-
-    S_bianchi(j) = Ps*Ptr*EP/((1-Ptr)*T_SLOT+Ptr*Ps*T_S+Ptr*(1-Ps)*T_C)/1e6;
-end
-
-bianchi_result = S_bianchi;
+% Copyright 2020 University of Washington
+% 
+% Redistribution and use in source and binary forms, with or without
+% modification, are permitted provided that the following conditions are met:
+% 
+% 1. Redistributions of source code must retain the above copyright notice,
+% this list of conditions and the following disclaimer.
+% 
+% 2. Redistributions in binary form must reproduce the above copyright notice,
+% this list of conditions and the following disclaimer in the documentation
+% and/or other materials provided with the distribution.
+% 
+% 3. Neither the name of the copyright holder nor the names of its contributors
+% may be used to endorse or promote products derived from this software without
+% specific prior written permission.
+% 
+% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+% POSSIBILITY OF SUCH DAMAGE.
+%
+% Co-authored by Leonardo Lanante, Hao Yin, and Sebastien Deronne
+
+function [bianchi_result] = Bianchi11a(data_rate, ack_rate, difs)
+nA = [5:5:50];
+CWmin = 15;
+CWmax = 1023;
+L_DATA = 1500 * 8; % data size in bits
+L_ACK = 14 * 8; % ACK size in bits
+B = 1/(CWmin+1);
+EP = L_DATA/(1-B);
+T_GI = 800e-9; % guard interval in seconds
+T_SYMBOL = 3.2e-6 + T_GI; % symbol duration in seconds
+T_LPHY = 20e-6; % PHY preamble & header duration in seconds
+L_SERVICE = 16; % service field length in bits
+L_TAIL = 6; % tail lengthh in bits
+L_MAC = (24 + 4) * 8; % MAC header size in bits
+L_APP_HDR = 8 * 6; % bits added by the upper layer(s)
+T_SIFS = 16e-6;
+T_DIFS = 34e-6;
+T_SLOT = 9e-6;
+delta = 1e-7;
+
+N_DBPS = data_rate * T_SYMBOL; % number of data bits per OFDM symbol
+N_SYMBOLS = ceil((L_SERVICE + L_MAC + L_DATA + L_APP_HDR + L_TAIL)/N_DBPS);
+T_DATA = T_LPHY + (T_SYMBOL * N_SYMBOLS);
+
+N_DBPS = ack_rate * T_SYMBOL; % number of data bits per OFDM symbol
+N_SYMBOLS = ceil((L_SERVICE + L_ACK + L_TAIL)/N_DBPS);
+T_ACK = T_LPHY + (T_SYMBOL * N_SYMBOLS);
+
+T_s = T_DATA + T_SIFS + T_ACK + T_DIFS;
+if difs == 1 %DIFS
+    T_C = T_DATA + T_DIFS;
+else %EIFS
+    T_s = T_DATA + T_SIFS + T_ACK + T_DIFS + delta;
+    T_C = T_DATA + T_DIFS + T_SIFS + T_ACK + delta;
+end
+T_S = T_s/(1-B) + T_SLOT;
+S_bianchi = zeros(size(nA));
+for j = 1:length(nA)
+    n = nA(j)*1;
+    W = CWmin + 1;
+    m = log2((CWmax + 1)/(CWmin + 1));
+    tau1 = linspace(0, 1, 1e4);
+    p = 1 - (1 - tau1).^(n - 1);
+    ps = p*0;
+
+    for i = 0:m-1
+        ps = ps + (2*p).^i;
+    end
+    taup = 2./(1 + W + p.*W.*ps);
+    [a,b] = min(abs(tau1 - taup));
+    tau = taup(b);
+
+    Ptr = 1 - (1 - tau)^n;
+    Ps = n*tau*(1 - tau)^(n - 1)/Ptr;
+
+    S_bianchi(j) = Ps*Ptr*EP/((1-Ptr)*T_SLOT+Ptr*Ps*T_S+Ptr*(1-Ps)*T_C)/1e6;
+end
+
+bianchi_result = S_bianchi;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/examples/reference/bianchi11ax.py ns-3.34/src/wifi/examples/reference/bianchi11ax.py
--- ns-3.33/src/wifi/examples/reference/bianchi11ax.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/examples/reference/bianchi11ax.py	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,169 @@
+#
+# Copyright 2020 University of Washington
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation;
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+# Authors:  Hao Yin and Sebastien Deronne
+# 
+import numpy as np
+import math
+
+
+def bianchi_ax(data_rate, ack_rate, k, difs):
+    # Parameters for 11ax
+    nA = np.linspace(5, 50, 10)
+    CWmin = 15 
+    CWmax = 1023 
+    L_DATA = 1500 * 8 # data size in bits
+    L_ACK = 14 * 8    # ACK size in bits
+    #B = 1/(CWmin+1) 
+    B=0 
+    EP = L_DATA/(1-B)
+    T_GI = 800e-9                  # guard interval in seconds
+    T_SYMBOL_ACK = 4e-6            # symbol duration in seconds (for ACK)
+    T_SYMBOL_DATA = 12.8e-6 + T_GI # symbol duration in seconds (for DATA)
+    T_PHY_ACK = 20e-6              # PHY preamble & header duration in seconds (for ACK)
+    T_PHY_DATA = 44e-6             # PHY preamble & header duration in seconds (for DATA)
+    L_SERVICE = 16                 # service field length in bits
+    L_TAIL = 6                     # tail lengthh in bits
+    L_MAC = (30) * 8               # MAC header size in bits
+    L_APP_HDR = 8 * 8              # bits added by the upper layer(s)
+    T_SIFS = 16e-6 
+    T_DIFS = 34e-6 
+    T_SLOT = 9e-6 
+    delta = 1e-7 
+
+    Aggregation_Type = 'A_MPDU'   #A_MPDU or A_MSDU (HYBRID not fully supported)
+    K_MSDU = 1 
+    K_MPDU = k 
+    L_MPDU_HEADER = 4
+    L_MSDU_HEADER = 14 * 8 
+    if (k <= 1):
+        Aggregation_Type = 'NONE' 
+
+    N_DBPS = data_rate * T_SYMBOL_DATA   # number of data bits per OFDM symbol
+
+    if (Aggregation_Type == 'NONE'):
+        N_SYMBOLS = math.ceil((L_SERVICE + (L_MAC + L_DATA + L_APP_HDR) + L_TAIL)/N_DBPS)
+        T_DATA = T_PHY_DATA + (T_SYMBOL_DATA * N_SYMBOLS)
+        K_MPDU = 1
+        K_MSDU = 1 
+
+    if (Aggregation_Type == 'A_MSDU'):
+        N_SYMBOLS = math.ceil((L_SERVICE + K_MPDU*(L_MAC + L_MPDU_HEADER + K_MSDU*(L_MSDU_HEADER + L_DATA + L_APP_HDR)) + L_TAIL)/N_DBPS)
+        T_DATA = T_PHY_DATA + (T_SYMBOL_DATA * N_SYMBOLS)
+
+    if (Aggregation_Type == 'A_MPDU'):
+        N_SYMBOLS = math.ceil((L_SERVICE + K_MPDU*(L_MAC + L_MPDU_HEADER + L_DATA + L_APP_HDR) + L_TAIL)/N_DBPS)
+        T_DATA = T_PHY_DATA + (T_SYMBOL_DATA * N_SYMBOLS)
+
+    #Calculate ACK Duration
+    N_DBPS = ack_rate * T_SYMBOL_ACK   # number of data bits per OFDM symbol
+    N_SYMBOLS = math.ceil((L_SERVICE + L_ACK + L_TAIL)/N_DBPS)
+    T_ACK = T_PHY_ACK + (T_SYMBOL_ACK * N_SYMBOLS)
+
+    T_s = T_DATA + T_SIFS + T_ACK + T_DIFS 
+    if difs == 1: #DIFS
+        T_C = T_DATA + T_DIFS 
+    else:
+        T_s = T_DATA + T_SIFS + T_ACK + T_DIFS + delta 
+        T_C = T_DATA + T_DIFS + T_SIFS + T_ACK + delta 
+
+    T_S = T_s/(1-B) + T_SLOT 
+
+    S_bianchi = np.zeros(len(nA)) 
+    for j in range(len(nA)):
+        n = nA[j]*1 
+        W = CWmin + 1 
+        m = math.log2((CWmax + 1)/(CWmin + 1)) 
+        tau1 = np.linspace(0, 0.1, 100000)  
+        p = 1 - np.power((1 - tau1),(n - 1))
+        ps = p*0 
+
+        for i in range(int(m)):
+            ps = ps + np.power(2*p, i) 
+
+        taup = 2./(1 + W + p*W*ps) 
+        b = np.argmin(np.abs(tau1 - taup))
+        tau = taup[b] 
+
+        Ptr = 1 - math.pow((1 - tau), int(n))
+        Ps = n*tau*math.pow((1 - tau), int(n-1))/Ptr
+
+        S_bianchi[j] = K_MSDU*K_MPDU*Ps*Ptr*EP/((1-Ptr)*T_SLOT+Ptr*Ps*T_S+Ptr*(1-Ps)*T_C)/1e6 
+
+    bianchi_result = S_bianchi
+    return bianchi_result
+
+def str_result(bianchi_result, mcs, bw):
+    str_bianchi = '    {' + '\"HeMcs{:d}'.format(mcs) + '_{:d}MHz\"'.format(bw) + ', {\n'
+    for  i in range (len(bianchi_result)):
+        str_tmp = '        {' + '{:d}, {:.4f}'.format(5*(i+1), bianchi_result[i]) +'},\n'
+        str_bianchi  = str_bianchi + str_tmp
+    str_bianchi = str_bianchi + "    }},\n"
+    print(str_bianchi)
+    return str_bianchi
+
+# Settings for different MCS and mode
+data_rates_20MHz = [8.603e6, 17.206e6, 25.8e6, 34.4e6, 51.5e6, 68.8e6, 77.4e6, 86e6, 103.2e6, 114.7e6, 129e6, 143.4e6]
+ack_rates_20MHz = [6e6, 12e6, 12e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6]
+data_rates_40MHz = [17.2e6, 34.4e6, 51.5e6, 68.8e6, 103.2e6, 137.6e6, 154.9e6, 172.1e6, 206.5e6, 229.4e6, 258.1e6, 286.8e6]
+ack_rates_40MHz = [6e6, 12e6, 12e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6]
+data_rates_80MHz = [36e6, 72.1e6, 108.1e6, 144.1e6, 216.2e6, 288.2e6, 324.3e6, 360.3e6, 432.4e6, 480.4e6, 540.4e6, 600.5e6]
+ack_rates_80MHz = [6e6, 12e6, 12e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6]
+data_rates_160MHz = [72.1e6, 144.1e6, 216.2e6, 288.2e6, 432.4e6, 576.5e6, 648.5e6, 720.6e6, 864.7e6, 960.8e6, 1080.9e6, 1201e6]
+ack_rates_160MHz = [6e6, 12e6, 12e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6, 24e6]
+
+# Generate results with frame aggregation disabled
+k = 1
+
+difs = 1
+fo = open("bianchi_11ax_difs.txt", "w")
+for i in range(len(data_rates_20MHz)):
+    bianchi_result = bianchi_ax(data_rates_20MHz[i], ack_rates_20MHz[i], k, difs)
+    str_s = str_result(bianchi_result, i, 20)
+    fo.write(str_s)
+for i in range(len(data_rates_40MHz)):
+    bianchi_result = bianchi_ax(data_rates_40MHz[i], ack_rates_40MHz[i], k, difs)
+    str_s = str_result(bianchi_result, i, 40)
+    fo.write(str_s)
+for i in range(len(data_rates_80MHz)):
+    bianchi_result = bianchi_ax(data_rates_80MHz[i], ack_rates_80MHz[i], k, difs)
+    str_s = str_result(bianchi_result, i, 80)
+    fo.write(str_s)
+for i in range(len(data_rates_160MHz)):
+    bianchi_result = bianchi_ax(data_rates_160MHz[i], ack_rates_160MHz[i], k, difs)
+    str_s = str_result(bianchi_result, i, 160)
+    fo.write(str_s)
+fo.close()
+
+difs = 0
+fo = open("bianchi_11ax_eifs.txt", "w")
+for i in range(len(data_rates_20MHz)):
+    bianchi_result = bianchi_ax(data_rates_20MHz[i], ack_rates_20MHz[i], k, difs)
+    str_s = str_result(bianchi_result, i, 20)
+    fo.write(str_s)
+for i in range(len(data_rates_40MHz)):
+    bianchi_result = bianchi_ax(data_rates_40MHz[i], ack_rates_40MHz[i], k, difs)
+    str_s = str_result(bianchi_result, i, 40)
+    fo.write(str_s)
+for i in range(len(data_rates_80MHz)):
+    bianchi_result = bianchi_ax(data_rates_80MHz[i], ack_rates_80MHz[i], k, difs)
+    str_s = str_result(bianchi_result, i, 80)
+    fo.write(str_s)
+for i in range(len(data_rates_160MHz)):
+    bianchi_result = bianchi_ax(data_rates_160MHz[i], ack_rates_160MHz[i], k, difs)
+    str_s = str_result(bianchi_result, i, 160)
+    fo.write(str_s)
+fo.close()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/examples/reference/Bianchi11b.m ns-3.34/src/wifi/examples/reference/Bianchi11b.m
--- ns-3.33/src/wifi/examples/reference/Bianchi11b.m	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/examples/reference/Bianchi11b.m	2021-07-14 10:31:07.000000000 -0700
@@ -1,44 +1,74 @@
-function [bianchi_result] = Bianchi11b(txduration, ack, difs)
-nA = [5:5:50];
-CWmin = 31;
-CWmax = 1023;
-eP = 1500*8; 
-B = 1/(CWmin + 1);
-EP = eP/(1 - B);   
-T_ACK = ack;  %txDuration value from WiFiPhy.cc
-T_AMPDU = txduration; %txDuration value from WiFiPhy.cc
-T_SIFS = 10e-6;
-T_DIFS = 50e-6;
-T_SLOT = 20e-6;
-delta = 1e-7;
-T_s = T_AMPDU + T_SIFS + T_ACK + T_DIFS;
-if difs == 1 %DIFS
-    T_C = T_AMPDU + T_DIFS;
-else %EIFS
-    T_s = T_AMPDU + T_SIFS + T_ACK + T_DIFS + delta;
-    T_C = T_AMPDU + T_DIFS + T_SIFS + T_ACK + delta;
-end
-T_S = T_s/(1 - B) + T_SLOT;
-S_bianchi = zeros(size(nA));
-for j = 1:length(nA)
-    n = nA(j)*1;
-    W = CWmin + 1;
-    m = log2((CWmax + 1)/(CWmin + 1));
-    tau1 = linspace(0, 1, 1e4);
-    p=1 - (1 - tau1).^(n - 1);
-    ps = p*0;
-
-    for i = 0:m-1
-        ps = ps + (2*p).^i;
-    end
-    taup = 2./(1 + W + p.*W.*ps);
-    [a,b] = min(abs(tau1 - taup));
-    tau = taup(b);
-
-    Ptr = 1 - (1 - tau)^n;
-    Ps=n*tau*(1 - tau)^(n - 1)/Ptr;
-
-    S_bianchi(j) = Ps*Ptr*EP/((1-Ptr)*T_SLOT+Ptr*Ps*T_S+Ptr*(1-Ps)*T_C)/1e6;
-end
-
-bianchi_result = S_bianchi;
+% Copyright 2020 University of Washington
+% 
+% Redistribution and use in source and binary forms, with or without
+% modification, are permitted provided that the following conditions are met:
+% 
+% 1. Redistributions of source code must retain the above copyright notice,
+% this list of conditions and the following disclaimer.
+% 
+% 2. Redistributions in binary form must reproduce the above copyright notice,
+% this list of conditions and the following disclaimer in the documentation
+% and/or other materials provided with the distribution.
+% 
+% 3. Neither the name of the copyright holder nor the names of its contributors
+% may be used to endorse or promote products derived from this software without
+% specific prior written permission.
+% 
+% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+% POSSIBILITY OF SUCH DAMAGE.
+%
+% Co-authored by Leonardo Lanante, Hao Yin, and Sebastien Deronne
+
+function [bianchi_result] = Bianchi11b(txduration, ack, difs)
+nA = [5:5:50];
+CWmin = 31;
+CWmax = 1023;
+eP = 1500*8; 
+B = 1/(CWmin + 1);
+EP = eP/(1 - B);   
+T_ACK = ack;  %txDuration value from WiFiPhy.cc
+T_AMPDU = txduration; %txDuration value from WiFiPhy.cc
+T_SIFS = 10e-6;
+T_DIFS = 50e-6;
+T_SLOT = 20e-6;
+delta = 1e-7;
+T_s = T_AMPDU + T_SIFS + T_ACK + T_DIFS;
+if difs == 1 %DIFS
+    T_C = T_AMPDU + T_DIFS;
+else %EIFS
+    T_s = T_AMPDU + T_SIFS + T_ACK + T_DIFS + delta;
+    T_C = T_AMPDU + T_DIFS + T_SIFS + T_ACK + delta;
+end
+T_S = T_s/(1 - B) + T_SLOT;
+S_bianchi = zeros(size(nA));
+for j = 1:length(nA)
+    n = nA(j)*1;
+    W = CWmin + 1;
+    m = log2((CWmax + 1)/(CWmin + 1));
+    tau1 = linspace(0, 1, 1e4);
+    p=1 - (1 - tau1).^(n - 1);
+    ps = p*0;
+
+    for i = 0:m-1
+        ps = ps + (2*p).^i;
+    end
+    taup = 2./(1 + W + p.*W.*ps);
+    [a,b] = min(abs(tau1 - taup));
+    tau = taup(b);
+
+    Ptr = 1 - (1 - tau)^n;
+    Ps=n*tau*(1 - tau)^(n - 1)/Ptr;
+
+    S_bianchi(j) = Ps*Ptr*EP/((1-Ptr)*T_SLOT+Ptr*Ps*T_S+Ptr*(1-Ps)*T_C)/1e6;
+end
+
+bianchi_result = S_bianchi;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/examples/reference/Bianchi11g.m ns-3.34/src/wifi/examples/reference/Bianchi11g.m
--- ns-3.33/src/wifi/examples/reference/Bianchi11g.m	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/examples/reference/Bianchi11g.m	2021-07-14 10:31:07.000000000 -0700
@@ -1,60 +1,90 @@
-function [bianchi_result] = Bianchi11g(data_rate, ack_rate, difs)
-nA = [5:5:50];
-CWmin = 15;
-CWmax = 1023;
-L_DATA = 1500 * 8; % data size in bits
-L_ACK = 14 * 8; % ACK size in bits
-B = 1/(CWmin+1);
-EP = L_DATA/(1-B);   
-T_GI = 800e-9; % guard interval in seconds
-T_SYMBOL = 3.2e-6 + T_GI; % symbol duration in seconds
-T_LPHY = 20e-6; % PHY preamble & header duration in seconds
-T_SIG_EXT = 6e-6; % signal extension duration in seconds
-L_SERVICE = 16; % service field length in bits
-L_TAIL = 6; % tail lengthh in bits
-L_MAC = (24 + 4) * 8; % MAC header size in bits
-L_APP_HDR = 8 * 6; % bits added by the upper layer(s)
-T_SIFS = 10e-6;
-T_DIFS = 28e-6;
-T_SLOT = 9e-6;
-delta = 1e-7;
-
-N_DBPS = data_rate * T_SYMBOL; % number of data bits per OFDM symbol
-N_SYMBOLS = ceil((L_SERVICE + L_MAC + L_DATA + L_APP_HDR + L_TAIL)/N_DBPS);
-T_DATA = T_LPHY + (T_SYMBOL * N_SYMBOLS) + T_SIG_EXT;
-
-N_DBPS = ack_rate * T_SYMBOL; % number of data bits per OFDM symbol
-N_SYMBOLS = ceil((L_SERVICE + L_ACK + L_TAIL)/N_DBPS);
-T_ACK = T_LPHY + (T_SYMBOL * N_SYMBOLS) + T_SIG_EXT;
-
-T_s = T_DATA + T_SIFS + T_ACK + T_DIFS;
-if difs == 1 %DIFS
-    T_C = T_DATA + T_DIFS;
-else %EIFS
-    T_s = T_DATA + T_SIFS + T_ACK + T_DIFS + delta;
-    T_C = T_DATA + T_DIFS + T_SIFS + T_ACK + delta;
-end
-T_S = T_s/(1-B) + T_SLOT;
-S_bianchi = zeros(size(nA));
-for j = 1:length(nA)
-    n = nA(j)*1;
-    W = CWmin + 1;
-    m = log2((CWmax + 1)/(CWmin + 1));
-    tau1 = linspace(0, 1, 1e4);
-    p = 1 - (1 - tau1).^(n - 1);
-    ps = p*0;
-
-    for i = 0:m-1
-        ps = ps + (2*p).^i;
-    end
-    taup = 2./(1 + W + p.*W.*ps);
-    [a,b] = min(abs(tau1 - taup));
-    tau = taup(b);
-
-    Ptr = 1 - (1 - tau)^n;
-    Ps = n*tau*(1 - tau)^(n - 1)/Ptr;
-
-    S_bianchi(j) = Ps*Ptr*EP/((1-Ptr)*T_SLOT+Ptr*Ps*T_S+Ptr*(1-Ps)*T_C)/1e6;
-end
-
-bianchi_result = S_bianchi;
+% Copyright 2020 University of Washington
+% 
+% Redistribution and use in source and binary forms, with or without
+% modification, are permitted provided that the following conditions are met:
+% 
+% 1. Redistributions of source code must retain the above copyright notice,
+% this list of conditions and the following disclaimer.
+% 
+% 2. Redistributions in binary form must reproduce the above copyright notice,
+% this list of conditions and the following disclaimer in the documentation
+% and/or other materials provided with the distribution.
+% 
+% 3. Neither the name of the copyright holder nor the names of its contributors
+% may be used to endorse or promote products derived from this software without
+% specific prior written permission.
+% 
+% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+% POSSIBILITY OF SUCH DAMAGE.
+%
+% Co-authored by Leonardo Lanante, Hao Yin, and Sebastien Deronne
+
+function [bianchi_result] = Bianchi11g(data_rate, ack_rate, difs)
+nA = [5:5:50];
+CWmin = 15;
+CWmax = 1023;
+L_DATA = 1500 * 8; % data size in bits
+L_ACK = 14 * 8; % ACK size in bits
+B = 1/(CWmin+1);
+EP = L_DATA/(1-B);   
+T_GI = 800e-9; % guard interval in seconds
+T_SYMBOL = 3.2e-6 + T_GI; % symbol duration in seconds
+T_LPHY = 20e-6; % PHY preamble & header duration in seconds
+T_SIG_EXT = 6e-6; % signal extension duration in seconds
+L_SERVICE = 16; % service field length in bits
+L_TAIL = 6; % tail lengthh in bits
+L_MAC = (24 + 4) * 8; % MAC header size in bits
+L_APP_HDR = 8 * 6; % bits added by the upper layer(s)
+T_SIFS = 10e-6;
+T_DIFS = 28e-6;
+T_SLOT = 9e-6;
+delta = 1e-7;
+
+N_DBPS = data_rate * T_SYMBOL; % number of data bits per OFDM symbol
+N_SYMBOLS = ceil((L_SERVICE + L_MAC + L_DATA + L_APP_HDR + L_TAIL)/N_DBPS);
+T_DATA = T_LPHY + (T_SYMBOL * N_SYMBOLS) + T_SIG_EXT;
+
+N_DBPS = ack_rate * T_SYMBOL; % number of data bits per OFDM symbol
+N_SYMBOLS = ceil((L_SERVICE + L_ACK + L_TAIL)/N_DBPS);
+T_ACK = T_LPHY + (T_SYMBOL * N_SYMBOLS) + T_SIG_EXT;
+
+T_s = T_DATA + T_SIFS + T_ACK + T_DIFS;
+if difs == 1 %DIFS
+    T_C = T_DATA + T_DIFS;
+else %EIFS
+    T_s = T_DATA + T_SIFS + T_ACK + T_DIFS + delta;
+    T_C = T_DATA + T_DIFS + T_SIFS + T_ACK + delta;
+end
+T_S = T_s/(1-B) + T_SLOT;
+S_bianchi = zeros(size(nA));
+for j = 1:length(nA)
+    n = nA(j)*1;
+    W = CWmin + 1;
+    m = log2((CWmax + 1)/(CWmin + 1));
+    tau1 = linspace(0, 1, 1e4);
+    p = 1 - (1 - tau1).^(n - 1);
+    ps = p*0;
+
+    for i = 0:m-1
+        ps = ps + (2*p).^i;
+    end
+    taup = 2./(1 + W + p.*W.*ps);
+    [a,b] = min(abs(tau1 - taup));
+    tau = taup(b);
+
+    Ptr = 1 - (1 - tau)^n;
+    Ps = n*tau*(1 - tau)^(n - 1)/Ptr;
+
+    S_bianchi(j) = Ps*Ptr*EP/((1-Ptr)*T_SLOT+Ptr*Ps*T_S+Ptr*(1-Ps)*T_C)/1e6;
+end
+
+bianchi_result = S_bianchi;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/examples/reference/generate_bianchi.m ns-3.34/src/wifi/examples/reference/generate_bianchi.m
--- ns-3.33/src/wifi/examples/reference/generate_bianchi.m	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/examples/reference/generate_bianchi.m	2021-07-14 10:31:07.000000000 -0700
@@ -1,426 +1,456 @@
-clear;
-
-%11a DIFS
-fid = fopen('bianchi_11a_difs.txt', 'wt');
-nA = [5:5:50];
-
-%6Mbps
-data_rate = 6e6;
-ack_rate = 6e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
-fprintf(fid, "// 6 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%9Mbps
-data_rate = 9e6;
-ack_rate = 6e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
-fprintf(fid, "// 9 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%12Mbps
-data_rate = 12e6;
-ack_rate = 12e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
-fprintf(fid, "// 12 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%18Mbps
-data_rate = 18e6;
-ack_rate = 12e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
-fprintf(fid, "// 18 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%24Mbps
-data_rate = 24e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
-fprintf(fid, "// 24 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%36Mbps
-data_rate = 36e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
-fprintf(fid, "// 36 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%48Mbps
-data_rate = 48e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
-fprintf(fid, "// 48 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%54Mbps
-data_rate = 54e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
-fprintf(fid, "// 54 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-fclose(fid);
-
-%11a EIFS
-fid = fopen('bianchi_11a_eifs.txt', 'wt');
-
-%6Mbps
-data_rate = 6e6;
-ack_rate = 6e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
-fprintf(fid, "// 6 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%9Mbps
-data_rate = 9e6;
-ack_rate = 6e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
-fprintf(fid, "// 9 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%12Mbps
-data_rate = 12e6;
-ack_rate = 12e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
-fprintf(fid, "// 12 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%18Mbps
-data_rate = 18e6;
-ack_rate = 12e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
-fprintf(fid, "// 18 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%24Mbps
-data_rate = 24e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
-fprintf(fid, "// 24 Mbps - TC with EIFS\n");
-for k=1:10
-fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%36Mbps
-data_rate = 36e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
-fprintf(fid, "// 36 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%48Mbps
-data_rate = 48e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
-fprintf(fid, "// 48 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%54Mbps
-data_rate = 54e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
-fprintf(fid, "// 54 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-fclose(fid);
-
-
-%11g DIFS
-fid = fopen('bianchi_11g_difs.txt', 'wt');
-
-%6Mbps
-data_rate = 6e6;
-ack_rate = 6e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
-fprintf(fid, "// 6 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%9Mbps
-data_rate = 9e6;
-ack_rate = 6e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
-fprintf(fid, "// 9 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%12Mbps
-data_rate = 12e6;
-ack_rate = 12e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
-fprintf(fid, "// 12 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%18Mbps
-data_rate = 18e6;
-ack_rate = 12e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
-fprintf(fid, "// 18 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%24Mbps
-data_rate = 24e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
-fprintf(fid, "// 24 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%36Mbps
-data_rate = 36e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
-fprintf(fid, "// 36 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%48Mbps
-data_rate = 48e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
-fprintf(fid, "// 48 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%54Mbps
-data_rate = 54e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
-fprintf(fid, "// 54 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-fclose(fid);
-
-%11g EIFS
-fid = fopen('bianchi_11g_eifs.txt', 'wt');
-
-%6Mbps
-data_rate = 6e6;
-ack_rate = 6e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
-fprintf(fid, "// 6 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%9Mbps
-data_rate = 9e6;
-ack_rate = 6e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
-fprintf(fid, "// 9 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%12Mbps
-data_rate = 12e6;
-ack_rate = 12e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
-fprintf(fid, "// 12 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%18Mbps
-data_rate = 18e6;
-ack_rate = 12e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
-fprintf(fid, "// 18 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%24Mbps
-data_rate = 24e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
-fprintf(fid, "// 24 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%36Mbps
-data_rate = 36e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
-fprintf(fid, "// 36 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%48Mbps
-data_rate = 48e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
-fprintf(fid, "// 48 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%54Mbps
-data_rate = 54e6;
-ack_rate = 24e6;
-[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
-fprintf(fid, "// 54 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-fclose(fid);
-
-
-%11b DIFS
-fid = fopen('bianchi_11b_difs.txt', 'wt');
-
-%1Mbps
-txduration = 12480e-6;
-ack = 304e-6;
-[bianchi_result] = Bianchi11b(txduration, ack, 1);
-fprintf(fid, "// 1 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%2Mbps
-txduration = 6336e-6;
-ack = 248e-6;
-[bianchi_result] = Bianchi11b(txduration, ack, 1);
-fprintf(fid, "// 2 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%5.5Mbps
-txduration = 2427e-6;
-ack = 248e-6;
-[bianchi_result] = Bianchi11b (txduration, ack, 1);
-fprintf(fid, "// 5.5 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%11Mbps
-txduration = 1310e-6;
-ack = 248e-6;
-[bianchi_result] = Bianchi11b (txduration, ack, 1);
-fprintf(fid, "// 11 Mbps - TC with DIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%11b EIFS
-fid = fopen ('bianchi_11b_eifs.txt', 'wt');
-
-%1Mbps
-txduration = 12480e-6;
-ack = 304e-6;
-[bianchi_result] = Bianchi11b (txduration, ack, 0);
-fprintf (fid, "// 1 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf (fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf (fid, "\n");
-
-%2Mbps
-txduration = 6336e-6;
-ack = 248e-6;
-[bianchi_result] = Bianchi11b(txduration, ack, 0);
-fprintf(fid, "// 2 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%5.5Mbps
-txduration = 2427e-6;
-ack = 248e-6;
-[bianchi_result] = Bianchi11b(txduration, ack, 0);
-fprintf(fid, "// 5.5 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
-
-%11Mbps
-txduration = 1310e-6;
-ack = 248e-6;
-[bianchi_result] = Bianchi11b(txduration, ack, 0);
-fprintf(fid, "// 11 Mbps - TC with EIFS\n");
-for k=1:10
-    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
-end
-fprintf(fid, "\n");
+% Copyright 2020 University of Washington
+% 
+% Redistribution and use in source and binary forms, with or without
+% modification, are permitted provided that the following conditions are met:
+% 
+% 1. Redistributions of source code must retain the above copyright notice,
+% this list of conditions and the following disclaimer.
+% 
+% 2. Redistributions in binary form must reproduce the above copyright notice,
+% this list of conditions and the following disclaimer in the documentation
+% and/or other materials provided with the distribution.
+% 
+% 3. Neither the name of the copyright holder nor the names of its contributors
+% may be used to endorse or promote products derived from this software without
+% specific prior written permission.
+% 
+% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+% POSSIBILITY OF SUCH DAMAGE.
+%
+% Co-authored by Leonardo Lanante, Hao Yin, and Sebastien Deronne
+
+clear;
+
+%11a DIFS
+fid = fopen('bianchi_11a_difs.txt', 'wt');
+nA = [5:5:50];
+
+%6Mbps
+data_rate = 6e6;
+ack_rate = 6e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
+fprintf(fid, "// 6 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%9Mbps
+data_rate = 9e6;
+ack_rate = 6e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
+fprintf(fid, "// 9 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%12Mbps
+data_rate = 12e6;
+ack_rate = 12e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
+fprintf(fid, "// 12 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%18Mbps
+data_rate = 18e6;
+ack_rate = 12e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
+fprintf(fid, "// 18 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%24Mbps
+data_rate = 24e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
+fprintf(fid, "// 24 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%36Mbps
+data_rate = 36e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
+fprintf(fid, "// 36 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%48Mbps
+data_rate = 48e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
+fprintf(fid, "// 48 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%54Mbps
+data_rate = 54e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 1);
+fprintf(fid, "// 54 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+fclose(fid);
+
+%11a EIFS
+fid = fopen('bianchi_11a_eifs.txt', 'wt');
+
+%6Mbps
+data_rate = 6e6;
+ack_rate = 6e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
+fprintf(fid, "// 6 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%9Mbps
+data_rate = 9e6;
+ack_rate = 6e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
+fprintf(fid, "// 9 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%12Mbps
+data_rate = 12e6;
+ack_rate = 12e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
+fprintf(fid, "// 12 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%18Mbps
+data_rate = 18e6;
+ack_rate = 12e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
+fprintf(fid, "// 18 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%24Mbps
+data_rate = 24e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
+fprintf(fid, "// 24 Mbps - TC with EIFS\n");
+for k=1:10
+fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%36Mbps
+data_rate = 36e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
+fprintf(fid, "// 36 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%48Mbps
+data_rate = 48e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
+fprintf(fid, "// 48 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%54Mbps
+data_rate = 54e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11a(data_rate, ack_rate, 0);
+fprintf(fid, "// 54 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+fclose(fid);
+
+
+%11g DIFS
+fid = fopen('bianchi_11g_difs.txt', 'wt');
+
+%6Mbps
+data_rate = 6e6;
+ack_rate = 6e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
+fprintf(fid, "// 6 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%9Mbps
+data_rate = 9e6;
+ack_rate = 6e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
+fprintf(fid, "// 9 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%12Mbps
+data_rate = 12e6;
+ack_rate = 12e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
+fprintf(fid, "// 12 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%18Mbps
+data_rate = 18e6;
+ack_rate = 12e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
+fprintf(fid, "// 18 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%24Mbps
+data_rate = 24e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
+fprintf(fid, "// 24 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%36Mbps
+data_rate = 36e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
+fprintf(fid, "// 36 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%48Mbps
+data_rate = 48e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
+fprintf(fid, "// 48 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%54Mbps
+data_rate = 54e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 1);
+fprintf(fid, "// 54 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+fclose(fid);
+
+%11g EIFS
+fid = fopen('bianchi_11g_eifs.txt', 'wt');
+
+%6Mbps
+data_rate = 6e6;
+ack_rate = 6e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
+fprintf(fid, "// 6 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%9Mbps
+data_rate = 9e6;
+ack_rate = 6e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
+fprintf(fid, "// 9 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%12Mbps
+data_rate = 12e6;
+ack_rate = 12e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
+fprintf(fid, "// 12 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%18Mbps
+data_rate = 18e6;
+ack_rate = 12e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
+fprintf(fid, "// 18 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%24Mbps
+data_rate = 24e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
+fprintf(fid, "// 24 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%36Mbps
+data_rate = 36e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
+fprintf(fid, "// 36 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%48Mbps
+data_rate = 48e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
+fprintf(fid, "// 48 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%54Mbps
+data_rate = 54e6;
+ack_rate = 24e6;
+[bianchi_result] = Bianchi11g(data_rate, ack_rate, 0);
+fprintf(fid, "// 54 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+fclose(fid);
+
+
+%11b DIFS
+fid = fopen('bianchi_11b_difs.txt', 'wt');
+
+%1Mbps
+txduration = 12480e-6;
+ack = 304e-6;
+[bianchi_result] = Bianchi11b(txduration, ack, 1);
+fprintf(fid, "// 1 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%2Mbps
+txduration = 6336e-6;
+ack = 248e-6;
+[bianchi_result] = Bianchi11b(txduration, ack, 1);
+fprintf(fid, "// 2 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%5.5Mbps
+txduration = 2427e-6;
+ack = 248e-6;
+[bianchi_result] = Bianchi11b (txduration, ack, 1);
+fprintf(fid, "// 5.5 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%11Mbps
+txduration = 1310e-6;
+ack = 248e-6;
+[bianchi_result] = Bianchi11b (txduration, ack, 1);
+fprintf(fid, "// 11 Mbps - TC with DIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%11b EIFS
+fid = fopen ('bianchi_11b_eifs.txt', 'wt');
+
+%1Mbps
+txduration = 12480e-6;
+ack = 304e-6;
+[bianchi_result] = Bianchi11b (txduration, ack, 0);
+fprintf (fid, "// 1 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf (fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf (fid, "\n");
+
+%2Mbps
+txduration = 6336e-6;
+ack = 248e-6;
+[bianchi_result] = Bianchi11b(txduration, ack, 0);
+fprintf(fid, "// 2 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%5.5Mbps
+txduration = 2427e-6;
+ack = 248e-6;
+[bianchi_result] = Bianchi11b(txduration, ack, 0);
+fprintf(fid, "// 5.5 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
+
+%11Mbps
+txduration = 1310e-6;
+ack = 248e-6;
+[bianchi_result] = Bianchi11b(txduration, ack, 0);
+fprintf(fid, "// 11 Mbps - TC with EIFS\n");
+for k=1:10
+    fprintf(fid, "        {%d, %.4f},\n", nA(k), bianchi_result(k));
+end
+fprintf(fid, "\n");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/examples/wifi-bianchi.cc ns-3.34/src/wifi/examples/wifi-bianchi.cc
--- ns-3.33/src/wifi/examples/wifi-bianchi.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/examples/wifi-bianchi.cc	2021-07-14 10:31:07.000000000 -0700
@@ -28,6 +28,7 @@
 #include "ns3/log.h"
 #include "ns3/config.h"
 #include "ns3/gnuplot.h"
+#include "ns3/boolean.h"
 #include "ns3/string.h"
 #include "ns3/double.h"
 #include "ns3/integer.h"
@@ -47,6 +48,8 @@
 #include "ns3/packet-socket-client.h"
 #include "ns3/packet-socket-server.h"
 #include "ns3/application-container.h"
+#include "ns3/ampdu-subframe-header.h"
+#include "ns3/wifi-mac.h"
 
 #define PI 3.1415926535
 
@@ -81,304 +84,429 @@
 
 bool tracing = false;    ///< Flag to enable/disable generation of tracing files
 uint32_t pktSize = 1500; ///< packet size used for the simulation (in bytes)
+uint8_t maxMpdus = 0;    ///< The maximum number of MPDUs in A-MPDUs (0 to disable MPDU aggregation)
 
-std::map<unsigned int /* rate (bit/s)*/, std::map<unsigned int /* number of nodes */, double /* calculated throughput */> > bianchiResultsEifs =
+std::map<std::string /* mode */, std::map<unsigned int /* number of nodes */, double /* calculated throughput */> > bianchiResultsEifs =
 {
 /* 11b */
-    {1000000, {
-        {5, 0.8418},
-        {10, 0.7831},
-        {15, 0.7460},
-        {20, 0.7186},
-        {25, 0.6973},
-        {30, 0.6802},
-        {35, 0.6639},
-        {40, 0.6501},
-        {45, 0.6386},
-        {50, 0.6285},
-    }},
-    {2000000, {
-        {5, 1.6170},
-        {10, 1.5075},
-        {15, 1.4371},
-        {20, 1.3849},
-        {25, 1.3442},
-        {30, 1.3115},
-        {35, 1.2803},
-        {40, 1.2538},
-        {45, 1.2317},
-        {50, 1.2124},
-    }},
-    {5500000, {
-        {5, 3.8565},
-        {10, 3.6170},
-        {15, 3.4554},
-        {20, 3.3339},
-        {25, 3.2385},
-        {30, 3.1613},
-        {35, 3.0878},
-        {40, 3.0249},
-        {45, 2.9725},
-        {50, 2.9266},
-    }},
-    {11000000, {
-        {5, 6.3821},
-        {10, 6.0269},
-        {15, 5.7718},
-        {20, 5.5765},
-        {25, 5.4217},
-        {30, 5.2958},
-        {35, 5.1755},
-        {40, 5.0722},
-        {45, 4.9860},
-        {50, 4.9103},
-    }},
-/* 11a/g */
-    {6000000, {
-        {5, 4.6899},
-        {10, 4.3197},
-        {15, 4.1107},
-        {20, 3.9589},
-        {25, 3.8478},
-        {30, 3.7490},
-        {35, 3.6618},
-        {40, 3.5927},
-        {45, 3.5358},
-        {50, 3.4711},
-    }},
-    {9000000, {
-        {5, 6.8188},
-        {10, 6.2885},
-        {15, 5.9874},
-        {20, 5.7680},
-        {25, 5.6073},
-        {30, 5.4642},
-        {35, 5.3378},
-        {40, 5.2376},
-        {45, 5.1551},
-        {50, 5.0612},
-    }},
-    {12000000, {
-        {5, 8.8972},
-        {10, 8.2154},
-        {15, 7.8259},
-        {20, 7.5415},
-        {25, 7.3329},
-        {30, 7.1469},
-        {35, 6.9825},
-        {40, 6.8521},
-        {45, 6.7447},
-        {50, 6.6225},
-    }},
-    {18000000, {
-        {5, 12.6719},
-        {10, 11.7273},
-        {15, 11.1814},
-        {20, 10.7810},
-        {25, 10.4866},
-        {30, 10.2237},
-        {35, 9.9910},
-        {40, 9.8061},
-        {45, 9.6538},
-        {50, 9.4804},
-    }},
-    {24000000, {
-        {5, 16.0836},
-        {10, 14.9153},
-        {15, 14.2327},
-        {20, 13.7300},
-        {25, 13.3595},
-        {30, 13.0281},
-        {35, 12.7343},
-        {40, 12.5008},
-        {45, 12.3083},
-        {50, 12.0889},
-    }},
-    {36000000, {
-        {5, 22.0092},
-        {10, 20.4836},
-        {15, 19.5743},
-        {20, 18.8997},
-        {25, 18.4002},
-        {30, 17.9524},
-        {35, 17.5545},
-        {40, 17.2377},
-        {45, 16.9760},
-        {50, 16.6777},
-    }},
-    {48000000, {
-        {5, 26.8382},
-        {10, 25.0509},
-        {15, 23.9672},
-        {20, 23.1581},
-        {25, 22.5568},
-        {30, 22.0165},
-        {35, 21.5355},
-        {40, 21.1519},
-        {45, 20.8348},
-        {50, 20.4729},
-    }},
-    {54000000, {
-        {5, 29.2861},
-        {10, 27.3763},
-        {15, 26.2078},
-        {20, 25.3325},
-        {25, 24.6808},
-        {30, 24.0944},
-        {35, 23.5719},
-        {40, 23.1549},
-        {45, 22.8100},
-        {50, 22.4162},
+    {"DsssRate1Mbps", {
+        {5, 0.8418}, {10, 0.7831}, {15, 0.7460}, {20, 0.7186}, {25, 0.6973}, {30, 0.6802}, {35, 0.6639}, {40, 0.6501}, {45, 0.6386}, {50, 0.6285},
+    }},
+    {"DsssRate2Mbps", {
+        {5, 1.6170}, {10, 1.5075}, {15, 1.4371}, {20, 1.3849}, {25, 1.3442}, {30, 1.3115}, {35, 1.2803}, {40, 1.2538}, {45, 1.2317}, {50, 1.2124},
+    }},
+    {"DsssRate5_5Mbps", {
+        {5, 3.8565}, {10, 3.6170}, {15, 3.4554}, {20, 3.3339}, {25, 3.2385}, {30, 3.1613}, {35, 3.0878}, {40, 3.0249}, {45, 2.9725}, {50, 2.9266},
+    }},
+    {"DsssRate11Mbps", {
+        {5, 6.3821}, {10, 6.0269}, {15, 5.7718}, {20, 5.5765}, {25, 5.4217}, {30, 5.2958}, {35, 5.1755}, {40, 5.0722}, {45, 4.9860}, {50, 4.9103},
+    }},
+/* 11a */
+    {"OfdmRate6Mbps", {
+        {5, 4.6899}, {10, 4.3197}, {15, 4.1107}, {20, 3.9589}, {25, 3.8478}, {30, 3.7490}, {35, 3.6618}, {40, 3.5927}, {45, 3.5358}, {50, 3.4711},
+    }},
+    {"OfdmRate9Mbps", {
+        {5, 6.8188}, {10, 6.2885}, {15, 5.9874}, {20, 5.7680}, {25, 5.6073}, {30, 5.4642}, {35, 5.3378}, {40, 5.2376}, {45, 5.1551}, {50, 5.0612},
+    }},
+    {"OfdmRate12Mbps", {
+        {5, 8.8972}, {10, 8.2154}, {15, 7.8259}, {20, 7.5415}, {25, 7.3329}, {30, 7.1469}, {35, 6.9825}, {40, 6.8521}, {45, 6.7447}, {50, 6.6225},
+    }},
+    {"OfdmRate18Mbps", {
+        {5, 12.6719}, {10, 11.7273}, {15, 11.1814}, {20, 10.7810}, {25, 10.4866}, {30, 10.2237}, {35, 9.9910}, {40, 9.8061}, {45, 9.6538}, {50, 9.4804},
+    }},
+    {"OfdmRate24Mbps", {
+        {5, 16.0836}, {10, 14.9153}, {15, 14.2327}, {20, 13.7300}, {25, 13.3595}, {30, 13.0281}, {35, 12.7343}, {40, 12.5008}, {45, 12.3083}, {50, 12.0889},
+    }},
+    {"OfdmRate36Mbps", {
+        {5, 22.0092}, {10, 20.4836}, {15, 19.5743}, {20, 18.8997}, {25, 18.4002}, {30, 17.9524}, {35, 17.5545}, {40, 17.2377}, {45, 16.9760}, {50, 16.6777},
+    }},
+    {"OfdmRate48Mbps", {
+        {5, 26.8382}, {10, 25.0509}, {15, 23.9672}, {20, 23.1581}, {25, 22.5568}, {30, 22.0165}, {35, 21.5355}, {40, 21.1519}, {45, 20.8348}, {50, 20.4729},
+    }},
+    {"OfdmRate54Mbps", {
+        {5, 29.2861}, {10, 27.3763}, {15, 26.2078}, {20, 25.3325}, {25, 24.6808}, {30, 24.0944}, {35, 23.5719}, {40, 23.1549}, {45, 22.8100}, {50, 22.4162},
+    }},
+/* 11g */
+    {"ErpOfdmRate6Mbps", {
+        {5, 4.6899}, {10, 4.3197}, {15, 4.1107}, {20, 3.9589}, {25, 3.8478}, {30, 3.7490}, {35, 3.6618}, {40, 3.5927}, {45, 3.5358}, {50, 3.4711},
+    }},
+    {"ErpOfdmRate9Mbps", {
+        {5, 6.8188}, {10, 6.2885}, {15, 5.9874}, {20, 5.7680}, {25, 5.6073}, {30, 5.4642}, {35, 5.3378}, {40, 5.2376}, {45, 5.1551}, {50, 5.0612},
+    }},
+    {"ErpOfdmRate12Mbps", {
+        {5, 8.8972}, {10, 8.2154}, {15, 7.8259}, {20, 7.5415}, {25, 7.3329}, {30, 7.1469}, {35, 6.9825}, {40, 6.8521}, {45, 6.7447}, {50, 6.6225},
+    }},
+    {"ErpOfdmRate18Mbps", {
+        {5, 12.6719}, {10, 11.7273}, {15, 11.1814}, {20, 10.7810}, {25, 10.4866}, {30, 10.2237}, {35, 9.9910}, {40, 9.8061}, {45, 9.6538}, {50, 9.4804},
+    }},
+    {"ErpOfdmRate24Mbps", {
+        {5, 16.0836}, {10, 14.9153}, {15, 14.2327}, {20, 13.7300}, {25, 13.3595}, {30, 13.0281}, {35, 12.7343}, {40, 12.5008}, {45, 12.3083}, {50, 12.0889},
+    }},
+    {"ErpOfdmRate36Mbps", {
+        {5, 22.0092}, {10, 20.4836}, {15, 19.5743}, {20, 18.8997}, {25, 18.4002}, {30, 17.9524}, {35, 17.5545}, {40, 17.2377}, {45, 16.9760}, {50, 16.6777},
+    }},
+    {"ErpOfdmRate48Mbps", {
+        {5, 26.8382}, {10, 25.0509}, {15, 23.9672}, {20, 23.1581}, {25, 22.5568}, {30, 22.0165}, {35, 21.5355}, {40, 21.1519}, {45, 20.8348}, {50, 20.4729},
+    }},
+    {"ErpOfdmRate54Mbps", {
+        {5, 29.2861}, {10, 27.3763}, {15, 26.2078}, {20, 25.3325}, {25, 24.6808}, {30, 24.0944}, {35, 23.5719}, {40, 23.1549}, {45, 22.8100}, {50, 22.4162},
+    }},
+/* 11ax, no frame aggregation */
+    {"HeMcs0_20MHz", {
+        {5, 6.3381}, {10, 5.8172}, {15, 5.5223}, {20, 5.3146}, {25, 5.1525}, {30, 5.0187}, {35, 4.9039}, {40, 4.8034}, {45, 4.7134}, {50, 4.6317},
+    }},
+    {"HeMcs1_20MHz", {
+        {5, 11.6580}, {10, 10.7369}, {15, 10.2068}, {20, 9.8309}, {25, 9.5365}, {30, 9.2930}, {35, 9.0837}, {40, 8.9001}, {45, 8.7355}, {50, 8.5860},
+    }},
+    {"HeMcs2_20MHz", {
+        {5, 15.8572}, {10, 14.6445}, {15, 13.9367}, {20, 13.4323}, {25, 13.0361}, {30, 12.7076}, {35, 12.4249}, {40, 12.1766}, {45, 11.9538}, {50, 11.7511},
+    }},
+    {"HeMcs3_20MHz", {
+        {5, 19.7457}, {10, 18.2820}, {15, 17.4163}, {20, 16.7963}, {25, 16.3078}, {30, 15.9021}, {35, 15.5524}, {40, 15.2449}, {45, 14.9687}, {50, 14.7173},
+    }},
+    {"HeMcs4_20MHz", {
+        {5, 25.8947}, {10, 24.0721}, {15, 22.9698}, {20, 22.1738}, {25, 21.5437}, {30, 21.0186}, {35, 20.5650}, {40, 20.1654}, {45, 19.8059}, {50, 19.4784},
+    }},
+    {"HeMcs5_20MHz", {
+        {5, 30.0542}, {10, 28.0155}, {15, 26.7625}, {20, 25.8523}, {25, 25.1295}, {30, 24.5258}, {35, 24.0034}, {40, 23.5426}, {45, 23.1277}, {50, 22.7492},
+    }},
+    {"HeMcs6_20MHz", {
+        {5, 32.6789}, {10, 30.5150}, {15, 29.1708}, {20, 28.1907}, {25, 27.4107}, {30, 26.7583}, {35, 26.1931}, {40, 25.6941}, {45, 25.2446}, {50, 24.8343},
+    }},
+    {"HeMcs7_20MHz", {
+        {5, 34.1710}, {10, 31.9398}, {15, 30.5451}, {20, 29.5261}, {25, 28.7140}, {30, 28.0342}, {35, 27.4449}, {40, 26.9245}, {45, 26.4554}, {50, 26.0271},
+    }},
+    {"HeMcs8_20MHz", {
+        {5, 37.6051}, {10, 35.2296}, {15, 33.7228}, {20, 32.6160}, {25, 31.7314}, {30, 30.9895}, {35, 30.3455}, {40, 29.7760}, {45, 29.2623}, {50, 28.7929},
+    }},
+    {"HeMcs9_20MHz", {
+        {5, 39.5947}, {10, 37.1424}, {15, 35.5731}, {20, 34.4169}, {25, 33.4911}, {30, 32.7138}, {35, 32.0385}, {40, 31.4410}, {45, 30.9016}, {50, 30.4086},
+    }},
+    {"HeMcs10_20MHz", {
+        {5, 39.5947}, {10, 37.1424}, {15, 35.5731}, {20, 34.4169}, {25, 33.4911}, {30, 32.7138}, {35, 32.0385}, {40, 31.4410}, {45, 30.9016}, {50, 30.4086},
+    }},
+    {"HeMcs11_20MHz", {
+        {5, 41.8065}, {10, 39.2749}, {15, 37.6383}, {20, 36.4282}, {25, 35.4575}, {30, 34.6414}, {35, 33.9316}, {40, 33.3031}, {45, 32.7355}, {50, 32.2164},
+    }},
+    {"HeMcs0_40MHz", {
+        {5, 11.4999}, {10, 10.5902}, {15, 10.0669}, {20, 9.6960}, {25, 9.4055}, {30, 9.1652}, {35, 8.9587}, {40, 8.7775}, {45, 8.6151}, {50, 8.4676},
+    }},
+    {"HeMcs1_40MHz", {
+        {5, 19.5937}, {10, 18.1394}, {15, 17.2798}, {20, 16.6642}, {25, 16.1793}, {30, 15.7766}, {35, 15.4295}, {40, 15.1242}, {45, 14.8502}, {50, 14.6007},
+    }},
+    {"HeMcs2_40MHz", {
+        {5, 25.6338}, {10, 23.8255}, {15, 22.7329}, {20, 21.9442}, {25, 21.3200}, {30, 20.7999}, {35, 20.3506}, {40, 19.9549}, {45, 19.5990}, {50, 19.2746},
+    }},
+    {"HeMcs3_40MHz", {
+        {5, 30.0542}, {10, 28.0155}, {15, 26.7625}, {20, 25.8523}, {25, 25.1295}, {30, 24.5258}, {35, 24.0034}, {40, 23.5426}, {45, 23.1277}, {50, 22.7492},
+    }},
+    {"HeMcs4_40MHz", {
+        {5, 37.6051}, {10, 35.2296}, {15, 33.7228}, {20, 32.6160}, {25, 31.7314}, {30, 30.9895}, {35, 30.3455}, {40, 29.7760}, {45, 29.2623}, {50, 28.7929},
+    }},
+    {"HeMcs5_40MHz", {
+        {5, 41.8065}, {10, 39.2749}, {15, 37.6383}, {20, 36.4282}, {25, 35.4575}, {30, 34.6414}, {35, 33.9316}, {40, 33.3031}, {45, 32.7355}, {50, 32.2164},
+    }},
+    {"HeMcs6_40MHz", {
+        {5, 44.2801}, {10, 41.6672}, {15, 39.9580}, {20, 38.6892}, {25, 37.6692}, {30, 36.8103}, {35, 36.0625}, {40, 35.3998}, {45, 34.8008}, {50, 34.2528},
+    }},
+    {"HeMcs7_40MHz", {
+        {5, 44.2801}, {10, 41.6672}, {15, 39.9580}, {20, 38.6892}, {25, 37.6692}, {30, 36.8103}, {35, 36.0625}, {40, 35.3998}, {45, 34.8008}, {50, 34.2528},
+    }},
+    {"HeMcs8_40MHz", {
+        {5, 47.0648}, {10, 44.3699}, {15, 42.5825}, {20, 41.2495}, {25, 40.1751}, {30, 39.2689}, {35, 38.4790}, {40, 37.7781}, {45, 37.1443}, {50, 36.5639},
+    }},
+    {"HeMcs9_40MHz", {
+        {5, 50.2233}, {10, 47.4474}, {15, 45.5760}, {20, 44.1727}, {25, 43.0382}, {30, 42.0794}, {35, 41.2425}, {40, 40.4991}, {45, 39.8262}, {50, 39.2095},
+    }},
+    {"HeMcs10_40MHz", {
+        {5, 50.2233}, {10, 47.4474}, {15, 45.5760}, {20, 44.1727}, {25, 43.0382}, {30, 42.0794}, {35, 41.2425}, {40, 40.4991}, {45, 39.8262}, {50, 39.2095},
+    }},
+    {"HeMcs11_40MHz", {
+        {5, 50.2233}, {10, 47.4474}, {15, 45.5760}, {20, 44.1727}, {25, 43.0382}, {30, 42.0794}, {35, 41.2425}, {40, 40.4991}, {45, 39.8262}, {50, 39.2095},
+    }},
+    {"HeMcs0_80MHz", {
+        {5, 19.6542}, {10, 18.1962}, {15, 17.3342}, {20, 16.7168}, {25, 16.2305}, {30, 15.8265}, {35, 15.4784}, {40, 15.1723}, {45, 14.8973}, {50, 14.6471},
+    }},
+    {"HeMcs1_80MHz", {
+        {5, 30.9311}, {10, 28.8495}, {15, 27.5657}, {20, 26.6320}, {25, 25.8899}, {30, 25.2699}, {35, 24.7332}, {40, 24.2595}, {45, 23.8330}, {50, 23.4439},
+    }},
+    {"HeMcs2_80MHz", {
+        {5, 37.0575}, {10, 34.7039}, {15, 33.2146}, {20, 32.1216}, {25, 31.2485}, {30, 30.5164}, {35, 29.8811}, {40, 29.3194}, {45, 28.8127}, {50, 28.3499},
+    }},
+    {"HeMcs3_80MHz", {
+        {5, 41.8065}, {10, 39.2749}, {15, 37.6383}, {20, 36.4282}, {25, 35.4575}, {30, 34.6414}, {35, 33.9316}, {40, 33.3031}, {45, 32.7355}, {50, 32.2164},
+    }},
+    {"HeMcs4_80MHz", {
+        {5, 47.0648}, {10, 44.3699}, {15, 42.5825}, {20, 41.2495}, {25, 40.1751}, {30, 39.2689}, {35, 38.4790}, {40, 37.7781}, {45, 37.1443}, {50, 36.5639},
+    }},
+    {"HeMcs5_80MHz", {
+        {5, 50.2233}, {10, 47.4474}, {15, 45.5760}, {20, 44.1727}, {25, 43.0382}, {30, 42.0794}, {35, 41.2425}, {40, 40.4991}, {45, 39.8262}, {50, 39.2095},
+    }},
+    {"HeMcs6_80MHz", {
+        {5, 53.8362}, {10, 50.9837}, {15, 49.0221}, {20, 47.5418}, {25, 46.3407}, {30, 45.3233}, {35, 44.4337}, {40, 43.6425}, {45, 42.9255}, {50, 42.2678},
+    }},
+    {"HeMcs7_80MHz", {
+        {5, 53.8362}, {10, 50.9837}, {15, 49.0221}, {20, 47.5418}, {25, 46.3407}, {30, 45.3233}, {35, 44.4337}, {40, 43.6425}, {45, 42.9255}, {50, 42.2678},
+    }},
+    {"HeMcs8_80MHz", {
+        {5, 53.8362}, {10, 50.9837}, {15, 49.0221}, {20, 47.5418}, {25, 46.3407}, {30, 45.3233}, {35, 44.4337}, {40, 43.6425}, {45, 42.9255}, {50, 42.2678},
+    }},
+    {"HeMcs9_80MHz", {
+        {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
+    }},
+    {"HeMcs10_80MHz", {
+        {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
+    }},
+    {"HeMcs11_80MHz", {
+        {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
+    }},
+    {"HeMcs0_160MHz", {
+        {5, 29.8428}, {10, 27.8145}, {15, 26.5689}, {20, 25.6645}, {25, 24.9463}, {30, 24.3466}, {35, 23.8276}, {40, 23.3699}, {45, 22.9578}, {50, 22.5819},
+    }},
+    {"HeMcs1_160MHz", {
+        {5, 41.1308}, {10, 38.6227}, {15, 37.0064}, {20, 35.8126}, {25, 34.8556}, {30, 34.0513}, {35, 33.3520}, {40, 32.7329}, {45, 32.1739}, {50, 31.6628},
+    }},
+    {"HeMcs2_160MHz", {
+        {5, 46.2101}, {10, 43.5393}, {15, 41.7755}, {20, 40.4620}, {25, 39.4041}, {30, 38.5123}, {35, 37.7353}, {40, 37.0461}, {45, 36.4229}, {50, 35.8524},
+    }},
+    {"HeMcs3_160MHz", {
+        {5, 50.2233}, {10, 47.4474}, {15, 45.5760}, {20, 44.1727}, {25, 43.0382}, {30, 42.0794}, {35, 41.2425}, {40, 40.4991}, {45, 39.8262}, {50, 39.2095},
+    }},
+    {"HeMcs4_160MHz", {
+        {5, 53.8362}, {10, 50.9837}, {15, 49.0221}, {20, 47.5418}, {25, 46.3407}, {30, 45.3233}, {35, 44.4337}, {40, 43.6425}, {45, 42.9255}, {50, 42.2678},
+    }},
+    {"HeMcs5_160MHz", {
+        {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
+    }},
+    {"HeMcs6_160MHz", {
+        {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
+    }},
+    {"HeMcs7_160MHz", {
+        {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
+    }},
+    {"HeMcs8_160MHz", {
+        {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
+    }},
+    {"HeMcs9_160MHz", {
+        {5, 62.8834}, {10, 59.9147}, {15, 57.7564}, {20, 56.0992}, {25, 54.7419}, {30, 53.5850}, {35, 52.5689}, {40, 51.6620}, {45, 50.8379}, {50, 50.0803},
+    }},
+    {"HeMcs10_160MHz", {
+        {5, 62.8834}, {10, 59.9147}, {15, 57.7564}, {20, 56.0992}, {25, 54.7419}, {30, 53.5850}, {35, 52.5689}, {40, 51.6620}, {45, 50.8379}, {50, 50.0803},
+    }},
+    {"HeMcs11_160MHz", {
+        {5, 62.8834}, {10, 59.9147}, {15, 57.7564}, {20, 56.0992}, {25, 54.7419}, {30, 53.5850}, {35, 52.5689}, {40, 51.6620}, {45, 50.8379}, {50, 50.0803},
     }},
 };
 
-std::map<unsigned int /* rate (bit/s)*/, std::map<unsigned int /* number of nodes */, double /* calculated throughput */> > bianchiResultsDifs =
+std::map<std::string /* mode */, std::map<unsigned int /* number of nodes */, double /* calculated throughput */> > bianchiResultsDifs =
 {
 /* 11b */
-    {1000000, {
-        {5, 0.8437},
-        {10, 0.7861},
-        {15, 0.7496},
-        {20, 0.7226},
-        {25, 0.7016},
-        {30, 0.6847},
-        {35, 0.6686},
-        {40, 0.6549},
-        {45, 0.6435},
-        {50, 0.6336},
-    }},
-    {2000000, {
-        {5, 1.6228},
-        {10, 1.5168},
-        {15, 1.4482},
-        {20, 1.3972},
-        {25, 1.3574},
-        {30, 1.3253},
-        {35, 1.2947},
-        {40, 1.2687},
-        {45, 1.2469},
-        {50, 1.2279},
-    }},
-    {5500000, {
-        {5, 3.8896},
-        {10, 3.6707},
-        {15, 3.5203},
-        {20, 3.4063},
-        {25, 3.3161},
-        {30, 3.2429},
-        {35, 3.1729},
-        {40, 3.1128},
-        {45, 3.0625},
-        {50, 3.0184},
-    }},
-    {11000000, {
-        {5, 6.4734},
-        {10, 6.1774},
-        {15, 5.9553},
-        {20, 5.7819},
-        {25, 5.6429},
-        {30, 5.5289},
-        {35, 5.4191},
-        {40, 5.3243},
-        {45, 5.2446},
-        {50, 5.1745},
-    }},
-/* 11a/g */
-    {6000000, {
-        {5, 4.7087},
-        {10, 4.3453},
-        {15, 4.1397},
-        {20, 3.9899},
-        {25, 3.8802},
-        {30, 3.7824},
-        {35, 3.6961},
-        {40, 3.6276},
-        {45, 3.5712},
-        {50, 3.5071},
-    }},
-    {9000000, {
-        {5, 6.8586},
-        {10, 6.3431},
-        {15, 6.0489},
-        {20, 5.8340},
-        {25, 5.6762},
-        {30, 5.5355},
-        {35, 5.4110},
-        {40, 5.3122},
-        {45, 5.2307},
-        {50, 5.1380},
-    }},
-    {12000000, {
-        {5, 8.9515},
-        {10, 8.2901},
-        {15, 7.9102},
-        {20, 7.6319},
-        {25, 7.4274},
-        {30, 7.2447},
-        {35, 7.0829},
-        {40, 6.9544},
-        {45, 6.8485},
-        {50, 6.7278},
-    }},
-    {18000000, {
-        {5, 12.7822},
-        {10, 11.8801},
-        {15, 11.3543},
-        {20, 10.9668},
-        {25, 10.6809},
-        {30, 10.4249},
-        {35, 10.1978},
-        {40, 10.0171},
-        {45, 9.8679},
-        {50, 9.6978},
-    }},
-    {24000000, {
-        {5, 16.2470},
-        {10, 15.1426},
-        {15, 14.4904},
-        {20, 14.0072},
-        {25, 13.6496},
-        {30, 13.3288},
-        {35, 13.0436},
-        {40, 12.8164},
-        {45, 12.6286},
-        {50, 12.4144},
-    }},
-    {36000000, {
-        {5, 22.3164},
-        {10, 20.9147},
-        {15, 20.0649},
-        {20, 19.4289},
-        {25, 18.9552},
-        {30, 18.5284},
-        {35, 18.1476},
-        {40, 17.8434},
-        {45, 17.5915},
-        {50, 17.3036},
-    }},
-    {48000000, {
-        {5, 27.2963},
-        {10, 25.6987},
-        {15, 24.7069},
-        {20, 23.9578},
-        {25, 23.3965},
-        {30, 22.8891},
-        {35, 22.4350},
-        {40, 22.0713},
-        {45, 21.7696},
-        {50, 21.4243},
-    }},
-    {54000000, {
-        {5, 29.8324},
-        {10, 28.1519},
-        {15, 27.0948},
-        {20, 26.2925},
-        {25, 25.6896},
-        {30, 25.1434},
-        {35, 24.6539},
-        {40, 24.2613},
-        {45, 23.9353},
-        {50, 23.5618},
+    {"DsssRate1Mbps", {
+        {5, 0.8437}, {10, 0.7861}, {15, 0.7496}, {20, 0.7226}, {25, 0.7016}, {30, 0.6847}, {35, 0.6686}, {40, 0.6549}, {45, 0.6435}, {50, 0.6336},
+    }},
+    {"DsssRate2Mbps", {
+        {5, 1.6228}, {10, 1.5168}, {15, 1.4482}, {20, 1.3972}, {25, 1.3574}, {30, 1.3253}, {35, 1.2947}, {40, 1.2687}, {45, 1.2469}, {50, 1.2279},
+    }},
+    {"DsssRate5_5Mbps", {
+        {5, 3.8896}, {10, 3.6707}, {15, 3.5203}, {20, 3.4063}, {25, 3.3161}, {30, 3.2429}, {35, 3.1729}, {40, 3.1128}, {45, 3.0625}, {50, 3.0184},
+    }},
+    {"DsssRate11Mbps", {
+        {5, 6.4734}, {10, 6.1774}, {15, 5.9553}, {20, 5.7819}, {25, 5.6429}, {30, 5.5289}, {35, 5.4191}, {40, 5.3243}, {45, 5.2446}, {50, 5.1745},
+    }},
+/* 11a */
+    {"OfdmRate6Mbps", {
+        {5, 4.7087}, {10, 4.3453}, {15, 4.1397}, {20, 3.9899}, {25, 3.8802}, {30, 3.7824}, {35, 3.6961}, {40, 3.6276}, {45, 3.5712}, {50, 3.5071},
+    }},
+    {"OfdmRate9Mbps", {
+        {5, 6.8586}, {10, 6.3431}, {15, 6.0489}, {20, 5.8340}, {25, 5.6762}, {30, 5.5355}, {35, 5.4110}, {40, 5.3122}, {45, 5.2307}, {50, 5.1380},
+    }},
+    {"OfdmRate12Mbps", {
+        {5, 8.9515}, {10, 8.2901}, {15, 7.9102}, {20, 7.6319}, {25, 7.4274}, {30, 7.2447}, {35, 7.0829}, {40, 6.9544}, {45, 6.8485}, {50, 6.7278},
+    }},
+    {"OfdmRate18Mbps", {
+        {5, 12.7822}, {10, 11.8801}, {15, 11.3543}, {20, 10.9668}, {25, 10.6809}, {30, 10.4249}, {35, 10.1978}, {40, 10.0171}, {45, 9.8679}, {50, 9.6978},
+    }},
+    {"OfdmRate24Mbps", {
+        {5, 16.2470}, {10, 15.1426}, {15, 14.4904}, {20, 14.0072}, {25, 13.6496}, {30, 13.3288}, {35, 13.0436}, {40, 12.8164}, {45, 12.6286}, {50, 12.4144},
+    }},
+    {"OfdmRate36Mbps", {
+        {5, 22.3164}, {10, 20.9147}, {15, 20.0649}, {20, 19.4289}, {25, 18.9552}, {30, 18.5284}, {35, 18.1476}, {40, 17.8434}, {45, 17.5915}, {50, 17.3036},
+    }},
+    {"OfdmRate48Mbps", {
+        {5, 27.2963}, {10, 25.6987}, {15, 24.7069}, {20, 23.9578}, {25, 23.3965}, {30, 22.8891}, {35, 22.4350}, {40, 22.0713}, {45, 21.7696}, {50, 21.4243},
+    }},
+    {"OfdmRate54Mbps", {
+        {5, 29.8324}, {10, 28.1519}, {15, 27.0948}, {20, 26.2925}, {25, 25.6896}, {30, 25.1434}, {35, 24.6539}, {40, 24.2613}, {45, 23.9353}, {50, 23.5618},
+    }},
+/* 11g */
+    {"ErpOfdmRate6Mbps", {
+        {5, 4.7087}, {10, 4.3453}, {15, 4.1397}, {20, 3.9899}, {25, 3.8802}, {30, 3.7824}, {35, 3.6961}, {40, 3.6276}, {45, 3.5712}, {50, 3.5071},
+    }},
+    {"ErpOfdmRate9Mbps", {
+        {5, 6.8586}, {10, 6.3431}, {15, 6.0489}, {20, 5.8340}, {25, 5.6762}, {30, 5.5355}, {35, 5.4110}, {40, 5.3122}, {45, 5.2307}, {50, 5.1380},
+    }},
+    {"ErpOfdmRate12Mbps", {
+        {5, 8.9515}, {10, 8.2901}, {15, 7.9102}, {20, 7.6319}, {25, 7.4274}, {30, 7.2447}, {35, 7.0829}, {40, 6.9544}, {45, 6.8485}, {50, 6.7278},
+    }},
+    {"ErpOfdmRate18Mbps", {
+        {5, 12.7822}, {10, 11.8801}, {15, 11.3543}, {20, 10.9668}, {25, 10.6809}, {30, 10.4249}, {35, 10.1978}, {40, 10.0171}, {45, 9.8679}, {50, 9.6978},
+    }},
+    {"ErpOfdmRate24Mbps", {
+        {5, 16.2470}, {10, 15.1426}, {15, 14.4904}, {20, 14.0072}, {25, 13.6496}, {30, 13.3288}, {35, 13.0436}, {40, 12.8164}, {45, 12.6286}, {50, 12.4144},
+    }},
+    {"ErpOfdmRate36Mbps", {
+        {5, 22.3164}, {10, 20.9147}, {15, 20.0649}, {20, 19.4289}, {25, 18.9552}, {30, 18.5284}, {35, 18.1476}, {40, 17.8434}, {45, 17.5915}, {50, 17.3036},
+    }},
+    {"ErpOfdmRate48Mbps", {
+        {5, 27.2963}, {10, 25.6987}, {15, 24.7069}, {20, 23.9578}, {25, 23.3965}, {30, 22.8891}, {35, 22.4350}, {40, 22.0713}, {45, 21.7696}, {50, 21.4243},
+    }},
+    {"ErpOfdmRate54Mbps", {
+        {5, 29.8324}, {10, 28.1519}, {15, 27.0948}, {20, 26.2925}, {25, 25.6896}, {30, 25.1434}, {35, 24.6539}, {40, 24.2613}, {45, 23.9353}, {50, 23.5618},
+    }},
+/* 11ax, no frame aggregation */
+    {"HeMcs0_20MHz", {
+        {5, 6.3746}, {10, 5.8670}, {15, 5.5782}, {20, 5.3742}, {25, 5.2147}, {30, 5.0829}, {35, 4.9696}, {40, 4.8703}, {45, 4.7813}, {50, 4.7004},
+    }},
+    {"HeMcs1_20MHz", {
+        {5, 11.7574}, {10, 10.8735}, {15, 10.3606}, {20, 9.9954}, {25, 9.7084}, {30, 9.4704}, {35, 9.2654}, {40, 9.0853}, {45, 8.9235}, {50, 8.7763},
+    }},
+    {"HeMcs2_20MHz", {
+        {5, 16.0419}, {10, 14.8998}, {15, 14.2252}, {20, 13.7413}, {25, 13.3594}, {30, 13.0417}, {35, 12.7674}, {40, 12.5258}, {45, 12.3086}, {50, 12.1107},
+    }},
+    {"HeMcs3_20MHz", {
+        {5, 20.0089}, {10, 18.6480}, {15, 17.8309}, {20, 17.2410}, {25, 16.7736}, {30, 16.3837}, {35, 16.0465}, {40, 15.7491}, {45, 15.4813}, {50, 15.2369},
+    }},
+    {"HeMcs4_20MHz", {
+        {5, 26.3492}, {10, 24.7107}, {15, 23.6964}, {20, 22.9553}, {25, 22.3640}, {30, 21.8683}, {35, 21.4379}, {40, 21.0571}, {45, 20.7134}, {50, 20.3991},
+    }},
+    {"HeMcs5_20MHz", {
+        {5, 30.6683}, {10, 28.8843}, {15, 27.7540}, {20, 26.9210}, {25, 26.2528}, {30, 25.6906}, {35, 25.2012}, {40, 24.7671}, {45, 24.3746}, {50, 24.0151},
+    }},
+    {"HeMcs6_20MHz", {
+        {5, 33.4062}, {10, 31.5485}, {15, 30.3527}, {20, 29.4662}, {25, 28.7527}, {30, 28.1508}, {35, 27.6259}, {40, 27.1597}, {45, 26.7376}, {50, 26.3507},
+    }},
+    {"HeMcs7_20MHz", {
+        {5, 34.9671}, {10, 33.0739}, {15, 31.8436}, {20, 30.9282}, {25, 30.1900}, {30, 29.5665}, {35, 29.0221}, {40, 28.5382}, {45, 28.0997}, {50, 27.6975},
+    }},
+    {"HeMcs8_20MHz", {
+        {5, 38.5714}, {10, 36.6144}, {15, 35.3124}, {20, 34.3355}, {25, 33.5438}, {30, 32.8728}, {35, 32.2854}, {40, 31.7623}, {45, 31.2874}, {50, 30.8512},
+    }},
+    {"HeMcs9_20MHz", {
+        {5, 40.6674}, {10, 38.6851}, {15, 37.3466}, {20, 36.3371}, {25, 35.5165}, {30, 34.8197}, {35, 34.2087}, {40, 33.6638}, {45, 33.1688}, {50, 32.7137},
+    }},
+    {"HeMcs10_20MHz", {
+        {5, 40.6674}, {10, 38.6851}, {15, 37.3466}, {20, 36.3371}, {25, 35.5165}, {30, 34.8197}, {35, 34.2087}, {40, 33.6638}, {45, 33.1688}, {50, 32.7137},
+    }},
+    {"HeMcs11_20MHz", {
+        {5, 43.0043}, {10, 41.0039}, {15, 39.6294}, {20, 38.5865}, {25, 37.7358}, {30, 37.0116}, {35, 36.3756}, {40, 35.8076}, {45, 35.2909}, {50, 34.8154},
+    }},
+    {"HeMcs0_40MHz", {
+        {5, 11.6208}, {10, 10.7566}, {15, 10.2544}, {20, 9.8965}, {25, 9.6151}, {30, 9.3815}, {35, 9.1804}, {40, 9.0035}, {45, 8.8446}, {50, 8.7000},
+    }},
+    {"HeMcs1_40MHz", {
+        {5, 19.8764}, {10, 18.5328}, {15, 17.7255}, {20, 17.1424}, {25, 16.6803}, {30, 16.2947}, {35, 15.9612}, {40, 15.6668}, {45, 15.4018}, {50, 15.1599},
+    }},
+    {"HeMcs2_40MHz", {
+        {5, 26.1198}, {10, 24.5088}, {15, 23.5107}, {20, 22.7810}, {25, 22.1986}, {30, 21.7101}, {35, 21.2858}, {40, 20.9104}, {45, 20.5714}, {50, 20.2613},
+    }},
+    {"HeMcs3_40MHz", {
+        {5, 30.6683}, {10, 28.8843}, {15, 27.7540}, {20, 26.9210}, {25, 26.2528}, {30, 25.6906}, {35, 25.2012}, {40, 24.7671}, {45, 24.3746}, {50, 24.0151},
+    }},
+    {"HeMcs4_40MHz", {
+        {5, 38.5714}, {10, 36.6144}, {15, 35.3124}, {20, 34.3355}, {25, 33.5438}, {30, 32.8728}, {35, 32.2854}, {40, 31.7623}, {45, 31.2874}, {50, 30.8512},
+    }},
+    {"HeMcs5_40MHz", {
+        {5, 43.0043}, {10, 41.0039}, {15, 39.6294}, {20, 38.5865}, {25, 37.7358}, {30, 37.0116}, {35, 36.3756}, {40, 35.8076}, {45, 35.2909}, {50, 34.8154},
+    }},
+    {"HeMcs6_40MHz", {
+        {5, 45.6261}, {10, 43.6185}, {15, 42.2095}, {20, 41.1328}, {25, 40.2509}, {30, 39.4981}, {35, 38.8356}, {40, 38.2430}, {45, 37.7032}, {50, 37.2058},
+    }},
+    {"HeMcs7_40MHz", {
+        {5, 45.6261}, {10, 43.6185}, {15, 42.2095}, {20, 41.1328}, {25, 40.2509}, {30, 39.4981}, {35, 38.8356}, {40, 38.2430}, {45, 37.7032}, {50, 37.2058},
+    }},
+    {"HeMcs8_40MHz", {
+        {5, 48.5883}, {10, 46.5892}, {15, 45.1489}, {20, 44.0388}, {25, 43.1252}, {30, 42.3428}, {35, 41.6525}, {40, 41.0338}, {45, 40.4694}, {50, 39.9486},
+    }},
+    {"HeMcs9_40MHz", {
+        {5, 51.9619}, {10, 49.9941}, {15, 48.5284}, {20, 47.3867}, {25, 46.4416}, {30, 45.6290}, {35, 44.9099}, {40, 44.2640}, {45, 43.6736}, {50, 43.1279},
+    }},
+    {"HeMcs10_40MHz", {
+        {5, 51.9619}, {10, 49.9941}, {15, 48.5284}, {20, 47.3867}, {25, 46.4416}, {30, 45.6290}, {35, 44.9099}, {40, 44.2640}, {45, 43.6736}, {50, 43.1279},
+    }},
+    {"HeMcs11_40MHz", {
+        {5, 51.9619}, {10, 49.9941}, {15, 48.5284}, {20, 47.3867}, {25, 46.4416}, {30, 45.6290}, {35, 44.9099}, {40, 44.2640}, {45, 43.6736}, {50, 43.1279},
+    }},
+    {"HeMcs0_80MHz", {
+        {5, 20.0101}, {10, 18.6928}, {15, 17.8976}, {20, 17.3219}, {25, 16.8648}, {30, 16.4830}, {35, 16.1523}, {40, 15.8603}, {45, 15.5971}, {50, 15.3567},
+    }},
+    {"HeMcs1_80MHz", {
+        {5, 31.6415}, {10, 29.8575}, {15, 28.7177}, {20, 27.8747}, {25, 27.1971}, {30, 26.6261}, {35, 26.1283}, {40, 25.6865}, {45, 25.2866}, {50, 24.9200},
+    }},
+    {"HeMcs2_80MHz", {
+        {5, 38.0818}, {10, 36.1730}, {15, 34.9016}, {20, 33.9470}, {25, 33.1729}, {30, 32.5165}, {35, 31.9417}, {40, 31.4295}, {45, 30.9645}, {50, 30.5372},
+    }},
+    {"HeMcs3_80MHz", {
+        {5, 43.0043}, {10, 41.0039}, {15, 39.6294}, {20, 38.5865}, {25, 37.7358}, {30, 37.0116}, {35, 36.3756}, {40, 35.8076}, {45, 35.2909}, {50, 34.8154},
+    }},
+    {"HeMcs4_80MHz", {
+        {5, 48.5883}, {10, 46.5892}, {15, 45.1489}, {20, 44.0388}, {25, 43.1252}, {30, 42.3428}, {35, 41.6525}, {40, 41.0338}, {45, 40.4694}, {50, 39.9486},
+    }},
+    {"HeMcs5_80MHz", {
+        {5, 51.9619}, {10, 49.9941}, {15, 48.5284}, {20, 47.3867}, {25, 46.4416}, {30, 45.6290}, {35, 44.9099}, {40, 44.2640}, {45, 43.6736}, {50, 43.1279},
+    }},
+    {"HeMcs6_80MHz", {
+        {5, 55.8389}, {10, 53.9360}, {15, 52.4548}, {20, 51.2855}, {25, 50.3106}, {30, 49.4682}, {35, 48.7201}, {40, 48.0462}, {45, 47.4288}, {50, 46.8571},
+    }},
+    {"HeMcs7_80MHz", {
+        {5, 55.8389}, {10, 53.9360}, {15, 52.4548}, {20, 51.2855}, {25, 50.3106}, {30, 49.4682}, {35, 48.7201}, {40, 48.0462}, {45, 47.4288}, {50, 46.8571},
+    }},
+    {"HeMcs8_80MHz", {
+        {5, 55.8389}, {10, 53.9360}, {15, 52.4548}, {20, 51.2855}, {25, 50.3106}, {30, 49.4682}, {35, 48.7201}, {40, 48.0462}, {45, 47.4288}, {50, 46.8571},
+    }},
+    {"HeMcs9_80MHz", {
+        {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
+    }},
+    {"HeMcs10_80MHz", {
+        {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
+    }},
+    {"HeMcs11_80MHz", {
+        {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
+    }},
+    {"HeMcs0_160MHz", {
+        {5, 30.6710}, {10, 28.9919}, {15, 27.9160}, {20, 27.1188}, {25, 26.4770}, {30, 25.9355}, {35, 25.4630}, {40, 25.0432}, {45, 24.6629}, {50, 24.3141},
+    }},
+    {"HeMcs1_160MHz", {
+        {5, 42.3965}, {10, 40.4510}, {15, 39.1127}, {20, 38.0965}, {25, 37.2670}, {30, 36.5606}, {35, 35.9398}, {40, 35.3852}, {45, 34.8806}, {50, 34.4160},
+    }},
+    {"HeMcs2_160MHz", {
+        {5, 47.8139}, {10, 45.8767}, {15, 44.4795}, {20, 43.4017}, {25, 42.5141}, {30, 41.7535}, {35, 41.0821}, {40, 40.4801}, {45, 39.9307}, {50, 39.4236},
+    }},
+    {"HeMcs3_160MHz", {
+        {5, 51.9619}, {10, 49.9941}, {15, 48.5284}, {20, 47.3867}, {25, 46.4416}, {30, 45.6290}, {35, 44.9099}, {40, 44.2640}, {45, 43.6736}, {50, 43.1279},
+    }},
+    {"HeMcs4_160MHz", {
+        {5, 55.8389}, {10, 53.9360}, {15, 52.4548}, {20, 51.2855}, {25, 50.3106}, {30, 49.4682}, {35, 48.7201}, {40, 48.0462}, {45, 47.4288}, {50, 46.8571},
+    }},
+    {"HeMcs5_160MHz", {
+        {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
+    }},
+    {"HeMcs6_160MHz", {
+        {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
+    }},
+    {"HeMcs7_160MHz", {
+        {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
+    }},
+    {"HeMcs8_160MHz", {
+        {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
+    }},
+    {"HeMcs9_160MHz", {
+        {5, 65.6329}, {10, 64.0336}, {15, 62.5814}, {20, 61.3869}, {25, 60.3690}, {30, 59.4769}, {35, 58.6764}, {40, 57.9495}, {45, 57.2790}, {50, 56.6548},
+    }},
+    {"HeMcs10_160MHz", {
+        {5, 65.6329}, {10, 64.0336}, {15, 62.5814}, {20, 61.3869}, {25, 60.3690}, {30, 59.4769}, {35, 58.6764}, {40, 57.9495}, {45, 57.2790}, {50, 56.6548},
+    }},
+    {"HeMcs11_160MHz", {
+        {5, 65.6329}, {10, 64.0336}, {15, 62.5814}, {20, 61.3869}, {25, 60.3690}, {30, 59.4769}, {35, 58.6764}, {40, 57.9495}, {45, 57.2790}, {50, 56.6548},
     }},
 };
 
@@ -428,8 +556,17 @@
 }
 
 void
-TracePacketReception (std::string context, Ptr<const Packet> packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, SignalNoiseDbm signalNoise, uint16_t staId)
+TracePacketReception (std::string context, Ptr<const Packet> p, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, SignalNoiseDbm signalNoise, uint16_t staId)
 {
+  Ptr<Packet> packet = p->Copy ();
+  if (txVector.IsAggregation ())
+    {
+      AmpduSubframeHeader subHdr;
+      uint32_t extractedLength;
+      packet->RemoveHeader (subHdr);
+      extractedLength = subHdr.GetLength ();
+      packet = packet->CreateFragment (0, static_cast<uint32_t> (extractedLength));
+    }
   WifiMacHeader hdr;
   packet->PeekHeader (hdr);
   // hdr.GetAddr1() is the receiving MAC address
@@ -438,7 +575,7 @@
       return;
     }
   // hdr.GetAddr2() is the sending MAC address
-  if (packet->GetSize () == (pktSize + 36)) // ignore non-data frames
+  if (packet->GetSize () >= pktSize) // ignore non-data frames
     {
       IncrementCounter (packetsReceived, hdr.GetAddr2 ());
       IncrementCounter (bytesReceived, hdr.GetAddr2 (), pktSize);
@@ -506,7 +643,7 @@
       break;
     case BUSY_DECODING_PREAMBLE:
     {
-      if (p->GetSize () == (pktSize + 36)) // ignore non-data frames
+      if (p->GetSize () >= pktSize) // ignore non-data frames
         {
           IncrementCounter (rxEventWhileDecodingPreamble, addr);
         }
@@ -514,7 +651,7 @@
     }
     case RXING:
     {
-      if (p->GetSize () == (pktSize + 36)) // ignore non-data frames
+      if (p->GetSize () >= pktSize) // ignore non-data frames
         {
           IncrementCounter (rxEventWhileRxing, addr);
         }
@@ -522,7 +659,7 @@
     }
     case TXING:
     {
-      if (p->GetSize () == (pktSize + 36)) // ignore non-data frames
+      if (p->GetSize () >= pktSize) // ignore non-data frames
         {
           IncrementCounter (rxEventWhileTxing, addr);
         }
@@ -536,7 +673,7 @@
       break;
     case RECEPTION_ABORTED_BY_TX:
     {
-      if (p->GetSize () == (pktSize + 36)) // ignore non-data frames
+      if (p->GetSize () >= pktSize) // ignore non-data frames
         {
           IncrementCounter (rxEventAbortedByTx, addr);
         }
@@ -544,13 +681,15 @@
     }
     case L_SIG_FAILURE:
     {
-      if (p->GetSize () == (pktSize + 36)) // ignore non-data frames
+      if (p->GetSize () >= pktSize) // ignore non-data frames
         {
           IncrementCounter (phyHeaderFailed, addr);
         }
       break;
     }
+    case HT_SIG_FAILURE:
     case SIG_A_FAILURE:
+    case SIG_B_FAILURE:
       NS_FATAL_ERROR ("Unexpected PHY header failure!");
     case PREAMBLE_DETECTION_PACKET_SWITCH:
       NS_FATAL_ERROR ("All devices should send with same power, so no packet switch during preamble detection should occur!");
@@ -577,8 +716,23 @@
 void
 PhyRxOkTrace (std::string context, Ptr<const Packet> p, double snr, WifiMode mode, WifiPreamble preamble)
 {
-  NS_LOG_INFO ("PHY-RX-OK time=" << Simulator::Now () << " node=" << ContextToNodeId (context) << " size=" << p->GetSize () << " snr=" << snr << " mode=" << mode << " preamble=" << preamble);
-  if (p->GetSize () == (pktSize + 36)) // ignore non-data frames
+  uint8_t nMpdus = (p->GetSize () / pktSize);
+  NS_LOG_INFO ("PHY-RX-OK time=" << Simulator::Now ().As (Time::S)
+                                 << " node=" << ContextToNodeId (context)
+                                 << " size=" << p->GetSize ()
+                                 << " nMPDUs=" << +nMpdus
+                                 << " snr=" << snr
+                                 << " mode=" << mode
+                                 << " preamble=" << preamble);
+  if ((maxMpdus != 0) && (nMpdus != 0) && (nMpdus != maxMpdus))
+    {
+      if (nMpdus > maxMpdus)
+        {
+          NS_FATAL_ERROR ("A-MPDU settings not properly applied: maximum configured MPDUs is " << +maxMpdus << " but received an A-MPDU containing " << +nMpdus << " MPDUs");
+        }
+      NS_LOG_WARN ("Warning: less MPDUs aggregated in a received A-MPDU (" << +nMpdus << ") than configured (" << +maxMpdus << ")");
+    }
+  if (p->GetSize () >= pktSize) // ignore non-data frames
     {
       Mac48Address addr = ContextToMac (context);
       IncrementCounter (psduSucceeded, addr);
@@ -589,7 +743,7 @@
 PhyRxErrorTrace (std::string context, Ptr<const Packet> p, double snr)
 {
   NS_LOG_INFO ("PHY-RX-ERROR time=" << Simulator::Now () << " node=" << ContextToNodeId (context) << " size=" << p->GetSize () << " snr=" << snr);
-  if (p->GetSize () == (pktSize + 36)) // ignore non-data frames
+  if (p->GetSize () >= pktSize) // ignore non-data frames
     {
       Mac48Address addr = ContextToMac (context);
       IncrementCounter (psduFailed, addr);
@@ -604,7 +758,7 @@
     {
       phyTxTraceFile << Simulator::Now ().GetSeconds () << " " << ContextToNodeId (context) << " size=" << p->GetSize () << " " << txPowerW << std::endl;
     }
-  if (p->GetSize () == (pktSize + 36)) // ignore non-data frames
+  if (p->GetSize () >= pktSize) // ignore non-data frames
     {
       Mac48Address addr = ContextToMac (context);
       IncrementCounter (packetsTransmitted, addr);
@@ -689,8 +843,29 @@
 {
 public:
   Experiment ();
+
+  /**
+   * Configure and run the experiment.
+   *
+   * \param wifi the pre-configured WifiHelper
+   * \param wifiPhy the pre-configured YansWifiPhyHelper
+   * \param wifiMac the pre-configured WifiMacHelper
+   * \param wifiChannel the pre-configured YansWifiChannelHelper
+   * \param trialNumber the trial index
+   * \param networkSize the number of stations
+   * \param duration the duration of each simulation run
+   * \param pcap flag to enable/disable PCAP files generation
+   * \param infra flag to enable infrastructure model, ring adhoc network if not set
+   * \param guardIntervalNs the guard interval in ns
+   * \param distanceM the distance in meters
+   * \param apTxPowerDbm the AP transmit power in dBm
+   * \param staTxPowerDbm the STA transmit power in dBm
+   * \param pktInterval the packet interval
+   * \return 0 if all went well
+   */
   int Run (const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const WifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel,
-           uint32_t trialNumber, uint32_t networkSize, double duration, bool pcap, bool infra);
+           uint32_t trialNumber, uint32_t networkSize, Time duration, bool pcap, bool infra, uint16_t guardIntervalNs,
+           double distanceM, double apTxPowerDbm, double staTxPowerDbm, Time pktInterval);
 };
 
 Experiment::Experiment ()
@@ -699,7 +874,8 @@
 
 int
 Experiment::Run (const WifiHelper &helper, const YansWifiPhyHelper &wifiPhy, const WifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel,
-                 uint32_t trialNumber, uint32_t networkSize, double duration, bool pcap, bool infra)
+                 uint32_t trialNumber, uint32_t networkSize, Time duration, bool pcap, bool infra, uint16_t guardIntervalNs,
+                 double distance, double apTxPowerDbm, double staTxPowerDbm, Time pktInterval)
 {
   NodeContainer wifiNodes;
   if (infra)
@@ -723,15 +899,19 @@
   if (infra)
     {
       Ssid ssid = Ssid ("wifi-bianchi");
-      uint64_t beaconInterval = std::min<uint64_t> ((ceil ((duration * 1000000) / 1024) * 1024), (65535 * 1024)); //beacon interval needs to be a multiple of time units (1024 us)
+      uint64_t beaconInterval = std::min<uint64_t> ((ceil ((duration.GetSeconds () * 1000000) / 1024) * 1024), (65535 * 1024)); //beacon interval needs to be a multiple of time units (1024 us)
       mac.SetType ("ns3::ApWifiMac",
                    "BeaconInterval", TimeValue (MicroSeconds (beaconInterval)),
                    "Ssid", SsidValue (ssid));
+      phy.Set ("TxPowerStart", DoubleValue (apTxPowerDbm)); 
+      phy.Set ("TxPowerEnd", DoubleValue (apTxPowerDbm));
       devices = wifi.Install (phy, mac, wifiNodes.Get (0));
 
       mac.SetType ("ns3::StaWifiMac",
                    "MaxMissedBeacons", UintegerValue (std::numeric_limits<uint32_t>::max ()),
                    "Ssid", SsidValue (ssid));
+      phy.Set ("TxPowerStart", DoubleValue (staTxPowerDbm)); 
+      phy.Set ("TxPowerEnd", DoubleValue (staTxPowerDbm));
       for (uint32_t i = 1; i < nNodes; ++i)
         {
           devices.Add (wifi.Install (phy, mac, wifiNodes.Get (i)));
@@ -740,11 +920,27 @@
   else
     {
       mac.SetType ("ns3::AdhocWifiMac");
+      phy.Set ("TxPowerStart", DoubleValue (staTxPowerDbm));
+      phy.Set ("TxPowerEnd", DoubleValue (staTxPowerDbm));
       devices = wifi.Install (phy, mac, wifiNodes);
     }
 
   wifi.AssignStreams (devices, trialNumber);
 
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (guardIntervalNs == 400 ? true : false));
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HeConfiguration/GuardInterval", TimeValue (NanoSeconds (guardIntervalNs)));
+
+  // Configure aggregation
+  for (uint32_t i = 0; i < nNodes; ++i)
+    {
+      Ptr<NetDevice> dev = wifiNodes.Get (i)->GetDevice (0);
+      Ptr<WifiNetDevice> wifi_dev = DynamicCast<WifiNetDevice> (dev);
+      wifi_dev->GetMac ()->SetAttribute ("BE_MaxAmpduSize", UintegerValue (maxMpdus * (pktSize + 50)));
+      wifi_dev->GetMac ()->SetAttribute ("BK_MaxAmpduSize", UintegerValue (maxMpdus * (pktSize + 50)));
+      wifi_dev->GetMac ()->SetAttribute ("VO_MaxAmpduSize", UintegerValue (maxMpdus * (pktSize + 50)));
+      wifi_dev->GetMac ()->SetAttribute ("VI_MaxAmpduSize", UintegerValue (maxMpdus * (pktSize + 50)));
+    }
+
   MobilityHelper mobility;
   Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
   mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
@@ -755,7 +951,7 @@
   double angle = (static_cast<double> (360) / (nNodes - 1));
   for (uint32_t i = 0; i < (nNodes - 1); ++i)
     {
-      positionAlloc->Add (Vector (1.0 + (0.001 * cos ((i * angle * PI) / 180)), 1.0 + (0.001 * sin ((i * angle * PI) / 180)), 0.0));
+      positionAlloc->Add (Vector (1.0 + (distance * cos ((i * angle * PI) / 180)), 1.0 + (distance * sin ((i * angle * PI) / 180)), 0.0));
     }
 
   mobility.SetPositionAllocator (positionAlloc);
@@ -783,7 +979,7 @@
       wifiNodes.Get (i)->AddApplication (client);
       client->SetAttribute ("PacketSize", UintegerValue (pktSize));
       client->SetAttribute ("MaxPackets", UintegerValue (0));
-      client->SetAttribute ("Interval", TimeValue (MilliSeconds (1))); //TODO: reduce it for lower rates, increase it for higher rates
+      client->SetAttribute ("Interval", TimeValue (pktInterval));
       double start = startTime->GetValue ();
       NS_LOG_DEBUG ("Client " << i << " starting at " << start);
       client->SetStartTime (Seconds (start));
@@ -831,7 +1027,7 @@
   Config::Connect ("/NodeList/*/$ns3::Node/ApplicationList/*/$ns3::PacketSocketClient/Tx", MakeCallback (&SocketSendTrace));
 
   Simulator::Schedule (Seconds (10), &RestartCalc);
-  Simulator::Stop (Seconds (10 + duration));
+  Simulator::Stop (Seconds (10) + duration);
 
   if (pcap)
     {
@@ -868,20 +1064,27 @@
 
 int main (int argc, char *argv[])
 {
-  uint32_t nMinStas = 5;           ///< Minimum number of STAs to start with
-  uint32_t nMaxStas = 50;          ///< Maximum number of STAs to end with
-  uint32_t nStepSize = 5;          ///< Number of stations to add at each step
-  uint32_t verbose = 0;            ///< verbosity level that increases the number of debugging traces
-  double duration = 100;           ///< duration (in seconds) of each simulation run (i.e. per trial and per number of stations)
-  uint32_t trials = 1;             ///< Number of runs per point in the plot
-  bool pcap = false;               ///< Flag to enable/disable PCAP files generation
-  bool infra = false;              ///< Flag to enable infrastructure model, ring adhoc network if not set
-  std::string workDir = "./";      ///< the working directory to store generated files
-  double phyRate = 54;             ///< the constant PHY rate used to transmit Data frames (in Mbps)
-  std::string standard ("11a");    ///< the 802.11 standard
-  bool validate = false;           ///< Flag used for regression in order to verify ns-3 results are in the expected boundaries
-  uint32_t plotBianchiModel = 0x1; ///< First bit corresponds to the DIFS model, second bit to the EIFS model
-  double maxRelativeError = 0.015; ///< Maximum relative error tolerated between ns-3 results and the Bianchi model (used for regression, i.e. when the validate flag is set)
+  uint32_t nMinStas = 5;                  ///< Minimum number of STAs to start with
+  uint32_t nMaxStas = 50;                 ///< Maximum number of STAs to end with
+  uint32_t nStepSize = 5;                 ///< Number of stations to add at each step
+  uint32_t verbose = 0;                   ///< verbosity level that increases the number of debugging traces
+  double duration = 100;                  ///< duration (in seconds) of each simulation run (i.e. per trial and per number of stations)
+  uint32_t trials = 1;                    ///< Number of runs per point in the plot
+  bool pcap = false;                      ///< Flag to enable/disable PCAP files generation
+  bool infra = false;                     ///< Flag to enable infrastructure model, ring adhoc network if not set
+  std::string workDir = "./";             ///< the working directory to store generated files
+  std::string phyMode = "OfdmRate54Mbps"; ///< the constant PHY mode string used to transmit frames
+  std::string standard ("11a");           ///< the 802.11 standard
+  bool validate = false;                  ///< Flag used for regression in order to verify ns-3 results are in the expected boundaries
+  uint16_t plotBianchiModel = 0x01;        ///< First bit corresponds to the DIFS model, second bit to the EIFS model
+  double maxRelativeError = 0.015;        ///< Maximum relative error tolerated between ns-3 results and the Bianchi model (used for regression, i.e. when the validate flag is set)
+  double frequency = 5;                   ///< The operating frequency band in GHz: 2.4, 5 or 6
+  uint16_t channelWidth = 20;             ///< The constant channel width in MHz (only for 11n/ac/ax)
+  uint16_t guardIntervalNs = 800;         ///< The guard interval in nanoseconds (800 or 400 for 11n/ac, 800 or 1600 or 3200 for 11 ax)
+  uint16_t pktInterval = 1000;            ///< The socket packet interval in microseconds (a higher value is needed to reach saturation conditions as the channel bandwidth or the MCS increases)
+  double distance = 0.001;                ///< The distance in meters between the AP and the STAs
+  double apTxPower = 16;                  ///< The transmit power of the AP in dBm (if infrastructure only)
+  double staTxPower = 16;                 ///< The transmit power of each STA in dBm (or all STAs if adhoc)
 
   // Disable fragmentation and RTS/CTS
   Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("22000"));
@@ -902,13 +1105,22 @@
   cmd.AddValue ("pcap", "Enable/disable PCAP tracing", pcap);
   cmd.AddValue ("infra", "True to use infrastructure mode, false to use ring adhoc mode", infra);
   cmd.AddValue ("workDir", "The working directory used to store generated files", workDir);
-  cmd.AddValue ("phyRate", "Set the constant PHY rate in Mbps used to transmit Data frames", phyRate);
+  cmd.AddValue ("phyMode", "Set the constant PHY mode string used to transmit frames", phyMode);
   cmd.AddValue ("standard", "Set the standard (11a, 11b, 11g, 11n, 11ac, 11ax)", standard);
   cmd.AddValue ("nMinStas", "Minimum number of stations to start with", nMinStas);
   cmd.AddValue ("nMaxStas", "Maximum number of stations to start with", nMaxStas);
   cmd.AddValue ("nStepSize", "Number of stations to add at each step", nStepSize);
+  cmd.AddValue ("plotBianchiModel", "First bit corresponds to the DIFS model, second bit to the EIFS model", plotBianchiModel);
   cmd.AddValue ("validate", "Enable/disable validation of the ns-3 simulations against the Bianchi model", validate);
   cmd.AddValue ("maxRelativeError", "The maximum relative error tolerated between ns-3 results and the Bianchi model (used for regression, i.e. when the validate flag is set)", maxRelativeError);
+  cmd.AddValue ("frequency", "Set the operating frequency band in GHz: 2.4, 5 or 6", frequency);
+  cmd.AddValue ("channelWidth", "Set the constant channel width in MHz (only for 11n/ac/ax)", channelWidth);
+  cmd.AddValue ("guardIntervalNs", "Set the the guard interval in nanoseconds (800 or 400 for 11n/ac, 800 or 1600 or 3200 for 11 ax)", guardIntervalNs);
+  cmd.AddValue ("maxMpdus", "Set the maximum number of MPDUs in A-MPDUs (0 to disable MPDU aggregation)", maxMpdus);
+  cmd.AddValue ("distance", "Set the distance in meters between the AP and the STAs", distance);
+  cmd.AddValue ("apTxPower", "Set the transmit power of the AP in dBm (if infrastructure only)", apTxPower);
+  cmd.AddValue ("staTxPower", "Set the transmit power of each STA in dBm (or all STAs if adhoc)", staTxPower);
+  cmd.AddValue ("pktInterval", "Set the socket packet interval in microseconds", pktInterval);
   cmd.Parse (argc, argv);
 
   if (tracing)
@@ -949,53 +1161,87 @@
     {
       LogComponentEnable ("WifiBianchi", LOG_LEVEL_ALL);
     }
+  else
+    {
+      LogComponentEnable ("WifiBianchi", LOG_LEVEL_WARN);
+    }
   if (verbose >= 2)
     {
       WifiHelper::EnableLogComponents ();
     }
 
+  Config::SetDefault ("ns3::WifiPhy::ChannelWidth", UintegerValue (channelWidth));
+  std::stringstream phyModeStr;
+  phyModeStr << phyMode;
+  if (phyMode.find ("Mcs") != std::string::npos)
+    {
+      phyModeStr << "_" << channelWidth << "MHz";
+    }
+
   std::stringstream ss;
-  ss << "wifi-"<< standard << "-p-" << pktSize << (infra ? "-infrastructure" : "-adhoc") << "-r-" << phyRate << "-min-" << nMinStas << "-max-" << nMaxStas << "-step-" << nStepSize << "-throughput.plt";
+  ss << "wifi-"<< standard << "-p-" << pktSize << (infra ? "-infrastructure" : "-adhoc") << "-r-" << phyModeStr.str () << "-min-" << nMinStas << "-max-" << nMaxStas << "-step-" << nStepSize << "-throughput.plt";
   std::ofstream throughputPlot (ss.str ().c_str ());
   ss.str ("");
-  ss << "wifi-" << standard << "-p-" << pktSize << (infra ? "-infrastructure" : "-adhoc") <<"-r-" << phyRate << "-min-" << nMinStas << "-max-" << nMaxStas << "-step-" << nStepSize << "-throughput.eps";
+  ss << "wifi-" << standard << "-p-" << pktSize << (infra ? "-infrastructure" : "-adhoc") <<"-r-" << phyModeStr.str () << "-min-" << nMinStas << "-max-" << nMaxStas << "-step-" << nStepSize << "-throughput.eps";
   Gnuplot gnuplot = Gnuplot (ss.str ());
 
   WifiStandard wifiStandard;
-  std::stringstream phyRateStr;
   if (standard == "11a")
     {
       wifiStandard = WIFI_STANDARD_80211a;
-      if ((phyRate != 6) && (phyRate != 9) && (phyRate != 12) && (phyRate != 18) && (phyRate != 24) && (phyRate != 36) && (phyRate != 48) && (phyRate != 54))
-        {
-          NS_FATAL_ERROR ("Selected PHY rate " << phyRate << " is not defined in " << standard);
-        }
-      phyRateStr << "OfdmRate" << phyRate << "Mbps";
+      frequency = 5;
+      channelWidth = 20;
     }
   else if (standard == "11b")
     {
       wifiStandard = WIFI_STANDARD_80211b;
-      if ((phyRate != 1) && (phyRate != 2) && (phyRate != 5.5) && (phyRate != 11))
+      frequency = 2.4;
+      channelWidth = 22;
+    }
+  else if (standard == "11g")
+    {
+      wifiStandard = WIFI_STANDARD_80211g;
+      frequency = 2.4;
+      channelWidth = 20;
+    }
+  else if (standard == "11n")
+    {
+      if (frequency == 2.4)
         {
-          NS_FATAL_ERROR ("Selected PHY rate " << phyRate << " is not defined in " << standard);
+          wifiStandard = WIFI_STANDARD_80211n_2_4GHZ;
         }
-      if (phyRate == 5.5)
+      else if (frequency == 5)
         {
-          phyRateStr << "DsssRate5_5Mbps";
+          wifiStandard = WIFI_STANDARD_80211n_5GHZ;
         }
       else
         {
-          phyRateStr << "DsssRate" << phyRate << "Mbps";
+          NS_FATAL_ERROR ("Unsupported frequency band " << frequency << " GHz for standard " << standard);
         }
     }
-  else if (standard == "11g")
+  else if (standard == "11ac")
     {
-      wifiStandard = WIFI_STANDARD_80211g;
-      if ((phyRate != 6) && (phyRate != 9) && (phyRate != 12) && (phyRate != 18) && (phyRate != 24) && (phyRate != 36) && (phyRate != 48) && (phyRate != 54))
+      wifiStandard = WIFI_STANDARD_80211ac;
+      frequency = 5;
+    }
+  else if (standard == "11ax")
+    {
+      if (frequency == 2.4)
+        {
+          wifiStandard = WIFI_STANDARD_80211ax_2_4GHZ;
+        }
+      else if (frequency == 5)
+        {
+          wifiStandard = WIFI_STANDARD_80211ax_5GHZ;
+        }
+      else if (frequency == 6)
+        {
+          wifiStandard = WIFI_STANDARD_80211ax_6GHZ;
+        }
+      else
         {
-          NS_FATAL_ERROR ("Selected PHY rate " << phyRate << " is not defined in " << standard);
+          NS_FATAL_ERROR ("Unsupported frequency band " << frequency << " GHz for standard " << standard);
         }
-      phyRateStr << "ErpOfdmRate" << phyRate << "Mbps";
     }
   else
     {
@@ -1003,16 +1249,40 @@
     }
 
   YansWifiPhyHelper wifiPhy;
-  YansWifiChannelHelper wifiChannel;
-  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
-  wifiChannel.AddPropagationLoss ("ns3::LogDistancePropagationLossModel");
   wifiPhy.DisablePreambleDetectionModel ();
 
-  WifiMacHelper wifiMac;
+  YansWifiChannelHelper wifiChannel;
+  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
+  if (frequency == 6)
+    {
+      // Reference Loss for Friss at 1 m with 6.0 GHz
+      wifiChannel.AddPropagationLoss ("ns3::LogDistancePropagationLossModel",
+                                      "Exponent", DoubleValue (2.0),
+                                      "ReferenceDistance", DoubleValue (1.0),
+                                      "ReferenceLoss", DoubleValue (49.013));
+    }
+  else if (frequency == 5)
+    {
+      // Reference Loss for Friss at 1 m with 5.15 GHz
+      wifiChannel.AddPropagationLoss ("ns3::LogDistancePropagationLossModel",
+                                      "Exponent", DoubleValue (2.0),
+                                      "ReferenceDistance", DoubleValue (1.0),
+                                      "ReferenceLoss", DoubleValue (46.6777));
+    }
+  else
+    {
+      // Reference Loss for Friss at 1 m with 2.4 GHz
+      wifiChannel.AddPropagationLoss ("ns3::LogDistancePropagationLossModel",
+                                      "Exponent", DoubleValue (2.0),
+                                      "ReferenceDistance", DoubleValue (1.0),
+                                      "ReferenceLoss", DoubleValue (40.046));
+    }
 
   WifiHelper wifi;
   wifi.SetStandard (wifiStandard);
-  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue (phyRateStr.str()));
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                "DataMode", StringValue (phyMode),
+                                "ControlMode", StringValue (phyMode));
 
   Gnuplot2dDataset dataset;
   Gnuplot2dDataset datasetBianchiEifs;
@@ -1023,6 +1293,7 @@
   datasetBianchiDifs.SetStyle (Gnuplot2dDataset::LINES_POINTS);
 
   Experiment experiment;
+  WifiMacHelper wifiMac;
   double averageThroughput, throughputArray[trials];
   for (uint32_t n = nMinStas; n <= nMaxStas; n += nStepSize)
     {
@@ -1044,17 +1315,17 @@
           rxEventAbortedByTx.clear ();
           associated.clear ();
           throughput = 0;
-          std::cout << "Trial " << runIndex + 1 << " of " << trials << "; "<< phyRate << " Mbps for " << n << " nodes " << std::endl;
+          std::cout << "Trial " << runIndex + 1 << " of " << trials << "; "<< phyModeStr.str () << " for " << n << " nodes " << std::endl;
           if (tracing)
             {
-              cwTraceFile << "# Trial " << runIndex + 1 << " of " << trials << "; "<< phyRate << " Mbps for " << n << " nodes" << std::endl;
-              backoffTraceFile << "# Trial " << runIndex + 1 << " of " << trials << "; "<< phyRate << " Mbps for " << n << " nodes" << std::endl;
-              phyTxTraceFile << "# Trial " << runIndex + 1 << " of " << trials << "; " << phyRate << " Mbps for " << n << " nodes" << std::endl;
-              macTxTraceFile << "# Trial " << runIndex + 1 << " of " << trials << "; " << phyRate << " Mbps for " << n << " nodes" << std::endl;
-              macRxTraceFile << "# Trial " << runIndex + 1 << " of " << trials << "; " << phyRate << " Mbps for " << n << " nodes" << std::endl;
-              socketSendTraceFile << "# Trial " << runIndex + 1 << " of " << trials << "; " << phyRate << " Mbps for " << n << " nodes" << std::endl;
+              cwTraceFile << "# Trial " << runIndex + 1 << " of " << trials << "; "<< phyModeStr.str () << " for " << n << " nodes" << std::endl;
+              backoffTraceFile << "# Trial " << runIndex + 1 << " of " << trials << "; "<< phyModeStr.str () << " for " << n << " nodes" << std::endl;
+              phyTxTraceFile << "# Trial " << runIndex + 1 << " of " << trials << "; " << phyModeStr.str () << " for " << n << " nodes" << std::endl;
+              macTxTraceFile << "# Trial " << runIndex + 1 << " of " << trials << "; " << phyModeStr.str () << " for " << n << " nodes" << std::endl;
+              macRxTraceFile << "# Trial " << runIndex + 1 << " of " << trials << "; " << phyModeStr.str () << " for " << n << " nodes" << std::endl;
+              socketSendTraceFile << "# Trial " << runIndex + 1 << " of " << trials << "; " << phyModeStr.str () << " for " << n << " nodes" << std::endl;
             }
-          experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel, runIndex, n, duration, pcap, infra);
+          experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel, runIndex, n, Seconds (duration), pcap, infra, guardIntervalNs, distance, apTxPower, staTxPower, MicroSeconds (pktInterval));
           uint32_t k = 0;
           if (bytesReceived.size () != n)
             {
@@ -1105,7 +1376,7 @@
       bool rateFound = false;
       double relativeErrorDifs = 0;
       double relativeErrorEifs = 0;
-      auto itDifs = bianchiResultsDifs.find (static_cast<unsigned int> (phyRate * 1000000));
+      auto itDifs = bianchiResultsDifs.find (phyModeStr.str ());
       if (itDifs != bianchiResultsDifs.end ())
         {
           rateFound = true;
@@ -1120,7 +1391,7 @@
               NS_FATAL_ERROR ("No Bianchi results (DIFS) calculated for that number of stations!");
             }
         }
-      auto itEifs = bianchiResultsEifs.find (static_cast<unsigned int> (phyRate * 1000000));
+      auto itEifs = bianchiResultsEifs.find (phyModeStr.str ());
       if (itEifs != bianchiResultsEifs.end ())
         {
           rateFound = true;
@@ -1155,7 +1426,7 @@
     }
   dataset.SetTitle ("ns-3");
 
-  auto itDifs = bianchiResultsDifs.find (static_cast<unsigned int> (phyRate * 1000000));
+  auto itDifs = bianchiResultsDifs.find (phyModeStr.str ());
   if (itDifs != bianchiResultsDifs.end ())
     {
       for (uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
@@ -1177,7 +1448,7 @@
         }
     }
 
-  auto itEifs = bianchiResultsEifs.find (static_cast<unsigned int> (phyRate * 1000000));
+  auto itEifs = bianchiResultsEifs.find (phyModeStr.str ());
   if (itEifs != bianchiResultsEifs.end ())
     {
       for (uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
@@ -1222,17 +1493,17 @@
      << "set style line 8 linewidth 5\n"
      << "set style increment user";
   gnuplot.SetExtra (ss.str ());
-  if (plotBianchiModel & 0x01)
+  if (plotBianchiModel & 0x0001)
     {
       datasetBianchiDifs.SetTitle ("Bianchi");
       gnuplot.AddDataset (datasetBianchiDifs);
     }
-  if (plotBianchiModel & 0x02)
+  if (plotBianchiModel & 0x0002)
     {
       datasetBianchiEifs.SetTitle ("Bianchi");
       gnuplot.AddDataset (datasetBianchiEifs);
     }
-  if (plotBianchiModel == 0x03)
+  if (plotBianchiModel == 0x0003)
     {
       datasetBianchiEifs.SetTitle ("Bianchi (EIFS - lower bound)");
       datasetBianchiDifs.SetTitle ("Bianchi (DIFS - upper bound)");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/examples/wifi-manager-example.cc ns-3.34/src/wifi/examples/wifi-manager-example.cc
--- ns-3.33/src/wifi/examples/wifi-manager-example.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/examples/wifi-manager-example.cc	2021-07-14 10:31:07.000000000 -0700
@@ -29,8 +29,8 @@
 //
 // By default, the 802.11a standard using IdealWifiManager is plotted. Several command line
 // arguments can change the following options:
-// --wifiManager (Aarf, Aarfcd, Amrr, Arf, Cara, Ideal, Minstrel, MinstrelHt, Onoe, Rraa)
-// --standard (802.11a, 802.11b, 802.11g, 802.11n-5GHz, 802.11n-2.4GHz, 802.11ac, 802.11-holland, 802.11p-10MHz, 802.11p-5MHz)
+// --wifiManager (Aarf, Aarfcd, Amrr, Arf, Cara, Ideal, Minstrel, MinstrelHt, Onoe, Rraa, ThompsonSampling)
+// --standard (802.11a, 802.11b, 802.11g, 802.11p-10MHz, 802.11p-5MHz, 802.11n-5GHz, 802.11n-2.4GHz, 802.11ac, 802.11ax-6GHz, 802.11ax-5GHz, 802.11ax-2.4GHz)
 // --serverShortGuardInterval and --clientShortGuardInterval (for 802.11n/ac)
 // --serverNss and --clientNss (for 802.11n/ac)
 // --serverChannelWidth and --clientChannelWidth (for 802.11n/ac)
@@ -129,7 +129,7 @@
 };
 
 void
-ChangeSignalAndReportRate (Ptr<FixedRssLossModel> rssModel, struct Step step, double rss, Gnuplot2dDataset& rateDataset, Gnuplot2dDataset& actualDataset)
+ChangeSignalAndReportRate (Ptr<FixedRssLossModel> rssModel, Step step, double rss, Gnuplot2dDataset& rateDataset, Gnuplot2dDataset& actualDataset)
 {
   NS_LOG_FUNCTION (rssModel << step.stepSize << step.stepTime << rss);
   double snr = rss - noiseDbm;
@@ -162,8 +162,8 @@
   uint16_t clientNss = 1;
   uint16_t serverShortGuardInterval = 800;
   uint16_t clientShortGuardInterval = 800;
-  uint16_t serverChannelWidth = 20;
-  uint16_t clientChannelWidth = 20;
+  uint16_t serverChannelWidth = 0;  // use default for standard and band
+  uint16_t clientChannelWidth = 0;  // use default for standard and band
   std::string wifiManager ("Ideal");
   std::string standard ("802.11a");
   StandardInfo serverSelectedStandard;
@@ -186,8 +186,8 @@
   cmd.AddValue ("clientNss", "Set nss of the client (valid only for 802.11n or ac)", clientNss);
   cmd.AddValue ("serverShortGuardInterval", "Set short guard interval of the server (802.11n/ac/ax) in nanoseconds", serverShortGuardInterval);
   cmd.AddValue ("clientShortGuardInterval", "Set short guard interval of the client (802.11n/ac/ax) in nanoseconds", clientShortGuardInterval);
-  cmd.AddValue ("standard", "Set standard (802.11a, 802.11b, 802.11g, 802.11n-5GHz, 802.11n-2.4GHz, 802.11ac, 802.11-holland, 802.11p-10MHz, 802.11p-5MHz, 802.11ax-5GHz, 802.11ax-2.4GHz)", standard);
-  cmd.AddValue ("wifiManager", "Set wifi rate manager (Aarf, Aarfcd, Amrr, Arf, Cara, Ideal, Minstrel, MinstrelHt, Onoe, Rraa)", wifiManager);
+  cmd.AddValue ("standard", "Set standard (802.11a, 802.11b, 802.11g, 802.11p-10MHz, 802.11p-5MHz, 802.11n-5GHz, 802.11n-2.4GHz, 802.11ac, 802.11ax-6GHz, 802.11ax-5GHz, 802.11ax-2.4GHz)", standard);
+  cmd.AddValue ("wifiManager", "Set wifi rate manager (Aarf, Aarfcd, Amrr, Arf, Cara, Ideal, Minstrel, MinstrelHt, Onoe, Rraa, ThompsonSampling)", wifiManager);
   cmd.AddValue ("infrastructure", "Use infrastructure instead of adhoc", infrastructure);
   cmd.Parse (argc,argv);
 
@@ -205,36 +205,78 @@
 
   if (standard == "802.11b")
     {
+      if (serverChannelWidth == 0)
+        {
+          serverChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ);
+        }
       NS_ABORT_MSG_IF (serverChannelWidth != 22 && serverChannelWidth != 22, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (serverNss != 1, "Invalid nss for standard " << standard);
+      if (clientChannelWidth == 0)
+        {
+          clientChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ);
+        }
       NS_ABORT_MSG_IF (clientChannelWidth != 22 && clientChannelWidth != 22, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (clientNss != 1, "Invalid nss for standard " << standard);
     }
   else if (standard == "802.11a" || standard == "802.11g")
     {
+      if (serverChannelWidth == 0)
+        {
+          serverChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ);
+        }
       NS_ABORT_MSG_IF (serverChannelWidth != 20, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (serverNss != 1, "Invalid nss for standard " << standard);
+      if (clientChannelWidth == 0)
+        {
+          clientChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ);
+        }
       NS_ABORT_MSG_IF (clientChannelWidth != 20, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (clientNss != 1, "Invalid nss for standard " << standard);
     }
   else if (standard == "802.11n-5GHz" || standard == "802.11n-2.4GHz")
     {
+      WifiPhyBand band = (standard == "802.11n-2.4GHz" ? WIFI_PHY_BAND_2_4GHZ : WIFI_PHY_BAND_5GHZ);
+      if (serverChannelWidth == 0)
+        {
+          serverChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211n, band);
+        }
       NS_ABORT_MSG_IF (serverChannelWidth != 20 && serverChannelWidth != 40, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (serverNss == 0 || serverNss > 4, "Invalid nss " << serverNss << " for standard " << standard);
+      if (clientChannelWidth == 0)
+        {
+          clientChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211n, band);
+        }
       NS_ABORT_MSG_IF (clientChannelWidth != 20 && clientChannelWidth != 40, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (clientNss == 0 || clientNss > 4, "Invalid nss " << clientNss << " for standard " << standard);
     }
   else if (standard == "802.11ac")
     {
+      if (serverChannelWidth == 0)
+        {
+          serverChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ);
+        }
       NS_ABORT_MSG_IF (serverChannelWidth != 20 && serverChannelWidth != 40 && serverChannelWidth != 80 && serverChannelWidth != 160, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (serverNss == 0 || serverNss > 4, "Invalid nss " << serverNss << " for standard " << standard);
+      if (clientChannelWidth == 0)
+        {
+          clientChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ);
+        }
       NS_ABORT_MSG_IF (clientChannelWidth != 20 && clientChannelWidth != 40 && clientChannelWidth != 80 && clientChannelWidth != 160, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (clientNss == 0 || clientNss > 4, "Invalid nss " << clientNss << " for standard " << standard);
     }
-  else if (standard == "802.11ax-5GHz" || standard == "802.11ax-2.4GHz")
+  else if (standard == "802.11ax-6GHz" ||standard == "802.11ax-5GHz" || standard == "802.11ax-2.4GHz")
     {
+      WifiPhyBand band = (standard == "802.11ax-2.4GHz" ? WIFI_PHY_BAND_2_4GHZ : standard == "802.11ax-6GHz" ? WIFI_PHY_BAND_6GHZ : WIFI_PHY_BAND_5GHZ);
+      if (serverChannelWidth == 0)
+        {
+          serverChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211ax, band);
+        }
       NS_ABORT_MSG_IF (serverChannelWidth != 20 && serverChannelWidth != 40 && serverChannelWidth != 80 && serverChannelWidth != 160, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (serverNss == 0 || serverNss > 4, "Invalid nss " << serverNss << " for standard " << standard);
+      if (clientChannelWidth == 0)
+        {
+          clientChannelWidth = GetDefaultChannelWidth (WIFI_PHY_STANDARD_80211ax, band);
+        }
       NS_ABORT_MSG_IF (clientChannelWidth != 20 && clientChannelWidth != 40 && clientChannelWidth != 80 && clientChannelWidth != 160, "Invalid channel width for standard " << standard);
       NS_ABORT_MSG_IF (clientNss == 0 || clientNss > 4, "Invalid nss " << clientNss << " for standard " << standard);
     }
@@ -252,9 +294,9 @@
   serverStandards.push_back (StandardInfo ("802.11n-5GHz", WIFI_STANDARD_80211n_5GHZ, serverChannelWidth, 3, 30, 0, 35, 80 * channelRateFactor));
   serverStandards.push_back (StandardInfo ("802.11n-2.4GHz", WIFI_STANDARD_80211n_2_4GHZ, serverChannelWidth, 3, 30, 0, 35, 80 * channelRateFactor));
   serverStandards.push_back (StandardInfo ("802.11ac", WIFI_STANDARD_80211ac, serverChannelWidth, 5, 50, 0, 55, 120 * channelRateFactor));
-  serverStandards.push_back (StandardInfo ("802.11-holland", WIFI_STANDARD_holland, 20, 3, 27, 0, 30, 60));
   serverStandards.push_back (StandardInfo ("802.11p-10MHz", WIFI_STANDARD_80211p, 10, 3, 27, 0, 30, 60));
   serverStandards.push_back (StandardInfo ("802.11p-5MHz", WIFI_STANDARD_80211p, 5, 3, 27, 0, 30, 60));
+  serverStandards.push_back (StandardInfo ("802.11ax-6GHz", WIFI_STANDARD_80211ax_6GHZ, serverChannelWidth, 5, 55, 0, 60, 120 * channelRateFactor));
   serverStandards.push_back (StandardInfo ("802.11ax-5GHz", WIFI_STANDARD_80211ax_5GHZ, serverChannelWidth, 5, 55, 0, 60, 120 * channelRateFactor));
   serverStandards.push_back (StandardInfo ("802.11ax-2.4GHz", WIFI_STANDARD_80211ax_2_4GHZ, serverChannelWidth, 5, 55, 0, 60, 120 * channelRateFactor));
 
@@ -264,9 +306,9 @@
   clientStandards.push_back (StandardInfo ("802.11n-5GHz", WIFI_STANDARD_80211n_5GHZ, clientChannelWidth, 3, 30, 0, 35, 80 * channelRateFactor));
   clientStandards.push_back (StandardInfo ("802.11n-2.4GHz", WIFI_STANDARD_80211n_2_4GHZ, clientChannelWidth, 3, 30, 0, 35, 80 * channelRateFactor));
   clientStandards.push_back (StandardInfo ("802.11ac", WIFI_STANDARD_80211ac, clientChannelWidth, 5, 50, 0, 55, 120 * channelRateFactor));
-  clientStandards.push_back (StandardInfo ("802.11-holland", WIFI_STANDARD_holland, 20, 3, 27, 0, 30, 60));
   clientStandards.push_back (StandardInfo ("802.11p-10MHz", WIFI_STANDARD_80211p, 10, 3, 27, 0, 30, 60));
   clientStandards.push_back (StandardInfo ("802.11p-5MHz", WIFI_STANDARD_80211p, 5, 3, 27, 0, 30, 60));
+  clientStandards.push_back (StandardInfo ("802.11ax-6GHz", WIFI_STANDARD_80211ax_6GHZ, clientChannelWidth, 5, 55, 0, 60, 160 * channelRateFactor));
   clientStandards.push_back (StandardInfo ("802.11ax-5GHz", WIFI_STANDARD_80211ax_5GHZ, clientChannelWidth, 5, 55, 0, 60, 160 * channelRateFactor));
   clientStandards.push_back (StandardInfo ("802.11ax-2.4GHz", WIFI_STANDARD_80211ax_2_4GHZ, clientChannelWidth, 5, 55, 0, 60, 160 * channelRateFactor));
 
@@ -305,6 +347,7 @@
   if (standard == "802.11n-5GHz"
       || standard == "802.11n-2.4GHz"
       || standard == "802.11ac"
+      || standard == "802.11ax-6GHz"
       || standard == "802.11ax-5GHz"
       || standard == "802.11ax-2.4GHz")
     {
@@ -354,15 +397,19 @@
       Ssid ssid = Ssid ("ns-3-ssid");
       wifiMac.SetType ("ns3::StaWifiMac",
                        "Ssid", SsidValue (ssid));
+      wifiPhy.Set ("ChannelWidth", UintegerValue (serverSelectedStandard.m_width));
       serverDevice = wifi.Install (wifiPhy, wifiMac, serverNode);
       wifiMac.SetType ("ns3::ApWifiMac",
                        "Ssid", SsidValue (ssid));
+      wifiPhy.Set ("ChannelWidth", UintegerValue (clientSelectedStandard.m_width));
       clientDevice = wifi.Install (wifiPhy, wifiMac, clientNode);
     }
   else
     {
       wifiMac.SetType ("ns3::AdhocWifiMac");
+      wifiPhy.Set ("ChannelWidth", UintegerValue (serverSelectedStandard.m_width));
       serverDevice = wifi.Install (wifiPhy, wifiMac, serverNode);
+      wifiPhy.Set ("ChannelWidth", UintegerValue (clientSelectedStandard.m_width));
       clientDevice = wifi.Install (wifiPhy, wifiMac, clientNode);
     }
 
@@ -390,7 +437,7 @@
 
   Gnuplot2dDataset rateDataset (clientSelectedStandard.m_name + std::string ("-rate selected"));
   Gnuplot2dDataset actualDataset (clientSelectedStandard.m_name + std::string ("-observed"));
-  struct Step step;
+  Step step;
   step.stepSize = stepSize;
   step.stepTime = stepTime;
 
@@ -411,24 +458,21 @@
   wifiPhyPtrServer->SetNumberOfAntennas (t_serverNss);
   wifiPhyPtrServer->SetMaxSupportedTxSpatialStreams (t_serverNss);
   wifiPhyPtrServer->SetMaxSupportedRxSpatialStreams (t_serverNss);
-  // Only set the channel width and guard interval for HT and VHT modes
+  // Only set the guard interval for HT and VHT modes
   if (serverSelectedStandard.m_name == "802.11n-5GHz"
       || serverSelectedStandard.m_name == "802.11n-2.4GHz"
       || serverSelectedStandard.m_name == "802.11ac")
     {
-      wifiPhyPtrServer->SetChannelWidth (serverSelectedStandard.m_width);
-      wifiPhyPtrClient->SetChannelWidth (clientSelectedStandard.m_width);
       Ptr<HtConfiguration> clientHtConfiguration = wndClient->GetHtConfiguration ();
       clientHtConfiguration->SetShortGuardIntervalSupported (clientShortGuardInterval == 400);
       Ptr<HtConfiguration> serverHtConfiguration = wndServer->GetHtConfiguration ();
       serverHtConfiguration->SetShortGuardIntervalSupported (serverShortGuardInterval == 400);
     }
-  else if (serverSelectedStandard.m_name == "802.11ax-5GHz"
+  else if (serverSelectedStandard.m_name == "802.11ax-6GHz"
+           || serverSelectedStandard.m_name == "802.11ax-5GHz"
            || serverSelectedStandard.m_name == "802.11ax-2.4GHz")
     {
-      wifiPhyPtrServer->SetChannelWidth (serverSelectedStandard.m_width);
-      wifiPhyPtrClient->SetChannelWidth (clientSelectedStandard.m_width);
-      wndServer->GetHeConfiguration ()->SetGuardInterval (NanoSeconds (clientShortGuardInterval));
+      wndServer->GetHeConfiguration ()->SetGuardInterval (NanoSeconds (serverShortGuardInterval));
       wndClient->GetHeConfiguration ()->SetGuardInterval (NanoSeconds (clientShortGuardInterval));
     }
   NS_LOG_DEBUG ("Channel width " << wifiPhyPtrClient->GetChannelWidth () << " noiseDbm " << noiseDbm);
@@ -508,7 +552,8 @@
   if (standard == "802.11n-5GHz"
       || standard == "802.11n-2.4GHz"
       || standard == "802.11ac"
-      || standard == "802.11n-5GHz"
+      || standard == "802.11ax-6GHz"
+      || standard == "802.11ax-5GHz"
       || standard == "802.11ax-2.4GHz")
     {
       std::ostringstream serverGiStrStr;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/examples/wifi-phy-configuration.cc ns-3.34/src/wifi/examples/wifi-phy-configuration.cc
--- ns-3.33/src/wifi/examples/wifi-phy-configuration.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/examples/wifi-phy-configuration.cc	2021-07-14 10:31:07.000000000 -0700
@@ -61,6 +61,7 @@
 {
   uint32_t testCase = 0;
   bool printAttributes = false;
+  bool exceptionThrown = false;
 
   CommandLine cmd (__FILE__);
   cmd.AddValue ("testCase", "Test case", testCase);
@@ -102,11 +103,8 @@
     case 0:
       // Default configuration, without WifiHelper::SetStandard or WifiHelper
       phySta = CreateObject<YansWifiPhy> ();
-      // The default results in an invalid configuration of channel 0,
-      // width 20, and frequency 0 MHz
-      NS_ASSERT (phySta->GetChannelNumber () == 0);
-      NS_ASSERT (phySta->GetChannelWidth () == 20);
-      NS_ASSERT (phySta->GetFrequency () == 0);
+      // The default results in an invalid configuration
+      NS_ASSERT (!phySta->GetOperatingChannel ().IsSet ());
       PrintAttributesIfEnabled (printAttributes);
       break;
 
@@ -237,17 +235,6 @@
       PrintAttributesIfEnabled (printAttributes);
       break;
     case 12:
-      wifi.SetStandard (WIFI_STANDARD_holland);
-      staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
-      apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
-      phySta = GetYansWifiPhyPtr (staDevice);
-      // We expect channel 36, width 20, frequency 5180
-      NS_ASSERT (phySta->GetChannelNumber () == 36);
-      NS_ASSERT (phySta->GetChannelWidth () == 20);
-      NS_ASSERT (phySta->GetFrequency () == 5180);
-      PrintAttributesIfEnabled (printAttributes);
-      break;
-    case 13:
       wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
       phy.Set ("ChannelNumber", UintegerValue (44));
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
@@ -259,7 +246,7 @@
       NS_ASSERT (phySta->GetFrequency () == 5220);
       PrintAttributesIfEnabled (printAttributes);
       break;
-    case 14:
+    case 13:
       wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
       phy.Set ("ChannelNumber", UintegerValue (44));
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
@@ -274,53 +261,61 @@
       NS_ASSERT (phySta->GetFrequency () == 5200);
       PrintAttributesIfEnabled (printAttributes);
       break;
-    case 15:
+    case 14:
       wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
       phy.Set ("ChannelNumber", UintegerValue (44));
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
-      // Post-install reconfiguration to channel width 40 MHz
-      Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelWidth", UintegerValue (40));
-      Config::Set ("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelWidth", UintegerValue (40));
-      // Although channel 44 is configured originally for 20 MHz, we
-      // allow it to be used for 40 MHz here
-      NS_ASSERT (phySta->GetChannelNumber () == 44);
+      // Post-install reconfiguration to a 40 MHz channel
+      Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber", UintegerValue (46));
+      Config::Set ("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber", UintegerValue (46));
+      NS_ASSERT (phySta->GetChannelNumber () == 46);
       NS_ASSERT (phySta->GetChannelWidth () == 40);
-      NS_ASSERT (phySta->GetFrequency () == 5220);
+      NS_ASSERT (phySta->GetFrequency () == 5230);
       PrintAttributesIfEnabled (printAttributes);
       break;
-    case 16:
+    case 15:
       Config::SetDefault ("ns3::WifiPhy::ChannelNumber", UintegerValue (44));
       wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
-      // Post-install reconfiguration to channel width 40 MHz
-      Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelWidth", UintegerValue (40));
-      Config::Set ("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelWidth", UintegerValue (40));
-      // Although channel 44 is configured originally for 20 MHz, we
-      // allow it to be used for 40 MHz here
-      NS_ASSERT (phySta->GetChannelNumber () == 44);
+      // Post-install reconfiguration to a 40 MHz channel
+      Config::Set ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber", UintegerValue (46));
+      Config::Set ("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber", UintegerValue (46));
+      NS_ASSERT (phySta->GetChannelNumber () == 46);
       NS_ASSERT (phySta->GetChannelWidth () == 40);
-      NS_ASSERT (phySta->GetFrequency () == 5220);
+      NS_ASSERT (phySta->GetFrequency () == 5230);
       PrintAttributesIfEnabled (printAttributes);
       break;
-    case 17:
-      // Test that setting Frequency to a non-standard value will zero the
-      // channel number
+    case 16:
+      // Test that setting Frequency to a non-standard value will throw an exception
       Config::SetDefault ("ns3::WifiPhy::Frequency", UintegerValue (5281));
       wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
-      staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
-      apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
-      phySta = GetYansWifiPhyPtr (staDevice);
-      // We expect channel number to be zero since frequency doesn't match
-      NS_ASSERT (phySta->GetChannelNumber () == 0);
-      NS_ASSERT (phySta->GetChannelWidth () == 20);
-      NS_ASSERT (phySta->GetFrequency () == 5281);
+      exceptionThrown = false;
+      try
+        {
+          staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
+        }
+      catch (const std::runtime_error&)
+        {
+          exceptionThrown = true;
+        }
+      NS_ASSERT (exceptionThrown);
+      exceptionThrown = false;
+      try
+        {
+          apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
+        }
+      catch (const std::runtime_error&)
+        {
+          exceptionThrown = true;
+        }
+      NS_ASSERT (exceptionThrown);
       PrintAttributesIfEnabled (printAttributes);
       break;
-    case 18:
+    case 17:
       // Test that setting Frequency to a standard value will set the
       // channel number correctly
       Config::SetDefault ("ns3::WifiPhy::Frequency", UintegerValue (5500));
@@ -334,47 +329,75 @@
       NS_ASSERT (phySta->GetFrequency () == 5500);
       PrintAttributesIfEnabled (printAttributes);
       break;
-    case 19:
-      // Define a new channel number
+    case 18:
+      // Set a wrong channel after initialization
       wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
-      // This case will error exit due to invalid channel number unless
-      // we provide the DefineChannelNumber() below
-      phySta->DefineChannelNumber (99, WIFI_PHY_BAND_5GHZ, WIFI_PHY_STANDARD_80211n, 5185, 40);
-      phySta->SetAttribute ("ChannelNumber", UintegerValue (99));
+      exceptionThrown = false;
+      try
+        {
+          phySta->SetOperatingChannel (99, 5185, 40);
+        }
+      catch (const std::runtime_error&)
+        {
+          exceptionThrown = true;
+        }
+      NS_ASSERT (exceptionThrown);
       PrintAttributesIfEnabled (printAttributes);
       break;
-    case 20:
+    case 19:
       // Test how channel number behaves when frequency is non-standard
       wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
       phySta = GetYansWifiPhyPtr (staDevice);
-      phySta->SetAttribute ("Frequency", UintegerValue (5181));
-      // We expect channel number to be 0 due to unknown center frequency 5181
-      NS_ASSERT (phySta->GetChannelNumber () == 0);
-      NS_ASSERT (phySta->GetChannelWidth () == 20);
-      NS_ASSERT (phySta->GetFrequency () == 5181);
+      exceptionThrown = false;
+      try
+        {
+          phySta->SetAttribute ("Frequency", UintegerValue (5181));
+        }
+      catch (const std::runtime_error&)
+        {
+          exceptionThrown = true;
+        }
+      // We expect that an exception is thrown due to unknown center frequency 5181
+      NS_ASSERT (exceptionThrown);
       phySta->SetAttribute ("Frequency", UintegerValue (5180));
       // We expect channel number to be 36 due to known center frequency 5180
       NS_ASSERT (phySta->GetChannelNumber () == 36);
       NS_ASSERT (phySta->GetChannelWidth () == 20);
       NS_ASSERT (phySta->GetFrequency () == 5180);
-      phySta->SetAttribute ("Frequency", UintegerValue (5179));
-      // We expect channel number to be 0 due to unknown center frequency 5179
-      NS_ASSERT (phySta->GetChannelNumber () == 0);
-      NS_ASSERT (phySta->GetChannelWidth () == 20);
-      NS_ASSERT (phySta->GetFrequency () == 5179);
+      exceptionThrown = false;
+      try
+        {
+          phySta->SetAttribute ("Frequency", UintegerValue (5179));
+        }
+      catch (const std::runtime_error&)
+        {
+          exceptionThrown = true;
+        }
+      // We expect that an exception is thrown due to unknown center frequency 5179
+      NS_ASSERT (exceptionThrown);
       phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
       NS_ASSERT (phySta->GetChannelNumber () == 36);
       NS_ASSERT (phySta->GetChannelWidth () == 20);
       NS_ASSERT (phySta->GetFrequency () == 5180);
       PrintAttributesIfEnabled (printAttributes);
       break;
-    case 21:
-      // Set both channel and frequency to consistent values
+    case 20:
+      // Set both channel and frequency to consistent values before initialization
+      Config::SetDefault ("ns3::WifiPhy::Frequency", UintegerValue (5200));
+      Config::SetDefault ("ns3::WifiPhy::ChannelNumber", UintegerValue (40));
+      wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+      staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
+      apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
+      phySta = GetYansWifiPhyPtr (staDevice);
+      NS_ASSERT (phySta->GetChannelNumber () == 40);
+      NS_ASSERT (phySta->GetChannelWidth () == 20);
+      NS_ASSERT (phySta->GetFrequency () == 5200);
+      // Set both channel and frequency to consistent values after initialization
       wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
       staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
       apDevice = wifi.Install (phy, macAp, wifiApNode.Get (0));
@@ -397,18 +420,36 @@
       NS_ASSERT (phySta->GetChannelNumber () == 40);
       NS_ASSERT (phySta->GetChannelWidth () == 20);
       NS_ASSERT (phySta->GetFrequency () == 5200);
-      phySta->SetAttribute ("Frequency", UintegerValue (5179));
+      exceptionThrown = false;
+      try
+        {
+          phySta->SetAttribute ("Frequency", UintegerValue (5179));
+        }
+      catch (const std::runtime_error&)
+        {
+          exceptionThrown = true;
+        }
       phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
-      // We expect channel number to be 36
+      // We expect channel number to be 36 and an exception to be thrown
       NS_ASSERT (phySta->GetChannelNumber () == 36);
       NS_ASSERT (phySta->GetChannelWidth () == 20);
       NS_ASSERT (phySta->GetFrequency () == 5180);
+      NS_ASSERT (exceptionThrown);
       phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
-      phySta->SetAttribute ("Frequency", UintegerValue (5179));
-      // We expect channel number to be 0
-      NS_ASSERT (phySta->GetChannelNumber () == 0);
+      exceptionThrown = false;
+      try
+        {
+          phySta->SetAttribute ("Frequency", UintegerValue (5179));
+        }
+      catch (const std::runtime_error&)
+        {
+          exceptionThrown = true;
+        }
+      // We expect channel number to be 36 and an exception to be thrown
+      NS_ASSERT (phySta->GetChannelNumber () == 36);
       NS_ASSERT (phySta->GetChannelWidth () == 20);
-      NS_ASSERT (phySta->GetFrequency () == 5179);
+      NS_ASSERT (phySta->GetFrequency () == 5180);
+      NS_ASSERT (exceptionThrown);
       PrintAttributesIfEnabled (printAttributes);
       break;
     default:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/examples/wifi-phy-test.cc ns-3.34/src/wifi/examples/wifi-phy-test.cc
--- ns-3.33/src/wifi/examples/wifi-phy-test.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/examples/wifi-phy-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -66,11 +66,12 @@
   /**
    * Send receive function
    * \param psdu the PSDU
-   * \param snr the SNR
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
    * \param txVector the wifi transmit vector
    * \param statusPerMpdu reception status per MPDU
    */
-  void Receive (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+  void Receive (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                WifiTxVector txVector, std::vector<bool> statusPerMpdu);
   Ptr<WifiPhy> m_tx; ///< transmit
   struct Input m_input; ///< input
   struct Output m_output; ///< output
@@ -89,7 +90,8 @@
 }
 
 void
-PsrExperiment::Receive (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu)
+PsrExperiment::Receive (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                        WifiTxVector txVector, std::vector<bool> statusPerMpdu)
 {
   m_output.received++;
 }
@@ -188,11 +190,12 @@
   /**
    * Receive function
    * \param psdu the PSDU
-   * \param snr the SNR
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
    * \param txVector the wifi transmit vector
    * \param statusPerMpdu reception status per MPDU
    */
-  void Receive (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+  void Receive (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                WifiTxVector txVector, std::vector<bool> statusPerMpdu);
   Ptr<WifiPhy> m_txA; ///< transmit A
   Ptr<WifiPhy> m_txB; ///< transmit B
   uint32_t m_flowIdA; ///< flow ID A
@@ -226,7 +229,8 @@
 }
 
 void
-CollisionExperiment::Receive (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu)
+CollisionExperiment::Receive (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                              WifiTxVector txVector, std::vector<bool> statusPerMpdu)
 {
   FlowIdTag tag;
   if ((*psdu->begin ())->GetPacket ()->FindFirstMatchingByteTag (tag))
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/examples/wifi-test-interference-helper.cc ns-3.34/src/wifi/examples/wifi-test-interference-helper.cc
--- ns-3.33/src/wifi/examples/wifi-test-interference-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/examples/wifi-test-interference-helper.cc	2021-07-14 10:31:07.000000000 -0700
@@ -126,8 +126,8 @@
   struct Input m_input; ///< input
   bool m_droppedA; ///< flag to indicate whether packet A has been dropped
   bool m_droppedB; ///< flag to indicate whether packet B has been dropped
-  mutable uint64_t m_uidA;
-  mutable uint64_t m_uidB;
+  mutable uint64_t m_uidA; ///< UID to use for packet A
+  mutable uint64_t m_uidB; ///< UID to use for packet B
 };
 
 void
@@ -393,10 +393,6 @@
     {
       input.preamble = WIFI_PREAMBLE_HT_MF;
     }
-  else if (str_preamble == "WIFI_PREAMBLE_HT_GF" && (input.standard == WIFI_PHY_STANDARD_80211n))
-    {
-      input.preamble = WIFI_PREAMBLE_HT_GF;
-    }
   else if (str_preamble == "WIFI_PREAMBLE_VHT_SU" && input.standard == WIFI_PHY_STANDARD_80211ac)
     {
       input.preamble = WIFI_PREAMBLE_VHT_SU;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/helper/athstats-helper.cc ns-3.34/src/wifi/helper/athstats-helper.cc
--- ns-3.33/src/wifi/helper/athstats-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/helper/athstats-helper.cc	2021-07-14 10:31:07.000000000 -0700
@@ -22,7 +22,7 @@
 #include "ns3/simulator.h"
 #include "ns3/config.h"
 #include "ns3/wifi-mode.h"
-#include "ns3/wifi-preamble.h"
+#include "ns3/wifi-phy-common.h"
 #include "ns3/wifi-phy-state.h"
 #include "ns3/net-device-container.h"
 #include "ns3/node-container.h"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/helper/spectrum-wifi-helper.h ns-3.34/src/wifi/helper/spectrum-wifi-helper.h
--- ns-3.33/src/wifi/helper/spectrum-wifi-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/helper/spectrum-wifi-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -63,7 +63,7 @@
    *
    * This method implements the pure virtual method defined in \ref ns3::WifiPhyHelper.
    */
-  virtual Ptr<WifiPhy> Create (Ptr<Node> node, Ptr<NetDevice> device) const;
+  Ptr<WifiPhy> Create (Ptr<Node> node, Ptr<NetDevice> device) const override;
 
   Ptr<SpectrumChannel> m_channel; ///< the channel
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/helper/wifi-helper.cc ns-3.34/src/wifi/helper/wifi-helper.cc
--- ns-3.33/src/wifi/helper/wifi-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/helper/wifi-helper.cc	2021-07-14 10:31:07.000000000 -0700
@@ -21,8 +21,6 @@
  */
 
 #include "ns3/wifi-net-device.h"
-#include "ns3/minstrel-wifi-manager.h"
-#include "ns3/minstrel-ht-wifi-manager.h"
 #include "ns3/ap-wifi-mac.h"
 #include "ns3/ampdu-subframe-header.h"
 #include "ns3/mobility-model.h"
@@ -38,7 +36,6 @@
 #include "ns3/vht-configuration.h"
 #include "ns3/he-configuration.h"
 #include "ns3/obss-pd-algorithm.h"
-#include "ns3/wifi-ack-policy-selector.h"
 #include "wifi-helper.h"
 
 namespace ns3 {
@@ -387,10 +384,6 @@
         }
 
       mcsKnown |= RadiotapHeader::MCS_KNOWN_HT_FORMAT;
-      if (preamble == WIFI_PREAMBLE_HT_GF)
-        {
-          mcsFlags |= RadiotapHeader::MCS_FLAGS_HT_GREENFIELD;
-        }
 
       mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS;
       if (txVector.GetNess () & 0x01) //bit 1
@@ -498,8 +491,8 @@
         {
           data2 |= RadiotapHeader::HE_DATA2_RU_OFFSET_KNOWN;
           //HeRu indices start at 1 whereas RadioTap starts at 0
-          data2 |= (((txVector.GetHeMuUserInfo (staId).ru.index - 1) << 8) & 0x3f00);
-          data2 |= (((!txVector.GetHeMuUserInfo (staId).ru.primary80MHz) << 15) & 0x8000);
+          data2 |= (((txVector.GetHeMuUserInfo (staId).ru.GetIndex () - 1) << 8) & 0x3f00);
+          data2 |= (((!txVector.GetHeMuUserInfo (staId).ru.GetPrimary80MHz ()) << 15) & 0x8000);
         }
 
       uint16_t data3 = 0;
@@ -515,7 +508,7 @@
       uint16_t data5 = 0;
       if (preamble == WIFI_PREAMBLE_HE_MU || preamble == WIFI_PREAMBLE_HE_TB)
         {
-          HeRu::RuType ruType = txVector.GetHeMuUserInfo (staId).ru.ruType;
+          HeRu::RuType ruType = txVector.GetHeMuUserInfo (staId).ru.GetRuType ();
           switch (ruType)
             {
             case HeRu::RU_26_TONE:
@@ -722,10 +715,6 @@
     m_selectQueueCallback (&SelectQueueByDSField)
 {
   SetRemoteStationManager ("ns3::ArfWifiManager");
-  SetAckPolicySelectorForAc (AC_BE, "ns3::ConstantWifiAckPolicySelector");
-  SetAckPolicySelectorForAc (AC_BK, "ns3::ConstantWifiAckPolicySelector");
-  SetAckPolicySelectorForAc (AC_VI, "ns3::ConstantWifiAckPolicySelector");
-  SetAckPolicySelectorForAc (AC_VO, "ns3::ConstantWifiAckPolicySelector");
 }
 
 void
@@ -775,29 +764,6 @@
 }
 
 void
-WifiHelper::SetAckPolicySelectorForAc (AcIndex ac, std::string type,
-                                       std::string n0, const AttributeValue &v0,
-                                       std::string n1, const AttributeValue &v1,
-                                       std::string n2, const AttributeValue &v2,
-                                       std::string n3, const AttributeValue &v3,
-                                       std::string n4, const AttributeValue &v4,
-                                       std::string n5, const AttributeValue &v5,
-                                       std::string n6, const AttributeValue &v6,
-                                       std::string n7, const AttributeValue &v7)
-{
-  m_ackPolicySelector[ac] = ObjectFactory ();
-  m_ackPolicySelector[ac].SetTypeId (type);
-  m_ackPolicySelector[ac].Set (n0, v0);
-  m_ackPolicySelector[ac].Set (n1, v1);
-  m_ackPolicySelector[ac].Set (n2, v2);
-  m_ackPolicySelector[ac].Set (n3, v3);
-  m_ackPolicySelector[ac].Set (n4, v4);
-  m_ackPolicySelector[ac].Set (n5, v5);
-  m_ackPolicySelector[ac].Set (n6, v6);
-  m_ackPolicySelector[ac].Set (n7, v7);
-}
-
-void
 WifiHelper::SetStandard (WifiStandard standard)
 {
   m_standard = standard;
@@ -818,9 +784,6 @@
     case WIFI_PHY_STANDARD_80211g:
       m_standard = WIFI_STANDARD_80211g;
       return;
-    case WIFI_PHY_STANDARD_holland:
-      m_standard = WIFI_STANDARD_holland;
-      return;
     // remove the next value from WifiPhyStandard when deprecation ends
     case WIFI_PHY_STANDARD_80211n_2_4GHZ:
       m_standard = WIFI_STANDARD_80211n_2_4GHZ;
@@ -876,10 +839,8 @@
           device->SetHeConfiguration (heConfiguration);
         }
       Ptr<WifiRemoteStationManager> manager = m_stationManager.Create<WifiRemoteStationManager> ();
-      Ptr<WifiMac> mac = macHelper.Create (device);
+      Ptr<WifiMac> mac = macHelper.Create (device, m_standard);
       Ptr<WifiPhy> phy = phyHelper.Create (node, device);
-      mac->SetAddress (Mac48Address::Allocate ());
-      mac->ConfigureStandard (m_standard);
       phy->ConfigureStandardAndBand (it->second.phyStandard, it->second.phyBand);
       device->SetMac (mac);
       device->SetPhy (phy);
@@ -899,51 +860,26 @@
         {
           Ptr<NetDeviceQueueInterface> ndqi;
           BooleanValue qosSupported;
-          PointerValue ptr;
           Ptr<WifiMacQueue> wmq;
-          Ptr<WifiAckPolicySelector> ackSelector;
 
           rmac->GetAttributeFailSafe ("QosSupported", qosSupported);
           if (qosSupported.Get ())
             {
               ndqi = CreateObjectWithAttributes<NetDeviceQueueInterface> ("NTxQueues",
                                                                           UintegerValue (4));
-
-              rmac->GetAttributeFailSafe ("BE_Txop", ptr);
-              ackSelector = m_ackPolicySelector[AC_BE].Create<WifiAckPolicySelector> ();
-              ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
-              ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
-              wmq = ptr.Get<QosTxop> ()->GetWifiMacQueue ();
-              ndqi->GetTxQueue (0)->ConnectQueueTraces (wmq);
-
-              rmac->GetAttributeFailSafe ("BK_Txop", ptr);
-              ackSelector = m_ackPolicySelector[AC_BK].Create<WifiAckPolicySelector> ();
-              ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
-              ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
-              wmq = ptr.Get<QosTxop> ()->GetWifiMacQueue ();
-              ndqi->GetTxQueue (1)->ConnectQueueTraces (wmq);
-
-              rmac->GetAttributeFailSafe ("VI_Txop", ptr);
-              ackSelector = m_ackPolicySelector[AC_VI].Create<WifiAckPolicySelector> ();
-              ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
-              ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
-              wmq = ptr.Get<QosTxop> ()->GetWifiMacQueue ();
-              ndqi->GetTxQueue (2)->ConnectQueueTraces (wmq);
-
-              rmac->GetAttributeFailSafe ("VO_Txop", ptr);
-              ackSelector = m_ackPolicySelector[AC_VO].Create<WifiAckPolicySelector> ();
-              ackSelector->SetQosTxop (ptr.Get<QosTxop> ());
-              ptr.Get<QosTxop> ()->SetAckPolicySelector (ackSelector);
-              wmq = ptr.Get<QosTxop> ()->GetWifiMacQueue ();
-              ndqi->GetTxQueue (3)->ConnectQueueTraces (wmq);
+              for (auto& ac : {AC_BE, AC_BK, AC_VI, AC_VO})
+                {
+                  Ptr<QosTxop> qosTxop = rmac->GetQosTxop (ac);
+                  wmq = qosTxop->GetWifiMacQueue ();
+                  ndqi->GetTxQueue (static_cast<std::size_t> (ac))->ConnectQueueTraces (wmq);
+                }
               ndqi->SetSelectQueueCallback (m_selectQueueCallback);
             }
           else
             {
               ndqi = CreateObject<NetDeviceQueueInterface> ();
 
-              rmac->GetAttributeFailSafe ("Txop", ptr);
-              wmq = ptr.Get<Txop> ()->GetWifiMacQueue ();
+              wmq = rmac->GetTxop ()->GetWifiMacQueue ();
               ndqi->GetTxQueue (0)->ConnectQueueTraces (wmq);
             }
           device->AggregateObject (ndqi);
@@ -988,58 +924,82 @@
   LogComponentEnable ("AparfWifiManager", LOG_LEVEL_ALL);
   LogComponentEnable ("ArfWifiManager", LOG_LEVEL_ALL);
   LogComponentEnable ("BlockAckAgreement", LOG_LEVEL_ALL);
-  LogComponentEnable ("BlockAckCache", LOG_LEVEL_ALL);
+  LogComponentEnable ("RecipientBlockAckAgreement", LOG_LEVEL_ALL);
   LogComponentEnable ("BlockAckManager", LOG_LEVEL_ALL);
   LogComponentEnable ("CaraWifiManager", LOG_LEVEL_ALL);
   LogComponentEnable ("ChannelAccessManager", LOG_LEVEL_ALL);
   LogComponentEnable ("ConstantObssPdAlgorithm", LOG_LEVEL_ALL);
   LogComponentEnable ("ConstantRateWifiManager", LOG_LEVEL_ALL);
-  LogComponentEnable ("ConstantWifiAckPolicySelector", LOG_LEVEL_ALL);
   LogComponentEnable ("ChannelAccessManager", LOG_LEVEL_ALL);
   LogComponentEnable ("DsssErrorRateModel", LOG_LEVEL_ALL);
+  LogComponentEnable ("DsssPhy", LOG_LEVEL_ALL);
+  LogComponentEnable ("DsssPpdu", LOG_LEVEL_ALL);
+  LogComponentEnable ("ErpOfdmPhy", LOG_LEVEL_ALL);
+  LogComponentEnable ("ErpOfdmPpdu", LOG_LEVEL_ALL);
+  LogComponentEnable ("FrameExchangeManager", LOG_LEVEL_ALL);
   LogComponentEnable ("HeConfiguration", LOG_LEVEL_ALL);
+  LogComponentEnable ("HeFrameExchangeManager", LOG_LEVEL_ALL);
+  LogComponentEnable ("HePhy", LOG_LEVEL_ALL);
+  LogComponentEnable ("HePpdu", LOG_LEVEL_ALL);
   LogComponentEnable ("HtConfiguration", LOG_LEVEL_ALL);
+  LogComponentEnable ("HtFrameExchangeManager", LOG_LEVEL_ALL);
+  LogComponentEnable ("HtPhy", LOG_LEVEL_ALL);
+  LogComponentEnable ("HtPpdu", LOG_LEVEL_ALL);
   LogComponentEnable ("IdealWifiManager", LOG_LEVEL_ALL);
-  LogComponentEnable ("InfrastructureWifiMac", LOG_LEVEL_ALL);
   LogComponentEnable ("InterferenceHelper", LOG_LEVEL_ALL);
-  LogComponentEnable ("MacLow", LOG_LEVEL_ALL);
   LogComponentEnable ("MacRxMiddle", LOG_LEVEL_ALL);
   LogComponentEnable ("MacTxMiddle", LOG_LEVEL_ALL);
   LogComponentEnable ("MinstrelHtWifiManager", LOG_LEVEL_ALL);
   LogComponentEnable ("MinstrelWifiManager", LOG_LEVEL_ALL);
   LogComponentEnable ("MpduAggregator", LOG_LEVEL_ALL);
   LogComponentEnable ("MsduAggregator", LOG_LEVEL_ALL);
+  LogComponentEnable ("MultiUserScheduler", LOG_LEVEL_ALL);
   LogComponentEnable ("NistErrorRateModel", LOG_LEVEL_ALL);
   LogComponentEnable ("ObssPdAlgorithm", LOG_LEVEL_ALL);
+  LogComponentEnable ("OfdmPhy", LOG_LEVEL_ALL);
   LogComponentEnable ("OnoeWifiManager", LOG_LEVEL_ALL);
   LogComponentEnable ("OriginatorBlockAckAgreement", LOG_LEVEL_ALL);
+  LogComponentEnable ("OfdmPpdu", LOG_LEVEL_ALL);
   LogComponentEnable ("ParfWifiManager", LOG_LEVEL_ALL);
+  LogComponentEnable ("PhyEntity", LOG_LEVEL_ALL);
+  LogComponentEnable ("QosFrameExchangeManager", LOG_LEVEL_ALL);
   LogComponentEnable ("QosTxop", LOG_LEVEL_ALL);
   LogComponentEnable ("RegularWifiMac", LOG_LEVEL_ALL);
   LogComponentEnable ("RraaWifiManager", LOG_LEVEL_ALL);
+  LogComponentEnable ("RrMultiUserScheduler", LOG_LEVEL_ALL);
   LogComponentEnable ("RrpaaWifiManager", LOG_LEVEL_ALL);
   LogComponentEnable ("SimpleFrameCaptureModel", LOG_LEVEL_ALL);
   LogComponentEnable ("SpectrumWifiPhy", LOG_LEVEL_ALL);
   LogComponentEnable ("StaWifiMac", LOG_LEVEL_ALL);
   LogComponentEnable ("SupportedRates", LOG_LEVEL_ALL);
   LogComponentEnable ("TableBasedErrorRateModel", LOG_LEVEL_ALL);
+  LogComponentEnable ("ThompsonSamplingWifiManager", LOG_LEVEL_ALL);
   LogComponentEnable ("ThresholdPreambleDetectionModel", LOG_LEVEL_ALL);
   LogComponentEnable ("Txop", LOG_LEVEL_ALL);
   LogComponentEnable ("VhtConfiguration", LOG_LEVEL_ALL);
-  LogComponentEnable ("WifiAckPolicySelector", LOG_LEVEL_ALL);
+  LogComponentEnable ("VhtFrameExchangeManager", LOG_LEVEL_ALL);
+  LogComponentEnable ("VhtPhy", LOG_LEVEL_ALL);
+  LogComponentEnable ("VhtPpdu", LOG_LEVEL_ALL);
+  LogComponentEnable ("WifiAckManager", LOG_LEVEL_ALL);
+  LogComponentEnable ("WifiDefaultAckManager", LOG_LEVEL_ALL);
+  LogComponentEnable ("WifiDefaultProtectionManager", LOG_LEVEL_ALL);
   LogComponentEnable ("WifiMac", LOG_LEVEL_ALL);
   LogComponentEnable ("WifiMacQueue", LOG_LEVEL_ALL);
   LogComponentEnable ("WifiMacQueueItem", LOG_LEVEL_ALL);
   LogComponentEnable ("WifiNetDevice", LOG_LEVEL_ALL);
   LogComponentEnable ("WifiPhyStateHelper", LOG_LEVEL_ALL);
   LogComponentEnable ("WifiPhy", LOG_LEVEL_ALL);
+  LogComponentEnable ("WifiPhyOperatingChannel", LOG_LEVEL_ALL);
   LogComponentEnable ("WifiPpdu", LOG_LEVEL_ALL);
+  LogComponentEnable ("WifiProtectionManager", LOG_LEVEL_ALL);
   LogComponentEnable ("WifiPsdu", LOG_LEVEL_ALL);
   LogComponentEnable ("WifiRadioEnergyModel", LOG_LEVEL_ALL);
   LogComponentEnable ("WifiRemoteStationManager", LOG_LEVEL_ALL);
   LogComponentEnable ("WifiSpectrumPhyInterface", LOG_LEVEL_ALL);
   LogComponentEnable ("WifiSpectrumSignalParameters", LOG_LEVEL_ALL);
   LogComponentEnable ("WifiTxCurrentModel", LOG_LEVEL_ALL);
+  LogComponentEnable ("WifiTxParameters", LOG_LEVEL_ALL);
+  LogComponentEnable ("WifiTxTimer", LOG_LEVEL_ALL);
   LogComponentEnable ("YansErrorRateModel", LOG_LEVEL_ALL);
   LogComponentEnable ("YansWifiChannel", LOG_LEVEL_ALL);
   LogComponentEnable ("YansWifiPhy", LOG_LEVEL_ALL);
@@ -1063,18 +1023,7 @@
           currentStream += wifi->GetPhy ()->AssignStreams (currentStream);
 
           //Handle any random numbers in the station managers.
-          Ptr<WifiRemoteStationManager> manager = wifi->GetRemoteStationManager ();
-          Ptr<MinstrelWifiManager> minstrel = DynamicCast<MinstrelWifiManager> (manager);
-          if (minstrel)
-            {
-              currentStream += minstrel->AssignStreams (currentStream);
-            }
-
-          Ptr<MinstrelHtWifiManager> minstrelHt = DynamicCast<MinstrelHtWifiManager> (manager);
-          if (minstrelHt)
-            {
-              currentStream += minstrelHt->AssignStreams (currentStream);
-            }
+          currentStream += wifi->GetRemoteStationManager ()->AssignStreams (currentStream);
 
           //Handle any random numbers in the MAC objects.
           Ptr<WifiMac> mac = wifi->GetMac ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/helper/wifi-helper.h ns-3.34/src/wifi/helper/wifi-helper.h
--- ns-3.33/src/wifi/helper/wifi-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/helper/wifi-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -294,7 +294,7 @@
   virtual void EnablePcapInternal (std::string prefix,
                                    Ptr<NetDevice> nd,
                                    bool promiscuous,
-                                   bool explicitFilename);
+                                   bool explicitFilename) override;
 
   /**
    * \brief Enable ASCII trace output on the indicated net device.
@@ -310,7 +310,7 @@
   virtual void EnableAsciiInternal (Ptr<OutputStreamWrapper> stream,
                                     std::string prefix,
                                     Ptr<NetDevice> nd,
-                                    bool explicitFilename);
+                                    bool explicitFilename) override;
 
   PcapHelper::DataLinkType m_pcapDlt; ///< PCAP data link type
 };
@@ -402,39 +402,6 @@
                            std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
                            std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
 
-  /**
-   * \param ac the Access Category to attach the ack policy selector to.
-   * \param type the type of ns3::WifiAckPolicySelector to create.
-   * \param n0 the name of the attribute to set
-   * \param v0 the value of the attribute to set
-   * \param n1 the name of the attribute to set
-   * \param v1 the value of the attribute to set
-   * \param n2 the name of the attribute to set
-   * \param v2 the value of the attribute to set
-   * \param n3 the name of the attribute to set
-   * \param v3 the value of the attribute to set
-   * \param n4 the name of the attribute to set
-   * \param v4 the value of the attribute to set
-   * \param n5 the name of the attribute to set
-   * \param v5 the value of the attribute to set
-   * \param n6 the name of the attribute to set
-   * \param v6 the value of the attribute to set
-   * \param n7 the name of the attribute to set
-   * \param v7 the value of the attribute to set
-   *
-   * All the attributes specified in this method should exist
-   * in the requested ack policy selector.
-   */
-  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 ());
-
   /// Callback invoked to determine the MAC queue selected for a given packet
   typedef std::function<std::size_t (Ptr<QueueItem>)> SelectQueueCallback;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/helper/wifi-mac-helper.cc ns-3.34/src/wifi/helper/wifi-mac-helper.cc
--- ns-3.33/src/wifi/helper/wifi-mac-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/helper/wifi-mac-helper.cc	2021-07-14 10:31:07.000000000 -0700
@@ -20,7 +20,10 @@
 
 #include "ns3/net-device.h"
 #include "wifi-mac-helper.h"
-#include "ns3/wifi-mac.h"
+#include "ns3/frame-exchange-manager.h"
+#include "ns3/wifi-protection-manager.h"
+#include "ns3/wifi-ack-manager.h"
+#include "ns3/multi-user-scheduler.h"
 #include "ns3/boolean.h"
 
 namespace ns3 {
@@ -30,45 +33,48 @@
   //By default, we create an AdHoc MAC layer without QoS.
   SetType ("ns3::AdhocWifiMac",
            "QosSupported", BooleanValue (false));
-}
 
-WifiMacHelper::~WifiMacHelper ()
-{
+  m_protectionManager.SetTypeId ("ns3::WifiDefaultProtectionManager");
+  m_ackManager.SetTypeId ("ns3::WifiDefaultAckManager");
 }
 
-void
-WifiMacHelper::SetType (std::string type,
-                        std::string n0, const AttributeValue &v0,
-                        std::string n1, const AttributeValue &v1,
-                        std::string n2, const AttributeValue &v2,
-                        std::string n3, const AttributeValue &v3,
-                        std::string n4, const AttributeValue &v4,
-                        std::string n5, const AttributeValue &v5,
-                        std::string n6, const AttributeValue &v6,
-                        std::string n7, const AttributeValue &v7,
-                        std::string n8, const AttributeValue &v8,
-                        std::string n9, const AttributeValue &v9,
-                        std::string n10, const AttributeValue &v10)
+WifiMacHelper::~WifiMacHelper ()
 {
-  m_mac.SetTypeId (type);
-  m_mac.Set (n0, v0);
-  m_mac.Set (n1, v1);
-  m_mac.Set (n2, v2);
-  m_mac.Set (n3, v3);
-  m_mac.Set (n4, v4);
-  m_mac.Set (n5, v5);
-  m_mac.Set (n6, v6);
-  m_mac.Set (n7, v7);
-  m_mac.Set (n8, v8);
-  m_mac.Set (n9, v9);
-  m_mac.Set (n10, v10);
 }
 
 Ptr<WifiMac>
-WifiMacHelper::Create (Ptr<NetDevice> device) const
+WifiMacHelper::Create (Ptr<NetDevice> device, WifiStandard standard) const
 {
+  auto standardIt = wifiStandards.find (standard);
+  NS_ABORT_MSG_IF (standardIt == wifiStandards.end (), "Selected standard is not defined!");
+
   Ptr<WifiMac> mac = m_mac.Create<WifiMac> ();
   mac->SetDevice (device);
+  mac->SetAddress (Mac48Address::Allocate ());
+  mac->ConfigureStandard (standard);
+
+  Ptr<RegularWifiMac> wifiMac = DynamicCast<RegularWifiMac> (mac);
+  Ptr<FrameExchangeManager> fem;
+
+  if (wifiMac != 0 && (fem = wifiMac->GetFrameExchangeManager ()) != 0)
+    {
+      Ptr<WifiProtectionManager> protectionManager = m_protectionManager.Create<WifiProtectionManager> ();
+      protectionManager->SetWifiMac (wifiMac);
+      fem->SetProtectionManager (protectionManager);
+
+      Ptr<WifiAckManager> ackManager = m_ackManager.Create<WifiAckManager> ();
+      ackManager->SetWifiMac (wifiMac);
+      fem->SetAckManager (ackManager);
+
+      // create and install the Multi User Scheduler if this is an HE AP
+      Ptr<ApWifiMac> apMac = DynamicCast<ApWifiMac> (mac);
+      if (apMac != nullptr && standardIt->second.macStandard >= WIFI_MAC_STANDARD_80211ax
+          && m_muScheduler.IsTypeIdSet ())
+        {
+          Ptr<MultiUserScheduler> muScheduler = m_muScheduler.Create<MultiUserScheduler> ();
+          apMac->AggregateObject (muScheduler);
+        }
+    }
   return mac;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/helper/wifi-mac-helper.h ns-3.34/src/wifi/helper/wifi-mac-helper.h
--- ns-3.33/src/wifi/helper/wifi-mac-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/helper/wifi-mac-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -22,6 +22,7 @@
 #define WIFI_MAC_HELPER_H
 
 #include "ns3/object-factory.h"
+#include "ns3/wifi-standards.h"
 
 namespace ns3 {
 
@@ -57,61 +58,105 @@
   virtual ~WifiMacHelper ();
 
   /**
+   * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
    * \param type the type of ns3::WifiMac to create.
-   * Valid values of the type field must be a type subclassed from WifiMac.
-   *
-   * \param n0 the name of the attribute to set
-   * \param v0 the value of the attribute to set
-   * \param n1 the name of the attribute to set
-   * \param v1 the value of the attribute to set
-   * \param n2 the name of the attribute to set
-   * \param v2 the value of the attribute to set
-   * \param n3 the name of the attribute to set
-   * \param v3 the value of the attribute to set
-   * \param n4 the name of the attribute to set
-   * \param v4 the value of the attribute to set
-   * \param n5 the name of the attribute to set
-   * \param v5 the value of the attribute to set
-   * \param n6 the name of the attribute to set
-   * \param v6 the value of the attribute to set
-   * \param n7 the name of the attribute to set
-   * \param v7 the value of the attribute to set
-   * \param n8 the name of the attribute to set
-   * \param v8 the value of the attribute to set
-   * \param n9 the name of the attribute to set
-   * \param v9 the value of the attribute to set
-   * \param n10 the name of the attribute to set
-   * \param v10 the value of the attribute to set
+   * \param args A sequence of name-value pairs of the attributes to set.
    *
    * All the attributes specified in this method should exist
    * in the requested MAC.
    */
-  virtual void SetType (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 (),
-                        std::string n8 = "", const AttributeValue &v8 = EmptyAttributeValue (),
-                        std::string n9 = "", const AttributeValue &v9 = EmptyAttributeValue (),
-                        std::string n10 = "", const AttributeValue &v10 = EmptyAttributeValue ());
+  template <typename... Args>
+  void SetType (std::string type, Args&&... args);
+
+  /**
+   * Helper function used to set the Protection Manager.
+   *
+   * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+   * \param type the type of Protection Manager
+   * \param args A sequence of name-value pairs of the attributes to set.
+   */
+  template <typename... Args>
+  void SetProtectionManager (std::string type, Args&&... args);
+
+  /**
+   * Helper function used to set the Acknowledgment Manager.
+   *
+   * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+   * \param type the type of Acknowledgment Manager
+   * \param args A sequence of name-value pairs of the attributes to set.
+   */
+  template <typename... Args>
+  void SetAckManager (std::string type, Args&&... args);
+
+  /**
+   * Helper function used to set the Multi User Scheduler that can be aggregated
+   * to an HE AP's MAC.
+   *
+   * \tparam Args \deduced Template type parameter pack for the sequence of name-value pairs.
+   * \param type the type of Multi User Scheduler
+   * \param args A sequence of name-value pairs of the attributes to set.
+   */
+  template <typename... Args>
+  void SetMultiUserScheduler (std::string type, Args&&... args);
 
   /**
    * \param device the device within which the MAC object will reside
+   * \param standard the standard to configure during installation
    * \returns a new MAC object.
    *
    * This allows the ns3::WifiHelper class to create MAC objects from ns3::WifiHelper::Install.
    */
-  virtual Ptr<WifiMac> Create (Ptr<NetDevice> device) const;
+  virtual Ptr<WifiMac> Create (Ptr<NetDevice> device, WifiStandard standard) const;
 
 
 protected:
-  ObjectFactory m_mac; ///< MAC object factory
+  ObjectFactory m_mac;                ///< MAC object factory
+  ObjectFactory m_protectionManager;  ///< Factory to create a protection manager
+  ObjectFactory m_ackManager;         ///< Factory to create an acknowledgment manager
+  ObjectFactory m_muScheduler;        ///< Multi-user Scheduler object factory
 };
 
 } // namespace ns3
 
+
+/***************************************************************
+ *  Implementation of the templates declared above.
+ ***************************************************************/
+
+namespace ns3 {
+
+template <typename... Args>
+void
+WifiMacHelper::SetType (std::string type, Args&&... args)
+{
+  m_mac.SetTypeId (type);
+  m_mac.Set (args...);
+}
+
+template <typename... Args>
+void
+WifiMacHelper::SetProtectionManager (std::string type, Args&&... args)
+{
+  m_protectionManager.SetTypeId (type);
+  m_protectionManager.Set (args...);
+}
+
+template <typename... Args>
+void
+WifiMacHelper::SetAckManager (std::string type, Args&&... args)
+{
+  m_ackManager.SetTypeId (type);
+  m_ackManager.Set (args...);
+}
+
+template <typename... Args>
+void
+WifiMacHelper::SetMultiUserScheduler (std::string type, Args&&... args)
+{
+  m_muScheduler.SetTypeId (type);
+  m_muScheduler.Set (args...);
+}
+
+} // namespace ns3
+
 #endif /* WIFI_MAC_HELPER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/helper/wifi-radio-energy-model-helper.h ns-3.34/src/wifi/helper/wifi-radio-energy-model-helper.h
--- ns-3.33/src/wifi/helper/wifi-radio-energy-model-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/helper/wifi-radio-energy-model-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -52,7 +52,7 @@
    *
    * Sets an attribute of the underlying PHY object.
    */
-  void Set (std::string name, const AttributeValue &v);
+  void Set (std::string name, const AttributeValue &v) override;
 
   /**
    * \param callback Callback function for energy depletion handling.
@@ -108,7 +108,7 @@
    * Implements DeviceEnergyModel::Install.
    */
   virtual Ptr<DeviceEnergyModel> DoInstall (Ptr<NetDevice> device,
-                                            Ptr<EnergySource> source) const;
+                                            Ptr<EnergySource> source) const override;
 
 private:
   ObjectFactory m_radioEnergy; ///< radio energy
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/helper/yans-wifi-helper.h ns-3.34/src/wifi/helper/yans-wifi-helper.h
--- ns-3.33/src/wifi/helper/yans-wifi-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/helper/yans-wifi-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -186,7 +186,7 @@
    *
    * This method implements the pure virtual method defined in \ref ns3::WifiPhyHelper.
    */
-  virtual Ptr<WifiPhy> Create (Ptr<Node> node, Ptr<NetDevice> device) const;
+  Ptr<WifiPhy> Create (Ptr<Node> node, Ptr<NetDevice> device) const override;
 
   Ptr<YansWifiChannel> m_channel; ///< YANS wifi channel
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/aarfcd-wifi-manager.cc ns-3.34/src/wifi/model/aarfcd-wifi-manager.cc
--- ns-3.33/src/wifi/model/aarfcd-wifi-manager.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/aarfcd-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,421 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2004,2005,2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Federico Maguolo <maguolof@dei.unipd.it>
- */
-
-#include "ns3/log.h"
-#include "ns3/packet.h"
-#include "aarfcd-wifi-manager.h"
-#include "wifi-tx-vector.h"
-
-#define Min(a,b) ((a < b) ? a : b)
-#define Max(a,b) ((a > b) ? a : b)
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("AarfcdWifiManager");
-
-/**
- * \brief hold per-remote-station state for AARF-CD Wifi manager.
- *
- * This struct extends from WifiRemoteStation struct to hold additional
- * information required by the AARF-CD Wifi manager
- */
-struct AarfcdWifiRemoteStation : public WifiRemoteStation
-{
-  uint32_t m_timer; ///< timer
-  uint32_t m_success; ///< success
-  uint32_t m_failed; ///< failed
-  bool m_recovery; ///< recovery
-  bool m_justModifyRate; ///< just modify rate
-  uint32_t m_successThreshold; ///< success threshold
-  uint32_t m_timerTimeout; ///< timer timeout
-  uint8_t m_rate; ///< rate
-  bool m_rtsOn; ///< RTS on
-  uint32_t m_rtsWnd; ///< RTS window
-  uint32_t m_rtsCounter; ///< RTS counter
-  bool m_haveASuccess; ///< have a success
-};
-
-NS_OBJECT_ENSURE_REGISTERED (AarfcdWifiManager);
-
-TypeId
-AarfcdWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::AarfcdWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<AarfcdWifiManager> ()
-    .AddAttribute ("SuccessK", "Multiplication factor for the success threshold in the AARF algorithm.",
-                   DoubleValue (2.0),
-                   MakeDoubleAccessor (&AarfcdWifiManager::m_successK),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("TimerK",
-                   "Multiplication factor for the timer threshold in the AARF algorithm.",
-                   DoubleValue (2.0),
-                   MakeDoubleAccessor (&AarfcdWifiManager::m_timerK),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("MaxSuccessThreshold",
-                   "Maximum value of the success threshold in the AARF algorithm.",
-                   UintegerValue (60),
-                   MakeUintegerAccessor (&AarfcdWifiManager::m_maxSuccessThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("MinTimerThreshold",
-                   "The minimum value for the 'timer' threshold in the AARF algorithm.",
-                   UintegerValue (15),
-                   MakeUintegerAccessor (&AarfcdWifiManager::m_minTimerThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("MinSuccessThreshold",
-                   "The minimum value for the success threshold in the AARF algorithm.",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&AarfcdWifiManager::m_minSuccessThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("MinRtsWnd",
-                   "Minimum value for RTS window of AARF-CD",
-                   UintegerValue (1),
-                   MakeUintegerAccessor (&AarfcdWifiManager::m_minRtsWnd),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("MaxRtsWnd",
-                   "Maximum value for RTS window of AARF-CD",
-                   UintegerValue (40),
-                   MakeUintegerAccessor (&AarfcdWifiManager::m_maxRtsWnd),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("TurnOffRtsAfterRateDecrease",
-                   "If true the RTS mechanism will be turned off when the rate will be decreased",
-                   BooleanValue (true),
-                   MakeBooleanAccessor (&AarfcdWifiManager::m_turnOffRtsAfterRateDecrease),
-                   MakeBooleanChecker ())
-    .AddAttribute ("TurnOnRtsAfterRateIncrease",
-                   "If true the RTS mechanism will be turned on when the rate will be increased",
-                   BooleanValue (true),
-                   MakeBooleanAccessor (&AarfcdWifiManager::m_turnOnRtsAfterRateIncrease),
-                   MakeBooleanChecker ())
-    .AddTraceSource ("Rate",
-                     "Traced value for rate changes (b/s)",
-                     MakeTraceSourceAccessor (&AarfcdWifiManager::m_currentRate),
-                     "ns3::TracedValueCallback::Uint64")
-  ;
-  return tid;
-}
-
-AarfcdWifiManager::AarfcdWifiManager ()
-  : WifiRemoteStationManager (),
-    m_currentRate (0)
-{
-  NS_LOG_FUNCTION (this);
-}
-
-AarfcdWifiManager::~AarfcdWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-AarfcdWifiManager::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  if (GetHtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
-    }
-  if (GetVhtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
-    }
-  if (GetHeSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
-    }
-}
-
-WifiRemoteStation *
-AarfcdWifiManager::DoCreateStation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  AarfcdWifiRemoteStation *station = new AarfcdWifiRemoteStation ();
-
-  //AARF fields below
-  station->m_successThreshold = m_minSuccessThreshold;
-  station->m_timerTimeout = m_minTimerThreshold;
-  station->m_rate = 0;
-  station->m_success = 0;
-  station->m_failed = 0;
-  station->m_recovery = false;
-  station->m_timer = 0;
-
-  //AARF-CD specific fields below
-  station->m_rtsOn = false;
-  station->m_rtsWnd = m_minRtsWnd;
-  station->m_rtsCounter = 0;
-  station->m_justModifyRate = true;
-  station->m_haveASuccess = false;
-
-  return station;
-}
-
-void
-AarfcdWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void
-AarfcdWifiManager::DoReportDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
-  station->m_timer++;
-  station->m_failed++;
-  station->m_success = 0;
-
-  if (!station->m_rtsOn)
-    {
-      TurnOnRts (station);
-      if (!station->m_justModifyRate && !station->m_haveASuccess)
-        {
-          IncreaseRtsWnd (station);
-        }
-      else
-        {
-          ResetRtsWnd (station);
-        }
-      station->m_rtsCounter = station->m_rtsWnd;
-      if (station->m_failed >= 2)
-        {
-          station->m_timer = 0;
-        }
-    }
-  else if (station->m_recovery)
-    {
-      NS_ASSERT (station->m_failed >= 1);
-      station->m_justModifyRate = false;
-      station->m_rtsCounter = station->m_rtsWnd;
-      if (station->m_failed == 1)
-        {
-          //need recovery fallback
-          if (m_turnOffRtsAfterRateDecrease)
-            {
-              TurnOffRts (station);
-            }
-          station->m_justModifyRate = true;
-          station->m_successThreshold = (int)(Min (station->m_successThreshold * m_successK,
-                                                   m_maxSuccessThreshold));
-          station->m_timerTimeout = (int)(Max (station->m_timerTimeout * m_timerK,
-                                               m_minSuccessThreshold));
-          if (station->m_rate != 0)
-            {
-              station->m_rate--;
-            }
-        }
-      station->m_timer = 0;
-    }
-  else
-    {
-      NS_ASSERT (station->m_failed >= 1);
-      station->m_justModifyRate = false;
-      station->m_rtsCounter = station->m_rtsWnd;
-      if (((station->m_failed - 1) % 2) == 1)
-        {
-          //need normal fallback
-          if (m_turnOffRtsAfterRateDecrease)
-            {
-              TurnOffRts (station);
-            }
-          station->m_justModifyRate = true;
-          station->m_timerTimeout = m_minTimerThreshold;
-          station->m_successThreshold = m_minSuccessThreshold;
-          if (station->m_rate != 0)
-            {
-              station->m_rate--;
-            }
-        }
-      if (station->m_failed >= 2)
-        {
-          station->m_timer = 0;
-        }
-    }
-  CheckRts (station);
-}
-
-void
-AarfcdWifiManager::DoReportRxOk (WifiRemoteStation *station,
-                                 double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
-}
-
-void
-AarfcdWifiManager::DoReportRtsOk (WifiRemoteStation *st,
-                                  double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
-  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
-  NS_LOG_DEBUG ("station=" << station << " rts ok");
-  station->m_rtsCounter--;
-}
-
-void
-AarfcdWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                   double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
-  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
-  station->m_timer++;
-  station->m_success++;
-  station->m_failed = 0;
-  station->m_recovery = false;
-  station->m_justModifyRate = false;
-  station->m_haveASuccess = true;
-  NS_LOG_DEBUG ("station=" << station << " data ok success=" << station->m_success << ", timer=" << station->m_timer);
-  if ((station->m_success == station->m_successThreshold
-       || station->m_timer == station->m_timerTimeout)
-      && (station->m_rate < (GetNSupported (station) - 1)))
-    {
-      NS_LOG_DEBUG ("station=" << station << " inc rate");
-      station->m_rate++;
-      station->m_timer = 0;
-      station->m_success = 0;
-      station->m_recovery = true;
-      station->m_justModifyRate = true;
-      if (m_turnOnRtsAfterRateIncrease)
-        {
-          TurnOnRts (station);
-          ResetRtsWnd (station);
-          station->m_rtsCounter = station->m_rtsWnd;
-        }
-    }
-  CheckRts (station);
-}
-
-void
-AarfcdWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void
-AarfcdWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-WifiTxVector
-AarfcdWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiMode mode = GetSupported (station, station->m_rate);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
-    {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
-    }
-  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-}
-
-WifiTxVector
-AarfcdWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  /// \todo we could/should implement the AARF algorithm for
-  /// RTS only by picking a single rate within the BasicRateSet.
-  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiTxVector rtsTxVector;
-  WifiMode mode;
-  if (GetUseNonErpProtection () == false)
-    {
-      mode = GetSupported (station, 0);
-    }
-  else
-    {
-      mode = GetNonErpSupported (station, 0);
-    }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
-}
-
-bool
-AarfcdWifiManager::DoNeedRts (WifiRemoteStation *st,
-                              uint32_t size, bool normally)
-{
-  NS_LOG_FUNCTION (this << st << size << normally);
-  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
-  NS_LOG_INFO ("" << station << " rate=" << station->m_rate << " rts=" << (station->m_rtsOn ? "RTS" : "BASIC") <<
-               " rtsCounter=" << station->m_rtsCounter);
-  return station->m_rtsOn;
-}
-
-void
-AarfcdWifiManager::CheckRts (AarfcdWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  if (station->m_rtsCounter == 0 && station->m_rtsOn)
-    {
-      TurnOffRts (station);
-    }
-}
-
-void
-AarfcdWifiManager::TurnOffRts (AarfcdWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_rtsOn = false;
-  station->m_haveASuccess = false;
-}
-
-void
-AarfcdWifiManager::TurnOnRts (AarfcdWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_rtsOn = true;
-}
-
-void
-AarfcdWifiManager::IncreaseRtsWnd (AarfcdWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  if (station->m_rtsWnd == m_maxRtsWnd)
-    {
-      return;
-    }
-
-  station->m_rtsWnd *= 2;
-  if (station->m_rtsWnd > m_maxRtsWnd)
-    {
-      station->m_rtsWnd = m_maxRtsWnd;
-    }
-}
-
-void
-AarfcdWifiManager::ResetRtsWnd (AarfcdWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_rtsWnd = m_minRtsWnd;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/aarfcd-wifi-manager.h ns-3.34/src/wifi/model/aarfcd-wifi-manager.h
--- ns-3.33/src/wifi/model/aarfcd-wifi-manager.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/aarfcd-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,136 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2005,2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Federico Maguolo <maguolof@dei.unipd.it>
- */
-
-#ifndef AARFCD_WIFI_MANAGER_H
-#define AARFCD_WIFI_MANAGER_H
-
-#include "ns3/traced-value.h"
-#include "wifi-remote-station-manager.h"
-
-namespace ns3 {
-
-struct AarfcdWifiRemoteStation;
-
-/**
- * \brief an implementation of the AARF-CD algorithm
- * \ingroup wifi
- *
- * This algorithm was first described in "Efficient Collision Detection for Auto Rate Fallback Algorithm".
- * The implementation available here was done by Federico Maguolo for a very early development
- * version of ns-3. Federico died before merging this work in ns-3 itself so his code was ported
- * to ns-3 later without his supervision.
- *
- * This RAA does not support HT modes and will error
- * exit if the user tries to configure this RAA with a Wi-Fi MAC
- * that supports 802.11n or higher.
- */
-class AarfcdWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  AarfcdWifiManager ();
-  virtual ~AarfcdWifiManager ();
-
-
-private:
-  // Overridden from base class.
-  void DoInitialize (void);
-  WifiRemoteStation * DoCreateStation (void) const;
-  void DoReportRxOk (WifiRemoteStation *station,
-                     double rxSnr, WifiMode txMode);
-
-  void DoReportRtsFailed (WifiRemoteStation *station);
-  /**
-   * It is important to realize that "recovery" mode starts after failure of
-   * the first transmission after a rate increase and ends at the first successful
-   * transmission. Specifically, recovery mode transcends retransmissions boundaries.
-   * Fundamentally, ARF handles each data transmission independently, whether it
-   * is the initial transmission of a packet or the retransmission of a packet.
-   * The fundamental reason for this is that there is a backoff between each data
-   * transmission, be it an initial transmission or a retransmission.
-   *
-   * \param station the station that we failed to send Data
-   */
-  void DoReportDataFailed (WifiRemoteStation *station);
-  void DoReportRtsOk (WifiRemoteStation *station,
-                      double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  void DoReportFinalDataFailed (WifiRemoteStation *station);
-  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-  bool DoNeedRts (WifiRemoteStation *station,
-                  uint32_t size, bool normally);
-
-  /**
-   * Check if the use of RTS for the given station can be turned off.
-   *
-   * \param station the station that we are checking
-   */
-  void CheckRts (AarfcdWifiRemoteStation *station);
-  /**
-   * Increase the RTS window size of the given station.
-   *
-   * \param station the station to increase RTS window
-   */
-  void IncreaseRtsWnd (AarfcdWifiRemoteStation *station);
-  /**
-   * Reset the RTS window of the given station.
-   *
-   * \param station the station to reset RTS window
-   */
-  void ResetRtsWnd (AarfcdWifiRemoteStation *station);
-  /**
-   * Turn off RTS for the given station.
-   *
-   * \param station the station to turn RTS off
-   */
-  void TurnOffRts (AarfcdWifiRemoteStation *station);
-  /**
-   * Turn on RTS for the given station.
-   *
-   * \param station the station to turn RTS on
-   */
-  void TurnOnRts (AarfcdWifiRemoteStation *station);
-
-  //AARF fields below
-  uint32_t m_minTimerThreshold;   ///< minimum timer threshold
-  uint32_t m_minSuccessThreshold; ///< minimum success threshold
-  double m_successK;              ///< Multiplication factor for the success threshold
-  uint32_t m_maxSuccessThreshold; ///< maximum success threshold
-  double m_timerK;                ///< Multiplication factor for the timer threshold
-
-  //AARF-CD fields below
-  uint32_t m_minRtsWnd;               ///< minimum RTS window
-  uint32_t m_maxRtsWnd;               ///< maximum RTS window
-  bool m_turnOffRtsAfterRateDecrease; ///< turn off RTS after rate decrease
-  bool m_turnOnRtsAfterRateIncrease;  ///< turn on RTS after rate increase
-
-  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
-};
-
-} //namespace ns3
-
-#endif /* AARFCD_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/aarf-wifi-manager.cc ns-3.34/src/wifi/model/aarf-wifi-manager.cc
--- ns-3.33/src/wifi/model/aarf-wifi-manager.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/aarf-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,294 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2004,2005,2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#include "ns3/log.h"
-#include "aarf-wifi-manager.h"
-#include "wifi-tx-vector.h"
-
-#define Min(a,b) ((a < b) ? a : b)
-#define Max(a,b) ((a > b) ? a : b)
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("AarfWifiManager");
-
-/**
- * \brief hold per-remote-station state for AARF Wifi manager.
- *
- * This struct extends from WifiRemoteStation struct to hold additional
- * information required by the AARF Wifi manager
- */
-struct AarfWifiRemoteStation : public WifiRemoteStation
-{
-  uint32_t m_timer; ///< timer
-  uint32_t m_success; ///< success
-  uint32_t m_failed; ///< failed
-  bool m_recovery; ///< recovery
-  uint32_t m_timerTimeout; ///< timer timeout
-  uint32_t m_successThreshold; ///< success threshold
-  uint8_t m_rate; ///< rate
-};
-
-NS_OBJECT_ENSURE_REGISTERED (AarfWifiManager);
-
-TypeId
-AarfWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::AarfWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<AarfWifiManager> ()
-    .AddAttribute ("SuccessK", "Multiplication factor for the success threshold in the AARF algorithm.",
-                   DoubleValue (2.0),
-                   MakeDoubleAccessor (&AarfWifiManager::m_successK),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("TimerK",
-                   "Multiplication factor for the timer threshold in the AARF algorithm.",
-                   DoubleValue (2.0),
-                   MakeDoubleAccessor (&AarfWifiManager::m_timerK),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("MaxSuccessThreshold",
-                   "Maximum value of the success threshold in the AARF algorithm.",
-                   UintegerValue (60),
-                   MakeUintegerAccessor (&AarfWifiManager::m_maxSuccessThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("MinTimerThreshold",
-                   "The minimum value for the 'timer' threshold in the AARF algorithm.",
-                   UintegerValue (15),
-                   MakeUintegerAccessor (&AarfWifiManager::m_minTimerThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("MinSuccessThreshold",
-                   "The minimum value for the success threshold in the AARF algorithm.",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&AarfWifiManager::m_minSuccessThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddTraceSource ("Rate",
-                     "Traced value for rate changes (b/s)",
-                     MakeTraceSourceAccessor (&AarfWifiManager::m_currentRate),
-                     "ns3::TracedValueCallback::Uint64")
-  ;
-  return tid;
-}
-
-AarfWifiManager::AarfWifiManager ()
-  : WifiRemoteStationManager (),
-    m_currentRate (0)
-{
-  NS_LOG_FUNCTION (this);
-}
-
-AarfWifiManager::~AarfWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-AarfWifiManager::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  if (GetHtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
-    }
-  if (GetVhtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
-    }
-  if (GetHeSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
-    }
-}
-
-WifiRemoteStation *
-AarfWifiManager::DoCreateStation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  AarfWifiRemoteStation *station = new AarfWifiRemoteStation ();
-
-  station->m_successThreshold = m_minSuccessThreshold;
-  station->m_timerTimeout = m_minTimerThreshold;
-  station->m_rate = 0;
-  station->m_success = 0;
-  station->m_failed = 0;
-  station->m_recovery = false;
-  station->m_timer = 0;
-
-  return station;
-}
-
-void
-AarfWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-/**
- * It is important to realize that "recovery" mode starts after failure of
- * the first transmission after a rate increase and ends at the first successful
- * transmission. Specifically, recovery mode transcends retransmissions boundaries.
- * Fundamentally, ARF handles each data transmission independently, whether it
- * is the initial transmission of a packet or the retransmission of a packet.
- * The fundamental reason for this is that there is a backoff between each data
- * transmission, be it an initial transmission or a retransmission.
- *
- * \param st the station that we failed to send Data
- */
-void
-AarfWifiManager::DoReportDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  AarfWifiRemoteStation *station = static_cast<AarfWifiRemoteStation*> (st);
-  station->m_timer++;
-  station->m_failed++;
-  station->m_success = 0;
-
-  if (station->m_recovery)
-    {
-      NS_ASSERT (station->m_failed >= 1);
-      if (station->m_failed == 1)
-        {
-          //need recovery fallback
-          station->m_successThreshold = (int)(Min (station->m_successThreshold * m_successK,
-                                                   m_maxSuccessThreshold));
-          station->m_timerTimeout = (int)(Max (station->m_timerTimeout * m_timerK,
-                                               m_minSuccessThreshold));
-          if (station->m_rate != 0)
-            {
-              station->m_rate--;
-            }
-        }
-      station->m_timer = 0;
-    }
-  else
-    {
-      NS_ASSERT (station->m_failed >= 1);
-      if (((station->m_failed - 1) % 2) == 1)
-        {
-          //need normal fallback
-          station->m_timerTimeout = m_minTimerThreshold;
-          station->m_successThreshold = m_minSuccessThreshold;
-          if (station->m_rate != 0)
-            {
-              station->m_rate--;
-            }
-        }
-      if (station->m_failed >= 2)
-        {
-          station->m_timer = 0;
-        }
-    }
-}
-
-void
-AarfWifiManager::DoReportRxOk (WifiRemoteStation *station,
-                               double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
-}
-
-void
-AarfWifiManager::DoReportRtsOk (WifiRemoteStation *station,
-                                double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << station << ctsSnr << ctsMode << rtsSnr);
-  NS_LOG_DEBUG ("station=" << station << " rts ok");
-}
-
-void
-AarfWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                 double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
-  AarfWifiRemoteStation *station = static_cast<AarfWifiRemoteStation*> (st);
-  station->m_timer++;
-  station->m_success++;
-  station->m_failed = 0;
-  station->m_recovery = false;
-  NS_LOG_DEBUG ("station=" << station << " data ok success=" << station->m_success << ", timer=" << station->m_timer);
-  if ((station->m_success == station->m_successThreshold
-       || station->m_timer == station->m_timerTimeout)
-      && (station->m_rate < (GetNSupported (station) - 1)))
-    {
-      NS_LOG_DEBUG ("station=" << station << " inc rate");
-      station->m_rate++;
-      station->m_timer = 0;
-      station->m_success = 0;
-      station->m_recovery = true;
-    }
-}
-
-void
-AarfWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void
-AarfWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-WifiTxVector
-AarfWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  AarfWifiRemoteStation *station = static_cast<AarfWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiMode mode = GetSupported (station, station->m_rate);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
-    {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
-    }
-  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-}
-
-WifiTxVector
-AarfWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  /// \todo we could/should implement the AARF algorithm for
-  /// RTS only by picking a single rate within the BasicRateSet.
-  AarfWifiRemoteStation *station = static_cast<AarfWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiTxVector rtsTxVector;
-  WifiMode mode;
-  if (GetUseNonErpProtection () == false)
-    {
-      mode = GetSupported (station, 0);
-    }
-  else
-    {
-      mode = GetNonErpSupported (station, 0);
-    }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/aarf-wifi-manager.h ns-3.34/src/wifi/model/aarf-wifi-manager.h
--- ns-3.33/src/wifi/model/aarf-wifi-manager.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/aarf-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,82 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2005,2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#ifndef AARF_WIFI_MANAGER_H
-#define AARF_WIFI_MANAGER_H
-
-#include "ns3/traced-value.h"
-#include "wifi-remote-station-manager.h"
-
-namespace ns3 {
-
-/**
- * \brief AARF Rate control algorithm
- * \ingroup wifi
- *
- * This class implements the AARF rate control algorithm which
- * was initially described in <i>IEEE 802.11 Rate Adaptation:
- * A Practical Approach</i>, by M. Lacage, M.H. Manshaei, and
- * T. Turletti.
- *
- * This RAA does not support HT modes and will error
- * exit if the user tries to configure this RAA with a Wi-Fi MAC
- * that supports 802.11n or higher.
- */
-class AarfWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  AarfWifiManager ();
-  virtual ~AarfWifiManager ();
-
-
-private:
-  // Overridden from base class.
-  void DoInitialize (void);
-  WifiRemoteStation * DoCreateStation (void) const;
-  void DoReportRxOk (WifiRemoteStation *station,
-                     double rxSnr, WifiMode txMode);
-  void DoReportRtsFailed (WifiRemoteStation *station);
-  void DoReportDataFailed (WifiRemoteStation *station);
-  void DoReportRtsOk (WifiRemoteStation *station,
-                      double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  void DoReportFinalDataFailed (WifiRemoteStation *station);
-  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-
-  uint32_t m_minTimerThreshold;   ///< minimum timer threshold
-  uint32_t m_minSuccessThreshold; ///< minimum success threshold
-  double m_successK;              ///< Multiplication factor for the success threshold
-  uint32_t m_maxSuccessThreshold; ///< maximum success threshold
-  double m_timerK;                ///< Multiplication factor for the timer threshold
-
-  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
-};
-
-} //namespace ns3
-
-#endif /* AARF_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/adhoc-wifi-mac.cc ns-3.34/src/wifi/model/adhoc-wifi-mac.cc
--- ns-3.33/src/wifi/model/adhoc-wifi-mac.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/adhoc-wifi-mac.cc	2021-07-14 10:31:07.000000000 -0700
@@ -23,10 +23,9 @@
 #include "ns3/log.h"
 #include "ns3/packet.h"
 #include "adhoc-wifi-mac.h"
-#include "ht-capabilities.h"
-#include "vht-capabilities.h"
-#include "he-capabilities.h"
-#include "mac-low.h"
+#include "ns3/ht-capabilities.h"
+#include "ns3/vht-capabilities.h"
+#include "ns3/he-capabilities.h"
 
 namespace ns3 {
 
@@ -138,7 +137,7 @@
       hdr.SetNoOrder (); // explicitly set to 0 for the time being since HT control field is not yet implemented (set it to 1 when implemented)
     }
   hdr.SetAddr1 (to);
-  hdr.SetAddr2 (m_low->GetAddress ());
+  hdr.SetAddr2 (GetAddress ());
   hdr.SetAddr3 (GetBssid ());
   hdr.SetDsNotFrom ();
   hdr.SetDsNotTo ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/adhoc-wifi-mac.h ns-3.34/src/wifi/model/adhoc-wifi-mac.h
--- ns-3.33/src/wifi/model/adhoc-wifi-mac.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/adhoc-wifi-mac.h	2021-07-14 10:31:07.000000000 -0700
@@ -44,13 +44,12 @@
   AdhocWifiMac ();
   virtual ~AdhocWifiMac ();
 
-  // Implementations of pure virtual methods, or overridden from base class.
-  void SetAddress (Mac48Address address);
-  void SetLinkUpCallback (Callback<void> linkUp);
-  void Enqueue (Ptr<Packet> packet, Mac48Address to);
+  void SetAddress (Mac48Address address) override;
+  void SetLinkUpCallback (Callback<void> linkUp) override;
+  void Enqueue (Ptr<Packet> packet, Mac48Address to) override;
 
 private:
-  void Receive (Ptr<WifiMacQueueItem> mpdu);
+  void Receive (Ptr<WifiMacQueueItem> mpdu) override;
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ampdu-subframe-header.h ns-3.34/src/wifi/model/ampdu-subframe-header.h
--- ns-3.33/src/wifi/model/ampdu-subframe-header.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ampdu-subframe-header.h	2021-07-14 10:31:07.000000000 -0700
@@ -41,11 +41,11 @@
    */
   static TypeId GetTypeId (void);
 
-  TypeId GetInstanceTypeId (void) const;
-  void Print (std::ostream &os) const;
-  uint32_t GetSerializedSize (void) const;
-  void Serialize (Buffer::Iterator start) const;
-  uint32_t Deserialize (Buffer::Iterator start);
+  TypeId GetInstanceTypeId (void) const override;
+  void Print (std::ostream &os) const override;
+  uint32_t GetSerializedSize (void) const override;
+  void Serialize (Buffer::Iterator start) const override;
+  uint32_t Deserialize (Buffer::Iterator start) override;
 
   /**
    * Set the length field.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ampdu-tag.h ns-3.34/src/wifi/model/ampdu-tag.h
--- ns-3.33/src/wifi/model/ampdu-tag.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ampdu-tag.h	2021-07-14 10:31:07.000000000 -0700
@@ -41,7 +41,12 @@
    * \return the object TypeId
    */
   static TypeId GetTypeId (void);
-  TypeId GetInstanceTypeId (void) const;
+
+  TypeId GetInstanceTypeId (void) const override;
+  void Serialize (TagBuffer i) const override;
+  void Deserialize (TagBuffer i) override;
+  uint32_t GetSerializedSize () const override;
+  void Print (std::ostream &os) const override;
 
   /**
    * Create a AmpduTag with the default =0 no A-MPDU
@@ -60,11 +65,6 @@
    */
   void SetRemainingAmpduDuration (Time duration);
 
-  void Serialize (TagBuffer i) const;
-  void Deserialize (TagBuffer i);
-  uint32_t GetSerializedSize () const;
-  void Print (std::ostream &os) const;
-
   /**
    * \return the remaining number of MPDUs in an A-MPDU
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/amrr-wifi-manager.cc ns-3.34/src/wifi/model/amrr-wifi-manager.cc
--- ns-3.33/src/wifi/model/amrr-wifi-manager.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/amrr-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,405 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2003,2007 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#include "ns3/log.h"
-#include "ns3/simulator.h"
-#include "amrr-wifi-manager.h"
-#include "wifi-tx-vector.h"
-
-#define Min(a,b) ((a < b) ? a : b)
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("AmrrWifiManager");
-
-/**
- * \brief hold per-remote-station state for AMRR Wifi manager.
- *
- * This struct extends from WifiRemoteStation struct to hold additional
- * information required by the AMRR Wifi manager
- */
-struct AmrrWifiRemoteStation : public WifiRemoteStation
-{
-  Time m_nextModeUpdate; ///< next mode update time
-  uint32_t m_tx_ok;      ///< transmit OK
-  uint32_t m_tx_err;     ///< transmit error
-  uint32_t m_tx_retr;    ///< transmit retry
-  uint32_t m_retry;      ///< retry
-  uint8_t m_txrate;      ///< transmit rate
-  uint32_t m_successThreshold; ///< success threshold
-  uint32_t m_success;    ///< success
-  bool m_recovery;       ///< recovery
-};
-
-
-NS_OBJECT_ENSURE_REGISTERED (AmrrWifiManager);
-
-TypeId
-AmrrWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::AmrrWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<AmrrWifiManager> ()
-    .AddAttribute ("UpdatePeriod",
-                   "The interval between decisions about rate control changes",
-                   TimeValue (Seconds (1.0)),
-                   MakeTimeAccessor (&AmrrWifiManager::m_updatePeriod),
-                   MakeTimeChecker ())
-    .AddAttribute ("FailureRatio",
-                   "Ratio of minimum erroneous transmissions needed to switch to a lower rate",
-                   DoubleValue (1.0 / 3.0),
-                   MakeDoubleAccessor (&AmrrWifiManager::m_failureRatio),
-                   MakeDoubleChecker<double> (0.0, 1.0))
-    .AddAttribute ("SuccessRatio",
-                   "Ratio of maximum erroneous transmissions needed to switch to a higher rate",
-                   DoubleValue (1.0 / 10.0),
-                   MakeDoubleAccessor (&AmrrWifiManager::m_successRatio),
-                   MakeDoubleChecker<double> (0.0, 1.0))
-    .AddAttribute ("MaxSuccessThreshold",
-                   "Maximum number of consecutive success periods needed to switch to a higher rate",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&AmrrWifiManager::m_maxSuccessThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("MinSuccessThreshold",
-                   "Minimum number of consecutive success periods needed to switch to a higher rate",
-                   UintegerValue (1),
-                   MakeUintegerAccessor (&AmrrWifiManager::m_minSuccessThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddTraceSource ("Rate",
-                     "Traced value for rate changes (b/s)",
-                     MakeTraceSourceAccessor (&AmrrWifiManager::m_currentRate),
-                     "ns3::TracedValueCallback::Uint64")
-  ;
-  return tid;
-}
-
-AmrrWifiManager::AmrrWifiManager ()
-  : WifiRemoteStationManager (),
-    m_currentRate (0)
-{
-  NS_LOG_FUNCTION (this);
-}
-
-AmrrWifiManager::~AmrrWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-AmrrWifiManager::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  if (GetHtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
-    }
-  if (GetVhtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
-    }
-  if (GetHeSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
-    }
-}
-
-WifiRemoteStation *
-AmrrWifiManager::DoCreateStation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  AmrrWifiRemoteStation *station = new AmrrWifiRemoteStation ();
-  station->m_nextModeUpdate = Simulator::Now () + m_updatePeriod;
-  station->m_tx_ok = 0;
-  station->m_tx_err = 0;
-  station->m_tx_retr = 0;
-  station->m_retry = 0;
-  station->m_txrate = 0;
-  station->m_successThreshold = m_minSuccessThreshold;
-  station->m_success = 0;
-  station->m_recovery = false;
-  return station;
-}
-
-void
-AmrrWifiManager::DoReportRxOk (WifiRemoteStation *station,
-                               double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
-}
-
-void
-AmrrWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void
-AmrrWifiManager::DoReportDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  AmrrWifiRemoteStation *station = static_cast<AmrrWifiRemoteStation*> (st);
-  station->m_retry++;
-  station->m_tx_retr++;
-}
-
-void
-AmrrWifiManager::DoReportRtsOk (WifiRemoteStation *st,
-                                double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
-}
-
-void
-AmrrWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                 double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
-  AmrrWifiRemoteStation *station = static_cast<AmrrWifiRemoteStation*> (st);
-  station->m_retry = 0;
-  station->m_tx_ok++;
-}
-
-void
-AmrrWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void
-AmrrWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  AmrrWifiRemoteStation *station = static_cast<AmrrWifiRemoteStation*> (st);
-  station->m_retry = 0;
-  station->m_tx_err++;
-}
-
-bool
-AmrrWifiManager::IsMinRate (AmrrWifiRemoteStation *station) const
-{
-  NS_LOG_FUNCTION (this << station);
-  return (station->m_txrate == 0);
-}
-
-bool
-AmrrWifiManager::IsMaxRate (AmrrWifiRemoteStation *station) const
-{
-  NS_LOG_FUNCTION (this << station);
-  NS_ASSERT (station->m_txrate + 1 <= GetNSupported (station));
-  return (station->m_txrate + 1 == GetNSupported (station));
-}
-
-bool
-AmrrWifiManager::IsSuccess (AmrrWifiRemoteStation *station) const
-{
-  NS_LOG_FUNCTION (this << station);
-  return (station->m_tx_retr + station->m_tx_err) < station->m_tx_ok * m_successRatio;
-}
-
-bool
-AmrrWifiManager::IsFailure (AmrrWifiRemoteStation *station) const
-{
-  NS_LOG_FUNCTION (this << station);
-  return (station->m_tx_retr + station->m_tx_err) > station->m_tx_ok * m_failureRatio;
-}
-
-bool
-AmrrWifiManager::IsEnough (AmrrWifiRemoteStation *station) const
-{
-  NS_LOG_FUNCTION (this << station);
-  return (station->m_tx_retr + station->m_tx_err + station->m_tx_ok) > 10;
-}
-
-void
-AmrrWifiManager::ResetCnt (AmrrWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_tx_ok = 0;
-  station->m_tx_err = 0;
-  station->m_tx_retr = 0;
-}
-
-void
-AmrrWifiManager::IncreaseRate (AmrrWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_txrate++;
-  NS_ASSERT (station->m_txrate < GetNSupported (station));
-}
-
-void
-AmrrWifiManager::DecreaseRate (AmrrWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_txrate--;
-}
-
-void
-AmrrWifiManager::UpdateMode (AmrrWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  if (Simulator::Now () < station->m_nextModeUpdate)
-    {
-      return;
-    }
-  station->m_nextModeUpdate = Simulator::Now () + m_updatePeriod;
-  NS_LOG_DEBUG ("Update");
-
-  bool needChange = false;
-
-  if (IsSuccess (station) && IsEnough (station))
-    {
-      station->m_success++;
-      NS_LOG_DEBUG ("++ success=" << station->m_success << " successThreshold=" << station->m_successThreshold <<
-                    " tx_ok=" << station->m_tx_ok << " tx_err=" << station->m_tx_err << " tx_retr=" << station->m_tx_retr <<
-                    " rate=" << +station->m_txrate << " n-supported-rates=" << +GetNSupported (station));
-      if (station->m_success >= station->m_successThreshold
-          && !IsMaxRate (station))
-        {
-          station->m_recovery = true;
-          station->m_success = 0;
-          IncreaseRate (station);
-          needChange = true;
-        }
-      else
-        {
-          station->m_recovery = false;
-        }
-    }
-  else if (IsFailure (station))
-    {
-      station->m_success = 0;
-      NS_LOG_DEBUG ("-- success=" << station->m_success << " successThreshold=" << station->m_successThreshold <<
-                    " tx_ok=" << station->m_tx_ok << " tx_err=" << station->m_tx_err << " tx_retr=" << station->m_tx_retr <<
-                    " rate=" << +station->m_txrate << " n-supported-rates=" << +GetNSupported (station));
-      if (!IsMinRate (station))
-        {
-          if (station->m_recovery)
-            {
-              station->m_successThreshold *= 2;
-              station->m_successThreshold = std::min (station->m_successThreshold,
-                                                      m_maxSuccessThreshold);
-            }
-          else
-            {
-              station->m_successThreshold = m_minSuccessThreshold;
-            }
-          station->m_recovery = false;
-          DecreaseRate (station);
-          needChange = true;
-        }
-      else
-        {
-          station->m_recovery = false;
-        }
-    }
-  if (IsEnough (station) || needChange)
-    {
-      NS_LOG_DEBUG ("Reset");
-      ResetCnt (station);
-    }
-}
-
-WifiTxVector
-AmrrWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  AmrrWifiRemoteStation *station = static_cast<AmrrWifiRemoteStation*> (st);
-  UpdateMode (station);
-  NS_ASSERT (station->m_txrate < GetNSupported (station));
-  uint8_t rateIndex;
-  if (station->m_retry < 1)
-    {
-      rateIndex = station->m_txrate;
-    }
-  else if (station->m_retry < 2)
-    {
-      if (station->m_txrate > 0)
-        {
-          rateIndex = station->m_txrate - 1;
-        }
-      else
-        {
-          rateIndex = station->m_txrate;
-        }
-    }
-  else if (station->m_retry < 3)
-    {
-      if (station->m_txrate > 1)
-        {
-          rateIndex = station->m_txrate - 2;
-        }
-      else
-        {
-          rateIndex = station->m_txrate;
-        }
-    }
-  else
-    {
-      if (station->m_txrate > 2)
-        {
-          rateIndex = station->m_txrate - 3;
-        }
-      else
-        {
-          rateIndex = station->m_txrate;
-        }
-    }
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiMode mode = GetSupported (station, rateIndex);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
-    {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
-    }
-  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-}
-
-WifiTxVector
-AmrrWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  AmrrWifiRemoteStation *station = static_cast<AmrrWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  UpdateMode (station);
-  WifiTxVector rtsTxVector;
-  WifiMode mode;
-  if (GetUseNonErpProtection () == false)
-    {
-      mode = GetSupported (station, 0);
-    }
-  else
-    {
-      mode = GetNonErpSupported (station, 0);
-    }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/amrr-wifi-manager.h ns-3.34/src/wifi/model/amrr-wifi-manager.h
--- ns-3.33/src/wifi/model/amrr-wifi-manager.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/amrr-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,162 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2003,2007 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#ifndef AMRR_WIFI_MANAGER_H
-#define AMRR_WIFI_MANAGER_H
-
-#include "ns3/traced-value.h"
-#include "wifi-remote-station-manager.h"
-
-namespace ns3 {
-
-struct AmrrWifiRemoteStation;
-
-/**
- * \brief AMRR Rate control algorithm
- * \ingroup wifi
- *
- * This class implements the AMRR rate control algorithm which
- * was initially described in <i>IEEE 802.11 Rate Adaptation:
- * A Practical Approach</i>, by M. Lacage, M.H. Manshaei, and
- * T. Turletti.
- *
- * This RAA does not support HT modes and will error
- * exit if the user tries to configure this RAA with a Wi-Fi MAC
- * that supports 802.11n or higher.
- */
-class AmrrWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-
-  AmrrWifiManager ();
-  virtual ~AmrrWifiManager ();
-
-
-private:
-  // Overridden from base class.
-  void DoInitialize (void);
-  WifiRemoteStation * DoCreateStation (void) const;
-  void DoReportRxOk (WifiRemoteStation *station,
-                     double rxSnr, WifiMode txMode);
-  void DoReportRtsFailed (WifiRemoteStation *station);
-  void DoReportDataFailed (WifiRemoteStation *station);
-  void DoReportRtsOk (WifiRemoteStation *station,
-                      double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  void DoReportFinalDataFailed (WifiRemoteStation *station);
-  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-
-  /**
-   * Update the mode used to send to the given station.
-   *
-   * \param station the remote station state
-   */
-  void UpdateMode (AmrrWifiRemoteStation *station);
-  /**
-   * Reset transmission statistics of the given station.
-   *
-   * \param station the remote station state
-   */
-  void ResetCnt (AmrrWifiRemoteStation *station);
-  /**
-   * Increase the transmission rate to the given station.
-   *
-   * \param station the remote station state
-   */
-  void IncreaseRate (AmrrWifiRemoteStation *station);
-  /**
-   * Decrease the transmission rate to the given station.
-   *
-   * \param station the remote station state
-   */
-  void DecreaseRate (AmrrWifiRemoteStation *station);
-  /**
-   * Check if the current rate for the given station is the
-   * minimum rate.
-   *
-   * \param station the remote station state
-   *
-   * \return true if the current rate is the minimum rate,
-   *         false otherwise
-   */
-  bool IsMinRate (AmrrWifiRemoteStation *station) const;
-  /**
-   * Check if the current rate for the given station is the
-   * maximum rate.
-   *
-   * \param station the remote station state
-   *
-   * \return true if the current rate is the maximum rate,
-   *         false otherwise
-   */
-  bool IsMaxRate (AmrrWifiRemoteStation *station) const;
-  /**
-   * Check if the number of retransmission and transmission error
-   * is less than the number of successful transmission (times ratio).
-   *
-   * \param station the remote station state
-   *
-   * \return true if the number of retransmission and transmission error
-   *              is less than the number of successful transmission
-   *              (times ratio), false otherwise
-   */
-  bool IsSuccess (AmrrWifiRemoteStation *station) const;
-  /**
-   * Check if the number of retransmission and transmission error
-   * is greater than the number of successful transmission (times ratio).
-   *
-   * \param station the remote station state
-   *
-   * \return true if the number of retransmission and transmission error
-   *              is less than the number of successful transmission
-   *              (times ratio), false otherwise
-   */
-  bool IsFailure (AmrrWifiRemoteStation *station) const;
-  /**
-   * Check if the number of retransmission, transmission error,
-   * and successful transmission are greater than 10.
-   *
-   * \param station the remote station state
-   * \return true if the number of retransmission, transmission error,
-   *         and successful transmission are greater than 10,
-   *         false otherwise
-   */
-  bool IsEnough (AmrrWifiRemoteStation *station) const;
-
-  Time m_updatePeriod;            ///< update period
-  double m_failureRatio;          ///< failure ratio
-  double m_successRatio;          ///< success ratio
-  uint32_t m_maxSuccessThreshold; ///< maximum success threshold
-  uint32_t m_minSuccessThreshold; ///< minimum success threshold
-
-  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
-};
-
-} //namespace ns3
-
-#endif /* AMRR_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/amsdu-subframe-header.h ns-3.34/src/wifi/model/amsdu-subframe-header.h
--- ns-3.33/src/wifi/model/amsdu-subframe-header.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/amsdu-subframe-header.h	2021-07-14 10:31:07.000000000 -0700
@@ -41,11 +41,12 @@
    * \return the object TypeId
    */
   static TypeId GetTypeId (void);
-  TypeId GetInstanceTypeId (void) const;
-  void Print (std::ostream &os) const;
-  uint32_t GetSerializedSize (void) const;
-  void Serialize (Buffer::Iterator start) const;
-  uint32_t Deserialize (Buffer::Iterator start);
+
+  TypeId GetInstanceTypeId (void) const override;
+  void Print (std::ostream &os) const override;
+  uint32_t GetSerializedSize (void) const override;
+  void Serialize (Buffer::Iterator start) const override;
+  uint32_t Deserialize (Buffer::Iterator start) override;
 
   /**
    * Set destination address function
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/aparf-wifi-manager.cc ns-3.34/src/wifi/model/aparf-wifi-manager.cc
--- ns-3.33/src/wifi/model/aparf-wifi-manager.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/aparf-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,393 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014 Universidad de la República - Uruguay
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Matias Richart <mrichart@fing.edu.uy>
- */
-
-#include "ns3/log.h"
-#include "ns3/uinteger.h"
-#include "ns3/data-rate.h"
-#include "aparf-wifi-manager.h"
-#include "wifi-phy.h"
-
-#define Min(a,b) ((a < b) ? a : b)
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("AparfWifiManager");
-
-/**
- * Hold per-remote-station state for APARF Wifi manager.
- *
- * This struct extends from WifiRemoteStation struct to hold additional
- * information required by the APARF Wifi manager
- */
-struct
-AparfWifiRemoteStation : public WifiRemoteStation
-{
-  uint32_t m_nSuccess;                  //!< Number of successful transmission attempts.
-  uint32_t m_nFailed;                   //!< Number of failed transmission attempts.
-  uint32_t m_pCount;                    //!< Number of power changes.
-  uint32_t m_successThreshold;          //!< The minimum number of successful transmissions to try a new power or rate.
-  uint32_t m_failThreshold;             //!< The minimum number of failed transmissions to try a new power or rate.
-  uint8_t m_prevRateIndex;              //!< Rate index of the previous transmission.
-  uint8_t m_rateIndex;                  //!< Current rate index.
-  uint8_t m_critRateIndex;              //!< Critical rate.
-  uint8_t m_prevPowerLevel;             //!< Power level of the previous transmission.
-  uint8_t m_powerLevel;                 //!< Current power level.
-  uint8_t m_nSupported;                 //!< Number of supported rates by the remote station.
-  bool m_initialized;                   //!< For initializing variables.
-  AparfWifiManager::State m_aparfState; //!< The estimated state of the channel.
-};
-
-NS_OBJECT_ENSURE_REGISTERED (AparfWifiManager);
-
-TypeId
-AparfWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::AparfWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<AparfWifiManager> ()
-    .AddAttribute ("SuccessThreshold1",
-                   "The minimum number of successful transmissions in \"High\" state to try a new power or rate.",
-                   UintegerValue (3),
-                   MakeUintegerAccessor (&AparfWifiManager::m_succesMax1),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("SuccessThreshold2",
-                   "The minimum number of successful transmissions in \"Low\" state to try a new power or rate.",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&AparfWifiManager::m_succesMax2),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("FailThreshold",
-                   "The minimum number of failed transmissions to try a new power or rate.",
-                   UintegerValue (1),
-                   MakeUintegerAccessor (&AparfWifiManager::m_failMax),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("PowerThreshold",
-                   "The maximum number of power changes.",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&AparfWifiManager::m_powerMax),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("PowerDecrementStep",
-                   "Step size for decrement the power.",
-                   UintegerValue (1),
-                   MakeUintegerAccessor (&AparfWifiManager::m_powerDec),
-                   MakeUintegerChecker<uint8_t> ())
-    .AddAttribute ("PowerIncrementStep",
-                   "Step size for increment the power.",
-                   UintegerValue (1),
-                   MakeUintegerAccessor (&AparfWifiManager::m_powerInc),
-                   MakeUintegerChecker<uint8_t> ())
-    .AddAttribute ("RateDecrementStep",
-                   "Step size for decrement the rate.",
-                   UintegerValue (1),
-                   MakeUintegerAccessor (&AparfWifiManager::m_rateDec),
-                   MakeUintegerChecker<uint8_t> ())
-    .AddAttribute ("RateIncrementStep",
-                   "Step size for increment the rate.",
-                   UintegerValue (1),
-                   MakeUintegerAccessor (&AparfWifiManager::m_rateInc),
-                   MakeUintegerChecker<uint8_t> ())
-    .AddTraceSource ("PowerChange",
-                     "The transmission power has change",
-                     MakeTraceSourceAccessor (&AparfWifiManager::m_powerChange),
-                     "ns3::WifiRemoteStationManager::PowerChangeTracedCallback")
-    .AddTraceSource ("RateChange",
-                     "The transmission rate has change",
-                     MakeTraceSourceAccessor (&AparfWifiManager::m_rateChange),
-                     "ns3::WifiRemoteStationManager::RateChangeTracedCallback")
-  ;
-  return tid;
-}
-
-AparfWifiManager::AparfWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-AparfWifiManager::~AparfWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-AparfWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
-{
-  NS_LOG_FUNCTION (this << phy);
-  m_minPower = 0;
-  m_maxPower = phy->GetNTxPower () - 1;
-  WifiRemoteStationManager::SetupPhy (phy);
-}
-
-void
-AparfWifiManager::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  if (GetHtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
-    }
-  if (GetVhtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
-    }
-  if (GetHeSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
-    }
-}
-
-WifiRemoteStation *
-AparfWifiManager::DoCreateStation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  AparfWifiRemoteStation *station = new AparfWifiRemoteStation ();
-
-  station->m_successThreshold = m_succesMax1;
-  station->m_failThreshold = m_failMax;
-  station->m_nSuccess = 0;
-  station->m_nFailed = 0;
-  station->m_pCount = 0;
-  station->m_aparfState = AparfWifiManager::High;
-  station->m_initialized = false;
-
-  NS_LOG_DEBUG ("create station=" << station << ", rate=" << +station->m_rateIndex
-                                  << ", power=" << +station->m_powerLevel);
-
-  return station;
-}
-
-void
-AparfWifiManager::CheckInit (AparfWifiRemoteStation *station)
-{
-  if (!station->m_initialized)
-    {
-      station->m_nSupported = GetNSupported (station);
-      station->m_rateIndex = station->m_nSupported - 1;
-      station->m_prevRateIndex = station->m_nSupported - 1;
-      station->m_powerLevel = m_maxPower;
-      station->m_prevPowerLevel = m_maxPower;
-      station->m_critRateIndex = 0;
-      WifiMode mode = GetSupported (station, station->m_rateIndex);
-      uint16_t channelWidth = GetChannelWidth (station);
-      DataRate rate = DataRate (mode.GetDataRate (channelWidth));
-      double power = GetPhy ()->GetPowerDbm (m_maxPower);
-      m_powerChange (power, power, station->m_state->m_address);
-      m_rateChange (rate, rate, station->m_state->m_address);
-      station->m_initialized = true;
-    }
-}
-
-void AparfWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void AparfWifiManager::DoReportDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  AparfWifiRemoteStation *station = static_cast<AparfWifiRemoteStation*> (st);
-  CheckInit (station);
-  station->m_nFailed++;
-  station->m_nSuccess = 0;
-  NS_LOG_DEBUG ("station=" << station << ", rate=" << station->m_rateIndex
-                           << ", power=" << (int)station->m_powerLevel);
-
-  if (station->m_aparfState == AparfWifiManager::Low)
-    {
-      station->m_aparfState = AparfWifiManager::High;
-      station->m_successThreshold = m_succesMax1;
-    }
-  else if (station->m_aparfState == AparfWifiManager::Spread)
-    {
-      station->m_aparfState = AparfWifiManager::Low;
-      station->m_successThreshold = m_succesMax2;
-    }
-
-  if (station->m_nFailed == station->m_failThreshold)
-    {
-      station->m_nFailed = 0;
-      station->m_nSuccess = 0;
-      station->m_pCount = 0;
-      if (station->m_powerLevel == m_maxPower)
-        {
-          station->m_critRateIndex = station->m_rateIndex;
-          if (station->m_rateIndex != 0)
-            {
-              NS_LOG_DEBUG ("station=" << station << " dec rate");
-              station->m_rateIndex -= m_rateDec;
-            }
-        }
-      else
-        {
-          NS_LOG_DEBUG ("station=" << station << " inc power");
-          station->m_powerLevel += m_powerInc;
-        }
-    }
-}
-
-void
-AparfWifiManager::DoReportRxOk (WifiRemoteStation *station, double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
-}
-
-void
-AparfWifiManager::DoReportRtsOk (WifiRemoteStation *station, double ctsSnr,
-                                 WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << station << ctsSnr << ctsMode << rtsSnr);
-}
-
-void
-AparfWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                  double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
-  AparfWifiRemoteStation *station = static_cast<AparfWifiRemoteStation*> (st);
-  CheckInit (station);
-  station->m_nSuccess++;
-  station->m_nFailed = 0;
-  NS_LOG_DEBUG ("station=" << station << " data ok success=" << station->m_nSuccess << ", rate=" << +station->m_rateIndex << ", power=" << +station->m_powerLevel);
-
-  if ((station->m_aparfState == AparfWifiManager::High) && (station->m_nSuccess >= station->m_successThreshold))
-    {
-      station->m_aparfState = AparfWifiManager::Spread;
-    }
-  else if ((station->m_aparfState == AparfWifiManager::Low) && (station->m_nSuccess >= station->m_successThreshold))
-    {
-      station->m_aparfState = AparfWifiManager::Spread;
-    }
-  else if (station->m_aparfState == AparfWifiManager::Spread)
-    {
-      station->m_aparfState = AparfWifiManager::High;
-      station->m_successThreshold = m_succesMax1;
-    }
-
-  if (station->m_nSuccess == station->m_successThreshold)
-    {
-      station->m_nSuccess = 0;
-      station->m_nFailed = 0;
-      if (station->m_rateIndex == (station->m_state->m_operationalRateSet.size () - 1))
-        {
-          if (station->m_powerLevel != m_minPower)
-            {
-              NS_LOG_DEBUG ("station=" << station << " dec power");
-              station->m_powerLevel -= m_powerDec;
-            }
-        }
-      else
-        {
-          if (station->m_critRateIndex == 0)
-            {
-              if (station->m_rateIndex != (station->m_state->m_operationalRateSet.size () - 1))
-                {
-                  NS_LOG_DEBUG ("station=" << station << " inc rate");
-                  station->m_rateIndex += m_rateInc;
-                }
-            }
-          else
-            {
-              if (station->m_pCount == m_powerMax)
-                {
-                  station->m_powerLevel = m_maxPower;
-                  station->m_rateIndex = station->m_critRateIndex;
-                  station->m_pCount = 0;
-                  station->m_critRateIndex = 0;
-                }
-              else
-                {
-                  if (station->m_powerLevel != m_minPower)
-                    {
-                      station->m_powerLevel -= m_powerDec;
-                      station->m_pCount++;
-                    }
-                }
-            }
-        }
-    }
-}
-
-void
-AparfWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void
-AparfWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-WifiTxVector
-AparfWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  AparfWifiRemoteStation *station = static_cast<AparfWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  CheckInit (station);
-  WifiMode mode = GetSupported (station, station->m_rateIndex);
-  DataRate rate = DataRate (mode.GetDataRate (channelWidth));
-  DataRate prevRate = DataRate (GetSupported (station, station->m_prevRateIndex).GetDataRate (channelWidth));
-  double power = GetPhy ()->GetPowerDbm (station->m_powerLevel);
-  double prevPower = GetPhy ()->GetPowerDbm (station->m_prevPowerLevel);
-  if (station->m_prevPowerLevel != station->m_powerLevel)
-    {
-      m_powerChange (prevPower, power, station->m_state->m_address);
-      station->m_prevPowerLevel = station->m_powerLevel;
-    }
-  if (station->m_prevRateIndex != station->m_rateIndex)
-    {
-      m_rateChange (prevRate, rate, station->m_state->m_address);
-      station->m_prevRateIndex = station->m_rateIndex;
-    }
-  return WifiTxVector (mode, station->m_powerLevel, GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (st))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-}
-
-WifiTxVector
-AparfWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  /// \todo we could/should implement the ARF algorithm for
-  /// RTS only by picking a single rate within the BasicRateSet.
-  AparfWifiRemoteStation *station = static_cast<AparfWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiTxVector rtsTxVector;
-  WifiMode mode;
-  if (GetUseNonErpProtection () == false)
-    {
-      mode = GetSupported (station, 0);
-    }
-  else
-    {
-      mode = GetNonErpSupported (station, 0);
-    }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (st))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/aparf-wifi-manager.h ns-3.34/src/wifi/model/aparf-wifi-manager.h
--- ns-3.33/src/wifi/model/aparf-wifi-manager.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/aparf-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,126 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014 Universidad de la República - Uruguay
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Matias Richart <mrichart@fing.edu.uy>
- */
-
-#ifndef APARF_WIFI_MANAGER_H
-#define APARF_WIFI_MANAGER_H
-
-#include "wifi-remote-station-manager.h"
-
-namespace ns3 {
-
-struct AparfWifiRemoteStation;
-
-/**
- * \ingroup wifi
- * APARF Power and rate control algorithm
- *
- * This class implements the High Performance power and rate control algorithm
- * described in <i>Dynamic data rate and transmit power adjustment
- * in IEEE 802.11 wireless LANs</i> by Chevillat, P.; Jelitto, J.
- * and Truong, H. L. in International Journal of Wireless Information
- * Networks, Springer, 2005, 12, 123-145.
- * http://www.cs.mun.ca/~yzchen/papers/papers/rate_adaptation/80211_dynamic_rate_power_adjustment_chevillat_j2005.pdf
- *
- * This RAA does not support HT modes and will error
- * exit if the user tries to configure this RAA with a Wi-Fi MAC
- * that supports 802.11n or higher.
- */
-class AparfWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * Register this type.
-   * \return The object TypeId.
-   */
-  static TypeId GetTypeId (void);
-  AparfWifiManager ();
-  virtual ~AparfWifiManager ();
-
-  // Inherited from WifiRemoteStationManager
-  void SetupPhy (const Ptr<WifiPhy> phy);
-
-  /**
-   * Enumeration of the possible states of the channel.
-   */
-  enum State
-  {
-    High,
-    Low,
-    Spread
-  };
-
-
-private:
-  // Overridden from base class.
-  void DoInitialize (void);
-  WifiRemoteStation * DoCreateStation (void) const;
-  void DoReportRxOk (WifiRemoteStation *station,
-                     double rxSnr, WifiMode txMode);
-  void DoReportRtsFailed (WifiRemoteStation *station);
-  void DoReportDataFailed (WifiRemoteStation *station);
-  void DoReportRtsOk (WifiRemoteStation *station,
-                      double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  void DoReportFinalDataFailed (WifiRemoteStation *station);
-  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-
-  /** Check for initializations.
-   *
-   * \param station The remote station.
-   */
-  void CheckInit (AparfWifiRemoteStation *station);
-
-  uint32_t m_succesMax1; //!< The minimum number of successful transmissions in \"High\" state to try a new power or rate.
-  uint32_t m_succesMax2; //!< The minimum number of successful transmissions in \"Low\" state to try a new power or rate.
-  uint32_t m_failMax;    //!< The minimum number of failed transmissions to try a new power or rate.
-  uint32_t m_powerMax;   //!< The maximum number of power changes.
-  uint8_t m_powerInc;    //!< Step size for increment the power.
-  uint8_t m_powerDec;    //!< Step size for decrement the power.
-  uint8_t m_rateInc;     //!< Step size for increment the rate.
-  uint8_t m_rateDec;     //!< Step size for decrement the rate.
-
-  /**
-   * Minimal power level.
-   * Differently form rate, power levels do not depend on the remote station.
-   * The levels depend only on the physical layer of the device.
-   */
-  uint8_t m_minPower;
-
-  /**
-   * Maximal power level.
-   */
-  uint8_t m_maxPower;
-
-  /**
-   * The trace source fired when the transmission power changes.
-   */
-  TracedCallback<double, double, Mac48Address> m_powerChange;
-  /**
-   * The trace source fired when the transmission rate changes.
-   */
-  TracedCallback<DataRate, DataRate, Mac48Address> m_rateChange;
-};
-
-} //namespace ns3
-
-#endif /* APARF_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ap-wifi-mac.cc ns-3.34/src/wifi/model/ap-wifi-mac.cc
--- ns-3.33/src/wifi/model/ap-wifi-mac.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ap-wifi-mac.cc	2021-07-14 10:31:07.000000000 -0700
@@ -27,7 +27,7 @@
 #include "ns3/string.h"
 #include "ns3/random-variable-stream.h"
 #include "ap-wifi-mac.h"
-#include "mac-low.h"
+#include "channel-access-manager.h"
 #include "mac-tx-middle.h"
 #include "mac-rx-middle.h"
 #include "mgt-headers.h"
@@ -35,8 +35,8 @@
 #include "amsdu-subframe-header.h"
 #include "wifi-phy.h"
 #include "wifi-net-device.h"
-#include "ht-configuration.h"
-#include "he-configuration.h"
+#include "ns3/ht-configuration.h"
+#include "ns3/he-configuration.h"
 
 namespace ns3 {
 
@@ -48,7 +48,7 @@
 ApWifiMac::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::ApWifiMac")
-    .SetParent<InfrastructureWifiMac> ()
+    .SetParent<RegularWifiMac> ()
     .SetGroupName ("Wifi")
     .AddConstructor<ApWifiMac> ()
     .AddAttribute ("BeaconInterval",
@@ -57,11 +57,6 @@
                    MakeTimeAccessor (&ApWifiMac::GetBeaconInterval,
                                      &ApWifiMac::SetBeaconInterval),
                    MakeTimeChecker ())
-    .AddAttribute ("CfpMaxDuration", "The maximum size of the CFP (used when AP supports PCF)",
-                   TimeValue (MicroSeconds (51200)),
-                   MakeTimeAccessor (&ApWifiMac::GetCfpMaxDuration,
-                                     &ApWifiMac::SetCfpMaxDuration),
-                   MakeTimeChecker ())
     .AddAttribute ("BeaconJitter",
                    "A uniform random variable to cause the initial beacon starting time (after simulation time 0) "
                    "to be distributed between 0 and the BeaconInterval.",
@@ -83,37 +78,47 @@
                    BooleanValue (true),
                    MakeBooleanAccessor (&ApWifiMac::m_enableNonErpProtection),
                    MakeBooleanChecker ())
+    .AddAttribute ("BsrLifetime",
+                   "Lifetime of Buffer Status Reports received from stations.",
+                   TimeValue (MilliSeconds (20)),
+                   MakeTimeAccessor (&ApWifiMac::m_bsrLifetime),
+                   MakeTimeChecker ())
+    .AddTraceSource ("AssociatedSta",
+                     "A station associated with this access point.",
+                     MakeTraceSourceAccessor (&ApWifiMac::m_assocLogger),
+                     "ns3::ApWifiMac::AssociationCallback")
+    .AddTraceSource ("DeAssociatedSta",
+                     "A station lost association with this access point.",
+                     MakeTraceSourceAccessor (&ApWifiMac::m_deAssocLogger),
+                     "ns3::ApWifiMac::AssociationCallback")
   ;
   return tid;
 }
 
 ApWifiMac::ApWifiMac ()
-  : m_enableBeaconGeneration (false)
+  : m_enableBeaconGeneration (false),
+    m_numNonErpStations (0),
+    m_numNonHtStations (0),
+    m_shortSlotTimeEnabled (false),
+    m_shortPreambleEnabled (false)
 {
   NS_LOG_FUNCTION (this);
   m_beaconTxop = CreateObject<Txop> ();
   m_beaconTxop->SetAifsn (1);
   m_beaconTxop->SetMinCw (0);
   m_beaconTxop->SetMaxCw (0);
-  m_beaconTxop->SetMacLow (m_low);
   m_beaconTxop->SetChannelAccessManager (m_channelAccessManager);
   m_beaconTxop->SetTxMiddle (m_txMiddle);
-  m_beaconTxop->SetTxOkCallback (MakeCallback (&ApWifiMac::TxOk, this));
-  m_rxMiddle->SetPcfCallback (MakeCallback (&ApWifiMac::SendNextCfFrame, this));
 
   //Let the lower layers know that we are acting as an AP.
   SetTypeOfStation (AP);
-
-  m_itCfPollingList = m_cfPollingList.begin ();
 }
 
 ApWifiMac::~ApWifiMac ()
 {
   NS_LOG_FUNCTION (this);
   m_staList.clear ();
-  m_nonErpStations.clear ();
-  m_nonHtStations.clear ();
-  m_cfPollingList.clear ();
+  m_addressIdMap.clear ();
 }
 
 void
@@ -124,7 +129,6 @@
   m_beaconTxop = 0;
   m_enableBeaconGeneration = false;
   m_beaconEvent.Cancel ();
-  m_cfpEvent.Cancel ();
   RegularWifiMac::DoDispose ();
 }
 
@@ -157,14 +161,7 @@
 ApWifiMac::GetBeaconInterval (void) const
 {
   NS_LOG_FUNCTION (this);
-  return m_low->GetBeaconInterval ();
-}
-
-Time
-ApWifiMac::GetCfpMaxDuration (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_low->GetCfpMaxDuration ();
+  return m_beaconInterval;
 }
 
 void
@@ -173,7 +170,6 @@
   NS_LOG_FUNCTION (this << stationManager);
   m_beaconTxop->SetWifiRemoteStationManager (stationManager);
   RegularWifiMac::SetWifiRemoteStationManager (stationManager);
-  m_stationManager->SetPcfSupported (GetPcfSupported ());
 }
 
 void
@@ -200,18 +196,7 @@
     {
       NS_FATAL_ERROR ("beacon interval should be smaller then or equal to 65535 * 1024us (802.11 time unit)");
     }
-  m_low->SetBeaconInterval (interval);
-}
-
-void
-ApWifiMac::SetCfpMaxDuration (Time duration)
-{
-  NS_LOG_FUNCTION (this << duration);
-  if ((duration.GetMicroSeconds () % 1024) != 0)
-    {
-      NS_LOG_WARN ("CFP max duration should be multiple of 1024us (802.11 time unit)");
-    }
-  m_low->SetCfpMaxDuration (duration);
+  m_beaconInterval = interval;
 }
 
 int64_t
@@ -222,71 +207,62 @@
   return 1;
 }
 
-bool
-ApWifiMac::GetShortSlotTimeEnabled (void) const
+void
+ApWifiMac::UpdateShortSlotTimeEnabled (void)
 {
-  if (m_nonErpStations.size () != 0)
-    {
-      return false;
-    }
-  if (GetErpSupported () && GetShortSlotTimeSupported ())
+  NS_LOG_FUNCTION (this);
+  if (GetErpSupported () && GetShortSlotTimeSupported () && (m_numNonErpStations == 0))
     {
-      for (std::map<uint16_t, Mac48Address>::const_iterator i = m_staList.begin (); i != m_staList.end (); i++)
+      for (const auto& sta : m_staList)
         {
-          if (!m_stationManager->GetShortSlotTimeSupported (i->second))
+          if (!m_stationManager->GetShortSlotTimeSupported (sta.second))
             {
-              return false;
+              m_shortSlotTimeEnabled = false;
+              return;
             }
         }
-      return true;
+      m_shortSlotTimeEnabled = true;
+    }
+  else
+    {
+      m_shortSlotTimeEnabled = false;
     }
-  return false;
 }
 
-bool
-ApWifiMac::GetShortPreambleEnabled (void) const
+void
+ApWifiMac::UpdateShortPreambleEnabled (void)
 {
+  NS_LOG_FUNCTION (this);
   if (GetErpSupported () && m_phy->GetShortPhyPreambleSupported ())
     {
-      for (std::list<Mac48Address>::const_iterator i = m_nonErpStations.begin (); i != m_nonErpStations.end (); i++)
+      for (const auto& sta : m_staList)
         {
-          if (!m_stationManager->GetShortPreambleSupported (*i))
+          if (!m_stationManager->GetErpOfdmSupported (sta.second) ||
+              !m_stationManager->GetShortPreambleSupported (sta.second))
             {
-              return false;
+              m_shortPreambleEnabled = false;
+              return;
             }
         }
-      return true;
+      m_shortPreambleEnabled = true;
     }
-  return false;
-}
-
-bool
-ApWifiMac::IsNonGfHtStasPresent (void) const
-{
-  bool isNonGfHtStasPresent = false;
-  for (std::map<uint16_t, Mac48Address>::const_iterator i = m_staList.begin (); i != m_staList.end (); i++)
+  else
     {
-      if (!m_stationManager->GetGreenfieldSupported (i->second))
-        {
-          isNonGfHtStasPresent = true;
-          break;
-        }
+      m_shortPreambleEnabled = false;
     }
-  m_stationManager->SetUseGreenfieldProtection (isNonGfHtStasPresent);
-  return isNonGfHtStasPresent;
 }
 
 uint16_t
 ApWifiMac::GetVhtOperationalChannelWidth (void) const
 {
   uint16_t channelWidth = m_phy->GetChannelWidth ();
-  for (std::map<uint16_t, Mac48Address>::const_iterator i = m_staList.begin (); i != m_staList.end (); i++)
+  for (const auto& sta : m_staList)
     {
-      if (m_stationManager->GetVhtSupported (i->second))
+      if (m_stationManager->GetVhtSupported (sta.second))
         {
-          if (m_stationManager->GetChannelWidthSupported (i->second) < channelWidth)
+          if (m_stationManager->GetChannelWidthSupported (sta.second) < channelWidth)
             {
-              channelWidth = m_stationManager->GetChannelWidthSupported (i->second);
+              channelWidth = m_stationManager->GetChannelWidthSupported (sta.second);
             }
         }
     }
@@ -390,7 +366,7 @@
   //We're sending this packet with a from address that is our own. We
   //get that address from the lower MAC and make use of the
   //from-spoofing Enqueue() method to avoid duplicated code.
-  Enqueue (packet, to, m_low->GetAddress ());
+  Enqueue (packet, to, GetAddress ());
 }
 
 bool
@@ -407,9 +383,8 @@
   SupportedRates rates;
   //Send the set of supported rates and make sure that we indicate
   //the Basic Rate set in this set of supported rates.
-  for (uint8_t i = 0; i < m_phy->GetNModes (); i++)
+  for (const auto & mode : m_phy->GetModeList ())
     {
-      WifiMode mode = m_phy->GetMode (i);
       uint64_t modeDataRate = mode.GetDataRate (m_phy->GetChannelWidth ());
       NS_LOG_DEBUG ("Adding supported rate of " << modeDataRate);
       rates.AddSupportedRate (modeDataRate);
@@ -436,9 +411,9 @@
   //Also the standard mentioned that at least 1 element should be included in the SupportedRates the rest can be in the ExtendedSupportedRates
   if (GetHtSupported ())
     {
-      for (uint8_t i = 0; i < m_phy->GetNBssMembershipSelectors (); i++)
+      for (const auto & selector : m_phy->GetBssMembershipSelectorList ())
         {
-          rates.AddBssMembershipSelectorRate (m_phy->GetBssMembershipSelector (i));
+          rates.AddBssMembershipSelectorRate (selector);
         }
     }
   return rates;
@@ -462,13 +437,9 @@
 {
   NS_LOG_FUNCTION (this);
   CapabilityInformation capabilities;
-  capabilities.SetShortPreamble (GetShortPreambleEnabled ());
-  capabilities.SetShortSlotTime (GetShortSlotTimeEnabled ());
+  capabilities.SetShortPreamble (m_shortPreambleEnabled);
+  capabilities.SetShortSlotTime (m_shortSlotTimeEnabled);
   capabilities.SetEss ();
-  if (GetPcfSupported ())
-    {
-      capabilities.SetCfPollable ();
-    }
   return capabilities;
 }
 
@@ -480,9 +451,9 @@
   information.SetErpSupported (1);
   if (GetErpSupported ())
     {
-      information.SetNonErpPresent (!m_nonErpStations.empty ());
+      information.SetNonErpPresent (m_numNonErpStations > 0);
       information.SetUseProtection (GetUseNonErpProtection ());
-      if (GetShortPreambleEnabled ())
+      if (m_shortPreambleEnabled)
         {
           information.SetBarkerPreambleMode (0);
         }
@@ -542,21 +513,6 @@
   return edcaParameters;
 }
 
-CfParameterSet
-ApWifiMac::GetCfParameterSet (void) const
-{
-  CfParameterSet cfParameterSet;
-  if (GetPcfSupported () && !m_cfPollingList.empty ())
-    {
-      cfParameterSet.SetPcfSupported (1);
-      cfParameterSet.SetCFPCount (0);
-      cfParameterSet.SetCFPPeriod (1);
-      cfParameterSet.SetCFPMaxDurationUs (GetCfpMaxDuration ().GetMicroSeconds ());
-      cfParameterSet.SetCFPDurRemainingUs (GetCfpMaxDuration ().GetMicroSeconds ());
-    }
-  return cfParameterSet;
-}
-
 HtOperation
 ApWifiMac::GetHtOperation (void) const
 {
@@ -567,13 +523,13 @@
       operation.SetHtSupported (1);
       operation.SetPrimaryChannel (m_phy->GetChannelNumber ());
       operation.SetRifsMode (false);
-      operation.SetNonGfHtStasPresent (IsNonGfHtStasPresent ());
+      operation.SetNonGfHtStasPresent (true);
       if (m_phy->GetChannelWidth () > 20)
         {
           operation.SetSecondaryChannelOffset (1);
           operation.SetStaChannelWidth (1);
         }
-      if (m_nonHtStations.empty ())
+      if (m_numNonHtStations == 0)
         {
           operation.SetHtProtection (NO_PROTECTION);
         }
@@ -582,13 +538,8 @@
           operation.SetHtProtection (MIXED_MODE_PROTECTION);
         }
       uint64_t maxSupportedRate = 0; //in bit/s
-      for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HT))
         {
-          WifiMode mcs = m_phy->GetMcs (i);
-          if (mcs.GetModulationClass () != WIFI_MOD_CLASS_HT)
-            {
-              continue;
-            }
           uint8_t nss = (mcs.GetMcsValue () / 8) + 1;
           NS_ASSERT (nss > 0 && nss < 5);
           uint64_t dataRate = mcs.GetDataRate (m_phy->GetChannelWidth (), GetHtConfiguration ()->GetShortGuardIntervalSupported () ? 400 : 800, nss);
@@ -599,22 +550,21 @@
             }
         }
       uint8_t maxSpatialStream = m_phy->GetMaxSupportedTxSpatialStreams ();
-      uint8_t nMcs = m_phy->GetNMcs ();
-      for (std::map<uint16_t, Mac48Address>::const_iterator i = m_staList.begin (); i != m_staList.end (); i++)
+      auto mcsList = m_phy->GetMcsList (WIFI_MOD_CLASS_HT);
+      uint8_t nMcs = mcsList.size ();
+      for (const auto& sta : m_staList)
         {
-          if (m_stationManager->GetHtSupported (i->second))
+          if (m_stationManager->GetHtSupported (sta.second))
             {
               uint64_t maxSupportedRateByHtSta = 0; //in bit/s
-              for (uint8_t j = 0; j < (std::min (nMcs, m_stationManager->GetNMcsSupported (i->second))); j++)
+              auto itMcs = mcsList.begin ();
+              for (uint8_t j = 0; j < (std::min (nMcs, m_stationManager->GetNMcsSupported (sta.second))); j++)
                 {
-                  WifiMode mcs = m_phy->GetMcs (j);
-                  if (mcs.GetModulationClass () != WIFI_MOD_CLASS_HT)
-                    {
-                      continue;
-                    }
+                  WifiMode mcs = *itMcs++;
                   uint8_t nss = (mcs.GetMcsValue () / 8) + 1;
                   NS_ASSERT (nss > 0 && nss < 5);
-                  uint64_t dataRate = mcs.GetDataRate (m_stationManager->GetChannelWidthSupported (i->second), m_stationManager->GetShortGuardIntervalSupported (i->second) ? 400 : 800, nss);
+                  uint64_t dataRate = mcs.GetDataRate (m_stationManager->GetChannelWidthSupported (sta.second),
+                                                       m_stationManager->GetShortGuardIntervalSupported (sta.second) ? 400 : 800, nss);
                   if (dataRate > maxSupportedRateByHtSta)
                     {
                       maxSupportedRateByHtSta = dataRate;
@@ -624,13 +574,13 @@
                 {
                   maxSupportedRate = maxSupportedRateByHtSta;
                 }
-              if (m_stationManager->GetNMcsSupported (i->second) < nMcs)
+              if (m_stationManager->GetNMcsSupported (sta.second) < nMcs)
                 {
-                  nMcs = m_stationManager->GetNMcsSupported (i->second);
+                  nMcs = m_stationManager->GetNMcsSupported (sta.second);
                 }
-              if (m_stationManager->GetNumberOfSupportedStreams (i->second) < maxSpatialStream)
+              if (m_stationManager->GetNumberOfSupportedStreams (sta.second) < maxSpatialStream)
                 {
-                  maxSpatialStream = m_stationManager->GetNumberOfSupportedStreams (i->second);
+                  maxSpatialStream = m_stationManager->GetNumberOfSupportedStreams (sta.second);
                 }
             }
         }
@@ -674,13 +624,13 @@
           operation.SetChannelWidth (0);
         }
       uint8_t maxSpatialStream = m_phy->GetMaxSupportedRxSpatialStreams ();
-      for (std::map<uint16_t, Mac48Address>::const_iterator i = m_staList.begin (); i != m_staList.end (); i++)
+      for (const auto& sta : m_staList)
         {
-          if (m_stationManager->GetVhtSupported (i->second))
+          if (m_stationManager->GetVhtSupported (sta.second))
             {
-              if (m_stationManager->GetNumberOfSupportedStreams (i->second) < maxSpatialStream)
+              if (m_stationManager->GetNumberOfSupportedStreams (sta.second) < maxSpatialStream)
                 {
-                  maxSpatialStream = m_stationManager->GetNumberOfSupportedStreams (i->second);
+                  maxSpatialStream = m_stationManager->GetNumberOfSupportedStreams (sta.second);
                 }
             }
         }
@@ -702,13 +652,13 @@
     {
       operation.SetHeSupported (1);
       uint8_t maxSpatialStream = m_phy->GetMaxSupportedRxSpatialStreams ();
-      for (std::map<uint16_t, Mac48Address>::const_iterator i = m_staList.begin (); i != m_staList.end (); i++)
+      for (const auto& sta : m_staList)
         {
-          if (m_stationManager->GetHeSupported (i->second))
+          if (m_stationManager->GetHeSupported (sta.second))
             {
-              if (m_stationManager->GetNumberOfSupportedStreams (i->second) < maxSpatialStream)
+              if (m_stationManager->GetNumberOfSupportedStreams (sta.second) < maxSpatialStream)
                 {
-                  maxSpatialStream = m_stationManager->GetNumberOfSupportedStreams (i->second);
+                  maxSpatialStream = m_stationManager->GetNumberOfSupportedStreams (sta.second);
                 }
             }
         }
@@ -716,9 +666,7 @@
         {
           operation.SetMaxHeMcsPerNss (nss, 11); //TBD: hardcode to 11 for now since we assume all MCS values are supported
         }
-      UintegerValue bssColor;
-      GetHeConfiguration ()->GetAttribute ("BssColor", bssColor);
-      operation.SetBssColor (bssColor.Get ());
+      operation.SetBssColor (GetHeConfiguration ()->GetBssColor ());
     }
   return operation;
 }
@@ -740,8 +688,8 @@
   probe.SetSupportedRates (GetSupportedRates ());
   probe.SetBeaconIntervalUs (GetBeaconInterval ().GetMicroSeconds ());
   probe.SetCapabilities (GetCapabilities ());
-  m_stationManager->SetShortPreambleEnabled (GetShortPreambleEnabled ());
-  m_stationManager->SetShortSlotTimeEnabled (GetShortSlotTimeEnabled ());
+  m_stationManager->SetShortPreambleEnabled (m_shortPreambleEnabled);
+  m_stationManager->SetShortSlotTimeEnabled (m_shortSlotTimeEnabled);
   if (GetDsssSupported ())
     {
       probe.SetDsssParameterSet (GetDsssParameterSet ());
@@ -800,11 +748,11 @@
       bool found = false;
       if (isReassoc)
         {
-          for (std::map<uint16_t, Mac48Address>::const_iterator i = m_staList.begin (); i != m_staList.end (); ++i)
+          for (const auto& sta : m_staList)
             {
-              if (i->second == to)
+              if (sta.second == to)
                 {
-                  aid = i->first;
+                  aid = sta.first;
                   found = true;
                   break;
                 }
@@ -814,6 +762,18 @@
         {
           aid = GetNextAssociationId ();
           m_staList.insert (std::make_pair (aid, to));
+          m_assocLogger (aid, to);
+          m_addressIdMap.insert (std::make_pair (to, aid));
+          if (m_stationManager->GetDsssSupported (to) && !m_stationManager->GetErpOfdmSupported (to))
+            {
+              m_numNonErpStations++;
+            }
+          if (!m_stationManager->GetHtSupported (to))
+            {
+              m_numNonHtStations++;
+            }
+          UpdateShortSlotTimeEnabled ();
+          UpdateShortPreambleEnabled ();
         }
       assoc.SetAssociationId (aid);
     }
@@ -874,12 +834,8 @@
   beacon.SetSupportedRates (GetSupportedRates ());
   beacon.SetBeaconIntervalUs (GetBeaconInterval ().GetMicroSeconds ());
   beacon.SetCapabilities (GetCapabilities ());
-  m_stationManager->SetShortPreambleEnabled (GetShortPreambleEnabled ());
-  m_stationManager->SetShortSlotTimeEnabled (GetShortSlotTimeEnabled ());
-  if (GetPcfSupported ())
-    {
-      beacon.SetCfParameterSet (GetCfParameterSet ());
-    }
+  m_stationManager->SetShortPreambleEnabled (m_shortPreambleEnabled);
+  m_stationManager->SetShortSlotTimeEnabled (m_shortSlotTimeEnabled);
   if (GetDsssSupported ())
     {
       beacon.SetDsssParameterSet (GetDsssParameterSet ());
@@ -919,7 +875,7 @@
   //subsequent to the association of the long slot time STA.
   if (GetErpSupported ())
     {
-      if (GetShortSlotTimeEnabled () == true)
+      if (m_shortSlotTimeEnabled)
         {
           //Enable short slot time
           m_phy->SetSlot (MicroSeconds (9));
@@ -933,71 +889,23 @@
 }
 
 void
-ApWifiMac::SendNextCfFrame (void)
-{
-  if (!GetPcfSupported ())
-    {
-      return;
-    }
-  if (m_txop->CanStartNextPolling ())
-    {
-      SendCfPoll ();
-    }
-  else if (m_low->IsCfPeriod ())
-    {
-      SendCfEnd ();
-    }
-}
-
-void
-ApWifiMac::SendCfPoll (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_ASSERT (GetPcfSupported ());
-  m_txop->SendCfFrame (WIFI_MAC_DATA_NULL_CFPOLL, *m_itCfPollingList);
-}
-
-void
-ApWifiMac::SendCfEnd (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_ASSERT (GetPcfSupported ());
-  m_txop->SendCfFrame (WIFI_MAC_CTL_END, Mac48Address::GetBroadcast ());
-}
-
-void
-ApWifiMac::TxOk (const WifiMacHeader &hdr)
+ApWifiMac::TxOk (Ptr<const WifiMacQueueItem> mpdu)
 {
-  NS_LOG_FUNCTION (this);
-  RegularWifiMac::TxOk (hdr);
+  NS_LOG_FUNCTION (this << *mpdu);
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
   if ((hdr.IsAssocResp () || hdr.IsReassocResp ())
       && m_stationManager->IsWaitAssocTxOk (hdr.GetAddr1 ()))
     {
       NS_LOG_DEBUG ("associated with sta=" << hdr.GetAddr1 ());
       m_stationManager->RecordGotAssocTxOk (hdr.GetAddr1 ());
     }
-  else if (hdr.IsBeacon () && GetPcfSupported ())
-    {
-      if (!m_cfPollingList.empty ())
-        {
-          SendCfPoll ();
-        }
-      else
-        {
-          SendCfEnd ();
-        }
-    }
-  else if (hdr.IsCfPoll ())
-    {
-      IncrementPollingListIterator ();
-    }
 }
 
 void
-ApWifiMac::TxFailed (const WifiMacHeader &hdr)
+ApWifiMac::TxFailed (uint8_t timeoutReason, Ptr<const WifiMacQueueItem> mpdu, const WifiTxVector& txVector)
 {
-  NS_LOG_FUNCTION (this);
-  RegularWifiMac::TxFailed (hdr);
+  NS_LOG_FUNCTION (this << +timeoutReason << *mpdu << txVector);
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
 
   if ((hdr.IsAssocResp () || hdr.IsReassocResp ())
       && m_stationManager->IsWaitAssocTxOk (hdr.GetAddr1 ()))
@@ -1005,11 +913,6 @@
       NS_LOG_DEBUG ("association failed with sta=" << hdr.GetAddr1 ());
       m_stationManager->RecordGotAssocTxFailed (hdr.GetAddr1 ());
     }
-  else if (hdr.IsCfPoll ())
-    {
-      IncrementPollingListIterator ();
-      SendNextCfFrame ();
-    }
 }
 
 void
@@ -1116,57 +1019,16 @@
               m_stationManager->AddSupportedPhyPreamble (from, capabilities.IsShortPreamble ());
               SupportedRates rates = assocReq.GetSupportedRates ();
               bool problem = false;
-              bool isHtStation = false;
-              bool isOfdmStation = false;
-              bool isErpStation = false;
-              bool isDsssStation = false;
-              for (uint8_t i = 0; i < m_stationManager->GetNBasicModes (); i++)
+              if (rates.GetNRates () == 0)
                 {
-                  WifiMode mode = m_stationManager->GetBasicMode (i);
-                  if (!rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
-                    {
-                      if ((mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS) || (mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS))
-                        {
-                          isDsssStation = false;
-                        }
-                      else if (mode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM)
-                        {
-                          isErpStation = false;
-                        }
-                      else if (mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM)
-                        {
-                          isOfdmStation = false;
-                        }
-                      if (isDsssStation == false && isErpStation == false && isOfdmStation == false)
-                        {
-                          problem = true;
-                          break;
-                        }
-                    }
-                  else
-                    {
-                      if ((mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS) || (mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS))
-                        {
-                          isDsssStation = true;
-                        }
-                      else if (mode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM)
-                        {
-                          isErpStation = true;
-                        }
-                      else if (mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM)
-                        {
-                          isOfdmStation = true;
-                        }
-                    }
+                  problem = true;
                 }
-              m_stationManager->AddSupportedErpSlotTime (from, capabilities.IsShortSlotTime () && isErpStation);
               if (GetHtSupported ())
                 {
                   //check whether the HT STA supports all MCSs in Basic MCS Set
                   HtCapabilities htcapabilities = assocReq.GetHtCapabilities ();
                   if (htcapabilities.IsSupportedMcs (0))
                     {
-                      isHtStation = true;
                       for (uint8_t i = 0; i < m_stationManager->GetNBasicMcs (); i++)
                         {
                           WifiMode mcs = m_stationManager->GetBasicMcs (i);
@@ -1221,21 +1083,16 @@
                 {
                   NS_LOG_DEBUG ("The Basic Rate set modes are supported by the station");
                   //record all its supported modes in its associated WifiRemoteStation
-                  for (uint8_t j = 0; j < m_phy->GetNModes (); j++)
+                  for (const auto & mode : m_phy->GetModeList ())
                     {
-                      WifiMode mode = m_phy->GetMode (j);
                       if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
                         {
                           m_stationManager->AddSupportedMode (from, mode);
                         }
                     }
-                  if (GetPcfSupported () && capabilities.IsCfPollable ())
+                  if (GetErpSupported () && m_stationManager->GetErpOfdmSupported (from) && capabilities.IsShortSlotTime ())
                     {
-                      m_cfPollingList.push_back (from);
-                      if (m_itCfPollingList == m_cfPollingList.end ())
-                        {
-                          IncrementPollingListIterator ();
-                        }
+                      m_stationManager->AddSupportedErpSlotTime (from, true);
                     }
                   if (GetHtSupported ())
                     {
@@ -1252,10 +1109,9 @@
                       if (vhtCapabilities.GetRxHighestSupportedLgiDataRate () > 0)
                         {
                           m_stationManager->AddStationVhtCapabilities (from, vhtCapabilities);
-                          for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+                          for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_VHT))
                             {
-                              WifiMode mcs = m_phy->GetMcs (i);
-                              if (mcs.GetModulationClass () == WIFI_MOD_CLASS_VHT && vhtCapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
+                              if (vhtCapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
                                 {
                                   m_stationManager->AddSupportedMcs (hdr->GetAddr2 (), mcs);
                                   //here should add a control to add basic MCS when it is implemented
@@ -1274,10 +1130,9 @@
                       if (heCapabilities.GetSupportedMcsAndNss () != 0)
                         {
                           m_stationManager->AddStationHeCapabilities (from, heCapabilities);
-                          for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+                          for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HE))
                             {
-                              WifiMode mcs = m_phy->GetMcs (i);
-                              if (mcs.GetModulationClass () == WIFI_MOD_CLASS_HE && heCapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
+                              if (heCapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
                                 {
                                   m_stationManager->AddSupportedMcs (hdr->GetAddr2 (), mcs);
                                   //here should add a control to add basic MCS when it is implemented
@@ -1286,16 +1141,6 @@
                         }
                     }
                   m_stationManager->RecordWaitAssocTxOk (from);
-                  if (!isHtStation)
-                    {
-                      m_nonHtStations.push_back (hdr->GetAddr2 ());
-                      m_nonHtStations.unique ();
-                    }
-                  if (!isErpStation && isDsssStation)
-                    {
-                      m_nonErpStations.push_back (hdr->GetAddr2 ());
-                      m_nonErpStations.unique ();
-                    }
                   NS_LOG_DEBUG ("Send association response with success status");
                   SendAssocResp (hdr->GetAddr2 (), true, false);
                 }
@@ -1312,57 +1157,16 @@
               m_stationManager->AddSupportedPhyPreamble (from, capabilities.IsShortPreamble ());
               SupportedRates rates = reassocReq.GetSupportedRates ();
               bool problem = false;
-              bool isHtStation = false;
-              bool isOfdmStation = false;
-              bool isErpStation = false;
-              bool isDsssStation = false;
-              for (uint8_t i = 0; i < m_stationManager->GetNBasicModes (); i++)
+              if (rates.GetNRates () == 0)
                 {
-                  WifiMode mode = m_stationManager->GetBasicMode (i);
-                  if (!rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
-                    {
-                      if ((mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS) || (mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS))
-                        {
-                          isDsssStation = false;
-                        }
-                      else if (mode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM)
-                        {
-                          isErpStation = false;
-                        }
-                      else if (mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM)
-                        {
-                          isOfdmStation = false;
-                        }
-                      if (isDsssStation == false && isErpStation == false && isOfdmStation == false)
-                        {
-                          problem = true;
-                          break;
-                        }
-                    }
-                  else
-                    {
-                      if ((mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS) || (mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS))
-                        {
-                          isDsssStation = true;
-                        }
-                      else if (mode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM)
-                        {
-                          isErpStation = true;
-                        }
-                      else if (mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM)
-                        {
-                          isOfdmStation = true;
-                        }
-                    }
+                  problem = true;
                 }
-              m_stationManager->AddSupportedErpSlotTime (from, capabilities.IsShortSlotTime () && isErpStation);
               if (GetHtSupported ())
                 {
                   //check whether the HT STA supports all MCSs in Basic MCS Set
                   HtCapabilities htcapabilities = reassocReq.GetHtCapabilities ();
                   if (htcapabilities.IsSupportedMcs (0))
                     {
-                      isHtStation = true;
                       for (uint8_t i = 0; i < m_stationManager->GetNBasicMcs (); i++)
                         {
                           WifiMode mcs = m_stationManager->GetBasicMcs (i);
@@ -1417,14 +1221,17 @@
                 {
                   NS_LOG_DEBUG ("The Basic Rate set modes are supported by the station");
                   //update all its supported modes in its associated WifiRemoteStation
-                  for (uint8_t j = 0; j < m_phy->GetNModes (); j++)
+                  for (const auto & mode : m_phy->GetModeList ())
                     {
-                      WifiMode mode = m_phy->GetMode (j);
                       if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
                         {
                           m_stationManager->AddSupportedMode (from, mode);
                         }
                     }
+                  if (GetErpSupported () && m_stationManager->GetErpOfdmSupported (from) && capabilities.IsShortSlotTime ())
+                    {
+                      m_stationManager->AddSupportedErpSlotTime (from, true);
+                    }
                   if (GetHtSupported ())
                     {
                       HtCapabilities htCapabilities = reassocReq.GetHtCapabilities ();
@@ -1440,10 +1247,9 @@
                       if (vhtCapabilities.GetRxHighestSupportedLgiDataRate () > 0)
                         {
                           m_stationManager->AddStationVhtCapabilities (from, vhtCapabilities);
-                          for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+                          for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_VHT))
                             {
-                              WifiMode mcs = m_phy->GetMcs (i);
-                              if (mcs.GetModulationClass () == WIFI_MOD_CLASS_VHT && vhtCapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
+                              if (vhtCapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
                                 {
                                   m_stationManager->AddSupportedMcs (hdr->GetAddr2 (), mcs);
                                   //here should add a control to add basic MCS when it is implemented
@@ -1462,10 +1268,9 @@
                       if (heCapabilities.GetSupportedMcsAndNss () != 0)
                         {
                           m_stationManager->AddStationHeCapabilities (from, heCapabilities);
-                          for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+                          for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HE))
                             {
-                              WifiMode mcs = m_phy->GetMcs (i);
-                              if (mcs.GetModulationClass () == WIFI_MOD_CLASS_HE && heCapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
+                              if (heCapabilities.IsSupportedTxMcs (mcs.GetMcsValue ()))
                                 {
                                   m_stationManager->AddSupportedMcs (hdr->GetAddr2 (), mcs);
                                   //here should add a control to add basic MCS when it is implemented
@@ -1474,16 +1279,6 @@
                         }
                     }
                   m_stationManager->RecordWaitAssocTxOk (from);
-                  if (!isHtStation)
-                    {
-                      m_nonHtStations.push_back (hdr->GetAddr2 ());
-                      m_nonHtStations.unique ();
-                    }
-                  if (!isErpStation && isDsssStation)
-                    {
-                      m_nonErpStations.push_back (hdr->GetAddr2 ());
-                      m_nonErpStations.unique ();
-                    }
                   NS_LOG_DEBUG ("Send reassociation response with success status");
                   SendAssocResp (hdr->GetAddr2 (), true, true);
                 }
@@ -1493,35 +1288,23 @@
             {
               NS_LOG_DEBUG ("Disassociation received from " << from);
               m_stationManager->RecordDisassociated (from);
-              for (std::map<uint16_t, Mac48Address>::const_iterator j = m_staList.begin (); j != m_staList.end (); j++)
-                {
-                  if (j->second == from)
-                    {
-                      m_staList.erase (j);
-                      break;
-                    }
-                }
-              for (std::list<Mac48Address>::const_iterator j = m_nonErpStations.begin (); j != m_nonErpStations.end (); j++)
-                {
-                  if ((*j) == from)
-                    {
-                      m_nonErpStations.erase (j);
-                      break;
-                    }
-                }
-              for (std::list<Mac48Address>::const_iterator j = m_nonHtStations.begin (); j != m_nonHtStations.end (); j++)
-                {
-                  if ((*j) == from)
-                    {
-                      m_nonHtStations.erase (j);
-                      break;
-                    }
-                }
-              for (std::list<Mac48Address>::const_iterator j = m_cfPollingList.begin (); j != m_cfPollingList.end (); ++j)
+              for (auto it = m_staList.begin (); it != m_staList.end (); ++it)
                 {
-                  if ((*j) == from)
+                  if (it->second == from)
                     {
-                      m_cfPollingList.erase (j);
+                      m_staList.erase (it);
+                      m_deAssocLogger (it->first, it->second);
+                      m_addressIdMap.erase (from);
+                      if (m_stationManager->GetDsssSupported (from) && !m_stationManager->GetErpOfdmSupported (from))
+                        {
+                          m_numNonErpStations--;
+                        }
+                      if (!m_stationManager->GetHtSupported (from))
+                        {
+                          m_numNonHtStations--;
+                        }
+                      UpdateShortSlotTimeEnabled ();
+                      UpdateShortPreambleEnabled ();
                       break;
                     }
                 }
@@ -1577,13 +1360,17 @@
           m_beaconEvent = Simulator::ScheduleNow (&ApWifiMac::SendOneBeacon, this);
         }
     }
+  NS_ABORT_IF (!TraceConnectWithoutContext ("AckedMpdu", MakeCallback (&ApWifiMac::TxOk, this)));
+  NS_ABORT_IF (!TraceConnectWithoutContext ("MpduResponseTimeout", MakeCallback (&ApWifiMac::TxFailed, this)));
   RegularWifiMac::DoInitialize ();
+  UpdateShortSlotTimeEnabled ();
+  UpdateShortPreambleEnabled ();
 }
 
 bool
 ApWifiMac::GetUseNonErpProtection (void) const
 {
-  bool useProtection = !m_nonErpStations.empty () && m_enableNonErpProtection;
+  bool useProtection = (m_numNonErpStations > 0) && m_enableNonErpProtection;
   m_stationManager->SetUseNonErpProtection (useProtection);
   return useProtection;
 }
@@ -1603,15 +1390,71 @@
   return 0;
 }
 
+const std::map<uint16_t, Mac48Address>&
+ApWifiMac::GetStaList (void) const
+{
+  return m_staList;
+}
+
+uint16_t
+ApWifiMac::GetAssociationId (Mac48Address addr) const
+{
+  auto it = m_addressIdMap.find (addr);
+
+  if (it == m_addressIdMap.end ())
+    {
+      return SU_STA_ID;
+    }
+  return it->second;
+}
+
+uint8_t
+ApWifiMac::GetBufferStatus (uint8_t tid, Mac48Address address) const
+{
+  auto it = m_bufferStatus.find (WifiAddressTidPair (address, tid));
+  if (it == m_bufferStatus.end ()
+      || it->second.timestamp + m_bsrLifetime < Simulator::Now ())
+    {
+      return 255;
+    }
+  return it->second.value;
+}
+
 void
-ApWifiMac::IncrementPollingListIterator (void)
+ApWifiMac::SetBufferStatus (uint8_t tid, Mac48Address address, uint8_t size)
 {
-  NS_LOG_FUNCTION (this);
-  m_itCfPollingList++;
-  if (m_itCfPollingList == m_cfPollingList.end ())
+  if (size == 255)
+    {
+      // no point in storing an unspecified size
+      m_bufferStatus.erase (WifiAddressTidPair (address, tid));
+    }
+  else
+    {
+      m_bufferStatus[WifiAddressTidPair (address, tid)] = {size, Simulator::Now ()};
+    }
+}
+
+uint8_t
+ApWifiMac::GetMaxBufferStatus (Mac48Address address) const
+{
+  uint8_t maxSize = 0;
+  bool found = false;
+
+  for (uint8_t tid = 0; tid < 8; tid++)
+    {
+      uint8_t size = GetBufferStatus (tid, address);
+      if (size != 255)
+        {
+          maxSize = std::max (maxSize, size);
+          found = true;
+        }
+    }
+
+  if (found)
     {
-      m_itCfPollingList = m_cfPollingList.begin ();
+      return maxSize;
     }
+  return 255;
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ap-wifi-mac.h ns-3.34/src/wifi/model/ap-wifi-mac.h
--- ns-3.33/src/wifi/model/ap-wifi-mac.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ap-wifi-mac.h	2021-07-14 10:31:07.000000000 -0700
@@ -23,7 +23,8 @@
 #ifndef AP_WIFI_MAC_H
 #define AP_WIFI_MAC_H
 
-#include "infrastructure-wifi-mac.h"
+#include "regular-wifi-mac.h"
+#include <unordered_map>
 
 namespace ns3 {
 
@@ -44,7 +45,7 @@
  * Handle association, dis-association and authentication,
  * of STAs within an infrastructure BSS.
  */
-class ApWifiMac : public InfrastructureWifiMac
+class ApWifiMac : public RegularWifiMac
 {
 public:
   /**
@@ -56,13 +57,12 @@
   ApWifiMac ();
   virtual ~ApWifiMac ();
 
-  // Implementations of pure virtual methods, or overridden from base class.
-  void SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> stationManager);
-  void SetLinkUpCallback (Callback<void> linkUp);
-  void Enqueue (Ptr<Packet> packet, Mac48Address to);
-  void Enqueue (Ptr<Packet> packet, Mac48Address to, Mac48Address from);
-  bool SupportsSendFrom (void) const;
-  void SetAddress (Mac48Address address);
+  void SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> stationManager) override;
+  void SetLinkUpCallback (Callback<void> linkUp) override;
+  void Enqueue (Ptr<Packet> packet, Mac48Address to) override;
+  void Enqueue (Ptr<Packet> packet, Mac48Address to, Mac48Address from) override;
+  bool SupportsSendFrom (void) const override;
+  void SetAddress (Mac48Address address) override;
 
   /**
    * \param interval the interval between two beacon transmissions.
@@ -72,37 +72,7 @@
    * \return the interval between two beacon transmissions.
    */
   Time GetBeaconInterval (void) const;
-  /**
-   * \param duration the maximum duration for the CF period.
-   */
-  void SetCfpMaxDuration (Time duration);
-  /**
-   * \return the maximum duration for the CF period.
-   */
-  Time GetCfpMaxDuration (void) const;
-  /**
-   * Determine whether short slot time should be enabled or not in the BSS.
-   * Typically, true is returned only when there is no non-ERP stations associated
-   * to the AP, and that short slot time is supported by the AP and by all other
-   * ERP stations that are associated to the AP. Otherwise, false is returned.
-   *
-   * \returns whether short slot time should be enabled or not in the BSS.
-   */
-  bool GetShortSlotTimeEnabled (void) const;
-  /**
-   * Determine whether short preamble should be enabled or not in the BSS.
-   * Typically, true is returned only when the AP and all associated
-   * stations support short PHY preamble.
-   *
-   * \returns whether short preamble should be enabled or not in the BSS.
-   */
-  bool GetShortPreambleEnabled (void) const;
-  /**
-   * Determine whether non-Greenfield HT stations are present or not.
-   *
-   * \returns whether non-Greenfield HT stations are present or not.
-   */
-  bool IsNonGfHtStasPresent (void) const;
+
   /**
    * Determine the VHT operational channel width (in MHz).
    *
@@ -121,27 +91,79 @@
    */
   int64_t AssignStreams (int64_t stream);
 
+  /**
+   * Get a const reference to the map of associated stations. Each station is
+   * specified by an (association ID, MAC address) pair. Make sure not to use
+   * the returned reference after that this object has been deallocated.
+   *
+   * \return a const reference to the map of associated stations
+   */
+  const std::map<uint16_t, Mac48Address>& GetStaList (void) const;
+  /**
+   * \param addr the address of the associated station
+   * \return the Association ID allocated by the AP to the station, SU_STA_ID if unallocated
+   */
+  uint16_t GetAssociationId (Mac48Address addr) const;
+
+  /**
+   * Return the value of the Queue Size subfield of the last QoS Data or QoS Null
+   * frame received from the station with the given MAC address and belonging to
+   * the given TID.
+   *
+   * The Queue Size value is the total size, rounded up to the nearest multiple
+   * of 256 octets and expressed in units of 256 octets, of all  MSDUs and A-MSDUs
+   * buffered at the STA (excluding the MSDU or A-MSDU of the present QoS Data frame).
+   * A queue size value of 254 is used for all sizes greater than 64 768 octets.
+   * A queue size value of 255 is used to indicate an unspecified or unknown size.
+   * See Section 9.2.4.5.6 of 802.11-2016
+   *
+   * \param tid the given TID
+   * \param address the given MAC address
+   * \return the value of the Queue Size subfield
+   */
+  uint8_t GetBufferStatus (uint8_t tid, Mac48Address address) const;
+  /**
+   * Store the value of the Queue Size subfield of the last QoS Data or QoS Null
+   * frame received from the station with the given MAC address and belonging to
+   * the given TID.
+   *
+   * \param tid the given TID
+   * \param address the given MAC address
+   * \param size the value of the Queue Size subfield
+   */
+  void SetBufferStatus (uint8_t tid, Mac48Address address, uint8_t size);
+  /**
+   * Return the maximum among the values of the Queue Size subfield of the last
+   * QoS Data or QoS Null frames received from the station with the given MAC address
+   * and belonging to any TID.
+   *
+   * \param address the given MAC address
+   * \return the maximum among the values of the Queue Size subfields
+   */
+  uint8_t GetMaxBufferStatus (Mac48Address address) const;
 
 private:
-  void Receive (Ptr<WifiMacQueueItem> mpdu);
+  void Receive (Ptr<WifiMacQueueItem> mpdu)  override;
   /**
    * The packet we sent was successfully received by the receiver
    * (i.e. we received an Ack from the receiver).  If the packet
    * was an association response to the receiver, we record that
    * the receiver is now associated with us.
    *
-   * \param hdr the header of the packet that we successfully sent
+   * \param mpdu the MPDU that we successfully sent
    */
-  void TxOk (const WifiMacHeader &hdr);
+  void TxOk (Ptr<const WifiMacQueueItem> mpdu);
   /**
    * The packet we sent was successfully received by the receiver
    * (i.e. we did not receive an Ack from the receiver).  If the packet
    * was an association response to the receiver, we record that
    * the receiver is not associated with us yet.
    *
-   * \param hdr the header of the packet that we failed to sent
+   * \param timeoutReason the reason why the TX timer was started (\see WifiTxTimer::Reason)
+   * \param mpdu the MPDU that we failed to sent
+   * \param txVector the TX vector used to send the MPDU
    */
-  void TxFailed (const WifiMacHeader &hdr);
+  void TxFailed (uint8_t timeoutReason, Ptr<const WifiMacQueueItem> mpdu, const WifiTxVector& txVector);
 
   /**
    * This method is called to de-aggregate an A-MSDU and forward the
@@ -151,7 +173,7 @@
    *
    * \param mpdu the MPDU containing the A-MSDU.
    */
-  void DeaggregateAmsduAndForward (Ptr<WifiMacQueueItem> mpdu);
+  void DeaggregateAmsduAndForward (Ptr<WifiMacQueueItem> mpdu) override;
   /**
    * Forward the packet down to DCF/EDCAF (enqueue the packet). This method
    * is a wrapper for ForwardDown with traffic id.
@@ -191,18 +213,6 @@
    * Forward a beacon packet to the beacon special DCF.
    */
   void SendOneBeacon (void);
-  /**
-   * Determine what is the next PCF frame and trigger its transmission.
-   */
-  void SendNextCfFrame (void);
-  /**
-   * Send a CF-Poll packet to the next polling STA.
-   */
-  void SendCfPoll (void);
-  /**
-   * Send a CF-End packet.
-   */
-  void SendCfEnd (void);
 
   /**
    * Return the Capability information of the current AP.
@@ -223,12 +233,6 @@
    */
   EdcaParameterSet GetEdcaParameterSet (void) const;
   /**
-   * Return the CF parameter set of the current AP.
-   *
-   * \return the CF parameter set that we support
-   */
-  CfParameterSet GetCfParameterSet (void) const;
-  /**
    * Return the HT operation of the current AP.
    *
    * \return the HT operation that we support
@@ -265,6 +269,21 @@
    * \param enable enable or disable beacon generation
    */
   void SetBeaconGeneration (bool enable);
+
+  /**
+   * Update whether short slot time should be enabled or not in the BSS.
+   * Typically, short slot time is enabled only when there is no non-ERP station
+   * associated  to the AP, and that short slot time is supported by the AP and by all
+   * other ERP stations that are associated to the AP. Otherwise, it is disabled.
+   */
+  void UpdateShortSlotTimeEnabled (void);
+  /**
+   * Update whether short preamble should be enabled or not in the BSS.
+   * Typically, short preamble is enabled only when the AP and all associated
+   * stations support short PHY preamble. Otherwise, it is disabled.
+   */
+  void UpdateShortPreambleEnabled (void);
+
   /**
    * Return whether protection for non-ERP stations is used in the BSS.
    *
@@ -272,14 +291,9 @@
    *         false otherwise
    */
   bool GetUseNonErpProtection (void) const;
-  /**
-   * Increment the PCF polling list iterator to indicate
-   * that the next polling station can be polled.
-   */
-  void IncrementPollingListIterator (void);
 
-  void DoDispose (void);
-  void DoInitialize (void);
+  void DoDispose (void) override;
+  void DoInitialize (void) override;
 
   /**
    * \return the next Association ID to be allocated by the AP
@@ -288,16 +302,38 @@
 
   Ptr<Txop> m_beaconTxop;                    //!< Dedicated Txop for beacons
   bool m_enableBeaconGeneration;             //!< Flag whether beacons are being generated
+  Time m_beaconInterval;                     //!< Beacon interval
   EventId m_beaconEvent;                     //!< Event to generate one beacon
-  EventId m_cfpEvent;                        //!< Event to generate one PCF frame
   Ptr<UniformRandomVariable> m_beaconJitter; //!< UniformRandomVariable used to randomize the time of the first beacon
   bool m_enableBeaconJitter;                 //!< Flag whether the first beacon should be generated at random time
   std::map<uint16_t, Mac48Address> m_staList; //!< Map of all stations currently associated to the AP with their association ID
-  std::list<Mac48Address> m_nonErpStations;  //!< List of all non-ERP stations currently associated to the AP
-  std::list<Mac48Address> m_nonHtStations;   //!< List of all non-HT stations currently associated to the AP
-  std::list<Mac48Address> m_cfPollingList;   //!< List of all PCF stations currently associated to the AP
-  std::list<Mac48Address>::iterator m_itCfPollingList; //!< Iterator to the list of all PCF stations currently associated to the AP
+  /// Maps MAC addresses of associated stations to their association ID
+  std::unordered_map<Mac48Address, uint16_t, WifiAddressHash> m_addressIdMap;
+  uint16_t m_numNonErpStations;              //!< Number of non-ERP stations currently associated to the AP
+  uint16_t m_numNonHtStations;               //!< Number of non-HT stations currently associated to the AP
+  bool m_shortSlotTimeEnabled;               //!< Flag whether short slot time is enabled within the BSS
+  bool m_shortPreambleEnabled;               //!< Flag whether short preamble is enabled in the BSS
   bool m_enableNonErpProtection;             //!< Flag whether protection mechanism is used or not when non-ERP STAs are present within the BSS
+  Time m_bsrLifetime;                        //!< Lifetime of Buffer Status Reports
+  /// store value and timestamp for each Buffer Status Report
+  typedef struct
+  {
+    uint8_t value;  //!< value of BSR
+    Time timestamp; //!< timestamp of BSR
+  } bsrType;
+  /// Per (MAC address, TID) buffer status reports
+  std::unordered_map<WifiAddressTidPair, bsrType, WifiAddressTidHash> m_bufferStatus;
+
+  /**
+   * TracedCallback signature for association/deassociation events.
+   *
+   * \param aid the AID of the station
+   * \param address the MAC address of the station
+   */
+  typedef void (* AssociationCallback)(uint16_t aid, Mac48Address address);
+
+  TracedCallback<uint16_t /* AID */, Mac48Address> m_assocLogger;   ///< association logger
+  TracedCallback<uint16_t /* AID */, Mac48Address> m_deAssocLogger; ///< deassociation logger
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/arf-wifi-manager.cc ns-3.34/src/wifi/model/arf-wifi-manager.cc
--- ns-3.33/src/wifi/model/arf-wifi-manager.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/arf-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,271 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2004,2005,2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#include "ns3/log.h"
-#include "arf-wifi-manager.h"
-#include "wifi-tx-vector.h"
-
-#define Min(a,b) ((a < b) ? a : b)
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("ArfWifiManager");
-
-/**
- * \brief hold per-remote-station state for ARF Wifi manager.
- *
- * This struct extends from WifiRemoteStation struct to hold additional
- * information required by the ARF Wifi manager
- */
-struct ArfWifiRemoteStation : public WifiRemoteStation
-{
-  uint32_t m_timer; ///< timer value
-  uint32_t m_success; ///< success count
-  uint32_t m_failed; ///< failed count
-  bool m_recovery; ///< recovery
-  uint32_t m_timerTimeout; ///< timer timeout
-  uint32_t m_successThreshold; ///< success threshold
-  uint8_t m_rate; ///< rate
-};
-
-NS_OBJECT_ENSURE_REGISTERED (ArfWifiManager);
-
-TypeId
-ArfWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ArfWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<ArfWifiManager> ()
-    .AddAttribute ("TimerThreshold", "The 'timer' threshold in the ARF algorithm.",
-                   UintegerValue (15),
-                   MakeUintegerAccessor (&ArfWifiManager::m_timerThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("SuccessThreshold",
-                   "The minimum number of successful transmissions to try a new rate.",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&ArfWifiManager::m_successThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddTraceSource ("Rate",
-                     "Traced value for rate changes (b/s)",
-                     MakeTraceSourceAccessor (&ArfWifiManager::m_currentRate),
-                     "ns3::TracedValueCallback::Uint64")
-  ;
-  return tid;
-}
-
-ArfWifiManager::ArfWifiManager ()
-  : WifiRemoteStationManager (),
-    m_currentRate (0)
-{
-  NS_LOG_FUNCTION (this);
-}
-
-ArfWifiManager::~ArfWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-ArfWifiManager::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  if (GetHtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
-    }
-  if (GetVhtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
-    }
-  if (GetHeSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
-    }
-}
-
-WifiRemoteStation *
-ArfWifiManager::DoCreateStation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  ArfWifiRemoteStation *station = new ArfWifiRemoteStation ();
-
-  station->m_successThreshold = m_successThreshold;
-  station->m_timerTimeout = m_timerThreshold;
-  station->m_rate = 0;
-  station->m_success = 0;
-  station->m_failed = 0;
-  station->m_recovery = false;
-  station->m_timer = 0;
-
-  return station;
-}
-
-void
-ArfWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-/**
- * It is important to realize that "recovery" mode starts after failure of
- * the first transmission after a rate increase and ends at the first successful
- * transmission. Specifically, recovery mode transcends retransmissions boundaries.
- * Fundamentally, ARF handles each data transmission independently, whether it
- * is the initial transmission of a packet or the retransmission of a packet.
- * The fundamental reason for this is that there is a backoff between each data
- * transmission, be it an initial transmission or a retransmission.
- *
- * \param st the station that we failed to send Data
- */
-void
-ArfWifiManager::DoReportDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  ArfWifiRemoteStation *station = static_cast<ArfWifiRemoteStation*> (st);
-  station->m_timer++;
-  station->m_failed++;
-  station->m_success = 0;
-
-  if (station->m_recovery)
-    {
-      NS_ASSERT (station->m_failed >= 1);
-      if (station->m_failed == 1)
-        {
-          //need recovery fallback
-          if (station->m_rate != 0)
-            {
-              station->m_rate--;
-            }
-        }
-      station->m_timer = 0;
-    }
-  else
-    {
-      NS_ASSERT (station->m_failed >= 1);
-      if (((station->m_failed - 1) % 2) == 1)
-        {
-          //need normal fallback
-          if (station->m_rate != 0)
-            {
-              station->m_rate--;
-            }
-        }
-      if (station->m_failed >= 2)
-        {
-          station->m_timer = 0;
-        }
-    }
-}
-
-void
-ArfWifiManager::DoReportRxOk (WifiRemoteStation *station,
-                              double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
-}
-
-void ArfWifiManager::DoReportRtsOk (WifiRemoteStation *station,
-                                    double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << station << ctsSnr << ctsMode << rtsSnr);
-  NS_LOG_DEBUG ("station=" << station << " rts ok");
-}
-
-void ArfWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                     double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
-  ArfWifiRemoteStation *station = static_cast<ArfWifiRemoteStation*> (st);
-  station->m_timer++;
-  station->m_success++;
-  station->m_failed = 0;
-  station->m_recovery = false;
-  NS_LOG_DEBUG ("station=" << station << " data ok success=" << station->m_success << ", timer=" << station->m_timer);
-  if ((station->m_success == m_successThreshold
-       || station->m_timer == m_timerThreshold)
-      && (station->m_rate < (station->m_state->m_operationalRateSet.size () - 1)))
-    {
-      NS_LOG_DEBUG ("station=" << station << " inc rate");
-      station->m_rate++;
-      station->m_timer = 0;
-      station->m_success = 0;
-      station->m_recovery = true;
-    }
-}
-
-void
-ArfWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void
-ArfWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-WifiTxVector
-ArfWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  ArfWifiRemoteStation *station = static_cast<ArfWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiMode mode = GetSupported (station, station->m_rate);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
-    {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
-    }
-  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-}
-
-WifiTxVector
-ArfWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  /// \todo we could/should implement the ARF algorithm for
-  /// RTS only by picking a single rate within the BasicRateSet.
-  ArfWifiRemoteStation *station = static_cast<ArfWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiTxVector rtsTxVector;
-  WifiMode mode;
-  if (GetUseNonErpProtection () == false)
-    {
-      mode = GetSupported (station, 0);
-    }
-  else
-    {
-      mode = GetNonErpSupported (station, 0);
-    }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/arf-wifi-manager.h ns-3.34/src/wifi/model/arf-wifi-manager.h
--- ns-3.33/src/wifi/model/arf-wifi-manager.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/arf-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,85 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2005,2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#ifndef ARF_WIFI_MANAGER_H
-#define ARF_WIFI_MANAGER_H
-
-#include "ns3/traced-value.h"
-#include "wifi-remote-station-manager.h"
-
-namespace ns3 {
-
-/**
- * \ingroup wifi
- * \brief ARF Rate control algorithm
- *
- * This class implements the so-called ARF algorithm which was
- * initially described in <i>WaveLAN-II: A High-performance wireless
- * LAN for the unlicensed band</i>, by A. Kamerman and L. Monteban. in
- * Bell Lab Technical Journal, pages 118-133, Summer 1997.
- *
- * This implementation differs from the initial description in that it
- * uses a packet-based timer rather than a time-based timer as described
- * in XXX (I cannot find back the original paper which described how
- * the time-based timer could be easily replaced with a packet-based
- * timer.)
- *
- * This RAA does not support HT modes and will error
- * exit if the user tries to configure this RAA with a Wi-Fi MAC
- * that supports 802.11n or higher.
- */
-class ArfWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  ArfWifiManager ();
-  virtual ~ArfWifiManager ();
-
-
-private:
-  // Overridden from base class.
-  void DoInitialize (void);
-  WifiRemoteStation * DoCreateStation (void) const;
-  void DoReportRxOk (WifiRemoteStation *station,
-                     double rxSnr, WifiMode txMode);
-  void DoReportRtsFailed (WifiRemoteStation *station);
-  void DoReportDataFailed (WifiRemoteStation *station);
-  void DoReportRtsOk (WifiRemoteStation *station,
-                      double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  void DoReportFinalDataFailed (WifiRemoteStation *station);
-  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-
-  uint32_t m_timerThreshold;   ///< timer threshold
-  uint32_t m_successThreshold; ///< success threshold
-
-  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
-};
-
-} //namespace ns3
-
-#endif /* ARF_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/block-ack-agreement.cc ns-3.34/src/wifi/model/block-ack-agreement.cc
--- ns-3.33/src/wifi/model/block-ack-agreement.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/block-ack-agreement.cc	2021-07-14 10:31:07.000000000 -0700
@@ -165,4 +165,37 @@
   return (m_htSupported == 1) ? true : false;
 }
 
+BlockAckType
+BlockAckAgreement::GetBlockAckType (void) const
+{
+  if (!m_htSupported)
+    {
+      return BlockAckType::BASIC;
+    }
+  // Multi-TID Block Ack is not currently supported
+  if (m_bufferSize > 64)
+    {
+      return {BlockAckType::COMPRESSED, {32}};
+    }
+  return {BlockAckType::COMPRESSED, {8}};
+}
+
+BlockAckReqType
+BlockAckAgreement::GetBlockAckReqType (void) const
+{
+  if (!m_htSupported)
+    {
+      return BlockAckReqType::BASIC;
+    }
+  // Multi-TID Block Ack Request is not currently supported
+  return BlockAckReqType::COMPRESSED;
+}
+
+std::size_t
+BlockAckAgreement::GetDistance (uint16_t seqNumber, uint16_t startingSeqNumber)
+{
+  NS_ASSERT (seqNumber < SEQNO_SPACE_SIZE && startingSeqNumber < SEQNO_SPACE_SIZE);
+  return (seqNumber - startingSeqNumber + SEQNO_SPACE_SIZE) % SEQNO_SPACE_SIZE;
+}
+
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/block-ack-agreement.h ns-3.34/src/wifi/model/block-ack-agreement.h
--- ns-3.33/src/wifi/model/block-ack-agreement.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/block-ack-agreement.h	2021-07-14 10:31:07.000000000 -0700
@@ -23,6 +23,7 @@
 
 #include "ns3/mac48-address.h"
 #include "ns3/event-id.h"
+#include "block-ack-type.h"
 
 namespace ns3 {
 /**
@@ -33,7 +34,7 @@
 {
   /// Provide access to MacLow class
   friend class MacLow;
-
+  friend class HtFrameExchangeManager;
 
 public:
   /**
@@ -43,7 +44,7 @@
    * \param tid the TID
    */
   BlockAckAgreement (Mac48Address peer, uint8_t tid);
-  ~BlockAckAgreement ();
+  virtual ~BlockAckAgreement ();
   /**
    * Set buffer size.
    *
@@ -111,7 +112,7 @@
    *
    * \return starting sequence number
    */
-  uint16_t GetStartingSequence (void) const;
+  virtual uint16_t GetStartingSequence (void) const;
   /**
    * Return the starting sequence control
    *
@@ -151,6 +152,27 @@
    *         false otherwise
    */
   bool IsHtSupported (void) const;
+  /**
+   * Get the type of the Block Acks sent by the recipient of this agreement.
+   *
+   * \return the type of the Block Acks sent by the recipient of this agreement
+   */
+  BlockAckType GetBlockAckType (void) const;
+  /**
+   * Get the type of the Block Ack Requests sent by the originator of this agreement.
+   *
+   * \return the type of the Block Ack Requests sent by the originator of this agreement
+   */
+  BlockAckReqType GetBlockAckReqType (void) const;
+  /**
+   * Get the distance between the given starting sequence number and the
+   * given sequence number.
+   *
+   * \param seqNumber the given sequence number
+   * \param startingSeqNumber the given starting sequence number
+   * \return the distance of the given sequence number from the given starting sequence number
+   */
+  static std::size_t GetDistance (uint16_t seqNumber, uint16_t startingSeqNumber);
 
 
 protected:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/block-ack-cache.cc ns-3.34/src/wifi/model/block-ack-cache.cc
--- ns-3.33/src/wifi/model/block-ack-cache.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/block-ack-cache.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,144 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 MIRKO BANCHI
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mirko Banchi <mk.banchi@gmail.com>
- */
-
-#include "ns3/log.h"
-#include "block-ack-cache.h"
-#include "qos-utils.h"
-#include "wifi-utils.h"
-#include "wifi-mac-header.h"
-#include "ctrl-headers.h"
-
-#define WINSIZE_ASSERT NS_ASSERT ((m_winEnd - m_winStart + 4096) % 4096 == m_winSize - 1)
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("BlockAckCache");
-
-void
-BlockAckCache::Init (uint16_t winStart, uint16_t winSize)
-{
-  NS_LOG_FUNCTION (this << winStart << winSize);
-  m_winStart = winStart;
-  m_winSize = winSize;
-  m_winEnd = (m_winStart + m_winSize - 1) % 4096;
-  memset (m_bitmap, 0, sizeof (m_bitmap));
-}
-
-uint16_t
-BlockAckCache::GetWinStart () const
-{
-  return m_winStart;
-}
-
-void
-BlockAckCache::UpdateWithMpdu (const WifiMacHeader *hdr)
-{
-  NS_LOG_FUNCTION (this << hdr);
-  uint16_t seqNumber = hdr->GetSequenceNumber ();
-  if (!QosUtilsIsOldPacket (m_winStart, seqNumber))
-    {
-      if (!IsInWindow (seqNumber, m_winStart, m_winSize))
-        {
-          uint16_t delta = (seqNumber - m_winEnd + 4096) % 4096;
-          if (delta > 1)
-            {
-              ResetPortionOfBitmap ((m_winEnd + 1) % 4096, ((seqNumber - 1) + 4096) % 4096);
-            }
-          m_winStart = (m_winStart + delta) % 4096;
-          m_winEnd = seqNumber;
-
-          WINSIZE_ASSERT;
-        }
-      m_bitmap[seqNumber] |= (0x0001 << hdr->GetFragmentNumber ());
-    }
-}
-
-void
-BlockAckCache::UpdateWithBlockAckReq (uint16_t startingSeq)
-{
-  NS_LOG_FUNCTION (this << startingSeq);
-  if (!QosUtilsIsOldPacket (m_winStart, startingSeq))
-    {
-      if (IsInWindow (startingSeq, m_winStart, m_winSize))
-        {
-          if (startingSeq != m_winStart)
-            {
-              m_winStart = startingSeq;
-              uint16_t newWinEnd = (m_winStart + m_winSize - 1) % 4096;
-              ResetPortionOfBitmap ((m_winEnd + 1) % 4096, newWinEnd);
-              m_winEnd = newWinEnd;
-
-              WINSIZE_ASSERT;
-            }
-        }
-      else
-        {
-          m_winStart = startingSeq;
-          m_winEnd = (m_winStart + m_winSize - 1) % 4096;
-          ResetPortionOfBitmap (m_winStart, m_winEnd);
-
-          WINSIZE_ASSERT;
-        }
-    }
-}
-
-void
-BlockAckCache::ResetPortionOfBitmap (uint16_t start, uint16_t end)
-{
-  NS_LOG_FUNCTION (this << start << end);
-  uint16_t i = start;
-  for (; i != end; i = (i + 1) % 4096)
-    {
-      m_bitmap[i] = 0;
-    }
-  m_bitmap[i] = 0;
-}
-
-void
-BlockAckCache::FillBlockAckBitmap (CtrlBAckResponseHeader *blockAckHeader)
-{
-  NS_LOG_FUNCTION (this << blockAckHeader);
-  if (blockAckHeader->IsBasic ())
-    {
-      NS_FATAL_ERROR ("Basic block ack is only partially implemented.");
-    }
-  else if (blockAckHeader->IsCompressed () || blockAckHeader->IsExtendedCompressed ())
-    {
-      uint16_t i = blockAckHeader->GetStartingSequence ();
-      uint16_t end = (i + m_winSize - 1) % 4096;
-      for (; i != end; i = (i + 1) % 4096)
-        {
-          if (m_bitmap[i] == 1)
-            {
-              blockAckHeader->SetReceivedPacket (i);
-            }
-        }
-      if (m_bitmap[i] == 1)
-        {
-          blockAckHeader->SetReceivedPacket (i);
-        }
-    }
-  else if (blockAckHeader->IsMultiTid ())
-    {
-      NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
-    }
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/block-ack-cache.h ns-3.34/src/wifi/model/block-ack-cache.h
--- ns-3.33/src/wifi/model/block-ack-cache.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/block-ack-cache.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,88 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 MIRKO BANCHI
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mirko Banchi <mk.banchi@gmail.com>
- */
-
-#ifndef BLOCK_ACK_CACHE_H
-#define BLOCK_ACK_CACHE_H
-
-//#include <stdint.h>
-
-namespace ns3 {
-
-class WifiMacHeader;
-class CtrlBAckResponseHeader;
-
-/**
- * \ingroup wifi
- * \brief BlockAckCache cache
- *
- */
-class BlockAckCache
-{
-public:
-  /**
-   * Initialization function
-   * \param winStart the window start
-   * \param winSize the window size
-   */
-  void Init (uint16_t winStart, uint16_t winSize);
-
-  /**
-   * Update with MPDU function
-   * \param hdr the wifi MAC header
-   */
-  void UpdateWithMpdu (const WifiMacHeader *hdr);
-  /**
-   * Update with block ack request function
-   * \param startingSeq the starting sequence
-   */
-  void UpdateWithBlockAckReq (uint16_t startingSeq);
-  /**
-   * When an A-MPDU is received, the window start may change to a new value
-   * depending on the sequence number of the received MPDU (standard11n page 134).
-   * This function is used to retrieve this value in order to add it to the BlockAck.
-   * \returns window start
-   */
-  uint16_t GetWinStart (void) const;
-
-  /**
-   * Fill block ack bitmap function
-   * \param blockAckHeader the block ack bitmap
-   */
-  void FillBlockAckBitmap (CtrlBAckResponseHeader *blockAckHeader);
-
-
-private:
-  /**
-   * Reset portion of bitmap function
-   * \param start the starting position
-   * \param end the ending position
-   */
-  void ResetPortionOfBitmap (uint16_t start, uint16_t end);
-
-  uint16_t m_winStart; ///< window start
-  uint16_t m_winSize;  ///< window size
-  uint16_t m_winEnd;   ///< window end
-
-  uint16_t m_bitmap[4096]; ///< bitmap
-};
-
-} //namespace ns3
-
-#endif /* BLOCK_ACK_CACHE_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/block-ack-manager.cc ns-3.34/src/wifi/model/block-ack-manager.cc
--- ns-3.33/src/wifi/model/block-ack-manager.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/block-ack-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -25,7 +25,6 @@
 #include "ctrl-headers.h"
 #include "mgt-headers.h"
 #include "wifi-mac-queue.h"
-#include "mac-tx-middle.h"
 #include "qos-utils.h"
 #include "wifi-tx-vector.h"
 
@@ -124,7 +123,7 @@
   agreement.SetBufferSize (reqHdr->GetBufferSize());
   agreement.SetTimeout (reqHdr->GetTimeout ());
   agreement.SetAmsduSupport (reqHdr->IsAmsduSupported ());
-  agreement.SetHtSupported (m_stationManager->GetHtSupported ());
+  agreement.SetHtSupported (m_stationManager->GetHtSupported () && m_stationManager->GetHtSupported (recipient));
   if (reqHdr->IsImmediateBlockAck ())
     {
       agreement.SetImmediateBlockAck ();
@@ -183,9 +182,10 @@
 }
 
 void
-BlockAckManager::UpdateAgreement (const MgtAddBaResponseHeader *respHdr, Mac48Address recipient)
+BlockAckManager::UpdateAgreement (const MgtAddBaResponseHeader *respHdr, Mac48Address recipient,
+                                  uint16_t startingSeq)
 {
-  NS_LOG_FUNCTION (this << respHdr << recipient);
+  NS_LOG_FUNCTION (this << respHdr << recipient << startingSeq);
   uint8_t tid = respHdr->GetTid ();
   AgreementsI it = m_agreements.find (std::make_pair (recipient, tid));
   if (it != m_agreements.end ())
@@ -194,22 +194,7 @@
       agreement.SetBufferSize (respHdr->GetBufferSize () + 1);
       agreement.SetTimeout (respHdr->GetTimeout ());
       agreement.SetAmsduSupport (respHdr->IsAmsduSupported ());
-      // When the Add BA Response is received, there may be a packet transmitted
-      // under the normal ack policy that needs to be retransmitted. If so, such
-      // packet is placed in the retransmit queue. If this is the case, the starting
-      // sequence number is the sequence number of such packet. Otherwise, it is
-      // the sequence number that will be assigned to the next packet to be transmitted.
-      uint16_t startSeq;
-      WifiMacQueue::ConstIterator mpduIt = m_retryPackets->PeekByTidAndAddress (tid, recipient);
-      if (mpduIt != m_retryPackets->end ())
-        {
-          startSeq = (*mpduIt)->GetHeader ().GetSequenceNumber ();
-        }
-      else
-        {
-          startSeq = m_txMiddle->GetNextSeqNumberByTidAndAddress (tid, recipient);
-        }
-      agreement.SetStartingSequence (startSeq);
+      agreement.SetStartingSequence (startingSeq);
       agreement.InitTxWindow ();
       if (respHdr->IsImmediateBlockAck ())
         {
@@ -288,7 +273,7 @@
 }
 
 Ptr<const WifiMacQueueItem>
-BlockAckManager::GetBar (bool remove)
+BlockAckManager::GetBar (bool remove, uint8_t tid, Mac48Address address)
 {
   Ptr<const WifiMacQueueItem> bar;
   // remove all expired MPDUs in the retransmission queue, so that Block Ack Requests
@@ -299,9 +284,18 @@
 
   while (nextBar != m_bars.end ())
     {
+      Mac48Address recipient = nextBar->bar->GetHeader ().GetAddr1 ();
+
+      if (address != Mac48Address::GetBroadcast () && tid != 8
+            && (!nextBar->bar->GetHeader ().IsBlockAckReq ()
+                  || address != recipient || tid != nextBar->tid))
+        {
+          // we can only return a BAR addressed to the given station and for the given TID
+          nextBar++;
+          continue;
+        }
       if (nextBar->bar->GetHeader ().IsBlockAckReq ())
         {
-          Mac48Address recipient = nextBar->bar->GetHeader ().GetAddr1 ();
           AgreementsI it = m_agreements.find (std::make_pair (recipient, nextBar->tid));
           if (it == m_agreements.end ())
             {
@@ -461,17 +455,26 @@
 }
 
 void
-BlockAckManager::NotifyGotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address recipient, double rxSnr, double dataSnr, WifiTxVector dataTxVector)
-{
-  NS_LOG_FUNCTION (this << blockAck << recipient << rxSnr << dataSnr << dataTxVector);
-  if (!blockAck->IsMultiTid ())
-    {
-      uint8_t tid = blockAck->GetTidInfo ();
+BlockAckManager::NotifyGotBlockAck (const CtrlBAckResponseHeader& blockAck, Mac48Address recipient,
+                                    const std::set<uint8_t>& tids, double rxSnr, double dataSnr,
+                                    const WifiTxVector& dataTxVector, size_t index)
+{
+  NS_LOG_FUNCTION (this << blockAck << recipient << rxSnr << dataSnr << dataTxVector << index);
+  if (!blockAck.IsMultiTid ())
+    {
+      uint8_t tid = blockAck.GetTidInfo (index);
+      // If this is a Multi-STA Block Ack with All-ack context (TID equal to 14),
+      // use the TID passed by the caller.
+      if (tid == 14)
+        {
+          NS_ASSERT (blockAck.GetAckType (index) && tids.size () == 1);
+          tid = *tids.begin ();
+        }
       if (ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED))
         {
           bool foundFirstLost = false;
-          uint8_t nSuccessfulMpdus = 0;
-          uint8_t nFailedMpdus = 0;
+          uint16_t nSuccessfulMpdus = 0;
+          uint16_t nFailedMpdus = 0;
           AgreementsI it = m_agreements.find (std::make_pair (recipient, tid));
           PacketQueueI queueEnd = it->second.second.end ();
 
@@ -491,12 +494,12 @@
           uint16_t currentStartingSeq = it->second.first.GetStartingSequence ();
           uint16_t currentSeq = SEQNO_SPACE_SIZE;   // invalid value
 
-          if (blockAck->IsBasic ())
+          if (blockAck.IsBasic ())
             {
               for (PacketQueueI queueIt = it->second.second.begin (); queueIt != queueEnd; )
                 {
                   currentSeq = (*queueIt)->GetHeader ().GetSequenceNumber ();
-                  if (blockAck->IsFragmentReceived (currentSeq,
+                  if (blockAck.IsFragmentReceived (currentSeq,
                                                     (*queueIt)->GetHeader ().GetFragmentNumber ()))
                     {
                       nSuccessfulMpdus++;
@@ -520,18 +523,18 @@
                   RemoveOldPackets (recipient, tid, (currentSeq + 1) % SEQNO_SPACE_SIZE);
                 }
             }
-          else if (blockAck->IsCompressed () || blockAck->IsExtendedCompressed ())
+          else if (blockAck.IsCompressed () || blockAck.IsExtendedCompressed () || blockAck.IsMultiSta ())
             {
               for (PacketQueueI queueIt = it->second.second.begin (); queueIt != queueEnd; )
                 {
                   currentSeq = (*queueIt)->GetHeader ().GetSequenceNumber ();
-                  if (blockAck->IsPacketReceived (currentSeq))
+                  if (blockAck.IsPacketReceived (currentSeq, index))
                     {
                       it->second.first.NotifyAckedMpdu (*queueIt);
                       nSuccessfulMpdus++;
                       if (!m_txOkCallback.IsNull ())
                         {
-                          m_txOkCallback ((*queueIt)->GetHeader ());
+                          m_txOkCallback (*queueIt);
                         }
                     }
                   else if (!QosUtilsIsOldPacket (currentStartingSeq, currentSeq))
@@ -539,7 +542,7 @@
                       nFailedMpdus++;
                       if (!m_txFailedCallback.IsNull ())
                         {
-                          m_txFailedCallback ((*queueIt)->GetHeader ());
+                          m_txFailedCallback (*queueIt);
                         }
                       InsertInRetryQueue (*queueIt);
                     }
@@ -599,13 +602,6 @@
 }
 
 void
-BlockAckManager::SetBlockAckType (BlockAckType bAckType)
-{
-  NS_LOG_FUNCTION (this << bAckType);
-  m_blockAckType = bAckType;
-}
-
-void
 BlockAckManager::NotifyDiscardedMpdu (Ptr<const WifiMacQueueItem> mpdu)
 {
   NS_LOG_FUNCTION (this << *mpdu);
@@ -664,7 +660,7 @@
   NS_ASSERT (it != m_agreements.end ());
 
   CtrlBAckRequestHeader reqHdr;
-  reqHdr.SetType (m_blockAckType);
+  reqHdr.SetType ((*it).second.first.GetBlockAckReqType ());
   reqHdr.SetTidInfo (tid);
   reqHdr.SetStartingSequence ((*it).second.first.GetStartingSequence ());
   return reqHdr;
@@ -674,21 +670,38 @@
 BlockAckManager::ScheduleBar (Ptr<const WifiMacQueueItem> bar, bool skipIfNoDataQueued)
 {
   NS_LOG_FUNCTION (this << *bar);
-  NS_ASSERT (bar->GetHeader ().IsBlockAckReq ());
+  NS_ASSERT (bar->GetHeader ().IsBlockAckReq () || bar->GetHeader ().IsTrigger ());
 
-  CtrlBAckRequestHeader reqHdr;
-  bar->GetPacket ()->PeekHeader (reqHdr);
-  uint8_t tid = reqHdr.GetTidInfo ();
+  uint8_t tid = 0;
+  if (bar->GetHeader ().IsBlockAckReq ())
+    {
+      CtrlBAckRequestHeader reqHdr;
+      bar->GetPacket ()->PeekHeader (reqHdr);
+      tid = reqHdr.GetTidInfo ();
+    }
+#ifdef NS3_BUILD_PROFILE_DEBUG
+  else
+    {
+      CtrlTriggerHeader triggerHdr;
+      bar->GetPacket ()->PeekHeader (triggerHdr);
+      NS_ASSERT (triggerHdr.IsMuBar ());
+    }
+#endif
   Bar request (bar, tid, skipIfNoDataQueued);
 
   // if a BAR for the given agreement is present, replace it with the new one
-  for (std::list<Bar>::const_iterator i = m_bars.begin (); i != m_bars.end (); i++)
+  std::list<Bar>::const_iterator i = m_bars.end ();
+
+  if (bar->GetHeader ().IsBlockAckReq ())
     {
-      if (i->bar->GetHeader ().GetAddr1 () == bar->GetHeader ().GetAddr1 () && i->tid == tid)
+      for (i = m_bars.begin (); i != m_bars.end (); i++)
         {
-          i = m_bars.erase (i);
-          m_bars.insert (i, request);
-          return;
+          if (i->bar->GetHeader ().IsBlockAckReq ()
+              && i->bar->GetHeader ().GetAddr1 () == bar->GetHeader ().GetAddr1 () && i->tid == tid)
+            {
+              i = m_bars.erase (i);
+              break;
+            }
         }
     }
 
@@ -698,7 +711,7 @@
     }
   else
     {
-      m_bars.push_back (request);
+      m_bars.insert (i, request);
     }
 }
 
@@ -906,13 +919,6 @@
 }
 
 void
-BlockAckManager::SetTxMiddle (const Ptr<MacTxMiddle> txMiddle)
-{
-  NS_LOG_FUNCTION (this << txMiddle);
-  m_txMiddle = txMiddle;
-}
-
-void
 BlockAckManager::SetTxOkCallback (TxOk callback)
 {
   m_txOkCallback = callback;
@@ -980,6 +986,22 @@
   return size;
 }
 
+BlockAckReqType
+BlockAckManager::GetBlockAckReqType (Mac48Address recipient, uint8_t tid) const
+{
+  AgreementsCI it = m_agreements.find (std::make_pair (recipient, tid));
+  NS_ABORT_MSG_IF (it == m_agreements.end (), "No established Block Ack agreement");
+  return it->second.first.GetBlockAckReqType ();
+}
+
+BlockAckType
+BlockAckManager::GetBlockAckType (Mac48Address recipient, uint8_t tid) const
+{
+  AgreementsCI it = m_agreements.find (std::make_pair (recipient, tid));
+  NS_ABORT_MSG_IF (it == m_agreements.end (), "No established Block Ack agreement");
+  return it->second.first.GetBlockAckType ();
+}
+
 uint16_t
 BlockAckManager::GetOriginatorStartingSequence (Mac48Address recipient, uint8_t tid) const
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/block-ack-manager.h ns-3.34/src/wifi/model/block-ack-manager.h
--- ns-3.33/src/wifi/model/block-ack-manager.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/block-ack-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -28,6 +28,7 @@
 #include "originator-block-ack-agreement.h"
 #include "block-ack-type.h"
 #include "wifi-mac-queue-item.h"
+#include "wifi-tx-vector.h"
 
 namespace ns3 {
 
@@ -36,7 +37,6 @@
 class MgtAddBaRequestHeader;
 class CtrlBAckResponseHeader;
 class CtrlBAckRequestHeader;
-class MacTxMiddle;
 class WifiMacQueue;
 class WifiMode;
 class Packet;
@@ -50,16 +50,16 @@
 {
   Bar ();
   /**
-   * Store a BlockAckRequest along with the corresponding TID.
+   * Store a BlockAckRequest along with the corresponding TID or a MU-BAR Trigger Frame.
    *
    * \param bar the BAR
    * \param tid the Traffic ID
    * \param skipIfNoDataQueued true to hold this BAR if there is no data queued
    */
   Bar (Ptr<const WifiMacQueueItem> bar, uint8_t tid, bool skipIfNoDataQueued = false);
-  Ptr<const WifiMacQueueItem> bar;  ///< BlockAckRequest
-  uint8_t tid;                      ///< TID
-  bool skipIfNoDataQueued;          ///< do not send if there is no data queued
+  Ptr<const WifiMacQueueItem> bar;  ///< BlockAckRequest or MU-BAR Trigger Frame
+  uint8_t tid;                      ///< TID (unused if MU-BAR)
+  bool skipIfNoDataQueued;          ///< do not send if there is no data queued (unused if MU-BAR)
 };
 
 
@@ -137,10 +137,12 @@
   /**
    * \param respHdr Relative Add block ack response (action frame).
    * \param recipient Address of peer station involved in block ack mechanism.
+   * \param startingSeq the updated starting sequence number
    *
    * Invoked upon receipt of a ADDBA response frame from <i>recipient</i>.
    */
-  void UpdateAgreement (const MgtAddBaResponseHeader *respHdr, Mac48Address recipient);
+  void UpdateAgreement (const MgtAddBaResponseHeader *respHdr, Mac48Address recipient,
+                        uint16_t startingSeq);
   /**
    * \param mpdu MPDU to store.
    *
@@ -149,13 +151,19 @@
    */
   void StorePacket (Ptr<WifiMacQueueItem> mpdu);
   /**
-   * Returns the next BlockAckRequest to send, if any.
+   * Returns the next BlockAckRequest or MU-BAR Trigger Frame to send, if any.
+   * If the given recipient is not the broadcast address and the given TID is less
+   * than 8, then only return a BlockAckRequest, if any, addressed to that recipient
+   * and for the given TID.
    *
    * \param remove true if the BAR has to be removed from the queue
+   * \param tid the TID
+   * \param recipient the recipient of the BAR
    *
    * \return the next BAR to be sent, if any
    */
-  Ptr<const WifiMacQueueItem> GetBar (bool remove = true);
+  Ptr<const WifiMacQueueItem> GetBar (bool remove = true, uint8_t tid = 8,
+                                      Mac48Address recipient = Mac48Address::GetBroadcast ());
   /**
    * Returns true if there are packets that need of retransmission or at least a
    * BAR is scheduled. Returns false otherwise.
@@ -185,17 +193,23 @@
   /**
    * \param blockAck The received BlockAck frame.
    * \param recipient Sender of BlockAck frame.
+   * \param tids the set of TIDs the acknowledged MPDUs belong to
    * \param rxSnr received SNR of the BlockAck frame itself
    * \param dataSnr data SNR reported by remote station
    * \param dataTxVector the TXVECTOR used to send the Data
+   * \param index the index of the Per AID TID Info subfield, in case of Multi-STA
+   *              Block Ack, or 0, otherwise
    *
    * Invoked upon receipt of a BlockAck frame. Typically, this function, is called
    * by ns3::QosTxop object. Performs a check on which MPDUs, previously sent
    * with Ack Policy set to Block Ack, were correctly received by the recipient.
    * An acknowledged MPDU is removed from the buffer, retransmitted otherwise.
+   * Note that <i>tids</i> is only used if <i>blockAck</i> is a Multi-STA Block Ack
+   * using All-ack context.
    */
-  void NotifyGotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address recipient,
-                          double rxSnr, double dataSnr, WifiTxVector dataTxVector);
+  void NotifyGotBlockAck (const CtrlBAckResponseHeader& blockAck, Mac48Address recipient,
+                          const std::set<uint8_t>& tids, double rxSnr, double dataSnr,
+                          const WifiTxVector& dataTxVector, size_t index = 0);
   /**
    * \param recipient Sender of the expected BlockAck frame.
    * \param tid Traffic ID.
@@ -276,22 +290,10 @@
    * \param queue The WifiMacQueue object.
    */
   void SetQueue (const Ptr<WifiMacQueue> queue);
-  /**
-   * Set the MacTxMiddle
-   * \param txMiddle the MacTxMiddle
-   */
-  void SetTxMiddle (const Ptr<MacTxMiddle> txMiddle);
 
   /**
-   * \param bAckType Type of BlockAck
-   *
-   * See ctrl-headers.h for more details.
-   */
-  void SetBlockAckType (BlockAckType bAckType);
-
-  /**
-   * Set BlockAck inactivity callback
-   * \param callback the BlockAck inactivity callback function
+   * Set block ack inactivity callback
+   * \param callback the block ack inactivity callback function
    */
   void SetBlockAckInactivityCallback (Callback<void, Mac48Address, uint8_t, bool> callback);
   /**
@@ -340,6 +342,24 @@
    */
   uint16_t GetRecipientBufferSize (Mac48Address recipient, uint8_t tid) const;
   /**
+   * This function returns the type of Block Acks sent to the recipient.
+   *
+   * \param recipient MAC address of recipient
+   * \param tid Traffic ID
+   *
+   * \returns the type of Block Acks sent to the recipient
+   */
+  BlockAckReqType GetBlockAckReqType (Mac48Address recipient, uint8_t tid) const;
+  /**
+   * This function returns the type of Block Acks sent by the recipient.
+   *
+   * \param recipient MAC address
+   * \param tid Traffic ID
+   *
+   * \returns the type of Block Acks sent by the recipient
+   */
+  BlockAckType GetBlockAckType (Mac48Address recipient, uint8_t tid) const;
+  /**
    * This function returns the starting sequence number of the transmit window.
    *
    * \param tid Traffic ID
@@ -350,15 +370,13 @@
   uint16_t GetOriginatorStartingSequence (Mac48Address recipient, uint8_t tid) const;
 
   /**
-   * typedef for a callback to invoke when a
-   * packet transmission was completed successfully.
+   * typedef for a callback to invoke when an MPDU is successfully ack'ed.
    */
-  typedef Callback <void, const WifiMacHeader&> TxOk;
+  typedef Callback <void, Ptr<const WifiMacQueueItem>> TxOk;
   /**
-   * typedef for a callback to invoke when a
-   * packet transmission was failed.
+   * typedef for a callback to invoke when an MPDU is negatively ack'ed.
    */
-  typedef Callback <void, const WifiMacHeader&> TxFailed;
+  typedef Callback <void, Ptr<const WifiMacQueueItem>> TxFailed;
   /**
    * \param callback the callback to invoke when a
    * packet transmission was completed successfully.
@@ -395,6 +413,7 @@
   /**
    * \param recipient the recipient
    * \param tid the TID
+   * \return the BlockAckRequest header for the established BA agreement
    *
    * Get the BlockAckRequest header for the established BA agreement
    * (<i>recipient</i>,<i>tid</i>).
@@ -506,9 +525,6 @@
   std::list<Bar> m_bars; ///< list of BARs
 
   uint8_t m_blockAckThreshold; ///< block ack threshold
-  BlockAckType m_blockAckType; ///< BlockAck type
-  Ptr<MacTxMiddle> m_txMiddle; ///< the MacTxMiddle
-  Mac48Address m_address;      ///< address
   Ptr<WifiMacQueue> m_queue;   ///< queue
   Callback<void, Mac48Address, uint8_t, bool> m_blockAckInactivityTimeout; ///< BlockAck inactivity timeout callback
   Callback<void, Mac48Address, uint8_t> m_blockPackets;   ///< block packets callback
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/block-ack-type.cc ns-3.34/src/wifi/model/block-ack-type.cc
--- ns-3.33/src/wifi/model/block-ack-type.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/block-ack-type.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,134 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2019 Universita' di Napoli
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "block-ack-type.h"
+#include "ns3/fatal-error.h"
+
+namespace ns3 {
+
+BlockAckType::BlockAckType (Variant v)
+  : m_variant (v)
+{
+  switch (m_variant)
+    {
+    case BASIC:
+      m_bitmapLen.push_back (128);
+      break;
+    case COMPRESSED:
+    case EXTENDED_COMPRESSED:
+      m_bitmapLen.push_back (8);
+      break;
+    case MULTI_TID:
+    case MULTI_STA:
+      // m_bitmapLen is left empty.
+      break;
+    default:
+      NS_FATAL_ERROR ("Unknown block ack type");
+    }
+}
+
+BlockAckType::BlockAckType ()
+  : BlockAckType (BASIC)
+{
+}
+
+BlockAckType::BlockAckType (Variant v, std::vector<uint8_t> l)
+  : m_variant (v),
+    m_bitmapLen (l)
+{
+}
+
+BlockAckReqType::BlockAckReqType (Variant v)
+  : m_variant (v)
+{
+  switch (m_variant)
+    {
+    case BASIC:
+    case COMPRESSED:
+    case EXTENDED_COMPRESSED:
+      m_nSeqControls = 1;
+      break;
+    case MULTI_TID:
+      m_nSeqControls = 0;
+      break;
+    default:
+      NS_FATAL_ERROR ("Unknown block ack request type");
+    }
+}
+
+BlockAckReqType::BlockAckReqType ()
+  : BlockAckReqType (BASIC)
+{
+}
+
+BlockAckReqType::BlockAckReqType (Variant v, uint8_t nSeqControls)
+  : m_variant (v),
+    m_nSeqControls (nSeqControls)
+{
+}
+
+std::ostream &operator << (std::ostream &os, const BlockAckType &type)
+{
+  switch (type.m_variant)
+    {
+    case BlockAckType::BASIC:
+      os << "basic-block-ack";
+      break;
+    case BlockAckType::COMPRESSED:
+      os << "compressed-block-ack";
+      break;
+    case BlockAckType::EXTENDED_COMPRESSED:
+      os << "extended-compressed-block-ack";
+      break;
+    case BlockAckType::MULTI_TID:
+      os << "multi-tid-block-ack[" << type.m_bitmapLen.size () << "]";
+      break;
+    case BlockAckType::MULTI_STA:
+      os << "multi-sta-block-ack[" << type.m_bitmapLen.size () << "]";
+      break;
+    default:
+      NS_FATAL_ERROR ("Unknown block ack type");
+    }
+  return os;
+}
+
+std::ostream &operator << (std::ostream &os, const BlockAckReqType &type)
+{
+  switch (type.m_variant)
+    {
+    case BlockAckReqType::BASIC:
+      os << "basic-block-ack-req";
+      break;
+    case BlockAckReqType::COMPRESSED:
+      os << "compressed-block-ack-req";
+      break;
+    case BlockAckReqType::EXTENDED_COMPRESSED:
+      os << "extended-compressed-block-ack-req";
+      break;
+    case BlockAckReqType::MULTI_TID:
+      os << "multi-tid-block-ack-req[" << type.m_nSeqControls << "]";
+      break;
+    default:
+      NS_FATAL_ERROR ("Unknown block ack request type");
+    }
+  return os;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/block-ack-type.h ns-3.34/src/wifi/model/block-ack-type.h
--- ns-3.33/src/wifi/model/block-ack-type.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/block-ack-type.h	2021-07-14 10:31:07.000000000 -0700
@@ -21,20 +21,111 @@
 #ifndef BLOCK_ACK_TYPE_H
 #define BLOCK_ACK_TYPE_H
 
+#include <ostream>
+#include <vector>
+
 namespace ns3 {
 
 /**
  * \ingroup wifi
- * The different block ack policies.
+ * The different BlockAck variants.
  */
-enum BlockAckType
+struct BlockAckType
 {
-  BASIC_BLOCK_ACK,
-  COMPRESSED_BLOCK_ACK,
-  EXTENDED_COMPRESSED_BLOCK_ACK,
-  MULTI_TID_BLOCK_ACK,
+  /**
+   * \enum Variant
+   * \brief The BlockAck variants
+   */
+  enum Variant
+  {
+    BASIC,
+    COMPRESSED,
+    EXTENDED_COMPRESSED,
+    MULTI_TID,
+    MULTI_STA
+  };
+  enum Variant m_variant;           //!< Block Ack variant
+  std::vector<uint8_t> m_bitmapLen; //!< Length (bytes) of included bitmaps
+
+  /**
+   * Default constructor for BlockAckType.
+   */
+  BlockAckType ();
+  /**
+   * Constructor for BlockAckType with given variant.
+   *
+   * \param v the Block Ack variant
+   */
+  BlockAckType (Variant v);
+  /**
+   * Constructor for BlockAckType with given variant
+   * and bitmap length.
+   *
+   * \param v the Block Ack variant
+   * \param l the length (bytes) of included bitmaps
+   */
+  BlockAckType (Variant v, std::vector<uint8_t> l);
 };
 
+/**
+ * \ingroup wifi
+ * The different BlockAckRequest variants.
+ */
+struct BlockAckReqType
+{
+  /**
+   * \enum Variant
+   * \brief The BlockAckReq variants
+   */
+  enum Variant
+  {
+    BASIC,
+    COMPRESSED,
+    EXTENDED_COMPRESSED,
+    MULTI_TID
+  };
+  enum Variant m_variant;           //!< Block Ack Request variant
+  uint8_t m_nSeqControls;           //!< Number of included Starting Sequence Control fields.
+                                    //!< This member is added for future support of Multi-TID BARs
+
+  /**
+   * Default constructor for BlockAckReqType.
+   */
+  BlockAckReqType ();
+  /**
+   * Constructor for BlockAckReqType with given variant.
+   *
+   * \param v the Block Ack Request variant
+   */
+  BlockAckReqType (Variant v);
+  /**
+   * Constructor for BlockAckReqType with given variant
+   * and number of SSC fields.
+   *
+   * \param v the Block Ack Request variant
+   * \param nSeqControls the number of included Starting Sequence Control fields
+   */
+  BlockAckReqType (Variant v, uint8_t nSeqControls);
+};
+
+/**
+ * Serialize BlockAckType to ostream in a human-readable form.
+ *
+ * \param os std::ostream
+ * \param type block ack type
+ * \return std::ostream
+ */
+std::ostream &operator << (std::ostream &os, const BlockAckType &type);
+
+/**
+ * Serialize BlockAckReqType to ostream in a human-readable form.
+ *
+ * \param os std::ostream
+ * \param type block ack request type
+ * \return std::ostream
+ */
+std::ostream &operator << (std::ostream &os, const BlockAckReqType &type);
+
 } //namespace ns3
 
 #endif /* BLOCK_ACK_TYPE_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/block-ack-window.cc ns-3.34/src/wifi/model/block-ack-window.cc
--- ns-3.33/src/wifi/model/block-ack-window.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/block-ack-window.cc	2021-07-14 10:31:07.000000000 -0700
@@ -73,6 +73,14 @@
   return m_window.at ((m_head + distance) % m_window.size ());
 }
 
+std::vector<bool>::const_reference
+BlockAckWindow::At (std::size_t distance) const
+{
+  NS_ASSERT (distance < m_window.size ());
+
+  return m_window.at ((m_head + distance) % m_window.size ());
+}
+
 void
 BlockAckWindow::Advance (std::size_t count)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/block-ack-window.h ns-3.34/src/wifi/model/block-ack-window.h
--- ns-3.33/src/wifi/model/block-ack-window.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/block-ack-window.h	2021-07-14 10:31:07.000000000 -0700
@@ -103,6 +103,16 @@
    */
   std::vector<bool>::reference At (std::size_t distance);
   /**
+   * Get a const reference to the element in the window having the given distance from
+   * the current winStart. Note that the given distance must be less than the
+   * window size.
+   *
+   * \param distance the given distance
+   * \return a const reference to the element in the window having the given distance
+   *         from the current winStart
+   */
+  std::vector<bool>::const_reference At (std::size_t distance) const;
+  /**
    * Advance the current winStart by the given number of positions.
    *
    * \param count the number of positions the current winStart must be advanced by
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/cara-wifi-manager.cc ns-3.34/src/wifi/model/cara-wifi-manager.cc
--- ns-3.33/src/wifi/model/cara-wifi-manager.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/cara-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,253 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2004,2005,2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Federico Maguolo <maguolof@dei.unipd.it>
- */
-
-#include "ns3/log.h"
-#include "cara-wifi-manager.h"
-#include "wifi-tx-vector.h"
-
-#define Min(a,b) ((a < b) ? a : b)
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("CaraWifiManager");
-
-/**
- * \brief hold per-remote-station state for CARA Wifi manager.
- *
- * This struct extends from WifiRemoteStation struct to hold additional
- * information required by the CARA Wifi manager
- */
-struct CaraWifiRemoteStation : public WifiRemoteStation
-{
-  uint32_t m_timer;   ///< timer count
-  uint32_t m_success; ///< success count
-  uint32_t m_failed;  ///< failed count
-  uint8_t m_rate;     ///< rate in bps
-};
-
-NS_OBJECT_ENSURE_REGISTERED (CaraWifiManager);
-
-TypeId
-CaraWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::CaraWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<CaraWifiManager> ()
-    .AddAttribute ("ProbeThreshold",
-                   "The number of consecutive transmissions failure to activate the RTS probe.",
-                   UintegerValue (1),
-                   MakeUintegerAccessor (&CaraWifiManager::m_probeThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("FailureThreshold",
-                   "The number of consecutive transmissions failure to decrease the rate.",
-                   UintegerValue (2),
-                   MakeUintegerAccessor (&CaraWifiManager::m_failureThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("SuccessThreshold",
-                   "The minimum number of successful transmissions to try a new rate.",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&CaraWifiManager::m_successThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("Timeout",
-                   "The 'timer' in the CARA algorithm",
-                   UintegerValue (15),
-                   MakeUintegerAccessor (&CaraWifiManager::m_timerTimeout),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddTraceSource ("Rate",
-                     "Traced value for rate changes (b/s)",
-                     MakeTraceSourceAccessor (&CaraWifiManager::m_currentRate),
-                     "ns3::TracedValueCallback::Uint64")
-  ;
-  return tid;
-}
-
-CaraWifiManager::CaraWifiManager ()
-  : WifiRemoteStationManager (),
-    m_currentRate (0)
-{
-  NS_LOG_FUNCTION (this);
-}
-
-CaraWifiManager::~CaraWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-CaraWifiManager::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  if (GetHtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
-    }
-  if (GetVhtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
-    }
-  if (GetHeSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
-    }
-}
-
-WifiRemoteStation *
-CaraWifiManager::DoCreateStation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  CaraWifiRemoteStation *station = new CaraWifiRemoteStation ();
-  station->m_rate = 0;
-  station->m_success = 0;
-  station->m_failed = 0;
-  station->m_timer = 0;
-  return station;
-}
-
-void
-CaraWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-}
-
-void
-CaraWifiManager::DoReportDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  CaraWifiRemoteStation *station = static_cast<CaraWifiRemoteStation*> (st);
-  station->m_timer++;
-  station->m_failed++;
-  station->m_success = 0;
-  if (station->m_failed >= m_failureThreshold)
-    {
-      NS_LOG_DEBUG ("self=" << station << " dec rate");
-      if (station->m_rate != 0)
-        {
-          station->m_rate--;
-        }
-      station->m_failed = 0;
-      station->m_timer = 0;
-    }
-}
-
-void
-CaraWifiManager::DoReportRxOk (WifiRemoteStation *st,
-                               double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << st << rxSnr << txMode);
-}
-
-void
-CaraWifiManager::DoReportRtsOk (WifiRemoteStation *st,
-                                double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
-}
-
-void
-CaraWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                 double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
-  CaraWifiRemoteStation *station = static_cast<CaraWifiRemoteStation*> (st);
-  station->m_timer++;
-  station->m_success++;
-  station->m_failed = 0;
-  NS_LOG_DEBUG ("self=" << station << " data ok success=" << station->m_success << ", timer=" << station->m_timer);
-  if ((station->m_success == m_successThreshold
-       || station->m_timer >= m_timerTimeout))
-    {
-      if (station->m_rate < GetNSupported (station) - 1)
-        {
-          station->m_rate++;
-        }
-      NS_LOG_DEBUG ("self=" << station << " inc rate=" << +station->m_rate);
-      station->m_timer = 0;
-      station->m_success = 0;
-    }
-}
-
-void
-CaraWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-}
-
-void
-CaraWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-}
-
-WifiTxVector
-CaraWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  CaraWifiRemoteStation *station = static_cast<CaraWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiMode mode = GetSupported (station, station->m_rate);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
-    {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
-    }
-  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-}
-
-WifiTxVector
-CaraWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  CaraWifiRemoteStation *station = static_cast<CaraWifiRemoteStation*> (st);
-  /// \todo we could/should implement the Arf algorithm for
-  /// RTS only by picking a single rate within the BasicRateSet.
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiTxVector rtsTxVector;
-  WifiMode mode;
-  if (GetUseNonErpProtection () == false)
-    {
-      mode = GetSupported (station, 0);
-    }
-  else
-    {
-      mode = GetNonErpSupported (station, 0);
-    }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
-}
-
-bool
-CaraWifiManager::DoNeedRts (WifiRemoteStation *st,
-                            uint32_t size, bool normally)
-{
-  NS_LOG_FUNCTION (this << st << size << normally);
-  CaraWifiRemoteStation *station = static_cast<CaraWifiRemoteStation*> (st);
-  return normally || station->m_failed >= m_probeThreshold;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/cara-wifi-manager.h ns-3.34/src/wifi/model/cara-wifi-manager.h
--- ns-3.33/src/wifi/model/cara-wifi-manager.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/cara-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,85 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2005,2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Federico Maguolo <maguolof@dei.unipd.it>
- */
-
-#ifndef CARA_WIFI_MANAGER_H
-#define CARA_WIFI_MANAGER_H
-
-#include "ns3/traced-value.h"
-#include "wifi-remote-station-manager.h"
-
-namespace ns3 {
-
-/**
- * \brief implement the CARA rate control algorithm
- * \ingroup wifi
- *
- * Implement the CARA algorithm from:
- * J. Kim, S. Kim, S. Choi, and D. Qiao.
- * "CARA: Collision-Aware Rate Adaptation for IEEE 802.11 WLANs."
- *
- * Originally implemented by Federico Maguolo for a very early
- * prototype version of ns-3.
- *
- * This RAA does not support HT modes and will error
- * exit if the user tries to configure this RAA with a Wi-Fi MAC
- * that supports 802.11n or higher.
- */
-class CaraWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  CaraWifiManager ();
-  virtual ~CaraWifiManager ();
-
-
-private:
-  // Overridden from base class.
-  void DoInitialize (void);
-  WifiRemoteStation * DoCreateStation (void) const;
-  void DoReportRxOk (WifiRemoteStation *station,
-                     double rxSnr, WifiMode txMode);
-  void DoReportRtsFailed (WifiRemoteStation *station);
-  void DoReportDataFailed (WifiRemoteStation *station);
-  void DoReportRtsOk (WifiRemoteStation *station,
-                      double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  void DoReportFinalDataFailed (WifiRemoteStation *station);
-  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-  bool DoNeedRts (WifiRemoteStation *station,
-                  uint32_t size, bool normally);
-
-  uint32_t m_timerTimeout;     ///< timer threshold
-  uint32_t m_successThreshold; ///< success threshold
-  uint32_t m_failureThreshold; ///< failure threshold
-  uint32_t m_probeThreshold;   ///< probe threshold
-
-  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
-};
-
-} //namespace ns3
-
-#endif /* CARA_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/cf-parameter-set.cc ns-3.34/src/wifi/model/cf-parameter-set.cc
--- ns-3.33/src/wifi/model/cf-parameter-set.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/cf-parameter-set.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,160 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2015
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "cf-parameter-set.h"
-
-namespace ns3 {
-
-CfParameterSet::CfParameterSet ()
-  : m_CFPCount (0),
-    m_CFPPeriod (0),
-    m_CFPMaxDuration (0),
-    m_CFPDurRemaining (0),
-    m_pcfSupported (0)
-{
-}
-
-WifiInformationElementId
-CfParameterSet::ElementId () const
-{
-  return IE_CF_PARAMETER_SET;
-}
-
-void
-CfParameterSet::SetPcfSupported (uint8_t pcfsupported)
-{
-  m_pcfSupported = pcfsupported;
-}
-
-uint8_t
-CfParameterSet::GetInformationFieldSize () const
-{
-  //we should not be here if PCF is not supported
-  NS_ASSERT (m_pcfSupported > 0);
-  return 6;
-}
-
-Buffer::Iterator
-CfParameterSet::Serialize (Buffer::Iterator i) const
-{
-  if (m_pcfSupported < 1)
-    {
-      return i;
-    }
-  return WifiInformationElement::Serialize (i);
-}
-
-uint16_t
-CfParameterSet::GetSerializedSize () const
-{
-  if (m_pcfSupported < 1)
-    {
-      return 0;
-    }
-  return WifiInformationElement::GetSerializedSize ();
-}
-
-void
-CfParameterSet::SerializeInformationField (Buffer::Iterator start) const
-{
-  if (m_pcfSupported == 1)
-    {
-      start.WriteU8 (m_CFPCount);
-      start.WriteU8 (m_CFPPeriod);
-      start.WriteHtolsbU16 (m_CFPMaxDuration / 1024);
-      start.WriteHtolsbU16 (m_CFPDurRemaining / 1024);
-    }
-}
-
-uint8_t
-CfParameterSet::DeserializeInformationField (Buffer::Iterator start,
-                                             uint8_t length)
-{
-  NS_ASSERT (length == 6);
-  Buffer::Iterator i = start;
-  m_CFPCount = i.ReadU8 ();
-  m_CFPPeriod = i.ReadU8 ();
-  m_CFPMaxDuration = i.ReadLsbtohU16 ();
-  m_CFPMaxDuration *= 1024;
-  m_CFPDurRemaining = i.ReadLsbtohU16 ();
-  m_CFPDurRemaining *= 1024;
-  return length;
-}
-
-uint8_t
-CfParameterSet::GetCFPCount (void) const
-{
-  return m_CFPCount;
-}
-
-uint8_t
-CfParameterSet::GetCFPPeriod (void) const
-{
-  return m_CFPPeriod;
-}
-
-uint64_t
-CfParameterSet::GetCFPMaxDurationUs (void) const
-{
-  return m_CFPMaxDuration;
-}
-
-uint64_t
-CfParameterSet::GetCFPDurRemainingUs (void) const
-{
-  return m_CFPDurRemaining;
-}
-
-void
-CfParameterSet::SetCFPCount (uint8_t count)
-{
-  m_CFPCount = count;
-}
-
-void
-CfParameterSet::SetCFPPeriod (uint8_t period)
-{
-  m_CFPPeriod = period;
-}
-
-void
-CfParameterSet::SetCFPMaxDurationUs (uint64_t maxDuration)
-{
-  m_CFPMaxDuration = maxDuration;
-}
-
-void
-CfParameterSet::SetCFPDurRemainingUs (uint64_t durRemaining)
-{
-  m_CFPDurRemaining = durRemaining;
-}
-
-std::ostream &
-operator << (std::ostream &os, const CfParameterSet &cfParameterSet)
-{
-  os <<  (uint16_t)cfParameterSet.GetCFPCount ()
-     << "|" << (uint16_t)cfParameterSet.GetCFPPeriod ()
-     << "|" << cfParameterSet.GetCFPMaxDurationUs ()
-     << "|" << cfParameterSet.GetCFPDurRemainingUs ();
-
-  return os;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/cf-parameter-set.h ns-3.34/src/wifi/model/cf-parameter-set.h
--- ns-3.33/src/wifi/model/cf-parameter-set.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/cf-parameter-set.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,130 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2015
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Authors: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef CF_PARAMETER_SET_H
-#define CF_PARAMETER_SET_H
-
-#include "ns3/wifi-information-element.h"
-
-namespace ns3 {
-
-/**
- * \brief The CF Parameter Set
- * \ingroup wifi
- *
- * This class knows how to serialise and deserialise the CF Parameter Set.
- */
-class CfParameterSet : public WifiInformationElement
-{
-public:
-  CfParameterSet ();
-
-  // Implementations of pure virtual methods of WifiInformationElement
-  WifiInformationElementId ElementId () const;
-  uint8_t GetInformationFieldSize () const;
-  void SerializeInformationField (Buffer::Iterator start) const;
-  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length);
-  /* This information element is a bit special in that it is only
-     included if the STA is a QoS STA. To support this we
-     override the Serialize and GetSerializedSize methods of
-     WifiInformationElement. */
-  Buffer::Iterator Serialize (Buffer::Iterator start) const;
-  uint16_t GetSerializedSize () const;
-
-  /**
-   * Set PCF supported function
-   * \param pcfSupported the PCF supported indicator
-   */
-  void SetPcfSupported (uint8_t pcfSupported);
-
-  /**
-   * Return the CFP Count in DTIM frames unit.
-   *
-   * \return the CFP Count in DTIM frames unit
-   */
-  uint8_t GetCFPCount (void) const;
-  /**
-   * Return the CFP Period in DTIM frames unit.
-   *
-   * \return the CFP Period in DTIM frames unit
-   */
-  uint8_t GetCFPPeriod (void) const;
-  /**
-   * Return the maximum CFP duration in microseconds.
-   *
-   * \return the maximum CFP duration in microseconds.
-   */
-  uint64_t GetCFPMaxDurationUs (void) const;
-  /**
-   * Return the remaining CFP duration in microseconds.
-   *
-   * \return the remaining CFP duration in microseconds
-   */
-  uint64_t GetCFPDurRemainingUs (void) const;
-
-  /**
-   * Set the CFP Count in DTIM frames unit.
-   *
-   * \param count the CFP Count in DTIM frames unit
-   */
-  void SetCFPCount (uint8_t count);
-  /**
-   * Set the CFP Period in DTIM frames unit.
-   *
-   * \param period the CFP Period in DTIM frames unit
-   */
-  void SetCFPPeriod (uint8_t period);
-  /**
-   * Set the maximum CFP duration in microseconds.
-   *
-   * \param maxDuration the maximum CFP duration in microseconds
-   */
-  void SetCFPMaxDurationUs (uint64_t maxDuration);
-  /**
-   * Set the remaining CFP duration in microseconds.
-   *
-   * \param durRemaining the remaining CFP duration in microseconds
-   */
-  void SetCFPDurRemainingUs (uint64_t durRemaining);
-
-
-private:
-  uint8_t m_CFPCount;                 ///< CFP Count
-  uint8_t m_CFPPeriod;                ///< CFP Period
-  uint64_t m_CFPMaxDuration;          ///< CFP maximum duration in microseconds
-  uint64_t m_CFPDurRemaining;         ///< CFP remaining duration in microseconds
-
-  /// This is used to decide if this element should be added to the frame or not
-  uint8_t m_pcfSupported;
-};
-
-/**
- * output operator
- *
- * \param os output stream
- * \param cfParameterSet the CF Parameter Set
- *
- * \return output stream
- */
-std::ostream &operator << (std::ostream &os, const CfParameterSet &cfParameterSet);
-
-} //namespace ns3
-
-#endif /* CF_PARAMETER_SET_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/channel-access-manager.cc ns-3.34/src/wifi/model/channel-access-manager.cc
--- ns-3.33/src/wifi/model/channel-access-manager.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/channel-access-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -24,7 +24,7 @@
 #include "txop.h"
 #include "wifi-phy-listener.h"
 #include "wifi-phy.h"
-#include "mac-low.h"
+#include "frame-exchange-manager.h"
 
 namespace ns3 {
 
@@ -136,6 +136,7 @@
       i = 0;
     }
   m_phy = 0;
+  m_feManager = 0;
 }
 
 void
@@ -162,10 +163,11 @@
 }
 
 void
-ChannelAccessManager::SetupLow (Ptr<MacLow> low)
+ChannelAccessManager::SetupFrameExchangeManager (Ptr<FrameExchangeManager> feManager)
 {
-  NS_LOG_FUNCTION (this << low);
-  low->RegisterChannelAccessManager (this);
+  NS_LOG_FUNCTION (this << feManager);
+  m_feManager = feManager;
+  m_feManager->SetChannelAccessManager (this);
 }
 
 Time
@@ -264,7 +266,8 @@
    *    with that AC has now become non-empty and any other transmit queues
    *    associated with that AC are empty; the medium is busy on the primary channel
    */
-  if (!txop->HasFramesToTransmit () && !txop->GetLow ()->IsCfPeriod () && txop->GetBackoffSlots () == 0)
+  if (!txop->HasFramesToTransmit () && txop->GetAccessStatus () != Txop::GRANTED
+      && txop->GetBackoffSlots () == 0)
     {
       if (!IsBusy ())
         {
@@ -287,7 +290,7 @@
 }
 
 void
-ChannelAccessManager::RequestAccess (Ptr<Txop> txop, bool isCfPeriod)
+ChannelAccessManager::RequestAccess (Ptr<Txop> txop)
 {
   NS_LOG_FUNCTION (this << txop);
   if (m_phy)
@@ -299,13 +302,6 @@
     {
       return;
     }
-  if (isCfPeriod)
-    {
-      txop->NotifyAccessRequested ();
-      Time delay = (MostRecent ({GetAccessGrantStart (true), Simulator::Now ()}) - Simulator::Now ());
-      m_accessTimeout = Simulator::Schedule (delay, &ChannelAccessManager::DoGrantPcfAccess, this, txop);
-      return;
-    }
   /*
    * EDCAF operations shall be performed at slot boundaries (Sec. 10.22.2.4 of 802.11-2016)
    */
@@ -322,19 +318,13 @@
     }
 
   UpdateBackoff ();
-  NS_ASSERT (!txop->IsAccessRequested ());
+  NS_ASSERT (txop->GetAccessStatus () != Txop::REQUESTED);
   txop->NotifyAccessRequested ();
   DoGrantDcfAccess ();
   DoRestartAccessTimeoutIfNeeded ();
 }
 
 void
-ChannelAccessManager::DoGrantPcfAccess (Ptr<Txop> txop)
-{
-  txop->NotifyAccessGranted ();
-}
-
-void
 ChannelAccessManager::DoGrantDcfAccess (void)
 {
   NS_LOG_FUNCTION (this);
@@ -342,7 +332,7 @@
   for (Txops::iterator i = m_txops.begin (); i != m_txops.end (); k++)
     {
       Ptr<Txop> txop = *i;
-      if (txop->IsAccessRequested ()
+      if (txop->GetAccessStatus () == Txop::REQUESTED
           && GetBackoffEndFor (txop) <= Simulator::Now () )
         {
           /**
@@ -356,7 +346,7 @@
           for (Txops::iterator j = i; j != m_txops.end (); j++, k++)
             {
               Ptr<Txop> otherTxop = *j;
-              if (otherTxop->IsAccessRequested ()
+              if (otherTxop->GetAccessStatus () == Txop::REQUESTED
                   && GetBackoffEndFor (otherTxop) <= Simulator::Now ())
                 {
                   NS_LOG_DEBUG ("dcf " << k << " needs access. backoff expired. internal collision. slots=" <<
@@ -371,18 +361,30 @@
             }
 
           /**
-           * Now, we notify all of these changes in one go. It is necessary to
+           * Now, we notify all of these changes in one go if the EDCAF winning
+           * the contention actually transmitted a frame. It is necessary to
            * perform first the calculations of which Txops are colliding and then
            * only apply the changes because applying the changes through notification
            * could change the global state of the manager, and, thus, could change
            * the result of the calculations.
            */
-          txop->NotifyAccessGranted ();
-          for (auto collidingTxop : internalCollisionTxops)
+          NS_ASSERT (m_feManager != 0);
+
+          if (m_feManager->StartTransmission (txop))
+            {
+              for (auto& collidingTxop : internalCollisionTxops)
+                {
+                  collidingTxop->NotifyInternalCollision ();
+                }
+              break;
+            }
+          else
             {
-              collidingTxop->NotifyInternalCollision ();
+              // reset the current state to the EDCAF that won the contention
+              // but did not transmit anything
+              i--;
+              k = std::distance (m_txops.begin (), i);
             }
-          break;
         }
       i++;
     }
@@ -511,7 +513,7 @@
   Time expectedBackoffEnd = Simulator::GetMaximumSimulationTime ();
   for (auto txop : m_txops)
     {
-      if (txop->IsAccessRequested ())
+      if (txop->GetAccessStatus () == Txop::REQUESTED)
         {
           Time tmp = GetBackoffEndFor (txop);
           if (tmp > Simulator::Now ())
@@ -653,7 +655,7 @@
           NS_ASSERT (txop->GetBackoffSlots () == 0);
         }
       txop->ResetCw ();
-      txop->m_accessRequested = false;
+      txop->m_access = Txop::NOT_REQUESTED;
       txop->NotifyChannelSwitching ();
     }
 
@@ -712,7 +714,7 @@
           NS_ASSERT (txop->GetBackoffSlots () == 0);
         }
       txop->ResetCw ();
-      txop->m_accessRequested = false;
+      txop->m_access = Txop::NOT_REQUESTED;
       txop->NotifyWakeUp ();
     }
 }
@@ -731,7 +733,7 @@
           NS_ASSERT (txop->GetBackoffSlots () == 0);
         }
       txop->ResetCw ();
-      txop->m_accessRequested = false;
+      txop->m_access = Txop::NOT_REQUESTED;
       txop->NotifyOn ();
     }
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/channel-access-manager.h ns-3.34/src/wifi/model/channel-access-manager.h
--- ns-3.33/src/wifi/model/channel-access-manager.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/channel-access-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -31,7 +31,7 @@
 class WifiPhy;
 class PhyListener;
 class Txop;
-class MacLow;
+class FrameExchangeManager;
 
 /**
  * \brief Manage a set of ns3::Txop
@@ -67,11 +67,11 @@
    */
   void RemovePhyListener (Ptr<WifiPhy> phy);
   /**
-   * Set up listener for MacLow events.
+   * Set up the Frame Exchange Manager.
    *
-   * \param low the MacLow to listen to
+   * \param feManager the Frame Exchange Manager
    */
-  void SetupLow (Ptr<MacLow> low);
+  void SetupFrameExchangeManager (Ptr<FrameExchangeManager> feManager);
 
   /**
    * \param txop a new Txop.
@@ -96,14 +96,23 @@
 
   /**
    * \param txop a Txop
-   * \param isCfPeriod flag whether it is called during the CF period
    *
    * Notify the ChannelAccessManager that a specific Txop needs access to the
    * medium. The ChannelAccessManager is then responsible for starting an access
-   * timer and, invoking Txop::DoNotifyAccessGranted when the access
+   * timer and, invoking FrameExchangeManager::StartTransmission when the access
    * is granted if it ever gets granted.
    */
-  void RequestAccess (Ptr<Txop> txop, bool isCfPeriod = false);
+  void RequestAccess (Ptr<Txop> txop);
+
+  /**
+   * Access will never be granted to the medium _before_
+   * the time returned by this method.
+   *
+   * \param ignoreNav flag whether NAV should be ignored
+   *
+   * \returns the absolute time at which access could start to be granted
+   */
+  Time GetAccessGrantStart (bool ignoreNav = false) const;
 
   /**
    * \param duration expected duration of reception
@@ -204,8 +213,7 @@
 
 
 protected:
-  // Inherited from ns3::Object
-  void DoDispose (void);
+  void DoDispose (void) override;
 
 
 private:
@@ -222,15 +230,6 @@
    */
   Time MostRecent (std::initializer_list<Time> list) const;
   /**
-   * Access will never be granted to the medium _before_
-   * the time returned by this method.
-   *
-   * \param ignoreNav flag whether NAV should be ignored
-   *
-   * \returns the absolute time at which access could start to be granted
-   */
-  Time GetAccessGrantStart (bool ignoreNav = false) const;
-  /**
    * Return the time when the backoff procedure
    * started for the given Txop.
    *
@@ -260,12 +259,6 @@
    * Grant access to Txop using DCF/EDCF contention rules
    */
   void DoGrantDcfAccess (void);
-  /**
-   * Grant access to Txop using PCF preemption
-   *
-   * \param txop the Txop
-   */
-  void DoGrantPcfAccess (Ptr<Txop> txop);
 
   /**
    * Return the Short Interframe Space (SIFS) for this PHY.
@@ -291,28 +284,29 @@
    */
   typedef std::vector<Ptr<Txop>> Txops;
 
-  Txops m_txops;                //!< the vector of managed Txops
-  Time m_lastAckTimeoutEnd;     //!< the last Ack timeout end time
-  Time m_lastCtsTimeoutEnd;     //!< the last CTS timeout end time
-  Time m_lastNavStart;          //!< the last NAV start time
-  Time m_lastNavDuration;       //!< the last NAV duration time
-  Time m_lastRxStart;           //!< the last receive start time
-  Time m_lastRxDuration;        //!< the last receive duration time
-  bool m_lastRxReceivedOk;      //!< the last receive OK
-  Time m_lastTxStart;           //!< the last transmit start time
-  Time m_lastTxDuration;        //!< the last transmit duration time
-  Time m_lastBusyStart;         //!< the last busy start time
-  Time m_lastBusyDuration;      //!< the last busy duration time
-  Time m_lastSwitchingStart;    //!< the last switching start time
-  Time m_lastSwitchingDuration; //!< the last switching duration time
-  bool m_sleeping;              //!< flag whether it is in sleeping state
-  bool m_off;                   //!< flag whether it is in off state
-  Time m_eifsNoDifs;            //!< EIFS no DIFS time
-  EventId m_accessTimeout;      //!< the access timeout ID
-  Time m_slot;                  //!< the slot time
-  Time m_sifs;                  //!< the SIFS time
-  PhyListener* m_phyListener;   //!< the PHY listener
-  Ptr<WifiPhy> m_phy;           //!< pointer to the PHY
+  Txops m_txops;                         //!< the vector of managed Txops
+  Time m_lastAckTimeoutEnd;              //!< the last Ack timeout end time
+  Time m_lastCtsTimeoutEnd;              //!< the last CTS timeout end time
+  Time m_lastNavStart;                   //!< the last NAV start time
+  Time m_lastNavDuration;                //!< the last NAV duration time
+  Time m_lastRxStart;                    //!< the last receive start time
+  Time m_lastRxDuration;                 //!< the last receive duration time
+  bool m_lastRxReceivedOk;               //!< the last receive OK
+  Time m_lastTxStart;                    //!< the last transmit start time
+  Time m_lastTxDuration;                 //!< the last transmit duration time
+  Time m_lastBusyStart;                  //!< the last busy start time
+  Time m_lastBusyDuration;               //!< the last busy duration time
+  Time m_lastSwitchingStart;             //!< the last switching start time
+  Time m_lastSwitchingDuration;          //!< the last switching duration time
+  bool m_sleeping;                       //!< flag whether it is in sleeping state
+  bool m_off;                            //!< flag whether it is in off state
+  Time m_eifsNoDifs;                     //!< EIFS no DIFS time
+  EventId m_accessTimeout;               //!< the access timeout ID
+  Time m_slot;                           //!< the slot time
+  Time m_sifs;                           //!< the SIFS time
+  PhyListener* m_phyListener;            //!< the PHY listener
+  Ptr<WifiPhy> m_phy;                    //!< pointer to the PHY
+  Ptr<FrameExchangeManager> m_feManager; //!< pointer to the Frame Exchange Manager
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/constant-obss-pd-algorithm.cc ns-3.34/src/wifi/model/constant-obss-pd-algorithm.cc
--- ns-3.33/src/wifi/model/constant-obss-pd-algorithm.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/constant-obss-pd-algorithm.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,108 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018 University of Washington
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "ns3/log.h"
-#include "ns3/node.h"
-#include "ns3/config.h"
-#include "ns3/double.h"
-#include "ns3/uinteger.h"
-#include "constant-obss-pd-algorithm.h"
-#include "sta-wifi-mac.h"
-#include "wifi-utils.h"
-#include "wifi-phy.h"
-#include "wifi-net-device.h"
-#include "he-configuration.h"
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("ConstantObssPdAlgorithm");
-NS_OBJECT_ENSURE_REGISTERED (ConstantObssPdAlgorithm);
-
-ConstantObssPdAlgorithm::ConstantObssPdAlgorithm ()
-  : ObssPdAlgorithm ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-TypeId
-ConstantObssPdAlgorithm::GetTypeId (void)
-{
-  static ns3::TypeId tid = ns3::TypeId ("ns3::ConstantObssPdAlgorithm")
-    .SetParent<ObssPdAlgorithm> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<ConstantObssPdAlgorithm> ()
-  ;
-  return tid;
-}
-
-void
-ConstantObssPdAlgorithm::ConnectWifiNetDevice (const Ptr<WifiNetDevice> device)
-{
-  Ptr<WifiPhy> phy = device->GetPhy ();
-  phy->TraceConnectWithoutContext ("EndOfHePreamble", MakeCallback (&ConstantObssPdAlgorithm::ReceiveHeSig, this));
-  ObssPdAlgorithm::ConnectWifiNetDevice (device);
-}
-
-void
-ConstantObssPdAlgorithm::ReceiveHeSig (HePreambleParameters params)
-{
-  NS_LOG_FUNCTION (this << +params.bssColor << WToDbm (params.rssiW));
-
-  Ptr<StaWifiMac> mac = m_device->GetMac ()->GetObject<StaWifiMac>();
-  if (mac && !mac->IsAssociated ())
-    {
-      NS_LOG_DEBUG ("This is not an associated STA: skip OBSS PD algorithm");
-      return;
-    }
-
-  Ptr<HeConfiguration> heConfiguration = m_device->GetHeConfiguration ();
-  NS_ASSERT (heConfiguration);
-  UintegerValue bssColorAttribute;
-  heConfiguration->GetAttribute ("BssColor", bssColorAttribute);
-  uint8_t bssColor = bssColorAttribute.Get ();
-
-  if (bssColor == 0)
-    {
-      NS_LOG_DEBUG ("BSS color is 0");
-      return;
-    }
-  if (params.bssColor == 0)
-    {
-      NS_LOG_DEBUG ("Received BSS color is 0");
-      return;
-    }
-  //TODO: SRP_AND_NON-SRG_OBSS-PD_PROHIBITED=1 => OBSS_PD SR is not allowed
-
-  bool isObss = (bssColor != params.bssColor);
-  if (isObss)
-    {
-      if (WToDbm (params.rssiW) < m_obssPdLevel)
-        {
-          NS_LOG_DEBUG ("Frame is OBSS and RSSI " << WToDbm(params.rssiW) << " is below OBSS-PD level of " << m_obssPdLevel << "; reset PHY to IDLE");
-          ResetPhy (params);
-        }
-      else
-        {
-          NS_LOG_DEBUG ("Frame is OBSS and RSSI is above OBSS-PD level");
-        }
-    }
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/constant-obss-pd-algorithm.h ns-3.34/src/wifi/model/constant-obss-pd-algorithm.h
--- ns-3.33/src/wifi/model/constant-obss-pd-algorithm.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/constant-obss-pd-algorithm.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,70 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018 University of Washington
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef CONSTANT_OBSS_PD_ALGORITHM_H
-#define CONSTANT_OBSS_PD_ALGORITHM_H
-
-#include "obss-pd-algorithm.h"
-
-namespace ns3 {
-
-/**
- * \brief Constant OBSS PD algorithm
- * \ingroup wifi
- *
- * This constant OBSS_PD algorithm is a simple OBSS_PD algorithm which evaluates if a receiving
- * signal should be accepted or rejected based on a constant threshold.
- *
- * Once a HE preamble and its header have been received by the PHY, the ReceiveHeSig method is
- * triggered. The algorithm then checks whether this is an OBSS frame by comparing its own BSS
- * color with the BSS color of the received preamble. If this is an OBSS frame, it compares the
- * received RSSI with its configured OBSS_PD level value. The PHY then gets reset to IDLE state
- * in case the received RSSI is lower than that constant OBSS PD level value, and is informed
- * about TX power restrictions that might be applied to the next transmission.
- */
-class ConstantObssPdAlgorithm : public ObssPdAlgorithm
-{
-public:
-  ConstantObssPdAlgorithm ();
-
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-
-  /**
-   * Connect the WifiNetDevice and setup eventual callbacks.
-   *
-   * \param device the WifiNetDevice
-   */
-  void ConnectWifiNetDevice (const Ptr<WifiNetDevice> device);
-
-  /**
-   * \param params the HE SIG parameters
-   *
-   * Evaluate the receipt of HE SIG.
-   */
-  void ReceiveHeSig (HePreambleParameters params);
-};
-
-} //namespace ns3
-
-#endif /* CONSTANT_OBSS_PD_ALGORITHM_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/constant-rate-wifi-manager.cc ns-3.34/src/wifi/model/constant-rate-wifi-manager.cc
--- ns-3.33/src/wifi/model/constant-rate-wifi-manager.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/constant-rate-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,136 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2004,2005 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#include "ns3/string.h"
-#include "ns3/log.h"
-#include "constant-rate-wifi-manager.h"
-#include "wifi-tx-vector.h"
-#include "wifi-utils.h"
-
-#define Min(a,b) ((a < b) ? a : b)
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("ConstantRateWifiManager");
-
-NS_OBJECT_ENSURE_REGISTERED (ConstantRateWifiManager);
-
-TypeId
-ConstantRateWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ConstantRateWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<ConstantRateWifiManager> ()
-    .AddAttribute ("DataMode", "The transmission mode to use for every data packet transmission",
-                   StringValue ("OfdmRate6Mbps"),
-                   MakeWifiModeAccessor (&ConstantRateWifiManager::m_dataMode),
-                   MakeWifiModeChecker ())
-    .AddAttribute ("ControlMode", "The transmission mode to use for every RTS packet transmission.",
-                   StringValue ("OfdmRate6Mbps"),
-                   MakeWifiModeAccessor (&ConstantRateWifiManager::m_ctlMode),
-                   MakeWifiModeChecker ())
-  ;
-  return tid;
-}
-
-ConstantRateWifiManager::ConstantRateWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-ConstantRateWifiManager::~ConstantRateWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-WifiRemoteStation *
-ConstantRateWifiManager::DoCreateStation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  WifiRemoteStation *station = new WifiRemoteStation ();
-  return station;
-}
-
-void
-ConstantRateWifiManager::DoReportRxOk (WifiRemoteStation *station,
-                                       double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
-}
-
-void
-ConstantRateWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void
-ConstantRateWifiManager::DoReportDataFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void
-ConstantRateWifiManager::DoReportRtsOk (WifiRemoteStation *st,
-                                        double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
-}
-
-void
-ConstantRateWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                         double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
-}
-
-void
-ConstantRateWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void
-ConstantRateWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-WifiTxVector
-ConstantRateWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  uint8_t nss = Min (GetMaxNumberOfTransmitStreams (), GetNumberOfSupportedStreams (st));
-  if (m_dataMode.GetModulationClass () == WIFI_MOD_CLASS_HT)
-    {
-      nss = 1 + (m_dataMode.GetMcsValue () / 8);
-    }
-  return WifiTxVector (m_dataMode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (m_dataMode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (st))), ConvertGuardIntervalToNanoSeconds (m_dataMode, GetShortGuardIntervalSupported (st), NanoSeconds (GetGuardInterval (st))), GetNumberOfAntennas (), nss, 0, GetChannelWidthForTransmission (m_dataMode, GetChannelWidth (st)), GetAggregation (st));
-}
-
-WifiTxVector
-ConstantRateWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  return WifiTxVector (m_ctlMode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (m_ctlMode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (st))), ConvertGuardIntervalToNanoSeconds (m_ctlMode, GetShortGuardIntervalSupported (st), NanoSeconds (GetGuardInterval (st))), 1, 1, 0, GetChannelWidthForTransmission (m_ctlMode, GetChannelWidth (st)), GetAggregation (st));
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/constant-rate-wifi-manager.h ns-3.34/src/wifi/model/constant-rate-wifi-manager.h
--- ns-3.33/src/wifi/model/constant-rate-wifi-manager.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/constant-rate-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,69 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2005,2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#ifndef CONSTANT_RATE_WIFI_MANAGER_H
-#define CONSTANT_RATE_WIFI_MANAGER_H
-
-#include "wifi-remote-station-manager.h"
-
-namespace ns3 {
-
-/**
- * \ingroup wifi
- * \brief use constant rates for data and RTS transmissions
- *
- * This class uses always the same transmission rate for every
- * packet sent.
- */
-class ConstantRateWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  ConstantRateWifiManager ();
-  virtual ~ConstantRateWifiManager ();
-
-
-private:
-  //overridden from base class
-  WifiRemoteStation* DoCreateStation (void) const;
-  void DoReportRxOk (WifiRemoteStation *station,
-                     double rxSnr, WifiMode txMode);
-  void DoReportRtsFailed (WifiRemoteStation *station);
-  void DoReportDataFailed (WifiRemoteStation *station);
-  void DoReportRtsOk (WifiRemoteStation *station,
-                      double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  void DoReportFinalDataFailed (WifiRemoteStation *station);
-  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-
-  WifiMode m_dataMode; //!< Wifi mode for unicast Data frames
-  WifiMode m_ctlMode;  //!< Wifi mode for RTS frames
-};
-
-} //namespace ns3
-
-#endif /* CONSTANT_RATE_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/constant-wifi-ack-policy-selector.cc ns-3.34/src/wifi/model/constant-wifi-ack-policy-selector.cc
--- ns-3.33/src/wifi/model/constant-wifi-ack-policy-selector.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/constant-wifi-ack-policy-selector.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,165 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2019 Universita' degli Studi di Napoli Federico II
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Stefano Avallone <stavallo@unina.it>
- */
-
-#include "ns3/log.h"
-#include "constant-wifi-ack-policy-selector.h"
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("ConstantWifiAckPolicySelector");
-
-NS_OBJECT_ENSURE_REGISTERED (ConstantWifiAckPolicySelector);
-
-TypeId
-ConstantWifiAckPolicySelector::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ConstantWifiAckPolicySelector")
-    .SetParent<WifiAckPolicySelector> ()
-    .AddConstructor<ConstantWifiAckPolicySelector> ()
-    .SetGroupName("Wifi")
-    .AddAttribute ("UseExplicitBar",
-                   "Specify whether to send Block Ack Requests (if true) or use"
-                   " Implicit Block Ack Request ack policy (if false).",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&ConstantWifiAckPolicySelector::m_useExplicitBar),
-                   MakeBooleanChecker ())
-    .AddAttribute ("BaThreshold",
-                   "Immediate acknowledgment is requested upon transmission of a frame "
-                   "whose sequence number is distant at least BaThreshold multiplied "
-                   "by the transmit window size from the starting sequence number of "
-                   "the transmit window. Set to zero to request a response for every "
-                   "transmitted frame.",
-                   DoubleValue (0.0),
-                   MakeDoubleAccessor (&ConstantWifiAckPolicySelector::m_baThreshold),
-                   MakeDoubleChecker<double> (0.0, 1.0))
-  ;
-  return tid;
-}
-
-ConstantWifiAckPolicySelector::ConstantWifiAckPolicySelector ()
-{
-  NS_LOG_FUNCTION_NOARGS ();
-}
-
-ConstantWifiAckPolicySelector::~ConstantWifiAckPolicySelector ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-ConstantWifiAckPolicySelector::UpdateTxParams (Ptr<WifiPsdu> psdu, MacLowTransmissionParameters & params)
-{
-  NS_LOG_FUNCTION (this << psdu << params);
-
-  std::set<uint8_t> tids = psdu->GetTids ();
-
-  if (tids.empty ())
-    {
-      NS_LOG_DEBUG ("No QoS Data frame in the PSDU");
-      return;
-    }
-
-  if (tids.size () > 1)
-    {
-      NS_LOG_DEBUG ("Multi-TID A-MPDUs not supported");
-      return;
-    }
-
-  Mac48Address receiver = psdu->GetAddr1 ();
-  uint8_t tid = *tids.begin ();
-
-  // Use Normal Ack if a BA agreement has not been established
-  if (!m_qosTxop->GetBaAgreementEstablished (receiver, tid))
-    {
-      params.EnableAck ();
-      return;
-    }
-
-  // If QosTxop forced the use of Block Ack QoS policy, do not make any change
-  if (params.MustSendBlockAckRequest ())
-    {
-      NS_LOG_DEBUG ("Use Block Ack policy as requested");
-      return;
-    }
-
-  // find the maximum distance from the sequence number of an MPDU included in the
-  // PSDU to the starting sequence number of the transmit window.
-  uint16_t maxDistToStartingSeq = psdu->GetMaxDistFromStartingSeq (m_qosTxop->GetBaStartingSequence (receiver, tid));
-
-  // An immediate response (Ack or Block Ack) is needed if any of the following holds:
-  // * the maximum distance between the sequence number of an MPDU to transmit
-  //   and the starting sequence number of the transmit window is greater than
-  //   or equal to the window size multiplied by the BaThreshold
-  // * no other frame belonging to this BA agreement is queued (because, in such
-  //   a case, a Block Ack is not going to be requested any time soon)
-  // * this is the initial frame of a transmission opportunity and it is not
-  //   protected by RTS/CTS (see Annex G.3 of IEEE 802.11-2016)
-  bool isResponseNeeded = (maxDistToStartingSeq >= m_baThreshold * m_qosTxop->GetBaBufferSize (receiver, tid)
-                           || m_qosTxop->PeekNextFrame (tid, receiver) == 0
-                           || (m_qosTxop->GetTxopLimit ().IsStrictlyPositive ()
-                               && m_qosTxop->GetTxopRemaining () == m_qosTxop->GetTxopLimit ()
-                               && !params.MustSendRts ()));
-
-  if (!isResponseNeeded)
-    {
-      NS_LOG_DEBUG ("A response is not needed: no ack for now, use Block Ack policy");
-      params.DisableAck ();
-      return;
-    }
-  // An immediate response is needed
-  if (maxDistToStartingSeq == 0)
-    {
-      NS_LOG_DEBUG ("Sending a single MPDU, no previous frame to ack: use Normal Ack policy");
-      NS_ASSERT (psdu->GetNMpdus () == 1);
-      params.EnableAck ();
-      return;
-    }
-  // Multiple MPDUs are being/have been sent
-  if (psdu->GetNMpdus () == 1 || m_useExplicitBar)
-    {
-      // in case of single MPDU, there are previous unacknowledged frames, thus
-      // we cannot use Implicit Block Ack Request policy, otherwise we get a
-      // normal ack as response
-      if (m_qosTxop->GetBaBufferSize (receiver, tid) > 64)
-        {
-          NS_LOG_DEBUG ("Scheduling an Extended Compressed block ack request");
-          params.EnableBlockAckRequest (BlockAckType::EXTENDED_COMPRESSED_BLOCK_ACK);
-        }
-      else
-        {
-          NS_LOG_DEBUG ("Scheduling a Compressed block ack request");
-          params.EnableBlockAckRequest (BlockAckType::COMPRESSED_BLOCK_ACK);
-        }
-      return;
-    }
-  // Implicit Block Ack Request policy
-  if (m_qosTxop->GetBaBufferSize (receiver, tid) > 64)
-    {
-      NS_LOG_DEBUG ("Implicitly requesting an Extended Compressed block ack");
-      params.EnableBlockAck (BlockAckType::EXTENDED_COMPRESSED_BLOCK_ACK);
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Implicitly requesting a Compressed block ack");
-      params.EnableBlockAck (BlockAckType::COMPRESSED_BLOCK_ACK);
-    }
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/constant-wifi-ack-policy-selector.h ns-3.34/src/wifi/model/constant-wifi-ack-policy-selector.h
--- ns-3.33/src/wifi/model/constant-wifi-ack-policy-selector.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/constant-wifi-ack-policy-selector.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,65 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2019 Universita' degli Studi di Napoli Federico II
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Stefano Avallone <stavallo@unina.it>
- */
-
-#ifndef CONSTANT_WIFI_ACK_POLICY_SELECTOR_H
-#define CONSTANT_WIFI_ACK_POLICY_SELECTOR_H
-
-#include "wifi-ack-policy-selector.h"
-
-namespace ns3 {
-
-/**
- * \ingroup wifi
- *
- * A constant ack policy selector operating based on the values of its attributes.
- */
-class ConstantWifiAckPolicySelector : public WifiAckPolicySelector
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-
-  ConstantWifiAckPolicySelector ();
-  virtual ~ConstantWifiAckPolicySelector();
-
-  /**
-   * Update the transmission parameters related to the acknowledgment policy for
-   * the given PSDU. This method is typically called by the MPDU aggregator when
-   * trying to aggregate another MPDU to the current A-MPDU. In fact, the
-   * AckPolicySelector may switch to a different acknowledgment policy when a
-   * new MPDU is aggregated to an A-MPDU.
-   * Note that multi-TID A-MPDUs are currently not supported by this method.
-   *
-   * \param psdu the given PSDU.
-   * \param params the MacLow parameters to update.
-   */
-  virtual void UpdateTxParams (Ptr<WifiPsdu> psdu, MacLowTransmissionParameters & params);
-
-private:
-  bool m_useExplicitBar; //!< true for sending BARs, false for using Implicit BAR ack policy
-  double m_baThreshold;  //!< Threshold to determine when a BlockAck must be requested
-};
-
-} //namespace ns3
-
-#endif /* CONSTANT_WIFI_ACK_POLICY_SELECTOR_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ctrl-headers.cc ns-3.34/src/wifi/model/ctrl-headers.cc
--- ns-3.33/src/wifi/model/ctrl-headers.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ctrl-headers.cc	2021-07-14 10:31:07.000000000 -0700
@@ -19,6 +19,11 @@
  */
 
 #include "ctrl-headers.h"
+#include "wifi-tx-vector.h"
+#include "ns3/he-phy.h"
+#include "wifi-utils.h"
+#include "ns3/address-utils.h"
+#include <algorithm>
 
 namespace ns3 {
 
@@ -31,7 +36,7 @@
 
 CtrlBAckRequestHeader::CtrlBAckRequestHeader ()
   : m_barAckPolicy (false),
-    m_baType (BASIC_BLOCK_ACK)
+    m_barType (BlockAckReqType::BASIC)
 {
 }
 
@@ -67,14 +72,14 @@
 {
   uint32_t size = 0;
   size += 2; //Bar control
-  switch (m_baType)
+  switch (m_barType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
-      case COMPRESSED_BLOCK_ACK:
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
+      case BlockAckReqType::BASIC:
+      case BlockAckReqType::COMPRESSED:
+      case BlockAckReqType::EXTENDED_COMPRESSED:
         size += 2;
         break;
-      case MULTI_TID_BLOCK_ACK:
+      case BlockAckReqType::MULTI_TID:
         size += (2 + 2) * (m_tidInfo + 1);
         break;
       default:
@@ -89,14 +94,14 @@
 {
   Buffer::Iterator i = start;
   i.WriteHtolsbU16 (GetBarControl ());
-  switch (m_baType)
+  switch (m_barType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
-      case COMPRESSED_BLOCK_ACK:
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
+      case BlockAckReqType::BASIC:
+      case BlockAckReqType::COMPRESSED:
+      case BlockAckReqType::EXTENDED_COMPRESSED:
         i.WriteHtolsbU16 (GetStartingSequenceControl ());
         break;
-      case MULTI_TID_BLOCK_ACK:
+      case BlockAckReqType::MULTI_TID:
         NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
         break;
       default:
@@ -110,14 +115,14 @@
 {
   Buffer::Iterator i = start;
   SetBarControl (i.ReadLsbtohU16 ());
-  switch (m_baType)
+  switch (m_barType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
-      case COMPRESSED_BLOCK_ACK:
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
+      case BlockAckReqType::BASIC:
+      case BlockAckReqType::COMPRESSED:
+      case BlockAckReqType::EXTENDED_COMPRESSED:
         SetStartingSequenceControl (i.ReadLsbtohU16 ());
         break;
-      case MULTI_TID_BLOCK_ACK:
+      case BlockAckReqType::MULTI_TID:
         NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
         break;
       default:
@@ -131,17 +136,17 @@
 CtrlBAckRequestHeader::GetBarControl (void) const
 {
   uint16_t res = 0;
-  switch (m_baType)
+  switch (m_barType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
+      case BlockAckReqType::BASIC:
         break;
-      case COMPRESSED_BLOCK_ACK:
+      case BlockAckReqType::COMPRESSED:
         res |= (0x02 << 1);
         break;
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
+      case BlockAckReqType::EXTENDED_COMPRESSED:
         res |= (0x01 << 1);
         break;
-      case MULTI_TID_BLOCK_ACK:
+      case BlockAckReqType::MULTI_TID:
         res |= (0x03 << 1);
         break;
       default:
@@ -158,19 +163,19 @@
   m_barAckPolicy = ((bar & 0x01) == 1) ? true : false;
   if (((bar >> 1) & 0x0f) == 0x03)
     {
-      m_baType = MULTI_TID_BLOCK_ACK;
+      m_barType.m_variant = BlockAckReqType::MULTI_TID;
     }
   else if (((bar >> 1) & 0x0f) == 0x01)
     {
-      m_baType = EXTENDED_COMPRESSED_BLOCK_ACK;
+      m_barType.m_variant = BlockAckReqType::EXTENDED_COMPRESSED;
     }
   else if (((bar >> 1) & 0x0f) == 0x02)
     {
-      m_baType = COMPRESSED_BLOCK_ACK;
+      m_barType.m_variant = BlockAckReqType::COMPRESSED;
     }
   else
     {
-      m_baType = BASIC_BLOCK_ACK;
+      m_barType.m_variant = BlockAckReqType::BASIC;
     }
   m_tidInfo = (bar >> 12) & 0x0f;
 }
@@ -194,15 +199,15 @@
 }
 
 void
-CtrlBAckRequestHeader::SetType (BlockAckType type)
+CtrlBAckRequestHeader::SetType (BlockAckReqType type)
 {
-  m_baType = type;
+  m_barType = type;
 }
 
-BlockAckType
+BlockAckReqType
 CtrlBAckRequestHeader::GetType (void) const
 {
-  return m_baType;
+  return m_barType;
 }
 
 void
@@ -239,25 +244,25 @@
 bool
 CtrlBAckRequestHeader::IsBasic (void) const
 {
-  return (m_baType == BASIC_BLOCK_ACK) ? true : false;
+  return (m_barType.m_variant == BlockAckReqType::BASIC) ? true : false;
 }
 
 bool
 CtrlBAckRequestHeader::IsCompressed (void) const
 {
-  return (m_baType == COMPRESSED_BLOCK_ACK) ? true : false;
+  return (m_barType.m_variant == BlockAckReqType::COMPRESSED) ? true : false;
 }
 
 bool
 CtrlBAckRequestHeader::IsExtendedCompressed (void) const
 {
-  return (m_baType == EXTENDED_COMPRESSED_BLOCK_ACK) ? true : false;
+  return (m_barType.m_variant == BlockAckReqType::EXTENDED_COMPRESSED) ? true : false;
 }
 
 bool
 CtrlBAckRequestHeader::IsMultiTid (void) const
 {
-  return (m_baType == MULTI_TID_BLOCK_ACK) ? true : false;
+  return (m_barType.m_variant == BlockAckReqType::MULTI_TID) ? true : false;
 }
 
 
@@ -269,9 +274,9 @@
 
 CtrlBAckResponseHeader::CtrlBAckResponseHeader ()
   : m_baAckPolicy (false),
-    m_baType (BASIC_BLOCK_ACK)
+    m_tidInfo (0)
 {
-  memset (&bitmap, 0, sizeof (bitmap));
+  SetType (BlockAckType::BASIC);
 }
 
 CtrlBAckResponseHeader::~CtrlBAckResponseHeader ()
@@ -298,28 +303,44 @@
 void
 CtrlBAckResponseHeader::Print (std::ostream &os) const
 {
-  os << "TID_INFO=" << m_tidInfo << ", StartingSeq=" << std::hex << m_startingSeq << std::dec;
+  if (m_baType.m_variant != BlockAckType::MULTI_STA)
+    {
+      os << "TID_INFO=" << m_tidInfo << ", StartingSeq=0x" << std::hex << m_baInfo[0].m_startingSeq << std::dec;
+    }
+  else
+    {
+      for (std::size_t i = 0; i < m_baInfo.size (); i++)
+        {
+          os << "{AID=" << GetAid11 (i)
+             << ", TID=" << GetTidInfo (i)
+             << ", StartingSeq=0x" << std::hex << m_baInfo[i].m_startingSeq << std::dec << "}";
+        }
+    }
 }
 
 uint32_t
 CtrlBAckResponseHeader::GetSerializedSize (void) const
 {
+  // This method only makes use of the configured BA type, so that functions like
+  // GetBlockAckSize () can easily return the size of a Block Ack of a given type
   uint32_t size = 0;
-  size += 2; //Bar control
-  switch (m_baType)
+  size += 2; //BA control
+  switch (m_baType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
-        size += (2 + 128);
+      case BlockAckType::BASIC:
+      case BlockAckType::COMPRESSED:
+      case BlockAckType::EXTENDED_COMPRESSED:
+        size += (2 + m_baType.m_bitmapLen[0]);
         break;
-      case COMPRESSED_BLOCK_ACK:
-        size += (2 + 8);
-        break;
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
-        size += (2 + 32);
-        break;
-      case MULTI_TID_BLOCK_ACK:
+      case BlockAckType::MULTI_TID:
         size += (2 + 2 + 8) * (m_tidInfo + 1); //Multi-TID block ack
         break;
+      case BlockAckType::MULTI_STA:
+        for (auto& bitmapLen : m_baType.m_bitmapLen)
+          {
+            size += 2 /* AID TID Info */ + (bitmapLen > 0 ? 2 : 0) /* BA SSC */ + bitmapLen;
+          }
+        break;
       default:
         NS_FATAL_ERROR ("Invalid BA type");
         break;
@@ -332,15 +353,35 @@
 {
   Buffer::Iterator i = start;
   i.WriteHtolsbU16 (GetBaControl ());
-  switch (m_baType)
+  switch (m_baType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
-      case COMPRESSED_BLOCK_ACK:
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
+      case BlockAckType::BASIC:
+      case BlockAckType::COMPRESSED:
+      case BlockAckType::EXTENDED_COMPRESSED:
         i.WriteHtolsbU16 (GetStartingSequenceControl ());
         i = SerializeBitmap (i);
         break;
-      case MULTI_TID_BLOCK_ACK:
+      case BlockAckType::MULTI_STA:
+        for (std::size_t index = 0; index < m_baInfo.size (); index++)
+          {
+            i.WriteHtolsbU16 (m_baInfo[index].m_aidTidInfo);
+            if (GetAid11 (index) != 2045)
+              {
+                if (m_baInfo[index].m_bitmap.size () > 0)
+                  {
+                    i.WriteHtolsbU16 (GetStartingSequenceControl (index));
+                    i = SerializeBitmap (i, index);
+                  }
+              }
+            else
+              {
+                uint32_t reserved = 0;
+                i.WriteHtolsbU32 (reserved);
+                WriteTo (i, m_baInfo[index].m_ra);
+              }
+          }
+        break;
+      case BlockAckType::MULTI_TID:
         NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
         break;
       default:
@@ -354,15 +395,48 @@
 {
   Buffer::Iterator i = start;
   SetBaControl (i.ReadLsbtohU16 ());
-  switch (m_baType)
+  switch (m_baType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
-      case COMPRESSED_BLOCK_ACK:
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
+      case BlockAckType::BASIC:
+      case BlockAckType::COMPRESSED:
+      case BlockAckType::EXTENDED_COMPRESSED:
         SetStartingSequenceControl (i.ReadLsbtohU16 ());
         i = DeserializeBitmap (i);
         break;
-      case MULTI_TID_BLOCK_ACK:
+      case BlockAckType::MULTI_STA:
+        {
+          std::size_t index = 0;
+          while (i.GetRemainingSize () > 0)
+            {
+              m_baInfo.push_back (BaInfoInstance ());
+              m_baType.m_bitmapLen.push_back (0);  // updated by next call to SetStartingSequenceControl
+
+              m_baInfo.back ().m_aidTidInfo = i.ReadLsbtohU16 ();
+
+              if (GetAid11 (index) != 2045)
+                {
+                  // the Block Ack Starting Sequence Control and Block Ack Bitmap subfields
+                  // are only present in Block acknowledgement context, i.e., if the Ack Type
+                  // subfield is set to 0 and the TID subfield is set to a value from 0 to 7.
+                  if (!GetAckType (index) && GetTidInfo (index) < 8)
+                    {
+                      SetStartingSequenceControl (i.ReadLsbtohU16 (), index);
+                      i = DeserializeBitmap (i, index);
+                    }
+                }
+              else
+                {
+                  i.ReadLsbtohU32 ();  // next 4 bytes are reserved
+                  ReadFrom (i, m_baInfo.back ().m_ra);
+                  // the length of this Per AID TID Info subfield is 12, so set
+                  // the bitmap length to 8 to simulate the correct size
+                  m_baType.m_bitmapLen.back () = 8;
+                }
+              index++;
+            }
+        }
+        break;
+      case BlockAckType::MULTI_TID:
         NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
         break;
       default:
@@ -382,6 +456,15 @@
 CtrlBAckResponseHeader::SetType (BlockAckType type)
 {
   m_baType = type;
+  m_baInfo.clear ();
+
+  for (auto& bitmapLen : m_baType.m_bitmapLen)
+    {
+      m_baInfo.push_back ({.m_aidTidInfo = 0,
+                           .m_startingSeq = 0,
+                           .m_bitmap = std::vector<uint8_t> (bitmapLen, 0),
+                           .m_ra = Mac48Address ()});
+    }
 }
 
 BlockAckType
@@ -391,15 +474,30 @@
 }
 
 void
-CtrlBAckResponseHeader::SetTidInfo (uint8_t tid)
+CtrlBAckResponseHeader::SetTidInfo (uint8_t tid, std::size_t index)
 {
-  m_tidInfo = static_cast<uint16_t> (tid);
+  NS_ASSERT_MSG (m_baType.m_variant == BlockAckType::MULTI_STA || index == 0,
+                 "index can only be non null for Multi-STA Block Ack");
+  NS_ASSERT (index < m_baInfo.size ());
+
+  if (m_baType.m_variant != BlockAckType::MULTI_STA)
+    {
+      m_tidInfo = static_cast<uint16_t> (tid);
+    }
+  else
+    {
+      m_baInfo[index].m_aidTidInfo |= ((static_cast<uint16_t> (tid) & 0x000f) << 12);
+    }
 }
 
 void
-CtrlBAckResponseHeader::SetStartingSequence (uint16_t seq)
+CtrlBAckResponseHeader::SetStartingSequence (uint16_t seq, std::size_t index)
 {
-  m_startingSeq = seq;
+  NS_ASSERT_MSG (m_baType.m_variant == BlockAckType::MULTI_STA || index == 0,
+                 "index can only be non null for Multi-STA Block Ack");
+  NS_ASSERT (index < m_baInfo.size ());
+
+  m_baInfo[index].m_startingSeq = seq;
 }
 
 bool
@@ -409,40 +507,138 @@
 }
 
 uint8_t
-CtrlBAckResponseHeader::GetTidInfo (void) const
+CtrlBAckResponseHeader::GetTidInfo (std::size_t index) const
 {
-  uint8_t tid = static_cast<uint8_t> (m_tidInfo);
+  NS_ASSERT_MSG (m_baType.m_variant == BlockAckType::MULTI_STA || index == 0,
+                 "index can only be non null for Multi-STA Block Ack");
+  NS_ASSERT (index < m_baInfo.size ());
+
+  uint8_t tid = 0;
+
+  if (m_baType.m_variant != BlockAckType::MULTI_STA)
+    {
+      tid = static_cast<uint8_t> (m_tidInfo);
+    }
+  else
+    {
+      tid = static_cast<uint8_t> ((m_baInfo[index].m_aidTidInfo >> 12) & 0x000f);
+    }
   return tid;
 }
 
 uint16_t
-CtrlBAckResponseHeader::GetStartingSequence (void) const
+CtrlBAckResponseHeader::GetStartingSequence (std::size_t index) const
 {
-  return m_startingSeq;
+  NS_ASSERT_MSG (m_baType.m_variant == BlockAckType::MULTI_STA || index == 0,
+                 "index can only be non null for Multi-STA Block Ack");
+  NS_ASSERT (index < m_baInfo.size ());
+
+  return m_baInfo[index].m_startingSeq;
 }
 
 bool
 CtrlBAckResponseHeader::IsBasic (void) const
 {
-  return (m_baType == BASIC_BLOCK_ACK) ? true : false;
+  return (m_baType.m_variant == BlockAckType::BASIC) ? true : false;
 }
 
 bool
 CtrlBAckResponseHeader::IsCompressed (void) const
 {
-  return (m_baType == COMPRESSED_BLOCK_ACK) ? true : false;
+  return (m_baType.m_variant == BlockAckType::COMPRESSED) ? true : false;
 }
 
 bool
 CtrlBAckResponseHeader::IsExtendedCompressed (void) const
 {
-  return (m_baType == EXTENDED_COMPRESSED_BLOCK_ACK) ? true : false;
+  return (m_baType.m_variant == BlockAckType::EXTENDED_COMPRESSED) ? true : false;
 }
 
 bool
 CtrlBAckResponseHeader::IsMultiTid (void) const
 {
-  return (m_baType == MULTI_TID_BLOCK_ACK) ? true : false;
+  return (m_baType.m_variant == BlockAckType::MULTI_TID) ? true : false;
+}
+
+bool
+CtrlBAckResponseHeader::IsMultiSta (void) const
+{
+  return (m_baType.m_variant == BlockAckType::MULTI_STA) ? true : false;
+}
+
+void
+CtrlBAckResponseHeader::SetAid11 (uint16_t aid, std::size_t index)
+{
+  NS_ASSERT (m_baType.m_variant == BlockAckType::MULTI_STA && index < m_baInfo.size ());
+
+  m_baInfo[index].m_aidTidInfo |= (aid & 0x07ff);
+}
+
+uint16_t
+CtrlBAckResponseHeader::GetAid11 (std::size_t index) const
+{
+  NS_ASSERT (m_baType.m_variant == BlockAckType::MULTI_STA && index < m_baInfo.size ());
+
+  return m_baInfo[index].m_aidTidInfo & 0x07ff;
+}
+
+void
+CtrlBAckResponseHeader::SetAckType (bool type, std::size_t index)
+{
+  NS_ASSERT (m_baType.m_variant == BlockAckType::MULTI_STA && index < m_baInfo.size ());
+
+  if (type)
+    {
+      m_baInfo[index].m_aidTidInfo |= (1 << 11);
+    }
+}
+
+bool
+CtrlBAckResponseHeader::GetAckType (std::size_t index) const
+{
+  NS_ASSERT (m_baType.m_variant == BlockAckType::MULTI_STA && index < m_baInfo.size ());
+
+  return ((m_baInfo[index].m_aidTidInfo >> 11) & 0x0001) != 0;
+}
+
+void
+CtrlBAckResponseHeader::SetUnassociatedStaAddress (const Mac48Address& ra, std::size_t index)
+{
+  NS_ASSERT (GetAid11 (index) == 2045);
+
+  m_baInfo[index].m_ra = ra;
+}
+
+Mac48Address
+CtrlBAckResponseHeader::GetUnassociatedStaAddress (std::size_t index) const
+{
+  NS_ASSERT (GetAid11 (index) == 2045);
+
+  return m_baInfo[index].m_ra;
+}
+
+std::size_t
+CtrlBAckResponseHeader::GetNPerAidTidInfoSubfields (void) const
+{
+  NS_ASSERT (m_baType.m_variant == BlockAckType::MULTI_STA);
+  return m_baInfo.size ();
+}
+
+std::vector<uint32_t>
+CtrlBAckResponseHeader::FindPerAidTidInfoWithAid (uint16_t aid) const
+{
+  NS_ASSERT (m_baType.m_variant == BlockAckType::MULTI_STA);
+
+  std::vector<uint32_t> ret;
+  ret.reserve (m_baInfo.size ());
+  for (uint32_t i = 0; i < m_baInfo.size (); i++)
+    {
+      if (GetAid11 (i) == aid)
+        {
+          ret.push_back (i);
+        }
+    }
+  return ret;
 }
 
 uint16_t
@@ -453,24 +649,30 @@
     {
       res |= 0x1;
     }
-  switch (m_baType)
+  switch (m_baType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
+      case BlockAckType::BASIC:
         break;
-      case COMPRESSED_BLOCK_ACK:
+      case BlockAckType::COMPRESSED:
         res |= (0x02 << 1);
         break;
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
+      case BlockAckType::EXTENDED_COMPRESSED:
         res |= (0x01 << 1);
         break;
-      case MULTI_TID_BLOCK_ACK:
+      case BlockAckType::MULTI_TID:
         res |= (0x03 << 1);
         break;
+      case BlockAckType::MULTI_STA:
+        res |= (0x0b << 1);
+        break;
       default:
         NS_FATAL_ERROR ("Invalid BA type");
         break;
     }
-  res |= (m_tidInfo << 12) & (0xf << 12);
+  if (m_baType.m_variant != BlockAckType::MULTI_STA)
+    {
+      res |= (m_tidInfo << 12) & (0xf << 12);
+    }
   return res;
 }
 
@@ -480,57 +682,158 @@
   m_baAckPolicy = ((ba & 0x01) == 1) ? true : false;
   if (((ba >> 1) & 0x0f) == 0x03)
     {
-      m_baType = MULTI_TID_BLOCK_ACK;
+      SetType (BlockAckType::MULTI_TID);
     }
   else if (((ba >> 1) & 0x0f) == 0x01)
     {
-      m_baType = EXTENDED_COMPRESSED_BLOCK_ACK;
+      SetType (BlockAckType::EXTENDED_COMPRESSED);
     }
   else if (((ba >> 1) & 0x0f) == 0x02)
     {
-      m_baType = COMPRESSED_BLOCK_ACK;
+      SetType (BlockAckType::COMPRESSED);
+    }
+  else if (((ba >> 1) & 0x0f) == 0)
+    {
+      SetType (BlockAckType::BASIC);
+    }
+  else if (((ba >> 1) & 0x0f) == 0x0b)
+    {
+      SetType (BlockAckType::MULTI_STA);
     }
   else
     {
-      m_baType = BASIC_BLOCK_ACK;
+      NS_FATAL_ERROR ("Invalid BA type");
+    }
+  if (m_baType.m_variant != BlockAckType::MULTI_STA)
+    {
+      m_tidInfo = (ba >> 12) & 0x0f;
     }
-  m_tidInfo = (ba >> 12) & 0x0f;
 }
 
 uint16_t
-CtrlBAckResponseHeader::GetStartingSequenceControl (void) const
+CtrlBAckResponseHeader::GetStartingSequenceControl (std::size_t index) const
 {
-  return (m_startingSeq << 4) & 0xfff0;
+  NS_ASSERT_MSG (m_baType.m_variant == BlockAckType::MULTI_STA || index == 0,
+                 "index can only be non null for Multi-STA Block Ack");
+  NS_ASSERT (index < m_baInfo.size ());
+
+  uint16_t ret = (m_baInfo[index].m_startingSeq << 4) & 0xfff0;
+
+  // The Fragment Number subfield encodes the length of the bitmap for
+  // Compressed and Multi-STA variants (see sections 9.3.1.9.3 and 9.3.1.9.7
+  // of 802.11ax Draft 3.0). Note that Fragmentation Level 3 is not supported.
+  if (m_baType.m_variant == BlockAckType::COMPRESSED)
+    {
+      if (m_baType.m_bitmapLen[0] == 32)
+        {
+          ret |= 0x0004;
+        }
+    }
+  else if (m_baType.m_variant == BlockAckType::MULTI_STA)
+    {
+      NS_ASSERT (m_baInfo.size () == m_baType.m_bitmapLen.size ());
+      NS_ASSERT_MSG (m_baInfo[index].m_bitmap.size () > 0,
+                     "This Per AID TID Info subfield has no Starting Sequence Control subfield");
+
+      if (m_baType.m_bitmapLen[index] == 16)
+        {
+          ret |= 0x0002;
+        }
+      else if (m_baType.m_bitmapLen[index] == 32)
+        {
+          ret |= 0x0004;
+        }
+      else if (m_baType.m_bitmapLen[index] == 4)
+        {
+          ret |= 0x0006;
+        }
+    }
+  return ret;
 }
 
 void
-CtrlBAckResponseHeader::SetStartingSequenceControl (uint16_t seqControl)
+CtrlBAckResponseHeader::SetStartingSequenceControl (uint16_t seqControl, std::size_t index)
 {
-  m_startingSeq = (seqControl >> 4) & 0x0fff;
+  NS_ASSERT_MSG (m_baType.m_variant == BlockAckType::MULTI_STA || index == 0,
+                 "index can only be non null for Multi-STA Block Ack");
+  NS_ASSERT (index < m_baInfo.size ());
+
+  // The Fragment Number subfield encodes the length of the bitmap for
+  // Compressed and Multi-STA variants (see sections 9.3.1.9.3 and 9.3.1.9.7
+  // of 802.11ax Draft 3.0). Note that Fragmentation Level 3 is not supported.
+  if (m_baType.m_variant == BlockAckType::COMPRESSED)
+    {
+      if ((seqControl & 0x0001) == 1)
+        {
+          NS_FATAL_ERROR ("Fragmentation Level 3 unsupported");
+        }
+      if (((seqControl >> 3) & 0x0001) == 0 && ((seqControl >> 1) & 0x0003) == 0)
+        {
+          SetType ({BlockAckType::COMPRESSED, {8}});
+        }
+      else if (((seqControl >> 3) & 0x0001) == 0 && ((seqControl >> 1) & 0x0003) == 2)
+        {
+          SetType ({BlockAckType::COMPRESSED, {32}});
+        }
+      else
+        {
+          NS_FATAL_ERROR ("Reserved configurations");
+        }
+    }
+  else if (m_baType.m_variant == BlockAckType::MULTI_STA)
+    {
+      if ((seqControl & 0x0001) == 1)
+        {
+          NS_FATAL_ERROR ("Fragmentation Level 3 unsupported");
+        }
+      uint8_t bitmapLen = 0;
+      if (((seqControl >> 3) & 0x0001) == 0 && ((seqControl >> 1) & 0x0003) == 0)
+        {
+          bitmapLen = 8;
+        }
+      else if (((seqControl >> 3) & 0x0001) == 0 && ((seqControl >> 1) & 0x0003) == 1)
+        {
+          bitmapLen = 16;
+        }
+      else if (((seqControl >> 3) & 0x0001) == 0 && ((seqControl >> 1) & 0x0003) == 2)
+        {
+          bitmapLen = 32;
+        }
+      else if (((seqControl >> 3) & 0x0001) == 0 && ((seqControl >> 1) & 0x0003) == 3)
+        {
+          bitmapLen = 4;
+        }
+      else
+        {
+          NS_FATAL_ERROR ("Reserved configurations");
+        }
+      m_baType.m_bitmapLen[index] = bitmapLen;
+      m_baInfo[index].m_bitmap.assign (bitmapLen, 0);
+    }
+
+  m_baInfo[index].m_startingSeq = (seqControl >> 4) & 0x0fff;
 }
 
 Buffer::Iterator
-CtrlBAckResponseHeader::SerializeBitmap (Buffer::Iterator start) const
+CtrlBAckResponseHeader::SerializeBitmap (Buffer::Iterator start, std::size_t index) const
 {
+  NS_ASSERT_MSG (m_baType.m_variant == BlockAckType::MULTI_STA || index == 0,
+                 "index can only be non null for Multi-STA Block Ack");
+  NS_ASSERT (index < m_baInfo.size ());
+
   Buffer::Iterator i = start;
-  switch (m_baType)
+  switch (m_baType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
-          for (uint8_t j = 0; j < 64; j++)
+      case BlockAckType::BASIC:
+      case BlockAckType::COMPRESSED:
+      case BlockAckType::EXTENDED_COMPRESSED:
+      case BlockAckType::MULTI_STA:
+          for (const auto& byte : m_baInfo[index].m_bitmap)
             {
-              i.WriteHtolsbU16 (bitmap.m_bitmap[j]);
+              i.WriteU8 (byte);
             }
           break;
-      case COMPRESSED_BLOCK_ACK:
-          i.WriteHtolsbU64 (bitmap.m_compressedBitmap);
-          break;
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
-          i.WriteHtolsbU64 (bitmap.m_extendedCompressedBitmap[0]);
-          i.WriteHtolsbU64 (bitmap.m_extendedCompressedBitmap[1]);
-          i.WriteHtolsbU64 (bitmap.m_extendedCompressedBitmap[2]);
-          i.WriteHtolsbU64 (bitmap.m_extendedCompressedBitmap[3]);
-          break;
-      case MULTI_TID_BLOCK_ACK:
+      case BlockAckType::MULTI_TID:
         NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
         break;
       default:
@@ -541,27 +844,25 @@
 }
 
 Buffer::Iterator
-CtrlBAckResponseHeader::DeserializeBitmap (Buffer::Iterator start)
+CtrlBAckResponseHeader::DeserializeBitmap (Buffer::Iterator start, std::size_t index)
 {
+  NS_ASSERT_MSG (m_baType.m_variant == BlockAckType::MULTI_STA || index == 0,
+                 "index can only be non null for Multi-STA Block Ack");
+  NS_ASSERT (index < m_baInfo.size ());
+
   Buffer::Iterator i = start;
-  switch (m_baType)
+  switch (m_baType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
-          for (uint8_t j = 0; j < 64; j++)
+      case BlockAckType::BASIC:
+      case BlockAckType::COMPRESSED:
+      case BlockAckType::EXTENDED_COMPRESSED:
+      case BlockAckType::MULTI_STA:
+          for (uint8_t j = 0; j < m_baType.m_bitmapLen[index]; j++)
             {
-              bitmap.m_bitmap[j] = i.ReadLsbtohU16 ();
+              m_baInfo[index].m_bitmap[j] = i.ReadU8 ();
             }
           break;
-      case COMPRESSED_BLOCK_ACK:
-          bitmap.m_compressedBitmap = i.ReadLsbtohU64 ();
-          break;
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
-          bitmap.m_extendedCompressedBitmap[0] = i.ReadLsbtohU64 ();
-          bitmap.m_extendedCompressedBitmap[1] = i.ReadLsbtohU64 ();
-          bitmap.m_extendedCompressedBitmap[2] = i.ReadLsbtohU64 ();
-          bitmap.m_extendedCompressedBitmap[3] = i.ReadLsbtohU64 ();
-          break;
-      case MULTI_TID_BLOCK_ACK:
+      case BlockAckType::MULTI_TID:
         NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
         break;
       default:
@@ -572,42 +873,37 @@
 }
 
 void
-CtrlBAckResponseHeader::SetReceivedPacket (uint16_t seq)
+CtrlBAckResponseHeader::SetReceivedPacket (uint16_t seq, std::size_t index)
 {
-  if (!IsInBitmap (seq))
+  NS_ASSERT_MSG (m_baType.m_variant == BlockAckType::MULTI_STA || index == 0,
+                 "index can only be non null for Multi-STA Block Ack");
+  NS_ASSERT (index < m_baInfo.size ());
+
+  if (!IsInBitmap (seq, index))
     {
       return;
     }
-  switch (m_baType)
+  switch (m_baType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
-        {
-          /* To set correctly basic block ack bitmap we need fragment number too.
-             So if it's not specified, we consider packet not fragmented. */
-          bitmap.m_bitmap[IndexInBitmap (seq)] |= 0x0001;
-          break;
-        }
-      case COMPRESSED_BLOCK_ACK:
-        {
-          bitmap.m_compressedBitmap |= (uint64_t (0x0000000000000001) << IndexInBitmap (seq));
-          break;
-        }
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
-        {
-          uint16_t index = IndexInBitmap (seq);
-          bitmap.m_extendedCompressedBitmap[index/64] |= (uint64_t (0x0000000000000001) << index);
-          break;
-        }
-      case MULTI_TID_BLOCK_ACK:
+      case BlockAckType::BASIC:
+        /* To set correctly basic block ack bitmap we need fragment number too.
+            So if it's not specified, we consider packet not fragmented. */
+        m_baInfo[index].m_bitmap[IndexInBitmap (seq) * 2] |= 0x01;
+        break;
+      case BlockAckType::COMPRESSED:
+      case BlockAckType::EXTENDED_COMPRESSED:
+      case BlockAckType::MULTI_STA:
         {
-          NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
+          uint16_t i = IndexInBitmap (seq, index);
+          m_baInfo[index].m_bitmap[i / 8] |= (uint8_t (0x01) << (i % 8));
           break;
         }
+      case BlockAckType::MULTI_TID:
+        NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
+        break;
       default:
-        {
-          NS_FATAL_ERROR ("Invalid BA type");
-          break;
-        }
+        NS_FATAL_ERROR ("Invalid BA type");
+        break;
     }
 }
 
@@ -619,17 +915,18 @@
     {
       return;
     }
-  switch (m_baType)
+  switch (m_baType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
-        bitmap.m_bitmap[IndexInBitmap (seq)] |= (0x0001 << frag);
+      case BlockAckType::BASIC:
+        m_baInfo[0].m_bitmap[IndexInBitmap (seq) * 2 + frag / 8] |= (0x01 << (frag % 8));
         break;
-      case COMPRESSED_BLOCK_ACK:
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
+      case BlockAckType::COMPRESSED:
+      case BlockAckType::EXTENDED_COMPRESSED:
+      case BlockAckType::MULTI_STA:
         /* We can ignore this...compressed block ack doesn't support
            acknowledgment of single fragments */
         break;
-      case MULTI_TID_BLOCK_ACK:
+      case BlockAckType::MULTI_TID:
         NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
         break;
       default:
@@ -639,43 +936,41 @@
 }
 
 bool
-CtrlBAckResponseHeader::IsPacketReceived (uint16_t seq) const
+CtrlBAckResponseHeader::IsPacketReceived (uint16_t seq, std::size_t index) const
 {
-  if (!IsInBitmap (seq))
+  NS_ASSERT_MSG (m_baType.m_variant == BlockAckType::MULTI_STA || index == 0,
+                 "index can only be non null for Multi-STA Block Ack");
+  NS_ASSERT (index < m_baInfo.size ());
+
+  if (m_baType.m_variant == BlockAckType::MULTI_STA
+      && GetAckType (index) && GetTidInfo (index) == 14)
+    {
+      // All-ack context
+      return true;
+    }
+  if (!IsInBitmap (seq, index))
     {
       return false;
     }
-  switch (m_baType)
+  switch (m_baType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
-        {
-          /*It's impossible to say if an entire packet was correctly received. */
-          return false;
-        }
-      case COMPRESSED_BLOCK_ACK:
+      case BlockAckType::BASIC:
+        /*It's impossible to say if an entire packet was correctly received. */
+        return false;
+      case BlockAckType::COMPRESSED:
+      case BlockAckType::EXTENDED_COMPRESSED:
+      case BlockAckType::MULTI_STA:
         {
-          /* Although this could make no sense, if packet with sequence number
-             equal to <i>seq</i> was correctly received, also all of its fragments
-             were correctly received. */
-          uint64_t mask = uint64_t (0x0000000000000001);
-          return (((bitmap.m_compressedBitmap >> IndexInBitmap (seq)) & mask) == 1) ? true : false;
-        }
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
-        {
-          uint64_t mask = uint64_t (0x0000000000000001);
-          uint16_t index = IndexInBitmap (seq);
-          return (((bitmap.m_extendedCompressedBitmap[index/64] >> index) & mask) == 1) ? true : false;
-        }
-      case MULTI_TID_BLOCK_ACK:
-        {
-          NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
-          break;
+          uint16_t i = IndexInBitmap (seq, index);
+          uint8_t mask = uint8_t (0x01) << (i % 8);
+          return ((m_baInfo[index].m_bitmap[i / 8] & mask) != 0) ? true : false;
         }
+      case BlockAckType::MULTI_TID:
+        NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
+        break;
       default:
-        {
-          NS_FATAL_ERROR ("Invalid BA type");
-          break;
-        }
+        NS_FATAL_ERROR ("Invalid BA type");
+        break;
     }
   return false;
 }
@@ -688,27 +983,17 @@
     {
       return false;
     }
-  switch (m_baType)
+  switch (m_baType.m_variant)
     {
-      case BASIC_BLOCK_ACK:
-        {
-          return ((bitmap.m_bitmap[IndexInBitmap (seq)] & (0x0001 << frag)) != 0x0000) ? true : false;
-        }
-      case COMPRESSED_BLOCK_ACK:
-        {
-          /* Although this could make no sense, if packet with sequence number
-             equal to <i>seq</i> was correctly received, also all of its fragments
-             were correctly received. */
-          uint64_t mask = uint64_t (0x0000000000000001);
-          return (((bitmap.m_compressedBitmap >> IndexInBitmap (seq)) & mask) == 1) ? true : false;
-        }
-      case EXTENDED_COMPRESSED_BLOCK_ACK:
-        {
-          uint64_t mask = uint64_t (0x0000000000000001);
-          uint16_t index = IndexInBitmap (seq);
-          return (((bitmap.m_extendedCompressedBitmap[index/64] >> index) & mask) == 1) ? true : false;
-        }
-      case MULTI_TID_BLOCK_ACK:
+      case BlockAckType::BASIC:
+        return ((m_baInfo[0].m_bitmap[IndexInBitmap (seq) * 2 + frag / 8] & (0x01 << (frag % 8))) != 0) ? true : false;
+      case BlockAckType::COMPRESSED:
+      case BlockAckType::EXTENDED_COMPRESSED:
+      case BlockAckType::MULTI_STA:
+        /* We can ignore this...compressed block ack doesn't support
+           acknowledgement of single fragments */
+        return false;
+      case BlockAckType::MULTI_TID:
         {
           NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
           break;
@@ -723,63 +1008,1089 @@
 }
 
 uint16_t
-CtrlBAckResponseHeader::IndexInBitmap (uint16_t seq) const
+CtrlBAckResponseHeader::IndexInBitmap (uint16_t seq, std::size_t index) const
 {
-  uint16_t index;
-  if (seq >= m_startingSeq)
+  uint16_t i;
+  if (seq >= m_baInfo[index].m_startingSeq)
     {
-      index = seq - m_startingSeq;
+      i = seq - m_baInfo[index].m_startingSeq;
     }
   else
     {
-      index = 4096 - m_startingSeq + seq;
-    }
-  if (m_baType == EXTENDED_COMPRESSED_BLOCK_ACK)
-    {
-      NS_ASSERT (index <= 255);
+      i = SEQNO_SPACE_SIZE - m_baInfo[index].m_startingSeq + seq;
     }
-  else
+
+  uint16_t nAckedMpdus = m_baType.m_bitmapLen[index] * 8;
+
+  if (m_baType.m_variant == BlockAckType::BASIC)
     {
-      NS_ASSERT (index <= 63);
+      nAckedMpdus = nAckedMpdus / 16;
     }
-  return index;
+
+  NS_ASSERT (i < nAckedMpdus);
+  return i;
 }
 
 bool
-CtrlBAckResponseHeader::IsInBitmap (uint16_t seq) const
+CtrlBAckResponseHeader::IsInBitmap (uint16_t seq, std::size_t index) const
 {
-  if (m_baType == EXTENDED_COMPRESSED_BLOCK_ACK)
-    {
-      return (seq - m_startingSeq + 4096) % 4096 < 256;
-    }
-  else
+  NS_ASSERT_MSG (m_baType.m_variant == BlockAckType::MULTI_STA || index == 0,
+                 "index can only be non null for Multi-STA Block Ack");
+  NS_ASSERT (index < m_baType.m_bitmapLen.size ());
+
+  uint16_t nAckedMpdus = m_baType.m_bitmapLen[index] * 8;
+
+  if (m_baType.m_variant == BlockAckType::BASIC)
     {
-      return (seq - m_startingSeq + 4096) % 4096 < 64;
+      nAckedMpdus = nAckedMpdus / 16;
     }
+
+  return (seq - m_baInfo[index].m_startingSeq + SEQNO_SPACE_SIZE) % SEQNO_SPACE_SIZE < nAckedMpdus;
+}
+
+const std::vector<uint8_t>&
+CtrlBAckResponseHeader::GetBitmap (std::size_t index) const
+{
+  NS_ASSERT_MSG (m_baType.m_variant == BlockAckType::MULTI_STA || index == 0,
+                 "index can only be non null for Multi-STA Block Ack");
+  NS_ASSERT (index < m_baInfo.size ());
+
+  return m_baInfo[index].m_bitmap;
+}
+
+void
+CtrlBAckResponseHeader::ResetBitmap (std::size_t index)
+{
+  NS_ASSERT_MSG (m_baType.m_variant == BlockAckType::MULTI_STA || index == 0,
+                 "index can only be non null for Multi-STA Block Ack");
+  NS_ASSERT (index < m_baInfo.size ());
+
+  m_baInfo[index].m_bitmap.assign (m_baType.m_bitmapLen[index], 0);
 }
 
-const uint16_t*
-CtrlBAckResponseHeader::GetBitmap (void) const
+
+/***********************************
+ * Trigger frame - User Info field
+ ***********************************/
+
+CtrlTriggerUserInfoField::CtrlTriggerUserInfoField (uint8_t triggerType)
+  : m_aid12 (0),
+    m_ruAllocation (0),
+    m_ulFecCodingType (false),
+    m_ulMcs (0),
+    m_ulDcm (false),
+    m_ulTargetRssi (0),
+    m_triggerType (triggerType),
+    m_basicTriggerDependentUserInfo (0)
 {
-  return bitmap.m_bitmap;
+  memset (&m_bits26To31, 0, sizeof (m_bits26To31));
 }
 
-uint64_t
-CtrlBAckResponseHeader::GetCompressedBitmap (void) const
+CtrlTriggerUserInfoField::~CtrlTriggerUserInfoField ()
 {
-  return bitmap.m_compressedBitmap;
 }
 
-const uint64_t*
-CtrlBAckResponseHeader::GetExtendedCompressedBitmap (void) const
+CtrlTriggerUserInfoField&
+CtrlTriggerUserInfoField::operator= (const CtrlTriggerUserInfoField& userInfo)
 {
-  return bitmap.m_extendedCompressedBitmap;
+  NS_ABORT_MSG_IF (m_triggerType != userInfo.m_triggerType, "Trigger Frame type mismatch");
+
+  // check for self-assignment
+  if (&userInfo == this)
+    {
+      return *this;
+    }
+
+  m_aid12 = userInfo.m_aid12;
+  m_ruAllocation = userInfo.m_ruAllocation;
+  m_ulFecCodingType = userInfo.m_ulFecCodingType;
+  m_ulMcs = userInfo.m_ulMcs;
+  m_ulDcm = userInfo.m_ulDcm;
+  m_bits26To31 = userInfo.m_bits26To31;
+  m_ulTargetRssi = userInfo.m_ulTargetRssi;
+  m_basicTriggerDependentUserInfo = userInfo.m_basicTriggerDependentUserInfo;
+  m_muBarTriggerDependentUserInfo = userInfo.m_muBarTriggerDependentUserInfo;
+  return *this;
 }
 
 void
-CtrlBAckResponseHeader::ResetBitmap (void)
+CtrlTriggerUserInfoField::Print (std::ostream &os) const
+{
+  os << ", USER_INFO AID=" << m_aid12 << ", RU_Allocation=" << +m_ruAllocation << ", MCS=" << +m_ulMcs;
+}
+
+uint32_t
+CtrlTriggerUserInfoField::GetSerializedSize (void) const
+{
+  uint32_t size = 0;
+  size += 5;   // User Info (excluding Trigger Dependent User Info)
+
+  switch (m_triggerType)
+    {
+      case BASIC_TRIGGER:
+      case BFRP_TRIGGER:
+        size += 1;
+        break;
+      case MU_BAR_TRIGGER:
+        size += m_muBarTriggerDependentUserInfo.GetSerializedSize (); // BAR Control and BAR Information
+        break;
+      // The Trigger Dependent User Info subfield is not present in the other variants
+    }
+
+  return size;
+}
+
+Buffer::Iterator
+CtrlTriggerUserInfoField::Serialize (Buffer::Iterator start) const
 {
-  memset (&bitmap, 0, sizeof (bitmap));
+  NS_ABORT_MSG_IF (m_triggerType == BFRP_TRIGGER, "BFRP Trigger frame is not supported");
+  NS_ABORT_MSG_IF (m_triggerType == GCR_MU_BAR_TRIGGER, "GCR-MU-BAR Trigger frame is not supported");
+  NS_ABORT_MSG_IF (m_triggerType == NFRP_TRIGGER, "NFRP Trigger frame is not supported");
+
+  Buffer::Iterator i = start;
+
+  uint32_t userInfo = 0;   // User Info except the MSB
+  userInfo |= (m_aid12 & 0x0fff);
+  userInfo |= (m_ruAllocation << 12);
+  userInfo |= (m_ulFecCodingType ? 1 << 20 : 0);
+  userInfo |= (m_ulMcs & 0x0f) << 21;
+  userInfo |= (m_ulDcm ? 1 << 25 : 0);
+
+  if (m_aid12 != 0 && m_aid12 != 2045)
+    {
+      userInfo |= (m_bits26To31.ssAllocation.startingSs & 0x07) << 26;
+      userInfo |= (m_bits26To31.ssAllocation.nSs & 0x07) << 29;
+    }
+  else
+    {
+      userInfo |= (m_bits26To31.raRuInformation.nRaRu & 0x1f) << 26;
+      userInfo |= (m_bits26To31.raRuInformation.moreRaRu ? 1 << 31 : 0);
+    }
+
+  i.WriteHtolsbU32 (userInfo);
+  // Here we need to write 8 bits covering the UL Target RSSI (7 bits) and the
+  // Reserved bit. Given how m_ulTargetRssi is set, writing m_ulTargetRssi
+  // leads to setting the Reserved bit to zero
+  i.WriteU8 (m_ulTargetRssi);
+
+  if (m_triggerType == BASIC_TRIGGER)
+    {
+      i.WriteU8 (m_basicTriggerDependentUserInfo);
+    }
+  else if (m_triggerType == MU_BAR_TRIGGER)
+    {
+      m_muBarTriggerDependentUserInfo.Serialize (i);
+      i.Next (m_muBarTriggerDependentUserInfo.GetSerializedSize ());
+    }
+
+  return i;
+}
+
+Buffer::Iterator
+CtrlTriggerUserInfoField::Deserialize (Buffer::Iterator start)
+{
+  NS_ABORT_MSG_IF (m_triggerType == BFRP_TRIGGER, "BFRP Trigger frame is not supported");
+  NS_ABORT_MSG_IF (m_triggerType == GCR_MU_BAR_TRIGGER, "GCR-MU-BAR Trigger frame is not supported");
+  NS_ABORT_MSG_IF (m_triggerType == NFRP_TRIGGER, "NFRP Trigger frame is not supported");
+
+  Buffer::Iterator i = start;
+
+  uint32_t userInfo = i.ReadLsbtohU32 ();
+
+  m_aid12 = userInfo & 0x0fff;
+  NS_ABORT_MSG_IF (m_aid12 == 4095, "Cannot deserialize a Padding field");
+  m_ruAllocation = (userInfo >> 12) & 0xff;
+  m_ulFecCodingType = (userInfo >> 20) & 0x01;
+  m_ulMcs = (userInfo >> 21) & 0x0f;
+  m_ulDcm = (userInfo >> 25) & 0x01;
+
+  if (m_aid12 != 0 && m_aid12 != 2045)
+    {
+      m_bits26To31.ssAllocation.startingSs = (userInfo >> 26) & 0x07;
+      m_bits26To31.ssAllocation.nSs = (userInfo >> 29) & 0x07;
+    }
+  else
+    {
+      m_bits26To31.raRuInformation.nRaRu = (userInfo >> 26) & 0x1f;
+      m_bits26To31.raRuInformation.moreRaRu = (userInfo >> 31) & 0x01;
+    }
+
+  m_ulTargetRssi = i.ReadU8 () & 0x7f;  // B39 is reserved
+
+  if (m_triggerType == BASIC_TRIGGER)
+    {
+      m_basicTriggerDependentUserInfo= i.ReadU8 ();
+    }
+  else if (m_triggerType == MU_BAR_TRIGGER)
+    {
+      uint32_t len = m_muBarTriggerDependentUserInfo.Deserialize (i);
+      i.Next (len);
+    }
+
+  return i;
+}
+
+TriggerFrameType
+CtrlTriggerUserInfoField::GetType (void) const
+{
+  return static_cast<TriggerFrameType> (m_triggerType);
+}
+
+void
+CtrlTriggerUserInfoField::SetAid12 (uint16_t aid)
+{
+  m_aid12 = aid & 0x0fff;
+}
+
+uint16_t
+CtrlTriggerUserInfoField::GetAid12 (void) const
+{
+  return m_aid12;
+}
+
+bool
+CtrlTriggerUserInfoField::HasRaRuForAssociatedSta (void) const
+{
+  return (m_aid12 == 0);
+}
+
+bool
+CtrlTriggerUserInfoField::HasRaRuForUnassociatedSta (void) const
+{
+  return (m_aid12 == 2045);
+}
+
+void
+CtrlTriggerUserInfoField::SetRuAllocation (HeRu::RuSpec ru)
+{
+  NS_ABORT_MSG_IF (ru.GetIndex () == 0, "Valid indices start at 1");
+
+  switch (ru.GetRuType ())
+    {
+    case HeRu::RU_26_TONE:
+      m_ruAllocation = ru.GetIndex () - 1;
+      break;
+    case HeRu::RU_52_TONE:
+      m_ruAllocation = ru.GetIndex () + 36;
+      break;
+    case HeRu::RU_106_TONE:
+      m_ruAllocation = ru.GetIndex () + 52;
+      break;
+    case HeRu::RU_242_TONE:
+      m_ruAllocation = ru.GetIndex () + 60;
+      break;
+    case HeRu::RU_484_TONE:
+      m_ruAllocation = ru.GetIndex () + 64;
+      break;
+    case HeRu::RU_996_TONE:
+      m_ruAllocation = 67;
+      break;
+    case HeRu::RU_2x996_TONE:
+      m_ruAllocation = 68;
+      break;
+    default:
+      NS_FATAL_ERROR ("RU type unknown.");
+      break;
+    }
+
+  NS_ABORT_MSG_IF (m_ruAllocation > 68, "Reserved value.");
+
+  m_ruAllocation <<= 1;
+  if (!ru.GetPrimary80MHz ())
+    {
+      m_ruAllocation++;
+    }
+}
+
+HeRu::RuSpec
+CtrlTriggerUserInfoField::GetRuAllocation (void) const
+{
+  HeRu::RuType ruType;
+  std::size_t index;
+
+  bool primary80MHz = ((m_ruAllocation & 0x01) == 0);
+
+  uint8_t val = m_ruAllocation >> 1;
+
+  if (val < 37)
+    {
+      ruType = HeRu::RU_26_TONE;
+      index = val + 1;
+    }
+  else if (val < 53)
+    {
+      ruType = HeRu::RU_52_TONE;
+      index = val - 36;
+    }
+  else if (val < 61)
+    {
+      ruType = HeRu::RU_106_TONE;
+      index = val - 52;
+    }
+  else if (val < 65)
+    {
+      ruType = HeRu::RU_242_TONE;
+      index = val - 60;
+    }
+  else if (val < 67)
+    {
+      ruType = HeRu::RU_484_TONE;
+      index = val - 64;
+    }
+  else if (val == 67)
+    {
+      ruType = HeRu::RU_996_TONE;
+      index = 1;
+    }
+  else if (val == 68)
+    {
+      ruType = HeRu::RU_2x996_TONE;
+      index = 1;
+    }
+  else
+    {
+      NS_FATAL_ERROR ("Reserved value.");
+    }
+
+  return HeRu::RuSpec (ruType, index, primary80MHz);
+}
+
+void
+CtrlTriggerUserInfoField::SetUlFecCodingType (bool ldpc)
+{
+  m_ulFecCodingType = ldpc;
+}
+
+bool
+CtrlTriggerUserInfoField::GetUlFecCodingType (void) const
+{
+  return m_ulFecCodingType;
+}
+
+void
+CtrlTriggerUserInfoField::SetUlMcs (uint8_t mcs)
+{
+  NS_ABORT_MSG_IF (mcs > 11, "Invalid MCS index");
+  m_ulMcs = mcs;
+}
+
+uint8_t
+CtrlTriggerUserInfoField::GetUlMcs (void) const
+{
+  return m_ulMcs;
+}
+
+void
+CtrlTriggerUserInfoField::SetUlDcm (bool dcm)
+{
+  m_ulDcm = dcm;
+}
+
+bool
+CtrlTriggerUserInfoField::GetUlDcm (void) const
+{
+  return m_ulDcm;
+}
+
+void
+CtrlTriggerUserInfoField::SetSsAllocation (uint8_t startingSs, uint8_t nSs)
+{
+  NS_ABORT_MSG_IF (m_aid12 == 0 || m_aid12 == 2045, "SS Allocation subfield not present");
+  NS_ABORT_MSG_IF (!startingSs || startingSs > 8, "Starting SS must be from 1 to 8");
+  NS_ABORT_MSG_IF (!nSs || nSs > 8, "Number of SS must be from 1 to 8");
+
+  m_bits26To31.ssAllocation.startingSs = startingSs - 1;
+  m_bits26To31.ssAllocation.nSs = nSs - 1;
+}
+
+uint8_t
+CtrlTriggerUserInfoField::GetStartingSs (void) const
+{
+  if (m_aid12 == 0 || m_aid12 == 2045)
+    {
+      return 1;
+    }
+  return m_bits26To31.ssAllocation.startingSs + 1;
+}
+
+uint8_t
+CtrlTriggerUserInfoField::GetNss (void) const
+{
+  if (m_aid12 == 0 || m_aid12 == 2045)
+    {
+      return 1;
+    }
+  return m_bits26To31.ssAllocation.nSs + 1;
+}
+
+void
+CtrlTriggerUserInfoField::SetRaRuInformation (uint8_t nRaRu, bool moreRaRu)
+{
+  NS_ABORT_MSG_IF (m_aid12 != 0 && m_aid12 != 2045, "RA-RU Information subfield not present");
+  NS_ABORT_MSG_IF (!nRaRu || nRaRu > 32, "Number of contiguous RA-RUs must be from 1 to 32");
+
+  m_bits26To31.raRuInformation.nRaRu = nRaRu - 1;
+  m_bits26To31.raRuInformation.moreRaRu = moreRaRu;
+}
+
+uint8_t
+CtrlTriggerUserInfoField::GetNRaRus (void) const
+{
+  NS_ABORT_MSG_IF (m_aid12 != 0 && m_aid12 != 2045, "RA-RU Information subfield not present");
+
+  return m_bits26To31.raRuInformation.nRaRu + 1;
+}
+
+bool
+CtrlTriggerUserInfoField::GetMoreRaRu (void) const
+{
+  NS_ABORT_MSG_IF (m_aid12 != 0 && m_aid12 != 2045, "RA-RU Information subfield not present");
+
+  return m_bits26To31.raRuInformation.moreRaRu;
+}
+
+void
+CtrlTriggerUserInfoField::SetUlTargetRssiMaxTxPower (void)
+{
+  m_ulTargetRssi = 127;  // see Table 9-25i of 802.11ax amendment D3.0
+}
+
+void
+CtrlTriggerUserInfoField::SetUlTargetRssi (int8_t dBm)
+{
+  NS_ABORT_MSG_IF (dBm < -110 || dBm > -20, "Invalid values for signal power");
+
+  m_ulTargetRssi = static_cast<uint8_t> (110 + dBm);
+}
+
+bool
+CtrlTriggerUserInfoField::IsUlTargetRssiMaxTxPower (void) const
+{
+  return (m_ulTargetRssi == 127);
+}
+
+int8_t
+CtrlTriggerUserInfoField::GetUlTargetRssi (void) const
+{
+  NS_ABORT_MSG_IF (m_ulTargetRssi == 127, "STA must use its max TX power");
+
+  return static_cast<int8_t> (m_ulTargetRssi) - 110;
+}
+
+void
+CtrlTriggerUserInfoField::SetBasicTriggerDepUserInfo (uint8_t spacingFactor, uint8_t tidLimit, AcIndex prefAc)
+{
+  NS_ABORT_MSG_IF (m_triggerType != BASIC_TRIGGER, "Not a Basic Trigger Frame");
+
+  m_basicTriggerDependentUserInfo = (spacingFactor & 0x03)
+                                     | (tidLimit & 0x07) << 2
+                                     // B5 is reserved
+                                     | (prefAc & 0x03) << 6;
+}
+
+uint8_t
+CtrlTriggerUserInfoField::GetMpduMuSpacingFactor (void) const
+{
+  NS_ABORT_MSG_IF (m_triggerType != BASIC_TRIGGER, "Not a Basic Trigger Frame");
+
+  return m_basicTriggerDependentUserInfo & 0x03;
+}
+
+uint8_t
+CtrlTriggerUserInfoField::GetTidAggregationLimit (void) const
+{
+  NS_ABORT_MSG_IF (m_triggerType != BASIC_TRIGGER, "Not a Basic Trigger Frame");
+
+  return (m_basicTriggerDependentUserInfo & 0x1c) >> 2;
+}
+
+AcIndex
+CtrlTriggerUserInfoField::GetPreferredAc (void) const
+{
+  NS_ABORT_MSG_IF (m_triggerType != BASIC_TRIGGER, "Not a Basic Trigger Frame");
+
+  return AcIndex ((m_basicTriggerDependentUserInfo & 0xc0) >> 6);
+}
+
+void
+CtrlTriggerUserInfoField::SetMuBarTriggerDepUserInfo (const CtrlBAckRequestHeader& bar)
+{
+  NS_ABORT_MSG_IF (m_triggerType != MU_BAR_TRIGGER, "Not a MU-BAR Trigger frame");
+  NS_ABORT_MSG_IF (bar.GetType ().m_variant != BlockAckReqType::COMPRESSED
+                   && bar.GetType ().m_variant != BlockAckReqType::MULTI_TID,
+                   "BAR Control indicates it is neither the Compressed nor the Multi-TID variant");
+  m_muBarTriggerDependentUserInfo = bar;
+}
+
+const CtrlBAckRequestHeader&
+CtrlTriggerUserInfoField::GetMuBarTriggerDepUserInfo (void) const
+{
+  NS_ABORT_MSG_IF (m_triggerType != MU_BAR_TRIGGER, "Not a MU-BAR Trigger frame");
+
+  return m_muBarTriggerDependentUserInfo;
+}
+
+/***********************************
+ *       Trigger frame
+ ***********************************/
+
+NS_OBJECT_ENSURE_REGISTERED (CtrlTriggerHeader);
+
+CtrlTriggerHeader::CtrlTriggerHeader ()
+  : m_triggerType (0),
+    m_ulLength (0),
+    m_moreTF (false),
+    m_csRequired (false),
+    m_ulBandwidth (0),
+    m_giAndLtfType (0),
+    m_apTxPower (0),
+    m_ulSpatialReuse (0)
+{
+}
+
+CtrlTriggerHeader::CtrlTriggerHeader (TriggerFrameType type, const WifiTxVector& txVector)
+  : CtrlTriggerHeader ()
+{
+  m_triggerType = type;
+  SetUlBandwidth (txVector.GetChannelWidth ());
+  SetUlLength (txVector.GetLength ());
+  uint16_t gi = txVector.GetGuardInterval ();
+  if (gi == 800 || gi == 1600)
+    {
+      m_giAndLtfType = 1;
+    }
+  else
+    {
+      m_giAndLtfType = 2;
+    }
+  for (auto& userInfo : txVector.GetHeMuUserInfoMap ())
+    {
+      CtrlTriggerUserInfoField& ui = AddUserInfoField ();
+      ui.SetAid12 (userInfo.first);
+      ui.SetRuAllocation (userInfo.second.ru);
+      ui.SetUlMcs (userInfo.second.mcs.GetMcsValue ());
+      ui.SetSsAllocation (1, userInfo.second.nss); // MU-MIMO is not supported
+    }
+}
+
+CtrlTriggerHeader::~CtrlTriggerHeader ()
+{
+}
+
+CtrlTriggerHeader&
+CtrlTriggerHeader::operator= (const CtrlTriggerHeader& trigger)
+{
+  // check for self-assignment
+  if (&trigger == this)
+    {
+      return *this;
+    }
+
+  m_triggerType = trigger.m_triggerType;
+  m_ulLength = trigger.m_ulLength;
+  m_moreTF = trigger.m_moreTF;
+  m_csRequired = trigger.m_csRequired;
+  m_ulBandwidth = trigger.m_ulBandwidth;
+  m_giAndLtfType = trigger.m_giAndLtfType;
+  m_apTxPower = trigger.m_apTxPower;
+  m_ulSpatialReuse = trigger.m_ulSpatialReuse;
+  m_userInfoFields.clear ();
+  m_userInfoFields = trigger.m_userInfoFields;
+  return *this;
+}
+
+TypeId
+CtrlTriggerHeader::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::CtrlTriggerHeader")
+    .SetParent<Header> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<CtrlTriggerHeader> ()
+  ;
+  return tid;
+}
+
+TypeId
+CtrlTriggerHeader::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+void
+CtrlTriggerHeader::Print (std::ostream &os) const
+{
+  os << "TriggerType=" << GetTypeString () << ", Bandwidth=" << +GetUlBandwidth ()
+     << ", UL Length=" << m_ulLength;
+
+  for (auto& ui : m_userInfoFields)
+    {
+      ui.Print (os);
+    }
+}
+
+uint32_t
+CtrlTriggerHeader::GetSerializedSize (void) const
+{
+  uint32_t size = 0;
+  size += 8;  // Common Info (excluding Trigger Dependent Common Info)
+
+  // Add the size of the Trigger Dependent Common Info subfield
+  if (m_triggerType == GCR_MU_BAR_TRIGGER)
+    {
+      size += 4;
+    }
+
+  for (auto& ui : m_userInfoFields)
+    {
+      size += ui.GetSerializedSize ();
+    }
+
+  size += 2;  // Padding field
+
+  return size;
+}
+
+void
+CtrlTriggerHeader::Serialize (Buffer::Iterator start) const
+{
+  NS_ABORT_MSG_IF (m_triggerType == BFRP_TRIGGER, "BFRP Trigger frame is not supported");
+  NS_ABORT_MSG_IF (m_triggerType == GCR_MU_BAR_TRIGGER, "GCR-MU-BAR Trigger frame is not supported");
+  NS_ABORT_MSG_IF (m_triggerType == NFRP_TRIGGER, "NFRP Trigger frame is not supported");
+
+  Buffer::Iterator i = start;
+
+  uint64_t commonInfo = 0;
+  commonInfo |= (m_triggerType & 0x0f);
+  commonInfo |= (m_ulLength & 0x0fff) << 4;
+  commonInfo |= (m_moreTF ? 1 << 16 : 0);
+  commonInfo |= (m_csRequired ? 1 << 17 : 0);
+  commonInfo |= (m_ulBandwidth & 0x03) << 18;
+  commonInfo |= (m_giAndLtfType & 0x03) << 20;
+  commonInfo |= static_cast<uint64_t> (m_apTxPower & 0x3f) << 28;
+  commonInfo |= static_cast<uint64_t> (m_ulSpatialReuse) << 37;
+
+  i.WriteHtolsbU64 (commonInfo);
+
+  for (auto& ui : m_userInfoFields)
+    {
+      i = ui.Serialize (i);
+    }
+
+  i.WriteHtolsbU16 (0xffff);   // Padding field, used as delimiter
+}
+
+uint32_t
+CtrlTriggerHeader::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+
+  uint64_t commonInfo = i.ReadLsbtohU64 ();
+
+  m_triggerType = (commonInfo & 0x0f);
+  m_ulLength = (commonInfo >> 4) & 0x0fff;
+  m_moreTF = (commonInfo >> 16) & 0x01;
+  m_csRequired = (commonInfo >> 17) & 0x01;
+  m_ulBandwidth = (commonInfo >> 18) & 0x03;
+  m_giAndLtfType = (commonInfo >> 20) & 0x03;
+  m_apTxPower = (commonInfo >> 28) & 0x3f;
+  m_ulSpatialReuse = (commonInfo >> 37) & 0xffff;
+  m_userInfoFields.clear ();
+
+  NS_ABORT_MSG_IF (m_triggerType == BFRP_TRIGGER, "BFRP Trigger frame is not supported");
+  NS_ABORT_MSG_IF (m_triggerType == GCR_MU_BAR_TRIGGER, "GCR-MU-BAR Trigger frame is not supported");
+  NS_ABORT_MSG_IF (m_triggerType == NFRP_TRIGGER, "NFRP Trigger frame is not supported");
+
+  bool isPadding = false;
+
+  // We always add a Padding field (of two octets of all 1s) as delimiter
+  while (!isPadding)
+    {
+      // read the first 2 bytes to check if we encountered the Padding field
+      if (i.ReadU16 () == 0xffff)
+        {
+          isPadding = true;
+        }
+      else
+        {
+          // go back 2 bytes to deserialize the User Info field from the beginning
+          i.Prev (2);
+          CtrlTriggerUserInfoField& ui = AddUserInfoField ();
+          i = ui.Deserialize (i);
+        }
+    }
+
+  return i.GetDistanceFrom (start);
+}
+
+void
+CtrlTriggerHeader::SetType (TriggerFrameType type)
+{
+  m_triggerType = type;
+}
+
+TriggerFrameType
+CtrlTriggerHeader::GetType (void) const
+{
+  return static_cast<TriggerFrameType> (m_triggerType);
+}
+
+const char *
+CtrlTriggerHeader::GetTypeString (void) const
+{
+  return GetTypeString (GetType ());
+}
+
+const char *
+CtrlTriggerHeader::GetTypeString (TriggerFrameType type)
+{
+#define FOO(x) \
+case x: \
+  return # x; \
+  break;
+
+  switch (type)
+    {
+      FOO (BASIC_TRIGGER);
+      FOO (BFRP_TRIGGER);
+      FOO (MU_BAR_TRIGGER);
+      FOO (MU_RTS_TRIGGER);
+      FOO (BSRP_TRIGGER);
+      FOO (GCR_MU_BAR_TRIGGER);
+      FOO (BQRP_TRIGGER);
+      FOO (NFRP_TRIGGER);
+    default:
+      return "ERROR";
+    }
+#undef FOO
+}
+
+bool
+CtrlTriggerHeader::IsBasic (void) const
+{
+  return (m_triggerType == BASIC_TRIGGER);
+}
+
+bool
+CtrlTriggerHeader::IsBfrp (void) const
+{
+  return (m_triggerType == BFRP_TRIGGER);
+}
+
+bool
+CtrlTriggerHeader::IsMuBar (void) const
+{
+  return (m_triggerType == MU_BAR_TRIGGER);
+}
+
+bool
+CtrlTriggerHeader::IsMuRts (void) const
+{
+  return (m_triggerType == MU_RTS_TRIGGER);
+}
+
+bool
+CtrlTriggerHeader::IsBsrp (void) const
+{
+  return (m_triggerType == BSRP_TRIGGER);
+}
+
+bool
+CtrlTriggerHeader::IsGcrMuBar (void) const
+{
+  return (m_triggerType == GCR_MU_BAR_TRIGGER);
+}
+
+bool
+CtrlTriggerHeader::IsBqrp (void) const
+{
+  return (m_triggerType == BQRP_TRIGGER);
+}
+
+bool
+CtrlTriggerHeader::IsNfrp (void) const
+{
+  return (m_triggerType == NFRP_TRIGGER);
+}
+
+void
+CtrlTriggerHeader::SetUlLength (uint16_t len)
+{
+  m_ulLength = (len & 0x0fff);
+}
+
+uint16_t
+CtrlTriggerHeader::GetUlLength (void) const
+{
+  return m_ulLength;
+}
+
+WifiTxVector
+CtrlTriggerHeader::GetHeTbTxVector (uint16_t staId) const
+{
+  auto userInfoIt = FindUserInfoWithAid (staId);
+  NS_ASSERT (userInfoIt != end ());
+
+  WifiTxVector v;
+  v.SetPreambleType (WifiPreamble::WIFI_PREAMBLE_HE_TB);
+  v.SetChannelWidth (GetUlBandwidth ());
+  v.SetGuardInterval (GetGuardInterval ());
+  v.SetLength (GetUlLength ());
+  v.SetHeMuUserInfo (staId, {userInfoIt->GetRuAllocation (),
+                             HePhy::GetHeMcs (userInfoIt->GetUlMcs ()),
+                             userInfoIt->GetNss ()});
+  return v;
+}
+
+void
+CtrlTriggerHeader::SetMoreTF (bool more)
+{
+  m_moreTF = more;
+}
+
+bool
+CtrlTriggerHeader::GetMoreTF (void) const
+{
+  return m_moreTF;
+}
+
+void
+CtrlTriggerHeader::SetCsRequired (bool cs)
+{
+  m_csRequired = cs;
+}
+
+bool
+CtrlTriggerHeader::GetCsRequired (void) const
+{
+  return m_csRequired;
+}
+
+void
+CtrlTriggerHeader::SetUlBandwidth (uint16_t bw)
+{
+  switch (bw)
+    {
+    case 20:
+      m_ulBandwidth = 0;
+      break;
+    case 40:
+      m_ulBandwidth = 1;
+      break;
+    case 80:
+      m_ulBandwidth = 2;
+      break;
+    case 160:
+      m_ulBandwidth = 3;
+      break;
+    default:
+      NS_FATAL_ERROR ("Bandwidth value not allowed.");
+      break;
+    }
+}
+
+uint16_t
+CtrlTriggerHeader::GetUlBandwidth (void) const
+{
+  return (1 << m_ulBandwidth) * 20;
+}
+
+void
+CtrlTriggerHeader::SetGiAndLtfType (uint16_t guardInterval, uint8_t ltfType)
+{
+  if (ltfType == 1 && guardInterval == 1600)
+    {
+      m_giAndLtfType = 0;
+    }
+  else if (ltfType == 2 && guardInterval == 1600)
+    {
+      m_giAndLtfType = 1;
+    }
+  else if (ltfType == 4 && guardInterval == 3200)
+    {
+      m_giAndLtfType = 2;
+    }
+  else
+    {
+      NS_FATAL_ERROR ("Invalid combination of GI and LTF type");
+    }
+}
+
+uint16_t
+CtrlTriggerHeader::GetGuardInterval (void) const
+{
+  if (m_giAndLtfType == 0 || m_giAndLtfType == 1)
+    {
+      return 1600;
+    }
+  else if (m_giAndLtfType == 2)
+    {
+      return 3200;
+    }
+  else
+    {
+      NS_FATAL_ERROR ("Invalid value for GI And LTF Type subfield");
+    }
+}
+
+uint8_t
+CtrlTriggerHeader::GetLtfType (void) const
+{
+  if (m_giAndLtfType == 0)
+    {
+      return 1;
+    }
+  else if (m_giAndLtfType == 1)
+    {
+      return 2;
+    }
+  else if (m_giAndLtfType == 2)
+    {
+      return 4;
+    }
+  else
+    {
+      NS_FATAL_ERROR ("Invalid value for GI And LTF Type subfield");
+    }
+}
+
+void
+CtrlTriggerHeader::SetApTxPower (int8_t power)
+{
+  // see Table 9-25f "AP Tx Power subfield encoding" of 802.11ax amendment D3.0
+  NS_ABORT_MSG_IF (power < -20 || power > 40, "Out of range power values");
+
+  m_apTxPower = static_cast<uint8_t> (power + 20);
+}
+
+int8_t
+CtrlTriggerHeader::GetApTxPower (void) const
+{
+  // see Table 9-25f "AP Tx Power subfield encoding" of 802.11ax amendment D3.0
+  return static_cast<int8_t> (m_apTxPower) - 20;
+}
+
+void
+CtrlTriggerHeader::SetUlSpatialReuse (uint16_t sr)
+{
+  m_ulSpatialReuse = sr;
+}
+
+uint16_t
+CtrlTriggerHeader::GetUlSpatialReuse (void) const
+{
+  return m_ulSpatialReuse;
+}
+
+CtrlTriggerHeader
+CtrlTriggerHeader::GetCommonInfoField (void) const
+{
+  // make a copy of this Trigger Frame and remove the User Info fields from the copy
+  CtrlTriggerHeader trigger (*this);
+  trigger.m_userInfoFields.clear ();
+  return trigger;
+}
+
+CtrlTriggerUserInfoField&
+CtrlTriggerHeader::AddUserInfoField (void)
+{
+  m_userInfoFields.emplace_back (m_triggerType);
+  return m_userInfoFields.back ();
+}
+
+CtrlTriggerUserInfoField&
+CtrlTriggerHeader::AddUserInfoField (const CtrlTriggerUserInfoField& userInfo)
+{
+  NS_ABORT_MSG_IF (userInfo.GetType () != m_triggerType,
+                   "Trying to add a User Info field of a type other than the type of the Trigger Frame");
+  m_userInfoFields.push_back (userInfo);
+  return m_userInfoFields.back ();
+}
+
+CtrlTriggerHeader::ConstIterator
+CtrlTriggerHeader::begin (void) const
+{
+  return m_userInfoFields.begin ();
+}
+
+CtrlTriggerHeader::ConstIterator
+CtrlTriggerHeader::end (void) const
+{
+  return m_userInfoFields.end ();
+}
+
+CtrlTriggerHeader::Iterator
+CtrlTriggerHeader::begin (void)
+{
+  return m_userInfoFields.begin ();
+}
+
+CtrlTriggerHeader::Iterator
+CtrlTriggerHeader::end (void)
+{
+  return m_userInfoFields.end ();
+}
+
+std::size_t
+CtrlTriggerHeader::GetNUserInfoFields (void) const
+{
+  return m_userInfoFields.size ();
+}
+
+CtrlTriggerHeader::ConstIterator
+CtrlTriggerHeader::FindUserInfoWithAid (ConstIterator start, uint16_t aid12) const
+{
+  // the lambda function returns true if a User Info field has the AID12 subfield
+  // equal to the given aid12 value
+  return std::find_if (start, end (), [aid12] (const CtrlTriggerUserInfoField& ui) -> bool
+                                      { return (ui.GetAid12 () == aid12); });
+}
+
+CtrlTriggerHeader::ConstIterator
+CtrlTriggerHeader::FindUserInfoWithAid (uint16_t aid12) const
+{
+  return FindUserInfoWithAid (m_userInfoFields.begin (), aid12);
+}
+
+CtrlTriggerHeader::ConstIterator
+CtrlTriggerHeader::FindUserInfoWithRaRuAssociated (ConstIterator start) const
+{
+  return FindUserInfoWithAid (start, 0);
+}
+
+CtrlTriggerHeader::ConstIterator
+CtrlTriggerHeader::FindUserInfoWithRaRuAssociated (void) const
+{
+  return FindUserInfoWithAid (0);
+}
+
+CtrlTriggerHeader::ConstIterator
+CtrlTriggerHeader::FindUserInfoWithRaRuUnassociated (ConstIterator start) const
+{
+  return FindUserInfoWithAid (start, 2045);
+}
+
+CtrlTriggerHeader::ConstIterator
+CtrlTriggerHeader::FindUserInfoWithRaRuUnassociated (void) const
+{
+  return FindUserInfoWithAid (2045);
+}
+
+bool
+CtrlTriggerHeader::IsValid (void) const
+{
+  // check that allocated RUs do not overlap
+  // TODO This is not a problem in case of UL MU-MIMO
+  std::vector<HeRu::RuSpec> prevRus;
+
+  for (auto& ui : m_userInfoFields)
+    {
+      if (HeRu::DoesOverlap (GetUlBandwidth (), ui.GetRuAllocation (), prevRus))
+        {
+          return false;
+        }
+      prevRus.push_back (ui.GetRuAllocation ());
+    }
+  return true;
 }
 
 }  //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ctrl-headers.h ns-3.34/src/wifi/model/ctrl-headers.h
--- ns-3.33/src/wifi/model/ctrl-headers.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ctrl-headers.h	2021-07-14 10:31:07.000000000 -0700
@@ -21,11 +21,18 @@
 #ifndef CTRL_HEADERS_H
 #define CTRL_HEADERS_H
 
+#include <list>
+#include <vector>
 #include "ns3/header.h"
 #include "block-ack-type.h"
+#include "ns3/he-ru.h"
+#include "ns3/mac48-address.h"
 
 namespace ns3 {
 
+class WifiTxVector;
+enum AcIndex : uint8_t;
+
 /**
  * \ingroup wifi
  * \brief Headers for BlockAckRequest.
@@ -48,11 +55,12 @@
    * \return the object TypeId
    */
   static TypeId GetTypeId (void);
-  TypeId GetInstanceTypeId (void) const;
-  void Print (std::ostream &os) const;
-  uint32_t GetSerializedSize (void) const;
-  void Serialize (Buffer::Iterator start) const;
-  uint32_t Deserialize (Buffer::Iterator start);
+
+  TypeId GetInstanceTypeId (void) const override;
+  void Print (std::ostream &os) const override;
+  uint32_t GetSerializedSize (void) const override;
+  void Serialize (Buffer::Iterator start) const override;
+  uint32_t Deserialize (Buffer::Iterator start) override;
 
   /**
    * Enable or disable HT immediate Ack.
@@ -61,11 +69,11 @@
    */
   void SetHtImmediateAck (bool immediateAck);
   /**
-   * Set the block ack type.
+   * Set the BlockAckRequest type.
    *
-   * \param type the BA type
+   * \param type the BlockAckRequest type
    */
-  void SetType (BlockAckType type);
+  void SetType (BlockAckReqType type);
   /**
    * Set Traffic ID (TID).
    *
@@ -88,11 +96,11 @@
    */
   bool MustSendHtImmediateAck (void) const;
   /**
-   * Return the Block Ack type ID.
+   * Return the BlockAckRequest type.
    *
-   * \return the BA type
+   * \return the type of the BlockAckRequest
    */
-  BlockAckType GetType (void) const;
+  BlockAckReqType GetType (void) const;
   /**
    * Return the Traffic ID (TID).
    *
@@ -171,10 +179,10 @@
    * For now only non HT immediate BlockAck is implemented so this field
    * is here only for a future implementation of HT delayed variant.
    */
-  bool m_barAckPolicy;    ///< BAR Ack Policy
-  BlockAckType m_baType;  ///< BA type
-  uint16_t m_tidInfo;     ///< TID info
-  uint16_t m_startingSeq; ///< starting sequence number
+  bool m_barAckPolicy;       ///< bar ack policy
+  BlockAckReqType m_barType; ///< BAR type
+  uint16_t m_tidInfo;        ///< TID info
+  uint16_t m_startingSeq;    ///< starting seq
 };
 
 
@@ -219,18 +227,25 @@
    */
   void SetType (BlockAckType type);
   /**
-   * Set Traffic ID (TID).
+   * For Block Ack variants other than Multi-STA Block Ack, set the TID_INFO subfield
+   * of the BA Control field. For Multi-STA Block Acks, set the TID subfield of the
+   * AID TID Info subfield of the Per AID TID Info subfield identified by the given
+   * index.
    *
-   * \param tid the TID
+   * \param tid the traffic ID
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
    */
-  void SetTidInfo (uint8_t tid);
+  void SetTidInfo (uint8_t tid, std::size_t index = 0);
   /**
-   * Set the starting sequence number from the given
-   * raw sequence control field.
+   * For Block Ack variants other than Multi-STA Block Ack, set the starting sequence
+   * number to the given value. For Multi-STA Block Acks, set the starting sequence
+   * number in the Per AID TID Info subfield identified by the given index to the
+   * given value.
    *
-   * \param seq the raw sequence control
+   * \param seq the starting sequence number
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
    */
-  void SetStartingSequence (uint16_t seq);
+  void SetStartingSequence (uint16_t seq, std::size_t index = 0);
 
   /**
    * Check if the current Ack Policy is immediate.
@@ -246,17 +261,24 @@
    */
   BlockAckType GetType (void) const;
   /**
-   * Return the Traffic ID (TID).
+   * For Block Ack variants other than Multi-STA Block Ack, get the TID_INFO subfield
+   * of the BA Control field. For Multi-STA Block Acks, get the TID subfield of the
+   * AID TID Info subfield of the Per AID TID Info subfield identified by the given
+   * index.
    *
-   * \return TID
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+   * \return the Traffic ID
    */
-  uint8_t GetTidInfo (void) const;
+  uint8_t GetTidInfo (std::size_t index = 0) const;
   /**
-   * Return the starting sequence number.
+   * For Block Ack variants other than Multi-STA Block Ack, get the starting sequence
+   * number. For Multi-STA Block Acks, get the starting sequence number in the
+   * Per AID TID Info subfield identified by the given index.
    *
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
    * \return the starting sequence number
    */
-  uint16_t GetStartingSequence (void) const;
+  uint16_t GetStartingSequence (std::size_t index = 0) const;
   /**
    * Check if the current BA policy is Basic Block Ack.
    *
@@ -285,14 +307,90 @@
    *         false otherwise
    */
   bool IsMultiTid (void) const;
+  /**
+   * Check if the BlockAck frame variant is Multi-STA Block Ack.
+   *
+   * \return true if the BlockAck frame variant is Multi-STA Block Ack,
+   *         false otherwise
+   */
+  bool IsMultiSta (void) const;
 
   /**
-   * Set the bitmap that the packet with the given sequence
-   * number was received.
+   * For Multi-STA Block Acks, set the AID11 subfield of the Per AID TID Info
+   * subfield identified by the given index to the given value
    *
-   * \param seq the sequence number
+   * \param aid the AID11 value
+   * \param index the index of the Per AID TID Info subfield
+   */
+  void SetAid11 (uint16_t aid, std::size_t index);
+  /**
+   * For Multi-STA Block Acks, get the AID11 subfield of the Per AID TID Info
+   * subfield identified by the given index.
+   *
+   * \param index the index of the Per AID TID Info subfield
+   * \return the AID11 subfield
+   */
+  uint16_t GetAid11 (std::size_t index) const;
+  /**
+   * For Multi-STA Block Acks, set the Ack Type subfield of the Per AID TID Info
+   * subfield identified by the given index to the given value
+   *
+   * \param type the ack type value
+   * \param index the index of the Per AID TID Info subfield
+   */
+  void SetAckType (bool type, std::size_t index);
+  /**
+   * For Multi-STA Block Acks, get the Ack Type subfield of the Per AID TID Info
+   * subfield identified by the given index.
+   *
+   * \param index the index of the Per AID TID Info subfield
+   * \return the Ack Type
+   */
+  bool GetAckType (std::size_t index) const;
+  /**
+   * For Multi-STA Block Acks, set the RA subfield of the Per AID TID Info
+   * subfield (with AID11 subfield equal to 2045) identified by the given index
+   * to the given MAC address.
+   *
+   * \param ra the MAC address
+   * \param index the index of the Per AID TID Info subfield
+   */
+  void SetUnassociatedStaAddress (const Mac48Address& ra, std::size_t index);
+  /**
+   * For Multi-STA Block Acks, get the RA subfield of the Per AID TID Info
+   * subfield (with AID11 subfield equal to 2045) identified by the given index
+   * to the given MAC address.
+   *
+   * \param index the index of the Per AID TID Info subfield
+   * \return the MAC address stored in the RA subfield
+   */
+  Mac48Address GetUnassociatedStaAddress (std::size_t index) const;
+  /**
+   * For Multi-STA Block Acks, get the number of Per AID TID Info subfields
+   * included in this Block Ack.
+   *
+   * \return the number of Per AID TID Info subfields included in this Multi-STA Block Ack
    */
-  void SetReceivedPacket (uint16_t seq);
+  std::size_t GetNPerAidTidInfoSubfields (void) const;
+  /**
+   * For Multi-STA Block Acks, get the indices of the Per AID TID Info subfields
+   * carrying the given AID in the AID11 subfield.
+   *
+   * \param aid the given AID
+   * \return a vector containing the indices of the Per AID TID Info subfields
+   *         carrying the given AID in the AID11 subfield
+   */
+  std::vector<uint32_t> FindPerAidTidInfoWithAid (uint16_t aid) const;
+
+  /**
+   * Record in the bitmap that the packet with the given sequence number was
+   * received. For Multi-STA Block Acks, <i>index</i> identifies the Per AID
+   * TID Info subfield whose bitmap has to be updated.
+   *
+   * \param seq the sequence number of the received packet
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+   */
+  void SetReceivedPacket (uint16_t seq, std::size_t index = 0);
   /**
    * Set the bitmap that the packet with the given sequence
    * number and fragment number was received.
@@ -302,14 +400,16 @@
    */
   void SetReceivedFragment (uint16_t seq, uint8_t frag);
   /**
-   * Check if the packet with the given sequence number
-   * was acknowledged in this BlockAck response.
+   * Check if the packet with the given sequence number was acknowledged in this
+   * BlockAck response. For Multi-STA Block Acks, <i>index</i> identifies the
+   * Per AID TID Info subfield whose bitmap has to be checked.
    *
-   * \param seq the sequence number
+   * \param seq the sequence number to be checked
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
    * \return true if the packet with the given sequence number
    *         was ACKed in this BlockAck response, false otherwise
    */
-  bool IsPacketReceived (uint16_t seq) const;
+  bool IsPacketReceived (uint16_t seq, std::size_t index = 0) const;
   /**
    * Check if the packet with the given sequence number
    * and fragment number was acknowledged in this BlockAck response.
@@ -323,41 +423,40 @@
   bool IsFragmentReceived (uint16_t seq, uint8_t frag) const;
 
   /**
-   * Return the starting sequence control.
-   *
-   * \return the starting sequence control
-   */
-  uint16_t GetStartingSequenceControl (void) const;
-  /**
-   * Set the starting sequence control with the given
-   * sequence control value
+   * Return the value of the Starting Sequence Control subfield. For Multi-STA
+   * Block Acks, <i>index</i> identifies the Per AID TID Info subfield whose
+   * Starting Sequence Control subfield has to be returned.
+   *
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+   * \return the value of the Starting Sequence Control subfield
+   */
+  uint16_t GetStartingSequenceControl (std::size_t index = 0) const;
+  /**
+   * Set the Starting Sequence Control subfield with the given sequence control
+   * value. For Multi-STA Block Acks, <i>index</i> identifies the Per AID TID Info
+   * subfield whose Starting Sequence Control subfield has to be set.
    *
    * \param seqControl the raw sequence control value
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
    */
-  void SetStartingSequenceControl (uint16_t seqControl);
-  /**
-   * Return the bitmap from the BlockAck response header.
-   *
-   * \return the bitmap from the BlockAck response header
-   */
-  const uint16_t* GetBitmap (void) const;
-  /**
-   * Return the compressed bitmap from the BlockAck response header.
-   *
-   * \return the compressed bitmap from the BlockAck response header
-   */
-  uint64_t GetCompressedBitmap (void) const;
+  void SetStartingSequenceControl (uint16_t seqControl, std::size_t index = 0);
   /**
-   * Return the extended compressed bitmap from the BlockAck response header.
+   * Return a const reference to the bitmap from the BlockAck response header.
+   * For Multi-STA Block Acks, return a const reference to the bitmap included
+   * in the Per AID TID Info subfield identified by <i>index</i>.
    *
-   * \return the extended compressed bitmap from the BlockAck response header
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+   * \return a const reference to the bitmap from the BlockAck response header
    */
-  const uint64_t* GetExtendedCompressedBitmap (void) const;
+  const std::vector<uint8_t>& GetBitmap (std::size_t index = 0) const;
 
   /**
-   * Reset the bitmap to 0.
+   * Reset the bitmap to 0. For Multi-STA Block Acks, reset the bitmap included
+   * in the Per AID TID Info subfield identified by <i>index</i>.
+   *
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
    */
-  void ResetBitmap (void);
+  void ResetBitmap (std::size_t index = 0);
 
 
 private:
@@ -375,19 +474,23 @@
   void SetBaControl (uint16_t ba);
 
   /**
-   * Serialize bitmap to the given buffer.
+   * Serialize bitmap to the given buffer. For Multi-STA Block Acks, <i>index</i>
+   * identifies the Per AID TID Info subfield whose bitmap has to be serialized.
    *
-   * \param start the iterator
+   * \param start iterator pointing to the beginning of the buffer to write into.
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
    * \return Buffer::Iterator to the next available buffer
    */
-  Buffer::Iterator SerializeBitmap (Buffer::Iterator start) const;
+  Buffer::Iterator SerializeBitmap (Buffer::Iterator start, std::size_t index = 0) const;
   /**
-   * Deserialize bitmap from the given buffer.
+   * Deserialize bitmap from the given buffer. For Multi-STA Block Acks, <i>index</i>
+   * identifies the Per AID TID Info subfield whose bitmap has to be deserialized.
    *
-   * \param start the iterator
+   * \param start iterator pointing to the beginning of the buffer to read from.
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
    * \return Buffer::Iterator to the next available buffer
    */
-  Buffer::Iterator DeserializeBitmap (Buffer::Iterator start);
+  Buffer::Iterator DeserializeBitmap (Buffer::Iterator start, std::size_t index = 0);
 
   /**
    * This function is used to correctly index in both bitmap
@@ -396,6 +499,7 @@
    * for more details see 7.2.1.8 in IEEE 802.11n/D4.00
    *
    * \param seq the sequence number
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
    *
    * \return If we are using basic block ack, return value represents index of
    * block of 16 bits for packet having sequence number equals to <i>seq</i>.
@@ -403,16 +507,18 @@
    * to set to 1 in the compressed bitmap to indicate that packet having
    * sequence number equals to <i>seq</i> was correctly received.
    */
-  uint16_t IndexInBitmap (uint16_t seq) const;
+  uint16_t IndexInBitmap (uint16_t seq, std::size_t index = 0) const;
 
   /**
-   * Checks if sequence number <i>seq</i> can be acknowledged in the bitmap.
+   * Check if sequence number <i>seq</i> can be acknowledged in the bitmap. For
+   * Multi-STA Block Acks, check if sequence number <i>seq</i> can be acknowledged
+   * in the bitmap included in the Per AID TID Info subfield identified by <i>index</i>.
    *
    * \param seq the sequence number
-   *
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
    * \return true if the sequence number is concerned by the bitmap
    */
-  bool IsInBitmap (uint16_t seq) const;
+  bool IsInBitmap (uint16_t seq, std::size_t index = 0) const;
 
   /**
    * The LSB bit of the BA control field is used only for the
@@ -420,17 +526,736 @@
    * For now only non HT immediate block ack is implemented so this field
    * is here only for a future implementation of HT delayed variant.
    */
-  bool m_baAckPolicy;     ///< BA Ack Policy
-  BlockAckType m_baType;  ///< BA type
-  uint16_t m_tidInfo;     ///< TID info
-  uint16_t m_startingSeq; ///< starting sequence number
+  bool m_baAckPolicy;             ///< BA Ack Policy
+  BlockAckType m_baType;          ///< BA type
+  uint16_t m_tidInfo;             ///< TID info (reserved if Multi-STA Block Ack)
+
+  /**
+   * The following structure can hold the BA Information field for the Basic and
+   * Compressed variants, one instance of the {Per TID Info, Block Ack Starting
+   * Sequence Control, Block Ack Bitmap} subfields for the Multi-TID variant or
+   * one instance of the Per AID TID Info subfield for the Multi-STA variant
+   * (which includes the AID TID Info, Block Ack Starting Sequence Control and
+   * Block Ack Bitmap subfields).
+   */
+  struct BaInfoInstance
+    {
+      uint16_t m_aidTidInfo;          //!< Reserved for Basic and Compressed
+                                      //!< Per TID Info subfield for Multi-TID
+                                      //!< AID TID Info subfield for Multi-STA
+      uint16_t m_startingSeq;         //!< Block Ack Starting Sequence Control subfield
+      std::vector<uint8_t> m_bitmap;  //!< block ack bitmap
+      Mac48Address m_ra;              //!< RA subfield (address of an unassociated station)
+                                      //!< for Multi-STA; reserved for other variants
+    };
+
+  std::vector<BaInfoInstance> m_baInfo;    //!< BA Information field
+};
+
+
+/**
+ * \ingroup wifi
+ * The different Trigger frame types.
+ */
+enum TriggerFrameType : uint8_t
+{
+  BASIC_TRIGGER = 0,       // Basic
+  BFRP_TRIGGER = 1,        // Beamforming Report Poll
+  MU_BAR_TRIGGER = 2,      // Multi-User Block Ack Request
+  MU_RTS_TRIGGER = 3,      // Multi-User Request To Send
+  BSRP_TRIGGER = 4,        // Buffer Status Report Poll
+  GCR_MU_BAR_TRIGGER = 5,  // Groupcast with Retries MU-BAR
+  BQRP_TRIGGER = 6,        // Bandwidth Query Report Poll
+  NFRP_TRIGGER = 7         // NDP Feedback Report Poll
+};
+
+
+/**
+ * \ingroup wifi
+ * \brief User Info field of Trigger frames.
+ *
+ * Trigger frames, introduced by 802.11ax amendment (see Section 9.3.1.23 of D3.0),
+ * include one or more User Info fields, each of which carries information about the
+ * HE TB PPDU that the addressed station sends in response to the Trigger frame.
+ */
+class CtrlTriggerUserInfoField
+{
+public:
+  /**
+   * Constructor
+   *
+   * \param triggerType the Trigger frame type
+   */
+  CtrlTriggerUserInfoField (uint8_t triggerType);
+  /**
+   * Copy assignment operator.
+   *
+   * \param userInfo the User Info field to copy
+   * \return a reference to the copied object
+   *
+   * Checks that the given User Info fields is included in the same type
+   * of Trigger Frame.
+   */
+  CtrlTriggerUserInfoField& operator= (const CtrlTriggerUserInfoField& userInfo);
+  /**
+   * Destructor
+   */
+  ~CtrlTriggerUserInfoField ();
+  /**
+   * Print the content of this User Info field
+   *
+   * \param os output stream
+   */
+  void Print (std::ostream &os) const;
+  /**
+   * Get the expected size of this User Info field
+   *
+   * \return the expected size of this User Info field.
+   */
+  uint32_t GetSerializedSize (void) const;
+  /**
+   * Serialize the User Info field to the given buffer.
+   *
+   * \param start an iterator which points to where the header should
+   *        be written
+   * \return Buffer::Iterator to the next available buffer
+   */
+  Buffer::Iterator Serialize (Buffer::Iterator start) const;
+  /**
+   * Deserialize the User Info field from the given buffer.
+   *
+   * \param start an iterator which points to where the header should
+   *        read from
+   * \return Buffer::Iterator to the next available buffer
+   */
+  Buffer::Iterator Deserialize (Buffer::Iterator start);
+  /**
+   * Get the type of the Trigger Frame this User Info field belongs to.
+   *
+   * \return the type of the Trigger Frame this User Info field belongs to
+   */
+  TriggerFrameType GetType (void) const;
+  /**
+   * Set the AID12 subfield, which carries the 12 LSBs of the AID of the
+   * station for which this User Info field is intended. The whole AID can
+   * be passed, since the passed value is properly masked.
+   *
+   * \param aid the value for the AID12 subfield
+   */
+  void SetAid12 (uint16_t aid);
+  /**
+   * Get the value of the AID12 subfield.
+   *
+   * \return the AID12 subfield
+   */
+  uint16_t GetAid12 (void) const;
+  /**
+   * Check if this User Info field allocates a Random Access RU for stations
+   * associated with the AP that transmitted the Trigger frame.
+   *
+   * \return true if a Random Access RU for associated stations is allocated
+   */
+  bool HasRaRuForAssociatedSta (void) const;
+  /**
+   * Check if this User Info field allocates a Random Access RU for stations
+   * not associated with the AP that transmitted the Trigger frame.
+   *
+   * \return true if a Random Access RU for unassociated stations is allocated
+   */
+  bool HasRaRuForUnassociatedSta (void) const;
+  /**
+   * Set the RU Allocation subfield according to the specified RU.
+   *
+   * \param ru the RU this User Info field is allocating
+   */
+  void SetRuAllocation (HeRu::RuSpec ru);
+  /**
+   * Get the RU specified by the RU Allocation subfield.
+   *
+   * \return the RU this User Info field is allocating
+   */
+  HeRu::RuSpec GetRuAllocation (void) const;
+  /**
+   * Set the UL FEC Coding Type subfield, which indicates whether BCC or LDPC is used
+   *
+   * \param ldpc whether to use LDPC or not
+   */
+  void SetUlFecCodingType (bool ldpc);
+  /**
+   * Get the UL FEC Coding Type subfield, which indicates whether BCC or LDPC is used
+   *
+   * \return true if LDPC is used
+   */
+  bool GetUlFecCodingType (void) const;
+  /**
+   * Set the UL MCS subfield, which indicates the MCS of the solicited HE TB PPDU
+   *
+   * \param mcs the MCS index (a value between 0 and 11)
+   */
+  void SetUlMcs (uint8_t mcs);
+  /**
+   * Get the UL MCS subfield, which indicates the MCS of the solicited HE TB PPDU
+   *
+   * \return the MCS index (a value between 0 and 11)
+   */
+  uint8_t GetUlMcs (void) const;
+  /**
+   * Set the UL DCM subfield, which indicates whether or not DCM is used
+   *
+   * \param dcm whether to use DCM or not
+   */
+  void SetUlDcm (bool dcm);
+  /**
+   * Get the UL DCM subfield, which indicates whether or not DCM is used
+   *
+   * \return true if DCM is used
+   */
+  bool GetUlDcm (void) const;
+  /**
+   * Set the SS Allocation subfield, which is present when the AID12 subfield
+   * is neither 0 nor 2045. This method must be called after setting the AID12
+   * subfield to a value other than 0 and 2045.
+   *
+   * \param startingSs the starting spatial stream (a value from 1 to 8)
+   * \param nSs the number of spatial streams (a value from 1 to 8)
+   */
+  void SetSsAllocation (uint8_t startingSs, uint8_t nSs);
+  /**
+   * Get the starting spatial stream.
+   *
+   * \return the starting spatial stream (a value between 1 and 8)
+   */
+  uint8_t GetStartingSs (void) const;
+  /**
+   * Get the number of spatial streams.
+   *
+   * \return the number of spatial streams (a value between 1 and 8)
+   */
+  uint8_t GetNss (void) const;
+  /**
+   * Set the RA-RU Information subfield, which is present when the AID12 subfield
+   * is 0 or 2045. This method must be called after setting the AID12 subfield to
+   * 0 or 2045.
+   *
+   * \param nRaRu the number (from 1 to 32) of contiguous RUs allocated for Random Access.
+   * \param moreRaRu whether RA-RUs are allocated in subsequent Trigger frames
+   */
+  void SetRaRuInformation (uint8_t nRaRu, bool moreRaRu);
+  /**
+   * Get the number of contiguous RUs for Random Access. This method can only be
+   * called if the AID12 subfield has been set to 0 or 2045
+   *
+   * \return the number of contiguous RA-RUs (a value between 1 and 32)
+   */
+  uint8_t GetNRaRus (void) const;
+  /**
+   * Return true if more RA-RUs are allocated in subsequent Trigger frames
+   * that are sent before the end of the current TXOP. This method can only be
+   * called if the AID12 subfield has been set to 0 or 2045
+   *
+   * \return true if more RA-RUs are allocated in subsequent Trigger frames
+   */
+  bool GetMoreRaRu (void) const;
+  /**
+   * Set the UL Target RSSI subfield to indicate to the station to transmit an
+   * HE TB PPDU response at its maximum transmit power for the assigned MCS
+   */
+  void SetUlTargetRssiMaxTxPower (void);
+  /**
+   * Set the UL Target RSSI subfield to indicate the expected receive signal
+   * power in dBm
+   *
+   * \param dBm the expected receive signal power (a value between -110 and -20)
+   */
+  void SetUlTargetRssi (int8_t dBm);
+  /**
+   * Return true if the UL Target RSSI subfield indicates to the station to transmit
+   * an HE TB PPDU response at its maximum transmit power for the assigned MCS
+   *
+   * \return true if the UL Target RSSI subfield indicates to the station to transmit
+   * an HE TB PPDU response at its maximum transmit power for the assigned MCS
+   */
+  bool IsUlTargetRssiMaxTxPower (void) const;
+  /**
+   * Get the expected receive signal power for the solicited HE TB PPDU. This
+   * method can only be called if IsUlTargetRssiMaxTxPower returns false.
+   *
+   * \return the expected receive signal power in dBm
+   */
+  int8_t GetUlTargetRssi (void) const;
+  /**
+   * Set the Trigger Dependent User Info subfield for Basic Trigger frames.
+   *
+   * \param spacingFactor the MPDU MU spacing factor
+   * \param tidLimit the value for the TID Aggregation Limit subfield
+   * \param prefAc the lowest AC recommended for aggregation of MPDUs
+   */
+  void SetBasicTriggerDepUserInfo (uint8_t spacingFactor, uint8_t tidLimit, AcIndex prefAc);
+  /**
+   * Get the MPDU MU spacing factor. This method can only be called if this
+   * User Info field is included in a Basic Trigger frame.
+   *
+   * \return the MPDU MU spacing factor
+   */
+  uint8_t GetMpduMuSpacingFactor (void) const;
+  /**
+   * Get the TID Aggregation Limit. This method can only be called if this
+   * User Info field is included in a Basic Trigger frame.
+   *
+   * \return the TID Aggregation Limit
+   */
+  uint8_t GetTidAggregationLimit (void) const;
+  /**
+   * Get the Preferred AC subfield. This method can only be called if this
+   * User Info field is included in a Basic Trigger frame.
+   *
+   * \return the Preferred AC subfield
+   */
+  AcIndex GetPreferredAc (void) const;
+  /**
+   * Set the Trigger Dependent User Info subfield for the MU-BAR variant of
+   * Trigger frames, which includes a BAR Control subfield and a BAR Information
+   * subfield. The BAR Control subfield must indicate either a Compressed
+   * BlockAckReq variant or a Multi-TID BlockAckReq variant.
+   *
+   * \param bar the BlockAckRequest header object including the BAR Control
+   *            subfield and the BAR Information subfield
+   */
+  void SetMuBarTriggerDepUserInfo (const CtrlBAckRequestHeader& bar);
+  /**
+   * Get the Trigger Dependent User Info subfield for the MU-BAR variant of
+   * Trigger frames, which includes a BAR Control subfield and a BAR Information
+   * subfield. The BAR Control subfield must indicate either a Compressed
+   * BlockAckReq variant or a Multi-TID BlockAckReq variant.
+   *
+   * \return the BlockAckRequest header object including the BAR Control
+   *         subfield and the BAR Information subfield
+   */
+   const CtrlBAckRequestHeader& GetMuBarTriggerDepUserInfo (void) const;
 
+private:
+  uint16_t m_aid12;   //!< Association ID of the addressed station
+  uint8_t m_ruAllocation;   //!< RU Allocation
+  bool m_ulFecCodingType;   //!< UL FEC Coding Type
+  uint8_t m_ulMcs;   //!< MCS to be used by the addressed station
+  bool m_ulDcm;   //!< whether or not to use Dual Carrier Modulation
   union
   {
-    uint16_t m_bitmap[64]; ///< the basic BlockAck bitmap
-    uint64_t m_compressedBitmap; ///< the compressed BlockAck bitmap
-    uint64_t m_extendedCompressedBitmap[4]; ///< the extended compressed BlockAck bitmap
-  } bitmap; ///< bitmap union type
+    struct
+    {
+      uint8_t startingSs;   //!< Starting spatial stream
+      uint8_t nSs;   //!< Number of spatial streams
+    } ssAllocation;   //!< Used when AID12 is neither 0 nor 2045
+    struct
+    {
+      uint8_t nRaRu;   //!< Number of Random Access RUs
+      bool moreRaRu;   //!< More RA-RU in subsequent Trigger frames
+    } raRuInformation;   //!< Used when AID12 is 0 or 2045
+  } m_bits26To31;   //!< Fields occupying bits 26-31 in the User Info field
+  uint8_t m_ulTargetRssi;   //!< Expected receive signal power
+  uint8_t m_triggerType; //!< Trigger frame type
+  uint8_t m_basicTriggerDependentUserInfo;   //!< Basic Trigger variant of Trigger Dependent User Info subfield
+  CtrlBAckRequestHeader m_muBarTriggerDependentUserInfo;   //!< MU-BAR variant of Trigger Dependent User Info subfield
+};
+
+
+/**
+ * \ingroup wifi
+ * \brief Headers for Trigger frames.
+ *
+ * 802.11ax amendment defines eight types of Trigger frames (see Section 9.3.1.23 of D3.0):
+ *   - Basic
+ *   - Beamforming Report Poll (BFRP)
+ *   - Multi-User Block Ack Request (MU-BAR)
+ *   - Multi-User Request To Send (MU-RTS)
+ *   - Buffer Status Report Poll (BSRP)
+ *   - Groupcast with Retries (GCR) MU-BAR
+ *   - Bandwidth Query Report Poll (BQRP)
+ *   - NDP Feedback Report Poll (NFRP)
+ * For now only the Basic, MU-BAR, MU-RTS, BSRP and BQRP variants are supported.
+ * Basic Trigger is also the default variant.
+ *
+ * The Padding field is optional, given that other techniques (post-EOF A-MPDU
+ * padding, aggregating other MPDUs in the A-MPDU) are available to satisfy the
+ * minimum time requirement. Currently, however, a Padding field of the minimum
+ * length (2 octets) is appended to every Trigger frame that is transmitted. In
+ * such a way, deserialization stops when a User Info field with the AID12 subfield
+ * set to 4095 (which indicates the start of a Padding field) is encountered.
+ */
+class CtrlTriggerHeader : public Header
+{
+public:
+  CtrlTriggerHeader ();
+  /**
+   * \brief Constructor
+   *
+   * Construct a Trigger Frame of the given type from the values stored in the
+   * given TX vector. In particular:
+   *   - the UL Bandwidth, UL Length and GI And LTF Type subfields of the Common Info
+   *     field are set based on the values stored in the TX vector;
+   *   - as many User Info fields as the number of entries in the HeMuUserInfoMap
+   *     of the TX vector are added to the Trigger Frame. The AID12, RU Allocation,
+   *     UL MCS and SS Allocation subfields of each User Info field are set based
+   *     on the values stored in the corresponding entry of the HeMuUserInfoMap.
+   *
+   * \param type the Trigger frame type
+   * \param txVector the TX vector used to build this Trigger Frame
+   */
+  CtrlTriggerHeader (TriggerFrameType type, const WifiTxVector& txVector);
+  ~CtrlTriggerHeader ();
+  /**
+   * Copy assignment operator.
+   *
+   * \param trigger the Trigger frame to copy
+   * \return a reference to the copied object
+   *
+   * Ensure that the type of this Trigger Frame is set to the type of the given
+   * Trigger Frame before copying the User Info fields.
+   */
+  CtrlTriggerHeader& operator= (const CtrlTriggerHeader& trigger);
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  TypeId GetInstanceTypeId (void) const;
+  void Print (std::ostream &os) const;
+  uint32_t GetSerializedSize (void) const;
+  void Serialize (Buffer::Iterator start) const;
+  uint32_t Deserialize (Buffer::Iterator start);
+
+  /**
+   * Set the Trigger frame type.
+   *
+   * \param type the Trigger frame type
+   */
+  void SetType (TriggerFrameType type);
+  /**
+   * Get the Trigger Frame type.
+   *
+   * \return the Trigger Frame type
+   */
+  TriggerFrameType GetType (void) const;
+  /**
+   * Return a string corresponding to the Trigger Frame type.
+   *
+   * \returns a string corresponding to the Trigger Frame type.
+   */
+  const char * GetTypeString (void) const;
+  /**
+   * Return a string corresponding to the given Trigger Frame type.
+   *
+   * \param type the Trigger Frame type
+   * \returns a string corresponding to the Trigger Frame type.
+   */
+  static const char * GetTypeString (TriggerFrameType type);
+  /**
+   * Check if this is a Basic Trigger frame.
+   *
+   * \return true if this is a Basic Trigger frame,
+   *         false otherwise
+   */
+  bool IsBasic (void) const;
+  /**
+   * Check if this is a Beamforming Report Poll Trigger frame.
+   *
+   * \return true if this is a Beamforming Report Poll Trigger frame,
+   *         false otherwise
+   */
+  bool IsBfrp (void) const;
+  /**
+   * Check if this is a MU-BAR Trigger frame.
+   *
+   * \return true if this is a MU-BAR Trigger frame,
+   *         false otherwise
+   */
+  bool IsMuBar (void) const;
+  /**
+   * Check if this is a MU-RTS Trigger frame.
+   *
+   * \return true if this is a MU-RTS Trigger frame,
+   *         false otherwise
+   */
+  bool IsMuRts (void) const;
+  /**
+   * Check if this is a Buffer Status Report Poll Trigger frame.
+   *
+   * \return true if this is a Buffer Status Report Poll Trigger frame,
+   *         false otherwise
+   */
+  bool IsBsrp (void) const;
+  /**
+   * Check if this is a Groupcast with Retries (GCR) MU-BAR Trigger frame.
+   *
+   * \return true if this is a Groupcast with Retries (GCR) MU-BAR Trigger frame,
+   *         false otherwise
+   */
+  bool IsGcrMuBar (void) const;
+  /**
+   * Check if this is a Bandwidth Query Report Poll Trigger frame.
+   *
+   * \return true if this is a Bandwidth Query Report Poll Trigger frame,
+   *         false otherwise
+   */
+  bool IsBqrp (void) const;
+  /**
+   * Check if this is a NDP Feedback Report Poll Trigger frame.
+   *
+   * \return true if this is a NDP Feedback Report Poll Trigger frame,
+   *         false otherwise
+   */
+  bool IsNfrp (void) const;
+  /**
+   * Set the UL Length subfield of the Common Info field.
+   *
+   * \param len the value for the UL Length subfield
+   */
+  void SetUlLength (uint16_t len);
+  /**
+   * Get the UL Length subfield of the Common Info field.
+   *
+   * \return the UL Length subfield
+   */
+  uint16_t GetUlLength (void) const;
+  /**
+   * Get the TX vector that the station with the given STA-ID will use to send
+   * the HE TB PPDU solicited by this Trigger Frame. Note that the TX power
+   * level is not set by this method.
+   *
+   * \param staId the STA-ID of a station addressed by this Trigger Frame
+   * \return the TX vector of the solicited HE TB PPDU
+   */
+  WifiTxVector GetHeTbTxVector (uint16_t staId) const;
+  /**
+   * Set the More TF subfield of the Common Info field.
+   *
+   * \param more the value for the More TF subfield
+   */
+  void SetMoreTF (bool more);
+  /**
+   * Get the More TF subfield of the Common Info field.
+   *
+   * \return the More TF subfield
+   */
+  bool GetMoreTF (void) const;
+  /**
+   * Set the CS Required subfield of the Common Info field.
+   *
+   * \param cs the value for the CS Required subfield
+   */
+  void SetCsRequired (bool cs);
+  /**
+   * Get the CS Required subfield of the Common Info field.
+   *
+   * \return the CS Required subfield
+   */
+  bool GetCsRequired (void) const;
+  /**
+   * Set the bandwidth of the solicited HE TB PPDU.
+   *
+   * \param bw bandwidth (allowed values: 20, 40, 80, 160)
+   */
+  void SetUlBandwidth (uint16_t bw);
+  /**
+   * Get the bandwidth of the solicited HE TB PPDU.
+   *
+   * \return the bandwidth (20, 40, 80 or 160)
+   */
+  uint16_t GetUlBandwidth (void) const;
+  /**
+   * Set the GI And LTF Type subfield of the Common Info field.
+   * Allowed combinations are:
+   *   - 1x LTF + 1.6us GI
+   *   - 2x LTF + 1.6us GI
+   *   - 4x LTF + 3.2us GI
+   *
+   * \param guardInterval the guard interval duration (in nanoseconds)
+   * \param ltfType the HE-LTF type (1, 2 or 4)
+   */
+  void SetGiAndLtfType (uint16_t guardInterval, uint8_t ltfType);
+  /**
+   * Get the guard interval duration (in nanoseconds) of the solicited HE TB PPDU.
+   *
+   * \return the guard interval duration (in nanoseconds) of the solicited HE TB PPDU
+   */
+  uint16_t GetGuardInterval (void) const;
+  /**
+   * Get the LTF type of the solicited HE TB PPDU.
+   *
+   * \return the LTF type of the solicited HE TB PPDU
+   */
+  uint8_t GetLtfType (void) const;
+  /**
+   * Set the AP TX Power subfield of the Common Info field.
+   *
+   * \param power the value (from -20 to 40) for the AP TX Power (dBm)
+   */
+  void SetApTxPower (int8_t power);
+  /**
+   * Get the power value (dBm) indicated by the AP TX Power subfield of the
+   * Common Info field.
+   *
+   * \return the AP TX Power (dBm) per 20 MHz
+   */
+  int8_t GetApTxPower (void) const;
+  /**
+   * Set the UL Spatial Reuse subfield of the Common Info field.
+   *
+   * \param sr the value for the UL Spatial Reuse subfield
+   */
+  void SetUlSpatialReuse (uint16_t sr);
+  /**
+   * Get the UL Spatial Reuse subfield of the Common Info field.
+   *
+   * \return the UL Spatial Reuse subfield
+   */
+  uint16_t GetUlSpatialReuse (void) const;
+  /**
+   * Get a copy of the Common Info field of this Trigger frame.
+   * Note that the User Info fields are excluded.
+   *
+   * \return a Trigger frame including a copy of the Common Info field of this frame.
+   */
+  CtrlTriggerHeader GetCommonInfoField (void) const;
+
+  /**
+   * Append a new User Info field to this Trigger frame and return
+   * a non-const reference to it. Make sure to call this method after
+   * setting the type of the Trigger frame.
+   *
+   * \return a non-const reference to the newly added User Info field
+   */
+  CtrlTriggerUserInfoField& AddUserInfoField (void);
+  /**
+   * Append the given User Info field to this Trigger frame and return
+   * a non-const reference to it. Make sure that the type of the given
+   * User Info field matches the type of this Trigger Frame.
+   *
+   * \param userInfo the User Info field to append to this Trigger Frame
+   * \return a non-const reference to the newly added User Info field
+   */
+  CtrlTriggerUserInfoField& AddUserInfoField (const CtrlTriggerUserInfoField& userInfo);
+
+  /// User Info fields list const iterator
+  typedef std::list<CtrlTriggerUserInfoField>::const_iterator ConstIterator;
+
+  /// User Info fields list iterator
+  typedef std::list<CtrlTriggerUserInfoField>::iterator Iterator;
+
+  /**
+   * \brief Get a const iterator pointing to the first User Info field in the list.
+   *
+   * \return a const iterator pointing to the first User Info field in the list
+   */
+  ConstIterator begin (void) const;
+  /**
+   * \brief Get a const iterator indicating past-the-last User Info field in the list.
+   *
+   * \return a const iterator indicating past-the-last User Info field in the list
+   */
+  ConstIterator end (void) const;
+  /**
+   * \brief Get an iterator pointing to the first User Info field in the list.
+   *
+   * \return an iterator pointing to the first User Info field in the list
+   */
+  Iterator begin (void);
+  /**
+   * \brief Get an iterator indicating past-the-last User Info field in the list.
+   *
+   * \return an iterator indicating past-the-last User Info field in the list
+   */
+  Iterator end (void);
+  /**
+   * \brief Get the number of User Info fields in this Trigger Frame.
+   *
+   * \return the number of User Info fields in this Trigger Frame
+   */
+  std::size_t GetNUserInfoFields (void) const;
+  /**
+   * Get a const iterator pointing to the first User Info field found (starting from
+   * the one pointed to by the given iterator) whose AID12 subfield is set to
+   * the given value.
+   *
+   * \param start a const iterator pointing to the User Info field to start the search from
+   * \param aid12 the value of the AID12 subfield to match
+   * \return a const iterator pointing to the User Info field matching the specified
+   * criterion, if any, or an iterator indicating past-the-last User Info field.
+   */
+  ConstIterator FindUserInfoWithAid (ConstIterator start, uint16_t aid12) const;
+  /**
+   * Get a const iterator pointing to the first User Info field found whose AID12
+   * subfield is set to the given value.
+   *
+   * \param aid12 the value of the AID12 subfield to match
+   * \return a const iterator pointing to the User Info field matching the specified
+   * criterion, if any, or an iterator indicating past-the-last User Info field.
+   */
+  ConstIterator FindUserInfoWithAid (uint16_t aid12) const;
+  /**
+   * Get a const iterator pointing to the first User Info field found (starting from
+   * the one pointed to by the given iterator) which allocates a Random Access
+   * RU for associated stations.
+   *
+   * \param start a const iterator pointing to the User Info field to start the search from
+   * \return a const iterator pointing to the User Info field matching the specified
+   * criterion, if any, or an iterator indicating past-the-last User Info field.
+   */
+  ConstIterator FindUserInfoWithRaRuAssociated (ConstIterator start) const;
+  /**
+   * Get a const iterator pointing to the first User Info field found which allocates
+   * a Random Access RU for associated stations.
+   *
+   * \return a const iterator pointing to the User Info field matching the specified
+   * criterion, if any, or an iterator indicating past-the-last User Info field.
+   */
+  ConstIterator FindUserInfoWithRaRuAssociated (void) const;
+  /**
+   * Get a const iterator pointing to the first User Info field found (starting from
+   * the one pointed to by the given iterator) which allocates a Random Access
+   * RU for unassociated stations.
+   *
+   * \param start a const iterator pointing to the User Info field to start the search from
+   * \return a const iterator pointing to the User Info field matching the specified
+   * criterion, if any, or an iterator indicating past-the-last User Info field.
+   */
+  ConstIterator FindUserInfoWithRaRuUnassociated (ConstIterator start) const;
+  /**
+   * Get a const iterator pointing to the first User Info field found which allocates
+   * a Random Access RU for unassociated stations.
+   *
+   * \return a const iterator pointing to the User Info field matching the specified
+   * criterion, if any, or an iterator indicating past-the-last User Info field.
+   */
+  ConstIterator FindUserInfoWithRaRuUnassociated (void) const;
+  /**
+   * Check the validity of this Trigger frame.
+   * TODO Implement the checks listed in Section 27.5.3.2.3 of 802.11ax amendment
+   * D3.0 (Allowed settings of the Trigger frame fields and TRS Control subfield).
+   *
+   * This function shall be invoked before transmitting and upon receiving
+   * a Trigger frame.
+   *
+   * \return true if the Trigger frame is valid, false otherwise.
+   */
+  bool IsValid (void) const;
+
+private:
+  /**
+   * Common Info field
+   */
+  uint8_t m_triggerType;       //!< Trigger type
+  uint16_t m_ulLength;         //!< Value for the L-SIG Length field
+  bool m_moreTF;               //!< True if a subsequent Trigger frame follows
+  bool m_csRequired;           //!< Carrier Sense required
+  uint8_t m_ulBandwidth;       //!< UL BW subfield
+  uint8_t m_giAndLtfType;      //!< GI And LTF Type subfield
+  uint8_t m_apTxPower;         //!< Tx Power used by AP to transmit the Trigger Frame
+  uint16_t m_ulSpatialReuse;   //!< Value for the Spatial Reuse field in HE-SIG-A
+  /**
+   * List of User Info fields
+   */
+  std::list<CtrlTriggerUserInfoField> m_userInfoFields;   //!< list of User Info fields
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/dsss-error-rate-model.cc ns-3.34/src/wifi/model/dsss-error-rate-model.cc
--- ns-3.33/src/wifi/model/dsss-error-rate-model.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/dsss-error-rate-model.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,175 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 The Boeing Company
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Gary Pei <guangyu.pei@boeing.com>
- */
-
-#include "ns3/log.h"
-#include "dsss-error-rate-model.h"
-#include <cmath>
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("DsssErrorRateModel");
-
-#ifndef HAVE_GSL
-const double DsssErrorRateModel::WLAN_SIR_PERFECT = 10.0;
-const double DsssErrorRateModel::WLAN_SIR_IMPOSSIBLE = 0.1;
-#endif
-
-double
-DsssErrorRateModel::DqpskFunction (double x)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  return ((std::sqrt (2.0) + 1.0) / std::sqrt (8.0 * M_PI * std::sqrt (2.0)))
-         * (1.0 / std::sqrt (x)) * std::exp ( -(2.0 - std::sqrt (2.0)) * x);
-}
-
-double
-DsssErrorRateModel::GetDsssDbpskSuccessRate (double sinr, uint64_t nbits)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  double EbN0 = sinr * 22000000.0 / 1000000.0; //1 bit per symbol with 1 MSPS
-  double ber = 0.5 * std::exp (-EbN0);
-  return std::pow ((1.0 - ber), static_cast<double> (nbits));
-}
-
-double
-DsssErrorRateModel::GetDsssDqpskSuccessRate (double sinr, uint64_t nbits)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  double EbN0 = sinr * 22000000.0 / 1000000.0 / 2.0; //2 bits per symbol, 1 MSPS
-  double ber = DqpskFunction (EbN0);
-  return std::pow ((1.0 - ber), static_cast<double> (nbits));
-}
-
-double
-DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (double sinr, uint64_t nbits)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-#ifdef HAVE_GSL
-  //symbol error probability
-  double EbN0 = sinr * 22000000.0 / 1375000.0 / 4.0;
-  double sep = SymbolErrorProb16Cck (4.0 * EbN0 / 2.0);
-  return std::min (1.0, std::pow (1.0 - sep, nbits / 4.0));
-#else
-  NS_LOG_WARN ("Running a 802.11b CCK Matlab model less accurate than GSL model");
-  //The Matlab model
-  double ber;
-  if (sinr > WLAN_SIR_PERFECT)
-    {
-      ber = 0.0;
-    }
-  else if (sinr < WLAN_SIR_IMPOSSIBLE)
-    {
-      ber = 0.5;
-    }
-  else
-    {
-      //fitprops.coeff from Matlab berfit
-      double a1 = 5.3681634344056195e-001;
-      double a2 = 3.3092430025608586e-003;
-      double a3 = 4.1654372361004000e-001;
-      double a4 = 1.0288981434358866e+000;
-      ber = a1 * std::exp (-std::pow ((sinr - a2) / a3, a4));
-    }
-  return std::min (1.0, std::pow ((1.0 - ber), static_cast<double> (nbits)));
-#endif
-}
-
-double
-DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (double sinr, uint64_t nbits)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-#ifdef HAVE_GSL
-  NS_LOG_DEBUG ("GSL enabled ");
-  //symbol error probability
-  double EbN0 = sinr * 22000000.0 / 1375000.0 / 8.0;
-  double sep = SymbolErrorProb256Cck (8.0 * EbN0 / 2.0);
-  return std::min (1.0, std::pow (1.0 - sep, nbits / 8.0));
-#else
-  NS_LOG_WARN ("Running a 802.11b CCK Matlab model less accurate than GSL model");
-  //The Matlab model
-  double ber;
-  if (sinr > WLAN_SIR_PERFECT)
-    {
-      ber = 0.0;
-    }
-  else if (sinr < WLAN_SIR_IMPOSSIBLE)
-    {
-      ber = 0.5;
-    }
-  else
-    {
-      //fitprops.coeff from Matlab berfit
-      double a1 = 7.9056742265333456e-003;
-      double a2 = -1.8397449399176360e-001;
-      double a3 = 1.0740689468707241e+000;
-      double a4 = 1.0523316904502553e+000;
-      double a5 = 3.0552298746496687e-001;
-      double a6 = 2.2032715128698435e+000;
-      ber =  (a1 * sinr * sinr + a2 * sinr + a3) / (sinr * sinr * sinr + a4 * sinr * sinr + a5 * sinr + a6);
-    }
-  return std::min (1.0, std::pow ((1.0 - ber), static_cast<double> (nbits)));
-#endif
-}
-
-#ifdef HAVE_GSL
-double
-IntegralFunction (double x, void *params)
-{
-  double beta = ((FunctionParameters *) params)->beta;
-  double n = ((FunctionParameters *) params)->n;
-  double IntegralFunction = std::pow (2 * gsl_cdf_ugaussian_P (x + beta) - 1, n - 1)
-    * std::exp (-x * x / 2.0) / std::sqrt (2.0 * M_PI);
-  return IntegralFunction;
-}
-
-double
-DsssErrorRateModel::SymbolErrorProb16Cck (double e2)
-{
-  double sep;
-  double error;
-
-  FunctionParameters params;
-  params.beta = std::sqrt (2.0 * e2);
-  params.n = 8.0;
-
-  gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);
-
-  gsl_function F;
-  F.function = &IntegralFunction;
-  F.params = &params;
-
-  gsl_integration_qagiu (&F,-params.beta, 0, 1e-7, 1000, w, &sep, &error);
-  gsl_integration_workspace_free (w);
-  if (error == 0.0)
-    {
-      sep = 1.0;
-    }
-
-  return 1.0 - sep;
-}
-
-double DsssErrorRateModel::SymbolErrorProb256Cck (double e1)
-{
-  return 1.0 - std::pow (1.0 - SymbolErrorProb16Cck (e1 / 2.0), 2.0);
-}
-
-#endif
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/dsss-error-rate-model.h ns-3.34/src/wifi/model/dsss-error-rate-model.h
--- ns-3.33/src/wifi/model/dsss-error-rate-model.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/dsss-error-rate-model.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,142 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 The Boeing Company
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Gary Pei <guangyu.pei@boeing.com>
- */
-
-#ifndef DSS_ERROR_RATE_MODEL_H
-#define DSS_ERROR_RATE_MODEL_H
-
-#ifdef HAVE_GSL
-#include <gsl/gsl_math.h>
-#include <gsl/gsl_integration.h>
-#include <gsl/gsl_cdf.h>
-#include <gsl/gsl_sf_bessel.h>
-#endif
-
-namespace ns3 {
-
-#ifdef HAVE_GSL
-/**
- * Structure for integral function parameters
- */
-typedef struct FunctionParameterType
-{
-  double beta; ///< Beta parameter
-  double n;    ///< n parameter
-} FunctionParameters;
-
-/**
- * Integral function using GSL library
- *
- * \param x the input x variable
- * \param params a pointer to FunctionParameters struct
- *
- * \return the integral function
- */
-double IntegralFunction (double x, void *params);
-#endif
-
-/**
- * \brief an implementation of DSSS error rate model
- * \ingroup wifi
- *
- * The 802.11b modulations:
- *    - 1 Mbps mode is based on DBPSK. BER is from equation 5.2-69 from John G. Proakis
- *      Digital Communications, 2001 edition
- *    - 2 Mbps model is based on DQPSK. Equation 8 from "Tight bounds and accurate
- *      approximations for DQPSK transmission bit error rate", G. Ferrari and G.E. Corazza
- *      ELECTRONICS LETTERS, 40(20):1284-1285, September 2004
- *    - 5.5 Mbps and 11 Mbps are based on equations (18) and (17) from "Properties and
- *      performance of the IEEE 802.11b complementarycode-key signal sets",
- *      Michael B. Pursley and Thomas C. Royster. IEEE TRANSACTIONS ON COMMUNICATIONS,
- *      57(2):440-449, February 2009.
- *
- *  This model is designed to run with highest accuracy using the GNU
- *  Scientific Library (GSL), but if GSL is not installed on the platform,
- *  will fall back to (slightly less accurate) Matlab-derived models for
- *  the CCK modulation types.
- *
- *  More detailed description and validation can be found in
- *      http://www.nsnam.org/~pei/80211b.pdf
- */
-class DsssErrorRateModel
-{
-public:
-  /**
-   * A function DQPSK
-   *
-   * \param x the input variable
-   *
-   * \return DQPSK (x)
-   */
-  static double DqpskFunction (double x);
-  /**
-   * Return the chunk success rate of the differential BPSK.
-   *
-   * \param sinr the SINR ratio (not dB) of the chunk
-   * \param nbits the size of the chunk
-   *
-   * \return the chunk success rate of the differential BPSK
-   */
-  static double GetDsssDbpskSuccessRate (double sinr, uint64_t nbits);
-  /**
-   * Return the chunk success rate of the differential encoded QPSK.
-   *
-   * \param sinr the SINR ratio (not dB) of the chunk
-   * \param nbits the size of the chunk
-   *
-   * \return the chunk success rate of the differential encoded QPSK.
-   */
-  static double GetDsssDqpskSuccessRate (double sinr,uint64_t nbits);
-  /**
-   * Return the chunk success rate of the differential encoded QPSK for
-   * 5.5Mbps data rate.
-   *
-   * \param sinr the SINR ratio (not dB) of the chunk
-   * \param nbits the size of the chunk
-   *
-   * \return the chunk success rate of the differential encoded QPSK for
-   */
-  static double GetDsssDqpskCck5_5SuccessRate (double sinr,uint64_t nbits);
-  /**
-   * Return the chunk success rate of the differential encoded QPSK for
-   * 11Mbps data rate.
-   *
-   * \param sinr the SINR ratio (not dB) of the chunk
-   * \param nbits the size of the chunk
-   *
-   * \return the chunk success rate of the differential encoded QPSK for
-   */
-  static double GetDsssDqpskCck11SuccessRate (double sinr,uint64_t nbits);
-#ifdef HAVE_GSL
-  static double SymbolErrorProb16Cck (double e2); /// equation (18) in Pursley's paper
-  static double SymbolErrorProb256Cck (double e1); /// equation (17) in Pursley's paper
-#else
-
-
-protected:
-  /// WLAN perfect
-  static const double WLAN_SIR_PERFECT;
-  /// WLAN impossible
-  static const double WLAN_SIR_IMPOSSIBLE;
-#endif
-};
-
-} //namespace ns3
-
-#endif /* DSSS_ERROR_RATE_MODEL_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/dsss-parameter-set.cc ns-3.34/src/wifi/model/dsss-parameter-set.cc
--- ns-3.33/src/wifi/model/dsss-parameter-set.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/dsss-parameter-set.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,93 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2016 Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "dsss-parameter-set.h"
-
-namespace ns3 {
-
-DsssParameterSet::DsssParameterSet ()
-  : m_currentChannel (0),
-    m_dsssSupported (0)
-{
-}
-
-WifiInformationElementId
-DsssParameterSet::ElementId () const
-{
-  return IE_DSSS_PARAMETER_SET;
-}
-
-void
-DsssParameterSet::SetDsssSupported (uint8_t dsssSupported)
-{
-  m_dsssSupported = dsssSupported;
-}
-
-void
-DsssParameterSet::SetCurrentChannel (uint8_t currentChannel)
-{
-  m_currentChannel = currentChannel;
-}
-
-uint8_t
-DsssParameterSet::GetInformationFieldSize () const
-{
-  NS_ASSERT (m_dsssSupported);
-  return 1;
-}
-
-Buffer::Iterator
-DsssParameterSet::Serialize (Buffer::Iterator i) const
-{
-  if (!m_dsssSupported)
-    {
-      return i;
-    }
-  return WifiInformationElement::Serialize (i);
-}
-
-uint16_t
-DsssParameterSet::GetSerializedSize () const
-{
-  if (!m_dsssSupported)
-    {
-      return 0;
-    }
-  return WifiInformationElement::GetSerializedSize ();
-}
-
-void
-DsssParameterSet::SerializeInformationField (Buffer::Iterator start) const
-{
-  if (m_dsssSupported)
-    {
-      start.WriteU8 (m_currentChannel);
-    }
-}
-
-uint8_t
-DsssParameterSet::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
-{
-  Buffer::Iterator i = start;
-  m_currentChannel = i.ReadU8 ();
-  return length;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/dsss-parameter-set.h ns-3.34/src/wifi/model/dsss-parameter-set.h
--- ns-3.33/src/wifi/model/dsss-parameter-set.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/dsss-parameter-set.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,74 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2016 Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef DSSS_PARAMETER_SET_H
-#define DSSS_PARAMETER_SET_H
-
-#include "wifi-information-element.h"
-
-namespace ns3 {
-
-/**
- * \brief The DSSS Parameter Set
- * \ingroup wifi
- *
- * This class knows how to serialise and deserialise the DSSS Parameter Set.
- */
-class DsssParameterSet : public WifiInformationElement
-{
-public:
-  DsssParameterSet ();
-
-  // Implementations of pure virtual methods of WifiInformationElement
-  WifiInformationElementId ElementId () const;
-  uint8_t GetInformationFieldSize () const;
-  void SerializeInformationField (Buffer::Iterator start) const;
-  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length);
-  /* This information element is a bit special in that it is only
-     included if the STA does support DSSS. To support this we
-     override the Serialize and GetSerializedSize methods of
-     WifiInformationElement. */
-  Buffer::Iterator Serialize (Buffer::Iterator start) const;
-  uint16_t GetSerializedSize () const;
-
-  /**
-   * Set DSSS supported
-   * \param dsssSupported the DSSS supported indicator
-   */
-  void SetDsssSupported (uint8_t dsssSupported);
-
-  /**
-   * Set the Current Channel field in the DsssParameterSet information element.
-   *
-   * \param currentChannel the CurrentChannel field in the DsssParameterSet information element
-   */
-  void SetCurrentChannel (uint8_t currentChannel);
-
-
-private:
-  uint8_t m_currentChannel; ///< current channel number
-
-  /// This is used to decide whether this element should be added to the frame or not
-  bool m_dsssSupported;
-};
-
-} //namespace ns3
-
-#endif /* DSSS_PARAMETER_SET_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/edca-parameter-set.h ns-3.34/src/wifi/model/edca-parameter-set.h
--- ns-3.33/src/wifi/model/edca-parameter-set.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/edca-parameter-set.h	2021-07-14 10:31:07.000000000 -0700
@@ -37,16 +37,16 @@
   EdcaParameterSet ();
 
   // Implementations of pure virtual methods of WifiInformationElement
-  WifiInformationElementId ElementId () const;
-  uint8_t GetInformationFieldSize () const;
-  void SerializeInformationField (Buffer::Iterator start) const;
-  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length);
+  WifiInformationElementId ElementId () const override;
+  uint8_t GetInformationFieldSize () const override;
+  void SerializeInformationField (Buffer::Iterator start) const override;
+  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length) override;
   /* This information element is a bit special in that it is only
      included if the STA is a QoS STA. To support this we
      override the Serialize and GetSerializedSize methods of
      WifiInformationElement. */
-  Buffer::Iterator Serialize (Buffer::Iterator start) const;
-  uint16_t GetSerializedSize () const;
+  Buffer::Iterator Serialize (Buffer::Iterator start) const override;
+  uint16_t GetSerializedSize () const override;
 
   /**
    * Set QOS supported function
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/erp-information.cc ns-3.34/src/wifi/model/erp-information.cc
--- ns-3.33/src/wifi/model/erp-information.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/erp-information.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,134 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2015 Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "erp-information.h"
-
-namespace ns3 {
-
-ErpInformation::ErpInformation ()
-  : m_erpInformation (0),
-    m_erpSupported (0)
-{
-}
-
-WifiInformationElementId
-ErpInformation::ElementId () const
-{
-  return IE_ERP_INFORMATION;
-}
-
-void
-ErpInformation::SetErpSupported (uint8_t erpSupported)
-{
-  m_erpSupported = erpSupported;
-}
-
-void
-ErpInformation::SetBarkerPreambleMode (uint8_t barkerPreambleMode)
-{
-  m_erpInformation |= (barkerPreambleMode & 0x01) << 2;
-}
-
-void
-ErpInformation::SetUseProtection (uint8_t useProtection)
-{
-  m_erpInformation |= (useProtection & 0x01) << 1;
-}
-
-void
-ErpInformation::SetNonErpPresent (uint8_t nonErpPresent)
-{
-  m_erpInformation |= nonErpPresent & 0x01;
-}
-
-uint8_t
-ErpInformation::GetBarkerPreambleMode (void) const
-{
-  return ((m_erpInformation >> 2) & 0x01);
-}
-
-uint8_t
-ErpInformation::GetUseProtection (void) const
-{
-  return ((m_erpInformation >> 1) & 0x01);
-}
-
-uint8_t
-ErpInformation::GetNonErpPresent (void) const
-{
-  return (m_erpInformation & 0x01);
-}
-
-uint8_t
-ErpInformation::GetInformationFieldSize () const
-{
-  NS_ASSERT (m_erpSupported);
-  return 1;
-}
-
-Buffer::Iterator
-ErpInformation::Serialize (Buffer::Iterator i) const
-{
-  if (!m_erpSupported)
-    {
-      return i;
-    }
-  return WifiInformationElement::Serialize (i);
-}
-
-uint16_t
-ErpInformation::GetSerializedSize () const
-{
-  if (!m_erpSupported)
-    {
-      return 0;
-    }
-  return WifiInformationElement::GetSerializedSize ();
-}
-
-void
-ErpInformation::SerializeInformationField (Buffer::Iterator start) const
-{
-  if (m_erpSupported)
-    {
-      start.WriteU8 (m_erpInformation);
-    }
-}
-
-uint8_t
-ErpInformation::DeserializeInformationField (Buffer::Iterator start,
-                                             uint8_t length)
-{
-  Buffer::Iterator i = start;
-  m_erpInformation = i.ReadU8 ();
-  return length;
-}
-
-std::ostream &
-operator << (std::ostream &os, const ErpInformation &erpInformation)
-{
-  os <<  bool (erpInformation.GetBarkerPreambleMode ())
-     << "|" << bool (erpInformation.GetUseProtection ())
-     << "|" << bool (erpInformation.GetNonErpPresent ());
-
-  return os;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/erp-information.h ns-3.34/src/wifi/model/erp-information.h
--- ns-3.33/src/wifi/model/erp-information.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/erp-information.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,118 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2015 Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef ERP_INFORMATION_H
-#define ERP_INFORMATION_H
-
-#include "wifi-information-element.h"
-
-namespace ns3 {
-
-/**
- * \brief The ErpInformation Information Element
- * \ingroup wifi
- *
- * This class knows how to serialise and deserialise the ErpInformation Information Element.
- */
-class ErpInformation : public WifiInformationElement
-{
-public:
-  ErpInformation ();
-
-  // Implementations of pure virtual methods of WifiInformationElement
-  WifiInformationElementId ElementId () const;
-  uint8_t GetInformationFieldSize () const;
-  void SerializeInformationField (Buffer::Iterator start) const;
-  uint8_t DeserializeInformationField (Buffer::Iterator start,
-                                       uint8_t length);
-
-  /* This information element is a bit special in that it is only
-     included if the STA is an ERP STA. To support this we
-     override the Serialize and GetSerializedSize methods of
-     WifiInformationElement. */
-  Buffer::Iterator Serialize (Buffer::Iterator start) const;
-  uint16_t GetSerializedSize () const;
-
-  /**
-   * Set the ERP supported field.
-   *
-   * \param erpSupported the ERP supported field in the ErpInformation information element
-   */
-  void SetErpSupported (uint8_t erpSupported);
-
-  /**
-   * Set the Barker_Preamble_Mode field in the ErpInformation information element.
-   *
-   * \param barkerPreambleMode the Barker_Preamble_Mode field in the ErpInformation information element
-   */
-  void SetBarkerPreambleMode (uint8_t barkerPreambleMode);
-  /**
-   * Set the Use_Protection field in the ErpInformation information element.
-   *
-   * \param useProtection the Use_Protection field in the ErpInformation information element
-   */
-  void SetUseProtection (uint8_t useProtection);
-  /**
-   * Set the Non_Erp_Present field in the ErpInformation information element.
-   *
-   * \param nonErpPresent the Non_Erp_Present field in the ErpInformation information element
-   */
-  void SetNonErpPresent (uint8_t nonErpPresent);
-
-  /**
-   * Return the Barker_Preamble_Mode field in the ErpInformation information element.
-   *
-   * \return the Barker_Preamble_Mode field in the ErpInformation information element
-   */
-  uint8_t GetBarkerPreambleMode (void) const;
-  /**
-   * Return the Use_Protection field in the ErpInformation information element.
-   *
-   * \return the Use_Protection field in the ErpInformation information element
-   */
-  uint8_t GetUseProtection (void) const;
-  /**
-   * Return the Non_Erp_Present field in the ErpInformation information element.
-   *
-   * \return the Non_Erp_Present field in the ErpInformation information element
-   */
-  uint8_t GetNonErpPresent (void) const;
-
-
-private:
-  uint8_t m_erpInformation; ///< ERP information
-
-  /// This is used to decide whether this element should be added to the frame or not
-  bool m_erpSupported;
-};
-
-/**
- * output stream output operator
- *
- * \param os output stream
- * \param erpInformation the ERP Information
- *
- * \returns output stream
- */
-std::ostream &operator << (std::ostream &os, const ErpInformation &erpInformation);
-
-} //namespace ns3
-
-#endif /* ERP_INFORMATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/error-rate-model.cc ns-3.34/src/wifi/model/error-rate-model.cc
--- ns-3.33/src/wifi/model/error-rate-model.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/error-rate-model.cc	2021-07-14 10:31:07.000000000 -0700
@@ -19,7 +19,7 @@
  */
 
 #include "error-rate-model.h"
-#include "dsss-error-rate-model.h"
+#include "ns3/dsss-error-rate-model.h"
 #include "wifi-tx-vector.h"
 
 namespace ns3 {
@@ -36,7 +36,7 @@
 }
 
 double
-ErrorRateModel::CalculateSnr (WifiTxVector txVector, double ber) const
+ErrorRateModel::CalculateSnr (const WifiTxVector& txVector, double ber) const
 {
   //This is a very simple binary search.
   double low, high, precision;
@@ -60,7 +60,7 @@
 }
 
 double
-ErrorRateModel::GetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint64_t nbits) const
+ErrorRateModel::GetChunkSuccessRate (WifiMode mode, const WifiTxVector& txVector, double snr, uint64_t nbits, uint8_t numRxAntennas, WifiPpduField field, uint16_t staId) const
 {
   if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS || mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS)
     {
@@ -80,9 +80,22 @@
     }
   else
     {
-      return DoGetChunkSuccessRate (mode, txVector, snr, nbits);
+      return DoGetChunkSuccessRate (mode, txVector, snr, nbits, numRxAntennas, field, staId);
     }
   return 0;
 }
 
+bool
+ErrorRateModel::IsAwgn (void) const
+{
+  return true;
+}
+
+int64_t
+ErrorRateModel::AssignStreams (int64_t stream)
+{
+  // Override this method if the error model uses random variables
+  return 0;
+}
+
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/error-rate-model.h ns-3.34/src/wifi/model/error-rate-model.h
--- ns-3.33/src/wifi/model/error-rate-model.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/error-rate-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -22,12 +22,10 @@
 #define ERROR_RATE_MODEL_H
 
 #include "ns3/object.h"
+#include "wifi-mode.h"
 
 namespace ns3 {
 
-class WifiTxVector;
-class WifiMode;
-
 /**
  * \ingroup wifi
  * \brief the interface for Wifi's error models
@@ -48,7 +46,13 @@
    *
    * \return the SNR which corresponds to the requested BER
    */
-  double CalculateSnr (WifiTxVector txVector, double ber) const;
+  double CalculateSnr (const WifiTxVector& txVector, double ber) const;
+
+  /**
+   * \return true if the model is for AWGN channels,
+   *         false otherwise
+   */
+  virtual bool IsAwgn (void) const;
 
   /**
    * This method returns the probability that the given 'chunk' of the
@@ -72,10 +76,25 @@
    * \param txVector TXVECTOR of the overall transmission
    * \param snr the SNR of the chunk
    * \param nbits the number of bits in this chunk
+   * \param numRxAntennas the number of active RX antennas (1 if not provided)
+   * \param field the PPDU field to which the chunk belongs to (assumes this is for the payload part if not provided)
+   * \param staId the station ID for MU
    *
    * \return probability of successfully receiving the chunk
    */
-  double GetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint64_t nbits) const;
+  double GetChunkSuccessRate (WifiMode mode, const WifiTxVector& txVector, double snr, uint64_t nbits,
+                              uint8_t numRxAntennas = 1, WifiPpduField field = WIFI_PPDU_FIELD_DATA,
+                              uint16_t staId = SU_STA_ID) const;
+
+  /**
+   * Assign a fixed random variable stream number to the random variables
+   * used by this model. Return the number of streams (possibly zero) that
+   * have been assigned.
+   *
+   * \param stream first stream index to use
+   * \return the number of stream indices assigned by this model
+   */
+  virtual int64_t AssignStreams (int64_t stream);
 
 
 private:
@@ -86,10 +105,14 @@
    * \param txVector TXVECTOR of the overall transmission
    * \param snr the SNR of the chunk
    * \param nbits the number of bits in this chunk
+   * \param numRxAntennas the number of active RX antennas
+   * \param field the PPDU field to which the chunk belongs to
+   * \param staId the station ID for MU
    *
    * \return probability of successfully receiving the chunk
    */
-  virtual double DoGetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint64_t nbits) const = 0;
+  virtual double DoGetChunkSuccessRate (WifiMode mode, const WifiTxVector& txVector, double snr, uint64_t nbits,
+                                        uint8_t numRxAntennas, WifiPpduField field, uint16_t staId) const = 0;
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/extended-capabilities.h ns-3.34/src/wifi/model/extended-capabilities.h
--- ns-3.33/src/wifi/model/extended-capabilities.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/extended-capabilities.h	2021-07-14 10:31:07.000000000 -0700
@@ -37,17 +37,17 @@
   ExtendedCapabilities ();
 
   // Implementations of pure virtual methods of WifiInformationElement
-  WifiInformationElementId ElementId () const;
-  uint8_t GetInformationFieldSize () const;
-  void SerializeInformationField (Buffer::Iterator start) const;
+  WifiInformationElementId ElementId () const override;
+  uint8_t GetInformationFieldSize () const override;
+  void SerializeInformationField (Buffer::Iterator start) const override;
   uint8_t DeserializeInformationField (Buffer::Iterator start,
-                                       uint8_t length);
+                                       uint8_t length) override;
   /* This information element is a bit special in that it is only
      included if the STA is a HT STA. To support this we
      override the Serialize and GetSerializedSize methods of
      WifiInformationElement. */
-  Buffer::Iterator Serialize (Buffer::Iterator start) const;
-  uint16_t GetSerializedSize () const;
+  Buffer::Iterator Serialize (Buffer::Iterator start) const override;
+  uint16_t GetSerializedSize () const override;
 
   /**
    * Set the HT Supported flag.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/frame-exchange-manager.cc ns-3.34/src/wifi/model/frame-exchange-manager.cc
--- ns-3.33/src/wifi/model/frame-exchange-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/frame-exchange-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,1135 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "ns3/abort.h"
+#include "frame-exchange-manager.h"
+#include "wifi-utils.h"
+#include "snr-tag.h"
+#include "wifi-mac-queue.h"
+#include "wifi-mac-trailer.h"
+
+#undef NS_LOG_APPEND_CONTEXT
+#define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] "
+
+// Time (in nanoseconds) to be added to the PSDU duration to yield the duration
+// of the timer that is started when the PHY indicates the start of the reception
+// of a frame and we are waiting for a response.
+#define PSDU_DURATION_SAFEGUARD 400
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("FrameExchangeManager");
+
+NS_OBJECT_ENSURE_REGISTERED (FrameExchangeManager);
+
+TypeId
+FrameExchangeManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::FrameExchangeManager")
+    .SetParent<Object> ()
+    .AddConstructor<FrameExchangeManager> ()
+    .SetGroupName ("Wifi")
+  ;
+  return tid;
+}
+
+FrameExchangeManager::FrameExchangeManager ()
+  : m_navEnd (Seconds (0)),
+    m_promisc (false),
+    m_moreFragments (false)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+FrameExchangeManager::~FrameExchangeManager ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+void
+FrameExchangeManager::Reset (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_txTimer.Cancel ();
+  if (m_navResetEvent.IsRunning ())
+    {
+      m_navResetEvent.Cancel ();
+    }
+  m_navEnd = Simulator::Now ();
+  m_mpdu = 0;
+  m_txParams.Clear ();
+  m_dcf = 0;
+}
+
+void
+FrameExchangeManager::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  Reset ();
+  m_fragmentedPacket = 0;
+  m_mac = 0;
+  m_txMiddle = 0;
+  m_rxMiddle = 0;
+  m_channelAccessManager = 0;
+  m_protectionManager = 0;
+  m_ackManager = 0;
+  if (m_phy != 0)
+    {
+      m_phy->TraceDisconnectWithoutContext ("PhyRxPayloadBegin",
+                                            MakeCallback (&FrameExchangeManager::RxStartIndication, this));
+    }
+  m_phy = 0;
+  Object::DoDispose ();
+}
+
+void
+FrameExchangeManager::SetProtectionManager (Ptr<WifiProtectionManager> protectionManager)
+{
+  NS_LOG_FUNCTION (this << protectionManager);
+  m_protectionManager = protectionManager;
+}
+
+Ptr<WifiProtectionManager>
+FrameExchangeManager::GetProtectionManager (void) const
+{
+  return m_protectionManager;
+}
+
+void
+FrameExchangeManager::SetAckManager (Ptr<WifiAckManager> ackManager)
+{
+  NS_LOG_FUNCTION (this << ackManager);
+  m_ackManager = ackManager;
+}
+
+Ptr<WifiAckManager>
+FrameExchangeManager::GetAckManager (void) const
+{
+  return m_ackManager;
+}
+
+void
+FrameExchangeManager::SetWifiMac (Ptr<RegularWifiMac> mac)
+{
+  NS_LOG_FUNCTION (this << mac);
+  m_mac = mac;
+}
+
+void
+FrameExchangeManager::SetMacTxMiddle (const Ptr<MacTxMiddle> txMiddle)
+{
+  NS_LOG_FUNCTION (this << txMiddle);
+  m_txMiddle = txMiddle;
+}
+
+void
+FrameExchangeManager::SetMacRxMiddle (const Ptr<MacRxMiddle> rxMiddle)
+{
+  NS_LOG_FUNCTION (this << rxMiddle);
+  m_rxMiddle = rxMiddle;
+}
+
+void
+FrameExchangeManager::SetChannelAccessManager (const Ptr<ChannelAccessManager> channelAccessManager)
+{
+  NS_LOG_FUNCTION (this << channelAccessManager);
+  m_channelAccessManager = channelAccessManager;
+}
+
+void
+FrameExchangeManager::SetWifiPhy (Ptr<WifiPhy> phy)
+{
+  NS_LOG_FUNCTION (this << phy);
+  m_phy = phy;
+  m_phy->TraceConnectWithoutContext ("PhyRxPayloadBegin",
+                                     MakeCallback (&FrameExchangeManager::RxStartIndication, this));
+  m_phy->SetReceiveOkCallback (MakeCallback (&FrameExchangeManager::Receive, this));
+}
+
+void
+FrameExchangeManager::ResetPhy (void)
+{
+  m_phy->TraceDisconnectWithoutContext ("PhyRxPayloadBegin",
+                                        MakeCallback (&FrameExchangeManager::RxStartIndication, this));
+  m_phy->SetReceiveOkCallback (MakeNullCallback<void, Ptr<WifiPsdu>, RxSignalInfo, WifiTxVector, std::vector<bool>> ());
+  m_phy = 0;
+}
+
+void
+FrameExchangeManager::SetAddress (Mac48Address address)
+{
+  NS_LOG_FUNCTION (this << address);
+  m_self = address;
+}
+
+void
+FrameExchangeManager::SetBssid (Mac48Address bssid)
+{
+  NS_LOG_FUNCTION (this << bssid);
+  m_bssid = bssid;
+}
+
+void
+FrameExchangeManager::SetDroppedMpduCallback (DroppedMpdu callback)
+{
+  NS_LOG_FUNCTION (this << &callback);
+  m_droppedMpduCallback = callback;
+}
+
+void
+FrameExchangeManager::SetAckedMpduCallback (AckedMpdu callback)
+{
+  NS_LOG_FUNCTION (this << &callback);
+  m_ackedMpduCallback = callback;
+}
+
+void
+FrameExchangeManager::SetPromisc (void)
+{
+  m_promisc = true;
+}
+
+bool
+FrameExchangeManager::IsPromisc (void) const
+{
+  return m_promisc;
+}
+
+const WifiTxTimer&
+FrameExchangeManager::GetWifiTxTimer (void) const
+{
+  return m_txTimer;
+}
+
+void
+FrameExchangeManager::NotifyPacketDiscarded (Ptr<const WifiMacQueueItem> mpdu)
+{
+  if (!m_droppedMpduCallback.IsNull ())
+    {
+      m_droppedMpduCallback (WIFI_MAC_DROP_REACHED_RETRY_LIMIT, mpdu);
+    }
+}
+
+void
+FrameExchangeManager::RxStartIndication (WifiTxVector txVector, Time psduDuration)
+{
+  NS_LOG_FUNCTION (this << "PSDU reception started for " << psduDuration.As (Time::US)
+                   << " (txVector: " << txVector << ")");
+
+  NS_ASSERT_MSG (!m_txTimer.IsRunning () || !m_navResetEvent.IsRunning (),
+                 "The TX timer and the NAV reset event cannot be both running");
+
+  // No need to reschedule timeouts if PSDU duration is null. In this case,
+  // PHY-RXEND immediately follows PHY-RXSTART (e.g. when PPDU has been filtered)
+  // and CCA will take over
+  if (m_txTimer.IsRunning () && psduDuration.IsStrictlyPositive ())
+    {
+      // we are waiting for a response and something arrived
+      NS_LOG_DEBUG ("Rescheduling timeout event");
+      m_txTimer.Reschedule (psduDuration + NanoSeconds (PSDU_DURATION_SAFEGUARD));
+      // PHY has switched to RX, so we can reset the ack timeout
+      m_channelAccessManager->NotifyAckTimeoutResetNow ();
+    }
+
+  if (m_navResetEvent.IsRunning ())
+    {
+      m_navResetEvent.Cancel ();
+    }
+}
+
+bool
+FrameExchangeManager::StartTransmission (Ptr<Txop> dcf)
+{
+  NS_LOG_FUNCTION (this << dcf);
+
+  NS_ASSERT (m_mpdu == 0);
+  if (m_txTimer.IsRunning ())
+    {
+      m_txTimer.Cancel ();
+    }
+  m_dcf = dcf;
+
+  Ptr<WifiMacQueue> queue = dcf->GetWifiMacQueue ();
+
+  // Even though channel access is requested when the queue is not empty, at
+  // the time channel access is granted the lifetime of the packet might be
+  // expired and the queue might be empty.
+  if (queue->IsEmpty ())
+    {
+      NS_LOG_DEBUG ("Queue empty");
+      m_dcf->NotifyChannelReleased ();
+      m_dcf = 0;
+      return false;
+    }
+
+  m_dcf->NotifyChannelAccessed ();
+  Ptr<WifiMacQueueItem> mpdu = *queue->Peek ()->GetQueueIteratorPairs ().front ().it;
+  NS_ASSERT (mpdu != 0);
+  NS_ASSERT (mpdu->GetHeader ().IsData () || mpdu->GetHeader ().IsMgt ());
+
+  // assign a sequence number if this is not a fragment nor a retransmission
+  if (!mpdu->IsFragment () && !mpdu->GetHeader ().IsRetry ())
+    {
+      uint16_t sequence = m_txMiddle->GetNextSequenceNumberFor (&mpdu->GetHeader ());
+      mpdu->GetHeader ().SetSequenceNumber (sequence);
+    }
+
+  NS_LOG_DEBUG ("MPDU payload size=" << mpdu->GetPacketSize () <<
+                ", to=" << mpdu->GetHeader ().GetAddr1 () <<
+                ", seq=" << mpdu->GetHeader ().GetSequenceControl ());
+
+  // check if the MSDU needs to be fragmented
+  mpdu = GetFirstFragmentIfNeeded (mpdu);
+
+  NS_ASSERT (m_protectionManager != 0);
+  NS_ASSERT (m_ackManager != 0);
+  WifiTxParameters txParams;
+  txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (mpdu->GetHeader ());
+  txParams.m_protection = m_protectionManager->TryAddMpdu (mpdu, txParams);
+  txParams.m_acknowledgment = m_ackManager->TryAddMpdu (mpdu, txParams);
+  txParams.AddMpdu (mpdu);
+  UpdateTxDuration (mpdu->GetHeader ().GetAddr1 (), txParams);
+
+  SendMpduWithProtection (mpdu, txParams);
+
+  return true;
+}
+
+Ptr<WifiMacQueueItem>
+FrameExchangeManager::GetFirstFragmentIfNeeded (Ptr<WifiMacQueueItem> mpdu)
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+
+  if (mpdu->IsFragment ())
+    {
+      // a fragment cannot be further fragmented
+      NS_ASSERT (m_fragmentedPacket != 0);
+    }
+  else if (m_mac->GetWifiRemoteStationManager ()->NeedFragmentation (mpdu))
+    {
+      NS_LOG_DEBUG ("Fragmenting the MSDU");
+      m_fragmentedPacket = mpdu->GetPacket ()->Copy ();
+      // dequeue the MSDU
+      WifiMacQueueItem::QueueIteratorPair queueIt = mpdu->GetQueueIteratorPairs ().front ();
+      queueIt.queue->Dequeue (queueIt.it);
+      // create the first fragment
+      mpdu->GetHeader ().SetMoreFragments ();
+      Ptr<Packet> fragment = m_fragmentedPacket->CreateFragment (0, m_mac->GetWifiRemoteStationManager ()->GetFragmentSize (mpdu, 0));
+      // enqueue the first fragment
+      Ptr<WifiMacQueueItem> item = Create<WifiMacQueueItem> (fragment, mpdu->GetHeader (), mpdu->GetTimeStamp ());
+      queueIt.queue->PushFront (item);
+      return item;
+    }
+  return mpdu;
+}
+
+void
+FrameExchangeManager::SendMpduWithProtection (Ptr<WifiMacQueueItem> mpdu, WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << *mpdu << &txParams);
+
+  m_mpdu = mpdu;
+  m_txParams = std::move (txParams);
+
+  // If protection is required, the MPDU must be stored in some queue because
+  // it is not put back in a queue if the RTS/CTS exchange fails
+  NS_ASSERT (m_txParams.m_protection->method == WifiProtection::NONE
+             || m_mpdu->GetHeader ().IsCtl ()
+             || m_mpdu->IsQueued ());
+
+  // Make sure that the acknowledgment time has been computed, so that SendRts()
+  // and SendCtsToSelf() can reuse this value.
+  NS_ASSERT (m_txParams.m_acknowledgment);
+
+  if (m_txParams.m_acknowledgment->acknowledgmentTime == Time::Min ())
+    {
+      CalculateAcknowledgmentTime (m_txParams.m_acknowledgment.get ());
+    }
+
+  // Set QoS Ack policy if this is a QoS data frame
+  WifiAckManager::SetQosAckPolicy (m_mpdu, m_txParams.m_acknowledgment.get ());
+
+  switch (m_txParams.m_protection->method)
+    {
+    case WifiProtection::RTS_CTS:
+      SendRts (m_txParams);
+      break;
+    case WifiProtection::CTS_TO_SELF:
+      SendCtsToSelf (m_txParams);
+      break;
+    case WifiProtection::NONE:
+      SendMpdu ();
+      break;
+    default:
+      NS_ABORT_MSG ("Unknown protection type");
+    }
+}
+
+void
+FrameExchangeManager::SendMpdu (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  Time txDuration = m_phy->CalculateTxDuration (m_mpdu->GetSize (), m_txParams.m_txVector, m_phy->GetPhyBand ());
+
+  NS_ASSERT (m_txParams.m_acknowledgment);
+
+  if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NONE)
+    {
+      Simulator::Schedule (txDuration, &FrameExchangeManager::TransmissionSucceeded, this);
+    }
+  else if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NORMAL_ACK)
+    {
+      m_mpdu->GetHeader ().SetDuration (GetFrameDurationId (m_mpdu->GetHeader (), m_mpdu->GetSize (),
+                                                            m_txParams, m_fragmentedPacket));
+
+      // the timeout duration is "aSIFSTime + aSlotTime + aRxPHYStartDelay, starting
+      // at the PHY-TXEND.confirm primitive" (section 10.3.2.9 or 10.22.2.2 of 802.11-2016).
+      // aRxPHYStartDelay equals the time to transmit the PHY header.
+      WifiNormalAck* normalAcknowledgment = static_cast<WifiNormalAck*> (m_txParams.m_acknowledgment.get ());
+
+      Time timeout = txDuration
+                    + m_phy->GetSifs ()
+                    + m_phy->GetSlot ()
+                    + m_phy->CalculatePhyPreambleAndHeaderDuration (normalAcknowledgment->ackTxVector);
+      NS_ASSERT (!m_txTimer.IsRunning ());
+      m_txTimer.Set (WifiTxTimer::WAIT_NORMAL_ACK, timeout, &FrameExchangeManager::NormalAckTimeout,
+                     this, m_mpdu, m_txParams.m_txVector);
+      m_channelAccessManager->NotifyAckTimeoutStartNow (timeout);
+    }
+  else
+    {
+      NS_ABORT_MSG ("Unable to handle the selected acknowledgment method ("
+                    << m_txParams.m_acknowledgment.get () << ")");
+    }
+
+  // transmit the MPDU
+  ForwardMpduDown (m_mpdu, m_txParams.m_txVector);
+
+  if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NONE)
+    {
+      // we are done with frames that do not require acknowledgment
+      m_mpdu = 0;
+    }
+}
+
+void
+FrameExchangeManager::ForwardMpduDown (Ptr<WifiMacQueueItem> mpdu, WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << *mpdu << txVector);
+
+  // The MPDU is about to be transmitted, we can now dequeue it if it is stored in a queue
+  DequeueMpdu (mpdu);
+
+  m_phy->Send (Create<WifiPsdu> (mpdu, false), txVector);
+}
+
+void
+FrameExchangeManager::DequeueMpdu (Ptr<WifiMacQueueItem> mpdu)
+{
+  NS_LOG_DEBUG (this << *mpdu);
+
+  if (mpdu->IsQueued ())
+    {
+      WifiMacQueueItem::QueueIteratorPair queueIt = mpdu->GetQueueIteratorPairs ().front ();
+      NS_ASSERT (*queueIt.it == mpdu);
+      queueIt.queue->Dequeue (queueIt.it);
+    }
+}
+
+void
+FrameExchangeManager::CalculateProtectionTime (WifiProtection* protection) const
+{
+  NS_LOG_FUNCTION (this << protection);
+  NS_ASSERT (protection != nullptr);
+
+  if (protection->method == WifiProtection::NONE)
+    {
+      protection->protectionTime = Seconds (0);
+    }
+  else if (protection->method == WifiProtection::RTS_CTS)
+    {
+      WifiRtsCtsProtection* rtsCtsProtection = static_cast<WifiRtsCtsProtection*> (protection);
+      rtsCtsProtection->protectionTime = m_phy->CalculateTxDuration (GetRtsSize (), rtsCtsProtection->rtsTxVector,
+                                                                     m_phy->GetPhyBand ())
+                                         + m_phy->CalculateTxDuration (GetCtsSize (), rtsCtsProtection->ctsTxVector,
+                                                                       m_phy->GetPhyBand ())
+                                         + 2 * m_phy->GetSifs ();
+    }
+  else if (protection->method == WifiProtection::CTS_TO_SELF)
+    {
+      WifiCtsToSelfProtection* ctsToSelfProtection = static_cast<WifiCtsToSelfProtection*> (protection);
+      ctsToSelfProtection->protectionTime = m_phy->CalculateTxDuration (GetCtsSize (),
+                                                                        ctsToSelfProtection->ctsTxVector,
+                                                                        m_phy->GetPhyBand ())
+                                            + m_phy->GetSifs ();
+    }
+}
+
+void
+FrameExchangeManager::CalculateAcknowledgmentTime (WifiAcknowledgment* acknowledgment) const
+{
+  NS_LOG_FUNCTION (this << acknowledgment);
+  NS_ASSERT (acknowledgment != nullptr);
+
+  if (acknowledgment->method == WifiAcknowledgment::NONE)
+    {
+      acknowledgment->acknowledgmentTime = Seconds (0);
+    }
+  else if (acknowledgment->method == WifiAcknowledgment::NORMAL_ACK)
+    {
+      WifiNormalAck* normalAcknowledgment = static_cast<WifiNormalAck*> (acknowledgment);
+      normalAcknowledgment->acknowledgmentTime = m_phy->GetSifs ()
+                                                 + m_phy->CalculateTxDuration (GetAckSize (),
+                                                                               normalAcknowledgment->ackTxVector,
+                                                                               m_phy->GetPhyBand ());
+    }
+}
+
+Time
+FrameExchangeManager::GetTxDuration (uint32_t ppduPayloadSize, Mac48Address receiver,
+                                     const WifiTxParameters& txParams) const
+{
+  return m_phy->CalculateTxDuration (ppduPayloadSize, txParams.m_txVector, m_phy->GetPhyBand ());
+}
+
+void
+FrameExchangeManager::UpdateTxDuration (Mac48Address receiver, WifiTxParameters& txParams) const
+{
+  txParams.m_txDuration = GetTxDuration (txParams.GetSize (receiver), receiver, txParams);
+}
+
+Time
+FrameExchangeManager::GetFrameDurationId (const WifiMacHeader& header, uint32_t size,
+                                          const WifiTxParameters& txParams,
+                                          Ptr<Packet> fragmentedPacket) const
+{
+  NS_LOG_FUNCTION (this << header << size << &txParams << fragmentedPacket);
+
+  NS_ASSERT (txParams.m_acknowledgment && txParams.m_acknowledgment->acknowledgmentTime != Time::Min ());
+  Time durationId = txParams.m_acknowledgment->acknowledgmentTime;
+
+  // if the current frame is a fragment followed by another fragment, we have to
+  // update the Duration/ID to cover the next fragment and the corresponding Ack
+  if (header.IsMoreFragments ())
+    {
+      uint32_t payloadSize = size - header.GetSize () - WIFI_MAC_FCS_LENGTH;
+      uint32_t nextFragmentOffset = (header.GetFragmentNumber () + 1) * payloadSize;
+      uint32_t nextFragmentSize = std::min (fragmentedPacket->GetSize () - nextFragmentOffset,
+                                            payloadSize);
+      WifiTxVector ackTxVector = m_mac->GetWifiRemoteStationManager ()->GetAckTxVector (header.GetAddr1 (),
+                                                                                        txParams.m_txVector);
+
+      durationId += 2 * m_phy->GetSifs ()
+                    + m_phy->CalculateTxDuration (GetAckSize (), ackTxVector, m_phy->GetPhyBand ())
+                    + m_phy->CalculateTxDuration (nextFragmentSize, txParams.m_txVector, m_phy->GetPhyBand ());
+    }
+  return durationId;
+}
+
+Time
+FrameExchangeManager::GetRtsDurationId (const WifiTxVector& rtsTxVector, Time txDuration, Time response) const
+{
+  NS_LOG_FUNCTION (this << rtsTxVector << txDuration << response);
+
+  WifiTxVector ctsTxVector;
+  ctsTxVector = m_mac->GetWifiRemoteStationManager ()->GetCtsTxVector (m_self, rtsTxVector.GetMode ());
+
+  return m_phy->GetSifs ()
+         + m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, m_phy->GetPhyBand ()) /* CTS */
+         + m_phy->GetSifs () + txDuration + response;
+}
+
+void
+FrameExchangeManager::SendRts (const WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << &txParams);
+
+  NS_ASSERT (txParams.GetPsduInfoMap ().size () == 1);
+  Mac48Address receiver = txParams.GetPsduInfoMap ().begin ()->first;
+
+  WifiMacHeader rts;
+  rts.SetType (WIFI_MAC_CTL_RTS);
+  rts.SetDsNotFrom ();
+  rts.SetDsNotTo ();
+  rts.SetNoRetry ();
+  rts.SetNoMoreFragments ();
+  rts.SetAddr1 (receiver);
+  rts.SetAddr2 (m_self);
+
+  NS_ASSERT (txParams.m_protection && txParams.m_protection->method == WifiProtection::RTS_CTS);
+  WifiRtsCtsProtection* rtsCtsProtection = static_cast<WifiRtsCtsProtection*> (txParams.m_protection.get ());
+
+  NS_ASSERT (txParams.m_txDuration != Time::Min ());
+  rts.SetDuration (GetRtsDurationId (rtsCtsProtection->rtsTxVector, txParams.m_txDuration,
+                                      txParams.m_acknowledgment->acknowledgmentTime));
+  Ptr<WifiMacQueueItem> mpdu = Create<WifiMacQueueItem> (Create<Packet> (), rts);
+
+  // After transmitting an RTS frame, the STA shall wait for a CTSTimeout interval with
+  // a value of aSIFSTime + aSlotTime + aRxPHYStartDelay (IEEE 802.11-2016 sec. 10.3.2.7).
+  // aRxPHYStartDelay equals the time to transmit the PHY header.
+  Time timeout = m_phy->CalculateTxDuration (GetRtsSize (), rtsCtsProtection->rtsTxVector, m_phy->GetPhyBand ())
+                 + m_phy->GetSifs ()
+                 + m_phy->GetSlot ()
+                 + m_phy->CalculatePhyPreambleAndHeaderDuration (rtsCtsProtection->ctsTxVector);
+  NS_ASSERT (!m_txTimer.IsRunning ());
+  m_txTimer.Set (WifiTxTimer::WAIT_CTS, timeout, &FrameExchangeManager::CtsTimeout, this,
+                 mpdu, rtsCtsProtection->rtsTxVector);
+  m_channelAccessManager->NotifyCtsTimeoutStartNow (timeout);
+
+  ForwardMpduDown (mpdu, rtsCtsProtection->rtsTxVector);
+}
+
+void
+FrameExchangeManager::DoSendCtsAfterRts (const WifiMacHeader& rtsHdr, WifiTxVector& ctsTxVector,
+                                         double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << rtsHdr << ctsTxVector << rtsSnr);
+
+  WifiMacHeader cts;
+  cts.SetType (WIFI_MAC_CTL_CTS);
+  cts.SetDsNotFrom ();
+  cts.SetDsNotTo ();
+  cts.SetNoMoreFragments ();
+  cts.SetNoRetry ();
+  cts.SetAddr1 (rtsHdr.GetAddr2 ());
+  Time duration = rtsHdr.GetDuration () - m_phy->GetSifs ()
+                  - m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, m_phy->GetPhyBand ());
+  // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8 of 802.11-2016)
+  if (duration.IsStrictlyNegative ())
+    {
+      duration = Seconds (0);
+    }
+  cts.SetDuration (duration);
+
+  Ptr<Packet> packet = Create<Packet> ();
+
+  SnrTag tag;
+  tag.Set (rtsSnr);
+  packet->AddPacketTag (tag);
+
+  // CTS should always use non-HT PPDU (HT PPDU cases not supported yet)
+  ForwardMpduDown (Create<WifiMacQueueItem> (packet, cts), ctsTxVector);
+}
+
+void
+FrameExchangeManager::SendCtsAfterRts (const WifiMacHeader& rtsHdr, WifiMode rtsTxMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << rtsHdr << rtsTxMode << rtsSnr);
+
+  WifiTxVector ctsTxVector = m_mac->GetWifiRemoteStationManager ()->GetCtsTxVector (rtsHdr.GetAddr2 (), rtsTxMode);
+  DoSendCtsAfterRts (rtsHdr, ctsTxVector, rtsSnr);
+}
+
+Time
+FrameExchangeManager::GetCtsToSelfDurationId (const WifiTxVector& ctsTxVector,
+                                               Time txDuration, Time response) const
+{
+  NS_LOG_FUNCTION (this << ctsTxVector << txDuration << response);
+
+  return m_phy->GetSifs () + txDuration + response;
+}
+
+void
+FrameExchangeManager::SendCtsToSelf (const WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << &txParams);
+
+  WifiMacHeader cts;
+  cts.SetType (WIFI_MAC_CTL_CTS);
+  cts.SetDsNotFrom ();
+  cts.SetDsNotTo ();
+  cts.SetNoMoreFragments ();
+  cts.SetNoRetry ();
+  cts.SetAddr1 (m_self);
+
+  NS_ASSERT (txParams.m_protection && txParams.m_protection->method == WifiProtection::CTS_TO_SELF);
+  WifiCtsToSelfProtection* ctsToSelfProtection = static_cast<WifiCtsToSelfProtection*> (txParams.m_protection.get ());
+
+  NS_ASSERT (txParams.m_txDuration != Time::Min ());
+  cts.SetDuration (GetCtsToSelfDurationId (ctsToSelfProtection->ctsTxVector, txParams.m_txDuration,
+                                            txParams.m_acknowledgment->acknowledgmentTime));
+
+  ForwardMpduDown (Create<WifiMacQueueItem> (Create<Packet> (), cts), ctsToSelfProtection->ctsTxVector);
+
+  Time ctsDuration = m_phy->CalculateTxDuration (GetCtsSize (), ctsToSelfProtection->ctsTxVector,
+                                                 m_phy->GetPhyBand ());
+  Simulator::Schedule (ctsDuration + m_phy->GetSifs (), &FrameExchangeManager::SendMpdu, this);
+}
+
+void
+FrameExchangeManager::SendNormalAck (const WifiMacHeader& hdr, const WifiTxVector& dataTxVector,
+                                     double dataSnr)
+{
+  NS_LOG_FUNCTION (this << hdr << dataTxVector << dataSnr);
+
+  WifiTxVector ackTxVector = m_mac->GetWifiRemoteStationManager ()->GetAckTxVector (hdr.GetAddr2 (), dataTxVector);
+  WifiMacHeader ack;
+  ack.SetType (WIFI_MAC_CTL_ACK);
+  ack.SetDsNotFrom ();
+  ack.SetDsNotTo ();
+  ack.SetNoRetry ();
+  ack.SetNoMoreFragments ();
+  ack.SetAddr1 (hdr.GetAddr2 ());
+  // 802.11-2016, Section 9.2.5.7: Duration/ID is received duration value
+  // minus the time to transmit the Ack frame and its SIFS interval
+  Time duration = hdr.GetDuration () - m_phy->GetSifs ()
+                  - m_phy->CalculateTxDuration (GetAckSize (), ackTxVector, m_phy->GetPhyBand ());
+  // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8 of 802.11-2016)
+  if (duration.IsStrictlyNegative ())
+    {
+      duration = Seconds (0);
+    }
+  ack.SetDuration (duration);
+
+  Ptr<Packet> packet = Create<Packet> ();
+
+  SnrTag tag;
+  tag.Set (dataSnr);
+  packet->AddPacketTag (tag);
+
+  ForwardMpduDown (Create<WifiMacQueueItem> (packet, ack), ackTxVector);
+}
+
+Ptr<WifiMacQueueItem>
+FrameExchangeManager::GetNextFragment (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_mpdu->GetHeader ().IsMoreFragments ());
+
+  WifiMacHeader& hdr = m_mpdu->GetHeader ();
+  hdr.SetFragmentNumber (hdr.GetFragmentNumber () + 1);
+
+  uint32_t startOffset = hdr.GetFragmentNumber () * m_mpdu->GetPacketSize ();
+  uint32_t size = m_fragmentedPacket->GetSize () - startOffset;
+
+  if (size > m_mpdu->GetPacketSize ())
+    {
+      // this is not the last fragment
+      size = m_mpdu->GetPacketSize ();
+      hdr.SetMoreFragments ();
+    }
+  else
+    {
+      hdr.SetNoMoreFragments ();
+    }
+
+  return Create<WifiMacQueueItem> (m_fragmentedPacket->CreateFragment (startOffset, size), hdr);
+}
+
+void
+FrameExchangeManager::TransmissionSucceeded (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  // Upon a transmission success, a non-QoS station transmits the next fragment,
+  // if any, or releases the channel, otherwise
+  if (m_moreFragments)
+    {
+      NS_LOG_DEBUG ("Schedule transmission of next fragment in a SIFS");
+      Simulator::Schedule (m_phy->GetSifs (), &FrameExchangeManager::StartTransmission, this, m_dcf);
+      m_moreFragments = false;
+    }
+  else
+    {
+      m_dcf->NotifyChannelReleased ();
+      m_dcf = 0;
+    }
+}
+
+void
+FrameExchangeManager::TransmissionFailed (void)
+{
+  NS_LOG_FUNCTION (this);
+  // A non-QoS station always releases the channel upon a transmission failure
+  m_dcf->NotifyChannelReleased ();
+  m_dcf = 0;
+}
+
+void
+FrameExchangeManager::NormalAckTimeout (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << *mpdu << txVector);
+
+  m_mac->GetWifiRemoteStationManager ()->ReportDataFailed (mpdu);
+
+  if (!m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (mpdu))
+    {
+      NS_LOG_DEBUG ("Missed Ack, discard MPDU");
+      NotifyPacketDiscarded (mpdu);
+      m_mac->GetWifiRemoteStationManager ()->ReportFinalDataFailed (mpdu);
+      m_dcf->ResetCw ();
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Missed Ack, retransmit MPDU");
+      mpdu->GetHeader ().SetRetry ();
+      RetransmitMpduAfterMissedAck (mpdu);
+      m_dcf->UpdateFailedCw ();
+    }
+
+  m_mpdu = 0;
+  TransmissionFailed ();
+}
+
+void
+FrameExchangeManager::RetransmitMpduAfterMissedAck (Ptr<WifiMacQueueItem> mpdu) const
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+
+  // insert the MPDU in the DCF queue again
+  m_dcf->GetWifiMacQueue ()->PushFront (mpdu);
+}
+
+void
+FrameExchangeManager::CtsTimeout (Ptr<WifiMacQueueItem> rts, const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << *rts << txVector);
+
+  m_mac->GetWifiRemoteStationManager ()->ReportRtsFailed (m_mpdu->GetHeader ());
+
+  if (!m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (m_mpdu))
+    {
+      NS_LOG_DEBUG ("Missed CTS, discard MPDU");
+      // Dequeue the MPDU if it is stored in a queue
+      DequeueMpdu (m_mpdu);
+      NotifyPacketDiscarded (m_mpdu);
+      m_mac->GetWifiRemoteStationManager ()->ReportFinalRtsFailed (m_mpdu->GetHeader ());
+      m_dcf->ResetCw ();
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Missed CTS, retransmit RTS");
+      RetransmitMpduAfterMissedCts (m_mpdu);
+      m_dcf->UpdateFailedCw ();
+    }
+  m_mpdu = 0;
+  TransmissionFailed ();
+}
+
+void
+FrameExchangeManager::RetransmitMpduAfterMissedCts (Ptr<WifiMacQueueItem> mpdu) const
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+
+  // the MPDU should be still in the DCF queue, unless it expired.
+  // If the MPDU has never been transmitted, it will be assigned a sequence
+  // number again the next time we try to transmit it. Therefore, we need to
+  // make its sequence number available again
+  if (!mpdu->GetHeader ().IsRetry ())
+    {
+      m_txMiddle->SetSequenceNumberFor (&mpdu->GetHeader ());
+    }
+}
+
+void
+FrameExchangeManager::NotifySwitchingStartNow (Time duration)
+{
+  NS_LOG_DEBUG ("Switching channel. Cancelling MAC pending events");
+  m_mac->GetWifiRemoteStationManager ()->Reset ();
+  Reset ();
+}
+
+void
+FrameExchangeManager::NotifySleepNow (void)
+{
+  NS_LOG_DEBUG ("Device in sleep mode. Cancelling MAC pending events");
+  Reset ();
+}
+
+void
+FrameExchangeManager::NotifyOffNow (void)
+{
+  NS_LOG_DEBUG ("Device is switched off. Cancelling MAC pending events");
+  Reset ();
+}
+
+void
+FrameExchangeManager::Receive (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                               WifiTxVector txVector, std::vector<bool> perMpduStatus)
+{
+  NS_LOG_FUNCTION (this << psdu << rxSignalInfo << txVector << perMpduStatus.size ()
+                   << std::all_of (perMpduStatus.begin(), perMpduStatus.end(), [](bool v) { return v; }));
+
+  if (!perMpduStatus.empty ())
+    {
+      // for A-MPDUs, we get here only once
+      PreProcessFrame (psdu, txVector);
+    }
+
+  // ignore unicast frames that are not addressed to us
+  Mac48Address addr1 = psdu->GetAddr1 ();
+  if (!addr1.IsGroup () && addr1 != m_self)
+    {
+      if (m_promisc && psdu->GetNMpdus () == 1 && psdu->GetHeader (0).IsData ())
+        {
+          m_rxMiddle->Receive (*psdu->begin ());
+        }
+      return;
+    }
+
+  if (psdu->GetNMpdus () == 1)
+    {
+      // if perMpduStatus is not empty (i.e., this MPDU is not included in an A-MPDU)
+      // then it must contain a single value which must be true (i.e., the MPDU
+      // has been correctly received)
+      NS_ASSERT (perMpduStatus.empty () || (perMpduStatus.size () == 1 && perMpduStatus[0]));
+      // Ack and CTS do not carry Addr2
+      if (!psdu->GetHeader (0).IsAck () && !psdu->GetHeader (0).IsCts ())
+        {
+          m_mac->GetWifiRemoteStationManager ()->ReportRxOk (psdu->GetHeader (0).GetAddr2 (),
+                                                             rxSignalInfo, txVector);
+        }
+      ReceiveMpdu (*(psdu->begin ()), rxSignalInfo, txVector, perMpduStatus.empty ());
+    }
+  else
+    {
+      EndReceiveAmpdu (psdu, rxSignalInfo, txVector, perMpduStatus);
+    }
+}
+
+void
+FrameExchangeManager::PreProcessFrame (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << psdu << txVector);
+
+  UpdateNav (psdu, txVector);
+}
+
+void
+FrameExchangeManager::UpdateNav (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << psdu << txVector);
+
+  if (psdu->GetHeader (0).GetRawDuration () > 32767)
+    {
+      // When the contents of a received Duration/ID field, treated as an unsigned
+      // integer, are greater than 32 768, the contents are interpreted as appropriate
+      // for the frame type and subtype or ignored if the receiving MAC entity does
+      // not have a defined interpretation for that type and subtype (IEEE 802.11-2016
+      // sec. 10.27.3)
+      return;
+    }
+
+  Time duration = psdu->GetDuration ();
+  NS_LOG_DEBUG ("Duration/ID=" << duration);
+
+  if (psdu->GetAddr1 () == m_self)
+    {
+      // When the received frame’s RA is equal to the STA’s own MAC address, the STA
+      // shall not update its NAV (IEEE 802.11-2016, sec. 10.3.2.4)
+      return;
+    }
+
+  // For all other received frames the STA shall update its NAV when the received
+  // Duration is greater than the STA’s current NAV value (IEEE 802.11-2016 sec. 10.3.2.4)
+  Time navEnd = Simulator::Now () + duration;
+  if (navEnd > m_navEnd)
+    {
+      m_navEnd = navEnd;
+      NS_LOG_DEBUG ("Updated NAV=" << m_navEnd);
+
+      // A STA that used information from an RTS frame as the most recent basis to update
+      // its NAV setting is permitted to reset its NAV if no PHY-RXSTART.indication
+      // primitive is received from the PHY during a NAVTimeout period starting when the
+      // MAC receives a PHY-RXEND.indication primitive corresponding to the detection of
+      // the RTS frame. NAVTimeout period is equal to:
+      // (2 x aSIFSTime) + (CTS_Time) + aRxPHYStartDelay + (2 x aSlotTime)
+      // The “CTS_Time” shall be calculated using the length of the CTS frame and the data
+      // rate at which the RTS frame used for the most recent NAV update was received
+      // (IEEE 802.11-2016 sec. 10.3.2.4)
+      if (psdu->GetHeader (0).IsRts ())
+        {
+          Time navResetDelay = 2 * m_phy->GetSifs ()
+                               + WifiPhy::CalculateTxDuration (GetCtsSize (), txVector,
+                                                               m_phy->GetPhyBand ())
+                               + m_phy->CalculatePhyPreambleAndHeaderDuration (txVector)
+                               + 2 * m_phy->GetSlot ();
+          m_navResetEvent = Simulator::Schedule (navResetDelay, &FrameExchangeManager::NavResetTimeout, this);
+        }
+    }
+  NS_LOG_DEBUG ("Current NAV=" << m_navEnd);
+
+  m_channelAccessManager->NotifyNavStartNow (duration);
+}
+
+void
+FrameExchangeManager::NavResetTimeout (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_navEnd = Simulator::Now ();
+  m_channelAccessManager->NotifyNavResetNow (Seconds (0));
+}
+
+void
+FrameExchangeManager::ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu, RxSignalInfo rxSignalInfo,
+                                   const WifiTxVector& txVector, bool inAmpdu)
+{
+  NS_LOG_FUNCTION (this << *mpdu << rxSignalInfo << txVector << inAmpdu);
+  // The received MPDU is either broadcast or addressed to this station
+  NS_ASSERT (mpdu->GetHeader ().GetAddr1 ().IsGroup ()
+             || mpdu->GetHeader ().GetAddr1 () == m_self);
+
+  double rxSnr = rxSignalInfo.snr;
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
+
+  if (hdr.IsCtl ())
+    {
+      if (hdr.IsRts ())
+        {
+          NS_ABORT_MSG_IF (inAmpdu, "Received RTS as part of an A-MPDU");
+
+          // A non-VHT STA that is addressed by an RTS frame behaves as follows:
+          // - If the NAV indicates idle, the STA shall respond with a CTS frame after a SIFS
+          // - Otherwise, the STA shall not respond with a CTS frame
+          // (IEEE 802.11-2016 sec. 10.3.2.7)
+          if (m_navEnd <= Simulator::Now ())
+            {
+              NS_LOG_DEBUG ("Received RTS from=" << hdr.GetAddr2 () << ", schedule CTS");
+              Simulator::Schedule (m_phy->GetSifs (), &FrameExchangeManager::SendCtsAfterRts,
+                                   this, hdr, txVector.GetMode (), rxSnr);
+            }
+          else
+            {
+              NS_LOG_DEBUG ("Received RTS from=" << hdr.GetAddr2 () << ", cannot schedule CTS");
+            }
+        }
+      else if (hdr.IsCts () && m_txTimer.IsRunning () && m_txTimer.GetReason () == WifiTxTimer::WAIT_CTS
+               && m_mpdu != 0)
+        {
+          NS_ABORT_MSG_IF (inAmpdu, "Received CTS as part of an A-MPDU");
+          NS_ASSERT (hdr.GetAddr1 () == m_self);
+
+          Mac48Address sender = m_mpdu->GetHeader ().GetAddr1 ();
+          NS_LOG_DEBUG ("Received CTS from=" << sender);
+
+          SnrTag tag;
+          mpdu->GetPacket ()->PeekPacketTag (tag);
+          m_mac->GetWifiRemoteStationManager ()->ReportRxOk (sender, rxSignalInfo, txVector);
+          m_mac->GetWifiRemoteStationManager ()->ReportRtsOk (m_mpdu->GetHeader (),
+                                                              rxSnr, txVector.GetMode (), tag.Get ());
+
+          m_txTimer.Cancel ();
+          m_channelAccessManager->NotifyCtsTimeoutResetNow ();
+          Simulator::Schedule (m_phy->GetSifs (), &FrameExchangeManager::SendMpdu, this);
+        }
+      else if (hdr.IsAck () && m_mpdu != 0 && m_txTimer.IsRunning ()
+               && m_txTimer.GetReason () == WifiTxTimer::WAIT_NORMAL_ACK)
+        {
+          NS_ASSERT (hdr.GetAddr1 () == m_self);
+          SnrTag tag;
+          mpdu->GetPacket ()->PeekPacketTag (tag);
+          ReceivedNormalAck (m_mpdu, m_txParams.m_txVector, txVector, rxSignalInfo, tag.Get ());
+          m_mpdu = 0;
+        }
+    }
+  else if (hdr.IsMgt ())
+    {
+      NS_ABORT_MSG_IF (inAmpdu, "Received management frame as part of an A-MPDU");
+
+      if (hdr.IsBeacon () || hdr.IsProbeResp ())
+        {
+          // Apply SNR tag for beacon quality measurements
+          SnrTag tag;
+          tag.Set (rxSnr);
+          Ptr<Packet> packet = mpdu->GetPacket ()->Copy ();
+          packet->AddPacketTag (tag);
+          mpdu = Create<WifiMacQueueItem> (packet, hdr);
+        }
+
+      if (hdr.GetAddr1 () == m_self)
+        {
+          NS_LOG_DEBUG ("Received " << hdr.GetTypeString () << " from=" << hdr.GetAddr2 () << ", schedule ACK");
+          Simulator::Schedule (m_phy->GetSifs (), &FrameExchangeManager::SendNormalAck,
+                               this, hdr, txVector, rxSnr);
+        }
+
+      m_rxMiddle->Receive (mpdu);
+    }
+  else if (hdr.IsData () && !hdr.IsQosData ())
+    {
+      if (hdr.GetAddr1 () == m_self)
+        {
+          NS_LOG_DEBUG ("Received " << hdr.GetTypeString () << " from=" << hdr.GetAddr2 () << ", schedule ACK");
+          Simulator::Schedule (m_phy->GetSifs (), &FrameExchangeManager::SendNormalAck,
+                               this, hdr, txVector, rxSnr);
+        }
+
+      m_rxMiddle->Receive (mpdu);
+    }
+}
+
+void
+FrameExchangeManager::ReceivedNormalAck (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector,
+                                         const WifiTxVector& ackTxVector, const RxSignalInfo& rxInfo,
+                                         double snr)
+{
+  Mac48Address sender = mpdu->GetHeader ().GetAddr1 ();
+  NS_LOG_DEBUG ("Received ACK from=" << sender);
+
+  NotifyReceivedNormalAck (mpdu);
+
+  // When fragmentation is used, only update manager when the last fragment is acknowledged
+  if (!mpdu->GetHeader ().IsMoreFragments ())
+    {
+      m_mac->GetWifiRemoteStationManager ()->ReportRxOk (sender, rxInfo, ackTxVector);
+      m_mac->GetWifiRemoteStationManager ()->ReportDataOk (mpdu, rxInfo.snr, ackTxVector.GetMode (),
+                                                           snr, txVector);
+    }
+  // cancel the timer
+  m_txTimer.Cancel ();
+  m_channelAccessManager->NotifyAckTimeoutResetNow ();
+
+  // The CW shall be reset to aCWmin after every successful attempt to transmit
+  // a frame containing all or part of an MSDU or MMPDU (sec. 10.3.3 of 802.11-2016)
+  m_dcf->ResetCw ();
+
+  if (mpdu->GetHeader ().IsMoreFragments ())
+    {
+      // enqueue the next fragment
+      Ptr<WifiMacQueueItem> next = GetNextFragment ();
+      m_dcf->GetWifiMacQueue ()->PushFront (next);
+      m_moreFragments = true;
+    }
+
+  TransmissionSucceeded ();
+}
+
+void
+FrameExchangeManager::NotifyReceivedNormalAck (Ptr<WifiMacQueueItem> mpdu)
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+
+  // inform the MAC that the transmission was successful
+  if (!m_ackedMpduCallback.IsNull ())
+    {
+      m_ackedMpduCallback (mpdu);
+    }
+}
+
+void
+FrameExchangeManager::EndReceiveAmpdu (Ptr<const WifiPsdu> psdu, const RxSignalInfo& rxSignalInfo,
+                                       const WifiTxVector& txVector, const std::vector<bool>& perMpduStatus)
+{
+  NS_ASSERT_MSG (false, "A non-QoS station should not receive an A-MPDU");
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/frame-exchange-manager.h ns-3.34/src/wifi/model/frame-exchange-manager.h
--- ns-3.33/src/wifi/model/frame-exchange-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/frame-exchange-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,549 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef FRAME_EXCHANGE_MANAGER_H
+#define FRAME_EXCHANGE_MANAGER_H
+
+#include "ns3/object.h"
+#include "qos-txop.h"
+#include "wifi-tx-vector.h"
+#include "wifi-psdu.h"
+#include "regular-wifi-mac.h"
+#include "mac-rx-middle.h"
+#include "mac-tx-middle.h"
+#include "wifi-phy.h"
+#include "wifi-tx-timer.h"
+#include "wifi-tx-parameters.h"
+// Needed to compile wave bindings
+#include "ns3/wifi-protection-manager.h"
+#include "ns3/wifi-ack-manager.h"
+#include "channel-access-manager.h"
+
+namespace ns3 {
+
+struct RxSignalInfo;
+struct WifiProtection;
+struct WifiAcknowledgment;
+
+/**
+ * \ingroup wifi
+ *
+ * FrameExchangeManager is a base class handling the basic frame exchange
+ * sequences for non-QoS stations.
+ */
+class FrameExchangeManager : public Object
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  FrameExchangeManager ();
+  virtual ~FrameExchangeManager ();
+
+  /**
+   * typedef for a callback to invoke when an MPDU is dropped.
+   */
+  typedef Callback <void, WifiMacDropReason, Ptr<const WifiMacQueueItem>> DroppedMpdu;
+  /**
+   * typedef for a callback to invoke when an MPDU is successfully acknowledged.
+   */
+  typedef Callback <void, Ptr<const WifiMacQueueItem>> AckedMpdu;
+
+  /**
+   * Request the FrameExchangeManager to start a frame exchange sequence.
+   *
+   * \param dcf the channel access function that gained channel access. It is
+   *            the DCF on non-QoS stations and an EDCA on QoS stations.
+   * \return true if a frame exchange sequence was started, false otherwise
+   */
+  virtual bool StartTransmission (Ptr<Txop> dcf);
+
+  /**
+   * This method is intended to be called by the PHY layer every time an MPDU
+   * is received and also when the reception of an A-MPDU is completed. In case
+   * the PSDU contains multiple MPDUs, the <i>perMpduStatus</i> vector is empty
+   * when receiving the individual MPDUs.
+   *
+   * \param psdu the received PSDU
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+   * \param txVector TxVector of the received PSDU
+   * \param perMpduStatus per MPDU reception status
+   */
+  void Receive (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                WifiTxVector txVector, std::vector<bool> perMpduStatus);
+
+  /**
+   * Set the MAC layer to use.
+   *
+   * \param mac the MAC layer to use
+   */
+  virtual void SetWifiMac (const Ptr<RegularWifiMac> mac);
+  /**
+   * Set the MAC TX Middle to use.
+   *
+   * \param txMiddle the MAC TX Middle to use
+   */
+  virtual void SetMacTxMiddle (const Ptr<MacTxMiddle> txMiddle);
+  /**
+   * Set the MAC RX Middle to use.
+   *
+   * \param rxMiddle the MAC RX Middle to use
+   */
+  virtual void SetMacRxMiddle (const Ptr<MacRxMiddle> rxMiddle);
+  /**
+   * Set the channel access manager to use
+   *
+   * \param channelAccessManager the channel access manager to use
+   */
+  virtual void SetChannelAccessManager (const Ptr<ChannelAccessManager> channelAccessManager);
+  /**
+   * Set the PHY layer to use.
+   *
+   * \param phy the PHY layer to use
+   */
+  virtual void SetWifiPhy (const Ptr<WifiPhy> phy);
+  /**
+   * Remove WifiPhy associated with this MacLow.
+   */
+  virtual void ResetPhy (void);
+  /**
+   * Set the Protection Manager to use
+   *
+   * \param protectionManager the Protection Manager to use
+   */
+  virtual void SetProtectionManager (Ptr<WifiProtectionManager> protectionManager);
+  /**
+   * Set the Acknowledgment Manager to use
+   *
+   * \param ackManager the Acknowledgment Manager to use
+   */
+  virtual void SetAckManager (Ptr<WifiAckManager> ackManager);
+  /**
+   * Set the MAC address.
+   *
+   * \param address the MAC address
+   */
+  virtual void SetAddress (Mac48Address address);
+  /**
+   * Set the Basic Service Set Identification.
+   *
+   * \param bssid the BSSID
+   */
+  virtual void SetBssid (Mac48Address bssid);
+  /**
+   * Set the callback to invoke when an MPDU is dropped.
+   *
+   * \param callback the callback to invoke when an MPDU is dropped
+   */
+  virtual void SetDroppedMpduCallback (DroppedMpdu callback);
+  /**
+   * Set the callback to invoke when an MPDU is successfully acked.
+   *
+   * \param callback the callback to invoke when an MPDU is successfully acked
+   */
+  void SetAckedMpduCallback (AckedMpdu callback);
+  /**
+   * Enable promiscuous mode.
+   */
+  void SetPromisc (void);
+  /**
+   * Check if the device is operating in promiscuous mode.
+   *
+   * \return true if the device is operating in promiscuous mode,
+   *         false otherwise
+   */
+  bool IsPromisc (void) const;
+
+  /**
+   * Get a const reference to the WifiTxTimer object.
+   *
+   * \return a const reference to the WifiTxTimer object
+   */
+  const WifiTxTimer& GetWifiTxTimer (void) const;
+
+  /**
+   * Get the Protection Manager used by this node.
+   *
+   * \return the Protection Manager used by this node
+   */
+  Ptr<WifiProtectionManager> GetProtectionManager (void) const;
+
+  /**
+   * Calculate the time required to protect a frame according to the given
+   * protection method. The protection time is stored in the protection
+   * object itself.
+   *
+   * \param protection the protection method
+   */
+  virtual void CalculateProtectionTime (WifiProtection* protection) const;
+
+  /**
+   * Get the Acknowledgment Manager used by this node.
+   *
+   * \return the Acknowledgment Manager used by this node
+   */
+  Ptr<WifiAckManager> GetAckManager (void) const;
+
+  /**
+   * Calculate the time required to acknowledge a frame according to the given
+   * acknowledgment method. The acknowledgment time is stored in the acknowledgment
+   * object itself.
+   *
+   * \param acknowledgment the acknowledgment method
+   */
+  virtual void CalculateAcknowledgmentTime (WifiAcknowledgment* acknowledgment) const;
+
+  /**
+   * \param duration switching delay duration.
+   *
+   * This method is typically invoked by the PhyMacLowListener to notify
+   * the MAC layer that a channel switching occurred. When a channel switching
+   * occurs, pending MAC transmissions (RTS, CTS, Data and Ack) are cancelled.
+   */
+  void NotifySwitchingStartNow (Time duration);
+
+  /**
+   * This method is typically invoked by the PhyMacLowListener to notify
+   * the MAC layer that the device has been put into sleep mode. When the device is put
+   * into sleep mode, pending MAC transmissions (RTS, CTS, Data and Ack) are cancelled.
+   */
+  void NotifySleepNow (void);
+
+  /**
+   * This method is typically invoked by the PhyMacLowListener to notify
+   * the MAC layer that the device has been put into off mode. When the device is put
+   * into off mode, pending MAC transmissions (RTS, CTS, Data and Ack) are cancelled.
+   */
+  void NotifyOffNow (void);
+
+protected:
+  void DoDispose () override;
+
+  /**
+   * Fragment the given MPDU if needed. If fragmentation is needed, return the
+   * first fragment; otherwise, return the given MPDU. Note that, if fragmentation
+   * is applied, the given MPDU is dequeued from the MAC queue and the first
+   * fragment is enqueued in its place.
+   *
+   * \param mpdu the given MPDU
+   * \return the first fragment if fragmentation is needed, the given MPDU otherwise
+   */
+  Ptr<WifiMacQueueItem> GetFirstFragmentIfNeeded (Ptr<WifiMacQueueItem> mpdu);
+
+  /**
+   * Send an MPDU with the given TX parameters (with the specified protection).
+   * Note that <i>txParams</i> is moved to m_txParams and hence is left in an
+   * undefined state.
+   *
+   * \param mpdu the MPDU to send
+   * \param txParams the TX parameters to use to transmit the MPDU
+   */
+  void SendMpduWithProtection (Ptr<WifiMacQueueItem> mpdu, WifiTxParameters& txParams);
+
+  /**
+   * Update the NAV, if needed, based on the Duration/ID of the given <i>psdu</i>.
+   *
+   * \param psdu the received PSDU
+   * \param txVector TxVector of the received PSDU
+   */
+  virtual void UpdateNav (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector);
+
+  /**
+   * Reset the NAV upon expiration of the NAV reset timer.
+   */
+  virtual void NavResetTimeout (void);
+
+  /**
+   * This method handles the reception of an MPDU (possibly included in an A-MPDU)
+   *
+   * \param mpdu the received MPDU
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+   * \param txVector TxVector of the received PSDU
+   * \param inAmpdu true if the MPDU is part of an A-MPDU
+   */
+  virtual void ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu, RxSignalInfo rxSignalInfo,
+                            const WifiTxVector& txVector, bool inAmpdu);
+
+  /**
+   * This method is called when the reception of an A-MPDU including multiple
+   * MPDUs is completed.
+   *
+   * \param psdu the received PSDU
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+   * \param txVector TxVector of the received PSDU
+   * \param perMpduStatus per MPDU reception status
+   */
+  virtual void EndReceiveAmpdu (Ptr<const WifiPsdu> psdu, const RxSignalInfo& rxSignalInfo,
+                                const WifiTxVector& txVector, const std::vector<bool>& perMpduStatus);
+
+  /**
+   * Perform the actions needed when a Normal Ack is received.
+   *
+   * \param mpdu the MPDU that was acknowledged
+   * \param txVector the TXVECTOR used to transmit the MPDU that was acknowledged
+   * \param ackTxVector the TXVECTOR used to transmit the Normal Ack frame
+   * \param rxInfo the info on the received signal (\see RxSignalInfo)
+   * \param snr the SNR at the receiver for the MPDU that was acknowledged
+   */
+  virtual void ReceivedNormalAck (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector,
+                                  const WifiTxVector& ackTxVector, const RxSignalInfo& rxInfo, double snr);
+
+  /**
+   * Notify other components that an MPDU was acknowledged.
+   *
+   * \param mpdu the MPDU that was acknowledged
+   */
+  virtual void NotifyReceivedNormalAck (Ptr<WifiMacQueueItem> mpdu);
+
+  /**
+   * Retransmit an MPDU that was not acknowledged.
+   *
+   * \param mpdu the MPDU to retransmit
+   */
+  virtual void RetransmitMpduAfterMissedAck (Ptr<WifiMacQueueItem> mpdu) const;
+
+  /**
+   * Retransmit an MPDU that was not sent because a CTS was not received.
+   *
+   * \param mpdu the MPDU to retransmit
+   */
+  virtual void RetransmitMpduAfterMissedCts (Ptr<WifiMacQueueItem> mpdu) const;
+
+  /**
+   * Pass the given MPDU, discarded because of the max retry limit was reached,
+   * to the MPDU dropped callback.
+   *
+   * \param mpdu the discarded MPDU
+   */
+  virtual void NotifyPacketDiscarded (Ptr<const WifiMacQueueItem> mpdu);
+
+  /**
+   * Perform actions that are possibly needed when receiving any frame,
+   * independently of whether the frame is addressed to this station
+   * (e.g., setting the NAV or the TXOP holder).
+   *
+   * \param psdu the received PSDU
+   * \param txVector TX vector of the received PSDU
+   */
+  virtual void PreProcessFrame (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector);
+
+  /**
+   * Get the updated TX duration of the frame associated with the given TX
+   * parameters if the size of the PSDU addressed to the given receiver
+   * becomes <i>ppduPayloadSize</i>.
+   *
+   * \param ppduPayloadSize the new PSDU size
+   * \param receiver the MAC address of the receiver of the PSDU
+   * \param txParams the TX parameters
+   * \return the updated TX duration
+   */
+  virtual Time GetTxDuration (uint32_t ppduPayloadSize, Mac48Address receiver,
+                                 const WifiTxParameters& txParams) const;
+
+  /**
+   * Update the TX duration field of the given TX parameters after that the PSDU
+   * addressed to the given receiver has changed.
+   *
+   * \param receiver the MAC address of the receiver of the PSDU
+   * \param txParams the TX parameters
+   */
+  void UpdateTxDuration (Mac48Address receiver, WifiTxParameters& txParams) const;
+
+  Ptr<Txop> m_dcf;                                  //!< the DCF/EDCAF that gained channel access
+  WifiTxTimer m_txTimer;                            //!< the timer set upon frame transmission
+  EventId m_navResetEvent;                          //!< the event to reset the NAV after an RTS
+  Ptr<RegularWifiMac> m_mac;                        //!< the MAC layer on this station
+  Ptr<MacTxMiddle> m_txMiddle;                      //!< the MAC TX Middle on this station
+  Ptr<MacRxMiddle> m_rxMiddle;                      //!< the MAC RX Middle on this station
+  Ptr<ChannelAccessManager> m_channelAccessManager; //!< the channel access manager
+  Ptr<WifiPhy> m_phy;                               //!< the PHY layer on this station
+  Mac48Address m_self;                              //!< the MAC address of this device
+  Mac48Address m_bssid;                             //!< BSSID address (Mac48Address)
+  Time m_navEnd;                                    //!< NAV expiration time
+  bool m_promisc;                                   //!< Flag if the device is operating in promiscuous mode
+  DroppedMpdu m_droppedMpduCallback;                //!< the dropped MPDU callback
+  AckedMpdu m_ackedMpduCallback;                    //!< the acknowledged MPDU callback
+
+  /**
+   * Forward an MPDU down to the PHY layer.
+   *
+   * \param mpdu the MPDU to forward down
+   * \param txVector the TXVECTOR used to transmit the MPDU
+   */
+  virtual void ForwardMpduDown (Ptr<WifiMacQueueItem> mpdu, WifiTxVector& txVector);
+
+  /**
+   * Dequeue the given MPDU from the queue in which it is stored.
+   *
+   * \param mpdu the given MPDU
+   */
+  virtual void DequeueMpdu (Ptr<WifiMacQueueItem> mpdu);
+
+  /**
+   * Compute how to set the Duration/ID field of a frame being transmitted with
+   * the given TX parameters
+   *
+   * \param header the MAC header of the frame
+   * \param size the size of the frame in bytes
+   * \param txParams the TX parameters used to send the frame
+   * \param fragmentedPacket the packet that originated the frame to transmit, in case
+   *                         the latter is a fragment
+   * \return the computed Duration/ID value
+   */
+  virtual Time GetFrameDurationId (const WifiMacHeader& header, uint32_t size,
+                                   const WifiTxParameters& txParams,
+                                   Ptr<Packet> fragmentedPacket) const;
+
+  /**
+   * Compute how to set the Duration/ID field of an RTS frame to send to protect
+   * a frame transmitted with the given TX vector.
+   *
+   * \param rtsTxVector the TX vector used to send the RTS frame
+   * \param txDuration the TX duration of the data frame
+   * \param response the time taken by the response (acknowledgment) to the data frame
+   * \return the computed Duration/ID value for the RTS frame
+   */
+  virtual Time GetRtsDurationId (const WifiTxVector& rtsTxVector, Time txDuration, Time response) const;
+
+  /**
+   * Send RTS to begin RTS-CTS-Data-Ack transaction.
+   *
+   * \param txParams the TX parameters for the data frame
+   */
+  void SendRts (const WifiTxParameters& txParams);
+
+  /**
+   * Send CTS after receiving RTS.
+   *
+   * \param rtsHdr the header of the received RTS
+   * \param rtsTxMode the TX mode used to transmit the RTS
+   * \param rtsSnr the SNR of the RTS in linear scale
+   */
+  void SendCtsAfterRts (const WifiMacHeader& rtsHdr, WifiMode rtsTxMode, double rtsSnr);
+
+  /**
+   * Send CTS after receiving RTS.
+   *
+   * \param rtsHdr the header of the received RTS
+   * \param ctsTxVector the TXVECTOR to use to transmit the CTS
+   * \param rtsSnr the SNR of the RTS in linear scale
+   */
+  void DoSendCtsAfterRts (const WifiMacHeader& rtsHdr, WifiTxVector& ctsTxVector, double rtsSnr);
+
+  /**
+   * Compute how to set the Duration/ID field of a CTS-to-self frame to send to
+   * protect a frame transmitted with the given TX vector.
+   *
+   * \param ctsTxVector the TX vector used to send the CTS-to-self frame
+   * \param txDuration the TX duration of the data frame
+   * \param response the time taken by the response (acknowledgment) to the data frame
+   * \return the computed Duration/ID value for the CTS-to-self frame
+   */
+  virtual Time GetCtsToSelfDurationId (const WifiTxVector& ctsTxVector, Time txDuration,
+                                       Time response) const;
+
+  /**
+   * Send CTS for a CTS-to-self mechanism.
+   *
+   * \param txParams the TX parameters for the data frame
+   */
+  void SendCtsToSelf (const WifiTxParameters& txParams);
+
+  /**
+   * Send Normal Ack.
+   *
+   * \param hdr the header of the frame soliciting the Normal Ack
+   * \param dataTxVector the TXVECTOR used to transmit the frame soliciting the Normal Ack
+   * \param dataSnr the SNR of the frame soliciting the Normal Ack in linear scale
+   */
+  void SendNormalAck (const WifiMacHeader& hdr, const WifiTxVector& dataTxVector, double dataSnr);
+
+  /**
+   * Get the next fragment of the current MSDU.
+   * Only called for fragmented MSDUs.
+   *
+   * \return the next fragment of the current MSDU.
+   */
+  Ptr<WifiMacQueueItem> GetNextFragment (void);
+
+  /**
+   * Take necessary actions upon a transmission success. A non-QoS station
+   * transmits the next fragment, if any, or releases the channel, otherwise.
+   */
+  virtual void TransmissionSucceeded (void);
+
+  /**
+   * Take necessary actions upon a transmission failure. A non-QoS station
+   * releases the channel when this method is called.
+   */
+  virtual void TransmissionFailed (void);
+
+  /**
+   * Called when the Ack timeout expires.
+   *
+   * \param mpdu the MPDU that solicited a Normal Ack response
+   * \param txVector the TXVECTOR used to transmit the frame soliciting the Normal Ack
+   */
+  void NormalAckTimeout (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector);
+
+  /**
+   * Called when the CTS timeout expires.
+   *
+   * \param rts the RTS that solicited a CTS response
+   * \param txVector the TXVECTOR used to transmit the RTS frame
+   */
+  virtual void CtsTimeout (Ptr<WifiMacQueueItem> rts, const WifiTxVector& txVector);
+
+private:
+  /**
+   * \param txVector the TXVECTOR decoded from PHY header.
+   * \param psduDuration the duration of the PSDU that is about to be received.
+   *
+   * This method is typically invoked by the lower PHY layer to notify
+   * the MAC layer that the reception of a PSDU is starting.
+   * This is equivalent to the PHY-RXSTART primitive.
+   * If the reception is correct for at least one MPDU of the PSDU
+   * the Receive method will be called after \p psduDuration.
+   */
+  void RxStartIndication (WifiTxVector txVector, Time psduDuration);
+
+  /**
+   * Send the current MPDU, which can be acknowledged by a Normal Ack.
+   */
+  void SendMpdu (void);
+
+  /**
+   * Reset this frame exchange manager.
+   */
+  virtual void Reset (void);
+
+  Ptr<WifiMacQueueItem> m_mpdu;                   //!< the MPDU being transmitted
+  WifiTxParameters m_txParams;                    //!< the TX parameters for the current frame
+  Ptr<Packet> m_fragmentedPacket;                 //!< the MSDU being fragmented
+  bool m_moreFragments;                           //!< true if a fragment has to be sent after a SIFS
+  Ptr<WifiProtectionManager> m_protectionManager; //!< Protection manager
+  Ptr<WifiAckManager> m_ackManager;               //!< Acknowledgment manager
+};
+
+} //namespace ns3
+
+#endif /* FRAME_EXCHANGE_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/constant-obss-pd-algorithm.cc ns-3.34/src/wifi/model/he/constant-obss-pd-algorithm.cc
--- ns-3.33/src/wifi/model/he/constant-obss-pd-algorithm.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/constant-obss-pd-algorithm.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,108 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "ns3/log.h"
+#include "ns3/node.h"
+#include "ns3/config.h"
+#include "ns3/double.h"
+#include "constant-obss-pd-algorithm.h"
+#include "ns3/sta-wifi-mac.h"
+#include "ns3/wifi-utils.h"
+#include "ns3/wifi-phy.h"
+#include "he-phy.h"
+#include "ns3/wifi-net-device.h"
+#include "he-configuration.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("ConstantObssPdAlgorithm");
+NS_OBJECT_ENSURE_REGISTERED (ConstantObssPdAlgorithm);
+
+ConstantObssPdAlgorithm::ConstantObssPdAlgorithm ()
+  : ObssPdAlgorithm ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+TypeId
+ConstantObssPdAlgorithm::GetTypeId (void)
+{
+  static ns3::TypeId tid = ns3::TypeId ("ns3::ConstantObssPdAlgorithm")
+    .SetParent<ObssPdAlgorithm> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<ConstantObssPdAlgorithm> ()
+  ;
+  return tid;
+}
+
+void
+ConstantObssPdAlgorithm::ConnectWifiNetDevice (const Ptr<WifiNetDevice> device)
+{
+  Ptr<WifiPhy> phy = device->GetPhy ();
+  auto hePhy = DynamicCast<HePhy> (phy->GetPhyEntity (WIFI_MOD_CLASS_HE));
+  NS_ASSERT (hePhy);
+  hePhy->SetEndOfHeSigACallback (MakeCallback (&ConstantObssPdAlgorithm::ReceiveHeSigA, this));
+  ObssPdAlgorithm::ConnectWifiNetDevice (device);
+}
+
+void
+ConstantObssPdAlgorithm::ReceiveHeSigA (HeSigAParameters params)
+{
+  NS_LOG_FUNCTION (this << +params.bssColor << WToDbm (params.rssiW));
+
+  Ptr<StaWifiMac> mac = m_device->GetMac ()->GetObject<StaWifiMac>();
+  if (mac && !mac->IsAssociated ())
+    {
+      NS_LOG_DEBUG ("This is not an associated STA: skip OBSS PD algorithm");
+      return;
+    }
+
+  Ptr<HeConfiguration> heConfiguration = m_device->GetHeConfiguration ();
+  NS_ASSERT (heConfiguration);
+  uint8_t bssColor = heConfiguration->GetBssColor ();
+
+  if (bssColor == 0)
+    {
+      NS_LOG_DEBUG ("BSS color is 0");
+      return;
+    }
+  if (params.bssColor == 0)
+    {
+      NS_LOG_DEBUG ("Received BSS color is 0");
+      return;
+    }
+  //TODO: SRP_AND_NON-SRG_OBSS-PD_PROHIBITED=1 => OBSS_PD SR is not allowed
+
+  bool isObss = (bssColor != params.bssColor);
+  if (isObss)
+    {
+      if (WToDbm (params.rssiW) < m_obssPdLevel)
+        {
+          NS_LOG_DEBUG ("Frame is OBSS and RSSI " << WToDbm(params.rssiW) << " is below OBSS-PD level of " << m_obssPdLevel << "; reset PHY to IDLE");
+          ResetPhy (params);
+        }
+      else
+        {
+          NS_LOG_DEBUG ("Frame is OBSS and RSSI is above OBSS-PD level");
+        }
+    }
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/constant-obss-pd-algorithm.h ns-3.34/src/wifi/model/he/constant-obss-pd-algorithm.h
--- ns-3.33/src/wifi/model/he/constant-obss-pd-algorithm.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/constant-obss-pd-algorithm.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,59 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef CONSTANT_OBSS_PD_ALGORITHM_H
+#define CONSTANT_OBSS_PD_ALGORITHM_H
+
+#include "obss-pd-algorithm.h"
+
+namespace ns3 {
+
+/**
+ * \brief Constant OBSS PD algorithm
+ * \ingroup wifi
+ *
+ * This constant OBSS_PD algorithm is a simple OBSS_PD algorithm which evaluates if a receiving
+ * signal should be accepted or rejected based on a constant threshold.
+ *
+ * Once a HE-SIG-A has been received by the PHY, the ReceiveHeSigA method is
+ * triggered. The algorithm then checks whether this is an OBSS frame by comparing its own BSS
+ * color with the BSS color of the received preamble. If this is an OBSS frame, it compares the
+ * received RSSI with its configured OBSS_PD level value. The PHY then gets reset to IDLE state
+ * in case the received RSSI is lower than that constant OBSS PD level value, and is informed
+ * about TX power restrictions that might be applied to the next transmission.
+ */
+class ConstantObssPdAlgorithm : public ObssPdAlgorithm
+{
+public:
+  ConstantObssPdAlgorithm ();
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  void ConnectWifiNetDevice (const Ptr<WifiNetDevice> device) override;
+  void ReceiveHeSigA (HeSigAParameters params) override;
+};
+
+} //namespace ns3
+
+#endif /* CONSTANT_OBSS_PD_ALGORITHM_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-capabilities.cc ns-3.34/src/wifi/model/he/he-capabilities.cc
--- ns-3.33/src/wifi/model/he/he-capabilities.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-capabilities.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,517 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "he-capabilities.h"
+#include <algorithm>
+
+namespace ns3 {
+
+HeCapabilities::HeCapabilities ()
+  : m_plusHtcHeSupport (0),
+    m_twtRequesterSupport (0),
+    m_twtResponderSupport (0),
+    m_fragmentationSupport (0),
+    m_maximumNumberOfFragmentedMsdus (0),
+    m_minimumFragmentSize (0),
+    m_triggerFrameMacPaddingDuration (0),
+    m_multiTidAggregationSupport (0),
+    m_heLinkAdaptation (0),
+    m_allAckSupport (0),
+    m_ulMuResponseSchedulingSupport (0),
+    m_aBsrSupport (0),
+    m_broadcastTwtSupport (0),
+    m_32bitBaBitmapSupport (0),
+    m_muCascadeSupport (0),
+    m_ackEnabledMultiTidAggregationSupport (0),
+    m_groupAddressedMultiStaBlockAckInDlMuSupport (0),
+    m_omControlSupport (0),
+    m_ofdmaRaSupport (0),
+    m_maxAmpduLengthExponent (0),
+    m_amsduFragmentationSupport (0),
+    m_flexibleTwtScheduleSupport (0),
+    m_rxControlFrameToMultiBss (0),
+    m_bsrpAmpduAggregation (0),
+    m_qtpSupport (0),
+    m_aBqrSupport (0),
+    m_dualBandSupport (0),
+    m_channelWidthSet (0),
+    m_preamblePuncturingRx (0),
+    m_deviceClass (0),
+    m_ldpcCodingInPayload (0),
+    m_heLtfAndGiForHePpdus (0),
+    m_heLtfAndGiForNdp (0),
+    m_stbcTxAndRx (0),
+    m_doppler (0),
+    m_ulMu (0),
+    m_dcmEncodingTx (0),
+    m_dcmEncodingRx (0),
+    m_ulHeMuPpduPayloadSupport (0),
+    m_suBeamformer (0),
+    m_suBeamformee (0),
+    m_muBeamformer (0),
+    m_beamformeeStsForSmallerOrEqualThan80Mhz (0),
+    m_nstsTotalForSmallerOrEqualThan80Mhz (0),
+    m_beamformeeStsForLargerThan80Mhz (0),
+    m_nstsTotalForLargerThan80Mhz (0),
+    m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz (0),
+    m_numberOfSoundingDimensionsForLargerThan80Mhz (0),
+    m_ngEqual16ForSuFeedbackSupport (0),
+    m_ngEqual16ForMuFeedbackSupport (0),
+    m_codebookSize42ForSuSupport (0),
+    m_codebookSize75ForSuSupport (0),
+    m_beamformingFeedbackWithTriggerFrame (0),
+    m_heErSuPpduPayload (0),
+    m_dlMuMimoOnPartialBandwidth (0),
+    m_ppeThresholdPresent (0),
+    m_srpBasedSrSupport (0),
+    m_powerBoostFactorAlphaSupport (0),
+    m_4TimesHeLtfAnd800NsGiSupportForHePpdus (0),
+    m_highestNssSupportedM1 (0),
+    m_highestMcsSupported (0),
+    m_heSupported (0)
+{
+  m_txBwMap.resize (8,0);
+  m_rxBwMap.resize (8,0);
+}
+
+WifiInformationElementId
+HeCapabilities::ElementId () const
+{
+  return IE_EXTENSION;
+}
+
+WifiInformationElementId
+HeCapabilities::ElementIdExt () const
+{
+  return IE_EXT_HE_CAPABILITIES;
+}
+
+void
+HeCapabilities::SetHeSupported (uint8_t heSupported)
+{
+  m_heSupported = heSupported;
+}
+
+uint8_t
+HeCapabilities::GetInformationFieldSize () const
+{
+  //we should not be here if HE is not supported
+  NS_ASSERT (m_heSupported > 0);
+  return 19; //todo: variable length!
+}
+
+Buffer::Iterator
+HeCapabilities::Serialize (Buffer::Iterator i) const
+{
+  if (m_heSupported < 1)
+    {
+      return i;
+    }
+  return WifiInformationElement::Serialize (i);
+}
+
+uint16_t
+HeCapabilities::GetSerializedSize () const
+{
+  if (m_heSupported < 1)
+    {
+      return 0;
+    }
+  return WifiInformationElement::GetSerializedSize ();
+}
+
+void
+HeCapabilities::SerializeInformationField (Buffer::Iterator start) const
+{
+  if (m_heSupported == 1)
+    {
+      //write the corresponding value for each bit
+      start.WriteHtolsbU32 (GetHeMacCapabilitiesInfo1 ());
+      start.WriteU8 (GetHeMacCapabilitiesInfo2 ());
+      start.WriteHtolsbU64 (GetHePhyCapabilitiesInfo1 ());
+      start.WriteU8 (GetHePhyCapabilitiesInfo2 ());
+      start.WriteHtolsbU32 (GetSupportedMcsAndNss ());
+      //todo: add another 32-bits field if 160 MHz channel is supported (variable length)
+      //todo: optional PPE Threshold field (variable length)
+    }
+}
+
+uint8_t
+HeCapabilities::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
+{
+  Buffer::Iterator i = start;
+  uint32_t macCapabilities1 = i.ReadLsbtohU32 ();
+  uint8_t macCapabilities2 = i.ReadU8 ();
+  uint64_t phyCapabilities1 = i.ReadLsbtohU64 ();
+  uint8_t phyCapabilities2 = i.ReadU8 ();
+  uint32_t mcsset = i.ReadU32 ();
+  SetHeMacCapabilitiesInfo (macCapabilities1, macCapabilities2);
+  SetHePhyCapabilitiesInfo (phyCapabilities1, phyCapabilities2);
+  SetSupportedMcsAndNss (mcsset);
+  //todo: add another 32-bits field if 160 MHz channel is supported (variable length)
+  //todo: optional PPE Threshold field (variable length)
+  return length;
+}
+
+void
+HeCapabilities::SetHeMacCapabilitiesInfo (uint32_t ctrl1, uint8_t ctrl2)
+{
+  m_plusHtcHeSupport = ctrl1 & 0x01;
+  m_twtRequesterSupport = (ctrl1 >> 1) & 0x01;
+  m_twtResponderSupport = (ctrl1 >> 2) & 0x01;
+  m_fragmentationSupport = (ctrl1 >> 3) & 0x03;
+  m_maximumNumberOfFragmentedMsdus = (ctrl1 >> 5) & 0x07;
+  m_minimumFragmentSize = (ctrl1 >> 8) & 0x03;
+  m_triggerFrameMacPaddingDuration = (ctrl1 >> 10) & 0x03;
+  m_multiTidAggregationSupport = (ctrl1 >> 12) & 0x07;
+  m_heLinkAdaptation = (ctrl1 >> 15) & 0x03;
+  m_allAckSupport = (ctrl1 >> 17) & 0x01;
+  m_ulMuResponseSchedulingSupport = (ctrl1 >> 18) & 0x01;
+  m_aBsrSupport = (ctrl1 >> 19) & 0x01;
+  m_broadcastTwtSupport = (ctrl1 >> 20) & 0x01;
+  m_32bitBaBitmapSupport = (ctrl1 >> 21) & 0x01;
+  m_muCascadeSupport = (ctrl1 >> 22) & 0x01;
+  m_ackEnabledMultiTidAggregationSupport = (ctrl1 >> 23) & 0x01;
+  m_groupAddressedMultiStaBlockAckInDlMuSupport = (ctrl1 >> 24) & 0x01;
+  m_omControlSupport = (ctrl1 >> 25) & 0x03;
+  m_ofdmaRaSupport = (ctrl1 >> 26) & 0x01;
+  m_maxAmpduLengthExponent = (ctrl1 >> 27) & 0x03;
+  m_amsduFragmentationSupport = (ctrl1 >> 29) & 0x01;
+  m_flexibleTwtScheduleSupport = (ctrl1 >> 30) & 0x01;
+  m_rxControlFrameToMultiBss = (ctrl1 >> 31) & 0x01;
+  m_bsrpAmpduAggregation = ctrl2 & 0x01;
+  m_qtpSupport = (ctrl2 >> 1) & 0x01;
+  m_aBqrSupport = (ctrl2 >> 2) & 0x01;
+}
+
+uint32_t
+HeCapabilities::GetHeMacCapabilitiesInfo1 () const
+{
+  uint32_t val = 0;
+  val |= m_plusHtcHeSupport & 0x01;
+  val |= (m_twtRequesterSupport & 0x01) << 1;
+  val |= (m_twtResponderSupport & 0x01) << 2;
+  val |= (m_fragmentationSupport & 0x03) << 3;
+  val |= (m_maximumNumberOfFragmentedMsdus & 0x07) << 5;
+  val |= (m_minimumFragmentSize & 0x03) << 8;
+  val |= (m_triggerFrameMacPaddingDuration & 0x03) << 10;
+  val |= (m_multiTidAggregationSupport & 0x07) << 12;
+  val |= (m_heLinkAdaptation & 0x03) << 15;
+  val |= (m_allAckSupport & 0x01) << 17;
+  val |= (m_ulMuResponseSchedulingSupport & 0x01) << 18;
+  val |= (m_aBsrSupport & 0x01) << 19;
+  val |= (m_broadcastTwtSupport & 0x01) << 20;
+  val |= (m_32bitBaBitmapSupport & 0x01) << 21;
+  val |= (m_muCascadeSupport & 0x01) << 22;
+  val |= (m_ackEnabledMultiTidAggregationSupport & 0x01) << 23;
+  val |= (m_groupAddressedMultiStaBlockAckInDlMuSupport & 0x01) << 24;
+  val |= (m_omControlSupport & 0x03) << 25;
+  val |= (m_ofdmaRaSupport & 0x01) << 26;
+  val |= (m_maxAmpduLengthExponent & 0x03) << 27;
+  val |= (m_amsduFragmentationSupport & 0x01) << 29;
+  val |= (m_flexibleTwtScheduleSupport & 0x01) << 30;
+  val |= (m_rxControlFrameToMultiBss & 0x01) << 31;
+  return val;
+}
+
+uint8_t
+HeCapabilities::GetHeMacCapabilitiesInfo2 () const
+{
+  uint8_t val = 0;
+  val |= m_bsrpAmpduAggregation & 0x01;
+  val |= (m_qtpSupport & 0x01) << 1;
+  val |= (m_aBqrSupport & 0x01) << 2;
+  return val;
+}
+
+void
+HeCapabilities::SetHePhyCapabilitiesInfo (uint64_t ctrl1, uint8_t ctrl2)
+{
+  m_dualBandSupport = ctrl1 & 0x01;
+  m_channelWidthSet = (ctrl1 >> 1) & 0x7f;
+  m_preamblePuncturingRx = (ctrl1 >> 8) & 0x0f;
+  m_deviceClass = (ctrl1 >> 12) & 0x01;
+  m_ldpcCodingInPayload = (ctrl1 >> 13) & 0x01;
+  m_heLtfAndGiForHePpdus = (ctrl1 >> 14) & 0x03;
+  m_heLtfAndGiForNdp = (ctrl1 >> 16) & 0x03;
+  m_stbcTxAndRx = (ctrl1 >> 18) & 0x03;
+  m_doppler = (ctrl1 >> 20) & 0x03;
+  m_ulMu = (ctrl1 >> 22) & 0x03;
+  m_dcmEncodingTx = (ctrl1 >> 24) & 0x0f;
+  m_dcmEncodingRx = (ctrl1 >> 27) & 0x0f;
+  m_ulHeMuPpduPayloadSupport = (ctrl1 >> 30) & 0x01;
+  m_suBeamformer = (ctrl1 >> 31) & 0x01;
+  m_suBeamformee = (ctrl1 >> 32) & 0x01;
+  m_muBeamformer = (ctrl1 >> 33) & 0x01;
+  m_beamformeeStsForSmallerOrEqualThan80Mhz = (ctrl1 >> 34) & 0x07;
+  m_nstsTotalForSmallerOrEqualThan80Mhz = (ctrl1 >> 37) & 0x07;
+  m_beamformeeStsForLargerThan80Mhz = (ctrl1 >> 40) & 0x07;
+  m_nstsTotalForLargerThan80Mhz = (ctrl1 >> 43) & 0x07;
+  m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz = (ctrl1 >> 46) & 0x07;
+  m_numberOfSoundingDimensionsForLargerThan80Mhz = (ctrl1 >> 49) & 0x07;
+  m_ngEqual16ForSuFeedbackSupport = (ctrl1 >> 52) & 0x01;
+  m_ngEqual16ForMuFeedbackSupport = (ctrl1 >> 53) & 0x01;
+  m_codebookSize42ForSuSupport = (ctrl1 >> 54) & 0x01;
+  m_codebookSize75ForSuSupport = (ctrl1 >> 55) & 0x01;
+  m_beamformingFeedbackWithTriggerFrame = (ctrl1 >> 56) & 0x07;
+  m_heErSuPpduPayload = (ctrl1 >> 59) & 0x01;
+  m_dlMuMimoOnPartialBandwidth = (ctrl1 >> 60) & 0x01;
+  m_ppeThresholdPresent = (ctrl1 >> 61) & 0x01;
+  m_srpBasedSrSupport = (ctrl1 >> 62) & 0x01;
+  m_powerBoostFactorAlphaSupport = (ctrl1 >> 63) & 0x01;
+  m_4TimesHeLtfAnd800NsGiSupportForHePpdus = ctrl2 & 0x01;
+}
+
+uint64_t
+HeCapabilities::GetHePhyCapabilitiesInfo1 () const
+{
+  uint64_t val = 0;
+  val |= m_dualBandSupport & 0x01;
+  val |= (m_channelWidthSet & 0x7f) << 1;
+  val |= (m_preamblePuncturingRx & 0x0f) << 8;
+  val |= (m_deviceClass & 0x01) << 12;
+  val |= (m_ldpcCodingInPayload & 0x01) << 13;
+  val |= (m_heLtfAndGiForHePpdus & 0x03) << 14;
+  val |= (m_heLtfAndGiForNdp & 0x03) << 16;
+  val |= (m_stbcTxAndRx & 0x03) << 18;
+  val |= (m_doppler & 0x03) << 20;
+  val |= (m_ulMu & 0x03) << 22;
+  val |= (m_dcmEncodingTx & 0x0f) << 24;
+  val |= (m_dcmEncodingRx & 0x0f) << 27;
+  val |= (m_ulHeMuPpduPayloadSupport & 0x01) << 30;
+  val |= (m_suBeamformer & 0x01) << 31;
+  val |= (static_cast<uint64_t> (m_suBeamformee) & 0x01) << 32;
+  val |= (static_cast<uint64_t> (m_muBeamformer) & 0x01) << 33;
+  val |= (static_cast<uint64_t> (m_beamformeeStsForSmallerOrEqualThan80Mhz) & 0x07) << 34;
+  val |= (static_cast<uint64_t> (m_nstsTotalForSmallerOrEqualThan80Mhz) & 0x07) << 37;
+  val |= (static_cast<uint64_t> (m_beamformeeStsForLargerThan80Mhz) & 0x07) << 40;
+  val |= (static_cast<uint64_t> (m_nstsTotalForLargerThan80Mhz) & 0x07) << 43;
+  val |= (static_cast<uint64_t> (m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz) & 0x07) << 46;
+  val |= (static_cast<uint64_t> (m_numberOfSoundingDimensionsForLargerThan80Mhz) & 0x07) << 49;
+  val |= (static_cast<uint64_t> (m_ngEqual16ForSuFeedbackSupport) & 0x01) << 52;
+  val |= (static_cast<uint64_t> (m_ngEqual16ForMuFeedbackSupport) & 0x01) << 53;
+  val |= (static_cast<uint64_t> (m_codebookSize42ForSuSupport) & 0x01) << 54;
+  val |= (static_cast<uint64_t> (m_codebookSize75ForSuSupport) & 0x01) << 55;
+  val |= (static_cast<uint64_t> (m_beamformingFeedbackWithTriggerFrame) & 0x07) << 56;
+  val |= (static_cast<uint64_t> (m_heErSuPpduPayload) & 0x01) << 59;
+  val |= (static_cast<uint64_t> (m_dlMuMimoOnPartialBandwidth) & 0x01) << 60;
+  val |= (static_cast<uint64_t> (m_ppeThresholdPresent) & 0x01) << 61;
+  val |= (static_cast<uint64_t> (m_srpBasedSrSupport) & 0x01) << 62;
+  val |= (static_cast<uint64_t> (m_powerBoostFactorAlphaSupport) & 0x01) << 63;
+  return val;
+}
+
+uint8_t
+HeCapabilities::GetHePhyCapabilitiesInfo2 () const
+{
+  uint8_t val = 0;
+  val |= m_4TimesHeLtfAnd800NsGiSupportForHePpdus & 0x01;
+  return val;
+}
+
+void
+HeCapabilities::SetSupportedMcsAndNss (uint16_t ctrl)
+{
+  m_highestNssSupportedM1 = ctrl & 0x07;
+  m_highestMcsSupported = (ctrl >> 3) & 0x07;
+  NS_ASSERT (m_highestMcsSupported <= 4);
+  uint8_t i;
+  for (i = 0; i < 5; i++)
+    {
+      m_txBwMap[i] = (ctrl >> (6 + i)) & 0x01;
+    }
+  for (i = 0; i < 5; i++)
+    {
+      m_rxBwMap[i] = (ctrl >> (11 + i)) & 0x01;
+    }
+  //todo: MCS NSS Descriptors
+}
+
+uint16_t
+HeCapabilities::GetSupportedMcsAndNss () const
+{
+  uint16_t val = 0;
+  val |= m_highestNssSupportedM1 & 0x07;
+  val |= (m_highestMcsSupported & 0x07) << 3;
+  uint8_t i;
+  for (i = 0; i < 5; i++)
+    {
+      val |= (m_txBwMap[i] & 0x01) << (6 + 1);
+    }
+  for (i = 0; i < 5; i++)
+    {
+      val |= (m_rxBwMap[i] & 0x01) << (11 + 1);
+    }
+  //todo: MCS NSS Descriptors
+  return val;
+}
+
+//todo: PPE threshold
+
+bool
+HeCapabilities::IsSupportedTxMcs (uint8_t mcs) const
+{
+  NS_ASSERT (mcs >= 0 && mcs <= 11);
+  if (mcs <= 7)
+    {
+      return true;
+    }
+  if (mcs == 8 && m_highestMcsSupported >= 1)
+    {
+      return true;
+    }
+  if (mcs == 9 && m_highestMcsSupported >= 2)
+    {
+      return true;
+    }
+  if (mcs == 10 && m_highestMcsSupported >= 3)
+    {
+      return true;
+    }
+  if (mcs == 11 && m_highestMcsSupported == 4)
+    {
+      return true;
+    }
+  return false;
+}
+
+bool
+HeCapabilities::IsSupportedRxMcs (uint8_t mcs) const
+{
+  NS_ASSERT (mcs >= 0 && mcs <= 11);
+  if (mcs <= 7)
+    {
+      return true;
+    }
+  if (mcs == 8 && m_highestMcsSupported >= 1)
+    {
+      return true;
+    }
+  if (mcs == 9 && m_highestMcsSupported >= 2)
+    {
+      return true;
+    }
+  if (mcs == 10 && m_highestMcsSupported >= 3)
+    {
+      return true;
+    }
+  if (mcs == 11 && m_highestMcsSupported == 4)
+    {
+      return true;
+    }
+  return false;
+}
+
+void
+HeCapabilities::SetChannelWidthSet (uint8_t channelWidthSet)
+{
+  NS_ASSERT (channelWidthSet <= 0x2f);
+  m_channelWidthSet = channelWidthSet;
+}
+
+void
+HeCapabilities::SetLdpcCodingInPayload (uint8_t ldpcCodingInPayload)
+{
+  m_ldpcCodingInPayload = ldpcCodingInPayload;
+}
+
+void
+HeCapabilities::SetHeLtfAndGiForHePpdus (uint8_t heLtfAndGiForHePpdus)
+{
+  NS_ASSERT (heLtfAndGiForHePpdus <= 0x03);
+  m_heLtfAndGiForHePpdus = heLtfAndGiForHePpdus;
+}
+
+void
+HeCapabilities::SetMaxAmpduLength (uint32_t maxAmpduLength)
+{
+  for (uint8_t i = 0; i <= 3; i++)
+    {
+      if ((1ul << (20 + i)) - 1 == maxAmpduLength)
+        {
+          m_maxAmpduLengthExponent = i;
+          return;
+        }
+    }
+  NS_ABORT_MSG ("Invalid A-MPDU Max Length value");
+}
+
+void
+HeCapabilities::SetHighestMcsSupported (uint8_t mcs)
+{
+  NS_ASSERT (mcs >= 7 && mcs <= 11);
+  m_highestMcsSupported = mcs - 7;
+}
+
+void
+HeCapabilities::SetHighestNssSupported (uint8_t nss)
+{
+  NS_ASSERT (nss >= 1 && nss <= 8);
+  m_highestNssSupportedM1 = nss - 1;
+}
+
+uint8_t
+HeCapabilities::GetChannelWidthSet (void) const
+{
+  return m_channelWidthSet;
+}
+
+uint8_t
+HeCapabilities::GetLdpcCodingInPayload (void) const
+{
+  return m_ldpcCodingInPayload;
+}
+
+uint8_t
+HeCapabilities::GetHeLtfAndGiForHePpdus (void) const
+{
+  return m_heLtfAndGiForHePpdus;
+}
+
+uint8_t
+HeCapabilities::GetHighestMcsSupported (void) const
+{
+  return m_highestMcsSupported + 7;
+}
+
+uint8_t
+HeCapabilities::GetHighestNssSupported (void) const
+{
+  return m_highestNssSupportedM1 + 1;
+}
+
+uint32_t
+HeCapabilities::GetMaxAmpduLength (void) const
+{
+  return std::min<uint32_t> ((1ul << (20 + m_maxAmpduLengthExponent)) - 1, 6500631);
+}
+
+std::ostream &
+operator << (std::ostream &os, const HeCapabilities &HeCapabilities)
+{
+  os << HeCapabilities.GetHeMacCapabilitiesInfo1 () << "|"
+     << +HeCapabilities.GetHeMacCapabilitiesInfo2 () << "|"
+     << HeCapabilities.GetHePhyCapabilitiesInfo1 () << "|"
+     << +HeCapabilities.GetHePhyCapabilitiesInfo2 () << "|"
+     << HeCapabilities.GetSupportedMcsAndNss ();
+  return os;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-capabilities.h ns-3.34/src/wifi/model/he/he-capabilities.h
--- ns-3.33/src/wifi/model/he/he-capabilities.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-capabilities.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,288 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef HE_CAPABILITIES_H
+#define HE_CAPABILITIES_H
+
+#include "ns3/wifi-information-element.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup wifi
+ *
+ * The IEEE 802.11ax HE Capabilities
+ */
+class HeCapabilities : public WifiInformationElement
+{
+public:
+  HeCapabilities ();
+
+  // Implementations of pure virtual methods of WifiInformationElement
+  WifiInformationElementId ElementId () const override;
+  WifiInformationElementId ElementIdExt () const override;
+  uint8_t GetInformationFieldSize () const override;
+  void SerializeInformationField (Buffer::Iterator start) const override;
+  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length) override;
+  /* This information element is a bit special in that it is only
+     included if the STA is an HE STA. To support this we
+     override the Serialize and GetSerializedSize methods of
+     WifiInformationElement. */
+  Buffer::Iterator Serialize (Buffer::Iterator start) const override;
+  uint16_t GetSerializedSize () const override;
+
+  /**
+   * Set HE supported
+   * \param heSupported the HE supported indicator
+   */
+  void SetHeSupported (uint8_t heSupported);
+
+  /**
+   * Set the HE MAC Capabilities Info field in the HE Capabilities information element.
+   *
+   * \param ctrl1 the HE MAC Capabilities Info field 1 in the HE Capabilities information element
+   * \param ctrl2 the HE MAC Capabilities Info field 2 in the HE Capabilities information element
+   */
+  void SetHeMacCapabilitiesInfo (uint32_t ctrl1, uint8_t ctrl2);
+  /**
+   * Set the HE PHY Capabilities Info field in the HE Capabilities information element.
+   *
+   * \param ctrl1 the HE PHY Capabilities Info field 1 in the HE Capabilities information element
+   * \param ctrl2 the HE PHY Capabilities Info field 2 in the HE Capabilities information element
+   */
+  void SetHePhyCapabilitiesInfo (uint64_t ctrl1, uint8_t ctrl2);
+  /**
+   * Set the MCS and NSS field in the HE Capabilities information element.
+   *
+   * \param ctrl the MCS and NSS field in the HE Capabilities information element
+   */
+  void SetSupportedMcsAndNss (uint16_t ctrl);
+
+  /**
+   * Return the 4 first octets of the HE MAC Capabilities Info field in the HE Capabilities information element.
+   *
+   * \return the 4 first octets of the HE MAC Capabilities Info field in the HE Capabilities information element
+   */
+  uint32_t GetHeMacCapabilitiesInfo1 () const;
+  /**
+   * Return the last octet of the HE MAC Capabilities Info field in the HE Capabilities information element.
+   *
+   * \return the last octet of the HE MAC Capabilities Info field in the HE Capabilities information element
+   */
+  uint8_t GetHeMacCapabilitiesInfo2 () const;
+  /**
+   * Return the 8 first octets of the HE PHY Capabilities Info field in the HE Capabilities information element.
+   *
+   * \return the 8 first octets of the HE PHY Capabilities Info field in the HE Capabilities information element
+   */
+  uint64_t GetHePhyCapabilitiesInfo1 () const;
+  /**
+   * Return the last octet of the HE PHY Capabilities Info field in the HE Capabilities information element.
+   *
+   * \return the last octet of the HE PHY Capabilities Info field in the HE Capabilities information element
+   */
+  uint8_t GetHePhyCapabilitiesInfo2 () const;
+  /**
+   * Return the MCS and NSS field in the HE Capabilities information element.
+   *
+   * \return the MCS and NSS field in the HE Capabilities information element
+   */
+  uint16_t GetSupportedMcsAndNss () const;
+
+  // PHY Capabilities Info fields
+  /**
+   * Set channel width set.
+   *
+   * \param channelWidthSet the channel width set
+   */
+  void SetChannelWidthSet (uint8_t channelWidthSet);
+  /**
+   * Set indication whether the transmission and reception of LDPC encoded packets is supported.
+   *
+   * \param ldpcCodingInPayload indication whether the transmission and reception of LDPC encoded packets is supported
+   */
+  void SetLdpcCodingInPayload (uint8_t ldpcCodingInPayload);
+  /**
+   * Set HE LTF and GI for HE PDPUs.
+   *
+   * \param heLtfAndGiForHePpdus the HE LTF and GI
+   */
+  void SetHeLtfAndGiForHePpdus (uint8_t heLtfAndGiForHePpdus);
+  /**
+   * Get channel width set.
+   *
+   * \returns the channel width set
+   */
+  uint8_t GetChannelWidthSet (void) const;
+  /**
+   * Indicates support for the transmission and reception of LDPC encoded packets.
+   *
+   * \returns indication whether the transmission and reception of LDPC encoded packets is supported
+   */
+  uint8_t GetLdpcCodingInPayload (void) const;
+  /**
+   * Get HE LTF and GI for HE PDPUs.
+   *
+   * \returns the HE LTF and GI
+   */
+  uint8_t GetHeLtfAndGiForHePpdus (void) const;
+  /**
+   * Get highest MCS supported.
+   *
+   * \returns the highest MCS is supported
+   */
+  uint8_t GetHighestMcsSupported (void) const;
+  /**
+   * Get highest NSS supported.
+   *
+   * \returns the highest supported NSS
+   */
+  uint8_t GetHighestNssSupported (void) const;
+
+  // MAC Capabilities Info fields
+  /**
+   * Set the maximum AMPDU length.
+   *
+   * \param maxAmpduLength 2^(20 + x) - 1, x in the range 0 to 3
+   */
+  void SetMaxAmpduLength (uint32_t maxAmpduLength);
+
+  // MCS and NSS field information
+  /**
+   * Set highest MCS supported.
+   *
+   * \param mcs the MCS
+   */
+  void SetHighestMcsSupported (uint8_t mcs);
+  /**
+   * Set highest NSS supported.
+   *
+   * \param nss the NSS
+   */
+  void SetHighestNssSupported (uint8_t nss);
+
+  /**
+   * Is RX MCS supported.
+   *
+   * \param mcs the MCS
+   * \returns true if MCS transmit supported
+   */
+  bool IsSupportedTxMcs (uint8_t mcs) const;
+  /**
+   * Is RX MCS supported.
+   *
+   * \param mcs the MCS
+   * \returns true if MCS receive supported
+   */
+  bool IsSupportedRxMcs (uint8_t mcs) const;
+
+  /**
+   * Return the maximum A-MPDU length.
+   *
+   * \return the maximum A-MPDU length
+   */
+  uint32_t GetMaxAmpduLength (void) const;
+
+
+private:
+  //MAC Capabilities Info fields
+  uint8_t m_plusHtcHeSupport;                            //!< HTC HE support
+  uint8_t m_twtRequesterSupport;                         //!< TWT requester support
+  uint8_t m_twtResponderSupport;                         //!< TWT responder support
+  uint8_t m_fragmentationSupport;                        //!< fragmentation support
+  uint8_t m_maximumNumberOfFragmentedMsdus;              //!< maximum number of fragmentation MSDUs
+  uint8_t m_minimumFragmentSize;                         //!< minimum fragment size
+  uint8_t m_triggerFrameMacPaddingDuration;              //!< trigger frame MAC padding duration
+  uint8_t m_multiTidAggregationSupport;                  //!< multi-TID aggregation support
+  uint8_t m_heLinkAdaptation;                            //!< HE link adaptation
+  uint8_t m_allAckSupport;                               //!< all Ack support
+  uint8_t m_ulMuResponseSchedulingSupport;               //!< UL MU response scheduling support
+  uint8_t m_aBsrSupport;                                 //!< BSR support
+  uint8_t m_broadcastTwtSupport;                         //!< broadcast TXT support
+  uint8_t m_32bitBaBitmapSupport;                        //!< 32-bit BA bitmap support
+  uint8_t m_muCascadeSupport;                            //!< MU cascade support
+  uint8_t m_ackEnabledMultiTidAggregationSupport;        //!< ack enabled multi-TID aggregation support
+  uint8_t m_groupAddressedMultiStaBlockAckInDlMuSupport; //!< group addressed multi-STA BlockAck in DL support
+  uint8_t m_omControlSupport;                            //!< operation mode control support
+  uint8_t m_ofdmaRaSupport;                              //!< OFDMA RA support
+  uint8_t m_maxAmpduLengthExponent;                      //!< maximum A-MPDU length exponent
+  uint8_t m_amsduFragmentationSupport;                   //!< A-MSDU fragmentation support
+  uint8_t m_flexibleTwtScheduleSupport;                  //!< flexible TWT schedule support
+  uint8_t m_rxControlFrameToMultiBss;                    //!< receive control frame to multi-BSS
+  uint8_t m_bsrpAmpduAggregation;                        //!< BSRP A-MPDU aggregation
+  uint8_t m_qtpSupport;                                  //!< QTP support
+  uint8_t m_aBqrSupport;                                 //!< ABQR support
+
+  //PHY Capabilities Info fields
+  uint8_t m_dualBandSupport;                         //!< dual band support
+  uint8_t m_channelWidthSet;                         //!< channel width set
+  uint8_t m_preamblePuncturingRx;                    //!< preamble puncturing receive
+  uint8_t m_deviceClass;                             //!< device class
+  uint8_t m_ldpcCodingInPayload;                     //!< LDPC coding in payload
+  uint8_t m_heLtfAndGiForHePpdus;                    //!< HE-LTF and GI for HE-PPDUs
+  uint8_t m_heLtfAndGiForNdp;                        //!< HE-LTF and GI for NDP
+  uint8_t m_stbcTxAndRx;                             //!< STBC transmit and receive
+  uint8_t m_doppler;                                 //!< Doppler
+  uint8_t m_ulMu;                                    //!< UL MU
+  uint8_t m_dcmEncodingTx;                           //!< DCM encoding transmit
+  uint8_t m_dcmEncodingRx;                           //!< DCM encoding receive
+  uint8_t m_ulHeMuPpduPayloadSupport;                //!< UL HE-MU-PDPU payload support
+  uint8_t m_suBeamformer;                            //!< SU beamformer
+  uint8_t m_suBeamformee;                            //!< SU beamformee
+  uint8_t m_muBeamformer;                            //!< MU beamformer
+  uint8_t m_beamformeeStsForSmallerOrEqualThan80Mhz; //!< beam formee STS for < 80 MHz
+  uint8_t m_nstsTotalForSmallerOrEqualThan80Mhz;     //!< STS total for < 80 MHz
+  uint8_t m_beamformeeStsForLargerThan80Mhz;         //!< beamformee STS for > 80MHz
+  uint8_t m_nstsTotalForLargerThan80Mhz;             //!< STS total for > 80 MHz
+  uint8_t m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz; //!< # of sounding dimensions for < 80 MHz
+  uint8_t m_numberOfSoundingDimensionsForLargerThan80Mhz;         //!< # of sounding dimensions for > 80 MHz
+  uint8_t m_ngEqual16ForSuFeedbackSupport;          //!< equal 16 for SU feedback
+  uint8_t m_ngEqual16ForMuFeedbackSupport;          //!< equal 16 for MU feedback
+  uint8_t m_codebookSize42ForSuSupport;             //!< codebook size 42 for SU
+  uint8_t m_codebookSize75ForSuSupport;             //!< codebook size 75 for SU
+  uint8_t m_beamformingFeedbackWithTriggerFrame;    //!< beamforming feedback with trigger frame
+  uint8_t m_heErSuPpduPayload;                      //!< HE-ER-SU-PPDU payload
+  uint8_t m_dlMuMimoOnPartialBandwidth;             //!< DL MU-MIMO on partial bandwidth
+  uint8_t m_ppeThresholdPresent;                    //!< PPE threshold present
+  uint8_t m_srpBasedSrSupport;                      //!< SRP based SR support
+  uint8_t m_powerBoostFactorAlphaSupport;           //!< power boost factor alpha support
+  uint8_t m_4TimesHeLtfAnd800NsGiSupportForHePpdus; //!< 4 times HE-LFT and 800ns GI support for HE-PPDUs
+
+  //MCS and NSS field information
+  uint8_t m_highestNssSupportedM1; //!< highest NSS support M1
+  uint8_t m_highestMcsSupported;   //!< highest MCS support
+  std::vector<uint8_t> m_txBwMap;  //!< transmit BW map
+  std::vector<uint8_t> m_rxBwMap;  //!< receive BW map
+
+  /// This is used to decide if this element should be added to the frame or not
+  uint8_t m_heSupported;
+};
+
+/**
+ * output stream output operator
+ * \param os the output stream
+ * \param HeCapabilities the HE capabilities
+ * \returns the output stream
+ */
+std::ostream &operator << (std::ostream &os, const HeCapabilities &HeCapabilities);
+
+} //namespace ns3
+
+#endif /* HE_CAPABILITY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-configuration.cc ns-3.34/src/wifi/model/he/he-configuration.cc
--- ns-3.33/src/wifi/model/he/he-configuration.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-configuration.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,105 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "ns3/log.h"
+#include "ns3/nstime.h"
+#include "ns3/uinteger.h"
+#include "he-configuration.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("HeConfiguration");
+NS_OBJECT_ENSURE_REGISTERED (HeConfiguration);
+
+HeConfiguration::HeConfiguration ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+TypeId
+HeConfiguration::GetTypeId (void)
+{
+  static ns3::TypeId tid = ns3::TypeId ("ns3::HeConfiguration")
+    .SetParent<Object> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<HeConfiguration> ()
+    .AddAttribute ("GuardInterval",
+                   "Specify the shortest guard interval duration that can be used for HE transmissions."
+                   "Possible values are 800ns, 1600ns or 3200ns.",
+                   TimeValue (NanoSeconds (3200)),
+                   MakeTimeAccessor (&HeConfiguration::GetGuardInterval,
+                                     &HeConfiguration::SetGuardInterval),
+                   MakeTimeChecker (NanoSeconds (800), NanoSeconds (3200)))
+    .AddAttribute ("BssColor",
+                   "The BSS color",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&HeConfiguration::GetBssColor,
+                                         &HeConfiguration::SetBssColor),
+                   MakeUintegerChecker<uint8_t> ())
+    .AddAttribute ("MpduBufferSize",
+                   "The MPDU buffer size for receiving A-MPDUs",
+                   UintegerValue (64),
+                   MakeUintegerAccessor (&HeConfiguration::GetMpduBufferSize,
+                                         &HeConfiguration::SetMpduBufferSize),
+                   MakeUintegerChecker<uint16_t> (64, 256))
+    ;
+    return tid;
+}
+
+void
+HeConfiguration::SetGuardInterval (Time guardInterval)
+{
+  NS_LOG_FUNCTION (this << guardInterval);
+  NS_ASSERT (guardInterval == NanoSeconds (800) || guardInterval == NanoSeconds (1600) || guardInterval == NanoSeconds (3200));
+  m_guardInterval = guardInterval;
+}
+
+Time
+HeConfiguration::GetGuardInterval (void) const
+{
+  return m_guardInterval;
+}
+
+void
+HeConfiguration::SetBssColor (uint8_t bssColor)
+{
+  NS_LOG_FUNCTION (this << +bssColor);
+  m_bssColor = bssColor;
+}
+
+uint8_t
+HeConfiguration::GetBssColor (void) const
+{
+  return m_bssColor;
+}
+
+void
+HeConfiguration::SetMpduBufferSize (uint16_t size)
+{
+  NS_LOG_FUNCTION (this << size);
+  m_mpduBufferSize = size;
+}
+
+uint16_t
+HeConfiguration::GetMpduBufferSize (void) const
+{
+  return m_mpduBufferSize;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-configuration.h ns-3.34/src/wifi/model/he/he-configuration.h
--- ns-3.33/src/wifi/model/he/he-configuration.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-configuration.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,81 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#ifndef HE_CONFIGURATION_H
+#define HE_CONFIGURATION_H
+
+#include "ns3/object.h"
+#include "ns3/nstime.h"
+
+namespace ns3 {
+
+/**
+ * \brief HE configuration
+ * \ingroup wifi
+ *
+ * This object stores HE configuration information, for use in modifying
+ * AP or STA behavior and for constructing HE-related information elements.
+ *
+ */
+class HeConfiguration : public Object
+{
+public:
+  HeConfiguration ();
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  /**
+   * \param guardInterval the supported HE guard interval
+   */
+  void SetGuardInterval (Time guardInterval);
+  /**
+   * \return the supported HE guard interval
+   */
+  Time GetGuardInterval (void) const;
+  /**
+   * \param bssColor the BSS color
+   */
+  void SetBssColor (uint8_t bssColor);
+  /**
+   * \return the BSS color
+   */
+  uint8_t GetBssColor (void) const;
+  /**
+   * \param size the MPDU buffer size to receive A-MPDUs
+   */
+  void SetMpduBufferSize (uint16_t size);
+  /**
+   * \return the MPDU buffer size to receive A-MPDUs
+   */
+  uint16_t GetMpduBufferSize (void) const;
+
+
+private:
+  Time m_guardInterval;      //!< Supported HE guard interval
+  uint8_t m_bssColor;        //!< BSS color
+  uint16_t m_mpduBufferSize; //!< MPDU buffer size
+};
+
+} //namespace ns3
+
+#endif /* HE_CONFIGURATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-frame-exchange-manager.cc ns-3.34/src/wifi/model/he/he-frame-exchange-manager.cc
--- ns-3.33/src/wifi/model/he/he-frame-exchange-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-frame-exchange-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,1732 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "ns3/abort.h"
+#include "he-frame-exchange-manager.h"
+#include "he-configuration.h"
+#include "ns3/recipient-block-ack-agreement.h"
+#include "ns3/ap-wifi-mac.h"
+#include "ns3/sta-wifi-mac.h"
+#include "multi-user-scheduler.h"
+#include "ns3/snr-tag.h"
+#include "he-phy.h"
+#include <algorithm>
+#include <functional>
+
+#undef NS_LOG_APPEND_CONTEXT
+#define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] "
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("HeFrameExchangeManager");
+
+NS_OBJECT_ENSURE_REGISTERED (HeFrameExchangeManager);
+
+TypeId
+HeFrameExchangeManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::HeFrameExchangeManager")
+    .SetParent<VhtFrameExchangeManager> ()
+    .AddConstructor<HeFrameExchangeManager> ()
+    .SetGroupName ("Wifi")
+  ;
+  return tid;
+}
+
+HeFrameExchangeManager::HeFrameExchangeManager ()
+  : m_triggerFrameInAmpdu (false)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+HeFrameExchangeManager::~HeFrameExchangeManager ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+uint16_t
+HeFrameExchangeManager::GetSupportedBaBufferSize (void) const
+{
+  NS_ASSERT (m_mac->GetHeConfiguration () != 0);
+  if (m_mac->GetHeConfiguration ()->GetMpduBufferSize () > 64)
+    {
+      return 256;
+    }
+  return 64;
+}
+
+void
+HeFrameExchangeManager::SetWifiMac (const Ptr<RegularWifiMac> mac)
+{
+  m_apMac = DynamicCast<ApWifiMac> (mac);
+  m_staMac = DynamicCast<StaWifiMac> (mac);
+  VhtFrameExchangeManager::SetWifiMac (mac);
+}
+
+void
+HeFrameExchangeManager::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_apMac = 0;
+  m_staMac = 0;
+  m_psduMap.clear ();
+  m_txParams.Clear ();
+  m_muScheduler = 0;
+  m_multiStaBaEvent.Cancel ();
+  VhtFrameExchangeManager::DoDispose ();
+}
+
+void
+HeFrameExchangeManager::SetMultiUserScheduler (const Ptr<MultiUserScheduler> muScheduler)
+{
+  NS_ASSERT (m_mac);
+  NS_ABORT_MSG_IF (m_apMac == 0,
+                   "A Multi-User Scheduler can only be aggregated to an AP");
+  NS_ABORT_MSG_IF (m_apMac->GetHeConfiguration () == 0,
+                   "A Multi-User Scheduler can only be aggregated to an HE AP");
+  m_muScheduler = muScheduler;
+}
+
+bool
+HeFrameExchangeManager::StartFrameExchange (Ptr<QosTxop> edca, Time availableTime, bool initialFrame)
+{
+  NS_LOG_FUNCTION (this << edca << availableTime << initialFrame);
+
+  MultiUserScheduler::TxFormat txFormat = MultiUserScheduler::SU_TX;
+  Ptr<const WifiMacQueueItem> mpdu = edca->PeekNextMpdu ();
+
+  /*
+   * We consult the Multi-user Scheduler (if available) to know the type of transmission to make if:
+   * - there is no pending BlockAckReq to transmit
+   * - either the AC queue is empty (the scheduler might select an UL MU transmission)
+   *   or the next frame in the AC queue is a non-broadcast QoS data frame addressed to
+   *   a receiver with which a BA agreement has been already established
+   */
+  if (m_muScheduler != 0
+      && edca->GetBaManager ()->GetBar (false) == nullptr
+      && (mpdu == 0
+          || (mpdu->GetHeader ().IsQosData ()
+              && !mpdu->GetHeader ().GetAddr1 ().IsGroup ()
+              && edca->GetBaAgreementEstablished (mpdu->GetHeader ().GetAddr1 (), mpdu->GetHeader ().GetQosTid ()))))
+    {
+      txFormat = m_muScheduler->NotifyAccessGranted (edca, availableTime, initialFrame);
+    }
+
+  if (txFormat == MultiUserScheduler::SU_TX)
+    {
+      return VhtFrameExchangeManager::StartFrameExchange (edca, availableTime, initialFrame);
+    }
+
+  if (txFormat == MultiUserScheduler::DL_MU_TX)
+    {
+      if (m_muScheduler->GetDlMuInfo ().psduMap.empty ())
+        {
+          NS_LOG_DEBUG ("The Multi-user Scheduler returned DL_MU_TX with empty psduMap, do not transmit");
+          return false;
+        }
+
+      SendPsduMapWithProtection (m_muScheduler->GetDlMuInfo ().psduMap,
+                                 m_muScheduler->GetDlMuInfo ().txParams);
+      return true;
+    }
+
+  if (txFormat == MultiUserScheduler::UL_MU_TX)
+    {
+      if (m_muScheduler->GetUlMuInfo ().trigger == nullptr)
+        {
+          NS_LOG_DEBUG ("The Multi-user Scheduler returned UL_MU_TX with empty Trigger Frame, do not transmit");
+          return false;
+        }
+
+      NS_ASSERT (m_muScheduler->GetUlMuInfo ().trigger->GetHeader ().IsTrigger ());
+      SendPsduMapWithProtection (WifiPsduMap {{SU_STA_ID, GetWifiPsdu (m_muScheduler->GetUlMuInfo ().trigger,
+                                                                       m_muScheduler->GetUlMuInfo ().txParams.m_txVector)}},
+                                 m_muScheduler->GetUlMuInfo ().txParams);
+      return true;
+    }
+
+  return false;
+}
+
+bool
+HeFrameExchangeManager::SendMpduFromBaManager (Ptr<QosTxop> edca, Time availableTime, bool initialFrame)
+{
+  NS_LOG_FUNCTION (this << edca << availableTime << initialFrame);
+
+  // First, check if there is a BAR to be transmitted
+  Ptr<const WifiMacQueueItem> peekedItem = edca->GetBaManager ()->GetBar (false);
+
+  if (peekedItem == 0)
+    {
+      NS_LOG_DEBUG ("Block Ack Manager returned no frame to send");
+      return false;
+    }
+
+  if (peekedItem->GetHeader ().IsBlockAckReq ())
+    {
+      // BlockAckReq are handled by the HT FEM
+      return HtFrameExchangeManager::SendMpduFromBaManager (edca, availableTime, initialFrame);
+    }
+
+  NS_ASSERT (peekedItem->GetHeader ().IsTrigger ());
+  m_triggerFrame = Copy (edca->GetBaManager ()->GetBar ());
+
+  SendPsduMap ();
+  return true;
+}
+
+void
+HeFrameExchangeManager::SendPsduMapWithProtection (WifiPsduMap psduMap, WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << &txParams);
+
+  m_psduMap = std::move (psduMap);
+  m_txParams = std::move (txParams);
+
+#ifdef NS3_BUILD_PROFILE_DEBUG
+  // If protection is required, the MPDUs must be stored in some queue because
+  // they are not put back in a queue if the MU-RTS/CTS exchange fails
+  if (m_txParams.m_protection->method != WifiProtection::NONE)
+    {
+      for (const auto& psdu : psduMap)
+        {
+          for (const auto& mpdu : *PeekPointer (psdu.second))
+            {
+              NS_ASSERT (mpdu->GetHeader ().IsCtl () || !mpdu->GetHeader ().HasData () || mpdu->IsQueued ());
+            }
+        }
+    }
+#endif
+
+  // Make sure that the acknowledgment time has been computed, so that SendMuRts()
+  // can reuse this value.
+  NS_ASSERT (m_txParams.m_acknowledgment);
+
+  if (m_txParams.m_acknowledgment->acknowledgmentTime == Time::Min ())
+    {
+      CalculateAcknowledgmentTime (m_txParams.m_acknowledgment.get ());
+    }
+
+  // Set QoS Ack policy
+  for (auto& psdu : m_psduMap)
+    {
+      WifiAckManager::SetQosAckPolicy (psdu.second, m_txParams.m_acknowledgment.get ());
+    }
+
+  if (m_txParams.m_protection->method == WifiProtection::NONE)
+    {
+      SendPsduMap ();
+    }
+  else
+    {
+      NS_ABORT_MSG ("Unknown or prohibited protection type: " << m_txParams.m_protection.get ());
+    }
+}
+
+Ptr<WifiPsdu>
+HeFrameExchangeManager::GetPsduTo (Mac48Address to, const WifiPsduMap& psduMap)
+{
+  auto it = std::find_if (psduMap.begin (), psduMap.end (),
+                          [&to] (std::pair<uint16_t, Ptr<WifiPsdu>> psdu)
+                            { return psdu.second->GetAddr1 () == to; });
+  if (it != psduMap.end ())
+    {
+      return it->second;
+    }
+  return nullptr;
+}
+
+void
+HeFrameExchangeManager::SendPsduMap (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  NS_ASSERT (m_txParams.m_acknowledgment);
+  NS_ASSERT (!m_txTimer.IsRunning ());
+
+  WifiTxTimer::Reason timerType = WifiTxTimer::NOT_RUNNING;  // no timer
+  WifiTxVector* responseTxVector = nullptr;
+  Ptr<WifiMacQueueItem> mpdu = nullptr;
+  Ptr<WifiPsdu> psdu = nullptr;
+  WifiTxVector txVector;
+
+  // Compute the type of TX timer to set depending on the acknowledgment method
+
+  /*
+   * Acknowledgment via a sequence of BlockAckReq and BlockAck frames
+   */
+  if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE)
+    {
+      WifiDlMuBarBaSequence* acknowledgment = static_cast<WifiDlMuBarBaSequence*> (m_txParams.m_acknowledgment.get ());
+
+      // schedule the transmission of required BlockAckReq frames
+      for (const auto& psdu : m_psduMap)
+        {
+          if (acknowledgment->stationsSendBlockAckReqTo.find (psdu.second->GetAddr1 ())
+              != acknowledgment->stationsSendBlockAckReqTo.end ())
+            {
+              // the receiver of this PSDU will receive a BlockAckReq
+              std::set<uint8_t> tids = psdu.second->GetTids ();
+              NS_ABORT_MSG_IF (tids.size () > 1, "Acknowledgment method incompatible with a Multi-TID A-MPDU");
+              uint8_t tid = *tids.begin ();
+
+              NS_ASSERT (m_edca != 0);
+              m_edca->ScheduleBar (m_edca->PrepareBlockAckRequest (psdu.second->GetAddr1 (), tid));
+            }
+        }
+
+      if (!acknowledgment->stationsReplyingWithNormalAck.empty ())
+        {
+          // a station will reply immediately with a Normal Ack
+          timerType = WifiTxTimer::WAIT_NORMAL_ACK_AFTER_DL_MU_PPDU;
+          responseTxVector = &acknowledgment->stationsReplyingWithNormalAck.begin ()->second.ackTxVector;
+          psdu = GetPsduTo (acknowledgment->stationsReplyingWithNormalAck.begin ()->first, m_psduMap);
+          NS_ASSERT (psdu->GetNMpdus () == 1);
+          mpdu = *psdu->begin ();
+        }
+      else if (!acknowledgment->stationsReplyingWithBlockAck.empty ())
+        {
+          // a station will reply immediately with a Block Ack
+          timerType = WifiTxTimer::WAIT_BLOCK_ACK;
+          responseTxVector = &acknowledgment->stationsReplyingWithBlockAck.begin ()->second.blockAckTxVector;
+          psdu = GetPsduTo (acknowledgment->stationsReplyingWithBlockAck.begin ()->first, m_psduMap);
+        }
+      // else no station will reply immediately
+    }
+  /*
+   * Acknowledgment via a MU-BAR Trigger Frame sent as single user frame
+   */
+  else if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_TF_MU_BAR)
+    {
+      WifiDlMuTfMuBar* acknowledgment = static_cast<WifiDlMuTfMuBar*> (m_txParams.m_acknowledgment.get ());
+
+      if (m_triggerFrame == nullptr)
+        {
+          // we are transmitting the DL MU PPDU and have to schedule the
+          // transmission of a MU-BAR Trigger Frame.
+          // Create a TXVECTOR by "merging" all the BlockAck TXVECTORs
+          std::map<uint16_t, CtrlBAckRequestHeader> recipients;
+
+          NS_ASSERT (!acknowledgment->stationsReplyingWithBlockAck.empty ());
+          auto staIt = acknowledgment->stationsReplyingWithBlockAck.begin ();
+          WifiTxVector txVector = staIt->second.blockAckTxVector;
+          while (staIt != acknowledgment->stationsReplyingWithBlockAck.end ())
+            {
+              NS_ASSERT (m_apMac != 0);
+              uint16_t staId = m_apMac->GetAssociationId (staIt->first);
+
+              txVector.SetHeMuUserInfo (staId, staIt->second.blockAckTxVector.GetHeMuUserInfo (staId));
+              recipients.emplace (staId, staIt->second.barHeader);
+
+              staIt++;
+            }
+          // set the Length field of the response TXVECTOR, which is needed to correctly
+          // set the UL Length field of the MU-BAR Trigger Frame
+          txVector.SetLength (acknowledgment->ulLength);
+
+          NS_ASSERT (m_edca != 0);
+          m_edca->ScheduleBar (PrepareMuBar (txVector, recipients));
+        }
+      else
+        {
+          // we are transmitting the MU-BAR following the DL MU PPDU after a SIFS.
+          // m_psduMap and m_txParams are still the same as when the DL MU PPDU was sent.
+          // record the set of stations expected to send a BlockAck frame
+          m_staExpectTbPpduFrom.clear ();
+          for (auto& station : acknowledgment->stationsReplyingWithBlockAck)
+            {
+              m_staExpectTbPpduFrom.insert (station.first);
+            }
+
+          Time txDuration = m_phy->CalculateTxDuration (m_triggerFrame->GetSize (),
+                                                        acknowledgment->muBarTxVector,
+                                                        m_phy->GetPhyBand ());
+          // update acknowledgmentTime to correctly set the Duration/ID
+          acknowledgment->acknowledgmentTime -= (m_phy->GetSifs () + txDuration);
+          m_triggerFrame->GetHeader ().SetDuration (GetPsduDurationId (txDuration, m_txParams));
+
+          responseTxVector = &acknowledgment->stationsReplyingWithBlockAck.begin ()->second.blockAckTxVector;
+          Time timeout = txDuration + m_phy->GetSifs () + m_phy->GetSlot ()
+                         + m_phy->CalculatePhyPreambleAndHeaderDuration (*responseTxVector);
+
+          m_txTimer.Set (WifiTxTimer::WAIT_BLOCK_ACKS_IN_TB_PPDU, timeout,
+                         &HeFrameExchangeManager::BlockAcksInTbPpduTimeout, this, &m_psduMap,
+                         &m_staExpectTbPpduFrom, m_staExpectTbPpduFrom.size ());
+          m_channelAccessManager->NotifyAckTimeoutStartNow (timeout);
+
+          ForwardMpduDown (m_triggerFrame, acknowledgment->muBarTxVector);
+          return;
+        }
+    }
+  /*
+   * Acknowledgment requested by MU-BAR TFs aggregated to PSDUs in the DL MU PPDU
+   */
+  else if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_AGGREGATE_TF)
+    {
+      WifiDlMuAggregateTf* acknowledgment = static_cast<WifiDlMuAggregateTf*> (m_txParams.m_acknowledgment.get ());
+
+      // record the set of stations expected to send a BlockAck frame
+      m_staExpectTbPpduFrom.clear ();
+
+      for (auto& station : acknowledgment->stationsReplyingWithBlockAck)
+        {
+          m_staExpectTbPpduFrom.insert (station.first);
+          // check that the station that is expected to send a BlockAck frame is
+          // actually the receiver of a PSDU
+          auto psduMapIt = std::find_if (m_psduMap.begin (), m_psduMap.end (),
+                                         [&station] (std::pair<uint16_t, Ptr<WifiPsdu>> psdu)
+                                           { return psdu.second->GetAddr1 () == station.first; });
+
+          NS_ASSERT (psduMapIt != m_psduMap.end ());
+          // add a MU-BAR Trigger Frame to the PSDU
+          std::vector<Ptr<WifiMacQueueItem>> mpduList (psduMapIt->second->begin (), psduMapIt->second->end ());
+          NS_ASSERT (mpduList.size () == psduMapIt->second->GetNMpdus ());
+          // set the Length field of the response TXVECTOR, which is needed to correctly
+          // set the UL Length field of the MU-BAR Trigger Frame
+          station.second.blockAckTxVector.SetLength (acknowledgment->ulLength);
+          mpduList.push_back (PrepareMuBar (station.second.blockAckTxVector,
+                                            {{psduMapIt->first, station.second.barHeader}}));
+          psduMapIt->second = Create<WifiPsdu> (std::move (mpduList));
+        }
+
+      timerType = WifiTxTimer::WAIT_BLOCK_ACKS_IN_TB_PPDU;
+      responseTxVector = &acknowledgment->stationsReplyingWithBlockAck.begin ()->second.blockAckTxVector;
+    }
+  /*
+   * Basic Trigger Frame starting an UL MU transmission
+   */
+  else if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::UL_MU_MULTI_STA_BA)
+    {
+      // the PSDU map being sent must contain a (Basic) Trigger Frame
+      NS_ASSERT (m_psduMap.size () == 1 && m_psduMap.begin ()->first == SU_STA_ID
+                 && (mpdu = *m_psduMap.begin ()->second->begin ())->GetHeader ().IsTrigger ());
+
+      WifiUlMuMultiStaBa* acknowledgment = static_cast<WifiUlMuMultiStaBa*> (m_txParams.m_acknowledgment.get ());
+
+      // record the set of stations solicited by this Trigger Frame
+      m_staExpectTbPpduFrom.clear ();
+
+      for (const auto& station : acknowledgment->stationsReceivingMultiStaBa)
+        {
+          m_staExpectTbPpduFrom.insert (station.first.first);
+        }
+
+      // Reset stationsReceivingMultiStaBa, which will be filled as soon as
+      // TB PPDUs are received
+      acknowledgment->stationsReceivingMultiStaBa.clear ();
+      acknowledgment->baType.m_bitmapLen.clear ();
+
+      // Add a SIFS and the TB PPDU duration to the acknowledgment time of the
+      // Trigger Frame, so that its Duration/ID is correctly computed
+      NS_ASSERT (m_muScheduler != 0);
+      acknowledgment->acknowledgmentTime += m_mac->GetWifiPhy ()->GetSifs ()
+                                            + m_muScheduler->GetUlMuInfo ().tbPpduDuration;
+
+      timerType = WifiTxTimer::WAIT_TB_PPDU_AFTER_BASIC_TF;
+      responseTxVector = &acknowledgment->tbPpduTxVector;
+    }
+  /*
+   * BSRP Trigger Frame
+   */
+  else if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NONE
+           && !m_txParams.m_txVector.IsUlMu ()
+           && m_psduMap.size () == 1 && m_psduMap.begin ()->first == SU_STA_ID
+           && (mpdu = *m_psduMap.begin ()->second->begin ())->GetHeader ().IsTrigger ())
+    {
+      CtrlTriggerHeader trigger;
+      mpdu->GetPacket ()->PeekHeader (trigger);
+      NS_ASSERT (trigger.IsBsrp ());
+      NS_ASSERT (m_apMac != 0);
+
+      // record the set of stations solicited by this Trigger Frame
+      m_staExpectTbPpduFrom.clear ();
+
+      for (const auto& userInfo : trigger)
+        {
+          auto staIt = m_apMac->GetStaList ().find (userInfo.GetAid12 ());
+          NS_ASSERT (staIt != m_apMac->GetStaList ().end ());
+          m_staExpectTbPpduFrom.insert (staIt->second);
+        }
+
+      // Add a SIFS and the TB PPDU duration to the acknowledgment time of the
+      // Trigger Frame, so that its Duration/ID is correctly computed
+      WifiNoAck* acknowledgment = static_cast<WifiNoAck*> (m_txParams.m_acknowledgment.get ());
+      txVector = trigger.GetHeTbTxVector (trigger.begin ()->GetAid12 ());
+      acknowledgment->acknowledgmentTime += m_mac->GetWifiPhy ()->GetSifs ()
+                                            + HePhy::ConvertLSigLengthToHeTbPpduDuration (trigger.GetUlLength (),
+                                                                                          txVector,
+                                                                                          m_phy->GetPhyBand ());
+
+      timerType = WifiTxTimer::WAIT_QOS_NULL_AFTER_BSRP_TF;
+      responseTxVector = &txVector;
+    }
+  /*
+   * TB PPDU solicited by a Basic Trigger Frame
+   */
+  else if (m_txParams.m_txVector.IsUlMu ()
+           && m_txParams.m_acknowledgment->method == WifiAcknowledgment::ACK_AFTER_TB_PPDU)
+    {
+      NS_ASSERT (m_psduMap.size () == 1);
+      timerType = WifiTxTimer::WAIT_BLOCK_ACK_AFTER_TB_PPDU;
+      NS_ASSERT (m_staMac != 0 && m_staMac->IsAssociated ());
+      txVector = m_mac->GetWifiRemoteStationManager ()->GetBlockAckTxVector (m_psduMap.begin ()->second->GetAddr1 (),
+                                                                             m_txParams.m_txVector);
+      responseTxVector = &txVector;
+    }
+  /*
+   * QoS Null frames solicited by a BSRP Trigger Frame
+   */
+  else if (m_txParams.m_txVector.IsUlMu ()
+           && m_txParams.m_acknowledgment->method == WifiAcknowledgment::NONE)
+    {
+      // No response is expected, so do nothing.
+    }
+  else
+    {
+      NS_ABORT_MSG ("Unable to handle the selected acknowledgment method ("
+                    << m_txParams.m_acknowledgment.get () << ")");
+    }
+
+  // create a map of Ptr<const WifiPsdu>, as required by the PHY
+  WifiConstPsduMap psduMap;
+  for (const auto& psdu : m_psduMap)
+    {
+      psduMap.emplace (psdu.first, psdu.second);
+    }
+
+  Time txDuration;
+  if (m_txParams.m_txVector.IsUlMu ())
+    {
+      txDuration = HePhy::ConvertLSigLengthToHeTbPpduDuration (m_txParams.m_txVector.GetLength (),
+                                                               m_txParams.m_txVector,
+                                                               m_phy->GetPhyBand ());
+    }
+  else
+    {
+      txDuration = m_phy->CalculateTxDuration (psduMap, m_txParams.m_txVector, m_phy->GetPhyBand ());
+
+      // Set Duration/ID
+      Time durationId = GetPsduDurationId (txDuration, m_txParams);
+      for (auto& psdu : m_psduMap)
+        {
+          psdu.second->SetDuration (durationId);
+        }
+    }
+
+  if (timerType == WifiTxTimer::NOT_RUNNING)
+    {
+      if (!m_txParams.m_txVector.IsUlMu ())
+        {
+          Simulator::Schedule (txDuration, &HeFrameExchangeManager::TransmissionSucceeded, this);
+        }
+    }
+  else
+    {
+      Time timeout = txDuration + m_phy->GetSifs () + m_phy->GetSlot ()
+                     + m_phy->CalculatePhyPreambleAndHeaderDuration (*responseTxVector);
+      m_channelAccessManager->NotifyAckTimeoutStartNow (timeout);
+
+      // start timer
+      switch (timerType)
+        {
+          case WifiTxTimer::WAIT_NORMAL_ACK_AFTER_DL_MU_PPDU:
+            NS_ASSERT (mpdu != nullptr);
+            m_txTimer.Set (timerType, timeout, &HeFrameExchangeManager::NormalAckTimeout,
+                          this, mpdu, m_txParams.m_txVector);
+            break;
+          case WifiTxTimer::WAIT_BLOCK_ACK:
+            NS_ASSERT (psdu != nullptr);
+            m_txTimer.Set (timerType, timeout, &HeFrameExchangeManager::BlockAckTimeout,
+                          this, psdu, m_txParams.m_txVector);
+            break;
+          case WifiTxTimer::WAIT_BLOCK_ACKS_IN_TB_PPDU:
+            m_txTimer.Set (timerType, timeout, &HeFrameExchangeManager::BlockAcksInTbPpduTimeout, this,
+                          &m_psduMap, &m_staExpectTbPpduFrom, m_staExpectTbPpduFrom.size ());
+            break;
+          case WifiTxTimer::WAIT_TB_PPDU_AFTER_BASIC_TF:
+          case WifiTxTimer::WAIT_QOS_NULL_AFTER_BSRP_TF:
+            m_txTimer.Set (timerType, timeout, &HeFrameExchangeManager::TbPpduTimeout, this,
+                          &m_psduMap, &m_staExpectTbPpduFrom, m_staExpectTbPpduFrom.size ());
+            break;
+          case WifiTxTimer::WAIT_BLOCK_ACK_AFTER_TB_PPDU:
+            m_txTimer.Set (timerType, timeout, &HeFrameExchangeManager::BlockAckAfterTbPpduTimeout,
+                          this, m_psduMap.begin ()->second, m_txParams.m_txVector);
+            break;
+          default:
+            NS_ABORT_MSG ("Unknown timer type: " << timerType);
+            break;
+        }
+    }
+
+  // transmit the map of PSDUs
+  ForwardPsduMapDown (psduMap, m_txParams.m_txVector);
+}
+
+void
+HeFrameExchangeManager::ForwardPsduMapDown (WifiConstPsduMap psduMap, WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << psduMap << txVector);
+
+  for (const auto& psdu : psduMap)
+    {
+      NS_LOG_DEBUG ("Transmitting: [STAID=" << psdu.first << ", " << *psdu.second << "]"); 
+    }
+  NS_LOG_DEBUG ("TXVECTOR: " << txVector);
+  for (const auto& psdu : psduMap)
+    {
+      NotifyTxToEdca (psdu.second);
+
+      // the PSDU is about to be transmitted, we can now dequeue the MPDUs
+      DequeuePsdu (psdu.second);
+    }
+  if (psduMap.size () > 1 || psduMap.begin ()->second->IsAggregate () || psduMap.begin ()->second->IsSingle ())
+    {
+      txVector.SetAggregation (true);
+    }
+
+  m_phy->Send (psduMap, txVector);
+}
+
+Ptr<WifiMacQueueItem>
+HeFrameExchangeManager::PrepareMuBar (const WifiTxVector& responseTxVector,
+                                      std::map<uint16_t, CtrlBAckRequestHeader> recipients) const
+{
+  NS_LOG_FUNCTION (this << responseTxVector);
+  NS_ASSERT (responseTxVector.GetHeMuUserInfoMap ().size () == recipients.size ());
+  NS_ASSERT (!recipients.empty ());
+
+  CtrlTriggerHeader muBar (TriggerFrameType::MU_BAR_TRIGGER, responseTxVector);
+  SetTargetRssi (muBar);
+  Mac48Address rxAddress;
+
+  // Add the Trigger Dependent User Info subfield to every User Info field
+  for (auto& userInfo : muBar)
+    {
+      auto recipientIt = recipients.find (userInfo.GetAid12 ());
+      NS_ASSERT (recipientIt != recipients.end ());
+
+      // Store the BAR in the Trigger Dependent User Info subfield
+      userInfo.SetMuBarTriggerDepUserInfo (recipientIt->second);
+    }
+
+  Ptr<Packet> bar = Create<Packet> ();
+  bar->AddHeader (muBar);
+  // "If the Trigger frame has one User Info field and the AID12 subfield of the
+  // User Info contains the AID of a STA, then the RA field is set to the address
+  // of that STA". Otherwise, it is set to the broadcast address (Sec. 9.3.1.23 -
+  // 802.11ax amendment draft 3.0)
+  if (muBar.GetNUserInfoFields () > 1)
+    {
+      rxAddress = Mac48Address::GetBroadcast ();
+    }
+  else
+    {
+      NS_ASSERT (m_apMac != 0);
+      rxAddress = m_apMac->GetStaList ().at (recipients.begin ()->first);
+    }
+
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_CTL_TRIGGER);
+  hdr.SetAddr1 (rxAddress);
+  hdr.SetAddr2 (m_self);
+  hdr.SetDsNotTo ();
+  hdr.SetDsNotFrom ();
+  hdr.SetNoRetry ();
+  hdr.SetNoMoreFragments ();
+
+  return Create<WifiMacQueueItem> (bar, hdr);
+}
+
+void
+HeFrameExchangeManager::CalculateAcknowledgmentTime (WifiAcknowledgment* acknowledgment) const
+{
+  NS_LOG_FUNCTION (this << acknowledgment);
+  NS_ASSERT (acknowledgment != nullptr);
+
+  /*
+   * Acknowledgment via a sequence of BlockAckReq and BlockAck frames
+   */
+  if (acknowledgment->method == WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE)
+    {
+      WifiDlMuBarBaSequence* dlMuBarBaAcknowledgment = static_cast<WifiDlMuBarBaSequence*> (acknowledgment);
+
+      Time duration = Seconds (0);
+
+      // normal ack or implicit BAR policy can be used for (no more than) one receiver
+      NS_ABORT_IF (dlMuBarBaAcknowledgment->stationsReplyingWithNormalAck.size ()
+                   + dlMuBarBaAcknowledgment->stationsReplyingWithBlockAck.size () > 1);
+
+      if (!dlMuBarBaAcknowledgment->stationsReplyingWithNormalAck.empty ())
+        {
+          const auto& info = dlMuBarBaAcknowledgment->stationsReplyingWithNormalAck.begin ()->second;
+          duration += m_phy->GetSifs ()
+                      + m_phy->CalculateTxDuration (GetAckSize (), info.ackTxVector, m_phy->GetPhyBand ());
+        }
+
+      if (!dlMuBarBaAcknowledgment->stationsReplyingWithBlockAck.empty ())
+        {
+          const auto& info = dlMuBarBaAcknowledgment->stationsReplyingWithBlockAck.begin ()->second;
+          duration += m_phy->GetSifs ()
+                      + m_phy->CalculateTxDuration (GetBlockAckSize (info.baType),
+                                                    info.blockAckTxVector, m_phy->GetPhyBand ());
+        }
+
+      for (const auto& stations : dlMuBarBaAcknowledgment->stationsSendBlockAckReqTo)
+        {
+          const auto& info = stations.second;
+          duration += m_phy->GetSifs ()
+                      + m_phy->CalculateTxDuration (GetBlockAckRequestSize (info.barType),
+                                                    info.blockAckReqTxVector, m_phy->GetPhyBand ())
+                      + m_phy->GetSifs ()
+                      + m_phy->CalculateTxDuration (GetBlockAckSize (info.baType),
+                                                    info.blockAckTxVector, m_phy->GetPhyBand ());
+        }
+
+      dlMuBarBaAcknowledgment->acknowledgmentTime = duration;
+    }
+  /*
+   * Acknowledgment via a MU-BAR Trigger Frame sent as single user frame
+   */
+  else if (acknowledgment->method == WifiAcknowledgment::DL_MU_TF_MU_BAR)
+    {
+      WifiDlMuTfMuBar* dlMuTfMuBarAcknowledgment = static_cast<WifiDlMuTfMuBar*> (acknowledgment);
+
+      Time duration = Seconds (0);
+
+      for (const auto& stations : dlMuTfMuBarAcknowledgment->stationsReplyingWithBlockAck)
+        {
+          // compute the TX duration of the BlockAck response from this receiver.
+          const auto& info = stations.second;
+          NS_ASSERT (info.blockAckTxVector.GetHeMuUserInfoMap ().size () == 1);
+          uint16_t staId = info.blockAckTxVector.GetHeMuUserInfoMap ().begin ()->first;
+          Time currBlockAckDuration = m_phy->CalculateTxDuration (GetBlockAckSize (info.baType),
+                                                                  info.blockAckTxVector,
+                                                                  m_phy->GetPhyBand (),
+                                                                  staId);
+          // update the max duration among all the Block Ack responses
+          if (currBlockAckDuration > duration)
+            {
+              duration = currBlockAckDuration;
+            }
+        }
+
+      // The computed duration may not be coded exactly in the L-SIG length, hence determine
+      // the exact duration corresponding to the value that will be coded in this field.
+      dlMuTfMuBarAcknowledgment->ulLength = HePhy::ConvertHeTbPpduDurationToLSigLength (duration, m_phy->GetPhyBand ());
+      WifiTxVector& txVector = dlMuTfMuBarAcknowledgment->stationsReplyingWithBlockAck.begin ()->second.blockAckTxVector;
+      duration = HePhy::ConvertLSigLengthToHeTbPpduDuration (dlMuTfMuBarAcknowledgment->ulLength,
+                                                             txVector, m_phy->GetPhyBand ());
+
+      uint32_t muBarSize = GetMuBarSize (dlMuTfMuBarAcknowledgment->barTypes);
+      dlMuTfMuBarAcknowledgment->acknowledgmentTime = m_phy->GetSifs ()
+                                                      + m_phy->CalculateTxDuration (muBarSize,
+                                                                                    dlMuTfMuBarAcknowledgment->muBarTxVector,
+                                                                                    m_phy->GetPhyBand ())
+                                                      + m_phy->GetSifs () + duration;
+    }
+  /*
+   * Acknowledgment requested by MU-BAR TFs aggregated to PSDUs in the DL MU PPDU
+   */
+  else if (acknowledgment->method == WifiAcknowledgment::DL_MU_AGGREGATE_TF)
+    {
+      WifiDlMuAggregateTf* dlMuAggrTfAcknowledgment = static_cast<WifiDlMuAggregateTf*> (acknowledgment);
+
+      Time duration = Seconds (0);
+
+      for (const auto& stations : dlMuAggrTfAcknowledgment->stationsReplyingWithBlockAck)
+        {
+          // compute the TX duration of the BlockAck response from this receiver.
+          const auto& info = stations.second;
+          NS_ASSERT (info.blockAckTxVector.GetHeMuUserInfoMap ().size () == 1);
+          uint16_t staId = info.blockAckTxVector.GetHeMuUserInfoMap ().begin ()->first;
+          Time currBlockAckDuration = m_phy->CalculateTxDuration (GetBlockAckSize (info.baType),
+                                                                  info.blockAckTxVector,
+                                                                  m_phy->GetPhyBand (),
+                                                                  staId);
+          // update the max duration among all the Block Ack responses
+          if (currBlockAckDuration > duration)
+            {
+              duration = currBlockAckDuration;
+            }
+        }
+
+      // The computed duration may not be coded exactly in the L-SIG length, hence determine
+      // the exact duration corresponding to the value that will be coded in this field.
+      dlMuAggrTfAcknowledgment->ulLength = HePhy::ConvertHeTbPpduDurationToLSigLength (duration, m_phy->GetPhyBand ());
+      WifiTxVector& txVector = dlMuAggrTfAcknowledgment->stationsReplyingWithBlockAck.begin ()->second.blockAckTxVector;
+      duration = HePhy::ConvertLSigLengthToHeTbPpduDuration (dlMuAggrTfAcknowledgment->ulLength,
+                                                             txVector, m_phy->GetPhyBand ());
+
+      dlMuAggrTfAcknowledgment->acknowledgmentTime = m_phy->GetSifs () + duration;
+    }
+  /*
+   * Basic Trigger Frame starting an UL MU transmission
+   */
+  else if (acknowledgment->method == WifiAcknowledgment::UL_MU_MULTI_STA_BA)
+    {
+      WifiUlMuMultiStaBa* ulMuMultiStaBa = static_cast<WifiUlMuMultiStaBa*> (acknowledgment);
+
+      Time duration = m_phy->CalculateTxDuration (GetBlockAckSize (ulMuMultiStaBa->baType),
+                                                  ulMuMultiStaBa->multiStaBaTxVector,
+                                                  m_phy->GetPhyBand ());
+      ulMuMultiStaBa->acknowledgmentTime = m_phy->GetSifs () + duration;
+    }
+  /*
+   * TB PPDU solicired by a Basic or BSRP Trigger Frame
+   */
+  else if (acknowledgment->method == WifiAcknowledgment::ACK_AFTER_TB_PPDU)
+    {
+      // The station solicited by the Trigger Frame does not have to account
+      // for the actual acknowledgment time since it is given the PPDU duration
+      // through the Trigger Frame
+      acknowledgment->acknowledgmentTime = Seconds (0);
+    }
+  else
+    {
+      VhtFrameExchangeManager::CalculateAcknowledgmentTime (acknowledgment);
+    }
+}
+
+Time
+HeFrameExchangeManager::GetTxDuration (uint32_t ppduPayloadSize, Mac48Address receiver,
+                                       const WifiTxParameters& txParams) const
+{
+  if (!txParams.m_txVector.IsMu ())
+    {
+      return VhtFrameExchangeManager::GetTxDuration (ppduPayloadSize, receiver, txParams);
+    }
+
+  NS_ASSERT_MSG (!txParams.m_txVector.IsDlMu () || m_apMac != 0, "DL MU can be done by an AP");
+  NS_ASSERT_MSG (!txParams.m_txVector.IsUlMu () || m_staMac != 0, "UL MU can be done by a STA");
+
+  if (txParams.m_acknowledgment
+      && txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_AGGREGATE_TF)
+    {
+      // we need to account for the size of the aggregated MU-BAR Trigger Frame
+      WifiDlMuAggregateTf* acknowledgment = static_cast<WifiDlMuAggregateTf*> (txParams.m_acknowledgment.get ());
+
+      const auto& info = acknowledgment->stationsReplyingWithBlockAck.find (receiver);
+      NS_ASSERT (info != acknowledgment->stationsReplyingWithBlockAck.end ());
+
+      ppduPayloadSize = MpduAggregator::GetSizeIfAggregated (info->second.muBarSize, ppduPayloadSize);
+    }
+
+  uint16_t staId = (txParams.m_txVector.IsDlMu () ? m_apMac->GetAssociationId (receiver)
+                                                  : m_staMac->GetAssociationId ());
+  Time psduDuration = m_phy->CalculateTxDuration (ppduPayloadSize, txParams.m_txVector,
+                                                  m_phy->GetPhyBand (), staId);
+
+  return std::max (psduDuration, txParams.m_txDuration);
+}
+
+void
+HeFrameExchangeManager::TbPpduTimeout (WifiPsduMap* psduMap,
+                                       const std::set<Mac48Address>* staMissedTbPpduFrom,
+                                       std::size_t nSolicitedStations)
+{
+  NS_LOG_FUNCTION (this << psduMap << staMissedTbPpduFrom->size () << nSolicitedStations);
+
+  NS_ASSERT (psduMap != nullptr);
+  NS_ASSERT (psduMap->size () == 1 && psduMap->begin ()->first == SU_STA_ID
+              && psduMap->begin ()->second->GetHeader (0).IsTrigger ());
+
+  // This method is called if some station(s) did not send a TB PPDU
+  NS_ASSERT (!staMissedTbPpduFrom->empty ());
+  NS_ASSERT (m_edca != 0);
+
+  if (staMissedTbPpduFrom->size () == nSolicitedStations)
+    {
+      // no station replied, the transmission failed
+      m_edca->UpdateFailedCw ();
+
+      TransmissionFailed ();
+    }
+  else if (!m_multiStaBaEvent.IsRunning ())
+    {
+      m_edca->ResetCw ();
+      TransmissionSucceeded ();
+    }
+
+  m_psduMap.clear ();
+}
+
+void
+HeFrameExchangeManager::BlockAcksInTbPpduTimeout (WifiPsduMap* psduMap,
+                                                  const std::set<Mac48Address>* staMissedBlockAckFrom,
+                                                  std::size_t nSolicitedStations)
+{
+  NS_LOG_FUNCTION (this << psduMap << nSolicitedStations);
+
+  NS_ASSERT (psduMap != nullptr);
+  NS_ASSERT (m_txParams.m_acknowledgment
+             && (m_txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_AGGREGATE_TF
+                 || m_txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_TF_MU_BAR));
+
+  // This method is called if some station(s) did not send a BlockAck frame in a TB PPDU
+  NS_ASSERT (!staMissedBlockAckFrom->empty ());
+
+  bool resetCw;
+
+  if (staMissedBlockAckFrom->size () == nSolicitedStations)
+    {
+      // no station replied, the transmission failed
+      // call ReportDataFailed to increase SRC/LRC
+      m_mac->GetWifiRemoteStationManager ()->ReportDataFailed (*psduMap->begin ()->second->begin ());
+      resetCw = false;
+    }
+  else
+    {
+      // the transmission succeeded
+      resetCw = true;
+    }
+
+  m_triggerFrame = nullptr;  // this is strictly needed for DL_MU_TF_MU_BAR only
+
+  for (const auto& sta : *staMissedBlockAckFrom)
+    {
+      Ptr<WifiPsdu> psdu = GetPsduTo (sta, *psduMap);
+      NS_ASSERT (psdu != nullptr);
+      // If the QSRC[AC] or the QLRC[AC] has reached dot11ShortRetryLimit or dot11LongRetryLimit
+      // respectively, CW[AC] shall be reset to CWmin[AC] (sec. 10.22.2.2 of 802.11-2016).
+      // We should get that psduResetCw is the same for all PSDUs, but the handling of QSRC/QLRC
+      // needs to be aligned to the specifications.
+      bool psduResetCw;
+      MissedBlockAck (psdu, m_txParams.m_txVector, psduResetCw);
+      resetCw = resetCw || psduResetCw;
+    }
+
+  NS_ASSERT (m_edca != 0);
+
+  if (resetCw)
+    {
+      m_edca->ResetCw ();
+    }
+  else
+    {
+      m_edca->UpdateFailedCw ();
+    }
+
+  if (staMissedBlockAckFrom->size () == nSolicitedStations)
+    {
+      // no station replied, the transmission failed
+      TransmissionFailed ();
+    }
+  else
+    {
+      TransmissionSucceeded ();
+    }
+  m_psduMap.clear ();
+}
+
+void
+HeFrameExchangeManager::BlockAckAfterTbPpduTimeout (Ptr<WifiPsdu> psdu, const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << *psdu << txVector);
+
+  bool resetCw;
+
+  // call ReportDataFailed to increase SRC/LRC
+  m_mac->GetWifiRemoteStationManager ()->ReportDataFailed (*psdu->begin ());
+
+  MissedBlockAck (psdu, m_txParams.m_txVector, resetCw);
+
+  // This is a PSDU sent in a TB PPDU. An HE STA resumes the EDCA backoff procedure
+  // without modifying CW or the backoff counter for the associated EDCAF, after
+  // transmission of an MPDU in a TB PPDU regardless of whether the STA has received
+  // the corresponding acknowledgment frame in response to the MPDU sent in the TB PPDU
+  // (Sec. 10.22.2.2 of 11ax Draft 3.0)
+  m_psduMap.clear ();
+}
+
+WifiTxVector
+HeFrameExchangeManager::GetHeTbTxVector (CtrlTriggerHeader trigger, Mac48Address triggerSender) const
+{
+  NS_ASSERT (triggerSender != m_self); //TxPower information is used only by STAs, it is useless for the sending AP (which can directly use CtrlTriggerHeader::GetHeTbTxVector)
+  NS_ASSERT (m_staMac != nullptr);
+  uint16_t staId = m_staMac->GetAssociationId ();
+  auto userInfoIt = trigger.FindUserInfoWithAid (staId);
+  NS_ASSERT (userInfoIt != trigger.end ());
+
+  WifiTxVector v = trigger.GetHeTbTxVector (staId);
+
+  Ptr<HeConfiguration> heConfiguration = m_mac->GetHeConfiguration ();
+  NS_ASSERT_MSG (heConfiguration != 0, "This STA has to be an HE station to send an HE TB PPDU");
+  v.SetBssColor (heConfiguration->GetBssColor ());
+
+  uint8_t powerLevel = m_mac->GetWifiRemoteStationManager ()->GetDefaultTxPowerLevel ();
+  /**
+   * Get the transmit power to use for an HE TB PPDU
+   * considering:
+   * - the transmit power used by the AP to send the Trigger Frame (TF),
+   *   obtained from the AP TX Power subfield of the Common Info field
+   *   of the TF.
+   * - the target uplink RSSI expected by the AP for the triggered HE TB PPDU,
+   *   obtained from the UL Target RSSI subfield of the User Info field
+   *   of the TF.
+   * - the RSSI of the PPDU containing the TF, typically logged by the
+   *   WifiRemoteStationManager upon reception of the TF from the AP.
+   *
+   * It is assumed that path loss is symmetric (i.e. uplink path loss is
+   * equivalent to the measured downlink path loss);
+   *
+   * Refer to section 27.3.14.2 (Power pre-correction) of 802.11ax Draft 4.0 for more details.
+   */
+  int8_t pathLossDb = trigger.GetApTxPower () - static_cast<int8_t> (m_mac->GetWifiRemoteStationManager ()->GetMostRecentRssi (triggerSender)); //cast RSSI to be on equal footing with AP Tx power information
+  double reqTxPowerDbm = static_cast<double> (userInfoIt->GetUlTargetRssi () + pathLossDb);
+
+  //Convert the transmit power to a power level
+  uint8_t numPowerLevels = m_phy->GetNTxPower ();
+  if (numPowerLevels > 1)
+    {
+      double stepDbm = (m_phy->GetTxPowerEnd () - m_phy->GetTxPowerStart ()) / (numPowerLevels - 1);
+      powerLevel = static_cast<uint8_t> (ceil ((reqTxPowerDbm - m_phy->GetTxPowerStart ()) / stepDbm)); //better be slightly above so as to satisfy target UL RSSI
+      if (powerLevel > numPowerLevels)
+        {
+          powerLevel = numPowerLevels; //capping will trigger warning below
+        }
+    }
+  if (reqTxPowerDbm > m_phy->GetPowerDbm (powerLevel))
+    {
+      NS_LOG_WARN ("The requested power level (" << reqTxPowerDbm << "dBm) cannot be satisfied (max: " << m_phy->GetTxPowerEnd () << "dBm)");
+    }
+  v.SetTxPowerLevel (powerLevel);
+  NS_LOG_LOGIC ("UL power control: "
+                << "input {pathLoss=" << pathLossDb << "dB, reqTxPower=" << reqTxPowerDbm << "dBm}"
+                << " output {powerLevel=" << +powerLevel << " -> " << m_phy->GetPowerDbm (powerLevel) << "dBm}"
+                << " PHY power capa {min=" << m_phy->GetTxPowerStart () << "dBm, max=" << m_phy->GetTxPowerEnd () << "dBm, levels:" << +numPowerLevels << "}");
+
+  return v;
+}
+
+void
+HeFrameExchangeManager::SetTargetRssi (CtrlTriggerHeader& trigger) const
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_apMac != 0);
+
+  trigger.SetApTxPower (static_cast<int8_t> (m_phy->GetPowerDbm (m_mac->GetWifiRemoteStationManager ()->GetDefaultTxPowerLevel ())));
+  for (auto& userInfo : trigger)
+    {
+      const auto staList = m_apMac->GetStaList ();
+      auto itAidAddr = staList.find (userInfo.GetAid12 ());
+      NS_ASSERT (itAidAddr != staList.end ());
+      int8_t rssi = static_cast<int8_t> (m_mac->GetWifiRemoteStationManager ()->GetMostRecentRssi (itAidAddr->second));
+      rssi = (rssi >= -20) ? -20 : ((rssi <= -110) ? -110 : rssi); //cap so as to keep within [-110; -20] dBm
+      userInfo.SetUlTargetRssi (rssi);
+    }
+}
+
+void
+HeFrameExchangeManager::SendMultiStaBlockAck (const WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << &txParams);
+
+  NS_ASSERT (m_apMac != 0);
+  NS_ASSERT (txParams.m_acknowledgment
+             && txParams.m_acknowledgment->method == WifiAcknowledgment::UL_MU_MULTI_STA_BA);
+  WifiUlMuMultiStaBa* acknowledgment = static_cast<WifiUlMuMultiStaBa*> (txParams.m_acknowledgment.get ());
+
+  NS_ASSERT (!acknowledgment->stationsReceivingMultiStaBa.empty ());
+
+  CtrlBAckResponseHeader blockAck;
+  blockAck.SetType (acknowledgment->baType);
+
+  Mac48Address receiver;
+
+  for (const auto& staInfo : acknowledgment->stationsReceivingMultiStaBa)
+    {
+      receiver = staInfo.first.first;
+      uint8_t tid = staInfo.first.second;
+      std::size_t index = staInfo.second;
+
+      blockAck.SetAid11 (m_apMac->GetAssociationId (receiver), index);
+      blockAck.SetTidInfo (tid, index);
+
+      if (tid == 14)
+        {
+          // All-ack context
+          NS_LOG_DEBUG ("Multi-STA Block Ack: Sending All-ack to=" << receiver);
+          blockAck.SetAckType (true, index);
+          continue;
+        }
+
+      if (acknowledgment->baType.m_bitmapLen.at (index) == 0)
+        {
+          // Acknowledgment context
+          NS_LOG_DEBUG ("Multi-STA Block Ack: Sending Ack to=" << receiver);
+          blockAck.SetAckType (true, index);
+        }
+      else
+        {
+          // Block acknowledgment context
+          blockAck.SetAckType (false, index);
+
+          auto addressTidPair = staInfo.first;
+          auto agreementIt = m_agreements.find (addressTidPair);
+          NS_ASSERT (agreementIt != m_agreements.end ());
+          agreementIt->second.FillBlockAckBitmap (&blockAck, index);
+          NS_LOG_DEBUG ("Multi-STA Block Ack: Sending Block Ack with seq=" << blockAck.GetStartingSequence (index)
+                        << " to=" << receiver << " tid=" << +tid);
+        }
+    }
+
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_CTL_BACKRESP);
+  hdr.SetAddr1 (acknowledgment->stationsReceivingMultiStaBa.size () == 1 ? receiver : Mac48Address::GetBroadcast ());
+  hdr.SetAddr2 (m_self);
+  hdr.SetDsNotFrom ();
+  hdr.SetDsNotTo ();
+
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader (blockAck);
+  Ptr<WifiPsdu> psdu = GetWifiPsdu (Create<WifiMacQueueItem> (packet, hdr),
+                                    acknowledgment->multiStaBaTxVector);
+
+  // The Duration/ID field in a BlockAck frame transmitted in response to a frame
+  // carried in HE TB PPDU is set according to the multiple protection settings
+  // (Sec. 9.2.5.7 of 802.11ax D3.0)
+  Time txDuration = m_phy->CalculateTxDuration (GetBlockAckSize (acknowledgment->baType),
+                                                acknowledgment->multiStaBaTxVector,
+                                                m_phy->GetPhyBand ());
+  WifiTxParameters params;
+  // if the TXOP limit is null, GetPsduDurationId returns the acknowledgment time,
+  // hence we set an method with acknowledgment time equal to zero.
+  params.m_acknowledgment = std::unique_ptr<WifiAcknowledgment> (new WifiNoAck);
+  psdu->SetDuration (GetPsduDurationId (txDuration, params));
+
+  psdu->GetPayload (0)->AddPacketTag (m_muSnrTag);
+
+  ForwardPsduDown (psdu, acknowledgment->multiStaBaTxVector);
+
+  // continue with the TXOP if time remains
+  m_psduMap.clear ();
+  m_edca->ResetCw ();
+  m_muSnrTag.Reset ();
+  Simulator::Schedule (txDuration, &HeFrameExchangeManager::TransmissionSucceeded, this);
+}
+
+void
+HeFrameExchangeManager::ReceiveBasicTrigger (const CtrlTriggerHeader& trigger, const WifiMacHeader& hdr)
+{
+  NS_LOG_FUNCTION (this << trigger << hdr);
+  NS_ASSERT (trigger.IsBasic ());
+  NS_ASSERT (m_staMac != 0 && m_staMac->IsAssociated ());
+
+  NS_LOG_DEBUG ("Received a Trigger Frame (basic variant) soliciting a transmission");
+
+  if (trigger.GetCsRequired () && hdr.GetAddr2 () != m_txopHolder && m_navEnd > Simulator::Now ())
+    {
+      NS_LOG_DEBUG ("Carrier Sensing required and channel busy, do nothing");
+      return;
+    }
+
+  // Starting from the Preferred AC indicated in the Trigger Frame, check if there
+  // is either a pending BlockAckReq frame or a data frame that can be transmitted
+  // in the allocated time and is addressed to a station with which a Block Ack
+  // agreement has been established.
+
+  // create the sequence of TIDs to check
+  std::vector<uint8_t> tids;
+  uint16_t staId = m_staMac->GetAssociationId ();
+  AcIndex preferredAc = trigger.FindUserInfoWithAid (staId)->GetPreferredAc ();
+  auto acIt = wifiAcList.find (preferredAc);
+  for (uint8_t i = 0; i < 4; i++)
+    {
+      NS_ASSERT (acIt != wifiAcList.end ());
+      tids.push_back (acIt->second.GetHighTid ());
+      tids.push_back (acIt->second.GetLowTid ());
+
+      acIt++;
+      if (acIt == wifiAcList.end ())
+        {
+          acIt = wifiAcList.begin ();
+        }
+    }
+
+  Ptr<const WifiMacQueueItem> mpdu;
+  Ptr<WifiPsdu> psdu;
+  WifiTxParameters txParams;
+  WifiTxVector tbTxVector = GetHeTbTxVector (trigger, hdr.GetAddr2 ());
+  Time ppduDuration = HePhy::ConvertLSigLengthToHeTbPpduDuration (trigger.GetUlLength (),
+                                                                  tbTxVector,
+                                                                  m_phy->GetPhyBand ());
+
+  for (const auto& tid : tids)
+    {
+      Ptr<QosTxop> edca = m_mac->GetQosTxop (tid);
+
+      if (!edca->GetBaAgreementEstablished (hdr.GetAddr2 (), tid))
+        {
+          // no Block Ack agreement established for this TID
+          continue;
+        }
+
+      txParams.Clear ();
+      txParams.m_txVector = tbTxVector;
+
+      // first, check if there is a pending BlockAckReq frame
+      if ((mpdu = edca->GetBaManager ()->GetBar (false, tid, hdr.GetAddr2 ())) != 0
+          && TryAddMpdu (mpdu, txParams, ppduDuration))
+        {
+          NS_LOG_DEBUG ("Sending a BAR within a TB PPDU");
+          psdu = Create<WifiPsdu> (edca->GetBaManager ()->GetBar (true, tid, hdr.GetAddr2 ()), true);
+          break;
+        }
+
+      // otherwise, check if a suitable data frame is available
+      if ((mpdu = edca->PeekNextMpdu (tid, hdr.GetAddr2 ())) != 0)
+        {
+          WifiMacQueueItem::QueueIteratorPair queueIt;
+          Ptr<WifiMacQueueItem> item = edca->GetNextMpdu (mpdu, txParams, ppduDuration, false, queueIt);
+
+          if (item != 0)
+            {
+              // try A-MPDU aggregation
+              std::vector<Ptr<WifiMacQueueItem>> mpduList = m_mpduAggregator->GetNextAmpdu (item, txParams,
+                                                                                            ppduDuration,
+                                                                                            queueIt);
+              psdu = (mpduList.size () > 1 ? Create<WifiPsdu> (std::move (mpduList))
+                                           : Create<WifiPsdu> (item, true));
+              break;
+            }
+        }
+    }
+
+  if (psdu != 0)
+    {
+      psdu->SetDuration (hdr.GetDuration () - m_phy->GetSifs () - ppduDuration);
+      SendPsduMapWithProtection (WifiPsduMap {{staId, psdu}}, txParams);
+    }
+  else
+    {
+      // send QoS Null frames
+      SendQosNullFramesInTbPpdu (trigger, hdr);
+    }
+}
+
+void
+HeFrameExchangeManager::SendQosNullFramesInTbPpdu (const CtrlTriggerHeader& trigger, const WifiMacHeader& hdr)
+{
+  NS_LOG_FUNCTION (this << trigger << hdr);
+  NS_ASSERT (trigger.IsBasic () || trigger.IsBsrp ());
+  NS_ASSERT (m_staMac != 0 && m_staMac->IsAssociated ());
+
+  NS_LOG_DEBUG ("Requested to send QoS Null frames");
+
+  if (trigger.GetCsRequired () && hdr.GetAddr2 () != m_txopHolder && m_navEnd > Simulator::Now ())
+    {
+      NS_LOG_DEBUG ("Carrier Sensing required and channel busy, do nothing");
+      return;
+    }
+
+  WifiMacHeader header;
+  header.SetType (WIFI_MAC_QOSDATA_NULL);
+  header.SetAddr1 (hdr.GetAddr2 ());
+  header.SetAddr2 (m_self);
+  header.SetAddr3 (hdr.GetAddr2 ());
+  header.SetDsTo ();
+  header.SetDsNotFrom ();
+  // TR3: Sequence numbers for transmitted QoS (+)Null frames may be set
+  // to any value. (Table 10-3 of 802.11-2016)
+  header.SetSequenceNumber (0);
+  // Set the EOSP bit so that NotifyTxToEdca will add the Queue Size
+  header.SetQosEosp ();
+
+  WifiTxParameters txParams;
+  txParams.m_txVector = GetHeTbTxVector (trigger, hdr.GetAddr2 ());
+  txParams.m_protection = std::unique_ptr<WifiProtection> (new WifiNoProtection);
+  txParams.m_acknowledgment = std::unique_ptr<WifiAcknowledgment> (new WifiNoAck);
+
+  Time ppduDuration = HePhy::ConvertLSigLengthToHeTbPpduDuration (trigger.GetUlLength (),
+                                                                  txParams.m_txVector,
+                                                                  m_phy->GetPhyBand ());
+  header.SetDuration (hdr.GetDuration () - m_phy->GetSifs () - ppduDuration);
+
+  Ptr<WifiMacQueueItem> mpdu;
+  std::vector<Ptr<WifiMacQueueItem>> mpduList;
+  uint8_t tid = 0;
+  header.SetQosTid (tid);
+
+  while (tid < 8
+         && IsWithinSizeAndTimeLimits (txParams.GetSizeIfAddMpdu (mpdu = Create<WifiMacQueueItem> (Create<Packet> (),
+                                                                                                   header)),
+                                       hdr.GetAddr2 (), txParams, ppduDuration))
+    {
+      NS_LOG_DEBUG ("Aggregating a QoS Null frame with tid=" << +tid);
+      // We could call TryAddMpdu instead of IsWithinSizeAndTimeLimits above in order to
+      // get the TX parameters updated automatically. However, aggregating the QoS Null
+      // frames might fail because MPDU aggregation is disabled by default for VO
+      // and BK. Therefore, we skip the check on max A-MPDU size and only update the
+      // TX parameters below.
+      txParams.m_acknowledgment = GetAckManager ()->TryAddMpdu (mpdu, txParams);
+      txParams.AddMpdu (mpdu);
+      UpdateTxDuration (mpdu->GetHeader ().GetAddr1 (), txParams);
+      mpduList.push_back (mpdu);
+      header.SetQosTid (++tid);
+    }
+
+  if (mpduList.empty ())
+    {
+      NS_LOG_DEBUG ("Not enough time to send a QoS Null frame");
+      return;
+    }
+
+  Ptr<WifiPsdu> psdu = (mpduList.size () > 1 ? Create<WifiPsdu> (std::move (mpduList))
+                                             : Create<WifiPsdu> (mpduList.front (), true));
+  uint16_t staId = m_staMac->GetAssociationId ();
+  SendPsduMapWithProtection (WifiPsduMap {{staId, psdu}}, txParams);
+}
+
+void
+HeFrameExchangeManager::ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu, RxSignalInfo rxSignalInfo,
+                                     const WifiTxVector& txVector, bool inAmpdu)
+{
+  // The received MPDU is either broadcast or addressed to this station
+  NS_ASSERT (mpdu->GetHeader ().GetAddr1 ().IsBroadcast ()
+             || mpdu->GetHeader ().GetAddr1 () == m_self);
+
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
+
+  if (txVector.IsUlMu () && m_txTimer.IsRunning ()
+      && m_txTimer.GetReason () == WifiTxTimer::WAIT_TB_PPDU_AFTER_BASIC_TF)
+    {
+      Mac48Address sender = hdr.GetAddr2 ();
+      NS_ASSERT (m_txParams.m_acknowledgment
+                  && m_txParams.m_acknowledgment->method == WifiAcknowledgment::UL_MU_MULTI_STA_BA);
+      WifiUlMuMultiStaBa* acknowledgment = static_cast<WifiUlMuMultiStaBa*> (m_txParams.m_acknowledgment.get ());
+      std::size_t index = acknowledgment->baType.m_bitmapLen.size ();
+
+      if (m_staExpectTbPpduFrom.find (sender) == m_staExpectTbPpduFrom.end ())
+        {
+          NS_LOG_WARN ("Received a TB PPDU from an unexpected station: " << sender);
+          return;
+        }
+
+      if (hdr.IsBlockAckReq ())
+        {
+          NS_LOG_DEBUG ("Received a BlockAckReq in a TB PPDU from " << sender);
+
+          CtrlBAckRequestHeader blockAckReq;
+          mpdu->GetPacket ()->PeekHeader (blockAckReq);
+          NS_ABORT_MSG_IF (blockAckReq.IsMultiTid (), "Multi-TID BlockAckReq not supported");
+          uint8_t tid = blockAckReq.GetTidInfo ();
+          auto agreementIt = m_agreements.find ({sender, tid});
+          NS_ASSERT (agreementIt != m_agreements.end ());
+          agreementIt->second.NotifyReceivedBar (blockAckReq.GetStartingSequence ());
+
+          // Block Acknowledgment context
+          acknowledgment->stationsReceivingMultiStaBa.emplace (std::make_pair (sender, tid), index);
+          acknowledgment->baType.m_bitmapLen.push_back (GetBlockAckType (sender, tid).m_bitmapLen.at (0));
+          uint16_t staId = txVector.GetHeMuUserInfoMap ().begin ()->first;
+          m_muSnrTag.Set (staId, rxSignalInfo.snr);
+        }
+      else if (hdr.IsQosData () && !inAmpdu && hdr.GetQosAckPolicy () == WifiMacHeader::NORMAL_ACK)
+        {
+          NS_LOG_DEBUG ("Received an S-MPDU in a TB PPDU from " << sender << " (" << *mpdu << ")");
+
+          uint8_t tid = hdr.GetQosTid ();
+          auto agreementIt = m_agreements.find ({sender, tid});
+          NS_ASSERT (agreementIt != m_agreements.end ());
+          agreementIt->second.NotifyReceivedMpdu (mpdu);
+
+          // Acknowledgment context of Multi-STA Block Acks
+          acknowledgment->stationsReceivingMultiStaBa.emplace (std::make_pair (sender, tid), index);
+          acknowledgment->baType.m_bitmapLen.push_back (0);
+          uint16_t staId = txVector.GetHeMuUserInfoMap ().begin ()->first;
+          m_muSnrTag.Set (staId, rxSignalInfo.snr);
+        }
+      else if (!(hdr.IsQosData () && !hdr.HasData () && !inAmpdu))
+        {
+          // The other case handled by this function is when we receive a QoS Null frame
+          // that is not in an A-MPDU. For all other cases, the reception is handled by
+          // parent classes. In particular, in case of a QoS data frame in A-MPDU, we
+          // have to wait until the A-MPDU reception is completed, but we let the
+          // parent classes notify the Block Ack agreement of the reception of this MPDU
+          VhtFrameExchangeManager::ReceiveMpdu (mpdu, rxSignalInfo, txVector, inAmpdu);
+          return;
+        }
+
+      // Schedule the transmission of a Multi-STA BlockAck frame if needed
+      if (!acknowledgment->stationsReceivingMultiStaBa.empty () && !m_multiStaBaEvent.IsRunning ())
+        {
+          m_multiStaBaEvent = Simulator::Schedule (m_phy->GetSifs (),
+                                                   &HeFrameExchangeManager::SendMultiStaBlockAck,
+                                                   this, std::cref (m_txParams));
+        }
+
+      // remove the sender from the set of stations that are expected to send a TB PPDU
+      m_staExpectTbPpduFrom.erase (sender);
+
+      if (m_staExpectTbPpduFrom.empty ())
+        {
+          // we do not expect any other BlockAck frame
+          m_txTimer.Cancel ();
+          m_channelAccessManager->NotifyAckTimeoutResetNow ();
+
+          if (!m_multiStaBaEvent.IsRunning ())
+            {
+              // all of the stations that replied with a TB PPDU sent QoS Null frames.
+              NS_LOG_DEBUG ("Continue the TXOP");
+              m_psduMap.clear ();
+              m_edca->ResetCw ();
+              TransmissionSucceeded ();
+            }
+        }
+
+      // the received TB PPDU has been processed
+      return;
+    }
+
+  if (hdr.IsCtl ())
+    {
+      if (hdr.IsAck () && m_txTimer.IsRunning ()
+          && m_txTimer.GetReason () == WifiTxTimer::WAIT_NORMAL_ACK_AFTER_DL_MU_PPDU)
+        {
+          NS_ASSERT (hdr.GetAddr1 () == m_self);
+          NS_ASSERT (m_txParams.m_acknowledgment);
+          NS_ASSERT (m_txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE);
+
+          WifiDlMuBarBaSequence* acknowledgment = static_cast<WifiDlMuBarBaSequence*> (m_txParams.m_acknowledgment.get ());
+          NS_ASSERT (acknowledgment->stationsReplyingWithNormalAck.size () == 1);
+          NS_ASSERT (m_apMac != 0);
+          uint16_t staId = m_apMac->GetAssociationId (acknowledgment->stationsReplyingWithNormalAck.begin ()->first);
+          auto it = m_psduMap.find (staId);
+          NS_ASSERT (it != m_psduMap.end ());
+          NS_ASSERT (it->second->GetAddr1 () == acknowledgment->stationsReplyingWithNormalAck.begin ()->first);
+          SnrTag tag;
+          mpdu->GetPacket ()->PeekPacketTag (tag);
+          ReceivedNormalAck (*it->second->begin (), m_txParams.m_txVector, txVector, rxSignalInfo, tag.Get ());
+        }
+      else if (hdr.IsBlockAck () && m_txTimer.IsRunning ()
+               && m_txTimer.GetReason () == WifiTxTimer::WAIT_BLOCK_ACKS_IN_TB_PPDU)
+        {
+          Mac48Address sender = hdr.GetAddr2 ();
+          NS_LOG_DEBUG ("Received BlockAck in TB PPDU from=" << sender);
+
+          SnrTag tag;
+          mpdu->GetPacket ()->PeekPacketTag (tag);
+
+          // notify the Block Ack Manager
+          CtrlBAckResponseHeader blockAck;
+          mpdu->GetPacket ()->PeekHeader (blockAck);
+          uint8_t tid = blockAck.GetTidInfo ();
+          GetBaManager (tid)->NotifyGotBlockAck (blockAck, hdr.GetAddr2 (), {tid}, rxSignalInfo.snr,
+                                                 tag.Get (), m_txParams.m_txVector);
+
+          // remove the sender from the set of stations that are expected to send a BlockAck
+          if (m_staExpectTbPpduFrom.erase (sender) == 0)
+            {
+              NS_LOG_WARN ("Received a BlockAck from an unexpected stations: " << sender);
+              return;
+            }
+
+          if (m_staExpectTbPpduFrom.empty ())
+            {
+              // we do not expect any other BlockAck frame
+              m_txTimer.Cancel ();
+              m_channelAccessManager->NotifyAckTimeoutResetNow ();
+              m_triggerFrame = nullptr;  // this is strictly needed for DL_MU_TF_MU_BAR only
+
+              m_edca->ResetCw ();
+              m_psduMap.clear ();
+              TransmissionSucceeded ();
+            }
+        }
+      else if (hdr.IsBlockAck () && m_txTimer.IsRunning ()
+               && m_txTimer.GetReason () == WifiTxTimer::WAIT_BLOCK_ACK_AFTER_TB_PPDU)
+        {
+          CtrlBAckResponseHeader blockAck;
+          mpdu->GetPacket ()->PeekHeader (blockAck);
+
+          NS_ABORT_MSG_IF (!blockAck.IsMultiSta (),
+                           "A Multi-STA BlockAck is expected after a TB PPDU");
+          NS_LOG_DEBUG ("Received a Multi-STA BlockAck from=" << hdr.GetAddr2 ());
+
+          NS_ASSERT (m_staMac != nullptr && m_staMac->IsAssociated ());
+          uint16_t staId = m_staMac->GetAssociationId ();
+          std::vector<uint32_t> indices = blockAck.FindPerAidTidInfoWithAid (staId);
+
+          if (indices.empty ())
+            {
+              NS_LOG_DEBUG ("No Per AID TID Info subfield intended for me");
+              return;
+            }
+
+          MuSnrTag tag;
+          mpdu->GetPacket ()->PeekPacketTag (tag);
+
+          // notify the Block Ack Manager
+          for (const auto& index : indices)
+            {
+              uint8_t tid = blockAck.GetTidInfo (index);
+
+              if (blockAck.GetAckType (index) && tid < 8)
+                {
+                  // Acknowledgment context
+                  NS_ABORT_IF (m_psduMap.empty () || m_psduMap.begin ()->first != staId);
+                  GetBaManager (tid)->NotifyGotAck (*m_psduMap.at (staId)->begin ());
+                }
+              else
+                {
+                  // Block Acknowledgment or All-ack context
+                  if (blockAck.GetAckType (index) && tid == 14)
+                    {
+                      // All-ack context, we need to determine the actual TID(s) of the PSDU
+                      NS_ASSERT (indices.size () == 1);
+                      NS_ABORT_IF (m_psduMap.empty () || m_psduMap.begin ()->first != staId);
+                      std::set<uint8_t> tids = m_psduMap.at (staId)->GetTids ();
+                      NS_ABORT_MSG_IF (tids.size () > 1, "Multi-TID A-MPDUs not supported yet");
+                      tid = *tids.begin ();
+                    }
+
+                  GetBaManager (tid)->NotifyGotBlockAck (blockAck, hdr.GetAddr2 (), {tid},
+                                                         rxSignalInfo.snr, tag.Get (staId),
+                                                         m_txParams.m_txVector, index);
+                }
+            }
+
+          // cancel the timer
+          m_txTimer.Cancel ();
+          m_channelAccessManager->NotifyAckTimeoutResetNow ();
+          m_psduMap.clear ();
+        }
+      else if (hdr.IsTrigger ())
+        {
+          // Trigger Frames are only processed by STAs
+          if (m_staMac == nullptr)
+            {
+              return;
+            }
+
+          // A Trigger Frame in an A-MPDU is processed when the A-MPDU is fully received
+          if (inAmpdu)
+            {
+              m_triggerFrameInAmpdu = true;
+              return;
+            }
+
+          CtrlTriggerHeader trigger;
+          mpdu->GetPacket ()->PeekHeader (trigger);
+
+          if (hdr.GetAddr1 () != m_self
+              && (!hdr.GetAddr1 ().IsBroadcast ()
+                  || !m_staMac->IsAssociated ()
+                  || hdr.GetAddr2 () != m_bssid     // not sent by the AP this STA is associated with
+                  || trigger.FindUserInfoWithAid (m_staMac->GetAssociationId ()) == trigger.end ()))
+            {
+              // not addressed to us
+              return;
+            }
+
+          uint16_t staId = m_staMac->GetAssociationId ();
+
+          if (trigger.IsMuBar ())
+            {
+              Mac48Address sender = hdr.GetAddr2 ();
+              NS_LOG_DEBUG ("Received MU-BAR Trigger Frame from=" << sender);
+              m_mac->GetWifiRemoteStationManager ()->ReportRxOk (sender, rxSignalInfo, txVector);
+
+              auto userInfoIt = trigger.FindUserInfoWithAid (staId);
+              NS_ASSERT (userInfoIt != trigger.end ());
+              CtrlBAckRequestHeader blockAckReq = userInfoIt->GetMuBarTriggerDepUserInfo ();
+              NS_ABORT_MSG_IF (blockAckReq.IsMultiTid (), "Multi-TID BlockAckReq not supported");
+              uint8_t tid = blockAckReq.GetTidInfo ();
+
+              auto agreementIt = m_agreements.find ({sender, tid});
+
+              if (agreementIt == m_agreements.end ())
+                {
+                  NS_LOG_DEBUG ("There's not a valid agreement for this BlockAckReq");
+                  return;
+                }
+
+              agreementIt->second.NotifyReceivedBar (blockAckReq.GetStartingSequence ());
+
+              NS_LOG_DEBUG ("Schedule Block Ack in TB PPDU");
+              Simulator::Schedule (m_phy->GetSifs (), &HeFrameExchangeManager::SendBlockAck, this,
+                                  agreementIt->second, hdr.GetDuration (),
+                                  GetHeTbTxVector (trigger, hdr.GetAddr2 ()), rxSignalInfo.snr);
+            }
+          else if (trigger.IsBasic ())
+            {
+              Simulator::Schedule (m_phy->GetSifs (), &HeFrameExchangeManager::ReceiveBasicTrigger,
+                                   this, trigger, hdr);
+            }
+          else if (trigger.IsBsrp ())
+            {
+              Simulator::Schedule (m_phy->GetSifs (), &HeFrameExchangeManager::SendQosNullFramesInTbPpdu,
+                                   this, trigger, hdr);
+            }
+        }
+      else
+        {
+          // the received control frame cannot be handled here
+          VhtFrameExchangeManager::ReceiveMpdu (mpdu, rxSignalInfo, txVector, inAmpdu);
+        }
+
+      // the received control frame has been processed
+      return;
+    }
+
+  // the received frame cannot be handled here
+  VhtFrameExchangeManager::ReceiveMpdu (mpdu, rxSignalInfo, txVector, inAmpdu);;
+}
+
+void
+HeFrameExchangeManager::EndReceiveAmpdu (Ptr<const WifiPsdu> psdu, const RxSignalInfo& rxSignalInfo,
+                                         const WifiTxVector& txVector, const std::vector<bool>& perMpduStatus)
+{
+  std::set<uint8_t> tids = psdu->GetTids ();
+
+  if (txVector.IsUlMu () && m_txTimer.IsRunning ()
+      && m_txTimer.GetReason () == WifiTxTimer::WAIT_TB_PPDU_AFTER_BASIC_TF)
+    {
+      Mac48Address sender = psdu->GetAddr2 ();
+      NS_ASSERT (m_txParams.m_acknowledgment
+                  && m_txParams.m_acknowledgment->method == WifiAcknowledgment::UL_MU_MULTI_STA_BA);
+      WifiUlMuMultiStaBa* acknowledgment = static_cast<WifiUlMuMultiStaBa*> (m_txParams.m_acknowledgment.get ());
+      std::size_t index = acknowledgment->baType.m_bitmapLen.size ();
+
+      if (m_staExpectTbPpduFrom.find (sender) == m_staExpectTbPpduFrom.end ())
+        {
+          NS_LOG_WARN ("Received a TB PPDU from an unexpected station: " << sender);
+          return;
+        }
+
+      NS_LOG_DEBUG ("Received an A-MPDU in a TB PPDU from " << sender << " (" << *psdu << ")");
+
+      if (std::any_of (tids.begin (), tids.end (),
+                       [&psdu](uint8_t tid)
+                         { return psdu->GetAckPolicyForTid (tid) == WifiMacHeader::NORMAL_ACK; }))
+        {
+          if (std::all_of (perMpduStatus.cbegin (), perMpduStatus.cend (), [](bool v) { return v; }))
+            {
+              // All-ack context
+              acknowledgment->stationsReceivingMultiStaBa.emplace (std::make_pair (sender, 14), index);
+              acknowledgment->baType.m_bitmapLen.push_back (0);
+            }
+          else
+            {
+              // Block Acknowledgment context
+              std::size_t i = 0;
+              for (const auto& tid : tids)
+                {
+                  acknowledgment->stationsReceivingMultiStaBa.emplace (std::make_pair (sender, tid), index + i++);
+                  acknowledgment->baType.m_bitmapLen.push_back (GetBlockAckType (sender, tid).m_bitmapLen.at (0));
+                }
+            }
+          uint16_t staId = txVector.GetHeMuUserInfoMap ().begin ()->first;
+          m_muSnrTag.Set (staId, rxSignalInfo.snr);
+        }
+
+      // Schedule the transmission of a Multi-STA BlockAck frame if needed
+      if (!acknowledgment->stationsReceivingMultiStaBa.empty () && !m_multiStaBaEvent.IsRunning ())
+        {
+          m_multiStaBaEvent = Simulator::Schedule (m_phy->GetSifs (),
+                                                   &HeFrameExchangeManager::SendMultiStaBlockAck,
+                                                   this, std::cref (m_txParams));
+        }
+
+      // remove the sender from the set of stations that are expected to send a TB PPDU
+      m_staExpectTbPpduFrom.erase (sender);
+
+      if (m_staExpectTbPpduFrom.empty ())
+        {
+          // we do not expect any other BlockAck frame
+          m_txTimer.Cancel ();
+          m_channelAccessManager->NotifyAckTimeoutResetNow ();
+
+          if (!m_multiStaBaEvent.IsRunning ())
+            {
+              // all of the stations that replied with a TB PPDU sent QoS Null frames.
+              NS_LOG_DEBUG ("Continue the TXOP");
+              m_psduMap.clear ();
+              m_edca->ResetCw ();
+              TransmissionSucceeded ();
+            }
+        }
+
+      // the received TB PPDU has been processed
+      return;
+    }
+
+  if (txVector.IsUlMu () && m_txTimer.IsRunning ()
+      && m_txTimer.GetReason () == WifiTxTimer::WAIT_QOS_NULL_AFTER_BSRP_TF)
+    {
+      Mac48Address sender = psdu->GetAddr2 ();
+
+      if (m_staExpectTbPpduFrom.find (sender) == m_staExpectTbPpduFrom.end ())
+        {
+          NS_LOG_WARN ("Received a TB PPDU from an unexpected station: " << sender);
+          return;
+        }
+      if (std::none_of (psdu->begin (), psdu->end (), [](Ptr<WifiMacQueueItem> mpdu)
+                                                      { return mpdu->GetHeader ().IsQosData ()
+                                                               && !mpdu->GetHeader ().HasData ();
+                                                      }))
+        {
+          NS_LOG_WARN ("No QoS Null frame in the received PSDU");
+          return;
+        }
+
+      NS_LOG_DEBUG ("Received QoS Null frames in a TB PPDU from " << sender);
+
+      // remove the sender from the set of stations that are expected to send a TB PPDU
+      m_staExpectTbPpduFrom.erase (sender);
+
+      if (m_staExpectTbPpduFrom.empty ())
+        {
+          // we do not expect any other response
+          m_txTimer.Cancel ();
+          m_channelAccessManager->NotifyAckTimeoutResetNow ();
+
+          NS_ASSERT (m_edca != 0);
+          m_psduMap.clear ();
+          m_edca->ResetCw ();
+          TransmissionSucceeded ();
+        }
+
+      // the received TB PPDU has been processed
+      return;
+    }
+
+  if (m_triggerFrameInAmpdu)
+    {
+      // the received A-MPDU contains a Trigger Frame. It is now time to handle it.
+      auto psduIt = psdu->begin ();
+      while (psduIt != psdu->end ())
+        {
+          if ((*psduIt)->GetHeader ().IsTrigger ())
+            {
+              ReceiveMpdu (*psduIt, rxSignalInfo, txVector, false);
+            }
+          psduIt++;
+        }
+
+      m_triggerFrameInAmpdu = false;
+      return;
+    }
+
+  // the received frame cannot be handled here
+  VhtFrameExchangeManager::EndReceiveAmpdu (psdu, rxSignalInfo, txVector, perMpduStatus);
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-frame-exchange-manager.h ns-3.34/src/wifi/model/he/he-frame-exchange-manager.h
--- ns-3.33/src/wifi/model/he/he-frame-exchange-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-frame-exchange-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,230 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef HE_FRAME_EXCHANGE_MANAGER_H
+#define HE_FRAME_EXCHANGE_MANAGER_H
+
+#include "ns3/vht-frame-exchange-manager.h"
+#include "mu-snr-tag.h"
+#include <map>
+#include <unordered_map>
+
+namespace ns3 {
+
+class MultiUserScheduler;
+class ApWifiMac;
+class StaWifiMac;
+class CtrlTriggerHeader;
+
+/**
+ * Map of PSDUs indexed by STA-ID
+ */
+typedef std::unordered_map <uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */> WifiPsduMap;
+/**
+ * Map of const PSDUs indexed by STA-ID
+ */
+typedef std::unordered_map <uint16_t /* staId */, Ptr<const WifiPsdu> /* PSDU */> WifiConstPsduMap;
+
+/**
+ * \ingroup wifi
+ *
+ * HeFrameExchangeManager handles the frame exchange sequences
+ * for HE stations.
+ */
+class HeFrameExchangeManager : public VhtFrameExchangeManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  HeFrameExchangeManager ();
+  virtual ~HeFrameExchangeManager ();
+
+  uint16_t GetSupportedBaBufferSize (void) const override;
+  bool StartFrameExchange (Ptr<QosTxop> edca, Time availableTime, bool initialFrame) override;
+  void SetWifiMac (const Ptr<RegularWifiMac> mac) override;
+  void CalculateAcknowledgmentTime (WifiAcknowledgment* acknowledgment) const override;
+
+  /**
+   * Set the Multi-user Scheduler associated with this Frame Exchange Manager.
+   *
+   * \param muScheduler the Multi-user Scheduler associated with this Frame Exchange Manager
+   */
+  void SetMultiUserScheduler (const Ptr<MultiUserScheduler> muScheduler);
+
+  /**
+   * Get the PSDU in the given PSDU map that is addressed to the given MAC address,
+   * if any, or a null pointer, otherwise.
+   *
+   * \param to the MAC address
+   * \param psduMap the PSDU map
+   * \return the PSDU, if any, or a null pointer, otherwise
+   */
+  static Ptr<WifiPsdu> GetPsduTo (Mac48Address to, const WifiPsduMap& psduMap);
+
+  /**
+   * Set the UL Target RSSI subfield of every User Info fields of the given
+   * Trigger Frame to the most recent RSSI observed from the corresponding
+   * station.
+   *
+   * \param trigger the given Trigger Frame
+   */
+  virtual void SetTargetRssi (CtrlTriggerHeader& trigger) const;
+
+protected:
+  void DoDispose () override;
+
+  void ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu, RxSignalInfo rxSignalInfo,
+                    const WifiTxVector& txVector, bool inAmpdu) override;
+  void EndReceiveAmpdu (Ptr<const WifiPsdu> psdu, const RxSignalInfo& rxSignalInfo,
+                        const WifiTxVector& txVector, const std::vector<bool>& perMpduStatus) override;
+  Time GetTxDuration (uint32_t ppduPayloadSize, Mac48Address receiver,
+                      const WifiTxParameters& txParams) const override;
+  bool SendMpduFromBaManager (Ptr<QosTxop> edca, Time availableTime, bool initialFrame) override;
+
+  /**
+   * Send a map of PSDUs as a DL MU PPDU.
+   * Note that both <i>psduMap</i> and <i>txParams</i> are moved to m_psduMap and
+   * m_txParams, respectively, and hence are left in an undefined state.
+   *
+   * \param psduMap the map of PSDUs to send
+   * \param txParams the TX parameters to use to transmit the PSDUs
+   */
+  void SendPsduMapWithProtection (WifiPsduMap psduMap, WifiTxParameters& txParams);
+
+  /**
+   * Forward a map of PSDUs down to the PHY layer.
+   *
+   * \param psduMap the map of PSDUs to transmit
+   * \param txVector the TXVECTOR used to transmit the MU PPDU
+   */
+  void ForwardPsduMapDown (WifiConstPsduMap psduMap, WifiTxVector& txVector);
+
+  /**
+   * Take the necessary actions after that some BlockAck frames are missing
+   * in response to a DL MU PPDU. This method must not be called if all the
+   * expected BlockAck frames were received.
+   *
+   * \param psduMap a pointer to PSDU map transmitted in a DL MU PPDU
+   * \param staMissedBlockAckFrom set of stations we missed a BlockAck frame from
+   * \param nSolicitedStations the number of stations solicited to send a TB PPDU
+   */
+  virtual void BlockAcksInTbPpduTimeout (WifiPsduMap* psduMap,
+                                         const std::set<Mac48Address>* staMissedBlockAckFrom,
+                                         std::size_t nSolicitedStations);
+
+  /**
+   * Take the necessary actions after that some TB PPDUs are missing in
+   * response to Trigger Frame. This method must not be called if all the
+   * expected TB PPDUs were received.
+   *
+   * \param psduMap a pointer to PSDU map transmitted in a DL MU PPDU
+   * \param staMissedTbPpduFrom set of stations we missed a TB PPDU from
+   * \param nSolicitedStations the number of stations solicited to send a TB PPDU
+   */
+  virtual void TbPpduTimeout (WifiPsduMap* psduMap,
+                              const std::set<Mac48Address>* staMissedTbPpduFrom,
+                              std::size_t nSolicitedStations);
+
+  /**
+   * Take the necessary actions after that a Block Ack is missing after a
+   * TB PPDU solicited through a Trigger Frame.
+   *
+   * \param psdu the PSDU in the TB PPDU
+   * \param txVector the TXVECTOR used to transmit the TB PPDU
+   */
+  virtual void BlockAckAfterTbPpduTimeout (Ptr<WifiPsdu> psdu, const WifiTxVector& txVector);
+
+  /**
+   * Return a TXVECTOR for the UL frame that the station will send in response to
+   * the given Trigger frame, configured with the BSS color and transmit power
+   * level to use for the consequent HE TB PPDU.
+   * Note that this method should only be called by non-AP stations only.
+   *
+   * \param trigger the received Trigger frame
+   * \param triggerSender the MAC address of the AP sending the Trigger frame
+   * \return TXVECTOR for the HE TB PPDU frame
+   */
+  WifiTxVector GetHeTbTxVector (CtrlTriggerHeader trigger, Mac48Address triggerSender) const;
+
+  /**
+   * Build a MU-BAR Trigger Frame starting from the TXVECTOR used to respond to
+   * the MU-BAR (in case of multiple responders, their TXVECTORs need to be
+   * "merged" into a single TXVECTOR) and from the BlockAckReq headers for
+   * every recipient.
+   * Note that the number of recipients must match the number of users addressed
+   * by the given TXVECTOR.
+   *
+   * \param responseTxVector the given TXVECTOR
+   * \param recipients the list of BlockAckReq headers indexed by the station's AID
+   * \return the MPDU containing the built MU-BAR
+   */
+  Ptr<WifiMacQueueItem> PrepareMuBar (const WifiTxVector& responseTxVector,
+                                      std::map<uint16_t, CtrlBAckRequestHeader> recipients) const;
+
+  /**
+   * Send a Multi-STA Block Ack frame after the reception of some TB PPDUs.
+   *
+   * \param txParams the TX parameters for the Trigger Frame that solicited the TB PPDUs
+   */
+  void SendMultiStaBlockAck (const WifiTxParameters& txParams);
+
+  /**
+   * Send QoS Null frames in response to a Basic or BSRP Trigger Frame. The number
+   * of QoS Null frames that are actually aggregated depends on the available time
+   * as indicated by the Trigger Frame and is at most 8 (one QoS Null frame per TID).
+   *
+   * \param trigger the Basic or BSRP Trigger Frame content
+   * \param hdr the MAC header of the Basic or BSRP Trigger Frame
+   */
+  void SendQosNullFramesInTbPpdu (const CtrlTriggerHeader& trigger, const WifiMacHeader& hdr);
+
+  Ptr<ApWifiMac> m_apMac;                             //!< MAC pointer (null if not an AP)
+  Ptr<StaWifiMac> m_staMac;                           //!< MAC pointer (null if not a STA)
+
+private:
+  /**
+   * Send the current PSDU map as a DL MU PPDU.
+   */
+  void SendPsduMap (void);
+
+  /**
+   * Take the necessary actions when receiveing a Basic Trigger Frame.
+   *
+   * \param trigger the Basic Trigger Frame content
+   * \param hdr the MAC header of the Basic Trigger Frame
+   */
+  void ReceiveBasicTrigger (const CtrlTriggerHeader& trigger, const WifiMacHeader& hdr);
+
+  WifiPsduMap m_psduMap;                              //!< the A-MPDU being transmitted
+  WifiTxParameters m_txParams;                        //!< the TX parameters for the current PPDU
+  Ptr<MultiUserScheduler> m_muScheduler;              //!< Multi-user Scheduler (HE APs only)
+  Ptr<WifiMacQueueItem> m_triggerFrame;               //!< Trigger Frame being sent
+  std::set<Mac48Address> m_staExpectTbPpduFrom;       //!< set of stations expected to send a TB PPDU
+  EventId m_multiStaBaEvent;                          //!< Sending a Multi-STA BlockAck event
+  MuSnrTag m_muSnrTag;                                //!< Tag to attach to Multi-STA BlockAck frames
+  bool m_triggerFrameInAmpdu;                         //!< True if the received A-MPDU contains an MU-BAR
+};
+
+} //namespace ns3
+
+#endif /* HE_FRAME_EXCHANGE_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-operation.cc ns-3.34/src/wifi/model/he/he-operation.cc
--- ns-3.33/src/wifi/model/he/he-operation.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-operation.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,187 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2017 Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "he-operation.h"
+
+namespace ns3 {
+
+HeOperation::HeOperation ()
+  : m_bssColor (0),
+    m_defaultPEDuration (0),
+    m_twtRequired (0),
+    m_heDurationBasedRtsThreshold (0),
+    m_partialBssColor (0),
+    m_maxBssidIndicator (0),
+    m_txBssidIndicator (0),
+    m_bssColorDisabled (0),
+    m_dualBeacon (0),
+    m_basicHeMcsAndNssSet (0),
+    m_heSupported (0)
+{
+}
+
+WifiInformationElementId
+HeOperation::ElementId () const
+{
+  return IE_EXTENSION;
+}
+
+WifiInformationElementId
+HeOperation::ElementIdExt () const
+{
+  return IE_EXT_HE_OPERATION;
+}
+
+void
+HeOperation::SetHeSupported (uint8_t heSupported)
+{
+  m_heSupported = heSupported;
+}
+
+uint8_t
+HeOperation::GetInformationFieldSize () const
+{
+  //we should not be here if he is not supported
+  NS_ASSERT (m_heSupported > 0);
+  return 7;
+}
+
+void
+HeOperation::SetHeOperationParameters (uint32_t ctrl)
+{
+  m_bssColor = ctrl & 0x3f;
+  m_defaultPEDuration = (ctrl >> 6) & 0x07;
+  m_twtRequired = (ctrl >> 9) & 0x01;
+  m_heDurationBasedRtsThreshold = (ctrl >> 10) & 0x03ff;
+  m_partialBssColor = (ctrl >> 20) & 0x01;
+  m_maxBssidIndicator = (ctrl >> 21) & 0xff;
+  m_txBssidIndicator = (ctrl >> 29) & 0x01;
+  m_bssColorDisabled = (ctrl >> 30) & 0x01;
+  m_dualBeacon = (ctrl >> 31) & 0x01;
+}
+
+uint32_t
+HeOperation::GetHeOperationParameters () const
+{
+  uint32_t val = 0;
+  val |= m_bssColor & 0x3f;
+  val |= (m_defaultPEDuration & 0x07) << 6;
+  val |= (m_twtRequired & 0x01) << 9;
+  val |= (m_heDurationBasedRtsThreshold & 0x03ff) << 10;
+  val |= (m_partialBssColor & 0x01) << 20;
+  val |= (m_maxBssidIndicator & 0xff) << 21;
+  val |= (m_txBssidIndicator & 0x01) << 29;
+  val |= (m_bssColorDisabled & 0x01) << 30;
+  val |= (m_dualBeacon & 0x01) << 31;
+  return val;
+}
+
+void
+HeOperation::SetMaxHeMcsPerNss (uint8_t nss, uint8_t maxHeMcs)
+{
+  NS_ASSERT ((maxHeMcs >= 7 && maxHeMcs <= 11) && (nss >= 1 && nss <= 8));
+  uint8_t val = 3; //3 means not supported
+  if (maxHeMcs > 9) //MCS 0 - 11
+    {
+      val = 2;
+    }
+  else if (maxHeMcs > 7) //MCS 0 - 9
+    {
+      val = 1;
+    }
+  else if (maxHeMcs == 7) //MCS 0 - 7
+    {
+      val = 0;
+    }
+  m_basicHeMcsAndNssSet |= ((val & 0x03) << ((nss - 1) * 2));
+}
+
+uint16_t
+HeOperation::GetBasicHeMcsAndNssSet (void) const
+{
+  return m_basicHeMcsAndNssSet;
+}
+
+void
+HeOperation::SetBssColor (uint8_t bssColor)
+{
+  NS_ABORT_UNLESS (bssColor < 64); // 6 bits
+  m_bssColor = bssColor;
+  m_bssColorDisabled = 0;
+}
+
+uint8_t
+HeOperation::GetBssColor (void) const
+{
+  return m_bssColor;
+}
+
+Buffer::Iterator
+HeOperation::Serialize (Buffer::Iterator i) const
+{
+  if (m_heSupported < 1)
+    {
+      return i;
+    }
+  return WifiInformationElement::Serialize (i);
+}
+
+uint16_t
+HeOperation::GetSerializedSize () const
+{
+  if (m_heSupported < 1)
+    {
+      return 0;
+    }
+  return WifiInformationElement::GetSerializedSize ();
+}
+
+void
+HeOperation::SerializeInformationField (Buffer::Iterator start) const
+{
+  if (m_heSupported == 1)
+    {
+      //write the corresponding value for each bit
+      start.WriteHtolsbU32 (GetHeOperationParameters ());
+      start.WriteU16 (GetBasicHeMcsAndNssSet ());
+      //todo: VHT Operation Information (variable)
+    }
+}
+
+uint8_t
+HeOperation::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
+{
+  Buffer::Iterator i = start;
+  uint32_t heOperationParameters = i.ReadLsbtohU32 ();
+  m_basicHeMcsAndNssSet = i.ReadU16 ();
+  SetHeOperationParameters (heOperationParameters);
+  //todo: VHT Operation Information (variable)
+  return length;
+}
+
+std::ostream &
+operator << (std::ostream &os, const HeOperation &HeOperation)
+{
+  os << HeOperation.GetHeOperationParameters () << "|"
+     << HeOperation.GetBasicHeMcsAndNssSet ();
+  return os;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-operation.h ns-3.34/src/wifi/model/he/he-operation.h
--- ns-3.33/src/wifi/model/he/he-operation.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-operation.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,132 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2017 Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef HE_OPERATION_H
+#define HE_OPERATION_H
+
+#include "ns3/wifi-information-element.h"
+
+namespace ns3 {
+
+/**
+ * \brief The HE Operation Information Element
+ * \ingroup wifi
+ *
+ * This class knows how to serialise and deserialise
+ * the HE Operation Information Element
+ */
+class HeOperation : public WifiInformationElement
+{
+public:
+  HeOperation ();
+
+  // Implementations of pure virtual methods of WifiInformationElement
+  WifiInformationElementId ElementId () const override;
+  WifiInformationElementId ElementIdExt () const override;
+  uint8_t GetInformationFieldSize () const override;
+  void SerializeInformationField (Buffer::Iterator start) const override;
+  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length) override;
+  /* This information element is a bit special in that it is only
+     included if the STA is a HE STA. To support this we
+     override the Serialize and GetSerializedSize methods of
+     WifiInformationElement. */
+  Buffer::Iterator Serialize (Buffer::Iterator start) const override;
+  uint16_t GetSerializedSize () const override;
+
+  /**
+   * Set the HE supported information element.
+   *
+   * \param heSupported the HE supported information element
+   */
+  void SetHeSupported (uint8_t heSupported);
+
+  /**
+   * Set the HE Operation Parameters field in the HE Operation information element.
+   *
+   * \param ctrl the HE Operation Parameters field in the HE Operation information element
+   */
+  void SetHeOperationParameters (uint32_t ctrl);
+  /**
+   * Set the Basic HE-MCS and NSS field in the HE Operation information element
+   * by specifying the tuple (<i>nss</i>, <i>maxMcs</i>).
+   *
+   * \param nss the NSS
+   * \param maxHeMcs the maximum supported HE-MCS value corresponding to that NSS
+   */
+  void SetMaxHeMcsPerNss (uint8_t nss, uint8_t maxHeMcs);
+
+  /**
+   * Return the HE Operation Parameters field in the HE Operation information element.
+   *
+   * \return the HE Operation Parameters field in the HE Operation information element
+   */
+  uint32_t GetHeOperationParameters (void) const;
+  /**
+   * Return the Basic HE-MCS And Nss field in the HE Operation information element.
+   *
+   * \return the Basic HE-MCS And Nss field in the HE Operation information element
+   */
+  uint16_t GetBasicHeMcsAndNssSet (void) const;
+  /**
+   * Set the BSS color
+   * \param bssColor the BSS color value
+   */
+  void SetBssColor (uint8_t bssColor);
+  /**
+   * Get the BSS color
+   * \return the BSS color value
+   */
+  uint8_t GetBssColor (void) const;
+
+
+private:
+  //HE Operation Parameters fields
+  uint8_t m_bssColor;                     //!< BSS color
+  uint8_t m_defaultPEDuration;            //!< default PE duration
+  uint8_t m_twtRequired;                  //!< TWT required
+  uint16_t m_heDurationBasedRtsThreshold; //!< HE duration based RTS threshold
+  uint8_t m_partialBssColor;              //!< partial BSS color
+  uint8_t m_maxBssidIndicator;            //!< max BSSID indicator
+  uint8_t m_txBssidIndicator;             //!< TX BSSID indicator
+  uint8_t m_bssColorDisabled;             //!< BSS color disabled
+  uint8_t m_dualBeacon;                   //!< Dual Beacon
+
+  //Basic HE-MCS and NSS Set
+  uint16_t m_basicHeMcsAndNssSet; ///< basic HE MCS NSS set
+
+  //TODO: VHT Operation Information subfields not defined in the standard yet.
+
+  /// This is used to decide whether this element should be added to the frame or not
+  uint8_t m_heSupported;
+};
+
+/**
+ * output stream output operator
+ *
+ * \param os output stream
+ * \param HeOperation the HE operation
+ *
+ * \returns output stream
+ */
+std::ostream &operator << (std::ostream &os, const HeOperation &HeOperation);
+
+} //namespace ns3
+
+#endif /* HE_OPERATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-phy.cc ns-3.34/src/wifi/model/he/he-phy.cc
--- ns-3.33/src/wifi/model/he/he-phy.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-phy.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,1187 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy and spectrum-wifi-phy)
+ */
+
+#include "he-phy.h"
+#include "he-ppdu.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/wifi-phy.h"
+#include "he-configuration.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/sta-wifi-mac.h"
+#include "ns3/ap-wifi-mac.h"
+#include "ns3/wifi-utils.h"
+#include "ns3/simulator.h"
+#include "ns3/log.h"
+#include "ns3/assert.h"
+#include <algorithm>
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("HePhy");
+
+/*******************************************************
+ *       HE PHY (P802.11ax/D4.0, clause 27)
+ *******************************************************/
+
+/* *NS_CHECK_STYLE_OFF* */
+const PhyEntity::PpduFormats HePhy::m_hePpduFormats { //Ignoring PE (Packet Extension)
+  { WIFI_PREAMBLE_HE_SU,    { WIFI_PPDU_FIELD_PREAMBLE,      //L-STF + L-LTF
+                              WIFI_PPDU_FIELD_NON_HT_HEADER, //L-SIG + RL-SIG
+                              WIFI_PPDU_FIELD_SIG_A,         //HE-SIG-A
+                              WIFI_PPDU_FIELD_TRAINING,      //HE-STF + HE-LTFs
+                              WIFI_PPDU_FIELD_DATA } },
+  { WIFI_PREAMBLE_HE_MU,    { WIFI_PPDU_FIELD_PREAMBLE,      //L-STF + L-LTF
+                              WIFI_PPDU_FIELD_NON_HT_HEADER, //L-SIG + RL-SIG
+                              WIFI_PPDU_FIELD_SIG_A,         //HE-SIG-A
+                              WIFI_PPDU_FIELD_SIG_B,         //HE-SIG-B
+                              WIFI_PPDU_FIELD_TRAINING,      //HE-STF + HE-LTFs
+                              WIFI_PPDU_FIELD_DATA } },
+  { WIFI_PREAMBLE_HE_TB,    { WIFI_PPDU_FIELD_PREAMBLE,      //L-STF + L-LTF
+                              WIFI_PPDU_FIELD_NON_HT_HEADER, //L-SIG + RL-SIG
+                              WIFI_PPDU_FIELD_SIG_A,         //HE-SIG-A
+                              WIFI_PPDU_FIELD_TRAINING,      //HE-STF + HE-LTFs
+                              WIFI_PPDU_FIELD_DATA } },
+  { WIFI_PREAMBLE_HE_ER_SU, { WIFI_PPDU_FIELD_PREAMBLE,      //L-STF + L-LTF
+                              WIFI_PPDU_FIELD_NON_HT_HEADER, //L-SIG + RL-SIG
+                              WIFI_PPDU_FIELD_SIG_A,         //HE-SIG-A
+                              WIFI_PPDU_FIELD_TRAINING,      //HE-STF + HE-LTFs
+                              WIFI_PPDU_FIELD_DATA } }
+};
+/* *NS_CHECK_STYLE_ON* */
+
+HePhy::HePhy (bool buildModeList /* = true */)
+  : VhtPhy (false) //don't add VHT modes to list
+{
+  NS_LOG_FUNCTION (this << buildModeList);
+  m_bssMembershipSelector = HE_PHY;
+  m_maxMcsIndexPerSs = 11;
+  m_maxSupportedMcsIndexPerSs = m_maxMcsIndexPerSs;
+  m_currentHeTbPpduUid = UINT64_MAX;
+  m_previouslyTxPpduUid = UINT64_MAX;
+  if (buildModeList)
+    {
+      BuildModeList ();
+    }
+}
+
+HePhy::~HePhy ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+HePhy::BuildModeList (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_modeList.empty ());
+  NS_ASSERT (m_bssMembershipSelector == HE_PHY);
+  for (uint8_t index = 0; index <= m_maxSupportedMcsIndexPerSs; ++index)
+    {
+      NS_LOG_LOGIC ("Add HeMcs" << +index << " to list");
+      m_modeList.emplace_back (CreateHeMcs (index));
+    }
+}
+
+WifiMode
+HePhy::GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const
+{
+  switch (field)
+    {
+      case WIFI_PPDU_FIELD_TRAINING: //consider SIG-A (SIG-B) mode for training for the time being for SU/ER-SU/TB (MU) (useful for InterferenceHelper)
+        if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU)
+          {
+            //Training comes after SIG-B
+            return GetSigBMode (txVector);
+          }
+        else
+          {
+            //Training comes after SIG-A
+            return GetSigAMode ();
+          }
+      default:
+        return VhtPhy::GetSigMode (field, txVector);
+    }
+}
+
+WifiMode
+HePhy::GetSigAMode (void) const
+{
+  return GetVhtMcs0 (); //same number of data tones as VHT for 20 MHz (i.e. 52)
+}
+
+WifiMode
+HePhy::GetSigBMode (const WifiTxVector& txVector) const
+{
+  NS_ABORT_MSG_IF (txVector.GetPreambleType () != WIFI_PREAMBLE_HE_MU, "HE-SIG-B only available for HE MU");
+  /**
+   * Get smallest HE MCS index among station's allocations and use the
+   * VHT version of the index. This enables to have 800 ns GI, 52 data
+   * tones, and 312.5 kHz spacing while ensuring that MCS will be decoded
+   * by all stations.
+   */
+  uint8_t smallestMcs = 5; //maximum MCS for HE-SIG-B
+  for (auto & info : txVector.GetHeMuUserInfoMap ())
+    {
+      smallestMcs = std::min (smallestMcs, info.second.mcs.GetMcsValue ());
+    }
+  switch (smallestMcs) //GetVhtMcs (mcs) is not static
+    {
+      case 0:
+        return GetVhtMcs0 ();
+      case 1:
+        return GetVhtMcs1 ();
+      case 2:
+        return GetVhtMcs2 ();
+      case 3:
+        return GetVhtMcs3 ();
+      case 4:
+        return GetVhtMcs4 ();
+      case 5:
+      default:
+        return GetVhtMcs5 ();
+    }
+}
+
+const PhyEntity::PpduFormats &
+HePhy::GetPpduFormats (void) const
+{
+  return m_hePpduFormats;
+}
+
+Time
+HePhy::GetLSigDuration (WifiPreamble /* preamble */) const
+{
+  return MicroSeconds (8); //L-SIG + RL-SIG
+}
+
+Time
+HePhy::GetTrainingDuration (const WifiTxVector& txVector,
+                            uint8_t nDataLtf, uint8_t nExtensionLtf /* = 0 */) const
+{
+  Time ltfDuration = MicroSeconds (8); //TODO extract from TxVector when available
+  Time stfDuration = (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB) ? MicroSeconds (8) : MicroSeconds (4);
+  NS_ABORT_MSG_IF (nDataLtf > 8, "Unsupported number of LTFs " << +nDataLtf << " for HE");
+  NS_ABORT_MSG_IF (nExtensionLtf > 0, "No extension LTFs expected for HE");
+  return stfDuration + ltfDuration * nDataLtf; //HE-STF + HE-LTFs
+}
+
+Time
+HePhy::GetSigADuration (WifiPreamble preamble) const
+{
+  return (preamble == WIFI_PREAMBLE_HE_ER_SU) ? MicroSeconds (16) : MicroSeconds (8); //HE-SIG-A (first and second symbol)
+}
+
+Time
+HePhy::GetSigBDuration (const WifiTxVector& txVector) const
+{
+  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU) //See section 27.3.10.8 of IEEE 802.11ax draft 4.0.
+    {
+      /*
+       * Compute the number of bits used by common field.
+       * Assume that compression bit in HE-SIG-A is not set (i.e. not
+       * full band MU-MIMO); the field is present.
+       */
+      uint16_t bw = txVector.GetChannelWidth ();
+      std::size_t commonFieldSize = 4 /* CRC */ + 6 /* tail */;
+      if (bw <= 40)
+        {
+          commonFieldSize += 8; //only one allocation subfield
+        }
+      else
+        {
+          commonFieldSize += 8 * (bw / 40) /* one allocation field per 40 MHz */ + 1 /* center RU */;
+        }
+
+      /*
+       * Compute the number of bits used by user-specific field.
+       * MU-MIMO is not supported; only one station per RU.
+       * The user-specific field is composed of N user block fields
+       * spread over each corresponding HE-SIG-B content channel.
+       * Each user block field contains either two or one users' data
+       * (the latter being for odd number of stations per content channel).
+       * Padding will be handled further down in the code.
+       */
+      std::pair<std::size_t, std::size_t> numStaPerContentChannel = txVector.GetNumRusPerHeSigBContentChannel ();
+      std::size_t maxNumStaPerContentChannel = std::max (numStaPerContentChannel.first, numStaPerContentChannel.second);
+      std::size_t maxNumUserBlockFields = maxNumStaPerContentChannel / 2; //handle last user block with single user, if any, further down
+      std::size_t userSpecificFieldSize = maxNumUserBlockFields * (2 * 21 /* user fields (2 users) */ + 4 /* tail */ + 6 /* CRC */);
+      if (maxNumStaPerContentChannel % 2 != 0)
+        {
+          userSpecificFieldSize += 21 /* last user field */ + 4 /* CRC */ + 6 /* tail */;
+        }
+
+      /*
+       * Compute duration of HE-SIG-B considering that padding
+       * is added up to the next OFDM symbol.
+       * Nss = 1 and GI = 800 ns for HE-SIG-B.
+       */
+      Time symbolDuration = MicroSeconds (4);
+      double numDataBitsPerSymbol = GetSigBMode (txVector).GetDataRate (20, 800, 1) * symbolDuration.GetNanoSeconds () / 1e9;
+      double numSymbols = ceil ((commonFieldSize + userSpecificFieldSize) / numDataBitsPerSymbol);
+
+      return FemtoSeconds (static_cast<uint64_t> (numSymbols * symbolDuration.GetFemtoSeconds ()));
+    }
+  else
+    {
+      // no SIG-B
+      return MicroSeconds (0);
+    }
+}
+
+uint16_t
+HePhy::ConvertHeTbPpduDurationToLSigLength (Time ppduDuration, WifiPhyBand band)
+{
+  uint8_t sigExtension = 0;
+  if (band == WIFI_PHY_BAND_2_4GHZ)
+    {
+      sigExtension = 6;
+    }
+  uint8_t m = 2; //HE TB PPDU so m is set to 2
+  uint16_t length = ((ceil ((static_cast<double> (ppduDuration.GetNanoSeconds () - (20 * 1000) - (sigExtension * 1000)) / 1000) / 4.0) * 3) - 3 - m);
+  return length;
+}
+
+Time
+HePhy::ConvertLSigLengthToHeTbPpduDuration (uint16_t length, const WifiTxVector& txVector, WifiPhyBand band)
+{
+  NS_ABORT_IF (txVector.GetPreambleType () != WIFI_PREAMBLE_HE_TB);
+  Time tSymbol = NanoSeconds (12800 + txVector.GetGuardInterval ());
+  Time preambleDuration = WifiPhy::GetStaticPhyEntity (WIFI_MOD_CLASS_HE)->CalculatePhyPreambleAndHeaderDuration (txVector); //this is quite convoluted but only way of keeping the method static
+  uint8_t sigExtension = 0;
+  if (band == WIFI_PHY_BAND_2_4GHZ)
+    {
+      sigExtension = 6;
+    }
+  uint8_t m = 2; //HE TB PPDU so m is set to 2
+  //Equation 27-11 of IEEE P802.11ax/D4.0
+  Time calculatedDuration = MicroSeconds (((ceil (static_cast<double> (length + 3 + m) / 3)) * 4) + 20 + sigExtension);
+  uint32_t nSymbols = floor (static_cast<double> ((calculatedDuration - preambleDuration).GetNanoSeconds () - (sigExtension * 1000)) / tSymbol.GetNanoSeconds ());
+  Time ppduDuration = preambleDuration + (nSymbols * tSymbol) + MicroSeconds (sigExtension);
+  return ppduDuration;
+}
+
+Time
+HePhy::CalculateNonOfdmaDurationForHeTb (const WifiTxVector& txVector) const
+{
+  NS_ABORT_IF (txVector.GetPreambleType () != WIFI_PREAMBLE_HE_TB);
+  Time duration = GetDuration (WIFI_PPDU_FIELD_PREAMBLE, txVector)
+    + GetDuration (WIFI_PPDU_FIELD_NON_HT_HEADER, txVector)
+    + GetDuration (WIFI_PPDU_FIELD_SIG_A, txVector);
+  return duration;
+}
+
+uint8_t
+HePhy::GetNumberBccEncoders (const WifiTxVector& /* txVector */) const
+{
+  return 1; //only 1 BCC encoder for HE since higher rates are obtained using LDPC
+}
+
+Time
+HePhy::GetSymbolDuration (const WifiTxVector& txVector) const
+{
+  uint16_t gi = txVector.GetGuardInterval ();
+  NS_ASSERT (gi == 800 || gi == 1600 || gi == 3200);
+  return NanoSeconds (12800 + gi);
+}
+
+Ptr<WifiPpdu>
+HePhy::BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration)
+{
+  NS_LOG_FUNCTION (this << psdus << txVector << ppduDuration);
+  HePpdu::TxPsdFlag flag = (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB) ?
+    HePpdu::PSD_HE_TB_NON_OFDMA_PORTION :
+    HePpdu::PSD_NON_HE_TB;
+  return Create<HePpdu> (psdus, txVector, ppduDuration, m_wifiPhy->GetPhyBand (),
+                         ObtainNextUid (txVector), flag);
+}
+
+void
+HePhy::StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW,
+                             Time rxDuration)
+{
+  NS_LOG_FUNCTION (this << ppdu << rxDuration);
+  const WifiTxVector& txVector = ppdu->GetTxVector ();
+  auto hePpdu = DynamicCast<HePpdu> (ppdu);
+  NS_ASSERT (hePpdu);
+  HePpdu::TxPsdFlag psdFlag = hePpdu->GetTxPsdFlag ();
+  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+      && psdFlag == HePpdu::PSD_HE_TB_OFDMA_PORTION)
+    {
+      if (m_currentHeTbPpduUid == ppdu->GetUid ()
+          && GetCurrentEvent () != 0)
+        {
+          //AP or STA has already received non-OFDMA part, switch to OFDMA part, and schedule reception of payload (will be canceled for STAs by StartPayload)
+          bool ofdmaStarted = !m_beginOfdmaPayloadRxEvents.empty ();
+          NS_LOG_INFO ("Switch to OFDMA part (already started? " << (ofdmaStarted ? "Y" : "N") << ") " <<
+                       "and schedule OFDMA payload reception in " << GetDuration (WIFI_PPDU_FIELD_TRAINING, txVector).As (Time::NS));
+          Ptr<Event> event = CreateInterferenceEvent (ppdu, txVector, rxDuration, rxPowersW, !ofdmaStarted);
+          uint16_t staId = GetStaId (ppdu);
+          NS_ASSERT (m_beginOfdmaPayloadRxEvents.find (staId) == m_beginOfdmaPayloadRxEvents.end ());
+          m_beginOfdmaPayloadRxEvents[staId] = Simulator::Schedule (GetDuration (WIFI_PPDU_FIELD_TRAINING, txVector),
+                                                                    &HePhy::StartReceiveOfdmaPayload, this, event);
+        }
+      else
+        {
+          //PHY receives the OFDMA payload while having dropped the preamble
+          NS_LOG_INFO ("Consider OFDMA part of the HE TB PPDU as interference since device dropped the preamble");
+          CreateInterferenceEvent (ppdu, txVector, rxDuration, rxPowersW);
+          //the OFDMA part of the HE TB PPDUs will be noise _after_ the completion of the current event
+          ErasePreambleEvent (ppdu, rxDuration);
+        }
+    }
+  else
+    {
+      PhyEntity::StartReceivePreamble (ppdu, rxPowersW, rxDuration);
+    }
+}
+
+void
+HePhy::CancelAllEvents (void)
+{
+  NS_LOG_FUNCTION (this);
+  for (auto & beginOfdmaPayloadRxEvent : m_beginOfdmaPayloadRxEvents)
+    {
+      beginOfdmaPayloadRxEvent.second.Cancel ();
+    }
+  m_beginOfdmaPayloadRxEvents.clear ();
+  PhyEntity::CancelAllEvents ();
+}
+
+void
+HePhy::DoAbortCurrentReception (WifiPhyRxfailureReason reason)
+{
+  NS_LOG_FUNCTION (this << reason);
+  if (reason != OBSS_PD_CCA_RESET)
+    {
+      for (auto & endMpduEvent : m_endOfMpduEvents)
+        {
+          endMpduEvent.Cancel ();
+        }
+      m_endOfMpduEvents.clear ();
+    }
+  else
+    {
+      PhyEntity::DoAbortCurrentReception (reason);
+    }
+}
+
+void
+HePhy::DoResetReceive (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  if (event->GetPpdu ()->GetType () != WIFI_PPDU_TYPE_UL_MU)
+    {
+      NS_ASSERT (event->GetEndTime () == Simulator::Now ());
+    }
+  for (auto & beginOfdmaPayloadRxEvent : m_beginOfdmaPayloadRxEvents)
+    {
+      beginOfdmaPayloadRxEvent.second.Cancel ();
+    }
+  m_beginOfdmaPayloadRxEvents.clear ();
+}
+
+Ptr<Event>
+HePhy::DoGetEvent (Ptr<const WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW)
+{
+  Ptr<Event> event;
+  //We store all incoming preamble events, and a decision is made at the end of the preamble detection window.
+  //If a preamble is received after the preamble detection window, it is stored anyway because this is needed for HE TB PPDUs in
+  //order to properly update the received power in InterferenceHelper. The map is cleaned anyway at the end of the current reception.
+  if (ppdu->GetType () == WIFI_PPDU_TYPE_UL_MU)
+    {
+      auto uidPreamblePair = std::make_pair (ppdu->GetUid (), ppdu->GetPreamble ());
+      const WifiTxVector& txVector = ppdu->GetTxVector ();
+      Time rxDuration = CalculateNonOfdmaDurationForHeTb (txVector); //the OFDMA part of the transmission will be added later on
+      const auto & currentPreambleEvents = GetCurrentPreambleEvents ();
+      auto it = currentPreambleEvents.find (uidPreamblePair);
+      if (it != currentPreambleEvents.end ())
+        {
+          NS_LOG_DEBUG ("Received another HE TB PPDU for UID " << ppdu->GetUid () << " from STA-ID " << ppdu->GetStaId () << " and BSS color " << +txVector.GetBssColor ());
+          event = it->second;
+          if (Simulator::Now () - event->GetStartTime () > NanoSeconds (400))
+            {
+              //Section 27.3.14.3 from 802.11ax Draft 4.0: Pre-correction accuracy requirements.
+              //A STA that transmits an HE TB PPDU, non-HT PPDU, or non-HT duplicate PPDU in response to a triggering PPDU
+              //shall ensure that the transmission start time of the HE TB PPDU, non-HT PPDU, or non-HT duplicate PPDU is
+              //within ±0.4 µs + 16 µs from the end, at the STA’s antenna connector, of the last OFDM symbol of the triggering
+              //PPDU (if it contains no PE field) or of the PE field of the triggering PPDU (if the PE field is present).
+              //As a result, if an HE TB PPDU arrives later than 0.4 µs, it is added as an interference but PPDU is dropped.
+              event = CreateInterferenceEvent (ppdu, txVector, rxDuration, rxPowersW);
+              NS_LOG_DEBUG ("Drop packet because not received within the 400ns window");
+              m_wifiPhy->NotifyRxDrop (GetAddressedPsduInPpdu (ppdu), HE_TB_PPDU_TOO_LATE);
+            }
+          else
+            {
+              //Update received power of the event associated to that UL MU transmission
+              UpdateInterferenceEvent (event, rxPowersW);
+            }
+          if ((GetCurrentEvent () != 0) && (GetCurrentEvent ()->GetPpdu ()->GetUid () != ppdu->GetUid ()))
+            {
+              NS_LOG_DEBUG ("Drop packet because already receiving another HE TB PPDU");
+              m_wifiPhy->NotifyRxDrop (GetAddressedPsduInPpdu (ppdu), RXING);
+            }
+          return nullptr;
+        }
+      else
+        {
+          NS_LOG_DEBUG ("Received a new HE TB PPDU for UID " << ppdu->GetUid () << " from STA-ID " << ppdu->GetStaId () << " and BSS color " << +txVector.GetBssColor ());
+          event = CreateInterferenceEvent (ppdu, txVector, rxDuration, rxPowersW);
+          AddPreambleEvent (event);
+        }
+    }
+  else
+    {
+      event = PhyEntity::DoGetEvent (ppdu, rxPowersW);
+    }
+  return event;
+}
+
+Ptr<const WifiPsdu>
+HePhy::GetAddressedPsduInPpdu (Ptr<const WifiPpdu> ppdu) const
+{
+  if (ppdu->GetType () == WIFI_PPDU_TYPE_DL_MU || ppdu->GetType () == WIFI_PPDU_TYPE_UL_MU)
+    {
+      auto hePpdu = DynamicCast<const HePpdu> (ppdu);
+      NS_ASSERT (hePpdu);
+      return hePpdu->GetPsdu (GetBssColor (), GetStaId (ppdu));
+    }
+  return PhyEntity::GetAddressedPsduInPpdu (ppdu);
+}
+
+uint8_t
+HePhy::GetBssColor (void) const
+{
+  uint8_t bssColor = 0;
+  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
+  if (device)
+    {
+      Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
+      if (heConfiguration)
+        {
+          bssColor = heConfiguration->GetBssColor ();
+        }
+    }
+  return bssColor;
+}
+
+uint16_t
+HePhy::GetStaId (const Ptr<const WifiPpdu> ppdu) const
+{
+  if (ppdu->GetType () == WIFI_PPDU_TYPE_UL_MU)
+    {
+      return ppdu->GetStaId ();
+    }
+  else if (ppdu->GetType () == WIFI_PPDU_TYPE_DL_MU)
+    {
+      Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
+      if (device)
+        {
+          Ptr<StaWifiMac> mac = DynamicCast<StaWifiMac> (device->GetMac ());
+          if (mac && mac->IsAssociated ())
+            {
+              return mac->GetAssociationId ();
+            }
+        }
+    }
+  return PhyEntity::GetStaId (ppdu);
+}
+
+PhyEntity::PhyFieldRxStatus
+HePhy::ProcessSigA (Ptr<Event> event, PhyFieldRxStatus status)
+{
+  NS_LOG_FUNCTION (this << *event << status);
+  //Notify end of SIG-A (in all cases)
+  HeSigAParameters params;
+  params.rssiW = GetRxPowerWForPpdu (event);
+  params.bssColor = event->GetTxVector ().GetBssColor ();
+  NotifyEndOfHeSigA (params); //if OBSS_PD CCA_RESET, set power restriction first and wait till field is processed before switching to IDLE
+
+  if (status.isSuccess)
+    {
+      //Check if PPDU is filtered based on the BSS color
+      uint8_t myBssColor = GetBssColor ();
+      uint8_t rxBssColor = event->GetTxVector ().GetBssColor ();
+      if (myBssColor != 0 && rxBssColor != 0 && myBssColor != rxBssColor)
+        {
+          NS_LOG_DEBUG ("The BSS color of this PPDU (" << +rxBssColor << ") does not match the device's (" << +myBssColor << "). The PPDU is filtered.");
+          return PhyFieldRxStatus (false, FILTERED, DROP);
+        }
+
+      Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
+      if (event->GetTxVector ().GetPreambleType () == WIFI_PREAMBLE_HE_TB)
+        {
+          m_currentHeTbPpduUid = ppdu->GetUid (); //to be able to correctly schedule start of OFDMA payload
+        }
+
+      if (ppdu->GetType () != WIFI_PPDU_TYPE_DL_MU && !GetAddressedPsduInPpdu (ppdu)) //Final decision on STA-ID correspondence of DL MU is delayed to end of SIG-B
+        {
+          NS_ASSERT (ppdu->GetType () == WIFI_PPDU_TYPE_UL_MU);
+          NS_LOG_DEBUG ("No PSDU addressed to that PHY in the received MU PPDU. The PPDU is filtered.");
+          return PhyFieldRxStatus (false, FILTERED, DROP);
+        }
+    }
+  return status;
+}
+
+void
+HePhy::SetEndOfHeSigACallback (EndOfHeSigACallback callback)
+{
+  m_endOfHeSigACallback = callback;
+}
+
+void
+HePhy::NotifyEndOfHeSigA (HeSigAParameters params)
+{
+  if (!m_endOfHeSigACallback.IsNull ())
+    {
+      m_endOfHeSigACallback (params);
+    }
+}
+
+PhyEntity::PhyFieldRxStatus
+HePhy::ProcessSigB (Ptr<Event> event, PhyFieldRxStatus status)
+{
+  NS_LOG_FUNCTION (this << *event << status);
+  if (status.isSuccess)
+    {
+      //Check if PPDU is filtered only if the SIG-B content is supported (not explicitly stated but assumed based on behavior for SIG-A)
+      if (!GetAddressedPsduInPpdu (event->GetPpdu ()))
+        {
+          NS_LOG_DEBUG ("No PSDU addressed to that PHY in the received MU PPDU. The PPDU is filtered.");
+          return PhyFieldRxStatus (false, FILTERED, DROP);
+        }
+    }
+  return status;
+}
+
+bool
+HePhy::IsConfigSupported (Ptr<const WifiPpdu> ppdu) const
+{
+  const WifiTxVector& txVector = ppdu->GetTxVector ();
+  uint16_t staId = GetStaId (ppdu);
+  WifiMode txMode = txVector.GetMode (staId);
+  uint8_t nss = txVector.GetNssMax ();
+  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU)
+    {
+      for (auto info : txVector.GetHeMuUserInfoMap ())
+        {
+          if (info.first == staId)
+            {
+              nss = info.second.nss; //no need to look at other PSDUs
+              break;
+            }
+        }
+    }
+
+  if (nss > m_wifiPhy->GetMaxSupportedRxSpatialStreams ())
+    {
+      NS_LOG_DEBUG ("Packet reception could not be started because not enough RX antennas");
+      return false;
+    }
+  if (!IsModeSupported (txMode))
+    {
+      NS_LOG_DEBUG ("Drop packet because it was sent using an unsupported mode (" << txVector.GetMode () << ")");
+      return false;
+    }
+  return true;
+}
+
+void
+HePhy::DoStartReceivePayload (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  const WifiTxVector& txVector = event->GetTxVector ();
+  Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
+  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB)
+    {
+      Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
+      bool isAp = device != 0 && (DynamicCast<ApWifiMac> (device->GetMac ()) != 0);
+      if (!isAp)
+        {
+          NS_LOG_DEBUG ("Ignore HE TB PPDU payload received by STA but keep state in Rx");
+          m_endRxPayloadEvents.push_back (Simulator::Schedule (ppdu->GetTxDuration () - CalculatePhyPreambleAndHeaderDuration (txVector),
+                                                               &PhyEntity::ResetReceive, this, event));
+          //Cancel all scheduled events for OFDMA payload reception
+          NS_ASSERT (!m_beginOfdmaPayloadRxEvents.empty () && m_beginOfdmaPayloadRxEvents.begin ()->second.IsRunning ());
+          for (auto & beginOfdmaPayloadRxEvent : m_beginOfdmaPayloadRxEvents)
+            {
+              beginOfdmaPayloadRxEvent.second.Cancel ();
+            }
+          m_beginOfdmaPayloadRxEvents.clear ();
+        }
+      else
+        {
+          NS_LOG_DEBUG ("Receiving PSDU in HE TB PPDU");
+          uint16_t staId = GetStaId (ppdu);
+          m_signalNoiseMap.insert ({std::make_pair (ppdu->GetUid (), staId), SignalNoiseDbm ()});
+          m_statusPerMpduMap.insert ({std::make_pair (ppdu->GetUid (), staId), std::vector<bool> ()});
+          if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB)
+            {
+              //for HE TB PPDUs, ScheduleEndOfMpdus and EndReceive are scheduled by StartReceiveOfdmaPayload
+              NS_ASSERT (isAp);
+              NS_ASSERT (!m_beginOfdmaPayloadRxEvents.empty ());
+              for (auto & beginOfdmaPayloadRxEvent : m_beginOfdmaPayloadRxEvents)
+                {
+                  NS_ASSERT (beginOfdmaPayloadRxEvent.second.IsRunning ());
+                }
+            }
+        }
+    }
+  else
+    {
+      PhyEntity::DoStartReceivePayload (event);
+    }
+}
+
+void
+HePhy::DoEndReceivePayload (Ptr<const WifiPpdu> ppdu)
+{
+  NS_LOG_FUNCTION (this << ppdu);
+  if (ppdu->GetType () == WIFI_PPDU_TYPE_UL_MU)
+    {
+      for (auto it = m_endRxPayloadEvents.begin (); it != m_endRxPayloadEvents.end (); )
+        {
+          if (it->IsExpired ())
+            {
+              it = m_endRxPayloadEvents.erase (it);
+            }
+          else
+            {
+              it++;
+            }
+        }
+      if (m_endRxPayloadEvents.empty ())
+        {
+          //We've got the last PPDU of the UL-OFDMA transmission
+          NotifyInterferenceRxEndAndClear (true); //reset WifiPhy
+        }
+    }
+  else
+    {
+      NS_ASSERT (m_wifiPhy->GetLastRxEndTime () == Simulator::Now ());
+      PhyEntity::DoEndReceivePayload (ppdu);
+    }
+}
+
+void
+HePhy::StartReceiveOfdmaPayload (Ptr<Event> event)
+{
+  Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
+  RxPowerWattPerChannelBand rxPowersW = event->GetRxPowerWPerBand ();
+  //The total RX power corresponds to the maximum over all the bands
+  auto it = std::max_element (rxPowersW.begin (), rxPowersW.end (),
+                              [] (const std::pair<WifiSpectrumBand, double> &p1, const std::pair<WifiSpectrumBand, double> &p2) {
+                                return p1.second < p2.second;
+                              });
+  NS_LOG_FUNCTION (this << *event << it->second);
+  NS_ASSERT (GetCurrentEvent () != 0);
+  auto itEvent = m_beginOfdmaPayloadRxEvents.find (GetStaId (ppdu));
+  /**
+   * m_beginOfdmaPayloadRxEvents should still be running only for APs, since canceled in StartReceivePayload for STAs.
+   * This is because SpectrumWifiPhy does not have access to the device type and thus blindly schedules things, letting
+   * the parent WifiPhy class take into account device type.
+   */
+  NS_ASSERT (itEvent != m_beginOfdmaPayloadRxEvents.end () && itEvent->second.IsExpired ());
+  m_beginOfdmaPayloadRxEvents.erase (itEvent);
+
+  Time payloadDuration = ppdu->GetTxDuration () - CalculatePhyPreambleAndHeaderDuration (ppdu->GetTxVector ());
+  Ptr<const WifiPsdu> psdu = GetAddressedPsduInPpdu (ppdu);
+  ScheduleEndOfMpdus (event);
+  m_endRxPayloadEvents.push_back (Simulator::Schedule (payloadDuration, &PhyEntity::EndReceivePayload, this, event));
+  m_signalNoiseMap.insert ({std::make_pair (ppdu->GetUid (), ppdu->GetStaId ()), SignalNoiseDbm ()});
+  m_statusPerMpduMap.insert ({std::make_pair (ppdu->GetUid (), ppdu->GetStaId ()), std::vector<bool> ()});
+}
+
+std::pair<uint16_t, WifiSpectrumBand>
+HePhy::GetChannelWidthAndBand (const WifiTxVector& txVector, uint16_t staId) const
+{
+  if (txVector.IsMu ())
+    {
+      return std::make_pair (HeRu::GetBandwidth (txVector.GetRu (staId).GetRuType ()),
+                             GetRuBandForRx (txVector, staId));
+    }
+  else
+    {
+      return PhyEntity::GetChannelWidthAndBand (txVector, staId);
+    }
+}
+
+WifiSpectrumBand
+HePhy::GetRuBandForTx (const WifiTxVector& txVector, uint16_t staId) const
+{
+  NS_ASSERT (txVector.IsMu ());
+  WifiSpectrumBand band;
+  HeRu::RuSpec ru = txVector.GetRu (staId);
+  uint16_t channelWidth = txVector.GetChannelWidth ();
+  NS_ASSERT (channelWidth <= m_wifiPhy->GetChannelWidth ());
+  HeRu::SubcarrierGroup group = HeRu::GetSubcarrierGroup (channelWidth, ru.GetRuType (), ru.GetPhyIndex ());
+  HeRu::SubcarrierRange range = std::make_pair (group.front ().first, group.back ().second);
+  // for a TX spectrum, the guard bandwidth is a function of the transmission channel width
+  // and the spectrum width equals the transmission channel width (hence bandIndex equals 0)
+  band = m_wifiPhy->ConvertHeRuSubcarriers (channelWidth, GetGuardBandwidth (channelWidth),
+                                            range, 0);
+  return band;
+}
+
+WifiSpectrumBand
+HePhy::GetRuBandForRx (const WifiTxVector& txVector, uint16_t staId) const
+{
+  NS_ASSERT (txVector.IsMu ());
+  WifiSpectrumBand band;
+  HeRu::RuSpec ru = txVector.GetRu (staId);
+  uint16_t channelWidth = txVector.GetChannelWidth ();
+  NS_ASSERT (channelWidth <= m_wifiPhy->GetChannelWidth ());
+  HeRu::SubcarrierGroup group = HeRu::GetSubcarrierGroup (channelWidth, ru.GetRuType (), ru.GetPhyIndex ());
+  HeRu::SubcarrierRange range = std::make_pair (group.front ().first, group.back ().second);
+  // for an RX spectrum, the guard bandwidth is a function of the operating channel width
+  // and the spectrum width equals the operating channel width
+  band = m_wifiPhy->ConvertHeRuSubcarriers (channelWidth, GetGuardBandwidth (m_wifiPhy->GetChannelWidth ()),
+                                            range, m_wifiPhy->GetOperatingChannel ().GetPrimaryChannelIndex (channelWidth));
+  return band;
+}
+
+WifiSpectrumBand
+HePhy::GetNonOfdmaBand (const WifiTxVector& txVector, uint16_t staId) const
+{
+  NS_ASSERT (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB);
+  uint16_t channelWidth = txVector.GetChannelWidth ();
+  NS_ASSERT (channelWidth <= m_wifiPhy->GetChannelWidth ());
+
+  HeRu::RuSpec ru = txVector.GetRu (staId);
+  uint16_t nonOfdmaWidth = GetNonOfdmaWidth (ru);
+
+  // Find the RU that encompasses the non-OFDMA part of the HE TB PPDU for the STA-ID
+  HeRu::RuSpec nonOfdmaRu = HeRu::FindOverlappingRu (channelWidth, ru, HeRu::GetRuType (nonOfdmaWidth));
+  nonOfdmaRu.SetPhyIndex (channelWidth, m_wifiPhy->GetOperatingChannel ().GetPrimaryChannelIndex (20));
+
+  HeRu::SubcarrierGroup groupPreamble = HeRu::GetSubcarrierGroup (channelWidth, nonOfdmaRu.GetRuType (), nonOfdmaRu.GetPhyIndex ());
+  HeRu::SubcarrierRange range = std::make_pair (groupPreamble.front ().first, groupPreamble.back ().second);
+  return m_wifiPhy->ConvertHeRuSubcarriers (channelWidth, GetGuardBandwidth (m_wifiPhy->GetChannelWidth ()), range,
+                                            m_wifiPhy->GetOperatingChannel ().GetPrimaryChannelIndex (channelWidth));
+}
+
+uint16_t
+HePhy::GetNonOfdmaWidth (HeRu::RuSpec ru) const
+{
+  if (ru.GetRuType () == HeRu::RU_26_TONE && ru.GetIndex () == 19)
+    {
+      // the center 26-tone RU in an 80 MHz channel is not fully covered by
+      // any 20 MHz channel, but only by an 80 MHz channel
+      return 80;
+    }
+  return std::max<uint16_t> (HeRu::GetBandwidth (ru.GetRuType ()), 20);
+}
+
+uint64_t
+HePhy::GetCurrentHeTbPpduUid (void) const
+{
+  return m_currentHeTbPpduUid;
+}
+
+uint16_t
+HePhy::GetMeasurementChannelWidth (const Ptr<const WifiPpdu> ppdu) const
+{
+  uint16_t channelWidth = PhyEntity::GetMeasurementChannelWidth (ppdu);
+  /**
+   * The PHY shall not issue a PHY-RXSTART.indication primitive in response to a PPDU that does not overlap
+   * the primary channel unless the PHY at an AP receives the HE TB PPDU solicited by the AP. For the HE
+   * TB PPDU solicited by the AP, the PHY shall issue a PHY-RXSTART.indication primitive for a PPDU
+   * received in the primary or at the secondary 20 MHz channel, the secondary 40 MHz channel, or the secondary
+   * 80 MHz channel.
+   */
+  if (channelWidth >= 40 && ppdu->GetUid () != m_previouslyTxPpduUid)
+    {
+      channelWidth = 20;
+    }
+  return channelWidth;
+}
+
+uint64_t
+HePhy::ObtainNextUid (const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << txVector);
+  uint64_t uid;
+  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB)
+    {
+      //Use UID of PPDU containing trigger frame to identify resulting HE TB PPDUs, since the latter should immediately follow the former
+      uid = m_wifiPhy->GetPreviouslyRxPpduUid ();
+      NS_ASSERT (uid != UINT64_MAX);
+    }
+  else
+    {
+      uid = m_globalPpduUid++;
+    }
+  m_previouslyTxPpduUid = uid; //to be able to identify solicited HE TB PPDUs
+  return uid;
+}
+
+Ptr<SpectrumValue>
+HePhy::GetTxPowerSpectralDensity (double txPowerW, Ptr<const WifiPpdu> ppdu) const
+{
+  const WifiTxVector& txVector = ppdu->GetTxVector ();
+  uint16_t centerFrequency = GetCenterFrequencyForChannelWidth (txVector);
+  uint16_t channelWidth = txVector.GetChannelWidth ();
+  NS_LOG_FUNCTION (this << centerFrequency << channelWidth << txPowerW);
+  auto hePpdu = DynamicCast<const HePpdu> (ppdu);
+  NS_ASSERT (hePpdu);
+  HePpdu::TxPsdFlag flag = hePpdu->GetTxPsdFlag ();
+  Ptr<SpectrumValue> v;
+  if (flag == HePpdu::PSD_HE_TB_OFDMA_PORTION)
+    {
+      WifiSpectrumBand band = GetRuBandForTx (txVector, GetStaId (hePpdu));
+      v = WifiSpectrumValueHelper::CreateHeMuOfdmTxPowerSpectralDensity (centerFrequency, channelWidth, txPowerW, GetGuardBandwidth (channelWidth), band);
+    }
+  else
+    {
+      if (flag == HePpdu::PSD_HE_TB_NON_OFDMA_PORTION)
+        {
+          //non-OFDMA portion is sent only on the 20 MHz channels covering the RU
+          uint16_t staId = GetStaId (hePpdu);
+          centerFrequency = GetCenterFrequencyForNonOfdmaPart (txVector, staId);
+          uint16_t ruWidth = HeRu::GetBandwidth (txVector.GetRu (staId).GetRuType ());
+          channelWidth = ruWidth < 20 ? 20 : ruWidth;
+        }
+      const auto & txMaskRejectionParams = GetTxMaskRejectionParams ();
+      v = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (centerFrequency, channelWidth, txPowerW, GetGuardBandwidth (channelWidth),
+                                                                       std::get<0> (txMaskRejectionParams), std::get<1> (txMaskRejectionParams), std::get<2> (txMaskRejectionParams));
+    }
+  return v;
+}
+
+uint16_t
+HePhy::GetCenterFrequencyForNonOfdmaPart (const WifiTxVector& txVector, uint16_t staId) const
+{
+  NS_LOG_FUNCTION (this << txVector << staId);
+  NS_ASSERT (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB);
+  uint16_t centerFrequency = GetCenterFrequencyForChannelWidth (txVector);
+  uint16_t currentWidth = txVector.GetChannelWidth ();
+
+  HeRu::RuSpec ru = txVector.GetRu (staId);
+  uint16_t nonOfdmaWidth = GetNonOfdmaWidth (ru);
+  if (nonOfdmaWidth != currentWidth)
+    {
+      //Obtain the index of the non-OFDMA portion
+      HeRu::RuSpec nonOfdmaRu = HeRu::FindOverlappingRu (currentWidth, ru, HeRu::GetRuType (nonOfdmaWidth));
+      nonOfdmaRu.SetPhyIndex (currentWidth, m_wifiPhy->GetOperatingChannel ().GetPrimaryChannelIndex (20));
+
+      uint16_t startingFrequency = centerFrequency - (currentWidth / 2);
+      centerFrequency = startingFrequency + nonOfdmaWidth * (nonOfdmaRu.GetPhyIndex () - 1) + nonOfdmaWidth / 2;
+    }
+  return centerFrequency;
+}
+
+void
+HePhy::StartTx (Ptr<WifiPpdu> ppdu)
+{
+  NS_LOG_FUNCTION (this << ppdu);
+  if (ppdu->GetType () == WIFI_PPDU_TYPE_UL_MU)
+    {
+      //non-OFDMA part
+      Time nonOfdmaDuration = CalculateNonOfdmaDurationForHeTb (ppdu->GetTxVector ());
+      Transmit (nonOfdmaDuration, ppdu, "non-OFDMA transmission");
+
+      //OFDMA part
+      auto hePpdu = DynamicCast<HePpdu> (ppdu->Copy ()); //since flag will be modified
+      NS_ASSERT (hePpdu);
+      hePpdu->SetTxPsdFlag (HePpdu::PSD_HE_TB_OFDMA_PORTION);
+      Time ofdmaDuration = ppdu->GetTxDuration () - nonOfdmaDuration;
+      Simulator::Schedule (nonOfdmaDuration, &PhyEntity::Transmit, this, ofdmaDuration, hePpdu, "OFDMA transmission");
+    }
+  else
+    {
+      PhyEntity::StartTx (ppdu);
+    }
+}
+
+Time
+HePhy::CalculateTxDuration (WifiConstPsduMap psduMap, const WifiTxVector& txVector, WifiPhyBand band) const
+{
+  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB)
+    {
+      return ConvertLSigLengthToHeTbPpduDuration (txVector.GetLength (), txVector, band);
+    }
+
+  Time maxDuration = Seconds (0);
+  for (auto & staIdPsdu : psduMap)
+    {
+      if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU)
+        {
+          WifiTxVector::HeMuUserInfoMap userInfoMap = txVector.GetHeMuUserInfoMap ();
+          NS_ABORT_MSG_IF (userInfoMap.find (staIdPsdu.first) == userInfoMap.end (), "STA-ID in psduMap (" << staIdPsdu.first << ") should be referenced in txVector");
+        }
+      Time current = WifiPhy::CalculateTxDuration (staIdPsdu.second->GetSize (), txVector, band,
+                                                   staIdPsdu.first);
+      if (current > maxDuration)
+        {
+          maxDuration = current;
+        }
+    }
+  NS_ASSERT (maxDuration.IsStrictlyPositive ());
+  return maxDuration;
+}
+
+void
+HePhy::InitializeModes (void)
+{
+  for (uint8_t i = 0; i < 12; ++i)
+    {
+      GetHeMcs (i);
+    }
+}
+
+WifiMode
+HePhy::GetHeMcs (uint8_t index)
+{
+#define CASE(x) \
+case x: \
+  return GetHeMcs ## x (); \
+
+  switch (index)
+    {
+      CASE ( 0)
+      CASE ( 1)
+      CASE ( 2)
+      CASE ( 3)
+      CASE ( 4)
+      CASE ( 5)
+      CASE ( 6)
+      CASE ( 7)
+      CASE ( 8)
+      CASE ( 9)
+      CASE (10)
+      CASE (11)
+      default:
+        NS_ABORT_MSG ("Inexistent index (" << +index << ") requested for HE");
+        return WifiMode ();
+    }
+#undef CASE
+}
+
+#define GET_HE_MCS(x) \
+WifiMode \
+HePhy::GetHeMcs ## x (void) \
+{ \
+  static WifiMode mcs = CreateHeMcs (x); \
+  return mcs; \
+}; \
+
+GET_HE_MCS (0)
+GET_HE_MCS (1)
+GET_HE_MCS (2)
+GET_HE_MCS (3)
+GET_HE_MCS (4)
+GET_HE_MCS (5)
+GET_HE_MCS (6)
+GET_HE_MCS (7)
+GET_HE_MCS (8)
+GET_HE_MCS (9)
+GET_HE_MCS (10)
+GET_HE_MCS (11)
+#undef GET_HE_MCS
+
+WifiMode
+HePhy::CreateHeMcs (uint8_t index)
+{
+  NS_ASSERT_MSG (index <= 11, "HeMcs index must be <= 11!");
+  return WifiModeFactory::CreateWifiMcs ("HeMcs" + std::to_string (index),
+                                         index,
+                                         WIFI_MOD_CLASS_HE,
+                                         MakeBoundCallback (&GetCodeRate, index),
+                                         MakeBoundCallback (&GetConstellationSize, index),
+                                         MakeBoundCallback (&GetPhyRate, index),
+                                         MakeCallback (&GetPhyRateFromTxVector),
+                                         MakeBoundCallback (&GetDataRate, index),
+                                         MakeCallback (&GetDataRateFromTxVector),
+                                         MakeBoundCallback (&GetNonHtReferenceRate, index),
+                                         MakeCallback (&IsModeAllowed));
+}
+
+WifiCodeRate
+HePhy::GetCodeRate (uint8_t mcsValue)
+{
+  switch (mcsValue)
+    {
+      case 10:
+        return WIFI_CODE_RATE_3_4;
+      case 11:
+        return WIFI_CODE_RATE_5_6;
+      default:
+        return VhtPhy::GetCodeRate (mcsValue);
+    }
+}
+
+uint16_t
+HePhy::GetConstellationSize (uint8_t mcsValue)
+{
+  switch (mcsValue)
+    {
+      case 10:
+      case 11:
+        return 1024;
+      default:
+        return VhtPhy::GetConstellationSize (mcsValue);
+    }
+}
+
+uint64_t
+HePhy::GetPhyRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+{
+  WifiCodeRate codeRate = GetCodeRate (mcsValue);
+  uint64_t dataRate = GetDataRate (mcsValue, channelWidth, guardInterval, nss);
+  return HtPhy::CalculatePhyRate (codeRate, dataRate);
+}
+
+uint64_t
+HePhy::GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t staId /* = SU_STA_ID */)
+{
+  uint16_t bw = txVector.GetChannelWidth ();
+  if (txVector.IsMu ())
+    {
+      bw = HeRu::GetBandwidth (txVector.GetRu (staId).GetRuType ());
+    }
+  return HePhy::GetPhyRate (txVector.GetMode (staId).GetMcsValue (),
+                            bw,
+                            txVector.GetGuardInterval (),
+                            txVector.GetNss (staId));
+}
+
+uint64_t
+HePhy::GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t staId /* = SU_STA_ID */)
+{
+  uint16_t bw = txVector.GetChannelWidth ();
+  if (txVector.IsMu ())
+    {
+      bw = HeRu::GetBandwidth (txVector.GetRu (staId).GetRuType ());
+    }
+  return HePhy::GetDataRate (txVector.GetMode (staId).GetMcsValue (),
+                             bw,
+                             txVector.GetGuardInterval (),
+                             txVector.GetNss (staId));
+}
+
+uint64_t
+HePhy::GetDataRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+{
+  NS_ASSERT (guardInterval == 800 || guardInterval == 1600 || guardInterval == 3200);
+  NS_ASSERT (nss <= 8);
+  return HtPhy::CalculateDataRate (12.8, guardInterval,
+                                   GetUsableSubcarriers (channelWidth),
+                                   static_cast<uint16_t> (log2 (GetConstellationSize (mcsValue))),
+                                   HtPhy::GetCodeRatio (GetCodeRate (mcsValue)), nss);
+}
+
+uint16_t
+HePhy::GetUsableSubcarriers (uint16_t channelWidth)
+{
+  switch (channelWidth)
+    {
+      case 2: //26-tone RU
+        return 24;
+      case 4: //52-tone RU
+        return 48;
+      case 8: //106-tone RU
+        return 102;
+      case 20:
+      default:
+        return 234;
+      case 40:
+        return 468;
+      case 80:
+        return 980;
+      case 160:
+        return 1960;
+    }
+}
+
+uint64_t
+HePhy::GetNonHtReferenceRate (uint8_t mcsValue)
+{
+  WifiCodeRate codeRate = GetCodeRate (mcsValue);
+  uint16_t constellationSize = GetConstellationSize (mcsValue);
+  return CalculateNonHtReferenceRate (codeRate, constellationSize);
+}
+
+uint64_t
+HePhy::CalculateNonHtReferenceRate (WifiCodeRate codeRate, uint16_t constellationSize)
+{
+  uint64_t dataRate;
+  switch (constellationSize)
+    {
+      case 1024:
+        if (codeRate == WIFI_CODE_RATE_3_4 || codeRate == WIFI_CODE_RATE_5_6)
+          {
+            dataRate = 54000000;
+          }
+        else
+          {
+            NS_FATAL_ERROR ("Trying to get reference rate for a MCS with wrong combination of coding rate and modulation");
+          }
+        break;
+      default:
+        dataRate = VhtPhy::CalculateNonHtReferenceRate (codeRate, constellationSize);
+    }
+  return dataRate;
+}
+
+bool
+HePhy::IsModeAllowed (uint16_t /* channelWidth */, uint8_t /* nss */)
+{
+  return true;
+}
+
+WifiConstPsduMap
+HePhy::GetWifiConstPsduMap (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) const
+{
+  uint16_t staId = SU_STA_ID;
+
+  if (txVector.IsUlMu ())
+    {
+      NS_ASSERT (txVector.GetHeMuUserInfoMap ().size () == 1);
+      staId = txVector.GetHeMuUserInfoMap ().begin ()->first;
+    }
+
+  return WifiConstPsduMap ({std::make_pair (staId, psdu)});
+}
+
+uint32_t
+HePhy::GetMaxPsduSize (void) const
+{
+  return 6500631;
+}
+
+} //namespace ns3
+
+namespace {
+
+/**
+ * Constructor class for HE modes
+ */
+static class ConstructorHe
+{
+public:
+  ConstructorHe ()
+  {
+    ns3::HePhy::InitializeModes ();
+    ns3::WifiPhy::AddStaticPhyEntity (ns3::WIFI_MOD_CLASS_HE, ns3::Create<ns3::HePhy> ());
+  }
+} g_constructor_he; ///< the constructor for HE modes
+
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-phy.h ns-3.34/src/wifi/model/he/he-phy.h
--- ns-3.33/src/wifi/model/he/he-phy.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,440 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy and spectrum-wifi-phy)
+ */
+
+#ifndef HE_PHY_H
+#define HE_PHY_H
+
+#include "ns3/vht-phy.h"
+#include "ns3/wifi-phy-band.h"
+#include "ns3/callback.h"
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of ns3::HePhy class
+ * and ns3::HeSigAParameters struct.
+ */
+
+namespace ns3 {
+
+/**
+ * This defines the BSS membership value for HE PHY.
+ */
+#define HE_PHY 125
+
+/**
+ * Parameters for received HE-SIG-A for OBSS_PD based SR
+ */
+struct HeSigAParameters
+{
+  double rssiW;     ///< RSSI in W
+  uint8_t bssColor; ///< BSS color
+};
+
+/**
+ * \brief PHY entity for HE (11ax)
+ * \ingroup wifi
+ *
+ * HE PHY is based on VHT PHY.
+ *
+ * Refer to P802.11ax/D4.0, clause 27.
+ */
+class HePhy : public VhtPhy
+{
+public:
+  /**
+   * Callback upon end of HE-SIG-A
+   *
+   * arg1: Parameters of HE-SIG-A
+   */
+  typedef Callback<void, HeSigAParameters> EndOfHeSigACallback;
+
+  /**
+   * Constructor for HE PHY
+   *
+   * \param buildModeList flag used to add HE modes to list (disabled
+   *                      by child classes to only add child classes' modes)
+   */
+  HePhy (bool buildModeList = true);
+  /**
+   * Destructor for HE PHY
+   */
+  virtual ~HePhy ();
+
+  WifiMode GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const override;
+  WifiMode GetSigAMode (void) const override;
+  WifiMode GetSigBMode (const WifiTxVector& txVector) const override;
+  const PpduFormats & GetPpduFormats (void) const override;
+  Time GetLSigDuration (WifiPreamble preamble) const override;
+  Time GetTrainingDuration (const WifiTxVector& txVector,
+                            uint8_t nDataLtf,
+                            uint8_t nExtensionLtf = 0) const override;
+  Time GetSigADuration (WifiPreamble preamble) const override;
+  Time GetSigBDuration (const WifiTxVector& txVector) const override;
+  Ptr<WifiPpdu> BuildPpdu (const WifiConstPsduMap & psdus,
+                           const WifiTxVector& txVector,
+                           Time ppduDuration) override;
+  Ptr<const WifiPsdu> GetAddressedPsduInPpdu (Ptr<const WifiPpdu> ppdu) const override;
+  void StartReceivePreamble (Ptr<WifiPpdu> ppdu,
+                             RxPowerWattPerChannelBand rxPowersW,
+                             Time rxDuration) override;
+  void CancelAllEvents (void) override;
+  uint16_t GetStaId (const Ptr<const WifiPpdu> ppdu) const override;
+  uint16_t GetMeasurementChannelWidth (const Ptr<const WifiPpdu> ppdu) const override;
+  void StartTx (Ptr<WifiPpdu> ppdu) override;
+  Time CalculateTxDuration (WifiConstPsduMap psduMap, const WifiTxVector& txVector, WifiPhyBand band) const override;
+
+  /**
+   * \return the BSS color of this PHY.
+   */
+  uint8_t GetBssColor (void) const;
+
+  /**
+   * \param ppduDuration the duration of the HE TB PPDU
+   * \param band the frequency band being used
+   *
+   * \return the L-SIG length value corresponding to that HE TB PPDU duration.
+   */
+  static uint16_t ConvertHeTbPpduDurationToLSigLength (Time ppduDuration, WifiPhyBand band);
+  /**
+   * \param length the L-SIG length value
+   * \param txVector the TXVECTOR used for the transmission of this HE TB PPDU
+   * \param band the frequency band being used
+   *
+   * \return the duration of the HE TB PPDU corresponding to that L-SIG length value.
+   */
+  static Time ConvertLSigLengthToHeTbPpduDuration (uint16_t length, const WifiTxVector& txVector, WifiPhyBand band);
+  /**
+   * \param txVector the transmission parameters used for the HE TB PPDU
+   *
+   * \return the duration of the non-OFDMA portion of the HE TB PPDU.
+   */
+  Time CalculateNonOfdmaDurationForHeTb (const WifiTxVector& txVector) const;
+
+  /**
+   * Get the band in the TX spectrum associated with the RU used by the PSDU
+   * transmitted to/by a given STA in a DL MU PPDU/HE TB PPDU
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the STA-ID of the station
+   *
+   * \return the RU band in the TX spectrum
+   */
+  WifiSpectrumBand GetRuBandForTx (const WifiTxVector& txVector, uint16_t staId) const;
+  /**
+   * Get the band in the RX spectrum associated with the RU used by the PSDU
+   * transmitted to/by a given STA in a DL MU PPDU/HE TB PPDU
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the STA-ID of the station
+   *
+   * \return the RU band in the RX spectrum
+   */
+  WifiSpectrumBand GetRuBandForRx (const WifiTxVector& txVector, uint16_t staId) const;
+  /**
+   * Get the band used to transmit the non-OFDMA part of an HE TB PPDU.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the STA-ID of the station taking part of the UL MU
+   *
+   * \return the spectrum band used to transmit the non-OFDMA part of an HE TB PPDU
+   */
+  WifiSpectrumBand GetNonOfdmaBand (const WifiTxVector& txVector, uint16_t staId) const;
+  /**
+   * Get the width in MHz of the non-OFDMA portion of an HE TB PPDU
+   *
+   * \param ru the RU in which the HE TB PPDU is sent
+   * \return the width in MHz of the non-OFDMA portion of an HE TB PPDU
+   */
+  uint16_t GetNonOfdmaWidth (HeRu::RuSpec ru) const;
+
+  /**
+   * \return the UID of the HE TB PPDU being received
+   */
+  uint64_t GetCurrentHeTbPpduUid (void) const;
+
+  /**
+   * Get the center frequency of the non-OFDMA part of the current TxVector for the
+   * given STA-ID.
+   * Note this method is only to be used for UL MU.
+   *
+   * \param txVector the TXVECTOR that has the RU allocation
+   * \param staId the STA-ID of the station taking part of the UL MU
+   * \return the center frequency in MHz corresponding to the non-OFDMA part of the HE TB PPDU
+   */
+  uint16_t GetCenterFrequencyForNonOfdmaPart (const WifiTxVector& txVector, uint16_t staId) const;
+
+  /**
+   * Set a callback for a end of HE-SIG-A.
+   *
+   * \param callback the EndOfHeSigACallback to set
+   */
+  void SetEndOfHeSigACallback (EndOfHeSigACallback callback);
+
+  /**
+   * Fire a EndOfHeSigA callback (if connected) once HE-SIG-A field has been received.
+   * This method is scheduled immediatly after end of HE-SIG-A, once
+   * field processing is finished.
+   *
+   * \param params the HE-SIG-A parameters
+   */
+  void NotifyEndOfHeSigA (HeSigAParameters params);
+
+  /**
+   * Initialize all HE modes.
+   */
+  static void InitializeModes (void);
+  /**
+   * Return the HE MCS corresponding to
+   * the provided index.
+   *
+   * \param index the index of the MCS
+   * \return an HE MCS
+   */
+  static WifiMode GetHeMcs (uint8_t index);
+
+  /**
+   * Return MCS 0 from HE MCS values.
+   *
+   * \return MCS 0 from HE MCS values
+   */
+  static WifiMode GetHeMcs0 (void);
+  /**
+   * Return MCS 1 from HE MCS values.
+   *
+   * \return MCS 1 from HE MCS values
+   */
+  static WifiMode GetHeMcs1 (void);
+  /**
+   * Return MCS 2 from HE MCS values.
+   *
+   * \return MCS 2 from HE MCS values
+   */
+  static WifiMode GetHeMcs2 (void);
+  /**
+   * Return MCS 3 from HE MCS values.
+   *
+   * \return MCS 3 from HE MCS values
+   */
+  static WifiMode GetHeMcs3 (void);
+  /**
+   * Return MCS 4 from HE MCS values.
+   *
+   * \return MCS 4 from HE MCS values
+   */
+  static WifiMode GetHeMcs4 (void);
+  /**
+   * Return MCS 5 from HE MCS values.
+   *
+   * \return MCS 5 from HE MCS values
+   */
+  static WifiMode GetHeMcs5 (void);
+  /**
+   * Return MCS 6 from HE MCS values.
+   *
+   * \return MCS 6 from HE MCS values
+   */
+  static WifiMode GetHeMcs6 (void);
+  /**
+   * Return MCS 7 from HE MCS values.
+   *
+   * \return MCS 7 from HE MCS values
+   */
+  static WifiMode GetHeMcs7 (void);
+  /**
+   * Return MCS 8 from HE MCS values.
+   *
+   * \return MCS 8 from HE MCS values
+   */
+  static WifiMode GetHeMcs8 (void);
+  /**
+   * Return MCS 9 from HE MCS values.
+   *
+   * \return MCS 9 from HE MCS values
+   */
+  static WifiMode GetHeMcs9 (void);
+  /**
+   * Return MCS 10 from HE MCS values.
+   *
+   * \return MCS 10 from HE MCS values
+   */
+  static WifiMode GetHeMcs10 (void);
+  /**
+   * Return MCS 11 from HE MCS values.
+   *
+   * \return MCS 11 from HE MCS values
+   */
+  static WifiMode GetHeMcs11 (void);
+
+  /**
+   * Return the coding rate corresponding to
+   * the supplied HE MCS index. This function is used
+   * as a callback for WifiMode operation.
+   *
+   * \param mcsValue the MCS index
+   * \return the coding rate.
+   */
+  static WifiCodeRate GetCodeRate (uint8_t mcsValue);
+  /**
+   * Return the constellation size corresponding
+   * to the supplied HE MCS index. This function is used
+   * as a callback for WifiMode operation.
+   *
+   * \param mcsValue the MCS index
+   * \return the size of modulation constellation.
+   */
+  static uint16_t GetConstellationSize (uint8_t mcsValue);
+  /**
+   * Return the PHY rate corresponding to the supplied HE MCS
+   * index, channel width, guard interval, and number of
+   * spatial stream. This function calls HtPhy::CalculatePhyRate
+   * and is mainly used as a callback for WifiMode operation.
+   *
+   * \param mcsValue the HE MCS index
+   * \param channelWidth the considered channel width in MHz
+   * \param guardInterval the considered guard interval duration in nanoseconds
+   * \param nss the considered number of stream
+   *
+   * \return the physical bit rate of this signal in bps.
+   */
+  static uint64_t GetPhyRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  /**
+   * Return the PHY rate corresponding to
+   * the supplied TXVECTOR for the STA-ID.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the station ID for MU (unused if SU)
+   * \return the physical bit rate of this signal in bps.
+   */
+  static uint64_t GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t staId = SU_STA_ID);
+  /**
+   * Return the data rate corresponding to
+   * the supplied TXVECTOR for the STA-ID.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the station ID for MU (unused if SU)
+   * \return the data bit rate in bps.
+   */
+  static uint64_t GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t staId = SU_STA_ID);
+  /**
+   * Return the data rate corresponding to
+   * the supplied HE MCS index, channel width,
+   * guard interval, and number of spatial
+   * streams.
+   *
+   * \param mcsValue the MCS index
+   * \param channelWidth the channel width in MHz
+   * \param guardInterval the guard interval duration in nanoseconds
+   * \param nss the number of spatial streams
+   * \return the data bit rate in bps.
+   */
+  static uint64_t GetDataRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  /**
+   * Calculate the rate in bps of the non-HT Reference Rate corresponding
+   * to the supplied HE MCS index. This function calls CalculateNonHtReferenceRate
+   * and is used as a callback for WifiMode operation.
+   *
+   * \param mcsValue the HE MCS index
+   * \return the rate in bps of the non-HT Reference Rate.
+   */
+  static uint64_t GetNonHtReferenceRate (uint8_t mcsValue);
+  /**
+   * Check whether the combination of <MCS, channel width, NSS> is allowed.
+   * This function is used as a callback for WifiMode operation, and always
+   * returns true since there is no limitation for any MCS in HePhy.
+   *
+   * \param channelWidth the considered channel width in MHz
+   * \param nss the considered number of streams
+   * \returns true.
+   */
+  static bool IsModeAllowed (uint16_t channelWidth, uint8_t nss);
+
+protected:
+  PhyFieldRxStatus ProcessSigA (Ptr<Event> event, PhyFieldRxStatus status) override;
+  PhyFieldRxStatus ProcessSigB (Ptr<Event> event, PhyFieldRxStatus status) override;
+  Ptr<Event> DoGetEvent (Ptr<const WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW) override;
+  bool IsConfigSupported (Ptr<const WifiPpdu> ppdu) const override;
+  void DoStartReceivePayload (Ptr<Event> event) override;
+  std::pair<uint16_t, WifiSpectrumBand> GetChannelWidthAndBand (const WifiTxVector& txVector, uint16_t staId) const override;
+  void DoEndReceivePayload (Ptr<const WifiPpdu> ppdu) override;
+  void DoResetReceive (Ptr<Event> event) override;
+  void DoAbortCurrentReception (WifiPhyRxfailureReason reason) override;
+  uint64_t ObtainNextUid (const WifiTxVector& txVector) override;
+  Ptr<SpectrumValue> GetTxPowerSpectralDensity (double txPowerW, Ptr<const WifiPpdu> ppdu) const override;
+  uint32_t GetMaxPsduSize (void) const override;
+  WifiConstPsduMap GetWifiConstPsduMap (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) const override;
+
+  /**
+   * Start receiving the PSDU (i.e. the first symbol of the PSDU has arrived) of an UL-OFDMA transmission.
+   * This function is called upon the RX event corresponding to the OFDMA part of the UL MU PPDU.
+   *
+   * \param event the event holding incoming OFDMA part of the PPDU's information
+   */
+  void StartReceiveOfdmaPayload (Ptr<Event> event);
+
+  /**
+   * Return the rate (in bps) of the non-HT Reference Rate
+   * which corresponds to the supplied code rate and
+   * constellation size.
+   *
+   * \param codeRate the convolutional coding rate
+   * \param constellationSize the size of modulation constellation
+   * \returns the rate in bps.
+   *
+   * To convert an HE MCS to its corresponding non-HT Reference Rate
+   * use the modulation and coding rate of the HT MCS
+   * and lookup in Table 10-10 of IEEE P802.11ax/D6.0.
+   */
+  static uint64_t CalculateNonHtReferenceRate (WifiCodeRate codeRate, uint16_t constellationSize);
+  /**
+   * \param channelWidth the channel width in MHz
+   * \return he number of usable subcarriers for data
+   */
+  static uint16_t GetUsableSubcarriers (uint16_t channelWidth);
+
+  uint64_t m_previouslyTxPpduUid;  //!< UID of the previously sent PPDU, used by AP to recognize response HE TB PPDUs
+  uint64_t m_currentHeTbPpduUid;   //!< UID of the HE TB PPDU being received
+
+  std::map <uint16_t /* STA-ID */, EventId> m_beginOfdmaPayloadRxEvents; //!< the beginning of the OFDMA payload reception events (indexed by STA-ID)
+
+  EndOfHeSigACallback m_endOfHeSigACallback; //!< end of HE-SIG-A callback
+
+private:
+  void BuildModeList (void) override;
+  uint8_t GetNumberBccEncoders (const WifiTxVector& txVector) const override;
+  Time GetSymbolDuration (const WifiTxVector& txVector) const override;
+
+  /**
+   * Create and return the HE MCS corresponding to
+   * the provided index.
+   * This method binds all the callbacks used by WifiMode.
+   *
+   * \param index the index of the MCS
+   * \return an HE MCS
+   */
+  static WifiMode CreateHeMcs (uint8_t index);
+
+  static const PpduFormats m_hePpduFormats; //!< HE PPDU formats
+}; //class HePhy
+
+} //namespace ns3
+
+#endif /* HE_PHY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-ppdu.cc ns-3.34/src/wifi/model/he/he-ppdu.cc
--- ns-3.33/src/wifi/model/he/he-ppdu.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-ppdu.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,541 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Rediet <getachew.redieteab@orange.com>
+ *         Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
+ *         Sébastien Deronne <sebastien.deronne@gmail.com> (HeSigHeader)
+ */
+
+#include "ns3/wifi-phy.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/wifi-utils.h"
+#include "he-phy.h"
+#include "he-ppdu.h"
+#include "ns3/log.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("HePpdu");
+
+std::ostream& operator<< (std::ostream& os, const HePpdu::TxPsdFlag &flag)
+{
+  switch (flag)
+    {
+      case HePpdu::PSD_NON_HE_TB:
+        return (os << "PSD_NON_HE_TB");
+      case HePpdu::PSD_HE_TB_NON_OFDMA_PORTION:
+        return (os << "PSD_HE_TB_NON_OFDMA_PORTION");
+      case HePpdu::PSD_HE_TB_OFDMA_PORTION:
+        return (os << "PSD_HE_TB_OFDMA_PORTION");
+      default:
+        NS_FATAL_ERROR ("Invalid PSD flag");
+        return (os << "INVALID");
+    }
+}
+
+HePpdu::HePpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration,
+                WifiPhyBand band, uint64_t uid, TxPsdFlag flag)
+  : OfdmPpdu (psdus.begin ()->second, txVector, band, uid, false) //don't instantiate LSigHeader of OfdmPpdu
+{
+  NS_LOG_FUNCTION (this << psdus << txVector << ppduDuration << band << uid << flag);
+
+  //overwrite with map (since only first element used by OfdmPpdu)
+  m_psdus.begin ()->second = 0;
+  m_psdus.clear ();
+  m_psdus = psdus;
+  if (IsMu ())
+    {
+      m_muUserInfos = txVector.GetHeMuUserInfoMap ();
+    }
+
+  SetPhyHeaders (txVector, ppduDuration);
+  SetTxPsdFlag (flag);
+}
+
+HePpdu::HePpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, Time ppduDuration,
+                WifiPhyBand band, uint64_t uid)
+  : OfdmPpdu (psdu, txVector, band, uid, false) //don't instantiate LSigHeader of OfdmPpdu
+{
+  NS_LOG_FUNCTION (this << psdu << txVector << ppduDuration << band << uid);
+  NS_ASSERT (!IsMu ());
+  SetPhyHeaders (txVector, ppduDuration);
+  SetTxPsdFlag (PSD_NON_HE_TB);
+}
+
+HePpdu::~HePpdu ()
+{
+}
+
+void
+HePpdu::SetPhyHeaders (const WifiTxVector& txVector, Time ppduDuration)
+{
+  NS_LOG_FUNCTION (this << txVector << ppduDuration);
+  uint8_t sigExtension = 0;
+  if (m_band == WIFI_PHY_BAND_2_4GHZ)
+    {
+      sigExtension = 6;
+    }
+  uint8_t m = 0;
+  if ((m_preamble == WIFI_PREAMBLE_HE_SU) || (m_preamble == WIFI_PREAMBLE_HE_TB))
+    {
+      m = 2;
+    }
+  else if (m_preamble == WIFI_PREAMBLE_HE_MU)
+    {
+      m = 1;
+    }
+  else
+    {
+      NS_ASSERT_MSG (false, "Unsupported preamble type");
+    }
+  uint16_t length = ((ceil ((static_cast<double> (ppduDuration.GetNanoSeconds () - (20 * 1000) - (sigExtension * 1000)) / 1000) / 4.0) * 3) - 3 - m);
+  m_lSig.SetLength (length);
+  if (IsDlMu ())
+    {
+      m_heSig.SetMuFlag (true);
+    }
+  else if (!IsUlMu ())
+    {
+      m_heSig.SetMcs (txVector.GetMode ().GetMcsValue ());
+      m_heSig.SetNStreams (txVector.GetNss ());
+    }
+  m_heSig.SetBssColor (txVector.GetBssColor ());
+  m_heSig.SetChannelWidth (m_channelWidth);
+  m_heSig.SetGuardIntervalAndLtfSize (txVector.GetGuardInterval (), 2/*NLTF currently unused*/);
+}
+
+WifiTxVector
+HePpdu::DoGetTxVector (void) const
+{
+  WifiTxVector txVector;
+  txVector.SetPreambleType (m_preamble);
+  txVector.SetMode (HePhy::GetHeMcs (m_heSig.GetMcs ()));
+  txVector.SetChannelWidth (m_heSig.GetChannelWidth ());
+  txVector.SetNss (m_heSig.GetNStreams ());
+  txVector.SetGuardInterval (m_heSig.GetGuardInterval ());
+  txVector.SetBssColor (m_heSig.GetBssColor ());
+  txVector.SetAggregation (m_psdus.size () > 1 || m_psdus.begin ()->second->IsAggregate ());
+  for (auto const& muUserInfo : m_muUserInfos)
+    {
+      txVector.SetHeMuUserInfo (muUserInfo.first, muUserInfo.second);
+    }
+  return txVector;
+}
+
+Time
+HePpdu::GetTxDuration (void) const
+{
+  Time ppduDuration = Seconds (0);
+  const WifiTxVector& txVector = GetTxVector ();
+  Time tSymbol = NanoSeconds (12800 + txVector.GetGuardInterval ());
+  Time preambleDuration = WifiPhy::CalculatePhyPreambleAndHeaderDuration (txVector);
+  uint8_t sigExtension = 0;
+  if (m_band == WIFI_PHY_BAND_2_4GHZ)
+    {
+      sigExtension = 6;
+    }
+  uint8_t m = IsDlMu () ? 1 : 2;
+  //Equation 27-11 of IEEE P802.11ax/D4.0
+  Time calculatedDuration = MicroSeconds (((ceil (static_cast<double> (m_lSig.GetLength () + 3 + m) / 3)) * 4) + 20 + sigExtension);
+  uint32_t nSymbols = floor (static_cast<double> ((calculatedDuration - preambleDuration).GetNanoSeconds () - (sigExtension * 1000)) / tSymbol.GetNanoSeconds ());
+  ppduDuration = preambleDuration + (nSymbols * tSymbol) + MicroSeconds (sigExtension);
+  return ppduDuration;
+}
+
+Ptr<WifiPpdu>
+HePpdu::Copy (void) const
+{
+  return Create<HePpdu> (m_psdus, GetTxVector (), GetTxDuration (), m_band, m_uid, m_txPsdFlag);
+}
+
+WifiPpduType
+HePpdu::GetType (void) const
+{
+  switch (m_preamble)
+    {
+      case WIFI_PREAMBLE_HE_MU:
+        return WIFI_PPDU_TYPE_DL_MU;
+      case WIFI_PREAMBLE_HE_TB:
+        return WIFI_PPDU_TYPE_UL_MU;
+      default:
+        return WIFI_PPDU_TYPE_SU;
+    }
+}
+
+bool
+HePpdu::IsMu (void) const
+{
+  return (IsDlMu () || IsUlMu ());
+}
+
+bool
+HePpdu::IsDlMu (void) const
+{
+  return (m_preamble == WIFI_PREAMBLE_HE_MU);
+}
+
+bool
+HePpdu::IsUlMu (void) const
+{
+  return (m_preamble == WIFI_PREAMBLE_HE_TB);
+}
+
+Ptr<const WifiPsdu>
+HePpdu::GetPsdu (uint8_t bssColor, uint16_t staId /* = SU_STA_ID */) const
+{
+  if (!IsMu ())
+    {
+      NS_ASSERT (m_psdus.size () == 1);
+      return m_psdus.at (SU_STA_ID);
+    }
+  else if (IsUlMu ())
+    {
+      NS_ASSERT (m_psdus.size () == 1);
+      if (bssColor == 0 || m_heSig.GetBssColor () == 0 || (bssColor == m_heSig.GetBssColor ()))
+        {
+          return m_psdus.begin ()->second;
+        }
+    }
+  else
+    {
+      if (bssColor == 0 || m_heSig.GetBssColor () == 0 || (bssColor == m_heSig.GetBssColor ()))
+        {
+          auto it = m_psdus.find (staId);
+          if (it != m_psdus.end ())
+            {
+              return it->second;
+            }
+        }
+    }
+  return nullptr;
+}
+
+uint16_t
+HePpdu::GetStaId (void) const
+{
+  NS_ASSERT (IsUlMu ());
+  return m_psdus.begin ()->first;
+}
+
+uint16_t
+HePpdu::GetTransmissionChannelWidth (void) const
+{
+  WifiTxVector txVector = GetTxVector ();
+  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB && GetStaId () != SU_STA_ID)
+    {
+      TxPsdFlag flag = GetTxPsdFlag ();
+      NS_ASSERT (flag > PSD_NON_HE_TB);
+      uint16_t ruWidth = HeRu::GetBandwidth (txVector.GetRu (GetStaId ()).GetRuType ());
+      uint16_t channelWidth = (flag == PSD_HE_TB_NON_OFDMA_PORTION && ruWidth < 20) ? 20 : ruWidth;
+      NS_LOG_INFO ("Use channelWidth=" << channelWidth << " MHz for HE TB from " << GetStaId ()
+                                       << " for " << flag);
+      return channelWidth;
+    }
+  else
+    {
+      return OfdmPpdu::GetTransmissionChannelWidth ();
+    }
+}
+
+bool
+HePpdu::CanBeReceived (uint16_t txCenterFreq, uint16_t p20MinFreq, uint16_t p20MaxFreq) const
+{
+  NS_LOG_FUNCTION (this << txCenterFreq << p20MinFreq << p20MaxFreq);
+
+  if (GetTxVector ().IsUlMu ())
+    {
+      // APs are able to receive TB PPDUs sent on a band other than the primary20 channel
+      return true;
+    }
+  return OfdmPpdu::CanBeReceived (txCenterFreq, p20MinFreq, p20MaxFreq);
+}
+
+HePpdu::TxPsdFlag
+HePpdu::GetTxPsdFlag (void) const
+{
+  return m_txPsdFlag;
+}
+
+void
+HePpdu::SetTxPsdFlag (TxPsdFlag flag)
+{
+  NS_LOG_FUNCTION (this << flag);
+  NS_ASSERT ((IsUlMu () && flag > PSD_NON_HE_TB) || (!IsUlMu () && flag == PSD_NON_HE_TB));
+  m_txPsdFlag = flag;
+}
+
+std::string
+HePpdu::PrintPayload (void) const
+{
+  std::ostringstream ss;
+  if (IsMu ())
+    {
+      ss << m_psdus;
+      ss << ", " << m_txPsdFlag;
+    }
+  else
+    {
+      ss << "PSDU=" << m_psdus.at (SU_STA_ID) << " ";
+    }
+  return ss.str ();
+}
+
+HePpdu::HeSigHeader::HeSigHeader ()
+  : m_format (1),
+    m_bssColor (0),
+    m_ul_dl (0),
+    m_mcs (0),
+    m_spatialReuse (0),
+    m_bandwidth (0),
+    m_gi_ltf_size (0),
+    m_nsts (0),
+    m_mu (false)
+{
+}
+
+HePpdu::HeSigHeader::~HeSigHeader ()
+{
+}
+
+TypeId
+HePpdu::HeSigHeader::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::HeSigHeader")
+    .SetParent<Header> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<HeSigHeader> ()
+  ;
+  return tid;
+}
+
+TypeId
+HePpdu::HeSigHeader::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+void
+HePpdu::HeSigHeader::Print (std::ostream &os) const
+{
+  os << "MCS=" << +m_mcs
+     << " CHANNEL_WIDTH=" << GetChannelWidth ()
+     << " GI=" << GetGuardInterval ()
+     << " NSTS=" << +m_nsts
+     << " BSSColor=" << +m_bssColor
+     << " MU=" << +m_mu;
+}
+
+uint32_t
+HePpdu::HeSigHeader::GetSerializedSize (void) const
+{
+  uint32_t size = 0;
+  size += 4; //HE-SIG-A1
+  size += 4; //HE-SIG-A2
+  if (m_mu)
+    {
+      size += 1; //HE-SIG-B
+    }
+  return size;
+}
+
+void
+HePpdu::HeSigHeader::SetMuFlag (bool mu)
+{
+  m_mu = mu;
+}
+
+void
+HePpdu::HeSigHeader::SetMcs (uint8_t mcs)
+{
+  NS_ASSERT (mcs <= 11);
+  m_mcs = mcs;
+}
+
+uint8_t
+HePpdu::HeSigHeader::GetMcs (void) const
+{
+  return m_mcs;
+}
+
+void
+HePpdu::HeSigHeader::SetBssColor (uint8_t bssColor)
+{
+  NS_ASSERT (bssColor < 64);
+  m_bssColor = bssColor;
+}
+
+uint8_t
+HePpdu::HeSigHeader::GetBssColor (void) const
+{
+  return m_bssColor;
+}
+
+void
+HePpdu::HeSigHeader::SetChannelWidth (uint16_t channelWidth)
+{
+  if (channelWidth == 160)
+    {
+      m_bandwidth = 3;
+    }
+  else if (channelWidth == 80)
+    {
+      m_bandwidth = 2;
+    }
+  else if (channelWidth == 40)
+    {
+      m_bandwidth = 1;
+    }
+  else
+    {
+      m_bandwidth = 0;
+    }
+}
+
+uint16_t
+HePpdu::HeSigHeader::GetChannelWidth (void) const
+{
+  if (m_bandwidth == 3)
+    {
+      return 160;
+    }
+  else if (m_bandwidth == 2)
+    {
+      return 80;
+    }
+  else if (m_bandwidth == 1)
+    {
+      return 40;
+    }
+  else
+    {
+      return 20;
+    }
+}
+
+void
+HePpdu::HeSigHeader::SetGuardIntervalAndLtfSize (uint16_t gi, uint8_t ltf)
+{
+  if (gi == 800 && ltf == 1)
+    {
+      m_gi_ltf_size = 0;
+    }
+  else if (gi == 800 && ltf == 2)
+    {
+      m_gi_ltf_size = 1;
+    }
+  else if (gi == 1600 && ltf == 2)
+    {
+      m_gi_ltf_size = 2;
+    }
+  else
+    {
+      m_gi_ltf_size = 3;
+    }
+}
+
+uint16_t
+HePpdu::HeSigHeader::GetGuardInterval (void) const
+{
+  if (m_gi_ltf_size == 3)
+    {
+      //we currently do not consider DCM nor STBC fields
+      return 3200;
+    }
+  else if (m_gi_ltf_size == 2)
+    {
+      return 1600;
+    }
+  else
+    {
+      return 800;
+    }
+}
+
+void
+HePpdu::HeSigHeader::SetNStreams (uint8_t nStreams)
+{
+  NS_ASSERT (nStreams <= 8);
+  m_nsts = (nStreams - 1);
+}
+
+uint8_t
+HePpdu::HeSigHeader::GetNStreams (void) const
+{
+  return (m_nsts + 1);
+}
+
+void
+HePpdu::HeSigHeader::Serialize (Buffer::Iterator start) const
+{
+  //HE-SIG-A1
+  uint8_t byte = m_format & 0x01;
+  byte |= ((m_ul_dl & 0x01) << 2);
+  byte |= ((m_mcs & 0x0f) << 3);
+  start.WriteU8 (byte);
+  uint16_t bytes = (m_bssColor & 0x3f);
+  bytes |= (0x01 << 6); //Reserved set to 1
+  bytes |= ((m_spatialReuse & 0x0f) << 7);
+  bytes |= ((m_bandwidth & 0x03) << 11);
+  bytes |= ((m_gi_ltf_size & 0x03) << 13);
+  bytes |= ((m_nsts & 0x01) << 15);
+  start.WriteU16 (bytes);
+  start.WriteU8 ((m_nsts >> 1) & 0x03);
+
+  //HE-SIG-A2
+  uint32_t sigA2 = 0;
+  sigA2 |= (0x01 << 14); //Set Reserved bit #14 to 1
+  start.WriteU32 (sigA2);
+
+  if (m_mu)
+    {
+      //HE-SIG-B
+      start.WriteU8 (0);
+    }
+}
+
+uint32_t
+HePpdu::HeSigHeader::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+
+  //HE-SIG-A1
+  uint8_t byte = i.ReadU8 ();
+  m_format = (byte & 0x01);
+  m_ul_dl = ((byte >> 2) & 0x01);
+  m_mcs = ((byte >> 3) & 0x0f);
+  uint16_t bytes = i.ReadU16 ();
+  m_bssColor = (bytes & 0x3f);
+  m_spatialReuse = ((bytes >> 7) & 0x0f);
+  m_bandwidth = ((bytes >> 11) & 0x03);
+  m_gi_ltf_size = ((bytes >> 13) & 0x03);
+  m_nsts = ((bytes >> 15) & 0x01);
+  byte = i.ReadU8 ();
+  m_nsts |= (byte & 0x03) << 1;
+
+  //HE-SIG-A2
+  i.ReadU32 ();
+
+  if (m_mu)
+    {
+      //HE-SIG-B
+      i.ReadU8 ();
+    }
+
+  return i.GetDistanceFrom (start);
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-ppdu.h ns-3.34/src/wifi/model/he/he-ppdu.h
--- ns-3.33/src/wifi/model/he/he-ppdu.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-ppdu.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,273 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Rediet <getachew.redieteab@orange.com>
+ *         Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
+ *         Sébastien Deronne <sebastien.deronne@gmail.com> (HeSigHeader)
+ */
+
+#ifndef HE_PPDU_H
+#define HE_PPDU_H
+
+#include "ns3/ofdm-ppdu.h"
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of ns3::HePpdu class.
+ */
+
+namespace ns3 {
+
+class WifiPsdu;
+
+/**
+ * \brief HE PPDU (11ax)
+ * \ingroup wifi
+ *
+ * HePpdu stores a preamble, PHY headers and a map of PSDUs of a PPDU with HE header
+ */
+class HePpdu : public OfdmPpdu
+{
+public:
+
+  /**
+   * HE-SIG PHY header (HE-SIG-A1/A2/B)
+   */
+  class HeSigHeader : public Header
+  {
+  public:
+    HeSigHeader ();
+    virtual ~HeSigHeader ();
+
+    /**
+     * \brief Get the type ID.
+     * \return the object TypeId
+     */
+    static TypeId GetTypeId (void);
+
+    TypeId GetInstanceTypeId (void) const override;
+    void Print (std::ostream &os) const override;
+    uint32_t GetSerializedSize (void) const override;
+    void Serialize (Buffer::Iterator start) const override;
+    uint32_t Deserialize (Buffer::Iterator start) override;
+
+    /**
+     * Set the Multi-User (MU) flag.
+     *
+     * \param mu the MU flag
+     */
+    void SetMuFlag (bool mu);
+
+    /**
+     * Fill the MCS field of HE-SIG-A1.
+     *
+     * \param mcs the MCS field of HE-SIG-A1
+     */
+    void SetMcs (uint8_t mcs);
+    /**
+     * Return the MCS field of HE-SIG-A1.
+     *
+     * \return the MCS field of HE-SIG-A1
+     */
+    uint8_t GetMcs (void) const;
+    /**
+     * Fill the BSS Color field of HE-SIG-A1.
+     *
+     * \param bssColor the BSS Color value
+     */
+    void SetBssColor (uint8_t bssColor);
+    /**
+     * Return the BSS Color field in the HE-SIG-A1.
+     *
+     * \return the BSS Color field in the HE-SIG-A1
+     */
+    uint8_t GetBssColor (void) const;
+    /**
+     * Fill the channel width field of HE-SIG-A1 (in MHz).
+     *
+     * \param channelWidth the channel width (in MHz)
+     */
+    void SetChannelWidth (uint16_t channelWidth);
+    /**
+     * Return the channel width (in MHz).
+     *
+     * \return the channel width (in MHz)
+     */
+    uint16_t GetChannelWidth (void) const;
+    /**
+     * Fill the GI + LTF size field of HE-SIG-A1.
+     *
+     * \param gi the guard interval (in nanoseconds)
+     * \param ltf the sequence of HE-LTF
+     */
+    void SetGuardIntervalAndLtfSize (uint16_t gi, uint8_t ltf);
+    /**
+     * Return the guard interval (in nanoseconds).
+     *
+     * \return the guard interval (in nanoseconds)
+     */
+    uint16_t GetGuardInterval (void) const;
+    /**
+     * Fill the number of streams field of HE-SIG-A1.
+     *
+     * \param nStreams the number of streams
+     */
+    void SetNStreams (uint8_t nStreams);
+    /**
+     * Return the number of streams.
+     *
+     * \return the number of streams
+     */
+    uint8_t GetNStreams (void) const;
+
+  private:
+    //HE-SIG-A1 fields
+    uint8_t m_format;       ///< Format bit
+    uint8_t m_bssColor;     ///< BSS color field
+    uint8_t m_ul_dl;        ///< UL/DL bit
+    uint8_t m_mcs;          ///< MCS field
+    uint8_t m_spatialReuse; ///< Spatial Reuse field
+    uint8_t m_bandwidth;    ///< Bandwidth field
+    uint8_t m_gi_ltf_size;  ///< GI+LTF Size field
+    uint8_t m_nsts;         ///< NSTS
+
+    /// This is used to decide whether MU SIG-B should be added or not
+    bool m_mu;
+  }; //class HeSigHeader
+
+  /**
+   * The transmit power spectral density flag, namely used
+   * to correctly build PSD for HE TB PPDU non-OFDMA and
+   * OFDMA portions.
+   */
+  enum TxPsdFlag
+  {
+    PSD_NON_HE_TB = 0,           //!< non-HE TB PPDU transmissions
+    PSD_HE_TB_NON_OFDMA_PORTION, //!< preamble of HE TB PPDU, which should only be sent on minimum subset of 20 MHz channels containing RU
+    PSD_HE_TB_OFDMA_PORTION      //!< OFDMA portion of HE TB PPDU, which should only be sent on RU
+  };
+
+  /**
+   * Create an SU HE PPDU, storing a PSDU.
+   *
+   * \param psdu the PHY payload (PSDU)
+   * \param txVector the TXVECTOR that was used for this PPDU
+   * \param ppduDuration the transmission duration of this PPDU
+   * \param band the WifiPhyBand used for the transmission of this PPDU
+   * \param uid the unique ID of this PPDU
+   */
+  HePpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, Time ppduDuration,
+          WifiPhyBand band, uint64_t uid);
+  /**
+   * Create an MU HE PPDU, storing a map of PSDUs.
+   *
+   * This PPDU can either be UL or DL.
+   *
+   * \param psdus the PHY payloads (PSDUs)
+   * \param txVector the TXVECTOR that was used for this PPDU
+   * \param ppduDuration the transmission duration of this PPDU
+   * \param band the WifiPhyBand used for the transmission of this PPDU
+   * \param uid the unique ID of this PPDU or of the triggering PPDU if this is an HE TB PPDU
+   * \param flag the flag indicating the type of Tx PSD to build
+   */
+  HePpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration,
+          WifiPhyBand band, uint64_t uid, TxPsdFlag flag);
+  /**
+   * Destructor for HePpdu.
+   */
+  virtual ~HePpdu ();
+
+  Time GetTxDuration (void) const override;
+  Ptr<WifiPpdu> Copy (void) const override;
+  WifiPpduType GetType (void) const override;
+  uint16_t GetStaId (void) const override;
+  uint16_t GetTransmissionChannelWidth (void) const override;
+  bool CanBeReceived (uint16_t txCenterFreq, uint16_t p20MinFreq,
+                      uint16_t p20MaxFreq) const override;
+
+  /**
+   * Get the payload of the PPDU.
+   *
+   * \param bssColor the BSS color of the PHY calling this function.
+   * \param staId the STA-ID of the PHY calling this function.
+   * \return the PSDU
+   */
+  Ptr<const WifiPsdu> GetPsdu (uint8_t bssColor, uint16_t staId = SU_STA_ID) const;
+
+  /**
+   * \return the transmit PSD flag set for this PPDU
+   *
+   * \see TxPsdFlag
+   */
+  TxPsdFlag GetTxPsdFlag (void) const;
+
+  /**
+   * \param flag the transmit PSD flag set for this PPDU
+   *
+   * \see TxPsdFlag
+   */
+  void SetTxPsdFlag (TxPsdFlag flag);
+
+protected:
+  std::string PrintPayload (void) const override;
+
+  /**
+   * Return true if the PPDU is a MU PPDU
+   * \return true if the PPDU is a MU PPDU
+   */
+  bool IsMu (void) const;
+  /**
+   * Return true if the PPDU is a DL MU PPDU
+   * \return true if the PPDU is a DL MU PPDU
+   */
+  bool IsDlMu (void) const;
+  /**
+   * Return true if the PPDU is an UL MU PPDU
+   * \return true if the PPDU is an UL MU PPDU
+   */
+  bool IsUlMu (void) const;
+
+  WifiTxVector::HeMuUserInfoMap m_muUserInfos; //!< the HE MU specific per-user information (to be removed once HE-SIG-B headers are implemented)
+
+private:
+  WifiTxVector DoGetTxVector (void) const override;
+
+  /**
+   * Fill in the HE PHY headers.
+   *
+   * \param txVector the TXVECTOR that was used for this PPDU
+   * \param ppduDuration the transmission duration of this PPDU
+   */
+  void SetPhyHeaders (const WifiTxVector& txVector, Time ppduDuration);
+
+  HeSigHeader m_heSig;   //!< the HE-SIG PHY header
+  TxPsdFlag m_txPsdFlag; //!< the transmit power spectral density flag
+}; //class HePpdu
+
+/**
+* \brief Stream insertion operator.
+*
+* \param os the stream
+* \param flag the transmit power spectral density flag
+* \returns a reference to the stream
+*/
+std::ostream& operator<< (std::ostream& os, const HePpdu::TxPsdFlag &flag);
+
+} //namespace ns3
+
+#endif /* HE_PPDU_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-ru.cc ns-3.34/src/wifi/model/he/he-ru.cc
--- ns-3.33/src/wifi/model/he/he-ru.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-ru.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,602 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "he-ru.h"
+#include "ns3/abort.h"
+#include "ns3/assert.h"
+
+namespace ns3 {
+
+const HeRu::SubcarrierGroups HeRu::m_heRuSubcarrierGroups =
+{
+  // RUs in a 20 MHz HE PPDU (Table 28-6)
+  { {20, HeRu::RU_26_TONE}, { /* 1 */ {{-121, -96}},
+      /* 2 */ {{-95, -70}},
+      /* 3 */ {{-68, -43}},
+      /* 4 */ {{-42, -17}},
+      /* 5 */ {{-16, -4}, {4, 16}},
+      /* 6 */ {{17, 42}},
+      /* 7 */ {{43, 68}},
+      /* 8 */ {{70, 95}},
+      /* 9 */ {{96, 121}} } },
+  { {20, HeRu::RU_52_TONE}, { /* 1 */ {{-121, -70}},
+      /* 2 */ {{-68, -17}},
+      /* 3 */ {{17, 68}},
+      /* 4 */ {{70, 121}} } },
+  { {20, HeRu::RU_106_TONE}, { /* 1 */ {{-122, -17}},
+      /* 2 */ {{17, 122}} } },
+  { {20, HeRu::RU_242_TONE}, { /* 1 */ {{-122, -2}, {2, 122}} } },
+  // RUs in a 40 MHz HE PPDU (Table 28-7)
+  { {40, HeRu::RU_26_TONE}, { /* 1 */ {{-243, -218}},
+      /* 2 */ {{-217, -192}},
+      /* 3 */ {{-189, -164}},
+      /* 4 */ {{-163, -138}},
+      /* 5 */ {{-136, -111}},
+      /* 6 */ {{-109, -84}},
+      /* 7 */ {{-83, -58}},
+      /* 8 */ {{-55, -30}},
+      /* 9 */ {{-29, -4}},
+      /* 10 */ {{4, 29}},
+      /* 11 */ {{30, 55}},
+      /* 12 */ {{58, 83}},
+      /* 13 */ {{84, 109}},
+      /* 14 */ {{111, 136}},
+      /* 15 */ {{138, 163}},
+      /* 16 */ {{164, 189}},
+      /* 17 */ {{192, 217}},
+      /* 18 */ {{218, 243}} } },
+  { {40, HeRu::RU_52_TONE}, { /* 1 */ {{-243, -192}},
+      /* 2 */ {{-189, -138}},
+      /* 3 */ {{-109, -58}},
+      /* 4 */ {{-55, -4}},
+      /* 5 */ {{4, 55}},
+      /* 6 */ {{58, 109}},
+      /* 7 */ {{138, 189}},
+      /* 8 */ {{192, 243}} } },
+  { {40, HeRu::RU_106_TONE}, { /* 1 */ {{-243, -138}},
+      /* 2 */ {{-109, -4}},
+      /* 3 */ {{4, 109}},
+      /* 4 */ {{138, 243}} } },
+  { {40, HeRu::RU_242_TONE}, { /* 1 */ {{-244, -3}},
+      /* 2 */ {{3, 244}} } },
+  { {40, HeRu::RU_484_TONE}, { /* 1 */ {{-244, -3}, {3, 244}} } },
+  // RUs in an 80 MHz HE PPDU (Table 28-8)
+  { {80, HeRu::RU_26_TONE}, { /* 1 */ {{-499, -474}},
+      /* 2 */ {{-473, -448}},
+      /* 3 */ {{-445, -420}},
+      /* 4 */ {{-419, -394}},
+      /* 5 */ {{-392, -367}},
+      /* 6 */ {{-365, -340}},
+      /* 7 */ {{-339, -314}},
+      /* 8 */ {{-311, -286}},
+      /* 9 */ {{-285, -260}},
+      /* 10 */ {{-257, -232}},
+      /* 11 */ {{-231, -206}},
+      /* 12 */ {{-203, -178}},
+      /* 13 */ {{-177, -152}},
+      /* 14 */ {{-150, -125}},
+      /* 15 */ {{-123, -98}},
+      /* 16 */ {{-97, -72}},
+      /* 17 */ {{-69, -44}},
+      /* 18 */ {{-43, -18}},
+      /* 19 */ {{-16, -4}, {4, 16}},
+      /* 20 */ {{18, 43}},
+      /* 21 */ {{44, 69}},
+      /* 22 */ {{72, 97}},
+      /* 23 */ {{98, 123}},
+      /* 24 */ {{125, 150}},
+      /* 25 */ {{152, 177}},
+      /* 26 */ {{178, 203}},
+      /* 27 */ {{206, 231}},
+      /* 28 */ {{232, 257}},
+      /* 29 */ {{260, 285}},
+      /* 30 */ {{286, 311}},
+      /* 31 */ {{314, 339}},
+      /* 32 */ {{340, 365}},
+      /* 33 */ {{367, 392}},
+      /* 34 */ {{394, 419}},
+      /* 35 */ {{420, 445}},
+      /* 36 */ {{448, 473}},
+      /* 37 */ {{474, 499}} } },
+  { {80, HeRu::RU_52_TONE}, { /* 1 */ {{-499, -448}},
+      /* 2 */ {{-445, -394}},
+      /* 3 */ {{-365, -314}},
+      /* 4 */ {{-311, -260}},
+      /* 5 */ {{-257, -206}},
+      /* 6 */ {{-203, -152}},
+      /* 7 */ {{-123, -72}},
+      /* 8 */ {{-69, -18}},
+      /* 9 */ {{18, 69}},
+      /* 10 */ {{72, 123}},
+      /* 11 */ {{152, 203}},
+      /* 12 */ {{206, 257}},
+      /* 13 */ {{260, 311}},
+      /* 14 */ {{314, 365}},
+      /* 15 */ {{394, 445}},
+      /* 16 */ {{448, 499}} } },
+  { {80, HeRu::RU_106_TONE}, { /* 1 */ {{-499, -394}},
+      /* 2 */ {{-365, -260}},
+      /* 3 */ {{-257, -152}},
+      /* 4 */ {{-123, -18}},
+      /* 5 */ {{18, 123}},
+      /* 6 */ {{152, 257}},
+      /* 7 */ {{260, 365}},
+      /* 8 */ {{394, 499}} } },
+  { {80, HeRu::RU_242_TONE}, { /* 1 */ {{-500, -259}},
+      /* 2 */ {{-258, -17}},
+      /* 3 */ {{17, 258}},
+      /* 4 */ {{259, 500}} } },
+  { {80, HeRu::RU_484_TONE}, { /* 1 */ {{-500, -17}},
+      /* 2 */ {{17, 500}} } },
+  { {80, HeRu::RU_996_TONE}, { /* 1 */ {{-500, -3}, {3, 500}} } }
+};
+
+
+HeRu::RuSpec::RuSpec ()
+  : m_index (0)    // indicates undefined RU
+{
+}
+
+HeRu::RuSpec::RuSpec (RuType ruType, std::size_t index, bool primary80MHz)
+  : m_ruType (ruType),
+    m_index (index),
+    m_primary80MHz (primary80MHz),
+    m_phyIndex (0)
+{
+  NS_ABORT_MSG_IF (index == 0, "Index cannot be zero");
+}
+
+HeRu::RuType
+HeRu::RuSpec::GetRuType (void) const
+{
+  NS_ABORT_MSG_IF (m_index == 0, "Undefined RU");
+  return m_ruType;
+}
+
+std::size_t
+HeRu::RuSpec::GetIndex (void) const
+{
+  NS_ABORT_MSG_IF (m_index == 0, "Undefined RU");
+  return m_index;
+}
+
+bool
+HeRu::RuSpec::GetPrimary80MHz (void) const
+{
+  NS_ABORT_MSG_IF (m_index == 0, "Undefined RU");
+  return m_primary80MHz;
+}
+
+void
+HeRu::RuSpec::SetPhyIndex (uint16_t bw, uint8_t p20Index)
+{
+  bool primary80IsLower80 = (p20Index < bw / 40);
+
+  if (bw < 160
+      || m_ruType == HeRu::RU_2x996_TONE
+      || (primary80IsLower80 && m_primary80MHz)
+      || (!primary80IsLower80 && !m_primary80MHz))
+    {
+      m_phyIndex = m_index;
+    }
+  else
+    {
+      m_phyIndex = m_index + GetNRus (bw, m_ruType) / 2;
+    }
+}
+
+bool
+HeRu::RuSpec::IsPhyIndexSet (void) const
+{
+  return (m_phyIndex != 0);
+}
+
+std::size_t
+HeRu::RuSpec::GetPhyIndex (void) const
+{
+  NS_ABORT_MSG_IF (m_phyIndex == 0, "RU PHY index not set");
+  return m_phyIndex;
+}
+
+std::size_t
+HeRu::GetNRus (uint16_t bw, RuType ruType)
+{
+  if (bw == 160 && ruType == RU_2x996_TONE)
+    {
+      return 1;
+    }
+
+  // if the bandwidth is 160MHz, search for the number of RUs available
+  // in 80MHz and double the result.
+  auto it = m_heRuSubcarrierGroups.find ({(bw == 160 ? 80 : bw), ruType});
+
+  if (it == m_heRuSubcarrierGroups.end ())
+    {
+      return 0;
+    }
+
+  return (bw == 160 ? 2 : 1) * it->second.size ();
+}
+
+std::vector<HeRu::RuSpec>
+HeRu::GetRusOfType (uint16_t bw, HeRu::RuType ruType)
+{
+  if (ruType == HeRu::RU_2x996_TONE)
+    {
+      NS_ASSERT (bw >= 160);
+      return {{ruType, 1, true}};
+    }
+
+  std::vector<HeRu::RuSpec> ret;
+  std::vector<bool> primary80MHzSet {true};
+
+  if (bw == 160)
+    {
+      primary80MHzSet.push_back (false);
+      bw = 80;
+    }
+
+  for (auto primary80MHz : primary80MHzSet)
+    {
+      for (std::size_t ruIndex = 1; ruIndex <= HeRu::m_heRuSubcarrierGroups.at ({bw, ruType}).size (); ruIndex++)
+        {
+          ret.push_back ({ruType, ruIndex, primary80MHz});
+        }
+    }
+  return ret;
+}
+
+std::vector<HeRu::RuSpec>
+HeRu::GetCentral26TonesRus (uint16_t bw, HeRu::RuType ruType)
+{
+  std::vector<std::size_t> indices;
+
+  if (ruType == HeRu::RU_52_TONE || ruType == HeRu::RU_106_TONE)
+    {
+      if (bw == 20)
+        {
+          indices.push_back (5);
+        }
+      else if (bw == 40)
+        {
+          indices.insert (indices.end (), {5, 14});
+        }
+      else if (bw >= 80)
+        {
+          indices.insert (indices.end (), {5, 14, 19, 24, 33});
+        }
+    }
+  else if (ruType == HeRu::RU_242_TONE || ruType == HeRu::RU_484_TONE)
+    {
+      if (bw >= 80)
+        {
+          indices.push_back (19);
+        }
+    }
+
+  std::vector<HeRu::RuSpec> ret;
+  std::vector<bool> primary80MHzSet {true};
+
+  if (bw == 160)
+    {
+      primary80MHzSet.push_back (false);
+    }
+
+  for (auto primary80MHz : primary80MHzSet)
+    {
+      for (const auto& index : indices)
+        {
+          ret.push_back ({HeRu::RU_26_TONE, index, primary80MHz});
+        }
+    }
+  return ret;
+}
+
+HeRu::SubcarrierGroup
+HeRu::GetSubcarrierGroup (uint16_t bw, RuType ruType, std::size_t phyIndex)
+{
+  if (ruType == HeRu::RU_2x996_TONE) //handle special case of RU covering 160 MHz channel
+    {
+      NS_ABORT_MSG_IF (bw != 160, "2x996 tone RU can only be used on 160 MHz band");
+      return {{-1012, -3}, {3, 1012}};
+    }
+
+  // Determine the shift to apply to tone indices for 160 MHz channel (i.e. -1012 to 1012), since
+  // m_heRuSubcarrierGroups contains indices for lower 80 MHz subchannel (i.e. from -500 to 500).
+  // The phyIndex is used to that aim.
+  std::size_t indexInLower80MHz = phyIndex;
+  std::size_t numRus = GetNRus (bw, ruType);
+  int16_t shift = (bw == 160) ? -512 : 0;
+  if (bw == 160 && phyIndex > (numRus / 2))
+    {
+      // The provided index is that of the upper 80 MHz subchannel
+      indexInLower80MHz = phyIndex - (numRus / 2);
+      shift = 512;
+    }
+
+  auto it = m_heRuSubcarrierGroups.find ({(bw == 160 ? 80 : bw), ruType});
+
+  NS_ABORT_MSG_IF (it == m_heRuSubcarrierGroups.end (), "RU not found");
+  NS_ABORT_MSG_IF (indexInLower80MHz > it->second.size (), "RU index not available");
+
+  SubcarrierGroup group = it->second.at (indexInLower80MHz - 1);
+  if (bw == 160)
+    {
+      for (auto & range : group)
+        {
+          range.first += shift;
+          range.second += shift;
+        }
+    }
+  return group;
+}
+
+bool
+HeRu::DoesOverlap (uint16_t bw, RuSpec ru, const std::vector<RuSpec> &v)
+{
+  // A 2x996-tone RU spans 160 MHz, hence it overlaps with any other RU
+  if (bw == 160 && ru.GetRuType () == RU_2x996_TONE && !v.empty ())
+    {
+      return true;
+    }
+
+  // This function may be called by the MAC layer, hence the PHY index may have
+  // not been set yet. Hence, we pass the "MAC" index to GetSubcarrierGroup instead
+  // of the PHY index. This is fine because we compare the primary 80 MHz bands of
+  // the two RUs below.
+  SubcarrierGroup rangesRu = GetSubcarrierGroup (bw, ru.GetRuType (), ru.GetIndex ());
+  for (auto& p : v)
+    {
+      if (ru.GetPrimary80MHz () != p.GetPrimary80MHz ())
+        {
+          // the two RUs are located in distinct 80MHz bands
+          continue;
+        }
+      for (const auto& rangeRu : rangesRu)
+        {
+          SubcarrierGroup rangesP = GetSubcarrierGroup (bw, p.GetRuType (), p.GetIndex ());
+          for (auto& rangeP : rangesP)
+            {
+              if (rangeP.second >= rangeRu.first && rangeRu.second >= rangeP.first)
+                {
+                  return true;
+                }
+            }
+        }
+    }
+  return false;
+}
+
+bool
+HeRu::DoesOverlap (uint16_t bw, RuSpec ru, const SubcarrierGroup &toneRanges)
+{
+  for (const auto & range : toneRanges)
+    {
+      if (bw == 160 && ru.GetRuType () == RU_2x996_TONE)
+        {
+          return true;
+        }
+
+      SubcarrierGroup rangesRu = GetSubcarrierGroup (bw, ru.GetRuType (), ru.GetPhyIndex ());
+      for (auto& r : rangesRu)
+        {
+          if (range.second >= r.first && r.second >= range.first)
+            {
+              return true;
+            }
+        }
+    }
+  return false;
+}
+
+HeRu::RuSpec
+HeRu::FindOverlappingRu (uint16_t bw, RuSpec referenceRu, RuType searchedRuType)
+{
+  std::size_t numRus = HeRu::GetNRus (bw, searchedRuType);
+
+  std::size_t numRusPer80Mhz;
+  std::vector<bool> primary80MhzFlags;
+  if (bw == 160)
+    {
+      primary80MhzFlags.push_back (true);
+      primary80MhzFlags.push_back (false);
+      numRusPer80Mhz = (searchedRuType == HeRu::RU_2x996_TONE ? 1 : numRus / 2);
+    }
+  else
+    {
+      primary80MhzFlags.push_back (referenceRu.GetPrimary80MHz ());
+      numRusPer80Mhz = numRus;
+    }
+
+  for (const auto primary80MHz : primary80MhzFlags)
+    {
+      std::size_t index = 1;
+      for (std::size_t indexPer80Mhz = 1; indexPer80Mhz <= numRusPer80Mhz; ++indexPer80Mhz, ++index)
+        {
+          RuSpec searchedRu (searchedRuType, index, primary80MHz);
+          if (DoesOverlap (bw, referenceRu, {searchedRu}))
+            {
+              return searchedRu;
+            }
+        }
+    }
+  NS_ABORT_MSG ("The searched RU type " << searchedRuType << " was not found for bw=" << bw << " and referenceRu=" << referenceRu);
+  return HeRu::RuSpec ();
+}
+
+std::ostream& operator<< (std::ostream& os, const HeRu::RuType &ruType)
+{
+  switch (ruType)
+    {
+      case HeRu::RU_26_TONE:
+        os << "26-tones";
+        break;
+      case HeRu::RU_52_TONE:
+        os << "52-tones";
+        break;
+      case HeRu::RU_106_TONE:
+        os << "106-tones";
+        break;
+      case HeRu::RU_242_TONE:
+        os << "242-tones";
+        break;
+      case HeRu::RU_484_TONE:
+        os << "484-tones";
+        break;
+      case HeRu::RU_996_TONE:
+        os << "996-tones";
+        break;
+      case HeRu::RU_2x996_TONE:
+        os << "2x996-tones";
+        break;
+      default:
+        NS_FATAL_ERROR ("Unknown RU type");
+    }
+  return os;
+}
+
+std::ostream& operator<< (std::ostream& os, const HeRu::RuSpec &ru)
+{
+  os << "RU{" << ru.GetRuType () << "/" << ru.GetIndex () << "/" << (ru.GetPrimary80MHz () ? "primary80MHz" : "secondary80MHz");
+  if (ru.IsPhyIndexSet ())
+    {
+      os << "[" << ru.GetPhyIndex () << "]";
+    }
+  os << "}";
+  return os;
+}
+
+uint16_t
+HeRu::GetBandwidth (RuType ruType)
+{
+  switch (ruType)
+    {
+      case RU_26_TONE:
+        return 2;
+      case RU_52_TONE:
+        return 4;
+      case RU_106_TONE:
+        return 8;
+      case RU_242_TONE:
+        return 20;
+      case RU_484_TONE:
+        return 40;
+      case RU_996_TONE:
+        return 80;
+      case RU_2x996_TONE:
+        return 160;
+      default:
+        NS_ABORT_MSG ("RU type " << ruType << " not found");
+        return 0;
+    }
+}
+
+HeRu::RuType
+HeRu::GetRuType (uint16_t bandwidth)
+{
+  switch (bandwidth)
+    {
+      case 2:
+        return RU_26_TONE;
+      case 4:
+        return RU_52_TONE;
+      case 8:
+        return RU_106_TONE;
+      case 20:
+        return RU_242_TONE;
+      case 40:
+        return RU_484_TONE;
+      case 80:
+        return RU_996_TONE;
+      case 160:
+        return RU_2x996_TONE;
+      default:
+        NS_ABORT_MSG (bandwidth << " MHz bandwidth not found");
+        return RU_242_TONE;
+    }
+}
+
+HeRu::RuType
+HeRu::GetEqualSizedRusForStations (uint16_t bandwidth, std::size_t& nStations,
+                                   std::size_t& nCentral26TonesRus)
+{
+  RuType ruType;
+  uint8_t nRusAssigned = 0;
+
+  // iterate over all the available RU types
+  for (auto& ru : m_heRuSubcarrierGroups)
+    {
+      if (ru.first.first == bandwidth && ru.second.size () <= nStations)
+        {
+          ruType = ru.first.second;
+          nRusAssigned = ru.second.size ();
+          break;
+        }
+      else if (bandwidth == 160 && ru.first.first == 80 && (2 * ru.second.size () <= nStations))
+        {
+          ruType = ru.first.second;
+          nRusAssigned = 2 * ru.second.size ();
+          break;
+        }
+    }
+  if (nRusAssigned == 0)
+    {
+      NS_ABORT_IF (bandwidth != 160 || nStations != 1);
+      nRusAssigned = 1;
+      ruType = RU_2x996_TONE;
+    }
+
+  nStations = nRusAssigned;
+
+  switch (ruType)
+    {
+      case RU_52_TONE:
+      case RU_106_TONE:
+        if (bandwidth == 20)
+          {
+            nCentral26TonesRus = 1;
+          }
+        else if (bandwidth == 40)
+          {
+            nCentral26TonesRus = 2;
+          }
+        else
+          {
+            nCentral26TonesRus = 5;
+          }
+        break;
+      case RU_242_TONE:
+      case RU_484_TONE:
+        nCentral26TonesRus = (bandwidth >= 80 ? 1 : 0);
+        break;
+      default:
+        nCentral26TonesRus = 0;
+    }
+
+  if (bandwidth == 160)
+    {
+      nCentral26TonesRus *= 2;
+    }
+
+  return ruType;
+}
+
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/he-ru.h ns-3.34/src/wifi/model/he/he-ru.h
--- ns-3.33/src/wifi/model/he/he-ru.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/he-ru.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,277 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef HE_RU_H
+#define HE_RU_H
+
+#include <map>
+#include <vector>
+#include <cstdint>
+#include <ostream>
+
+namespace ns3 {
+
+
+/**
+ * This class stores the subcarrier groups of all the available HE RUs.
+ */
+class HeRu
+{
+public:
+  /**
+   * The different HE Resource Unit (RU) types.
+   */
+  enum RuType
+  {
+    RU_26_TONE = 0,
+    RU_52_TONE,
+    RU_106_TONE,
+    RU_242_TONE,
+    RU_484_TONE,
+    RU_996_TONE,
+    RU_2x996_TONE
+  };
+
+  /// (lowest index, highest index) pair defining a subcarrier range
+  typedef std::pair<int16_t, int16_t> SubcarrierRange;
+
+  /// a vector of subcarrier ranges defining a subcarrier group
+  typedef std::vector<SubcarrierRange> SubcarrierGroup;
+
+
+  /**
+   * RU Specification. Stores the information carried by the RU Allocation subfield
+   * of the User Info field of Trigger frames (see 9.3.1.22.1 of 802.11ax D8.0).
+   * Note that primary80MHz must be true if ruType is RU_2x996_TONE.
+   * Internally, this class also stores the RU PHY index (ranging from 1 to the number
+   * of RUs of the given type in a channel of the considered width), so that this class
+   * contains all the information needed to locate the RU in a 160 MHz channel.
+   */
+  class RuSpec
+  {
+  public:
+    /**
+     * Default constructor
+     */
+    RuSpec ();
+    /**
+     * Constructor
+     *
+     * \param ruType the RU type
+     * \param index the RU index (starting at 1)
+     * \param primary80MHz whether the RU is allocated in the primary 80MHz channel
+     */
+    RuSpec (RuType ruType, std::size_t index, bool primary80MHz);
+
+    /**
+     * Get the RU type
+     *
+     * \return the RU type
+     */
+    RuType GetRuType (void) const;
+    /**
+     * Get the RU index
+     *
+     * \return the RU index
+     */
+    std::size_t GetIndex (void) const;
+    /**
+     * Get the primary 80 MHz flag
+     *
+     * \return true if the RU is in the primary 80 MHz channel and false otherwise
+     */
+    bool GetPrimary80MHz (void) const;
+    /**
+     * Set the RU PHY index
+     *
+     * \param bw the width of the channel of which the RU is part (in MHz)
+     * \param p20Index the index of the primary20 channel
+     */
+    void SetPhyIndex (uint16_t bw, uint8_t p20Index);
+    /**
+     * Return true if the RU PHY index has been set, false otherwise
+     *
+     * \return true if the RU PHY index has been set, false otherwise
+     */
+    bool IsPhyIndexSet (void) const;
+    /**
+     * Get the RU PHY index
+     *
+     * \return the RU PHY index
+     */
+    std::size_t GetPhyIndex (void) const;
+
+  private:
+    RuType m_ruType;         //!< RU type
+    std::size_t m_index;     /**< RU index (starting at 1) as defined by Tables 27-7
+                                  to 27-9 of 802.11ax D8.0 */
+    bool m_primary80MHz;     //!< true if the RU is allocated in the primary 80MHz channel
+    std::size_t m_phyIndex;  /**< the RU PHY index, which is used to indicate whether an
+                                  RU is located in the lower half or the higher half of
+                                  a 160MHz channel. For channel widths less than 160MHz,
+                                  the RU PHY index equals the RU index */
+  };
+
+
+  /**
+   * Get the number of distinct RUs of the given type (number of tones)
+   * available in a HE PPDU of the given bandwidth.
+   *
+   * \param bw the bandwidth (MHz) of the HE PPDU (20, 40, 80, 160)
+   * \param ruType the RU type (number of tones)
+   * \return the number of distinct RUs available
+   */
+  static std::size_t GetNRus (uint16_t bw, RuType ruType);
+
+  /**
+   * Get the set of distinct RUs of the given type (number of tones)
+   * available in a HE PPDU of the given bandwidth.
+   *
+   * \param bw the bandwidth (MHz) of the HE PPDU (20, 40, 80, 160)
+   * \param ruType the RU type (number of tones)
+   * \return the set of distinct RUs available
+   */
+  static std::vector<HeRu::RuSpec> GetRusOfType (uint16_t bw, HeRu::RuType ruType);
+
+  /**
+   * Get the set of 26-tone RUs that can be additionally allocated if the given
+   * bandwidth is split in RUs of the given type.
+   *
+   * \param bw the bandwidth (MHz) of the HE PPDU (20, 40, 80, 160)
+   * \param ruType the RU type (number of tones)
+   * \return the set of 26-tone RUs that can be additionally allocated
+   */
+  static std::vector<HeRu::RuSpec> GetCentral26TonesRus (uint16_t bw, HeRu::RuType ruType);
+
+  /**
+   * Get the subcarrier group of the RU having the given PHY index among all the
+   * RUs of the given type (number of tones) available in a HE PPDU of the
+   * given bandwidth. A subcarrier group is defined as one or more pairs
+   * indicating the lowest frequency index and the highest frequency index.
+   * Note that for channel width of 160 MHz the returned range is relative to
+   * the 160 MHz channel (i.e. -1012 to 1012). The PHY index parameter is used to
+   * distinguish between lower and higher 80 MHz subchannels.
+   *
+   * \param bw the bandwidth (MHz) of the HE PPDU (20, 40, 80, 160)
+   * \param ruType the RU type (number of tones)
+   * \param phyIndex the PHY index (starting at 1) of the RU
+   * \return the subcarrier range of the specified RU
+   */
+  static SubcarrierGroup GetSubcarrierGroup (uint16_t bw, RuType ruType, std::size_t phyIndex);
+
+  /**
+   * Check whether the given RU overlaps with the given set of RUs.
+   * Note that for channel width of 160 MHz the returned range is relative to
+   * the 160 MHz channel (i.e. -1012 to 1012).
+   *
+   * \param bw the bandwidth (MHz) of the HE PPDU (20, 40, 80, 160)
+   * \param ru the given RU allocation
+   * \param v the given set of RUs
+   * \return true if the given RU overlaps with the given set of RUs.
+   */
+  static bool DoesOverlap (uint16_t bw, RuSpec ru, const std::vector<RuSpec> &v);
+
+  /**
+   * Check whether the given RU overlaps with the given tone ranges.
+   * Note that for channel width of 160 MHz the returned range is relative to
+   * the 160 MHz channel (i.e. -1012 to 1012).
+   *
+   * \param bw the bandwidth (MHz) of the HE PPDU (20, 40, 80, 160)
+   * \param ru the given RU allocation
+   * \param toneRanges the given set of tone ranges
+   * \return true if the given RU overlaps with the given set of tone ranges.
+   */
+  static bool DoesOverlap (uint16_t bw, RuSpec ru, const SubcarrierGroup &toneRanges);
+
+  /**
+   * Find the RU allocation of the given RU type overlapping the given
+   * reference RU allocation.
+   * Note that an assert is generated if the RU allocation is not found.
+   *
+   * \param bw the bandwidth (MHz) of the HE PPDU (20, 40, 80, 160)
+   * \param referenceRu the reference RU allocation
+   * \param searchedRuType the searched RU type
+   * \return the searched RU allocation.
+   */
+  static RuSpec FindOverlappingRu (uint16_t bw, RuSpec referenceRu, RuType searchedRuType);
+
+  /**
+   * Get the approximate bandwidth occupied by a RU.
+   *
+   * \param ruType the RU type
+   * \return the approximate bandwidth (in MHz) occupied by the RU
+   */
+  static uint16_t GetBandwidth (RuType ruType);
+
+  /**
+   * Get the RU corresponding to the approximate bandwidth.
+   *
+   * \param bandwidth the approximate bandwidth (in MHz) occupied by the RU
+   * \return the RU type
+   */
+  static RuType GetRuType (uint16_t bandwidth);
+
+  /**
+   * Given the channel bandwidth and the number of stations candidate for being
+   * assigned an RU, maximize the number of candidate stations that can be assigned
+   * an RU subject to the constraint that all the stations must be assigned an RU
+   * of the same size (in terms of number of tones).
+   *
+   * \param bandwidth the channel bandwidth in MHz
+   * \param nStations the number of candidate stations. On return, it is set to
+   *                  the number of stations that are assigned an RU
+   * \param[out] nCentral26TonesRus the number of additional 26-tone RUs that can be
+   *                                allocated if the returned RU size is greater than 26 tones
+   * \return the RU type
+   */
+  static RuType GetEqualSizedRusForStations (uint16_t bandwidth, std::size_t& nStations,
+                                             std::size_t& nCentral26TonesRus);
+
+  /// (bandwidth, number of tones) pair
+  typedef std::pair<uint8_t, RuType> BwTonesPair;
+
+  /// map (bandwidth, number of tones) pairs to the group of subcarrier ranges
+  typedef std::map<BwTonesPair, std::vector<SubcarrierGroup> > SubcarrierGroups;
+
+  /// Subcarrier groups for all RUs (with indices being applicable to primary 80 MHz channel)
+  static const SubcarrierGroups  m_heRuSubcarrierGroups;
+};
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the stream
+ * \param ruType the RU type
+ * \returns a reference to the stream
+ */
+std::ostream& operator<< (std::ostream& os, const HeRu::RuType &ruType);
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the stream
+ * \param ru the RU
+ * \returns a reference to the stream
+ */
+std::ostream& operator<< (std::ostream& os, const HeRu::RuSpec &ru);
+
+} //namespace ns3
+
+#endif /* HE_RU_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/multi-user-scheduler.cc ns-3.34/src/wifi/model/he/multi-user-scheduler.cc
--- ns-3.33/src/wifi/model/he/multi-user-scheduler.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/multi-user-scheduler.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,185 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "ns3/abort.h"
+#include "multi-user-scheduler.h"
+#include "ns3/qos-txop.h"
+#include "he-configuration.h"
+#include "he-frame-exchange-manager.h"
+#include "ns3/wifi-protection.h"
+#include "ns3/wifi-acknowledgment.h"
+#include "ns3/wifi-mac-trailer.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("MultiUserScheduler");
+
+NS_OBJECT_ENSURE_REGISTERED (MultiUserScheduler);
+
+TypeId
+MultiUserScheduler::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::MultiUserScheduler")
+    .SetParent<Object> ()
+    .SetGroupName ("Wifi")
+  ;
+  return tid;
+}
+
+MultiUserScheduler::MultiUserScheduler ()
+{
+}
+
+MultiUserScheduler::~MultiUserScheduler ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+void
+MultiUserScheduler::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_apMac = 0;
+  m_heFem = 0;
+  m_edca = 0;
+  m_dlInfo.psduMap.clear ();
+  m_dlInfo.txParams.Clear ();
+  m_ulInfo.txParams.Clear ();
+  m_ulInfo.trigger = 0;
+  Object::DoDispose ();
+}
+
+void
+MultiUserScheduler::NotifyNewAggregate ()
+{
+  NS_LOG_FUNCTION (this);
+  if (m_apMac == 0)
+    {
+      Ptr<ApWifiMac> apMac = this->GetObject<ApWifiMac> ();
+      //verify that it's a valid AP mac and that
+      //the AP mac was not set before
+      if (apMac != 0)
+        {
+          this->SetWifiMac (apMac);
+        }
+    }
+  Object::NotifyNewAggregate ();
+}
+
+void
+MultiUserScheduler::DoInitialize (void)
+{
+  // compute the size in bytes of 8 QoS Null frames. It can be used by subclasses
+  // when responding to a BSRP Trigger Frame
+  WifiMacHeader header;
+  header.SetType (WIFI_MAC_QOSDATA_NULL);
+  header.SetDsTo ();
+  header.SetDsNotFrom ();
+  uint32_t headerSize = header.GetSerializedSize ();
+
+  m_sizeOf8QosNull = 0;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      m_sizeOf8QosNull = MpduAggregator::GetSizeIfAggregated (headerSize + WIFI_MAC_FCS_LENGTH, m_sizeOf8QosNull);
+    }
+}
+
+void
+MultiUserScheduler::SetWifiMac (Ptr<ApWifiMac> mac)
+{
+  NS_LOG_FUNCTION (this << mac);
+  m_apMac = mac;
+
+  // When VHT DL MU-MIMO will be supported, we will have to lower this requirement
+  // and allow a Multi-user scheduler to be installed on a VHT AP.
+  NS_ABORT_MSG_IF (m_apMac == 0 || m_apMac->GetHeConfiguration () == 0,
+                   "MultiUserScheduler can only be installed on HE APs");
+
+  m_heFem = DynamicCast<HeFrameExchangeManager> (m_apMac->GetFrameExchangeManager ());
+  m_heFem->SetMultiUserScheduler (this);
+}
+
+Ptr<WifiRemoteStationManager>
+MultiUserScheduler::GetWifiRemoteStationManager (void) const
+{
+  return m_apMac->GetWifiRemoteStationManager ();
+}
+
+MultiUserScheduler::TxFormat
+MultiUserScheduler::NotifyAccessGranted (Ptr<QosTxop> edca, Time availableTime, bool initialFrame)
+{
+  NS_LOG_FUNCTION (this << edca << availableTime << initialFrame);
+
+  m_edca = edca;
+  m_availableTime = availableTime;
+  m_initialFrame = initialFrame;
+
+  TxFormat txFormat = SelectTxFormat ();
+
+  if (txFormat == DL_MU_TX)
+    {
+      m_dlInfo = ComputeDlMuInfo ();
+    }
+  else if (txFormat == UL_MU_TX)
+    {
+      NS_ABORT_MSG_IF (m_heFem == 0, "UL MU PPDUs are only supported by HE APs");
+      m_ulInfo = ComputeUlMuInfo ();
+    }
+
+  if (txFormat != NO_TX)
+    {
+      m_lastTxFormat = txFormat;
+    }
+  return txFormat;
+}
+
+MultiUserScheduler::TxFormat
+MultiUserScheduler::GetLastTxFormat (void) const
+{
+  return m_lastTxFormat;
+}
+
+MultiUserScheduler::DlMuInfo&
+MultiUserScheduler::GetDlMuInfo (void)
+{
+  NS_ABORT_MSG_IF (m_lastTxFormat != DL_MU_TX, "Next transmission is not DL MU");
+
+#ifdef NS3_BUILD_PROFILE_DEBUG
+  // check that all the addressed stations support HE
+  for (auto& psdu : m_dlInfo.psduMap)
+    {
+      NS_ABORT_MSG_IF (!GetWifiRemoteStationManager ()->GetHeSupported (psdu.second->GetAddr1 ()),
+                       "Station " << psdu.second->GetAddr1 () << " does not support HE");
+    }
+#endif
+
+  return m_dlInfo;
+}
+
+MultiUserScheduler::UlMuInfo&
+MultiUserScheduler::GetUlMuInfo (void)
+{
+  NS_ABORT_MSG_IF (m_lastTxFormat != UL_MU_TX, "Next transmission is not UL MU");
+
+  return m_ulInfo;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/multi-user-scheduler.h ns-3.34/src/wifi/model/he/multi-user-scheduler.h
--- ns-3.33/src/wifi/model/he/multi-user-scheduler.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/multi-user-scheduler.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,178 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef MULTI_USER_SCHEDULER_H
+#define MULTI_USER_SCHEDULER_H
+
+#include "ns3/object.h"
+#include "he-ru.h"
+#include "ns3/ctrl-headers.h"
+#include "ns3/ap-wifi-mac.h"
+#include "ns3/wifi-mac-queue.h"
+#include "ns3/wifi-tx-parameters.h"
+#include "ns3/wifi-remote-station-manager.h"
+#include <unordered_map>
+
+namespace ns3 {
+
+class HeFrameExchangeManager;
+
+typedef std::unordered_map <uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */> WifiPsduMap;
+
+/**
+ * \ingroup wifi
+ *
+ * MultiUserScheduler is an abstract base class defining the API that APs
+ * supporting at least VHT can use to determine the format of their next transmission.
+ * VHT APs can only transmit DL MU PPDUs by using MU-MIMO, while HE APs can
+ * transmit both DL MU PPDUs and UL MU PPDUs by using OFDMA in addition to MU-MIMO.
+ *
+ * However, given that DL MU-MIMO is not yet supported, a MultiUserScheduler can
+ * only be aggregated to HE APs.
+ */
+class MultiUserScheduler : public Object
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  MultiUserScheduler ();
+  virtual ~MultiUserScheduler ();
+
+  /// Enumeration of the possible transmission formats
+  enum TxFormat
+  {
+    NO_TX = 0,
+    SU_TX,
+    DL_MU_TX,
+    UL_MU_TX
+  };
+
+  /// Information to be provided in case of DL MU transmission
+  struct DlMuInfo
+  {
+    WifiPsduMap psduMap;            //!< the DL MU PPDU to transmit
+    WifiTxParameters txParams;      //!< the transmission parameters
+  };
+
+  /// Information to be provided in case of UL MU transmission
+  struct UlMuInfo
+  {
+    Ptr<WifiMacQueueItem> trigger;  //!< the Trigger frame used to solicit TB PPDUs
+    Time tbPpduDuration;            //!< the duration of the solicited TB PPDU
+    WifiTxParameters txParams;      //!< the transmission parameters for the Trigger Frame
+  };
+
+  /**
+   * Notify the Multi-user Scheduler that the given AC of the AP gained channel
+   * access. The Multi-user Scheduler determines the format of the next transmission.
+   *
+   * \param edca the EDCAF which has been granted the opportunity to transmit
+   * \param availableTime the amount of time allowed for the frame exchange. Pass
+   *                      Time::Min() in case the TXOP limit is null
+   * \param initialFrame true if the frame being transmitted is the initial frame
+   *                     of the TXOP. This is used to determine whether the TXOP
+   *                     limit can be exceeded
+   * \return the format of the next transmission
+   */
+  TxFormat NotifyAccessGranted (Ptr<QosTxop> edca, Time availableTime, bool initialFrame);
+
+  /**
+   * Get the information required to perform a DL MU transmission. Note
+   * that this method can only be called if GetTxFormat returns DL_MU_TX.
+   *
+   * \return the information required to perform a DL MU transmission
+   */
+  DlMuInfo& GetDlMuInfo (void);
+
+  /**
+   * Get the information required to solicit an UL MU transmission. Note
+   * that this method can only be called if GetTxFormat returns UL_MU_TX.
+   *
+   * \return the information required to solicit an UL MU transmission
+   */
+  UlMuInfo& GetUlMuInfo (void);
+
+protected:
+  /**
+   * Get the station manager attached to the AP.
+   *
+   * \return the station manager attached to the AP
+   */
+  Ptr<WifiRemoteStationManager> GetWifiRemoteStationManager (void) const;
+
+  /**
+   * Get the format of the last transmission, as determined by the last call
+   * to NotifyAccessGranted that did not return NO_TX.
+   *
+   * \return the format of the last transmission
+   */
+  TxFormat GetLastTxFormat (void) const;
+
+  void DoDispose (void) override;
+  void NotifyNewAggregate (void) override;
+  void DoInitialize (void) override;
+
+  Ptr<ApWifiMac> m_apMac;                //!< the AP wifi MAC
+  Ptr<HeFrameExchangeManager> m_heFem;   //!< HE Frame Exchange Manager
+  Ptr<QosTxop> m_edca;                   //!< the AC that gained channel access
+  Time m_availableTime;                  //!< the time available for frame exchange
+  bool m_initialFrame;                   //!< true if a TXOP is being started
+  uint32_t m_sizeOf8QosNull;             //!< size in bytes of 8 QoS Null frames
+
+private:
+  /**
+   * Set the wifi MAC. Note that it must be the MAC of an HE AP.
+   *
+   * \param mac the AP wifi MAC
+   */
+  void SetWifiMac (Ptr<ApWifiMac> mac);
+
+  /**
+   * Select the format of the next transmission.
+   *
+   * \return the format of the next transmission
+   */
+  virtual TxFormat SelectTxFormat (void) = 0;
+
+  /**
+   * Compute the information required to perform a DL MU transmission.
+   *
+   * \return the information required to perform a DL MU transmission
+   */
+  virtual DlMuInfo ComputeDlMuInfo (void) = 0;
+
+  /**
+   * Prepare the information required to solicit an UL MU transmission.
+   *
+   * \return the information required to solicit an UL MU transmission
+   */
+  virtual UlMuInfo ComputeUlMuInfo (void) = 0;
+
+  TxFormat m_lastTxFormat {NO_TX};       //!< the format of last transmission
+  DlMuInfo m_dlInfo;                     //!< information required to perform a DL MU transmission
+  UlMuInfo m_ulInfo;                     //!< information required to solicit an UL MU transmission
+};
+
+} //namespace ns3
+
+#endif /* MULTI_USER_SCHEDULER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/mu-snr-tag.cc ns-3.34/src/wifi/model/he/mu-snr-tag.cc
--- ns-3.33/src/wifi/model/he/mu-snr-tag.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/mu-snr-tag.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,113 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "mu-snr-tag.h"
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (MuSnrTag);
+
+TypeId
+MuSnrTag::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::MuSnrTag")
+    .SetParent<Tag> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<MuSnrTag> ()
+  ;
+  return tid;
+}
+
+TypeId
+MuSnrTag::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+MuSnrTag::MuSnrTag ()
+{
+}
+
+void
+MuSnrTag::Reset (void)
+{
+  m_snrMap.clear ();
+}
+
+void
+MuSnrTag::Set (uint16_t staId, double snr)
+{
+  m_snrMap[staId] = snr;
+}
+
+bool
+MuSnrTag::IsPresent (uint16_t staId) const
+{
+  return (m_snrMap.find (staId) != m_snrMap.end ());
+}
+
+double
+MuSnrTag::Get (uint16_t staId) const
+{
+  NS_ASSERT (IsPresent (staId));
+  return m_snrMap.at (staId);
+}
+
+uint32_t
+MuSnrTag::GetSerializedSize (void) const
+{
+  return (sizeof (uint16_t) + sizeof (double)) * m_snrMap.size () + 1;
+}
+
+void
+MuSnrTag::Serialize (TagBuffer i) const
+{
+  i.WriteU8 (m_snrMap.size ());
+
+  for (const auto& staIdSnrPair : m_snrMap)
+    {
+      i.WriteU16 (staIdSnrPair.first);
+      i.WriteDouble (staIdSnrPair.second);
+    }
+}
+
+void
+MuSnrTag::Deserialize (TagBuffer i)
+{
+  uint8_t n = i.ReadU8 ();
+  for (uint8_t j = 0; j < n; j++)
+    {
+      uint16_t staId = i.ReadU16 ();
+      double snr = i.ReadDouble ();
+      m_snrMap.insert ({staId, snr});
+    }
+}
+
+void
+MuSnrTag::Print (std::ostream &os) const
+{
+  for (const auto& staIdSnrPair : m_snrMap)
+    {
+      os << "{STA-ID=" << staIdSnrPair.first << " Snr=" << staIdSnrPair.second << "} ";
+    }
+  os << std::endl;
+}
+
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/mu-snr-tag.h ns-3.34/src/wifi/model/he/mu-snr-tag.h
--- ns-3.33/src/wifi/model/he/mu-snr-tag.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/mu-snr-tag.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,88 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef MU_SNR_TAG_H
+#define MU_SNR_TAG_H
+
+#include "ns3/tag.h"
+#include <map>
+
+namespace ns3 {
+
+/**
+ * \ingroup wifi
+ *
+ * A tag to be attached to a response to a multi-user UL frame, that carries the SNR
+ * values with which the individual frames have been received.
+ */
+class MuSnrTag : public Tag
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  TypeId GetInstanceTypeId (void) const override;
+
+  /**
+   * Create an empty MuSnrTag
+   */
+  MuSnrTag ();
+
+  uint32_t GetSerializedSize (void) const override;
+  void Serialize (TagBuffer i) const override;
+  void Deserialize (TagBuffer i) override;
+  void Print (std::ostream &os) const override;
+
+  /**
+   * Reset the content of the tag.
+   */
+  void Reset (void);
+  /**
+   * Set the SNR for the given sender to the given value.
+   *
+   * \param staId the STA-ID of the given sender
+   * \param snr the value of the SNR to set in linear scale
+   */
+  void Set (uint16_t staId, double snr);
+  /**
+   * Return true if the SNR value for the given STA-ID is present
+   *
+   * \param staId the STA-ID
+   * \return true if the SNR value for the given STA-ID is present
+   */
+  bool IsPresent (uint16_t staId) const;
+  /**
+   * Return the SNR value for the given sender.
+   *
+   * \param staId the STA-ID of the given sender
+   * \return the SNR value in linear scale
+   */
+  double Get (uint16_t staId) const;
+
+
+private:
+  std::map<uint16_t, double> m_snrMap;     //!< Map containing (STA-ID, SNR) pairs
+};
+
+}
+
+#endif /* MU_SNR_TAG_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/obss-pd-algorithm.cc ns-3.34/src/wifi/model/he/obss-pd-algorithm.cc
--- ns-3.33/src/wifi/model/he/obss-pd-algorithm.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/obss-pd-algorithm.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,109 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "ns3/log.h"
+#include "ns3/double.h"
+#include "obss-pd-algorithm.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/wifi-phy.h"
+#include "he-phy.h"
+#include "ns3/wifi-utils.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("ObssPdAlgorithm");
+NS_OBJECT_ENSURE_REGISTERED (ObssPdAlgorithm);
+
+TypeId
+ObssPdAlgorithm::GetTypeId (void)
+{
+  static ns3::TypeId tid = ns3::TypeId ("ns3::ObssPdAlgorithm")
+    .SetParent<Object> ()
+    .SetGroupName ("Wifi")
+    .AddAttribute ("ObssPdLevel",
+                   "The current OBSS PD level (dBm).",
+                   DoubleValue (-82.0),
+                   MakeDoubleAccessor (&ObssPdAlgorithm::m_obssPdLevel),
+                   MakeDoubleChecker<double> (-101, -62))
+    .AddAttribute ("ObssPdLevelMin",
+                   "Minimum value (dBm) of OBSS PD level.",
+                   DoubleValue (-82.0),
+                   MakeDoubleAccessor (&ObssPdAlgorithm::m_obssPdLevelMin),
+                   MakeDoubleChecker<double> (-101, -62))
+    .AddAttribute ("ObssPdLevelMax",
+                   "Maximum value (dBm) of OBSS PD level.",
+                   DoubleValue (-62.0),
+                   MakeDoubleAccessor (&ObssPdAlgorithm::m_obssPdLevelMax),
+                   MakeDoubleChecker<double> (-101, -62))
+    .AddAttribute ("TxPowerRefSiso",
+                   "The SISO reference TX power level (dBm).",
+                   DoubleValue (21),
+                   MakeDoubleAccessor (&ObssPdAlgorithm::m_txPowerRefSiso),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("TxPowerRefMimo",
+                   "The MIMO reference TX power level (dBm).",
+                   DoubleValue (25),
+                   MakeDoubleAccessor (&ObssPdAlgorithm::m_txPowerRefMimo),
+                   MakeDoubleChecker<double> ())
+    .AddTraceSource ("Reset", "Trace CCA Reset event",
+                     MakeTraceSourceAccessor (&ObssPdAlgorithm::m_resetEvent),
+                     "ns3::ObssPdAlgorithm::ResetTracedCallback")
+  ;
+  return tid;
+}
+
+void
+ObssPdAlgorithm::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_device = 0;
+}
+
+void
+ObssPdAlgorithm::ConnectWifiNetDevice (const Ptr<WifiNetDevice> device)
+{
+  NS_LOG_FUNCTION (this << device);
+  m_device = device;
+}
+
+void
+ObssPdAlgorithm::ResetPhy (HeSigAParameters params)
+{
+  double txPowerMaxSiso = 0;
+  double txPowerMaxMimo = 0;
+  bool powerRestricted = false;
+  // Fetch my BSS color
+  Ptr<HeConfiguration> heConfiguration = m_device->GetHeConfiguration ();
+  NS_ASSERT (heConfiguration);
+  uint8_t bssColor = heConfiguration->GetBssColor ();
+  NS_LOG_DEBUG ("My BSS color " << (uint16_t) bssColor << " received frame " << (uint16_t) params.bssColor);
+
+  Ptr<WifiPhy> phy = m_device->GetPhy ();
+  if ((m_obssPdLevel > m_obssPdLevelMin) && (m_obssPdLevel <= m_obssPdLevelMax))
+    {
+      txPowerMaxSiso = m_txPowerRefSiso - (m_obssPdLevel - m_obssPdLevelMin);
+      txPowerMaxMimo = m_txPowerRefMimo - (m_obssPdLevel - m_obssPdLevelMin);
+      powerRestricted = true;
+    }
+  m_resetEvent (bssColor, WToDbm (params.rssiW), powerRestricted, txPowerMaxSiso, txPowerMaxMimo);
+  phy->ResetCca (powerRestricted, txPowerMaxSiso, txPowerMaxMimo);
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/obss-pd-algorithm.h ns-3.34/src/wifi/model/he/obss-pd-algorithm.h
--- ns-3.33/src/wifi/model/he/obss-pd-algorithm.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/obss-pd-algorithm.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,107 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef OBSS_PD_ALGORITHM_H
+#define OBSS_PD_ALGORITHM_H
+
+#include "ns3/object.h"
+#include "ns3/traced-callback.h"
+#include "he-configuration.h"
+
+namespace ns3 {
+
+struct HeSigAParameters;
+
+class WifiNetDevice;
+
+/**
+ * \brief OBSS PD algorithm interface
+ * \ingroup wifi
+ *
+ * This object provides the interface for all OBSS_PD algorithms
+ * and is designed to be subclassed.
+ *
+ * OBSS_PD stands for Overlapping Basic Service Set Preamble-Detection.
+ * OBSS_PD is an 802.11ax feature that allows a STA, under specific
+ * conditions, to ignore an inter-BSS PPDU.
+ */
+class ObssPdAlgorithm : public Object
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  /**
+   * Connect the WifiNetDevice and setup eventual callbacks.
+   *
+   * \param device the WifiNetDevice
+   */
+  virtual void ConnectWifiNetDevice (const Ptr<WifiNetDevice> device);
+
+  /**
+   * Reset PHY to IDLE.
+   * \param params HeSigAParameters causing PHY reset
+   */
+  void ResetPhy (HeSigAParameters params);
+
+  /**
+   * \param params the HE-SIG-A parameters
+   *
+   * Evaluate the receipt of HE-SIG-A.
+   */
+  virtual void ReceiveHeSigA (HeSigAParameters params) = 0;
+
+  /**
+   * TracedCallback signature for OBSS_PD reset events.
+   *
+   * \param [in] bssColor The BSS color of frame triggering the reset
+   * \param [in] rssiDbm The RSSI (dBm) of frame triggering the reset
+   * \param [in] powerRestricted Whether a TX power restriction is triggered
+   * \param [in] txPowerMaxDbmSiso The SISO TX power restricted level (dBm)
+   * \param [in] txPowerMaxDbmMimo The MIMO TX power restricted level (dBm)
+   */
+  typedef void (* ResetTracedCallback)(uint8_t bssColor, double rssiDbm, bool powerRestricted, double txPowerMaxDbmSiso, double txPowerMaxDbmMimo);
+
+
+protected:
+  void DoDispose (void) override;
+
+  Ptr<WifiNetDevice> m_device; ///< Pointer to the WifiNetDevice
+  double m_obssPdLevel;        ///< Current OBSS PD level (dBm)
+
+
+private:
+  double m_obssPdLevelMin; ///< Minimum OBSS PD level (dBm)
+  double m_obssPdLevelMax; ///< Maximum OBSS PD level (dBm)
+  double m_txPowerRefSiso; ///< SISO reference TX power level (dBm)
+  double m_txPowerRefMimo; ///< MIMO reference TX power level (dBm)
+
+  /**
+   * TracedCallback signature for PHY reset events.
+   */
+  TracedCallback<uint8_t, double, bool, double, double>  m_resetEvent;
+};
+
+} //namespace ns3
+
+#endif /* OBSS_PD_ALGORITHM_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/rr-multi-user-scheduler.cc ns-3.34/src/wifi/model/he/rr-multi-user-scheduler.cc
--- ns-3.33/src/wifi/model/he/rr-multi-user-scheduler.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/rr-multi-user-scheduler.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,852 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "rr-multi-user-scheduler.h"
+#include "ns3/wifi-protection.h"
+#include "ns3/wifi-acknowledgment.h"
+#include "ns3/wifi-psdu.h"
+#include "he-frame-exchange-manager.h"
+#include "he-configuration.h"
+#include "he-phy.h"
+#include <algorithm>
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("RrMultiUserScheduler");
+
+NS_OBJECT_ENSURE_REGISTERED (RrMultiUserScheduler);
+
+TypeId
+RrMultiUserScheduler::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::RrMultiUserScheduler")
+    .SetParent<MultiUserScheduler> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<RrMultiUserScheduler> ()
+    .AddAttribute ("NStations",
+                   "The maximum number of stations that can be granted an RU in a DL MU OFDMA transmission",
+                   UintegerValue (4),
+                   MakeUintegerAccessor (&RrMultiUserScheduler::m_nStations),
+                   MakeUintegerChecker<uint8_t> (1, 74))
+    .AddAttribute ("EnableTxopSharing",
+                   "If enabled, allow A-MPDUs of different TIDs in a DL MU PPDU.",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&RrMultiUserScheduler::m_enableTxopSharing),
+                   MakeBooleanChecker ())
+    .AddAttribute ("ForceDlOfdma",
+                   "If enabled, return DL_MU_TX even if no DL MU PPDU could be built.",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&RrMultiUserScheduler::m_forceDlOfdma),
+                   MakeBooleanChecker ())
+    .AddAttribute ("EnableUlOfdma",
+                   "If enabled, return UL_MU_TX if DL_MU_TX was returned the previous time.",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&RrMultiUserScheduler::m_enableUlOfdma),
+                   MakeBooleanChecker ())
+    .AddAttribute ("EnableBsrp",
+                   "If enabled, send a BSRP Trigger Frame before an UL MU transmission.",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&RrMultiUserScheduler::m_enableBsrp),
+                   MakeBooleanChecker ())
+    .AddAttribute ("UlPsduSize",
+                   "The default size in bytes of the solicited PSDU (to be sent in a TB PPDU)",
+                   UintegerValue (500),
+                   MakeUintegerAccessor (&RrMultiUserScheduler::m_ulPsduSize),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("UseCentral26TonesRus",
+                   "If enabled, central 26-tone RUs are allocated, too, when the "
+                   "selected RU type is at least 52 tones.",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&RrMultiUserScheduler::m_useCentral26TonesRus),
+                   MakeBooleanChecker ())
+    .AddAttribute ("MaxCredits",
+                   "Maximum amount of credits a station can have. When transmitting a DL MU PPDU, "
+                   "the amount of credits received by each station equals the TX duration (in "
+                   "microseconds) divided by the total number of stations. Stations that are the "
+                   "recipient of the DL MU PPDU have to pay a number of credits equal to the TX "
+                   "duration (in microseconds) times the allocated bandwidth share",
+                   TimeValue (Seconds (1)),
+                   MakeTimeAccessor (&RrMultiUserScheduler::m_maxCredits),
+                   MakeTimeChecker ())
+  ;
+  return tid;
+}
+
+RrMultiUserScheduler::RrMultiUserScheduler ()
+  : m_ulTriggerType (TriggerFrameType::BASIC_TRIGGER)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+RrMultiUserScheduler::~RrMultiUserScheduler ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+void
+RrMultiUserScheduler::DoInitialize (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_apMac != nullptr);
+  m_apMac->TraceConnectWithoutContext ("AssociatedSta",
+                                       MakeCallback (&RrMultiUserScheduler::NotifyStationAssociated, this));
+  m_apMac->TraceConnectWithoutContext ("DeAssociatedSta",
+                                       MakeCallback (&RrMultiUserScheduler::NotifyStationDeassociated, this));
+  for (const auto& ac : wifiAcList)
+    {
+      m_staList.insert ({ac.first, {}});
+    }
+  MultiUserScheduler::DoInitialize ();
+}
+
+void
+RrMultiUserScheduler::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_staList.clear ();
+  m_candidates.clear ();
+  m_trigger = nullptr;
+  m_txParams.Clear ();
+  m_apMac->TraceDisconnectWithoutContext ("AssociatedSta",
+                                          MakeCallback (&RrMultiUserScheduler::NotifyStationAssociated, this));
+  m_apMac->TraceDisconnectWithoutContext ("DeAssociatedSta",
+                                          MakeCallback (&RrMultiUserScheduler::NotifyStationDeassociated, this));
+  MultiUserScheduler::DoDispose ();
+}
+
+MultiUserScheduler::TxFormat
+RrMultiUserScheduler::SelectTxFormat (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  if (m_enableUlOfdma && m_enableBsrp && GetLastTxFormat () == DL_MU_TX)
+    {
+      return TrySendingBsrpTf ();
+    }
+
+  if (m_enableUlOfdma && (GetLastTxFormat () == DL_MU_TX
+                          || m_ulTriggerType == TriggerFrameType::BSRP_TRIGGER))
+    {
+      TxFormat txFormat = TrySendingBasicTf ();
+
+      if (txFormat != DL_MU_TX)
+        {
+          return txFormat;
+        }
+    }
+
+  return TrySendingDlMuPpdu ();
+}
+
+MultiUserScheduler::TxFormat
+RrMultiUserScheduler::TrySendingBsrpTf (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  CtrlTriggerHeader trigger (TriggerFrameType::BSRP_TRIGGER, GetDlMuInfo ().txParams.m_txVector);
+
+  WifiTxVector txVector = GetDlMuInfo ().txParams.m_txVector;
+  txVector.SetGuardInterval (trigger.GetGuardInterval ());
+
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader (trigger);
+
+  Mac48Address receiver = Mac48Address::GetBroadcast ();
+  if (trigger.GetNUserInfoFields () == 1)
+    {
+      NS_ASSERT (m_apMac->GetStaList ().find (trigger.begin ()->GetAid12 ()) != m_apMac->GetStaList ().end ());
+      receiver = m_apMac->GetStaList ().at (trigger.begin ()->GetAid12 ());
+    }
+
+  WifiMacHeader hdr (WIFI_MAC_CTL_TRIGGER);
+  hdr.SetAddr1 (receiver);
+  hdr.SetAddr2 (m_apMac->GetAddress ());
+  hdr.SetDsNotTo ();
+  hdr.SetDsNotFrom ();
+
+  Ptr<WifiMacQueueItem> item = Create<WifiMacQueueItem> (packet, hdr);
+
+  m_txParams.Clear ();
+  // set the TXVECTOR used to send the Trigger Frame
+  m_txParams.m_txVector = m_apMac->GetWifiRemoteStationManager ()->GetRtsTxVector (receiver);
+
+  if (!m_heFem->TryAddMpdu (item, m_txParams, m_availableTime))
+    {
+      // sending the BSRP Trigger Frame is not possible, hence return NO_TX. In
+      // this way, no transmission will occur now and the next time we will
+      // try again sending a BSRP Trigger Frame.
+      NS_LOG_DEBUG ("Remaining TXOP duration is not enough for BSRP TF exchange");
+      return NO_TX;
+    }
+
+  // Compute the time taken by each station to transmit 8 QoS Null frames
+  Time qosNullTxDuration = Seconds (0);
+  for (const auto& userInfo : trigger)
+    {
+      Time duration = WifiPhy::CalculateTxDuration (m_sizeOf8QosNull, txVector,
+                                                    m_apMac->GetWifiPhy ()->GetPhyBand (),
+                                                    userInfo.GetAid12 ());
+      qosNullTxDuration = Max (qosNullTxDuration, duration);
+    }
+
+  if (m_availableTime != Time::Min ())
+    {
+      // TryAddMpdu only considers the time to transmit the Trigger Frame
+      NS_ASSERT (m_txParams.m_protection && m_txParams.m_protection->protectionTime != Time::Min ());
+      NS_ASSERT (m_txParams.m_acknowledgment && m_txParams.m_acknowledgment->acknowledgmentTime.IsZero ());
+      NS_ASSERT (m_txParams.m_txDuration != Time::Min ());
+
+      if (m_txParams.m_protection->protectionTime
+          + m_txParams.m_txDuration     // BSRP TF tx time
+          + m_apMac->GetWifiPhy ()->GetSifs ()
+          + qosNullTxDuration
+          > m_availableTime)
+        {
+          NS_LOG_DEBUG ("Remaining TXOP duration is not enough for BSRP TF exchange");
+          return NO_TX;
+        }
+    }
+
+  NS_LOG_DEBUG ("Duration of QoS Null frames: " << qosNullTxDuration.As (Time::MS));
+  trigger.SetUlLength (HePhy::ConvertHeTbPpduDurationToLSigLength (qosNullTxDuration,
+                                                                    m_apMac->GetWifiPhy ()->GetPhyBand ()));
+  trigger.SetCsRequired (true);
+  m_heFem->SetTargetRssi (trigger);
+
+  packet = Create<Packet> ();
+  packet->AddHeader (trigger);
+  m_trigger = Create<WifiMacQueueItem> (packet, hdr);
+
+  m_ulTriggerType = TriggerFrameType::BSRP_TRIGGER;
+  m_tbPpduDuration = qosNullTxDuration;
+
+  return UL_MU_TX;
+}
+
+MultiUserScheduler::TxFormat
+RrMultiUserScheduler::TrySendingBasicTf (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  // check if an UL OFDMA transmission is possible after a DL OFDMA transmission
+  NS_ABORT_MSG_IF (m_ulPsduSize == 0, "The UlPsduSize attribute must be set to a non-null value");
+
+  // determine which of the stations served in DL have UL traffic
+  uint32_t maxBufferSize = 0;
+  // candidates sorted in decreasing order of queue size
+  std::multimap<uint8_t, CandidateInfo, std::greater<uint8_t>> ulCandidates;
+
+  for (const auto& candidate : m_candidates)
+    {
+      uint8_t queueSize = m_apMac->GetMaxBufferStatus (candidate.first->address);
+      if (queueSize == 255)
+        {
+          NS_LOG_DEBUG ("Buffer status of station " << candidate.first->address << " is unknown");
+          maxBufferSize = std::max (maxBufferSize, m_ulPsduSize);
+        }
+      else if (queueSize == 254)
+        {
+          NS_LOG_DEBUG ("Buffer status of station " << candidate.first->address << " is not limited");
+          maxBufferSize = 0xffffffff;
+        }
+      else
+        {
+          NS_LOG_DEBUG ("Buffer status of station " << candidate.first->address << " is " << +queueSize);
+          maxBufferSize = std::max (maxBufferSize, static_cast<uint32_t> (queueSize * 256));
+        }
+      // serve the station if its queue size is not null
+      if (queueSize > 0)
+        {
+          ulCandidates.emplace (queueSize, candidate);
+        }
+    }
+
+  // if the maximum buffer size is 0, skip UL OFDMA and proceed with trying DL OFDMA
+  if (maxBufferSize > 0)
+    {
+      NS_ASSERT (!ulCandidates.empty ());
+      std::size_t count = ulCandidates.size ();
+      std::size_t nCentral26TonesRus;
+      HeRu::RuType ruType = HeRu::GetEqualSizedRusForStations (m_apMac->GetWifiPhy ()->GetChannelWidth (),
+                                                               count, nCentral26TonesRus);
+      if (!m_useCentral26TonesRus || ulCandidates.size () == count)
+        {
+          nCentral26TonesRus = 0;
+        }
+      else
+        {
+          nCentral26TonesRus = std::min (ulCandidates.size () - count, nCentral26TonesRus);
+        }
+
+      WifiTxVector txVector;
+      txVector.SetPreambleType (WIFI_PREAMBLE_HE_TB);
+      auto candidateIt = ulCandidates.begin ();
+
+      if (GetLastTxFormat () == DL_MU_TX)
+        {
+          txVector.SetChannelWidth (GetDlMuInfo ().txParams.m_txVector.GetChannelWidth ());
+          txVector.SetGuardInterval (CtrlTriggerHeader ().GetGuardInterval ());
+
+          for (std::size_t i = 0; i < count + nCentral26TonesRus; i++)
+            {
+              NS_ASSERT (candidateIt != ulCandidates.end ());
+              uint16_t staId = candidateIt->second.first->aid;
+              // AssignRuIndices will be called below to set RuSpec
+              txVector.SetHeMuUserInfo (staId,
+                                        {{(i < count ? ruType : HeRu::RU_26_TONE), 1, false},
+                                        GetDlMuInfo ().txParams.m_txVector.GetMode (staId),
+                                        GetDlMuInfo ().txParams.m_txVector.GetNss (staId)});
+
+              candidateIt++;
+            }
+        }
+      else
+        {
+          CtrlTriggerHeader trigger;
+          GetUlMuInfo ().trigger->GetPacket ()->PeekHeader (trigger);
+
+          txVector.SetChannelWidth (trigger.GetUlBandwidth ());
+          txVector.SetGuardInterval (trigger.GetGuardInterval ());
+
+          for (std::size_t i = 0; i < count + nCentral26TonesRus; i++)
+            {
+              NS_ASSERT (candidateIt != ulCandidates.end ());
+              uint16_t staId = candidateIt->second.first->aid;
+              auto userInfoIt = trigger.FindUserInfoWithAid (staId);
+              NS_ASSERT (userInfoIt != trigger.end ());
+              // AssignRuIndices will be called below to set RuSpec
+              txVector.SetHeMuUserInfo (staId,
+                                        {{(i < count ? ruType : HeRu::RU_26_TONE), 1, false},
+                                        HePhy::GetHeMcs (userInfoIt->GetUlMcs ()),
+                                        userInfoIt->GetNss ()});
+
+              candidateIt++;
+            }
+        }
+
+      // remove candidates that will not be served
+      ulCandidates.erase (candidateIt, ulCandidates.end ());
+      AssignRuIndices (txVector);
+
+      CtrlTriggerHeader trigger (TriggerFrameType::BASIC_TRIGGER, txVector);
+      Ptr<Packet> packet = Create<Packet> ();
+      packet->AddHeader (trigger);
+
+      Mac48Address receiver = Mac48Address::GetBroadcast ();
+      if (ulCandidates.size () == 1)
+        {
+          receiver = ulCandidates.begin ()->second.first->address;
+        }
+
+      WifiMacHeader hdr (WIFI_MAC_CTL_TRIGGER);
+      hdr.SetAddr1 (receiver);
+      hdr.SetAddr2 (m_apMac->GetAddress ());
+      hdr.SetDsNotTo ();
+      hdr.SetDsNotFrom ();
+
+      Ptr<WifiMacQueueItem> item = Create<WifiMacQueueItem> (packet, hdr);
+
+      // compute the maximum amount of time that can be granted to stations.
+      // This value is limited by the max PPDU duration
+      Time maxDuration = GetPpduMaxTime (txVector.GetPreambleType ());
+
+      m_txParams.Clear ();
+      // set the TXVECTOR used to send the Trigger Frame
+      m_txParams.m_txVector = m_apMac->GetWifiRemoteStationManager ()->GetRtsTxVector (receiver);
+
+      if (!m_heFem->TryAddMpdu (item, m_txParams, m_availableTime))
+        {
+          // an UL OFDMA transmission is not possible, hence return NO_TX. In
+          // this way, no transmission will occur now and the next time we will
+          // try again performing an UL OFDMA transmission.
+          NS_LOG_DEBUG ("Remaining TXOP duration is not enough for UL MU exchange");
+          return NO_TX;
+        }
+
+      if (m_availableTime != Time::Min ())
+        {
+          // TryAddMpdu only considers the time to transmit the Trigger Frame
+          NS_ASSERT (m_txParams.m_protection && m_txParams.m_protection->protectionTime != Time::Min ());
+          NS_ASSERT (m_txParams.m_acknowledgment && m_txParams.m_acknowledgment->acknowledgmentTime != Time::Min ());
+          NS_ASSERT (m_txParams.m_txDuration != Time::Min ());
+
+          maxDuration = Min (maxDuration, m_availableTime
+                                          - m_txParams.m_protection->protectionTime
+                                          - m_txParams.m_txDuration
+                                          - m_apMac->GetWifiPhy ()->GetSifs ()
+                                          - m_txParams.m_acknowledgment->acknowledgmentTime);
+          if (maxDuration.IsNegative ())
+            {
+              NS_LOG_DEBUG ("Remaining TXOP duration is not enough for UL MU exchange");
+              return NO_TX;
+            }
+        }
+
+      // Compute the time taken by each station to transmit a frame of maxBufferSize size
+      Time bufferTxTime = Seconds (0);
+      for (const auto& userInfo : trigger)
+        {
+          Time duration = WifiPhy::CalculateTxDuration (maxBufferSize, txVector,
+                                                        m_apMac->GetWifiPhy ()->GetPhyBand (),
+                                                        userInfo.GetAid12 ());
+          bufferTxTime = Max (bufferTxTime, duration);
+        }
+
+      if (bufferTxTime < maxDuration)
+        {
+          // the maximum buffer size can be transmitted within the allowed time
+          maxDuration = bufferTxTime;
+        }
+      else
+        {
+          // maxDuration may be a too short time. If it does not allow any station to
+          // transmit at least m_ulPsduSize bytes, give up the UL MU transmission for now
+          Time minDuration = Seconds (0);
+          for (const auto& userInfo : trigger)
+            {
+              Time duration = WifiPhy::CalculateTxDuration (m_ulPsduSize, txVector,
+                                                            m_apMac->GetWifiPhy ()->GetPhyBand (),
+                                                            userInfo.GetAid12 ());
+              minDuration = (minDuration.IsZero () ? duration : Min (minDuration, duration));
+            }
+
+          if (maxDuration < minDuration)
+            {
+              // maxDuration is a too short time, hence return NO_TX. In this way,
+              // no transmission will occur now and the next time we will try again
+              // performing an UL OFDMA transmission.
+              NS_LOG_DEBUG ("Available time " << maxDuration.As (Time::MS) << " is too short");
+              return NO_TX;
+            }
+        }
+
+      // maxDuration is the time to grant to the stations. Finalize the Trigger Frame
+      NS_LOG_DEBUG ("TB PPDU duration: " << maxDuration.As (Time::MS));
+      trigger.SetUlLength (HePhy::ConvertHeTbPpduDurationToLSigLength (maxDuration,
+                                                                       m_apMac->GetWifiPhy ()->GetPhyBand ()));
+      trigger.SetCsRequired (true);
+      m_heFem->SetTargetRssi (trigger);
+      // set Preferred AC to the AC that gained channel access
+      for (auto& userInfo : trigger)
+        {
+          userInfo.SetBasicTriggerDepUserInfo (0, 0, m_edca->GetAccessCategory ());
+        }
+
+      packet = Create<Packet> ();
+      packet->AddHeader (trigger);
+      m_trigger = Create<WifiMacQueueItem> (packet, hdr);
+
+      m_ulTriggerType = TriggerFrameType::BASIC_TRIGGER;
+      m_tbPpduDuration = maxDuration;
+
+      return UL_MU_TX;
+    }
+  return DL_MU_TX;
+}
+
+void
+RrMultiUserScheduler::NotifyStationAssociated (uint16_t aid, Mac48Address address)
+{
+  NS_LOG_FUNCTION (this << aid << address);
+
+  if (GetWifiRemoteStationManager ()->GetHeSupported (address))
+    {
+      for (auto& staList : m_staList)
+        {
+          staList.second.push_back (MasterInfo {aid, address, 0.0});
+        }
+    }
+}
+
+void
+RrMultiUserScheduler::NotifyStationDeassociated (uint16_t aid, Mac48Address address)
+{
+  NS_LOG_FUNCTION (this << aid << address);
+
+  if (GetWifiRemoteStationManager ()->GetHeSupported (address))
+    {
+      for (auto& staList : m_staList)
+        {
+          staList.second.remove_if ([&aid, &address] (const MasterInfo& info)
+                                    { return info.aid == aid && info.address == address; });
+        }
+    }
+}
+
+MultiUserScheduler::TxFormat
+RrMultiUserScheduler::TrySendingDlMuPpdu (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  AcIndex primaryAc = m_edca->GetAccessCategory ();
+
+  if (m_staList[primaryAc].empty ())
+    {
+      NS_LOG_DEBUG ("No HE stations associated: return SU_TX");
+      return TxFormat::SU_TX;
+    }
+
+  std::size_t count = std::min (static_cast<std::size_t> (m_nStations), m_staList[primaryAc].size ());
+  std::size_t nCentral26TonesRus;
+  HeRu::RuType ruType = HeRu::GetEqualSizedRusForStations (m_apMac->GetWifiPhy ()->GetChannelWidth (), count,
+                                                           nCentral26TonesRus);
+  NS_ASSERT (count >= 1);
+
+  if (!m_useCentral26TonesRus)
+    {
+      nCentral26TonesRus = 0;
+    }
+
+  uint8_t currTid = wifiAcList.at (primaryAc).GetHighTid ();
+
+  Ptr<const WifiMacQueueItem> mpdu = m_edca->PeekNextMpdu ();
+
+  if (mpdu != nullptr && mpdu->GetHeader ().IsQosData ())
+    {
+      currTid = mpdu->GetHeader ().GetQosTid ();
+    }
+
+  // determine the list of TIDs to check
+  std::vector<uint8_t> tids;
+
+  if (m_enableTxopSharing)
+    {
+      for (auto acIt = wifiAcList.find (primaryAc); acIt != wifiAcList.end (); acIt++)
+        {
+          uint8_t firstTid = (acIt->first == primaryAc ? currTid : acIt->second.GetHighTid ());
+          tids.push_back (firstTid);
+          tids.push_back (acIt->second.GetOtherTid (firstTid));
+        }
+    }
+  else
+    {
+      tids.push_back (currTid);
+    }
+
+  Ptr<HeConfiguration> heConfiguration = m_apMac->GetHeConfiguration ();
+  NS_ASSERT (heConfiguration != 0);
+
+  m_txParams.Clear ();
+  m_txParams.m_txVector.SetPreambleType (WIFI_PREAMBLE_HE_MU);
+  m_txParams.m_txVector.SetChannelWidth (m_apMac->GetWifiPhy ()->GetChannelWidth ());
+  m_txParams.m_txVector.SetGuardInterval (heConfiguration->GetGuardInterval ().GetNanoSeconds ());
+  m_txParams.m_txVector.SetBssColor (heConfiguration->GetBssColor ());
+
+  // The TXOP limit can be exceeded by the TXOP holder if it does not transmit more
+  // than one Data or Management frame in the TXOP and the frame is not in an A-MPDU
+  // consisting of more than one MPDU (Sec. 10.22.2.8 of 802.11-2016).
+  // For the moment, we are considering just one MPDU per receiver.
+  Time actualAvailableTime = (m_initialFrame ? Time::Min () : m_availableTime);
+
+  // iterate over the associated stations until an enough number of stations is identified
+  auto staIt = m_staList[primaryAc].begin ();
+  m_candidates.clear ();
+
+  while (staIt != m_staList[primaryAc].end ()
+         && m_candidates.size () < std::min (static_cast<std::size_t> (m_nStations), count + nCentral26TonesRus))
+    {
+      NS_LOG_DEBUG ("Next candidate STA (MAC=" << staIt->address << ", AID=" << staIt->aid << ")");
+
+      HeRu::RuType currRuType = (m_candidates.size () < count ? ruType : HeRu::RU_26_TONE);
+
+      // check if the AP has at least one frame to be sent to the current station
+      for (uint8_t tid : tids)
+        {
+          AcIndex ac = QosUtilsMapTidToAc (tid);
+          NS_ASSERT (ac >= primaryAc);
+          // check that a BA agreement is established with the receiver for the
+          // considered TID, since ack sequences for DL MU PPDUs require block ack
+          if (m_apMac->GetQosTxop (ac)->GetBaAgreementEstablished (staIt->address, tid))
+            {
+              mpdu = m_apMac->GetQosTxop (ac)->PeekNextMpdu (tid, staIt->address);
+
+              // we only check if the first frame of the current TID meets the size
+              // and duration constraints. We do not explore the queues further.
+              if (mpdu != 0)
+                {
+                  // Use a temporary TX vector including only the STA-ID of the
+                  // candidate station to check if the MPDU meets the size and time limits.
+                  // An RU of the computed size is tentatively assigned to the candidate
+                  // station, so that the TX duration can be correctly computed.
+                  WifiTxVector suTxVector = GetWifiRemoteStationManager ()->GetDataTxVector (mpdu->GetHeader ()),
+                               txVectorCopy = m_txParams.m_txVector;
+
+                  m_txParams.m_txVector.SetHeMuUserInfo (staIt->aid,
+                                                         {{currRuType, 1, false},
+                                                          suTxVector.GetMode (),
+                                                          suTxVector.GetNss ()});
+
+                  if (!m_heFem->TryAddMpdu (mpdu, m_txParams, actualAvailableTime))
+                    {
+                      NS_LOG_DEBUG ("Adding the peeked frame violates the time constraints");
+                      m_txParams.m_txVector = txVectorCopy;
+                    }
+                  else
+                    {
+                      // the frame meets the constraints
+                      NS_LOG_DEBUG ("Adding candidate STA (MAC=" << staIt->address << ", AID="
+                                    << staIt->aid << ") TID=" << +tid);
+                      m_candidates.push_back ({staIt, mpdu});
+                      break;    // terminate the for loop
+                    }
+                }
+              else
+                {
+                  NS_LOG_DEBUG ("No frames to send to " << staIt->address << " with TID=" << +tid);
+                }
+            }
+        }
+
+      // move to the next station in the list
+      staIt++;
+    }
+
+  if (m_candidates.empty ())
+    {
+      if (m_forceDlOfdma)
+        {
+          NS_LOG_DEBUG ("The AP does not have suitable frames to transmit: return NO_TX");
+          return NO_TX;
+        }
+      NS_LOG_DEBUG ("The AP does not have suitable frames to transmit: return SU_TX");
+      return SU_TX;
+    }
+
+  return TxFormat::DL_MU_TX;
+}
+
+MultiUserScheduler::DlMuInfo
+RrMultiUserScheduler::ComputeDlMuInfo (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  if (m_candidates.empty ())
+    {
+      return DlMuInfo ();
+    }
+
+  uint16_t bw = m_apMac->GetWifiPhy ()->GetChannelWidth ();
+
+  // compute how many stations can be granted an RU and the RU size
+  std::size_t nRusAssigned = m_txParams.GetPsduInfoMap ().size ();
+  std::size_t nCentral26TonesRus;
+  HeRu::RuType ruType = HeRu::GetEqualSizedRusForStations (bw, nRusAssigned, nCentral26TonesRus);
+
+  NS_LOG_DEBUG (nRusAssigned << " stations are being assigned a " << ruType << " RU");
+
+  if (!m_useCentral26TonesRus || m_candidates.size () == nRusAssigned)
+    {
+      nCentral26TonesRus = 0;
+    }
+  else
+    {
+      nCentral26TonesRus = std::min (m_candidates.size () - nRusAssigned, nCentral26TonesRus);
+      NS_LOG_DEBUG (nCentral26TonesRus << " stations are being assigned a 26-tones RU");
+    }
+
+  DlMuInfo dlMuInfo;
+
+  // We have to update the TXVECTOR
+  dlMuInfo.txParams.m_txVector.SetPreambleType (m_txParams.m_txVector.GetPreambleType ());
+  dlMuInfo.txParams.m_txVector.SetChannelWidth (m_txParams.m_txVector.GetChannelWidth ());
+  dlMuInfo.txParams.m_txVector.SetGuardInterval (m_txParams.m_txVector.GetGuardInterval ());
+  dlMuInfo.txParams.m_txVector.SetBssColor (m_txParams.m_txVector.GetBssColor ());
+
+  auto candidateIt = m_candidates.begin (); // iterator over the list of candidate receivers
+
+  for (std::size_t i = 0; i < nRusAssigned + nCentral26TonesRus; i++)
+    {
+      NS_ASSERT (candidateIt != m_candidates.end ());
+
+      uint16_t staId = candidateIt->first->aid;
+      // AssignRuIndices will be called below to set RuSpec
+      dlMuInfo.txParams.m_txVector.SetHeMuUserInfo (staId,
+                                                    {{(i < nRusAssigned ? ruType : HeRu::RU_26_TONE), 1, false},
+                                                      m_txParams.m_txVector.GetMode (staId),
+                                                      m_txParams.m_txVector.GetNss (staId)});
+      candidateIt++;
+    }
+
+  // remove candidates that will not be served
+  m_candidates.erase (candidateIt, m_candidates.end ());
+
+  AssignRuIndices (dlMuInfo.txParams.m_txVector);
+  m_txParams.Clear ();
+
+  Ptr<const WifiMacQueueItem> mpdu;
+
+  // Compute the TX params (again) by using the stored MPDUs and the final TXVECTOR
+  Time actualAvailableTime = (m_initialFrame ? Time::Min () : m_availableTime);
+
+  for (const auto& candidate : m_candidates)
+    {
+      mpdu = candidate.second;
+      NS_ASSERT (mpdu != nullptr);
+
+      bool ret = m_heFem->TryAddMpdu (mpdu, dlMuInfo.txParams, actualAvailableTime);
+      NS_UNUSED (ret);
+      NS_ASSERT_MSG (ret, "Weird that an MPDU does not meet constraints when "
+                          "transmitted over a larger RU");
+    }
+
+  // We have to complete the PSDUs to send
+  Ptr<WifiMacQueue> queue;
+  Mac48Address receiver;
+
+  for (const auto& candidate : m_candidates)
+    {
+      // Let us try first A-MSDU aggregation if possible
+      mpdu = candidate.second;
+      NS_ASSERT (mpdu != nullptr);
+      uint8_t tid = mpdu->GetHeader ().GetQosTid ();
+      receiver = mpdu->GetHeader ().GetAddr1 ();
+      NS_ASSERT (receiver == candidate.first->address);
+
+      NS_ASSERT (mpdu->IsQueued ());
+      WifiMacQueueItem::QueueIteratorPair queueIt = mpdu->GetQueueIteratorPairs ().front ();
+      NS_ASSERT (queueIt.queue != nullptr);
+      Ptr<WifiMacQueueItem> item = *queueIt.it;
+      queueIt.it++;
+
+      if (!mpdu->GetHeader ().IsRetry ())
+        {
+          // this MPDU must have been dequeued from the AC queue and we can try
+          // A-MSDU aggregation
+          item = m_heFem->GetMsduAggregator ()->GetNextAmsdu (mpdu, dlMuInfo.txParams, m_availableTime, queueIt);
+
+          if (item == nullptr)
+            {
+              // A-MSDU aggregation failed or disabled
+              item = *mpdu->GetQueueIteratorPairs ().front ().it;
+            }
+          m_apMac->GetQosTxop (QosUtilsMapTidToAc (tid))->AssignSequenceNumber (item);
+        }
+
+      // Now, let's try A-MPDU aggregation if possible
+      std::vector<Ptr<WifiMacQueueItem>> mpduList = m_heFem->GetMpduAggregator ()->GetNextAmpdu (item, dlMuInfo.txParams, m_availableTime, queueIt);
+
+      if (mpduList.size () > 1)
+        {
+          // A-MPDU aggregation succeeded, update psduMap
+          dlMuInfo.psduMap[candidate.first->aid] = Create<WifiPsdu> (std::move (mpduList));
+        }
+      else
+        {
+          dlMuInfo.psduMap[candidate.first->aid] = Create<WifiPsdu> (item, true);
+        }
+    }
+
+  AcIndex primaryAc = m_edca->GetAccessCategory ();
+
+  // The amount of credits received by each station equals the TX duration (in
+  // microseconds) divided by the number of stations.
+  double creditsPerSta = dlMuInfo.txParams.m_txDuration.ToDouble (Time::US)
+                        / m_staList[primaryAc].size ();
+  // Transmitting stations have to pay a number of credits equal to the TX duration
+  // (in microseconds) times the allocated bandwidth share.
+  double debitsPerMhz = dlMuInfo.txParams.m_txDuration.ToDouble (Time::US)
+                        / (nRusAssigned * HeRu::GetBandwidth (ruType)
+                          + nCentral26TonesRus * HeRu::GetBandwidth (HeRu::RU_26_TONE));
+
+  // assign credits to all stations
+  for (auto& sta : m_staList[primaryAc])
+    {
+      sta.credits += creditsPerSta;
+      sta.credits = std::min (sta.credits, m_maxCredits.ToDouble (Time::US));
+    }
+
+  // subtract debits to the selected stations
+  candidateIt = m_candidates.begin ();
+
+  for (std::size_t i = 0; i < nRusAssigned + nCentral26TonesRus; i++)
+    {
+      NS_ASSERT (candidateIt != m_candidates.end ());
+
+      candidateIt->first->credits -= debitsPerMhz * HeRu::GetBandwidth (i < nRusAssigned ? ruType : HeRu::RU_26_TONE);
+
+      candidateIt++;
+    }
+
+  // sort the list in decreasing order of credits
+  m_staList[primaryAc].sort ([] (const MasterInfo& a, const MasterInfo& b)
+                              { return a.credits > b.credits; });
+
+  NS_LOG_DEBUG ("Next station to serve has AID=" << m_staList[primaryAc].front ().aid);
+
+  return dlMuInfo;
+}
+
+void
+RrMultiUserScheduler::AssignRuIndices (WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << txVector);
+
+  uint8_t bw = txVector.GetChannelWidth ();
+
+  // find the RU types allocated in the TXVECTOR
+  std::set<HeRu::RuType> ruTypeSet;
+  for (const auto& userInfo : txVector.GetHeMuUserInfoMap ())
+    {
+      ruTypeSet.insert (userInfo.second.ru.GetRuType ());
+    }
+
+  std::vector<HeRu::RuSpec> ruSet, central26TonesRus;
+
+  // This scheduler allocates equal sized RUs and optionally the remaining 26-tone RUs
+  if (ruTypeSet.size () == 2)
+    {
+      // central 26-tone RUs have been allocated
+      NS_ASSERT (ruTypeSet.find (HeRu::RU_26_TONE) != ruTypeSet.end ());
+      ruTypeSet.erase (HeRu::RU_26_TONE);
+      NS_ASSERT (ruTypeSet.size () == 1);
+      central26TonesRus = HeRu::GetCentral26TonesRus (bw, *ruTypeSet.begin ());
+    }
+
+  NS_ASSERT (ruTypeSet.size () == 1);
+  ruSet = HeRu::GetRusOfType (bw, *ruTypeSet.begin ());
+
+  auto ruSetIt = ruSet.begin ();
+  auto central26TonesRusIt = central26TonesRus.begin ();
+
+  for (const auto& userInfo : txVector.GetHeMuUserInfoMap ())
+    {
+      if (userInfo.second.ru.GetRuType () == *ruTypeSet.begin ())
+        {
+          NS_ASSERT (ruSetIt != ruSet.end ());
+          txVector.SetRu (*ruSetIt, userInfo.first);
+          ruSetIt++;
+        }
+      else
+        {
+          NS_ASSERT (central26TonesRusIt != central26TonesRus.end ());
+          txVector.SetRu (*central26TonesRusIt, userInfo.first);
+          central26TonesRusIt++;
+        }
+    }
+}
+
+MultiUserScheduler::UlMuInfo
+RrMultiUserScheduler::ComputeUlMuInfo (void)
+{
+  return UlMuInfo {m_trigger, m_tbPpduDuration, std::move (m_txParams)};
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he/rr-multi-user-scheduler.h ns-3.34/src/wifi/model/he/rr-multi-user-scheduler.h
--- ns-3.33/src/wifi/model/he/rr-multi-user-scheduler.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/he/rr-multi-user-scheduler.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,145 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef RR_MULTI_USER_SCHEDULER_H
+#define RR_MULTI_USER_SCHEDULER_H
+
+#include "multi-user-scheduler.h"
+#include <list>
+
+namespace ns3 {
+
+/**
+ * \ingroup wifi
+ *
+ * RrMultiUserScheduler is a simple OFDMA scheduler that indicates to perform a DL OFDMA
+ * transmission if the AP has frames to transmit to at least one station.
+ * RrMultiUserScheduler assigns RUs of equal size (in terms of tones) to stations to
+ * which the AP has frames to transmit belonging to the AC who gained access to the
+ * channel or higher. The maximum number of stations that can be granted an RU
+ * is configurable. Associated stations are served in a round robin fashion.
+ *
+ * \todo Take the supported channel width of the stations into account while selecting
+ * stations and assigning RUs to them.
+ */
+class RrMultiUserScheduler : public MultiUserScheduler
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  RrMultiUserScheduler ();
+  virtual ~RrMultiUserScheduler ();
+
+protected:
+  void DoDispose (void) override;
+  void DoInitialize (void) override;
+
+private:
+  TxFormat SelectTxFormat (void) override;
+  DlMuInfo ComputeDlMuInfo (void) override;
+  UlMuInfo ComputeUlMuInfo (void) override;
+
+  /**
+   * Check if it is possible to send a BSRP Trigger Frame given the current
+   * time limits.
+   *
+   * \return UL_MU_TX if it is possible to send a BSRP TF, NO_TX otherwise
+   */
+  virtual TxFormat TrySendingBsrpTf (void);
+
+  /**
+   * Check if it is possible to send a Basic Trigger Frame given the current
+   * time limits.
+   *
+   * \return UL_MU_TX if it is possible to send a Basic TF, DL_MU_TX if we can try
+   *         to send a DL MU PPDU and NO_TX if the remaining time is too short
+   */
+  virtual TxFormat TrySendingBasicTf (void);
+
+  /**
+   * Check if it is possible to send a DL MU PPDU given the current
+   * time limits.
+   *
+   * \return DL_MU_TX if it is possible to send a DL MU PPDU, SU_TX if a SU PPDU
+   *         can be transmitted (e.g., there are no HE stations associated or sending
+   *         a DL MU PPDU is not possible and m_forceDlOfdma is false) or NO_TX otherwise
+   */
+  virtual TxFormat TrySendingDlMuPpdu (void);
+
+  /**
+   * Assign an RU index to all the RUs allocated by the given TXVECTOR. Allocated
+   * RUs must all have the same size, except for allocated central 26-tone RUs.
+   *
+   * \param txVector the given TXVECTOR
+   */
+  void AssignRuIndices (WifiTxVector& txVector);
+
+  /**
+   * Notify the scheduler that a station associated with the AP
+   *
+   * \param aid the AID of the station
+   * \param address the MAC address of the station
+   */
+  void NotifyStationAssociated (uint16_t aid, Mac48Address address);
+  /**
+   * Notify the scheduler that a station deassociated with the AP
+   *
+   * \param aid the AID of the station
+   * \param address the MAC address of the station
+   */
+  void NotifyStationDeassociated (uint16_t aid, Mac48Address address);
+
+  /**
+   * Information used to sort stations
+   */
+  struct MasterInfo
+  {
+    uint16_t aid;                 //!< station's AID
+    Mac48Address address;         //!< station's MAC Address
+    double credits;               //!< credits accumulated by the station
+  };
+
+  /**
+   * Information stored for candidate stations
+   */
+  typedef std::pair<std::list<MasterInfo>::iterator, Ptr<const WifiMacQueueItem>> CandidateInfo;
+
+  uint8_t m_nStations;                                  //!< Number of stations/slots to fill
+  bool m_enableTxopSharing;                             //!< allow A-MPDUs of different TIDs in a DL MU PPDU
+  bool m_forceDlOfdma;                                  //!< return DL_OFDMA even if no DL MU PPDU was built
+  bool m_enableUlOfdma;                                 //!< enable the scheduler to also return UL_OFDMA
+  bool m_enableBsrp;                                    //!< send a BSRP before an UL MU transmission
+  bool m_useCentral26TonesRus;                          //!< whether to allocate central 26-tone RUs
+  uint32_t m_ulPsduSize;                                //!< the size in byte of the solicited PSDU
+  std::map<AcIndex, std::list<MasterInfo>> m_staList;   //!< Per-AC list of stations (next to serve first)
+  std::list<CandidateInfo> m_candidates;                //!< Candidate stations for MU TX
+  Time m_maxCredits;                                    //!< Max amount of credits a station can have
+  Ptr<WifiMacQueueItem> m_trigger;                      //!< Trigger Frame to send
+  Time m_tbPpduDuration;                                //!< Duration of the solicited TB PPDUs
+  WifiTxParameters m_txParams;                          //!< TX parameters
+  TriggerFrameType m_ulTriggerType;                     //!< Trigger Frame type for UL MU
+};
+
+} //namespace ns3
+
+#endif /* RR_MULTI_USER_SCHEDULER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he-capabilities.cc ns-3.34/src/wifi/model/he-capabilities.cc
--- ns-3.33/src/wifi/model/he-capabilities.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/he-capabilities.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,516 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2016
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "he-capabilities.h"
-
-namespace ns3 {
-
-HeCapabilities::HeCapabilities ()
-  : m_plusHtcHeSupport (0),
-    m_twtRequesterSupport (0),
-    m_twtResponderSupport (0),
-    m_fragmentationSupport (0),
-    m_maximumNumberOfFragmentedMsdus (0),
-    m_minimumFragmentSize (0),
-    m_triggerFrameMacPaddingDuration (0),
-    m_multiTidAggregationSupport (0),
-    m_heLinkAdaptation (0),
-    m_allAckSupport (0),
-    m_ulMuResponseSchedulingSupport (0),
-    m_aBsrSupport (0),
-    m_broadcastTwtSupport (0),
-    m_32bitBaBitmapSupport (0),
-    m_muCascadeSupport (0),
-    m_ackEnabledMultiTidAggregationSupport (0),
-    m_groupAddressedMultiStaBlockAckInDlMuSupport (0),
-    m_omControlSupport (0),
-    m_ofdmaRaSupport (0),
-    m_maxAmpduLengthExponent (0),
-    m_amsduFragmentationSupport (0),
-    m_flexibleTwtScheduleSupport (0),
-    m_rxControlFrameToMultiBss (0),
-    m_bsrpAmpduAggregation (0),
-    m_qtpSupport (0),
-    m_aBqrSupport (0),
-    m_dualBandSupport (0),
-    m_channelWidthSet (0),
-    m_preamblePuncturingRx (0),
-    m_deviceClass (0),
-    m_ldpcCodingInPayload (0),
-    m_heLtfAndGiForHePpdus (0),
-    m_heLtfAndGiForNdp (0),
-    m_stbcTxAndRx (0),
-    m_doppler (0),
-    m_ulMu (0),
-    m_dcmEncodingTx (0),
-    m_dcmEncodingRx (0),
-    m_ulHeMuPpduPayloadSupport (0),
-    m_suBeamformer (0),
-    m_suBeamformee (0),
-    m_muBeamformer (0),
-    m_beamformeeStsForSmallerOrEqualThan80Mhz (0),
-    m_nstsTotalForSmallerOrEqualThan80Mhz (0),
-    m_beamformeeStsForLargerThan80Mhz (0),
-    m_nstsTotalForLargerThan80Mhz (0),
-    m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz (0),
-    m_numberOfSoundingDimensionsForLargerThan80Mhz (0),
-    m_ngEqual16ForSuFeedbackSupport (0),
-    m_ngEqual16ForMuFeedbackSupport (0),
-    m_codebookSize42ForSuSupport (0),
-    m_codebookSize75ForSuSupport (0),
-    m_beamformingFeedbackWithTriggerFrame (0),
-    m_heErSuPpduPayload (0),
-    m_dlMuMimoOnPartialBandwidth (0),
-    m_ppeThresholdPresent (0),
-    m_srpBasedSrSupport (0),
-    m_powerBoostFactorAlphaSupport (0),
-    m_4TimesHeLtfAnd800NsGiSupportForHePpdus (0),
-    m_highestNssSupportedM1 (0),
-    m_highestMcsSupported (0),
-    m_heSupported (0)
-{
-  m_txBwMap.resize (8,0);
-  m_rxBwMap.resize (8,0);
-}
-
-WifiInformationElementId
-HeCapabilities::ElementId () const
-{
-  return IE_EXTENSION;
-}
-
-WifiInformationElementId
-HeCapabilities::ElementIdExt () const
-{
-  return IE_EXT_HE_CAPABILITIES;
-}
-
-void
-HeCapabilities::SetHeSupported (uint8_t heSupported)
-{
-  m_heSupported = heSupported;
-}
-
-uint8_t
-HeCapabilities::GetInformationFieldSize () const
-{
-  //we should not be here if HE is not supported
-  NS_ASSERT (m_heSupported > 0);
-  return 19; //todo: variable length!
-}
-
-Buffer::Iterator
-HeCapabilities::Serialize (Buffer::Iterator i) const
-{
-  if (m_heSupported < 1)
-    {
-      return i;
-    }
-  return WifiInformationElement::Serialize (i);
-}
-
-uint16_t
-HeCapabilities::GetSerializedSize () const
-{
-  if (m_heSupported < 1)
-    {
-      return 0;
-    }
-  return WifiInformationElement::GetSerializedSize ();
-}
-
-void
-HeCapabilities::SerializeInformationField (Buffer::Iterator start) const
-{
-  if (m_heSupported == 1)
-    {
-      //write the corresponding value for each bit
-      start.WriteHtolsbU32 (GetHeMacCapabilitiesInfo1 ());
-      start.WriteU8 (GetHeMacCapabilitiesInfo2 ());
-      start.WriteHtolsbU64 (GetHePhyCapabilitiesInfo1 ());
-      start.WriteU8 (GetHePhyCapabilitiesInfo2 ());
-      start.WriteHtolsbU32 (GetSupportedMcsAndNss ());
-      //todo: add another 32-bits field if 160 MHz channel is supported (variable length)
-      //todo: optional PPE Threshold field (variable length)
-    }
-}
-
-uint8_t
-HeCapabilities::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
-{
-  Buffer::Iterator i = start;
-  uint32_t macCapabilities1 = i.ReadLsbtohU32 ();
-  uint8_t macCapabilities2 = i.ReadU8 ();
-  uint64_t phyCapabilities1 = i.ReadLsbtohU64 ();
-  uint8_t phyCapabilities2 = i.ReadU8 ();
-  uint32_t mcsset = i.ReadU32 ();
-  SetHeMacCapabilitiesInfo (macCapabilities1, macCapabilities2);
-  SetHePhyCapabilitiesInfo (phyCapabilities1, phyCapabilities2);
-  SetSupportedMcsAndNss (mcsset);
-  //todo: add another 32-bits field if 160 MHz channel is supported (variable length)
-  //todo: optional PPE Threshold field (variable length)
-  return length;
-}
-
-void
-HeCapabilities::SetHeMacCapabilitiesInfo (uint32_t ctrl1, uint8_t ctrl2)
-{
-  m_plusHtcHeSupport = ctrl1 & 0x01;
-  m_twtRequesterSupport = (ctrl1 >> 1) & 0x01;
-  m_twtResponderSupport = (ctrl1 >> 2) & 0x01;
-  m_fragmentationSupport = (ctrl1 >> 3) & 0x03;
-  m_maximumNumberOfFragmentedMsdus = (ctrl1 >> 5) & 0x07;
-  m_minimumFragmentSize = (ctrl1 >> 8) & 0x03;
-  m_triggerFrameMacPaddingDuration = (ctrl1 >> 10) & 0x03;
-  m_multiTidAggregationSupport = (ctrl1 >> 12) & 0x07;
-  m_heLinkAdaptation = (ctrl1 >> 15) & 0x03;
-  m_allAckSupport = (ctrl1 >> 17) & 0x01;
-  m_ulMuResponseSchedulingSupport = (ctrl1 >> 18) & 0x01;
-  m_aBsrSupport = (ctrl1 >> 19) & 0x01;
-  m_broadcastTwtSupport = (ctrl1 >> 20) & 0x01;
-  m_32bitBaBitmapSupport = (ctrl1 >> 21) & 0x01;
-  m_muCascadeSupport = (ctrl1 >> 22) & 0x01;
-  m_ackEnabledMultiTidAggregationSupport = (ctrl1 >> 23) & 0x01;
-  m_groupAddressedMultiStaBlockAckInDlMuSupport = (ctrl1 >> 24) & 0x01;
-  m_omControlSupport = (ctrl1 >> 25) & 0x03;
-  m_ofdmaRaSupport = (ctrl1 >> 26) & 0x01;
-  m_maxAmpduLengthExponent = (ctrl1 >> 27) & 0x03;
-  m_amsduFragmentationSupport = (ctrl1 >> 29) & 0x01;
-  m_flexibleTwtScheduleSupport = (ctrl1 >> 30) & 0x01;
-  m_rxControlFrameToMultiBss = (ctrl1 >> 31) & 0x01;
-  m_bsrpAmpduAggregation = ctrl2 & 0x01;
-  m_qtpSupport = (ctrl2 >> 1) & 0x01;
-  m_aBqrSupport = (ctrl2 >> 2) & 0x01;
-}
-
-uint32_t
-HeCapabilities::GetHeMacCapabilitiesInfo1 () const
-{
-  uint32_t val = 0;
-  val |= m_plusHtcHeSupport & 0x01;
-  val |= (m_twtRequesterSupport & 0x01) << 1;
-  val |= (m_twtResponderSupport & 0x01) << 2;
-  val |= (m_fragmentationSupport & 0x03) << 3;
-  val |= (m_maximumNumberOfFragmentedMsdus & 0x07) << 5;
-  val |= (m_minimumFragmentSize & 0x03) << 8;
-  val |= (m_triggerFrameMacPaddingDuration & 0x03) << 10;
-  val |= (m_multiTidAggregationSupport & 0x07) << 12;
-  val |= (m_heLinkAdaptation & 0x03) << 15;
-  val |= (m_allAckSupport & 0x01) << 17;
-  val |= (m_ulMuResponseSchedulingSupport & 0x01) << 18;
-  val |= (m_aBsrSupport & 0x01) << 19;
-  val |= (m_broadcastTwtSupport & 0x01) << 20;
-  val |= (m_32bitBaBitmapSupport & 0x01) << 21;
-  val |= (m_muCascadeSupport & 0x01) << 22;
-  val |= (m_ackEnabledMultiTidAggregationSupport & 0x01) << 23;
-  val |= (m_groupAddressedMultiStaBlockAckInDlMuSupport & 0x01) << 24;
-  val |= (m_omControlSupport & 0x03) << 25;
-  val |= (m_ofdmaRaSupport & 0x01) << 26;
-  val |= (m_maxAmpduLengthExponent & 0x03) << 27;
-  val |= (m_amsduFragmentationSupport & 0x01) << 29;
-  val |= (m_flexibleTwtScheduleSupport & 0x01) << 30;
-  val |= (m_rxControlFrameToMultiBss & 0x01) << 31;
-  return val;
-}
-
-uint8_t
-HeCapabilities::GetHeMacCapabilitiesInfo2 () const
-{
-  uint8_t val = 0;
-  val |= m_bsrpAmpduAggregation & 0x01;
-  val |= (m_qtpSupport & 0x01) << 1;
-  val |= (m_aBqrSupport & 0x01) << 2;
-  return val;
-}
-
-void
-HeCapabilities::SetHePhyCapabilitiesInfo (uint64_t ctrl1, uint8_t ctrl2)
-{
-  m_dualBandSupport = ctrl1 & 0x01;
-  m_channelWidthSet = (ctrl1 >> 1) & 0x7f;
-  m_preamblePuncturingRx = (ctrl1 >> 8) & 0x0f;
-  m_deviceClass = (ctrl1 >> 12) & 0x01;
-  m_ldpcCodingInPayload = (ctrl1 >> 13) & 0x01;
-  m_heLtfAndGiForHePpdus = (ctrl1 >> 14) & 0x03;
-  m_heLtfAndGiForNdp = (ctrl1 >> 16) & 0x03;
-  m_stbcTxAndRx = (ctrl1 >> 18) & 0x03;
-  m_doppler = (ctrl1 >> 20) & 0x03;
-  m_ulMu = (ctrl1 >> 22) & 0x03;
-  m_dcmEncodingTx = (ctrl1 >> 24) & 0x0f;
-  m_dcmEncodingRx = (ctrl1 >> 27) & 0x0f;
-  m_ulHeMuPpduPayloadSupport = (ctrl1 >> 30) & 0x01;
-  m_suBeamformer = (ctrl1 >> 31) & 0x01;
-  m_suBeamformee = (ctrl1 >> 32) & 0x01;
-  m_muBeamformer = (ctrl1 >> 33) & 0x01;
-  m_beamformeeStsForSmallerOrEqualThan80Mhz = (ctrl1 >> 34) & 0x07;
-  m_nstsTotalForSmallerOrEqualThan80Mhz = (ctrl1 >> 37) & 0x07;
-  m_beamformeeStsForLargerThan80Mhz = (ctrl1 >> 40) & 0x07;
-  m_nstsTotalForLargerThan80Mhz = (ctrl1 >> 43) & 0x07;
-  m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz = (ctrl1 >> 46) & 0x07;
-  m_numberOfSoundingDimensionsForLargerThan80Mhz = (ctrl1 >> 49) & 0x07;
-  m_ngEqual16ForSuFeedbackSupport = (ctrl1 >> 52) & 0x01;
-  m_ngEqual16ForMuFeedbackSupport = (ctrl1 >> 53) & 0x01;
-  m_codebookSize42ForSuSupport = (ctrl1 >> 54) & 0x01;
-  m_codebookSize75ForSuSupport = (ctrl1 >> 55) & 0x01;
-  m_beamformingFeedbackWithTriggerFrame = (ctrl1 >> 56) & 0x07;
-  m_heErSuPpduPayload = (ctrl1 >> 59) & 0x01;
-  m_dlMuMimoOnPartialBandwidth = (ctrl1 >> 60) & 0x01;
-  m_ppeThresholdPresent = (ctrl1 >> 61) & 0x01;
-  m_srpBasedSrSupport = (ctrl1 >> 62) & 0x01;
-  m_powerBoostFactorAlphaSupport = (ctrl1 >> 63) & 0x01;
-  m_4TimesHeLtfAnd800NsGiSupportForHePpdus = ctrl2 & 0x01;
-}
-
-uint64_t
-HeCapabilities::GetHePhyCapabilitiesInfo1 () const
-{
-  uint64_t val = 0;
-  val |= m_dualBandSupport & 0x01;
-  val |= (m_channelWidthSet & 0x7f) << 1;
-  val |= (m_preamblePuncturingRx & 0x0f) << 8;
-  val |= (m_deviceClass & 0x01) << 12;
-  val |= (m_ldpcCodingInPayload & 0x01) << 13;
-  val |= (m_heLtfAndGiForHePpdus & 0x03) << 14;
-  val |= (m_heLtfAndGiForNdp & 0x03) << 16;
-  val |= (m_stbcTxAndRx & 0x03) << 18;
-  val |= (m_doppler & 0x03) << 20;
-  val |= (m_ulMu & 0x03) << 22;
-  val |= (m_dcmEncodingTx & 0x0f) << 24;
-  val |= (m_dcmEncodingRx & 0x0f) << 27;
-  val |= (m_ulHeMuPpduPayloadSupport & 0x01) << 30;
-  val |= (m_suBeamformer & 0x01) << 31;
-  val |= (static_cast<uint64_t> (m_suBeamformee) & 0x01) << 32;
-  val |= (static_cast<uint64_t> (m_muBeamformer) & 0x01) << 33;
-  val |= (static_cast<uint64_t> (m_beamformeeStsForSmallerOrEqualThan80Mhz) & 0x07) << 34;
-  val |= (static_cast<uint64_t> (m_nstsTotalForSmallerOrEqualThan80Mhz) & 0x07) << 37;
-  val |= (static_cast<uint64_t> (m_beamformeeStsForLargerThan80Mhz) & 0x07) << 40;
-  val |= (static_cast<uint64_t> (m_nstsTotalForLargerThan80Mhz) & 0x07) << 43;
-  val |= (static_cast<uint64_t> (m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz) & 0x07) << 46;
-  val |= (static_cast<uint64_t> (m_numberOfSoundingDimensionsForLargerThan80Mhz) & 0x07) << 49;
-  val |= (static_cast<uint64_t> (m_ngEqual16ForSuFeedbackSupport) & 0x01) << 52;
-  val |= (static_cast<uint64_t> (m_ngEqual16ForMuFeedbackSupport) & 0x01) << 53;
-  val |= (static_cast<uint64_t> (m_codebookSize42ForSuSupport) & 0x01) << 54;
-  val |= (static_cast<uint64_t> (m_codebookSize75ForSuSupport) & 0x01) << 55;
-  val |= (static_cast<uint64_t> (m_beamformingFeedbackWithTriggerFrame) & 0x07) << 56;
-  val |= (static_cast<uint64_t> (m_heErSuPpduPayload) & 0x01) << 59;
-  val |= (static_cast<uint64_t> (m_dlMuMimoOnPartialBandwidth) & 0x01) << 60;
-  val |= (static_cast<uint64_t> (m_ppeThresholdPresent) & 0x01) << 61;
-  val |= (static_cast<uint64_t> (m_srpBasedSrSupport) & 0x01) << 62;
-  val |= (static_cast<uint64_t> (m_powerBoostFactorAlphaSupport) & 0x01) << 63;
-  return val;
-}
-
-uint8_t
-HeCapabilities::GetHePhyCapabilitiesInfo2 () const
-{
-  uint8_t val = 0;
-  val |= m_4TimesHeLtfAnd800NsGiSupportForHePpdus & 0x01;
-  return val;
-}
-
-void
-HeCapabilities::SetSupportedMcsAndNss (uint16_t ctrl)
-{
-  m_highestNssSupportedM1 = ctrl & 0x07;
-  m_highestMcsSupported = (ctrl >> 3) & 0x07;
-  NS_ASSERT (m_highestMcsSupported <= 4);
-  uint8_t i;
-  for (i = 0; i < 5; i++)
-    {
-      m_txBwMap[i] = (ctrl >> (6 + i)) & 0x01;
-    }
-  for (i = 0; i < 5; i++)
-    {
-      m_rxBwMap[i] = (ctrl >> (11 + i)) & 0x01;
-    }
-  //todo: MCS NSS Descriptors
-}
-
-uint16_t
-HeCapabilities::GetSupportedMcsAndNss () const
-{
-  uint16_t val = 0;
-  val |= m_highestNssSupportedM1 & 0x07;
-  val |= (m_highestMcsSupported & 0x07) << 3;
-  uint8_t i;
-  for (i = 0; i < 5; i++)
-    {
-      val |= (m_txBwMap[i] & 0x01) << (6 + 1);
-    }
-  for (i = 0; i < 5; i++)
-    {
-      val |= (m_rxBwMap[i] & 0x01) << (11 + 1);
-    }
-  //todo: MCS NSS Descriptors
-  return val;
-}
-
-//todo: PPE threshold
-
-bool
-HeCapabilities::IsSupportedTxMcs (uint8_t mcs) const
-{
-  NS_ASSERT (mcs >= 0 && mcs <= 11);
-  if (mcs <= 7)
-    {
-      return true;
-    }
-  if (mcs == 8 && m_highestMcsSupported >= 1)
-    {
-      return true;
-    }
-  if (mcs == 9 && m_highestMcsSupported >= 2)
-    {
-      return true;
-    }
-  if (mcs == 10 && m_highestMcsSupported >= 3)
-    {
-      return true;
-    }
-  if (mcs == 11 && m_highestMcsSupported == 4)
-    {
-      return true;
-    }
-  return false;
-}
-
-bool
-HeCapabilities::IsSupportedRxMcs (uint8_t mcs) const
-{
-  NS_ASSERT (mcs >= 0 && mcs <= 11);
-  if (mcs <= 7)
-    {
-      return true;
-    }
-  if (mcs == 8 && m_highestMcsSupported >= 1)
-    {
-      return true;
-    }
-  if (mcs == 9 && m_highestMcsSupported >= 2)
-    {
-      return true;
-    }
-  if (mcs == 10 && m_highestMcsSupported >= 3)
-    {
-      return true;
-    }
-  if (mcs == 11 && m_highestMcsSupported == 4)
-    {
-      return true;
-    }
-  return false;
-}
-
-void
-HeCapabilities::SetChannelWidthSet (uint8_t channelWidthSet)
-{
-  NS_ASSERT (channelWidthSet <= 0x2f);
-  m_channelWidthSet = channelWidthSet;
-}
-
-void
-HeCapabilities::SetLdpcCodingInPayload (uint8_t ldpcCodingInPayload)
-{
-  m_ldpcCodingInPayload = ldpcCodingInPayload;
-}
-
-void
-HeCapabilities::SetHeLtfAndGiForHePpdus (uint8_t heLtfAndGiForHePpdus)
-{
-  NS_ASSERT (heLtfAndGiForHePpdus <= 0x03);
-  m_heLtfAndGiForHePpdus = heLtfAndGiForHePpdus;
-}
-
-void
-HeCapabilities::SetMaxAmpduLength (uint32_t maxAmpduLength)
-{
-  for (uint8_t i = 0; i <= 3; i++)
-    {
-      if ((1ul << (20 + i)) - 1 == maxAmpduLength)
-        {
-          m_maxAmpduLengthExponent = i;
-          return;
-        }
-    }
-  NS_ABORT_MSG ("Invalid A-MPDU Max Length value");
-}
-
-void
-HeCapabilities::SetHighestMcsSupported (uint8_t mcs)
-{
-  NS_ASSERT (mcs >= 7 && mcs <= 11);
-  m_highestMcsSupported = mcs - 7;
-}
-
-void
-HeCapabilities::SetHighestNssSupported (uint8_t nss)
-{
-  NS_ASSERT (nss >= 1 && nss <= 8);
-  m_highestNssSupportedM1 = nss - 1;
-}
-
-uint8_t
-HeCapabilities::GetChannelWidthSet (void) const
-{
-  return m_channelWidthSet;
-}
-
-uint8_t
-HeCapabilities::GetLdpcCodingInPayload (void) const
-{
-  return m_ldpcCodingInPayload;
-}
-
-uint8_t
-HeCapabilities::GetHeLtfAndGiForHePpdus (void) const
-{
-  return m_heLtfAndGiForHePpdus;
-}
-
-uint8_t
-HeCapabilities::GetHighestMcsSupported (void) const
-{
-  return m_highestMcsSupported + 7;
-}
-
-uint8_t
-HeCapabilities::GetHighestNssSupported (void) const
-{
-  return m_highestNssSupportedM1 + 1;
-}
-
-uint32_t
-HeCapabilities::GetMaxAmpduLength (void) const
-{
-  return (1ul << (20 + m_maxAmpduLengthExponent)) - 1;
-}
-
-std::ostream &
-operator << (std::ostream &os, const HeCapabilities &HeCapabilities)
-{
-  os << HeCapabilities.GetHeMacCapabilitiesInfo1 () << "|"
-     << +HeCapabilities.GetHeMacCapabilitiesInfo2 () << "|"
-     << HeCapabilities.GetHePhyCapabilitiesInfo1 () << "|"
-     << +HeCapabilities.GetHePhyCapabilitiesInfo2 () << "|"
-     << HeCapabilities.GetSupportedMcsAndNss ();
-  return os;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he-capabilities.h ns-3.34/src/wifi/model/he-capabilities.h
--- ns-3.33/src/wifi/model/he-capabilities.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/he-capabilities.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,288 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2016
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef HE_CAPABILITIES_H
-#define HE_CAPABILITIES_H
-
-#include "wifi-information-element.h"
-
-namespace ns3 {
-
-/**
- * \ingroup wifi
- *
- * The IEEE 802.11ax HE Capabilities
- */
-class HeCapabilities : public WifiInformationElement
-{
-public:
-  HeCapabilities ();
-
-  // Implementations of pure virtual methods of WifiInformationElement
-  WifiInformationElementId ElementId () const;
-  WifiInformationElementId ElementIdExt () const;
-  uint8_t GetInformationFieldSize () const;
-  void SerializeInformationField (Buffer::Iterator start) const;
-  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length);
-  /* This information element is a bit special in that it is only
-     included if the STA is an HE STA. To support this we
-     override the Serialize and GetSerializedSize methods of
-     WifiInformationElement. */
-  Buffer::Iterator Serialize (Buffer::Iterator start) const;
-  uint16_t GetSerializedSize () const;
-
-  /**
-   * Set HE supported
-   * \param heSupported the HE supported indicator
-   */
-  void SetHeSupported (uint8_t heSupported);
-
-  /**
-   * Set the HE MAC Capabilities Info field in the HE Capabilities information element.
-   *
-   * \param ctrl1 the HE MAC Capabilities Info field 1 in the HE Capabilities information element
-   * \param ctrl2 the HE MAC Capabilities Info field 2 in the HE Capabilities information element
-   */
-  void SetHeMacCapabilitiesInfo (uint32_t ctrl1, uint8_t ctrl2);
-  /**
-   * Set the HE PHY Capabilities Info field in the HE Capabilities information element.
-   *
-   * \param ctrl1 the HE PHY Capabilities Info field 1 in the HE Capabilities information element
-   * \param ctrl2 the HE PHY Capabilities Info field 2 in the HE Capabilities information element
-   */
-  void SetHePhyCapabilitiesInfo (uint64_t ctrl1, uint8_t ctrl2);
-  /**
-   * Set the MCS and NSS field in the HE Capabilities information element.
-   *
-   * \param ctrl the MCS and NSS field in the HE Capabilities information element
-   */
-  void SetSupportedMcsAndNss (uint16_t ctrl);
-
-  /**
-   * Return the 4 first octets of the HE MAC Capabilities Info field in the HE Capabilities information element.
-   *
-   * \return the 4 first octets of the HE MAC Capabilities Info field in the HE Capabilities information element
-   */
-  uint32_t GetHeMacCapabilitiesInfo1 () const;
-  /**
-   * Return the last octet of the HE MAC Capabilities Info field in the HE Capabilities information element.
-   *
-   * \return the last octet of the HE MAC Capabilities Info field in the HE Capabilities information element
-   */
-  uint8_t GetHeMacCapabilitiesInfo2 () const;
-  /**
-   * Return the 8 first octets of the HE PHY Capabilities Info field in the HE Capabilities information element.
-   *
-   * \return the 8 first octets of the HE PHY Capabilities Info field in the HE Capabilities information element
-   */
-  uint64_t GetHePhyCapabilitiesInfo1 () const;
-  /**
-   * Return the last octet of the HE PHY Capabilities Info field in the HE Capabilities information element.
-   *
-   * \return the last octet of the HE PHY Capabilities Info field in the HE Capabilities information element
-   */
-  uint8_t GetHePhyCapabilitiesInfo2 () const;
-  /**
-   * Return the MCS and NSS field in the HE Capabilities information element.
-   *
-   * \return the MCS and NSS field in the HE Capabilities information element
-   */
-  uint16_t GetSupportedMcsAndNss () const;
-
-  // PHY Capabilities Info fields
-  /**
-   * Set channel width set.
-   *
-   * \param channelWidthSet the channel width set
-   */
-  void SetChannelWidthSet (uint8_t channelWidthSet);
-  /**
-   * Set indication whether the transmission and reception of LDPC encoded packets is supported.
-   *
-   * \param ldpcCodingInPayload indication whether the transmission and reception of LDPC encoded packets is supported
-   */
-  void SetLdpcCodingInPayload (uint8_t ldpcCodingInPayload);
-  /**
-   * Set HE LTF and GI for HE PDPUs.
-   *
-   * \param heLtfAndGiForHePpdus the HE LTF and GI
-   */
-  void SetHeLtfAndGiForHePpdus (uint8_t heLtfAndGiForHePpdus);
-  /**
-   * Get channel width set.
-   *
-   * \returns the channel width set
-   */
-  uint8_t GetChannelWidthSet (void) const;
-  /**
-   * Indicates support for the transmission and reception of LDPC encoded packets.
-   *
-   * \returns indication whether the transmission and reception of LDPC encoded packets is supported
-   */
-  uint8_t GetLdpcCodingInPayload (void) const;
-  /**
-   * Get HE LTF and GI for HE PDPUs.
-   *
-   * \returns the HE LTF and GI
-   */
-  uint8_t GetHeLtfAndGiForHePpdus (void) const;
-  /**
-   * Get highest MCS supported.
-   *
-   * \returns the highest MCS is supported
-   */
-  uint8_t GetHighestMcsSupported (void) const;
-  /**
-   * Get highest NSS supported.
-   *
-   * \returns the highest supported NSS
-   */
-  uint8_t GetHighestNssSupported (void) const;
-
-  // MAC Capabilities Info fields
-  /**
-   * Set the maximum AMPDU length.
-   *
-   * \param maxAmpduLength 2^(20 + x) - 1, x in the range 0 to 3
-   */
-  void SetMaxAmpduLength (uint32_t maxAmpduLength);
-
-  // MCS and NSS field information
-  /**
-   * Set highest MCS supported.
-   *
-   * \param mcs the MCS
-   */
-  void SetHighestMcsSupported (uint8_t mcs);
-  /**
-   * Set highest NSS supported.
-   *
-   * \param nss the NSS
-   */
-  void SetHighestNssSupported (uint8_t nss);
-
-  /**
-   * Is RX MCS supported.
-   *
-   * \param mcs the MCS
-   * \returns true if MCS transmit supported
-   */
-  bool IsSupportedTxMcs (uint8_t mcs) const;
-  /**
-   * Is RX MCS supported.
-   *
-   * \param mcs the MCS
-   * \returns true if MCS receive supported
-   */
-  bool IsSupportedRxMcs (uint8_t mcs) const;
-
-  /**
-   * Return the maximum A-MPDU length.
-   *
-   * \return the maximum A-MPDU length
-   */
-  uint32_t GetMaxAmpduLength (void) const;
-
-
-private:
-  //MAC Capabilities Info fields
-  uint8_t m_plusHtcHeSupport;                            //!< HTC HE support
-  uint8_t m_twtRequesterSupport;                         //!< TWT requester support
-  uint8_t m_twtResponderSupport;                         //!< TWT responder support
-  uint8_t m_fragmentationSupport;                        //!< fragmentation support
-  uint8_t m_maximumNumberOfFragmentedMsdus;              //!< maximum number of fragmentation MSDUs
-  uint8_t m_minimumFragmentSize;                         //!< minimum fragment size
-  uint8_t m_triggerFrameMacPaddingDuration;              //!< trigger frame MAC padding duration
-  uint8_t m_multiTidAggregationSupport;                  //!< multi-TID aggregation support
-  uint8_t m_heLinkAdaptation;                            //!< HE link adaptation
-  uint8_t m_allAckSupport;                               //!< all Ack support
-  uint8_t m_ulMuResponseSchedulingSupport;               //!< UL MU response scheduling support
-  uint8_t m_aBsrSupport;                                 //!< BSR support
-  uint8_t m_broadcastTwtSupport;                         //!< broadcast TXT support
-  uint8_t m_32bitBaBitmapSupport;                        //!< 32-bit BA bitmap support
-  uint8_t m_muCascadeSupport;                            //!< MU cascade support
-  uint8_t m_ackEnabledMultiTidAggregationSupport;        //!< ack enabled multi-TID aggregation support
-  uint8_t m_groupAddressedMultiStaBlockAckInDlMuSupport; //!< group addressed multi-STA BlockAck in DL support
-  uint8_t m_omControlSupport;                            //!< operation mode control support
-  uint8_t m_ofdmaRaSupport;                              //!< OFDMA RA support
-  uint8_t m_maxAmpduLengthExponent;                      //!< maximum A-MPDU length exponent
-  uint8_t m_amsduFragmentationSupport;                   //!< A-MSDU fragmentation support
-  uint8_t m_flexibleTwtScheduleSupport;                  //!< flexible TWT schedule support
-  uint8_t m_rxControlFrameToMultiBss;                    //!< receive control frame to multi-BSS
-  uint8_t m_bsrpAmpduAggregation;                        //!< BSRP A-MPDU aggregation
-  uint8_t m_qtpSupport;                                  //!< QTP support
-  uint8_t m_aBqrSupport;                                 //!< ABQR support
-
-  //PHY Capabilities Info fields
-  uint8_t m_dualBandSupport;                         //!< dual band support
-  uint8_t m_channelWidthSet;                         //!< channel width set
-  uint8_t m_preamblePuncturingRx;                    //!< preamble puncturing receive
-  uint8_t m_deviceClass;                             //!< device class
-  uint8_t m_ldpcCodingInPayload;                     //!< LDPC coding in payload
-  uint8_t m_heLtfAndGiForHePpdus;                    //!< HE-LTF and GI for HE-PPDUs
-  uint8_t m_heLtfAndGiForNdp;                        //!< HE-LTF and GI for NDP
-  uint8_t m_stbcTxAndRx;                             //!< STBC transmit and receive
-  uint8_t m_doppler;                                 //!< Doppler
-  uint8_t m_ulMu;                                    //!< UL MU
-  uint8_t m_dcmEncodingTx;                           //!< DCM encoding transmit
-  uint8_t m_dcmEncodingRx;                           //!< DCM encoding receive
-  uint8_t m_ulHeMuPpduPayloadSupport;                //!< UL HE-MU-PDPU payload support
-  uint8_t m_suBeamformer;                            //!< SU beamformer
-  uint8_t m_suBeamformee;                            //!< SU beamformee
-  uint8_t m_muBeamformer;                            //!< MU beamformer
-  uint8_t m_beamformeeStsForSmallerOrEqualThan80Mhz; //!< beam formee STS for < 80 MHz
-  uint8_t m_nstsTotalForSmallerOrEqualThan80Mhz;     //!< STS total for < 80 MHz
-  uint8_t m_beamformeeStsForLargerThan80Mhz;         //!< beamformee STS for > 80MHz
-  uint8_t m_nstsTotalForLargerThan80Mhz;             //!< STS total for > 80 MHz
-  uint8_t m_numberOfSoundingDimensionsForSmallerOrEqualThan80Mhz; //!< # of sounding dimensions for < 80 MHz
-  uint8_t m_numberOfSoundingDimensionsForLargerThan80Mhz;         //!< # of sounding dimensions for > 80 MHz
-  uint8_t m_ngEqual16ForSuFeedbackSupport;          //!< equal 16 for SU feedback
-  uint8_t m_ngEqual16ForMuFeedbackSupport;          //!< equal 16 for MU feedback
-  uint8_t m_codebookSize42ForSuSupport;             //!< codebook size 42 for SU
-  uint8_t m_codebookSize75ForSuSupport;             //!< codebook size 75 for SU
-  uint8_t m_beamformingFeedbackWithTriggerFrame;    //!< beamforming feedback with trigger frame
-  uint8_t m_heErSuPpduPayload;                      //!< HE-ER-SU-PPDU payload
-  uint8_t m_dlMuMimoOnPartialBandwidth;             //!< DL MU-MIMO on partial bandwidth
-  uint8_t m_ppeThresholdPresent;                    //!< PPE threshold present
-  uint8_t m_srpBasedSrSupport;                      //!< SRP based SR support
-  uint8_t m_powerBoostFactorAlphaSupport;           //!< power boost factor alpha support
-  uint8_t m_4TimesHeLtfAnd800NsGiSupportForHePpdus; //!< 4 times HE-LFT and 800ns GI support for HE-PPDUs
-
-  //MCS and NSS field information
-  uint8_t m_highestNssSupportedM1; //!< highest NSS support M1
-  uint8_t m_highestMcsSupported;   //!< highest MCS support
-  std::vector<uint8_t> m_txBwMap;  //!< transmit BW map
-  std::vector<uint8_t> m_rxBwMap;  //!< receive BW map
-
-  /// This is used to decide if this element should be added to the frame or not
-  uint8_t m_heSupported;
-};
-
-/**
- * output stream output operator
- * \param os the output stream
- * \param HeCapabilities the HE capabilities
- * \returns the output stream
- */
-std::ostream &operator << (std::ostream &os, const HeCapabilities &HeCapabilities);
-
-} //namespace ns3
-
-#endif /* HE_CAPABILITY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he-configuration.cc ns-3.34/src/wifi/model/he-configuration.cc
--- ns-3.33/src/wifi/model/he-configuration.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/he-configuration.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,91 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018 University of Washington
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-#include "ns3/log.h"
-#include "ns3/nstime.h"
-#include "ns3/uinteger.h"
-#include "he-configuration.h"
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("HeConfiguration");
-NS_OBJECT_ENSURE_REGISTERED (HeConfiguration);
-
-HeConfiguration::HeConfiguration ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-TypeId
-HeConfiguration::GetTypeId (void)
-{
-  static ns3::TypeId tid = ns3::TypeId ("ns3::HeConfiguration")
-    .SetParent<Object> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<HeConfiguration> ()
-    .AddAttribute ("GuardInterval",
-                   "Specify the shortest guard interval duration that can be used for HE transmissions."
-                   "Possible values are 800ns, 1600ns or 3200ns.",
-                   TimeValue (NanoSeconds (3200)),
-                   MakeTimeAccessor (&HeConfiguration::GetGuardInterval,
-                                     &HeConfiguration::SetGuardInterval),
-                   MakeTimeChecker (NanoSeconds (800), NanoSeconds (3200)))
-    .AddAttribute ("BssColor",
-                   "The BSS color",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&HeConfiguration::m_bssColor),
-                   MakeUintegerChecker<uint8_t> ())
-    .AddAttribute ("MpduBufferSize",
-                   "The MPDU buffer size for receiving A-MPDUs",
-                   UintegerValue (64),
-                   MakeUintegerAccessor (&HeConfiguration::GetMpduBufferSize,
-                                         &HeConfiguration::SetMpduBufferSize),
-                   MakeUintegerChecker<uint16_t> (64, 256))
-    ;
-    return tid;
-}
-
-void
-HeConfiguration::SetGuardInterval (Time guardInterval)
-{
-  NS_LOG_FUNCTION (this << guardInterval);
-  NS_ASSERT (guardInterval == NanoSeconds (800) || guardInterval == NanoSeconds (1600) || guardInterval == NanoSeconds (3200));
-  m_guardInterval = guardInterval;
-}
-
-Time
-HeConfiguration::GetGuardInterval (void) const
-{
-  return m_guardInterval;
-}
-
-void
-HeConfiguration::SetMpduBufferSize (uint16_t size)
-{
-  NS_LOG_FUNCTION (this << size);
-  m_mpduBufferSize = size;
-}
-
-uint16_t
-HeConfiguration::GetMpduBufferSize (void) const
-{
-  return m_mpduBufferSize;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he-configuration.h ns-3.34/src/wifi/model/he-configuration.h
--- ns-3.33/src/wifi/model/he-configuration.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/he-configuration.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,73 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018 University of Washington
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-#ifndef HE_CONFIGURATION_H
-#define HE_CONFIGURATION_H
-
-#include "ns3/object.h"
-#include "ns3/nstime.h"
-
-namespace ns3 {
-
-/**
- * \brief HE configuration
- * \ingroup wifi
- *
- * This object stores HE configuration information, for use in modifying
- * AP or STA behavior and for constructing HE-related information elements.
- *
- */
-class HeConfiguration : public Object
-{
-public:
-  HeConfiguration ();
-
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-
-  /**
-   * \param guardInterval the supported HE guard interval
-   */
-  void SetGuardInterval (Time guardInterval);
-  /**
-   * \return the supported HE guard interval
-   */
-  Time GetGuardInterval (void) const;
-  /**
-   * \param size the MPDU buffer size to receive A-MPDUs
-   */
-  void SetMpduBufferSize (uint16_t size);
-  /**
-   * \return the MPDU buffer size to receive A-MPDUs
-   */
-  uint16_t GetMpduBufferSize (void) const;
-
-
-private:
-  Time m_guardInterval;      //!< Supported HE guard interval
-  uint8_t m_bssColor;        //!< BSS color
-  uint16_t m_mpduBufferSize; //!< MPDU buffer size
-};
-
-} //namespace ns3
-
-#endif /* HE_CONFIGURATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he-operation.cc ns-3.34/src/wifi/model/he-operation.cc
--- ns-3.33/src/wifi/model/he-operation.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/he-operation.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,187 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2017 Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "he-operation.h"
-
-namespace ns3 {
-
-HeOperation::HeOperation ()
-  : m_bssColor (0),
-    m_defaultPEDuration (0),
-    m_twtRequired (0),
-    m_heDurationBasedRtsThreshold (0),
-    m_partialBssColor (0),
-    m_maxBssidIndicator (0),
-    m_txBssidIndicator (0),
-    m_bssColorDisabled (0),
-    m_dualBeacon (0),
-    m_basicHeMcsAndNssSet (0),
-    m_heSupported (0)
-{
-}
-
-WifiInformationElementId
-HeOperation::ElementId () const
-{
-  return IE_EXTENSION;
-}
-
-WifiInformationElementId
-HeOperation::ElementIdExt () const
-{
-  return IE_EXT_HE_OPERATION;
-}
-
-void
-HeOperation::SetHeSupported (uint8_t heSupported)
-{
-  m_heSupported = heSupported;
-}
-
-uint8_t
-HeOperation::GetInformationFieldSize () const
-{
-  //we should not be here if he is not supported
-  NS_ASSERT (m_heSupported > 0);
-  return 7;
-}
-
-void
-HeOperation::SetHeOperationParameters (uint32_t ctrl)
-{
-  m_bssColor = ctrl & 0x3f;
-  m_defaultPEDuration = (ctrl >> 6) & 0x07;
-  m_twtRequired = (ctrl >> 9) & 0x01;
-  m_heDurationBasedRtsThreshold = (ctrl >> 10) & 0x03ff;
-  m_partialBssColor = (ctrl >> 20) & 0x01;
-  m_maxBssidIndicator = (ctrl >> 21) & 0xff;
-  m_txBssidIndicator = (ctrl >> 29) & 0x01;
-  m_bssColorDisabled = (ctrl >> 30) & 0x01;
-  m_dualBeacon = (ctrl >> 31) & 0x01;
-}
-
-uint32_t
-HeOperation::GetHeOperationParameters () const
-{
-  uint32_t val = 0;
-  val |= m_bssColor & 0x3f;
-  val |= (m_defaultPEDuration & 0x07) << 6;
-  val |= (m_twtRequired & 0x01) << 9;
-  val |= (m_heDurationBasedRtsThreshold & 0x03ff) << 10;
-  val |= (m_partialBssColor & 0x01) << 20;
-  val |= (m_maxBssidIndicator & 0xff) << 21;
-  val |= (m_txBssidIndicator & 0x01) << 29;
-  val |= (m_bssColorDisabled & 0x01) << 30;
-  val |= (m_dualBeacon & 0x01) << 31;
-  return val;
-}
-
-void
-HeOperation::SetMaxHeMcsPerNss (uint8_t nss, uint8_t maxHeMcs)
-{
-  NS_ASSERT ((maxHeMcs >= 7 && maxHeMcs <= 11) && (nss >= 1 && nss <= 8));
-  uint8_t val = 3; //3 means not supported
-  if (maxHeMcs > 9) //MCS 0 - 11
-    {
-      val = 2;
-    }
-  else if (maxHeMcs > 7) //MCS 0 - 9
-    {
-      val = 1;
-    }
-  else if (maxHeMcs == 7) //MCS 0 - 7
-    {
-      val = 0;
-    }
-  m_basicHeMcsAndNssSet |= ((val & 0x03) << ((nss - 1) * 2));
-}
-
-uint16_t
-HeOperation::GetBasicHeMcsAndNssSet (void) const
-{
-  return m_basicHeMcsAndNssSet;
-}
-
-void
-HeOperation::SetBssColor (uint8_t bssColor)
-{
-  NS_ABORT_UNLESS (bssColor < 64); // 6 bits
-  m_bssColor = bssColor;
-  m_bssColorDisabled = 0;
-}
-
-uint8_t
-HeOperation::GetBssColor (void) const
-{
-  return m_bssColor;
-}
-
-Buffer::Iterator
-HeOperation::Serialize (Buffer::Iterator i) const
-{
-  if (m_heSupported < 1)
-    {
-      return i;
-    }
-  return WifiInformationElement::Serialize (i);
-}
-
-uint16_t
-HeOperation::GetSerializedSize () const
-{
-  if (m_heSupported < 1)
-    {
-      return 0;
-    }
-  return WifiInformationElement::GetSerializedSize ();
-}
-
-void
-HeOperation::SerializeInformationField (Buffer::Iterator start) const
-{
-  if (m_heSupported == 1)
-    {
-      //write the corresponding value for each bit
-      start.WriteHtolsbU32 (GetHeOperationParameters ());
-      start.WriteU16 (GetBasicHeMcsAndNssSet ());
-      //todo: VHT Operation Information (variable)
-    }
-}
-
-uint8_t
-HeOperation::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
-{
-  Buffer::Iterator i = start;
-  uint32_t heOperationParameters = i.ReadLsbtohU32 ();
-  m_basicHeMcsAndNssSet = i.ReadU16 ();
-  SetHeOperationParameters (heOperationParameters);
-  //todo: VHT Operation Information (variable)
-  return length;
-}
-
-std::ostream &
-operator << (std::ostream &os, const HeOperation &HeOperation)
-{
-  os << HeOperation.GetHeOperationParameters () << "|"
-     << HeOperation.GetBasicHeMcsAndNssSet ();
-  return os;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he-operation.h ns-3.34/src/wifi/model/he-operation.h
--- ns-3.33/src/wifi/model/he-operation.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/he-operation.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,132 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2017 Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef HE_OPERATION_H
-#define HE_OPERATION_H
-
-#include "wifi-information-element.h"
-
-namespace ns3 {
-
-/**
- * \brief The HE Operation Information Element
- * \ingroup wifi
- *
- * This class knows how to serialise and deserialise
- * the HE Operation Information Element
- */
-class HeOperation : public WifiInformationElement
-{
-public:
-  HeOperation ();
-
-  // Implementations of pure virtual methods of WifiInformationElement
-  WifiInformationElementId ElementId () const;
-  WifiInformationElementId ElementIdExt () const;
-  uint8_t GetInformationFieldSize () const;
-  void SerializeInformationField (Buffer::Iterator start) const;
-  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length);
-  /* This information element is a bit special in that it is only
-     included if the STA is a HE STA. To support this we
-     override the Serialize and GetSerializedSize methods of
-     WifiInformationElement. */
-  Buffer::Iterator Serialize (Buffer::Iterator start) const;
-  uint16_t GetSerializedSize () const;
-
-  /**
-   * Set the HE supported information element.
-   *
-   * \param heSupported the HE supported information element
-   */
-  void SetHeSupported (uint8_t heSupported);
-
-  /**
-   * Set the HE Operation Parameters field in the HE Operation information element.
-   *
-   * \param ctrl the HE Operation Parameters field in the HE Operation information element
-   */
-  void SetHeOperationParameters (uint32_t ctrl);
-  /**
-   * Set the Basic HE-MCS and NSS field in the HE Operation information element
-   * by specifying the tuple (<i>nss</i>, <i>maxMcs</i>).
-   *
-   * \param nss the NSS
-   * \param maxHeMcs the maximum supported HE-MCS value corresponding to that NSS
-   */
-  void SetMaxHeMcsPerNss (uint8_t nss, uint8_t maxHeMcs);
-
-  /**
-   * Return the HE Operation Parameters field in the HE Operation information element.
-   *
-   * \return the HE Operation Parameters field in the HE Operation information element
-   */
-  uint32_t GetHeOperationParameters (void) const;
-  /**
-   * Return the Basic HE-MCS And Nss field in the HE Operation information element.
-   *
-   * \return the Basic HE-MCS And Nss field in the HE Operation information element
-   */
-  uint16_t GetBasicHeMcsAndNssSet (void) const;
-  /**
-   * Set the BSS color
-   * \param bssColor the BSS color value
-   */
-  void SetBssColor (uint8_t bssColor);
-  /**
-   * Get the BSS color
-   * \return the BSS color value
-   */
-  uint8_t GetBssColor (void) const;
-
-
-private:
-  //HE Operation Parameters fields
-  uint8_t m_bssColor;                     //!< BSS color
-  uint8_t m_defaultPEDuration;            //!< default PE duration
-  uint8_t m_twtRequired;                  //!< TWT required
-  uint16_t m_heDurationBasedRtsThreshold; //!< HE duration based RTS threshold
-  uint8_t m_partialBssColor;              //!< partial BSS color
-  uint8_t m_maxBssidIndicator;            //!< max BSSID indicator
-  uint8_t m_txBssidIndicator;             //!< TX BSSID indicator
-  uint8_t m_bssColorDisabled;             //!< BSS color disabled
-  uint8_t m_dualBeacon;                   //!< Dual Beacon
-
-  //Basic HE-MCS and NSS Set
-  uint16_t m_basicHeMcsAndNssSet; ///< basic HE MCS NSS set
-
-  //TODO: VHT Operation Information subfields not defined in the standard yet.
-
-  /// This is used to decide whether this element should be added to the frame or not
-  uint8_t m_heSupported;
-};
-
-/**
- * output stream output operator
- *
- * \param os output stream
- * \param HeOperation the HE operation
- *
- * \returns output stream
- */
-std::ostream &operator << (std::ostream &os, const HeOperation &HeOperation);
-
-} //namespace ns3
-
-#endif /* HE_OPERATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he-ru.cc ns-3.34/src/wifi/model/he-ru.cc
--- ns-3.33/src/wifi/model/he-ru.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/he-ru.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,356 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Stefano Avallone <stavallo@unina.it>
- */
-
-#include "he-ru.h"
-#include "ns3/abort.h"
-
-namespace ns3 {
-
-const HeRu::SubcarrierGroups HeRu::m_heRuSubcarrierGroups =
-{
-  // RUs in a 20 MHz HE PPDU (Table 28-6)
-  { {20, HeRu::RU_26_TONE}, { /* 1 */ {{-121, -96}},
-      /* 2 */ {{-95, -70}},
-      /* 3 */ {{-68, -43}},
-      /* 4 */ {{-42, -17}},
-      /* 5 */ {{-16, -4}, {4, 16}},
-      /* 6 */ {{17, 42}},
-      /* 7 */ {{43, 68}},
-      /* 8 */ {{70, 95}},
-      /* 9 */ {{96, 121}} } },
-  { {20, HeRu::RU_52_TONE}, { /* 1 */ {{-121, -70}},
-      /* 2 */ {{-68, -17}},
-      /* 3 */ {{17, 68}},
-      /* 4 */ {{70, 121}} } },
-  { {20, HeRu::RU_106_TONE}, { /* 1 */ {{-122, -17}},
-      /* 2 */ {{17, 122}} } },
-  { {20, HeRu::RU_242_TONE}, { /* 1 */ {{-122, -2}, {2, 122}} } },
-  // RUs in a 40 MHz HE PPDU (Table 28-7)
-  { {40, HeRu::RU_26_TONE}, { /* 1 */ {{-243, -218}},
-      /* 2 */ {{-217, -192}},
-      /* 3 */ {{-189, -164}},
-      /* 4 */ {{-163, -138}},
-      /* 5 */ {{-136, -111}},
-      /* 6 */ {{-109, -84}},
-      /* 7 */ {{-83, -58}},
-      /* 8 */ {{-55, -30}},
-      /* 9 */ {{-29, -4}},
-      /* 10 */ {{4, 29}},
-      /* 11 */ {{30, 55}},
-      /* 12 */ {{58, 83}},
-      /* 13 */ {{84, 109}},
-      /* 14 */ {{111, 136}},
-      /* 15 */ {{138, 163}},
-      /* 16 */ {{164, 189}},
-      /* 17 */ {{192, 217}},
-      /* 18 */ {{218, 243}} } },
-  { {40, HeRu::RU_52_TONE}, { /* 1 */ {{-243, -192}},
-      /* 2 */ {{-189, -138}},
-      /* 3 */ {{-109, -58}},
-      /* 4 */ {{-55, -4}},
-      /* 5 */ {{4, 55}},
-      /* 6 */ {{58, 109}},
-      /* 7 */ {{138, 189}},
-      /* 8 */ {{192, 243}} } },
-  { {40, HeRu::RU_106_TONE}, { /* 1 */ {{-243, -138}},
-      /* 2 */ {{-109, -4}},
-      /* 3 */ {{4, 109}},
-      /* 4 */ {{138, 243}} } },
-  { {40, HeRu::RU_242_TONE}, { /* 1 */ {{-244, -3}},
-      /* 2 */ {{3, 244}} } },
-  { {40, HeRu::RU_484_TONE}, { /* 1 */ {{-244, -3}, {3, 244}} } },
-  // RUs in an 80 MHz HE PPDU (Table 28-8)
-  { {80, HeRu::RU_26_TONE}, { /* 1 */ {{-499, -474}},
-      /* 2 */ {{-473, -448}},
-      /* 3 */ {{-445, -420}},
-      /* 4 */ {{-419, -394}},
-      /* 5 */ {{-392, -367}},
-      /* 6 */ {{-365, -340}},
-      /* 7 */ {{-339, -314}},
-      /* 8 */ {{-311, -286}},
-      /* 9 */ {{-285, -260}},
-      /* 10 */ {{-257, -232}},
-      /* 11 */ {{-231, -206}},
-      /* 12 */ {{-203, -178}},
-      /* 13 */ {{-177, -152}},
-      /* 14 */ {{-150, -125}},
-      /* 15 */ {{-123, -98}},
-      /* 16 */ {{-97, -72}},
-      /* 17 */ {{-69, -44}},
-      /* 18 */ {{-43, -18}},
-      /* 19 */ {{-16, -4}, {4, 16}},
-      /* 20 */ {{18, 43}},
-      /* 21 */ {{44, 69}},
-      /* 22 */ {{72, 97}},
-      /* 23 */ {{98, 123}},
-      /* 24 */ {{125, 150}},
-      /* 25 */ {{152, 177}},
-      /* 26 */ {{178, 203}},
-      /* 27 */ {{206, 231}},
-      /* 28 */ {{232, 257}},
-      /* 29 */ {{260, 285}},
-      /* 30 */ {{286, 311}},
-      /* 31 */ {{314, 339}},
-      /* 32 */ {{340, 365}},
-      /* 33 */ {{367, 392}},
-      /* 34 */ {{394, 419}},
-      /* 35 */ {{420, 445}},
-      /* 36 */ {{448, 473}},
-      /* 37 */ {{474, 499}} } },
-  { {80, HeRu::RU_52_TONE}, { /* 1 */ {{-499, -448}},
-      /* 2 */ {{-445, -394}},
-      /* 3 */ {{-365, -314}},
-      /* 4 */ {{-311, -260}},
-      /* 5 */ {{-257, -206}},
-      /* 6 */ {{-203, -152}},
-      /* 7 */ {{-123, -72}},
-      /* 8 */ {{-69, -18}},
-      /* 9 */ {{18, 69}},
-      /* 10 */ {{72, 123}},
-      /* 11 */ {{152, 203}},
-      /* 12 */ {{206, 257}},
-      /* 13 */ {{260, 311}},
-      /* 14 */ {{314, 365}},
-      /* 15 */ {{394, 445}},
-      /* 16 */ {{448, 499}} } },
-  { {80, HeRu::RU_106_TONE}, { /* 1 */ {{-499, -394}},
-      /* 2 */ {{-365, -260}},
-      /* 3 */ {{-257, -152}},
-      /* 4 */ {{-123, -18}},
-      /* 5 */ {{18, 123}},
-      /* 6 */ {{152, 257}},
-      /* 7 */ {{260, 365}},
-      /* 8 */ {{394, 499}} } },
-  { {80, HeRu::RU_242_TONE}, { /* 1 */ {{-500, -259}},
-      /* 2 */ {{-258, -17}},
-      /* 3 */ {{17, 258}},
-      /* 4 */ {{259, 500}} } },
-  { {80, HeRu::RU_484_TONE}, { /* 1 */ {{-500, -17}},
-      /* 2 */ {{17, 500}} } },
-  { {80, HeRu::RU_996_TONE}, { /* 1 */ {{-500, -3}, {3, 500}} } }
-};
-
-
-std::size_t
-HeRu::GetNRus (uint8_t bw, RuType ruType)
-{
-  if (bw == 160 && ruType == RU_2x996_TONE)
-    {
-      return 1;
-    }
-
-  // if the bandwidth is 160MHz, search for the number of RUs available
-  // in 80MHz and double the result.
-  auto it = m_heRuSubcarrierGroups.find ({(bw == 160 ? 80 : bw), ruType});
-
-  if (it == m_heRuSubcarrierGroups.end ())
-    {
-      return 0;
-    }
-
-  return (bw == 160 ? 2 : 1) * it->second.size ();
-}
-
-HeRu::SubcarrierGroup
-HeRu::GetSubcarrierGroup (uint8_t bw, RuType ruType, std::size_t index)
-{
-  if (ruType == HeRu::RU_2x996_TONE) //handle special case of RU covering 160 MHz channel
-    {
-      NS_ABORT_MSG_IF (bw != 160, "2x996 tone RU can only be used on 160 MHz band");
-      return {{-1012, -3}, {3, 1012}};
-    }
-
-  // Determine the shift to apply to tone indices for 160 MHz channel (i.e. -1012 to 1012), since
-  // m_heRuSubcarrierGroups contains indices for primary 80 MHz subchannel (i.e. from -500 to 500).
-  // The index is used to that aim.
-  std::size_t indexInPrimary80MHz = index;
-  std::size_t numRus = GetNRus (bw, ruType);
-  int16_t shift = (bw == 160) ? -512 : 0;
-  if (bw == 160 && index > (numRus / 2))
-    {
-      // The provided index is that of the secondary 80 MHz subchannel
-      indexInPrimary80MHz = index - (numRus / 2);
-      shift = 512;
-    }
-
-  auto it = m_heRuSubcarrierGroups.find ({(bw == 160 ? 80 : bw), ruType});
-
-  NS_ABORT_MSG_IF (it == m_heRuSubcarrierGroups.end (), "RU not found");
-  NS_ABORT_MSG_IF (!indexInPrimary80MHz || indexInPrimary80MHz > it->second.size (), "RU index not available");
-
-  SubcarrierGroup group = it->second.at (indexInPrimary80MHz - 1);
-  if (bw == 160)
-    {
-      for (auto & range : group)
-        {
-          range.first += shift;
-          range.second += shift;
-        }
-    }
-  return group;
-}
-
-#ifdef NOTYET
-// Currently unused methods planned for ns-3.34; causing
-// problems with API scanning (see issue #308)
-bool
-HeRu::DoesOverlap (uint8_t bw, RuSpec ru, const std::vector<RuSpec> &v)
-{
-  // A 2x996-tone RU spans 160 MHz, hence it overlaps with any other RU
-  if (bw == 160 && ru.ruType == RU_2x996_TONE && !v.empty ())
-    {
-      return true;
-    }
-
-  SubcarrierGroup groups = GetSubcarrierGroup (bw, ru.ruType, ru.index);
-  for (auto& p : v)
-    {
-      if (ru.primary80MHz != p.primary80MHz)
-        {
-          // the two RUs are located in distinct 80MHz bands
-          continue;
-        }
-      if (DoesOverlap (bw, p, groups))
-        {
-          return true;
-        }
-    }
-  return false;
-}
-
-bool
-HeRu::DoesOverlap (uint8_t bw, RuSpec ru, const SubcarrierGroup &toneRanges)
-{
-  for (const auto & range : toneRanges)
-    {
-      if (bw == 160 && ru.ruType == RU_2x996_TONE)
-        {
-          return true;
-        }
-
-      SubcarrierGroup rangesRu = GetSubcarrierGroup (bw, ru.ruType, ru.index);
-      for (auto& r : rangesRu)
-        {
-          if (range.second >= r.first && r.second >= range.first)
-            {
-              return true;
-            }
-        }
-    }
-  return false;
-}
-#endif
-
-std::ostream& operator<< (std::ostream& os, const HeRu::RuType &ruType)
-{
-  switch (ruType)
-    {
-      case HeRu::RU_26_TONE:
-        os << "26-tones";
-        break;
-      case HeRu::RU_52_TONE:
-        os << "52-tones";
-        break;
-      case HeRu::RU_106_TONE:
-        os << "106-tones";
-        break;
-      case HeRu::RU_242_TONE:
-        os << "242-tones";
-        break;
-      case HeRu::RU_484_TONE:
-        os << "484-tones";
-        break;
-      case HeRu::RU_996_TONE:
-        os << "996-tones";
-        break;
-      case HeRu::RU_2x996_TONE:
-        os << "2x996-tones";
-        break;
-      default:
-        NS_FATAL_ERROR ("Unknown RU type");
-    }
-  return os;
-}
-
-std::ostream& operator<< (std::ostream& os, const HeRu::RuSpec &ru)
-{
-  os << "RU{" << ru.ruType << "/" << ru.index << "/" << (ru.primary80MHz ? "primary80MHz" : "secondary80MHz") << "}";
-  return os;
-}
-
-uint16_t
-HeRu::GetBandwidth (RuType ruType)
-{
-  switch (ruType)
-    {
-      case RU_26_TONE:
-        return 2;
-      case RU_52_TONE:
-        return 4;
-      case RU_106_TONE:
-        return 8;
-      case RU_242_TONE:
-        return 20;
-      case RU_484_TONE:
-        return 40;
-      case RU_996_TONE:
-        return 80;
-      case RU_2x996_TONE:
-        return 160;
-      default:
-        NS_ABORT_MSG ("RU type " << ruType << " not found");
-        return 0;
-    }
-}
-
-HeRu::RuType
-HeRu::GetEqualSizedRusForStations (uint16_t bandwidth, std::size_t& nStations)
-{
-  RuType ruType;
-  uint8_t nRusAssigned = 0;
-
-  // iterate over all the available RU types
-  for (auto& ru : m_heRuSubcarrierGroups)
-    {
-      if (ru.first.first == bandwidth && ru.second.size () <= nStations)
-        {
-          ruType = ru.first.second;
-          nRusAssigned = ru.second.size ();
-          break;
-        }
-      else if (bandwidth == 160 && ru.first.first == 80 && (2 * ru.second.size () <= nStations))
-        {
-          ruType = ru.first.second;
-          nRusAssigned = 2 * ru.second.size ();
-          break;
-        }
-    }
-  if (nRusAssigned == 0)
-    {
-      NS_ABORT_IF (bandwidth != 160 || nStations != 1);
-      nRusAssigned = 1;
-      ruType = RU_2x996_TONE;
-    }
-
-  nStations = nRusAssigned;
-  return ruType;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/he-ru.h ns-3.34/src/wifi/model/he-ru.h
--- ns-3.33/src/wifi/model/he-ru.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/he-ru.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,177 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Stefano Avallone <stavallo@unina.it>
- */
-
-#ifndef HE_RU_H
-#define HE_RU_H
-
-#include <map>
-#include <vector>
-
-#include <cstdint>
-#include <ostream>
-namespace ns3 {
-
-
-/**
- * This class stores the subcarrier groups of all the available HE RUs.
- */
-class HeRu
-{
-public:
-  /**
-   * The different HE Resource Unit (RU) types.
-   */
-  enum RuType
-  {
-    RU_26_TONE = 0,
-    RU_52_TONE,
-    RU_106_TONE,
-    RU_242_TONE,
-    RU_484_TONE,
-    RU_996_TONE,
-    RU_2x996_TONE
-  };
-
-  /// (lowest index, highest index) pair defining a subcarrier range
-  typedef std::pair<int16_t, int16_t> SubcarrierRange;
-
-  /// a vector of subcarrier ranges defining a subcarrier group
-  typedef std::vector<SubcarrierRange> SubcarrierGroup;
-
-
-  /**
-   * RU Specification. Stores the information carried by the RU Allocation
-   * subfield of the User Info field of Trigger frames. Note that primary80MHz
-   * must be true if ruType is RU_2x996_TONE.
-   */
-  typedef struct
-  {
-    bool primary80MHz;   //!< true if the RU is allocated in the primary 80MHz channel
-    RuType ruType;       //!< RU type
-    std::size_t index;   //!< index (starting at 1)
-  } RuSpec;
-
-
-  /**
-   * Get the number of distinct RUs of the given type (number of tones)
-   * available in a HE PPDU of the given bandwidth.
-   *
-   * \param bw the bandwidth (MHz) of the HE PPDU (20, 40, 80, 160)
-   * \param ruType the RU type (number of tones)
-   * \return the number of distinct RUs available
-   */
-  static std::size_t GetNRus (uint8_t bw, RuType ruType);
-
-  /**
-   * Get the subcarrier group of the RU having the given index among all the
-   * RUs of the given type (number of tones) available in a HE PPDU of the
-   * given bandwidth. A subcarrier group is defined as one or more pairs
-   * indicating the lowest frequency index and the highest frequency index.
-   * Note that for channel width of 160 MHz the returned range is relative to
-   * the 160 MHz channel (i.e. -1012 to 1012). The index parameter is used to
-   * distinguish between primary and secondary 80 MHz subchannels.
-   *
-   * \param bw the bandwidth (MHz) of the HE PPDU (20, 40, 80, 160)
-   * \param ruType the RU type (number of tones)
-   * \param index the index (starting at 1) of the RU
-   * \return the subcarrier range of the specified RU
-   */
-  static SubcarrierGroup GetSubcarrierGroup (uint8_t bw, RuType ruType, std::size_t index);
-
-#ifdef NOTYET
-// Currently unused methods planned for ns-3.34; causing
-// problems with API scanning (see issue #308) 
-  /**
-   * Check whether the given RU overlaps with the given set of RUs.
-   * Note that for channel width of 160 MHz the returned range is relative to
-   * the 160 MHz channel (i.e. -1012 to 1012).
-   *
-   * \param bw the bandwidth (MHz) of the HE PPDU (20, 40, 80, 160)
-   * \param ru the given RU allocation
-   * \param v the given set of RUs
-   * \return true if the given RU overlaps with the given set of RUs.
-   */
-  static bool DoesOverlap (uint8_t bw, RuSpec ru, const std::vector<RuSpec> &v);
-
-  /**
-   * Check whether the given RU overlaps with the given tone ranges.
-   * Note that for channel width of 160 MHz the returned range is relative to
-   * the 160 MHz channel (i.e. -1012 to 1012).
-   *
-   * \param bw the bandwidth (MHz) of the HE PPDU (20, 40, 80, 160)
-   * \param ru the given RU allocation
-   * \param toneRanges the given set of tone ranges
-   * \return true if the given RU overlaps with the given set of tone ranges.
-   */
-  static bool DoesOverlap (uint8_t bw, RuSpec ru, const SubcarrierGroup &toneRanges);
-#endif
-
-  /**
-   * Get the approximate bandwidth occupied by a RU.
-   *
-   * \param ruType the RU type
-   * \return the approximate bandwidth (in MHz) occupied by the RU
-   */
-  static uint16_t GetBandwidth (RuType ruType);
-
-  /**
-   * Given the channel bandwidth and the number of stations candidate for being
-   * assigned an RU, maximize the number of candidate stations that can be assigned
-   * an RU subject to the constraint that all the stations must be assigned an RU
-   * of the same size (in terms of number of tones).
-   *
-   * \param bandwidth the channel bandwidth in MHz
-   * \param nStations the number of candidate stations. On return, it is set to
-   *                  the number of stations that are assigned an RU
-   * \return the RU type
-   */
-  static RuType GetEqualSizedRusForStations (uint16_t bandwidth, std::size_t& nStations);
-
-  /// (bandwidth, number of tones) pair
-  typedef std::pair<uint8_t, RuType> BwTonesPair;
-
-  /// map (bandwidth, number of tones) pairs to the group of subcarrier ranges
-  typedef std::map<BwTonesPair, std::vector<SubcarrierGroup> > SubcarrierGroups;
-
-  //!< Subcarrier groups for all RUs (with indices being applicable to primary 80 MHz channel)
-  static const SubcarrierGroups  m_heRuSubcarrierGroups;
-};
-
-/**
- * \brief Stream insertion operator.
- *
- * \param os the stream
- * \param ruType the RU type
- * \returns a reference to the stream
- */
-std::ostream& operator<< (std::ostream& os, const HeRu::RuType &ruType);
-
-/**
- * \brief Stream insertion operator.
- *
- * \param os the stream
- * \param ru the RU
- * \returns a reference to the stream
- */
-std::ostream& operator<< (std::ostream& os, const HeRu::RuSpec &ru);
-
-} //namespace ns3
-
-#endif /* HE_RU_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht/ht-capabilities.cc ns-3.34/src/wifi/model/ht/ht-capabilities.cc
--- ns-3.33/src/wifi/model/ht/ht-capabilities.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/ht/ht-capabilities.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,553 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Ghada Badawy <gbadawy@rim.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "ht-capabilities.h"
+
+namespace ns3 {
+
+HtCapabilities::HtCapabilities ()
+  : m_ldpc (0),
+    m_supportedChannelWidth (0),
+    m_smPowerSave (0),
+    m_greenField (0),
+    m_shortGuardInterval20 (0),
+    m_shortGuardInterval40 (0),
+    m_txStbc (0),
+    m_rxStbc (0),
+    m_htDelayedBlockAck (0),
+    m_maxAmsduLength (0),
+    m_dssMode40 (0),
+    m_psmpSupport (0),
+    m_fortyMhzIntolerant (0),
+    m_lsigProtectionSupport (0),
+    m_maxAmpduLengthExponent (0),
+    m_minMpduStartSpace (0),
+    m_ampduReserved (0),
+    m_reservedMcsSet1 (0),
+    m_rxHighestSupportedDataRate (0),
+    m_reservedMcsSet2 (0),
+    m_txMcsSetDefined (0),
+    m_txRxMcsSetUnequal (0),
+    m_txMaxNSpatialStreams (0),
+    m_txUnequalModulation (0),
+    m_reservedMcsSet3 (0),
+    m_pco (0),
+    m_pcoTransitionTime (0),
+    m_reservedExtendedCapabilities (0),
+    m_mcsFeedback (0),
+    m_htcSupport (0),
+    m_reverseDirectionResponder (0),
+    m_reservedExtendedCapabilities2 (0),
+    m_implicitRxBfCapable (0),
+    m_rxStaggeredSoundingCapable (0),
+    m_txStaggeredSoundingCapable (0),
+    m_rxNdpCapable (0),
+    m_txNdpCapable (0),
+    m_implicitTxBfCapable (0),
+    m_calibration (0),
+    m_explicitCsiTxBfCapable (0),
+    m_explicitNoncompressedSteeringCapable (0),
+    m_explicitCompressedSteeringCapable (0),
+    m_explicitTxBfCsiFeedback (0),
+    m_explicitNoncompressedBfFeedbackCapable (0),
+    m_explicitCompressedBfFeedbackCapable (0),
+    m_minimalGrouping (0),
+    m_csiNBfAntennasSupported (0),
+    m_noncompressedSteeringNBfAntennasSupported (0),
+    m_compressedSteeringNBfAntennasSupported (0),
+    m_csiMaxNRowsBfSupported (0),
+    m_channelEstimationCapability (0),
+    m_reservedTxBf (0),
+    m_antennaSelectionCapability (0),
+    m_explicitCsiFeedbackBasedTxASelCapable (0),
+    m_antennaIndicesFeedbackBasedTxASelCapable (0),
+    m_explicitCsiFeedbackCapable (0),
+    m_antennaIndicesFeedbackCapable (0),
+    m_rxASelCapable (0),
+    m_txSoundingPpdusCapable (0),
+    m_reservedASel (0),
+    m_htSupported (0)
+{
+  for (uint8_t i = 0; i < MAX_SUPPORTED_MCS; i++)
+    {
+      m_rxMcsBitmask[i] = 0;
+    }
+}
+
+WifiInformationElementId
+HtCapabilities::ElementId () const
+{
+  return IE_HT_CAPABILITIES;
+}
+
+void
+HtCapabilities::SetHtSupported (uint8_t htSupported)
+{
+  m_htSupported = htSupported;
+}
+
+void
+HtCapabilities::SetLdpc (uint8_t ldpc)
+{
+  m_ldpc = ldpc;
+}
+
+void
+HtCapabilities::SetSupportedChannelWidth (uint8_t supportedChannelWidth)
+{
+  m_supportedChannelWidth = supportedChannelWidth;
+}
+
+void
+HtCapabilities::SetShortGuardInterval20 (uint8_t shortGuardInterval)
+{
+  m_shortGuardInterval20 = shortGuardInterval;
+}
+
+void
+HtCapabilities::SetShortGuardInterval40 (uint8_t shortGuardInterval)
+{
+  m_shortGuardInterval40 = shortGuardInterval;
+}
+
+void
+HtCapabilities::SetMaxAmsduLength (uint16_t maxAmsduLength)
+{
+  NS_ABORT_MSG_IF (maxAmsduLength != 3839 && maxAmsduLength != 7935,
+                   "Invalid A-MSDU Max Length value");
+  m_maxAmsduLength = (maxAmsduLength == 3839 ? 0 : 1);
+}
+
+void
+HtCapabilities::SetLSigProtectionSupport (uint8_t lSigProtection)
+{
+  m_lsigProtectionSupport = lSigProtection;
+}
+
+void
+HtCapabilities::SetMaxAmpduLength (uint32_t maxAmpduLength)
+{
+  for (uint8_t i = 0; i <= 3; i++)
+    {
+      if ((1ul << (13 + i)) - 1 == maxAmpduLength)
+        {
+          m_maxAmpduLengthExponent = i;
+          return;
+        }
+    }
+  NS_ABORT_MSG ("Invalid A-MPDU Max Length value");
+}
+
+void
+HtCapabilities::SetRxMcsBitmask (uint8_t index)
+{
+  m_rxMcsBitmask[index] = 1;
+}
+
+void
+HtCapabilities::SetRxHighestSupportedDataRate (uint16_t maxSupportedRate)
+{
+  m_rxHighestSupportedDataRate = maxSupportedRate;
+}
+
+void
+HtCapabilities::SetTxMcsSetDefined (uint8_t txMcsSetDefined)
+{
+  m_txMcsSetDefined = txMcsSetDefined;
+}
+
+void
+HtCapabilities::SetTxRxMcsSetUnequal (uint8_t txRxMcsSetUnequal)
+{
+  m_txRxMcsSetUnequal = txRxMcsSetUnequal;
+}
+
+void
+HtCapabilities::SetTxMaxNSpatialStreams (uint8_t maxTxSpatialStreams)
+{
+  m_txMaxNSpatialStreams = maxTxSpatialStreams - 1; //0 for 1 SS, 1 for 2 SSs, etc
+}
+
+void
+HtCapabilities::SetTxUnequalModulation (uint8_t txUnequalModulation)
+{
+  m_txUnequalModulation = txUnequalModulation;
+}
+
+uint8_t
+HtCapabilities::GetLdpc (void) const
+{
+  return m_ldpc;
+}
+
+uint8_t
+HtCapabilities::GetSupportedChannelWidth (void) const
+{
+  return m_supportedChannelWidth;
+}
+
+uint8_t
+HtCapabilities::GetShortGuardInterval20 (void) const
+{
+  return m_shortGuardInterval20;
+}
+
+uint16_t
+HtCapabilities::GetMaxAmsduLength (void) const
+{
+  if (m_maxAmsduLength == 0)
+    {
+      return 3839;
+    }
+  return 7935;
+}
+
+uint32_t
+HtCapabilities::GetMaxAmpduLength (void) const
+{
+  return (1ul << (13 + m_maxAmpduLengthExponent)) - 1;
+}
+
+bool
+HtCapabilities::IsSupportedMcs (uint8_t mcs) const
+{
+  if (m_rxMcsBitmask[mcs] == 1)
+    {
+      return true;
+    }
+  return false;
+}
+
+uint8_t
+HtCapabilities::GetRxHighestSupportedAntennas (void) const
+{
+  for (uint8_t nRx = 2; nRx <= 4; nRx++)
+    {
+      for (uint8_t mcs = (nRx - 1) * 8; mcs <= ((7 * nRx) + (nRx - 1)); mcs++)
+        {
+          if (IsSupportedMcs (mcs) == false)
+            {
+              return (nRx - 1);
+            }
+        }
+    }
+  return 4;
+}
+
+uint8_t
+HtCapabilities::GetInformationFieldSize () const
+{
+  //we should not be here if HT is not supported
+  NS_ASSERT (m_htSupported > 0);
+  return 26;
+}
+
+Buffer::Iterator
+HtCapabilities::Serialize (Buffer::Iterator i) const
+{
+  if (m_htSupported < 1)
+    {
+      return i;
+    }
+  return WifiInformationElement::Serialize (i);
+}
+
+uint16_t
+HtCapabilities::GetSerializedSize () const
+{
+  if (m_htSupported < 1)
+    {
+      return 0;
+    }
+  return WifiInformationElement::GetSerializedSize ();
+}
+
+uint16_t
+HtCapabilities::GetHtCapabilitiesInfo (void) const
+{
+  uint16_t val = 0;
+  val |= m_ldpc & 0x01;
+  val |= (m_supportedChannelWidth & 0x01) << 1;
+  val |= (m_smPowerSave & 0x03) << 2;
+  val |= (m_greenField & 0x01) << 4;
+  val |= (m_shortGuardInterval20 & 0x01) << 5;
+  val |= (m_shortGuardInterval40 & 0x01) << 6;
+  val |= (m_txStbc & 0x01) << 7;
+  val |= (m_rxStbc & 0x03) << 8;
+  val |= (m_htDelayedBlockAck & 0x01) << 10;
+  val |= (m_maxAmsduLength & 0x01) << 11;
+  val |= (m_dssMode40 & 0x01) << 12;
+  val |= (m_psmpSupport & 0x01) << 13;
+  val |= (m_fortyMhzIntolerant & 0x01) << 14;
+  val |= (m_lsigProtectionSupport & 0x01) << 15;
+  return val;
+}
+
+void
+HtCapabilities::SetHtCapabilitiesInfo (uint16_t ctrl)
+{
+  m_ldpc = ctrl & 0x01;
+  m_supportedChannelWidth = (ctrl >> 1) & 0x01;
+  m_smPowerSave = (ctrl >> 2) & 0x03;
+  m_greenField = (ctrl >> 4) & 0x01;
+  m_shortGuardInterval20 = (ctrl >> 5) & 0x01;
+  m_shortGuardInterval40 = (ctrl >> 6) & 0x01;
+  m_txStbc = (ctrl >> 7) & 0x01;
+  m_rxStbc = (ctrl >> 8) & 0x03;
+  m_htDelayedBlockAck = (ctrl >> 10) & 0x01;
+  m_maxAmsduLength = (ctrl >> 11) & 0x01;
+  m_dssMode40 = (ctrl >> 12) & 0x01;
+  m_psmpSupport = (ctrl >> 13) & 0x01;
+  m_fortyMhzIntolerant = (ctrl >> 14) & 0x01;
+  m_lsigProtectionSupport = (ctrl >> 15) & 0x01;
+}
+
+void
+HtCapabilities::SetAmpduParameters (uint8_t ctrl)
+{
+  m_maxAmpduLengthExponent = ctrl & 0x03;
+  m_minMpduStartSpace = (ctrl >> 2) & 0x1b;
+  m_ampduReserved = (ctrl >> 5) & 0xe0;
+}
+
+uint8_t
+HtCapabilities::GetAmpduParameters (void) const
+{
+  uint8_t val = 0;
+  val |=  m_maxAmpduLengthExponent & 0x03;
+  val |= (m_minMpduStartSpace & 0x1b) << 2;
+  val |= (m_ampduReserved & 0xe0) << 5;
+  return val;
+}
+
+void
+HtCapabilities::SetSupportedMcsSet (uint64_t ctrl1, uint64_t ctrl2)
+{
+  for (uint64_t i = 0; i < 77; i++)
+    {
+      if (i < 64)
+        {
+          m_rxMcsBitmask[i] = (ctrl1 >> i) & 0x01;
+        }
+      else
+        {
+          m_rxMcsBitmask[i] = (ctrl2 >> (i - 64)) & 0x01;
+        }
+    }
+  m_reservedMcsSet1 = (ctrl2 >> 13) & 0x07;
+  m_rxHighestSupportedDataRate = (ctrl2 >> 16) & 0x03ff;
+  m_reservedMcsSet2 = (ctrl2 >> 26) & 0x3f;
+  m_txMcsSetDefined = (ctrl2 >> 32) & 0x01;
+  m_txRxMcsSetUnequal = (ctrl2 >> 33) & 0x01;
+  m_txMaxNSpatialStreams = (ctrl2 >> 34) & 0x03;
+  m_txUnequalModulation = (ctrl2 >> 36) & 0x01;
+  m_reservedMcsSet3 = (ctrl2 >> 37) & 0x07ffffff;
+}
+
+uint64_t
+HtCapabilities::GetSupportedMcsSet1 (void) const
+{
+  uint64_t val = 0;
+  for (uint64_t i = 63; i > 0; i--)
+    {
+      val = (val << 1) | (m_rxMcsBitmask[i] & 0x01);
+    }
+  val = (val << 1) | (m_rxMcsBitmask[0] & 0x01);
+  return val;
+}
+
+uint64_t
+HtCapabilities::GetSupportedMcsSet2 (void) const
+{
+  uint64_t val = 0;
+  val = val | (m_reservedMcsSet3 & 0x07ffffff);
+  val = (val << 1) | (m_txUnequalModulation & 0x01);
+  val = (val << 2) | (m_txMaxNSpatialStreams & 0x03);
+  val = (val << 1) | (m_txRxMcsSetUnequal & 0x01);
+  val = (val << 1) | (m_txMcsSetDefined & 0x01);
+  val = (val << 6) | (m_reservedMcsSet2 & 0x3f);
+  val = (val << 10) | (m_rxHighestSupportedDataRate & 0x3ff);
+  val = (val << 3) | (m_reservedMcsSet1 & 0x07);
+
+  for (uint64_t i = 13; i > 0; i--)
+    {
+      val = (val << 1) | ( m_rxMcsBitmask[i + 63] & 0x01);
+    }
+  return val;
+}
+
+uint16_t
+HtCapabilities::GetExtendedHtCapabilities (void) const
+{
+  uint16_t val = 0;
+  val |= m_pco & 0x01;
+  val |= (m_pcoTransitionTime & 0x03) << 1;
+  val |= (m_reservedExtendedCapabilities & 0x1f) << 3;
+  val |= (m_mcsFeedback & 0x03) << 8;
+  val |= (m_htcSupport & 0x01) << 10;
+  val |= (m_reverseDirectionResponder & 0x01) << 11;
+  val |= (m_reservedExtendedCapabilities2 & 0x0f) << 12;
+  return val;
+}
+
+void
+HtCapabilities::SetExtendedHtCapabilities (uint16_t ctrl)
+{
+  m_pco = ctrl & 0x01;
+  m_pcoTransitionTime = (ctrl >> 1) & 0x03;
+  m_reservedExtendedCapabilities = (ctrl >> 3) & 0x1f;
+  m_mcsFeedback = (ctrl >> 8) & 0x03;
+  m_htcSupport = (ctrl >> 10) & 0x01;
+  m_reverseDirectionResponder = (ctrl >> 11) & 0x01;
+  m_reservedExtendedCapabilities2 = (ctrl >> 12) & 0x0f;
+}
+
+uint32_t
+HtCapabilities::GetTxBfCapabilities (void) const
+{
+  uint32_t val = 0;
+  val |= m_implicitRxBfCapable & 0x01;
+  val |= (m_rxStaggeredSoundingCapable & 0x01) << 1;
+  val |= (m_txStaggeredSoundingCapable & 0x01) << 2;
+  val |= (m_rxNdpCapable & 0x01) << 3;
+  val |= (m_txNdpCapable & 0x01) << 4;
+  val |= (m_implicitTxBfCapable & 0x01) << 5;
+  val |= (m_calibration & 0x03) << 6;
+  val |= (m_explicitCsiTxBfCapable & 0x01) << 8;
+  val |= (m_explicitNoncompressedSteeringCapable & 0x01) << 9;
+  val |= (m_explicitCompressedSteeringCapable & 0x01) << 10;
+  val |= (m_explicitTxBfCsiFeedback & 0x03) << 11;
+  val |= (m_explicitNoncompressedBfFeedbackCapable & 0x03) << 13;
+  val |= (m_explicitCompressedBfFeedbackCapable & 0x03) << 15;
+  val |= (m_minimalGrouping & 0x03) << 17;
+  val |= (m_csiNBfAntennasSupported & 0x03) << 19;
+  val |= (m_noncompressedSteeringNBfAntennasSupported & 0x03) << 21;
+  val |= (m_compressedSteeringNBfAntennasSupported & 0x03) << 23;
+  val |= (m_csiMaxNRowsBfSupported & 0x03) << 25;
+  val |= (m_channelEstimationCapability & 0x03) << 27;
+  val |= (m_reservedTxBf & 0x07) << 29;
+  return val;
+}
+
+void
+HtCapabilities::SetTxBfCapabilities (uint32_t ctrl)
+{
+  m_implicitRxBfCapable = ctrl & 0x01;
+  m_rxStaggeredSoundingCapable = (ctrl >> 1) & 0x01;
+  m_txStaggeredSoundingCapable = (ctrl >> 2) & 0x01;
+  m_rxNdpCapable = (ctrl >> 3) & 0x01;
+  m_txNdpCapable = (ctrl >> 4) & 0x01;
+  m_implicitTxBfCapable = (ctrl >> 5) & 0x01;
+  m_calibration = (ctrl >> 6) & 0x03;
+  m_explicitCsiTxBfCapable = (ctrl >> 8) & 0x01;
+  m_explicitNoncompressedSteeringCapable = (ctrl >> 9) & 0x01;
+  m_explicitCompressedSteeringCapable = (ctrl >> 10) & 0x01;
+  m_explicitTxBfCsiFeedback = (ctrl >> 11) & 0x03;
+  m_explicitNoncompressedBfFeedbackCapable = (ctrl >> 13) & 0x03;
+  m_explicitCompressedBfFeedbackCapable = (ctrl >> 15) & 0x03;
+  m_minimalGrouping = (ctrl >> 17) & 0x03;
+  m_csiNBfAntennasSupported = (ctrl >> 19) & 0x03;
+  m_noncompressedSteeringNBfAntennasSupported = (ctrl >> 21) & 0x03;
+  m_compressedSteeringNBfAntennasSupported = (ctrl >> 23) & 0x03;
+  m_csiMaxNRowsBfSupported = (ctrl >> 25) & 0x03;
+  m_channelEstimationCapability = (ctrl >> 27) & 0x03;
+  m_reservedTxBf = (ctrl >> 29) & 0x07;
+}
+
+uint8_t
+HtCapabilities::GetAntennaSelectionCapabilities (void) const
+{
+  uint8_t val = 0;
+  val |= m_antennaSelectionCapability & 0x01;
+  val |= (m_explicitCsiFeedbackBasedTxASelCapable & 0x01) << 1;
+  val |= (m_antennaIndicesFeedbackBasedTxASelCapable & 0x01) << 2;
+  val |= (m_explicitCsiFeedbackCapable & 0x01) << 3;
+  val |= (m_antennaIndicesFeedbackCapable & 0x01) << 4;
+  val |= (m_rxASelCapable & 0x01) << 5;
+  val |= (m_txSoundingPpdusCapable & 0x01) << 6;
+  val |= (m_reservedASel & 0x01) << 7;
+  return val;
+}
+
+void
+HtCapabilities::SetAntennaSelectionCapabilities (uint8_t ctrl)
+{
+  m_antennaSelectionCapability = ctrl & 0x01;
+  m_explicitCsiFeedbackBasedTxASelCapable = (ctrl >> 1) & 0x01;
+  m_antennaIndicesFeedbackBasedTxASelCapable = (ctrl >> 2) & 0x01;
+  m_explicitCsiFeedbackCapable = (ctrl >> 3) & 0x01;
+  m_antennaIndicesFeedbackCapable = (ctrl >> 4) & 0x01;
+  m_rxASelCapable = (ctrl >> 5) & 0x01;
+  m_txSoundingPpdusCapable = (ctrl >> 6) & 0x01;
+  m_reservedASel = (ctrl >> 7) & 0x01;
+}
+
+void
+HtCapabilities::SerializeInformationField (Buffer::Iterator start) const
+{
+  if (m_htSupported == 1)
+    {
+      //write the corresponding value for each bit
+      start.WriteHtolsbU16 (GetHtCapabilitiesInfo ());
+      start.WriteU8 (GetAmpduParameters ());
+      start.WriteHtolsbU64 (GetSupportedMcsSet1 ());
+      start.WriteHtolsbU64 (GetSupportedMcsSet2 ());
+      start.WriteU16 (GetExtendedHtCapabilities ());
+      start.WriteU32 (GetTxBfCapabilities ());
+      start.WriteU8 (GetAntennaSelectionCapabilities ());
+    }
+}
+
+uint8_t
+HtCapabilities::DeserializeInformationField (Buffer::Iterator start,
+                                             uint8_t length)
+{
+  Buffer::Iterator i = start;
+  uint16_t htinfo = i.ReadLsbtohU16 ();
+  uint8_t ampduparam = i.ReadU8 ();
+  uint64_t mcsset1 = i.ReadLsbtohU64 ();
+  uint64_t mcsset2 = i.ReadLsbtohU64 ();
+  uint16_t extendedcapabilities = i.ReadU16 ();
+  uint32_t txbfcapabilities = i.ReadU32 ();
+  uint8_t aselcapabilities = i.ReadU8 ();
+  SetHtCapabilitiesInfo (htinfo);
+  SetAmpduParameters (ampduparam);
+  SetSupportedMcsSet (mcsset1, mcsset2);
+  SetExtendedHtCapabilities (extendedcapabilities);
+  SetTxBfCapabilities (txbfcapabilities);
+  SetAntennaSelectionCapabilities (aselcapabilities);
+  return length;
+}
+
+std::ostream &
+operator << (std::ostream &os, const HtCapabilities &htcapabilities)
+{
+  os << bool (htcapabilities.GetLdpc ())
+     << "|" << bool (htcapabilities.GetSupportedChannelWidth ())
+     << "|" << bool (htcapabilities.GetShortGuardInterval20 ()) << "|";
+  for (uint8_t i = 0; i < MAX_SUPPORTED_MCS; i++)
+    {
+      os << htcapabilities.IsSupportedMcs (i) << " ";
+    }
+  return os;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht/ht-capabilities.h ns-3.34/src/wifi/model/ht/ht-capabilities.h
--- ns-3.33/src/wifi/model/ht/ht-capabilities.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/ht/ht-capabilities.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,364 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Ghada Badawy <gbadawy@gmail.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef HT_CAPABILITIES_H
+#define HT_CAPABILITIES_H
+
+#include "ns3/wifi-information-element.h"
+
+/**
+ * This defines the maximum number of supported MCSs that a STA is
+ * allowed to have. Currently this number is set for IEEE 802.11n
+ */
+#define MAX_SUPPORTED_MCS  (77)
+
+namespace ns3 {
+
+/**
+ * \brief The HT Capabilities Information Element
+ * \ingroup wifi
+ *
+ * This class knows how to serialise and deserialise the HT Capabilities Information Element
+ */
+class HtCapabilities : public WifiInformationElement
+{
+public:
+  HtCapabilities ();
+
+  // Implementations of pure virtual methods of WifiInformationElement
+  WifiInformationElementId ElementId () const override;
+  uint8_t GetInformationFieldSize () const override;
+  void SerializeInformationField (Buffer::Iterator start) const override;
+  uint8_t DeserializeInformationField (Buffer::Iterator start,
+                                       uint8_t length) override;
+  /* This information element is a bit special in that it is only
+     included if the STA is an HT STA. To support this we
+     override the Serialize and GetSerializedSize methods of
+     WifiInformationElement. */
+  Buffer::Iterator Serialize (Buffer::Iterator start) const override;
+  uint16_t GetSerializedSize () const override;
+
+  /**
+   * Set the HT supported field.
+   *
+   * \param htSupported the HT supported field
+   */
+  void SetHtSupported (uint8_t htSupported);
+
+  /**
+   * Set the HT Capabilities Info field in the HT Capabilities information element.
+   *
+   * \param ctrl the HT Capabilities Info field in the HT Capabilities information element
+   */
+  void SetHtCapabilitiesInfo (uint16_t ctrl);
+  /**
+   * Set the A-MPDU Parameters field in the HT Capabilities information element.
+   *
+   * \param ctrl the A-MPDU Parameters field in the HT Capabilities information element
+   */
+  void SetAmpduParameters (uint8_t ctrl);
+  /**
+   * Set the Supported MCS Set field in the HT Capabilities information element.
+   *
+   * \param ctrl1 the first 64 bytes of the Supported MCS Set field in the HT Capabilities information element
+   * \param ctrl2 the last 64 bytes of the Supported MCS Set field in the HT Capabilities information element
+   */
+  void SetSupportedMcsSet (uint64_t ctrl1, uint64_t ctrl2);
+  /**
+   * Set the Extended HT Capabilities field in the HT Capabilities information element.
+   *
+   * \param ctrl the Extended HT Capabilities field in the HT Capabilities information element
+   */
+  void SetExtendedHtCapabilities (uint16_t ctrl);
+  /**
+   * Set the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities information element.
+   *
+   * \param ctrl the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities information element
+   */
+  void SetTxBfCapabilities (uint32_t ctrl);
+  /**
+   * Set the the Antenna Selection (ASEL) Capabilities field in the HT Capabilities information element.
+   *
+   * \param ctrl the Antenna Selection (ASEL) Capabilities field in the HT Capabilities information element
+   */
+  void SetAntennaSelectionCapabilities (uint8_t ctrl);
+
+  /**
+   * Set the LDPC field.
+   *
+   * \param ldpc the LDPC field
+   */
+  void SetLdpc (uint8_t ldpc);
+  /**
+   * Set the supported channel width field.
+   *
+   * \param supportedChannelWidth the supported channel width field
+   */
+  void SetSupportedChannelWidth (uint8_t supportedChannelWidth);
+  /**
+   * Set the short guard interval 20 field.
+   *
+   * \param shortGuardInterval the short guard interval
+   */
+  void SetShortGuardInterval20 (uint8_t shortGuardInterval);
+  /**
+   * Set the short guard interval 40 field.
+   *
+   * \param shortGuardInterval the short guard interval
+   */
+  void SetShortGuardInterval40 (uint8_t shortGuardInterval);
+  /**
+   * Set the maximum AMSDU length.
+   *
+   * \param maxAmsduLength Either 3839 or 7935
+   */
+  void SetMaxAmsduLength (uint16_t maxAmsduLength);
+  /**
+   * Set the LSIG protection support.
+   *
+   * \param lSigProtection the LSIG protection support field
+   */
+  void SetLSigProtectionSupport (uint8_t lSigProtection);
+
+  /**
+   * Set the maximum AMPDU length.
+   *
+   * \param maxAmpduLength 2^(13 + x) - 1, x in the range 0 to 3
+   */
+  void SetMaxAmpduLength (uint32_t maxAmpduLength);
+
+  /**
+   * Set the receive MCS bitmask.
+   *
+   * \param index the index of the receive MCS
+   */
+  void SetRxMcsBitmask (uint8_t index);
+  /**
+   * Set the receive highest supported data rate.
+   *
+   * \param maxSupportedRate the maximum supported data rate
+   */
+  void SetRxHighestSupportedDataRate (uint16_t maxSupportedRate);
+  /**
+   * Set the transmit MCS set defined.
+   *
+   * \param txMcsSetDefined the TX MCS set defined
+   */
+  void SetTxMcsSetDefined (uint8_t txMcsSetDefined);
+  /**
+   * Set the transmit / receive MCS set unequal.
+   *
+   * \param txRxMcsSetUnequal the TX/RX MCS set unequal field
+   */
+  void SetTxRxMcsSetUnequal (uint8_t txRxMcsSetUnequal);
+  /**
+   * Set the transmit maximum N spatial streams.
+   *
+   * \param maxTxSpatialStreams the maximum number of TX SSs
+   */
+  void SetTxMaxNSpatialStreams (uint8_t maxTxSpatialStreams);
+  /**
+   * Set the transmit unequal modulation.
+   *
+   * \param txUnequalModulation the TX unequal modulation field
+   */
+  void SetTxUnequalModulation (uint8_t txUnequalModulation);
+
+  /**
+   * Return the HT Capabilities Info field in the HT Capabilities information element.
+   *
+   * \return the HT Capabilities Info field in the HT Capabilities information element
+   */
+  uint16_t GetHtCapabilitiesInfo (void) const;
+  /**
+   * Return the A-MPDU Parameters field in the HT Capabilities information element.
+   *
+   * \return the A-MPDU Parameters field in the HT Capabilities information element
+   */
+  uint8_t GetAmpduParameters (void) const;
+  /**
+   * Return the first 64 bytes of the Supported MCS Set field in the HT Capabilities information element.
+   *
+   * \return the first 64 bytes of the Supported MCS Set field in the HT Capabilities information element
+   */
+  uint64_t GetSupportedMcsSet1 (void) const;
+  /**
+   * Return the last 64 bytes of the Supported MCS Set field in the HT Capabilities information element.
+   *
+   * \return the last 64 bytes of the Supported MCS Set field in the HT Capabilities information element
+   */
+  uint64_t GetSupportedMcsSet2 (void) const;
+  /**
+   * Return the Extended HT Capabilities field in the HT Capabilities information element.
+   *
+   * \return the Extended HT Capabilities field in the HT Capabilities information element
+   */
+  uint16_t GetExtendedHtCapabilities (void) const;
+  /**
+   * Return the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities information element.
+   *
+   * \return the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities information element
+   */
+  uint32_t GetTxBfCapabilities (void) const;
+  /**
+   * Return the Antenna Selection (ASEL) Capabilities field in the HT Capabilities information element.
+   *
+   * \return the Antenna Selection (ASEL) Capabilities field in the HT Capabilities information element
+   */
+  uint8_t GetAntennaSelectionCapabilities (void) const;
+
+  /**
+   * Return LDPC.
+   *
+   * \return the LDPC value
+   */
+  uint8_t GetLdpc (void) const;
+  /**
+   * Return the supported channel width.
+   *
+   * \return the supported channel width
+   */
+  uint8_t GetSupportedChannelWidth (void) const;
+  /**
+   * Return the short guard interval 20 value.
+   *
+   * \return the short guard interval 20 value
+   */
+  uint8_t GetShortGuardInterval20 (void) const;
+  /**
+   * Return the maximum A-MSDU length.
+   *
+   * \return the maximum A-MSDU length
+   */
+  uint16_t GetMaxAmsduLength (void) const;
+  /**
+   * Return the maximum A-MPDU length.
+   *
+   * \return the maximum A-MPDU length
+   */
+  uint32_t GetMaxAmpduLength (void) const;
+  /**
+   * Return the is MCS supported flag.
+   *
+   * \param mcs is MCS supported flag
+   *
+   * \return true if successful
+   */
+  bool IsSupportedMcs (uint8_t mcs) const;
+  /**
+   * Return the receive highest supported antennas.
+   *
+   * \return the receive highest supported antennas
+   */
+  uint8_t GetRxHighestSupportedAntennas (void) const;
+
+
+private:
+  //HT Capabilities Info field
+  uint8_t m_ldpc;                  ///< LDPC
+  uint8_t m_supportedChannelWidth; ///< supported channel width
+  uint8_t m_smPowerSave;           ///< SM power save
+  uint8_t m_greenField;            ///< Greenfield
+  uint8_t m_shortGuardInterval20;  ///< short guard interval 20 MHz
+  uint8_t m_shortGuardInterval40;  ///< short guard interval 40 MHz
+  uint8_t m_txStbc;                ///< transmit STBC
+  uint8_t m_rxStbc;                ///< receive STBC
+  uint8_t m_htDelayedBlockAck;     ///< HT delayed block ack
+  uint8_t m_maxAmsduLength;        ///< maximum A-MSDU length
+  uint8_t m_dssMode40;             ///< DSS mode 40
+  uint8_t m_psmpSupport;           ///< PSMP support
+  uint8_t m_fortyMhzIntolerant;    ///< 40 MHz intolerant
+  uint8_t m_lsigProtectionSupport; ///< L-SIG protection support
+
+  //A-MPDU Parameters field
+  uint8_t m_maxAmpduLengthExponent; ///< maximum A-MPDU length
+  uint8_t m_minMpduStartSpace;      ///< minimum MPDU start space
+  uint8_t m_ampduReserved;          ///< A-MPDU reserved
+
+  //Supported MCS Set field
+  uint8_t m_reservedMcsSet1;                 ///< reserved MCS set 1
+  uint16_t m_rxHighestSupportedDataRate;     ///< receive highest supported data rate
+  uint8_t m_reservedMcsSet2;                 ///< reserved MCS set 2
+  uint8_t m_txMcsSetDefined;                 ///< transmit MCS set defined
+  uint8_t m_txRxMcsSetUnequal;               ///< transmit / receive MCS set unequal
+  uint8_t m_txMaxNSpatialStreams;            ///< transmit maximum number spatial streams
+  uint8_t m_txUnequalModulation;             ///< transmit unequal modulation
+  uint32_t m_reservedMcsSet3;                ///< reserved MCS set 3
+  uint8_t m_rxMcsBitmask[MAX_SUPPORTED_MCS]; ///< receive MCS bitmask
+
+  //HT Extended Capabilities field
+  uint8_t m_pco;                           ///< PCO
+  uint8_t m_pcoTransitionTime;             ///< PCO transition time
+  uint8_t m_reservedExtendedCapabilities;  ///< reserved extended capabilities
+  uint8_t m_mcsFeedback;                   ///< MCS feedback
+  uint8_t m_htcSupport;                    ///< HTC support
+  uint8_t m_reverseDirectionResponder;     ///< reverse direction responder
+  uint8_t m_reservedExtendedCapabilities2; ///< reserver extended capabilities 2
+
+  //Transmit Beamforming Capabilities field
+  uint8_t m_implicitRxBfCapable;                       ///< implicit receive BF capable
+  uint8_t m_rxStaggeredSoundingCapable;                ///< receive staggered sounding capable
+  uint8_t m_txStaggeredSoundingCapable;                ///< transmit staggered sounding capable
+  uint8_t m_rxNdpCapable;                              ///< receive NDP capable
+  uint8_t m_txNdpCapable;                              ///< transmit NDP capable
+  uint8_t m_implicitTxBfCapable;                       ///< implicit transmit BF capable
+  uint8_t m_calibration;                               ///< calibration
+  uint8_t m_explicitCsiTxBfCapable;                    ///< explicit CSI transmit BF capable
+  uint8_t m_explicitNoncompressedSteeringCapable;      ///< explicit non compressed steeering capable
+  uint8_t m_explicitCompressedSteeringCapable;         ///< explicit compressed steeering capable
+  uint8_t m_explicitTxBfCsiFeedback;                   ///< explicit transmit BF CSI feedback
+  uint8_t m_explicitNoncompressedBfFeedbackCapable;    ///< explicit non compressed BF feedback capable
+  uint8_t m_explicitCompressedBfFeedbackCapable;       ///< explicit compressed BF feedback capable
+  uint8_t m_minimalGrouping;                           ///< minimal grouping
+  uint8_t m_csiNBfAntennasSupported;                   ///< CSI NBF antenna supported
+  uint8_t m_noncompressedSteeringNBfAntennasSupported; ///< non compressed steering NBF antenna supported
+  uint8_t m_compressedSteeringNBfAntennasSupported;    ///< compressed steering NBF antenna supported
+  uint8_t m_csiMaxNRowsBfSupported;                    ///< CSI maximum number rows BF supported
+  uint8_t m_channelEstimationCapability;               ///< channel estimation capability
+  uint8_t m_reservedTxBf;                              ///< reserved  transmit BF
+
+  //ASEL Capabilities field
+  uint8_t m_antennaSelectionCapability;               ///< antenna selection capability
+  uint8_t m_explicitCsiFeedbackBasedTxASelCapable;    ///< explicit CSI feedback based transmit antenna selection capable
+  uint8_t m_antennaIndicesFeedbackBasedTxASelCapable; ///< antenna indices feedback based transmit antenna selection capable
+  uint8_t m_explicitCsiFeedbackCapable;               ///< explicit CSI feedback capable
+  uint8_t m_antennaIndicesFeedbackCapable;            ///< antenna indices feedback capable
+  uint8_t m_rxASelCapable;                            ///< receive antenna selection capable
+  uint8_t m_txSoundingPpdusCapable;                   ///< sounding PPDUS capable
+  uint8_t m_reservedASel;                             ///< reserved ASEL
+
+  /// This is used to decide whether this element should be added to the frame or not
+  uint8_t m_htSupported;
+};
+
+/**
+ * output stream output operator
+ *
+ * \param os output stream
+ * \param htcapabilities the HT capabilities
+ *
+ * \returns output stream
+ */
+std::ostream &operator << (std::ostream &os, const HtCapabilities &htcapabilities);
+
+} //namespace ns3
+
+#endif /* HT_CAPABILITY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht/ht-configuration.cc ns-3.34/src/wifi/model/ht/ht-configuration.cc
--- ns-3.33/src/wifi/model/ht/ht-configuration.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/ht/ht-configuration.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,91 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018  Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "ns3/log.h"
+#include "ns3/boolean.h"
+#include "ns3/uinteger.h"
+#include "ht-configuration.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("HtConfiguration");
+
+NS_OBJECT_ENSURE_REGISTERED (HtConfiguration);
+
+HtConfiguration::HtConfiguration ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+HtConfiguration::~HtConfiguration ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+TypeId
+HtConfiguration::GetTypeId (void)
+{
+  static ns3::TypeId tid = ns3::TypeId ("ns3::HtConfiguration")
+    .SetParent<Object> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<HtConfiguration> ()
+    .AddAttribute ("ShortGuardIntervalSupported",
+                   "Whether or not short guard interval is supported.",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&HtConfiguration::GetShortGuardIntervalSupported,
+                                        &HtConfiguration::SetShortGuardIntervalSupported),
+                   MakeBooleanChecker ())
+    .AddAttribute ("LdpcSupported",
+                   "Whether or not LDPC coding is supported.",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&HtConfiguration::GetLdpcSupported,
+                                        &HtConfiguration::SetLdpcSupported),
+                   MakeBooleanChecker ())
+    ;
+    return tid;
+}
+
+void
+HtConfiguration::SetShortGuardIntervalSupported (bool enable)
+{
+  NS_LOG_FUNCTION (this << enable);
+  m_sgiSupported = enable;
+}
+
+bool
+HtConfiguration::GetShortGuardIntervalSupported (void) const
+{
+  return m_sgiSupported;
+}
+
+void
+HtConfiguration::SetLdpcSupported (bool enable)
+{
+  NS_LOG_FUNCTION (this << enable);
+  m_ldpcSupported = enable;
+}
+
+bool
+HtConfiguration::GetLdpcSupported (void) const
+{
+  return m_ldpcSupported;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht/ht-configuration.h ns-3.34/src/wifi/model/ht/ht-configuration.h
--- ns-3.33/src/wifi/model/ht/ht-configuration.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/ht/ht-configuration.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,85 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018  Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef HT_CONFIGURATION_H
+#define HT_CONFIGURATION_H
+
+#include "ns3/object.h"
+
+namespace ns3 {
+
+/**
+ * \brief HT configuration
+ * \ingroup wifi
+ *
+ * This object stores HT configuration information, for use in modifying
+ * AP or STA behavior and for constructing HT-related information elements.
+ *
+ */
+class HtConfiguration : public Object
+{
+public:
+  HtConfiguration ();
+  virtual ~HtConfiguration ();
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  /**
+   * Enable or disable SGI support.
+   *
+   * \param enable true if SGI is to be supported,
+   *               false otherwise
+   */
+  void SetShortGuardIntervalSupported (bool enable);
+  /**
+   * \return whether the device supports SGI.
+   *
+   * \return true if SGI is supported,
+   *         false otherwise.
+   */
+  bool GetShortGuardIntervalSupported (void) const;
+  /**
+   * Enable or disable LDPC support.
+   *
+   * \param enable true if LDPC is to be supported,
+   *               false otherwise
+   */
+  void SetLdpcSupported (bool enable);
+  /**
+   * \return whether the device supports LDPC.
+   *
+   * \return true if LDPC is supported,
+   *         false otherwise.
+   */
+  bool GetLdpcSupported (void) const;
+
+
+private:
+  bool m_sgiSupported;        ///< flag whether short guard interval is supported
+  bool m_ldpcSupported;       ///< flag whether LDPC coding is supported
+};
+
+} //namespace ns3
+
+#endif /* HT_CONFIGURATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht/ht-frame-exchange-manager.cc ns-3.34/src/wifi/model/ht/ht-frame-exchange-manager.cc
--- ns-3.33/src/wifi/model/ht/ht-frame-exchange-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/ht/ht-frame-exchange-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,1452 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "ns3/abort.h"
+#include "ht-frame-exchange-manager.h"
+#include "ns3/wifi-mac-queue.h"
+#include "ns3/mgt-headers.h"
+#include "ns3/recipient-block-ack-agreement.h"
+#include "ns3/wifi-utils.h"
+#include "ns3/snr-tag.h"
+#include "ns3/ctrl-headers.h"
+
+#undef NS_LOG_APPEND_CONTEXT
+#define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] "
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("HtFrameExchangeManager");
+
+NS_OBJECT_ENSURE_REGISTERED (HtFrameExchangeManager);
+
+TypeId
+HtFrameExchangeManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::HtFrameExchangeManager")
+    .SetParent<QosFrameExchangeManager> ()
+    .AddConstructor<HtFrameExchangeManager> ()
+    .SetGroupName ("Wifi")
+  ;
+  return tid;
+}
+
+HtFrameExchangeManager::HtFrameExchangeManager ()
+{
+  NS_LOG_FUNCTION (this);
+  m_msduAggregator = CreateObject<MsduAggregator> ();
+  m_mpduAggregator = CreateObject<MpduAggregator> ();
+}
+
+HtFrameExchangeManager::~HtFrameExchangeManager ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+void
+HtFrameExchangeManager::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_agreements.clear ();
+  m_msduAggregator = 0;
+  m_mpduAggregator = 0;
+  m_psdu = 0;
+  m_txParams.Clear ();
+  QosFrameExchangeManager::DoDispose ();
+}
+
+void
+HtFrameExchangeManager::SetWifiMac (const Ptr<RegularWifiMac> mac)
+{
+  m_msduAggregator->SetWifiMac (mac);
+  m_mpduAggregator->SetWifiMac (mac);
+  QosFrameExchangeManager::SetWifiMac (mac);
+}
+
+Ptr<MsduAggregator>
+HtFrameExchangeManager::GetMsduAggregator (void) const
+{
+  return m_msduAggregator;
+}
+
+Ptr<MpduAggregator>
+HtFrameExchangeManager::GetMpduAggregator (void) const
+{
+  return m_mpduAggregator;
+}
+
+Ptr<BlockAckManager>
+HtFrameExchangeManager::GetBaManager (uint8_t tid) const
+{
+  return m_mac->GetQosTxop (tid)->GetBaManager ();
+}
+
+bool
+HtFrameExchangeManager::NeedSetupBlockAck (Mac48Address recipient, uint8_t tid)
+{
+  Ptr<QosTxop> qosTxop = m_mac->GetQosTxop (tid);
+  bool establish;
+
+  if (!m_mac->GetWifiRemoteStationManager ()->GetHtSupported (recipient))
+    {
+      establish = false;
+    }
+  else if (qosTxop->GetBaManager ()->ExistsAgreement (recipient, tid)
+           && !qosTxop->GetBaManager ()->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::RESET))
+    {
+      establish = false;
+    }
+  else
+    {
+      uint32_t packets = qosTxop->GetWifiMacQueue ()->GetNPacketsByTidAndAddress (tid, recipient);
+      establish = ((qosTxop->GetBlockAckThreshold () > 0 && packets >= qosTxop->GetBlockAckThreshold ())
+                   || (m_mpduAggregator->GetMaxAmpduSize (recipient, tid, WIFI_MOD_CLASS_HT) > 0 && packets > 1)
+                   || m_mac->GetWifiRemoteStationManager ()->GetVhtSupported ());
+    }
+
+  NS_LOG_FUNCTION (this << recipient << +tid << establish);
+  return establish;
+}
+
+void
+HtFrameExchangeManager::SendAddBaRequest (Mac48Address dest, uint8_t tid, uint16_t startingSeq,
+                                          uint16_t timeout, bool immediateBAck)
+{
+  NS_LOG_FUNCTION (this << dest << +tid << startingSeq << timeout << immediateBAck);
+  NS_LOG_DEBUG ("Send ADDBA request to " << dest);
+
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_MGT_ACTION);
+  hdr.SetAddr1 (dest);
+  hdr.SetAddr2 (m_self);
+  hdr.SetAddr3 (m_bssid);
+  hdr.SetDsNotTo ();
+  hdr.SetDsNotFrom ();
+
+  WifiActionHeader actionHdr;
+  WifiActionHeader::ActionValue action;
+  action.blockAck = WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST;
+  actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
+
+  Ptr<Packet> packet = Create<Packet> ();
+  // Setting ADDBARequest header
+  MgtAddBaRequestHeader reqHdr;
+  reqHdr.SetAmsduSupport (true);
+  if (immediateBAck)
+    {
+      reqHdr.SetImmediateBlockAck ();
+    }
+  else
+    {
+      reqHdr.SetDelayedBlockAck ();
+    }
+  reqHdr.SetTid (tid);
+  /* For now we don't use buffer size field in the ADDBA request frame. The recipient
+   * will choose how many packets it can receive under block ack.
+   */
+  reqHdr.SetBufferSize (0);
+  reqHdr.SetTimeout (timeout);
+  // set the starting sequence number for the BA agreement
+  reqHdr.SetStartingSequence (startingSeq);
+
+  GetBaManager (tid)->CreateAgreement (&reqHdr, dest);
+
+  packet->AddHeader (reqHdr);
+  packet->AddHeader (actionHdr);
+
+  Ptr<WifiMacQueueItem> mpdu = Create<WifiMacQueueItem> (packet, hdr);
+
+  // get the sequence number for the ADDBA Request management frame
+  uint16_t sequence = m_txMiddle->GetNextSequenceNumberFor (&mpdu->GetHeader ());
+  mpdu->GetHeader ().SetSequenceNumber (sequence);
+
+  WifiTxParameters txParams;
+  txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (mpdu->GetHeader ());
+  txParams.m_protection = std::unique_ptr<WifiProtection> (new WifiNoProtection);
+  txParams.m_acknowledgment = GetAckManager ()->TryAddMpdu (mpdu, txParams);
+
+  SendMpduWithProtection (mpdu, txParams);
+}
+
+void
+HtFrameExchangeManager::SendAddBaResponse (const MgtAddBaRequestHeader *reqHdr,
+                                           Mac48Address originator)
+{
+  NS_LOG_FUNCTION (this << originator);
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_MGT_ACTION);
+  hdr.SetAddr1 (originator);
+  hdr.SetAddr2 (m_self);
+  hdr.SetAddr3 (m_bssid);
+  hdr.SetDsNotFrom ();
+  hdr.SetDsNotTo ();
+
+  MgtAddBaResponseHeader respHdr;
+  StatusCode code;
+  code.SetSuccess ();
+  respHdr.SetStatusCode (code);
+  //Here a control about queues type?
+  respHdr.SetAmsduSupport (reqHdr->IsAmsduSupported ());
+
+  if (reqHdr->IsImmediateBlockAck ())
+    {
+      respHdr.SetImmediateBlockAck ();
+    }
+  else
+    {
+      respHdr.SetDelayedBlockAck ();
+    }
+  respHdr.SetTid (reqHdr->GetTid ());
+
+  respHdr.SetBufferSize (GetSupportedBaBufferSize () - 1);
+  respHdr.SetTimeout (reqHdr->GetTimeout ());
+
+  WifiActionHeader actionHdr;
+  WifiActionHeader::ActionValue action;
+  action.blockAck = WifiActionHeader::BLOCK_ACK_ADDBA_RESPONSE;
+  actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
+
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader (respHdr);
+  packet->AddHeader (actionHdr);
+
+  CreateBlockAckAgreement (&respHdr, originator, reqHdr->GetStartingSequence ());
+
+  //It is unclear which queue this frame should go into. For now we
+  //bung it into the queue corresponding to the TID for which we are
+  //establishing an agreement, and push it to the head.
+  m_mac->GetQosTxop (reqHdr->GetTid ())->PushFront (packet, hdr);
+}
+
+uint16_t
+HtFrameExchangeManager::GetSupportedBaBufferSize (void) const
+{
+  return 64;
+}
+
+void
+HtFrameExchangeManager::SendDelbaFrame (Mac48Address addr, uint8_t tid, bool byOriginator)
+{
+  NS_LOG_FUNCTION (this << addr << +tid << byOriginator);
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_MGT_ACTION);
+  hdr.SetAddr1 (addr);
+  hdr.SetAddr2 (m_self);
+  hdr.SetAddr3 (m_bssid);
+  hdr.SetDsNotTo ();
+  hdr.SetDsNotFrom ();
+
+  MgtDelBaHeader delbaHdr;
+  delbaHdr.SetTid (tid);
+  if (byOriginator)
+    {
+      delbaHdr.SetByOriginator ();
+      GetBaManager (tid)->DestroyAgreement (addr, tid);
+    }
+  else
+    {
+      delbaHdr.SetByRecipient ();
+      DestroyBlockAckAgreement (addr, tid);
+    }
+
+  WifiActionHeader actionHdr;
+  WifiActionHeader::ActionValue action;
+  action.blockAck = WifiActionHeader::BLOCK_ACK_DELBA;
+  actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
+
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader (delbaHdr);
+  packet->AddHeader (actionHdr);
+
+  m_mac->GetQosTxop (tid)->GetWifiMacQueue ()->PushFront (Create<WifiMacQueueItem> (packet, hdr));
+}
+
+void
+HtFrameExchangeManager::CreateBlockAckAgreement (const MgtAddBaResponseHeader *respHdr, Mac48Address originator,
+                                                 uint16_t startingSeq)
+{
+  NS_LOG_FUNCTION (this << *respHdr << originator << startingSeq);
+  uint8_t tid = respHdr->GetTid ();
+  
+  RecipientBlockAckAgreement agreement (originator, respHdr->IsAmsduSupported (), tid,
+                                        respHdr->GetBufferSize () + 1, respHdr->GetTimeout (),
+                                        startingSeq,
+                                        m_mac->GetWifiRemoteStationManager ()->GetHtSupported ()
+                                        && m_mac->GetWifiRemoteStationManager ()->GetHtSupported (originator));
+  agreement.SetMacRxMiddle (m_rxMiddle);
+  if (respHdr->IsImmediateBlockAck ())
+    {
+      agreement.SetImmediateBlockAck ();
+    }
+  else
+    {
+      agreement.SetDelayedBlockAck ();
+    }
+
+  if (respHdr->GetTimeout () != 0)
+    {
+      Time timeout = MicroSeconds (1024 * agreement.GetTimeout ());
+
+      agreement.m_inactivityEvent = Simulator::Schedule (timeout, &HtFrameExchangeManager::SendDelbaFrame,
+                                                         this, originator, tid, false);
+    }
+
+  m_agreements.insert ({{originator, tid}, agreement});
+  GetBaManager (tid)->SetBlockAckInactivityCallback (MakeCallback (&HtFrameExchangeManager::SendDelbaFrame, this));
+}
+
+void
+HtFrameExchangeManager::DestroyBlockAckAgreement  (Mac48Address originator, uint8_t tid)
+{
+  NS_LOG_FUNCTION (this << originator << +tid);
+
+  auto agreementIt = m_agreements.find ({originator, tid});
+  if (agreementIt != m_agreements.end ())
+    {
+      // forward up the buffered MPDUs before destroying the agreement
+      agreementIt->second.Flush ();
+      m_agreements.erase (agreementIt);
+    }
+}
+
+bool
+HtFrameExchangeManager::StartFrameExchange (Ptr<QosTxop> edca, Time availableTime, bool initialFrame)
+{
+  NS_LOG_FUNCTION (this << edca << availableTime << initialFrame);
+
+  // First, check if there is a BAR to be transmitted
+  if (SendMpduFromBaManager (edca, availableTime, initialFrame))
+    {
+      return true;
+    }
+
+  Ptr<const WifiMacQueueItem> peekedItem = edca->PeekNextMpdu ();
+
+  // Even though channel access is requested when the queue is not empty, at
+  // the time channel access is granted the lifetime of the packet might be
+  // expired and the queue might be empty.
+  if (peekedItem == 0)
+    {
+      NS_LOG_DEBUG ("No frames available for transmission");
+      return false;
+    }
+
+  const WifiMacHeader& hdr = peekedItem->GetHeader ();
+  // setup a Block Ack agreement if needed
+  if (hdr.IsQosData () && !hdr.GetAddr1 ().IsGroup ()
+      && NeedSetupBlockAck (hdr.GetAddr1 (), hdr.GetQosTid ()))
+    {
+      // if the peeked MPDU has been already transmitted, use its sequence number
+      // as the starting sequence number for the BA agreement, otherwise use the
+      // next available sequence number
+      uint16_t startingSeq = (hdr.IsRetry () ? hdr.GetSequenceNumber ()
+                                             : m_txMiddle->GetNextSeqNumberByTidAndAddress (hdr.GetQosTid (),
+                                                                                            hdr.GetAddr1 ()));
+      SendAddBaRequest (hdr.GetAddr1 (), hdr.GetQosTid (), startingSeq,
+                        edca->GetBlockAckInactivityTimeout (), true);
+      return true;
+    }
+
+  // Use SendDataFrame if we can try aggregation
+  if (hdr.IsQosData () && !hdr.GetAddr1 ().IsGroup () && !peekedItem->IsFragment ()
+      && !m_mac->GetWifiRemoteStationManager ()->NeedFragmentation (peekedItem))
+    {
+      return SendDataFrame (peekedItem, availableTime, initialFrame);
+    }
+
+  // Use the QoS FEM to transmit the frame in all the other cases, i.e.:
+  // - the frame is not a QoS data frame
+  // - the frame is a broadcast QoS data frame
+  // - the frame is a fragment
+  // - the frame must be fragmented
+  return QosFrameExchangeManager::StartFrameExchange (edca, availableTime, initialFrame);
+}
+
+bool
+HtFrameExchangeManager::SendMpduFromBaManager (Ptr<QosTxop> edca, Time availableTime, bool initialFrame)
+{
+  NS_LOG_FUNCTION (this << edca << availableTime << initialFrame);
+
+  // First, check if there is a BAR to be transmitted
+  Ptr<const WifiMacQueueItem> peekedItem = edca->GetBaManager ()->GetBar (false);
+
+  if (peekedItem == 0)
+    {
+      NS_LOG_DEBUG ("Block Ack Manager returned no frame to send");
+      return false;
+    }
+
+  NS_ASSERT (peekedItem->GetHeader ().IsBlockAckReq ());
+
+  // Prepare the TX parameters. Note that the default ack manager expects the
+  // data TxVector in the m_txVector field to compute the BlockAck TxVector.
+  // The m_txVector field of the TX parameters is set to the BlockAckReq TxVector
+  // a few lines below.
+  WifiTxParameters txParams;
+  txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peekedItem->GetHeader ());
+  txParams.m_protection = std::unique_ptr<WifiProtection> (new WifiNoProtection);
+  txParams.m_acknowledgment = GetAckManager ()->TryAddMpdu (peekedItem, txParams);
+
+  NS_ABORT_IF (txParams.m_acknowledgment->method != WifiAcknowledgment::BLOCK_ACK);
+
+  WifiBlockAck* blockAcknowledgment = static_cast<WifiBlockAck*> (txParams.m_acknowledgment.get ());
+  CalculateAcknowledgmentTime (blockAcknowledgment);
+  // the BlockAckReq frame is sent using the same TXVECTOR as the BlockAck frame
+  txParams.m_txVector = blockAcknowledgment->blockAckTxVector;
+
+  Time barTxDuration = m_phy->CalculateTxDuration (peekedItem->GetSize (),
+                                                   blockAcknowledgment->blockAckTxVector,
+                                                   m_phy->GetPhyBand ());
+
+  // if the available time is limited and we are not transmitting the initial
+  // frame of the TXOP, we have to check that this frame and its response fit
+  // within the given time limits
+  if (availableTime != Time::Min () && !initialFrame
+      && barTxDuration + m_phy->GetSifs () + blockAcknowledgment->acknowledgmentTime > availableTime)
+    {
+      NS_LOG_DEBUG ("Not enough time to send the BAR frame returned by the Block Ack Manager");
+      return false;
+    }
+
+  // we can transmit the BlockAckReq frame
+  Ptr<const WifiMacQueueItem> mpdu = edca->GetBaManager ()->GetBar ();
+  SendPsduWithProtection (Create<WifiPsdu> (mpdu, false), txParams);
+  return true;
+}
+
+bool
+HtFrameExchangeManager::SendDataFrame (Ptr<const WifiMacQueueItem> peekedItem,
+                                       Time availableTime, bool initialFrame)
+{
+  NS_ASSERT (peekedItem != 0 && peekedItem->GetHeader ().IsQosData ()
+             && !peekedItem->GetHeader ().GetAddr1 ().IsBroadcast ()
+             && !peekedItem->IsFragment ());
+  NS_LOG_FUNCTION (this << *peekedItem << availableTime << initialFrame);
+
+  Ptr<QosTxop> edca = m_mac->GetQosTxop (peekedItem->GetHeader ().GetQosTid ());
+  WifiTxParameters txParams;
+  txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peekedItem->GetHeader ());
+  WifiMacQueueItem::QueueIteratorPair queueIt;
+  Ptr<WifiMacQueueItem> mpdu = edca->GetNextMpdu (peekedItem, txParams, availableTime, initialFrame, queueIt);
+
+  if (mpdu == nullptr)
+    {
+      NS_LOG_DEBUG ("Not enough time to transmit a frame");
+      return false;
+    }
+
+  // try A-MPDU aggregation
+  std::vector<Ptr<WifiMacQueueItem>> mpduList = m_mpduAggregator->GetNextAmpdu (mpdu, txParams,
+                                                                                availableTime, queueIt);
+  NS_ASSERT (txParams.m_acknowledgment);
+
+  if (mpduList.size () > 1)
+    {
+      // A-MPDU aggregation succeeded
+      SendPsduWithProtection (Create<WifiPsdu> (std::move (mpduList)), txParams);
+    }
+  else if (txParams.m_acknowledgment->method == WifiAcknowledgment::BAR_BLOCK_ACK)
+    {
+      // a QoS data frame using the Block Ack policy can be followed by a BlockAckReq
+      // frame and a BlockAck frame. Such a sequence is handled by the HT FEM
+      SendPsduWithProtection (Create<WifiPsdu> (mpdu, false), txParams);
+    }
+  else
+    {
+      // transmission can be handled by the base FEM
+      SendMpduWithProtection (mpdu, txParams);
+    }
+
+  return true;
+}
+
+void
+HtFrameExchangeManager::CalculateAcknowledgmentTime (WifiAcknowledgment* acknowledgment) const
+{
+  NS_LOG_FUNCTION (this << acknowledgment);
+  NS_ASSERT (acknowledgment != nullptr);
+
+  if (acknowledgment->method == WifiAcknowledgment::BLOCK_ACK)
+    {
+      WifiBlockAck* blockAcknowledgment = static_cast<WifiBlockAck*> (acknowledgment);
+      Time baTxDuration = m_phy->CalculateTxDuration (GetBlockAckSize (blockAcknowledgment->baType),
+                                                      blockAcknowledgment->blockAckTxVector,
+                                                      m_phy->GetPhyBand ());
+      blockAcknowledgment->acknowledgmentTime = m_phy->GetSifs () + baTxDuration;
+    }
+  else if (acknowledgment->method == WifiAcknowledgment::BAR_BLOCK_ACK)
+    {
+      WifiBarBlockAck* barBlockAcknowledgment = static_cast<WifiBarBlockAck*> (acknowledgment);
+      Time barTxDuration = m_phy->CalculateTxDuration (GetBlockAckRequestSize (barBlockAcknowledgment->barType),
+                                                      barBlockAcknowledgment->blockAckReqTxVector,
+                                                      m_phy->GetPhyBand ());
+      Time baTxDuration = m_phy->CalculateTxDuration (GetBlockAckSize (barBlockAcknowledgment->baType),
+                                                      barBlockAcknowledgment->blockAckTxVector,
+                                                      m_phy->GetPhyBand ());
+      barBlockAcknowledgment->acknowledgmentTime = 2 * m_phy->GetSifs () + barTxDuration + baTxDuration;
+    }
+  else
+    {
+      QosFrameExchangeManager::CalculateAcknowledgmentTime (acknowledgment);
+    }
+}
+
+void
+HtFrameExchangeManager::ForwardMpduDown (Ptr<WifiMacQueueItem> mpdu, WifiTxVector& txVector)
+{
+  ForwardPsduDown (GetWifiPsdu (mpdu, txVector), txVector);
+}
+
+Ptr<WifiPsdu>
+HtFrameExchangeManager::GetWifiPsdu (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector) const
+{
+  return Create<WifiPsdu> (mpdu, false);
+}
+
+void
+HtFrameExchangeManager::NotifyReceivedNormalAck (Ptr<WifiMacQueueItem> mpdu)
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+
+  if (mpdu->GetHeader ().IsQosData ())
+    {
+      uint8_t tid = mpdu->GetHeader ().GetQosTid ();
+      Ptr<QosTxop> edca = m_mac->GetQosTxop (tid);
+
+      if (edca->GetBaAgreementEstablished (mpdu->GetHeader ().GetAddr1 (), tid))
+        {
+          // notify the BA manager that the MPDU was acknowledged
+          edca->GetBaManager ()->NotifyGotAck (mpdu);
+        }
+    }
+  else if (mpdu->GetHeader ().IsAction ())
+    {
+      WifiActionHeader actionHdr;
+      Ptr<Packet> p = mpdu->GetPacket ()->Copy ();
+      p->RemoveHeader (actionHdr);
+      if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK)
+        {
+          if (actionHdr.GetAction ().blockAck == WifiActionHeader::BLOCK_ACK_DELBA)
+            {
+              MgtDelBaHeader delBa;
+              p->PeekHeader (delBa);
+              if (delBa.IsByOriginator ())
+                {
+                  GetBaManager (delBa.GetTid ())->DestroyAgreement (mpdu->GetHeader ().GetAddr1 (),
+                                                                    delBa.GetTid ());
+                }
+              else
+                {
+                  DestroyBlockAckAgreement (mpdu->GetHeader ().GetAddr1 (), delBa.GetTid ());
+                }
+            }
+          else if (actionHdr.GetAction ().blockAck == WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST)
+            {
+              // Setup ADDBA response timeout
+              MgtAddBaRequestHeader addBa;
+              p->PeekHeader (addBa);
+              Ptr<QosTxop> edca = m_mac->GetQosTxop (addBa.GetTid ());
+              Simulator::Schedule (edca->GetAddBaResponseTimeout (),
+                                   &QosTxop::AddBaResponseTimeout, edca,
+                                   mpdu->GetHeader ().GetAddr1 (), addBa.GetTid ());
+            }
+        }
+    }
+  QosFrameExchangeManager::NotifyReceivedNormalAck (mpdu);
+}
+
+void
+HtFrameExchangeManager::TransmissionSucceeded (void)
+{
+  NS_LOG_DEBUG (this);
+
+  if (m_edca != 0 && m_edca->GetTxopLimit ().IsZero () && m_edca->GetBaManager ()->GetBar (false) != 0)
+    {
+      // A TXOP limit of 0 indicates that the TXOP holder may transmit or cause to
+      // be transmitted (as responses) the following within the current TXOP:
+      // f) Any number of BlockAckReq frames
+      // (Sec. 10.22.2.8 of 802.11-2016)
+      NS_LOG_DEBUG ("Schedule a transmission from Block Ack Manager in a SIFS");
+      bool (HtFrameExchangeManager::*fp) (Ptr<QosTxop>, Time) = &HtFrameExchangeManager::StartTransmission;
+
+      // TXOP limit is null, hence the txopDuration parameter is unused
+      Simulator::Schedule (m_phy->GetSifs (), fp, this, m_edca, Seconds (0));
+    }
+  else
+    {
+      QosFrameExchangeManager::TransmissionSucceeded ();
+    }
+}
+
+void
+HtFrameExchangeManager::NotifyPacketDiscarded (Ptr<const WifiMacQueueItem> mpdu)
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+
+  if (mpdu->GetHeader ().IsQosData ())
+    {
+      GetBaManager (mpdu->GetHeader ().GetQosTid ())->NotifyDiscardedMpdu (mpdu);
+    }
+  else if (mpdu->GetHeader ().IsAction ())
+    {
+      WifiActionHeader actionHdr;
+      mpdu->GetPacket ()->PeekHeader (actionHdr);
+      if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK)
+        {
+          uint8_t tid = GetTid (mpdu->GetPacket (), mpdu->GetHeader ());
+          if (GetBaManager (tid)->ExistsAgreementInState (mpdu->GetHeader ().GetAddr1 (), tid,
+                                                          OriginatorBlockAckAgreement::PENDING))
+            {
+              NS_LOG_DEBUG ("No ACK after ADDBA request");
+              GetBaManager (tid)->NotifyAgreementNoReply (mpdu->GetHeader ().GetAddr1 (), tid);
+              Ptr<QosTxop> qosTxop = m_mac->GetQosTxop (tid);
+              Simulator::Schedule (qosTxop->GetFailedAddBaTimeout (), &QosTxop::ResetBa, qosTxop,
+                                   mpdu->GetHeader ().GetAddr1 (), tid);
+            }
+        }
+    }
+  QosFrameExchangeManager::NotifyPacketDiscarded (mpdu);
+}
+
+void
+HtFrameExchangeManager::RetransmitMpduAfterMissedAck (Ptr<WifiMacQueueItem> mpdu) const
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+
+  if (mpdu->GetHeader ().IsQosData ())
+    {
+      uint8_t tid = mpdu->GetHeader ().GetQosTid ();
+      Ptr<QosTxop> edca = m_mac->GetQosTxop (tid);
+
+      if (edca->GetBaAgreementEstablished (mpdu->GetHeader ().GetAddr1 (), tid))
+        {
+          // notify the BA manager that the MPDU was not acknowledged
+          edca->GetBaManager ()->NotifyMissedAck (mpdu);
+          return;
+        }
+    }
+  QosFrameExchangeManager::RetransmitMpduAfterMissedAck (mpdu);
+}
+
+void
+HtFrameExchangeManager::RetransmitMpduAfterMissedCts (Ptr<WifiMacQueueItem> mpdu) const
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+
+  // the MPDU should be still in the queue, unless it expired.
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
+  if (hdr.IsQosData ())
+    {
+      uint8_t tid = hdr.GetQosTid ();
+      Ptr<QosTxop> edca = m_mac->GetQosTxop (tid);
+
+      if (edca->GetBaAgreementEstablished (hdr.GetAddr1 (), tid)
+          && !hdr.IsRetry ())
+        {
+          // The MPDU has never been transmitted, so we can make its sequence
+          // number available again if it is lower than the sequence number
+          // maintained by the MAC TX middle
+          uint16_t currentNextSeq = m_txMiddle->PeekNextSequenceNumberFor (&hdr);
+          uint16_t startingSeq = edca->GetBaStartingSequence (hdr.GetAddr1 (), tid);
+
+          if (BlockAckAgreement::GetDistance (hdr.GetSequenceNumber (), startingSeq)
+              < BlockAckAgreement::GetDistance (currentNextSeq, startingSeq))
+            {
+              m_txMiddle->SetSequenceNumberFor (&hdr);
+            }
+
+          return;
+        }
+    }
+  QosFrameExchangeManager::RetransmitMpduAfterMissedCts (mpdu);
+}
+
+Time
+HtFrameExchangeManager::GetPsduDurationId (Time txDuration, const WifiTxParameters& txParams) const
+{
+  NS_LOG_FUNCTION (this << txDuration << &txParams);
+
+  NS_ASSERT (m_edca != 0);
+
+  if (m_edca->GetTxopLimit ().IsZero ())
+    {
+      NS_ASSERT (txParams.m_acknowledgment && txParams.m_acknowledgment->acknowledgmentTime != Time::Min ());
+      return txParams.m_acknowledgment->acknowledgmentTime;
+    }
+
+  // under multiple protection settings, if the TXOP limit is not null, Duration/ID
+  // is set to cover the remaining TXOP time (Sec. 9.2.5.2 of 802.11-2016).
+  // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8
+  // of 802.11-2016)
+  return std::max (m_edca->GetRemainingTxop () - txDuration, Seconds (0));
+}
+
+void
+HtFrameExchangeManager::SendPsduWithProtection (Ptr<WifiPsdu> psdu, WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << psdu << &txParams);
+
+  m_psdu = psdu;
+  m_txParams = std::move (txParams);
+
+#ifdef NS3_BUILD_PROFILE_DEBUG
+  // If protection is required, the MPDUs must be stored in some queue because
+  // they are not put back in a queue if the RTS/CTS exchange fails
+  if (m_txParams.m_protection->method != WifiProtection::NONE)
+    {
+      for (const auto& mpdu : *PeekPointer (m_psdu))
+        {
+          NS_ASSERT (mpdu->GetHeader ().IsCtl () || mpdu->IsQueued ());
+        }
+    }
+#endif
+
+  // Make sure that the acknowledgment time has been computed, so that SendRts()
+  // and SendCtsToSelf() can reuse this value.
+  NS_ASSERT (m_txParams.m_acknowledgment);
+
+  if (m_txParams.m_acknowledgment->acknowledgmentTime == Time::Min ())
+    {
+      CalculateAcknowledgmentTime (m_txParams.m_acknowledgment.get ());
+    }
+
+  // Set QoS Ack policy
+  WifiAckManager::SetQosAckPolicy (m_psdu, m_txParams.m_acknowledgment.get ());
+
+  if (m_txParams.m_protection->method == WifiProtection::RTS_CTS)
+    {
+      SendRts (m_txParams);
+    }
+  else if (m_txParams.m_protection->method == WifiProtection::CTS_TO_SELF)
+    {
+      SendCtsToSelf (m_txParams);
+    }
+  else if (m_txParams.m_protection->method == WifiProtection::NONE)
+    {
+      SendPsdu ();
+    }
+  else
+    {
+      NS_ABORT_MSG ("Unknown protection type");
+    }
+}
+
+void
+HtFrameExchangeManager::CtsTimeout (Ptr<WifiMacQueueItem> rts, const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << *rts << txVector);
+
+  if (m_psdu == 0)
+    {
+      // A CTS Timeout occurred when protecting a single MPDU is handled by the
+      // parent classes
+      QosFrameExchangeManager::CtsTimeout (rts, txVector);
+      return;
+    }
+
+  NS_ASSERT (m_psdu->GetNMpdus () > 1);
+  m_mac->GetWifiRemoteStationManager ()->ReportRtsFailed (m_psdu->GetHeader (0));
+
+  if (!m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (*m_psdu->begin ()))
+    {
+      NS_LOG_DEBUG ("Missed CTS, discard MPDUs");
+      m_mac->GetWifiRemoteStationManager ()->ReportFinalRtsFailed (m_psdu->GetHeader (0));
+      // Dequeue the MPDUs if they are stored in a queue
+      DequeuePsdu (m_psdu);
+      for (const auto& mpdu : *PeekPointer (m_psdu))
+        {
+          NotifyPacketDiscarded (mpdu);
+        }
+      m_edca->ResetCw ();
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Missed CTS, retransmit MPDUs");
+      for (const auto& mpdu : *PeekPointer (m_psdu))
+        {
+          RetransmitMpduAfterMissedCts (mpdu);
+        }
+      m_edca->UpdateFailedCw ();
+    }
+  m_psdu = 0;
+  TransmissionFailed ();
+}
+
+void
+HtFrameExchangeManager::SendPsdu (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  Time txDuration = m_phy->CalculateTxDuration (m_psdu->GetSize (), m_txParams.m_txVector, m_phy->GetPhyBand ());
+
+  NS_ASSERT (m_txParams.m_acknowledgment);
+
+  if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NONE)
+    {
+      Simulator::Schedule (txDuration, &HtFrameExchangeManager::TransmissionSucceeded, this);
+    }
+  else if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::BLOCK_ACK)
+    {
+      m_psdu->SetDuration (GetPsduDurationId (txDuration, m_txParams));
+
+      // the timeout duration is "aSIFSTime + aSlotTime + aRxPHYStartDelay, starting
+      // at the PHY-TXEND.confirm primitive" (section 10.3.2.9 or 10.22.2.2 of 802.11-2016).
+      // aRxPHYStartDelay equals the time to transmit the PHY header.
+      WifiBlockAck* blockAcknowledgment = static_cast<WifiBlockAck*> (m_txParams.m_acknowledgment.get ());
+
+      Time timeout = txDuration
+                    + m_phy->GetSifs ()
+                    + m_phy->GetSlot ()
+                    + m_phy->CalculatePhyPreambleAndHeaderDuration (blockAcknowledgment->blockAckTxVector);
+      NS_ASSERT (!m_txTimer.IsRunning ());
+      m_txTimer.Set (WifiTxTimer::WAIT_BLOCK_ACK, timeout, &HtFrameExchangeManager::BlockAckTimeout,
+                     this, m_psdu, m_txParams.m_txVector);
+      m_channelAccessManager->NotifyAckTimeoutStartNow (timeout);
+    }
+  else if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::BAR_BLOCK_ACK)
+    {
+      m_psdu->SetDuration (GetPsduDurationId (txDuration, m_txParams));
+
+      // schedule the transmission of a BAR in a SIFS
+      std::set<uint8_t> tids = m_psdu->GetTids ();
+      NS_ABORT_MSG_IF (tids.size () > 1, "Acknowledgment method incompatible with a Multi-TID A-MPDU");
+      uint8_t tid = *tids.begin ();
+
+      Ptr<QosTxop> edca = m_mac->GetQosTxop (tid);
+      edca->ScheduleBar (edca->PrepareBlockAckRequest (m_psdu->GetAddr1 (), tid));
+
+      Simulator::Schedule (txDuration, &HtFrameExchangeManager::TransmissionSucceeded, this);
+    }
+  else
+    {
+      NS_ABORT_MSG ("Unable to handle the selected acknowledgment method ("
+                    << m_txParams.m_acknowledgment.get () << ")");
+    }
+
+  // transmit the PSDU
+  if (m_psdu->GetNMpdus () > 1)
+    {
+      ForwardPsduDown (m_psdu, m_txParams.m_txVector);
+    }
+  else
+    {
+      ForwardMpduDown (*m_psdu->begin (), m_txParams.m_txVector);
+    }
+
+  if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NONE)
+    {
+      // we are done in case the A-MPDU does not require acknowledgment
+      m_psdu = 0;
+    }
+}
+
+void
+HtFrameExchangeManager::NotifyTxToEdca (Ptr<const WifiPsdu> psdu) const
+{
+  NS_LOG_FUNCTION (this << psdu);
+
+  for (const auto& mpdu : *PeekPointer (psdu))
+    {
+      if (mpdu->GetHeader ().IsQosData ())
+        {
+          Ptr<QosTxop> edca = m_mac->GetQosTxop (mpdu->GetHeader ().GetQosTid ());
+
+          if (mpdu->GetHeader ().IsQosEosp ())
+            {
+              edca->SetQosQueueSize (mpdu);
+            }
+          if (mpdu->GetHeader ().HasData ())
+            {
+              edca->CompleteMpduTx (mpdu);
+            }
+        }
+    }
+}
+
+void
+HtFrameExchangeManager::DequeueMpdu (Ptr<WifiMacQueueItem> mpdu)
+{
+  DequeuePsdu (Create<const WifiPsdu> (mpdu, true));
+}
+
+void
+HtFrameExchangeManager::DequeuePsdu (Ptr<const WifiPsdu> psdu)
+{
+  NS_LOG_DEBUG (this << psdu);
+
+  for (const auto& mpdu : *PeekPointer (psdu))
+    {
+      if (mpdu->GetQueueIteratorPairs ().size () > 1)
+        {
+          // this MPDU contains an A-MSDU
+          for (const auto& queueIt : mpdu->GetQueueIteratorPairs ())
+            {
+              NS_ASSERT (*queueIt.it != mpdu);
+              queueIt.queue->Dequeue (queueIt.it);
+            }
+        }
+      else if (mpdu->IsQueued ())
+        {
+          WifiMacQueueItem::QueueIteratorPair queueIt = mpdu->GetQueueIteratorPairs ().front ();
+          NS_ASSERT (*queueIt.it == mpdu);
+          queueIt.queue->Dequeue (queueIt.it);
+        }
+    }
+}
+
+void
+HtFrameExchangeManager::ForwardPsduDown (Ptr<const WifiPsdu> psdu, WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << psdu << txVector);
+
+  NS_LOG_DEBUG ("Transmitting a PSDU: " << *psdu << " TXVECTOR: " << txVector);
+  NotifyTxToEdca (psdu);
+
+  if (psdu->IsAggregate ())
+    {
+      txVector.SetAggregation (true);
+    }
+
+  // The PSDU is about to be transmitted, we can now dequeue the MPDUs
+  DequeuePsdu (psdu);
+
+  m_phy->Send (psdu, txVector);
+}
+
+bool
+HtFrameExchangeManager::IsWithinLimitsIfAddMpdu (Ptr<const WifiMacQueueItem> mpdu,
+                                                 const WifiTxParameters& txParams,
+                                                 Time ppduDurationLimit) const
+{
+  NS_ASSERT (mpdu != 0);
+  NS_LOG_FUNCTION (this << *mpdu << &txParams << ppduDurationLimit);
+  
+  Mac48Address receiver = mpdu->GetHeader ().GetAddr1 ();
+  uint32_t ampduSize = txParams.GetSizeIfAddMpdu (mpdu);
+
+  if (txParams.GetSize (receiver) > 0)
+    {
+      // we are attempting to perform A-MPDU aggregation, hence we have to check
+      // that we meet the limit on the max A-MPDU size
+      uint8_t tid;
+      const WifiTxParameters::PsduInfo* info;
+
+      if (mpdu->GetHeader ().IsQosData ())
+        {
+          tid = mpdu->GetHeader ().GetQosTid ();
+        }
+      else if ((info = txParams.GetPsduInfo (receiver)) && !info->seqNumbers.empty ())
+        {
+          tid = info->seqNumbers.begin ()->first;
+        }
+      else
+        {
+          NS_ABORT_MSG ("Cannot aggregate a non-QoS data frame to an A-MPDU that does"
+                        " not contain any QoS data frame");
+        }
+
+      WifiModulationClass modulation = txParams.m_txVector.GetModulationClass ();
+
+      if (!IsWithinAmpduSizeLimit (ampduSize, receiver, tid, modulation))
+        {
+          return false;
+        }
+    }
+
+  return IsWithinSizeAndTimeLimits (ampduSize, receiver, txParams, ppduDurationLimit);
+}
+
+bool
+HtFrameExchangeManager::IsWithinAmpduSizeLimit (uint32_t ampduSize, Mac48Address receiver, uint8_t tid,
+                                                WifiModulationClass modulation) const
+{
+  NS_LOG_FUNCTION (this << ampduSize << receiver << +tid << modulation);
+
+  uint32_t maxAmpduSize = m_mpduAggregator->GetMaxAmpduSize (receiver, tid, modulation);
+
+  if (maxAmpduSize == 0)
+    {
+      NS_LOG_DEBUG ("A-MPDU aggregation disabled");
+      return false;
+    }
+
+  if (ampduSize > maxAmpduSize)
+    {
+      NS_LOG_DEBUG ("the frame does not meet the constraint on max A-MPDU size ("
+                    << maxAmpduSize << ")");
+      return false;
+    }
+  return true;
+}
+
+bool
+HtFrameExchangeManager::TryAggregateMsdu (Ptr<const WifiMacQueueItem> msdu, WifiTxParameters& txParams,
+                                          Time availableTime) const
+{
+  NS_ASSERT (msdu != 0 && msdu->GetHeader ().IsQosData ());
+  NS_LOG_FUNCTION (this << *msdu << &txParams << availableTime);
+
+  // check if aggregating the given MSDU requires a different protection method
+  NS_ASSERT (txParams.m_protection);
+  Time protectionTime = txParams.m_protection->protectionTime;
+
+  std::unique_ptr<WifiProtection> protection;
+  protection = GetProtectionManager ()->TryAggregateMsdu (msdu, txParams);
+  bool protectionSwapped = false;
+
+  if (protection)
+    {
+      // the protection method has changed, calculate the new protection time
+      CalculateProtectionTime (protection.get ());
+      protectionTime = protection->protectionTime;
+      // swap unique pointers, so that the txParams that is passed to the next
+      // call to IsWithinLimitsIfAggregateMsdu is the most updated one
+      txParams.m_protection.swap (protection);
+      protectionSwapped = true;
+    }
+  NS_ASSERT (protectionTime != Time::Min ());
+
+  // check if aggregating the given MSDU requires a different acknowledgment method
+  NS_ASSERT (txParams.m_acknowledgment);
+  Time acknowledgmentTime = txParams.m_acknowledgment->acknowledgmentTime;
+
+  std::unique_ptr<WifiAcknowledgment> acknowledgment;
+  acknowledgment = GetAckManager ()->TryAggregateMsdu (msdu, txParams);
+  bool acknowledgmentSwapped = false;
+
+  if (acknowledgment)
+    {
+      // the acknowledgment method has changed, calculate the new acknowledgment time
+      CalculateAcknowledgmentTime (acknowledgment.get ());
+      acknowledgmentTime = acknowledgment->acknowledgmentTime;
+      // swap unique pointers, so that the txParams that is passed to the next
+      // call to IsWithinLimitsIfAggregateMsdu is the most updated one
+      txParams.m_acknowledgment.swap (acknowledgment);
+      acknowledgmentSwapped = true;
+    }
+  NS_ASSERT (acknowledgmentTime != Time::Min ());
+
+  Time ppduDurationLimit = Time::Min ();
+  if (availableTime != Time::Min ())
+    {
+      ppduDurationLimit = availableTime - protectionTime - acknowledgmentTime;
+    }
+
+  if (!IsWithinLimitsIfAggregateMsdu (msdu, txParams, ppduDurationLimit))
+    {
+      // adding MPDU failed, restore protection and acknowledgment methods
+      // if they were swapped
+      if (protectionSwapped)
+        {
+          txParams.m_protection.swap (protection);
+        }
+      if (acknowledgmentSwapped)
+        {
+          txParams.m_acknowledgment.swap (acknowledgment);
+        }
+      return false;
+    }
+
+  // the given MPDU can be added, hence update the txParams
+  txParams.AggregateMsdu (msdu);
+  UpdateTxDuration (msdu->GetHeader ().GetAddr1 (), txParams);
+
+  return true;
+}
+
+bool
+HtFrameExchangeManager::IsWithinLimitsIfAggregateMsdu (Ptr<const WifiMacQueueItem> msdu,
+                                                       const WifiTxParameters& txParams,
+                                                       Time ppduDurationLimit) const
+{
+  NS_ASSERT (msdu != 0 && msdu->GetHeader ().IsQosData ());
+  NS_LOG_FUNCTION (this << *msdu << &txParams << ppduDurationLimit);
+
+  std::pair<uint16_t, uint32_t> ret = txParams.GetSizeIfAggregateMsdu (msdu);
+  Mac48Address receiver = msdu->GetHeader ().GetAddr1 ();
+  uint8_t tid = msdu->GetHeader ().GetQosTid ();
+  WifiModulationClass modulation = txParams.m_txVector.GetModulationClass ();
+
+  // Check that the limit on A-MSDU size is met
+  uint16_t maxAmsduSize = m_msduAggregator->GetMaxAmsduSize (receiver, tid, modulation);
+
+  if (maxAmsduSize == 0)
+    {
+      NS_LOG_DEBUG ("A-MSDU aggregation disabled");
+      return false;
+    }
+
+  if (ret.first > maxAmsduSize)
+    {
+      NS_LOG_DEBUG ("No other MSDU can be aggregated: maximum A-MSDU size ("
+                    << maxAmsduSize << ") reached ");
+      return false;
+    }
+
+  const WifiTxParameters::PsduInfo* info = txParams.GetPsduInfo (msdu->GetHeader ().GetAddr1 ());
+  NS_ASSERT (info != nullptr);
+
+  if (info->ampduSize > 0)
+    {
+      // the A-MSDU being built is aggregated to other MPDUs in an A-MPDU.
+      // Check that the limit on A-MPDU size is met.
+      if (!IsWithinAmpduSizeLimit (ret.second, receiver, tid, modulation))
+        {
+          return false;
+        }
+    }
+
+  return IsWithinSizeAndTimeLimits (ret.second, receiver, txParams, ppduDurationLimit);
+}
+
+void
+HtFrameExchangeManager::BlockAckTimeout (Ptr<WifiPsdu> psdu, const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << *psdu << txVector);
+
+  m_mac->GetWifiRemoteStationManager ()->ReportDataFailed (*psdu->begin ());
+
+  bool resetCw;
+  MissedBlockAck (psdu, txVector, resetCw);
+
+  NS_ASSERT (m_edca != 0);
+
+  if (resetCw)
+    {
+      m_edca->ResetCw ();
+    }
+  else
+    {
+      m_edca->UpdateFailedCw ();
+    }
+
+  m_psdu = 0;
+  TransmissionFailed ();
+}
+
+void
+HtFrameExchangeManager::MissedBlockAck (Ptr<WifiPsdu> psdu, const WifiTxVector& txVector, bool& resetCw)
+{
+  NS_LOG_FUNCTION (this << psdu << txVector << resetCw);
+
+  Mac48Address recipient = psdu->GetAddr1 ();
+  bool isBar;
+  uint8_t tid;
+
+  if (psdu->GetNMpdus () == 1 && psdu->GetHeader (0).IsBlockAckReq ())
+    {
+      isBar = true;
+      CtrlBAckRequestHeader baReqHdr;
+      psdu->GetPayload (0)->PeekHeader (baReqHdr);
+      tid = baReqHdr.GetTidInfo ();
+    }
+  else
+    {
+      isBar = false;
+      m_mac->GetWifiRemoteStationManager ()->ReportAmpduTxStatus (recipient, 0, psdu->GetNMpdus (),
+                                                                  0, 0, txVector);
+      std::set<uint8_t> tids = psdu->GetTids ();
+      NS_ABORT_MSG_IF (tids.size () > 1, "Multi-TID A-MPDUs not handled here");
+      NS_ASSERT (!tids.empty ());
+      tid = *tids.begin ();
+    }
+
+  Ptr<QosTxop> edca = m_mac->GetQosTxop (tid);
+
+  if (edca->UseExplicitBarAfterMissedBlockAck () || isBar)
+    {
+      // we have to send a BlockAckReq, if needed
+      if (GetBaManager (tid)->NeedBarRetransmission (tid, recipient))
+        {
+          NS_LOG_DEBUG ("Missed Block Ack, transmit a BlockAckReq");
+          if (isBar)
+            {
+              psdu->GetHeader (0).SetRetry ();
+              edca->ScheduleBar (*psdu->begin ());
+            }
+          else
+            {
+              // missed block ack after data frame with Implicit BAR Ack policy
+              edca->ScheduleBar (edca->PrepareBlockAckRequest (recipient, tid));
+            }
+          resetCw = false;
+        }
+      else
+        {
+          NS_LOG_DEBUG ("Missed Block Ack, do not transmit a BlockAckReq");
+          // if a BA agreement exists, we can get here if there is no outstanding
+          // MPDU whose lifetime has not expired yet.
+          m_mac->GetWifiRemoteStationManager ()->ReportFinalDataFailed (*psdu->begin ());
+          if (GetBaManager (tid)->ExistsAgreementInState (recipient, tid,
+                                                          OriginatorBlockAckAgreement::ESTABLISHED))
+            {
+              // If there is any (expired) outstanding MPDU, request the BA manager to discard
+              // it, which involves the scheduling of a BAR to advance the recipient's window
+              if (GetBaManager (tid)->GetNBufferedPackets (recipient, tid) > 0)
+                {
+                  GetBaManager (tid)->DiscardOutstandingMpdus (recipient, tid);
+                }
+              // otherwise, it means that we have not received a Block Ack in response to a
+              // BlockAckRequest sent while no frame was outstanding, whose purpose was therefore
+              // to advance the recipient's window. Schedule a BlockAckRequest with
+              // skipIfNoDataQueued set to true, so that the BlockAckRequest is only sent
+              // if there are data frames queued for this recipient.
+              else
+                {
+                  edca->ScheduleBar (edca->PrepareBlockAckRequest (recipient, tid), true);
+                }
+            }
+          resetCw = true;
+        }
+    }
+  else
+    {
+      // we have to retransmit the data frames, if needed
+      if (!m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (*psdu->begin ()))
+        {
+          NS_LOG_DEBUG ("Missed Block Ack, do not retransmit the data frames");
+          m_mac->GetWifiRemoteStationManager ()->ReportFinalDataFailed (*psdu->begin ());
+          for (const auto& mpdu : *PeekPointer (psdu))
+            {
+              FrameExchangeManager::NotifyPacketDiscarded (mpdu);
+            }
+          GetBaManager (tid)->DiscardOutstandingMpdus (recipient, tid);
+          resetCw = true;
+        }
+      else
+        {
+          NS_LOG_DEBUG ("Missed Block Ack, retransmit data frames");
+          GetBaManager (tid)->NotifyMissedBlockAck (recipient, tid);
+          resetCw = false;
+        }
+    }
+}
+
+void
+HtFrameExchangeManager::SendBlockAck (const RecipientBlockAckAgreement& agreement, Time durationId,
+                                      WifiTxVector& blockAckTxVector, double rxSnr)
+{
+  NS_LOG_FUNCTION (this << durationId << blockAckTxVector << rxSnr);
+
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_CTL_BACKRESP);
+  hdr.SetAddr1 (agreement.GetPeer ());
+  hdr.SetAddr2 (m_self);
+  hdr.SetDsNotFrom ();
+  hdr.SetDsNotTo ();
+
+  CtrlBAckResponseHeader blockAck;
+  blockAck.SetType (agreement.GetBlockAckType ());
+  blockAck.SetTidInfo (agreement.GetTid ());
+  agreement.FillBlockAckBitmap (&blockAck);
+
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader (blockAck);
+  Ptr<WifiPsdu> psdu = GetWifiPsdu (Create<WifiMacQueueItem> (packet, hdr), blockAckTxVector);
+
+  // 802.11-2016, Section 9.2.5.7: In a BlockAck frame transmitted in response
+  // to a BlockAckReq frame or transmitted in response to a frame containing an
+  // implicit block ack request, the Duration/ID field is set to the value obtained
+  // from the Duration/ ID field of the frame that elicited the response minus the
+  // time, in microseconds between the end of the PPDU carrying the frame that
+  // elicited the response and the end of the PPDU carrying the BlockAck frame.
+  Time baDurationId = durationId - m_phy->GetSifs ()
+                      - m_phy->CalculateTxDuration (psdu, blockAckTxVector, m_phy->GetPhyBand ());
+  // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8 of 802.11-2016)
+  if (baDurationId.IsStrictlyNegative ())
+    {
+      baDurationId = Seconds (0);
+    }
+  psdu->GetHeader (0).SetDuration (baDurationId);
+
+  SnrTag tag;
+  tag.Set (rxSnr);
+  psdu->GetPayload (0)->AddPacketTag (tag);
+
+  ForwardPsduDown (psdu, blockAckTxVector);
+}
+
+bool
+HtFrameExchangeManager::GetBaAgreementEstablished (Mac48Address originator, uint8_t tid) const
+{
+  return (m_agreements.find ({originator, tid}) != m_agreements.end ());
+}
+
+BlockAckType
+HtFrameExchangeManager::GetBlockAckType (Mac48Address originator, uint8_t tid) const
+{
+  auto it = m_agreements.find ({originator, tid});
+  NS_ABORT_MSG_IF (it == m_agreements.end (), "No established Block Ack agreement");
+  return it->second.GetBlockAckType ();
+}
+
+void
+HtFrameExchangeManager::ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu, RxSignalInfo rxSignalInfo,
+                                     const WifiTxVector& txVector, bool inAmpdu)
+{
+  // The received MPDU is either broadcast or addressed to this station
+  NS_ASSERT (mpdu->GetHeader ().GetAddr1 ().IsGroup ()
+             || mpdu->GetHeader ().GetAddr1 () == m_self);
+
+  double rxSnr = rxSignalInfo.snr;
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
+
+  if (hdr.IsCtl ())
+    {
+      if (hdr.IsCts () && m_txTimer.IsRunning () && m_txTimer.GetReason () == WifiTxTimer::WAIT_CTS
+          && m_psdu != 0)
+        {
+          NS_ABORT_MSG_IF (inAmpdu, "Received CTS as part of an A-MPDU");
+          NS_ASSERT (hdr.GetAddr1 () == m_self);
+
+          Mac48Address sender = m_psdu->GetAddr1 ();
+          NS_LOG_DEBUG ("Received CTS from=" << sender);
+
+          SnrTag tag;
+          mpdu->GetPacket ()->PeekPacketTag (tag);
+          m_mac->GetWifiRemoteStationManager ()->ReportRxOk (sender, rxSignalInfo, txVector);
+          m_mac->GetWifiRemoteStationManager ()->ReportRtsOk (m_psdu->GetHeader (0),
+                                                              rxSnr, txVector.GetMode (), tag.Get ());
+
+          m_txTimer.Cancel ();
+          m_channelAccessManager->NotifyCtsTimeoutResetNow ();
+          Simulator::Schedule (m_phy->GetSifs (), &HtFrameExchangeManager::SendPsdu, this);
+        }
+      else if (hdr.IsBlockAck () && m_txTimer.IsRunning ()
+               && m_txTimer.GetReason () == WifiTxTimer::WAIT_BLOCK_ACK
+               && hdr.GetAddr1 () == m_self)
+        {
+          Mac48Address sender = hdr.GetAddr2 ();
+          NS_LOG_DEBUG ("Received BlockAck from=" << sender);
+
+          SnrTag tag;
+          mpdu->GetPacket ()->PeekPacketTag (tag);
+
+          // notify the Block Ack Manager
+          CtrlBAckResponseHeader blockAck;
+          mpdu->GetPacket ()->PeekHeader (blockAck);
+          uint8_t tid = blockAck.GetTidInfo ();
+          GetBaManager (tid)->NotifyGotBlockAck (blockAck, hdr.GetAddr2 (), {tid}, rxSnr,
+                                                 tag.Get (), m_txParams.m_txVector);
+
+          // cancel the timer
+          m_txTimer.Cancel ();
+          m_channelAccessManager->NotifyAckTimeoutResetNow ();
+
+          // Reset the CW
+          m_edca->ResetCw ();
+
+          m_psdu = 0;
+          TransmissionSucceeded ();
+        }
+      else if (hdr.IsBlockAckReq ())
+        {
+          NS_ASSERT (hdr.GetAddr1 () == m_self);
+          NS_ABORT_MSG_IF (inAmpdu, "BlockAckReq in A-MPDU is not supported");
+
+          Mac48Address sender = hdr.GetAddr2 ();
+          NS_LOG_DEBUG ("Received BlockAckReq from=" << sender);
+
+          CtrlBAckRequestHeader blockAckReq;
+          mpdu->GetPacket ()->PeekHeader (blockAckReq);
+          NS_ABORT_MSG_IF (blockAckReq.IsMultiTid (), "Multi-TID BlockAckReq not supported");
+          uint8_t tid = blockAckReq.GetTidInfo ();
+          
+          auto agreementIt = m_agreements.find ({sender, tid});
+
+          if (agreementIt == m_agreements.end ())
+            {
+              NS_LOG_DEBUG ("There's not a valid agreement for this BlockAckReq");
+              return;
+            }
+
+          agreementIt->second.NotifyReceivedBar (blockAckReq.GetStartingSequence ());
+
+          NS_LOG_DEBUG ("Schedule Block Ack");
+          Simulator::Schedule (m_phy->GetSifs (), &HtFrameExchangeManager::SendBlockAck, this,
+                               agreementIt->second, hdr.GetDuration (),
+                               m_mac->GetWifiRemoteStationManager ()->GetBlockAckTxVector (sender, txVector),
+                               rxSnr);
+        }
+      else
+        {
+          // the received control frame cannot be handled here
+          QosFrameExchangeManager::ReceiveMpdu (mpdu, rxSignalInfo, txVector, inAmpdu);
+        }
+      return;
+    }
+
+  if (hdr.IsQosData () && hdr.HasData () && hdr.GetAddr1 () == m_self)
+    {
+      uint8_t tid = hdr.GetQosTid ();
+
+      auto agreementIt = m_agreements.find ({hdr.GetAddr2 (), tid});
+      if (agreementIt != m_agreements.end ())
+        {
+          // a Block Ack agreement has been established
+          NS_LOG_DEBUG ("Received from=" << hdr.GetAddr2 ()
+                        << " (" << *mpdu << ")");
+
+          agreementIt->second.NotifyReceivedMpdu (mpdu);
+
+          if (!inAmpdu && hdr.GetQosAckPolicy () == WifiMacHeader::NORMAL_ACK)
+            {
+              NS_LOG_DEBUG ("Schedule Normal Ack");
+              Simulator::Schedule (m_phy->GetSifs (), &HtFrameExchangeManager::SendNormalAck,
+                                   this, hdr, txVector, rxSnr);
+            }
+          return;
+        }
+      // We let the QosFrameExchangeManager handle QoS data frame not belonging
+      // to a Block Ack agreement
+    }
+
+  QosFrameExchangeManager::ReceiveMpdu (mpdu, rxSignalInfo, txVector, inAmpdu);
+}
+
+void
+HtFrameExchangeManager::EndReceiveAmpdu (Ptr<const WifiPsdu> psdu, const RxSignalInfo& rxSignalInfo,
+                                         const WifiTxVector& txVector, const std::vector<bool>& perMpduStatus)
+{
+  std::set<uint8_t> tids = psdu->GetTids ();
+
+  // Multi-TID A-MPDUs are not supported yet
+  if (tids.size () == 1)
+    {
+      uint8_t tid = *tids.begin ();
+      WifiMacHeader::QosAckPolicy ackPolicy = psdu->GetAckPolicyForTid (tid);
+      NS_ASSERT (psdu->GetNMpdus () > 1);
+
+      if (ackPolicy == WifiMacHeader::NORMAL_ACK)
+        {
+          // Normal Ack or Implicit Block Ack Request
+          NS_LOG_DEBUG ("Schedule Block Ack");
+          auto agreementIt = m_agreements.find ({psdu->GetAddr2 (), tid});
+          NS_ASSERT (agreementIt != m_agreements.end ());
+
+          Simulator::Schedule (m_phy->GetSifs (), &HtFrameExchangeManager::SendBlockAck, this,
+                               agreementIt->second, psdu->GetDuration (),
+                               m_mac->GetWifiRemoteStationManager ()->GetBlockAckTxVector (psdu->GetAddr2 (), txVector),
+                               rxSignalInfo.snr);
+        }
+    }
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht/ht-frame-exchange-manager.h ns-3.34/src/wifi/model/ht/ht-frame-exchange-manager.h
--- ns-3.33/src/wifi/model/ht/ht-frame-exchange-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/ht/ht-frame-exchange-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,397 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef HT_FRAME_EXCHANGE_MANAGER_H
+#define HT_FRAME_EXCHANGE_MANAGER_H
+
+#include "ns3/qos-frame-exchange-manager.h"
+#include "ns3/mpdu-aggregator.h"
+#include "ns3/msdu-aggregator.h"
+#include "ns3/wifi-psdu.h"
+
+class AmpduAggregationTest;
+class TwoLevelAggregationTest;
+class HeAggregationTest;
+
+namespace ns3 {
+
+class MgtAddBaResponseHeader;
+class RecipientBlockAckAgreement;
+
+/**
+ * \ingroup wifi
+ *
+ * HtFrameExchangeManager handles the frame exchange sequences
+ * for HT stations.
+ */
+class HtFrameExchangeManager : public QosFrameExchangeManager
+{
+public:
+  /// allow AmpduAggregationTest class access
+  friend class ::AmpduAggregationTest;
+  /// allow TwoLevelAggregationTest class access
+  friend class ::TwoLevelAggregationTest;
+  /// allow HeAggregationTest class access
+  friend class ::HeAggregationTest;
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  HtFrameExchangeManager ();
+  virtual ~HtFrameExchangeManager ();
+
+  bool StartFrameExchange (Ptr<QosTxop> edca, Time availableTime, bool initialFrame) override;
+  void SetWifiMac (const Ptr<RegularWifiMac> mac) override;
+  void CalculateAcknowledgmentTime (WifiAcknowledgment* acknowledgment) const override;
+
+  /**
+   * Returns the aggregator used to construct A-MSDU subframes.
+   *
+   * \return the aggregator used to construct A-MSDU subframes.
+   */
+  Ptr<MsduAggregator> GetMsduAggregator (void) const;
+  /**
+   * Returns the aggregator used to construct A-MPDU subframes.
+   *
+   * \return the aggregator used to construct A-MPDU subframes.
+   */
+  Ptr<MpduAggregator> GetMpduAggregator (void) const;
+
+  /**
+   * Check if the PSDU obtained by aggregating the given MPDU to the PSDU specified
+   * by the given TX parameters meets the constraints on the maximum A-MPDU size
+   * and its transmission time does not exceed the given PPDU duration limit (if
+   * different than Time::Min()).
+   *
+   * \param mpdu the given MPDU
+   * \param txParams the TX parameters
+   * \param ppduDurationLimit the constraint on the PPDU transmission time
+   * \return true if the size and time constraints are met, false otherwise
+   */
+  bool IsWithinLimitsIfAddMpdu (Ptr<const WifiMacQueueItem> mpdu,
+                                const WifiTxParameters& txParams,
+                                Time ppduDurationLimit) const override;
+
+  /**
+   * Check whether an A-MPDU of the given size meets the constraint on the maximum
+   * size for A-MPDUs sent to the given receiver, belonging to the given TID and
+   * transmitted using the given modulation class.
+   *
+   * \param ampduSize the size in bytes of the A-MPDU.
+   * \param receiver the address of the station that is the receiver of the A-MPDU
+   * \param tid the TID of the A-MPDU
+   * \param modulation the modulation class used to transmit the A-MPDU
+   * \return true if the constraint on the max A-MPDU size is met.
+   */
+  virtual bool IsWithinAmpduSizeLimit (uint32_t ampduSize, Mac48Address receiver, uint8_t tid,
+                                       WifiModulationClass modulation) const;
+
+  /**
+   * Check if aggregating an MSDU to the current MPDU (as specified by the given
+   * TX parameters) does not violate the size and time constraints, while taking
+   * into account the possibly updated protection and acknowledgment methods. If
+   * size and time constraints are met, the TX parameters are modified with the
+   * updated protection and acknowledgment methods.
+   *
+   * \param msdu the given MSDU
+   * \param txParams the TX parameters
+   * \param availableTime the constraint on the TX time of the PSDU, if different
+   *        than Time::Min()
+   * \return true if aggregating an MSDU to the current PSDU does not violate the
+   *         size and time constraints
+   */
+  virtual bool TryAggregateMsdu (Ptr<const WifiMacQueueItem> msdu, WifiTxParameters& txParams,
+                                 Time availableTime) const;
+
+  /**
+   * Check if the PSDU obtained by aggregating the given MSDU to the PSDU specified
+   * by the given TX parameters meets the constraints on the maximum A-MSDU size
+   * and its transmission time does not exceed the given PPDU duration limit (if
+   * different than Time::Min()).
+   *
+   * \param msdu the given MSDU
+   * \param txParams the TX parameters
+   * \param ppduDurationLimit the constraint on the PPDU transmission time
+   * \return true if the size and time constraints are met, false otherwise
+   */
+  virtual bool IsWithinLimitsIfAggregateMsdu (Ptr<const WifiMacQueueItem> msdu,
+                                              const WifiTxParameters& txParams,
+                                              Time ppduDurationLimit) const;
+
+  /**
+   * \param respHdr Add block ack response from originator (action
+   *        frame).
+   * \param originator Address of peer station involved in block ack
+   *        mechanism.
+   * \param startingSeq Sequence number of the first MPDU of all
+   *        packets for which block ack was negotiated.
+   *
+   * This function is typically invoked only by ns3::RegularWifiMac
+   * when the STA (which may be non-AP in ESS, or in an IBSS) has
+   * received an ADDBA Request frame and is transmitting an ADDBA
+   * Response frame. At this point MacLow must allocate buffers to
+   * collect all correctly received packets belonging to the category
+   * for which block ack was negotiated.
+   */
+  void CreateBlockAckAgreement (const MgtAddBaResponseHeader *respHdr,
+                                Mac48Address originator, uint16_t startingSeq);
+  /**
+   * Destroy a Block Ack agreement.
+   *
+   * \param originator the originator MAC address
+   * \param tid the TID associated with the Block Ack agreement
+   */
+  void DestroyBlockAckAgreement (Mac48Address originator, uint8_t tid);
+  /**
+   * This method can be called to accept a received ADDBA Request. An
+   * ADDBA Response will be constructed and queued for transmission.
+   *
+   * \param reqHdr a pointer to the received ADDBA Request header.
+   * \param originator the MAC address of the originator.
+   */
+  void SendAddBaResponse (const MgtAddBaRequestHeader *reqHdr,
+                          Mac48Address originator);
+  /**
+   * Get the maximum supported buffer size for a Block Ack agreement. This value
+   * is typically included in ADDBA Response frames.
+   *
+   * \return the maximum supported buffer size for a Block Ack agreement
+   */
+  virtual uint16_t GetSupportedBaBufferSize (void) const;
+
+  /**
+   * Return true if a Block Ack agreement has been established with the given
+   * originator for the given TID.
+   *
+   * \param originator the MAC address of the given originator
+   * \param tid the Traffic ID
+   * \return true if a Block Ack agreement has been established with the given
+   *         originator for the given TID
+   */
+  bool GetBaAgreementEstablished (Mac48Address originator, uint8_t tid) const;
+
+  /**
+   * Get the type of BlockAck frames sent to the given originator.
+   *
+   * \param originator the MAC address of the given originator
+   * \param tid the Traffic ID
+   * \return the type of BlockAck frames sent to the given originator
+   */
+  BlockAckType GetBlockAckType (Mac48Address originator, uint8_t tid) const;
+
+protected:
+  void DoDispose () override;
+
+  void ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu, RxSignalInfo rxSignalInfo,
+                    const WifiTxVector& txVector, bool inAmpdu) override;
+  void EndReceiveAmpdu (Ptr<const WifiPsdu> psdu, const RxSignalInfo& rxSignalInfo,
+                        const WifiTxVector& txVector, const std::vector<bool>& perMpduStatus) override;
+  void NotifyReceivedNormalAck (Ptr<WifiMacQueueItem> mpdu) override;
+  void NotifyPacketDiscarded (Ptr<const WifiMacQueueItem> mpdu) override;
+  void RetransmitMpduAfterMissedAck (Ptr<WifiMacQueueItem> mpdu) const override;
+  void RetransmitMpduAfterMissedCts (Ptr<WifiMacQueueItem> mpdu) const override;
+  void ForwardMpduDown (Ptr<WifiMacQueueItem> mpdu, WifiTxVector& txVector) override;
+  void CtsTimeout (Ptr<WifiMacQueueItem> rts, const WifiTxVector& txVector) override;
+  void TransmissionSucceeded (void) override;
+  void DequeueMpdu (Ptr<WifiMacQueueItem> mpdu) override;
+
+  /**
+   * Get a PSDU containing the given MPDU
+   *
+   * \param mpdu the given MPDU
+   * \param txVector the TXVECTOR to use to send the MPDU
+   * \return a PSDU containing the given MPDU
+   */
+  virtual Ptr<WifiPsdu> GetWifiPsdu (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector) const;
+
+  /**
+   * Get the Block Ack Manager handling the given TID.
+   *
+   * \param tid the given TID
+   * \return the Block Ack Manager handling the given TID
+   */
+  Ptr<BlockAckManager> GetBaManager (uint8_t tid) const;
+
+  /**
+   * Compute how to set the Duration/ID field of PSDUs that do not include fragments.
+   *
+   * \param txDuration the duration of the PSDU transmission
+   * \param txParams the TX parameters used to send the PSDU
+   * \return the value for the Duration/ID field
+   */
+  virtual Time GetPsduDurationId (Time txDuration, const WifiTxParameters& txParams) const;
+
+  /**
+   * Send a PSDU (A-MPDU or BlockAckReq frame) requesting a BlockAck frame or
+   * a BlockAckReq frame followed by a BlockAck frame for the acknowledgment.
+   * Note that <i>txParams</i> is moved to m_txParams and hence is left in an
+   * undefined state.
+   *
+   * \param psdu the PSDU to send
+   * \param txParams the TX parameters to use to transmit the PSDU
+   */
+  void SendPsduWithProtection (Ptr<WifiPsdu> psdu, WifiTxParameters& txParams);
+
+  /**
+   * Notify the transmission of the given PSDU to the EDCAF associated with the
+   * AC the PSDU belongs to.
+   *
+   * \param psdu the PSDU to transmit
+   */
+  virtual void NotifyTxToEdca (Ptr<const WifiPsdu> psdu) const;
+
+  /**
+   * Forward a PSDU down to the PHY layer. Also, notify the Block Ack Manager
+   * of the transmission of the constituent MPDUs.
+   *
+   * \param psdu the PSDU to forward down
+   * \param txVector the TXVECTOR used to transmit the MPDU
+   */
+  virtual void ForwardPsduDown (Ptr<const WifiPsdu> psdu, WifiTxVector& txVector);
+
+  /**
+   * Dequeue the MPDUs of the given PSDU from the queue in which they are stored.
+   *
+   * \param psdu the given PSDU
+   */
+  void DequeuePsdu (Ptr<const WifiPsdu> psdu);
+
+  /**
+   * If the Block Ack Manager associated with the given EDCA has a BlockAckReq frame
+   * to transmit (the duration of which plus the response fits within the given
+   * available time, if the latter is not Time::Min() and this is not the initial
+   * frame of a TXOP), transmit the frame and return true. Otherwise, return false.
+   *
+   * \param edca the EDCAF which has been granted the opportunity to transmit
+   * \param availableTime the amount of time allowed for the frame exchange. Equals
+   *                      Time::Min() in case the TXOP limit is null
+   * \param initialFrame true if the frame being transmitted is the initial frame
+   *                     of the TXOP. This is used to determine whether the TXOP
+   *                     limit can be exceeded
+   * \return true if frame is transmitted, false otherwise
+   */
+  virtual bool SendMpduFromBaManager (Ptr<QosTxop> edca, Time availableTime, bool initialFrame);
+
+  /**
+   * Given a non-broadcast QoS data frame, prepare the PSDU to transmit by attempting
+   * A-MSDU and A-MPDU aggregation (if enabled), while making sure that the frame
+   * exchange (possibly including protection and acknowledgment) is completed within
+   * the given available time.
+   *
+   * \param peekedItem the given non-broadcast QoS data frame
+   * \param availableTime the amount of time allowed for the frame exchange. Equals
+   *                      Time::Min() in case the TXOP limit is null
+   * \param initialFrame true if the frame being transmitted is the initial frame
+   *                     of the TXOP. This is used to determine whether the TXOP
+   *                     limit can be exceeded
+   * \return true if frame is transmitted, false otherwise
+   */
+  virtual bool SendDataFrame (Ptr<const WifiMacQueueItem> peekedItem,
+                              Time availableTime, bool initialFrame);
+
+  /**
+   * A Block Ack agreement needs to be established with the given recipient for the
+   * given TID if it does not already exist (or exists and is in state RESET) and:
+   *
+   * - the number of packets in the queue reaches the BlockAckThreshold value OR
+   * - MPDU aggregation is enabled and there is more than one packet in the queue OR
+   * - the station is a VHT station
+   *
+   * \param recipient address of the recipient.
+   * \param tid traffic ID.
+   * \return true if a Block Ack agreement needs to be established, false otherwise.
+   */
+  virtual bool NeedSetupBlockAck (Mac48Address recipient, uint8_t tid);
+
+  /**
+   * Sends an ADDBA Request to establish a block ack agreement with STA
+   * addressed by <i>recipient</i> for TID <i>tid</i>.
+   *
+   * \param recipient address of the recipient.
+   * \param tid traffic ID.
+   * \param startingSeq the BA agreement starting sequence number
+   * \param timeout timeout value.
+   * \param immediateBAck flag to indicate whether immediate BlockAck is used.
+   */
+  void SendAddBaRequest (Mac48Address recipient, uint8_t tid, uint16_t startingSeq,
+                         uint16_t timeout, bool immediateBAck);
+
+  /**
+   * Sends DELBA frame to cancel a block ack agreement with STA
+   * addressed by <i>addr</i> for TID <i>tid</i>.
+   *
+   * \param addr address of the recipient.
+   * \param tid traffic ID.
+   * \param byOriginator flag to indicate whether this is set by the originator.
+   */
+  void SendDelbaFrame (Mac48Address addr, uint8_t tid, bool byOriginator);
+
+  /**
+   * Create a BlockAck frame with header equal to <i>blockAck</i> and start its transmission.
+   *
+   * \param agreement the agreement the Block Ack response belongs to
+   * \param durationId the Duration/ID of the frame soliciting this Block Ack response
+   * \param blockAckTxVector the transmit vector for the Block Ack response
+   * \param rxSnr the receive SNR
+   */
+  void SendBlockAck (const RecipientBlockAckAgreement& agreement, Time durationId,
+                     WifiTxVector& blockAckTxVector, double rxSnr);
+
+  /**
+   * Called when the BlockAck timeout expires.
+   *
+   * \param psdu the PSDU (BlockAckReq or A-MPDU) that solicited a BlockAck response
+   * \param txVector the TXVECTOR used to send the PSDU that solicited a BlockAck response
+   */
+  virtual void BlockAckTimeout (Ptr<WifiPsdu> psdu, const WifiTxVector& txVector);
+
+  /**
+   * Take necessary actions when a BlockAck is missed, such as scheduling a
+   * BlockAckReq frame or the retransmission of the unacknowledged frames.
+   *
+   * \param psdu the PSDU (BlockAckReq or A-MPDU) that solicited a BlockAck response
+   * \param txVector the TXVECTOR used to send the PSDU that solicited a BlockAck response
+   * \param[out] resetCw true if we shall stop retransmitting the PSDU
+   */
+  virtual void MissedBlockAck (Ptr<WifiPsdu> psdu, const WifiTxVector& txVector, bool& resetCw);
+
+  /// agreement key typedef (MAC address and TID)
+  typedef std::pair<Mac48Address, uint8_t> AgreementKey;
+
+  std::map<AgreementKey, RecipientBlockAckAgreement> m_agreements; //!< agreements
+  Ptr<MsduAggregator> m_msduAggregator;                            //!< A-MSDU aggregator
+  Ptr<MpduAggregator> m_mpduAggregator;                            //!< A-MPDU aggregator
+
+private:
+  /**
+   * Send the current PSDU, which can be acknowledged by a BlockAck frame or
+   * followed by a BlockAckReq frame and a BlockAck frame.
+   */
+  void SendPsdu (void);
+
+  Ptr<WifiPsdu> m_psdu;                               //!< the A-MPDU being transmitted
+  WifiTxParameters m_txParams;                        //!< the TX parameters for the current frame
+};
+
+} //namespace ns3
+
+#endif /* HT_FRAME_EXCHANGE_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht/ht-operation.cc ns-3.34/src/wifi/model/ht/ht-operation.cc
--- ns-3.33/src/wifi/model/ht/ht-operation.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/ht/ht-operation.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,520 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016 Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "ht-operation.h"
+
+namespace ns3 {
+
+HtOperation::HtOperation ()
+  : m_primaryChannel (0),
+    m_secondaryChannelOffset (0),
+    m_staChannelWidth (0),
+    m_rifsMode (0),
+    m_reservedInformationSubset1 (0),
+    m_htProtection (0),
+    m_nonGfHtStasPresent (1),
+    m_reservedInformationSubset2_1 (0),
+    m_obssNonHtStasPresent (0),
+    m_reservedInformationSubset2_2 (0),
+    m_reservedInformationSubset3_1 (0),
+    m_dualBeacon (0),
+    m_dualCtsProtection (0),
+    m_stbcBeacon (0),
+    m_lSigTxopProtectionFullSupport (0),
+    m_pcoActive (0),
+    m_pcoPhase (0),
+    m_reservedInformationSubset3_2 (0),
+    m_reservedMcsSet1 (0),
+    m_rxHighestSupportedDataRate (0),
+    m_reservedMcsSet2 (0),
+    m_txMcsSetDefined (0),
+    m_txRxMcsSetUnequal (0),
+    m_txMaxNSpatialStreams (0),
+    m_txUnequalModulation (0),
+    m_reservedMcsSet3 (0),
+    m_htSupported (0)
+{
+  for (uint8_t k = 0; k < MAX_SUPPORTED_MCS; k++)
+    {
+      m_rxMcsBitmask[k] = 0;
+    }
+}
+
+WifiInformationElementId
+HtOperation::ElementId () const
+{
+  return IE_HT_OPERATION;
+}
+
+void
+HtOperation::SetHtSupported (uint8_t htSupported)
+{
+  m_htSupported = htSupported;
+}
+
+uint8_t
+HtOperation::GetInformationFieldSize () const
+{
+  //we should not be here if HT is not supported
+  NS_ASSERT (m_htSupported > 0);
+  return 22;
+}
+
+void
+HtOperation::SetPrimaryChannel (uint8_t ctrl)
+{
+  m_primaryChannel = ctrl;
+}
+
+void
+HtOperation::SetSecondaryChannelOffset (uint8_t secondaryChannelOffset)
+{
+  m_secondaryChannelOffset = secondaryChannelOffset;
+}
+
+void
+HtOperation::SetStaChannelWidth (uint8_t staChannelWidth)
+{
+  m_staChannelWidth = staChannelWidth;
+}
+
+void
+HtOperation::SetRifsMode (uint8_t rifsMode)
+{
+  m_rifsMode = rifsMode;
+}
+
+void
+HtOperation::SetHtProtection (uint8_t htProtection)
+{
+  m_htProtection = htProtection;
+}
+
+void
+HtOperation::SetNonGfHtStasPresent (uint8_t nonGfHtStasPresent)
+{
+  m_nonGfHtStasPresent = nonGfHtStasPresent;
+}
+
+void
+HtOperation::SetObssNonHtStasPresent (uint8_t obssNonHtStasPresent)
+{
+  m_obssNonHtStasPresent = obssNonHtStasPresent;
+}
+
+void
+HtOperation::SetDualBeacon (uint8_t dualBeacon)
+{
+  m_dualBeacon = dualBeacon;
+}
+
+void
+HtOperation::SetDualCtsProtection (uint8_t dualCtsProtection)
+{
+  m_dualCtsProtection = dualCtsProtection;
+}
+
+void
+HtOperation::SetStbcBeacon (uint8_t stbcBeacon)
+{
+  m_stbcBeacon = stbcBeacon;
+}
+
+void
+HtOperation::SetLSigTxopProtectionFullSupport (uint8_t lSigTxopProtectionFullSupport)
+{
+  m_lSigTxopProtectionFullSupport = lSigTxopProtectionFullSupport;
+}
+
+void
+HtOperation::SetPcoActive (uint8_t pcoActive)
+{
+  m_pcoActive = pcoActive;
+}
+
+void
+HtOperation::SetPhase (uint8_t pcoPhase)
+{
+  m_pcoPhase = pcoPhase;
+}
+
+void
+HtOperation::SetRxMcsBitmask (uint8_t index)
+{
+  m_rxMcsBitmask[index] = 1;
+}
+
+void
+HtOperation::SetRxHighestSupportedDataRate (uint16_t maxSupportedRate)
+{
+  m_rxHighestSupportedDataRate = maxSupportedRate;
+}
+
+void
+HtOperation::SetTxMcsSetDefined (uint8_t txMcsSetDefined)
+{
+  m_txMcsSetDefined = txMcsSetDefined;
+}
+
+void
+HtOperation::SetTxRxMcsSetUnequal (uint8_t txRxMcsSetUnequal)
+{
+  m_txRxMcsSetUnequal = txRxMcsSetUnequal;
+}
+
+void
+HtOperation::SetTxMaxNSpatialStreams (uint8_t maxTxSpatialStreams)
+{
+  m_txMaxNSpatialStreams = maxTxSpatialStreams - 1; //0 for 1 SS, 1 for 2 SSs, etc
+}
+
+void
+HtOperation::SetTxUnequalModulation (uint8_t txUnequalModulation)
+{
+  m_txUnequalModulation = txUnequalModulation;
+}
+
+uint8_t
+HtOperation::GetPrimaryChannel (void) const
+{
+  return m_primaryChannel;
+}
+
+uint8_t
+HtOperation::GetSecondaryChannelOffset (void) const
+{
+  return m_secondaryChannelOffset;
+}
+
+uint8_t
+HtOperation::GetStaChannelWidth (void) const
+{
+  return m_staChannelWidth;
+}
+
+uint8_t
+HtOperation::GetRifsMode (void) const
+{
+  return m_rifsMode;
+}
+
+uint8_t
+HtOperation::GetHtProtection (void) const
+{
+  return m_htProtection;
+}
+
+uint8_t
+HtOperation::GetNonGfHtStasPresent (void) const
+{
+  return m_nonGfHtStasPresent;
+}
+
+uint8_t
+HtOperation::GetObssNonHtStasPresent (void) const
+{
+  return m_obssNonHtStasPresent;
+}
+
+uint8_t
+HtOperation::GetDualBeacon (void) const
+{
+  return m_dualBeacon;
+}
+
+uint8_t
+HtOperation::GetDualCtsProtection (void) const
+{
+  return m_dualCtsProtection;
+}
+
+uint8_t
+HtOperation::GetStbcBeacon (void) const
+{
+  return m_stbcBeacon;
+}
+
+uint8_t
+HtOperation::GetLSigTxopProtectionFullSupport (void) const
+{
+  return m_lSigTxopProtectionFullSupport;
+}
+
+uint8_t
+HtOperation::GetPcoActive (void) const
+{
+  return m_pcoActive;
+}
+
+uint8_t
+HtOperation::GetPhase (void) const
+{
+  return m_pcoPhase;
+}
+
+bool
+HtOperation::IsSupportedMcs (uint8_t mcs) const
+{
+  if (m_rxMcsBitmask[mcs] == 1)
+    {
+      return true;
+    }
+  return false;
+}
+
+uint16_t
+HtOperation::GetRxHighestSupportedDataRate (void) const
+{
+  return m_rxHighestSupportedDataRate;
+}
+
+uint8_t
+HtOperation::GetTxMcsSetDefined (void) const
+{
+  return m_txMcsSetDefined;
+}
+
+uint8_t
+HtOperation::GetTxRxMcsSetUnequal (void) const
+{
+  return m_txRxMcsSetUnequal;
+}
+
+uint8_t
+HtOperation::GetTxMaxNSpatialStreams (void) const
+{
+  return m_txMaxNSpatialStreams;
+}
+
+uint8_t
+HtOperation::GetTxUnequalModulation (void) const
+{
+  return m_txUnequalModulation;
+}
+
+Buffer::Iterator
+HtOperation::Serialize (Buffer::Iterator i) const
+{
+  if (m_htSupported < 1)
+    {
+      return i;
+    }
+  return WifiInformationElement::Serialize (i);
+}
+
+uint16_t
+HtOperation::GetSerializedSize () const
+{
+  if (m_htSupported < 1)
+    {
+      return 0;
+    }
+  return WifiInformationElement::GetSerializedSize ();
+}
+
+uint8_t
+HtOperation::GetInformationSubset1 (void) const
+{
+  uint8_t val = 0;
+  val |= m_secondaryChannelOffset & 0x03;
+  val |= (m_staChannelWidth & 0x01) << 2;
+  val |= (m_rifsMode & 0x01) << 3;
+  val |= (m_reservedInformationSubset1 & 0x0f) << 4;
+  return val;
+}
+
+void
+HtOperation::SetInformationSubset1 (uint8_t ctrl)
+{
+  m_secondaryChannelOffset = ctrl & 0x03;
+  m_staChannelWidth = (ctrl >> 2) & 0x01;
+  m_rifsMode = (ctrl >> 3) & 0x01;
+  m_reservedInformationSubset1 = (ctrl >> 4) & 0x0f;
+}
+
+uint16_t
+HtOperation::GetInformationSubset2 (void) const
+{
+  uint16_t val = 0;
+  val |= m_htProtection & 0x03;
+  val |= (m_nonGfHtStasPresent & 0x01) << 2;
+  val |= (m_reservedInformationSubset2_1 & 0x01) << 3;
+  val |= (m_obssNonHtStasPresent & 0x01) << 4;
+  val |= (m_reservedInformationSubset2_2 & 0x07ff) << 5;
+  return val;
+}
+
+void
+HtOperation::SetInformationSubset2 (uint16_t ctrl)
+{
+  m_htProtection = ctrl & 0x03;
+  m_nonGfHtStasPresent = (ctrl >> 2) & 0x01;
+  m_reservedInformationSubset2_1 = (ctrl >> 3) & 0x01;
+  m_obssNonHtStasPresent = (ctrl >> 4) & 0x01;
+  m_reservedInformationSubset2_2 = static_cast<uint8_t> ((ctrl >> 5) & 0x07ff);
+}
+
+uint16_t
+HtOperation::GetInformationSubset3 (void) const
+{
+  uint16_t val = 0;
+  val |= m_reservedInformationSubset3_1 & 0x3f;
+  val |= (m_dualBeacon & 0x01) << 6;
+  val |= (m_dualCtsProtection & 0x01) << 7;
+  val |= (m_stbcBeacon & 0x01) << 8;
+  val |= (m_lSigTxopProtectionFullSupport & 0x01) << 9;
+  val |= (m_pcoActive & 0x01) << 10;
+  val |= (m_pcoPhase & 0x01) << 11;
+  val |= (m_reservedInformationSubset3_2 & 0x0f) << 12;
+  return val;
+}
+
+void
+HtOperation::SetInformationSubset3 (uint16_t ctrl)
+{
+  m_reservedInformationSubset3_1 = ctrl & 0x3f;
+  m_dualBeacon = (ctrl >> 6) & 0x01;
+  m_dualCtsProtection = (ctrl >> 7) & 0x01;
+  m_stbcBeacon = (ctrl >> 8) & 0x01;
+  m_lSigTxopProtectionFullSupport = (ctrl >> 9) & 0x01;
+  m_pcoActive = (ctrl >> 10) & 0x01;
+  m_pcoPhase = (ctrl >> 11) & 0x01;
+  m_reservedInformationSubset3_2 = (ctrl >> 12) & 0x0f;
+}
+
+void
+HtOperation::SetBasicMcsSet (uint64_t ctrl1, uint64_t ctrl2)
+{
+  for (uint64_t i = 0; i < 77; i++)
+    {
+      if (i < 64)
+        {
+          m_rxMcsBitmask[i] = (ctrl1 >> i) & 0x01;
+        }
+      else
+        {
+          m_rxMcsBitmask[i] = (ctrl2 >> (i - 64)) & 0x01;
+        }
+    }
+  m_reservedMcsSet1 = (ctrl2 >> 13) & 0x07;
+  m_rxHighestSupportedDataRate = (ctrl2 >> 16) & 0x03ff;
+  m_reservedMcsSet2 = (ctrl2 >> 26) & 0x3f;
+  m_txMcsSetDefined = (ctrl2 >> 32) & 0x01;
+  m_txRxMcsSetUnequal = (ctrl2 >> 33) & 0x01;
+  m_txMaxNSpatialStreams = (ctrl2 >> 34) & 0x03;
+  m_txUnequalModulation = (ctrl2 >> 36) & 0x01;
+  m_reservedMcsSet3 = (ctrl2 >> 37) & 0x07ffffff;
+}
+
+uint64_t
+HtOperation::GetBasicMcsSet1 (void) const
+{
+  uint64_t val = 0;
+  for (uint64_t i = 63; i > 0; i--)
+    {
+      val = (val << 1) | (m_rxMcsBitmask[i] & 0x01);
+    }
+  val = (val << 1) | (m_rxMcsBitmask[0] & 0x01);
+  return val;
+}
+
+uint64_t
+HtOperation::GetBasicMcsSet2 (void) const
+{
+  uint64_t val = 0;
+  val = val | (m_reservedMcsSet3 & 0x07ffffff);
+  val = (val << 1) | (m_txUnequalModulation & 0x01);
+  val = (val << 2) | (m_txMaxNSpatialStreams & 0x03);
+  val = (val << 1) | (m_txRxMcsSetUnequal & 0x01);
+  val = (val << 1) | (m_txMcsSetDefined & 0x01);
+  val = (val << 6) | (m_reservedMcsSet2 & 0x3f);
+  val = (val << 10) | (m_rxHighestSupportedDataRate & 0x3ff);
+  val = (val << 3) | (m_reservedMcsSet1 & 0x07);
+
+  for (uint64_t i = 13; i > 0; i--)
+    {
+      val = (val << 1) | ( m_rxMcsBitmask[i + 63] & 0x01);
+    }
+  return val;
+}
+
+void
+HtOperation::SerializeInformationField (Buffer::Iterator start) const
+{
+  if (m_htSupported == 1)
+    {
+      //write the corresponding value for each bit
+      start.WriteU8 (GetPrimaryChannel ());
+      start.WriteU8 (GetInformationSubset1 ());
+      start.WriteU16 (GetInformationSubset2 ());
+      start.WriteU16 (GetInformationSubset3 ());
+      start.WriteHtolsbU64 (GetBasicMcsSet1 ());
+      start.WriteHtolsbU64 (GetBasicMcsSet2 ());
+    }
+}
+
+uint8_t
+HtOperation::DeserializeInformationField (Buffer::Iterator start,
+                                          uint8_t length)
+{
+  Buffer::Iterator i = start;
+  uint8_t primarychannel = i.ReadU8 ();
+  uint8_t informationsubset1 = i.ReadU8 ();
+  uint16_t informationsubset2 = i.ReadU16 ();
+  uint16_t informationsubset3 = i.ReadU16 ();
+  uint64_t mcsset1 = i.ReadLsbtohU64 ();
+  uint64_t mcsset2 = i.ReadLsbtohU64 ();
+  SetPrimaryChannel (primarychannel);
+  SetInformationSubset1 (informationsubset1);
+  SetInformationSubset2 (informationsubset2);
+  SetInformationSubset3 (informationsubset3);
+  SetBasicMcsSet (mcsset1, mcsset2);
+  return length;
+}
+
+std::ostream &
+operator << (std::ostream &os, const HtOperation &htOperation)
+{
+  os << bool (htOperation.GetPrimaryChannel ())
+     << "|" << +htOperation.GetSecondaryChannelOffset ()
+     << "|" << bool (htOperation.GetStaChannelWidth ())
+     << "|" << bool (htOperation.GetRifsMode ())
+     << "|" << +htOperation.GetHtProtection ()
+     << "|" << bool (htOperation.GetNonGfHtStasPresent ())
+     << "|" << bool (htOperation.GetObssNonHtStasPresent ())
+     << "|" << bool (htOperation.GetDualBeacon ())
+     << "|" << bool (htOperation.GetDualCtsProtection ())
+     << "|" << bool (htOperation.GetStbcBeacon ())
+     << "|" << bool (htOperation.GetLSigTxopProtectionFullSupport ())
+     << "|" << bool (htOperation.GetPcoActive ())
+     << "|" << bool (htOperation.GetPhase ())
+     << "|" << htOperation.GetRxHighestSupportedDataRate ()
+     << "|" << bool (htOperation.GetTxMcsSetDefined ())
+     << "|" << bool (htOperation.GetTxRxMcsSetUnequal ())
+     << "|" << +htOperation.GetTxMaxNSpatialStreams ()
+     << "|" << bool (htOperation.GetTxUnequalModulation ()) << "|";
+  for (uint8_t i = 0; i < MAX_SUPPORTED_MCS; i++)
+    {
+      os << htOperation.IsSupportedMcs (i) << " ";
+    }
+  return os;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht/ht-operation.h ns-3.34/src/wifi/model/ht/ht-operation.h
--- ns-3.33/src/wifi/model/ht/ht-operation.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/ht/ht-operation.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,424 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016 Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef HT_OPERATION_H
+#define HT_OPERATION_H
+
+#include "ns3/wifi-information-element.h"
+
+/**
+ * This defines the maximum number of supported MCSs that a STA is
+ * allowed to have. Currently this number is set for IEEE 802.11n
+ */
+#define MAX_SUPPORTED_MCS  (77)
+
+namespace ns3 {
+
+/// HtProtectionType enumeration
+enum HtProtectionType
+{
+  NO_PROTECTION,
+  NON_MEMBER_PROTECTION,
+  TWENTY_MHZ_PROTECTION,
+  MIXED_MODE_PROTECTION
+};
+
+/**
+ * \brief The HT Operation Information Element
+ * \ingroup wifi
+ *
+ * This class knows how to serialise and deserialise
+ * the HT Operation Information Element
+ */
+class HtOperation : public WifiInformationElement
+{
+public:
+  HtOperation ();
+
+  // Implementations of pure virtual methods of WifiInformationElement
+  WifiInformationElementId ElementId () const override;
+  uint8_t GetInformationFieldSize () const override;
+  void SerializeInformationField (Buffer::Iterator start) const override;
+  uint8_t DeserializeInformationField (Buffer::Iterator start,
+                                       uint8_t length) override;
+  /* This information element is a bit special in that it is only
+     included if the STA is an HT STA. To support this we
+     override the Serialize and GetSerializedSize methods of
+     WifiInformationElement. */
+  Buffer::Iterator Serialize (Buffer::Iterator start) const override;
+  uint16_t GetSerializedSize () const override;
+
+  /**
+   * Set the HT Supported.
+   *
+   * \param htSupported the HT Supported flag
+   */
+  void SetHtSupported (uint8_t htSupported);
+
+  /**
+   * Set the Primary Channel field in the HT Operation information element.
+   *
+   * \param ctrl the Primary Channel field in the HT Operation information element
+   */
+  void SetPrimaryChannel (uint8_t ctrl);
+  /**
+   * Set the Information Subset 1 field in the HT Operation information element.
+   *
+   * \param ctrl the Information Subset 1 field in the HT Operation information element
+   */
+  void SetInformationSubset1 (uint8_t ctrl);
+  /**
+   * Set the Information Subset 2 field in the HT Operation information element.
+   *
+   * \param ctrl the Information Subset 2 field in the HT Operation information element
+   */
+  void SetInformationSubset2 (uint16_t ctrl);
+  /**
+   * Set the Information Subset 3 field in the HT Operation information element.
+   *
+   * \param ctrl the Information Subset 3 field in the HT Operation information element
+   */
+  void SetInformationSubset3 (uint16_t ctrl);
+  /**
+   * Set the Basic MCS Set field in the HT Operation information element.
+   *
+   * \param ctrl1 the first 64 bytes of the Basic MCS Set field in the HT Operation information element
+   * \param ctrl2 the last 64 bytes of the Basic MCS Set field in the HT Operation information element
+   */
+  void SetBasicMcsSet (uint64_t ctrl1, uint64_t ctrl2);
+
+  /**
+   * Set the secondary channel offset.
+   *
+   * \param secondaryChannelOffset the secondary channel offset
+   */
+  void SetSecondaryChannelOffset (uint8_t secondaryChannelOffset);
+  /**
+   * Set the STA channel width.
+   *
+   * \param staChannelWidth the STA channel width
+   */
+  void SetStaChannelWidth (uint8_t staChannelWidth);
+  /**
+   * Set the RIFS mode.
+   *
+   * \param rifsMode the RIFS mode
+   */
+  void SetRifsMode (uint8_t rifsMode);
+
+  /**
+   * Set the HT protection.
+   *
+   * \param htProtection the HT protection
+   */
+  void SetHtProtection (uint8_t htProtection);
+  /**
+   * Set the non GF HT STAs present.
+   *
+   * \param nonGfHtStasPresent the non GF HT STAs present
+   */
+  void SetNonGfHtStasPresent (uint8_t nonGfHtStasPresent);
+  /**
+   * Set the OBSS non HT STAs present.
+   *
+   * \param obssNonHtStasPresent the OBSS non HTA STAs present
+   */
+  void SetObssNonHtStasPresent (uint8_t obssNonHtStasPresent);
+
+  /**
+   * Set the dual beacon.
+   *
+   * \param dualBeacon the dual beacon
+   */
+  void SetDualBeacon (uint8_t dualBeacon);
+  /**
+   * Set the dual CTS protection.
+   *
+   * \param dualCtsProtection the dual CTS protection
+   */
+  void SetDualCtsProtection (uint8_t dualCtsProtection);
+  /**
+   * Set the STBC beacon.
+   *
+   * \param stbcBeacon the STBC beacon
+   */
+  void SetStbcBeacon (uint8_t stbcBeacon);
+  /**
+   * Set the LSIG TXOP protection full support.
+   *
+   * \param lSigTxopProtectionFullSupport the LSIG TXOP protection full support
+   */
+  void SetLSigTxopProtectionFullSupport (uint8_t lSigTxopProtectionFullSupport);
+  /**
+   * Set the PCO active.
+   *
+   * \param pcoActive the PCO active
+   */
+  void SetPcoActive (uint8_t pcoActive);
+  /**
+   * Set the PCO phase.
+   *
+   * \param pcoPhase the PCO phase
+   */
+  void SetPhase (uint8_t pcoPhase);
+
+  /**
+   * Set the receive MCS bitmask.
+   *
+   * \param index the MCS bitmask
+   */
+  void SetRxMcsBitmask (uint8_t index);
+  /**
+   * Set the receive highest supported data rate.
+   *
+   * \param maxSupportedRate the maximum supported data rate
+   */
+  void SetRxHighestSupportedDataRate (uint16_t maxSupportedRate);
+  /**
+   * Set the transmit MCS set defined.
+   *
+   * \param txMcsSetDefined the transmit MCS set defined
+   */
+  void SetTxMcsSetDefined (uint8_t txMcsSetDefined);
+  /**
+   * Set the transmit / receive MCS set unequal.
+   *
+   * \param txRxMcsSetUnequal the transmit / receive MCS set unequal
+   */
+  void SetTxRxMcsSetUnequal (uint8_t txRxMcsSetUnequal);
+  /**
+   * Set the transmit maximum number spatial streams.
+   *
+   * \param maxTxSpatialStreams the maximum transmit spatial streams
+   */
+  void SetTxMaxNSpatialStreams (uint8_t maxTxSpatialStreams);
+  /**
+   * Set the transmit unequal modulation.
+   *
+   * \param txUnequalModulation the transmit unequal modulation
+   */
+  void SetTxUnequalModulation (uint8_t txUnequalModulation);
+
+  /**
+   * Return the Primary Channel field in the HT Operation information element.
+   *
+   * \return the Primary Channel field in the HT Operation information element
+   */
+  uint8_t GetPrimaryChannel (void) const;
+  /**
+   * Return the Information Subset 1 field in the HT Operation information element.
+   *
+   * \return the Information Subset 1 field in the HT Operation information element
+   */
+  uint8_t GetInformationSubset1 (void) const;
+  /**
+   * Return the Information Subset 2 field in the HT Operation information element.
+   *
+   * \return the Information Subset 2 field in the HT Operation information element
+   */
+  uint16_t GetInformationSubset2 (void) const;
+  /**
+   * Return the Information Subset 3 field in the HT Operation information element.
+   *
+   * \return the Information Subset 3 field in the HT Operation information element
+   */
+  uint16_t GetInformationSubset3 (void) const;
+  /**
+   * Return the first 64 bytes of the Basic MCS Set field in the HT Operation information element.
+   *
+   * \return the first 64 bytes of the Basic MCS Set field in the HT Operation information element
+   */
+  uint64_t GetBasicMcsSet1 (void) const;
+  /**
+   * Return the last 64 bytes of the Basic MCS Set field in the HT Operation information element.
+   *
+   * \return the last 64 bytes of the Basic MCS Set field in the HT Operation information element
+   */
+  uint64_t GetBasicMcsSet2 (void) const;
+
+  /**
+   * Return the secondary channel offset.
+   *
+   * \return the secondary channel offset
+   */
+  uint8_t GetSecondaryChannelOffset (void) const;
+  /**
+   * Return the STA channel width.
+   *
+   * \return the STA channel width
+   */
+  uint8_t GetStaChannelWidth (void) const;
+  /**
+   * Return the RIFS mode.
+   *
+   * \return the RIFS mode
+   */
+  uint8_t GetRifsMode (void) const;
+
+  /**
+   * Return the HT protection.
+   *
+   * \return the HT protection
+   */
+  uint8_t GetHtProtection (void) const;
+  /**
+   * Return the non GF HT STAs present.
+   *
+   * \return the non GF HT STAs present
+   */
+  uint8_t GetNonGfHtStasPresent (void) const;
+  /**
+   * Return the OBSS non HT STAs present.
+   *
+   * \return the OBSS non HT STAs present
+   */
+  uint8_t GetObssNonHtStasPresent (void) const;
+
+  /**
+   * Return dual beacon.
+   *
+   * \return the dual beacon
+   */
+  uint8_t GetDualBeacon (void) const;
+  /**
+   * Return dual CTS protection.
+   *
+   * \return the dual CTS protection
+   */
+  uint8_t GetDualCtsProtection (void) const;
+  /**
+   * Return STBC beacon.
+   *
+   * \return the STBC beacon
+   */
+  uint8_t GetStbcBeacon (void) const;
+  /**
+   * Return LSIG TXOP protection full support.
+   *
+   * \return the LSIG TXOP protection full support
+   */
+  uint8_t GetLSigTxopProtectionFullSupport (void) const;
+  /**
+   * Return PCO active.
+   *
+   * \return the PCO active
+   */
+  uint8_t GetPcoActive (void) const;
+  /**
+   * Return phase.
+   *
+   * \return the phase
+   */
+  uint8_t GetPhase (void) const;
+
+  /**
+   * Return MCS is supported.
+   *
+   * \param mcs MCS
+   *\
+   * \return the MCS is supported
+   */
+  bool IsSupportedMcs (uint8_t mcs) const;
+  /**
+   * Return receive highest supported data rate.
+   *
+   * \return receive highest supported data rate
+   */
+  uint16_t GetRxHighestSupportedDataRate (void) const;
+  /**
+   * Return transmit MCS set defined.
+   *
+   * \return the transmit MCS set defined
+   */
+  uint8_t GetTxMcsSetDefined (void) const;
+  /**
+   * Return transmit / receive MCS set unequal.
+   *
+   * \return transmit / receive MCS set unequal
+   */
+  uint8_t GetTxRxMcsSetUnequal (void) const;
+  /**
+   * Return transmit maximum number spatial streams.
+   *
+   * \return transmit maximum number spatial streams
+   */
+  uint8_t GetTxMaxNSpatialStreams (void) const;
+  /**
+   * Return transmit unequal modulation.
+   *
+   * \return transmit unequal modulation
+   */
+  uint8_t GetTxUnequalModulation (void) const;
+
+
+private:
+  uint8_t m_primaryChannel; ///< primary channel
+
+  //HT Information Subset 1
+  uint8_t m_secondaryChannelOffset;     ///< secondary channel offset
+  uint8_t m_staChannelWidth;            ///< STA channel width
+  uint8_t m_rifsMode;                   ///< RIFS mode
+  uint8_t m_reservedInformationSubset1; ///< reserved information subset 1
+
+  //HT Information Subset 2
+  uint8_t m_htProtection;                 ///< HT protection
+  uint8_t m_nonGfHtStasPresent;           ///< non GF HT STAs present
+  uint8_t m_reservedInformationSubset2_1; ///< reserved information subset 2-1
+  uint8_t m_obssNonHtStasPresent;         ///< OBSS NON HT STAs present
+  uint8_t m_reservedInformationSubset2_2; ///< reserved information subset 2-2
+
+  //HT Information Subset 3
+  uint8_t m_reservedInformationSubset3_1;  ///< reserved information subset 3-1
+  uint8_t m_dualBeacon;                    ///< dual beacon
+  uint8_t m_dualCtsProtection;             ///< dual CTS protection
+  uint8_t m_stbcBeacon;                    ///< STBC beacon
+  uint8_t m_lSigTxopProtectionFullSupport; ///< L-SIG TXOP protection full support
+  uint8_t m_pcoActive;                     ///< PCO active
+  uint8_t m_pcoPhase;                      ///< PCO phase
+  uint8_t m_reservedInformationSubset3_2;  ///< reserved information subset 3-2
+
+  //Basic MCS Set field
+  uint8_t m_reservedMcsSet1;                 ///< reserved MCS set 1
+  uint16_t m_rxHighestSupportedDataRate;     ///< receive highest supported data rate
+  uint8_t m_reservedMcsSet2;                 ///< reserved MCS set2
+  uint8_t m_txMcsSetDefined;                 ///< transmit MCS set defined
+  uint8_t m_txRxMcsSetUnequal;               ///< transmit / receive MCS set unequal
+  uint8_t m_txMaxNSpatialStreams;            ///< transmit maximum number spatial streams
+  uint8_t m_txUnequalModulation;             ///< transmit unequal modulation
+  uint32_t m_reservedMcsSet3;                ///< reserved MCS set 3
+  uint8_t m_rxMcsBitmask[MAX_SUPPORTED_MCS]; ///< receive MCS bitmask
+
+  /// This is used to decide whether this element should be added to the frame or not
+  uint8_t m_htSupported;
+};
+
+/**
+ * output stream output operator
+ *
+ * \param os output stream
+ * \param htOperation the HT operation
+ *
+ * \returns output stream
+ */
+std::ostream &operator << (std::ostream &os, const HtOperation &htOperation);
+
+} //namespace ns3
+
+#endif /* HT_OPERATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht/ht-phy.cc ns-3.34/src/wifi/model/ht/ht-phy.cc
--- ns-3.33/src/wifi/model/ht/ht-phy.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/ht/ht-phy.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,794 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy)
+ */
+
+#include "ht-phy.h"
+#include "ht-ppdu.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/wifi-phy.h"
+#include "ns3/wifi-utils.h"
+#include "ns3/log.h"
+#include "ns3/assert.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("HtPhy");
+
+/*******************************************************
+ *       HT PHY (IEEE 802.11-2016, clause 19)
+ *******************************************************/
+
+/* *NS_CHECK_STYLE_OFF* */
+const PhyEntity::PpduFormats HtPhy::m_htPpduFormats {
+  { WIFI_PREAMBLE_HT_MF, { WIFI_PPDU_FIELD_PREAMBLE,      //L-STF + L-LTF
+                           WIFI_PPDU_FIELD_NON_HT_HEADER, //L-SIG
+                           WIFI_PPDU_FIELD_HT_SIG,        //HT-SIG
+                           WIFI_PPDU_FIELD_TRAINING,      //HT-STF + HT-LTFs
+                           WIFI_PPDU_FIELD_DATA } }
+};
+/* *NS_CHECK_STYLE_ON* */
+
+HtPhy::HtPhy (uint8_t maxNss /* = 1 */, bool buildModeList /* = true */)
+  : OfdmPhy (OFDM_PHY_DEFAULT, false) //don't add OFDM modes to list
+{
+  NS_LOG_FUNCTION (this << +maxNss << buildModeList);
+  m_maxSupportedNss = maxNss;
+  m_bssMembershipSelector = HT_PHY;
+  m_maxMcsIndexPerSs = 7;
+  m_maxSupportedMcsIndexPerSs = m_maxMcsIndexPerSs;
+  if (buildModeList)
+    {
+      NS_ABORT_MSG_IF (maxNss == 0 || maxNss > 4, "Unsupported max Nss " << +maxNss << " for HT PHY");
+      BuildModeList ();
+    }
+}
+
+HtPhy::~HtPhy ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+HtPhy::BuildModeList (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_modeList.empty ());
+  NS_ASSERT (m_bssMembershipSelector == HT_PHY);
+
+  uint8_t index = 0;
+  for (uint8_t nss = 1; nss <= m_maxSupportedNss; ++nss)
+    {
+      for (uint8_t i = 0; i <= m_maxSupportedMcsIndexPerSs; ++i)
+        {
+          NS_LOG_LOGIC ("Add HtMcs" << +index << " to list");
+          m_modeList.emplace_back (CreateHtMcs (index));
+          ++index;
+        }
+      index = 8 * nss;
+    }
+}
+
+WifiMode
+HtPhy::GetMcs (uint8_t index) const
+{
+  for (const auto & mcs : m_modeList)
+    {
+      if (mcs.GetMcsValue () == index)
+        {
+          return mcs;
+        }
+    }
+
+  // Should have returned if MCS found
+  NS_ABORT_MSG ("Unsupported MCS index " << +index << " for this PHY entity");
+  return WifiMode ();
+}
+
+bool
+HtPhy::IsMcsSupported (uint8_t index) const
+{
+  for (const auto & mcs : m_modeList)
+    {
+      if (mcs.GetMcsValue () == index)
+        {
+          return true;
+        }
+    }
+  return false;
+}
+
+bool
+HtPhy::HandlesMcsModes (void) const
+{
+  return true;
+}
+
+const PhyEntity::PpduFormats &
+HtPhy::GetPpduFormats (void) const
+{
+  return m_htPpduFormats;
+}
+
+WifiMode
+HtPhy::GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const
+{
+  switch (field)
+    {
+      case WIFI_PPDU_FIELD_PREAMBLE: //consider non-HT header mode for preamble (useful for InterferenceHelper)
+      case WIFI_PPDU_FIELD_NON_HT_HEADER:
+        return GetLSigMode ();
+      case WIFI_PPDU_FIELD_TRAINING: //consider HT-SIG mode for training (useful for InterferenceHelper)
+      case WIFI_PPDU_FIELD_HT_SIG:
+        return GetHtSigMode ();
+      default:
+        return PhyEntity::GetSigMode (field, txVector);
+    }
+}
+
+WifiMode
+HtPhy::GetLSigMode (void)
+{
+  return GetOfdmRate6Mbps ();
+}
+
+WifiMode
+HtPhy::GetHtSigMode (void) const
+{
+  return GetLSigMode (); //same number of data tones as OFDM (i.e. 48)
+}
+
+uint8_t
+HtPhy::GetBssMembershipSelector (void) const
+{
+  return m_bssMembershipSelector;
+}
+
+void
+HtPhy::SetMaxSupportedMcsIndexPerSs (uint8_t maxIndex)
+{
+  NS_LOG_FUNCTION (this << +maxIndex);
+  NS_ABORT_MSG_IF (maxIndex > m_maxMcsIndexPerSs, "Provided max MCS index " << +maxIndex << " per SS greater than max standard-defined value " << +m_maxMcsIndexPerSs);
+  if (maxIndex != m_maxSupportedMcsIndexPerSs)
+    {
+      NS_LOG_LOGIC ("Rebuild mode list since max MCS index per spatial stream has changed");
+      m_maxSupportedMcsIndexPerSs = maxIndex;
+      m_modeList.clear ();
+      BuildModeList ();
+    }
+}
+
+uint8_t
+HtPhy::GetMaxSupportedMcsIndexPerSs (void) const
+{
+  return m_maxSupportedMcsIndexPerSs;
+}
+
+void
+HtPhy::SetMaxSupportedNss (uint8_t maxNss)
+{
+  NS_LOG_FUNCTION (this << +maxNss);
+  NS_ASSERT (m_bssMembershipSelector == HT_PHY);
+  NS_ABORT_MSG_IF (maxNss == 0 || maxNss > 4, "Unsupported max Nss " << +maxNss << " for HT PHY");
+  if (maxNss != m_maxSupportedNss)
+    {
+      NS_LOG_LOGIC ("Rebuild mode list since max number of spatial streams has changed");
+      m_maxSupportedNss = maxNss;
+      m_modeList.clear ();
+      BuildModeList ();
+    }
+}
+
+Time
+HtPhy::GetDuration (WifiPpduField field, const WifiTxVector& txVector) const
+{
+  switch (field)
+    {
+      case WIFI_PPDU_FIELD_PREAMBLE:
+        return MicroSeconds (16); //L-STF + L-LTF or HT-GF-STF + HT-LTF1
+      case WIFI_PPDU_FIELD_NON_HT_HEADER:
+        return GetLSigDuration (txVector.GetPreambleType ());
+      case WIFI_PPDU_FIELD_TRAINING:
+        {
+          //We suppose here that STBC = 0.
+          //If STBC > 0, we need a different mapping between Nss and Nltf
+          // (see IEEE 802.11-2016 , section 19.3.9.4.6 "HT-LTF definition").
+          uint8_t nDataLtf = 8;
+          uint8_t nss = txVector.GetNssMax (); //so as to cover also HE MU case (see section 27.3.10.10 of IEEE P802.11ax/D4.0)
+          if (nss < 3)
+            {
+              nDataLtf = nss;
+            }
+          else if (nss < 5)
+            {
+              nDataLtf = 4;
+            }
+          else if (nss < 7)
+            {
+              nDataLtf = 6;
+            }
+
+          uint8_t nExtensionLtf = (txVector.GetNess () < 3) ? txVector.GetNess () : 4;
+
+          return GetTrainingDuration (txVector, nDataLtf, nExtensionLtf);
+        }
+      case WIFI_PPDU_FIELD_HT_SIG:
+        return GetHtSigDuration ();
+      default:
+        return PhyEntity::GetDuration (field, txVector);
+    }
+}
+
+Time
+HtPhy::GetLSigDuration (WifiPreamble preamble) const
+{
+  return MicroSeconds (4);
+}
+
+Time
+HtPhy::GetTrainingDuration (const WifiTxVector& txVector,
+                            uint8_t nDataLtf, uint8_t nExtensionLtf /* = 0 */) const
+{
+  NS_ABORT_MSG_IF (nDataLtf == 0 || nDataLtf > 4 || nExtensionLtf > 4 || (nDataLtf + nExtensionLtf) > 5,
+                   "Unsupported combination of data (" << +nDataLtf << ")  and extension (" << +nExtensionLtf << ")  LTFs numbers for HT"); //see IEEE 802.11-2016, section 19.3.9.4.6 "HT-LTF definition"
+  Time duration = MicroSeconds (4) * (nDataLtf + nExtensionLtf);
+  return MicroSeconds (4) * (1 /* HT-STF */ + nDataLtf + nExtensionLtf);
+}
+
+Time
+HtPhy::GetHtSigDuration (void) const
+{
+  return MicroSeconds (8); //HT-SIG
+}
+
+Time
+HtPhy::GetPayloadDuration (uint32_t size, const WifiTxVector& txVector, WifiPhyBand band, MpduType mpdutype,
+                           bool incFlag, uint32_t &totalAmpduSize, double &totalAmpduNumSymbols,
+                           uint16_t staId) const
+{
+  WifiMode payloadMode = txVector.GetMode (staId);
+  uint8_t stbc = txVector.IsStbc () ? 2 : 1; //corresponding to m_STBC in Nsym computation (see IEEE 802.11-2016, equations (19-32) and (21-62))
+  uint8_t nes = GetNumberBccEncoders (txVector);
+  //TODO: Update station managers to consider GI capabilities
+  Time symbolDuration = GetSymbolDuration (txVector);
+
+  double numDataBitsPerSymbol = payloadMode.GetDataRate (txVector, staId) * symbolDuration.GetNanoSeconds () / 1e9;
+  uint8_t service = GetNumberServiceBits ();
+
+  double numSymbols = 0;
+  switch (mpdutype)
+    {
+      case FIRST_MPDU_IN_AGGREGATE:
+        {
+          //First packet in an A-MPDU
+          numSymbols = (stbc * (service + size * 8.0 + 6 * nes) / (stbc * numDataBitsPerSymbol));
+          if (incFlag == 1)
+            {
+              totalAmpduSize += size;
+              totalAmpduNumSymbols += numSymbols;
+            }
+          break;
+        }
+      case MIDDLE_MPDU_IN_AGGREGATE:
+        {
+          //consecutive packets in an A-MPDU
+          numSymbols = (stbc * size * 8.0) / (stbc * numDataBitsPerSymbol);
+          if (incFlag == 1)
+            {
+              totalAmpduSize += size;
+              totalAmpduNumSymbols += numSymbols;
+            }
+          break;
+        }
+      case LAST_MPDU_IN_AGGREGATE:
+        {
+          //last packet in an A-MPDU
+          uint32_t totalSize = totalAmpduSize + size;
+          numSymbols = lrint (stbc * ceil ((service + totalSize * 8.0 + 6 * nes) / (stbc * numDataBitsPerSymbol)));
+          NS_ASSERT (totalAmpduNumSymbols <= numSymbols);
+          numSymbols -= totalAmpduNumSymbols;
+          if (incFlag == 1)
+            {
+              totalAmpduSize = 0;
+              totalAmpduNumSymbols = 0;
+            }
+          break;
+        }
+      case NORMAL_MPDU:
+      case SINGLE_MPDU:
+        {
+          //Not an A-MPDU or single MPDU (i.e. the current payload contains both service and padding)
+          //The number of OFDM symbols in the data field when BCC encoding
+          //is used is given in equation 19-32 of the IEEE 802.11-2016 standard.
+          numSymbols = lrint (stbc * ceil ((service + size * 8.0 + 6.0 * nes) / (stbc * numDataBitsPerSymbol)));
+          break;
+        }
+      default:
+        NS_FATAL_ERROR ("Unknown MPDU type");
+    }
+
+  Time payloadDuration = FemtoSeconds (static_cast<uint64_t> (numSymbols * symbolDuration.GetFemtoSeconds ()));
+  if (mpdutype == NORMAL_MPDU || mpdutype == SINGLE_MPDU || mpdutype == LAST_MPDU_IN_AGGREGATE)
+    {
+      payloadDuration += GetSignalExtension (band);
+    }
+  return payloadDuration;
+}
+
+uint8_t
+HtPhy::GetNumberBccEncoders (const WifiTxVector& txVector) const
+{
+  /**
+   * Add an encoder when crossing maxRatePerCoder frontier.
+   *
+   * The value of 320 Mbps and 350 Mbps for normal GI and short GI (resp.)
+   * were obtained by observing the rates for which Nes was incremented in tables
+   * 19-27 to 19-41 of IEEE 802.11-2016.
+   */
+  double maxRatePerCoder = (txVector.GetGuardInterval () == 800) ? 320e6 : 350e6;
+  return ceil (txVector.GetMode ().GetDataRate (txVector) / maxRatePerCoder);
+}
+
+Time
+HtPhy::GetSymbolDuration (const WifiTxVector& txVector) const
+{
+  uint16_t gi = txVector.GetGuardInterval ();
+  NS_ASSERT (gi == 400 || gi == 800);
+  return NanoSeconds (3200 + gi);
+}
+
+Ptr<WifiPpdu>
+HtPhy::BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration)
+{
+  NS_LOG_FUNCTION (this << psdus << txVector << ppduDuration);
+  return Create<HtPpdu> (psdus.begin ()->second, txVector, ppduDuration, m_wifiPhy->GetPhyBand (),
+                         ObtainNextUid (txVector));
+}
+
+PhyEntity::PhyFieldRxStatus
+HtPhy::DoEndReceiveField (WifiPpduField field, Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << field << *event);
+  switch (field)
+    {
+      case WIFI_PPDU_FIELD_HT_SIG:
+        return EndReceiveHtSig (event);
+      case WIFI_PPDU_FIELD_TRAINING:
+        return PhyFieldRxStatus (true); //always consider that training has been correctly received
+      case WIFI_PPDU_FIELD_NON_HT_HEADER:
+      //no break so as to go to OfdmPhy for processing
+      default:
+        return OfdmPhy::DoEndReceiveField (field, event);
+    }
+}
+
+PhyEntity::PhyFieldRxStatus
+HtPhy::EndReceiveHtSig (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  NS_ASSERT (IsHt (event->GetTxVector ().GetPreambleType ()));
+  SnrPer snrPer = GetPhyHeaderSnrPer (WIFI_PPDU_FIELD_HT_SIG, event);
+  NS_LOG_DEBUG ("HT-SIG: SNR(dB)=" << RatioToDb (snrPer.snr) << ", PER=" << snrPer.per);
+  PhyFieldRxStatus status (GetRandomValue () > snrPer.per);
+  if (status.isSuccess)
+    {
+      NS_LOG_DEBUG ("Received HT-SIG");
+      if (!IsAllConfigSupported (WIFI_PPDU_FIELD_HT_SIG, event->GetPpdu ()))
+        {
+          status = PhyFieldRxStatus (false, UNSUPPORTED_SETTINGS, DROP);
+        }
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Drop packet because HT-SIG reception failed");
+      status.reason = HT_SIG_FAILURE;
+      status.actionIfFailure = DROP;
+    }
+  return status;
+}
+
+bool
+HtPhy::IsAllConfigSupported (WifiPpduField field, Ptr<const WifiPpdu> ppdu) const
+{
+  if (field == WIFI_PPDU_FIELD_NON_HT_HEADER)
+    {
+      return true; //wait till reception of HT-SIG (or SIG-A) to make decision
+    }
+  return OfdmPhy::IsAllConfigSupported (field, ppdu);
+}
+
+bool
+HtPhy::IsConfigSupported (Ptr<const WifiPpdu> ppdu) const
+{
+  const WifiTxVector& txVector = ppdu->GetTxVector ();
+  if (txVector.GetNss () > m_wifiPhy->GetMaxSupportedRxSpatialStreams ())
+    {
+      NS_LOG_DEBUG ("Packet reception could not be started because not enough RX antennas");
+      return false;
+    }
+  if (!IsModeSupported (txVector.GetMode ()))
+    {
+      NS_LOG_DEBUG ("Drop packet because it was sent using an unsupported mode (" << txVector.GetMode () << ")");
+      return false;
+    }
+  return true;
+}
+
+Ptr<SpectrumValue>
+HtPhy::GetTxPowerSpectralDensity (double txPowerW, Ptr<const WifiPpdu> ppdu) const
+{
+  const WifiTxVector& txVector = ppdu->GetTxVector ();
+  uint16_t centerFrequency = GetCenterFrequencyForChannelWidth (txVector);
+  uint16_t channelWidth = txVector.GetChannelWidth ();
+  NS_LOG_FUNCTION (this << centerFrequency << channelWidth << txPowerW);
+  const auto & txMaskRejectionParams = GetTxMaskRejectionParams ();
+  Ptr<SpectrumValue> v = WifiSpectrumValueHelper::CreateHtOfdmTxPowerSpectralDensity (centerFrequency, channelWidth, txPowerW, GetGuardBandwidth (channelWidth),
+                                                                                      std::get<0> (txMaskRejectionParams), std::get<1> (txMaskRejectionParams), std::get<2> (txMaskRejectionParams));
+  return v;
+}
+
+void
+HtPhy::InitializeModes (void)
+{
+  for (uint8_t i = 0; i < 32; ++i)
+    {
+      GetHtMcs (i);
+    }
+}
+
+WifiMode
+HtPhy::GetHtMcs (uint8_t index)
+{
+#define CASE(x) \
+case x: \
+  return GetHtMcs ## x (); \
+
+  switch (index)
+    {
+      CASE ( 0)
+      CASE ( 1)
+      CASE ( 2)
+      CASE ( 3)
+      CASE ( 4)
+      CASE ( 5)
+      CASE ( 6)
+      CASE ( 7)
+      CASE ( 8)
+      CASE ( 9)
+      CASE (10)
+      CASE (11)
+      CASE (12)
+      CASE (13)
+      CASE (14)
+      CASE (15)
+      CASE (16)
+      CASE (17)
+      CASE (18)
+      CASE (19)
+      CASE (20)
+      CASE (21)
+      CASE (22)
+      CASE (23)
+      CASE (24)
+      CASE (25)
+      CASE (26)
+      CASE (27)
+      CASE (28)
+      CASE (29)
+      CASE (30)
+      CASE (31)
+      default:
+        NS_ABORT_MSG ("Inexistent (or not supported) index (" << +index << ") requested for HT");
+        return WifiMode ();
+    }
+#undef CASE
+}
+
+#define GET_HT_MCS(x) \
+WifiMode \
+HtPhy::GetHtMcs ## x (void) \
+{ \
+  static WifiMode mcs = CreateHtMcs (x); \
+  return mcs; \
+}; \
+
+GET_HT_MCS (0)
+GET_HT_MCS (1)
+GET_HT_MCS (2)
+GET_HT_MCS (3)
+GET_HT_MCS (4)
+GET_HT_MCS (5)
+GET_HT_MCS (6)
+GET_HT_MCS (7)
+GET_HT_MCS (8)
+GET_HT_MCS (9)
+GET_HT_MCS (10)
+GET_HT_MCS (11)
+GET_HT_MCS (12)
+GET_HT_MCS (13)
+GET_HT_MCS (14)
+GET_HT_MCS (15)
+GET_HT_MCS (16)
+GET_HT_MCS (17)
+GET_HT_MCS (18)
+GET_HT_MCS (19)
+GET_HT_MCS (20)
+GET_HT_MCS (21)
+GET_HT_MCS (22)
+GET_HT_MCS (23)
+GET_HT_MCS (24)
+GET_HT_MCS (25)
+GET_HT_MCS (26)
+GET_HT_MCS (27)
+GET_HT_MCS (28)
+GET_HT_MCS (29)
+GET_HT_MCS (30)
+GET_HT_MCS (31)
+#undef GET_HT_MCS
+
+WifiMode
+HtPhy::CreateHtMcs (uint8_t index)
+{
+  NS_ASSERT_MSG (index <= 31, "HtMcs index must be <= 31!");
+  return WifiModeFactory::CreateWifiMcs ("HtMcs" + std::to_string (index),
+                                         index,
+                                         WIFI_MOD_CLASS_HT,
+                                         MakeBoundCallback (&GetHtCodeRate, index),
+                                         MakeBoundCallback (&GetHtConstellationSize, index),
+                                         MakeBoundCallback (&GetPhyRate, index),
+                                         MakeCallback (&GetPhyRateFromTxVector),
+                                         MakeBoundCallback (&GetDataRate, index),
+                                         MakeCallback (&GetDataRateFromTxVector),
+                                         MakeBoundCallback (&GetNonHtReferenceRate, index),
+                                         MakeCallback (&IsModeAllowed));
+}
+
+WifiCodeRate
+HtPhy::GetHtCodeRate (uint8_t mcsValue)
+{
+  return GetCodeRate (mcsValue % 8);
+}
+
+WifiCodeRate
+HtPhy::GetCodeRate (uint8_t mcsValue)
+{
+  switch (mcsValue)
+    {
+      case 0:
+      case 1:
+      case 3:
+        return WIFI_CODE_RATE_1_2;
+      case 2:
+      case 4:
+      case 6:
+        return WIFI_CODE_RATE_3_4;
+      case 5:
+        return WIFI_CODE_RATE_2_3;
+      case 7:
+        return WIFI_CODE_RATE_5_6;
+      default:
+        return WIFI_CODE_RATE_UNDEFINED;
+    }
+}
+
+uint16_t
+HtPhy::GetHtConstellationSize (uint8_t mcsValue)
+{
+  return GetConstellationSize (mcsValue % 8);
+}
+
+uint16_t
+HtPhy::GetConstellationSize (uint8_t mcsValue)
+{
+  switch (mcsValue)
+    {
+      case 0:
+        return 2;
+      case 1:
+      case 2:
+        return 4;
+      case 3:
+      case 4:
+        return 16;
+      case 5:
+      case 6:
+      case 7:
+        return 64;
+      default:
+        return 0;
+    }
+}
+
+uint64_t
+HtPhy::GetPhyRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+{
+  WifiCodeRate codeRate = GetHtCodeRate (mcsValue);
+  uint64_t dataRate = GetDataRate (mcsValue, channelWidth, guardInterval, nss);
+  return CalculatePhyRate (codeRate, dataRate);
+}
+
+uint64_t
+HtPhy::CalculatePhyRate (WifiCodeRate codeRate, uint64_t dataRate)
+{
+  return (dataRate / GetCodeRatio (codeRate));
+}
+
+uint64_t
+HtPhy::GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
+{
+  return GetPhyRate (txVector.GetMode ().GetMcsValue (),
+                     txVector.GetChannelWidth (),
+                     txVector.GetGuardInterval (),
+                     txVector.GetNss ());
+}
+
+double
+HtPhy::GetCodeRatio (WifiCodeRate codeRate)
+{
+  switch (codeRate)
+    {
+      case WIFI_CODE_RATE_5_6:
+        return (5.0 / 6.0);
+      default:
+        return OfdmPhy::GetCodeRatio (codeRate);
+    }
+}
+
+uint64_t
+HtPhy::GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
+{
+  return GetDataRate (txVector.GetMode ().GetMcsValue (),
+                      txVector.GetChannelWidth (),
+                      txVector.GetGuardInterval (),
+                      txVector.GetNss ());
+}
+
+uint64_t
+HtPhy::GetDataRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+{
+  NS_ASSERT (guardInterval == 800 || guardInterval == 400);
+  NS_ASSERT (nss <= 4);
+  return CalculateDataRate (3.2, guardInterval,
+                            GetUsableSubcarriers (channelWidth),
+                            static_cast<uint16_t> (log2 (GetHtConstellationSize (mcsValue))),
+                            GetCodeRatio (GetHtCodeRate (mcsValue)), nss);
+}
+
+uint64_t
+HtPhy::CalculateDataRate (double symbolDuration, uint16_t guardInterval,
+                          uint16_t usableSubCarriers, uint16_t numberOfBitsPerSubcarrier,
+                          double codingRate, uint8_t nss)
+{
+  return nss * OfdmPhy::CalculateDataRate (symbolDuration, guardInterval,
+                                           usableSubCarriers, numberOfBitsPerSubcarrier,
+                                           codingRate);
+}
+
+uint16_t
+HtPhy::GetUsableSubcarriers (uint16_t channelWidth)
+{
+  return (channelWidth == 40) ? 108 : 52;
+}
+
+uint64_t
+HtPhy::GetNonHtReferenceRate (uint8_t mcsValue)
+{
+  WifiCodeRate codeRate = GetHtCodeRate (mcsValue);
+  uint16_t constellationSize = GetHtConstellationSize (mcsValue);
+  return CalculateNonHtReferenceRate (codeRate, constellationSize);
+}
+
+uint64_t
+HtPhy::CalculateNonHtReferenceRate (WifiCodeRate codeRate, uint16_t constellationSize)
+{
+  uint64_t dataRate;
+  switch (constellationSize)
+    {
+      case 2:
+        if (codeRate == WIFI_CODE_RATE_1_2)
+          {
+            dataRate = 6000000;
+          }
+        else if (codeRate == WIFI_CODE_RATE_3_4)
+          {
+            dataRate = 9000000;
+          }
+        else
+          {
+            NS_FATAL_ERROR ("Trying to get reference rate for a MCS with wrong combination of coding rate and modulation");
+          }
+        break;
+      case 4:
+        if (codeRate == WIFI_CODE_RATE_1_2)
+          {
+            dataRate = 12000000;
+          }
+        else if (codeRate == WIFI_CODE_RATE_3_4)
+          {
+            dataRate = 18000000;
+          }
+        else
+          {
+            NS_FATAL_ERROR ("Trying to get reference rate for a MCS with wrong combination of coding rate and modulation");
+          }
+        break;
+      case 16:
+        if (codeRate == WIFI_CODE_RATE_1_2)
+          {
+            dataRate = 24000000;
+          }
+        else if (codeRate == WIFI_CODE_RATE_3_4)
+          {
+            dataRate = 36000000;
+          }
+        else
+          {
+            NS_FATAL_ERROR ("Trying to get reference rate for a MCS with wrong combination of coding rate and modulation");
+          }
+        break;
+      case 64:
+        if (codeRate == WIFI_CODE_RATE_1_2 || codeRate == WIFI_CODE_RATE_2_3)
+          {
+            dataRate = 48000000;
+          }
+        else if (codeRate == WIFI_CODE_RATE_3_4 || codeRate == WIFI_CODE_RATE_5_6)
+          {
+            dataRate = 54000000;
+          }
+        else
+          {
+            NS_FATAL_ERROR ("Trying to get reference rate for a MCS with wrong combination of coding rate and modulation");
+          }
+        break;
+      default:
+        NS_FATAL_ERROR ("Wrong constellation size");
+    }
+  return dataRate;
+}
+
+bool
+HtPhy::IsModeAllowed (uint16_t /* channelWidth */, uint8_t /* nss */)
+{
+  return true;
+}
+
+uint32_t
+HtPhy::GetMaxPsduSize (void) const
+{
+  return 65535;
+}
+
+} //namespace ns3
+
+namespace {
+
+/**
+ * Constructor class for HT modes
+ */
+static class ConstructorHt
+{
+public:
+  ConstructorHt ()
+  {
+    ns3::HtPhy::InitializeModes ();
+    ns3::WifiPhy::AddStaticPhyEntity (ns3::WIFI_MOD_CLASS_HT, ns3::Create<ns3::HtPhy> ()); //dummy Nss
+  }
+} g_constructor_ht; ///< the constructor for HT modes
+
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht/ht-phy.h ns-3.34/src/wifi/model/ht/ht-phy.h
--- ns-3.33/src/wifi/model/ht/ht-phy.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/ht/ht-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,558 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy)
+ */
+
+#ifndef HT_PHY_H
+#define HT_PHY_H
+
+#include "ns3/ofdm-phy.h"
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of ns3::HtPhy class.
+ */
+
+namespace ns3 {
+
+/**
+ * This defines the BSS membership value for HT PHY.
+ */
+#define HT_PHY 127
+
+/**
+ * \brief PHY entity for HT (11n)
+ * \ingroup wifi
+ *
+ * HT PHY is based on OFDM PHY.
+ * Only HT-Mixed is supported (support for HT-Greenfield has been removed).
+ * Only HT MCSs up to 31 are supported.
+ *
+ * Refer to IEEE 802.11-2016, clause 19.
+ */
+class HtPhy : public OfdmPhy
+{
+public:
+  /**
+   * Constructor for HT PHY
+   *
+   * \param maxNss the maximum number of spatial streams
+   * \param buildModeList flag used to add HT modes to list (disabled
+   *                      by child classes to only add child classes' modes)
+   */
+  HtPhy (uint8_t maxNss = 1, bool buildModeList = true);
+  /**
+   * Destructor for HT PHY
+   */
+  virtual ~HtPhy ();
+
+  WifiMode GetMcs (uint8_t index) const override;
+  bool IsMcsSupported (uint8_t index) const override;
+  bool HandlesMcsModes (void) const override;
+  WifiMode GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const override;
+  const PpduFormats & GetPpduFormats (void) const override;
+  Time GetDuration (WifiPpduField field, const WifiTxVector& txVector) const override;
+  Time GetPayloadDuration (uint32_t size, const WifiTxVector& txVector, WifiPhyBand band, MpduType mpdutype,
+                           bool incFlag, uint32_t &totalAmpduSize, double &totalAmpduNumSymbols,
+                           uint16_t staId) const override;
+  Ptr<WifiPpdu> BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration) override;
+
+  /**
+   * \return the WifiMode used for the L-SIG (non-HT header) field
+   */
+  static WifiMode GetLSigMode (void);
+  /**
+   * \return the WifiMode used for the HT-SIG field
+   */
+  virtual WifiMode GetHtSigMode (void) const;
+
+  /**
+   * \return the BSS membership selector for this PHY entity
+   */
+  uint8_t GetBssMembershipSelector (void) const;
+
+  /**
+   * Set the maximum supported MCS index __per spatial stream__.
+   * For HT, this results in non-continuous indices for supported MCSs.
+   *
+   * \return the maximum MCS index per spatial stream supported by this entity
+   */
+  uint8_t GetMaxSupportedMcsIndexPerSs (void) const;
+  /**
+   * Set the maximum supported MCS index __per spatial stream__.
+   * For HT, this results in non-continuous indices for supported MCSs.
+   *
+   * \param maxIndex the maximum MCS index per spatial stream supported by this entity
+   *
+   * The provided value should not be greater than maximum standard-defined value.
+   */
+  void SetMaxSupportedMcsIndexPerSs (uint8_t maxIndex);
+  /**
+   * Configure the maximum number of spatial streams supported
+   * by this HT PHY.
+   *
+   * \param maxNss the maximum number of spatial streams
+   */
+  void SetMaxSupportedNss (uint8_t maxNss);
+
+  /**
+   * \param preamble the type of preamble
+   * \return the duration of the L-SIG (non-HT header) field
+   *
+   * \see WIFI_PPDU_FIELD_NON_HT_HEADER
+   */
+  virtual Time GetLSigDuration (WifiPreamble preamble) const;
+  /**
+   * \param txVector the transmission parameters
+   * \param nDataLtf the number of data LTF fields (excluding those in preamble)
+   * \param nExtensionLtf the number of extension LTF fields
+   * \return the duration of the training field
+   *
+   * \see WIFI_PPDU_FIELD_TRAINING
+   */
+  virtual Time GetTrainingDuration (const WifiTxVector& txVector,
+                                    uint8_t nDataLtf, uint8_t nExtensionLtf = 0) const;
+  /**
+   * \return the duration of the HT-SIG field
+   */
+  virtual Time GetHtSigDuration (void) const;
+
+  /**
+   * Initialize all HT modes.
+   */
+  static void InitializeModes (void);
+  /**
+   * Return the HT MCS corresponding to
+   * the provided index.
+   *
+   * \param index the index of the MCS
+   * \return an HT MCS
+   */
+  static WifiMode GetHtMcs (uint8_t index);
+
+  /**
+   * Return MCS 0 from HT MCS values.
+   *
+   * \return MCS 0 from HT MCS values
+   */
+  static WifiMode GetHtMcs0 (void);
+  /**
+   * Return MCS 1 from HT MCS values.
+   *
+   * \return MCS 1 from HT MCS values
+   */
+  static WifiMode GetHtMcs1 (void);
+  /**
+   * Return MCS 2 from HT MCS values.
+   *
+   * \return MCS 2 from HT MCS values
+   */
+  static WifiMode GetHtMcs2 (void);
+  /**
+   * Return MCS 3 from HT MCS values.
+   *
+   * \return MCS 3 from HT MCS values
+   */
+  static WifiMode GetHtMcs3 (void);
+  /**
+   * Return MCS 4 from HT MCS values.
+   *
+   * \return MCS 4 from HT MCS values
+   */
+  static WifiMode GetHtMcs4 (void);
+  /**
+   * Return MCS 5 from HT MCS values.
+   *
+   * \return MCS 5 from HT MCS values
+   */
+  static WifiMode GetHtMcs5 (void);
+  /**
+   * Return MCS 6 from HT MCS values.
+   *
+   * \return MCS 6 from HT MCS values
+   */
+  static WifiMode GetHtMcs6 (void);
+  /**
+   * Return MCS 7 from HT MCS values.
+   *
+   * \return MCS 7 from HT MCS values
+   */
+  static WifiMode GetHtMcs7 (void);
+  /**
+   * Return MCS 8 from HT MCS values.
+   *
+   * \return MCS 8 from HT MCS values
+   */
+  static WifiMode GetHtMcs8 (void);
+  /**
+   * Return MCS 9 from HT MCS values.
+   *
+   * \return MCS 9 from HT MCS values
+   */
+  static WifiMode GetHtMcs9 (void);
+  /**
+   * Return MCS 10 from HT MCS values.
+   *
+   * \return MCS 10 from HT MCS values
+   */
+  static WifiMode GetHtMcs10 (void);
+  /**
+   * Return MCS 11 from HT MCS values.
+   *
+   * \return MCS 11 from HT MCS values
+   */
+  static WifiMode GetHtMcs11 (void);
+  /**
+   * Return MCS 12 from HT MCS values.
+   *
+   * \return MCS 12 from HT MCS values
+   */
+  static WifiMode GetHtMcs12 (void);
+  /**
+   * Return MCS 13 from HT MCS values.
+   *
+   * \return MCS 13 from HT MCS values
+   */
+  static WifiMode GetHtMcs13 (void);
+  /**
+   * Return MCS 14 from HT MCS values.
+   *
+   * \return MCS 14 from HT MCS values
+   */
+  static WifiMode GetHtMcs14 (void);
+  /**
+   * Return MCS 15 from HT MCS values.
+   *
+   * \return MCS 15 from HT MCS values
+   */
+  static WifiMode GetHtMcs15 (void);
+  /**
+   * Return MCS 16 from HT MCS values.
+   *
+   * \return MCS 16 from HT MCS values
+   */
+  static WifiMode GetHtMcs16 (void);
+  /**
+   * Return MCS 17 from HT MCS values.
+   *
+   * \return MCS 17 from HT MCS values
+   */
+  static WifiMode GetHtMcs17 (void);
+  /**
+   * Return MCS 18 from HT MCS values.
+   *
+   * \return MCS 18 from HT MCS values
+   */
+  static WifiMode GetHtMcs18 (void);
+  /**
+   * Return MCS 19 from HT MCS values.
+   *
+   * \return MCS 19 from HT MCS values
+   */
+  static WifiMode GetHtMcs19 (void);
+  /**
+   * Return MCS 20 from HT MCS values.
+   *
+   * \return MCS 20 from HT MCS values
+   */
+  static WifiMode GetHtMcs20 (void);
+  /**
+   * Return MCS 21 from HT MCS values.
+   *
+   * \return MCS 21 from HT MCS values
+   */
+  static WifiMode GetHtMcs21 (void);
+  /**
+   * Return MCS 22 from HT MCS values.
+   *
+   * \return MCS 22 from HT MCS values
+   */
+  static WifiMode GetHtMcs22 (void);
+  /**
+   * Return MCS 23 from HT MCS values.
+   *
+   * \return MCS 23 from HT MCS values
+   */
+  static WifiMode GetHtMcs23 (void);
+  /**
+   * Return MCS 24 from HT MCS values.
+   *
+   * \return MCS 24 from HT MCS values
+   */
+  static WifiMode GetHtMcs24 (void);
+  /**
+   * Return MCS 25 from HT MCS values.
+   *
+   * \return MCS 25 from HT MCS values
+   */
+  static WifiMode GetHtMcs25 (void);
+  /**
+   * Return MCS 26 from HT MCS values.
+   *
+   * \return MCS 26 from HT MCS values
+   */
+  static WifiMode GetHtMcs26 (void);
+  /**
+   * Return MCS 27 from HT MCS values.
+   *
+   * \return MCS 27 from HT MCS values
+   */
+  static WifiMode GetHtMcs27 (void);
+  /**
+   * Return MCS 28 from HT MCS values.
+   *
+   * \return MCS 28 from HT MCS values
+   */
+  static WifiMode GetHtMcs28 (void);
+  /**
+   * Return MCS 29 from HT MCS values.
+   *
+   * \return MCS 29 from HT MCS values
+   */
+  static WifiMode GetHtMcs29 (void);
+  /**
+   * Return MCS 30 from HT MCS values.
+   *
+   * \return MCS 30 from HT MCS values
+   */
+  static WifiMode GetHtMcs30 (void);
+  /**
+   * Return MCS 31 from HT MCS values.
+   *
+   * \return MCS 31 from HT MCS values
+   */
+  static WifiMode GetHtMcs31 (void);
+
+  /**
+   * Return the coding rate corresponding to
+   * the supplied HT MCS index. This function calls
+   * GetCodeRate and is used as a callback for
+   * WifiMode operation.
+   *
+   * \param mcsValue the MCS index
+   * \return the coding rate.
+   */
+  static WifiCodeRate GetHtCodeRate (uint8_t mcsValue);
+  /**
+   * Return the coding rate corresponding to
+   * the supplied HT MCS index between 0 and 7,
+   * since HT MCS index > 8 is used for higher NSS.
+   * This function is reused by child classes.
+   *
+   * \param mcsValue the MCS index
+   * \return the coding rate.
+   */
+  static WifiCodeRate GetCodeRate (uint8_t mcsValue);
+  /**
+   * Return the constellation size corresponding
+   * to the supplied HT MCS index.
+   *
+   * \param mcsValue the MCS index
+   * \return the size of modulation constellation.
+   */
+  static uint16_t GetHtConstellationSize (uint8_t mcsValue);
+  /**
+   * Return the constellation size corresponding
+   * to the supplied HT MCS index between 0 and 7,
+   * since HT MCS index > 8 is used for higher NSS.
+   * This function is reused by child classes.
+   *
+   * \param mcsValue the MCS index
+   * \return the size of modulation constellation.
+   */
+  static uint16_t GetConstellationSize (uint8_t mcsValue);
+  /**
+   * Return the PHY rate corresponding to the supplied HT MCS
+   * index, channel width, guard interval, and number of
+   * spatial stream. This function calls CalculatePhyRate
+   * and is mainly used as a callback for WifiMode operation.
+   *
+   * \param mcsValue the HT MCS index
+   * \param channelWidth the considered channel width in MHz
+   * \param guardInterval the considered guard interval duration in nanoseconds
+   * \param nss the considered number of stream
+   *
+   * \return the physical bit rate of this signal in bps.
+   */
+  static uint64_t GetPhyRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  /**
+   * Return the PHY rate corresponding to
+   * the supplied TXVECTOR.
+   * This function is mainly used as a callback
+   * for WifiMode operation.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the station ID (only here to have a common signature for all callbacks)
+   * \return the physical bit rate of this signal in bps.
+   */
+  static uint64_t GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t staId);
+  /**
+   * Return the data rate corresponding to
+   * the supplied TXVECTOR.
+   * This function is mainly used as a callback
+   * for WifiMode operation.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the station ID (only here to have a common signature for all callbacks)
+   * \return the data bit rate in bps.
+   */
+  static uint64_t GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t staId);
+  /**
+   * Return the data rate corresponding to the supplied HT
+   * MCS index, channel width, guard interval, and number
+   * of spatial streams. This function is mainly used as a
+   * callback for WifiMode operation.
+   *
+   * \param mcsValue the HT MCS index
+   * \param channelWidth the channel width in MHz
+   * \param guardInterval the guard interval duration in nanoseconds
+   * \param nss the number of spatial streams
+   * \return the data bit rate in bps.
+   */
+  static uint64_t GetDataRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  /**
+   * Calculate the rate in bps of the non-HT Reference Rate corresponding
+   * to the supplied HT MCS index. This function calls CalculateNonHtReferenceRate
+   * and is used as a callback for WifiMode operation.
+   *
+   * \param mcsValue the HT MCS index
+   * \return the rate in bps of the non-HT Reference Rate.
+   */
+  static uint64_t GetNonHtReferenceRate (uint8_t mcsValue);
+  /**
+   * Check whether the combination of <MCS, channel width, NSS> is allowed.
+   * This function is used as a callback for WifiMode operation, and always
+   * returns true since there is no limitation for any MCS in HtPhy.
+   *
+   * \param channelWidth the considered channel width in MHz
+   * \param nss the considered number of streams
+   * \returns true.
+   */
+  static bool IsModeAllowed (uint16_t channelWidth, uint8_t nss);
+
+protected:
+  PhyFieldRxStatus DoEndReceiveField (WifiPpduField field, Ptr<Event> event) override;
+  bool IsAllConfigSupported (WifiPpduField field, Ptr<const WifiPpdu> ppdu) const override;
+  bool IsConfigSupported (Ptr<const WifiPpdu> ppdu) const override;
+  Ptr<SpectrumValue> GetTxPowerSpectralDensity (double txPowerW, Ptr<const WifiPpdu> ppdu) const override;
+  uint32_t GetMaxPsduSize (void) const override;
+
+  /**
+   * Build mode list.
+   * Should be redone whenever the maximum MCS index per spatial stream
+   * ,or any other important parameter having an impact on the MCS index
+   * (e.g. number of spatial streams for HT), changes.
+   */
+  virtual void BuildModeList (void);
+
+  /**
+   * \param txVector the transmission parameters
+   * \return the number of BCC encoders used for data encoding
+   */
+  virtual uint8_t GetNumberBccEncoders (const WifiTxVector& txVector) const;
+  /**
+   * \param txVector the transmission parameters
+   * \return the symbol duration (including GI)
+   */
+  virtual Time GetSymbolDuration (const WifiTxVector& txVector) const;
+
+  /**
+   * Return the PHY rate corresponding to
+   * the supplied code rate and data rate.
+   *
+   * \param codeRate the code rate
+   * \param dataRate the data rate in bps
+   * \return the data bit rate in bps.
+   */
+  static uint64_t CalculatePhyRate (WifiCodeRate codeRate, uint64_t dataRate);
+  /**
+   * Return the rate (in bps) of the non-HT Reference Rate
+   * which corresponds to the supplied code rate and
+   * constellation size.
+   *
+   * \param codeRate the convolutional coding rate
+   * \param constellationSize the size of modulation constellation
+   * \returns the rate in bps.
+   *
+   * To convert an HT MCS to its corresponding non-HT Reference Rate
+   * use the modulation and coding rate of the HT MCS
+   * and lookup in Table 10-7 of IEEE 802.11-2016s.
+   */
+  static uint64_t CalculateNonHtReferenceRate (WifiCodeRate codeRate, uint16_t constellationSize);
+  /**
+   * Convert WifiCodeRate to a ratio, e.g., code ratio of WIFI_CODE_RATE_1_2 is 0.5.
+   *
+   * \param codeRate the code rate
+   * \return the code rate in ratio.
+   */
+  static double GetCodeRatio (WifiCodeRate codeRate);
+  /**
+   * Calculates data rate from the supplied parameters.
+   *
+   * \param symbolDuration the symbol duration (in us) excluding guard interval
+   * \param guardInterval the considered guard interval duration in nanoseconds
+   * \param usableSubCarriers the number of usable subcarriers for data
+   * \param numberOfBitsPerSubcarrier the number of data bits per subcarrier
+   * \param codingRate the coding rate
+   * \param nss the considered number of streams
+   *
+   * \return the data bit rate of this signal in bps.
+   */
+  static uint64_t CalculateDataRate (double symbolDuration, uint16_t guardInterval,
+                                     uint16_t usableSubCarriers, uint16_t numberOfBitsPerSubcarrier,
+                                     double codingRate, uint8_t nss);
+  /**
+   * \param channelWidth the channel width in MHz
+   * \return he number of usable subcarriers for data
+   */
+  static uint16_t GetUsableSubcarriers (uint16_t channelWidth);
+
+  uint8_t m_maxMcsIndexPerSs;          //!< the maximum MCS index per spatial stream as defined by the standard
+  uint8_t m_maxSupportedMcsIndexPerSs; //!< the maximum supported MCS index per spatial stream
+  uint8_t m_bssMembershipSelector;     //!< the BSS membership selector
+
+private:
+  /**
+   * End receiving the HT-SIG, perform HT-specific actions, and
+   * provide the status of the reception.
+   *
+   * \param event the event holding incoming PPDU's information
+   * \return status of the reception of the HT-SIG
+   */
+  PhyFieldRxStatus EndReceiveHtSig (Ptr<Event> event);
+
+  /**
+   * Return the HT MCS corresponding to
+   * the provided index.
+   * This method binds all the callbacks used by WifiMode.
+   *
+   * \param index the index of the MCS
+   * \return an HT MCS
+   */
+  static WifiMode CreateHtMcs (uint8_t index);
+
+  uint8_t m_maxSupportedNss; //!< Maximum supported number of spatial streams (used to build HT MCS indices)
+
+  static const PpduFormats m_htPpduFormats; //!< HT PPDU formats
+}; //class HtPhy
+
+} //namespace ns3
+
+#endif /* HT_PHY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht/ht-ppdu.cc ns-3.34/src/wifi/model/ht/ht-ppdu.cc
--- ns-3.33/src/wifi/model/ht/ht-ppdu.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/ht/ht-ppdu.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,221 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Rediet <getachew.redieteab@orange.com>
+ *         Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
+ *         Sébastien Deronne <sebastien.deronne@gmail.com> (HtSigHeader)
+ */
+
+#include "ns3/wifi-phy.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/wifi-utils.h"
+#include "ht-phy.h"
+#include "ht-ppdu.h"
+#include "ns3/log.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("HtPpdu");
+
+HtPpdu::HtPpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, Time ppduDuration,
+                WifiPhyBand band, uint64_t uid)
+  : OfdmPpdu (psdu, txVector, band, uid, false) //don't instantiate LSigHeader of OfdmPpdu
+{
+  NS_LOG_FUNCTION (this << psdu << txVector << ppduDuration << band << uid);
+  uint8_t sigExtension = 0;
+  if (m_band == WIFI_PHY_BAND_2_4GHZ)
+    {
+      sigExtension = 6;
+    }
+  uint16_t length = ((ceil ((static_cast<double> (ppduDuration.GetNanoSeconds () - (20 * 1000) - (sigExtension * 1000)) / 1000) / 4.0) * 3) - 3);
+  m_lSig.SetLength (length);
+  m_htSig.SetMcs (txVector.GetMode ().GetMcsValue ());
+  m_htSig.SetChannelWidth (m_channelWidth);
+  m_htSig.SetHtLength (psdu->GetSize ());
+  m_htSig.SetAggregation (txVector.IsAggregation ());
+  m_htSig.SetShortGuardInterval (txVector.GetGuardInterval () == 400);
+}
+
+HtPpdu::~HtPpdu ()
+{
+}
+
+WifiTxVector
+HtPpdu::DoGetTxVector (void) const
+{
+  WifiTxVector txVector;
+  txVector.SetPreambleType (m_preamble);
+  txVector.SetMode (HtPhy::GetHtMcs (m_htSig.GetMcs ()));
+  txVector.SetChannelWidth (m_htSig.GetChannelWidth ());
+  txVector.SetNss (1 + (m_htSig.GetMcs () / 8));
+  txVector.SetGuardInterval(m_htSig.GetShortGuardInterval () ? 400 : 800);
+  txVector.SetAggregation (m_htSig.GetAggregation ());
+  return txVector;
+}
+
+Time
+HtPpdu::GetTxDuration (void) const
+{
+  Time ppduDuration = Seconds (0);
+  const WifiTxVector& txVector = GetTxVector ();
+  ppduDuration = WifiPhy::CalculateTxDuration (m_htSig.GetHtLength (), txVector, m_band);
+  return ppduDuration;
+}
+
+Ptr<WifiPpdu>
+HtPpdu::Copy (void) const
+{
+  return Create<HtPpdu> (GetPsdu (), GetTxVector (), GetTxDuration (), m_band, m_uid);
+}
+
+HtPpdu::HtSigHeader::HtSigHeader ()
+  : m_mcs (0),
+    m_cbw20_40 (0),
+    m_htLength (0),
+    m_aggregation (0),
+    m_sgi (0)
+{
+}
+
+HtPpdu::HtSigHeader::~HtSigHeader ()
+{
+}
+
+TypeId
+HtPpdu::HtSigHeader::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::HtSigHeader")
+    .SetParent<Header> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<HtSigHeader> ()
+  ;
+  return tid;
+}
+
+TypeId
+HtPpdu::HtSigHeader::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+void
+HtPpdu::HtSigHeader::Print (std::ostream &os) const
+{
+  os << "MCS=" << +m_mcs
+     << " HT_LENGTH=" << m_htLength
+     << " CHANNEL_WIDTH=" << GetChannelWidth ()
+     << " SGI=" << +m_sgi
+     << " AGGREGATION=" << +m_aggregation;
+}
+
+uint32_t
+HtPpdu::HtSigHeader::GetSerializedSize (void) const
+{
+  return 6;
+}
+
+void
+HtPpdu::HtSigHeader::SetMcs (uint8_t mcs)
+{
+  NS_ASSERT (mcs <= 31);
+  m_mcs = mcs;
+}
+
+uint8_t
+HtPpdu::HtSigHeader::GetMcs (void) const
+{
+  return m_mcs;
+}
+
+void
+HtPpdu::HtSigHeader::SetChannelWidth (uint16_t channelWidth)
+{
+  m_cbw20_40 = (channelWidth > 20) ? 1 : 0;
+}
+
+uint16_t
+HtPpdu::HtSigHeader::GetChannelWidth (void) const
+{
+  return m_cbw20_40 ? 40 : 20;
+}
+
+void
+HtPpdu::HtSigHeader::SetHtLength (uint16_t length)
+{
+  m_htLength = length;
+}
+
+uint16_t
+HtPpdu::HtSigHeader::GetHtLength (void) const
+{
+  return m_htLength;
+}
+
+void
+HtPpdu::HtSigHeader::SetAggregation (bool aggregation)
+{
+  m_aggregation = aggregation ? 1 : 0;
+}
+
+bool
+HtPpdu::HtSigHeader::GetAggregation (void) const
+{
+  return m_aggregation ? true : false;
+}
+
+void
+HtPpdu::HtSigHeader::SetShortGuardInterval (bool sgi)
+{
+  m_sgi = sgi ? 1 : 0;
+}
+
+bool
+HtPpdu::HtSigHeader::GetShortGuardInterval (void) const
+{
+  return m_sgi ? true : false;
+}
+
+void
+HtPpdu::HtSigHeader::Serialize (Buffer::Iterator start) const
+{
+  uint8_t byte = m_mcs;
+  byte |= ((m_cbw20_40 & 0x01) << 7);
+  start.WriteU8 (byte);
+  start.WriteU16 (m_htLength);
+  byte = (0x01 << 2); //Set Reserved bit #2 to 1
+  byte |= ((m_aggregation & 0x01) << 3);
+  byte |= ((m_sgi & 0x01) << 7);
+  start.WriteU8 (byte);
+  start.WriteU16 (0);
+}
+
+uint32_t
+HtPpdu::HtSigHeader::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+  uint8_t byte = i.ReadU8 ();
+  m_mcs = byte & 0x7f;
+  m_cbw20_40 = ((byte >> 7) & 0x01);
+  m_htLength = i.ReadU16 ();
+  byte = i.ReadU8 ();
+  m_aggregation = ((byte >> 3) & 0x01);
+  m_sgi = ((byte >> 7) & 0x01);
+  i.ReadU16 ();
+  return i.GetDistanceFrom (start);
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht/ht-ppdu.h ns-3.34/src/wifi/model/ht/ht-ppdu.h
--- ns-3.33/src/wifi/model/ht/ht-ppdu.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/ht/ht-ppdu.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,166 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Rediet <getachew.redieteab@orange.com>
+ *         Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
+ *         Sébastien Deronne <sebastien.deronne@gmail.com> (HtSigHeader)
+ */
+
+#ifndef HT_PPDU_H
+#define HT_PPDU_H
+
+#include "ns3/ofdm-ppdu.h"
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of ns3::HtPpdu class.
+ */
+
+namespace ns3 {
+
+class WifiPsdu;
+
+/**
+ * \brief HT  PPDU (11n)
+ * \ingroup wifi
+ *
+ * HtPpdu stores a preamble, PHY headers and a PSDU of a PPDU with HT header
+ */
+class HtPpdu : public OfdmPpdu
+{
+public:
+
+  /**
+   * HT PHY header (HT-SIG1/2).
+   * See section 19.3.9 in IEEE 802.11-2016.
+   */
+  class HtSigHeader : public Header
+  {
+  public:
+    HtSigHeader ();
+    virtual ~HtSigHeader ();
+
+    /**
+     * \brief Get the type ID.
+     * \return the object TypeId
+     */
+    static TypeId GetTypeId (void);
+
+    TypeId GetInstanceTypeId (void) const override;
+    void Print (std::ostream &os) const override;
+    uint32_t GetSerializedSize (void) const override;
+    void Serialize (Buffer::Iterator start) const override;
+    uint32_t Deserialize (Buffer::Iterator start) override;
+
+    /**
+     * Fill the MCS field of HT-SIG.
+     *
+     * \param mcs the MCS field of HT-SIG
+     */
+    void SetMcs (uint8_t mcs);
+    /**
+     * Return the MCS field of HT-SIG.
+     *
+     * \return the MCS field of HT-SIG
+     */
+    uint8_t GetMcs (void) const;
+    /**
+     * Fill the channel width field of HT-SIG (in MHz).
+     *
+     * \param channelWidth the channel width (in MHz)
+     */
+    void SetChannelWidth (uint16_t channelWidth);
+    /**
+     * Return the channel width (in MHz).
+     *
+     * \return the channel width (in MHz)
+     */
+    uint16_t GetChannelWidth (void) const;
+    /**
+     * Fill the aggregation field of HT-SIG.
+     *
+     * \param aggregation whether the PSDU contains A-MPDU or not
+     */
+    void SetAggregation (bool aggregation);
+    /**
+     * Return the aggregation field of HT-SIG.
+     *
+     * \return the aggregation field of HT-SIG
+     */
+    bool GetAggregation (void) const;
+    /**
+     * Fill the short guard interval field of HT-SIG.
+     *
+     * \param sgi whether short guard interval is used or not
+     */
+    void SetShortGuardInterval (bool sgi);
+    /**
+     * Return the short guard interval field of HT-SIG.
+     *
+     * \return the short guard interval field of HT-SIG
+     */
+    bool GetShortGuardInterval (void) const;
+    /**
+     * Fill the HT length field of HT-SIG (in bytes).
+     *
+     * \param length the HT length field of HT-SIG (in bytes)
+     */
+    void SetHtLength (uint16_t length);
+    /**
+     * Return the HT length field of HT-SIG (in bytes).
+     *
+     * \return the HT length field of HT-SIG (in bytes)
+     */
+    uint16_t GetHtLength (void) const;
+
+  private:
+    uint8_t m_mcs;         ///< Modulation and Coding Scheme index
+    uint8_t m_cbw20_40;    ///< CBW 20/40
+    uint16_t m_htLength;   ///< HT length
+    uint8_t m_aggregation; ///< Aggregation
+    uint8_t m_sgi;         ///< Short Guard Interval
+  }; //HtSigHeader
+
+  /**
+   * Create an HT PPDU.
+   *
+   * \param psdu the PHY payload (PSDU)
+   * \param txVector the TXVECTOR that was used for this PPDU
+   * \param ppduDuration the transmission duration of this PPDU
+   * \param band the WifiPhyBand used for the transmission of this PPDU
+   * \param uid the unique ID of this PPDU
+   */
+  HtPpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, Time ppduDuration,
+          WifiPhyBand band, uint64_t uid);
+  /**
+   * Destructor for HtPpdu.
+   */
+  virtual ~HtPpdu ();
+
+  Time GetTxDuration (void) const override;
+  Ptr<WifiPpdu> Copy (void) const override;
+
+private:
+  WifiTxVector DoGetTxVector (void) const override;
+
+  HtSigHeader m_htSig;  //!< the HT-SIG PHY header
+}; //class HtPpdu
+
+} //namespace ns3
+
+#endif /* HT_PPDU_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht-capabilities.cc ns-3.34/src/wifi/model/ht-capabilities.cc
--- ns-3.33/src/wifi/model/ht-capabilities.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ht-capabilities.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,566 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2013
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Authors: Ghada Badawy <gbadawy@rim.com>
- *          Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "ht-capabilities.h"
-
-namespace ns3 {
-
-HtCapabilities::HtCapabilities ()
-  : m_ldpc (0),
-    m_supportedChannelWidth (0),
-    m_smPowerSave (0),
-    m_greenField (0),
-    m_shortGuardInterval20 (0),
-    m_shortGuardInterval40 (0),
-    m_txStbc (0),
-    m_rxStbc (0),
-    m_htDelayedBlockAck (0),
-    m_maxAmsduLength (0),
-    m_dssMode40 (0),
-    m_psmpSupport (0),
-    m_fortyMhzIntolerant (0),
-    m_lsigProtectionSupport (0),
-    m_maxAmpduLengthExponent (0),
-    m_minMpduStartSpace (0),
-    m_ampduReserved (0),
-    m_reservedMcsSet1 (0),
-    m_rxHighestSupportedDataRate (0),
-    m_reservedMcsSet2 (0),
-    m_txMcsSetDefined (0),
-    m_txRxMcsSetUnequal (0),
-    m_txMaxNSpatialStreams (0),
-    m_txUnequalModulation (0),
-    m_reservedMcsSet3 (0),
-    m_pco (0),
-    m_pcoTransitionTime (0),
-    m_reservedExtendedCapabilities (0),
-    m_mcsFeedback (0),
-    m_htcSupport (0),
-    m_reverseDirectionResponder (0),
-    m_reservedExtendedCapabilities2 (0),
-    m_implicitRxBfCapable (0),
-    m_rxStaggeredSoundingCapable (0),
-    m_txStaggeredSoundingCapable (0),
-    m_rxNdpCapable (0),
-    m_txNdpCapable (0),
-    m_implicitTxBfCapable (0),
-    m_calibration (0),
-    m_explicitCsiTxBfCapable (0),
-    m_explicitNoncompressedSteeringCapable (0),
-    m_explicitCompressedSteeringCapable (0),
-    m_explicitTxBfCsiFeedback (0),
-    m_explicitNoncompressedBfFeedbackCapable (0),
-    m_explicitCompressedBfFeedbackCapable (0),
-    m_minimalGrouping (0),
-    m_csiNBfAntennasSupported (0),
-    m_noncompressedSteeringNBfAntennasSupported (0),
-    m_compressedSteeringNBfAntennasSupported (0),
-    m_csiMaxNRowsBfSupported (0),
-    m_channelEstimationCapability (0),
-    m_reservedTxBf (0),
-    m_antennaSelectionCapability (0),
-    m_explicitCsiFeedbackBasedTxASelCapable (0),
-    m_antennaIndicesFeedbackBasedTxASelCapable (0),
-    m_explicitCsiFeedbackCapable (0),
-    m_antennaIndicesFeedbackCapable (0),
-    m_rxASelCapable (0),
-    m_txSoundingPpdusCapable (0),
-    m_reservedASel (0),
-    m_htSupported (0)
-{
-  for (uint8_t i = 0; i < MAX_SUPPORTED_MCS; i++)
-    {
-      m_rxMcsBitmask[i] = 0;
-    }
-}
-
-WifiInformationElementId
-HtCapabilities::ElementId () const
-{
-  return IE_HT_CAPABILITIES;
-}
-
-void
-HtCapabilities::SetHtSupported (uint8_t htSupported)
-{
-  m_htSupported = htSupported;
-}
-
-void
-HtCapabilities::SetLdpc (uint8_t ldpc)
-{
-  m_ldpc = ldpc;
-}
-
-void
-HtCapabilities::SetSupportedChannelWidth (uint8_t supportedChannelWidth)
-{
-  m_supportedChannelWidth = supportedChannelWidth;
-}
-
-void
-HtCapabilities::SetGreenfield (uint8_t greenfield)
-{
-  m_greenField = greenfield;
-}
-
-void
-HtCapabilities::SetShortGuardInterval20 (uint8_t shortGuardInterval)
-{
-  m_shortGuardInterval20 = shortGuardInterval;
-}
-
-void
-HtCapabilities::SetShortGuardInterval40 (uint8_t shortGuardInterval)
-{
-  m_shortGuardInterval40 = shortGuardInterval;
-}
-
-void
-HtCapabilities::SetMaxAmsduLength (uint16_t maxAmsduLength)
-{
-  NS_ABORT_MSG_IF (maxAmsduLength != 3839 && maxAmsduLength != 7935,
-                   "Invalid A-MSDU Max Length value");
-  m_maxAmsduLength = (maxAmsduLength == 3839 ? 0 : 1);
-}
-
-void
-HtCapabilities::SetLSigProtectionSupport (uint8_t lSigProtection)
-{
-  m_lsigProtectionSupport = lSigProtection;
-}
-
-void
-HtCapabilities::SetMaxAmpduLength (uint32_t maxAmpduLength)
-{
-  for (uint8_t i = 0; i <= 3; i++)
-    {
-      if ((1ul << (13 + i)) - 1 == maxAmpduLength)
-        {
-          m_maxAmpduLengthExponent = i;
-          return;
-        }
-    }
-  NS_ABORT_MSG ("Invalid A-MPDU Max Length value");
-}
-
-void
-HtCapabilities::SetRxMcsBitmask (uint8_t index)
-{
-  m_rxMcsBitmask[index] = 1;
-}
-
-void
-HtCapabilities::SetRxHighestSupportedDataRate (uint16_t maxSupportedRate)
-{
-  m_rxHighestSupportedDataRate = maxSupportedRate;
-}
-
-void
-HtCapabilities::SetTxMcsSetDefined (uint8_t txMcsSetDefined)
-{
-  m_txMcsSetDefined = txMcsSetDefined;
-}
-
-void
-HtCapabilities::SetTxRxMcsSetUnequal (uint8_t txRxMcsSetUnequal)
-{
-  m_txRxMcsSetUnequal = txRxMcsSetUnequal;
-}
-
-void
-HtCapabilities::SetTxMaxNSpatialStreams (uint8_t maxTxSpatialStreams)
-{
-  m_txMaxNSpatialStreams = maxTxSpatialStreams - 1; //0 for 1 SS, 1 for 2 SSs, etc
-}
-
-void
-HtCapabilities::SetTxUnequalModulation (uint8_t txUnequalModulation)
-{
-  m_txUnequalModulation = txUnequalModulation;
-}
-
-uint8_t
-HtCapabilities::GetLdpc (void) const
-{
-  return m_ldpc;
-}
-
-uint8_t
-HtCapabilities::GetSupportedChannelWidth (void) const
-{
-  return m_supportedChannelWidth;
-}
-
-uint8_t
-HtCapabilities::GetGreenfield (void) const
-{
-  return m_greenField;
-}
-
-uint8_t
-HtCapabilities::GetShortGuardInterval20 (void) const
-{
-  return m_shortGuardInterval20;
-}
-
-uint16_t
-HtCapabilities::GetMaxAmsduLength (void) const
-{
-  if (m_maxAmsduLength == 0)
-    {
-      return 3839;
-    }
-  return 7935;
-}
-
-uint32_t
-HtCapabilities::GetMaxAmpduLength (void) const
-{
-  return (1ul << (13 + m_maxAmpduLengthExponent)) - 1;
-}
-
-bool
-HtCapabilities::IsSupportedMcs (uint8_t mcs) const
-{
-  if (m_rxMcsBitmask[mcs] == 1)
-    {
-      return true;
-    }
-  return false;
-}
-
-uint8_t
-HtCapabilities::GetRxHighestSupportedAntennas (void) const
-{
-  for (uint8_t nRx = 2; nRx <= 4; nRx++)
-    {
-      for (uint8_t mcs = (nRx - 1) * 8; mcs <= ((7 * nRx) + (nRx - 1)); mcs++)
-        {
-          if (IsSupportedMcs (mcs) == false)
-            {
-              return (nRx - 1);
-            }
-        }
-    }
-  return 4;
-}
-
-uint8_t
-HtCapabilities::GetInformationFieldSize () const
-{
-  //we should not be here if HT is not supported
-  NS_ASSERT (m_htSupported > 0);
-  return 26;
-}
-
-Buffer::Iterator
-HtCapabilities::Serialize (Buffer::Iterator i) const
-{
-  if (m_htSupported < 1)
-    {
-      return i;
-    }
-  return WifiInformationElement::Serialize (i);
-}
-
-uint16_t
-HtCapabilities::GetSerializedSize () const
-{
-  if (m_htSupported < 1)
-    {
-      return 0;
-    }
-  return WifiInformationElement::GetSerializedSize ();
-}
-
-uint16_t
-HtCapabilities::GetHtCapabilitiesInfo (void) const
-{
-  uint16_t val = 0;
-  val |= m_ldpc & 0x01;
-  val |= (m_supportedChannelWidth & 0x01) << 1;
-  val |= (m_smPowerSave & 0x03) << 2;
-  val |= (m_greenField & 0x01) << 4;
-  val |= (m_shortGuardInterval20 & 0x01) << 5;
-  val |= (m_shortGuardInterval40 & 0x01) << 6;
-  val |= (m_txStbc & 0x01) << 7;
-  val |= (m_rxStbc & 0x03) << 8;
-  val |= (m_htDelayedBlockAck & 0x01) << 10;
-  val |= (m_maxAmsduLength & 0x01) << 11;
-  val |= (m_dssMode40 & 0x01) << 12;
-  val |= (m_psmpSupport & 0x01) << 13;
-  val |= (m_fortyMhzIntolerant & 0x01) << 14;
-  val |= (m_lsigProtectionSupport & 0x01) << 15;
-  return val;
-}
-
-void
-HtCapabilities::SetHtCapabilitiesInfo (uint16_t ctrl)
-{
-  m_ldpc = ctrl & 0x01;
-  m_supportedChannelWidth = (ctrl >> 1) & 0x01;
-  m_smPowerSave = (ctrl >> 2) & 0x03;
-  m_greenField = (ctrl >> 4) & 0x01;
-  m_shortGuardInterval20 = (ctrl >> 5) & 0x01;
-  m_shortGuardInterval40 = (ctrl >> 6) & 0x01;
-  m_txStbc = (ctrl >> 7) & 0x01;
-  m_rxStbc = (ctrl >> 8) & 0x03;
-  m_htDelayedBlockAck = (ctrl >> 10) & 0x01;
-  m_maxAmsduLength = (ctrl >> 11) & 0x01;
-  m_dssMode40 = (ctrl >> 12) & 0x01;
-  m_psmpSupport = (ctrl >> 13) & 0x01;
-  m_fortyMhzIntolerant = (ctrl >> 14) & 0x01;
-  m_lsigProtectionSupport = (ctrl >> 15) & 0x01;
-}
-
-void
-HtCapabilities::SetAmpduParameters (uint8_t ctrl)
-{
-  m_maxAmpduLengthExponent = ctrl & 0x03;
-  m_minMpduStartSpace = (ctrl >> 2) & 0x1b;
-  m_ampduReserved = (ctrl >> 5) & 0xe0;
-}
-
-uint8_t
-HtCapabilities::GetAmpduParameters (void) const
-{
-  uint8_t val = 0;
-  val |=  m_maxAmpduLengthExponent & 0x03;
-  val |= (m_minMpduStartSpace & 0x1b) << 2;
-  val |= (m_ampduReserved & 0xe0) << 5;
-  return val;
-}
-
-void
-HtCapabilities::SetSupportedMcsSet (uint64_t ctrl1, uint64_t ctrl2)
-{
-  for (uint64_t i = 0; i < 77; i++)
-    {
-      if (i < 64)
-        {
-          m_rxMcsBitmask[i] = (ctrl1 >> i) & 0x01;
-        }
-      else
-        {
-          m_rxMcsBitmask[i] = (ctrl2 >> (i - 64)) & 0x01;
-        }
-    }
-  m_reservedMcsSet1 = (ctrl2 >> 13) & 0x07;
-  m_rxHighestSupportedDataRate = (ctrl2 >> 16) & 0x03ff;
-  m_reservedMcsSet2 = (ctrl2 >> 26) & 0x3f;
-  m_txMcsSetDefined = (ctrl2 >> 32) & 0x01;
-  m_txRxMcsSetUnequal = (ctrl2 >> 33) & 0x01;
-  m_txMaxNSpatialStreams = (ctrl2 >> 34) & 0x03;
-  m_txUnequalModulation = (ctrl2 >> 36) & 0x01;
-  m_reservedMcsSet3 = (ctrl2 >> 37) & 0x07ffffff;
-}
-
-uint64_t
-HtCapabilities::GetSupportedMcsSet1 (void) const
-{
-  uint64_t val = 0;
-  for (uint64_t i = 63; i > 0; i--)
-    {
-      val = (val << 1) | (m_rxMcsBitmask[i] & 0x01);
-    }
-  val = (val << 1) | (m_rxMcsBitmask[0] & 0x01);
-  return val;
-}
-
-uint64_t
-HtCapabilities::GetSupportedMcsSet2 (void) const
-{
-  uint64_t val = 0;
-  val = val | (m_reservedMcsSet3 & 0x07ffffff);
-  val = (val << 1) | (m_txUnequalModulation & 0x01);
-  val = (val << 2) | (m_txMaxNSpatialStreams & 0x03);
-  val = (val << 1) | (m_txRxMcsSetUnequal & 0x01);
-  val = (val << 1) | (m_txMcsSetDefined & 0x01);
-  val = (val << 6) | (m_reservedMcsSet2 & 0x3f);
-  val = (val << 10) | (m_rxHighestSupportedDataRate & 0x3ff);
-  val = (val << 3) | (m_reservedMcsSet1 & 0x07);
-
-  for (uint64_t i = 13; i > 0; i--)
-    {
-      val = (val << 1) | ( m_rxMcsBitmask[i + 63] & 0x01);
-    }
-  return val;
-}
-
-uint16_t
-HtCapabilities::GetExtendedHtCapabilities (void) const
-{
-  uint16_t val = 0;
-  val |= m_pco & 0x01;
-  val |= (m_pcoTransitionTime & 0x03) << 1;
-  val |= (m_reservedExtendedCapabilities & 0x1f) << 3;
-  val |= (m_mcsFeedback & 0x03) << 8;
-  val |= (m_htcSupport & 0x01) << 10;
-  val |= (m_reverseDirectionResponder & 0x01) << 11;
-  val |= (m_reservedExtendedCapabilities2 & 0x0f) << 12;
-  return val;
-}
-
-void
-HtCapabilities::SetExtendedHtCapabilities (uint16_t ctrl)
-{
-  m_pco = ctrl & 0x01;
-  m_pcoTransitionTime = (ctrl >> 1) & 0x03;
-  m_reservedExtendedCapabilities = (ctrl >> 3) & 0x1f;
-  m_mcsFeedback = (ctrl >> 8) & 0x03;
-  m_htcSupport = (ctrl >> 10) & 0x01;
-  m_reverseDirectionResponder = (ctrl >> 11) & 0x01;
-  m_reservedExtendedCapabilities2 = (ctrl >> 12) & 0x0f;
-}
-
-uint32_t
-HtCapabilities::GetTxBfCapabilities (void) const
-{
-  uint32_t val = 0;
-  val |= m_implicitRxBfCapable & 0x01;
-  val |= (m_rxStaggeredSoundingCapable & 0x01) << 1;
-  val |= (m_txStaggeredSoundingCapable & 0x01) << 2;
-  val |= (m_rxNdpCapable & 0x01) << 3;
-  val |= (m_txNdpCapable & 0x01) << 4;
-  val |= (m_implicitTxBfCapable & 0x01) << 5;
-  val |= (m_calibration & 0x03) << 6;
-  val |= (m_explicitCsiTxBfCapable & 0x01) << 8;
-  val |= (m_explicitNoncompressedSteeringCapable & 0x01) << 9;
-  val |= (m_explicitCompressedSteeringCapable & 0x01) << 10;
-  val |= (m_explicitTxBfCsiFeedback & 0x03) << 11;
-  val |= (m_explicitNoncompressedBfFeedbackCapable & 0x03) << 13;
-  val |= (m_explicitCompressedBfFeedbackCapable & 0x03) << 15;
-  val |= (m_minimalGrouping & 0x03) << 17;
-  val |= (m_csiNBfAntennasSupported & 0x03) << 19;
-  val |= (m_noncompressedSteeringNBfAntennasSupported & 0x03) << 21;
-  val |= (m_compressedSteeringNBfAntennasSupported & 0x03) << 23;
-  val |= (m_csiMaxNRowsBfSupported & 0x03) << 25;
-  val |= (m_channelEstimationCapability & 0x03) << 27;
-  val |= (m_reservedTxBf & 0x07) << 29;
-  return val;
-}
-
-void
-HtCapabilities::SetTxBfCapabilities (uint32_t ctrl)
-{
-  m_implicitRxBfCapable = ctrl & 0x01;
-  m_rxStaggeredSoundingCapable = (ctrl >> 1) & 0x01;
-  m_txStaggeredSoundingCapable = (ctrl >> 2) & 0x01;
-  m_rxNdpCapable = (ctrl >> 3) & 0x01;
-  m_txNdpCapable = (ctrl >> 4) & 0x01;
-  m_implicitTxBfCapable = (ctrl >> 5) & 0x01;
-  m_calibration = (ctrl >> 6) & 0x03;
-  m_explicitCsiTxBfCapable = (ctrl >> 8) & 0x01;
-  m_explicitNoncompressedSteeringCapable = (ctrl >> 9) & 0x01;
-  m_explicitCompressedSteeringCapable = (ctrl >> 10) & 0x01;
-  m_explicitTxBfCsiFeedback = (ctrl >> 11) & 0x03;
-  m_explicitNoncompressedBfFeedbackCapable = (ctrl >> 13) & 0x03;
-  m_explicitCompressedBfFeedbackCapable = (ctrl >> 15) & 0x03;
-  m_minimalGrouping = (ctrl >> 17) & 0x03;
-  m_csiNBfAntennasSupported = (ctrl >> 19) & 0x03;
-  m_noncompressedSteeringNBfAntennasSupported = (ctrl >> 21) & 0x03;
-  m_compressedSteeringNBfAntennasSupported = (ctrl >> 23) & 0x03;
-  m_csiMaxNRowsBfSupported = (ctrl >> 25) & 0x03;
-  m_channelEstimationCapability = (ctrl >> 27) & 0x03;
-  m_reservedTxBf = (ctrl >> 29) & 0x07;
-}
-
-uint8_t
-HtCapabilities::GetAntennaSelectionCapabilities (void) const
-{
-  uint8_t val = 0;
-  val |= m_antennaSelectionCapability & 0x01;
-  val |= (m_explicitCsiFeedbackBasedTxASelCapable & 0x01) << 1;
-  val |= (m_antennaIndicesFeedbackBasedTxASelCapable & 0x01) << 2;
-  val |= (m_explicitCsiFeedbackCapable & 0x01) << 3;
-  val |= (m_antennaIndicesFeedbackCapable & 0x01) << 4;
-  val |= (m_rxASelCapable & 0x01) << 5;
-  val |= (m_txSoundingPpdusCapable & 0x01) << 6;
-  val |= (m_reservedASel & 0x01) << 7;
-  return val;
-}
-
-void
-HtCapabilities::SetAntennaSelectionCapabilities (uint8_t ctrl)
-{
-  m_antennaSelectionCapability = ctrl & 0x01;
-  m_explicitCsiFeedbackBasedTxASelCapable = (ctrl >> 1) & 0x01;
-  m_antennaIndicesFeedbackBasedTxASelCapable = (ctrl >> 2) & 0x01;
-  m_explicitCsiFeedbackCapable = (ctrl >> 3) & 0x01;
-  m_antennaIndicesFeedbackCapable = (ctrl >> 4) & 0x01;
-  m_rxASelCapable = (ctrl >> 5) & 0x01;
-  m_txSoundingPpdusCapable = (ctrl >> 6) & 0x01;
-  m_reservedASel = (ctrl >> 7) & 0x01;
-}
-
-void
-HtCapabilities::SerializeInformationField (Buffer::Iterator start) const
-{
-  if (m_htSupported == 1)
-    {
-      //write the corresponding value for each bit
-      start.WriteHtolsbU16 (GetHtCapabilitiesInfo ());
-      start.WriteU8 (GetAmpduParameters ());
-      start.WriteHtolsbU64 (GetSupportedMcsSet1 ());
-      start.WriteHtolsbU64 (GetSupportedMcsSet2 ());
-      start.WriteU16 (GetExtendedHtCapabilities ());
-      start.WriteU32 (GetTxBfCapabilities ());
-      start.WriteU8 (GetAntennaSelectionCapabilities ());
-    }
-}
-
-uint8_t
-HtCapabilities::DeserializeInformationField (Buffer::Iterator start,
-                                             uint8_t length)
-{
-  Buffer::Iterator i = start;
-  uint16_t htinfo = i.ReadLsbtohU16 ();
-  uint8_t ampduparam = i.ReadU8 ();
-  uint64_t mcsset1 = i.ReadLsbtohU64 ();
-  uint64_t mcsset2 = i.ReadLsbtohU64 ();
-  uint16_t extendedcapabilities = i.ReadU16 ();
-  uint32_t txbfcapabilities = i.ReadU32 ();
-  uint8_t aselcapabilities = i.ReadU8 ();
-  SetHtCapabilitiesInfo (htinfo);
-  SetAmpduParameters (ampduparam);
-  SetSupportedMcsSet (mcsset1, mcsset2);
-  SetExtendedHtCapabilities (extendedcapabilities);
-  SetTxBfCapabilities (txbfcapabilities);
-  SetAntennaSelectionCapabilities (aselcapabilities);
-  return length;
-}
-
-std::ostream &
-operator << (std::ostream &os, const HtCapabilities &htcapabilities)
-{
-  os << bool (htcapabilities.GetLdpc ())
-     << "|" << bool (htcapabilities.GetSupportedChannelWidth ())
-     << "|" << bool (htcapabilities.GetGreenfield ())
-     << "|" << bool (htcapabilities.GetShortGuardInterval20 ()) << "|";
-  for (uint8_t i = 0; i < MAX_SUPPORTED_MCS; i++)
-    {
-      os << htcapabilities.IsSupportedMcs (i) << " ";
-    }
-  return os;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht-capabilities.h ns-3.34/src/wifi/model/ht-capabilities.h
--- ns-3.33/src/wifi/model/ht-capabilities.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ht-capabilities.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,376 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2013
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Authors: Ghada Badawy <gbadawy@gmail.com>
- *          Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef HT_CAPABILITIES_H
-#define HT_CAPABILITIES_H
-
-#include "wifi-information-element.h"
-
-/**
- * This defines the maximum number of supported MCSs that a STA is
- * allowed to have. Currently this number is set for IEEE 802.11n
- */
-#define MAX_SUPPORTED_MCS  (77)
-
-namespace ns3 {
-
-/**
- * \brief The HT Capabilities Information Element
- * \ingroup wifi
- *
- * This class knows how to serialise and deserialise the HT Capabilities Information Element
- */
-class HtCapabilities : public WifiInformationElement
-{
-public:
-  HtCapabilities ();
-
-  // Implementations of pure virtual methods of WifiInformationElement
-  WifiInformationElementId ElementId () const;
-  uint8_t GetInformationFieldSize () const;
-  void SerializeInformationField (Buffer::Iterator start) const;
-  uint8_t DeserializeInformationField (Buffer::Iterator start,
-                                       uint8_t length);
-  /* This information element is a bit special in that it is only
-     included if the STA is an HT STA. To support this we
-     override the Serialize and GetSerializedSize methods of
-     WifiInformationElement. */
-  Buffer::Iterator Serialize (Buffer::Iterator start) const;
-  uint16_t GetSerializedSize () const;
-
-  /**
-   * Set the HT supported field.
-   *
-   * \param htSupported the HT supported field
-   */
-  void SetHtSupported (uint8_t htSupported);
-
-  /**
-   * Set the HT Capabilities Info field in the HT Capabilities information element.
-   *
-   * \param ctrl the HT Capabilities Info field in the HT Capabilities information element
-   */
-  void SetHtCapabilitiesInfo (uint16_t ctrl);
-  /**
-   * Set the A-MPDU Parameters field in the HT Capabilities information element.
-   *
-   * \param ctrl the A-MPDU Parameters field in the HT Capabilities information element
-   */
-  void SetAmpduParameters (uint8_t ctrl);
-  /**
-   * Set the Supported MCS Set field in the HT Capabilities information element.
-   *
-   * \param ctrl1 the first 64 bytes of the Supported MCS Set field in the HT Capabilities information element
-   * \param ctrl2 the last 64 bytes of the Supported MCS Set field in the HT Capabilities information element
-   */
-  void SetSupportedMcsSet (uint64_t ctrl1, uint64_t ctrl2);
-  /**
-   * Set the Extended HT Capabilities field in the HT Capabilities information element.
-   *
-   * \param ctrl the Extended HT Capabilities field in the HT Capabilities information element
-   */
-  void SetExtendedHtCapabilities (uint16_t ctrl);
-  /**
-   * Set the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities information element.
-   *
-   * \param ctrl the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities information element
-   */
-  void SetTxBfCapabilities (uint32_t ctrl);
-  /**
-   * Set the the Antenna Selection (ASEL) Capabilities field in the HT Capabilities information element.
-   *
-   * \param ctrl the Antenna Selection (ASEL) Capabilities field in the HT Capabilities information element
-   */
-  void SetAntennaSelectionCapabilities (uint8_t ctrl);
-
-  /**
-   * Set the LDPC field.
-   *
-   * \param ldpc the LDPC field
-   */
-  void SetLdpc (uint8_t ldpc);
-  /**
-   * Set the supported channel width field.
-   *
-   * \param supportedChannelWidth the supported channel width field
-   */
-  void SetSupportedChannelWidth (uint8_t supportedChannelWidth);
-  /**
-   * Set the Greenfield field.
-   *
-   * \param greenfield the Greenfield field
-   */
-  void SetGreenfield (uint8_t greenfield);
-  /**
-   * Set the short guard interval 20 field.
-   *
-   * \param shortGuardInterval the short guard interval
-   */
-  void SetShortGuardInterval20 (uint8_t shortGuardInterval);
-  /**
-   * Set the short guard interval 40 field.
-   *
-   * \param shortGuardInterval the short guard interval
-   */
-  void SetShortGuardInterval40 (uint8_t shortGuardInterval);
-  /**
-   * Set the maximum AMSDU length.
-   *
-   * \param maxAmsduLength Either 3839 or 7935
-   */
-  void SetMaxAmsduLength (uint16_t maxAmsduLength);
-  /**
-   * Set the LSIG protection support.
-   *
-   * \param lSigProtection the LSIG protection support field
-   */
-  void SetLSigProtectionSupport (uint8_t lSigProtection);
-
-  /**
-   * Set the maximum AMPDU length.
-   *
-   * \param maxAmpduLength 2^(13 + x) - 1, x in the range 0 to 3
-   */
-  void SetMaxAmpduLength (uint32_t maxAmpduLength);
-
-  /**
-   * Set the receive MCS bitmask.
-   *
-   * \param index the index of the receive MCS
-   */
-  void SetRxMcsBitmask (uint8_t index);
-  /**
-   * Set the receive highest supported data rate.
-   *
-   * \param maxSupportedRate the maximum supported data rate
-   */
-  void SetRxHighestSupportedDataRate (uint16_t maxSupportedRate);
-  /**
-   * Set the transmit MCS set defined.
-   *
-   * \param txMcsSetDefined the TX MCS set defined
-   */
-  void SetTxMcsSetDefined (uint8_t txMcsSetDefined);
-  /**
-   * Set the transmit / receive MCS set unequal.
-   *
-   * \param txRxMcsSetUnequal the TX/RX MCS set unequal field
-   */
-  void SetTxRxMcsSetUnequal (uint8_t txRxMcsSetUnequal);
-  /**
-   * Set the transmit maximum N spatial streams.
-   *
-   * \param maxTxSpatialStreams the maximum number of TX SSs
-   */
-  void SetTxMaxNSpatialStreams (uint8_t maxTxSpatialStreams);
-  /**
-   * Set the transmit unequal modulation.
-   *
-   * \param txUnequalModulation the TX unequal modulation field
-   */
-  void SetTxUnequalModulation (uint8_t txUnequalModulation);
-
-  /**
-   * Return the HT Capabilities Info field in the HT Capabilities information element.
-   *
-   * \return the HT Capabilities Info field in the HT Capabilities information element
-   */
-  uint16_t GetHtCapabilitiesInfo (void) const;
-  /**
-   * Return the A-MPDU Parameters field in the HT Capabilities information element.
-   *
-   * \return the A-MPDU Parameters field in the HT Capabilities information element
-   */
-  uint8_t GetAmpduParameters (void) const;
-  /**
-   * Return the first 64 bytes of the Supported MCS Set field in the HT Capabilities information element.
-   *
-   * \return the first 64 bytes of the Supported MCS Set field in the HT Capabilities information element
-   */
-  uint64_t GetSupportedMcsSet1 (void) const;
-  /**
-   * Return the last 64 bytes of the Supported MCS Set field in the HT Capabilities information element.
-   *
-   * \return the last 64 bytes of the Supported MCS Set field in the HT Capabilities information element
-   */
-  uint64_t GetSupportedMcsSet2 (void) const;
-  /**
-   * Return the Extended HT Capabilities field in the HT Capabilities information element.
-   *
-   * \return the Extended HT Capabilities field in the HT Capabilities information element
-   */
-  uint16_t GetExtendedHtCapabilities (void) const;
-  /**
-   * Return the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities information element.
-   *
-   * \return the Transmit Beamforming (TxBF) Capabilities field in the HT Capabilities information element
-   */
-  uint32_t GetTxBfCapabilities (void) const;
-  /**
-   * Return the Antenna Selection (ASEL) Capabilities field in the HT Capabilities information element.
-   *
-   * \return the Antenna Selection (ASEL) Capabilities field in the HT Capabilities information element
-   */
-  uint8_t GetAntennaSelectionCapabilities (void) const;
-
-  /**
-   * Return LDPC.
-   *
-   * \return the LDPC value
-   */
-  uint8_t GetLdpc (void) const;
-  /**
-   * Return the supported channel width.
-   *
-   * \return the supported channel width
-   */
-  uint8_t GetSupportedChannelWidth (void) const;
-  /**
-   * Return the Greenfield field.
-   *
-   * \return the Greenfield field
-   */
-  uint8_t GetGreenfield (void) const;
-  /**
-   * Return the short guard interval 20 value.
-   *
-   * \return the short guard interval 20 value
-   */
-  uint8_t GetShortGuardInterval20 (void) const;
-  /**
-   * Return the maximum A-MSDU length.
-   *
-   * \return the maximum A-MSDU length
-   */
-  uint16_t GetMaxAmsduLength (void) const;
-  /**
-   * Return the maximum A-MPDU length.
-   *
-   * \return the maximum A-MPDU length
-   */
-  uint32_t GetMaxAmpduLength (void) const;
-  /**
-   * Return the is MCS supported flag.
-   *
-   * \param mcs is MCS supported flag
-   *
-   * \return true if successful
-   */
-  bool IsSupportedMcs (uint8_t mcs) const;
-  /**
-   * Return the receive highest supported antennas.
-   *
-   * \return the receive highest supported antennas
-   */
-  uint8_t GetRxHighestSupportedAntennas (void) const;
-
-
-private:
-  //HT Capabilities Info field
-  uint8_t m_ldpc;                  ///< LDPC
-  uint8_t m_supportedChannelWidth; ///< supported channel width
-  uint8_t m_smPowerSave;           ///< SM power save
-  uint8_t m_greenField;            ///< Greenfield
-  uint8_t m_shortGuardInterval20;  ///< short guard interval 20 MHz
-  uint8_t m_shortGuardInterval40;  ///< short guard interval 40 MHz
-  uint8_t m_txStbc;                ///< transmit STBC
-  uint8_t m_rxStbc;                ///< receive STBC
-  uint8_t m_htDelayedBlockAck;     ///< HT delayed block ack
-  uint8_t m_maxAmsduLength;        ///< maximum A-MSDU length
-  uint8_t m_dssMode40;             ///< DSS mode 40
-  uint8_t m_psmpSupport;           ///< PSMP support
-  uint8_t m_fortyMhzIntolerant;    ///< 40 MHz intolerant
-  uint8_t m_lsigProtectionSupport; ///< L-SIG protection support
-
-  //A-MPDU Parameters field
-  uint8_t m_maxAmpduLengthExponent; ///< maximum A-MPDU length
-  uint8_t m_minMpduStartSpace;      ///< minimum MPDU start space
-  uint8_t m_ampduReserved;          ///< A-MPDU reserved
-
-  //Supported MCS Set field
-  uint8_t m_reservedMcsSet1;                 ///< reserved MCS set 1
-  uint16_t m_rxHighestSupportedDataRate;     ///< receive highest supported data rate
-  uint8_t m_reservedMcsSet2;                 ///< reserved MCS set 2
-  uint8_t m_txMcsSetDefined;                 ///< transmit MCS set defined
-  uint8_t m_txRxMcsSetUnequal;               ///< transmit / receive MCS set unequal
-  uint8_t m_txMaxNSpatialStreams;            ///< transmit maximum number spatial streams
-  uint8_t m_txUnequalModulation;             ///< transmit unequal modulation
-  uint32_t m_reservedMcsSet3;                ///< reserved MCS set 3
-  uint8_t m_rxMcsBitmask[MAX_SUPPORTED_MCS]; ///< receive MCS bitmask
-
-  //HT Extended Capabilities field
-  uint8_t m_pco;                           ///< PCO
-  uint8_t m_pcoTransitionTime;             ///< PCO transition time
-  uint8_t m_reservedExtendedCapabilities;  ///< reserved extended capabilities
-  uint8_t m_mcsFeedback;                   ///< MCS feedback
-  uint8_t m_htcSupport;                    ///< HTC support
-  uint8_t m_reverseDirectionResponder;     ///< reverse direction responder
-  uint8_t m_reservedExtendedCapabilities2; ///< reserver extended capabilities 2
-
-  //Transmit Beamforming Capabilities field
-  uint8_t m_implicitRxBfCapable;                       ///< implicit receive BF capable
-  uint8_t m_rxStaggeredSoundingCapable;                ///< receive staggered sounding capable
-  uint8_t m_txStaggeredSoundingCapable;                ///< transmit staggered sounding capable
-  uint8_t m_rxNdpCapable;                              ///< receive NDP capable
-  uint8_t m_txNdpCapable;                              ///< transmit NDP capable
-  uint8_t m_implicitTxBfCapable;                       ///< implicit transmit BF capable
-  uint8_t m_calibration;                               ///< calibration
-  uint8_t m_explicitCsiTxBfCapable;                    ///< explicit CSI transmit BF capable
-  uint8_t m_explicitNoncompressedSteeringCapable;      ///< explicit non compressed steeering capable
-  uint8_t m_explicitCompressedSteeringCapable;         ///< explicit compressed steeering capable
-  uint8_t m_explicitTxBfCsiFeedback;                   ///< explicit transmit BF CSI feedback
-  uint8_t m_explicitNoncompressedBfFeedbackCapable;    ///< explicit non compressed BF feedback capable
-  uint8_t m_explicitCompressedBfFeedbackCapable;       ///< explicit compressed BF feedback capable
-  uint8_t m_minimalGrouping;                           ///< minimal grouping
-  uint8_t m_csiNBfAntennasSupported;                   ///< CSI NBF antenna supported
-  uint8_t m_noncompressedSteeringNBfAntennasSupported; ///< non compressed steering NBF antenna supported
-  uint8_t m_compressedSteeringNBfAntennasSupported;    ///< compressed steering NBF antenna supported
-  uint8_t m_csiMaxNRowsBfSupported;                    ///< CSI maximum number rows BF supported
-  uint8_t m_channelEstimationCapability;               ///< channel estimation capability
-  uint8_t m_reservedTxBf;                              ///< reserved  transmit BF
-
-  //ASEL Capabilities field
-  uint8_t m_antennaSelectionCapability;               ///< antenna selection capability
-  uint8_t m_explicitCsiFeedbackBasedTxASelCapable;    ///< explicit CSI feedback based transmit antenna selection capable
-  uint8_t m_antennaIndicesFeedbackBasedTxASelCapable; ///< antenna indices feedback based transmit antenna selection capable
-  uint8_t m_explicitCsiFeedbackCapable;               ///< explicit CSI feedback capable
-  uint8_t m_antennaIndicesFeedbackCapable;            ///< antenna indices feedback capable
-  uint8_t m_rxASelCapable;                            ///< receive antenna selection capable
-  uint8_t m_txSoundingPpdusCapable;                   ///< sounding PPDUS capable
-  uint8_t m_reservedASel;                             ///< reserved ASEL
-
-  /// This is used to decide whether this element should be added to the frame or not
-  uint8_t m_htSupported;
-};
-
-/**
- * output stream output operator
- *
- * \param os output stream
- * \param htcapabilities the HT capabilities
- *
- * \returns output stream
- */
-std::ostream &operator << (std::ostream &os, const HtCapabilities &htcapabilities);
-
-} //namespace ns3
-
-#endif /* HT_CAPABILITY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht-configuration.cc ns-3.34/src/wifi/model/ht-configuration.cc
--- ns-3.33/src/wifi/model/ht-configuration.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ht-configuration.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,110 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018  Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "ns3/log.h"
-#include "ns3/boolean.h"
-#include "ns3/uinteger.h"
-#include "ht-configuration.h"
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("HtConfiguration");
-
-NS_OBJECT_ENSURE_REGISTERED (HtConfiguration);
-
-HtConfiguration::HtConfiguration ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-HtConfiguration::~HtConfiguration ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-TypeId
-HtConfiguration::GetTypeId (void)
-{
-  static ns3::TypeId tid = ns3::TypeId ("ns3::HtConfiguration")
-    .SetParent<Object> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<HtConfiguration> ()
-    .AddAttribute ("ShortGuardIntervalSupported",
-                   "Whether or not short guard interval is supported.",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&HtConfiguration::GetShortGuardIntervalSupported,
-                                        &HtConfiguration::SetShortGuardIntervalSupported),
-                   MakeBooleanChecker ())
-    .AddAttribute ("GreenfieldSupported",
-                   "Whether or not Greenfield is supported.",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&HtConfiguration::GetGreenfieldSupported,
-                                        &HtConfiguration::SetGreenfieldSupported),
-                   MakeBooleanChecker ())
-    .AddAttribute ("LdpcSupported",
-                   "Whether or not LDPC coding is supported.",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&HtConfiguration::GetLdpcSupported,
-                                        &HtConfiguration::SetLdpcSupported),
-                   MakeBooleanChecker ())
-    ;
-    return tid;
-}
-
-void
-HtConfiguration::SetShortGuardIntervalSupported (bool enable)
-{
-  NS_LOG_FUNCTION (this << enable);
-  m_sgiSupported = enable;
-}
-
-bool
-HtConfiguration::GetShortGuardIntervalSupported (void) const
-{
-  return m_sgiSupported;
-}
-
-void
-HtConfiguration::SetGreenfieldSupported (bool enable)
-{
-  NS_LOG_FUNCTION (this << enable);
-  m_greenfieldSupported = enable;
-}
-
-bool
-HtConfiguration::GetGreenfieldSupported (void) const
-{
-  return m_greenfieldSupported;
-}
-
-void
-HtConfiguration::SetLdpcSupported (bool enable)
-{
-  NS_LOG_FUNCTION (this << enable);
-  m_ldpcSupported = enable;
-}
-
-bool
-HtConfiguration::GetLdpcSupported (void) const
-{
-  return m_ldpcSupported;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht-configuration.h ns-3.34/src/wifi/model/ht-configuration.h
--- ns-3.33/src/wifi/model/ht-configuration.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ht-configuration.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,100 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018  Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef HT_CONFIGURATION_H
-#define HT_CONFIGURATION_H
-
-#include "ns3/object.h"
-
-namespace ns3 {
-
-/**
- * \brief HT configuration
- * \ingroup wifi
- *
- * This object stores HT configuration information, for use in modifying
- * AP or STA behavior and for constructing HT-related information elements.
- *
- */
-class HtConfiguration : public Object
-{
-public:
-  HtConfiguration ();
-  virtual ~HtConfiguration ();
-
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-
-  /**
-   * Enable or disable SGI support.
-   *
-   * \param enable true if SGI is to be supported,
-   *               false otherwise
-   */
-  void SetShortGuardIntervalSupported (bool enable);
-  /**
-   * \return whether the device supports SGI.
-   *
-   * \return true if SGI is supported,
-   *         false otherwise.
-   */
-  bool GetShortGuardIntervalSupported (void) const;
-  /**
-   * Enable or disable Greenfield support.
-   *
-   * \param enable true if Greenfield is to be supported,
-   *               false otherwise
-   */
-  void SetGreenfieldSupported (bool enable);
-  /**
-   * \return whether the device supports Greenfield.
-   *
-   * \return true if Greenfield is supported,
-   *         false otherwise.
-   */
-  bool GetGreenfieldSupported (void) const;
-  /**
-   * Enable or disable LDPC support.
-   *
-   * \param enable true if LDPC is to be supported,
-   *               false otherwise
-   */
-  void SetLdpcSupported (bool enable);
-  /**
-   * \return whether the device supports LDPC.
-   *
-   * \return true if LDPC is supported,
-   *         false otherwise.
-   */
-  bool GetLdpcSupported (void) const;
-
-
-private:
-  bool m_sgiSupported;        ///< flag whether short guard interval is supported
-  bool m_greenfieldSupported; ///< flag whether Greenfield is supported
-  bool m_ldpcSupported;       ///< flag whether LDPC coding is supported
-};
-
-} //namespace ns3
-
-#endif /* HT_CONFIGURATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht-operation.cc ns-3.34/src/wifi/model/ht-operation.cc
--- ns-3.33/src/wifi/model/ht-operation.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ht-operation.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,520 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2016 Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "ht-operation.h"
-
-namespace ns3 {
-
-HtOperation::HtOperation ()
-  : m_primaryChannel (0),
-    m_secondaryChannelOffset (0),
-    m_staChannelWidth (0),
-    m_rifsMode (0),
-    m_reservedInformationSubset1 (0),
-    m_htProtection (0),
-    m_nonGfHtStasPresent (0),
-    m_reservedInformationSubset2_1 (0),
-    m_obssNonHtStasPresent (0),
-    m_reservedInformationSubset2_2 (0),
-    m_reservedInformationSubset3_1 (0),
-    m_dualBeacon (0),
-    m_dualCtsProtection (0),
-    m_stbcBeacon (0),
-    m_lSigTxopProtectionFullSupport (0),
-    m_pcoActive (0),
-    m_pcoPhase (0),
-    m_reservedInformationSubset3_2 (0),
-    m_reservedMcsSet1 (0),
-    m_rxHighestSupportedDataRate (0),
-    m_reservedMcsSet2 (0),
-    m_txMcsSetDefined (0),
-    m_txRxMcsSetUnequal (0),
-    m_txMaxNSpatialStreams (0),
-    m_txUnequalModulation (0),
-    m_reservedMcsSet3 (0),
-    m_htSupported (0)
-{
-  for (uint8_t k = 0; k < MAX_SUPPORTED_MCS; k++)
-    {
-      m_rxMcsBitmask[k] = 0;
-    }
-}
-
-WifiInformationElementId
-HtOperation::ElementId () const
-{
-  return IE_HT_OPERATION;
-}
-
-void
-HtOperation::SetHtSupported (uint8_t htSupported)
-{
-  m_htSupported = htSupported;
-}
-
-uint8_t
-HtOperation::GetInformationFieldSize () const
-{
-  //we should not be here if HT is not supported
-  NS_ASSERT (m_htSupported > 0);
-  return 22;
-}
-
-void
-HtOperation::SetPrimaryChannel (uint8_t ctrl)
-{
-  m_primaryChannel = ctrl;
-}
-
-void
-HtOperation::SetSecondaryChannelOffset (uint8_t secondaryChannelOffset)
-{
-  m_secondaryChannelOffset = secondaryChannelOffset;
-}
-
-void
-HtOperation::SetStaChannelWidth (uint8_t staChannelWidth)
-{
-  m_staChannelWidth = staChannelWidth;
-}
-
-void
-HtOperation::SetRifsMode (uint8_t rifsMode)
-{
-  m_rifsMode = rifsMode;
-}
-
-void
-HtOperation::SetHtProtection (uint8_t htProtection)
-{
-  m_htProtection = htProtection;
-}
-
-void
-HtOperation::SetNonGfHtStasPresent (uint8_t nonGfHtStasPresent)
-{
-  m_nonGfHtStasPresent = nonGfHtStasPresent;
-}
-
-void
-HtOperation::SetObssNonHtStasPresent (uint8_t obssNonHtStasPresent)
-{
-  m_obssNonHtStasPresent = obssNonHtStasPresent;
-}
-
-void
-HtOperation::SetDualBeacon (uint8_t dualBeacon)
-{
-  m_dualBeacon = dualBeacon;
-}
-
-void
-HtOperation::SetDualCtsProtection (uint8_t dualCtsProtection)
-{
-  m_dualCtsProtection = dualCtsProtection;
-}
-
-void
-HtOperation::SetStbcBeacon (uint8_t stbcBeacon)
-{
-  m_stbcBeacon = stbcBeacon;
-}
-
-void
-HtOperation::SetLSigTxopProtectionFullSupport (uint8_t lSigTxopProtectionFullSupport)
-{
-  m_lSigTxopProtectionFullSupport = lSigTxopProtectionFullSupport;
-}
-
-void
-HtOperation::SetPcoActive (uint8_t pcoActive)
-{
-  m_pcoActive = pcoActive;
-}
-
-void
-HtOperation::SetPhase (uint8_t pcoPhase)
-{
-  m_pcoPhase = pcoPhase;
-}
-
-void
-HtOperation::SetRxMcsBitmask (uint8_t index)
-{
-  m_rxMcsBitmask[index] = 1;
-}
-
-void
-HtOperation::SetRxHighestSupportedDataRate (uint16_t maxSupportedRate)
-{
-  m_rxHighestSupportedDataRate = maxSupportedRate;
-}
-
-void
-HtOperation::SetTxMcsSetDefined (uint8_t txMcsSetDefined)
-{
-  m_txMcsSetDefined = txMcsSetDefined;
-}
-
-void
-HtOperation::SetTxRxMcsSetUnequal (uint8_t txRxMcsSetUnequal)
-{
-  m_txRxMcsSetUnequal = txRxMcsSetUnequal;
-}
-
-void
-HtOperation::SetTxMaxNSpatialStreams (uint8_t maxTxSpatialStreams)
-{
-  m_txMaxNSpatialStreams = maxTxSpatialStreams - 1; //0 for 1 SS, 1 for 2 SSs, etc
-}
-
-void
-HtOperation::SetTxUnequalModulation (uint8_t txUnequalModulation)
-{
-  m_txUnequalModulation = txUnequalModulation;
-}
-
-uint8_t
-HtOperation::GetPrimaryChannel (void) const
-{
-  return m_primaryChannel;
-}
-
-uint8_t
-HtOperation::GetSecondaryChannelOffset (void) const
-{
-  return m_secondaryChannelOffset;
-}
-
-uint8_t
-HtOperation::GetStaChannelWidth (void) const
-{
-  return m_staChannelWidth;
-}
-
-uint8_t
-HtOperation::GetRifsMode (void) const
-{
-  return m_rifsMode;
-}
-
-uint8_t
-HtOperation::GetHtProtection (void) const
-{
-  return m_htProtection;
-}
-
-uint8_t
-HtOperation::GetNonGfHtStasPresent (void) const
-{
-  return m_nonGfHtStasPresent;
-}
-
-uint8_t
-HtOperation::GetObssNonHtStasPresent (void) const
-{
-  return m_obssNonHtStasPresent;
-}
-
-uint8_t
-HtOperation::GetDualBeacon (void) const
-{
-  return m_dualBeacon;
-}
-
-uint8_t
-HtOperation::GetDualCtsProtection (void) const
-{
-  return m_dualCtsProtection;
-}
-
-uint8_t
-HtOperation::GetStbcBeacon (void) const
-{
-  return m_stbcBeacon;
-}
-
-uint8_t
-HtOperation::GetLSigTxopProtectionFullSupport (void) const
-{
-  return m_lSigTxopProtectionFullSupport;
-}
-
-uint8_t
-HtOperation::GetPcoActive (void) const
-{
-  return m_pcoActive;
-}
-
-uint8_t
-HtOperation::GetPhase (void) const
-{
-  return m_pcoPhase;
-}
-
-bool
-HtOperation::IsSupportedMcs (uint8_t mcs) const
-{
-  if (m_rxMcsBitmask[mcs] == 1)
-    {
-      return true;
-    }
-  return false;
-}
-
-uint16_t
-HtOperation::GetRxHighestSupportedDataRate (void) const
-{
-  return m_rxHighestSupportedDataRate;
-}
-
-uint8_t
-HtOperation::GetTxMcsSetDefined (void) const
-{
-  return m_txMcsSetDefined;
-}
-
-uint8_t
-HtOperation::GetTxRxMcsSetUnequal (void) const
-{
-  return m_txRxMcsSetUnequal;
-}
-
-uint8_t
-HtOperation::GetTxMaxNSpatialStreams (void) const
-{
-  return m_txMaxNSpatialStreams;
-}
-
-uint8_t
-HtOperation::GetTxUnequalModulation (void) const
-{
-  return m_txUnequalModulation;
-}
-
-Buffer::Iterator
-HtOperation::Serialize (Buffer::Iterator i) const
-{
-  if (m_htSupported < 1)
-    {
-      return i;
-    }
-  return WifiInformationElement::Serialize (i);
-}
-
-uint16_t
-HtOperation::GetSerializedSize () const
-{
-  if (m_htSupported < 1)
-    {
-      return 0;
-    }
-  return WifiInformationElement::GetSerializedSize ();
-}
-
-uint8_t
-HtOperation::GetInformationSubset1 (void) const
-{
-  uint8_t val = 0;
-  val |= m_secondaryChannelOffset & 0x03;
-  val |= (m_staChannelWidth & 0x01) << 2;
-  val |= (m_rifsMode & 0x01) << 3;
-  val |= (m_reservedInformationSubset1 & 0x0f) << 4;
-  return val;
-}
-
-void
-HtOperation::SetInformationSubset1 (uint8_t ctrl)
-{
-  m_secondaryChannelOffset = ctrl & 0x03;
-  m_staChannelWidth = (ctrl >> 2) & 0x01;
-  m_rifsMode = (ctrl >> 3) & 0x01;
-  m_reservedInformationSubset1 = (ctrl >> 4) & 0x0f;
-}
-
-uint16_t
-HtOperation::GetInformationSubset2 (void) const
-{
-  uint16_t val = 0;
-  val |= m_htProtection & 0x03;
-  val |= (m_nonGfHtStasPresent & 0x01) << 2;
-  val |= (m_reservedInformationSubset2_1 & 0x01) << 3;
-  val |= (m_obssNonHtStasPresent & 0x01) << 4;
-  val |= (m_reservedInformationSubset2_2 & 0x07ff) << 5;
-  return val;
-}
-
-void
-HtOperation::SetInformationSubset2 (uint16_t ctrl)
-{
-  m_htProtection = ctrl & 0x03;
-  m_nonGfHtStasPresent = (ctrl >> 2) & 0x01;
-  m_reservedInformationSubset2_1 = (ctrl >> 3) & 0x01;
-  m_obssNonHtStasPresent = (ctrl >> 4) & 0x01;
-  m_reservedInformationSubset2_2 = static_cast<uint8_t> ((ctrl >> 5) & 0x07ff);
-}
-
-uint16_t
-HtOperation::GetInformationSubset3 (void) const
-{
-  uint16_t val = 0;
-  val |= m_reservedInformationSubset3_1 & 0x3f;
-  val |= (m_dualBeacon & 0x01) << 6;
-  val |= (m_dualCtsProtection & 0x01) << 7;
-  val |= (m_stbcBeacon & 0x01) << 8;
-  val |= (m_lSigTxopProtectionFullSupport & 0x01) << 9;
-  val |= (m_pcoActive & 0x01) << 10;
-  val |= (m_pcoPhase & 0x01) << 11;
-  val |= (m_reservedInformationSubset3_2 & 0x0f) << 12;
-  return val;
-}
-
-void
-HtOperation::SetInformationSubset3 (uint16_t ctrl)
-{
-  m_reservedInformationSubset3_1 = ctrl & 0x3f;
-  m_dualBeacon = (ctrl >> 6) & 0x01;
-  m_dualCtsProtection = (ctrl >> 7) & 0x01;
-  m_stbcBeacon = (ctrl >> 8) & 0x01;
-  m_lSigTxopProtectionFullSupport = (ctrl >> 9) & 0x01;
-  m_pcoActive = (ctrl >> 10) & 0x01;
-  m_pcoPhase = (ctrl >> 11) & 0x01;
-  m_reservedInformationSubset3_2 = (ctrl >> 12) & 0x0f;
-}
-
-void
-HtOperation::SetBasicMcsSet (uint64_t ctrl1, uint64_t ctrl2)
-{
-  for (uint64_t i = 0; i < 77; i++)
-    {
-      if (i < 64)
-        {
-          m_rxMcsBitmask[i] = (ctrl1 >> i) & 0x01;
-        }
-      else
-        {
-          m_rxMcsBitmask[i] = (ctrl2 >> (i - 64)) & 0x01;
-        }
-    }
-  m_reservedMcsSet1 = (ctrl2 >> 13) & 0x07;
-  m_rxHighestSupportedDataRate = (ctrl2 >> 16) & 0x03ff;
-  m_reservedMcsSet2 = (ctrl2 >> 26) & 0x3f;
-  m_txMcsSetDefined = (ctrl2 >> 32) & 0x01;
-  m_txRxMcsSetUnequal = (ctrl2 >> 33) & 0x01;
-  m_txMaxNSpatialStreams = (ctrl2 >> 34) & 0x03;
-  m_txUnequalModulation = (ctrl2 >> 36) & 0x01;
-  m_reservedMcsSet3 = (ctrl2 >> 37) & 0x07ffffff;
-}
-
-uint64_t
-HtOperation::GetBasicMcsSet1 (void) const
-{
-  uint64_t val = 0;
-  for (uint64_t i = 63; i > 0; i--)
-    {
-      val = (val << 1) | (m_rxMcsBitmask[i] & 0x01);
-    }
-  val = (val << 1) | (m_rxMcsBitmask[0] & 0x01);
-  return val;
-}
-
-uint64_t
-HtOperation::GetBasicMcsSet2 (void) const
-{
-  uint64_t val = 0;
-  val = val | (m_reservedMcsSet3 & 0x07ffffff);
-  val = (val << 1) | (m_txUnequalModulation & 0x01);
-  val = (val << 2) | (m_txMaxNSpatialStreams & 0x03);
-  val = (val << 1) | (m_txRxMcsSetUnequal & 0x01);
-  val = (val << 1) | (m_txMcsSetDefined & 0x01);
-  val = (val << 6) | (m_reservedMcsSet2 & 0x3f);
-  val = (val << 10) | (m_rxHighestSupportedDataRate & 0x3ff);
-  val = (val << 3) | (m_reservedMcsSet1 & 0x07);
-
-  for (uint64_t i = 13; i > 0; i--)
-    {
-      val = (val << 1) | ( m_rxMcsBitmask[i + 63] & 0x01);
-    }
-  return val;
-}
-
-void
-HtOperation::SerializeInformationField (Buffer::Iterator start) const
-{
-  if (m_htSupported == 1)
-    {
-      //write the corresponding value for each bit
-      start.WriteU8 (GetPrimaryChannel ());
-      start.WriteU8 (GetInformationSubset1 ());
-      start.WriteU16 (GetInformationSubset2 ());
-      start.WriteU16 (GetInformationSubset3 ());
-      start.WriteHtolsbU64 (GetBasicMcsSet1 ());
-      start.WriteHtolsbU64 (GetBasicMcsSet2 ());
-    }
-}
-
-uint8_t
-HtOperation::DeserializeInformationField (Buffer::Iterator start,
-                                          uint8_t length)
-{
-  Buffer::Iterator i = start;
-  uint8_t primarychannel = i.ReadU8 ();
-  uint8_t informationsubset1 = i.ReadU8 ();
-  uint16_t informationsubset2 = i.ReadU16 ();
-  uint16_t informationsubset3 = i.ReadU16 ();
-  uint64_t mcsset1 = i.ReadLsbtohU64 ();
-  uint64_t mcsset2 = i.ReadLsbtohU64 ();
-  SetPrimaryChannel (primarychannel);
-  SetInformationSubset1 (informationsubset1);
-  SetInformationSubset2 (informationsubset2);
-  SetInformationSubset3 (informationsubset3);
-  SetBasicMcsSet (mcsset1, mcsset2);
-  return length;
-}
-
-std::ostream &
-operator << (std::ostream &os, const HtOperation &htOperation)
-{
-  os << bool (htOperation.GetPrimaryChannel ())
-     << "|" << +htOperation.GetSecondaryChannelOffset ()
-     << "|" << bool (htOperation.GetStaChannelWidth ())
-     << "|" << bool (htOperation.GetRifsMode ())
-     << "|" << +htOperation.GetHtProtection ()
-     << "|" << bool (htOperation.GetNonGfHtStasPresent ())
-     << "|" << bool (htOperation.GetObssNonHtStasPresent ())
-     << "|" << bool (htOperation.GetDualBeacon ())
-     << "|" << bool (htOperation.GetDualCtsProtection ())
-     << "|" << bool (htOperation.GetStbcBeacon ())
-     << "|" << bool (htOperation.GetLSigTxopProtectionFullSupport ())
-     << "|" << bool (htOperation.GetPcoActive ())
-     << "|" << bool (htOperation.GetPhase ())
-     << "|" << htOperation.GetRxHighestSupportedDataRate ()
-     << "|" << bool (htOperation.GetTxMcsSetDefined ())
-     << "|" << bool (htOperation.GetTxRxMcsSetUnequal ())
-     << "|" << +htOperation.GetTxMaxNSpatialStreams ()
-     << "|" << bool (htOperation.GetTxUnequalModulation ()) << "|";
-  for (uint8_t i = 0; i < MAX_SUPPORTED_MCS; i++)
-    {
-      os << htOperation.IsSupportedMcs (i) << " ";
-    }
-  return os;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ht-operation.h ns-3.34/src/wifi/model/ht-operation.h
--- ns-3.33/src/wifi/model/ht-operation.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ht-operation.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,424 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2016 Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef HT_OPERATION_H
-#define HT_OPERATION_H
-
-#include "wifi-information-element.h"
-
-/**
- * This defines the maximum number of supported MCSs that a STA is
- * allowed to have. Currently this number is set for IEEE 802.11n
- */
-#define MAX_SUPPORTED_MCS  (77)
-
-namespace ns3 {
-
-/// HtProtectionType enumeration
-enum HtProtectionType
-{
-  NO_PROTECTION,
-  NON_MEMBER_PROTECTION,
-  TWENTY_MHZ_PROTECTION,
-  MIXED_MODE_PROTECTION
-};
-
-/**
- * \brief The HT Operation Information Element
- * \ingroup wifi
- *
- * This class knows how to serialise and deserialise
- * the HT Operation Information Element
- */
-class HtOperation : public WifiInformationElement
-{
-public:
-  HtOperation ();
-
-  // Implementations of pure virtual methods of WifiInformationElement
-  WifiInformationElementId ElementId () const;
-  uint8_t GetInformationFieldSize () const;
-  void SerializeInformationField (Buffer::Iterator start) const;
-  uint8_t DeserializeInformationField (Buffer::Iterator start,
-                                       uint8_t length);
-  /* This information element is a bit special in that it is only
-     included if the STA is an HT STA. To support this we
-     override the Serialize and GetSerializedSize methods of
-     WifiInformationElement. */
-  Buffer::Iterator Serialize (Buffer::Iterator start) const;
-  uint16_t GetSerializedSize () const;
-
-  /**
-   * Set the HT Supported.
-   *
-   * \param htSupported the HT Supported flag
-   */
-  void SetHtSupported (uint8_t htSupported);
-
-  /**
-   * Set the Primary Channel field in the HT Operation information element.
-   *
-   * \param ctrl the Primary Channel field in the HT Operation information element
-   */
-  void SetPrimaryChannel (uint8_t ctrl);
-  /**
-   * Set the Information Subset 1 field in the HT Operation information element.
-   *
-   * \param ctrl the Information Subset 1 field in the HT Operation information element
-   */
-  void SetInformationSubset1 (uint8_t ctrl);
-  /**
-   * Set the Information Subset 2 field in the HT Operation information element.
-   *
-   * \param ctrl the Information Subset 2 field in the HT Operation information element
-   */
-  void SetInformationSubset2 (uint16_t ctrl);
-  /**
-   * Set the Information Subset 3 field in the HT Operation information element.
-   *
-   * \param ctrl the Information Subset 3 field in the HT Operation information element
-   */
-  void SetInformationSubset3 (uint16_t ctrl);
-  /**
-   * Set the Basic MCS Set field in the HT Operation information element.
-   *
-   * \param ctrl1 the first 64 bytes of the Basic MCS Set field in the HT Operation information element
-   * \param ctrl2 the last 64 bytes of the Basic MCS Set field in the HT Operation information element
-   */
-  void SetBasicMcsSet (uint64_t ctrl1, uint64_t ctrl2);
-
-  /**
-   * Set the secondary channel offset.
-   *
-   * \param secondaryChannelOffset the secondary channel offset
-   */
-  void SetSecondaryChannelOffset (uint8_t secondaryChannelOffset);
-  /**
-   * Set the STA channel width.
-   *
-   * \param staChannelWidth the STA channel width
-   */
-  void SetStaChannelWidth (uint8_t staChannelWidth);
-  /**
-   * Set the RIFS mode.
-   *
-   * \param rifsMode the RIFS mode
-   */
-  void SetRifsMode (uint8_t rifsMode);
-
-  /**
-   * Set the HT protection.
-   *
-   * \param htProtection the HT protection
-   */
-  void SetHtProtection (uint8_t htProtection);
-  /**
-   * Set the non GF HT STAs present.
-   *
-   * \param nonGfHtStasPresent the non GF HT STAs present
-   */
-  void SetNonGfHtStasPresent (uint8_t nonGfHtStasPresent);
-  /**
-   * Set the OBSS non HT STAs present.
-   *
-   * \param obssNonHtStasPresent the OBSS non HTA STAs present
-   */
-  void SetObssNonHtStasPresent (uint8_t obssNonHtStasPresent);
-
-  /**
-   * Set the dual beacon.
-   *
-   * \param dualBeacon the dual beacon
-   */
-  void SetDualBeacon (uint8_t dualBeacon);
-  /**
-   * Set the dual CTS protection.
-   *
-   * \param dualCtsProtection the dual CTS protection
-   */
-  void SetDualCtsProtection (uint8_t dualCtsProtection);
-  /**
-   * Set the STBC beacon.
-   *
-   * \param stbcBeacon the STBC beacon
-   */
-  void SetStbcBeacon (uint8_t stbcBeacon);
-  /**
-   * Set the LSIG TXOP protection full support.
-   *
-   * \param lSigTxopProtectionFullSupport the LSIG TXOP protection full support
-   */
-  void SetLSigTxopProtectionFullSupport (uint8_t lSigTxopProtectionFullSupport);
-  /**
-   * Set the PCO active.
-   *
-   * \param pcoActive the PCO active
-   */
-  void SetPcoActive (uint8_t pcoActive);
-  /**
-   * Set the PCO phase.
-   *
-   * \param pcoPhase the PCO phase
-   */
-  void SetPhase (uint8_t pcoPhase);
-
-  /**
-   * Set the receive MCS bitmask.
-   *
-   * \param index the MCS bitmask
-   */
-  void SetRxMcsBitmask (uint8_t index);
-  /**
-   * Set the receive highest supported data rate.
-   *
-   * \param maxSupportedRate the maximum supported data rate
-   */
-  void SetRxHighestSupportedDataRate (uint16_t maxSupportedRate);
-  /**
-   * Set the transmit MCS set defined.
-   *
-   * \param txMcsSetDefined the transmit MCS set defined
-   */
-  void SetTxMcsSetDefined (uint8_t txMcsSetDefined);
-  /**
-   * Set the transmit / receive MCS set unequal.
-   *
-   * \param txRxMcsSetUnequal the transmit / receive MCS set unequal
-   */
-  void SetTxRxMcsSetUnequal (uint8_t txRxMcsSetUnequal);
-  /**
-   * Set the transmit maximum number spatial streams.
-   *
-   * \param maxTxSpatialStreams the maximum transmit spatial streams
-   */
-  void SetTxMaxNSpatialStreams (uint8_t maxTxSpatialStreams);
-  /**
-   * Set the transmit unequal modulation.
-   *
-   * \param txUnequalModulation the transmit unequal modulation
-   */
-  void SetTxUnequalModulation (uint8_t txUnequalModulation);
-
-  /**
-   * Return the Primary Channel field in the HT Operation information element.
-   *
-   * \return the Primary Channel field in the HT Operation information element
-   */
-  uint8_t GetPrimaryChannel (void) const;
-  /**
-   * Return the Information Subset 1 field in the HT Operation information element.
-   *
-   * \return the Information Subset 1 field in the HT Operation information element
-   */
-  uint8_t GetInformationSubset1 (void) const;
-  /**
-   * Return the Information Subset 2 field in the HT Operation information element.
-   *
-   * \return the Information Subset 2 field in the HT Operation information element
-   */
-  uint16_t GetInformationSubset2 (void) const;
-  /**
-   * Return the Information Subset 3 field in the HT Operation information element.
-   *
-   * \return the Information Subset 3 field in the HT Operation information element
-   */
-  uint16_t GetInformationSubset3 (void) const;
-  /**
-   * Return the first 64 bytes of the Basic MCS Set field in the HT Operation information element.
-   *
-   * \return the first 64 bytes of the Basic MCS Set field in the HT Operation information element
-   */
-  uint64_t GetBasicMcsSet1 (void) const;
-  /**
-   * Return the last 64 bytes of the Basic MCS Set field in the HT Operation information element.
-   *
-   * \return the last 64 bytes of the Basic MCS Set field in the HT Operation information element
-   */
-  uint64_t GetBasicMcsSet2 (void) const;
-
-  /**
-   * Return the secondary channel offset.
-   *
-   * \return the secondary channel offset
-   */
-  uint8_t GetSecondaryChannelOffset (void) const;
-  /**
-   * Return the STA channel width.
-   *
-   * \return the STA channel width
-   */
-  uint8_t GetStaChannelWidth (void) const;
-  /**
-   * Return the RIFS mode.
-   *
-   * \return the RIFS mode
-   */
-  uint8_t GetRifsMode (void) const;
-
-  /**
-   * Return the HT protection.
-   *
-   * \return the HT protection
-   */
-  uint8_t GetHtProtection (void) const;
-  /**
-   * Return the non GF HT STAs present.
-   *
-   * \return the non GF HT STAs present
-   */
-  uint8_t GetNonGfHtStasPresent (void) const;
-  /**
-   * Return the OBSS non HT STAs present.
-   *
-   * \return the OBSS non HT STAs present
-   */
-  uint8_t GetObssNonHtStasPresent (void) const;
-
-  /**
-   * Return dual beacon.
-   *
-   * \return the dual beacon
-   */
-  uint8_t GetDualBeacon (void) const;
-  /**
-   * Return dual CTS protection.
-   *
-   * \return the dual CTS protection
-   */
-  uint8_t GetDualCtsProtection (void) const;
-  /**
-   * Return STBC beacon.
-   *
-   * \return the STBC beacon
-   */
-  uint8_t GetStbcBeacon (void) const;
-  /**
-   * Return LSIG TXOP protection full support.
-   *
-   * \return the LSIG TXOP protection full support
-   */
-  uint8_t GetLSigTxopProtectionFullSupport (void) const;
-  /**
-   * Return PCO active.
-   *
-   * \return the PCO active
-   */
-  uint8_t GetPcoActive (void) const;
-  /**
-   * Return phase.
-   *
-   * \return the phase
-   */
-  uint8_t GetPhase (void) const;
-
-  /**
-   * Return MCS is supported.
-   *
-   * \param mcs MCS
-   *\
-   * \return the MCS is supported
-   */
-  bool IsSupportedMcs (uint8_t mcs) const;
-  /**
-   * Return receive highest supported data rate.
-   *
-   * \return receive highest supported data rate
-   */
-  uint16_t GetRxHighestSupportedDataRate (void) const;
-  /**
-   * Return transmit MCS set defined.
-   *
-   * \return the transmit MCS set defined
-   */
-  uint8_t GetTxMcsSetDefined (void) const;
-  /**
-   * Return transmit / receive MCS set unequal.
-   *
-   * \return transmit / receive MCS set unequal
-   */
-  uint8_t GetTxRxMcsSetUnequal (void) const;
-  /**
-   * Return transmit maximum number spatial streams.
-   *
-   * \return transmit maximum number spatial streams
-   */
-  uint8_t GetTxMaxNSpatialStreams (void) const;
-  /**
-   * Return transmit unequal modulation.
-   *
-   * \return transmit unequal modulation
-   */
-  uint8_t GetTxUnequalModulation (void) const;
-
-
-private:
-  uint8_t m_primaryChannel; ///< primary channel
-
-  //HT Information Subset 1
-  uint8_t m_secondaryChannelOffset;     ///< secondary channel offset
-  uint8_t m_staChannelWidth;            ///< STA channel width
-  uint8_t m_rifsMode;                   ///< RIFS mode
-  uint8_t m_reservedInformationSubset1; ///< reserved information subset 1
-
-  //HT Information Subset 2
-  uint8_t m_htProtection;                 ///< HT protection
-  uint8_t m_nonGfHtStasPresent;           ///< non GF HT STAs present
-  uint8_t m_reservedInformationSubset2_1; ///< reserved information subset 2-1
-  uint8_t m_obssNonHtStasPresent;         ///< OBSS NON HT STAs present
-  uint8_t m_reservedInformationSubset2_2; ///< reserved information subset 2-2
-
-  //HT Information Subset 3
-  uint8_t m_reservedInformationSubset3_1;  ///< reserved information subset 3-1
-  uint8_t m_dualBeacon;                    ///< dual beacon
-  uint8_t m_dualCtsProtection;             ///< dual CTS protection
-  uint8_t m_stbcBeacon;                    ///< STBC beacon
-  uint8_t m_lSigTxopProtectionFullSupport; ///< L-SIG TXOP protection full support
-  uint8_t m_pcoActive;                     ///< PCO active
-  uint8_t m_pcoPhase;                      ///< PCO phase
-  uint8_t m_reservedInformationSubset3_2;  ///< reserved information subset 3-2
-
-  //Basic MCS Set field
-  uint8_t m_reservedMcsSet1;                 ///< reserved MCS set 1
-  uint16_t m_rxHighestSupportedDataRate;     ///< receive highest supported data rate
-  uint8_t m_reservedMcsSet2;                 ///< reserved MCS set2
-  uint8_t m_txMcsSetDefined;                 ///< transmit MCS set defined
-  uint8_t m_txRxMcsSetUnequal;               ///< transmit / receive MCS set unequal
-  uint8_t m_txMaxNSpatialStreams;            ///< transmit maximum number spatial streams
-  uint8_t m_txUnequalModulation;             ///< transmit unequal modulation
-  uint32_t m_reservedMcsSet3;                ///< reserved MCS set 3
-  uint8_t m_rxMcsBitmask[MAX_SUPPORTED_MCS]; ///< receive MCS bitmask
-
-  /// This is used to decide whether this element should be added to the frame or not
-  uint8_t m_htSupported;
-};
-
-/**
- * output stream output operator
- *
- * \param os output stream
- * \param htOperation the HT operation
- *
- * \returns output stream
- */
-std::ostream &operator << (std::ostream &os, const HtOperation &htOperation);
-
-} //namespace ns3
-
-#endif /* HT_OPERATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ideal-wifi-manager.cc ns-3.34/src/wifi/model/ideal-wifi-manager.cc
--- ns-3.33/src/wifi/model/ideal-wifi-manager.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ideal-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,591 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#include <algorithm>
-#include "ns3/log.h"
-#include "ideal-wifi-manager.h"
-#include "wifi-phy.h"
-
-namespace ns3 {
-
-/**
- * \brief hold per-remote-station state for Ideal Wifi manager.
- *
- * This struct extends from WifiRemoteStation struct to hold additional
- * information required by the Ideal Wifi manager
- */
-struct IdealWifiRemoteStation : public WifiRemoteStation
-{
-  double m_lastSnrObserved;            //!< SNR of most recently reported packet sent to the remote station
-  uint16_t m_lastChannelWidthObserved; //!< Channel width (in MHz) of most recently reported packet sent to the remote station
-  uint16_t m_lastNssObserved;          //!<  Number of spatial streams of most recently reported packet sent to the remote station
-  double m_lastSnrCached;              //!< SNR most recently used to select a rate
-  uint8_t m_lastNss;                   //!< Number of spatial streams most recently used to the remote station
-  WifiMode m_lastMode;                 //!< Mode most recently used to the remote station
-  uint16_t m_lastChannelWidth;         //!< Channel width (in MHz) most recently used to the remote station
-};
-
-/// To avoid using the cache before a valid value has been cached
-static const double CACHE_INITIAL_VALUE = -100;
-
-NS_OBJECT_ENSURE_REGISTERED (IdealWifiManager);
-
-NS_LOG_COMPONENT_DEFINE ("IdealWifiManager");
-
-TypeId
-IdealWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::IdealWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<IdealWifiManager> ()
-    .AddAttribute ("BerThreshold",
-                   "The maximum Bit Error Rate acceptable at any transmission mode",
-                   DoubleValue (1e-6),
-                   MakeDoubleAccessor (&IdealWifiManager::m_ber),
-                   MakeDoubleChecker<double> ())
-    .AddTraceSource ("Rate",
-                     "Traced value for rate changes (b/s)",
-                     MakeTraceSourceAccessor (&IdealWifiManager::m_currentRate),
-                     "ns3::TracedValueCallback::Uint64")
-  ;
-  return tid;
-}
-
-IdealWifiManager::IdealWifiManager ()
-  : m_currentRate (0)
-{
-  NS_LOG_FUNCTION (this);
-}
-
-IdealWifiManager::~IdealWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-IdealWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
-{
-  NS_LOG_FUNCTION (this << phy);
-  WifiRemoteStationManager::SetupPhy (phy);
-}
-
-uint16_t
-IdealWifiManager::GetChannelWidthForNonHtMode (WifiMode mode) const
-{
-  NS_ASSERT (mode.GetModulationClass () != WIFI_MOD_CLASS_HT
-             && mode.GetModulationClass () != WIFI_MOD_CLASS_VHT
-             && mode.GetModulationClass () != WIFI_MOD_CLASS_HE);
-  if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS
-      || mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS)
-    {
-      return 22;
-    }
-  else
-    {
-      return 20;
-    }
-}
-
-void
-IdealWifiManager::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  BuildSnrThresholds ();
-}
-
-void
-IdealWifiManager::BuildSnrThresholds (void)
-{
-  m_thresholds.clear ();
-  WifiMode mode;
-  WifiTxVector txVector;
-  uint8_t nss = 1;
-  uint8_t nModes = GetPhy ()->GetNModes ();
-  for (uint8_t i = 0; i < nModes; i++)
-    {
-      mode = GetPhy ()->GetMode (i);
-      txVector.SetChannelWidth (GetChannelWidthForNonHtMode (mode));
-      txVector.SetNss (nss);
-      txVector.SetMode (mode);
-      NS_LOG_DEBUG ("Adding mode = " << mode.GetUniqueName ());
-      AddSnrThreshold (txVector, GetPhy ()->CalculateSnr (txVector, m_ber));
-    }
-  // Add all MCSes
-  if (GetHtSupported ())
-    {
-      nModes = GetPhy ()->GetNMcs ();
-      for (uint8_t i = 0; i < nModes; i++)
-        {
-          for (uint16_t j = 20; j <= GetPhy ()->GetChannelWidth (); j *= 2)
-            {
-              txVector.SetChannelWidth (j);
-              mode = GetPhy ()->GetMcs (i);
-              if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
-                {
-                  uint16_t guardInterval = GetShortGuardIntervalSupported () ? 400 : 800;
-                  txVector.SetGuardInterval (guardInterval);
-                  //derive NSS from the MCS index
-                  nss = (mode.GetMcsValue () / 8) + 1;
-                  NS_LOG_DEBUG ("Adding mode = " << mode.GetUniqueName () <<
-                                " channel width " << j <<
-                                " nss " << +nss <<
-                                " GI " << guardInterval);
-                  txVector.SetNss (nss);
-                  txVector.SetMode (mode);
-                  AddSnrThreshold (txVector, GetPhy ()->CalculateSnr (txVector, m_ber));
-                }
-              else //VHT or HE
-                {
-                  uint16_t guardInterval;
-                  if (mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
-                    {
-                      guardInterval = GetShortGuardIntervalSupported () ? 400 : 800;
-                    }
-                  else
-                    {
-                      guardInterval = GetGuardInterval ();
-                    }
-                  txVector.SetGuardInterval (guardInterval);
-                  for (uint8_t k = 1; k <= GetPhy ()->GetMaxSupportedTxSpatialStreams (); k++)
-                    {
-                      if (mode.IsAllowed (j, k))
-                        {
-                          NS_LOG_DEBUG ("Adding mode = " << mode.GetUniqueName () <<
-                                        " channel width " << j <<
-                                        " nss " << +k <<
-                                        " GI " << guardInterval);
-                          txVector.SetNss (k);
-                          txVector.SetMode (mode);
-                          AddSnrThreshold (txVector, GetPhy ()->CalculateSnr (txVector, m_ber));
-                        }
-                      else
-                        {
-                          NS_LOG_DEBUG ("Mode = " << mode.GetUniqueName () << " disallowed");
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-double
-IdealWifiManager::GetSnrThreshold (WifiTxVector txVector)
-{
-  NS_LOG_FUNCTION (this << txVector);
-  auto it = std::find_if (m_thresholds.begin (), m_thresholds.end (),
-      [&txVector] (const std::pair<double, WifiTxVector>& p) -> bool {
-          return ((txVector.GetMode () == p.second.GetMode ()) && (txVector.GetNss () == p.second.GetNss ()) && (txVector.GetChannelWidth () == p.second.GetChannelWidth ()));
-      }
-  );
-  if (it == m_thresholds.end ())
-    {
-      //This means capabilities have changed in runtime, hence rebuild SNR thresholds
-      BuildSnrThresholds ();
-      it = std::find_if (m_thresholds.begin (), m_thresholds.end (),
-          [&txVector] (const std::pair<double, WifiTxVector>& p) -> bool {
-              return ((txVector.GetMode () == p.second.GetMode ()) && (txVector.GetNss () == p.second.GetNss ()) && (txVector.GetChannelWidth () == p.second.GetChannelWidth ()));
-          }
-      );
-      NS_ASSERT_MSG (it != m_thresholds.end (), "SNR threshold not found");
-  }
-  return it->first;
-}
-
-void
-IdealWifiManager::AddSnrThreshold (WifiTxVector txVector, double snr)
-{
-  NS_LOG_FUNCTION (this << txVector.GetMode ().GetUniqueName () << txVector.GetChannelWidth () << snr);
-  m_thresholds.push_back (std::make_pair (snr, txVector));
-}
-
-WifiRemoteStation *
-IdealWifiManager::DoCreateStation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  IdealWifiRemoteStation *station = new IdealWifiRemoteStation ();
-  Reset (station);
-  return station;
-}
-
-void
-IdealWifiManager::Reset (WifiRemoteStation *station) const
-{
-  NS_LOG_FUNCTION (this << station);
-  IdealWifiRemoteStation *st = static_cast<IdealWifiRemoteStation*> (station);
-  st->m_lastSnrObserved = 0.0;
-  st->m_lastChannelWidthObserved = 0;
-  st->m_lastNssObserved = 1;
-  st->m_lastSnrCached = CACHE_INITIAL_VALUE;
-  st->m_lastMode = GetDefaultMode ();
-  st->m_lastChannelWidth = 0;
-  st->m_lastNss = 1;
-}
-
-void
-IdealWifiManager::DoReportRxOk (WifiRemoteStation *station, double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
-}
-
-void
-IdealWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void
-IdealWifiManager::DoReportDataFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void
-IdealWifiManager::DoReportRtsOk (WifiRemoteStation *st,
-                                 double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode.GetUniqueName () << rtsSnr);
-  IdealWifiRemoteStation *station = static_cast<IdealWifiRemoteStation*> (st);
-  station->m_lastSnrObserved = rtsSnr;
-  station->m_lastChannelWidthObserved = GetPhy ()->GetChannelWidth () >= 40 ? 20 : GetPhy ()->GetChannelWidth ();
-  station->m_lastNssObserved = 1;
-}
-
-void
-IdealWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                  double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode.GetUniqueName () << dataSnr << dataChannelWidth << +dataNss);
-  IdealWifiRemoteStation *station = static_cast<IdealWifiRemoteStation*> (st);
-  if (dataSnr == 0)
-    {
-      NS_LOG_WARN ("DataSnr reported to be zero; not saving this report.");
-      return;
-    }
-  station->m_lastSnrObserved = dataSnr;
-  station->m_lastChannelWidthObserved = dataChannelWidth;
-  station->m_lastNssObserved = dataNss;
-}
-
-void
-IdealWifiManager::DoReportAmpduTxStatus (WifiRemoteStation *st, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus,
-                                         double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << +nSuccessfulMpdus << +nFailedMpdus << rxSnr << dataSnr << dataChannelWidth << +dataNss);
-  IdealWifiRemoteStation *station = static_cast<IdealWifiRemoteStation*> (st);
-  if (dataSnr == 0)
-    {
-      NS_LOG_WARN ("DataSnr reported to be zero; not saving this report.");
-      return;
-    }
-  station->m_lastSnrObserved = dataSnr;
-  station->m_lastChannelWidthObserved = dataChannelWidth;
-  station->m_lastNssObserved = dataNss;
-}
-
-void
-IdealWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  Reset (station);
-}
-
-void
-IdealWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  Reset (station);
-}
-
-WifiTxVector
-IdealWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  IdealWifiRemoteStation *station = static_cast<IdealWifiRemoteStation*> (st);
-  //We search within the Supported rate set the mode with the
-  //highest data rate for which the SNR threshold is smaller than m_lastSnr
-  //to ensure correct packet delivery.
-  WifiMode maxMode = GetDefaultMode ();
-  WifiTxVector txVector;
-  WifiMode mode;
-  uint64_t bestRate = 0;
-  uint8_t selectedNss = 1;
-  uint16_t guardInterval;
-  uint16_t channelWidth = std::min (GetChannelWidth (station), GetPhy ()->GetChannelWidth ());
-  txVector.SetChannelWidth (channelWidth);
-  if ((station->m_lastSnrCached != CACHE_INITIAL_VALUE) && (station->m_lastSnrObserved == station->m_lastSnrCached) && (channelWidth == station->m_lastChannelWidth))
-    {
-      // SNR has not changed, so skip the search and use the last mode selected
-      maxMode = station->m_lastMode;
-      selectedNss = station->m_lastNss;
-      NS_LOG_DEBUG ("Using cached mode = " << maxMode.GetUniqueName () <<
-                    " last snr observed " << station->m_lastSnrObserved <<
-                    " cached " << station->m_lastSnrCached <<
-                    " channel width " << station->m_lastChannelWidth <<
-                    " nss " << +selectedNss);
-    }
-  else
-    {
-      if (GetHtSupported () && GetHtSupported (st))
-        {
-          for (uint8_t i = 0; i < GetNMcsSupported (station); i++)
-            {
-              mode = GetMcsSupported (station, i);
-              txVector.SetMode (mode);
-              if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
-                {
-                  guardInterval = static_cast<uint16_t> (std::max (GetShortGuardIntervalSupported (station) ? 400 : 800, GetShortGuardIntervalSupported () ? 400 : 800));
-                  txVector.SetGuardInterval (guardInterval);
-                  // If the node and peer are both VHT capable, only search VHT modes
-                  if (GetVhtSupported () && GetVhtSupported (station))
-                    {
-                      continue;
-                    }
-                  // If the node and peer are both HE capable, only search HE modes
-                  if (GetHeSupported () && GetHeSupported (station))
-                    {
-                      continue;
-                    }
-                  // Derive NSS from the MCS index. There is a different mode for each possible NSS value.
-                  uint8_t nss = (mode.GetMcsValue () / 8) + 1;
-                  txVector.SetNss (nss);
-                  if (!txVector.IsValid ()
-                      || nss > std::min (GetMaxNumberOfTransmitStreams (), GetNumberOfSupportedStreams (st)))
-                    {
-                      NS_LOG_DEBUG ("Skipping mode " << mode.GetUniqueName () <<
-                                    " nss " << +nss <<
-                                    " width " << txVector.GetChannelWidth ());
-                      continue;
-                    }
-                  double threshold = GetSnrThreshold (txVector);
-                  uint64_t dataRate = mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), nss);
-                  NS_LOG_DEBUG ("Testing mode " << mode.GetUniqueName () <<
-                                " data rate " << dataRate <<
-                                " threshold " << threshold  << " last snr observed " <<
-                                station->m_lastSnrObserved << " cached " <<
-                                station->m_lastSnrCached);
-                  double snr = GetLastObservedSnr (station, channelWidth, nss);
-                  if (dataRate > bestRate && threshold < snr)
-                    {
-                      NS_LOG_DEBUG ("Candidate mode = " << mode.GetUniqueName () <<
-                                    " data rate " << dataRate <<
-                                    " threshold " << threshold  <<
-                                    " channel width " << channelWidth <<
-                                    " snr " << snr);
-                      bestRate = dataRate;
-                      maxMode = mode;
-                      selectedNss = nss;
-                    }
-                }
-              else if (mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
-                {
-                  guardInterval = static_cast<uint16_t> (std::max (GetShortGuardIntervalSupported (station) ? 400 : 800, GetShortGuardIntervalSupported () ? 400 : 800));
-                  txVector.SetGuardInterval (guardInterval);
-                  // If the node and peer are both HE capable, only search HE modes
-                  if (GetHeSupported () && GetHeSupported (station))
-                    {
-                      continue;
-                    }
-                  // If the node and peer are not both VHT capable, only search HT modes
-                  if (!GetVhtSupported () || !GetVhtSupported (station))
-                    {
-                      continue;
-                    }
-                  for (uint8_t nss = 1; nss <= std::min (GetMaxNumberOfTransmitStreams (), GetNumberOfSupportedStreams (station)); nss++)
-                    {
-                      txVector.SetNss (nss);
-                      if (!txVector.IsValid ())
-                        {
-                          NS_LOG_DEBUG ("Skipping mode " << mode.GetUniqueName () <<
-                                        " nss " << +nss <<
-                                        " width " << txVector.GetChannelWidth ());
-                          continue;
-                        }
-                      double threshold = GetSnrThreshold (txVector);
-                      uint64_t dataRate = mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), nss);
-                      NS_LOG_DEBUG ("Testing mode = " << mode.GetUniqueName () <<
-                                    " data rate " << dataRate <<
-                                    " threshold " << threshold << " last snr observed " <<
-                                    station->m_lastSnrObserved << " cached " <<
-                                    station->m_lastSnrCached);
-                      double snr = GetLastObservedSnr (station, channelWidth, nss);
-                      if (dataRate > bestRate && threshold < snr)
-                        {
-                          NS_LOG_DEBUG ("Candidate mode = " << mode.GetUniqueName () <<
-                                        " data rate " << dataRate <<
-                                        " channel width " << channelWidth <<
-                                        " snr " << snr);
-                          bestRate = dataRate;
-                          maxMode = mode;
-                          selectedNss = nss;
-                        }
-                    }
-                }
-              else //HE
-                {
-                  guardInterval = std::max (GetGuardInterval (station), GetGuardInterval ());
-                  txVector.SetGuardInterval (guardInterval);
-                  // If the node and peer are not both HE capable, only search (V)HT modes
-                  if (!GetHeSupported () || !GetHeSupported (station))
-                    {
-                      continue;
-                    }
-                  for (uint8_t nss = 1; nss <= std::min (GetMaxNumberOfTransmitStreams (), GetNumberOfSupportedStreams (station)); nss++)
-                    {
-                      txVector.SetNss (nss);
-                      if (!txVector.IsValid ())
-                        {
-                          NS_LOG_DEBUG ("Skipping mode " << mode.GetUniqueName () <<
-                                        " nss " << +nss <<
-                                        " width " << +txVector.GetChannelWidth ());
-                          continue;
-                        }
-                      double threshold = GetSnrThreshold (txVector);
-                      uint64_t dataRate = mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), nss);
-                      NS_LOG_DEBUG ("Testing mode = " << mode.GetUniqueName () <<
-                                    " data rate " << dataRate <<
-                                    " threshold " << threshold  << " last snr observed " <<
-                                    station->m_lastSnrObserved << " cached " <<
-                                    station->m_lastSnrCached);
-                      double snr = GetLastObservedSnr (station, channelWidth, nss);
-                      if (dataRate > bestRate && threshold < snr)
-                        {
-                          NS_LOG_DEBUG ("Candidate mode = " << mode.GetUniqueName () <<
-                                        " data rate " << dataRate <<
-                                        " threshold " << threshold  <<
-                                        " channel width " << channelWidth <<
-                                        " snr " << snr);
-                          bestRate = dataRate;
-                          maxMode = mode;
-                          selectedNss = nss;
-                        }
-                    }
-                }
-            }
-        }
-      else
-        {
-          // Non-HT selection
-          selectedNss = 1;
-          for (uint8_t i = 0; i < GetNSupported (station); i++)
-            {
-              mode = GetSupported (station, i);
-              txVector.SetMode (mode);
-              txVector.SetNss (selectedNss);
-              uint16_t channelWidth = GetChannelWidthForNonHtMode (mode);
-              txVector.SetChannelWidth (channelWidth);
-              double threshold = GetSnrThreshold (txVector);
-              uint64_t dataRate = mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), txVector.GetNss ());
-              NS_LOG_DEBUG ("mode = " << mode.GetUniqueName () <<
-                            " threshold " << threshold  <<
-                            " last snr observed " <<
-                            station->m_lastSnrObserved);
-              double snr = GetLastObservedSnr (station, channelWidth, 1);
-              if (dataRate > bestRate && threshold < snr)
-                {
-                  NS_LOG_DEBUG ("Candidate mode = " << mode.GetUniqueName () <<
-                                " data rate " << dataRate <<
-                                " threshold " << threshold  <<
-                                " snr " << snr);
-                  bestRate = dataRate;
-                  maxMode = mode;
-                }
-            }
-        }
-      NS_LOG_DEBUG ("Updating cached values for station to " <<  maxMode.GetUniqueName () << " snr " << station->m_lastSnrObserved);
-      station->m_lastSnrCached = station->m_lastSnrObserved;
-      station->m_lastMode = maxMode;
-      station->m_lastNss = selectedNss;
-    }
-  NS_LOG_DEBUG ("Found maxMode: " << maxMode << " channelWidth: " << channelWidth << " nss: " << +selectedNss);
-  station->m_lastChannelWidth = channelWidth;
-  if (maxMode.GetModulationClass () == WIFI_MOD_CLASS_HE)
-    {
-      guardInterval = std::max (GetGuardInterval (station), GetGuardInterval ());
-    }
-  else if ((maxMode.GetModulationClass () == WIFI_MOD_CLASS_HT) || (maxMode.GetModulationClass () == WIFI_MOD_CLASS_VHT))
-    {
-      guardInterval = static_cast<uint16_t> (std::max (GetShortGuardIntervalSupported (station) ? 400 : 800, GetShortGuardIntervalSupported () ? 400 : 800));
-    }
-  else
-    {
-      guardInterval = 800;
-    }
-  if (m_currentRate != maxMode.GetDataRate (channelWidth, guardInterval, selectedNss))
-    {
-      NS_LOG_DEBUG ("New datarate: " << maxMode.GetDataRate (channelWidth, guardInterval, selectedNss));
-      m_currentRate = maxMode.GetDataRate (channelWidth, guardInterval, selectedNss);
-    }
-  return WifiTxVector (maxMode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (maxMode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), guardInterval, GetNumberOfAntennas (), selectedNss, 0, GetChannelWidthForTransmission (maxMode, channelWidth), GetAggregation (station));
-}
-
-WifiTxVector
-IdealWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  IdealWifiRemoteStation *station = static_cast<IdealWifiRemoteStation*> (st);
-  //We search within the Basic rate set the mode with the highest
-  //SNR threshold possible which is smaller than m_lastSnr to
-  //ensure correct packet delivery.
-  double maxThreshold = 0.0;
-  WifiTxVector txVector;
-  WifiMode mode;
-  uint8_t nss = 1;
-  WifiMode maxMode = GetDefaultMode ();
-  //RTS is sent in a non-HT frame
-  for (uint8_t i = 0; i < GetNBasicModes (); i++)
-    {
-      mode = GetBasicMode (i);
-      txVector.SetMode (mode);
-      txVector.SetNss (nss);
-      txVector.SetChannelWidth (GetChannelWidthForNonHtMode (mode));
-      double threshold = GetSnrThreshold (txVector);
-      if (threshold > maxThreshold && threshold < station->m_lastSnrObserved)
-        {
-          maxThreshold = threshold;
-          maxMode = mode;
-        }
-    }
-  return WifiTxVector (maxMode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (maxMode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, GetNumberOfAntennas (), nss, 0, GetChannelWidthForNonHtMode (maxMode), GetAggregation (station));
-}
-
-double
-IdealWifiManager::GetLastObservedSnr (IdealWifiRemoteStation *station, uint16_t channelWidth, uint8_t nss) const
-{
-  double snr = station->m_lastSnrObserved;
-  if (channelWidth != station->m_lastChannelWidthObserved)
-    {
-      snr /= (static_cast<double> (channelWidth) / station->m_lastChannelWidthObserved);
-    }
-  if (nss != station->m_lastNssObserved)
-    {
-      snr /= (static_cast<double> (nss) / station->m_lastNssObserved);
-    }
-  NS_LOG_DEBUG ("Last observed SNR is " << station->m_lastSnrObserved <<
-                " for channel width " << station->m_lastChannelWidthObserved <<
-                " and nss " << +station->m_lastNssObserved <<
-                "; computed SNR is " << snr <<
-                " for channel width " << channelWidth <<
-                " and nss " << +nss);
-  return snr;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ideal-wifi-manager.h ns-3.34/src/wifi/model/ideal-wifi-manager.h
--- ns-3.33/src/wifi/model/ideal-wifi-manager.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/ideal-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,142 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#ifndef IDEAL_WIFI_MANAGER_H
-#define IDEAL_WIFI_MANAGER_H
-
-#include "ns3/traced-value.h"
-#include "wifi-remote-station-manager.h"
-
-namespace ns3 {
-
-struct IdealWifiRemoteStation;
-
-/**
- * \brief Ideal rate control algorithm
- * \ingroup wifi
- *
- * This class implements an 'ideal' rate control algorithm
- * similar to RBAR in spirit (see <i>A rate-adaptive MAC
- * protocol for multihop wireless networks</i> by G. Holland,
- * N. Vaidya, and P. Bahl.): every station keeps track of the
- * SNR of every packet received and sends back this SNR to the
- * original transmitter by an out-of-band mechanism. Each
- * transmitter keeps track of the last SNR sent back by a receiver
- * and uses it to pick a transmission mode based on a set
- * of SNR thresholds built from a target BER and transmission
- * mode-specific SNR/BER curves.
- */
-class IdealWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  IdealWifiManager ();
-  virtual ~IdealWifiManager ();
-
-  void SetupPhy (const Ptr<WifiPhy> phy);
-
-
-private:
-  //overridden from base class
-  void DoInitialize (void);
-  WifiRemoteStation* DoCreateStation (void) const;
-  void DoReportRxOk (WifiRemoteStation *station,
-                     double rxSnr, WifiMode txMode);
-  void DoReportRtsFailed (WifiRemoteStation *station);
-  void DoReportDataFailed (WifiRemoteStation *station);
-  void DoReportRtsOk (WifiRemoteStation *station,
-                      double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportAmpduTxStatus (WifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus,
-                              double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  void DoReportFinalDataFailed (WifiRemoteStation *station);
-  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-
-  /**
-   * Reset the station, invoked if the maximum amount of retries has failed.
-   */
-  void Reset (WifiRemoteStation *station) const;
-
-  /**
-   * Construct the vector of minimum SNRs needed to successfully transmit for
-   * all possible combinations (rate, channel width, nss) based on PHY capabilities.
-   * This is called at initialization and if PHY capabilities changed.
-   */
-  void BuildSnrThresholds (void);
-
-  /**
-   * Return the minimum SNR needed to successfully transmit
-   * data with this WifiTxVector at the specified BER.
-   *
-   * \param txVector WifiTxVector (containing valid mode, width, and Nss)
-   *
-   * \return the minimum SNR for the given WifiTxVector in linear scale
-   */
-  double GetSnrThreshold (WifiTxVector txVector);
-  /**
-   * Adds a pair of WifiTxVector and the minimum SNR for that given vector
-   * to the list.
-   *
-   * \param txVector the WifiTxVector storing mode, channel width, and Nss
-   * \param snr the minimum SNR for the given txVector in linear scale
-   */
-  void AddSnrThreshold (WifiTxVector txVector, double snr);
-
-  /**
-   * Convenience function for selecting a channel width for non-HT mode
-   * \param mode non-HT WifiMode
-   * \return the channel width (MHz) for the selected mode
-   */
-  uint16_t GetChannelWidthForNonHtMode (WifiMode mode) const;
-
-  /**
-   * Convenience function to get the last observed SNR from a given station for a given channel width and a given NSS.
-   * Since the previously received SNR information might be related to a different channel width than the requested one,
-   * and/or a different NSS,  the function does some computations to get the corresponding SNR.
-   *
-   * \param station the station being queried
-   * \param channelWidth the channel width (in MHz)
-   * \param nss the number of spatial streams
-   * \return the SNR in linear scale
-   */
-  double GetLastObservedSnr (IdealWifiRemoteStation *station, uint16_t channelWidth, uint8_t nss) const;
-
-  /**
-   * A vector of <snr, WifiTxVector> pair holding the minimum SNR for the
-   * WifiTxVector
-   */
-  typedef std::vector<std::pair<double, WifiTxVector> > Thresholds;
-
-  double m_ber;             //!< The maximum Bit Error Rate acceptable at any transmission mode
-  Thresholds m_thresholds;  //!< List of WifiTxVector and the minimum SNR pair
-
-  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
-};
-
-} //namespace ns3
-
-#endif /* IDEAL_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/infrastructure-wifi-mac.cc ns-3.34/src/wifi/model/infrastructure-wifi-mac.cc
--- ns-3.33/src/wifi/model/infrastructure-wifi-mac.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/infrastructure-wifi-mac.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,83 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2017
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "infrastructure-wifi-mac.h"
-#include "ns3/log.h"
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("InfrastructureWifiMac");
-
-NS_OBJECT_ENSURE_REGISTERED (InfrastructureWifiMac);
-
-
-TypeId
-InfrastructureWifiMac::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::InfrastructureWifiMac")
-    .SetParent<RegularWifiMac> ()
-    .SetGroupName ("Wifi")
-    .AddAttribute ("PcfSupported",
-                   "This Boolean attribute is set to enable PCF support at this STA",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&InfrastructureWifiMac::SetPcfSupported,
-                                        &InfrastructureWifiMac::GetPcfSupported),
-                   MakeBooleanChecker ())
-  ;
-  return tid;
-}
-
-InfrastructureWifiMac::InfrastructureWifiMac ()
-  : m_pcfSupported (0)
-{
-  NS_LOG_FUNCTION (this);
-}
-
-InfrastructureWifiMac::~InfrastructureWifiMac ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-InfrastructureWifiMac::SetQosSupported (bool enable)
-{
-  NS_ASSERT_MSG (!(GetPcfSupported () && enable), "QoS cannot be enabled when PCF support is activated (not supported)");
-  RegularWifiMac::SetQosSupported (enable);
-}
-
-void
-InfrastructureWifiMac::SetPcfSupported (bool enable)
-{
-  NS_LOG_FUNCTION (this << enable);
-  NS_ASSERT_MSG (!(GetQosSupported () && enable), "PCF cannot be enabled when QoS support is activated (not supported)");
-  m_pcfSupported = enable;
-  if (m_stationManager != 0)
-    {
-      m_stationManager->SetPcfSupported (enable);
-    }
-}
-
-bool
-InfrastructureWifiMac::GetPcfSupported () const
-{
-  return m_pcfSupported;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/infrastructure-wifi-mac.h ns-3.34/src/wifi/model/infrastructure-wifi-mac.h
--- ns-3.33/src/wifi/model/infrastructure-wifi-mac.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/infrastructure-wifi-mac.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,84 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2017
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef INFRASTRUCTURE_WIFI_MAC_H
-#define INFRASTRUCTURE_WIFI_MAC_H
-
-#include "regular-wifi-mac.h"
-
-namespace ns3 {
-
-/**
- * \ingroup wifi
- *
- * The Wifi MAC high model for a STA or AP in a BSS.
- */
-class InfrastructureWifiMac : public RegularWifiMac
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-
-  InfrastructureWifiMac ();
-  virtual ~InfrastructureWifiMac ();
-
-  /**
-   * \param packet the packet to send.
-   * \param to the address to which the packet should be sent.
-   *
-   * The packet should be enqueued in a TX queue, and should be
-   * dequeued as soon as the channel access function determines that
-   * access is granted to this MAC.
-   */
-  virtual void Enqueue (Ptr<Packet> packet, Mac48Address to) = 0;
-  /**
-   * Enable or disable QoS support for the device.
-   *
-   * \param enable whether QoS is supported
-   */
-  void SetQosSupported (bool enable);
-
-  /**
-   * Enable or disable PCF support for the device.
-   *
-   * \param enable whether PCF is supported
-   */
-  void SetPcfSupported (bool enable);
-  /**
-   * Return whether the device supports PCF.
-   *
-   * \return true if PCF is supported, false otherwise
-   */
-  bool GetPcfSupported () const;
-
-
-private:
-  /**
-   * This Boolean is set \c true iff this WifiMac support PCF
-   */
-  bool m_pcfSupported;
-};
-
-} //namespace ns3
-
-#endif /* INFRASTRUCTURE_WIFI_MAC_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/interference-helper.cc ns-3.34/src/wifi/model/interference-helper.cc
--- ns-3.33/src/wifi/model/interference-helper.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/interference-helper.cc	2021-07-14 10:31:07.000000000 -0700
@@ -28,7 +28,6 @@
 #include "wifi-phy.h"
 #include "error-rate-model.h"
 #include "wifi-utils.h"
-#include "wifi-ppdu.h"
 #include "wifi-psdu.h"
 
 namespace ns3 {
@@ -39,7 +38,7 @@
  *       PHY event class
  ****************************************************************/
 
-Event::Event (Ptr<const WifiPpdu> ppdu, WifiTxVector txVector, Time duration, RxPowerWattPerChannelBand rxPower)
+Event::Event (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand rxPower)
   : m_ppdu (ppdu),
     m_txVector (txVector),
     m_startTime (Simulator::Now ()),
@@ -50,6 +49,8 @@
 
 Event::~Event ()
 {
+  m_ppdu = 0;
+  m_rxPowerW.clear ();
 }
 
 Ptr<const WifiPpdu>
@@ -102,12 +103,28 @@
   return m_rxPowerW;
 }
 
-WifiTxVector
+const WifiTxVector&
 Event::GetTxVector (void) const
 {
   return m_txVector;
 }
 
+void
+Event::UpdateRxPowerW (RxPowerWattPerChannelBand rxPower)
+{
+  NS_ASSERT (rxPower.size () == m_rxPowerW.size ());
+  //Update power band per band
+  for (auto & currentRxPowerW : m_rxPowerW)
+    {
+      auto band = currentRxPowerW.first;
+      auto it = rxPower.find (band);
+      if (it != rxPower.end ())
+        {
+          currentRxPowerW.second += it->second;
+        }
+    }
+}
+
 std::ostream & operator << (std::ostream &os, const Event &event)
 {
   os << "start=" << event.GetStartTime () << ", end=" << event.GetEndTime ()
@@ -128,6 +145,11 @@
 {
 }
 
+InterferenceHelper::NiChange::~NiChange ()
+{
+  m_event = 0;
+}
+
 double
 InterferenceHelper::NiChange::GetPower (void) const
 {
@@ -160,15 +182,15 @@
 
 InterferenceHelper::~InterferenceHelper ()
 {
-  EraseEvents ();
+  RemoveBands ();
   m_errorRateModel = 0;
 }
 
 Ptr<Event>
-InterferenceHelper::Add (Ptr<const WifiPpdu> ppdu, WifiTxVector txVector, Time duration, RxPowerWattPerChannelBand rxPowerW)
+InterferenceHelper::Add (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand rxPowerW, bool isStartOfdmaRxing)
 {
   Ptr<Event> event = Create<Event> (ppdu, txVector, duration, rxPowerW);
-  AppendEvent (event);
+  AppendEvent (event, isStartOfdmaRxing);
   return event;
 }
 
@@ -179,8 +201,9 @@
   // of signal, so we provide dummy versions
   WifiMacHeader hdr;
   hdr.SetType (WIFI_MAC_QOSDATA);
+  hdr.SetQosTid (0);
   Ptr<WifiPpdu> fakePpdu = Create<WifiPpdu> (Create<WifiPsdu> (Create<Packet> (0), hdr),
-                                             WifiTxVector (), duration, WIFI_PHY_BAND_UNSPECIFIED);
+                                             WifiTxVector ());
   Add (fakePpdu, WifiTxVector (), duration, rxPowerW);
 }
 
@@ -188,6 +211,10 @@
 InterferenceHelper::RemoveBands(void)
 {
   NS_LOG_FUNCTION (this);
+  for (auto it : m_niChangesPerBand)
+    {
+      it.second.clear ();
+    }
   m_niChangesPerBand.clear();
   m_firstPowerPerBand.clear();
 }
@@ -229,7 +256,7 @@
 }
 
 Time
-InterferenceHelper::GetEnergyDuration (double energyW, WifiSpectrumBand band) const
+InterferenceHelper::GetEnergyDuration (double energyW, WifiSpectrumBand band)
 {
   Time now = Simulator::Now ();
   auto i = GetPreviousPosition (now, band);
@@ -249,9 +276,9 @@
 }
 
 void
-InterferenceHelper::AppendEvent (Ptr<Event> event)
+InterferenceHelper::AppendEvent (Ptr<Event> event, bool isStartOfdmaRxing)
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << event << isStartOfdmaRxing);
   RxPowerWattPerChannelBand rxPowerWattPerChannelBand = event->GetRxPowerWPerBand ();
   for (auto const& it : rxPowerWattPerChannelBand)
     {
@@ -268,6 +295,13 @@
           // Always leave the first zero power noise event in the list
           ni_it->second.erase (++(ni_it->second.begin ()), GetNextPosition (event->GetStartTime (), band));
         }
+      else if (isStartOfdmaRxing)
+        {
+          //When the first UL-OFDMA payload is received, we need to set m_firstPowerPerBand
+          //so that it takes into account interferences that arrived between the start of the
+          //UL MU transmission and the start of UL-OFDMA payload.
+          m_firstPowerPerBand.find (band)->second = previousPowerStart;
+        }
       auto first = AddNiChangeEvent (event->GetStartTime (), NiChange (previousPowerStart, event), band);
       auto last = AddNiChangeEvent (event->GetEndTime (), NiChange (previousPowerEnd, event), band);
       for (auto i = first; i != last; ++i)
@@ -277,6 +311,26 @@
     }
 }
 
+void
+InterferenceHelper::UpdateEvent (Ptr<Event> event, RxPowerWattPerChannelBand rxPower)
+{
+  NS_LOG_FUNCTION (this << event);
+  //This is called for UL MU events, in order to scale power as long as UL MU PPDUs arrive
+  for (auto const& it : rxPower)
+    {
+      WifiSpectrumBand band = it.first;
+      auto ni_it = m_niChangesPerBand.find (band);
+      NS_ASSERT (ni_it != m_niChangesPerBand.end ());
+      auto first = GetPreviousPosition (event->GetStartTime (), band);
+      auto last = GetPreviousPosition (event->GetEndTime (), band);
+      for (auto i = first; i != last; ++i)
+        {
+          i->second.AddPower (it.second);
+        }
+    }
+    event->UpdateRxPowerW (rxPower);
+}
+
 double
 InterferenceHelper::CalculateSnr (double signal, double noiseInterference, uint16_t channelWidth, uint8_t nss) const
 {
@@ -290,13 +344,16 @@
   double noise = noiseFloor + noiseInterference;
   double snr = signal / noise; //linear scale
   NS_LOG_DEBUG ("bandwidth(MHz)=" << channelWidth << ", signal(W)= " << signal << ", noise(W)=" << noiseFloor << ", interference(W)=" << noiseInterference << ", snr=" << RatioToDb(snr) << "dB");
-  double gain = 1;
-  if (m_numRxAntennas > nss)
+  if (m_errorRateModel->IsAwgn ())
     {
-      gain = static_cast<double>(m_numRxAntennas) / nss; //compute gain offered by diversity for AWGN
+      double gain = 1;
+      if (m_numRxAntennas > nss)
+        {
+          gain = static_cast<double> (m_numRxAntennas) / nss; //compute gain offered by diversity for AWGN
+        }
+      NS_LOG_DEBUG ("SNR improvement thanks to diversity: " << 10 * std::log10 (gain) << "dB");
+      snr *= gain;
     }
-  NS_LOG_DEBUG ("SNR improvement thanks to diversity: " << 10 * std::log10 (gain) << "dB");
-  snr *= gain;
   return snr;
 }
 
@@ -330,7 +387,7 @@
 }
 
 double
-InterferenceHelper::CalculateChunkSuccessRate (double snir, Time duration, WifiMode mode, WifiTxVector txVector) const
+InterferenceHelper::CalculateChunkSuccessRate (double snir, Time duration, WifiMode mode, const WifiTxVector& txVector, WifiPpduField field) const
 {
   if (duration.IsZero ())
     {
@@ -338,12 +395,12 @@
     }
   uint64_t rate = mode.GetDataRate (txVector.GetChannelWidth ());
   uint64_t nbits = static_cast<uint64_t> (rate * duration.GetSeconds ());
-  double csr = m_errorRateModel->GetChunkSuccessRate (mode, txVector, snir, nbits);
+  double csr = m_errorRateModel->GetChunkSuccessRate (mode, txVector, snir, nbits, m_numRxAntennas, field);
   return csr;
 }
 
 double
-InterferenceHelper::CalculatePayloadChunkSuccessRate (double snir, Time duration, WifiTxVector txVector, uint16_t staId) const
+InterferenceHelper::CalculatePayloadChunkSuccessRate (double snir, Time duration, const WifiTxVector& txVector, uint16_t staId) const
 {
   if (duration.IsZero ())
     {
@@ -353,7 +410,7 @@
   uint64_t rate = mode.GetDataRate (txVector, staId);
   uint64_t nbits = static_cast<uint64_t> (rate * duration.GetSeconds ());
   nbits /= txVector.GetNss (staId); //divide effective number of bits by NSS to achieve same chunk error rate as SISO for AWGN
-  double csr = m_errorRateModel->GetChunkSuccessRate (mode, txVector, snir, nbits);
+  double csr = m_errorRateModel->GetChunkSuccessRate (mode, txVector, snir, nbits, m_numRxAntennas, WIFI_PPDU_FIELD_DATA, staId);
   return csr;
 }
 
@@ -363,17 +420,16 @@
                                          uint16_t staId, std::pair<Time, Time> window) const
 {
   NS_LOG_FUNCTION (this << channelWidth << band.first << band.second << staId << window.first << window.second);
-  const WifiTxVector txVector = event->GetTxVector ();
   double psr = 1.0; /* Packet Success Rate */
   auto ni_it = nis->find (band)->second;
   auto j = ni_it.begin ();
   Time previous = j->first;
-  WifiMode payloadMode = txVector.GetMode (staId);
-  WifiPreamble preamble = txVector.GetPreambleType ();
-  Time phyHeaderStart = j->first + WifiPhy::GetPhyPreambleDuration (txVector); //PPDU start time + preamble
-  Time phyHtSigHeaderStart = phyHeaderStart + WifiPhy::GetPhyHeaderDuration (txVector); //PPDU start time + preamble + L-SIG
-  Time phyTrainingSymbolsStart = phyHtSigHeaderStart + WifiPhy::GetPhyHtSigHeaderDuration (preamble) + WifiPhy::GetPhySigA1Duration (preamble) + WifiPhy::GetPhySigA2Duration (preamble); //PPDU start time + preamble + L-SIG + HT-SIG or SIG-A
-  Time phyPayloadStart = phyTrainingSymbolsStart + WifiPhy::GetPhyTrainingSymbolDuration (txVector) + WifiPhy::GetPhySigBDuration (preamble); //PPDU start time + preamble + L-SIG + HT-SIG or SIG-A + Training + SIG-B
+  WifiMode payloadMode = event->GetTxVector ().GetMode (staId);
+  Time phyPayloadStart = j->first;
+  if (event->GetPpdu ()->GetType () != WIFI_PPDU_TYPE_UL_MU) //j->first corresponds to the start of the UL-OFDMA payload
+    {
+      phyPayloadStart = j->first + WifiPhy::CalculatePhyPreambleAndHeaderDuration (event->GetTxVector ());
+    }
   Time windowStart = phyPayloadStart + window.first;
   Time windowEnd = phyPayloadStart + window.second;
   double noiseInterferenceW = m_firstPowerPerBand.find (band)->second;
@@ -383,17 +439,17 @@
       Time current = j->first;
       NS_LOG_DEBUG ("previous= " << previous << ", current=" << current);
       NS_ASSERT (current >= previous);
-      double snr = CalculateSnr (powerW, noiseInterferenceW, channelWidth, txVector.GetNss (staId));
+      double snr = CalculateSnr (powerW, noiseInterferenceW, channelWidth, event->GetTxVector ().GetNss (staId));
       //Case 1: Both previous and current point to the windowed payload
       if (previous >= windowStart)
         {
-          psr *= CalculatePayloadChunkSuccessRate (snr, Min (windowEnd, current) - previous, txVector, staId);
+          psr *= CalculatePayloadChunkSuccessRate (snr, Min (windowEnd, current) - previous, event->GetTxVector (), staId);
           NS_LOG_DEBUG ("Both previous and current point to the windowed payload: mode=" << payloadMode << ", psr=" << psr);
         }
       //Case 2: previous is before windowed payload and current is in the windowed payload
       else if (current >= windowStart)
         {
-          psr *= CalculatePayloadChunkSuccessRate (snr, Min (windowEnd, current) - windowStart, txVector, staId);
+          psr *= CalculatePayloadChunkSuccessRate (snr, Min (windowEnd, current) - windowStart, event->GetTxVector (), staId);
           NS_LOG_DEBUG ("previous is before windowed payload and current is in the windowed payload: mode=" << payloadMode << ", psr=" << psr);
         }
       noiseInterferenceW = j->second.GetPower () - powerW;
@@ -409,21 +465,23 @@
 }
 
 double
-InterferenceHelper::CalculateNonHtPhyHeaderPer (Ptr<const Event> event, NiChangesPerBand *nis, WifiSpectrumBand band) const
+InterferenceHelper::CalculatePhyHeaderSectionPsr (Ptr<const Event> event, NiChangesPerBand *nis,
+                                                  uint16_t channelWidth, WifiSpectrumBand band,
+                                                  PhyEntity::PhyHeaderSections phyHeaderSections) const
 {
   NS_LOG_FUNCTION (this << band.first << band.second);
-  const WifiTxVector txVector = event->GetTxVector ();
-  uint16_t channelWidth = txVector.GetChannelWidth () >= 40 ? 20 : txVector.GetChannelWidth (); //calculate PER on the 20 MHz primary channel for L-SIG
   double psr = 1.0; /* Packet Success Rate */
   auto ni_it = nis->find (band)->second;
   auto j = ni_it.begin ();
+
+  NS_ASSERT (!phyHeaderSections.empty ());
+  Time stopLastSection = Seconds (0);
+  for (const auto & section : phyHeaderSections)
+    {
+      stopLastSection = Max (stopLastSection, section.second.first.second);
+    }
+
   Time previous = j->first;
-  WifiPreamble preamble = txVector.GetPreambleType ();
-  WifiMode headerMode = WifiPhy::GetPhyHeaderMode (txVector);
-  Time phyHeaderStart = j->first + WifiPhy::GetPhyPreambleDuration (txVector); //PPDU start time + preamble
-  Time phyLSigHeaderEnd = phyHeaderStart + WifiPhy::GetPhyHeaderDuration (txVector); //PPDU start time + preamble + L-SIG
-  Time phyTrainingSymbolsStart = phyLSigHeaderEnd + WifiPhy::GetPhyHtSigHeaderDuration (preamble) + WifiPhy::GetPhySigA1Duration (preamble) + WifiPhy::GetPhySigA2Duration (preamble); //PPDU start time + preamble + L-SIG + HT-SIG or SIG-A
-  Time phyPayloadStart = phyTrainingSymbolsStart + WifiPhy::GetPhyTrainingSymbolDuration (txVector) + WifiPhy::GetPhySigBDuration (preamble); //PPDU start time + preamble + L-SIG + HT-SIG or SIG-A + Training + SIG-B
   double noiseInterferenceW = m_firstPowerPerBand.find (band)->second;
   double powerW = event->GetRxPowerW (band);
   while (++j != ni_it.end ())
@@ -432,366 +490,60 @@
       NS_LOG_DEBUG ("previous= " << previous << ", current=" << current);
       NS_ASSERT (current >= previous);
       double snr = CalculateSnr (powerW, noiseInterferenceW, channelWidth, 1);
-      //Case 1: previous and current after payload start
-      if (previous >= phyPayloadStart)
-        {
-          psr *= 1;
-          NS_LOG_DEBUG ("Case 1 - previous and current after payload start: nothing to do");
-        }
-      //Case 2: previous is in training or in SIG-B: non-HT will not enter here since it didn't enter in the last two and they are all the same for non-HT
-      else if (previous >= phyTrainingSymbolsStart)
-        {
-          NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
-          psr *= 1;
-          NS_LOG_DEBUG ("Case 2 - previous is in training or in SIG-B: nothing to do");
-        }
-      //Case 3: previous is in HT-SIG or SIG-A: non-HT will not enter here since it didn't enter in the last two and they are all the same for non-HT
-      else if (previous >= phyLSigHeaderEnd)
+      for (const auto & section : phyHeaderSections)
         {
-          NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
-          psr *= 1;
-          NS_LOG_DEBUG ("Case 3cii - previous is in HT-SIG or SIG-A: nothing to do");
-        }
-      //Case 4: previous in L-SIG: HT GF will not reach here because it will execute the previous if and exit
-      else if (previous >= phyHeaderStart)
-        {
-          NS_ASSERT (preamble != WIFI_PREAMBLE_HT_GF);
-          //Case 4a: current after payload start
-          if (current >= phyPayloadStart)
-            {
-              psr *= CalculateChunkSuccessRate (snr, phyLSigHeaderEnd - previous, headerMode, txVector);
-              NS_LOG_DEBUG ("Case 4a - previous in L-SIG and current after payload start: mode=" << headerMode << ", psr=" << psr);
-            }
-          //Case 4b: current is in training or in SIG-B. non-HT will not come here since it went in previous if or if the previous if is not true this will be not true
-          else if (current >= phyTrainingSymbolsStart)
-            {
-              NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
-              psr *= CalculateChunkSuccessRate (snr, phyLSigHeaderEnd - previous, headerMode, txVector);
-              NS_LOG_DEBUG ("Case 4a - previous in L-SIG and current is in training or in SIG-B: mode=" << headerMode << ", psr=" << psr);
-            }
-          //Case 4c: current in HT-SIG or in SIG-A. non-HT will not come here since it went in previous if or if the previous if is not true this will be not true
-          else if (current >= phyLSigHeaderEnd)
-            {
-              NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
-              psr *= CalculateChunkSuccessRate (snr, phyLSigHeaderEnd - previous, headerMode, txVector);
-              NS_LOG_DEBUG ("Case 4ci - previous is in L-SIG and current in HT-SIG or in SIG-A: mode=" << headerMode << ", psr=" << psr);
-            }
-          //Case 4d: current with previous in L-SIG
-          else
-            {
-              psr *= CalculateChunkSuccessRate (snr, current - previous, headerMode, txVector);
-              NS_LOG_DEBUG ("Case 4d - current with previous in L-SIG: mode=" << headerMode << ", psr=" << psr);
-            }
-        }
-      //Case 5: previous is in the preamble works for all cases
-      else
-        {
-          //Case 5a: current after payload start
-          if (current >= phyPayloadStart)
-            {
-              psr *= CalculateChunkSuccessRate (snr, phyLSigHeaderEnd - phyHeaderStart, headerMode, txVector);
-              NS_LOG_DEBUG ("Case 5aii - previous is in the preamble and current is after payload start: mode=" << headerMode << ", psr=" << psr);
-            }
-          //Case 5b: current is in training or in SIG-B. non-HT will not come here since it went in previous if or if the previous if is not true this will be not true
-          else if (current >= phyTrainingSymbolsStart)
-            {
-              NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
-              psr *= CalculateChunkSuccessRate (snr, phyLSigHeaderEnd - phyHeaderStart, headerMode, txVector);
-              NS_LOG_DEBUG ("Case 5b - previous is in the preamble and current is in training or in SIG-B: mode=" << headerMode << ", psr=" << psr);
-            }
-          //Case 5c: current in HT-SIG or in SIG-A. non-HT will not come here since it went in previous if or if the previous if is not true this will be not true
-          else if (current >= phyLSigHeaderEnd)
-            {
-              NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
-              psr *= CalculateChunkSuccessRate (snr, phyLSigHeaderEnd - phyHeaderStart, headerMode, txVector);
-              NS_LOG_DEBUG ("Case 5b - previous is in the preamble and current in HT-SIG or in SIG-A: mode=" << headerMode << ", psr=" << psr);
-            }
-          //Case 5d: current is in L-SIG.
-          else if (current >= phyHeaderStart)
+          Time start = section.second.first.first;
+          Time stop = section.second.first.second;
+
+          if (previous <= stop || current >= start)
             {
-              NS_ASSERT (preamble != WIFI_PREAMBLE_HT_GF);
-              psr *= CalculateChunkSuccessRate (snr, current - phyHeaderStart, headerMode, txVector);
-              NS_LOG_DEBUG ("Case 5d - previous is in the preamble and current is in L-SIG: mode=" << headerMode << ", psr=" << psr);
+              Time duration = Min (stop, current) - Max (start, previous);
+              if (duration.IsStrictlyPositive ())
+                {
+                  psr *= CalculateChunkSuccessRate (snr, duration, section.second.second, event->GetTxVector (), section.first);
+                  NS_LOG_DEBUG ("Current NI change in " << section.first << " [" << start << ", " << stop << "] for "
+                                << duration.As (Time::NS) << ": mode=" << section.second.second << ", psr=" << psr);
+                }
             }
         }
-
       noiseInterferenceW = j->second.GetPower () - powerW;
       previous = j->first;
+      if (previous > stopLastSection)
+        {
+          NS_LOG_DEBUG ("Stop: new previous=" << previous << " after stop of last section=" << stopLastSection);
+          break;
+        }
     }
-
-  double per = 1 - psr;
-  return per;
+  return psr;
 }
 
 double
-InterferenceHelper::CalculateHtPhyHeaderPer (Ptr<const Event> event, NiChangesPerBand *nis, WifiSpectrumBand band) const
+InterferenceHelper::CalculatePhyHeaderPer (Ptr<const Event> event, NiChangesPerBand *nis,
+                                           uint16_t channelWidth, WifiSpectrumBand band,
+                                           WifiPpduField header) const
 {
-  NS_LOG_FUNCTION (this << band.first << band.second);
-  const WifiTxVector txVector = event->GetTxVector ();
-  uint16_t channelWidth = txVector.GetChannelWidth () >= 40 ? 20 : txVector.GetChannelWidth (); //calculate PER on the 20 MHz primary channel for PHY headers
-  double psr = 1.0; /* Packet Success Rate */
+  NS_LOG_FUNCTION (this << band.first << band.second << header);
   auto ni_it = nis->find (band)->second;
-  auto j = ni_it.begin ();
-  Time previous = j->first;
-  WifiPreamble preamble = txVector.GetPreambleType ();
-  WifiMode mcsHeaderMode;
-  if (IsHt (preamble))
-    {
-      //mode for PHY header fields sent with HT modulation
-      mcsHeaderMode = WifiPhy::GetHtPhyHeaderMode ();
-    }
-  else if (IsVht (preamble))
-    {
-      //mode for PHY header fields sent with VHT modulation
-      mcsHeaderMode = WifiPhy::GetVhtPhyHeaderMode ();
-    }
-  else if (IsHe (preamble))
-    {
-      //mode for PHY header fields sent with HE modulation
-      mcsHeaderMode = WifiPhy::GetHePhyHeaderMode ();
-    }
-  WifiMode headerMode = WifiPhy::GetPhyHeaderMode (txVector);
-  Time phyHeaderStart = j->first + WifiPhy::GetPhyPreambleDuration (txVector); //PPDU start time + preamble
-  Time phyLSigHeaderEnd = phyHeaderStart + WifiPhy::GetPhyHeaderDuration (txVector); //PPDU start time + preamble + L-SIG
-  Time phyTrainingSymbolsStart = phyLSigHeaderEnd + WifiPhy::GetPhyHtSigHeaderDuration (preamble) + WifiPhy::GetPhySigA1Duration (preamble) + WifiPhy::GetPhySigA2Duration (preamble); //PPDU start time + preamble + L-SIG + HT-SIG or SIG-A
-  Time phyPayloadStart = phyTrainingSymbolsStart + WifiPhy::GetPhyTrainingSymbolDuration (txVector) + WifiPhy::GetPhySigBDuration (preamble); //PPDU start time + preamble + L-SIG + HT-SIG or SIG-A + Training + SIG-B
-  double noiseInterferenceW = m_firstPowerPerBand.find (band)->second;
-  double powerW = event->GetRxPowerW (band);
-  while (++j != ni_it.end ())
+  auto phyEntity = WifiPhy::GetStaticPhyEntity (event->GetTxVector ().GetModulationClass ());
+
+  PhyEntity::PhyHeaderSections sections;
+  for (const auto & section : phyEntity->GetPhyHeaderSections (event->GetTxVector (), ni_it.begin ()->first))
     {
-      Time current = j->first;
-      NS_LOG_DEBUG ("previous= " << previous << ", current=" << current);
-      NS_ASSERT (current >= previous);
-      double snr = CalculateSnr (powerW, noiseInterferenceW, channelWidth, 1);
-      //Case 1: previous and current after payload start: nothing to do
-      if (previous >= phyPayloadStart)
-        {
-          psr *= 1;
-          NS_LOG_DEBUG ("Case 1 - previous and current after payload start: nothing to do");
-        }
-      //Case 2: previous is in training or in SIG-B: non-HT will not enter here since it didn't enter in the last two and they are all the same for non-HT
-      else if (previous >= phyTrainingSymbolsStart)
-        {
-          NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
-          //Case 2a: current after payload start
-          if (current >= phyPayloadStart)
-            {
-              psr *= CalculateChunkSuccessRate (snr, phyPayloadStart - previous, mcsHeaderMode, txVector);
-              NS_LOG_DEBUG ("Case 2a - previous is in training or in SIG-B and current after payload start: mode=" << mcsHeaderMode << ", psr=" << psr);
-            }
-          //Case 2b: current is in training or in SIG-B
-          else
-            {
-              psr *= CalculateChunkSuccessRate (snr, current - previous, mcsHeaderMode, txVector);
-              NS_LOG_DEBUG ("Case 2b - previous is in training or in SIG-B and current is in training or in SIG-B: mode=" << mcsHeaderMode << ", psr=" << psr);
-            }
-        }
-      //Case 3: previous is in HT-SIG or SIG-A: non-HT will not enter here since it didn't enter in the last two and they are all the same for non-HT
-      else if (previous >= phyLSigHeaderEnd)
-        {
-          NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
-          //Case 3a: current after payload start
-          if (current >= phyPayloadStart)
-            {
-              psr *= CalculateChunkSuccessRate (snr, phyPayloadStart - phyTrainingSymbolsStart, mcsHeaderMode, txVector);
-              //Case 3ai: VHT or HE format
-              if (IsVht (preamble) || IsHe (preamble))
-                {
-                  //SIG-A is sent using non-HT OFDM modulation
-                  psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - previous, headerMode, txVector);
-                  NS_LOG_DEBUG ("Case 3ai - previous is in SIG-A and current after payload start: mcs mode=" << mcsHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
-                }
-              //Case 3aii: HT formats
-              else
-                {
-                  psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - previous, mcsHeaderMode, txVector);
-                  NS_LOG_DEBUG ("Case 3aii - previous is in HT-SIG and current after payload start: mode=" << mcsHeaderMode << ", psr=" << psr);
-                }
-            }
-          //Case 3b: current is in training or in SIG-B
-          else if (current >= phyTrainingSymbolsStart)
-            {
-              psr *= CalculateChunkSuccessRate (snr, current - phyTrainingSymbolsStart, mcsHeaderMode, txVector);
-              //Case 3bi: VHT or HE format
-              if (IsVht (preamble) || IsHe (preamble))
-                {
-                  //SIG-A is sent using non-HT OFDM modulation
-                  psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - previous, headerMode, txVector);
-                  NS_LOG_DEBUG ("Case 3bi - previous is in SIG-A and current is in training or in SIG-B: mode=" << headerMode << ", psr=" << psr);
-                }
-              //Case 3bii: HT formats
-              else
-                {
-                  psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - previous, mcsHeaderMode, txVector);
-                  NS_LOG_DEBUG ("Case 3bii - previous is in HT-SIG and current is in HT training: mode=" << mcsHeaderMode << ", psr=" << psr);
-                }
-            }
-          //Case 3c: current with previous in HT-SIG or SIG-A
-          else
-            {
-              //Case 3ci: VHT or HE format
-              if (IsVht (preamble) || IsHe (preamble))
-                {
-                  //SIG-A is sent using non-HT OFDM modulation
-                  psr *= CalculateChunkSuccessRate (snr, current - previous, headerMode, txVector);
-                  NS_LOG_DEBUG ("Case 3ci - previous with current in SIG-A: mode=" << headerMode << ", psr=" << psr);
-                }
-              //Case 3cii: HT mixed format or HT greenfield
-              else
-                {
-                  psr *= CalculateChunkSuccessRate (snr, current - previous, mcsHeaderMode, txVector);
-                  NS_LOG_DEBUG ("Case 3cii - previous with current in HT-SIG: mode=" << mcsHeaderMode << ", psr=" << psr);
-                }
-            }
-        }
-      //Case 4: previous in L-SIG: HT GF will not reach here because it will execute the previous if and exit
-      else if (previous >= phyHeaderStart)
+      if (section.first == header)
         {
-          NS_ASSERT (preamble != WIFI_PREAMBLE_HT_GF);
-          //Case 4a: current after payload start
-          if (current >= phyPayloadStart)
-            {
-              //Case 4ai: non-HT format
-              if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT)
-                {
-                  psr *= 1;
-                  NS_LOG_DEBUG ("Case 4ai - previous in L-SIG and current after payload start: nothing to do");
-                }
-              //Case 4aii: VHT or HE format
-              else if (IsVht (preamble) || IsHe (preamble))
-                {
-                  psr *= CalculateChunkSuccessRate (snr, phyPayloadStart - phyTrainingSymbolsStart, mcsHeaderMode, txVector);
-                  psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - phyLSigHeaderEnd, headerMode, txVector);
-                  NS_LOG_DEBUG ("Case 4aii - previous is in L-SIG and current after payload start: mcs mode=" << mcsHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
-                }
-              //Case 4aiii: HT mixed format
-              else
-                {
-                  psr *= CalculateChunkSuccessRate (snr, phyPayloadStart - phyLSigHeaderEnd, mcsHeaderMode, txVector);
-                  NS_LOG_DEBUG ("Case 4aiii - previous in L-SIG and current after payload start: mcs mode=" << mcsHeaderMode << ", psr=" << psr);
-                }
-            }
-          //Case 4b: current is in training or in SIG-B. non-HT will not come here since it went in previous if or if the previous if is not true this will be not true
-          else if (current >= phyTrainingSymbolsStart)
-            {
-              NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
-              //Case 4bi: VHT or HE format
-              if (IsVht (preamble) || IsHe (preamble))
-                {
-                  psr *= CalculateChunkSuccessRate (snr, current - phyTrainingSymbolsStart, mcsHeaderMode, txVector);
-                  psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - phyLSigHeaderEnd, headerMode, txVector);
-                  NS_LOG_DEBUG ("Case 4bi - previous is in L-SIG and current in training or in SIG-B: mcs mode=" << mcsHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
-                }
-              //Case 4bii: HT mixed format
-              else
-                {
-                  psr *= CalculateChunkSuccessRate (snr, current - phyLSigHeaderEnd, mcsHeaderMode, txVector);
-                  NS_LOG_DEBUG ("Case 4bii - previous in L-SIG and current in HT training: mcs mode=" << mcsHeaderMode << ", psr=" << psr);
-                }
-            }
-          //Case 4c: current in HT-SIG or in SIG-A. Non-HT will not come here since it went in previous if or if the previous if is not true this will be not true
-          else if (current >= phyLSigHeaderEnd)
-            {
-              NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
-              //Case 4ci: VHT format
-              if (IsVht (preamble) || IsHe (preamble))
-                {
-                  psr *= CalculateChunkSuccessRate (snr, current - phyLSigHeaderEnd, headerMode, txVector);
-                  NS_LOG_DEBUG ("Case 4ci - previous is in L-SIG and current in SIG-A: mode=" << headerMode << ", psr=" << psr);
-                }
-              //Case 4cii: HT mixed format
-              else
-                {
-                  psr *= CalculateChunkSuccessRate (snr, current - phyLSigHeaderEnd, mcsHeaderMode, txVector);
-                  NS_LOG_DEBUG ("Case 4cii - previous in L-SIG and current in HT-SIG: mcs mode=" << mcsHeaderMode << ", psr=" << psr);
-                }
-            }
-          //Case 4d: current with previous in L-SIG
-          else
-            {
-              psr *= 1;
-              NS_LOG_DEBUG ("Case 4d - current with previous in L-SIG: nothing to do");
-            }
+          sections[header] = section.second;
         }
-      //Case 5: previous is in the preamble works for all cases
-      else
-        {
-          //Case 5a: current after payload start
-          if (current >= phyPayloadStart)
-            {
-              //Case 5ai: non-HT format (No HT-SIG or Training Symbols)
-              if (preamble == WIFI_PREAMBLE_LONG || preamble == WIFI_PREAMBLE_SHORT)
-                {
-                  psr *= 1;
-                  NS_LOG_DEBUG ("Case 5ai - previous is in the preamble and current is after payload start: nothing to do");
-                }
-              //Case 5aii: VHT or HE format
-              else if (IsVht (preamble) || IsHe (preamble))
-                {
-                  psr *= CalculateChunkSuccessRate (snr, phyPayloadStart - phyTrainingSymbolsStart, mcsHeaderMode, txVector);
-                  psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - phyLSigHeaderEnd, headerMode, txVector);
-                  NS_LOG_DEBUG ("Case 5aii - previous is in the preamble and current is after payload start: mcs mode=" << mcsHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
-                }
-              //Case 5aiii: HT formats
-              else
-                {
-                  psr *= CalculateChunkSuccessRate (snr, phyPayloadStart - phyLSigHeaderEnd, mcsHeaderMode, txVector);
-                  NS_LOG_DEBUG ("Case 5aiii - previous is in the preamble and current is after payload start: mcs mode=" << mcsHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
-                }
-            }
-          //Case 5b: current is in training or in SIG-B. Non-HT will not come here since it went in previous if or if the previous if is not true this will be not true
-          else if (current >= phyTrainingSymbolsStart)
-            {
-              NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
-              //Case 5bi: VHT or HE format
-              if (IsVht (preamble) || IsHe (preamble))
-                {
-                  psr *= CalculateChunkSuccessRate (snr, current - phyTrainingSymbolsStart, mcsHeaderMode, txVector);
-                  psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - phyLSigHeaderEnd, headerMode, txVector);
-                  NS_LOG_DEBUG ("Case 5bi - previous is in the preamble and current in training or in SIG-B: mcs mode=" << mcsHeaderMode << ", non-HT mode=" << headerMode << ", psr=" << psr);
-                }
-              //Case 5bii: HT mixed format
-              else
-                {
-                  psr *= CalculateChunkSuccessRate (snr, current - phyLSigHeaderEnd, mcsHeaderMode, txVector);
-                  NS_LOG_DEBUG ("Case 5bii - previous is in the preamble and current in HT training: mcs mode=" << mcsHeaderMode << ", psr=" << psr);
-                }
-            }
-          //Case 5c: current in HT-SIG or in SIG-A. Non-HT will not come here since it went in previous if or if the previous if is not true this will be not true
-          else if (current >= phyLSigHeaderEnd)
-            {
-              NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT));
-              //Case 5ci: VHT or HE format
-              if (IsVht (preamble) || IsHe (preamble))
-                {
-                  psr *= CalculateChunkSuccessRate (snr, current - phyLSigHeaderEnd, headerMode, txVector);
-                  NS_LOG_DEBUG ("Case 5ci - previous is in preamble and current in SIG-A: mode=" << headerMode << ", psr=" << psr);
-                }
-              //Case 5cii: HT formats
-              else
-                {
-                  psr *= CalculateChunkSuccessRate (snr, current - phyLSigHeaderEnd, mcsHeaderMode, txVector);
-                  NS_LOG_DEBUG ("Case 5cii - previous in preamble and current in HT-SIG: mcs mode=" << mcsHeaderMode << ", psr=" << psr);
-                }
-            }
-          //Case 5d: current is in L-SIG. HT-GF will not come here
-          else if (current >= phyHeaderStart)
-            {
-              NS_ASSERT (preamble != WIFI_PREAMBLE_HT_GF);
-              psr *= 1;
-              NS_LOG_DEBUG ("Case 5d - previous is in the preamble and current is in L-SIG: nothing to do");
-            }
-        }
-
-      noiseInterferenceW = j->second.GetPower () - powerW;
-      previous = j->first;
     }
 
-  double per = 1 - psr;
-  return per;
+  double psr = 1.0;
+  if (!sections.empty () > 0)
+    {
+      psr = CalculatePhyHeaderSectionPsr (event, nis, channelWidth, band, sections);
+    }
+  return 1 - psr;
 }
 
-struct InterferenceHelper::SnrPer
+struct PhyEntity::SnrPer
 InterferenceHelper::CalculatePayloadSnrPer (Ptr<Event> event, uint16_t channelWidth, WifiSpectrumBand band,
                                             uint16_t staId, std::pair<Time, Time> relativeMpduStartStop) const
 {
@@ -808,10 +560,7 @@
    */
   double per = CalculatePayloadPer (event, channelWidth, &ni, band, staId, relativeMpduStartStop);
 
-  struct SnrPer snrPer;
-  snrPer.snr = snr;
-  snrPer.per = per;
-  return snrPer;
+  return PhyEntity::SnrPer (snr, per);
 }
 
 double
@@ -826,51 +575,12 @@
   return snr;
 }
 
-struct InterferenceHelper::SnrPer
-InterferenceHelper::CalculateNonHtPhyHeaderSnrPer (Ptr<Event> event, WifiSpectrumBand band) const
+struct PhyEntity::SnrPer
+InterferenceHelper::CalculatePhyHeaderSnrPer (Ptr<Event> event, uint16_t channelWidth, WifiSpectrumBand band,
+                                              WifiPpduField header) const
 {
-  NS_LOG_FUNCTION (this << band.first << band.second);
+  NS_LOG_FUNCTION (this << band.first << band.second << header);
   NiChangesPerBand ni;
-  uint16_t channelWidth;
-  if (event->GetTxVector ().GetChannelWidth () >= 40)
-    {
-      channelWidth = 20; //calculate PER on the 20 MHz primary channel for L-SIG
-    }
-  else
-    {
-      channelWidth = event->GetTxVector ().GetChannelWidth ();
-    }
-  double noiseInterferenceW = CalculateNoiseInterferenceW (event, &ni, band);
-  double snr = CalculateSnr (event->GetRxPowerW (band),
-                             noiseInterferenceW,
-                             channelWidth,
-                             1);
-
-  /* calculate the SNIR at the start of the PHY header and accumulate
-   * all SNIR changes in the SNIR vector.
-   */
-  double per = CalculateNonHtPhyHeaderPer (event, &ni, band);
-
-  struct SnrPer snrPer;
-  snrPer.snr = snr;
-  snrPer.per = per;
-  return snrPer;
-}
-
-struct InterferenceHelper::SnrPer
-InterferenceHelper::CalculateHtPhyHeaderSnrPer (Ptr<Event> event, WifiSpectrumBand band) const
-{
-  NS_LOG_FUNCTION (this << band.first << band.second);
-  NiChangesPerBand ni;
-  uint16_t channelWidth;
-  if (event->GetTxVector ().GetChannelWidth () >= 40)
-    {
-      channelWidth = 20; //calculate PER on the 20 MHz primary channel for PHY headers
-    }
-  else
-    {
-      channelWidth = event->GetTxVector ().GetChannelWidth ();
-    }
   double noiseInterferenceW = CalculateNoiseInterferenceW (event, &ni, band);
   double snr = CalculateSnr (event->GetRxPowerW (band),
                              noiseInterferenceW,
@@ -880,12 +590,9 @@
   /* calculate the SNIR at the start of the PHY header and accumulate
    * all SNIR changes in the SNIR vector.
    */
-  double per = CalculateHtPhyHeaderPer (event, &ni, band);
+  double per = CalculatePhyHeaderPer (event, &ni, channelWidth, band, header);
   
-  struct SnrPer snrPer;
-  snrPer.snr = snr;
-  snrPer.per = per;
-  return snrPer;
+  return PhyEntity::SnrPer (snr, per);
 }
 
 void
@@ -901,16 +608,16 @@
   m_rxing = false;
 }
 
-InterferenceHelper::NiChanges::const_iterator
-InterferenceHelper::GetNextPosition (Time moment, WifiSpectrumBand band) const
+InterferenceHelper::NiChanges::iterator
+InterferenceHelper::GetNextPosition (Time moment, WifiSpectrumBand band)
 {
   auto it = m_niChangesPerBand.find (band);
   NS_ASSERT (it != m_niChangesPerBand.end ());
   return it->second.upper_bound (moment);
 }
 
-InterferenceHelper::NiChanges::const_iterator
-InterferenceHelper::GetPreviousPosition (Time moment, WifiSpectrumBand band) const
+InterferenceHelper::NiChanges::iterator
+InterferenceHelper::GetPreviousPosition (Time moment, WifiSpectrumBand band)
 {
   auto it = GetNextPosition (moment, band);
   // This is safe since there is always an NiChange at time 0,
@@ -935,15 +642,15 @@
 }
 
 void
-InterferenceHelper::NotifyRxEnd ()
+InterferenceHelper::NotifyRxEnd (Time endTime)
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << endTime);
   m_rxing = false;
-  //Update m_firstPower for frame capture
+  //Update m_firstPowerPerBand for frame capture
   for (auto ni : m_niChangesPerBand)
     {
       NS_ASSERT (ni.second.size () > 1);
-      auto it = GetPreviousPosition (Simulator::Now (), ni.first);
+      auto it = GetPreviousPosition (endTime, ni.first);
       it--;
       m_firstPowerPerBand.find (ni.first)->second = it->second.GetPower ();
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/interference-helper.h ns-3.34/src/wifi/model/interference-helper.h
--- ns-3.33/src/wifi/model/interference-helper.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/interference-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -21,10 +21,7 @@
 #ifndef INTERFERENCE_HELPER_H
 #define INTERFERENCE_HELPER_H
 
-#include "ns3/nstime.h"
-#include "ns3/wifi-spectrum-value-helper.h"
-#include "wifi-tx-vector.h"
-#include <map>
+#include "phy-entity.h"
 
 namespace ns3 {
 
@@ -33,11 +30,6 @@
 class ErrorRateModel;
 
 /**
- * A map of the received power (Watts) for each band
- */
-typedef std::map <WifiSpectrumBand, double> RxPowerWattPerChannelBand;
-
-/**
  * \ingroup wifi
  * \brief handles interference calculations
  * \brief signal event for a PPDU.
@@ -53,7 +45,7 @@
    * \param duration duration of the PPDU
    * \param rxPower the received power per band (W)
    */
-  Event (Ptr<const WifiPpdu> ppdu, WifiTxVector txVector, Time duration, RxPowerWattPerChannelBand rxPower);
+  Event (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand rxPower);
   ~Event ();
 
   /**
@@ -104,7 +96,14 @@
    *
    * \return the TXVECTOR of the PPDU
    */
-  WifiTxVector GetTxVector (void) const;
+  const WifiTxVector& GetTxVector (void) const;
+  /**
+   * Update the received power (W) for all bands, i.e. add up the received power
+   * to the current received power, for each band.
+   *
+   * \param rxPower the received power (W) for all bands.
+   */
+  void UpdateRxPowerW (RxPowerWattPerChannelBand rxPower);
 
 
 private:
@@ -132,19 +131,6 @@
 class InterferenceHelper
 {
 public:
-  /**
-   * Signal event for a PPDU.
-   */
-
-  /**
-   * A struct for both SNR and PER
-   */
-  struct SnrPer
-  {
-    double snr; ///< SNR in linear scale
-    double per; ///< PER
-  };
-
   InterferenceHelper ();
   ~InterferenceHelper ();
 
@@ -195,7 +181,7 @@
    *          energy on the medium for a given band will
    *          be higher than the requested threshold.
    */
-  Time GetEnergyDuration (double energyW, WifiSpectrumBand band) const;
+  Time GetEnergyDuration (double energyW, WifiSpectrumBand band);
 
   /**
    * Add the PPDU-related signal to interference helper.
@@ -204,10 +190,11 @@
    * \param txVector the TXVECTOR
    * \param duration the PPDU duration
    * \param rxPower received power per band (W)
+   * \param isStartOfdmaRxing flag whether the event corresponds to the start of the OFDMA payload reception (only used for UL-OFDMA) //TODO simplify this once WifiPpdu is subclassed by adding an attribute
    *
    * \return Event
    */
-  Ptr<Event> Add (Ptr<const WifiPpdu> ppdu, WifiTxVector txVector, Time duration, RxPowerWattPerChannelBand rxPower);
+  Ptr<Event> Add (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing = false);
 
   /**
    * Add a non-Wifi signal to interference helper.
@@ -230,7 +217,7 @@
    *
    * \return struct of SNR and PER (with PER being evaluated over the provided time window)
    */
-  struct InterferenceHelper::SnrPer CalculatePayloadSnrPer (Ptr<Event> event, uint16_t channelWidth, WifiSpectrumBand band,
+  struct PhyEntity::SnrPer CalculatePayloadSnrPer (Ptr<Event> event, uint16_t channelWidth, WifiSpectrumBand band,
                                                             uint16_t staId, std::pair<Time, Time> relativeMpduStartStop) const;
   /**
    * Calculate the SNIR for the event (starting from now until the event end).
@@ -244,25 +231,18 @@
    */
   double CalculateSnr (Ptr<Event> event, uint16_t channelWidth, uint8_t nss, WifiSpectrumBand band) const;
   /**
-   * Calculate the SNIR at the start of the non-HT PHY header and accumulate
-   * all SNIR changes in the SNIR vector.
-   *
-   * \param event the event corresponding to the first time the corresponding PPDU arrives
-   * \param band identify the band used by the PSDU
-   *
-   * \return struct of SNR and PER
-   */
-  struct InterferenceHelper::SnrPer CalculateNonHtPhyHeaderSnrPer (Ptr<Event> event, WifiSpectrumBand band) const;
-  /**
-   * Calculate the SNIR at the start of the HT PHY header and accumulate
+   * Calculate the SNIR at the start of the PHY header and accumulate
    * all SNIR changes in the SNIR vector.
    *
    * \param event the event corresponding to the first time the corresponding PPDU arrives
+   * \param channelWidth the channel width (in MHz) for header measurement
    * \param band identify the band used by the PSDU
+   * \param header the PHY header to consider
    *
    * \return struct of SNR and PER
    */
-  struct InterferenceHelper::SnrPer CalculateHtPhyHeaderSnrPer (Ptr<Event> event, WifiSpectrumBand band) const;
+  struct PhyEntity::SnrPer CalculatePhyHeaderSnrPer (Ptr<Event> event, uint16_t channelWidth, WifiSpectrumBand band,
+                                                              WifiPpduField header) const;
 
   /**
    * Notify that RX has started.
@@ -270,13 +250,23 @@
   void NotifyRxStart ();
   /**
    * Notify that RX has ended.
+   * 
+   * \param endTime the end time of the signal
    */
-  void NotifyRxEnd ();
+  void NotifyRxEnd (Time endTime);
   /**
    * Erase all events.
    */
   void EraseEvents (void);
 
+  /**
+   * Update event to scale its received power (W) per band.
+   *
+   * \param event the event to be updated
+   * \param rxPower the received power (W) per band to be added to the current event
+   */
+  void UpdateEvent (Ptr<Event> event, RxPowerWattPerChannelBand rxPower);
+
 
 protected:
   /**
@@ -291,18 +281,30 @@
    */
   double CalculateSnr (double signal, double noiseInterference, uint16_t channelWidth, uint8_t nss) const;
   /**
-   * Calculate the success rate of the chunk given the SINR, duration, and Wi-Fi mode.
-   * The duration and mode are used to calculate how many bits are present in the chunk.
+   * Calculate the success rate of the chunk given the SINR, duration, and TXVECTOR.
+   * The duration and TXVECTOR are used to calculate how many bits are present in the chunk.
    *
    * \param snir the SINR
    * \param duration the duration of the chunk
    * \param mode the WifiMode
    * \param txVector the TXVECTOR
+   * \param field the PPDU field to which the chunk belongs to
    *
    * \return the success rate
    */
-  double CalculateChunkSuccessRate (double snir, Time duration, WifiMode mode, WifiTxVector txVector) const;
-
+  double CalculateChunkSuccessRate (double snir, Time duration, WifiMode mode, const WifiTxVector& txVector, WifiPpduField field) const;
+  /**
+   * Calculate the success rate of the payload chunk given the SINR, duration, and TXVECTOR.
+   * The duration and TXVECTOR are used to calculate how many bits are present in the payload chunk.
+   *
+   * \param snir the SINR
+   * \param duration the duration of the chunk
+   * \param txVector the TXVECTOR
+   * \param staId the station ID of the PSDU (only used for MU)
+   *
+   * \return the success rate
+   */
+  double CalculatePayloadChunkSuccessRate (double snir, Time duration, const WifiTxVector& txVector, uint16_t staId = SU_STA_ID) const;
 
 private:
   /**
@@ -318,6 +320,7 @@
      * \param event causes this NI change
      */
     NiChange (double power, Ptr<Event> event);
+    ~NiChange ();
     /**
      * Return the power
      *
@@ -356,9 +359,11 @@
   /**
    * Append the given Event.
    *
-   * \param event
+   * \param event the event to be appended
+   * \param isStartOfdmaRxing flag whether event corresponds to the start of the OFDMA payload reception (only used for UL-OFDMA)
    */
-  void AppendEvent (Ptr<Event> event);
+  void AppendEvent (Ptr<Event> event, bool isStartOfdmaRxing);
+
   /**
    * Calculate noise and interference power in W.
    *
@@ -370,18 +375,6 @@
    */
   double CalculateNoiseInterferenceW (Ptr<Event> event, NiChangesPerBand *nis, WifiSpectrumBand band) const;
   /**
-   * Calculate the success rate of the payload chunk given the SINR, duration, and Wi-Fi mode.
-   * The duration and mode are used to calculate how many bits are present in the chunk.
-   *
-   * \param snir the SINR
-   * \param duration the duration of the chunk
-   * \param txVector the TXVECTOR
-   * \param staId the station ID of the PSDU (only used for MU)
-   *
-   * \return the success rate
-   */
-  double CalculatePayloadChunkSuccessRate (double snir, Time duration, WifiTxVector txVector, uint16_t staId) const;
-  /**
    * Calculate the error rate of the given PHY payload only in the provided time
    * window (thus enabling per MPDU PER information). The PHY payload can be divided into
    * multiple chunks (e.g. due to interference from other transmissions).
@@ -398,27 +391,34 @@
   double CalculatePayloadPer (Ptr<const Event> event, uint16_t channelWidth, NiChangesPerBand *nis, WifiSpectrumBand band,
                               uint16_t staId, std::pair<Time, Time> window) const;
   /**
-   * Calculate the error rate of the non-HT PHY header. The non-HT PHY header
+   * Calculate the error rate of the PHY header. The PHY header
    * can be divided into multiple chunks (e.g. due to interference from other transmissions).
    *
    * \param event the event
    * \param nis the NiChanges
+   * \param channelWidth the channel width (in MHz) for header measurement
    * \param band the band
+   * \param header the PHY header to consider
    *
-   * \return the error rate of the non-HT PHY header
+   * \return the error rate of the HT PHY header
    */
-  double CalculateNonHtPhyHeaderPer (Ptr<const Event> event, NiChangesPerBand *nis, WifiSpectrumBand band) const;
+  double CalculatePhyHeaderPer (Ptr<const Event> event, NiChangesPerBand *nis,
+                                uint16_t channelWidth, WifiSpectrumBand band,
+                                WifiPpduField header) const;
   /**
-   * Calculate the error rate of the HT PHY header. TheHT PHY header
-   * can be divided into multiple chunks (e.g. due to interference from other transmissions).
+   * Calculate the success rate of the PHY header sections for the provided event.
    *
    * \param event the event
    * \param nis the NiChanges
+   * \param channelWidth the channel width (in MHz) for header measurement
    * \param band the band
+   * \param phyHeaderSections the map of PHY header sections (\see PhyEntity::PhyHeaderSections)
    *
-   * \return the error rate of the HT PHY header
+   * \return the success rate of the PHY header sections
    */
-  double CalculateHtPhyHeaderPer (Ptr<const Event> event, NiChangesPerBand *nis, WifiSpectrumBand band) const;
+  double CalculatePhyHeaderSectionPsr (Ptr<const Event> event, NiChangesPerBand *nis,
+                                       uint16_t channelWidth, WifiSpectrumBand band,
+                                       PhyEntity::PhyHeaderSections phyHeaderSections) const;
 
   double m_noiseFigure;                                    //!< noise figure (linear)
   Ptr<ErrorRateModel> m_errorRateModel;                    //!< error rate model
@@ -434,7 +434,7 @@
    * \param band identify the band to check
    * \returns an iterator to the list of NiChanges
    */
-  NiChanges::const_iterator GetNextPosition (Time moment, WifiSpectrumBand band) const;
+  NiChanges::iterator GetNextPosition (Time moment, WifiSpectrumBand band);
   /**
    * Returns an iterator to the last NiChange that is before than moment
    *
@@ -442,7 +442,7 @@
    * \param band identify the band to check
    * \returns an iterator to the list of NiChanges
    */
-  NiChanges::const_iterator GetPreviousPosition (Time moment, WifiSpectrumBand band) const;
+  NiChanges::iterator GetPreviousPosition (Time moment, WifiSpectrumBand band);
 
   /**
    * Add NiChange to the list at the appropriate position and
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/mac-low.cc ns-3.34/src/wifi/model/mac-low.cc
--- ns-3.33/src/wifi/model/mac-low.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/mac-low.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,2607 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2005,2006 INRIA
- * Copyright (c) 2009 MIRKO BANCHI
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- *          Mirko Banchi <mk.banchi@gmail.com>
- *          Stefano Avallone <stavallo@unina.it>
- */
-
-#include "ns3/simulator.h"
-#include "ns3/log.h"
-#include "mac-low.h"
-#include "qos-txop.h"
-#include "snr-tag.h"
-#include "ampdu-tag.h"
-#include "wifi-mac-queue.h"
-#include "wifi-psdu.h"
-#include "wifi-utils.h"
-#include "ctrl-headers.h"
-#include "mgt-headers.h"
-#include "wifi-remote-station-manager.h"
-#include "mpdu-aggregator.h"
-#include "msdu-aggregator.h"
-#include "ampdu-subframe-header.h"
-#include "wifi-phy-listener.h"
-#include "wifi-mac-trailer.h"
-#include "wifi-phy.h"
-#include "wifi-net-device.h"
-#include "wifi-mac.h"
-#include <algorithm>
-#include "wifi-ack-policy-selector.h"
-
-#undef NS_LOG_APPEND_CONTEXT
-#define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] "
-
-// Time (in nanoseconds) to be added to the PSDU duration to yield the duration
-// of the timer that is started when the PHY indicates the start of the reception
-// of a frame and we are waiting for a response.
-#define PSDU_DURATION_SAFEGUARD 400
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("MacLow");
-
-/**
- * Listener for PHY events. Forwards to MacLow
- */
-class PhyMacLowListener : public ns3::WifiPhyListener
-{
-public:
-  /**
-   * Create a PhyMacLowListener for the given MacLow.
-   *
-   * \param macLow
-   */
-  PhyMacLowListener (ns3::MacLow *macLow)
-    : m_macLow (macLow)
-  {
-  }
-  virtual ~PhyMacLowListener ()
-  {
-  }
-  void NotifyRxStart (Time duration)
-  {
-  }
-  void NotifyRxEndOk (void)
-  {
-  }
-  void NotifyRxEndError (void)
-  {
-  }
-  void NotifyTxStart (Time duration, double txPowerDbm)
-  {
-  }
-  void NotifyMaybeCcaBusyStart (Time duration)
-  {
-  }
-  void NotifySwitchingStart (Time duration)
-  {
-    m_macLow->NotifySwitchingStartNow (duration);
-  }
-  void NotifySleep (void)
-  {
-    m_macLow->NotifySleepNow ();
-  }
-  void NotifyOff (void)
-  {
-    m_macLow->NotifyOffNow ();
-  }
-  void NotifyWakeup (void)
-  {
-  }
-  void NotifyOn (void)
-  {
-  }
-
-private:
-  ns3::MacLow *m_macLow; ///< the MAC
-};
-
-
-MacLow::MacLow ()
-  : m_msduAggregator (0),
-    m_mpduAggregator (0),
-    m_normalAckTimeoutEvent (),
-    m_blockAckTimeoutEvent (),
-    m_ctsTimeoutEvent (),
-    m_sendCtsEvent (),
-    m_sendAckEvent (),
-    m_sendDataEvent (),
-    m_waitIfsEvent (),
-    m_endTxNoAckEvent (),
-    m_currentPacket (0),
-    m_currentTxop (0),
-    m_lastNavStart (Seconds (0)),
-    m_lastNavDuration (Seconds (0)),
-    m_cfpStart (Seconds (0)),
-    m_lastBeacon (Seconds (0)),
-    m_cfpForeshortening (Seconds (0)),
-    m_promisc (false),
-    m_phyMacLowListener (0),
-    m_ctsToSelfSupported (false),
-    m_cfAckInfo ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-MacLow::~MacLow ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-/* static */
-TypeId
-MacLow::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::MacLow")
-    .SetParent<Object> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<MacLow> ()
-  ;
-  return tid;
-}
-
-void
-MacLow::SetupPhyMacLowListener (const Ptr<WifiPhy> phy)
-{
-  m_phyMacLowListener = new PhyMacLowListener (this);
-  phy->RegisterListener (m_phyMacLowListener);
-}
-
-void
-MacLow::RemovePhyMacLowListener (Ptr<WifiPhy> phy)
-{
-  if (m_phyMacLowListener != 0 )
-    {
-      phy->UnregisterListener (m_phyMacLowListener);
-      delete m_phyMacLowListener;
-      m_phyMacLowListener = 0;
-    }
-}
-
-void
-MacLow::DoDispose (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_normalAckTimeoutEvent.Cancel ();
-  m_blockAckTimeoutEvent.Cancel ();
-  m_ctsTimeoutEvent.Cancel ();
-  m_sendCtsEvent.Cancel ();
-  m_sendAckEvent.Cancel ();
-  m_sendDataEvent.Cancel ();
-  m_waitIfsEvent.Cancel ();
-  m_endTxNoAckEvent.Cancel ();
-  m_msduAggregator = 0;
-  m_mpduAggregator = 0;
-  m_phy = 0;
-  m_stationManager = 0;
-  if (m_phyMacLowListener != 0)
-    {
-      delete m_phyMacLowListener;
-      m_phyMacLowListener = 0;
-    }
-}
-
-void
-MacLow::CancelAllEvents (void)
-{
-  NS_LOG_FUNCTION (this);
-  bool oneRunning = false;
-  if (m_normalAckTimeoutEvent.IsRunning ())
-    {
-      m_normalAckTimeoutEvent.Cancel ();
-      oneRunning = true;
-    }
-  if (m_blockAckTimeoutEvent.IsRunning ())
-    {
-      m_blockAckTimeoutEvent.Cancel ();
-      oneRunning = true;
-    }
-  if (m_ctsTimeoutEvent.IsRunning ())
-    {
-      m_ctsTimeoutEvent.Cancel ();
-      oneRunning = true;
-    }
-  if (m_sendCtsEvent.IsRunning ())
-    {
-      m_sendCtsEvent.Cancel ();
-      oneRunning = true;
-    }
-  if (m_sendAckEvent.IsRunning ())
-    {
-      m_sendAckEvent.Cancel ();
-      oneRunning = true;
-    }
-  if (m_sendDataEvent.IsRunning ())
-    {
-      m_sendDataEvent.Cancel ();
-      oneRunning = true;
-    }
-  if (m_waitIfsEvent.IsRunning ())
-    {
-      m_waitIfsEvent.Cancel ();
-      oneRunning = true;
-    }
-  if (m_endTxNoAckEvent.IsRunning ())
-    {
-      m_endTxNoAckEvent.Cancel ();
-      oneRunning = true;
-    }
-  if (oneRunning && m_currentTxop != 0)
-    {
-      m_currentTxop->Cancel ();
-      m_currentTxop = 0;
-    }
-}
-
-void
-MacLow::SetPhy (const Ptr<WifiPhy> phy)
-{
-  m_phy = phy;
-  m_phy->TraceConnectWithoutContext ("PhyRxPayloadBegin", MakeCallback (&MacLow::RxStartIndication, this));
-  m_phy->SetReceiveOkCallback (MakeCallback (&MacLow::DeaggregateAmpduAndReceive, this));
-  m_phy->SetReceiveErrorCallback (MakeCallback (&MacLow::ReceiveError, this));
-  SetupPhyMacLowListener (phy);
-}
-
-Ptr<WifiPhy>
-MacLow::GetPhy (void) const
-{
-  return m_phy;
-}
-
-void
-MacLow::ResetPhy (void)
-{
-  m_phy->TraceDisconnectWithoutContext ("PhyRxPayloadBegin", MakeCallback (&MacLow::RxStartIndication, this));
-  m_phy->SetReceiveOkCallback (MakeNullCallback<void, Ptr<WifiPsdu>, double, WifiTxVector, std::vector<bool>> ());
-  m_phy->SetReceiveErrorCallback (MakeNullCallback<void, Ptr<WifiPsdu>> ());
-  RemovePhyMacLowListener (m_phy);
-  m_phy = 0;
-}
-
-Ptr<QosTxop>
-MacLow::GetEdca (uint8_t tid) const
-{
-  auto it = m_edca.find (QosUtilsMapTidToAc (tid));
-  NS_ASSERT (it != m_edca.end ());
-  return it->second;
-}
-
-void
-MacLow::SetMac (const Ptr<WifiMac> mac)
-{
-  m_mac = mac;
-}
-
-void
-MacLow::SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> manager)
-{
-  m_stationManager = manager;
-}
-
-Ptr<MsduAggregator>
-MacLow::GetMsduAggregator (void) const
-{
-  return m_msduAggregator;
-}
-
-Ptr<MpduAggregator>
-MacLow::GetMpduAggregator (void) const
-{
-  return m_mpduAggregator;
-}
-
-void
-MacLow::SetMsduAggregator (const Ptr<MsduAggregator> aggr)
-{
-  NS_LOG_FUNCTION (this << aggr);
-  m_msduAggregator = aggr;
-}
-
-void
-MacLow::SetMpduAggregator (const Ptr<MpduAggregator> aggr)
-{
-  NS_LOG_FUNCTION (this << aggr);
-  m_mpduAggregator = aggr;
-}
-
-void
-MacLow::SetAddress (Mac48Address ad)
-{
-  m_self = ad;
-}
-
-void
-MacLow::SetCtsToSelfSupported (bool enable)
-{
-  m_ctsToSelfSupported = enable;
-}
-
-bool
-MacLow::GetCtsToSelfSupported (void) const
-{
-  return m_ctsToSelfSupported;
-}
-
-void
-MacLow::SetBeaconInterval (Time interval)
-{
-  m_beaconInterval = interval;
-}
-
-void
-MacLow::SetCfpMaxDuration (Time cfpMaxDuration)
-{
-  m_cfpMaxDuration = cfpMaxDuration;
-}
-
-void
-MacLow::SetBssid (Mac48Address bssid)
-{
-  m_bssid = bssid;
-}
-
-void
-MacLow::SetPromisc (void)
-{
-  m_promisc = true;
-}
-
-Mac48Address
-MacLow::GetAddress (void) const
-{
-  return m_self;
-}
-
-Time
-MacLow::GetSifs (void) const
-{
-  return m_phy->GetSifs ();
-}
-
-Time
-MacLow::GetSlotTime (void) const
-{
-  return m_phy->GetSlot ();
-}
-
-Time
-MacLow::GetPifs (void) const
-{
-  return m_phy->GetPifs ();
-}
-
-Mac48Address
-MacLow::GetBssid (void) const
-{
-  return m_bssid;
-}
-
-Time
-MacLow::GetBeaconInterval (void) const
-{
-  return m_beaconInterval;
-}
-
-Time
-MacLow::GetCfpMaxDuration (void) const
-{
-  return m_cfpMaxDuration;
-}
-
-bool
-MacLow::IsPromisc (void) const
-{
-  return m_promisc;
-}
-
-void
-MacLow::SetRxCallback (Callback<void, Ptr<WifiMacQueueItem>> callback)
-{
-  m_rxCallback = callback;
-}
-
-void
-MacLow::RegisterChannelAccessManager (Ptr<ChannelAccessManager> channelAccessManager)
-{
-  m_channelAccessManagers.push_back (channelAccessManager);
-}
-
-void
-MacLow::StartTransmission (Ptr<WifiMacQueueItem> mpdu,
-                           MacLowTransmissionParameters params,
-                           Ptr<Txop> txop)
-{
-  NS_LOG_FUNCTION (this << *mpdu << params << txop);
-  NS_ASSERT (!m_cfAckInfo.expectCfAck);
-  if (m_phy->IsStateOff ())
-    {
-      NS_LOG_DEBUG ("Cannot start TX because device is OFF");
-      return;
-    }
-  /* m_currentPacket is not NULL because someone started
-   * a transmission and was interrupted before one of:
-   *   - ctsTimeout
-   *   - sendDataAfterCTS
-   * expired. This means that one of these timers is still
-   * running. They are all cancelled below anyway by the
-   * call to CancelAllEvents (because of at least one
-   * of these two timers) which will trigger a call to the
-   * previous listener's cancel method.
-   *
-   * This typically happens because the high-priority
-   * QapScheduler has taken access to the channel from
-   * one of the EDCA of the QAP.
-   */
-  m_currentPacket = Create<WifiPsdu> (mpdu, false);
-  const WifiMacHeader& hdr = mpdu->GetHeader ();
-  CancelAllEvents ();
-  m_currentTxop = txop;
-  m_txParams = params;
-  if (hdr.IsCtl ())
-    {
-      m_currentTxVector = GetRtsTxVector (mpdu);
-    }
-  else
-    {
-      m_currentTxVector = GetDataTxVector (mpdu);
-    }
-
-  /* The packet received by this function can be any of the following:
-   * (a) a management frame dequeued from the Txop
-   * (b) a non-QoS data frame dequeued from the Txop
-   * (c) a non-group addressed QoS Data frame peeked or dequeued from a QosTxop
-   * (d) a group addressed QoS data or DELBA Request frame dequeued from a QosTxop
-   * (e) a BlockAckReq or ADDBA Request frame
-   * (f) a fragment of non-QoS/QoS Data frame dequeued from the Txop/QosTxop
-   */
-  if (hdr.IsQosData () && !hdr.GetAddr1 ().IsGroup ()
-      && !hdr.IsMoreFragments () && hdr.GetFragmentNumber () == 0)
-    {
-      // We get here if the received packet is a non-broadcast QoS data frame
-      uint8_t tid = hdr.GetQosTid ();
-      Ptr<QosTxop> qosTxop = m_edca.find (QosUtilsMapTidToAc (tid))->second;
-
-      // if a TXOP limit exists, compute the remaining TXOP duration
-      Time txopLimit = Time::Min ();
-      if (m_currentTxop->GetTxopLimit ().IsStrictlyPositive ())
-        {
-          txopLimit = m_currentTxop->GetTxopRemaining () - CalculateOverheadTxTime (mpdu, m_txParams);
-          NS_ASSERT (txopLimit.IsPositive ());
-        }
-
-      // QosTxop may send us a peeked frame
-      Ptr<const WifiMacQueueItem> tmp = qosTxop->PeekNextFrame ();
-      bool isPeeked = (tmp != 0 && tmp->GetPacket () == mpdu->GetPacket ());
-
-      Ptr<WifiMacQueueItem> newMpdu;
-      // If the frame has been peeked, dequeue it if it meets the size and duration constraints
-      if (isPeeked)
-        {
-          newMpdu = qosTxop->DequeuePeekedFrame (mpdu, m_currentTxVector, true, 0, txopLimit);
-        }
-      else if (IsWithinSizeAndTimeLimits (mpdu, m_currentTxVector, 0, txopLimit))
-        {
-          newMpdu = mpdu;
-        }
-
-      if (newMpdu == 0)
-        {
-          // if the frame has been dequeued, then there is no BA agreement with the
-          // receiver (otherwise the frame would have been peeked). Hence, the frame
-          // has been sent under Normal Ack policy, not acknowledged and now retransmitted.
-          // If we cannot send it now, let the QosTxop retransmit it again.
-          // If the frame has been just peeked, reset the current packet at QosTxop.
-          if (isPeeked)
-            {
-              qosTxop->UpdateCurrentPacket (Create<WifiMacQueueItem> (nullptr, WifiMacHeader ()));
-            }
-          return;
-        }
-      // Update the current packet at QosTxop, given that A-MSDU aggregation may have
-      // been performed on the peeked frame
-      qosTxop->UpdateCurrentPacket (newMpdu);
-
-      //Perform MPDU aggregation if possible
-      std::vector<Ptr<WifiMacQueueItem>> mpduList;
-      if (m_mpduAggregator != 0)
-        {
-          mpduList = m_mpduAggregator->GetNextAmpdu (newMpdu, m_currentTxVector, txopLimit);
-        }
-
-      if (mpduList.size () > 1)
-        {
-          m_currentPacket = Create<WifiPsdu> (mpduList);
-
-          NS_LOG_DEBUG ("tx unicast A-MPDU containing " << mpduList.size () << " MPDUs");
-          qosTxop->SetAmpduExist (hdr.GetAddr1 (), true);
-        }
-      else if (m_currentTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_VHT
-               || m_currentTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HE)
-        {
-          // VHT/HE single MPDU
-          m_currentPacket = Create<WifiPsdu> (newMpdu, true);
-
-          NS_LOG_DEBUG ("tx unicast S-MPDU with sequence number " << hdr.GetSequenceNumber ());
-          qosTxop->SetAmpduExist (hdr.GetAddr1 (), true);
-        }
-      else  // HT
-        {
-          m_currentPacket = Create<WifiPsdu> (newMpdu, false);
-        }
-
-      // A QoS Txop must have an installed ack policy selector
-      NS_ASSERT (qosTxop->GetAckPolicySelector () != 0);
-      qosTxop->GetAckPolicySelector ()->UpdateTxParams (m_currentPacket, m_txParams);
-      qosTxop->GetAckPolicySelector ()->SetAckPolicy (m_currentPacket, m_txParams);
-    }
-
-  NS_LOG_DEBUG ("startTx size=" << m_currentPacket->GetSize () <<
-                ", to=" << m_currentPacket->GetAddr1 () << ", txop=" << m_currentTxop);
-
-  if (m_txParams.MustSendRts ())
-    {
-      SendRtsForPacket ();
-    }
-  else
-    {
-      if ((m_ctsToSelfSupported || m_stationManager->GetUseNonErpProtection ()) && NeedCtsToSelf ())
-        {
-          SendCtsToSelf ();
-        }
-      else
-        {
-          SendDataPacket ();
-        }
-    }
-
-  /* When this method completes, either we have taken ownership of the medium or the device switched off in the meantime. */
-  NS_ASSERT (m_phy->IsStateTx () || m_phy->IsStateOff ());
-}
-
-bool
-MacLow::NeedCtsToSelf (void) const
-{
-  WifiTxVector dataTxVector = GetDataTxVector (*m_currentPacket->begin ());
-  return m_stationManager->NeedCtsToSelf (dataTxVector);
-}
-
-bool
-MacLow::IsWithinSizeAndTimeLimits (Ptr<const WifiMacQueueItem> mpdu, WifiTxVector txVector,
-                                    uint32_t ampduSize, Time ppduDurationLimit)
-{
-  NS_ASSERT (mpdu != 0 && mpdu->GetHeader ().IsQosData ());
-
-  return IsWithinSizeAndTimeLimits (mpdu->GetSize (), mpdu->GetHeader ().GetAddr1 (),
-                                    mpdu->GetHeader ().GetQosTid (), txVector,
-                                    ampduSize, ppduDurationLimit);
-}
-
-bool
-MacLow::IsWithinSizeAndTimeLimits (uint32_t mpduSize, Mac48Address receiver, uint8_t tid,
-                                    WifiTxVector txVector, uint32_t ampduSize, Time ppduDurationLimit)
-{
-  NS_LOG_FUNCTION (this << mpduSize << receiver << +tid << txVector << ampduSize << ppduDurationLimit);
-
-  if (ppduDurationLimit != Time::Min () && ppduDurationLimit.IsNegative ())
-    {
-      return false;
-    }
-
-  WifiModulationClass modulation = txVector.GetMode ().GetModulationClass ();
-
-  uint32_t maxAmpduSize = 0;
-  if (GetMpduAggregator ())
-    {
-      maxAmpduSize = GetMpduAggregator ()->GetMaxAmpduSize (receiver, tid, modulation);
-    }
-
-  // If maxAmpduSize is null, then ampduSize must be null as well
-  NS_ASSERT (maxAmpduSize || ampduSize == 0);
-
-  uint32_t ppduPayloadSize = mpduSize;
-
-  // compute the correct size for A-MPDUs and S-MPDUs
-  if (ampduSize > 0 || modulation >= WIFI_MOD_CLASS_VHT)
-    {
-      ppduPayloadSize = GetMpduAggregator ()->GetSizeIfAggregated (mpduSize, ampduSize);
-    }
-
-  if (maxAmpduSize > 0 && ppduPayloadSize > maxAmpduSize)
-    {
-      NS_LOG_DEBUG ("the frame does not meet the constraint on max A-MPDU size");
-      return false;
-    }
-
-  // Get the maximum PPDU Duration based on the preamble type
-  Time maxPpduDuration = GetPpduMaxTime (txVector.GetPreambleType ());
-
-  Time txTime = m_phy->CalculateTxDuration (ppduPayloadSize, txVector, m_phy->GetPhyBand ());
-
-  if ((ppduDurationLimit.IsStrictlyPositive () && txTime > ppduDurationLimit)
-      || (maxPpduDuration.IsStrictlyPositive () && txTime > maxPpduDuration))
-    {
-      NS_LOG_DEBUG ("the frame does not meet the constraint on max PPDU duration");
-      return false;
-    }
-
-  return true;
-}
-
-void
-MacLow::RxStartIndication (WifiTxVector txVector, Time psduDuration)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("PSDU reception started for " << psduDuration.ToDouble (Time::US)
-                << " us (txVector: " << txVector << ")");
-  if (psduDuration.IsZero ())
-    {
-      //PHY-RXEND immediately follows PHY-RXSTART (e.g. when PPDU has been filtered), no need to reschedule timeouts (CCA will take over)
-      return;
-    }
-  NS_ASSERT (psduDuration.IsStrictlyPositive ());
-
-  if (m_normalAckTimeoutEvent.IsRunning ())
-    {
-      // we are waiting for a Normal Ack and something arrived
-      NS_LOG_DEBUG ("Rescheduling Normal Ack timeout");
-      m_normalAckTimeoutEvent.Cancel ();
-      NotifyAckTimeoutResetNow ();
-      m_normalAckTimeoutEvent = Simulator::Schedule (psduDuration + NanoSeconds (PSDU_DURATION_SAFEGUARD),
-                                                     &MacLow::NormalAckTimeout, this);
-    }
-  else if (m_blockAckTimeoutEvent.IsRunning ())
-    {
-      // we are waiting for a BlockAck and something arrived
-      NS_LOG_DEBUG ("Rescheduling Block Ack timeout");
-      m_blockAckTimeoutEvent.Cancel ();
-      NotifyAckTimeoutResetNow ();
-      m_blockAckTimeoutEvent = Simulator::Schedule (psduDuration + NanoSeconds (PSDU_DURATION_SAFEGUARD),
-                                                    &MacLow::BlockAckTimeout, this);
-    }
-  else if (m_ctsTimeoutEvent.IsRunning ())
-    {
-      // we are waiting for a CTS and something arrived
-      NS_LOG_DEBUG ("Rescheduling CTS timeout");
-      m_ctsTimeoutEvent.Cancel ();
-      NotifyCtsTimeoutResetNow ();
-      m_ctsTimeoutEvent = Simulator::Schedule (psduDuration + NanoSeconds (PSDU_DURATION_SAFEGUARD),
-                                               &MacLow::CtsTimeout, this);
-    }
-  else if (m_navCounterResetCtsMissed.IsRunning ())
-    {
-      NS_LOG_DEBUG ("Cannot reset NAV");
-      m_navCounterResetCtsMissed.Cancel ();
-    }
-}
-
-void
-MacLow::ReceiveError (Ptr<WifiPsdu> psdu)
-{
-  NS_LOG_FUNCTION (this << *psdu);
-  NS_LOG_DEBUG ("rx failed");
-  if (IsCfPeriod () && m_currentPacket->GetHeader (0).IsCfPoll ())
-    {
-      NS_ASSERT (m_currentTxop != 0);
-      m_currentTxop->MissedCfPollResponse (m_cfAckInfo.expectCfAck);
-    }
-  else if (m_cfAckInfo.expectCfAck)
-    {
-      NS_ASSERT (m_currentTxop != 0);
-      Ptr<Txop> txop = m_currentTxop;
-      m_currentTxop = 0;
-      txop->MissedAck ();
-    }
-  m_cfAckInfo.expectCfAck = false;
-  return;
-}
-
-void
-MacLow::NotifySwitchingStartNow (Time duration)
-{
-  NS_LOG_DEBUG ("switching channel. Cancelling MAC pending events");
-  m_stationManager->Reset ();
-  CancelAllEvents ();
-  if (m_navCounterResetCtsMissed.IsRunning ())
-    {
-      m_navCounterResetCtsMissed.Cancel ();
-    }
-  m_lastNavStart = Simulator::Now ();
-  m_lastNavDuration = Seconds (0);
-  m_currentPacket = 0;
-  m_currentTxop = 0;
-}
-
-void
-MacLow::NotifySleepNow (void)
-{
-  NS_LOG_DEBUG ("Device in sleep mode. Cancelling MAC pending events");
-  CancelAllEvents ();
-  if (m_navCounterResetCtsMissed.IsRunning ())
-    {
-      m_navCounterResetCtsMissed.Cancel ();
-    }
-  m_lastNavStart = Simulator::Now ();
-  m_lastNavDuration = Seconds (0);
-  m_currentPacket = 0;
-  m_currentTxop = 0;
-}
-
-void
-MacLow::NotifyOffNow (void)
-{
-  NS_LOG_DEBUG ("Device is switched off. Cancelling MAC pending events");
-  CancelAllEvents ();
-  if (m_navCounterResetCtsMissed.IsRunning ())
-    {
-      m_navCounterResetCtsMissed.Cancel ();
-    }
-  m_lastNavStart = Simulator::Now ();
-  m_lastNavDuration = Seconds (0);
-  m_currentPacket = 0;
-  m_currentTxop = 0;
-}
-
-void
-MacLow::ReceiveOk (Ptr<WifiMacQueueItem> mpdu, double rxSnr, WifiTxVector txVector, bool ampduSubframe)
-{
-  NS_LOG_FUNCTION (this << *mpdu << rxSnr << txVector);
-  /* An MPDU is received from the PHY.
-   * When we have handled this MPDU,
-   * we handle any packet present in the
-   * packet queue.
-   */
-  const WifiMacHeader& hdr = mpdu->GetHeader ();
-  Ptr<Packet> packet = mpdu->GetPacket ()->Copy ();
-
-  bool isPrevNavZero = IsNavZero ();
-  NS_LOG_DEBUG ("duration/id=" << hdr.GetDuration ());
-  NotifyNav (packet, hdr);
-  if (hdr.IsRts ())
-    {
-      /* see section 9.2.5.7 802.11-1999
-       * A STA that is addressed by an RTS frame shall transmit a CTS frame after a SIFS
-       * period if the NAV at the STA receiving the RTS frame indicates that the medium is
-       * idle. If the NAV at the STA receiving the RTS indicates the medium is not idle,
-       * that STA shall not respond to the RTS frame.
-       */
-      if (ampduSubframe)
-        {
-          NS_FATAL_ERROR ("Received RTS as part of an A-MPDU");
-        }
-      else
-        {
-          if (isPrevNavZero
-              && hdr.GetAddr1 () == m_self)
-            {
-              NS_LOG_DEBUG ("rx RTS from=" << hdr.GetAddr2 () << ", schedule CTS");
-              NS_ASSERT (m_sendCtsEvent.IsExpired ());
-              m_stationManager->ReportRxOk (hdr.GetAddr2 (),
-                                            rxSnr, txVector.GetMode ());
-              m_sendCtsEvent = Simulator::Schedule (GetSifs (),
-                                                    &MacLow::SendCtsAfterRts, this,
-                                                    hdr.GetAddr2 (),
-                                                    hdr.GetDuration (),
-                                                    txVector,
-                                                    rxSnr);
-            }
-          else
-            {
-              NS_LOG_DEBUG ("rx RTS from=" << hdr.GetAddr2 () << ", cannot schedule CTS");
-            }
-        }
-    }
-  else if (hdr.IsCts ()
-           && hdr.GetAddr1 () == m_self
-           && m_ctsTimeoutEvent.IsRunning ()
-           && m_currentPacket != 0)
-    {
-      if (ampduSubframe)
-        {
-          NS_FATAL_ERROR ("Received CTS as part of an A-MPDU");
-        }
-
-      NS_LOG_DEBUG ("received cts from=" << m_currentPacket->GetAddr1 ());
-
-      SnrTag tag;
-      packet->RemovePacketTag (tag);
-      m_stationManager->ReportRxOk (m_currentPacket->GetAddr1 (),
-                                    rxSnr, txVector.GetMode ());
-      m_stationManager->ReportRtsOk (m_currentPacket->GetAddr1 (), &m_currentPacket->GetHeader (0),
-                                     rxSnr, txVector.GetMode (), tag.Get ());
-
-      m_ctsTimeoutEvent.Cancel ();
-      NotifyCtsTimeoutResetNow ();
-      NS_ASSERT (m_sendDataEvent.IsExpired ());
-      m_sendDataEvent = Simulator::Schedule (GetSifs (),
-                                             &MacLow::SendDataAfterCts, this,
-                                             hdr.GetDuration ());
-    }
-  else if (hdr.IsAck ()
-           && hdr.GetAddr1 () == m_self
-           && m_normalAckTimeoutEvent.IsRunning ()
-           && m_txParams.MustWaitNormalAck ())
-    {
-      NS_LOG_DEBUG ("receive ack from=" << m_currentPacket->GetAddr1 ());
-      SnrTag tag;
-      packet->RemovePacketTag (tag);
-      //When fragmentation is used, only update manager when the last fragment is acknowledged
-      if (!m_txParams.HasNextPacket ())
-        {
-          m_stationManager->ReportRxOk (m_currentPacket->GetAddr1 (),
-                                        rxSnr, txVector.GetMode ());
-          m_stationManager->ReportDataOk (m_currentPacket->GetAddr1 (), &m_currentPacket->GetHeader (0),
-                                          rxSnr, txVector.GetMode (), tag.Get (),
-                                          m_currentTxVector, m_currentPacket->GetSize ());
-        }
-      // cancel the Normal Ack timer
-      m_normalAckTimeoutEvent.Cancel ();
-      NotifyAckTimeoutResetNow ();
-      m_currentTxop->GotAck ();
-
-      if (m_txParams.HasNextPacket ())
-        {
-          m_waitIfsEvent = Simulator::Schedule (GetSifs (), &MacLow::WaitIfsAfterEndTxFragment, this);
-        }
-      else if (m_currentPacket->GetHeader (0).IsQosData () && m_currentTxop->IsQosTxop () &&
-               m_currentTxop->GetTxopLimit ().IsStrictlyPositive () && m_currentTxop->GetTxopRemaining () > GetSifs ())
-        {
-          m_waitIfsEvent = Simulator::Schedule (GetSifs (), &MacLow::WaitIfsAfterEndTxPacket, this);
-        }
-      else if (m_currentTxop->IsQosTxop ())
-        {
-          m_currentTxop->TerminateTxop ();
-        }
-    }
-  else if (hdr.IsBlockAck () && hdr.GetAddr1 () == m_self
-           && m_txParams.MustWaitBlockAck ()
-           && m_blockAckTimeoutEvent.IsRunning ())
-    {
-      NS_LOG_DEBUG ("got block ack from " << hdr.GetAddr2 ());
-      SnrTag tag;
-      packet->RemovePacketTag (tag);
-      CtrlBAckResponseHeader blockAck;
-      packet->RemoveHeader (blockAck);
-      m_blockAckTimeoutEvent.Cancel ();
-      NotifyAckTimeoutResetNow ();
-      m_currentTxop->GotBlockAck (&blockAck, hdr.GetAddr2 (), rxSnr, tag.Get (), m_currentTxVector);
-      // start next packet if TXOP remains, otherwise contend for accessing the channel again
-      if (m_currentTxop->IsQosTxop () && m_currentTxop->GetTxopLimit ().IsStrictlyPositive ()
-          && m_currentTxop->GetTxopRemaining () > GetSifs ())
-        {
-          m_waitIfsEvent = Simulator::Schedule (GetSifs (), &MacLow::WaitIfsAfterEndTxPacket, this);
-        }
-      else if (m_currentTxop->IsQosTxop ())
-        {
-          m_currentTxop->TerminateTxop ();
-        }
-    }
-  else if (hdr.IsBlockAckReq () && hdr.GetAddr1 () == m_self)
-    {
-      m_stationManager->ReportRxOk (hdr.GetAddr2 (), rxSnr, txVector.GetMode ());
-
-      CtrlBAckRequestHeader blockAckReq;
-      packet->RemoveHeader (blockAckReq);
-      if (!blockAckReq.IsMultiTid ())
-        {
-          uint8_t tid = blockAckReq.GetTidInfo ();
-          AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), tid));
-          if (it != m_bAckAgreements.end ())
-            {
-              //Update block ack cache
-              BlockAckCachesI i = m_bAckCaches.find (std::make_pair (hdr.GetAddr2 (), tid));
-              NS_ASSERT (i != m_bAckCaches.end ());
-              (*i).second.UpdateWithBlockAckReq (blockAckReq.GetStartingSequence ());
-
-              //NS_ASSERT (m_sendAckEvent.IsExpired ());
-              m_sendAckEvent.Cancel ();
-              /* See section 11.5.3 in IEEE 802.11 for mean of this timer */
-              ResetBlockAckInactivityTimerIfNeeded (it->second.first);
-              if ((*it).second.first.IsImmediateBlockAck ())
-                {
-                  NS_LOG_DEBUG ("rx blockAckRequest/sendImmediateBlockAck from=" << hdr.GetAddr2 ());
-                  m_sendAckEvent = Simulator::Schedule (GetSifs (),
-                                                        &MacLow::SendBlockAckAfterBlockAckRequest, this,
-                                                        blockAckReq,
-                                                        hdr.GetAddr2 (),
-                                                        hdr.GetDuration (),
-                                                        txVector.GetMode (),
-                                                        rxSnr);
-                }
-              else
-                {
-                  NS_FATAL_ERROR ("Delayed block ack not supported.");
-                }
-            }
-          else
-            {
-              NS_LOG_DEBUG ("There's not a valid agreement for this block ack request.");
-            }
-        }
-      else
-        {
-          NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
-        }
-    }
-  else if (hdr.IsCtl ())
-    {
-      if (hdr.IsCfEnd ())
-        {
-          NS_LOG_DEBUG ("rx CF-END ");
-          m_cfpStart = NanoSeconds (0);
-          if (m_cfAckInfo.expectCfAck)
-            {
-              NS_ASSERT (m_currentTxop != 0);
-              if (hdr.IsCfAck ())
-                {
-                  m_currentTxop->GotAck ();
-                }
-              else
-                {
-                  m_currentTxop->MissedAck ();
-                }
-            }
-          if (m_currentTxop != 0)
-            {
-              m_currentTxop->GotCfEnd ();
-            }
-          m_cfAckInfo.expectCfAck = false;
-        }
-      else
-        {
-          NS_LOG_DEBUG ("rx drop " << hdr.GetTypeString ());
-        }
-    }
-  else if (hdr.GetAddr1 () == m_self)
-    {
-      if (hdr.IsCfPoll ())
-        {
-          m_cfpStart = Simulator::Now ();
-          if (m_cfAckInfo.expectCfAck && !hdr.IsCfAck ())
-            {
-              NS_ASSERT (m_currentTxop != 0);
-              Ptr<Txop> txop = m_currentTxop;
-              m_currentTxop = 0;
-              txop->MissedAck ();
-              m_cfAckInfo.expectCfAck = false;
-            }
-        }
-      m_stationManager->ReportRxOk (hdr.GetAddr2 (),
-                                    rxSnr, txVector.GetMode ());
-      if (hdr.IsQosData () && ReceiveMpdu (mpdu))
-        {
-          /* From section 9.10.4 in IEEE 802.11:
-             Upon the receipt of a QoS data frame from the originator for which
-             the block ack agreement exists, the recipient shall buffer the MSDU
-             regardless of the value of the Ack Policy subfield within the
-             QoS Control field of the QoS data frame. */
-          if (hdr.IsQosAck () && !ampduSubframe)
-            {
-              NS_LOG_DEBUG ("rx QoS unicast/sendAck from=" << hdr.GetAddr2 ());
-              AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
-
-              RxCompleteBufferedPacketsWithSmallerSequence (it->second.first.GetStartingSequenceControl (),
-                                                            hdr.GetAddr2 (), hdr.GetQosTid ());
-              RxCompleteBufferedPacketsUntilFirstLost (hdr.GetAddr2 (), hdr.GetQosTid ());
-              NS_ASSERT (m_sendAckEvent.IsExpired ());
-              m_sendAckEvent = Simulator::Schedule (GetSifs (),
-                                                    &MacLow::SendAckAfterData, this,
-                                                    hdr.GetAddr2 (),
-                                                    hdr.GetDuration (),
-                                                    txVector.GetMode (),
-                                                    rxSnr);
-            }
-          else if (hdr.IsQosBlockAck ())
-            {
-              AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
-              /* See section 11.5.3 in IEEE 802.11 for mean of this timer */
-              ResetBlockAckInactivityTimerIfNeeded (it->second.first);
-            }
-          return;
-        }
-      else if (hdr.IsQosData () && hdr.IsQosBlockAck ())
-        {
-          /* This happens if a packet with ack policy Block Ack is received and a block ack
-             agreement for that packet doesn't exist.
-
-             From section 11.5.3 in IEEE 802.11e:
-             When a recipient does not have an active block ack for a TID, but receives
-             data MPDUs with the Ack Policy subfield set to Block Ack, it shall discard
-             them and shall send a DELBA frame using the normal access
-             mechanisms. */
-          AcIndex ac = QosUtilsMapTidToAc (hdr.GetQosTid ());
-          m_edca[ac]->SendDelbaFrame (hdr.GetAddr2 (), hdr.GetQosTid (), false);
-          return;
-        }
-      else if (hdr.IsQosData () && hdr.IsQosNoAck ())
-        {
-          if (ampduSubframe)
-            {
-              NS_LOG_DEBUG ("rx Ampdu with No Ack Policy from=" << hdr.GetAddr2 ());
-            }
-          else
-            {
-              NS_LOG_DEBUG ("rx unicast/noAck from=" << hdr.GetAddr2 ());
-            }
-        }
-      else if (hdr.IsData () || hdr.IsMgt ())
-        {
-          if (hdr.IsProbeResp ())
-            {
-              // Apply SNR tag for probe response quality measurements
-              SnrTag tag;
-              tag.Set (rxSnr);
-              packet->AddPacketTag (tag);
-              mpdu = Create<WifiMacQueueItem> (packet, hdr);
-            }
-          if (hdr.IsMgt () && ampduSubframe)
-            {
-              NS_FATAL_ERROR ("Received management packet as part of an A-MPDU");
-            }
-          else
-            {
-              if (IsCfPeriod ())
-                {
-                  if (hdr.HasData ())
-                    {
-                      m_cfAckInfo.appendCfAck = true;
-                      m_cfAckInfo.address = hdr.GetAddr2 ();
-                    }
-                }
-              else
-                {
-                  NS_LOG_DEBUG ("rx unicast/sendAck from=" << hdr.GetAddr2 ());
-                  NS_ASSERT (m_sendAckEvent.IsExpired ());
-                  m_sendAckEvent = Simulator::Schedule (GetSifs (),
-                                                        &MacLow::SendAckAfterData, this,
-                                                        hdr.GetAddr2 (),
-                                                        hdr.GetDuration (),
-                                                        txVector.GetMode (),
-                                                        rxSnr);
-                }
-            }
-        }
-      goto rxPacket;
-    }
-  else if (hdr.GetAddr1 ().IsGroup ())
-    {
-      if (ampduSubframe)
-        {
-          NS_FATAL_ERROR ("Received group addressed packet as part of an A-MPDU");
-        }
-      else
-        {
-          if (hdr.IsData () || hdr.IsMgt ())
-            {
-              NS_LOG_DEBUG ("rx group from=" << hdr.GetAddr2 ());
-              if (hdr.IsBeacon ())
-                {
-                  // Apply SNR tag for beacon quality measurements
-                  SnrTag tag;
-                  tag.Set (rxSnr);
-                  packet->AddPacketTag (tag);
-                  mpdu = Create<WifiMacQueueItem> (packet, hdr);
-                }
-              goto rxPacket;
-            }
-        }
-    }
-  else if (m_promisc)
-    {
-      NS_ASSERT (hdr.GetAddr1 () != m_self);
-      if (hdr.IsData ())
-        {
-          goto rxPacket;
-        }
-    }
-  else
-    {
-      if (m_cfAckInfo.expectCfAck && hdr.IsCfAck ())
-        {
-          m_cfAckInfo.expectCfAck = false;
-          NS_ASSERT (m_currentTxop != 0);
-          m_currentTxop->GotAck ();
-        }
-      NS_LOG_DEBUG ("rx not for me from=" << hdr.GetAddr2 ());
-    }
-  return;
-rxPacket:
-  if (m_cfAckInfo.expectCfAck && hdr.IsCfAck ())
-    {
-      m_cfAckInfo.expectCfAck = false;
-      NS_ASSERT (m_currentTxop != 0);
-      m_currentTxop->GotAck ();
-    }
-  m_rxCallback (mpdu);
-  return;
-}
-
-uint32_t
-MacLow::GetCfEndSize (void) const
-{
-  WifiMacHeader cfEnd;
-  if (m_cfAckInfo.expectCfAck || m_cfAckInfo.appendCfAck)
-    {
-      cfEnd.SetType (WIFI_MAC_CTL_END_ACK);
-    }
-  else
-    {
-      cfEnd.SetType (WIFI_MAC_CTL_END);
-    }
-  return cfEnd.GetSize () + 4;
-}
-
-Time
-MacLow::GetAckDuration (Mac48Address to, WifiTxVector dataTxVector) const
-{
-  WifiTxVector ackTxVector = GetAckTxVectorForData (to, dataTxVector.GetMode ());
-  return GetAckDuration (ackTxVector);
-}
-
-Time
-MacLow::GetAckDuration (WifiTxVector ackTxVector) const
-{
-  NS_ASSERT (ackTxVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HT); //Ack should always use non-HT PPDU (HT PPDU cases not supported yet)
-  return m_phy->CalculateTxDuration (GetAckSize (), ackTxVector, m_phy->GetPhyBand ());
-}
-
-Time
-MacLow::GetBlockAckDuration (WifiTxVector blockAckReqTxVector, BlockAckType type) const
-{
-  /*
-   * For immediate Basic BlockAck we should transmit the frame with the same WifiMode
-   * as the BlockAckReq.
-   */
-  return m_phy->CalculateTxDuration (GetBlockAckSize (type), blockAckReqTxVector, m_phy->GetPhyBand ());
-}
-
-Time
-MacLow::GetBlockAckRequestDuration (WifiTxVector blockAckReqTxVector, BlockAckType type) const
-{
-  return m_phy->CalculateTxDuration (GetBlockAckRequestSize (type), blockAckReqTxVector, m_phy->GetPhyBand ());
-}
-
-Time
-MacLow::GetCtsDuration (Mac48Address to, WifiTxVector rtsTxVector) const
-{
-  WifiTxVector ctsTxVector = GetCtsTxVectorForRts (to, rtsTxVector.GetMode ());
-  return GetCtsDuration (ctsTxVector);
-}
-
-Time
-MacLow::GetCtsDuration (WifiTxVector ctsTxVector) const
-{
-  NS_ASSERT (ctsTxVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HT); //CTS should always use non-HT PPDU (HT PPDU cases not supported yet)
-  return m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, m_phy->GetPhyBand ());
-}
-
-WifiTxVector
-MacLow::GetRtsTxVector (Ptr<const WifiMacQueueItem> item) const
-{
-  return m_stationManager->GetRtsTxVector (item->GetHeader ().GetAddr1 ());
-}
-
-WifiTxVector
-MacLow::GetDataTxVector (Ptr<const WifiMacQueueItem> item) const
-{
-  return m_stationManager->GetDataTxVector (item->GetHeader ());
-}
-
-Time
-MacLow::GetResponseDuration (const MacLowTransmissionParameters& params, WifiTxVector dataTxVector,
-                             Mac48Address receiver) const
-{
-  NS_LOG_FUNCTION (this << receiver << dataTxVector << params);
-
-  Time duration = Seconds (0);
-  if (params.MustWaitNormalAck ())
-    {
-      duration += GetSifs ();
-      duration += GetAckDuration (receiver, dataTxVector);
-    }
-  else if (params.MustWaitBlockAck ())
-    {
-      duration += GetSifs ();
-      WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_self, dataTxVector.GetMode ());
-      duration += GetBlockAckDuration (blockAckReqTxVector, params.GetBlockAckType ());
-    }
-  else if (params.MustSendBlockAckRequest ())
-    {
-      duration += 2 * GetSifs ();
-      WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_self, dataTxVector.GetMode ());
-      duration += GetBlockAckRequestDuration (blockAckReqTxVector, params.GetBlockAckRequestType ());
-      duration += GetBlockAckDuration (blockAckReqTxVector, params.GetBlockAckRequestType ());
-    }
-  return duration;
-}
-
-WifiMode
-MacLow::GetControlAnswerMode (WifiMode reqMode) const
-{
-  /**
-   * The standard has relatively unambiguous rules for selecting a
-   * control response rate (the below is quoted from IEEE 802.11-2012,
-   * Section 9.7):
-   *
-   * To allow the transmitting STA to calculate the contents of the
-   * Duration/ID field, a STA responding to a received frame shall
-   * transmit its Control Response frame (either CTS or Ack), other
-   * than the BlockAck control frame, at the highest rate in the
-   * BSSBasicRateSet parameter that is less than or equal to the
-   * rate of the immediately previous frame in the frame exchange
-   * sequence (as defined in Annex G) and that is of the same
-   * modulation class (see Section 9.7.8) as the received frame...
-   */
-  NS_LOG_FUNCTION (this << reqMode);
-  WifiMode mode = m_stationManager->GetDefaultMode ();
-  bool found = false;
-  //First, search the BSS Basic Rate set
-  for (uint8_t i = 0; i < m_stationManager->GetNBasicModes (); i++)
-    {
-      WifiMode testMode = m_stationManager->GetBasicMode (i);
-      if ((!found || testMode.IsHigherDataRate (mode))
-          && (!testMode.IsHigherDataRate (reqMode))
-          && (IsAllowedControlAnswerModulationClass (reqMode.GetModulationClass (), testMode.GetModulationClass ())))
-        {
-          mode = testMode;
-          //We've found a potentially-suitable transmit rate, but we
-          //need to continue and consider all the basic rates before
-          //we can be sure we've got the right one.
-          found = true;
-        }
-    }
-  if (m_stationManager->GetHtSupported ())
-    {
-      if (!found)
-        {
-          mode = m_stationManager->GetDefaultMcs ();
-          for (uint8_t i = 0; i != m_stationManager->GetNBasicMcs (); i++)
-            {
-              WifiMode testMode = m_stationManager->GetBasicMcs (i);
-              if ((!found || testMode.IsHigherDataRate (mode))
-                  && (!testMode.IsHigherDataRate (reqMode))
-                  && (testMode.GetModulationClass () == reqMode.GetModulationClass ()))
-                {
-                  mode = testMode;
-                  //We've found a potentially-suitable transmit rate, but we
-                  //need to continue and consider all the basic rates before
-                  //we can be sure we've got the right one.
-                  found = true;
-                }
-            }
-        }
-    }
-  //If we found a suitable rate in the BSSBasicRateSet, then we are
-  //done and can return that mode.
-  if (found)
-    {
-      NS_LOG_DEBUG ("MacLow::GetControlAnswerMode returning " << mode);
-      return mode;
-    }
-
-  /**
-   * If no suitable basic rate was found, we search the mandatory
-   * rates. The standard (IEEE 802.11-2007, Section 9.6) says:
-   *
-   *   ...If no rate contained in the BSSBasicRateSet parameter meets
-   *   these conditions, then the control frame sent in response to a
-   *   received frame shall be transmitted at the highest mandatory
-   *   rate of the PHY that is less than or equal to the rate of the
-   *   received frame, and that is of the same modulation class as the
-   *   received frame. In addition, the Control Response frame shall
-   *   be sent using the same PHY options as the received frame,
-   *   unless they conflict with the requirement to use the
-   *   BSSBasicRateSet parameter.
-   *
-   * \todo Note that we're ignoring the last sentence for now, because
-   * there is not yet any manipulation here of PHY options.
-   */
-  for (uint8_t idx = 0; idx < m_phy->GetNModes (); idx++)
-    {
-      WifiMode thismode = m_phy->GetMode (idx);
-      /* If the rate:
-       *
-       *  - is a mandatory rate for the PHY, and
-       *  - is equal to or faster than our current best choice, and
-       *  - is less than or equal to the rate of the received frame, and
-       *  - is of the same modulation class as the received frame
-       *
-       * ...then it's our best choice so far.
-       */
-      if (thismode.IsMandatory ()
-          && (!found || thismode.IsHigherDataRate (mode))
-          && (!thismode.IsHigherDataRate (reqMode))
-          && (IsAllowedControlAnswerModulationClass (reqMode.GetModulationClass (), thismode.GetModulationClass ())))
-        {
-          mode = thismode;
-          //As above; we've found a potentially-suitable transmit
-          //rate, but we need to continue and consider all the
-          //mandatory rates before we can be sure we've got the right one.
-          found = true;
-        }
-    }
-  if (m_stationManager->GetHtSupported () )
-    {
-      for (uint8_t idx = 0; idx < m_phy->GetNMcs (); idx++)
-        {
-          WifiMode thismode = m_phy->GetMcs (idx);
-          if (thismode.IsMandatory ()
-              && (!found || thismode.IsHigherDataRate (mode))
-              && (!thismode.IsHigherCodeRate (reqMode))
-              && (thismode.GetModulationClass () == reqMode.GetModulationClass ()))
-            {
-              mode = thismode;
-              //As above; we've found a potentially-suitable transmit
-              //rate, but we need to continue and consider all the
-              //mandatory rates before we can be sure we've got the right one.
-              found = true;
-            }
-        }
-    }
-
-  /**
-   * If we still haven't found a suitable rate for the response then
-   * someone has messed up the simulation configuration. This probably means
-   * that the WifiPhyStandard is not set correctly, or that a rate that
-   * is not supported by the PHY has been explicitly requested.
-   *
-   * Either way, it is serious - we can either disobey the standard or
-   * fail, and I have chosen to do the latter...
-   */
-  if (!found)
-    {
-      NS_FATAL_ERROR ("Can't find response rate for " << reqMode);
-    }
-
-  NS_LOG_DEBUG ("MacLow::GetControlAnswerMode returning " << mode);
-  return mode;
-}
-
-WifiTxVector
-MacLow::GetCtsTxVector (Mac48Address to, WifiMode rtsTxMode) const
-{
-  NS_ASSERT (!to.IsGroup ());
-  WifiMode ctsMode = GetControlAnswerMode (rtsTxMode);
-  WifiTxVector v;
-  v.SetMode (ctsMode);
-  v.SetPreambleType (GetPreambleForTransmission (ctsMode.GetModulationClass (), m_stationManager->GetShortPreambleEnabled (), m_stationManager->UseGreenfieldForDestination (to)));
-  v.SetTxPowerLevel (m_stationManager->GetDefaultTxPowerLevel ());
-  v.SetChannelWidth (GetChannelWidthForTransmission (ctsMode, m_phy->GetChannelWidth ()));
-   uint16_t ctsTxGuardInterval = ConvertGuardIntervalToNanoSeconds (ctsMode, DynamicCast<WifiNetDevice> (m_phy->GetDevice ()));
-  v.SetGuardInterval (ctsTxGuardInterval);
-  v.SetNss (1);
-  return v;
-}
-
-WifiTxVector
-MacLow::GetAckTxVector (Mac48Address to, WifiMode dataTxMode) const
-{
-  NS_ASSERT (!to.IsGroup ());
-  WifiMode ackMode = GetControlAnswerMode (dataTxMode);
-  WifiTxVector v;
-  v.SetMode (ackMode);
-  v.SetPreambleType (GetPreambleForTransmission (ackMode.GetModulationClass (), m_stationManager->GetShortPreambleEnabled (), m_stationManager->UseGreenfieldForDestination (to)));
-  v.SetTxPowerLevel (m_stationManager->GetDefaultTxPowerLevel ());
-  v.SetChannelWidth (GetChannelWidthForTransmission (ackMode, m_phy->GetChannelWidth ()));
-   uint16_t ackTxGuardInterval = ConvertGuardIntervalToNanoSeconds (ackMode, DynamicCast<WifiNetDevice> (m_phy->GetDevice ()));
-  v.SetGuardInterval (ackTxGuardInterval);
-  v.SetNss (1);
-  return v;
-}
-
-WifiTxVector
-MacLow::GetBlockAckTxVector (Mac48Address to, WifiMode dataTxMode) const
-{
-  NS_ASSERT (!to.IsGroup ());
-  WifiMode blockAckMode = GetControlAnswerMode (dataTxMode);
-  WifiTxVector v;
-  v.SetMode (blockAckMode);
-  v.SetPreambleType (GetPreambleForTransmission (blockAckMode.GetModulationClass (), m_stationManager->GetShortPreambleEnabled (), m_stationManager->UseGreenfieldForDestination (to)));
-  v.SetTxPowerLevel (m_stationManager->GetDefaultTxPowerLevel ());
-  v.SetChannelWidth (GetChannelWidthForTransmission (blockAckMode, m_phy->GetChannelWidth ()));
-uint16_t blockAckTxGuardInterval = ConvertGuardIntervalToNanoSeconds (blockAckMode, DynamicCast<WifiNetDevice> (m_phy->GetDevice ()));
-  v.SetGuardInterval (blockAckTxGuardInterval);
-  v.SetNss (1);
-  return v;
-}
-
-WifiTxVector
-MacLow::GetCtsTxVectorForRts (Mac48Address to, WifiMode rtsTxMode) const
-{
-  return GetCtsTxVector (to, rtsTxMode);
-}
-
-WifiTxVector
-MacLow::GetAckTxVectorForData (Mac48Address to, WifiMode dataTxMode) const
-{
-  return GetAckTxVector (to, dataTxMode);
-}
-
-Time
-MacLow::CalculateOverallTxTime (Ptr<const Packet> packet,
-                                const WifiMacHeader* hdr,
-                                const MacLowTransmissionParameters& params,
-                                uint32_t fragmentSize) const
-{
-  Ptr<const WifiMacQueueItem> item = Create<const WifiMacQueueItem> (packet, *hdr);
-  Time txTime = CalculateOverheadTxTime (item, params);
-  uint32_t dataSize;
-  if (fragmentSize > 0)
-    {
-      Ptr<const Packet> fragment = Create<Packet> (fragmentSize);
-      dataSize = GetSize (fragment, hdr, m_currentPacket && m_currentPacket->IsAggregate ());
-    }
-  else
-    {
-      dataSize = GetSize (packet, hdr, m_currentPacket && m_currentPacket->IsAggregate ());
-    }
-  txTime += m_phy->CalculateTxDuration (dataSize, GetDataTxVector (item), m_phy->GetPhyBand ());
-  return txTime;
-}
-
-Time
-MacLow::CalculateOverheadTxTime (Ptr<const WifiMacQueueItem> item,
-                                 const MacLowTransmissionParameters& params) const
-{
-  Time txTime = Seconds (0);
-  if (params.MustSendRts ())
-    {
-      WifiTxVector rtsTxVector = GetRtsTxVector (item);
-      txTime += m_phy->CalculateTxDuration (GetRtsSize (), rtsTxVector, m_phy->GetPhyBand ());
-      txTime += GetCtsDuration (item->GetHeader ().GetAddr1 (), rtsTxVector);
-      txTime += Time (GetSifs () * 2);
-    }
-  txTime += GetResponseDuration (params, GetDataTxVector (item), item->GetHeader ().GetAddr1 ());
-
-  return txTime;
-}
-
-Time
-MacLow::CalculateTransmissionTime (Ptr<const Packet> packet,
-                                   const WifiMacHeader* hdr,
-                                   const MacLowTransmissionParameters& params) const
-{
-  Time txTime = CalculateOverallTxTime (packet, hdr, params);
-  if (params.HasNextPacket ())
-    {
-      WifiTxVector dataTxVector = GetDataTxVector (Create<const WifiMacQueueItem> (packet, *hdr));
-      txTime += GetSifs ();
-      txTime += m_phy->CalculateTxDuration (params.GetNextPacketSize (), dataTxVector, m_phy->GetPhyBand ());
-    }
-  return txTime;
-}
-
-void
-MacLow::NotifyNav (Ptr<const Packet> packet, const WifiMacHeader &hdr)
-{
-  NS_ASSERT (m_lastNavStart <= Simulator::Now ());
-  if (hdr.GetRawDuration () > 32767)
-    {
-      //All stations process Duration field values less than or equal to 32 767 from valid data frames
-      //to update their NAV settings as appropriate under the coordination function rules.
-      return;
-    }
-  if (hdr.IsCfEnd () && hdr.GetAddr2 () == m_bssid)
-    {
-      //see section 9.3.2.2 802.11-1999
-      DoNavResetNow (Seconds (0));
-      return;
-    }
-  else if (hdr.GetAddr1 () != m_self)
-    {
-      // see section 9.2.5.4 802.11-1999
-      Time duration = hdr.GetDuration ();
-      bool navUpdated = DoNavStartNow (duration);
-      if (hdr.IsRts () && navUpdated)
-        {
-          /**
-           * A STA that used information from an RTS frame as the most recent basis to update its NAV setting
-           * is permitted to reset its NAV if no PHY-RXSTART.indication is detected from the PHY during a
-           * period with a duration of (2 * aSIFSTime) + (CTS_Time) + aRxPHYStartDelay + (2 * aSlotTime)
-           * starting at the PHY-RXEND.indication corresponding to the detection of the RTS frame. The
-           * “CTS_Time” shall be calculated using the length of the CTS frame and the data rate at which
-           * the RTS frame used for the most recent NAV update was received.
-           */
-          WifiMacHeader cts;
-          cts.SetType (WIFI_MAC_CTL_CTS);
-          WifiTxVector txVector = GetRtsTxVector (Create<const WifiMacQueueItem> (packet, hdr));
-          Time navCounterResetCtsMissedDelay =
-            m_phy->CalculateTxDuration (cts.GetSerializedSize (), txVector, m_phy->GetPhyBand ()) +
-            Time (2 * GetSifs ()) + Time (2 * GetSlotTime ()) +
-            m_phy->CalculatePhyPreambleAndHeaderDuration (txVector);
-          m_navCounterResetCtsMissed = Simulator::Schedule (navCounterResetCtsMissedDelay,
-                                                            &MacLow::DoNavResetNow, this,
-                                                            Seconds (0));
-        }
-    }
-}
-
-void
-MacLow::DoNavResetNow (Time duration)
-{
-  NS_LOG_FUNCTION (this << duration);
-  for (ChannelAccessManagersCI i = m_channelAccessManagers.begin (); i != m_channelAccessManagers.end (); i++)
-    {
-      (*i)->NotifyNavResetNow (duration);
-    }
-  m_lastNavStart = Simulator::Now ();
-  m_lastNavDuration = duration;
-}
-
-bool
-MacLow::DoNavStartNow (Time duration)
-{
-  for (ChannelAccessManagersCI i = m_channelAccessManagers.begin (); i != m_channelAccessManagers.end (); i++)
-    {
-      (*i)->NotifyNavStartNow (duration);
-    }
-  Time newNavEnd = Simulator::Now () + duration;
-  Time oldNavEnd = m_lastNavStart + m_lastNavDuration;
-  if (newNavEnd > oldNavEnd)
-    {
-      m_lastNavStart = Simulator::Now ();
-      m_lastNavDuration = duration;
-      return true;
-    }
-  return false;
-}
-
-void
-MacLow::NotifyAckTimeoutStartNow (Time duration)
-{
-  for (ChannelAccessManagersCI i = m_channelAccessManagers.begin (); i != m_channelAccessManagers.end (); i++)
-    {
-      (*i)->NotifyAckTimeoutStartNow (duration);
-    }
-}
-
-void
-MacLow::NotifyAckTimeoutResetNow (void)
-{
-  for (ChannelAccessManagersCI i = m_channelAccessManagers.begin (); i != m_channelAccessManagers.end (); i++)
-    {
-      (*i)->NotifyAckTimeoutResetNow ();
-    }
-}
-
-void
-MacLow::NotifyCtsTimeoutStartNow (Time duration)
-{
-  for (ChannelAccessManagersCI i = m_channelAccessManagers.begin (); i != m_channelAccessManagers.end (); i++)
-    {
-      (*i)->NotifyCtsTimeoutStartNow (duration);
-    }
-}
-
-void
-MacLow::NotifyCtsTimeoutResetNow (void)
-{
-  for (ChannelAccessManagersCI i = m_channelAccessManagers.begin (); i != m_channelAccessManagers.end (); i++)
-    {
-      (*i)->NotifyCtsTimeoutResetNow ();
-    }
-}
-
-void
-MacLow::ForwardDown (Ptr<const WifiPsdu> psdu, WifiTxVector txVector)
-{
-  NS_LOG_FUNCTION (this << psdu << txVector);
-
-  NS_ASSERT (psdu->GetNMpdus ());
-  const WifiMacHeader& hdr = (*psdu->begin ())->GetHeader ();
-
-  NS_LOG_DEBUG ("send " << hdr.GetTypeString () <<
-                ", to=" << hdr.GetAddr1 () <<
-                ", size=" << psdu->GetSize () <<
-                ", mode=" << txVector.GetMode  () <<
-                ", preamble=" << txVector.GetPreambleType () <<
-                ", duration=" << hdr.GetDuration () <<
-                ", seq=0x" << std::hex << hdr.GetSequenceControl () << std::dec);
-
-  if (hdr.IsCfPoll () && m_stationManager->GetPcfSupported ())
-    {
-      Simulator::Schedule (GetPifs () + m_phy->CalculateTxDuration (psdu->GetSize (), txVector, m_phy->GetPhyBand ()), &MacLow::CfPollTimeout, this);
-    }
-  if (hdr.IsBeacon () && m_stationManager->GetPcfSupported ())
-    {
-      if (Simulator::Now () > m_lastBeacon + m_beaconInterval)
-        {
-          m_cfpForeshortening = (Simulator::Now () - m_lastBeacon - m_beaconInterval);
-        }
-      m_lastBeacon = Simulator::Now ();
-    }
-  else if (hdr.IsCfEnd () && m_stationManager->GetPcfSupported ())
-    {
-      m_cfpStart = NanoSeconds (0);
-      m_cfpForeshortening = NanoSeconds (0);
-      m_cfAckInfo.appendCfAck = false;
-      m_cfAckInfo.expectCfAck = false;
-    }
-  else if (IsCfPeriod () && hdr.HasData ())
-    {
-      m_cfAckInfo.expectCfAck = true;
-    }
-
-  if (psdu->IsSingle ())
-    {
-      txVector.SetAggregation (true);
-      NS_LOG_DEBUG ("Sending S-MPDU");
-    }
-  else if (psdu->IsAggregate ())
-    {
-      txVector.SetAggregation (true);
-      NS_LOG_DEBUG ("Sending A-MPDU");
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Sending non aggregate MPDU");
-    }
-
-  for (auto& mpdu : *PeekPointer (psdu))
-    {
-      if (mpdu->GetHeader ().IsQosData ())
-        {
-          auto edcaIt = m_edca.find (QosUtilsMapTidToAc (mpdu->GetHeader ().GetQosTid ()));
-          edcaIt->second->CompleteMpduTx (mpdu);
-        }
-    }
-  m_phy->Send (psdu, txVector);
-}
-
-void
-MacLow::CfPollTimeout (void)
-{
-  NS_LOG_FUNCTION (this);
-  //to be reworked
-  bool busy = false;
-  for (ChannelAccessManagersCI i = m_channelAccessManagers.begin (); i != m_channelAccessManagers.end (); i++)
-    {
-      busy = (*i)->IsBusy ();
-    }
-  if (!busy)
-    {
-      NS_ASSERT (m_currentTxop != 0);
-      m_currentTxop->MissedCfPollResponse (m_cfAckInfo.expectCfAck);
-      m_cfAckInfo.expectCfAck = false;
-    }
-}
-
-void
-MacLow::CtsTimeout (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("cts timeout");
-  /// \todo should check that there was no RX start before now.
-  /// we should restart a new CTS timeout now until the expected
-  /// end of RX if there was a RX start before now.
-  m_stationManager->ReportRtsFailed (m_currentPacket->GetAddr1 (), &m_currentPacket->GetHeader (0));
-
-  Ptr<QosTxop> qosTxop = DynamicCast<QosTxop> (m_currentTxop);
-  if (qosTxop != 0)
-    {
-      qosTxop->NotifyMissedCts (std::list<Ptr<WifiMacQueueItem>> (m_currentPacket->begin (), m_currentPacket->end ()));
-    }
-  else
-    {
-      m_currentTxop->MissedCts ();
-    }
-  m_currentTxop = 0;
-}
-
-void
-MacLow::NormalAckTimeout (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("normal ack timeout");
-  /// \todo should check that there was no RX start before now.
-  /// we should restart a new ack timeout now until the expected
-  /// end of RX if there was a RX start before now.
-  Ptr<Txop> txop = m_currentTxop;
-  m_currentTxop = 0;
-  txop->MissedAck ();
-}
-
-void
-MacLow::BlockAckTimeout (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("block ack timeout");
-  Ptr<Txop> txop = m_currentTxop;
-  m_currentTxop = 0;
-  txop->MissedBlockAck (m_currentPacket->GetNMpdus ());
-}
-
-void
-MacLow::SendRtsForPacket (void)
-{
-  NS_LOG_FUNCTION (this);
-  /* send an RTS for this packet. */
-  WifiMacHeader rts;
-  rts.SetType (WIFI_MAC_CTL_RTS);
-  rts.SetDsNotFrom ();
-  rts.SetDsNotTo ();
-  rts.SetNoRetry ();
-  rts.SetNoMoreFragments ();
-  rts.SetAddr1 (m_currentPacket->GetAddr1 ());
-  rts.SetAddr2 (m_self);
-  WifiTxVector rtsTxVector = GetRtsTxVector (*m_currentPacket->begin ());
-  Time duration = Seconds (0);
-
-  duration += GetSifs ();
-  duration += GetCtsDuration (m_currentPacket->GetAddr1 (), rtsTxVector);
-  duration += GetSifs ();
-  duration += m_phy->CalculateTxDuration (m_currentPacket->GetSize (),
-                                          m_currentTxVector, m_phy->GetPhyBand ());
-  duration += GetResponseDuration (m_txParams, m_currentTxVector, m_currentPacket->GetAddr1 ());
-  if (m_txParams.HasNextPacket ())
-    {
-      duration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (),
-                                              m_currentTxVector, m_phy->GetPhyBand ());
-      duration += GetResponseDuration (m_txParams, m_currentTxVector, m_currentPacket->GetAddr1 ());
-    }
-  rts.SetDuration (duration);
-
-  Time txDuration = m_phy->CalculateTxDuration (GetRtsSize (), rtsTxVector, m_phy->GetPhyBand ());
-  // After transmitting an RTS frame, the STA shall wait for a CTSTimeout interval with
-  // a value of aSIFSTime + aSlotTime + aRxPHYStartDelay (IEEE 802.11-2016 sec. 10.3.2.7).
-  // aRxPHYStartDelay equals the time to transmit the PHY header.
-  Time timerDelay = txDuration + GetSifs () + GetSlotTime ()
-                    + m_phy->CalculatePhyPreambleAndHeaderDuration (rtsTxVector);
-  NS_ASSERT (m_ctsTimeoutEvent.IsExpired ());
-  NotifyCtsTimeoutStartNow (timerDelay);
-  m_ctsTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::CtsTimeout, this);
-
-  ForwardDown (Create<const WifiPsdu> (Create<Packet> (), rts), rtsTxVector);
-}
-
-void
-MacLow::StartDataTxTimers (WifiTxVector dataTxVector)
-{
-  Time txDuration = m_phy->CalculateTxDuration (m_currentPacket->GetSize (), dataTxVector, m_phy->GetPhyBand ());
-  if (m_txParams.MustWaitNormalAck () && !IsCfPeriod ())
-    {
-      // the timeout duration is "aSIFSTime + aSlotTime + aRxPHYStartDelay, starting
-      // at the PHY-TXEND.confirm primitive" (section 10.3.2.9 or 10.22.2.2 of 802.11-2016).
-      // aRxPHYStartDelay equals the time to transmit the PHY header.
-      WifiTxVector ackTxVector = GetAckTxVector (m_currentPacket->GetAddr1 (),
-                                                 dataTxVector.GetMode ());
-      Time timerDelay = txDuration + GetSifs () + GetSlotTime ()
-                        + m_phy->CalculatePhyPreambleAndHeaderDuration (ackTxVector);
-      NS_ASSERT (m_normalAckTimeoutEvent.IsExpired ());
-      NotifyAckTimeoutStartNow (timerDelay);
-      m_normalAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::NormalAckTimeout, this);
-    }
-  else if (m_txParams.MustWaitBlockAck ())
-    {
-      // the timeout duration is "aSIFSTime + aSlotTime + aRxPHYStartDelay, starting
-      // at the PHY-TXEND.confirm primitive" (section 10.3.2.9 or 10.22.2.2 of 802.11-2016).
-      // aRxPHYStartDelay equals the time to transmit the PHY header.
-      WifiTxVector blockAckTxVector = GetBlockAckTxVector (m_currentPacket->GetAddr1 (),
-                                                           dataTxVector.GetMode ());
-      Time timerDelay = txDuration + GetSifs () + GetSlotTime ()
-                        + m_phy->CalculatePhyPreambleAndHeaderDuration (blockAckTxVector);
-      NS_ASSERT (m_blockAckTimeoutEvent.IsExpired ());
-      NotifyAckTimeoutStartNow (timerDelay);
-      m_blockAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::BlockAckTimeout, this);
-    }
-  else if (m_txParams.HasNextPacket ())
-    {
-      NS_ASSERT (m_waitIfsEvent.IsExpired ());
-      Time delay = txDuration + GetSifs ();
-      m_waitIfsEvent = Simulator::Schedule (delay, &MacLow::WaitIfsAfterEndTxFragment, this);
-    }
-  else if (m_currentPacket->GetHeader (0).IsQosData () && m_currentTxop->IsQosTxop () &&
-           m_currentTxop->GetTxopLimit ().IsStrictlyPositive () && m_currentTxop->GetTxopRemaining () > GetSifs ())
-   {
-      Time delay = txDuration + GetSifs ();
-      m_waitIfsEvent = Simulator::Schedule (delay, &MacLow::WaitIfsAfterEndTxPacket, this);
-    }
-  else
-    {
-      // since we do not expect any timer to be triggered.
-      m_endTxNoAckEvent = Simulator::Schedule (txDuration, &MacLow::EndTxNoAck, this);
-    }
-}
-
-void
-MacLow::SendDataPacket (void)
-{
-  NS_LOG_FUNCTION (this);
-  /* send this packet directly. No RTS is needed. */
-  StartDataTxTimers (m_currentTxVector);
-
-  if (!IsCfPeriod ())
-    {
-      Time duration = GetResponseDuration (m_txParams, m_currentTxVector, m_currentPacket->GetAddr1 ());
-      if (m_txParams.HasNextPacket ())
-        {
-          duration += GetSifs ();
-          duration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (),
-                                                  m_currentTxVector, m_phy->GetPhyBand ());
-          duration += GetResponseDuration (m_txParams, m_currentTxVector, m_currentPacket->GetAddr1 ());
-        }
-      m_currentPacket->SetDuration (duration);
-    }
-  else
-    {
-      if (m_currentPacket->GetHeader (0).IsCfEnd ())
-        {
-          m_currentPacket->GetHeader (0).SetRawDuration (0);
-        }
-      else
-        {
-          m_currentPacket->GetHeader (0).SetRawDuration (32768);
-        }
-    }
-
-  if (!m_currentPacket->IsAggregate ())
-    {
-      if (m_cfAckInfo.appendCfAck)
-        {
-          switch (m_currentPacket->GetHeader (0).GetType ())
-            {
-            case WIFI_MAC_DATA:
-              m_currentPacket->GetHeader (0).SetType (WIFI_MAC_DATA_CFACK, false);
-              break;
-            case WIFI_MAC_DATA_CFPOLL:
-              m_currentPacket->GetHeader (0).SetType (WIFI_MAC_DATA_CFACK_CFPOLL, false);
-              break;
-            case WIFI_MAC_DATA_NULL:
-              m_currentPacket->GetHeader (0).SetType (WIFI_MAC_DATA_NULL_CFACK, false);
-              break;
-            case WIFI_MAC_DATA_NULL_CFPOLL:
-              m_currentPacket->GetHeader (0).SetType (WIFI_MAC_DATA_NULL_CFACK_CFPOLL, false);
-              break;
-            case WIFI_MAC_CTL_END:
-              m_currentPacket->GetHeader (0).SetType (WIFI_MAC_CTL_END_ACK, false);
-              break;
-            default:
-              NS_ASSERT (false);
-              break;
-            }
-          NS_ASSERT (m_cfAckInfo.address != Mac48Address ());
-          //Standard says that, for frames of type Data+CF-Ack, Data+CF-Poll+CF-Ack, and CF-Poll+CF-Ack,
-          //the rate chosen to transmit the frame must be supported by both the addressed recipient STA and the STA to which the Ack is intended.
-          //This ideally requires the rate manager to handle this case, but this requires to update all rate manager classes.
-          //Instead, we simply fetch two TxVector and we select the one with the lowest data rate.
-          //This should be later changed, at the latest once HCCA is implemented for HT/VHT/HE stations.
-          WifiMacHeader tmpHdr = m_currentPacket->GetHeader (0);
-          tmpHdr.SetAddr1 (m_cfAckInfo.address);
-          WifiTxVector tmpTxVector = GetDataTxVector (Create<const WifiMacQueueItem> (m_currentPacket->GetPayload (0), tmpHdr));
-          if (tmpTxVector.GetMode ().GetDataRate (tmpTxVector) < m_currentTxVector.GetMode ().GetDataRate (m_currentTxVector))
-            {
-              m_currentTxVector = tmpTxVector;
-            }
-          m_cfAckInfo.appendCfAck = false;
-          m_cfAckInfo.address = Mac48Address ();
-        }
-    }
-  if (m_txParams.MustSendBlockAckRequest ())
-    {
-      Ptr<QosTxop> qosTxop = DynamicCast<QosTxop> (m_currentTxop);
-      NS_ASSERT (qosTxop != 0);
-      auto bar = qosTxop->PrepareBlockAckRequest (m_currentPacket->GetAddr1 (), *m_currentPacket->GetTids ().begin ());
-      qosTxop->ScheduleBar (bar);
-    }
-  ForwardDown (m_currentPacket, m_currentTxVector);
-}
-
-bool
-MacLow::IsNavZero (void) const
-{
-  return (m_lastNavStart + m_lastNavDuration < Simulator::Now ());
-}
-
-void
-MacLow::SendCtsToSelf (void)
-{
-  WifiMacHeader cts;
-  cts.SetType (WIFI_MAC_CTL_CTS);
-  cts.SetDsNotFrom ();
-  cts.SetDsNotTo ();
-  cts.SetNoMoreFragments ();
-  cts.SetNoRetry ();
-  cts.SetAddr1 (m_self);
-
-  WifiTxVector ctsTxVector = GetRtsTxVector (*m_currentPacket->begin ());
-  Time duration = Seconds (0);
-
-  duration += GetSifs ();
-  duration += m_phy->CalculateTxDuration (m_currentPacket->GetSize (),
-                                          m_currentTxVector, m_phy->GetPhyBand ());
-  duration += GetResponseDuration (m_txParams, m_currentTxVector, m_currentPacket->GetAddr1 ());
-  if (m_txParams.HasNextPacket ())
-    {
-      duration += GetSifs ();
-      duration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (),
-                                              m_currentTxVector, m_phy->GetPhyBand ());
-      duration += GetResponseDuration (m_txParams, m_currentTxVector, m_currentPacket->GetAddr1 ());
-    }
-
-  cts.SetDuration (duration);
-
-  ForwardDown (Create<const WifiPsdu> (Create<Packet> (), cts), ctsTxVector);
-
-  Time txDuration = m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, m_phy->GetPhyBand ());
-  txDuration += GetSifs ();
-  NS_ASSERT (m_sendDataEvent.IsExpired ());
-
-  m_sendDataEvent = Simulator::Schedule (txDuration,
-                                         &MacLow::SendDataAfterCts, this,
-                                         duration);
-}
-
-void
-MacLow::SendCtsAfterRts (Mac48Address source, Time duration, WifiTxVector rtsTxVector, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << source << duration << rtsTxVector.GetMode () << rtsSnr);
-  /* send a CTS when you receive a RTS
-   * right after SIFS.
-   */
-  WifiTxVector ctsTxVector = GetCtsTxVector (source, rtsTxVector.GetMode ());
-  WifiMacHeader cts;
-  cts.SetType (WIFI_MAC_CTL_CTS);
-  cts.SetDsNotFrom ();
-  cts.SetDsNotTo ();
-  cts.SetNoMoreFragments ();
-  cts.SetNoRetry ();
-  cts.SetAddr1 (source);
-  duration -= GetCtsDuration (source, rtsTxVector);
-  duration -= GetSifs ();
-  NS_ASSERT (duration.IsPositive ());
-  cts.SetDuration (duration);
-
-  Ptr<Packet> packet = Create<Packet> ();
-
-  SnrTag tag;
-  tag.Set (rtsSnr);
-  packet->AddPacketTag (tag);
-
-  //CTS should always use non-HT PPDU (HT PPDU cases not supported yet)
-  ForwardDown (Create<const WifiPsdu> (packet, cts), ctsTxVector);
-}
-
-void
-MacLow::SendDataAfterCts (Time duration)
-{
-  NS_LOG_FUNCTION (this);
-  /* send the third step in a
-   * RTS/CTS/Data/Ack handshake
-   */
-  NS_ASSERT (m_currentPacket != 0);
-
-  StartDataTxTimers (m_currentTxVector);
-  Time newDuration = GetResponseDuration (m_txParams, m_currentTxVector, m_currentPacket->GetAddr1 ());
-  if (m_txParams.HasNextPacket ())
-    {
-      newDuration += GetSifs ();
-      newDuration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (), m_currentTxVector, m_phy->GetPhyBand ());
-      newDuration += GetResponseDuration (m_txParams, m_currentTxVector, m_currentPacket->GetAddr1 ());
-    }
-
-  Time txDuration = m_phy->CalculateTxDuration (m_currentPacket->GetSize (), m_currentTxVector, m_phy->GetPhyBand ());
-  duration -= txDuration;
-  duration -= GetSifs ();
-
-  duration = std::max (duration, newDuration);
-  NS_ASSERT (duration.IsPositive ());
-  m_currentPacket->SetDuration (duration);
-  if (m_txParams.MustSendBlockAckRequest ())
-    {
-      Ptr<QosTxop> qosTxop = DynamicCast<QosTxop> (m_currentTxop);
-      NS_ASSERT (qosTxop != 0);
-      auto bar = qosTxop->PrepareBlockAckRequest (m_currentPacket->GetAddr1 (), *m_currentPacket->GetTids ().begin ());
-      qosTxop->ScheduleBar (bar);
-    }
-  ForwardDown (m_currentPacket, m_currentTxVector);
-}
-
-void
-MacLow::WaitIfsAfterEndTxFragment (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_currentTxop->StartNextFragment ();
-}
-
-void
-MacLow::WaitIfsAfterEndTxPacket (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_currentTxop->StartNextPacket ();
-}
-
-void
-MacLow::EndTxNoAck (void)
-{
-  NS_LOG_FUNCTION (this);
-  if (m_currentPacket->GetHeader (0).IsBeacon () && m_stationManager->GetPcfSupported ())
-    {
-      m_cfpStart = Simulator::Now ();
-    }
-  if (!m_cfAckInfo.expectCfAck)
-    {
-      Ptr<Txop> txop = m_currentTxop;
-      txop->EndTxNoAck ();
-    }
-  if (!IsCfPeriod ())
-    {
-      m_currentTxop = 0;
-    }
-}
-
-void
-MacLow::SendAckAfterData (Mac48Address source, Time duration, WifiMode dataTxMode, double dataSnr)
-{
-  NS_LOG_FUNCTION (this);
-  // send an Ack, after SIFS, when you receive a packet
-  WifiTxVector ackTxVector = GetAckTxVector (source, dataTxMode);
-  WifiMacHeader ack;
-  ack.SetType (WIFI_MAC_CTL_ACK);
-  ack.SetDsNotFrom ();
-  ack.SetDsNotTo ();
-  ack.SetNoRetry ();
-  ack.SetNoMoreFragments ();
-  ack.SetAddr1 (source);
-  // 802.11-2012, Section 8.3.1.4:  Duration/ID is received duration value
-  // minus the time to transmit the Ack frame and its SIFS interval
-  duration -= GetAckDuration (ackTxVector);
-  duration -= GetSifs ();
-  NS_ASSERT_MSG (duration.IsPositive (), "Please provide test case to maintainers if this assert is hit.");
-  ack.SetDuration (duration);
-
-  Ptr<Packet> packet = Create<Packet> ();
-
-  SnrTag tag;
-  tag.Set (dataSnr);
-  packet->AddPacketTag (tag);
-
-  //Ack should always use non-HT PPDU (HT PPDU cases not supported yet)
-  ForwardDown (Create<const WifiPsdu> (packet, ack), ackTxVector);
-}
-
-bool
-MacLow::ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu)
-{
-  const WifiMacHeader& hdr = mpdu->GetHeader ();
-
-  if (m_stationManager->GetHtSupported ()
-      || m_stationManager->GetVhtSupported ()
-      || m_stationManager->GetHeSupported ())
-    {
-      Mac48Address originator = hdr.GetAddr2 ();
-      uint8_t tid = 0;
-      if (hdr.IsQosData ())
-        {
-          tid = hdr.GetQosTid ();
-        }
-      uint16_t seqNumber = hdr.GetSequenceNumber ();
-      AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
-      if (it != m_bAckAgreements.end ())
-        {
-          //Implement HT immediate BlockAck support for HT Delayed BlockAck is not added yet
-          if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence (), seqNumber))
-            {
-              StoreMpduIfNeeded (mpdu);
-              if (!IsInWindow (hdr.GetSequenceNumber (), (*it).second.first.GetStartingSequence (), (*it).second.first.GetBufferSize ()))
-                {
-                  uint16_t delta = (seqNumber - (*it).second.first.GetWinEnd () + 4096) % 4096;
-                  NS_ASSERT (delta > 0);
-                  uint16_t bufferSize = (*it).second.first.GetBufferSize ();
-                  uint16_t startingSeq = (seqNumber - bufferSize + 1 + 4096) % 4096;
-                  (*it).second.first.SetStartingSequence (startingSeq);
-                  RxCompleteBufferedPacketsWithSmallerSequence ((*it).second.first.GetStartingSequenceControl (), originator, tid);
-                }
-              RxCompleteBufferedPacketsUntilFirstLost (originator, tid); //forwards up packets starting from winstart and set winstart to last +1
-            }
-          return true;
-        }
-      return false;
-    }
-  return StoreMpduIfNeeded (mpdu);
-}
-
-bool
-MacLow::StoreMpduIfNeeded (Ptr<WifiMacQueueItem> mpdu)
-{
-  const WifiMacHeader& hdr = mpdu->GetHeader ();
-
-  AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
-  if (it != m_bAckAgreements.end ())
-    {
-      uint16_t endSequence = ((*it).second.first.GetStartingSequence () + 2047) % 4096;
-      uint32_t mappedSeqControl = QosUtilsMapSeqControlToUniqueInteger (hdr.GetSequenceControl (), endSequence);
-
-      BufferedPacketI i = (*it).second.second.begin ();
-      for (; i != (*it).second.second.end ()
-           && QosUtilsMapSeqControlToUniqueInteger ((*i)->GetHeader ().GetSequenceControl (), endSequence) < mappedSeqControl; i++)
-        {
-        }
-      (*it).second.second.insert (i, mpdu);
-
-      //Update block ack cache
-      BlockAckCachesI j = m_bAckCaches.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
-      NS_ASSERT (j != m_bAckCaches.end ());
-      (*j).second.UpdateWithMpdu (&hdr);
-      return true;
-    }
-  return false;
-}
-
-void
-MacLow::CreateBlockAckAgreement (const MgtAddBaResponseHeader *respHdr, Mac48Address originator,
-                                 uint16_t startingSeq)
-{
-  NS_LOG_FUNCTION (this);
-  uint8_t tid = respHdr->GetTid ();
-  BlockAckAgreement agreement (originator, tid);
-  if (respHdr->IsImmediateBlockAck ())
-    {
-      agreement.SetImmediateBlockAck ();
-    }
-  else
-    {
-      agreement.SetDelayedBlockAck ();
-    }
-  agreement.SetAmsduSupport (respHdr->IsAmsduSupported ());
-  agreement.SetBufferSize (respHdr->GetBufferSize () + 1);
-  agreement.SetTimeout (respHdr->GetTimeout ());
-  agreement.SetStartingSequence (startingSeq);
-
-  std::list<Ptr<WifiMacQueueItem>> buffer (0);
-  AgreementKey key (originator, respHdr->GetTid ());
-  AgreementValue value (agreement, buffer);
-  m_bAckAgreements.insert (std::make_pair (key, value));
-
-  BlockAckCache cache;
-  cache.Init (startingSeq, respHdr->GetBufferSize () + 1);
-  m_bAckCaches.insert (std::make_pair (key, cache));
-
-  if (respHdr->GetTimeout () != 0)
-    {
-      AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, respHdr->GetTid ()));
-      Time timeout = MicroSeconds (1024 * agreement.GetTimeout ());
-
-      AcIndex ac = QosUtilsMapTidToAc (agreement.GetTid ());
-
-      it->second.first.m_inactivityEvent = Simulator::Schedule (timeout,
-                                                                &QosTxop::SendDelbaFrame,
-                                                                m_edca[ac], originator, tid, false);
-    }
-}
-
-void
-MacLow::DestroyBlockAckAgreement (Mac48Address originator, uint8_t tid)
-{
-  NS_LOG_FUNCTION (this);
-  AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
-  if (it != m_bAckAgreements.end ())
-    {
-      RxCompleteBufferedPacketsWithSmallerSequence (it->second.first.GetStartingSequenceControl (), originator, tid);
-      RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
-      m_bAckAgreements.erase (it);
-      BlockAckCachesI i = m_bAckCaches.find (std::make_pair (originator, tid));
-      NS_ASSERT (i != m_bAckCaches.end ());
-      m_bAckCaches.erase (i);
-    }
-}
-
-void
-MacLow::RxCompleteBufferedPacketsWithSmallerSequence (uint16_t seq, Mac48Address originator, uint8_t tid)
-{
-  AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
-  if (it != m_bAckAgreements.end ())
-    {
-      uint16_t endSequence = ((*it).second.first.GetStartingSequence () + 2047) % 4096;
-      uint32_t mappedStart = QosUtilsMapSeqControlToUniqueInteger (seq, endSequence);
-      BufferedPacketI last = (*it).second.second.begin ();
-      uint16_t guard = 0;
-      if (last != (*it).second.second.end ())
-        {
-          guard = (*(*it).second.second.begin ())->GetHeader ().GetSequenceControl ();
-        }
-      BufferedPacketI i = (*it).second.second.begin ();
-      for (; i != (*it).second.second.end ()
-           && QosUtilsMapSeqControlToUniqueInteger ((*i)->GetHeader ().GetSequenceControl (), endSequence) < mappedStart; )
-        {
-          if (guard == (*i)->GetHeader ().GetSequenceControl ())
-            {
-              if (!(*i)->GetHeader ().IsMoreFragments ())
-                {
-                  while (last != i)
-                    {
-                      m_rxCallback (*last);
-                      last++;
-                    }
-                  m_rxCallback (*last);
-                  last++;
-                  /* go to next packet */
-                  while (i != (*it).second.second.end () && guard == (*i)->GetHeader ().GetSequenceControl ())
-                    {
-                      i++;
-                    }
-                  if (i != (*it).second.second.end ())
-                    {
-                      guard = (*i)->GetHeader ().GetSequenceControl ();
-                      last = i;
-                    }
-                }
-              else
-                {
-                  guard++;
-                }
-            }
-          else
-            {
-              /* go to next packet */
-              while (i != (*it).second.second.end () && guard == (*i)->GetHeader ().GetSequenceControl ())
-                {
-                  i++;
-                }
-              if (i != (*it).second.second.end ())
-                {
-                  guard = (*i)->GetHeader ().GetSequenceControl ();
-                  last = i;
-                }
-            }
-        }
-      (*it).second.second.erase ((*it).second.second.begin (), i);
-    }
-}
-
-void
-MacLow::RxCompleteBufferedPacketsUntilFirstLost (Mac48Address originator, uint8_t tid)
-{
-  AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
-  if (it != m_bAckAgreements.end ())
-    {
-      uint16_t guard = (*it).second.first.GetStartingSequenceControl ();
-      BufferedPacketI lastComplete = (*it).second.second.begin ();
-      BufferedPacketI i = (*it).second.second.begin ();
-      for (; i != (*it).second.second.end () && guard == (*i)->GetHeader ().GetSequenceControl (); i++)
-        {
-          if (!(*i)->GetHeader ().IsMoreFragments ())
-            {
-              while (lastComplete != i)
-                {
-                  m_rxCallback (*lastComplete);
-                  lastComplete++;
-                }
-              m_rxCallback (*lastComplete);
-              lastComplete++;
-            }
-          guard = (*i)->GetHeader ().IsMoreFragments () ? (guard + 1) : ((guard + 16) & 0xfff0);
-        }
-      (*it).second.first.SetStartingSequenceControl (guard);
-      /* All packets already forwarded to WifiMac must be removed from buffer:
-      [begin (), lastComplete) */
-      (*it).second.second.erase ((*it).second.second.begin (), lastComplete);
-    }
-}
-
-void
-MacLow::SendBlockAckResponse (const CtrlBAckResponseHeader* blockAck, Mac48Address originator, bool immediate,
-                              Time duration, WifiMode blockAckReqTxMode, double rxSnr)
-{
-  NS_LOG_FUNCTION (this);
-  Ptr<Packet> packet = Create<Packet> ();
-  packet->AddHeader (*blockAck);
-
-  WifiMacHeader hdr;
-  hdr.SetType (WIFI_MAC_CTL_BACKRESP);
-  hdr.SetAddr1 (originator);
-  hdr.SetAddr2 (GetAddress ());
-  hdr.SetDsNotFrom ();
-  hdr.SetDsNotTo ();
-  hdr.SetNoRetry ();
-  hdr.SetNoMoreFragments ();
-
-  WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (originator, blockAckReqTxMode);
-
-  if (immediate)
-    {
-      m_txParams.DisableAck ();
-      duration -= GetSifs ();
-      duration -= GetBlockAckDuration (blockAckReqTxVector, blockAck->GetType ());
-    }
-  else
-    {
-      m_txParams.EnableAck ();
-      duration += GetSifs ();
-      duration += GetAckDuration (originator, blockAckReqTxVector);
-    }
-  m_txParams.DisableNextData ();
-
-  if (!immediate)
-    {
-      StartDataTxTimers (blockAckReqTxVector);
-    }
-
-  NS_ASSERT (duration.IsPositive ());
-  hdr.SetDuration (duration);
-  //here should be present a control about immediate or delayed BlockAck
-  //for now we assume immediate
-  SnrTag tag;
-  tag.Set (rxSnr);
-  packet->AddPacketTag (tag);
-  ForwardDown (Create<const WifiPsdu> (packet, hdr), blockAckReqTxVector);
-}
-
-void
-MacLow::SendBlockAckAfterAmpdu (uint8_t tid, Mac48Address originator, Time duration, WifiTxVector blockAckReqTxVector, double rxSnr)
-{
-  NS_LOG_FUNCTION (this);
-  if (!m_phy->IsStateTx () && !m_phy->IsStateRx ())
-    {
-      NS_LOG_FUNCTION (this << +tid << originator << duration.As (Time::S) << blockAckReqTxVector << rxSnr);
-      CtrlBAckResponseHeader blockAck;
-      uint16_t seqNumber = 0;
-      BlockAckCachesI i = m_bAckCaches.find (std::make_pair (originator, tid));
-      NS_ASSERT (i != m_bAckCaches.end ());
-      seqNumber = (*i).second.GetWinStart ();
-
-      bool immediate = true;
-      AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
-      blockAck.SetStartingSequence (seqNumber);
-      blockAck.SetTidInfo (tid);
-      immediate = (*it).second.first.IsImmediateBlockAck ();
-      if ((*it).second.first.GetBufferSize () > 64)
-        {
-          blockAck.SetType (EXTENDED_COMPRESSED_BLOCK_ACK);
-        }
-      else
-        {
-          blockAck.SetType (COMPRESSED_BLOCK_ACK);
-        }
-      NS_LOG_DEBUG ("Got Implicit block Ack Req with seq " << seqNumber);
-      (*i).second.FillBlockAckBitmap (&blockAck);
-
-      WifiTxVector blockAckTxVector = GetBlockAckTxVector (originator, blockAckReqTxVector.GetMode ());
-
-      SendBlockAckResponse (&blockAck, originator, immediate, duration, blockAckTxVector.GetMode (), rxSnr);
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Skip block ack response!");
-    }
-}
-
-void
-MacLow::SendBlockAckAfterBlockAckRequest (const CtrlBAckRequestHeader reqHdr, Mac48Address originator,
-                                          Time duration, WifiMode blockAckReqTxMode, double rxSnr)
-{
-  NS_LOG_FUNCTION (this);
-  CtrlBAckResponseHeader blockAck;
-  uint8_t tid = 0;
-  bool immediate = false;
-  if (!reqHdr.IsMultiTid ())
-    {
-      tid = reqHdr.GetTidInfo ();
-      AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
-      if (it != m_bAckAgreements.end ())
-        {
-          blockAck.SetStartingSequence (reqHdr.GetStartingSequence ());
-          blockAck.SetTidInfo (tid);
-          immediate = (*it).second.first.IsImmediateBlockAck ();
-          if (reqHdr.IsBasic ())
-            {
-              blockAck.SetType (BASIC_BLOCK_ACK);
-            }
-          else if (reqHdr.IsCompressed ())
-            {
-              blockAck.SetType (COMPRESSED_BLOCK_ACK);
-            }
-          else if (reqHdr.IsExtendedCompressed ())
-            {
-              blockAck.SetType (EXTENDED_COMPRESSED_BLOCK_ACK);
-            }
-          BlockAckCachesI i = m_bAckCaches.find (std::make_pair (originator, tid));
-          NS_ASSERT (i != m_bAckCaches.end ());
-          (*i).second.FillBlockAckBitmap (&blockAck);
-          NS_LOG_DEBUG ("Got block Ack Req with seq " << reqHdr.GetStartingSequence ());
-
-          if (!m_stationManager->GetHtSupported ()
-              && !m_stationManager->GetVhtSupported ()
-              && !m_stationManager->GetHeSupported ())
-            {
-              /* All packets with smaller sequence than starting sequence control must be passed up to WifiMac
-               * See 9.10.3 in IEEE 802.11e standard.
-               */
-              RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequenceControl (), originator, tid);
-              RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
-            }
-          else
-            {
-              if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence (), reqHdr.GetStartingSequence ()))
-                {
-                  (*it).second.first.SetStartingSequence (reqHdr.GetStartingSequence ());
-                  RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequenceControl (), originator, tid);
-                  RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
-                }
-            }
-        }
-      else
-        {
-          NS_LOG_DEBUG ("there's not a valid block ack agreement with " << originator);
-        }
-    }
-  else
-    {
-      NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
-    }
-  SendBlockAckResponse (&blockAck, originator, immediate, duration, blockAckReqTxMode, rxSnr);
-}
-
-void
-MacLow::ResetBlockAckInactivityTimerIfNeeded (BlockAckAgreement &agreement)
-{
-  if (agreement.GetTimeout () != 0)
-    {
-      NS_ASSERT (agreement.m_inactivityEvent.IsRunning ());
-      agreement.m_inactivityEvent.Cancel ();
-      Time timeout = MicroSeconds (1024 * agreement.GetTimeout ());
-      AcIndex ac = QosUtilsMapTidToAc (agreement.GetTid ());
-      agreement.m_inactivityEvent = Simulator::Schedule (timeout,
-                                                         &QosTxop::SendDelbaFrame,
-                                                         m_edca[ac], agreement.GetPeer (),
-                                                         agreement.GetTid (), false);
-    }
-}
-
-void
-MacLow::RegisterEdcaForAc (AcIndex ac, Ptr<QosTxop> edca)
-{
-  m_edca.insert (std::make_pair (ac, edca));
-}
-
-void
-MacLow::DeaggregateAmpduAndReceive (Ptr<WifiPsdu> psdu, double rxSnr, WifiTxVector txVector, std::vector<bool> statusPerMpdu)
-{
-  NS_LOG_FUNCTION (this);
-  bool normalAck = false;
-  bool ampduSubframe = txVector.IsAggregation (); //flag indicating the packet belongs to an A-MPDU and is not a VHT/HE single MPDU
-  //statusPerMpdu is empty for intermediate MPDU forwarding.
-  //This function is called also once the PPDU has been fully received by the PHY,
-  //in that case statusPerMpdu carries the information about the received MPDUs.
-  if (ampduSubframe && !statusPerMpdu.empty ())
-    {
-      //We are here if a S-MPDU is received or if all MPDUs of an A-MPDU have been
-      //received (but have been already forwarded up, so ReceiveOk won't be called)
-      NS_ASSERT (psdu->IsAggregate ());
-      ampduSubframe = true;
-      auto n = psdu->begin ();
-      auto status = statusPerMpdu.begin ();
-      NS_ABORT_MSG_IF (psdu->GetNMpdus () != statusPerMpdu.size (), "Should have one receive status per MPDU");
-
-      WifiMacHeader firsthdr = (*n)->GetHeader ();
-      if (firsthdr.GetAddr1 () == m_self)
-        {
-          //Iterate over all MPDUs and notify reception only if status OK
-          for (; n != psdu->end (); ++n, ++status)
-            {
-              firsthdr = (*n)->GetHeader ();
-              NS_ABORT_MSG_IF (firsthdr.GetAddr1 () != m_self, "All MPDUs of A-MPDU should have the same destination address");
-              if (*status) //PER and thus CRC check succeeded
-                {
-                  if (psdu->IsSingle ())
-                    {
-                      //If the MPDU is sent as a VHT/HE single MPDU (EOF=1 in A-MPDU subframe header), then the responder sends an Ack.
-                      NS_LOG_DEBUG ("Receive S-MPDU");
-                      ampduSubframe = false;
-                    }
-                  else if (!m_sendAckEvent.IsRunning () && firsthdr.IsQosAck ()) // Implicit BAR Ack Policy
-                    {
-                      m_sendAckEvent = Simulator::Schedule (GetSifs (),
-                                                            &MacLow::SendBlockAckAfterAmpdu, this,
-                                                            firsthdr.GetQosTid (),
-                                                            firsthdr.GetAddr2 (),
-                                                            firsthdr.GetDuration (),
-                                                            txVector, rxSnr);
-                    }
-
-                  if (firsthdr.IsAck () || firsthdr.IsBlockAck () || firsthdr.IsBlockAckReq ())
-                    {
-                      ReceiveOk ((*n), rxSnr, txVector, ampduSubframe);
-                    }
-                  else if (firsthdr.IsData () || firsthdr.IsQosData ())
-                    {
-                      NS_LOG_DEBUG ("Deaggregate packet from " << firsthdr.GetAddr2 () << " with sequence=" << firsthdr.GetSequenceNumber ());
-                      if (psdu->IsSingle ())
-                        {
-                          ReceiveOk ((*n), rxSnr, txVector, ampduSubframe);
-                        }
-                      if (firsthdr.IsQosAck ())
-                        {
-                          NS_LOG_DEBUG ("Normal Ack");
-                          normalAck = true;
-                        }
-                    }
-                  else
-                    {
-                      NS_FATAL_ERROR ("Received A-MPDU with invalid first MPDU type");
-                    }
-
-                  if (!psdu->IsSingle ())
-                    {
-                      if (normalAck)
-                        {
-                          //send BlockAck
-                          if (firsthdr.IsBlockAckReq ())
-                            {
-                              NS_FATAL_ERROR ("Sending a BlockAckReq with QosPolicy equal to Normal Ack");
-                            }
-                          uint8_t tid = firsthdr.GetQosTid ();
-                          AgreementsI it = m_bAckAgreements.find (std::make_pair (firsthdr.GetAddr2 (), tid));
-                          if (it != m_bAckAgreements.end ())
-                            {
-                              /* See section 11.5.3 in IEEE 802.11 for the definition of this timer */
-                              ResetBlockAckInactivityTimerIfNeeded (it->second.first);
-                              NS_LOG_DEBUG ("rx A-MPDU/sendImmediateBlockAck from=" << firsthdr.GetAddr2 ());
-                              NS_ASSERT (m_sendAckEvent.IsRunning ());
-                            }
-                          else
-                            {
-                              NS_LOG_DEBUG ("There's not a valid agreement for this block ack request.");
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-  else
-    {
-      /* An MPDU has been received */
-      NS_ASSERT (!psdu->IsAggregate ());
-      ReceiveOk ((*psdu->begin ()), rxSnr, txVector, ampduSubframe);
-    }
-}
-
-Time
-MacLow::GetRemainingCfpDuration (void) const
-{
-  NS_LOG_FUNCTION (this);
-  Time remainingCfpDuration = std::min (m_cfpStart, m_cfpStart + m_cfpMaxDuration - Simulator::Now () - m_cfpForeshortening);
-  NS_ASSERT (remainingCfpDuration.IsPositive ());
-  return remainingCfpDuration;
-}
-
-bool
-MacLow::IsCfPeriod (void) const
-{
-  return (m_stationManager->GetPcfSupported () && m_cfpStart.IsStrictlyPositive ());
-}
-
-bool
-MacLow::CanTransmitNextCfFrame (void) const
-{
-  NS_LOG_FUNCTION (this);
-  if (!IsCfPeriod ())
-    {
-      return false;
-    }
-  NS_ASSERT (GetRemainingCfpDuration ().IsPositive ());
-  WifiMacHeader hdr;
-  hdr.SetType (WIFI_MAC_DATA);
-  WifiMacTrailer fcs;
-  uint32_t maxMacFrameSize = MAX_MSDU_SIZE + hdr.GetSerializedSize () + fcs.GetSerializedSize ();
-  Time nextTransmission = 2 * m_phy->CalculateTxDuration (maxMacFrameSize, m_currentTxVector, m_phy->GetPhyBand ()) + 3 * GetSifs () + m_phy->CalculateTxDuration (GetCfEndSize (), m_currentTxVector, m_phy->GetPhyBand ());
-  return ((GetRemainingCfpDuration () - nextTransmission).IsPositive ());
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/mac-low.h ns-3.34/src/wifi/model/mac-low.h
--- ns-3.33/src/wifi/model/mac-low.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/mac-low.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,913 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2005, 2006 INRIA
- * Copyright (c) 2009 MIRKO BANCHI
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- *          Mirko Banchi <mk.banchi@gmail.com>
- */
-
-#ifndef MAC_LOW_H
-#define MAC_LOW_H
-
-#include <map>
-#include "ns3/object.h"
-#include "ns3/nstime.h"
-#include "channel-access-manager.h"
-#include "block-ack-cache.h"
-#include "mac-low-transmission-parameters.h"
-#include "qos-utils.h"
-#include "wifi-mac-header.h"
-#include "wifi-tx-vector.h"
-#include "block-ack-type.h"
-#include "wifi-mpdu-type.h"
-
-namespace ns3 {
-
-class WifiMac;
-class WifiPhy;
-class Txop;
-class QosTxop;
-class WifiMacQueueItem;
-class WifiMacQueue;
-class WifiPsdu;
-class BlockAckAgreement;
-class MgtAddBaResponseHeader;
-class WifiRemoteStationManager;
-class CtrlBAckRequestHeader;
-class CtrlBAckResponseHeader;
-class MsduAggregator;
-class MpduAggregator;
-
-/**
- * \ingroup wifi
- * \brief handle RTS/CTS/Data/Ack transactions.
- */
-class MacLow : public Object
-{
-public:
-
-  /**
-   * typedef for a callback for MacLowRx
-   */
-  typedef Callback<void, Ptr<WifiMacQueueItem>> MacLowRxCallback;
-
-  MacLow ();
-  virtual ~MacLow ();
-
-  /**
-   * Register this type.
-   * \return The TypeId.
-   */
-  static TypeId GetTypeId (void);
-
-  /**
-   * Set up WifiPhy associated with this MacLow.
-   *
-   * \param phy WifiPhy associated with this MacLow
-   */
-  void SetPhy (const Ptr<WifiPhy> phy);
-  /**
-   * \return current attached PHY device
-   */
-  Ptr<WifiPhy> GetPhy (void) const;
-  /**
-   * Remove WifiPhy associated with this MacLow.
-   */
-  void ResetPhy (void);
-  /**
-   * \param tid the Traffic ID
-   * \return the QosTxop corresponding to the given TID
-   */
-  Ptr<QosTxop> GetEdca (uint8_t tid) const;
-  /**
-   * Set up WifiMac associated with this MacLow.
-   *
-   * \param mac WifiMac associated with this MacLow
-   */
-  void SetMac (const Ptr<WifiMac> mac);
-  /**
-   * Set up WifiRemoteStationManager associated with this MacLow.
-   *
-   * \param manager WifiRemoteStationManager associated with this MacLow
-   */
-  void SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> manager);
-  /**
-   * Set MAC address of this MacLow.
-   *
-   * \param ad Mac48Address of this MacLow
-   */
-  void SetAddress (Mac48Address ad);
-  /**
-   * Enable or disable CTS-to-self capability.
-   *
-   * \param enable Enable or disable CTS-to-self capability
-   */
-  void SetCtsToSelfSupported (bool enable);
-  /**
-   * \param interval the expected interval between two beacon transmissions.
-   */
-  void SetBeaconInterval (Time interval);
-  /**
-   * \param duration the maximum duration for the CF period.
-   */
-  void SetCfpMaxDuration (Time duration);
-  /**
-   * Set the Basic Service Set Identification.
-   *
-   * \param ad the BSSID
-   */
-  void SetBssid (Mac48Address ad);
-  /**
-   * Enable promiscuous mode.
-   */
-  void SetPromisc (void);
-  /**
-   * Return whether CTS-to-self capability is supported.
-   *
-   * \return true if CTS-to-self is supported, false otherwise
-   */
-  bool GetCtsToSelfSupported (void) const;
-  /**
-   * Return the MAC address of this MacLow.
-   *
-   * \return Mac48Address of this MacLow
-   */
-  Mac48Address GetAddress (void) const;
-  /**
-   * Return Short Interframe Space (SIFS) of this MacLow.
-   *
-   * \return SIFS
-   */
-  Time GetSifs (void) const;
-  /**
-   * Return slot duration of this MacLow.
-   *
-   * \return slot duration
-   */
-  Time GetSlotTime (void) const;
-  /**
-   * Return PCF Interframe Space (PIFS) of this MacLow.
-   *
-   * \return PIFS
-   */
-  Time GetPifs (void) const;
-  /**
-   * \return the expected interval between two beacon transmissions.
-   */
-  Time GetBeaconInterval (void) const;
-  /**
-   * \return the maximum duration for the CF period.
-   */
-  Time GetCfpMaxDuration (void) const;
-  /**
-   * \return the remaining duration for the CF period.
-   */
-  Time GetRemainingCfpDuration (void) const;
-  /**
-   * Return the Basic Service Set Identification.
-   *
-   * \return BSSID
-   */
-  Mac48Address GetBssid (void) const;
-  /**
-   * Check if MacLow is operating in promiscuous mode.
-   *
-   * \return true if MacLow is operating in promiscuous mode,
-   *         false otherwise
-   */
-  bool IsPromisc (void) const;
-
-  /**
-   * \param callback the callback which receives every incoming packet.
-   *
-   * This callback typically forwards incoming packets to
-   * an instance of ns3::MacRxMiddle.
-   */
-  void SetRxCallback (Callback<void, Ptr<WifiMacQueueItem>> callback);
-  /**
-   * \param channelAccessManager pointer to ChannelAccessManager in order to listen to NAV events
-   *        for every incoming and outgoing packet.
-   */
-  void RegisterChannelAccessManager (Ptr<ChannelAccessManager> channelAccessManager);
-
-  /**
-   * Check whether the given MPDU, if transmitted according to the given TX vector,
-   * meets the constraint on the maximum A-MPDU size (by assuming that the frame
-   * has to be aggregated to an existing A-MPDU of the given size) and its
-   * transmission time exceeds neither the max PPDU duration (depending on the
-   * PPDU format) nor the given PPDU duration limit (if strictly positive).
-   * The given MPDU needs to be a QoS Data frame.
-   *
-   * \param mpdu the MPDU.
-   * \param txVector the TX vector used to transmit the MPDU
-   * \param ampduSize the size of the existing A-MPDU in bytes, if any
-   * \param ppduDurationLimit the limit on the PPDU duration
-   * \returns true if constraints on size and duration limit are met.
-   */
-  bool IsWithinSizeAndTimeLimits (Ptr<const WifiMacQueueItem> mpdu, WifiTxVector txVector,
-                                  uint32_t ampduSize, Time ppduDurationLimit);
-  /**
-   * Check whether an MPDU of the given size, destined to the given receiver and
-   * belonging to the given TID, if transmitted according to the given TX vector,
-   * meets the constraint on the maximum A-MPDU size (by assuming that the frame
-   * has to be aggregated to an existing A-MPDU of the given size) and its
-   * transmission time exceeds neither the max PPDU duration (depending on the
-   * PPDU format) nor the given PPDU duration limit (if strictly positive).
-   *
-   * \param mpduSize the MPDU size.
-   * \param receiver the receiver
-   * \param tid the TID
-   * \param txVector the TX vector used to transmit the MPDU
-   * \param ampduSize the size of the existing A-MPDU in bytes, if any
-   * \param ppduDurationLimit the limit on the PPDU duration
-   * \returns true if constraints on size and duration limit are met.
-   */
-  bool IsWithinSizeAndTimeLimits (uint32_t mpduSize, Mac48Address receiver, uint8_t tid,
-                                  WifiTxVector txVector, uint32_t ampduSize, Time ppduDurationLimit);
-  /**
-   * \param packet to send (does not include the 802.11 MAC header and checksum)
-   * \param hdr header associated to the packet to send.
-   * \param parameters transmission parameters of packet.
-   * \return the transmission time that includes the time for the next packet transmission
-   *
-   * This transmission time includes the time required for
-   * the next packet transmission if one was selected.
-   */
-  Time CalculateTransmissionTime (Ptr<const Packet> packet,
-                                  const WifiMacHeader* hdr,
-                                  const MacLowTransmissionParameters& parameters) const;
-
-  /**
-   * \param packet to send (does not include the 802.11 MAC header and checksum)
-   * \param hdr header associated to the packet to send.
-   * \param params transmission parameters of packet.
-   * \param fragmentSize the packet fragment size (if fragmentation is used) in bytes
-   * \return the transmission time that includes the time for the next packet transmission
-   *
-   * This transmission time does not include the time required for
-   * the next packet transmission if one was selected.
-   */
-  Time CalculateOverallTxTime (Ptr<const Packet> packet,
-                               const WifiMacHeader* hdr,
-                               const MacLowTransmissionParameters& params,
-                               uint32_t fragmentSize = 0) const;
-
-  /**
-   * \param item packet to send (does not include the 802.11 MAC header and checksum)
-   * \param params transmission parameters of packet.
-   * \return the transmission time that does not include the time required to transmit the frame
-   *
-   * This transmission time  only includes the time for the RTS/CTS exchange (if any)
-   * and for the Ack frame (if any).
-   */
-  Time CalculateOverheadTxTime (Ptr<const WifiMacQueueItem> item,
-                               const MacLowTransmissionParameters& params) const;
-
-  /**
-   * \param mpdu packet to send
-   * \param parameters the transmission parameters to use for this packet.
-   * \param txop pointer to the calling Txop.
-   *
-   * Start the transmission of the input packet and notify the listener
-   * of transmission events.
-   */
-  virtual void StartTransmission (Ptr<WifiMacQueueItem> mpdu,
-                                  MacLowTransmissionParameters parameters,
-                                  Ptr<Txop> txop);
-
-  /**
-   * \param txVector the TXVECTOR decoded from PHY header.
-   * \param psduDuration the duration of the PSDU that is about to be received.
-   *
-   * This method is typically invoked by the lower PHY layer to notify
-   * the MAC layer that the reception of a PSDU is starting.
-   * This is equivalent to the PHY-RXSTART primitive.
-   * If the reception is correct for at least one MPDU of the PSDU
-   * the DeaggregateAmpduAndReceive will be called after \p psduDuration.
-   * Otherwise, ReceiveError will be called after the same duration.
-   */
-  void RxStartIndication (WifiTxVector txVector, Time psduDuration);
-
-  /**
-   * \param mpdu MPDU received
-   * \param rxSnr snr of MPDU received in linear scale
-   * \param txVector TXVECTOR of MPDU received
-   * \param ampduSubframe true if this MPDU is part of an A-MPDU
-   *
-   * This method is typically invoked by the lower PHY layer to notify
-   * the MAC layer that an MPDU was successfully received.
-   */
-  void ReceiveOk (Ptr<WifiMacQueueItem> mpdu, double rxSnr, WifiTxVector txVector, bool ampduSubframe);
-  /**
-   * \param psdu PSDU received.
-   *
-   * This method is typically invoked by the lower PHY layer to notify
-   * the MAC layer that a PSDU was unsuccessfully received.
-   */
-  void ReceiveError (Ptr<WifiPsdu> psdu);
-  /**
-   * \param duration switching delay duration.
-   *
-   * This method is typically invoked by the PhyMacLowListener to notify
-   * the MAC layer that a channel switching occurred. When a channel switching
-   * occurs, pending MAC transmissions (RTS, CTS, Data and Ack) are cancelled.
-   */
-  void NotifySwitchingStartNow (Time duration);
-  /**
-   * This method is typically invoked by the PhyMacLowListener to notify
-   * the MAC layer that the device has been put into sleep mode. When the device is put
-   * into sleep mode, pending MAC transmissions (RTS, CTS, Data and Ack) are cancelled.
-   */
-  void NotifySleepNow (void);
-  /**
-   * This method is typically invoked by the PhyMacLowListener to notify
-   * the MAC layer that the device has been put into off mode. When the device is put
-   * into off mode, pending MAC transmissions (RTS, CTS, Data and Ack) are cancelled.
-   */
-  void NotifyOffNow (void);
-  /**
-   * \param respHdr Add block ack response from originator (action
-   *        frame).
-   * \param originator Address of peer station involved in block ack
-   *        mechanism.
-   * \param startingSeq Sequence number of the first MPDU of all
-   *        packets for which block ack was negotiated.
-   *
-   * This function is typically invoked only by ns3::RegularWifiMac
-   * when the STA (which may be non-AP in ESS, or in an IBSS) has
-   * received an ADDBA Request frame and is transmitting an ADDBA
-   * Response frame. At this point MacLow must allocate buffers to
-   * collect all correctly received packets belonging to the category
-   * for which block ack was negotiated.
-   */
-  void CreateBlockAckAgreement (const MgtAddBaResponseHeader *respHdr,
-                                Mac48Address originator,
-                                uint16_t startingSeq);
-  /**
-   * \param originator Address of peer participating in block ack mechanism.
-   * \param tid TID for which block ack was created.
-   *
-   * Checks if exists an established block ack agreement with <i>originator</i>
-   * for TID <i>tid</i>. If the agreement exists, tears down it. This function is typically
-   * invoked when a DELBA frame is received from <i>originator</i>.
-   */
-  void DestroyBlockAckAgreement (Mac48Address originator, uint8_t tid);
-  /**
-   * \param ac Access class managed by the queue.
-   * \param edca the QosTxop for the queue.
-   *
-   * The lifetime of the registered QosTxop is typically equal to the lifetime of the queue
-   * associated to this AC.
-   */
-  void RegisterEdcaForAc (AcIndex ac, Ptr<QosTxop> edca);
-  /**
-   * \param aggregatedPacket which is the current A-MPDU
-   * \param rxSnr SNR of packet received in linear scale
-   * \param txVector TXVECTOR of packet received
-   * \param statusPerMpdu reception status per MPDU
-   *
-   * This function de-aggregates an A-MPDU and decide if each MPDU is received correctly or not
-   *
-   */
-  void DeaggregateAmpduAndReceive (Ptr<WifiPsdu> aggregatedPacket, double rxSnr, WifiTxVector txVector,
-                                   std::vector<bool> statusPerMpdu);
-
-  /**
-   * Return a TXVECTOR for the Data frame given the destination.
-   * The function consults WifiRemoteStationManager, which controls the rate
-   * to different destinations.
-   *
-   * \param item the item being asked for TXVECTOR
-   * \return TXVECTOR for the given item
-   */
-  virtual WifiTxVector GetDataTxVector (Ptr<const WifiMacQueueItem> item) const;
-  /**
-   * Start NAV with the given duration.
-   *
-   * \param duration the duration
-   * \return true if NAV is reset
-   */
-  bool DoNavStartNow (Time duration);
-  /**
-   * This function indicates whether Simulator::Now is in the CF period.
-   *
-   * \return true if Simulator::Now is in CF period,
-   *         false otherwise
-   */
-  virtual bool IsCfPeriod (void) const;
-  /**
-   * This function decides if a CF frame can be transmitted in the current CFP.
-   *
-   * \return true if a CF frame can be transmitted in the current CFP,
-   *         false otherwise
-   */
-  bool CanTransmitNextCfFrame (void) const;
-
-  /**
-   * Returns the aggregator used to construct A-MSDU subframes.
-   *
-   * \return the aggregator used to construct A-MSDU subframes.
-   */
-  Ptr<MsduAggregator> GetMsduAggregator (void) const;
-  /**
-   * Returns the aggregator used to construct A-MPDU subframes.
-   *
-   * \return the aggregator used to construct A-MPDU subframes.
-   */
-  Ptr<MpduAggregator> GetMpduAggregator (void) const;
-
-  /**
-   * Set the aggregator used to construct A-MSDU subframes.
-   *
-   * \param aggr pointer to the MSDU aggregator.
-   */
-  void SetMsduAggregator (const Ptr<MsduAggregator> aggr);
-  /**
-   * Set the aggregator used to construct A-MPDU subframes.
-   *
-   * \param aggr pointer to the MPDU aggregator.
-   */
-  void SetMpduAggregator (const Ptr<MpduAggregator> aggr);
-
-
-private:
-  /**
-   * Cancel all scheduled events. Called before beginning a transmission
-   * or switching channel.
-   */
-  void CancelAllEvents (void);
-  /**
-   * Return the total CF-END size (including FCS trailer).
-   *
-   * \return the total CF-END size in bytes
-   */
-  uint32_t GetCfEndSize (void) const;
-  /**
-   * Forward a PSDU down to WifiPhy for transmission.
-   *
-   * \param psdu the PSDU
-   * \param txVector the transmit vector
-   */
-  void ForwardDown (Ptr<const WifiPsdu> psdu, WifiTxVector txVector);
-  /**
-   * Return a TXVECTOR for the RTS frame given the destination.
-   * The function consults WifiRemoteStationManager, which controls the rate
-   * to different destinations.
-   *
-   * \param item the item being asked for RTS TXVECTOR
-   * \return TXVECTOR for the RTS of the given item
-   */
-  WifiTxVector GetRtsTxVector (Ptr<const WifiMacQueueItem> item) const;
-  /**
-   * Return a TXVECTOR for the CTS frame given the destination and the mode of the RTS
-   * used by the sender.
-   * The function consults WifiRemoteStationManager, which controls the rate
-   * to different destinations.
-   *
-   * \param to the MAC address of the CTS receiver
-   * \param rtsTxMode the mode of the RTS used by the sender
-   * \return TXVECTOR for the CTS
-   */
-  WifiTxVector GetCtsTxVector (Mac48Address to, WifiMode rtsTxMode) const;
-  /**
-   * Return a TXVECTOR for the Ack frame given the destination and the mode of the Data
-   * used by the sender.
-   * The function consults WifiRemoteStationManager, which controls the rate
-   * to different destinations.
-   *
-   * \param to the MAC address of the Ack receiver
-   * \param dataTxMode the mode of the Data used by the sender
-   * \return TXVECTOR for the Ack
-   */
-  WifiTxVector GetAckTxVector (Mac48Address to, WifiMode dataTxMode) const;
-  /**
-   * Return a TXVECTOR for the BlockAck frame given the destination and the mode of the Data
-   * used by the sender.
-   * The function consults WifiRemoteStationManager, which controls the rate
-   * to different destinations.
-   *
-   * \param to the MAC address of the BlockAck receiver
-   * \param dataTxMode the mode of the Data used by the sender
-   * \return TXVECTOR for the BlockAck
-   */
-  WifiTxVector GetBlockAckTxVector (Mac48Address to, WifiMode dataTxMode) const;
-  /**
-   * Return a TXVECTOR for the CTS frame given the destination and the mode of the RTS
-   * used by the sender.
-   * The function consults WifiRemoteStationManager, which controls the rate
-   * to different destinations.
-   *
-   * \param to the MAC address of the CTS receiver
-   * \param rtsTxMode the mode of the RTS used by the sender
-   * \return TXVECTOR for the CTS
-   */
-  WifiTxVector GetCtsTxVectorForRts (Mac48Address to, WifiMode rtsTxMode) const;
-  /**
-   * Return a TXVECTOR for the BlockAck frame given the destination and the mode of the Data
-   * used by the sender.
-   * The function consults WifiRemoteStationManager, which controls the rate
-   * to different destinations.
-   *
-   * \param to the MAC address of the BlockAck receiver
-   * \param dataTxMode the mode of the Data used by the sender
-   * \return TXVECTOR for the BlockAck
-   */
-  WifiTxVector GetAckTxVectorForData (Mac48Address to, WifiMode dataTxMode) const;
-  /**
-   * Get control answer mode function.
-   *
-   * \param reqMode request mode
-   *
-   * \return control answer mode
-   */
-  WifiMode GetControlAnswerMode (WifiMode reqMode) const;
-  /**
-   * Return the time required to transmit the CTS (including preamble and FCS).
-   *
-   * \param ctsTxVector the TXVECTOR used to transmit the CTS
-   * \return the time required to transmit the CTS (including preamble and FCS)
-   */
-  Time GetCtsDuration (WifiTxVector ctsTxVector) const;
-  /**
-   * Return the time required to transmit the CTS to the specified address
-   * given the TXVECTOR of the RTS (including preamble and FCS).
-   *
-   * \param to the receiver MAC address
-   * \param rtsTxVector the TXVECTOR used to transmit the RTS
-   * \return the time required to transmit the CTS (including preamble and FCS)
-   */
-  Time GetCtsDuration (Mac48Address to, WifiTxVector rtsTxVector) const;
-  /**
-   * Return the time required to transmit the Ack (including preamble and FCS).
-   *
-   * \param ackTxVector the TXVECTOR used to transmit the Ack
-   * \return the time required to transmit the Ack (including preamble and FCS)
-   */
-  Time GetAckDuration (WifiTxVector ackTxVector) const;
-  /**
-   * Return the time required to transmit the Ack to the specified address
-   * given the TXVECTOR of the Data (including preamble and FCS).
-   *
-   * \param to the receiver MAC address
-   * \param dataTxVector the TXVECTOR used to transmit the Data
-   * \return the time required to transmit the Ack (including preamble and FCS)
-   */
-  Time GetAckDuration (Mac48Address to, WifiTxVector dataTxVector) const;
-  /**
-   * Return the time required to transmit the BlockAck to the specified address
-   * given the TXVECTOR of the BAR (including preamble and FCS).
-   *
-   * \param blockAckReqTxVector the TXVECTOR used to transmit the BAR
-   * \param type the BlockAck type
-   * \return the time required to transmit the BlockAck (including preamble and FCS)
-   */
-  Time GetBlockAckDuration (WifiTxVector blockAckReqTxVector, BlockAckType type) const;
-  /**
-   * Return the time required to transmit the BlockAckRequest to the specified address
-   * given the TXVECTOR (including preamble and FCS).
-   *
-   * \param blockAckReqTxVector the TX vector used to transmit the BAR
-   * \param type the BlockAckRequest type
-   * \return the time required to transmit the BlockAckRequest (including preamble and FCS)
-   */
-  Time GetBlockAckRequestDuration (WifiTxVector blockAckReqTxVector, BlockAckType type) const;
-  /**
-   * Return the time required to transmit the response frames (Ack or BAR+BA
-   * following the policy configured in the transmit parameters).
-   *
-   * \param params the transmission parameters
-   * \param dataTxVector the TX vector used to transmit the data frame
-   * \param receiver the station from which a response is expected
-   * \return the time required to transmit the response (Ack or BAR+BA)
-   */
-  Time GetResponseDuration (const MacLowTransmissionParameters& params,
-                            WifiTxVector dataTxVector, Mac48Address receiver) const;
-  /**
-   * Check if CTS-to-self mechanism should be used for the current packet.
-   *
-   * \return true if CTS-to-self mechanism should be used for the current packet,
-   *         false otherwise
-   */
-  bool NeedCtsToSelf (void) const;
-
-  /**
-   * Notify NAV function.
-   *
-   * \param packet the packet
-   * \param hdr the header
-   */
-  void NotifyNav (Ptr<const Packet> packet,const WifiMacHeader &hdr);
-  /**
-   * Reset NAV with the given duration.
-   *
-   * \param duration the duration to set
-   */
-  void DoNavResetNow (Time duration);
-  /**
-   * Check if NAV is zero.
-   *
-   * \return true if NAV is zero,
-   *         false otherwise
-   */
-  bool IsNavZero (void) const;
-  /**
-   * Notify ChannelAccessManager that Ack timer should be started for the given duration.
-   *
-   * \param duration the duration of the timer
-   */
-  void NotifyAckTimeoutStartNow (Time duration);
-  /**
-   * Notify ChannelAccessManager that Ack timer should be reset.
-   */
-  void NotifyAckTimeoutResetNow (void);
-  /**
-   * Notify ChannelAccessManager that CTS timer should be started for the given duration.
-   *
-   * \param duration the duration of the timer
-   */
-  void NotifyCtsTimeoutStartNow (Time duration);
-  /**
-   * Notify ChannelAccessManager that CTS timer should be reset.
-   */
-  void NotifyCtsTimeoutResetNow (void);
-  /* Event handlers */
-  /**
-   * Event handler when normal Ack timeout occurs.
-   */
-  void NormalAckTimeout (void);
-  /**
-   * Event handler when BlockAck timeout occurs.
-   */
-  void BlockAckTimeout (void);
-  /**
-   * Event handler when CTS timeout occurs.
-   */
-  void CtsTimeout (void);
-  /**
-   * Event handler when CF-Poll timeout occurs.
-   */
-  void CfPollTimeout (void);
-  /**
-   * Send CTS for a CTS-to-self mechanism.
-   */
-  void SendCtsToSelf (void);
-  /**
-   * Send CTS after receiving RTS.
-   *
-   * \param source the transmitter of the RTS
-   * \param duration the NAV of the RTS
-   * \param rtsTxVector the TXVECTOR used to transmit the RTS
-   * \param rtsSnr the SNR of the RTS in linear scale
-   */
-  void SendCtsAfterRts (Mac48Address source, Time duration, WifiTxVector rtsTxVector, double rtsSnr);
-  /**
-   * Send Ack after receiving Data.
-   *
-   * \param source the transmitter of the Data
-   * \param duration the NAV of the Data
-   * \param dataTxMode the TXVECTOR used to transmit the Data
-   * \param dataSnr the SNR of the Data in linear scale
-   */
-  void SendAckAfterData (Mac48Address source, Time duration, WifiMode dataTxMode, double dataSnr);
-  /**
-   * Send Data after receiving CTS.
-   *
-   * \param duration the NAV of the CTS
-   */
-  void SendDataAfterCts (Time duration);
-
-  /**
-   * Event handler that is usually scheduled to fired at the appropriate time
-   * after completing transmissions.
-   */
-  void WaitIfsAfterEndTxFragment (void);
-  /**
-   * Event handler that is usually scheduled to fired at the appropriate time
-   * after sending a packet.
-   */
-  void WaitIfsAfterEndTxPacket (void);
-
-  /**
-   * A transmission that does not require an Ack has completed.
-   */
-  void EndTxNoAck (void);
-  /**
-   * Send RTS to begin RTS-CTS-Data-Ack transaction.
-   */
-  void SendRtsForPacket (void);
-  /**
-   * Send Data packet, which can be Data-Ack or
-   * RTS-CTS-Data-Ack transaction.
-   */
-  void SendDataPacket (void);
-  /**
-   * Start a Data timer by scheduling appropriate
-   * Ack timeout.
-   *
-   * \param dataTxVector the TXVECTOR used to transmit the Data
-   */
-  void StartDataTxTimers (WifiTxVector dataTxVector);
-
-  void DoDispose (void);
-
-  /**
-   * \param originator Address of peer participating in block ack mechanism.
-   * \param tid TID for which block ack was created.
-   * \param seq Starting sequence control
-   *
-   * This function forward up all completed "old" packets with sequence number
-   * smaller than <i>seq</i>. All comparison are performed circularly modulo 4096.
-   */
-  void RxCompleteBufferedPacketsWithSmallerSequence (uint16_t seq, Mac48Address originator, uint8_t tid);
-  /**
-   * \param originator Address of peer participating in block ack mechanism.
-   * \param tid TID for which block ack was created.
-   *
-   * This method is typically invoked when a MPDU with ack policy
-   * subfield set to Normal Ack is received and a block ack agreement
-   * for that packet exists.
-   * This happens when the originator of block ack has only few MPDUs to send.
-   * All completed MSDUs starting with starting sequence number of block ack
-   * agreement are forward up to WifiMac until there is an incomplete or missing MSDU.
-   * See section 9.10.4 in IEEE 802.11 standard for more details.
-   */
-  void RxCompleteBufferedPacketsUntilFirstLost (Mac48Address originator, uint8_t tid);
-  /**
-   * \param mpdu the MPDU
-   * \returns true if MPDU received
-   *
-   * This method updates the reorder buffer and the scoreboard when an MPDU is received in an HT station
-   * and stores the MPDU if needed when an MPDU is received in an non-HT Station (implements HT
-   * immediate BlockAck)
-   */
-  bool ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu);
-  /**
-   * \param mpdu the MPDU
-   * \returns true if the MPDU stored
-   *
-   * This method checks if exists a valid established block ack agreement.
-   * If there is, store the packet without pass it up to WifiMac. The packet is buffered
-   * in order of increasing sequence control field. All comparison are performed
-   * circularly modulo 2^12.
-   */
-  bool StoreMpduIfNeeded (Ptr<WifiMacQueueItem> mpdu);
-  /**
-   * Invoked after that a BlockAckRequest has been received. Looks for corresponding
-   * block ack agreement and creates a block ack bitmap on a received packets basis.
-   *
-   * \param reqHdr the BAR header
-   * \param originator the transmitter of the BAR
-   * \param duration the NAV of the BAR
-   * \param blockAckReqTxMode the TXVECTOR used to transmit the BAR
-   * \param rxSnr the SNR of the BAR in linear scale
-   */
-  void SendBlockAckAfterBlockAckRequest (const CtrlBAckRequestHeader reqHdr, Mac48Address originator,
-                                         Time duration, WifiMode blockAckReqTxMode, double rxSnr);
-  /**
-   * Invoked after an A-MPDU has been received. Looks for corresponding
-   * block ack agreement and creates a block ack bitmap on a received packets basis.
-   *
-   * \param tid the Traffic ID
-   * \param originator the originator MAC address
-   * \param duration the remaining NAV duration
-   * \param blockAckReqTxVector the transmit vector
-   * \param rxSnr the receive SNR in linear scale
-   */
-  void SendBlockAckAfterAmpdu (uint8_t tid, Mac48Address originator, Time duration,
-                               WifiTxVector blockAckReqTxVector, double rxSnr);
-  /**
-   * This method creates BlockAck frame with header equals to <i>blockAck</i> and start its transmission.
-   *
-   * \param blockAck the BA response header to send
-   * \param originator the station to send a BA to
-   * \param immediate use immediate BA policy if true
-   * \param duration the NAV duration
-   * \param blockAckReqTxMode the TXVECTOR used to transmit the BAR
-   * \param rxSnr the received SNR in linear scale
-   */
-  void SendBlockAckResponse (const CtrlBAckResponseHeader* blockAck, Mac48Address originator, bool immediate,
-                             Time duration, WifiMode blockAckReqTxMode, double rxSnr);
-  /**
-   * Every time that a BlockAckRequest or a packet with Ack Policy equals to <i>Block Ack</i>
-   * are received, if a relative block ack agreement exists and the value of inactivity timeout
-   * is not 0, the timer is reset.
-   * see section 11.5.3 in IEEE 802.11e for more details.
-   *
-   * \param agreement the BA agreement
-   */
-  void ResetBlockAckInactivityTimerIfNeeded (BlockAckAgreement &agreement);
-
-  /**
-   * Set up WifiPhy listener for this MacLow.
-   *
-   * \param phy the WifiPhy this MacLow is connected to
-   */
-  void SetupPhyMacLowListener (const Ptr<WifiPhy> phy);
-  /**
-   * Remove current WifiPhy listener for this MacLow.
-   *
-   * \param phy the WifiPhy this MacLow is connected to
-   */
-  void RemovePhyMacLowListener (Ptr<WifiPhy> phy);
-
-  Ptr<WifiPhy> m_phy; //!< Pointer to WifiPhy (actually send/receives frames)
-  Ptr<WifiMac> m_mac; //!< Pointer to WifiMac (to fetch configuration)
-  Ptr<WifiRemoteStationManager> m_stationManager; //!< Pointer to WifiRemoteStationManager (rate control)
-  MacLowRxCallback m_rxCallback; //!< Callback to pass packet up
-
-  /**
-   * A struct that holds information about Ack piggybacking (CF-Ack).
-   */
-  struct CfAckInfo
-  {
-    bool appendCfAck;     //!< Flag used for PCF to indicate whether a CF-Ack should be appended
-    bool expectCfAck;     //!< Flag used for PCF to indicate whether a CF-Ack should be expected
-    Mac48Address address; //!< Address of the station to be acknowledged
-  };
-
-  /**
-   * typedef for an iterator for a list of ChannelAccessManager.
-   */
-  typedef std::vector<Ptr<ChannelAccessManager> >::const_iterator ChannelAccessManagersCI;
-  /**
-   * typedef for a list of ChannelAccessManager.
-   */
-  typedef std::vector<Ptr<ChannelAccessManager> > ChannelAccessManagers;
-  ChannelAccessManagers m_channelAccessManagers; //!< List of ChannelAccessManager
-
-  Ptr<MsduAggregator> m_msduAggregator;             //!< A-MSDU aggregator
-  Ptr<MpduAggregator> m_mpduAggregator;             //!< A-MPDU aggregator
-
-  EventId m_normalAckTimeoutEvent;      //!< Normal Ack timeout event
-  EventId m_blockAckTimeoutEvent;       //!< BlockAck timeout event
-  EventId m_ctsTimeoutEvent;            //!< CTS timeout event
-  EventId m_sendCtsEvent;               //!< Event to send CTS
-  EventId m_sendAckEvent;               //!< Event to send Ack
-  EventId m_sendDataEvent;              //!< Event to send Data
-  EventId m_waitIfsEvent;               //!< Wait for IFS event
-  EventId m_endTxNoAckEvent;            //!< Event for finishing transmission that does not require Ack
-  EventId m_navCounterResetCtsMissed;   //!< Event to reset NAV when CTS is not received
-
-  Ptr<WifiPsdu> m_currentPacket;            //!< Current packet transmitted/to be transmitted
-  Ptr<Txop> m_currentTxop;                  //!< Current TXOP
-  MacLowTransmissionParameters m_txParams;  //!< Transmission parameters of the current packet
-  Mac48Address m_self;                      //!< Address of this MacLow (Mac48Address)
-  Mac48Address m_bssid;                     //!< BSSID address (Mac48Address)
-
-  Time m_beaconInterval;   //!< Expected interval between two beacon transmissions
-  Time m_cfpMaxDuration;   //!< CFP max duration
-
-  Time m_lastNavStart;     //!< The time when the latest NAV started
-  Time m_lastNavDuration;  //!< The duration of the latest NAV
-
-  Time m_cfpStart;          //!< The time when the latest CF period started
-  Time m_lastBeacon;        //!< The time when the last beacon frame transmission started
-  Time m_cfpForeshortening; //!< The delay the current CF period should be foreshortened
-
-  bool m_promisc;  //!< Flag if the device is operating in promiscuous mode
-
-  class PhyMacLowListener * m_phyMacLowListener; //!< Listener needed to monitor when a channel switching occurs.
-
-  /*
-   * BlockAck data structures.
-   */
-  typedef std::list<Ptr<WifiMacQueueItem>>::iterator BufferedPacketI; //!< buffered packet iterator typedef
-
-  typedef std::pair<Mac48Address, uint8_t> AgreementKey; //!< agreement key typedef
-  typedef std::pair<BlockAckAgreement, std::list<Ptr<WifiMacQueueItem>> > AgreementValue; //!< agreement value typedef
-
-  typedef std::map<AgreementKey, AgreementValue> Agreements; //!< agreements
-  typedef std::map<AgreementKey, AgreementValue>::iterator AgreementsI; //!< agreements iterator
-
-  typedef std::map<AgreementKey, BlockAckCache> BlockAckCaches; //!< block ack caches typedef
-  typedef std::map<AgreementKey, BlockAckCache>::iterator BlockAckCachesI; //!< block ack caches iterator typedef
-
-  Agreements m_bAckAgreements; //!< block ack agreements
-  BlockAckCaches m_bAckCaches; //!< block ack caches
-
-  typedef std::map<AcIndex, Ptr<QosTxop> > QueueEdcas; //!< EDCA queues typedef
-  QueueEdcas m_edca; //!< EDCA queues
-
-  bool m_ctsToSelfSupported;             //!< Flag whether CTS-to-self is supported
-  WifiTxVector m_currentTxVector;        //!< TXVECTOR used for the current packet transmission
-
-  CfAckInfo m_cfAckInfo; //!< Info about piggyback Acks used in PCF
-};
-
-} //namespace ns3
-
-#endif /* MAC_LOW_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/mac-low-transmission-parameters.cc ns-3.34/src/wifi/model/mac-low-transmission-parameters.cc
--- ns-3.33/src/wifi/model/mac-low-transmission-parameters.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/mac-low-transmission-parameters.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,294 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2005,2006 INRIA
- * Copyright (c) 2009 MIRKO BANCHI
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- *          Mirko Banchi <mk.banchi@gmail.com>
- */
-
-#include "mac-low-transmission-parameters.h"
-
-namespace ns3 {
-
-MacLowTransmissionParameters::MacLowTransmissionParameters ()
-  : m_nextSize (0),
-    m_waitAck (ACK_NONE),
-    m_sendBar (BLOCK_ACK_REQUEST_NONE),
-    m_sendRts (false)
-{
-}
-
-void
-MacLowTransmissionParameters::EnableNextData (uint32_t size)
-{
-  m_nextSize = size;
-}
-
-void
-MacLowTransmissionParameters::DisableNextData (void)
-{
-  m_nextSize = 0;
-}
-
-void
-MacLowTransmissionParameters::EnableBlockAck (BlockAckType type)
-{
-  switch (type)
-    {
-    case BlockAckType::BASIC_BLOCK_ACK:
-      m_waitAck = BLOCK_ACK_BASIC;
-      break;
-    case BlockAckType::COMPRESSED_BLOCK_ACK:
-      m_waitAck = BLOCK_ACK_COMPRESSED;
-      break;
-    case BlockAckType::EXTENDED_COMPRESSED_BLOCK_ACK:
-      m_waitAck = BLOCK_ACK_EXTENDED_COMPRESSED;
-      break;
-    case BlockAckType::MULTI_TID_BLOCK_ACK:
-      m_waitAck = BLOCK_ACK_MULTI_TID;
-      break;
-    default:
-      NS_FATAL_ERROR ("Unknown Block ack type");
-      break;
-    }
-
-  // Reset m_sendBar
-  m_sendBar = BLOCK_ACK_REQUEST_NONE;
-}
-
-void
-MacLowTransmissionParameters::EnableBlockAckRequest (BlockAckType type)
-{
-  switch (type)
-    {
-    case BlockAckType::BASIC_BLOCK_ACK:
-      m_sendBar = BLOCK_ACK_REQUEST_BASIC;
-      break;
-    case BlockAckType::COMPRESSED_BLOCK_ACK:
-      m_sendBar = BLOCK_ACK_REQUEST_COMPRESSED;
-      break;
-    case BlockAckType::EXTENDED_COMPRESSED_BLOCK_ACK:
-      m_sendBar = BLOCK_ACK_REQUEST_EXTENDED_COMPRESSED;
-      break;
-    case BlockAckType::MULTI_TID_BLOCK_ACK:
-      m_sendBar = BLOCK_ACK_REQUEST_MULTI_TID;
-      break;
-    default:
-      NS_FATAL_ERROR ("Unknown Block Ack Request type");
-      break;
-    }
-
-  // Reset m_waitAck
-  m_waitAck = ACK_NONE;
-}
-
-void
-MacLowTransmissionParameters::EnableAck (void)
-{
-  m_waitAck = ACK_NORMAL;
-  // Reset m_sendBar
-  m_sendBar = BLOCK_ACK_REQUEST_NONE;
-}
-
-void
-MacLowTransmissionParameters::DisableAck (void)
-{
-  m_waitAck = ACK_NONE;
-}
-
-void
-MacLowTransmissionParameters::DisableBlockAckRequest (void)
-{
-  m_sendBar = BLOCK_ACK_REQUEST_NONE;
-}
-
-void
-MacLowTransmissionParameters::EnableRts (void)
-{
-  m_sendRts = true;
-}
-
-void
-MacLowTransmissionParameters::DisableRts (void)
-{
-  m_sendRts = false;
-}
-
-bool
-MacLowTransmissionParameters::MustWaitNormalAck (void) const
-{
-  return (m_waitAck == ACK_NORMAL);
-}
-
-bool
-MacLowTransmissionParameters::MustWaitBlockAck (void) const
-{
-  bool ret;
-  switch (m_waitAck)
-    {
-    case BLOCK_ACK_BASIC:
-    case BLOCK_ACK_COMPRESSED:
-    case BLOCK_ACK_EXTENDED_COMPRESSED:
-    case BLOCK_ACK_MULTI_TID:
-      ret = true;
-      break;
-    default:
-      ret = false;
-      break;
-    }
-  return ret;
-}
-
-BlockAckType
-MacLowTransmissionParameters::GetBlockAckType (void) const
-{
-  BlockAckType type;
-  switch (m_waitAck)
-    {
-    case BLOCK_ACK_BASIC:
-      type = BlockAckType::BASIC_BLOCK_ACK;
-      break;
-    case BLOCK_ACK_COMPRESSED:
-      type = BlockAckType::COMPRESSED_BLOCK_ACK;
-      break;
-    case BLOCK_ACK_EXTENDED_COMPRESSED:
-      type = BlockAckType::EXTENDED_COMPRESSED_BLOCK_ACK;
-      break;
-    case BLOCK_ACK_MULTI_TID:
-      type = BlockAckType::MULTI_TID_BLOCK_ACK;
-      break;
-    default:
-      NS_FATAL_ERROR ("Block ack is not used");
-      break;
-    }
-  return type;
-}
-
-bool
-MacLowTransmissionParameters::MustSendBlockAckRequest (void) const
-{
-  bool ret;
-  switch (m_sendBar)
-    {
-    case BLOCK_ACK_REQUEST_BASIC:
-    case BLOCK_ACK_REQUEST_COMPRESSED:
-    case BLOCK_ACK_REQUEST_EXTENDED_COMPRESSED:
-    case BLOCK_ACK_REQUEST_MULTI_TID:
-      ret = true;
-      break;
-    default:
-      ret = false;
-      break;
-    }
-  return ret;
-}
-
-BlockAckType
-MacLowTransmissionParameters::GetBlockAckRequestType (void) const
-{
-  BlockAckType type;
-  switch (m_sendBar)
-    {
-    case BLOCK_ACK_REQUEST_BASIC:
-      type = BlockAckType::BASIC_BLOCK_ACK;
-      break;
-    case BLOCK_ACK_REQUEST_COMPRESSED:
-      type = BlockAckType::COMPRESSED_BLOCK_ACK;
-      break;
-    case BLOCK_ACK_REQUEST_EXTENDED_COMPRESSED:
-      type = BlockAckType::EXTENDED_COMPRESSED_BLOCK_ACK;
-      break;
-    case BLOCK_ACK_REQUEST_MULTI_TID:
-      type = BlockAckType::MULTI_TID_BLOCK_ACK;
-      break;
-    default:
-      NS_FATAL_ERROR ("Block ack request must not be sent");
-      break;
-    }
-  return type;
-}
-
-bool
-MacLowTransmissionParameters::MustSendRts (void) const
-{
-  return m_sendRts;
-}
-
-bool
-MacLowTransmissionParameters::HasNextPacket (void) const
-{
-  return (m_nextSize != 0);
-}
-
-uint32_t
-MacLowTransmissionParameters::GetNextPacketSize (void) const
-{
-  NS_ASSERT (HasNextPacket ());
-  return m_nextSize;
-}
-
-std::ostream &operator << (std::ostream &os, const MacLowTransmissionParameters &params)
-{
-  os << "["
-     << "send rts=" << params.m_sendRts << ", "
-     << "next size=" << params.m_nextSize << ", "
-     << "ack=";
-  switch (params.m_waitAck)
-    {
-    case MacLowTransmissionParameters::ACK_NONE:
-      os << "none, ";
-      break;
-    case MacLowTransmissionParameters::ACK_NORMAL:
-      os << "normal, ";
-      break;
-    case MacLowTransmissionParameters::BLOCK_ACK_BASIC:
-      os << "basic-block-ack, ";
-      break;
-    case MacLowTransmissionParameters::BLOCK_ACK_COMPRESSED:
-      os << "compressed-block-ack, ";
-      break;
-    case MacLowTransmissionParameters::BLOCK_ACK_EXTENDED_COMPRESSED:
-      os << "extended-compressed-block-ack, ";
-      break;
-    case MacLowTransmissionParameters::BLOCK_ACK_MULTI_TID:
-      os << "multi-tid-block-ack, ";
-      break;
-    }
-  os << "bar=";
-  switch (params.m_sendBar)
-    {
-    case MacLowTransmissionParameters::BLOCK_ACK_REQUEST_NONE:
-      os << "none";
-      break;
-    case MacLowTransmissionParameters::BLOCK_ACK_REQUEST_BASIC:
-      os << "basic";
-      break;
-    case MacLowTransmissionParameters::BLOCK_ACK_REQUEST_COMPRESSED:
-      os << "compressed";
-      break;
-    case MacLowTransmissionParameters::BLOCK_ACK_REQUEST_EXTENDED_COMPRESSED:
-      os << "extended-compressed";
-      break;
-    case MacLowTransmissionParameters::BLOCK_ACK_REQUEST_MULTI_TID:
-      os << "multi-tid";
-      break;
-    }
-  os << "]";
-  return os;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/mac-low-transmission-parameters.h ns-3.34/src/wifi/model/mac-low-transmission-parameters.h
--- ns-3.33/src/wifi/model/mac-low-transmission-parameters.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/mac-low-transmission-parameters.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,177 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2005, 2006 INRIA
- * Copyright (c) 2009 MIRKO BANCHI
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- *          Mirko Banchi <mk.banchi@gmail.com>
- */
-
-#ifndef MAC_LOW_TRANSMISSION_PARAMETERS_H
-#define MAC_LOW_TRANSMISSION_PARAMETERS_H
-
-#include "ns3/uinteger.h"
-#include "block-ack-type.h"
-
-namespace ns3 {
-
-/**
- * \brief control how a packet is transmitted.
- * \ingroup wifi
- *
- * The ns3::MacLow::StartTransmission method expects
- * an instance of this class to describe how the packet
- * should be transmitted.
- */
-class MacLowTransmissionParameters
-{
-public:
-  MacLowTransmissionParameters ();
-
-  /**
-   * Wait ACKTimeout for an Ack. If we get an Ack
-   * on time, call MacLowTransmissionListener::GotAck.
-   * Call MacLowTransmissionListener::MissedAck otherwise.
-   */
-  void EnableAck (void);
-  /**
-   * Wait the timeout corresponding to the given BlockAck response type.
-   *
-   * \param type the BlockAck response type
-   */
-  void EnableBlockAck (BlockAckType type);
-  /**
-   * Schedule the transmission of a BlockAckRequest of the given type.
-   *
-   * \param type the BlockAckRequest type
-   */
-  void EnableBlockAckRequest (BlockAckType type);
-  /**
-   * Send a RTS, and wait CTSTimeout for a CTS. If we get a
-   * CTS on time, call MacLowTransmissionListener::GotCts
-   * and send data. Otherwise, call MacLowTransmissionListener::MissedCts
-   * and do not send data.
-   */
-  void EnableRts (void);
-  /**
-   * \param size size of next data to send after current packet is
-   *        sent in bytes.
-   *
-   * Add the transmission duration of the next data to the
-   * durationId of the outgoing packet and call
-   * MacLowTransmissionListener::StartNextFragment at the end of
-   * the current transmission + SIFS.
-   */
-  void EnableNextData (uint32_t size);
-  /**
-   * Do not wait for Ack after data transmission. Typically
-   * used for Broadcast and multicast frames.
-   */
-  void DisableAck (void);
-  /**
-   * Do not send BlockAckRequest after data transmission
-   */
-  void DisableBlockAckRequest (void);
-  /**
-   * Do not send RTS and wait for CTS before sending data.
-   */
-  void DisableRts (void);
-  /**
-   * Do not attempt to send data burst after current transmission
-   */
-  void DisableNextData (void);
-  /**
-   * \returns true if normal ack protocol should be used, false
-   *          otherwise.
-   *
-   * \sa EnableAck
-   */
-  bool MustWaitNormalAck (void) const;
-  /**
-   * \returns true if block ack mechanism is used, false otherwise.
-   *
-   * \sa EnableBlockAck
-   */
-  bool MustWaitBlockAck (void) const;
-  /**
-   * \returns the selected BlockAck variant.
-   *
-   * Only call this method if the block ack mechanism is used.
-   */
-  BlockAckType GetBlockAckType (void) const;
-  /**
-   * \returns true if a BlockAckRequest must be sent, false otherwise.
-   *
-   * Return true if a BlockAckRequest must be sent, false otherwise.
-   */
-  bool MustSendBlockAckRequest (void) const;
-  /**
-   * \returns the selected BlockAckRequest variant.
-   *
-   * Only call this method if a BlockAckRequest must be sent.
-   */
-  BlockAckType GetBlockAckRequestType (void) const;
-  /**
-   * \returns true if RTS should be sent and CTS waited for before
-   *          sending data, false otherwise.
-   */
-  bool MustSendRts (void) const;
-  /**
-   * \returns true if EnableNextData was called, false otherwise.
-   */
-  bool HasNextPacket (void) const;
-  /**
-   * \returns the size specified by EnableNextData.
-   */
-  uint32_t GetNextPacketSize (void) const;
-
-private:
-  friend std::ostream &operator << (std::ostream &os, const MacLowTransmissionParameters &params);
-  uint32_t m_nextSize; //!< the next size
-  /// wait Ack enumerated type
-  enum
-  {
-    ACK_NONE,
-    ACK_NORMAL,
-    BLOCK_ACK_BASIC,
-    BLOCK_ACK_COMPRESSED,
-    BLOCK_ACK_EXTENDED_COMPRESSED,
-    BLOCK_ACK_MULTI_TID
-  } m_waitAck; //!< wait Ack
-  /// send BAR enumerated type
-  enum
-  {
-    BLOCK_ACK_REQUEST_NONE,
-    BLOCK_ACK_REQUEST_BASIC,
-    BLOCK_ACK_REQUEST_COMPRESSED,
-    BLOCK_ACK_REQUEST_EXTENDED_COMPRESSED,
-    BLOCK_ACK_REQUEST_MULTI_TID
-  } m_sendBar; //!< send BAR
-  bool m_sendRts; //!< send an RTS?
-};
-
-/**
- * Serialize MacLowTransmissionParameters to ostream in a human-readable form.
- *
- * \param os std::ostream
- * \param params MacLowTransmissionParameters
- * \return std::ostream
- */
-std::ostream &operator << (std::ostream &os, const MacLowTransmissionParameters &params);
-
-} //namespace ns3
-
-#endif /* MAC_LOW_TRANSMISSION_PARAMETERS_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/mac-rx-middle.cc ns-3.34/src/wifi/model/mac-rx-middle.cc
--- ns-3.33/src/wifi/model/mac-rx-middle.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/mac-rx-middle.cc	2021-07-14 10:31:07.000000000 -0700
@@ -301,10 +301,7 @@
   NS_LOG_FUNCTION (*mpdu);
   const WifiMacHeader* hdr = &mpdu->GetHeader ();
   NS_ASSERT (hdr->IsData () || hdr->IsMgt ());
-  if (!m_pcfCallback.IsNull ())
-    {
-      m_pcfCallback ();
-    }
+
   OriginatorRxStatus *originator = Lookup (hdr);
   /**
    * The check below is really unneeded because it can fail in a lot of
@@ -354,10 +351,4 @@
     }
 }
 
-void
-MacRxMiddle::SetPcfCallback (Callback<void> callback)
-{
-  m_pcfCallback = callback;
-}
-
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/mac-rx-middle.h ns-3.34/src/wifi/model/mac-rx-middle.h
--- ns-3.33/src/wifi/model/mac-rx-middle.h	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/mac-rx-middle.h	2021-07-14 10:31:07.000000000 -0700
@@ -57,13 +57,6 @@
   void SetForwardCallback (ForwardUpCallback callback);
 
   /**
-   * Set a callback to trigger the next PCF frame.
-   *
-   * \param callback the callback to set
-   */
-  void SetPcfCallback (Callback<void> callback);
-
-  /**
    * Receive a packet.
    *
    * \param mpdu the MPDU
@@ -133,8 +126,6 @@
   Originators m_originatorStatus; ///< originator status
   QosOriginators m_qosOriginatorStatus; ///< QOS originator status
   ForwardUpCallback m_callback; ///< forward up callback
-
-  Callback<void> m_pcfCallback; //!< PCF callback
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/mac-tx-middle.cc ns-3.34/src/wifi/model/mac-tx-middle.cc
--- ns-3.33/src/wifi/model/mac-tx-middle.cc	2021-01-09 10:19:22.000000000 -0800
+++ ns-3.34/src/wifi/model/mac-tx-middle.cc	2021-07-14 10:31:07.000000000 -0700
@@ -124,4 +124,24 @@
   return seq;
 }
 
+void
+MacTxMiddle::SetSequenceNumberFor (const WifiMacHeader *hdr)
+{
+  NS_LOG_FUNCTION (this << *hdr);
+
+  if (hdr->IsQosData ()
+      && !hdr->GetAddr1 ().IsGroup ())
+    {
+      uint8_t tid = hdr->GetQosTid ();
+      NS_ASSERT (tid < 16);
+      auto it = m_qosSequences.find (hdr->GetAddr1 ());
+      NS_ASSERT (it != m_qosSequences.end ());
+      it->second[tid] = hdr->GetSequenceNumber ();
+    }
+  else
+    {
+      m_sequence = hdr->GetSequenceNumber ();
+    }
+}
+
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/mac-tx-middle.h ns-3.34/src/wifi/model/mac-tx-middle.h
--- ns-3.33/src/wifi/model/mac-tx-middle.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/mac-tx-middle.h	2021-07-14 10:31:07.000000000 -0700
@@ -65,7 +65,13 @@
    * \return the next sequence number
    */
   uint16_t GetNextSeqNumberByTidAndAddress (uint8_t tid, Mac48Address addr) const;
-
+  /**
+   * Set the sequence number of the given MAC header as the next sequence
+   * number for the Traffic ID and destination of the given MAC header.
+   *
+   * \param hdr the given MAC header
+   */
+  void SetSequenceNumberFor (const WifiMacHeader *hdr);
 
 private:
   std::map <Mac48Address,uint16_t*> m_qosSequences; ///< QOS sequences
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/mgt-headers.cc ns-3.34/src/wifi/model/mgt-headers.cc
--- ns-3.33/src/wifi/model/mgt-headers.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/mgt-headers.cc	2021-07-14 10:31:07.000000000 -0700
@@ -313,18 +313,6 @@
 }
 
 void
-MgtProbeResponseHeader::SetCfParameterSet (CfParameterSet cfParameterSet)
-{
-  m_cfParameterSet = cfParameterSet;
-}
-
-CfParameterSet
-MgtProbeResponseHeader::GetCfParameterSet (void) const
-{
-  return m_cfParameterSet;
-}
-
-void
 MgtProbeResponseHeader::SetSsid (Ssid ssid)
 {
   m_ssid = ssid;
@@ -404,7 +392,6 @@
   size += m_capability.GetSerializedSize ();
   size += m_ssid.GetSerializedSize ();
   size += m_rates.GetSerializedSize ();
-  size += m_cfParameterSet.GetSerializedSize ();
   size += m_dsssParameterSet.GetSerializedSize ();
   size += m_erpInformation.GetSerializedSize ();
   size += m_rates.extended.GetSerializedSize ();
@@ -452,7 +439,6 @@
   i = m_capability.Serialize (i);
   i = m_ssid.Serialize (i);
   i = m_rates.Serialize (i);
-  i = m_cfParameterSet.Serialize (i);
   i = m_dsssParameterSet.Serialize (i);
   i = m_erpInformation.Serialize (i);
   i = m_rates.extended.Serialize (i);
@@ -476,7 +462,6 @@
   i = m_capability.Deserialize (i);
   i = m_ssid.Deserialize (i);
   i = m_rates.Deserialize (i);
-  i = m_cfParameterSet.DeserializeIfPresent (i);
   i = m_dsssParameterSet.DeserializeIfPresent (i);
   i = m_erpInformation.DeserializeIfPresent (i);
   i = m_rates.extended.DeserializeIfPresent (i);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/mgt-headers.h ns-3.34/src/wifi/model/mgt-headers.h
--- ns-3.33/src/wifi/model/mgt-headers.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/mgt-headers.h	2021-07-14 10:31:07.000000000 -0700
@@ -28,17 +28,16 @@
 #include "capability-information.h"
 #include "supported-rates.h"
 #include "ssid.h"
-#include "dsss-parameter-set.h"
+#include "ns3/dsss-parameter-set.h"
 #include "extended-capabilities.h"
-#include "ht-capabilities.h"
-#include "ht-operation.h"
-#include "vht-capabilities.h"
-#include "vht-operation.h"
-#include "erp-information.h"
+#include "ns3/ht-capabilities.h"
+#include "ns3/ht-operation.h"
+#include "ns3/vht-capabilities.h"
+#include "ns3/vht-operation.h"
+#include "ns3/erp-information.h"
 #include "edca-parameter-set.h"
-#include "he-capabilities.h"
-#include "he-operation.h"
-#include "cf-parameter-set.h"
+#include "ns3/he-capabilities.h"
+#include "ns3/he-operation.h"
 
 namespace ns3 {
 
@@ -154,11 +153,12 @@
    * \return The TypeId.
    */
   static TypeId GetTypeId (void);
-  TypeId GetInstanceTypeId (void) const;
-  void Print (std::ostream &os) const;
-  uint32_t GetSerializedSize (void) const;
-  void Serialize (Buffer::Iterator start) const;
-  uint32_t Deserialize (Buffer::Iterator start);
+
+  TypeId GetInstanceTypeId (void) const override;
+  void Print (std::ostream &os) const override;
+  uint32_t GetSerializedSize (void) const override;
+  void Serialize (Buffer::Iterator start) const override;
+  uint32_t Deserialize (Buffer::Iterator start) override;
 
 
 private:
@@ -706,12 +706,6 @@
    */
   EdcaParameterSet GetEdcaParameterSet (void) const;
   /**
-   * Return the CF parameter set.
-   *
-   * \return CF parameter set
-   */
-  CfParameterSet GetCfParameterSet (void) const;
-  /**
    * Set the Capability information.
    *
    * \param capabilities Capability information
@@ -796,12 +790,6 @@
    */
   void SetEdcaParameterSet (EdcaParameterSet edcaParameterSet);
   /**
-   * Set the CF parameter set.
-   *
-   * \param cfParameterSet CF parameter set
-   */
-  void SetCfParameterSet (CfParameterSet cfParameterSet);
-  /**
    * Return the time stamp.
    *
    * \return time stamp
@@ -836,7 +824,6 @@
   HeOperation m_heOperation;         //!< HE operation
   ErpInformation m_erpInformation;     //!< ERP information
   EdcaParameterSet m_edcaParameterSet; //!< EDCA Parameter Set
-  CfParameterSet m_cfParameterSet;     //!< CF parameter set
 };
 
 
@@ -1263,7 +1250,7 @@
    * \return The TypeId.
    */
   static TypeId GetTypeId (void);
-  // Inherited
+
   TypeId GetInstanceTypeId (void) const;
   void Print (std::ostream &os) const;
   uint32_t GetSerializedSize (void) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/minstrel-ht-wifi-manager.cc ns-3.34/src/wifi/model/minstrel-ht-wifi-manager.cc
--- ns-3.33/src/wifi/model/minstrel-ht-wifi-manager.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/minstrel-ht-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,1824 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2009 Duy Nguyen
- * Copyright (c) 2015 Ghada Badawy
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Authors: Duy Nguyen <duy@soe.ucsc.edu>
- *          Ghada Badawy <gbadawy@gmail.com>
- *          Matias Richart <mrichart@fing.edu.uy>
- *
- * Some Comments:
- *
- * 1) By default, Minstrel applies the multi-rate retry (the core of Minstrel
- *    algorithm). Otherwise, please use ConstantRateWifiManager instead.
- *
- * 2) Sampling is done differently from legacy Minstrel. Minstrel-HT tries
- * to sample all rates in all groups at least once and to avoid many
- * consecutive samplings.
- *
- * 3) Sample rate is tried only once, at first place of the MRR chain.
- *
- * reference: http://lwn.net/Articles/376765/
- */
-
-#include <iomanip>
-#include "ns3/packet.h"
-#include "ns3/simulator.h"
-#include "ns3/log.h"
-#include "ns3/random-variable-stream.h"
-#include "minstrel-ht-wifi-manager.h"
-#include "wifi-mac.h"
-#include "wifi-phy.h"
-
-#define Min(a,b) ((a < b) ? a : b)
-#define Max(a,b) ((a > b) ? a : b)
-
-NS_LOG_COMPONENT_DEFINE ("MinstrelHtWifiManager");
-
-namespace ns3 {
-
-///MinstrelHtWifiRemoteStation structure
-struct MinstrelHtWifiRemoteStation : MinstrelWifiRemoteStation
-{
-  uint8_t m_sampleGroup;     //!< The group that the sample rate belongs to.
-
-  uint32_t m_sampleWait;      //!< How many transmission attempts to wait until a new sample.
-  uint32_t m_sampleTries;     //!< Number of sample tries after waiting sampleWait.
-  uint32_t m_sampleCount;     //!< Max number of samples per update interval.
-  uint32_t m_numSamplesSlow;  //!< Number of times a slow rate was sampled.
-
-  uint32_t m_avgAmpduLen;      //!< Average number of MPDUs in an A-MPDU.
-  uint32_t m_ampduLen;         //!< Number of MPDUs in an A-MPDU.
-  uint32_t m_ampduPacketCount; //!< Number of A-MPDUs transmitted.
-
-  McsGroupData m_groupsTable;  //!< Table of groups with stats.
-  bool m_isHt;                 //!< If the station is HT capable.
-
-  std::ofstream m_statsFile;   //!< File where statistics table is written.
-};
-
-NS_OBJECT_ENSURE_REGISTERED (MinstrelHtWifiManager);
-
-TypeId
-MinstrelHtWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::MinstrelHtWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .AddConstructor<MinstrelHtWifiManager> ()
-    .SetGroupName ("Wifi")
-    .AddAttribute ("UpdateStatistics",
-                   "The interval between updating statistics table ",
-                   TimeValue (MilliSeconds (50)),
-                   MakeTimeAccessor (&MinstrelHtWifiManager::m_updateStats),
-                   MakeTimeChecker ())
-    .AddAttribute ("LegacyUpdateStatistics",
-                   "The interval between updating statistics table (for legacy Minstrel) ",
-                   TimeValue (MilliSeconds (100)),
-                   MakeTimeAccessor (&MinstrelHtWifiManager::m_legacyUpdateStats),
-                   MakeTimeChecker ())
-    .AddAttribute ("LookAroundRate",
-                   "The percentage to try other rates (for legacy Minstrel)",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&MinstrelHtWifiManager::m_lookAroundRate),
-                   MakeUintegerChecker<uint8_t>(0, 100))
-    .AddAttribute ("EWMA",
-                   "EWMA level",
-                   UintegerValue (75),
-                   MakeUintegerAccessor (&MinstrelHtWifiManager::m_ewmaLevel),
-                   MakeUintegerChecker<uint8_t>(0, 100))
-    .AddAttribute ("SampleColumn",
-                   "The number of columns used for sampling",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&MinstrelHtWifiManager::m_nSampleCol),
-                   MakeUintegerChecker <uint8_t> ())
-    .AddAttribute ("PacketLength",
-                   "The packet length used for calculating mode TxTime (bytes)",
-                   UintegerValue (1200),
-                   MakeUintegerAccessor (&MinstrelHtWifiManager::m_frameLength),
-                   MakeUintegerChecker <uint32_t> ())
-    .AddAttribute ("UseVhtOnly",
-                   "Use only VHT MCSs (and not HT) when VHT is available",
-                   BooleanValue (true),
-                   MakeBooleanAccessor (&MinstrelHtWifiManager::m_useVhtOnly),
-                   MakeBooleanChecker ())
-    .AddAttribute ("PrintStats",
-                   "Control the printing of the statistics table",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&MinstrelHtWifiManager::m_printStats),
-                   MakeBooleanChecker ())
-    .AddTraceSource ("Rate",
-                     "Traced value for rate changes (b/s)",
-                     MakeTraceSourceAccessor (&MinstrelHtWifiManager::m_currentRate),
-                     "ns3::TracedValueCallback::Uint64")
-  ;
-  return tid;
-}
-
-MinstrelHtWifiManager::MinstrelHtWifiManager ()
-  : m_numGroups (0),
-    m_numRates (0),
-    m_currentRate (0)
-{
-  NS_LOG_FUNCTION (this);
-  m_uniformRandomVariable = CreateObject<UniformRandomVariable> ();
-  /**
-   *  Create the legacy Minstrel manager in case HT is not supported by the device
-   *  or non-HT stations want to associate.
-   */
-  m_legacyManager = CreateObject<MinstrelWifiManager> ();
-}
-
-MinstrelHtWifiManager::~MinstrelHtWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-  for (uint8_t i = 0; i < m_numGroups; i++)
-    {
-      m_minstrelGroups[i].ratesFirstMpduTxTimeTable.clear ();
-      m_minstrelGroups[i].ratesTxTimeTable.clear ();
-    }
-}
-
-int64_t
-MinstrelHtWifiManager::AssignStreams (int64_t stream)
-{
-  NS_LOG_FUNCTION (this << stream);
-  int64_t numStreamsAssigned = 0;
-  m_uniformRandomVariable->SetStream (stream);
-  numStreamsAssigned++;
-  numStreamsAssigned += m_legacyManager->AssignStreams (stream);
-  return numStreamsAssigned;
-}
-
-void
-MinstrelHtWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
-{
-  NS_LOG_FUNCTION (this << phy);
-  // Setup PHY for legacy manager.
-  m_legacyManager->SetupPhy (phy);
-  WifiRemoteStationManager::SetupPhy (phy);
-}
-
-void
-MinstrelHtWifiManager::SetupMac (const Ptr<WifiMac> mac)
-{
-  NS_LOG_FUNCTION (this << mac);
-  m_legacyManager->SetupMac (mac);
-  WifiRemoteStationManager::SetupMac (mac);
-}
-
-void
-MinstrelHtWifiManager::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  if (GetHeSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
-    }
-  /**
-   * Here we initialize m_minstrelGroups with all the possible groups.
-   * If a group is not supported by the device, then it is marked as not supported.
-   * Then, after all initializations are finished, we check actual support for each receiving station.
-   */
-
-  // Check if the device supports HT
-  if (GetHtSupported ())
-    {
-      m_numGroups = MAX_SUPPORTED_STREAMS * MAX_HT_STREAM_GROUPS;
-      m_numRates = MAX_HT_GROUP_RATES;
-
-      if (GetVhtSupported ())
-        {
-          m_numGroups += MAX_SUPPORTED_STREAMS * MAX_VHT_STREAM_GROUPS;
-          m_numRates = MAX_VHT_GROUP_RATES;
-        }
-
-      /**
-       *  Initialize the groups array.
-       *  The HT groups come first, then the VHT ones.
-       *  Minstrel maintains different types of indexes:
-       *  - A global continuous index, which identifies all rates within all groups, in [0, m_numGroups * m_numRates]
-       *  - A groupId, which indexes a group in the array, in [0, m_numGroups]
-       *  - A rateId, which identifies a rate within a group, in [0, m_numRates]
-       *  - A deviceIndex, which indexes a MCS in the PHY MCS array.
-       *  - A mcsIndex, which indexes a MCS in the wifi-remote-station-manager supported MCSs array.
-       */
-      NS_LOG_DEBUG ("Initialize MCS Groups:");
-      m_minstrelGroups = MinstrelMcsGroups (m_numGroups);
-
-      // Initialize all HT groups
-      for (uint16_t chWidth = 20; chWidth <= MAX_HT_WIDTH; chWidth *= 2)
-        {
-          for (uint8_t sgi = 0; sgi <= 1; sgi++)
-            {
-              for (uint8_t streams = 1; streams <= MAX_SUPPORTED_STREAMS; streams++)
-                {
-                  uint8_t groupId = GetHtGroupId (streams, sgi, chWidth);
-
-                  m_minstrelGroups[groupId].streams = streams;
-                  m_minstrelGroups[groupId].sgi = sgi;
-                  m_minstrelGroups[groupId].chWidth = chWidth;
-                  m_minstrelGroups[groupId].isVht = false;
-                  m_minstrelGroups[groupId].isSupported = false;
-
-                  // Check capabilities of the device
-                  if (!(!GetShortGuardIntervalSupported () && m_minstrelGroups[groupId].sgi)                   ///Is SGI supported by the transmitter?
-                      && (GetPhy ()->GetChannelWidth () >= m_minstrelGroups[groupId].chWidth)               ///Is channel width supported by the transmitter?
-                      && (GetPhy ()->GetMaxSupportedTxSpatialStreams () >= m_minstrelGroups[groupId].streams))  ///Are streams supported by the transmitter?
-                    {
-                      m_minstrelGroups[groupId].isSupported = true;
-
-                      // Calculate TX time for all rates of the group
-                      WifiModeList htMcsList = GetHtDeviceMcsList ();
-                      for (uint8_t i = 0; i < MAX_HT_GROUP_RATES; i++)
-                        {
-                          uint16_t deviceIndex = i + (m_minstrelGroups[groupId].streams - 1) * 8;
-                          WifiMode mode =  htMcsList[deviceIndex];
-                          AddFirstMpduTxTime (groupId, mode, CalculateMpduTxDuration (GetPhy (), streams, sgi, chWidth, mode, FIRST_MPDU_IN_AGGREGATE));
-                          AddMpduTxTime (groupId, mode, CalculateMpduTxDuration (GetPhy (), streams, sgi, chWidth, mode, MIDDLE_MPDU_IN_AGGREGATE));
-                        }
-                      NS_LOG_DEBUG ("Initialized group " << +groupId << ": (" << +streams << "," << +sgi << "," << chWidth << ")");
-                    }
-                }
-            }
-        }
-
-      if (GetVhtSupported ())
-        {
-          // Initialize all VHT groups
-          for (uint16_t chWidth = 20; chWidth <= MAX_VHT_WIDTH; chWidth *= 2)
-            {
-              for (uint8_t sgi = 0; sgi <= 1; sgi++)
-                {
-                  for (uint8_t streams = 1; streams <= MAX_SUPPORTED_STREAMS; streams++)
-                    {
-                      uint8_t groupId = GetVhtGroupId (streams, sgi, chWidth);
-
-                      m_minstrelGroups[groupId].streams = streams;
-                      m_minstrelGroups[groupId].sgi = sgi;
-                      m_minstrelGroups[groupId].chWidth = chWidth;
-                      m_minstrelGroups[groupId].isVht = true;
-                      m_minstrelGroups[groupId].isSupported = false;
-
-                      // Check capabilities of the device
-                      if (!(!GetShortGuardIntervalSupported () && m_minstrelGroups[groupId].sgi)                   ///Is SGI supported by the transmitter?
-                          && (GetPhy ()->GetChannelWidth () >= m_minstrelGroups[groupId].chWidth)               ///Is channel width supported by the transmitter?
-                          && (GetPhy ()->GetMaxSupportedTxSpatialStreams () >= m_minstrelGroups[groupId].streams))  ///Are streams supported by the transmitter?
-                        {
-                          m_minstrelGroups[groupId].isSupported = true;
-
-                          // Calculate TX time for all rates of the group
-                          WifiModeList vhtMcsList = GetVhtDeviceMcsList ();
-                          for (uint8_t i = 0; i < MAX_VHT_GROUP_RATES; i++)
-                            {
-                              WifiMode mode = vhtMcsList[i];
-                              // Check for invalid VHT MCSs and do not add time to array.
-                              if (IsValidMcs (GetPhy (), streams, chWidth, mode))
-                                {
-                                  AddFirstMpduTxTime (groupId, mode, CalculateMpduTxDuration (GetPhy (), streams, sgi, chWidth, mode, FIRST_MPDU_IN_AGGREGATE));
-                                  AddMpduTxTime (groupId, mode, CalculateMpduTxDuration (GetPhy (), streams, sgi, chWidth, mode, MIDDLE_MPDU_IN_AGGREGATE));
-                                }
-                            }
-                          NS_LOG_DEBUG ("Initialized group " << +groupId << ": (" << +streams << "," << +sgi << "," << chWidth << ")");
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-bool
-MinstrelHtWifiManager::IsValidMcs (Ptr<WifiPhy> phy, uint8_t streams, uint16_t chWidth, WifiMode mode)
-{
-  NS_LOG_FUNCTION (this << phy << +streams << chWidth << mode);
-  WifiTxVector txvector;
-  txvector.SetNss (streams);
-  txvector.SetChannelWidth (chWidth);
-  txvector.SetMode (mode);
-  return txvector.IsValid ();
-}
-
-Time
-MinstrelHtWifiManager::CalculateMpduTxDuration (Ptr<WifiPhy> phy, uint8_t streams, uint8_t sgi,
-                                                uint16_t chWidth, WifiMode mode, MpduType mpduType)
-{
-  NS_LOG_FUNCTION (this << phy << +streams << +sgi << chWidth << mode << mpduType);
-  WifiTxVector txvector;
-  txvector.SetNss (streams);
-  txvector.SetGuardInterval (sgi ? 400 : 800);
-  txvector.SetChannelWidth (chWidth);
-  txvector.SetNess (0);
-  txvector.SetStbc (0);
-  txvector.SetMode (mode);
-  txvector.SetPreambleType (WIFI_PREAMBLE_HT_MF);
-  return WifiPhy::CalculatePhyPreambleAndHeaderDuration (txvector)
-         + WifiPhy::GetPayloadDuration (m_frameLength, txvector, phy->GetPhyBand (), mpduType);
-}
-
-Time
-MinstrelHtWifiManager::GetFirstMpduTxTime (uint8_t groupId, WifiMode mode) const
-{
-  NS_LOG_FUNCTION (this << +groupId << mode);
-  auto it = m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.find (mode);
-  NS_ASSERT (it != m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.end ());
-  return it->second;
-}
-
-void
-MinstrelHtWifiManager::AddFirstMpduTxTime (uint8_t groupId, WifiMode mode, Time t)
-{
-  NS_LOG_FUNCTION (this << +groupId << mode << t);
-  m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.insert (std::make_pair (mode, t));
-}
-
-Time
-MinstrelHtWifiManager::GetMpduTxTime (uint8_t groupId, WifiMode mode) const
-{
-  NS_LOG_FUNCTION (this << +groupId << mode);
-  auto it = m_minstrelGroups[groupId].ratesTxTimeTable.find (mode);
-  NS_ASSERT (it != m_minstrelGroups[groupId].ratesTxTimeTable.end ());
-  return it->second;
-}
-
-void
-MinstrelHtWifiManager::AddMpduTxTime (uint8_t groupId, WifiMode mode, Time t)
-{
-  NS_LOG_FUNCTION (this << +groupId << mode << t);
-  m_minstrelGroups[groupId].ratesTxTimeTable.insert (std::make_pair (mode, t));
-}
-
-WifiRemoteStation *
-MinstrelHtWifiManager::DoCreateStation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  MinstrelHtWifiRemoteStation *station = new MinstrelHtWifiRemoteStation ();
-
-  // Initialize variables common to both stations.
-  station->m_nextStatsUpdate = Simulator::Now () + m_updateStats;
-  station->m_col = 0;
-  station->m_index = 0;
-  station->m_maxTpRate = 0;
-  station->m_maxTpRate2 = 0;
-  station->m_maxProbRate = 0;
-  station->m_nModes = 0;
-  station->m_totalPacketsCount = 0;
-  station->m_samplePacketsCount = 0;
-  station->m_isSampling = false;
-  station->m_sampleRate = 0;
-  station->m_sampleDeferred = false;
-  station->m_shortRetry = 0;
-  station->m_longRetry = 0;
-  station->m_txrate = 0;
-  station->m_initialized = false;
-
-  // Variables specific to HT station
-  station->m_sampleGroup = 0;
-  station->m_numSamplesSlow = 0;
-  station->m_sampleCount = 16;
-  station->m_sampleWait = 0;
-  station->m_sampleTries = 4;
-
-  station->m_avgAmpduLen = 1;
-  station->m_ampduLen = 0;
-  station->m_ampduPacketCount = 0;
-
-  // If the device supports HT
-  if (GetHtSupported ())
-    {
-      /**
-       * Assume the station is HT.
-       * When correct information available it will be checked.
-       */
-      station->m_isHt = true;
-    }
-  // Use the variable in the station to indicate that the device do not support HT
-  else
-    {
-      station->m_isHt = false;
-    }
-
-  return station;
-}
-
-void
-MinstrelHtWifiManager::CheckInit (MinstrelHtWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  // Note: we appear to be doing late initialization of the table
-  // to make sure that the set of supported rates has been initialized
-  // before we perform our own initialization.
-  if (!station->m_initialized)
-    {
-      /**
-       *  Check if the station supports HT.
-       *  Assume that if the device do not supports HT then
-       *  the station will not support HT either.
-       *  We save from using another check and variable.
-       */
-      if (!GetHtSupported (station))
-        {
-          NS_LOG_INFO ("non-HT station " << station);
-          station->m_isHt = false;
-          // We will use non-HT minstrel for this station. Initialize the manager.
-          m_legacyManager->SetAttribute ("UpdateStatistics", TimeValue (m_legacyUpdateStats));
-          m_legacyManager->SetAttribute ("LookAroundRate", UintegerValue (m_lookAroundRate));
-          m_legacyManager->SetAttribute ("EWMA", UintegerValue (m_ewmaLevel));
-          m_legacyManager->SetAttribute ("SampleColumn", UintegerValue (m_nSampleCol));
-          m_legacyManager->SetAttribute ("PacketLength", UintegerValue (m_frameLength));
-          m_legacyManager->SetAttribute ("PrintStats", BooleanValue (m_printStats));
-          m_legacyManager->CheckInit (station);
-        }
-      else
-        {
-          NS_LOG_DEBUG ("HT station " << station);
-          station->m_isHt = true;
-          station->m_nModes = GetNMcsSupported (station);
-          station->m_minstrelTable = MinstrelRate (station->m_nModes);
-          station->m_sampleTable = SampleRate (m_numRates, std::vector<uint8_t> (m_nSampleCol));
-          InitSampleTable (station);
-          RateInit (station);
-          station->m_initialized = true;
-        }
-    }
-}
-
-void
-MinstrelHtWifiManager::DoReportRxOk (WifiRemoteStation *st, double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << st);
-  NS_LOG_DEBUG ("DoReportRxOk m_txrate=" << static_cast<MinstrelHtWifiRemoteStation*> (st)->m_txrate);
-}
-
-void
-MinstrelHtWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
-  CheckInit (station);
-  if (!station->m_initialized)
-    {
-      return;
-    }
-  NS_LOG_DEBUG ("DoReportRtsFailed m_txrate = " << station->m_txrate);
-  station->m_shortRetry++;
-}
-
-void
-MinstrelHtWifiManager::DoReportRtsOk (WifiRemoteStation *st, double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << st);
-}
-
-void
-MinstrelHtWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
-  NS_LOG_DEBUG ("Final RTS failed");
-  CheckInit (station);
-  if (!station->m_initialized)
-    {
-      return;
-    }
-  UpdateRetry (station);
-}
-
-void
-MinstrelHtWifiManager::DoReportDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
-
-  CheckInit (station);
-  if (!station->m_initialized)
-    {
-      return;
-    }
-
-  NS_LOG_DEBUG ("DoReportDataFailed " << station << "\t rate " << station->m_txrate << "\tlongRetry \t" << station->m_longRetry);
-
-  if (!station->m_isHt)
-    {
-      m_legacyManager->UpdateRate (station);
-    }
-  else
-    {
-      uint8_t rateId = GetRateId (station->m_txrate);
-      uint8_t groupId = GetGroupId (station->m_txrate);
-      station->m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt++; // Increment the attempts counter for the rate used.
-      UpdateRate (station);
-    }
-}
-
-void
-MinstrelHtWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
-  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
-
-  CheckInit (station);
-  if (!station->m_initialized)
-    {
-      return;
-    }
-
-  NS_LOG_DEBUG ("DoReportDataOk m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (before update).");
-
-  if (!station->m_isHt)
-    {
-      station->m_minstrelTable[station->m_txrate].numRateSuccess++;
-      station->m_minstrelTable[station->m_txrate].numRateAttempt++;
-
-      m_legacyManager->UpdatePacketCounters (station);
-
-      NS_LOG_DEBUG ("DoReportDataOk m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (after update).");
-
-      UpdateRetry (station);
-      m_legacyManager->UpdateStats (station);
-
-      if (station->m_nModes >= 1)
-        {
-          station->m_txrate = m_legacyManager->FindRate (station);
-        }
-    }
-  else
-    {
-      uint8_t rateId = GetRateId (station->m_txrate);
-      uint8_t groupId = GetGroupId (station->m_txrate);
-      station->m_groupsTable[groupId].m_ratesTable[rateId].numRateSuccess++;
-      station->m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt++;
-
-      UpdatePacketCounters (station, 1, 0);
-
-      NS_LOG_DEBUG ("DoReportDataOk m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (after update).");
-
-      station->m_isSampling = false;
-      station->m_sampleDeferred = false;
-
-      UpdateRetry (station);
-      if (Simulator::Now () >=  station->m_nextStatsUpdate)
-        {
-          UpdateStats (station);
-        }
-
-      if (station->m_nModes >= 1)
-        {
-          station->m_txrate = FindRate (station);
-        }
-    }
-
-  NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate  );
-}
-
-void
-MinstrelHtWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
-
-  CheckInit (station);
-  if (!station->m_initialized)
-    {
-      return;
-    }
-
-  NS_LOG_DEBUG ("DoReportFinalDataFailed - TxRate=" << station->m_txrate);
-
-  if (!station->m_isHt)
-    {
-      m_legacyManager->UpdatePacketCounters (station);
-
-      UpdateRetry (station);
-
-      m_legacyManager->UpdateStats (station);
-      if (station->m_nModes >= 1)
-        {
-          station->m_txrate = m_legacyManager->FindRate (station);
-        }
-    }
-  else
-    {
-      UpdatePacketCounters (station, 0, 1);
-
-      station->m_isSampling = false;
-      station->m_sampleDeferred = false;
-
-      UpdateRetry (station);
-      if (Simulator::Now () >=  station->m_nextStatsUpdate)
-        {
-          UpdateStats (station);
-        }
-
-      if (station->m_nModes >= 1)
-        {
-          station->m_txrate = FindRate (station);
-        }
-    }
-  NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate);
-}
-
-void
-MinstrelHtWifiManager::DoReportAmpduTxStatus (WifiRemoteStation *st, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus,
-                                              double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << +nSuccessfulMpdus << +nFailedMpdus << rxSnr << dataSnr << dataChannelWidth << +dataNss);
-  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
-
-  CheckInit (station);
-  if (!station->m_initialized)
-    {
-      return;
-    }
-
-  NS_ASSERT_MSG (station->m_isHt, "A-MPDU Tx Status called but no HT or VHT supported.");
-
-  NS_LOG_DEBUG ("DoReportAmpduTxStatus. TxRate=" << station->m_txrate << " SuccMpdus=" <<
-                +nSuccessfulMpdus << " FailedMpdus=" << +nFailedMpdus);
-
-  station->m_ampduPacketCount++;
-  station->m_ampduLen += nSuccessfulMpdus + nFailedMpdus;
-
-  UpdatePacketCounters (station, nSuccessfulMpdus, nFailedMpdus);
-
-  uint8_t rateId = GetRateId (station->m_txrate);
-  uint8_t groupId = GetGroupId (station->m_txrate);
-  station->m_groupsTable[groupId].m_ratesTable[rateId].numRateSuccess += nSuccessfulMpdus;
-  station->m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt += nSuccessfulMpdus + nFailedMpdus;
-
-  if (nSuccessfulMpdus == 0 && station->m_longRetry < CountRetries (station))
-    {
-      // We do not receive a BlockAck. The entire AMPDU fail.
-      UpdateRate (station);
-    }
-  else
-    {
-      station->m_isSampling = false;
-      station->m_sampleDeferred = false;
-
-      UpdateRetry (station);
-      if (Simulator::Now () >=  station->m_nextStatsUpdate)
-        {
-          UpdateStats (station);
-        }
-
-      if (station->m_nModes >= 1)
-        {
-          station->m_txrate = FindRate (station);
-        }
-      NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate);
-    }
-}
-
-void
-MinstrelHtWifiManager::UpdateRate (MinstrelHtWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-
-  /**
-   * Retry Chain table is implemented here.
-   *
-   * FIXME
-   * Currently, NS3 does not retransmit an entire A-MPDU when BACK is missing
-   * but retransmits each MPDU until MPDUs lifetime expires (or a BACK is received).
-   * Then, there is no way to control A-MPDU retries (no call to NeedDataRetransmission).
-   * So, it is possible that the A-MPDU keeps retrying after longRetry reaches its limit.
-   *
-   *
-   * Try |     LOOKAROUND RATE     | NORMAL RATE
-   * -------------------------------------------------------
-   *  1  |  Random rate            | Best throughput
-   *  2  |  Next best throughput   | Next best throughput
-   *  3  |  Best probability       | Best probability
-   *
-   * Note: For clarity, multiple blocks of if's and else's are used
-   * Following implementation in Linux, in MinstrelHT lowest base rate is not used.
-   * Explanation can be found here: http://marc.info/?l=linux-wireless&m=144602778611966&w=2
-   */
-
-  CheckInit (station);
-  if (!station->m_initialized)
-    {
-      return;
-    }
-  station->m_longRetry++;
-
-  /**
-   * Get the IDs for all rates.
-   */
-  uint8_t maxTpRateId = GetRateId (station->m_maxTpRate);
-  uint8_t maxTpGroupId = GetGroupId (station->m_maxTpRate);
-  uint8_t maxTp2RateId = GetRateId (station->m_maxTpRate2);
-  uint8_t maxTp2GroupId = GetGroupId (station->m_maxTpRate2);
-  uint8_t maxProbRateId = GetRateId (station->m_maxProbRate);
-  uint8_t maxProbGroupId = GetGroupId (station->m_maxProbRate);
-
-  /// For normal rate, we're not currently sampling random rates.
-  if (!station->m_isSampling)
-    {
-      /// Use best throughput rate.
-      if (station->m_longRetry <  station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].retryCount)
-        {
-          NS_LOG_DEBUG ("Not Sampling; use the same rate again");
-          station->m_txrate = station->m_maxTpRate;  //!<  There are still a few retries.
-        }
-
-      /// Use second best throughput rate.
-      else if (station->m_longRetry < ( station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].retryCount +
-                                        station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].retryCount))
-        {
-          NS_LOG_DEBUG ("Not Sampling; use the Max TP2");
-          station->m_txrate = station->m_maxTpRate2;
-        }
-
-      /// Use best probability rate.
-      else if (station->m_longRetry <= ( station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].retryCount +
-                                         station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].retryCount +
-                                         station->m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].retryCount))
-        {
-          NS_LOG_DEBUG ("Not Sampling; use Max Prob");
-          station->m_txrate = station->m_maxProbRate;
-        }
-      else
-        {
-          NS_FATAL_ERROR ("Max retries reached and m_longRetry not cleared properly. longRetry= " << station->m_longRetry);
-        }
-    }
-
-  /// We're currently sampling random rates.
-  else
-    {
-      /// Sample rate is used only once
-      /// Use the best rate.
-      if (station->m_longRetry < 1 + station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTp2RateId].retryCount)
-        {
-          NS_LOG_DEBUG ("Sampling use the MaxTP rate");
-          station->m_txrate = station->m_maxTpRate2;
-        }
-
-      /// Use the best probability rate.
-      else if (station->m_longRetry <= 1 + station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTp2RateId].retryCount +
-               station->m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].retryCount)
-        {
-          NS_LOG_DEBUG ("Sampling use the MaxProb rate");
-          station->m_txrate = station->m_maxProbRate;
-        }
-      else
-        {
-          NS_FATAL_ERROR ("Max retries reached and m_longRetry not cleared properly. longRetry= " << station->m_longRetry);
-        }
-    }
-  NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate);
-}
-
-void
-MinstrelHtWifiManager::UpdateRetry (MinstrelHtWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_shortRetry = 0;
-  station->m_longRetry = 0;
-}
-
-void
-MinstrelHtWifiManager::UpdatePacketCounters (MinstrelHtWifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus)
-{
-  NS_LOG_FUNCTION (this << station << +nSuccessfulMpdus << +nFailedMpdus);
-
-  station->m_totalPacketsCount += nSuccessfulMpdus + nFailedMpdus;
-  if (station->m_isSampling)
-    {
-      station->m_samplePacketsCount += nSuccessfulMpdus + nFailedMpdus;
-    }
-  if (station->m_totalPacketsCount == ~0)
-    {
-      station->m_samplePacketsCount = 0;
-      station->m_totalPacketsCount = 0;
-    }
-
-  if (!station->m_sampleWait && !station->m_sampleTries && station->m_sampleCount > 0)
-    {
-      station->m_sampleWait = 16 + 2 * station->m_avgAmpduLen;
-      station->m_sampleTries = 1;
-      station->m_sampleCount--;
-    }
-}
-
-WifiTxVector
-MinstrelHtWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
-
-  if (!station->m_initialized)
-    {
-      CheckInit (station);
-    }
-
-  if (!station->m_isHt)
-    {
-      WifiTxVector vector = m_legacyManager->GetDataTxVector (station);
-      uint64_t dataRate = vector.GetMode ().GetDataRate (vector);
-      if (m_currentRate != dataRate && !station->m_isSampling)
-        {
-          NS_LOG_DEBUG ("New datarate: " << dataRate);
-          m_currentRate = dataRate;
-        }
-      return vector;
-    }
-  else
-    {
-      NS_LOG_DEBUG ("DoGetDataMode m_txrate= " << station->m_txrate);
-
-      uint8_t rateId = GetRateId (station->m_txrate);
-      uint8_t groupId = GetGroupId (station->m_txrate);
-      uint8_t mcsIndex = station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex;
-
-      NS_LOG_DEBUG ("DoGetDataMode rateId= " << +rateId << " groupId= " << +groupId << " mode= " << GetMcsSupported (station, mcsIndex));
-
-      McsGroup group = m_minstrelGroups[groupId];
-
-      // Check consistency of rate selected.
-      if ((group.sgi && !GetShortGuardIntervalSupported (station)) || group.chWidth > GetChannelWidth (station)  ||  group.streams > GetNumberOfSupportedStreams (station))
-        {
-          NS_FATAL_ERROR ("Inconsistent group selected. Group: (" << +group.streams <<
-                         "," << +group.sgi << "," << group.chWidth << ")" <<
-                         " Station capabilities: (" << GetNumberOfSupportedStreams (station) <<
-                         "," << GetShortGuardIntervalSupported (station) << "," << GetChannelWidth (station) << ")");
-        }
-      WifiMode mode = GetMcsSupported (station, mcsIndex);
-      uint64_t dataRate = mode.GetDataRate (group.chWidth, group.sgi ? 400 : 800, group.streams);
-      if (m_currentRate != dataRate && !station->m_isSampling)
-        {
-          NS_LOG_DEBUG ("New datarate: " << dataRate);
-          m_currentRate = dataRate;
-        }
-      return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), group.sgi ? 400 : 800, GetNumberOfAntennas (), group.streams, GetNess (station), GetChannelWidthForTransmission (mode, group.chWidth), GetAggregation (station) && !station->m_isSampling);
-    }
-}
-
-WifiTxVector
-MinstrelHtWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
-
-  if (!station->m_initialized)
-    {
-      CheckInit (station);
-    }
-
-  if (!station->m_isHt)
-    {
-      return m_legacyManager->GetRtsTxVector (station);
-    }
-  else
-    {
-      NS_LOG_DEBUG ("DoGetRtsMode m_txrate=" << station->m_txrate);
-
-      /* RTS is sent in a non-HT frame. RTS with HT is not supported yet in NS3.
-       * When supported, decision of using HT has to follow rules in Section 9.7.6 from 802.11-2012.
-       * From Sec. 9.7.6.5: "A frame other than a BlockAckReq or BlockAck that is carried in a
-       * non-HT PPDU shall be transmitted by the STA using a rate no higher than the highest
-       * rate in  the BSSBasicRateSet parameter that is less than or equal to the rate or
-       * non-HT reference rate (see 9.7.9) of the previously transmitted frame that was
-       * directed to the same receiving STA. If no rate in the BSSBasicRateSet parameter meets
-       * these conditions, the control frame shall be transmitted at a rate no higher than the
-       * highest mandatory rate of the attached PHY that is less than or equal to the rate
-       * or non-HT reference rate (see 9.7.9) of the previously transmitted frame that was
-       * directed to the same receiving STA."
-       */
-
-      // As we are in Minstrel HT, assume the last rate was an HT rate.
-      uint8_t rateId = GetRateId (station->m_txrate);
-      uint8_t groupId = GetGroupId (station->m_txrate);
-      uint8_t mcsIndex = station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex;
-
-      WifiMode lastRate = GetMcsSupported (station, mcsIndex);
-      uint64_t lastDataRate = lastRate.GetNonHtReferenceRate ();
-      uint8_t nBasicRates = GetNBasicModes ();
-
-      WifiMode rtsRate;
-      bool rateFound = false;
-
-      for (uint8_t i = 0; i < nBasicRates; i++)
-        {
-          uint64_t rate = GetBasicMode (i).GetDataRate (20);
-          if (rate <= lastDataRate)
-            {
-              rtsRate = GetBasicMode (i);
-              rateFound = true;
-            }
-        }
-
-      if (!rateFound)
-        {
-          Ptr<WifiPhy> phy = GetPhy ();
-          uint8_t nSupportRates = phy->GetNModes ();
-          for (uint8_t i = 0; i < nSupportRates; i++)
-            {
-              uint64_t rate = phy->GetMode (i).GetDataRate (20);
-              if (rate <= lastDataRate)
-                {
-                  rtsRate = phy->GetMode (i);
-                  rateFound = true;
-                }
-            }
-        }
-
-      NS_ASSERT (rateFound);
-
-      return WifiTxVector (rtsRate, GetDefaultTxPowerLevel (), GetPreambleForTransmission (rtsRate.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))),
-                           800, 1, 1, 0, GetChannelWidthForTransmission (rtsRate, GetChannelWidth (station)), GetAggregation (station));
-    }
-}
-
-bool
-MinstrelHtWifiManager::DoNeedRetransmission (WifiRemoteStation *st, Ptr<const Packet> packet, bool normally)
-{
-  NS_LOG_FUNCTION (this << st << packet << normally);
-
-  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
-
-  CheckInit (station);
-  if (!station->m_initialized)
-    {
-      return normally;
-    }
-
-  uint32_t maxRetries;
-
-  if (!station->m_isHt)
-    {
-      maxRetries = m_legacyManager->CountRetries (station);
-    }
-  else
-    {
-      maxRetries = CountRetries (station);
-    }
-
-  if (station->m_longRetry >= maxRetries)
-    {
-      NS_LOG_DEBUG ("No re-transmission allowed. Retries: " <<  station->m_longRetry << " Max retries: " << maxRetries);
-      return false;
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Re-transmit. Retries: " <<  station->m_longRetry << " Max retries: " << maxRetries);
-      return true;
-    }
-}
-
-uint32_t
-MinstrelHtWifiManager::CountRetries (MinstrelHtWifiRemoteStation *station)
-{
-  uint8_t maxProbRateId = GetRateId (station->m_maxProbRate);
-  uint8_t maxProbGroupId = GetGroupId (station->m_maxProbRate);
-  uint8_t maxTpRateId = GetRateId (station->m_maxTpRate);
-  uint8_t maxTpGroupId = GetGroupId (station->m_maxTpRate);
-  uint8_t maxTp2RateId = GetRateId (station->m_maxTpRate2);
-  uint8_t maxTp2GroupId = GetGroupId (station->m_maxTpRate2);
-
-  if (!station->m_isSampling)
-    {
-      return station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].retryCount +
-             station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].retryCount +
-             station->m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].retryCount;
-    }
-  else
-    {
-      return 1 + station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTp2RateId].retryCount +
-             station->m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].retryCount;
-    }
-}
-
-uint16_t
-MinstrelHtWifiManager::GetNextSample (MinstrelHtWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  uint8_t sampleGroup = station->m_sampleGroup;
-  uint8_t index = station->m_groupsTable[sampleGroup].m_index;
-  uint8_t col = station->m_groupsTable[sampleGroup].m_col;
-  uint8_t sampleIndex = station->m_sampleTable[index][col];
-  uint16_t rateIndex = GetIndex (sampleGroup, sampleIndex);
-  NS_LOG_DEBUG ("Next Sample is " << rateIndex);
-  SetNextSample (station); //Calculate the next sample rate.
-  return rateIndex;
-}
-
-void
-MinstrelHtWifiManager::SetNextSample (MinstrelHtWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  do
-    {
-      station->m_sampleGroup++;
-      station->m_sampleGroup %= m_numGroups;
-    }
-  while (!station->m_groupsTable[station->m_sampleGroup].m_supported);
-
-  station->m_groupsTable[station->m_sampleGroup].m_index++;
-
-  uint8_t sampleGroup = station->m_sampleGroup;
-  uint8_t index = station->m_groupsTable[station->m_sampleGroup].m_index;
-  uint8_t col = station->m_groupsTable[sampleGroup].m_col;
-
-  if (index >= m_numRates)
-    {
-      station->m_groupsTable[station->m_sampleGroup].m_index = 0;
-      station->m_groupsTable[station->m_sampleGroup].m_col++;
-      if (station->m_groupsTable[station->m_sampleGroup].m_col >= m_nSampleCol)
-        {
-          station->m_groupsTable[station->m_sampleGroup].m_col = 0;
-        }
-      index = station->m_groupsTable[station->m_sampleGroup].m_index;
-      col = station->m_groupsTable[sampleGroup].m_col;
-    }
-  NS_LOG_DEBUG ("New sample set: group= " << +sampleGroup << " index= " << +station->m_sampleTable[index][col]);
-}
-
-uint16_t
-MinstrelHtWifiManager::FindRate (MinstrelHtWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  NS_LOG_DEBUG ("FindRate packet=" << station->m_totalPacketsCount);
-
-  if ((station->m_samplePacketsCount + station->m_totalPacketsCount) == 0)
-    {
-      return station->m_maxTpRate;
-    }
-
-  // If we have waited enough, then sample.
-  if (station->m_sampleWait == 0 && station->m_sampleTries != 0)
-    {
-      //SAMPLING
-      NS_LOG_DEBUG ("Obtaining a sampling rate");
-      /// Now go through the table and find an index rate.
-      uint16_t sampleIdx = GetNextSample (station);
-      NS_LOG_DEBUG ("Sampling rate = " << sampleIdx);
-
-      //Evaluate if the sampling rate selected should be used.
-      uint8_t sampleGroupId = GetGroupId (sampleIdx);
-      uint8_t sampleRateId = GetRateId (sampleIdx);
-
-      // If the rate selected is not supported, then don't sample.
-      if (station->m_groupsTable[sampleGroupId].m_supported && station->m_groupsTable[sampleGroupId].m_ratesTable[sampleRateId].supported)
-        {
-          /**
-           * Sampling might add some overhead to the frame.
-           * Hence, don't use sampling for the currently used rates.
-           *
-           * Also do not sample if the probability is already higher than 95%
-           * to avoid wasting airtime.
-           */
-          HtRateInfo sampleRateInfo = station->m_groupsTable[sampleGroupId].m_ratesTable[sampleRateId];
-
-          NS_LOG_DEBUG ("Use sample rate? MaxTpRate= " << station->m_maxTpRate << " CurrentRate= " << station->m_txrate <<
-                        " SampleRate= " << sampleIdx << " SampleProb= " << sampleRateInfo.ewmaProb);
-
-          if (sampleIdx != station->m_maxTpRate && sampleIdx != station->m_maxTpRate2
-              && sampleIdx != station->m_maxProbRate && sampleRateInfo.ewmaProb <= 95)
-            {
-
-              /**
-               * Make sure that lower rates get sampled only occasionally,
-               * if the link is working perfectly.
-               */
-
-              uint8_t maxTpGroupId = GetGroupId (station->m_maxTpRate);
-              uint8_t maxTp2GroupId = GetGroupId (station->m_maxTpRate2);
-              uint8_t maxTp2RateId = GetRateId (station->m_maxTpRate2);
-              uint8_t maxProbGroupId = GetGroupId (station->m_maxProbRate);
-              uint8_t maxProbRateId = GetRateId (station->m_maxProbRate);
-
-              uint8_t maxTpStreams = m_minstrelGroups[maxTpGroupId].streams;
-              uint8_t sampleStreams = m_minstrelGroups[sampleGroupId].streams;
-
-              Time sampleDuration = sampleRateInfo.perfectTxTime;
-              Time maxTp2Duration = station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].perfectTxTime;
-              Time maxProbDuration = station->m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].perfectTxTime;
-
-              NS_LOG_DEBUG ("Use sample rate? SampleDuration= " << sampleDuration << " maxTp2Duration= " << maxTp2Duration <<
-                            " maxProbDuration= " << maxProbDuration << " sampleStreams= " << +sampleStreams <<
-                            " maxTpStreams= " << +maxTpStreams);
-              if (sampleDuration < maxTp2Duration || (sampleStreams < maxTpStreams && sampleDuration < maxProbDuration))
-                {
-                  /// Set flag that we are currently sampling.
-                  station->m_isSampling = true;
-
-                  /// set the rate that we're currently sampling
-                  station->m_sampleRate = sampleIdx;
-
-                  NS_LOG_DEBUG ("FindRate " << "sampleRate=" << sampleIdx);
-                  station->m_sampleTries--;
-                  return sampleIdx;
-                }
-              else
-                {
-                  station->m_numSamplesSlow++;
-                  if (sampleRateInfo.numSamplesSkipped >= 20 && station->m_numSamplesSlow <= 2)
-                    {
-                      /// Set flag that we are currently sampling.
-                      station->m_isSampling = true;
-
-                      /// set the rate that we're currently sampling
-                      station->m_sampleRate = sampleIdx;
-
-                      NS_LOG_DEBUG ("FindRate " << "sampleRate=" << sampleIdx);
-                      station->m_sampleTries--;
-                      return sampleIdx;
-                    }
-                }
-            }
-        }
-    }
-  if (station->m_sampleWait > 0)
-    {
-      station->m_sampleWait--;
-    }
-
-  ///	Continue using the best rate.
-
-  NS_LOG_DEBUG ("FindRate " << "maxTpRrate=" << station->m_maxTpRate);
-  return station->m_maxTpRate;
-}
-void
-MinstrelHtWifiManager::UpdateStats (MinstrelHtWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-
-  station->m_nextStatsUpdate = Simulator::Now () + m_updateStats;
-
-  station->m_numSamplesSlow = 0;
-  station->m_sampleCount = 0;
-
-  double tempProb;
-
-  if (station->m_ampduPacketCount > 0)
-    {
-      uint32_t newLen = station->m_ampduLen / station->m_ampduPacketCount;
-      station->m_avgAmpduLen = ( newLen * (100 - m_ewmaLevel) + (station->m_avgAmpduLen * m_ewmaLevel) ) / 100;
-      station->m_ampduLen = 0;
-      station->m_ampduPacketCount = 0;
-    }
-
-  /* Initialize global rate indexes */
-  station->m_maxTpRate = GetLowestIndex (station);
-  station->m_maxTpRate2 = GetLowestIndex (station);
-  station->m_maxProbRate = GetLowestIndex (station);
-
-  /// Update throughput and EWMA for each rate inside each group.
-  for (uint8_t j = 0; j < m_numGroups; j++)
-    {
-      if (station->m_groupsTable[j].m_supported)
-        {
-          station->m_sampleCount++;
-
-          /* (re)Initialize group rate indexes */
-          station->m_groupsTable[j].m_maxTpRate = GetLowestIndex (station, j);
-          station->m_groupsTable[j].m_maxTpRate2 = GetLowestIndex (station, j);
-          station->m_groupsTable[j].m_maxProbRate = GetLowestIndex (station, j);
-
-          for (uint8_t i = 0; i < m_numRates; i++)
-            {
-              if (station->m_groupsTable[j].m_ratesTable[i].supported)
-                {
-                  station->m_groupsTable[j].m_ratesTable[i].retryUpdated = false;
-
-                  NS_LOG_DEBUG (+i << " " << GetMcsSupported (station, station->m_groupsTable[j].m_ratesTable[i].mcsIndex) <<
-                                "\t attempt=" << station->m_groupsTable[j].m_ratesTable[i].numRateAttempt <<
-                                "\t success=" << station->m_groupsTable[j].m_ratesTable[i].numRateSuccess);
-
-                  /// If we've attempted something.
-                  if (station->m_groupsTable[j].m_ratesTable[i].numRateAttempt > 0)
-                    {
-                      station->m_groupsTable[j].m_ratesTable[i].numSamplesSkipped = 0;
-                      /**
-                       * Calculate the probability of success.
-                       * Assume probability scales from 0 to 100.
-                       */
-                      tempProb = (100 * station->m_groupsTable[j].m_ratesTable[i].numRateSuccess) / station->m_groupsTable[j].m_ratesTable[i].numRateAttempt;
-
-                      /// Bookkeeping.
-                      station->m_groupsTable[j].m_ratesTable[i].prob = tempProb;
-
-                      if (station->m_groupsTable[j].m_ratesTable[i].successHist == 0)
-                        {
-                          station->m_groupsTable[j].m_ratesTable[i].ewmaProb = tempProb;
-                        }
-                      else
-                        {
-                          station->m_groupsTable[j].m_ratesTable[i].ewmsdProb = CalculateEwmsd (station->m_groupsTable[j].m_ratesTable[i].ewmsdProb,
-                                                                                                tempProb, station->m_groupsTable[j].m_ratesTable[i].ewmaProb,
-                                                                                                m_ewmaLevel);
-                          /// EWMA probability
-                          tempProb = (tempProb * (100 - m_ewmaLevel) + station->m_groupsTable[j].m_ratesTable[i].ewmaProb * m_ewmaLevel)  / 100;
-                          station->m_groupsTable[j].m_ratesTable[i].ewmaProb = tempProb;
-                        }
-
-                      station->m_groupsTable[j].m_ratesTable[i].throughput = CalculateThroughput (station, j, i, tempProb);
-
-                      station->m_groupsTable[j].m_ratesTable[i].successHist += station->m_groupsTable[j].m_ratesTable[i].numRateSuccess;
-                      station->m_groupsTable[j].m_ratesTable[i].attemptHist += station->m_groupsTable[j].m_ratesTable[i].numRateAttempt;
-                    }
-                  else
-                    {
-                      station->m_groupsTable[j].m_ratesTable[i].numSamplesSkipped++;
-                    }
-
-                  /// Bookkeeping.
-                  station->m_groupsTable[j].m_ratesTable[i].prevNumRateSuccess = station->m_groupsTable[j].m_ratesTable[i].numRateSuccess;
-                  station->m_groupsTable[j].m_ratesTable[i].prevNumRateAttempt = station->m_groupsTable[j].m_ratesTable[i].numRateAttempt;
-                  station->m_groupsTable[j].m_ratesTable[i].numRateSuccess = 0;
-                  station->m_groupsTable[j].m_ratesTable[i].numRateAttempt = 0;
-
-                  if (station->m_groupsTable[j].m_ratesTable[i].throughput != 0)
-                    {
-                      SetBestStationThRates (station, GetIndex (j, i));
-                      SetBestProbabilityRate (station, GetIndex (j, i));
-                    }
-
-                }
-            }
-        }
-    }
-
-  //Try to sample all available rates during each interval.
-  station->m_sampleCount *= 8;
-
-  //Recalculate retries for the rates selected.
-  CalculateRetransmits (station, station->m_maxTpRate);
-  CalculateRetransmits (station, station->m_maxTpRate2);
-  CalculateRetransmits (station, station->m_maxProbRate);
-
-  NS_LOG_DEBUG ("max tp=" << station->m_maxTpRate << "\nmax tp2=" <<  station->m_maxTpRate2 << "\nmax prob=" << station->m_maxProbRate);
-  if (m_printStats)
-    {
-      PrintTable (station);
-    }
-}
-
-double
-MinstrelHtWifiManager::CalculateThroughput (MinstrelHtWifiRemoteStation *station, uint8_t groupId, uint8_t rateId, double ewmaProb)
-{
-  /**
-  * Calculating throughput.
-  * Do not account throughput if probability of success is below 10%
-  * (as done in minstrel_ht linux implementation).
-  */
-  if (ewmaProb < 10)
-    {
-      return 0;
-    }
-  else
-    {
-      /**
-       * For the throughput calculation, limit the probability value to 90% to
-       * account for collision related packet error rate fluctuation.
-       */
-      Time txTime =  station->m_groupsTable[groupId].m_ratesTable[rateId].perfectTxTime;
-      if (ewmaProb > 90)
-        {
-          return 90 / txTime.GetSeconds ();
-        }
-      else
-        {
-          return ewmaProb / txTime.GetSeconds ();
-        }
-    }
-}
-
-void
-MinstrelHtWifiManager::SetBestProbabilityRate (MinstrelHtWifiRemoteStation *station, uint16_t index)
-{
-  GroupInfo *group;
-  HtRateInfo rate;
-  uint8_t tmpGroupId, tmpRateId;
-  double tmpTh, tmpProb;
-  uint8_t groupId, rateId;
-  double currentTh;
-  // maximum group probability (GP) variables
-  uint8_t maxGPGroupId, maxGPRateId;
-  double maxGPTh;
-
-  groupId = GetGroupId (index);
-  rateId = GetRateId (index);
-  group = &station->m_groupsTable[groupId];
-  rate = group->m_ratesTable[rateId];
-
-  tmpGroupId = GetGroupId (station->m_maxProbRate);
-  tmpRateId = GetRateId (station->m_maxProbRate);
-  tmpProb = station->m_groupsTable[tmpGroupId].m_ratesTable[tmpRateId].ewmaProb;
-  tmpTh =  station->m_groupsTable[tmpGroupId].m_ratesTable[tmpRateId].throughput;
-
-  if (rate.ewmaProb > 75)
-    {
-      currentTh = station->m_groupsTable[groupId].m_ratesTable[rateId].throughput;
-      if (currentTh > tmpTh)
-        {
-          station->m_maxProbRate = index;
-        }
-
-      maxGPGroupId = GetGroupId (group->m_maxProbRate);
-      maxGPRateId = GetRateId (group->m_maxProbRate);
-      maxGPTh = station->m_groupsTable[maxGPGroupId].m_ratesTable[maxGPRateId].throughput;
-
-      if (currentTh > maxGPTh)
-        {
-          group->m_maxProbRate = index;
-        }
-    }
-  else
-    {
-      if (rate.ewmaProb > tmpProb)
-        {
-          station->m_maxProbRate = index;
-        }
-      maxGPRateId = GetRateId (group->m_maxProbRate);
-      if (rate.ewmaProb > group->m_ratesTable[maxGPRateId].ewmaProb)
-        {
-          group->m_maxProbRate = index;
-        }
-    }
-}
-
-/*
- * Find & sort topmost throughput rates
- *
- * If multiple rates provide equal throughput the sorting is based on their
- * current success probability. Higher success probability is preferred among
- * MCS groups.
- */
-void
-MinstrelHtWifiManager::SetBestStationThRates (MinstrelHtWifiRemoteStation *station, uint16_t index)
-{
-  uint8_t groupId, rateId;
-  double th, prob;
-  uint8_t maxTpGroupId, maxTpRateId;
-  uint8_t maxTp2GroupId, maxTp2RateId;
-  double maxTpTh, maxTpProb;
-  double maxTp2Th, maxTp2Prob;
-
-  groupId = GetGroupId (index);
-  rateId = GetRateId (index);
-  prob = station->m_groupsTable[groupId].m_ratesTable[rateId].ewmaProb;
-  th = station->m_groupsTable[groupId].m_ratesTable[rateId].throughput;
-
-  maxTpGroupId = GetGroupId (station->m_maxTpRate);
-  maxTpRateId = GetRateId (station->m_maxTpRate);
-  maxTpProb = station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].ewmaProb;
-  maxTpTh = station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].throughput;
-
-  maxTp2GroupId = GetGroupId (station->m_maxTpRate2);
-  maxTp2RateId = GetRateId (station->m_maxTpRate2);
-  maxTp2Prob = station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].ewmaProb;
-  maxTp2Th = station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].throughput;
-
-  if (th > maxTpTh || (th == maxTpTh && prob > maxTpProb))
-    {
-      station->m_maxTpRate2 = station->m_maxTpRate;
-      station->m_maxTpRate = index;
-    }
-  else if (th > maxTp2Th || (th == maxTp2Th && prob > maxTp2Prob))
-    {
-      station->m_maxTpRate2 = index;
-    }
-
-  //Find best rates per group
-
-  GroupInfo *group = &station->m_groupsTable[groupId];
-  maxTpGroupId = GetGroupId (group->m_maxTpRate);
-  maxTpRateId = GetRateId (group->m_maxTpRate);
-  maxTpProb = group->m_ratesTable[maxTpRateId].ewmaProb;
-  maxTpTh = station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].throughput;
-
-  maxTp2GroupId = GetGroupId (group->m_maxTpRate2);
-  maxTp2RateId = GetRateId (group->m_maxTpRate2);
-  maxTp2Prob = group->m_ratesTable[maxTp2RateId].ewmaProb;
-  maxTp2Th = station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].throughput;
-
-  if (th > maxTpTh || (th == maxTpTh && prob > maxTpProb))
-    {
-      group->m_maxTpRate2 = group->m_maxTpRate;
-      group->m_maxTpRate = index;
-    }
-  else if (th > maxTp2Th || (th == maxTp2Th && prob > maxTp2Prob))
-    {
-      group->m_maxTpRate2 = index;
-    }
-}
-
-void
-MinstrelHtWifiManager::RateInit (MinstrelHtWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-
-  station->m_groupsTable = McsGroupData (m_numGroups);
-
-  /**
-  * Initialize groups supported by the receiver.
-  */
-  NS_LOG_DEBUG ("Supported groups by station:");
-  for (uint8_t groupId = 0; groupId < m_numGroups; groupId++)
-    {
-      if (m_minstrelGroups[groupId].isSupported)
-        {
-          station->m_groupsTable[groupId].m_supported = false;
-          if (!(!GetVhtSupported (station) && m_minstrelGroups[groupId].isVht)                    ///Is VHT supported by the receiver?
-              && (m_minstrelGroups[groupId].isVht || !GetVhtSupported (station) || !m_useVhtOnly) ///If it is an HT MCS, check if VHT only is disabled
-              && !(!GetShortGuardIntervalSupported (station) && m_minstrelGroups[groupId].sgi)    ///Is SGI supported by the receiver?
-              && (GetChannelWidth (station) >= m_minstrelGroups[groupId].chWidth)                 ///Is channel width supported by the receiver?
-              && (GetNumberOfSupportedStreams (station) >= m_minstrelGroups[groupId].streams))    ///Are streams supported by the receiver?
-            {
-              NS_LOG_DEBUG ("Group " << +groupId << ": (" << +m_minstrelGroups[groupId].streams <<
-                            "," << +m_minstrelGroups[groupId].sgi << "," << m_minstrelGroups[groupId].chWidth << ")");
-
-              station->m_groupsTable[groupId].m_supported = true;                                ///Group supported.
-              station->m_groupsTable[groupId].m_col = 0;
-              station->m_groupsTable[groupId].m_index = 0;
-
-              station->m_groupsTable[groupId].m_ratesTable = HtMinstrelRate (m_numRates);        ///Create the rate list for the group.
-              for (uint8_t i = 0; i < m_numRates; i++)
-                {
-                  station->m_groupsTable[groupId].m_ratesTable[i].supported = false;
-                }
-
-              // Initialize all modes supported by the remote station that belong to the current group.
-              for (uint8_t i = 0; i < station->m_nModes; i++)
-                {
-                  WifiMode mode = GetMcsSupported (station, i);
-
-                  ///Use the McsValue as the index in the rate table.
-                  ///This way, MCSs not supported are not initialized.
-                  uint8_t rateId = mode.GetMcsValue ();
-                  if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
-                    {
-                      rateId %= MAX_HT_GROUP_RATES;
-                    }
-
-                  if ((m_minstrelGroups[groupId].isVht && mode.GetModulationClass () == WIFI_MOD_CLASS_VHT                       ///If it is a VHT MCS only add to a VHT group.
-                       && IsValidMcs (GetPhy (), m_minstrelGroups[groupId].streams, m_minstrelGroups[groupId].chWidth, mode))   ///Check validity of the VHT MCS
-                      || (!m_minstrelGroups[groupId].isVht &&  mode.GetModulationClass () == WIFI_MOD_CLASS_HT                  ///If it is a HT MCS only add to a HT group.
-                          && mode.GetMcsValue () < (m_minstrelGroups[groupId].streams * 8)                                      ///Check if the HT MCS corresponds to groups number of streams.
-                          && mode.GetMcsValue () >= ((m_minstrelGroups[groupId].streams - 1) * 8)))
-                    {
-                      NS_LOG_DEBUG ("Mode " << +i << ": " << mode << " isVht: " << m_minstrelGroups[groupId].isVht);
-
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].supported = true;
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex = i;         ///Mapping between rateId and operationalMcsSet
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt = 0;
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].numRateSuccess = 0;
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].prob = 0;
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].ewmaProb = 0;
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].prevNumRateAttempt = 0;
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].prevNumRateSuccess = 0;
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].numSamplesSkipped = 0;
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].successHist = 0;
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].attemptHist = 0;
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].throughput = 0;
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].perfectTxTime = GetFirstMpduTxTime (groupId, GetMcsSupported (station, i));
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].retryCount = 0;
-                      station->m_groupsTable[groupId].m_ratesTable[rateId].adjustedRetryCount = 0;
-                      CalculateRetransmits (station, groupId, rateId);
-                    }
-                }
-            }
-        }
-    }
-  SetNextSample (station);                  /// Select the initial sample index.
-  UpdateStats (station);                    /// Calculate the initial high throughput rates.
-  station->m_txrate = FindRate (station);   /// Select the rate to use.
-}
-
-void
-MinstrelHtWifiManager::CalculateRetransmits (MinstrelHtWifiRemoteStation *station, uint16_t index)
-{
-  NS_LOG_FUNCTION (this << station << index);
-  uint8_t groupId = GetGroupId (index);
-  uint8_t rateId = GetRateId (index);
-  if (!station->m_groupsTable[groupId].m_ratesTable[rateId].retryUpdated)
-    {
-      CalculateRetransmits (station, groupId, rateId);
-    }
-}
-
-void
-MinstrelHtWifiManager::CalculateRetransmits (MinstrelHtWifiRemoteStation *station, uint8_t groupId, uint8_t rateId)
-{
-  NS_LOG_FUNCTION (this << station << +groupId << +rateId);
-
-  uint32_t cw = 15;                     // Is an approximation.
-  uint32_t cwMax = 1023;
-  Time cwTime, txTime, dataTxTime;
-  Time slotTime = GetPhy ()->GetSlot ();
-  Time ackTime = GetPhy ()->GetSifs () + GetPhy ()->GetBlockAckTxTime ();
-
-  if (station->m_groupsTable[groupId].m_ratesTable[rateId].ewmaProb < 1)
-    {
-      station->m_groupsTable[groupId].m_ratesTable[rateId].retryCount = 1;
-    }
-  else
-    {
-      station->m_groupsTable[groupId].m_ratesTable[rateId].retryCount = 2;
-      station->m_groupsTable[groupId].m_ratesTable[rateId].retryUpdated = true;
-
-      dataTxTime = GetFirstMpduTxTime (groupId, GetMcsSupported (station, station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex)) +
-        GetMpduTxTime (groupId, GetMcsSupported (station, station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex)) * (station->m_avgAmpduLen - 1);
-
-      /* Contention time for first 2 tries */
-      cwTime = (cw / 2) * slotTime;
-      cw = Min ((cw + 1) * 2, cwMax);
-      cwTime += (cw / 2) * slotTime;
-      cw = Min ((cw + 1) * 2, cwMax);
-
-      /* Total TX time for data and Contention after first 2 tries */
-      txTime = cwTime + 2 * (dataTxTime + ackTime);
-
-      /* See how many more tries we can fit inside segment size */
-      do
-        {
-          /* Contention time for this try */
-          cwTime = (cw / 2) * slotTime;
-          cw = Min ((cw + 1) * 2, cwMax);
-
-          /* Total TX time after this try */
-          txTime += cwTime + ackTime + dataTxTime;
-        }
-      while ((txTime < MilliSeconds (6))
-             && (++station->m_groupsTable[groupId].m_ratesTable[rateId].retryCount < 7));
-    }
-}
-
-double
-MinstrelHtWifiManager::CalculateEwmsd (double oldEwmsd, double currentProb, double ewmaProb, double weight)
-{
-  double diff, incr, tmp;
-
-  /* calculate exponential weighted moving variance */
-  diff = currentProb - ewmaProb;
-  incr = (100 - weight) * diff / 100;
-  tmp = oldEwmsd * oldEwmsd;
-  tmp = weight * (tmp + diff * incr) / 100;
-
-  /* return standard deviation */
-  return sqrt (tmp);
-}
-
-void
-MinstrelHtWifiManager::InitSampleTable (MinstrelHtWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_col = station->m_index = 0;
-
-  //for off-setting to make rates fall between 0 and nModes
-  uint8_t numSampleRates = m_numRates;
-
-  uint16_t newIndex;
-  for (uint8_t col = 0; col < m_nSampleCol; col++)
-    {
-      for (uint8_t i = 0; i < numSampleRates; i++ )
-        {
-          /**
-           * The next two lines basically tries to generate a random number
-           * between 0 and the number of available rates
-           */
-          int uv = m_uniformRandomVariable->GetInteger (0, numSampleRates);
-          newIndex = (i + uv) % numSampleRates;
-
-          //this loop is used for filling in other uninitialized places
-          while (station->m_sampleTable[newIndex][col] != 0)
-            {
-              newIndex = (newIndex + 1) % m_numRates;
-            }
-          station->m_sampleTable[newIndex][col] = i;
-        }
-    }
-}
-
-void
-MinstrelHtWifiManager::PrintTable (MinstrelHtWifiRemoteStation *station)
-{
-  if (!station->m_statsFile.is_open ())
-    {
-      std::ostringstream tmp;
-      tmp << "minstrel-ht-stats-" << station->m_state->m_address << ".txt";
-      station->m_statsFile.open (tmp.str ().c_str (), std::ios::out);
-    }
-
-  station->m_statsFile << "               best   ____________rate__________    ________statistics________    ________last_______    ______sum-of________\n" <<
-    " mode guard #  rate  [name   idx airtime  max_tp]  [avg(tp) avg(prob) sd(prob)]  [prob.|retry|suc|att]  [#success | #attempts]\n";
-  for (uint8_t i = 0; i < m_numGroups; i++)
-    {
-      StatsDump (station, i, station->m_statsFile);
-    }
-
-  station->m_statsFile << "\nTotal packet count::    ideal " << Max (0, station->m_totalPacketsCount - station->m_samplePacketsCount) <<
-    "              lookaround " << station->m_samplePacketsCount << "\n";
-  station->m_statsFile << "Average # of aggregated frames per A-MPDU: " << station->m_avgAmpduLen << "\n\n";
-
-  station->m_statsFile.flush ();
-}
-
-void
-MinstrelHtWifiManager::StatsDump (MinstrelHtWifiRemoteStation *station, uint8_t groupId, std::ofstream &of)
-{
-  uint8_t numRates = m_numRates;
-  McsGroup group = m_minstrelGroups[groupId];
-  Time txTime;
-  char giMode;
-  if (group.sgi)
-    {
-      giMode = 'S';
-    }
-  else
-    {
-      giMode = 'L';
-    }
-  for (uint8_t i = 0; i < numRates; i++)
-    {
-      if (station->m_groupsTable[groupId].m_supported && station->m_groupsTable[groupId].m_ratesTable[i].supported)
-        {
-          if (!group.isVht)
-            {
-              of << "HT" << group.chWidth << "   " << giMode << "GI  " << (int)group.streams << "   ";
-            }
-          else
-            {
-              of << "VHT" << group.chWidth << "   " << giMode << "GI  " << (int)group.streams << "   ";
-            }
-
-          uint16_t maxTpRate = station->m_maxTpRate;
-          uint16_t maxTpRate2 = station->m_maxTpRate2;
-          uint16_t maxProbRate = station->m_maxProbRate;
-
-          uint16_t idx = GetIndex (groupId, i);
-          if (idx == maxTpRate)
-            {
-              of << 'A';
-            }
-          else
-            {
-              of << ' ';
-            }
-          if (idx == maxTpRate2)
-            {
-              of << 'B';
-            }
-          else
-            {
-              of << ' ';
-            }
-          if (idx == maxProbRate)
-            {
-              of << 'P';
-            }
-          else
-            {
-              of << ' ';
-            }
-
-          if (!group.isVht)
-            {
-              of << std::setw (4) << "   MCS" << (group.streams - 1) * 8 + i;
-            }
-          else
-            {
-              of << std::setw (7) << "   MCS" << +i << "/" << (int) group.streams;
-            }
-
-          of << "  " << std::setw (3) << +idx << "  ";
-
-          /* tx_time[rate(i)] in usec */
-          txTime = GetFirstMpduTxTime (groupId, GetMcsSupported (station, station->m_groupsTable[groupId].m_ratesTable[i].mcsIndex));
-          of << std::setw (6) << txTime.GetMicroSeconds () << "  ";
-
-          of << std::setw (7) << CalculateThroughput (station, groupId, i, 100) / 100 << "   " <<
-            std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].throughput / 100 << "   " <<
-            std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].ewmaProb << "  " <<
-            std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].ewmsdProb << "  " <<
-            std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].prob << "  " <<
-            std::setw (2) << station->m_groupsTable[groupId].m_ratesTable[i].retryCount << "   " <<
-            std::setw (3) << station->m_groupsTable[groupId].m_ratesTable[i].prevNumRateSuccess << "  " <<
-            std::setw (3) << station->m_groupsTable[groupId].m_ratesTable[i].prevNumRateAttempt << "   " <<
-            std::setw (9) << station->m_groupsTable[groupId].m_ratesTable[i].successHist << "   " <<
-            std::setw (9) << station->m_groupsTable[groupId].m_ratesTable[i].attemptHist << "\n";
-        }
-    }
-}
-uint16_t
-MinstrelHtWifiManager::GetIndex (uint8_t groupId, uint8_t rateId)
-{
-  NS_LOG_FUNCTION (this << +groupId << +rateId);
-  uint16_t index;
-  index = groupId * m_numRates + rateId;
-  return index;
-}
-
-uint8_t
-MinstrelHtWifiManager::GetRateId (uint16_t index)
-{
-  NS_LOG_FUNCTION (this << index);
-  uint8_t id;
-  id = index % m_numRates;
-  return id;
-}
-
-uint8_t
-MinstrelHtWifiManager::GetGroupId (uint16_t index)
-{
-  NS_LOG_FUNCTION (this << index);
-  return index / m_numRates;
-}
-
-uint8_t
-MinstrelHtWifiManager::GetHtGroupId (uint8_t txstreams, uint8_t sgi, uint16_t chWidth)
-{
-  NS_LOG_FUNCTION (this << +txstreams << +sgi << chWidth);
-  return MAX_SUPPORTED_STREAMS * 2 * (chWidth == 40 ? 1 : 0) + MAX_SUPPORTED_STREAMS * sgi + txstreams - 1;
-}
-
-uint8_t
-MinstrelHtWifiManager::GetVhtGroupId (uint8_t txstreams, uint8_t sgi, uint16_t chWidth)
-{
-  NS_LOG_FUNCTION (this << +txstreams << +sgi << chWidth);
-  return MAX_HT_STREAM_GROUPS * MAX_SUPPORTED_STREAMS + MAX_SUPPORTED_STREAMS * 2 * (chWidth == 160 ? 3 : chWidth == 80 ? 2 : chWidth == 40 ? 1 : 0) + MAX_SUPPORTED_STREAMS * sgi + txstreams - 1;
-}
-
-uint16_t
-MinstrelHtWifiManager::GetLowestIndex (MinstrelHtWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-
-  uint8_t groupId = 0;
-  uint8_t rateId = 0;
-  while (groupId < m_numGroups && !station->m_groupsTable[groupId].m_supported)
-    {
-      groupId++;
-    }
-  while (rateId < m_numRates && !station->m_groupsTable[groupId].m_ratesTable[rateId].supported)
-    {
-      rateId++;
-    }
-  NS_ASSERT (station->m_groupsTable[groupId].m_supported && station->m_groupsTable[groupId].m_ratesTable[rateId].supported);
-  return GetIndex (groupId, rateId);
-}
-
-uint16_t
-MinstrelHtWifiManager::GetLowestIndex (MinstrelHtWifiRemoteStation *station, uint8_t groupId)
-{
-  NS_LOG_FUNCTION (this << station << +groupId);
-
-  uint8_t rateId = 0;
-  while (rateId < m_numRates && !station->m_groupsTable[groupId].m_ratesTable[rateId].supported)
-    {
-      rateId++;
-    }
-  NS_ASSERT (station->m_groupsTable[groupId].m_supported && station->m_groupsTable[groupId].m_ratesTable[rateId].supported);
-  return GetIndex (groupId, rateId);
-}
-
-WifiModeList
-MinstrelHtWifiManager::GetVhtDeviceMcsList (void) const
-{
-  WifiModeList vhtMcsList;
-  Ptr<WifiPhy> phy = GetPhy ();
-  for (uint8_t i = 0; i < phy->GetNMcs (); i++)
-    {
-      WifiMode mode = phy->GetMcs (i);
-      if (mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
-        {
-          vhtMcsList.push_back (mode);
-        }
-    }
-  return vhtMcsList;
-}
-
-WifiModeList
-MinstrelHtWifiManager::GetHtDeviceMcsList (void) const
-{
-  WifiModeList htMcsList;
-  Ptr<WifiPhy> phy = GetPhy ();
-  for (uint8_t i = 0; i < phy->GetNMcs (); i++)
-    {
-      WifiMode mode = phy->GetMcs (i);
-      if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
-        {
-          htMcsList.push_back (mode);
-        }
-    }
-  return htMcsList;
-}
-
-} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/minstrel-ht-wifi-manager.h ns-3.34/src/wifi/model/minstrel-ht-wifi-manager.h
--- ns-3.33/src/wifi/model/minstrel-ht-wifi-manager.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/minstrel-ht-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,592 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2009 Duy Nguyen
- * Copyright (c) 2015 Ghada Badawy
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- *Authors: Duy Nguyen <duy@soe.ucsc.edu>
- *         Ghada Badawy <gbadawy@gmail.com>
- *         Matias Richart <mrichart@fing.edu.uy>
- *
- * MinstrelHt is a rate adaptation algorithm for high-throughput (HT) 802.11
- */
-
-#ifndef MINSTREL_HT_WIFI_MANAGER_H
-#define MINSTREL_HT_WIFI_MANAGER_H
-
-#include "wifi-remote-station-manager.h"
-#include "minstrel-wifi-manager.h"
-#include "wifi-mpdu-type.h"
-
-namespace ns3 {
-
-/**
- * Data structure to save transmission time calculations per rate.
- */
-typedef std::map<WifiMode, Time> TxTime;
-
-/**
- * Data structure to contain the information that defines a group.
- * It also contains the transmission times for all the MCS in the group.
- * A group is a collection of MCS defined by the number of spatial streams,
- * if it uses or not Short Guard Interval, and the channel width used.
- */
-struct McsGroup
-{
-  uint8_t streams;  ///< streams
-  uint8_t sgi;      ///< short guard interval (0 or 1)
-  uint16_t chWidth; ///< channel width (MHz)
-  bool isVht;       ///< is VHT?
-  bool isSupported; ///< is supported?
-  // To accurately account for TX times, we separate the TX time of the first
-  // MPDU in an A-MPDU from the rest of the MPDUs.
-  TxTime ratesTxTimeTable;          ///< rates transmit time table
-  TxTime ratesFirstMpduTxTimeTable; ///< rates MPDU transmit time table
-};
-
-/**
- * Data structure for a table of group definitions.
- * A vector of McsGroups.
- */
-typedef std::vector<McsGroup> MinstrelMcsGroups;
-
-struct MinstrelHtWifiRemoteStation;
-/**
- * A struct to contain all statistics information related to a data rate.
- */
-struct HtRateInfo
-{
-  /**
-   * Perfect transmission time calculation, or frame calculation.
-   * Given a bit rate and a packet length n bytes.
-   */
-  Time perfectTxTime;
-  bool supported;               //!< If the rate is supported.
-  uint8_t mcsIndex;             //!< The index in the operationalMcsSet of the WifiRemoteStationManager.
-  uint32_t retryCount;          //!< Retry limit.
-  uint32_t adjustedRetryCount;  //!< Adjust the retry limit for this rate.
-  uint32_t numRateAttempt;      //!< Number of transmission attempts so far.
-  uint32_t numRateSuccess;      //!< Number of successful frames transmitted so far.
-  double prob;                  //!< Current probability within last time interval. (# frame success )/(# total frames)
-  bool retryUpdated;            //!< If number of retries was updated already.
-  /**
-   * Exponential weighted moving average of probability.
-   * EWMA calculation:
-   * ewma_prob =[prob *(100 - ewma_level) + (ewma_prob_old * ewma_level)]/100
-   */
-  double ewmaProb;
-  double ewmsdProb;             //!< Exponential weighted moving standard deviation of probability.
-  uint32_t prevNumRateAttempt;  //!< Number of transmission attempts with previous rate.
-  uint32_t prevNumRateSuccess;  //!< Number of successful frames transmitted with previous rate.
-  uint32_t numSamplesSkipped;   //!< Number of times this rate statistics were not updated because no attempts have been made.
-  uint64_t successHist;         //!< Aggregate of all transmission successes.
-  uint64_t attemptHist;         //!< Aggregate of all transmission attempts.
-  double throughput;            //!< Throughput of this rate (in packets per second).
-};
-
-/**
- * Data structure for a Minstrel Rate table.
- * A vector of a struct HtRateInfo.
- */
-typedef std::vector<HtRateInfo> HtMinstrelRate;
-
-/**
- * A struct to contain information of a group.
- */
-struct GroupInfo
-{
-  /**
-   * MCS rates are divided into groups based on the number of streams and flags that they use.
-   */
-  uint8_t m_col;                  //!< Sample table column.
-  uint8_t m_index;                //!< Sample table index.
-  bool m_supported;               //!< If the rates of this group are supported by the station.
-  uint16_t m_maxTpRate;           //!< The max throughput rate of this group in bps.
-  uint16_t m_maxTpRate2;          //!< The second max throughput rate of this group in bps.
-  uint16_t m_maxProbRate;         //!< The highest success probability rate of this group in bps.
-  HtMinstrelRate m_ratesTable;    //!< Information about rates of this group.
-};
-
-/**
- * Data structure for a table of groups. Each group is of type GroupInfo.
- * A vector of a GroupInfo.
- */
-typedef std::vector<struct GroupInfo> McsGroupData;
-
-/**
- * Constants for maximum values.
- */
-
-static const uint8_t MAX_SUPPORTED_STREAMS = 4;  //!< Maximal number of streams supported by the PHY layer.
-static const uint8_t MAX_HT_STREAM_GROUPS = 4;   //!< Maximal number of groups per stream in HT (2 possible channel widths and 2 possible SGI configurations).
-static const uint8_t MAX_VHT_STREAM_GROUPS = 8;  //!< Maximal number of groups per stream in VHT (4 possible channel widths and 2 possible SGI configurations).
-static const uint8_t MAX_HT_GROUP_RATES = 8;     //!< Number of rates (or MCS) per HT group.
-static const uint8_t MAX_VHT_GROUP_RATES = 10;   //!< Number of rates (or MCS) per VHT group.
-static const uint8_t MAX_HT_WIDTH = 40;          //!< Maximal channel width in MHz.
-static const uint8_t MAX_VHT_WIDTH = 160;        //!< Maximal channel width in MHz.
-
-/**
- * \brief Implementation of Minstrel HT Rate Control Algorithm
- * \ingroup wifi
- *
- * Minstrel-HT is a rate adaptation mechanism for the 802.11n/ac standard
- * based on Minstrel, and is based on the approach of probing the channel
- * to dynamically learn about working rates that can be supported.
- * Minstrel-HT is designed for high-latency devices that implement a
- * Multiple Rate Retry (MRR) chain. This kind of device does
- * not give feedback for every frame retransmission, but only when a frame
- * was correctly transmitted (an Ack is received) or a frame transmission
- * completely fails (all retransmission attempts fail).
- * The MRR chain is used to advise the hardware about which rate to use
- * when retransmitting a frame.
- *
- * Minstrel-HT adapts the MCS, channel width, number of streams, and
- * short guard interval (enabled or disabled).  For keeping statistics,
- * it arranges MCS in groups, where each group is defined by the
- * tuple (streams, SGI, channel width).  There is a vector of all groups
- * supported by the PHY layer of the transmitter; for each group, the
- * capabilities and the estimated duration of its rates are maintained.
- *
- * Each station maintains a table of groups statistics. For each group, a flag
- * indicates if the group is supported by the station. Different stations
- * communicating with an AP can have different capabilities.
- *
- * Stats are updated per A-MPDU when receiving AmpduTxStatus. If the number
- * of successful or failed MPDUs is greater than zero (a BlockAck was
- * received), the rates are also updated.
- * If the number of successful and failed MPDUs is zero (BlockAck timeout),
- * then the rate selected is based on the MRR chain.
- *
- * On each update interval, it sets the maxThrRate, the secondmaxThrRate
- * and the maxProbRate for the MRR chain. These rates are only used when
- * an entire A-MPDU fails and is retried.
- *
- * Differently from legacy minstrel, sampling is not done based on
- * "lookaround ratio", but assuring all rates are sampled at least once
- * each interval. However, it samples less often the low rates and high
- * probability of error rates.
- *
- * When this rate control is configured but non-legacy modes are not supported,
- * Minstrel-HT uses legacy Minstrel (minstrel-wifi-manager) for rate control.
- *
- * This RAA does not support HE modes yet and will error
- * exit if the user tries to configure this RAA with a Wi-Fi MAC
- * that supports 802.11ax or higher.
- */
-class MinstrelHtWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  MinstrelHtWifiManager ();
-  virtual ~MinstrelHtWifiManager ();
-
-  /**
-   * Assign a fixed random variable stream number to the random variables
-   * used by this model.  Return the number of streams (possibly zero) that
-   * have been assigned.
-   *
-   * \param stream first stream index to use
-   * \return the number of stream indices assigned by this model
-   */
-  int64_t AssignStreams (int64_t stream);
-
-  // Inherited from WifiRemoteStationManager
-  void SetupPhy (const Ptr<WifiPhy> phy);
-  void SetupMac (const Ptr<WifiMac> mac);
-
-  /**
-   * TracedCallback signature for rate change events.
-   *
-   * \param [in] rate The new rate.
-   * \param [in] address The remote station MAC address.
-   */
-  typedef void (*RateChangeTracedCallback)(const uint64_t rate, const Mac48Address remoteAddress);
-
-
-private:
-  // Overridden from base class.
-  void DoInitialize (void);
-  WifiRemoteStation * DoCreateStation (void) const;
-  void DoReportRxOk (WifiRemoteStation *station,
-                     double rxSnr, WifiMode txMode);
-  void DoReportRtsFailed (WifiRemoteStation *station);
-  void DoReportDataFailed (WifiRemoteStation *station);
-  void DoReportRtsOk (WifiRemoteStation *station,
-                      double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  void DoReportFinalDataFailed (WifiRemoteStation *station);
-  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-  void DoReportAmpduTxStatus (WifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus,
-                              double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  bool DoNeedRetransmission (WifiRemoteStation *st, Ptr<const Packet> packet, bool normally);
-
-  /**
-   * Check the validity of a combination of number of streams, chWidth and mode.
-   *
-   * \param phy pointer to the wifi PHY
-   * \param streams the number of streams
-   * \param chWidth the channel width (MHz)
-   * \param mode the wifi mode
-   * \returns true if the combination is valid
-   */
-  bool IsValidMcs (Ptr<WifiPhy> phy, uint8_t streams, uint16_t chWidth, WifiMode mode);
-
-  /**
-   * Estimates the TxTime of a frame with a given mode and group (stream, guard interval and channel width).
-   *
-   * \param phy pointer to the wifi PHY
-   * \param streams the number of streams
-   * \param sgi short guard interval enabled (0 or 1)
-   * \param chWidth the channel width (MHz)
-   * \param mode the wifi mode
-   * \param mpduType the type of the MPDU
-   * \returns the transmit time
-   */
-  Time CalculateMpduTxDuration (Ptr<WifiPhy> phy, uint8_t streams, uint8_t sgi,
-                                uint16_t chWidth, WifiMode mode, MpduType mpduType);
-
-  /**
-   * Obtain the TxTime saved in the group information.
-   *
-   * \param groupId the group ID
-   * \param mode the wifi mode
-   * \returns the transmit time
-   */
-  Time GetMpduTxTime (uint8_t groupId, WifiMode mode) const;
-
-  /**
-   * Save a TxTime to the vector of groups.
-   *
-   * \param groupId the group ID
-   * \param mode the wifi mode
-   * \param t the transmit time
-   */
-  void AddMpduTxTime (uint8_t groupId, WifiMode mode, Time t);
-
-  /**
-   * Obtain the TxTime saved in the group information.
-   *
-   * \param groupId the group ID
-   * \param mode the wifi mode
-   * \returns the transmit time
-   */
-  Time GetFirstMpduTxTime (uint8_t groupId, WifiMode mode) const;
-
-  /**
-   * Save a TxTime to the vector of groups.
-   *
-   * \param groupId the group ID
-   * \param mode the wifi mode
-   * \param t the transmit time
-   */
-  void AddFirstMpduTxTime (uint8_t groupId, WifiMode mode, Time t);
-
-  /**
-   * Update the number of retries and reset accordingly.
-   * \param station the wifi remote station
-   */
-  void UpdateRetry (MinstrelHtWifiRemoteStation *station);
-
-  /**
-   * Update the number of sample count variables.
-   *
-   * \param station the wifi remote station
-   * \param nSuccessfulMpdus the number of successfully received MPDUs
-   * \param nFailedMpdus the number of failed MPDUs
-   */
-  void UpdatePacketCounters (MinstrelHtWifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus);
-
-  /**
-   * Getting the next sample from Sample Table.
-   *
-   * \param station the wifi remote station
-   * \returns the next sample
-   */
-  uint16_t GetNextSample (MinstrelHtWifiRemoteStation *station);
-
-  /**
-   * Set the next sample from Sample Table.
-   *
-   * \param station the wifi remote station
-   */
-  void SetNextSample (MinstrelHtWifiRemoteStation *station);
-
-  /**
-   * Find a rate to use from Minstrel Table.
-   *
-   * \param station the minstrel HT wifi remote station
-   * \returns the rate in bps
-   */
-  uint16_t FindRate (MinstrelHtWifiRemoteStation *station);
-
-  /**
-   * Update the Minstrel Table.
-   *
-   * \param station the minstrel HT wifi remote station
-   */
-  void UpdateStats (MinstrelHtWifiRemoteStation *station);
-
-  /**
-   * Initialize Minstrel Table.
-   *
-   * \param station the minstrel HT wifi remote station
-   */
-  void RateInit (MinstrelHtWifiRemoteStation *station);
-
-  /**
-   * Return the average throughput of the MCS defined by groupId and rateId.
-   *
-   * \param station the minstrel HT wifi remote station
-   * \param groupId the group ID
-   * \param rateId the rate ID
-   * \param ewmaProb the EWMA probability
-   * \returns the throughput in bps
-   */
-  double CalculateThroughput (MinstrelHtWifiRemoteStation *station, uint8_t groupId, uint8_t rateId, double ewmaProb);
-
-  /**
-   * Set index rate as maxTpRate or maxTp2Rate if is better than current values.
-   *
-   * \param station the minstrel HT wifi remote station
-   * \param index the index
-   */
-  void SetBestStationThRates (MinstrelHtWifiRemoteStation *station, uint16_t index);
-
-  /**
-   * Set index rate as maxProbRate if it is better than current value.
-   *
-   * \param station the minstrel HT wifi remote station
-   * \param index the index
-   */
-  void SetBestProbabilityRate (MinstrelHtWifiRemoteStation *station, uint16_t index);
-
-  /**
-   * Calculate the number of retransmissions to set for the index rate.
-   *
-   * \param station the minstrel HT wifi remote station
-   * \param index the index
-   */
-  void CalculateRetransmits (MinstrelHtWifiRemoteStation *station, uint16_t index);
-
-  /**
-   * Calculate the number of retransmissions to set for the (groupId, rateId) rate.
-   *
-   * \param station the minstrel HT wifi remote station
-   * \param groupId the group ID
-   * \param rateId the rate ID
-   */
-  void CalculateRetransmits (MinstrelHtWifiRemoteStation *station, uint8_t groupId, uint8_t rateId);
-
-  /**
-   * Estimate the time to transmit the given packet with the given number of retries.
-   * This function is "roughly" the function "calc_usecs_unicast_packet" in minstrel.c
-   * in the madwifi implementation.
-   *
-   * The basic idea is that, we try to estimate the "average" time used to transmit the
-   * packet for the given number of retries while also accounting for the 802.11 congestion
-   * window change. The original code in the madwifi seems to estimate the number of backoff
-   * slots as the half of the current CW size.
-   *
-   * There are four main parts:
-   *  - wait for DIFS (sense idle channel)
-   *  - Ack timeouts
-   *  - Data transmission
-   *  - backoffs according to CW
-   *
-   * \param dataTransmissionTime the data transmission time
-   * \param shortRetries the short retries
-   * \param longRetries the long retries
-   * \returns the unicast packet time
-   */
-  Time CalculateTimeUnicastPacket (Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries);
-
-  /**
-   * Perform EWMSD (Exponentially Weighted Moving Standard Deviation) calculation.
-   *
-   * \param oldEwmsd the old EWMSD
-   * \param currentProb the current probability
-   * \param ewmaProb the EWMA probability
-   * \param weight the weight
-   * \returns the EWMSD
-   */
-  double CalculateEwmsd (double oldEwmsd, double currentProb, double ewmaProb, double weight);
-
-  /**
-   * Initialize Sample Table.
-   *
-   * \param station the minstrel HT wifi remote station
-   */
-  void InitSampleTable (MinstrelHtWifiRemoteStation *station);
-
-  /**
-   * Printing Sample Table.
-   *
-   * \param station the minstrel HT wifi remote station
-   */
-  void PrintSampleTable (MinstrelHtWifiRemoteStation *station);
-
-  /**
-   * Printing Minstrel Table.
-   *
-   * \param station the minstrel HT wifi remote station
-   */
-  void PrintTable (MinstrelHtWifiRemoteStation *station);
-
-  /**
-   * Print group statistics.
-   *
-   * \param station the minstrel HT wifi remote station
-   * \param groupId the group ID
-   * \param of the output file stream
-   */
-  void StatsDump (MinstrelHtWifiRemoteStation *station, uint8_t groupId, std::ofstream &of);
-
-  /**
-   * Check for initializations.
-   *
-   * \param station the minstrel HT wifi remote station
-   */
-  void CheckInit (MinstrelHtWifiRemoteStation *station);
-
-  /**
-   * Count retries.
-   *
-   * \param station the minstrel HT wifi remote station
-   * \returns the count of retries
-   */
-  uint32_t CountRetries (MinstrelHtWifiRemoteStation * station);
-
-  /**
-   * Update rate.
-   *
-   * \param station the minstrel HT wifi remote station
-   */
-  void UpdateRate (MinstrelHtWifiRemoteStation *station);
-
-  /**
-   * For managing rates from different groups, a global index for
-   * all rates in all groups is used.
-   * The group order is fixed by BW -> SGI -> streams.
-   * Following functions convert from groupId and rateId to
-   * global index and vice versa.
-   *
-   * \param index the index
-   * \returns the rate ID
-   */
-
-  /**
-   * Return the rateId inside a group, from the global index.
-   *
-   * \param index the index
-   * \returns the rate ID
-   */
-  uint8_t GetRateId (uint16_t index);
-
-  /**
-   * Return the groupId from the global index.
-   *
-   * \param index the index
-   * \returns the group ID
-   */
-  uint8_t GetGroupId (uint16_t index);
-
-  /**
-   * Returns the global index corresponding to the groupId and rateId.
-   *
-   * \param groupId the group ID
-   * \param rateId the rate ID
-   * \returns the index
-   */
-  uint16_t GetIndex (uint8_t groupId, uint8_t rateId);
-
-  /**
-   * Returns the groupId of a HT MCS with the given number of streams, if using SGI and the channel width used.
-   *
-   * \param txstreams the number of streams
-   * \param sgi short guard interval enabled (0 or 1)
-   * \param chWidth the channel width (MHz)
-   * \returns the HT group ID
-   */
-  uint8_t GetHtGroupId (uint8_t txstreams, uint8_t sgi, uint16_t chWidth);
-
-  /**
-   * Returns the groupId of a VHT MCS with the given number of streams, if using SGI and the channel width used.
-   *
-   * \param txstreams the number of streams
-   * \param sgi short guard interval enabled (0 or 1)
-   * \param chWidth the channel width (MHz)
-   * \returns the VHT group ID
-   */
-  uint8_t GetVhtGroupId (uint8_t txstreams, uint8_t sgi, uint16_t chWidth);
-
-  /**
-   * Returns the lowest global index of the rates supported by the station.
-   *
-   * \param station the minstrel HT wifi remote station
-   * \returns the lowest global index
-   */
-  uint16_t GetLowestIndex (MinstrelHtWifiRemoteStation *station);
-
-  /**
-   * Returns the lowest global index of the rates supported by in the group.
-   *
-   * \param station the minstrel HT wifi remote station
-   * \param groupId the group ID
-   * \returns the lowest global index
-   */
-  uint16_t GetLowestIndex (MinstrelHtWifiRemoteStation *station, uint8_t groupId);
-
-  /**
-   * Returns a list of only the VHT MCS supported by the device.
-   * \returns the list of the VHT MCS supported
-   */
-  WifiModeList GetVhtDeviceMcsList (void) const;
-
-  /**
-   * Returns a list of only the HT MCS supported by the device.
-   * \returns the list of the HT MCS supported
-   */
-  WifiModeList GetHtDeviceMcsList (void) const;
-
-  Time m_updateStats;        //!< How frequent do we calculate the stats.
-  Time m_legacyUpdateStats;  //!< How frequent do we calculate the stats for legacy MinstrelWifiManager.
-  uint8_t m_lookAroundRate;  //!< The % to try other rates than our current rate.
-  uint8_t m_ewmaLevel;       //!< Exponential weighted moving average level (or coefficient).
-  uint8_t m_nSampleCol;      //!< Number of sample columns.
-  uint32_t m_frameLength;    //!< Frame length used for calculate modes TxTime in bytes.
-  uint8_t m_numGroups;       //!< Number of groups Minstrel should consider.
-  uint8_t m_numRates;        //!< Number of rates per group Minstrel should consider.
-  bool m_useVhtOnly;         //!< If only VHT MCS should be used, instead of HT and VHT.
-  bool m_printStats;         //!< If statistics table should be printed.
-
-  MinstrelMcsGroups m_minstrelGroups;                 //!< Global array for groups information.
-
-  Ptr<MinstrelWifiManager> m_legacyManager;           //!< Pointer to an instance of MinstrelWifiManager. Used when 802.11n/ac not supported.
-
-  Ptr<UniformRandomVariable> m_uniformRandomVariable; //!< Provides uniform random variables.
-
-  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
-};
-
-} // namespace ns3
-
-#endif /* MINSTREL_HT_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/minstrel-wifi-manager.cc ns-3.34/src/wifi/model/minstrel-wifi-manager.cc
--- ns-3.33/src/wifi/model/minstrel-wifi-manager.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/minstrel-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,1100 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2009 Duy Nguyen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Authors: Duy Nguyen <duy@soe.ucsc.edu>
- *          Matías Richart <mrichart@fing.edu.uy>
- *
- * Some Comments:
- *
- * 1) Segment Size is declared for completeness but not used  because it has
- *    to do more with the requirement of the specific hardware.
- *
- * 2) By default, Minstrel applies the multi-rate retry (the core of Minstrel
- *    algorithm). Otherwise, please use ConstantRateWifiManager instead.
- *
- * http://linuxwireless.org/en/developers/Documentation/mac80211/RateControl/minstrel
- */
-
-#include <iomanip>
-#include "ns3/packet.h"
-#include "ns3/random-variable-stream.h"
-#include "ns3/simulator.h"
-#include "ns3/log.h"
-#include "minstrel-wifi-manager.h"
-#include "wifi-mac.h"
-#include "wifi-phy.h"
-
-#define Min(a,b) ((a < b) ? a : b)
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("MinstrelWifiManager");
-
-NS_OBJECT_ENSURE_REGISTERED (MinstrelWifiManager);
-
-TypeId
-MinstrelWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::MinstrelWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<MinstrelWifiManager> ()
-    .AddAttribute ("UpdateStatistics",
-                   "The interval between updating statistics table ",
-                   TimeValue (Seconds (0.1)),
-                   MakeTimeAccessor (&MinstrelWifiManager::m_updateStats),
-                   MakeTimeChecker ())
-    .AddAttribute ("LookAroundRate",
-                   "The percentage to try other rates",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&MinstrelWifiManager::m_lookAroundRate),
-                   MakeUintegerChecker<uint8_t> ())
-    .AddAttribute ("EWMA",
-                   "EWMA level",
-                   UintegerValue (75),
-                   MakeUintegerAccessor (&MinstrelWifiManager::m_ewmaLevel),
-                   MakeUintegerChecker<uint8_t> ())
-    .AddAttribute ("SampleColumn",
-                   "The number of columns used for sampling",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&MinstrelWifiManager::m_sampleCol),
-                   MakeUintegerChecker <uint8_t> ())
-    .AddAttribute ("PacketLength",
-                   "The packet length used for calculating mode TxTime",
-                   UintegerValue (1200),
-                   MakeUintegerAccessor (&MinstrelWifiManager::m_pktLen),
-                   MakeUintegerChecker <uint32_t> ())
-    .AddAttribute ("PrintStats",
-                   "Print statistics table",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&MinstrelWifiManager::m_printStats),
-                   MakeBooleanChecker ())
-    .AddAttribute ("PrintSamples",
-                   "Print samples table",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&MinstrelWifiManager::m_printSamples),
-                   MakeBooleanChecker ())
-    .AddTraceSource ("Rate",
-                     "Traced value for rate changes (b/s)",
-                     MakeTraceSourceAccessor (&MinstrelWifiManager::m_currentRate),
-                     "ns3::TracedValueCallback::Uint64")
-  ;
-  return tid;
-}
-
-MinstrelWifiManager::MinstrelWifiManager ()
-  : WifiRemoteStationManager (),
-    m_currentRate (0)
-{
-  NS_LOG_FUNCTION (this);
-  m_uniformRandomVariable = CreateObject<UniformRandomVariable> ();
-}
-
-MinstrelWifiManager::~MinstrelWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-MinstrelWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
-{
-  NS_LOG_FUNCTION (this << phy);
-  uint8_t nModes = phy->GetNModes ();
-  for (uint8_t i = 0; i < nModes; i++)
-    {
-      WifiMode mode = phy->GetMode (i);
-      WifiTxVector txVector;
-      txVector.SetMode (mode);
-      txVector.SetPreambleType (WIFI_PREAMBLE_LONG);
-      AddCalcTxTime (mode, phy->CalculateTxDuration (m_pktLen, txVector, phy->GetPhyBand ()));
-    }
-  WifiRemoteStationManager::SetupPhy (phy);
-}
-
-void
-MinstrelWifiManager::SetupMac (const Ptr<WifiMac> mac)
-{
-  NS_LOG_FUNCTION (this << mac);
-  WifiRemoteStationManager::SetupMac (mac);
-}
-
-void
-MinstrelWifiManager::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  if (GetHtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
-    }
-  if (GetVhtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
-    }
-  if (GetHeSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
-    }
-}
-
-int64_t
-MinstrelWifiManager::AssignStreams (int64_t stream)
-{
-  NS_LOG_FUNCTION (this << stream);
-  m_uniformRandomVariable->SetStream (stream);
-  return 1;
-}
-
-Time
-MinstrelWifiManager::GetCalcTxTime (WifiMode mode) const
-{
-  NS_LOG_FUNCTION (this << mode);
-  auto it = m_calcTxTime.find (mode);
-  NS_ASSERT (it != m_calcTxTime.end ());
-  return it->second;
-}
-
-void
-MinstrelWifiManager::AddCalcTxTime (WifiMode mode, Time t)
-{
-  NS_LOG_FUNCTION (this << mode << t);
-  m_calcTxTime.insert (std::make_pair (mode, t));
-}
-
-WifiRemoteStation *
-MinstrelWifiManager::DoCreateStation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  MinstrelWifiRemoteStation *station = new MinstrelWifiRemoteStation ();
-
-  station->m_nextStatsUpdate = Simulator::Now () + m_updateStats;
-  station->m_col = 0;
-  station->m_index = 0;
-  station->m_maxTpRate = 0;
-  station->m_maxTpRate2 = 0;
-  station->m_maxProbRate = 0;
-  station->m_nModes = 0;
-  station->m_totalPacketsCount = 0;
-  station->m_samplePacketsCount = 0;
-  station->m_isSampling = false;
-  station->m_sampleRate = 0;
-  station->m_sampleDeferred = false;
-  station->m_shortRetry = 0;
-  station->m_longRetry = 0;
-  station->m_retry = 0;
-  station->m_txrate = 0;
-  station->m_initialized = false;
-
-  return station;
-}
-
-void
-MinstrelWifiManager::CheckInit (MinstrelWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  if (!station->m_initialized && GetNSupported (station) > 1)
-    {
-      //Note: we appear to be doing late initialization of the table
-      //to make sure that the set of supported rates has been initialized
-      //before we perform our own initialization.
-      station->m_nModes = GetNSupported (station);
-      station->m_minstrelTable = MinstrelRate (station->m_nModes);
-      station->m_sampleTable = SampleRate (station->m_nModes, std::vector<uint8_t> (m_sampleCol));
-      InitSampleTable (station);
-      RateInit (station);
-      station->m_initialized = true;
-    }
-}
-
-/**
- *
- * Retry Chain table is implemented here
- *
- * Try |         LOOKAROUND RATE              | NORMAL RATE
- *     | random < best    | random > best     |
- * --------------------------------------------------------------
- *  1  | Best throughput  | Random rate       | Best throughput
- *  2  | Random rate      | Best throughput   | Next best throughput
- *  3  | Best probability | Best probability  | Best probability
- *  4  | Lowest base rate | Lowest base rate  | Lowest base rate
- *
- * Note: For clarity, multiple blocks of if's and else's are used
- * After failing max retry times, DoReportFinalDataFailed will be called
- */
-void
-MinstrelWifiManager::UpdateRate (MinstrelWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_longRetry++;
-  station->m_minstrelTable[station->m_txrate].numRateAttempt++;
-
-  NS_LOG_DEBUG ("DoReportDataFailed " << station << " rate " << station->m_txrate << " longRetry " << station->m_longRetry);
-
-  //for normal rate, we're not currently sampling random rates
-  if (!station->m_isSampling)
-    {
-      NS_LOG_DEBUG ("Failed with normal rate: current=" << station->m_txrate << ", sample=" << station->m_sampleRate << ", maxTp=" << station->m_maxTpRate << ", maxTp2=" << station->m_maxTpRate2 << ", maxProb=" << station->m_maxProbRate);
-      //use best throughput rate
-      if (station->m_longRetry < station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount)
-        {
-          NS_LOG_DEBUG (" More retries left for the maximum throughput rate.");
-          station->m_txrate = station->m_maxTpRate;
-        }
-
-      //use second best throughput rate
-      else if (station->m_longRetry <= (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
-                                        station->m_minstrelTable[station->m_maxTpRate2].adjustedRetryCount))
-        {
-          NS_LOG_DEBUG (" More retries left for the second maximum throughput rate.");
-          station->m_txrate = station->m_maxTpRate2;
-        }
-
-      //use best probability rate
-      else if (station->m_longRetry <= (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
-                                        station->m_minstrelTable[station->m_maxTpRate2].adjustedRetryCount +
-                                        station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
-        {
-          NS_LOG_DEBUG (" More retries left for the maximum probability rate.");
-          station->m_txrate = station->m_maxProbRate;
-        }
-
-      //use lowest base rate
-      else if (station->m_longRetry > (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
-                                       station->m_minstrelTable[station->m_maxTpRate2].adjustedRetryCount +
-                                       station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
-        {
-          NS_LOG_DEBUG (" More retries left for the base rate.");
-          station->m_txrate = 0;
-        }
-    }
-
-  //for look-around rate, we're currently sampling random rates
-  else
-    {
-      NS_LOG_DEBUG ("Failed with look around rate: current=" << station->m_txrate << ", sample=" << station->m_sampleRate << ", maxTp=" << station->m_maxTpRate << ", maxTp2=" << station->m_maxTpRate2 << ", maxProb=" << station->m_maxProbRate);
-      //current sampling rate is slower than the current best rate
-      if (station->m_sampleDeferred)
-        {
-          NS_LOG_DEBUG ("Look around rate is slower than the maximum throughput rate.");
-          //use best throughput rate
-          if (station->m_longRetry < station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount)
-            {
-              NS_LOG_DEBUG (" More retries left for the maximum throughput rate.");
-              station->m_txrate = station->m_maxTpRate;
-            }
-
-          //use random rate
-          else if (station->m_longRetry <= (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
-                                            station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount))
-            {
-              NS_LOG_DEBUG (" More retries left for the sampling rate.");
-              station->m_txrate = station->m_sampleRate;
-            }
-
-          //use max probability rate
-          else if (station->m_longRetry <= (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
-                                            station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
-                                            station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount ))
-            {
-              NS_LOG_DEBUG (" More retries left for the maximum probability rate.");
-              station->m_txrate = station->m_maxProbRate;
-            }
-
-          //use lowest base rate
-          else if (station->m_longRetry > (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
-                                           station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
-                                           station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
-            {
-              NS_LOG_DEBUG (" More retries left for the base rate.");
-              station->m_txrate = 0;
-            }
-        }
-      //current sampling rate is better than current best rate
-      else
-        {
-          NS_LOG_DEBUG ("Look around rate is faster than the maximum throughput rate.");
-          //use random rate
-          if (station->m_longRetry < station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount)
-            {
-              NS_LOG_DEBUG (" More retries left for the sampling rate.");
-              station->m_txrate = station->m_sampleRate;
-            }
-
-          //use the best throughput rate
-          else if (station->m_longRetry <= (station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
-                                            station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount))
-            {
-              NS_LOG_DEBUG (" More retries left for the maximum throughput rate.");
-              station->m_txrate = station->m_maxTpRate;
-            }
-
-          //use the best probability rate
-          else if (station->m_longRetry <= (station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
-                                            station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
-                                            station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
-            {
-              NS_LOG_DEBUG (" More retries left for the maximum probability rate.");
-              station->m_txrate = station->m_maxProbRate;
-            }
-
-          //use the lowest base rate
-          else if (station->m_longRetry > (station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
-                                           station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
-                                           station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
-            {
-              NS_LOG_DEBUG (" More retries left for the base rate.");
-              station->m_txrate = 0;
-            }
-        }
-    }
-}
-
-WifiTxVector
-MinstrelWifiManager::GetDataTxVector (MinstrelWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  if (!station->m_initialized)
-    {
-      CheckInit (station);
-    }
-  WifiMode mode = GetSupported (station, station->m_txrate);
-  if (m_currentRate != mode.GetDataRate (channelWidth) && !station->m_isSampling)
-    {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
-    }
-  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-}
-
-WifiTxVector
-MinstrelWifiManager::GetRtsTxVector (MinstrelWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  NS_LOG_DEBUG ("DoGetRtsMode m_txrate=" << station->m_txrate);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiTxVector rtsTxVector;
-  WifiMode mode;
-  if (GetUseNonErpProtection () == false)
-    {
-      mode = GetSupported (station, 0);
-    }
-  else
-    {
-      mode = GetNonErpSupported (station, 0);
-    }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
-}
-
-uint32_t
-MinstrelWifiManager::CountRetries (MinstrelWifiRemoteStation *station)
-{
-  if (!station->m_isSampling)
-    {
-      return station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
-             station->m_minstrelTable[station->m_maxTpRate2].adjustedRetryCount +
-             station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount +
-             station->m_minstrelTable[0].adjustedRetryCount;
-    }
-  else
-    {
-      return station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
-             station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
-             station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount +
-             station->m_minstrelTable[0].adjustedRetryCount;
-    }
-}
-
-uint16_t
-MinstrelWifiManager::FindRate (MinstrelWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-
-  if (station->m_totalPacketsCount == 0)
-    {
-      return 0;
-    }
-
-  uint16_t idx = 0;
-  NS_LOG_DEBUG ("Total: " << station->m_totalPacketsCount << "  Sample: " << station->m_samplePacketsCount << "  Deferred: " << station->m_numSamplesDeferred);
-
-  int delta = (station->m_totalPacketsCount * m_lookAroundRate / 100) - (station->m_samplePacketsCount + station->m_numSamplesDeferred / 2);
-
-  NS_LOG_DEBUG ("Decide sampling. Delta: " << delta << " lookAroundRatio: " <<  m_lookAroundRate);
-
-  /* delta < 0: no sampling required */
-  if (delta >= 0)
-    {
-      NS_LOG_DEBUG ("Search next sampling rate");
-      uint8_t ratesSupported = station->m_nModes;
-      if (delta > ratesSupported * 2)
-        {
-          /* From Linux implementation:
-           * With multi-rate retry, not every planned sample
-           * attempt actually gets used, due to the way the retry
-           * chain is set up - [max_tp,sample,prob,lowest] for
-           * sample_rate < max_tp.
-           *
-           * If there's too much sampling backlog and the link
-           * starts getting worse, minstrel would start bursting
-           * out lots of sampling frames, which would result
-           * in a large throughput loss. */
-          station->m_samplePacketsCount += (delta - ratesSupported * 2);
-        }
-
-      //now go through the table and find an index rate
-      idx = GetNextSample (station);
-
-      NS_LOG_DEBUG ("Sample rate = " << idx << "(" << GetSupported (station, idx) << ")");
-
-      //error check
-      if (idx >= station->m_nModes)
-        {
-          NS_LOG_DEBUG ("ALERT!!! ERROR");
-        }
-
-      //set the rate that we're currently sampling
-      station->m_sampleRate = idx;
-
-      /* From Linux implementation:
-       * Decide if direct ( 1st MRR stage) or indirect (2nd MRR stage)
-       * rate sampling method should be used.
-       * Respect such rates that are not sampled for 20 iterations.
-       */
-      if ((station->m_minstrelTable[idx].perfectTxTime > station->m_minstrelTable[station->m_maxTpRate].perfectTxTime)
-          && (station->m_minstrelTable[idx].numSamplesSkipped < 20))
-        {
-          // If the rate is slower and we have sample it enough, defer to second stage
-          station->m_sampleDeferred = true;
-          station->m_numSamplesDeferred++;
-
-          //set flag that we are currently sampling
-          station->m_isSampling = true;
-        }
-      else
-        {
-          // if samplieLimit is zero, then don't sample this rate
-          if (!station->m_minstrelTable[idx].sampleLimit)
-            {
-              idx = station->m_maxTpRate;
-              station->m_isSampling = false;
-            }
-          else
-            {
-              //set flag that we are currently sampling
-              station->m_isSampling = true;
-              if (station->m_minstrelTable[idx].sampleLimit > 0)
-                {
-                  station->m_minstrelTable[idx].sampleLimit--;
-                }
-            }
-        }
-
-      //using the best rate instead
-      if (station->m_sampleDeferred)
-        {
-          NS_LOG_DEBUG ("The next look around rate is slower than the maximum throughput rate, continue with the maximum throughput rate: " << station->m_maxTpRate << "(" << GetSupported (station, station->m_maxTpRate) << ")");
-          idx = station->m_maxTpRate;
-        }
-    }
-  //continue using the best rate
-  else
-    {
-      NS_LOG_DEBUG ("Continue using the maximum throughput rate: " << station->m_maxTpRate << "(" << GetSupported (station, station->m_maxTpRate) << ")");
-      idx = station->m_maxTpRate;
-    }
-
-  NS_LOG_DEBUG ("Rate = " << idx << "(" << GetSupported (station, idx) << ")");
-
-  return idx;
-}
-
-void
-MinstrelWifiManager::UpdateStats (MinstrelWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  if (Simulator::Now () <  station->m_nextStatsUpdate)
-    {
-      return;
-    }
-
-  if (!station->m_initialized)
-    {
-      return;
-    }
-  NS_LOG_FUNCTION (this);
-  station->m_nextStatsUpdate = Simulator::Now () + m_updateStats;
-  NS_LOG_DEBUG ("Next update at " << station->m_nextStatsUpdate);
-  NS_LOG_DEBUG ("Currently using rate: " << station->m_txrate << " (" << GetSupported (station, station->m_txrate) << ")");
-
-  Time txTime;
-  uint32_t tempProb;
-
-  NS_LOG_DEBUG ("Index-Rate\t\tAttempt\tSuccess");
-  for (uint8_t i = 0; i < station->m_nModes; i++)
-    {
-
-      //calculate the perfect TX time for this rate
-      txTime = station->m_minstrelTable[i].perfectTxTime;
-
-      //just for initialization
-      if (txTime.GetMicroSeconds () == 0)
-        {
-          txTime = Seconds (1);
-        }
-
-      NS_LOG_DEBUG (+i << " " << GetSupported (station, i) <<
-                    "\t" << station->m_minstrelTable[i].numRateAttempt <<
-                    "\t" << station->m_minstrelTable[i].numRateSuccess);
-
-      //if we've attempted something
-      if (station->m_minstrelTable[i].numRateAttempt)
-        {
-          station->m_minstrelTable[i].numSamplesSkipped = 0;
-          /**
-           * calculate the probability of success
-           * assume probability scales from 0 to 18000
-           */
-          tempProb = (station->m_minstrelTable[i].numRateSuccess * 18000) / station->m_minstrelTable[i].numRateAttempt;
-
-          //bookkeeping
-          station->m_minstrelTable[i].prob = tempProb;
-
-          if (station->m_minstrelTable[i].successHist == 0)
-            {
-              station->m_minstrelTable[i].ewmaProb = tempProb;
-            }
-          else
-            {
-              //EWMA probability (cast for gcc 3.4 compatibility)
-              tempProb = ((tempProb * (100 - m_ewmaLevel)) + (station->m_minstrelTable[i].ewmaProb * m_ewmaLevel) ) / 100;
-
-              station->m_minstrelTable[i].ewmaProb = tempProb;
-            }
-
-          //calculating throughput
-          station->m_minstrelTable[i].throughput = tempProb * static_cast<uint32_t> ((1000000 / txTime.GetMicroSeconds ()));
-        }
-      else
-        {
-          station->m_minstrelTable[i].numSamplesSkipped++;
-        }
-
-      //bookkeeping
-      station->m_minstrelTable[i].successHist += station->m_minstrelTable[i].numRateSuccess;
-      station->m_minstrelTable[i].attemptHist += station->m_minstrelTable[i].numRateAttempt;
-      station->m_minstrelTable[i].prevNumRateSuccess = station->m_minstrelTable[i].numRateSuccess;
-      station->m_minstrelTable[i].prevNumRateAttempt = station->m_minstrelTable[i].numRateAttempt;
-      station->m_minstrelTable[i].numRateSuccess = 0;
-      station->m_minstrelTable[i].numRateAttempt = 0;
-
-      //Sample less often below 10% and  above 95% of success
-      if ((station->m_minstrelTable[i].ewmaProb > 17100) || (station->m_minstrelTable[i].ewmaProb < 1800))
-        {
-          /**
-           * See: http://wireless.kernel.org/en/developers/Documentation/mac80211/RateControl/minstrel/
-           *
-           * Analysis of information showed that the system was sampling too hard at some rates.
-           * For those rates that never work (54mb, 500m range) there is no point in retrying 10 sample packets (< 6 ms time).
-           * Consequently, for the very low probability rates, we try at most twice when fails and not sample more than 4 times.
-           */
-          if (station->m_minstrelTable[i].retryCount > 2)
-            {
-              station->m_minstrelTable[i].adjustedRetryCount = 2;
-            }
-          station->m_minstrelTable[i].sampleLimit = 4;
-        }
-      else
-        {
-          // no sampling limit.
-          station->m_minstrelTable[i].sampleLimit = -1;
-          station->m_minstrelTable[i].adjustedRetryCount = station->m_minstrelTable[i].retryCount;
-        }
-
-      //if it's 0 allow two retries.
-      if (station->m_minstrelTable[i].adjustedRetryCount == 0)
-        {
-          station->m_minstrelTable[i].adjustedRetryCount = 2;
-        }
-    }
-
-  NS_LOG_DEBUG ("Attempt/success reset to 0");
-
-  uint32_t max_tp = 0;
-  uint8_t index_max_tp = 0, index_max_tp2 = 0;
-
-  //go find max throughput, second maximum throughput, high probability of success
-  NS_LOG_DEBUG ("Finding the maximum throughput, second maximum throughput, and highest probability");
-  NS_LOG_DEBUG ("Index-Rate\t\tT-put\tEWMA");
-  for (uint8_t i = 0; i < station->m_nModes; i++)
-    {
-      NS_LOG_DEBUG (+i << " " << GetSupported (station, i) <<
-                    "\t" << station->m_minstrelTable[i].throughput <<
-                    "\t" << station->m_minstrelTable[i].ewmaProb);
-
-      if (max_tp < station->m_minstrelTable[i].throughput)
-        {
-          index_max_tp = i;
-          max_tp = station->m_minstrelTable[i].throughput;
-        }
-    }
-
-  max_tp = 0;
-  //find the second highest max
-  for (uint8_t i = 0; i < station->m_nModes; i++)
-    {
-      if ((i != index_max_tp) && (max_tp < station->m_minstrelTable[i].throughput))
-        {
-          index_max_tp2 = i;
-          max_tp = station->m_minstrelTable[i].throughput;
-        }
-    }
-
-  uint32_t max_prob = 0;
-  uint8_t index_max_prob = 0;
-  for (uint8_t i = 0; i < station->m_nModes; i++)
-    {
-      if ((station->m_minstrelTable[i].ewmaProb >= 95 * 180) && (station->m_minstrelTable[i].throughput >= station->m_minstrelTable[index_max_prob].throughput))
-        {
-          index_max_prob = i;
-          max_prob = station->m_minstrelTable[i].ewmaProb;
-        }
-      else if (station->m_minstrelTable[i].ewmaProb >= max_prob)
-        {
-          index_max_prob = i;
-          max_prob = station->m_minstrelTable[i].ewmaProb;
-        }
-    }
-
-  station->m_maxTpRate = index_max_tp;
-  station->m_maxTpRate2 = index_max_tp2;
-  station->m_maxProbRate = index_max_prob;
-
-  if (index_max_tp > station->m_txrate)
-    {
-      station->m_txrate = index_max_tp;
-    }
-
-  NS_LOG_DEBUG ("max throughput=" << +index_max_tp << "(" << GetSupported (station, index_max_tp) <<
-                ")\tsecond max throughput=" << +index_max_tp2 << "(" << GetSupported (station, index_max_tp2) <<
-                ")\tmax prob=" << +index_max_prob << "(" << GetSupported (station, index_max_prob) << ")");
-  if (m_printStats)
-    {
-      PrintTable (station);
-    }
-  if (m_printSamples)
-    {
-      PrintSampleTable (station);
-    }
-}
-
-void
-MinstrelWifiManager::DoReportRxOk (WifiRemoteStation *st, double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << st << rxSnr << txMode);
-  NS_LOG_DEBUG ("DoReportRxOk m_txrate=" << static_cast<MinstrelWifiRemoteStation*> (st)->m_txrate);
-}
-
-void
-MinstrelWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
-  NS_LOG_DEBUG ("DoReportRtsFailed m_txrate=" << station->m_txrate);
-  station->m_shortRetry++;
-}
-
-void
-MinstrelWifiManager::DoReportRtsOk (WifiRemoteStation *st, double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
-}
-
-void
-MinstrelWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
-  UpdateRetry (station);
-}
-
-void
-MinstrelWifiManager::DoReportDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
-  NS_LOG_DEBUG ("DoReportDataFailed " << station << "\t rate " << station->m_txrate << "\tlongRetry \t" << station->m_longRetry);
-  CheckInit (station);
-  if (!station->m_initialized)
-    {
-      return;
-    }
-
-  UpdateRate (station);
-}
-
-void
-MinstrelWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                     double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
-  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
-
-  CheckInit (station);
-  if (!station->m_initialized)
-    {
-      return;
-    }
-
-  NS_LOG_DEBUG ("DoReportDataOk m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (before update).");
-
-  station->m_minstrelTable[station->m_txrate].numRateSuccess++;
-  station->m_minstrelTable[station->m_txrate].numRateAttempt++;
-
-  UpdatePacketCounters (station);
-
-  NS_LOG_DEBUG ("DoReportDataOk m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (after update).");
-
-  UpdateRetry (station);
-  UpdateStats (station);
-
-  if (station->m_nModes >= 1)
-    {
-      station->m_txrate = FindRate (station);
-    }
-  NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate);
-}
-
-void
-MinstrelWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
-
-  CheckInit (station);
-  if (!station->m_initialized)
-    {
-      return;
-    }
-
-  NS_LOG_DEBUG ("DoReportFinalDataFailed m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (before update).");
-
-  UpdatePacketCounters (station);
-
-  UpdateRetry (station);
-  UpdateStats (station);
-
-  NS_LOG_DEBUG ("DoReportFinalDataFailed m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (after update).");
-
-  if (station->m_nModes >= 1)
-    {
-      station->m_txrate = FindRate (station);
-    }
-  NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate);
-}
-
-void
-MinstrelWifiManager::UpdatePacketCounters (MinstrelWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-
-  station->m_totalPacketsCount++;
-  // If it is a sampling frame and the sampleRate was used, increase counter
-  if (station->m_isSampling && (!station->m_sampleDeferred || station->m_longRetry >= station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount))
-    {
-      station->m_samplePacketsCount++;
-    }
-
-  if (station->m_numSamplesDeferred > 0)
-    {
-      station->m_numSamplesDeferred--;
-    }
-
-  if (station->m_totalPacketsCount == ~0)
-    {
-      station->m_numSamplesDeferred = 0;
-      station->m_samplePacketsCount = 0;
-      station->m_totalPacketsCount = 0;
-    }
-  station->m_isSampling = false;
-  station->m_sampleDeferred = false;
-}
-
-void
-MinstrelWifiManager::UpdateRetry (MinstrelWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_retry = station->m_shortRetry + station->m_longRetry;
-  station->m_shortRetry = 0;
-  station->m_longRetry = 0;
-}
-
-WifiTxVector
-MinstrelWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
-  return GetDataTxVector (station);
-}
-
-WifiTxVector
-MinstrelWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
-  return GetRtsTxVector (station);
-}
-
-bool
-MinstrelWifiManager::DoNeedRetransmission (WifiRemoteStation *st, Ptr<const Packet> packet, bool normally)
-{
-  NS_LOG_FUNCTION (this << st << packet << normally);
-  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
-
-  CheckInit (station);
-  if (!station->m_initialized)
-    {
-      return normally;
-    }
-  if (station->m_longRetry >= CountRetries (station))
-    {
-      NS_LOG_DEBUG ("No re-transmission allowed. Retries: " <<  station->m_longRetry << " Max retries: " << CountRetries (station));
-      return false;
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Re-transmit. Retries: " <<  station->m_longRetry << " Max retries: " << CountRetries (station));
-      return true;
-    }
-}
-
-uint16_t
-MinstrelWifiManager::GetNextSample (MinstrelWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  uint16_t bitrate;
-  bitrate = station->m_sampleTable[station->m_index][station->m_col];
-  station->m_index++;
-
-  //bookkeeping for m_index and m_col variables
-  NS_ABORT_MSG_IF (station->m_nModes < 2, "Integer overflow detected");
-  if (station->m_index > station->m_nModes - 2)
-    {
-      station->m_index = 0;
-      station->m_col++;
-      if (station->m_col >= m_sampleCol)
-        {
-          station->m_col = 0;
-        }
-    }
-  return bitrate;
-}
-
-void
-MinstrelWifiManager::RateInit (MinstrelWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  for (uint8_t i = 0; i < station->m_nModes; i++)
-    {
-      NS_LOG_DEBUG ("Initializing rate index " << +i << " " << GetSupported (station, i));
-      station->m_minstrelTable[i].numRateAttempt = 0;
-      station->m_minstrelTable[i].numRateSuccess = 0;
-      station->m_minstrelTable[i].prevNumRateSuccess = 0;
-      station->m_minstrelTable[i].prevNumRateAttempt = 0;
-      station->m_minstrelTable[i].successHist = 0;
-      station->m_minstrelTable[i].attemptHist = 0;
-      station->m_minstrelTable[i].numSamplesSkipped = 0;
-      station->m_minstrelTable[i].prob = 0;
-      station->m_minstrelTable[i].ewmaProb = 0;
-      station->m_minstrelTable[i].throughput = 0;
-      station->m_minstrelTable[i].perfectTxTime = GetCalcTxTime (GetSupported (station, i));
-      NS_LOG_DEBUG (" perfectTxTime = " << station->m_minstrelTable[i].perfectTxTime);
-      station->m_minstrelTable[i].retryCount = 1;
-      station->m_minstrelTable[i].adjustedRetryCount = 1;
-      //Emulating minstrel.c::ath_rate_ctl_reset
-      //We only check from 2 to 10 retries. This guarantee that
-      //at least one retry is permitted.
-      Time totalTxTimeWithGivenRetries = Seconds (0.0); //tx_time in minstrel.c
-      NS_LOG_DEBUG (" Calculating the number of retries");
-      for (uint32_t retries = 2; retries < 11; retries++)
-        {
-          NS_LOG_DEBUG ("  Checking " << retries << " retries");
-          totalTxTimeWithGivenRetries = CalculateTimeUnicastPacket (station->m_minstrelTable[i].perfectTxTime, 0, retries);
-          NS_LOG_DEBUG ("   totalTxTimeWithGivenRetries = " << totalTxTimeWithGivenRetries);
-          if (totalTxTimeWithGivenRetries > MilliSeconds (6))
-            {
-              break;
-            }
-          station->m_minstrelTable[i].sampleLimit = -1;
-          station->m_minstrelTable[i].retryCount = retries;
-          station->m_minstrelTable[i].adjustedRetryCount = retries;
-        }
-    }
-  UpdateStats (station);
-}
-
-Time
-MinstrelWifiManager::CalculateTimeUnicastPacket (Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries)
-{
-  NS_LOG_FUNCTION (this << dataTransmissionTime << shortRetries << longRetries);
-  //See rc80211_minstrel.c
-
-  //First transmission (Data + Ack timeout)
-  Time tt = dataTransmissionTime + GetPhy ()->GetSifs () + GetPhy ()->GetAckTxTime ();
-
-  uint32_t cwMax = 1023;
-  uint32_t cw = 31;
-  for (uint32_t retry = 0; retry < longRetries; retry++)
-    {
-      //Add one re-transmission (Data + Ack timeout)
-      tt += dataTransmissionTime + GetPhy ()->GetSifs () + GetPhy ()->GetAckTxTime ();
-
-      //Add average back off (half the current contention window)
-      tt += (cw / 2.0) * GetPhy ()->GetSlot ();
-
-      //Update contention window
-      cw = std::min (cwMax, (cw + 1) * 2);
-    }
-
-  return tt;
-}
-
-void
-MinstrelWifiManager::InitSampleTable (MinstrelWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_col = station->m_index = 0;
-
-  //for off-setting to make rates fall between 0 and nModes
-  uint8_t numSampleRates = station->m_nModes;
-
-  uint16_t newIndex;
-  for (uint8_t col = 0; col < m_sampleCol; col++)
-    {
-      for (uint8_t i = 0; i < numSampleRates; i++ )
-        {
-          /**
-           * The next two lines basically tries to generate a random number
-           * between 0 and the number of available rates
-           */
-          int uv = m_uniformRandomVariable->GetInteger (0, numSampleRates);
-          NS_LOG_DEBUG ("InitSampleTable uv: " << uv);
-          newIndex = (i + uv) % numSampleRates;
-
-          //this loop is used for filling in other uninitialized places
-          while (station->m_sampleTable[newIndex][col] != 0)
-            {
-              newIndex = (newIndex + 1) % station->m_nModes;
-            }
-          station->m_sampleTable[newIndex][col] = i;
-        }
-    }
-}
-
-void
-MinstrelWifiManager::PrintSampleTable (MinstrelWifiRemoteStation *station)
-{
-  uint8_t numSampleRates = station->m_nModes;
-  std::stringstream table;
-  for (uint8_t i = 0; i < numSampleRates; i++)
-    {
-      for (uint8_t j = 0; j < m_sampleCol; j++)
-        {
-          table << station->m_sampleTable[i][j] << "\t";
-        }
-      table << std::endl;
-    }
-  NS_LOG_DEBUG (table.str ());
-}
-
-void
-MinstrelWifiManager::PrintTable (MinstrelWifiRemoteStation *station)
-{
-  if (!station->m_statsFile.is_open ())
-    {
-      std::ostringstream tmp;
-      tmp << "minstrel-stats-" << station->m_state->m_address << ".txt";
-      station->m_statsFile.open (tmp.str ().c_str (), std::ios::out);
-    }
-
-  station->m_statsFile << "best   _______________rate________________    ________statistics________    ________last_______    ______sum-of________\n" <<
-    "rate  [      name       idx airtime max_tp]  [avg(tp) avg(prob) sd(prob)]  [prob.|retry|suc|att]  [#success | #attempts]\n";
-
-  uint16_t maxTpRate = station->m_maxTpRate;
-  uint16_t maxTpRate2 = station->m_maxTpRate2;
-  uint16_t maxProbRate = station->m_maxProbRate;
-
-  for (uint8_t i = 0; i < station->m_nModes; i++)
-    {
-      RateInfo rate = station->m_minstrelTable[i];
-
-      if (i == maxTpRate)
-        {
-          station->m_statsFile << 'A';
-        }
-      else
-        {
-          station->m_statsFile << ' ';
-        }
-      if (i == maxTpRate2)
-        {
-          station->m_statsFile << 'B';
-        }
-      else
-        {
-          station->m_statsFile << ' ';
-        }
-      if (i == maxProbRate)
-        {
-          station->m_statsFile << 'P';
-        }
-      else
-        {
-          station->m_statsFile << ' ';
-        }
-
-      float tmpTh = rate.throughput / 100000.0f;
-      station->m_statsFile << "   " <<
-        std::setw (17) << GetSupported (station, i) << "  " <<
-        std::setw (2) << i << "  " <<
-        std::setw (4) << rate.perfectTxTime.GetMicroSeconds () <<
-        std::setw (8) << "    -----    " <<
-        std::setw (8) << tmpTh << "    " <<
-        std::setw (3) << rate.ewmaProb / 180 <<
-        std::setw (3) << "       ---      " <<
-        std::setw (3) << rate.prob / 180 << "     " <<
-        std::setw (1) << rate.adjustedRetryCount << "   " <<
-        std::setw (3) << rate.prevNumRateSuccess << " " <<
-        std::setw (3) << rate.prevNumRateAttempt << "   " <<
-        std::setw (9) << rate.successHist << "   " <<
-        std::setw (9) << rate.attemptHist << "\n";
-    }
-  station->m_statsFile << "\nTotal packet count:    ideal " << station->m_totalPacketsCount - station->m_samplePacketsCount
-                       << "      lookaround " << station->m_samplePacketsCount << "\n\n";
-
-  station->m_statsFile.flush ();
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/minstrel-wifi-manager.h ns-3.34/src/wifi/model/minstrel-wifi-manager.h
--- ns-3.33/src/wifi/model/minstrel-wifi-manager.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/minstrel-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,369 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2009 Duy Nguyen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Authors: Duy Nguyen <duy@soe.ucsc.edu>
- *          Matías Richart <mrichart@fing.edu.uy>
- */
-
-#ifndef MINSTREL_WIFI_MANAGER_H
-#define MINSTREL_WIFI_MANAGER_H
-
-#include "ns3/traced-value.h"
-#include "wifi-remote-station-manager.h"
-#include <fstream>
-#include <map>
-
-namespace ns3 {
-
-class UniformRandomVariable;
-
-/**
- * A struct to contain all information related to a data rate
- */
-struct RateInfo
-{
-  /**
-   * Perfect transmission time calculation, or frame calculation
-   * Given a bit rate and a packet length n bytes
-   */
-  Time perfectTxTime;
-
-  uint32_t retryCount;          ///< retry limit
-  uint32_t adjustedRetryCount;  ///< adjust the retry limit for this rate
-  uint32_t numRateAttempt;      ///< how many number of attempts so far
-  uint32_t numRateSuccess;      ///< number of successful packets
-  uint32_t prob;                ///< (# packets success)/(# total packets)
-  /**
-   * EWMA calculation
-   * ewma_prob =[prob *(100 - ewma_level) + (ewma_prob_old * ewma_level)]/100
-   */
-  uint32_t ewmaProb;
-  uint32_t throughput;  ///< throughput of a rate in bps
-
-  uint32_t prevNumRateAttempt;  //!< Number of transmission attempts with previous rate.
-  uint32_t prevNumRateSuccess;  //!< Number of successful frames transmitted with previous rate.
-  uint64_t successHist;         //!< Aggregate of all transmission successes.
-  uint64_t attemptHist;         //!< Aggregate of all transmission attempts.
-
-  uint8_t numSamplesSkipped; //!< number of samples skipped
-  int sampleLimit; //!< sample limit
-};
-
-/**
- * Data structure for a Minstrel Rate table
- * A vector of a struct RateInfo
- */
-typedef std::vector<RateInfo> MinstrelRate;
-/**
- * Data structure for a Sample Rate table
- * A vector of a vector uint8_t
- */
-typedef std::vector<std::vector<uint8_t> > SampleRate;
-
-/**
- * \brief hold per-remote-station state for Minstrel Wifi manager.
- *
- * This struct extends from WifiRemoteStation struct to hold additional
- * information required by the Minstrel Wifi manager
- */
-struct MinstrelWifiRemoteStation : public WifiRemoteStation
-{
-  Time m_nextStatsUpdate;  ///< 10 times every second
-
-  /**
-   * To keep track of the current position in the our random sample table
-   * going row by row from 1st column until the 10th column(Minstrel defines 10)
-   * then we wrap back to the row 1 column 1.
-   * note: there are many other ways to do this.
-   */
-  uint8_t m_col;                 ///< column index
-  uint8_t m_index;               ///< vector index
-  uint16_t m_maxTpRate;          ///< the current throughput rate in bps
-  uint16_t m_maxTpRate2;         ///< second highest throughput rate in bps
-  uint16_t m_maxProbRate;        ///< rate with highest probability of success in bps
-  uint8_t m_nModes;              ///< number of modes supported
-  int m_totalPacketsCount;       ///< total number of packets as of now
-  int m_samplePacketsCount;      ///< how many packets we have sample so far
-  int m_numSamplesDeferred;      ///< number samples deferred
-  bool m_isSampling;             ///< a flag to indicate we are currently sampling
-  uint16_t m_sampleRate;         ///< current sample rate in bps
-  bool m_sampleDeferred;         ///< a flag to indicate sample rate is on the second stage
-  uint32_t m_shortRetry;         ///< short retries such as control packets
-  uint32_t m_longRetry;          ///< long retries such as data packets
-  uint32_t m_retry;              ///< total retries short + long
-  uint16_t m_txrate;             ///< current transmit rate in bps
-  bool m_initialized;            ///< for initializing tables
-  MinstrelRate m_minstrelTable;  ///< minstrel table
-  SampleRate m_sampleTable;      ///< sample table
-  std::ofstream m_statsFile;     ///< stats file
-};
-
-
-/**
- * \brief Implementation of Minstrel Rate Control Algorithm
- * \ingroup wifi
- *
- * Minstrel is a rate control algorithm implemented in MadWifi and Linux.
- * The basic principle is to probe the environment and adapt the rate
- * based on statistics collected on the probability of successful
- * transmission.  The algorithm adapts the rate to the highest rate
- * that it considers successful, and spends a fraction of its time
- * doing 'look around' by trying other rates.
- *
- * Minstrel is appropriate for non-HT configurations; for HT (i.e. 802.11n
- * or higher), users should use MinstrelHtWifiManager instead.
- * Minstrel will error exit if the user tries to configure it with a
- * Wi-Fi MAC that supports 802.11n or higher.
- *
- * Some notes on this implementation follow.  The implementation has
- * been adapted to bring it closer to the Linux implementation.
- * For each rate, a new parameter samplesSkipped is added. This parameter
- * is intended to solve an issue regarding the sampling of low rates when
- * a high rate is working well, which leads to outdated statistics.
- * This change makes throughput a bit lower in simple, stable scenarios,
- * but may help in dynamic scenarios to react faster and more accurately
- * to changes.
- *
- * Related to the previous, the logic for deciding when to sample random
- * rates is as follows.  When a sample rate is deferred to the second MRR
- * chain stage, a new parameter (numSamplesDeferred) is increased. This
- * parameters is used (jointly with sampleCount) to compare current
- * sample count with the lookaround rate.
- *
- * Also related with sampling, another parameter sampleLimit is added.
- * This parameter limits the number of times a very low or very high
- * probability rate is sampled, avoiding to try a poorly working sample
- * rate too often.
- *
- * When updating the EWMA probability of a rate for the first time, it does
- * not apply EWMA but instead assigns the entire probability.
- * Since the EWMA probability is initialized to zero, this generates
- * a more accurate EWMA.
- */
-class MinstrelWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  MinstrelWifiManager ();
-  virtual ~MinstrelWifiManager ();
-
-  // Inherited from WifiRemoteStationManager
-  void SetupPhy (const Ptr<WifiPhy> phy);
-  void SetupMac (const Ptr<WifiMac> mac);
-
-  /**
-   * Assign a fixed random variable stream number to the random variables
-   * used by this model.  Return the number of streams (possibly zero) that
-   * have been assigned.
-   *
-   * \param stream first stream index to use
-   *
-   * \return the number of stream indices assigned by this model
-   */
-  int64_t AssignStreams (int64_t stream);
-
-  /**
-   * Update the rate.
-   *
-   * \param station the station object
-   */
-  void UpdateRate (MinstrelWifiRemoteStation *station);
-
-  /**
-   * Update the Minstrel Table.
-   *
-   * \param station the station object
-   */
-  void UpdateStats (MinstrelWifiRemoteStation *station);
-
-  /**
-   * Find a rate to use from Minstrel Table.
-   *
-   * \param station the station object
-   * \returns the rate in bps
-   */
-  uint16_t FindRate (MinstrelWifiRemoteStation *station);
-
-  /**
-   * Get data transmit vector.
-   *
-   * \param station the station object
-   * \returns WifiTxVector
-   */
-  WifiTxVector GetDataTxVector (MinstrelWifiRemoteStation *station);
-
-  /**
-   * Get RTS transmit vector.
-   *
-   * \param station the station object
-   * \returns WifiTxVector
-   */
-  WifiTxVector GetRtsTxVector (MinstrelWifiRemoteStation *station);
-
-  /**
-   * Get the number of retries.
-   *
-   * \param station the station object
-   * \returns the number of retries
-   */
-  uint32_t CountRetries (MinstrelWifiRemoteStation *station);
-
-  /**
-   * Update packet counters.
-   *
-   * \param station the station object
-   */
-  void UpdatePacketCounters (MinstrelWifiRemoteStation *station);
-
-  /**
-   * Update the number of retries and reset accordingly.
-   *
-   * \param station the station object
-   */
-  void UpdateRetry (MinstrelWifiRemoteStation *station);
-
-  /**
-   * Check for initializations.
-   *
-   * \param station the station object
-   */
-  void CheckInit (MinstrelWifiRemoteStation *station);
-
-  /**
-   * Initialize Sample Table.
-   *
-   * \param station the station object
-   */
-  void InitSampleTable (MinstrelWifiRemoteStation *station);
-
-private:
-  // Overridden from base class.
-  void DoInitialize (void);
-  WifiRemoteStation * DoCreateStation (void) const;
-  void DoReportRxOk (WifiRemoteStation *station,
-                     double rxSnr, WifiMode txMode);
-  void DoReportRtsFailed (WifiRemoteStation *station);
-  void DoReportDataFailed (WifiRemoteStation *station);
-  void DoReportRtsOk (WifiRemoteStation *station,
-                      double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  void DoReportFinalDataFailed (WifiRemoteStation *station);
-  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-
-  bool DoNeedRetransmission (WifiRemoteStation *st,
-                                 Ptr<const Packet> packet, bool normally);
-
-
-  /**
-   * Estimate the TxTime of a packet with a given mode.
-   *
-   * \param mode Wi-Fi mode
-   * \returns the transmission time
-   */
-  Time GetCalcTxTime (WifiMode mode) const;
-  /**
-   * Add transmission time for the given mode to an internal list.
-   *
-   * \param mode Wi-Fi mode
-   * \param t transmission time
-   */
-  void AddCalcTxTime (WifiMode mode, Time t);
-
-  /**
-   * Initialize Minstrel Table.
-   *
-   * \param station the station object
-   */
-  void RateInit (MinstrelWifiRemoteStation *station);
-
-  /**
-   * Get the next sample from Sample Table.
-   *
-   * \param station the station object
-   * \returns the next sample
-   */
-  uint16_t GetNextSample (MinstrelWifiRemoteStation *station);
-
-  /**
-   * Estimate the time to transmit the given packet with the given number of retries.
-   * This function is "roughly" the function "calc_usecs_unicast_packet" in minstrel.c
-   * in the madwifi implementation.
-   *
-   * The basic idea is that, we try to estimate the "average" time used to transmit the
-   * packet for the given number of retries while also accounting for the 802.11 congestion
-   * window change. The original code in the madwifi seems to estimate the number of backoff
-   * slots as the half of the current CW size.
-   *
-   * There are four main parts:
-   *  - wait for DIFS (sense idle channel)
-   *  - Ack timeouts
-   *  - Data transmission
-   *  - backoffs according to CW
-   *
-   * \param dataTransmissionTime the data transmission time
-   * \param shortRetries short retries
-   * \param longRetries long retries
-   * \returns the unicast packet time
-   */
-  Time CalculateTimeUnicastPacket (Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries);
-
-  /**
-   * Print Sample Table.
-   *
-   * \param station the station object
-   */
-  void PrintSampleTable (MinstrelWifiRemoteStation *station);
-
-  /**
-   * Print Minstrel Table.
-   *
-   * \param station the station object
-   */
-  void PrintTable (MinstrelWifiRemoteStation *station);
-
-  /**
-   * typedef for a vector of a pair of Time, WifiMode.
-   * Essentially a map from WifiMode to its corresponding transmission time
-   * to transmit a reference packet.
-   */
-  typedef std::map<WifiMode, Time> TxTime;
-
-  TxTime m_calcTxTime;      ///< to hold all the calculated TxTime for all modes
-  Time m_updateStats;       ///< how frequent do we calculate the stats
-  uint8_t m_lookAroundRate; ///< the % to try other rates than our current rate
-  uint8_t m_ewmaLevel;      ///< exponential weighted moving average
-  uint8_t m_sampleCol;      ///< number of sample columns
-  uint32_t m_pktLen;        ///< packet length used for calculate mode TxTime
-  bool m_printStats;        ///< whether statistics table should be printed.
-  bool m_printSamples;      ///< whether samples table should be printed.
-
-  /// Provides uniform random variables.
-  Ptr<UniformRandomVariable> m_uniformRandomVariable;
-
-  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
-};
-
-} //namespace ns3
-
-#endif /* MINSTREL_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/mpdu-aggregator.cc ns-3.34/src/wifi/model/mpdu-aggregator.cc
--- ns-3.33/src/wifi/model/mpdu-aggregator.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/mpdu-aggregator.cc	2021-07-14 10:31:07.000000000 -0700
@@ -26,17 +26,17 @@
 #include "wifi-phy.h"
 #include "wifi-tx-vector.h"
 #include "wifi-remote-station-manager.h"
-#include "mac-low.h"
 #include "wifi-mac-queue-item.h"
 #include "wifi-mac-queue.h"
 #include "msdu-aggregator.h"
 #include "wifi-net-device.h"
-#include "ht-capabilities.h"
-#include "vht-capabilities.h"
-#include "he-capabilities.h"
-#include "wifi-mac.h"
+#include "ns3/ht-capabilities.h"
+#include "ns3/vht-capabilities.h"
+#include "ns3/he-capabilities.h"
+#include "regular-wifi-mac.h"
 #include "ctrl-headers.h"
 #include "wifi-mac-trailer.h"
+#include "wifi-tx-parameters.h"
 
 NS_LOG_COMPONENT_DEFINE ("MpduAggregator");
 
@@ -64,9 +64,17 @@
 }
 
 void
-MpduAggregator::SetEdcaQueues (EdcaQueues edcaQueues)
+MpduAggregator::DoDispose ()
 {
-    m_edca = edcaQueues;
+  m_mac = 0;
+  Object::DoDispose ();
+}
+
+void
+MpduAggregator::SetWifiMac (const Ptr<RegularWifiMac> mac)
+{
+  NS_LOG_FUNCTION (this << mac);
+  m_mac = mac;
 }
 
 void
@@ -116,11 +124,6 @@
   NS_LOG_FUNCTION (this << recipient << +tid << modulation);
 
   AcIndex ac = QosUtilsMapTidToAc (tid);
-  Ptr<QosTxop> qosTxop = m_edca.find (ac)->second;
-  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (qosTxop->GetLow ()->GetPhy ()->GetDevice ());
-  NS_ASSERT (device);
-  Ptr<WifiRemoteStationManager> stationManager = device->GetRemoteStationManager ();
-  NS_ASSERT (stationManager);
 
   // Find the A-MPDU max size configured on this device
   UintegerValue size;
@@ -128,16 +131,16 @@
   switch (ac)
     {
       case AC_BE:
-        device->GetMac ()->GetAttribute ("BE_MaxAmpduSize", size);
+        m_mac->GetAttribute ("BE_MaxAmpduSize", size);
         break;
       case AC_BK:
-        device->GetMac ()->GetAttribute ("BK_MaxAmpduSize", size);
+        m_mac->GetAttribute ("BK_MaxAmpduSize", size);
         break;
       case AC_VI:
-        device->GetMac ()->GetAttribute ("VI_MaxAmpduSize", size);
+        m_mac->GetAttribute ("VI_MaxAmpduSize", size);
         break;
       case AC_VO:
-        device->GetMac ()->GetAttribute ("VO_MaxAmpduSize", size);
+        m_mac->GetAttribute ("VO_MaxAmpduSize", size);
         break;
       default:
         NS_ABORT_MSG ("Unknown AC " << ac);
@@ -152,6 +155,9 @@
       return 0;
     }
 
+  Ptr<WifiRemoteStationManager> stationManager = m_mac->GetWifiRemoteStationManager ();
+  NS_ASSERT (stationManager);
+
   // Retrieve the Capabilities elements advertised by the recipient
   Ptr<const HeCapabilities> heCapabilities = stationManager->GetStationHeCapabilities (recipient);
   Ptr<const VhtCapabilities> vhtCapabilities = stationManager->GetStationVhtCapabilities (recipient);
@@ -206,64 +212,33 @@
 }
 
 std::vector<Ptr<WifiMacQueueItem>>
-MpduAggregator::GetNextAmpdu (Ptr<const WifiMacQueueItem> mpdu, WifiTxVector txVector,
-                              Time ppduDurationLimit) const
+MpduAggregator::GetNextAmpdu (Ptr<WifiMacQueueItem> mpdu, WifiTxParameters& txParams,
+                              Time availableTime, WifiMacQueueItem::QueueIteratorPair queueIt) const
 {
-  NS_LOG_FUNCTION (this << *mpdu << ppduDurationLimit);
-  std::vector<Ptr<WifiMacQueueItem>> mpduList;
-  Mac48Address recipient = mpdu->GetHeader ().GetAddr1 ();
+  NS_LOG_FUNCTION (this << *mpdu << &txParams << availableTime);
 
-  NS_ASSERT (mpdu->GetHeader ().IsQosData () && !recipient.IsGroup ());
-
-  uint8_t tid = GetTid (mpdu->GetPacket (), mpdu->GetHeader ());
-  auto edcaIt = m_edca.find (QosUtilsMapTidToAc (tid));
-  NS_ASSERT (edcaIt != m_edca.end ());
+  std::vector<Ptr<WifiMacQueueItem>> mpduList;
 
-  WifiModulationClass modulation = txVector.GetMode ().GetModulationClass ();
-  uint32_t maxAmpduSize = GetMaxAmpduSize (recipient, tid, modulation);
+  Mac48Address recipient = mpdu->GetHeader ().GetAddr1 ();
+  NS_ASSERT (mpdu->GetHeader ().IsQosData () && !recipient.IsBroadcast ());
+  uint8_t tid = mpdu->GetHeader ().GetQosTid ();
 
-  if (maxAmpduSize == 0)
-    {
-      NS_LOG_DEBUG ("A-MPDU aggregation disabled");
-      return mpduList;
-    }
+  Ptr<QosTxop> qosTxop = m_mac->GetQosTxop (tid);
+  NS_ASSERT (qosTxop != 0);
 
-  //Have to make sure that the block ack agreement is established before sending an A-MPDU
-  if (edcaIt->second->GetBaAgreementEstablished (recipient, tid))
+  //Have to make sure that the block ack agreement is established and A-MPDU is enabled
+  if (qosTxop->GetBaAgreementEstablished (recipient, tid)
+      && GetMaxAmpduSize (recipient, tid, txParams.m_txVector.GetModulationClass ()) > 0)
     {
       /* here is performed MPDU aggregation */
-      uint16_t startingSequenceNumber = edcaIt->second->GetBaStartingSequence (recipient, tid);
-      Ptr<WifiMacQueueItem> nextMpdu;
-      uint16_t maxMpdus = edcaIt->second->GetBaBufferSize (recipient, tid);
-      uint32_t currentAmpduSize = 0;
-
-      // check if the received MPDU meets the size and duration constraints
-      if (edcaIt->second->GetLow ()->IsWithinSizeAndTimeLimits (mpdu, txVector, 0, ppduDurationLimit))
-        {
-          // MPDU can be aggregated
-          nextMpdu = Copy (mpdu);
-        }
+      Ptr<WifiMacQueueItem> nextMpdu = mpdu;
 
       while (nextMpdu != 0)
         {
-          /* if we are here, nextMpdu can be aggregated to the A-MPDU.
-           * nextMpdu may be any of the following:
-           * (a) an A-MSDU (with all the constituent MSDUs dequeued from
-           *     the EDCA queue)
-           * (b) an MSDU dequeued from the EDCA queue
-           * (c) a retransmitted MSDU or A-MSDU dequeued from the BA Manager queue
-           * (d) an MPDU that was aggregated in an A-MPDU which was not
-           *     transmitted (e.g., because the RTS/CTS exchange failed)
-           */
-
-          currentAmpduSize = GetSizeIfAggregated (nextMpdu->GetSize (), currentAmpduSize);
-
+          // if we are here, nextMpdu can be aggregated to the A-MPDU.
           NS_LOG_DEBUG ("Adding packet with sequence number " << nextMpdu->GetHeader ().GetSequenceNumber ()
                         << " to A-MPDU, packet size = " << nextMpdu->GetSize ()
-                        << ", A-MPDU size = " << currentAmpduSize);
-
-          // Always use the Normal Ack policy (Implicit Block Ack), for now
-          nextMpdu->GetHeader ().SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
+                        << ", A-MPDU size = " << txParams.GetSize (recipient));
 
           mpduList.push_back (nextMpdu);
 
@@ -271,28 +246,29 @@
           nextMpdu = 0;
 
           Ptr<const WifiMacQueueItem> peekedMpdu;
-          peekedMpdu = edcaIt->second->PeekNextFrame (tid, recipient);
+          peekedMpdu = qosTxop->PeekNextMpdu (queueIt, tid, recipient);
           if (peekedMpdu != 0)
             {
-              uint16_t currentSequenceNumber = peekedMpdu->GetHeader ().GetSequenceNumber ();
-
-              if (IsInWindow (currentSequenceNumber, startingSequenceNumber, maxMpdus))
-                {
-                  // dequeue the frame if constraints on size and duration limit are met.
-                  // Note that the dequeued MPDU differs from the peeked MPDU if A-MSDU
-                  // aggregation is performed during the dequeue
-                  NS_LOG_DEBUG ("Trying to aggregate another MPDU");
-                  nextMpdu = edcaIt->second->DequeuePeekedFrame (peekedMpdu, txVector, true,
-                                                                 currentAmpduSize, ppduDurationLimit);
-                }
+              // PeekNextMpdu() does not return an MPDU that is beyond the transmit window
+              NS_ASSERT (IsInWindow (peekedMpdu->GetHeader ().GetSequenceNumber (),
+                                     qosTxop->GetBaStartingSequence (recipient, tid),
+                                     qosTxop->GetBaBufferSize (recipient, tid)));
+
+              // get the next MPDU to aggregate, provided that the constraints on size
+              // and duration limit are met. Note that the returned MPDU differs from
+              // the peeked MPDU if A-MSDU aggregation is enabled.
+              NS_LOG_DEBUG ("Trying to aggregate another MPDU");
+              nextMpdu = qosTxop->GetNextMpdu (peekedMpdu, txParams, availableTime, false, queueIt);
             }
         }
+
       if (mpduList.size () == 1)
         {
           // return an empty vector if it was not possible to aggregate at least two MPDUs
           mpduList.clear ();
         }
     }
+
   return mpduList;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/mpdu-aggregator.h ns-3.34/src/wifi/model/mpdu-aggregator.h
--- ns-3.33/src/wifi/model/mpdu-aggregator.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/mpdu-aggregator.h	2021-07-14 10:31:07.000000000 -0700
@@ -33,6 +33,8 @@
 class WifiTxVector;
 class Packet;
 class WifiMacQueueItem;
+class RegularWifiMac;
+class WifiTxParameters;
 
 /**
  * \brief Aggregator used to construct A-MPDUs
@@ -95,9 +97,12 @@
    * as determined for the modulation class indicated by the given TxVector
    *
    * - the time to transmit the resulting PPDU, according to the given TxVector,
-   * does not exceed both the maximum PPDU duration allowed by the corresponding
-   * modulation class (if any) and the given PPDU duration limit (if distinct from
-   * Time::Min ())
+   * does not exceed the maximum PPDU duration allowed by the corresponding
+   * modulation class (if any)
+   *
+   * - the time to transmit the resulting PPDU and to carry out protection and
+   * acknowledgment, as specified by the given TX parameters, does not exceed the
+   * given available time (if distinct from Time::Min ())
    *
    * For now, only non-broadcast QoS Data frames can be aggregated (do not pass
    * other types of frames to this method). MPDUs to aggregate are looked for
@@ -111,20 +116,23 @@
    * the returned vector is empty.
    *
    * \param mpdu the given MPDU.
-   * \param txVector the TxVector used to transmit the frame
-   * \param ppduDurationLimit the limit on the PPDU duration
+   * \param txParams the TX parameters used to transmit the frame
+   * \param availableTime the time available for the frame exchange
+   * \param queueIt the QueueIteratorPair pointing to the queue item from which the
+   *                search for an MPDU starts, if the QueueIteratorPair is valid
    * \return the resulting A-MPDU, if aggregation is possible.
    */
-  std::vector<Ptr<WifiMacQueueItem>> GetNextAmpdu (Ptr<const WifiMacQueueItem> mpdu,
-                                                   WifiTxVector txVector,
-                                                   Time ppduDurationLimit = Time::Min ()) const;
+  std::vector<Ptr<WifiMacQueueItem>> GetNextAmpdu (Ptr<WifiMacQueueItem> mpdu,
+                                                   WifiTxParameters& txParams,
+                                                   Time availableTime,
+                                                   WifiMacQueueItem::QueueIteratorPair queueIt) const;
 
   /**
-   * Set the map of EDCA queues.
+   * Set the MAC layer to use.
    *
-   * \param edcaQueues the map of EDCA queues.
+   * \param mac the MAC layer to use
    */
-  void SetEdcaQueues (EdcaQueues edcaQueues);
+  void SetWifiMac (const Ptr<RegularWifiMac> mac);
 
   /**
    * \param ampduSize the size of the A-MPDU that needs to be padded in bytes
@@ -142,11 +150,15 @@
    *
    * \param mpduSize size of the MPDU in bytes.
    * \param isSingle true if S-MPDU.
+   * \return the A-MPDU subframe header
    */
   static AmpduSubframeHeader GetAmpduSubframeHeader (uint16_t mpduSize, bool isSingle);
 
+protected:
+  void DoDispose () override;
+
 private:
-  EdcaQueues m_edca;   //!< the map of EDCA queues
+  Ptr<RegularWifiMac> m_mac;   //!< the MAC of this station
 };
 
 }  //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/msdu-aggregator.cc ns-3.34/src/wifi/model/msdu-aggregator.cc
--- ns-3.33/src/wifi/model/msdu-aggregator.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/msdu-aggregator.cc	2021-07-14 10:31:07.000000000 -0700
@@ -22,17 +22,14 @@
 #include "ns3/log.h"
 #include "ns3/packet.h"
 #include "msdu-aggregator.h"
-#include "amsdu-subframe-header.h"
 #include "qos-txop.h"
-#include "mpdu-aggregator.h"
 #include "wifi-remote-station-manager.h"
-#include "mac-low.h"
-#include "wifi-phy.h"
-#include "wifi-net-device.h"
-#include "ht-capabilities.h"
-#include "wifi-mac.h"
+#include "ns3/ht-capabilities.h"
+#include "regular-wifi-mac.h"
 #include "wifi-mac-queue.h"
 #include "wifi-mac-trailer.h"
+#include "ns3/ht-frame-exchange-manager.h"
+#include "wifi-tx-parameters.h"
 #include <algorithm>
 
 namespace ns3 {
@@ -61,9 +58,19 @@
 }
 
 void
-MsduAggregator::SetEdcaQueues (EdcaQueues map)
+MsduAggregator::DoDispose ()
 {
-    m_edca = map;
+  m_mac = 0;
+  m_htFem = 0;
+  Object::DoDispose ();
+}
+
+void
+MsduAggregator::SetWifiMac (const Ptr<RegularWifiMac> mac)
+{
+  NS_LOG_FUNCTION (this << mac);
+  m_mac = mac;
+  m_htFem = DynamicCast<HtFrameExchangeManager> (m_mac->GetFrameExchangeManager ());
 }
 
 uint16_t
@@ -76,27 +83,24 @@
 }
 
 Ptr<WifiMacQueueItem>
-MsduAggregator::GetNextAmsdu (Mac48Address recipient, uint8_t tid,
-                              WifiTxVector txVector, uint32_t ampduSize,
-                              Time ppduDurationLimit) const
+MsduAggregator::GetNextAmsdu (Ptr<const WifiMacQueueItem> peekedItem, WifiTxParameters& txParams,
+                              Time availableTime, WifiMacQueueItem::QueueIteratorPair& queueIt) const
 {
-  NS_LOG_FUNCTION (recipient << +tid << txVector << ampduSize << ppduDurationLimit);
+  NS_LOG_FUNCTION (this << *peekedItem << &txParams << availableTime);
+
+  NS_ASSERT (peekedItem->IsQueued ());
+  NS_ASSERT (peekedItem->GetQueueIteratorPairs ().size () == 1);
+  WifiMacQueueItem::QueueIteratorPair peekedIt = peekedItem->GetQueueIteratorPairs ().front ();
+  NS_ASSERT ((*peekedIt.it)->GetPacket () == peekedItem->GetPacket ());
+
+  uint8_t tid = peekedItem->GetHeader ().GetQosTid ();
+  Mac48Address recipient = peekedItem->GetHeader ().GetAddr1 ();
 
   /* "The Address 1 field of an MPDU carrying an A-MSDU shall be set to an
    * individual address or to the GCR concealment address" (Section 10.12
    * of 802.11-2016)
    */
-  NS_ABORT_MSG_IF (recipient.IsGroup (), "Recipient address is group addressed");
-
-  Ptr<QosTxop> qosTxop = m_edca.find (QosUtilsMapTidToAc (tid))->second;
-  Ptr<WifiMacQueue> queue = qosTxop->GetWifiMacQueue ();
-  WifiMacQueue::ConstIterator peekedIt = queue->PeekByTidAndAddress (tid, recipient);
-
-  if (peekedIt == queue->end ())
-    {
-      NS_LOG_DEBUG ("No packet with the given TID and address in the queue");
-      return 0;
-    }
+  NS_ABORT_MSG_IF (recipient.IsBroadcast (), "Recipient address is broadcast");
 
   /* "A STA shall not transmit an A-MSDU within a QoS Data frame under a block
    * ack agreement unless the recipient indicates support for A-MSDU by setting
@@ -105,74 +109,38 @@
    */
   // No check required for now, as we always set the A-MSDU Supported field to 1
 
-  WifiModulationClass modulation = txVector.GetMode ().GetModulationClass ();
+  // TODO Add support for the Max Number Of MSDUs In A-MSDU field in the Extended
+  // Capabilities element sent by the recipient
 
-  // Get the maximum size of the A-MSDU we can send to the recipient
-  uint16_t maxAmsduSize = GetMaxAmsduSize (recipient, tid, modulation);
+  NS_ASSERT (m_htFem != 0);
 
-  if (maxAmsduSize == 0)
+  if (GetMaxAmsduSize (recipient, tid, txParams.m_txVector.GetModulationClass ()) == 0)
     {
-      return 0;
+      NS_LOG_DEBUG ("A-MSDU aggregation disabled");
+      return nullptr;
     }
 
-  Ptr<WifiMacQueueItem> amsdu = Create<WifiMacQueueItem> (Create<const Packet> (), (*peekedIt)->GetHeader ());
-  uint8_t nMsdu = 0;
-  // We need to keep track of the first MSDU. When it is processed, it is not known
-  // if aggregation will succeed or not.
-  WifiMacQueue::ConstIterator first = peekedIt;
+  Ptr<WifiMacQueueItem> amsdu = Copy (peekedItem);
+  uint8_t nMsdu = 1;
 
-  // TODO Add support for the Max Number Of MSDUs In A-MSDU field in the Extended
-  // Capabilities element sent by the recipient
+  peekedIt.it++;
 
-  while (peekedIt != queue->end ())
+  while ((peekedIt.it = peekedIt.queue->PeekByTidAndAddress (tid, recipient, peekedIt.it)) != peekedIt.queue->end ()
+         && m_htFem->TryAggregateMsdu (*peekedIt.it, txParams, availableTime))
     {
-      // check if aggregating the peeked MSDU violates the A-MSDU size limit
-      uint16_t newAmsduSize = GetSizeIfAggregated ((*peekedIt)->GetPacket ()->GetSize (),
-                                                   amsdu->GetPacket ()->GetSize ());
-
-      if (newAmsduSize > maxAmsduSize)
-        {
-          NS_LOG_DEBUG ("No other MSDU can be aggregated: maximum A-MSDU size reached");
-          break;
-        }
-
-      // check if the A-MSDU obtained by aggregating the peeked MSDU violates
-      // the A-MPDU size limit or the PPDU duration limit
-      if (!qosTxop->GetLow ()->IsWithinSizeAndTimeLimits (amsdu->GetHeader ().GetSize () + newAmsduSize
-                                                          + WIFI_MAC_FCS_LENGTH,
-                                                          recipient, tid, txVector, ampduSize, ppduDurationLimit))
-        {
-          NS_LOG_DEBUG ("No other MSDU can be aggregated");
-          break;
-        }
-
-      // The MSDU can be aggregated to the A-MSDU.
-      // If it is the first MSDU, move to the next one
-      if (nMsdu == 0)
-        {
-          amsdu = Copy (*peekedIt);
-          peekedIt++;
-        }
-      // otherwise, remove it from the queue
-      else
-        {
-          amsdu->Aggregate (*peekedIt);
-          peekedIt = queue->Remove (peekedIt);
-        }
-
+      amsdu->Aggregate (*peekedIt.it);
+      peekedIt.it++;
       nMsdu++;
-
-      peekedIt = queue->PeekByTidAndAddress (tid, recipient, peekedIt);
     }
 
-  if (nMsdu < 2)
+  if (nMsdu == 1)
     {
       NS_LOG_DEBUG ("Aggregation failed (could not aggregate at least two MSDUs)");
-      return 0;
+      return nullptr;
     }
 
-  // Aggregation succeeded, we have to remove the first MSDU
-  queue->Remove (first);
+  // Aggregation succeeded
+  queueIt = peekedIt;
 
   return amsdu;
 }
@@ -190,11 +158,6 @@
   NS_LOG_FUNCTION (this << recipient << +tid << modulation);
 
   AcIndex ac = QosUtilsMapTidToAc (tid);
-  Ptr<QosTxop> qosTxop = m_edca.find (ac)->second;
-  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (qosTxop->GetLow ()->GetPhy ()->GetDevice ());
-  NS_ASSERT (device);
-  Ptr<WifiRemoteStationManager> stationManager = device->GetRemoteStationManager ();
-  NS_ASSERT (stationManager);
 
   // Find the A-MSDU max size configured on this device
   UintegerValue size;
@@ -202,16 +165,16 @@
   switch (ac)
     {
       case AC_BE:
-        device->GetMac ()->GetAttribute ("BE_MaxAmsduSize", size);
+        m_mac->GetAttribute ("BE_MaxAmsduSize", size);
         break;
       case AC_BK:
-        device->GetMac ()->GetAttribute ("BK_MaxAmsduSize", size);
+        m_mac->GetAttribute ("BK_MaxAmsduSize", size);
         break;
       case AC_VI:
-        device->GetMac ()->GetAttribute ("VI_MaxAmsduSize", size);
+        m_mac->GetAttribute ("VI_MaxAmsduSize", size);
         break;
       case AC_VO:
-        device->GetMac ()->GetAttribute ("VO_MaxAmsduSize", size);
+        m_mac->GetAttribute ("VO_MaxAmsduSize", size);
         break;
       default:
         NS_ABORT_MSG ("Unknown AC " << ac);
@@ -226,6 +189,9 @@
       return 0;
     }
 
+  Ptr<WifiRemoteStationManager> stationManager = m_mac->GetWifiRemoteStationManager ();
+  NS_ASSERT (stationManager);
+
   // Retrieve the Capabilities elements advertised by the recipient
   Ptr<const VhtCapabilities> vhtCapabilities = stationManager->GetStationVhtCapabilities (recipient);
   Ptr<const HtCapabilities> htCapabilities = stationManager->GetStationHtCapabilities (recipient);
@@ -271,11 +237,11 @@
   return maxAmsduSize;
 }
 
-MsduAggregator::DeaggregatedMsdus
+WifiMacQueueItem::DeaggregatedMsdus
 MsduAggregator::Deaggregate (Ptr<Packet> aggregatedPacket)
 {
   NS_LOG_FUNCTION_NOARGS ();
-  DeaggregatedMsdus set;
+  WifiMacQueueItem::DeaggregatedMsdus set;
 
   AmsduSubframeHeader hdr;
   Ptr<Packet> extractedMsdu = Create<Packet> ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/msdu-aggregator.h ns-3.34/src/wifi/model/msdu-aggregator.h
--- ns-3.33/src/wifi/model/msdu-aggregator.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/msdu-aggregator.h	2021-07-14 10:31:07.000000000 -0700
@@ -25,15 +25,17 @@
 #include "ns3/nstime.h"
 #include "wifi-mode.h"
 #include "qos-utils.h"
+#include "wifi-mac-queue-item.h"
 #include <map>
 
 namespace ns3 {
 
-class AmsduSubframeHeader;
 class Packet;
 class QosTxop;
-class WifiMacQueueItem;
 class WifiTxVector;
+class RegularWifiMac;
+class HtFrameExchangeManager;
+class WifiTxParameters;
 
 /**
  * \brief Aggregator used to construct A-MSDUs
@@ -42,10 +44,6 @@
 class MsduAggregator : public Object
 {
 public:
-  /// DeaggregatedMsdus typedef
-  typedef std::list<std::pair<Ptr<const Packet>, AmsduSubframeHeader> > DeaggregatedMsdus;
-  /// DeaggregatedMsdusCI typedef
-  typedef std::list<std::pair<Ptr<const Packet>, AmsduSubframeHeader> >::const_iterator DeaggregatedMsdusCI;
   /// EDCA queues typedef
   typedef std::map<AcIndex, Ptr<QosTxop> > EdcaQueues;
 
@@ -71,36 +69,38 @@
   static uint16_t GetSizeIfAggregated (uint16_t msduSize, uint16_t amsduSize);
 
   /**
-   * Dequeue MSDUs to be transmitted to a given station and belonging to a
-   * given TID from the corresponding EDCA queue and aggregate them to form
-   * an A-MSDU that meets the following constraints:
+   * Attempt to aggregate other MSDUs to the given A-MSDU while meeting the
+   * following constraints:
    *
    * - the A-MSDU size does not exceed the maximum A-MSDU size as determined for
    * the modulation class indicated by the given TxVector
    *
    * - the size of the A-MPDU resulting from the aggregation of the MPDU in which
-   * the A-MSDU will be embedded and an existing A-MPDU of the given size
-   * (possibly null) does not exceed the maximum A-MPDU size as determined for
+   * the A-MSDU will be embedded and the current A-MPDU (as specified by the given
+   * TX parameters) does not exceed the maximum A-MPDU size as determined for
    * the modulation class indicated by the given TxVector
    *
    * - the time to transmit the resulting PPDU, according to the given TxVector,
-   * does not exceed both the maximum PPDU duration allowed by the corresponding
-   * modulation class (if any) and the given PPDU duration limit (if distinct from
-   * Time::Min ())
+   * does not exceed the maximum PPDU duration allowed by the corresponding
+   * modulation class (if any)
+   *
+   * - the time to transmit the resulting PPDU and to carry out protection and
+   * acknowledgment, as specified by the given TX parameters, does not exceed the
+   * given available time (if distinct from Time::Min ())
    *
    * If it is not possible to aggregate at least two MSDUs, no MSDU is dequeued
    * from the EDCA queue and a null pointer is returned.
    *
-   * \param recipient the receiver station address.
-   * \param tid the TID.
-   * \param txVector the TxVector used to transmit the frame
-   * \param ampduSize the size of the existing A-MPDU in bytes
-   * \param ppduDurationLimit the limit on the PPDU duration
-   * \return the resulting A-MSDU, if aggregation is possible, 0 otherwise.
-   */
-  Ptr<WifiMacQueueItem> GetNextAmsdu (Mac48Address recipient, uint8_t tid,
-                                      WifiTxVector txVector, uint32_t ampduSize = 0,
-                                      Time ppduDurationLimit = Time::Min ()) const;
+   * \param peekedItem the MSDU which we attempt to aggregate other MSDUs to
+   * \param txParams the TX parameters for the current frame
+   * \param availableTime the time available for the frame exchange
+   * \param[out] queueIt a QueueIteratorPair pointing to the queue item following the
+   *                     last item used to prepare the returned A-MSDU, if any; otherwise,
+   *                     its value is unchanged
+   * \return the resulting A-MSDU, if aggregation is possible, a null pointer otherwise.
+   */
+  Ptr<WifiMacQueueItem> GetNextAmsdu (Ptr<const WifiMacQueueItem> peekedItem, WifiTxParameters& txParams,
+                                      Time availableTime, WifiMacQueueItem::QueueIteratorPair& queueIt) const;
 
   /**
    * Determine the maximum size for an A-MSDU of the given TID that can be sent
@@ -119,14 +119,14 @@
    * \param aggregatedPacket the aggregated packet.
    * \returns DeaggregatedMsdus.
    */
-  static DeaggregatedMsdus Deaggregate (Ptr<Packet> aggregatedPacket);
+  static WifiMacQueueItem::DeaggregatedMsdus Deaggregate (Ptr<Packet> aggregatedPacket);
 
   /**
-   * Set the map of EDCA queues.
+   * Set the MAC layer to use.
    *
-   * \param map the map of EDCA queues.
+   * \param mac the MAC layer to use
    */
-  void SetEdcaQueues (EdcaQueues map);
+  void SetWifiMac (const Ptr<RegularWifiMac> mac);
 
   /**
    * Calculate how much padding must be added to the end of an A-MSDU of the
@@ -139,8 +139,12 @@
    */
   static uint8_t CalculatePadding (uint16_t amsduSize);
 
+protected:
+  void DoDispose () override;
+
 private:
-  EdcaQueues m_edca;   //!< the map of EDCA queues
+  Ptr<RegularWifiMac> m_mac;            //!< the MAC of this station
+  Ptr<HtFrameExchangeManager> m_htFem;  //!< the HT Frame Exchange Manager of this station
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/nist-error-rate-model.cc ns-3.34/src/wifi/model/nist-error-rate-model.cc
--- ns-3.33/src/wifi/model/nist-error-rate-model.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/nist-error-rate-model.cc	2021-07-14 10:31:07.000000000 -0700
@@ -217,9 +217,9 @@
 }
 
 double
-NistErrorRateModel::DoGetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint64_t nbits) const
+NistErrorRateModel::DoGetChunkSuccessRate (WifiMode mode, const WifiTxVector& txVector, double snr, uint64_t nbits, uint8_t numRxAntennas, WifiPpduField field, uint16_t staId) const
 {
-  NS_LOG_FUNCTION (this << mode << snr << nbits);
+  NS_LOG_FUNCTION (this << mode << snr << nbits << +numRxAntennas << field << staId);
   if (mode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM
       || mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM
       || mode.GetModulationClass () == WIFI_MOD_CLASS_HT
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/nist-error-rate-model.h ns-3.34/src/wifi/model/nist-error-rate-model.h
--- ns-3.33/src/wifi/model/nist-error-rate-model.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/nist-error-rate-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -47,8 +47,8 @@
 
 
 private:
-  //Inherited from ErrorRateModel
-  double DoGetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint64_t nbits) const;
+  double DoGetChunkSuccessRate (WifiMode mode, const WifiTxVector& txVector, double snr, uint64_t nbits,
+                                uint8_t numRxAntennas, WifiPpduField field, uint16_t staId) const override;
   /**
    * Return the bValue such that coding rate = bValue / (bValue + 1).
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/dsss-error-rate-model.cc ns-3.34/src/wifi/model/non-ht/dsss-error-rate-model.cc
--- ns-3.33/src/wifi/model/non-ht/dsss-error-rate-model.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/dsss-error-rate-model.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,175 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 The Boeing Company
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Gary Pei <guangyu.pei@boeing.com>
+ */
+
+#include "ns3/log.h"
+#include "dsss-error-rate-model.h"
+#include <cmath>
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("DsssErrorRateModel");
+
+#ifndef HAVE_GSL
+const double DsssErrorRateModel::WLAN_SIR_PERFECT = 10.0;
+const double DsssErrorRateModel::WLAN_SIR_IMPOSSIBLE = 0.1;
+#endif
+
+double
+DsssErrorRateModel::DqpskFunction (double x)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  return ((std::sqrt (2.0) + 1.0) / std::sqrt (8.0 * M_PI * std::sqrt (2.0)))
+         * (1.0 / std::sqrt (x)) * std::exp ( -(2.0 - std::sqrt (2.0)) * x);
+}
+
+double
+DsssErrorRateModel::GetDsssDbpskSuccessRate (double sinr, uint64_t nbits)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  double EbN0 = sinr * 22000000.0 / 1000000.0; //1 bit per symbol with 1 MSPS
+  double ber = 0.5 * std::exp (-EbN0);
+  return std::pow ((1.0 - ber), static_cast<double> (nbits));
+}
+
+double
+DsssErrorRateModel::GetDsssDqpskSuccessRate (double sinr, uint64_t nbits)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  double EbN0 = sinr * 22000000.0 / 1000000.0 / 2.0; //2 bits per symbol, 1 MSPS
+  double ber = DqpskFunction (EbN0);
+  return std::pow ((1.0 - ber), static_cast<double> (nbits));
+}
+
+double
+DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (double sinr, uint64_t nbits)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+#ifdef HAVE_GSL
+  //symbol error probability
+  double EbN0 = sinr * 22000000.0 / 1375000.0 / 4.0;
+  double sep = SymbolErrorProb16Cck (4.0 * EbN0 / 2.0);
+  return std::min (1.0, std::pow (1.0 - sep, nbits / 4.0));
+#else
+  NS_LOG_WARN ("Running a 802.11b CCK Matlab model less accurate than GSL model");
+  //The Matlab model
+  double ber;
+  if (sinr > WLAN_SIR_PERFECT)
+    {
+      ber = 0.0;
+    }
+  else if (sinr < WLAN_SIR_IMPOSSIBLE)
+    {
+      ber = 0.5;
+    }
+  else
+    {
+      //fitprops.coeff from Matlab berfit
+      double a1 = 5.3681634344056195e-001;
+      double a2 = 3.3092430025608586e-003;
+      double a3 = 4.1654372361004000e-001;
+      double a4 = 1.0288981434358866e+000;
+      ber = a1 * std::exp (-std::pow ((sinr - a2) / a3, a4));
+    }
+  return std::min (1.0, std::pow ((1.0 - ber), static_cast<double> (nbits)));
+#endif
+}
+
+double
+DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (double sinr, uint64_t nbits)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+#ifdef HAVE_GSL
+  NS_LOG_DEBUG ("GSL enabled ");
+  //symbol error probability
+  double EbN0 = sinr * 22000000.0 / 1375000.0 / 8.0;
+  double sep = SymbolErrorProb256Cck (8.0 * EbN0 / 2.0);
+  return std::min (1.0, std::pow (1.0 - sep, nbits / 8.0));
+#else
+  NS_LOG_WARN ("Running a 802.11b CCK Matlab model less accurate than GSL model");
+  //The Matlab model
+  double ber;
+  if (sinr > WLAN_SIR_PERFECT)
+    {
+      ber = 0.0;
+    }
+  else if (sinr < WLAN_SIR_IMPOSSIBLE)
+    {
+      ber = 0.5;
+    }
+  else
+    {
+      //fitprops.coeff from Matlab berfit
+      double a1 = 7.9056742265333456e-003;
+      double a2 = -1.8397449399176360e-001;
+      double a3 = 1.0740689468707241e+000;
+      double a4 = 1.0523316904502553e+000;
+      double a5 = 3.0552298746496687e-001;
+      double a6 = 2.2032715128698435e+000;
+      ber =  (a1 * sinr * sinr + a2 * sinr + a3) / (sinr * sinr * sinr + a4 * sinr * sinr + a5 * sinr + a6);
+    }
+  return std::min (1.0, std::pow ((1.0 - ber), static_cast<double> (nbits)));
+#endif
+}
+
+#ifdef HAVE_GSL
+double
+IntegralFunction (double x, void *params)
+{
+  double beta = ((FunctionParameters *) params)->beta;
+  double n = ((FunctionParameters *) params)->n;
+  double IntegralFunction = std::pow (2 * gsl_cdf_ugaussian_P (x + beta) - 1, n - 1)
+    * std::exp (-x * x / 2.0) / std::sqrt (2.0 * M_PI);
+  return IntegralFunction;
+}
+
+double
+DsssErrorRateModel::SymbolErrorProb16Cck (double e2)
+{
+  double sep;
+  double error;
+
+  FunctionParameters params;
+  params.beta = std::sqrt (2.0 * e2);
+  params.n = 8.0;
+
+  gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);
+
+  gsl_function F;
+  F.function = &IntegralFunction;
+  F.params = &params;
+
+  gsl_integration_qagiu (&F,-params.beta, 0, 1e-7, 1000, w, &sep, &error);
+  gsl_integration_workspace_free (w);
+  if (error == 0.0)
+    {
+      sep = 1.0;
+    }
+
+  return 1.0 - sep;
+}
+
+double DsssErrorRateModel::SymbolErrorProb256Cck (double e1)
+{
+  return 1.0 - std::pow (1.0 - SymbolErrorProb16Cck (e1 / 2.0), 2.0);
+}
+
+#endif
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/dsss-error-rate-model.h ns-3.34/src/wifi/model/non-ht/dsss-error-rate-model.h
--- ns-3.33/src/wifi/model/non-ht/dsss-error-rate-model.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/dsss-error-rate-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,142 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 The Boeing Company
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Gary Pei <guangyu.pei@boeing.com>
+ */
+
+#ifndef DSSS_ERROR_RATE_MODEL_H
+#define DSSS_ERROR_RATE_MODEL_H
+
+#ifdef HAVE_GSL
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_integration.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_sf_bessel.h>
+#endif
+
+namespace ns3 {
+
+#ifdef HAVE_GSL
+/**
+ * Structure for integral function parameters
+ */
+typedef struct FunctionParameterType
+{
+  double beta; ///< Beta parameter
+  double n;    ///< n parameter
+} FunctionParameters;
+
+/**
+ * Integral function using GSL library
+ *
+ * \param x the input x variable
+ * \param params a pointer to FunctionParameters struct
+ *
+ * \return the integral function
+ */
+double IntegralFunction (double x, void *params);
+#endif
+
+/**
+ * \brief an implementation of DSSS error rate model
+ * \ingroup wifi
+ *
+ * The 802.11b modulations:
+ *    - 1 Mbps mode is based on DBPSK. BER is from equation 5.2-69 from John G. Proakis
+ *      Digital Communications, 2001 edition
+ *    - 2 Mbps model is based on DQPSK. Equation 8 from "Tight bounds and accurate
+ *      approximations for DQPSK transmission bit error rate", G. Ferrari and G.E. Corazza
+ *      ELECTRONICS LETTERS, 40(20):1284-1285, September 2004
+ *    - 5.5 Mbps and 11 Mbps are based on equations (18) and (17) from "Properties and
+ *      performance of the IEEE 802.11b complementarycode-key signal sets",
+ *      Michael B. Pursley and Thomas C. Royster. IEEE TRANSACTIONS ON COMMUNICATIONS,
+ *      57(2):440-449, February 2009.
+ *
+ *  This model is designed to run with highest accuracy using the GNU
+ *  Scientific Library (GSL), but if GSL is not installed on the platform,
+ *  will fall back to (slightly less accurate) Matlab-derived models for
+ *  the CCK modulation types.
+ *
+ *  More detailed description and validation can be found in
+ *      http://www.nsnam.org/~pei/80211b.pdf
+ */
+class DsssErrorRateModel
+{
+public:
+  /**
+   * A function DQPSK
+   *
+   * \param x the input variable
+   *
+   * \return DQPSK (x)
+   */
+  static double DqpskFunction (double x);
+  /**
+   * Return the chunk success rate of the differential BPSK.
+   *
+   * \param sinr the SINR ratio (not dB) of the chunk
+   * \param nbits the size of the chunk
+   *
+   * \return the chunk success rate of the differential BPSK
+   */
+  static double GetDsssDbpskSuccessRate (double sinr, uint64_t nbits);
+  /**
+   * Return the chunk success rate of the differential encoded QPSK.
+   *
+   * \param sinr the SINR ratio (not dB) of the chunk
+   * \param nbits the size of the chunk
+   *
+   * \return the chunk success rate of the differential encoded QPSK.
+   */
+  static double GetDsssDqpskSuccessRate (double sinr,uint64_t nbits);
+  /**
+   * Return the chunk success rate of the differential encoded QPSK for
+   * 5.5Mbps data rate.
+   *
+   * \param sinr the SINR ratio (not dB) of the chunk
+   * \param nbits the size of the chunk
+   *
+   * \return the chunk success rate of the differential encoded QPSK for
+   */
+  static double GetDsssDqpskCck5_5SuccessRate (double sinr,uint64_t nbits);
+  /**
+   * Return the chunk success rate of the differential encoded QPSK for
+   * 11Mbps data rate.
+   *
+   * \param sinr the SINR ratio (not dB) of the chunk
+   * \param nbits the size of the chunk
+   *
+   * \return the chunk success rate of the differential encoded QPSK for
+   */
+  static double GetDsssDqpskCck11SuccessRate (double sinr,uint64_t nbits);
+#ifdef HAVE_GSL
+  static double SymbolErrorProb16Cck (double e2); /// equation (18) in Pursley's paper
+  static double SymbolErrorProb256Cck (double e1); /// equation (17) in Pursley's paper
+#else
+
+
+protected:
+  /// WLAN perfect
+  static const double WLAN_SIR_PERFECT;
+  /// WLAN impossible
+  static const double WLAN_SIR_IMPOSSIBLE;
+#endif
+};
+
+} //namespace ns3
+
+#endif /* DSSS_ERROR_RATE_MODEL_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/dsss-parameter-set.cc ns-3.34/src/wifi/model/non-ht/dsss-parameter-set.cc
--- ns-3.33/src/wifi/model/non-ht/dsss-parameter-set.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/dsss-parameter-set.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,93 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016 Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "dsss-parameter-set.h"
+
+namespace ns3 {
+
+DsssParameterSet::DsssParameterSet ()
+  : m_currentChannel (0),
+    m_dsssSupported (0)
+{
+}
+
+WifiInformationElementId
+DsssParameterSet::ElementId () const
+{
+  return IE_DSSS_PARAMETER_SET;
+}
+
+void
+DsssParameterSet::SetDsssSupported (uint8_t dsssSupported)
+{
+  m_dsssSupported = dsssSupported;
+}
+
+void
+DsssParameterSet::SetCurrentChannel (uint8_t currentChannel)
+{
+  m_currentChannel = currentChannel;
+}
+
+uint8_t
+DsssParameterSet::GetInformationFieldSize () const
+{
+  NS_ASSERT (m_dsssSupported);
+  return 1;
+}
+
+Buffer::Iterator
+DsssParameterSet::Serialize (Buffer::Iterator i) const
+{
+  if (!m_dsssSupported)
+    {
+      return i;
+    }
+  return WifiInformationElement::Serialize (i);
+}
+
+uint16_t
+DsssParameterSet::GetSerializedSize () const
+{
+  if (!m_dsssSupported)
+    {
+      return 0;
+    }
+  return WifiInformationElement::GetSerializedSize ();
+}
+
+void
+DsssParameterSet::SerializeInformationField (Buffer::Iterator start) const
+{
+  if (m_dsssSupported)
+    {
+      start.WriteU8 (m_currentChannel);
+    }
+}
+
+uint8_t
+DsssParameterSet::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
+{
+  Buffer::Iterator i = start;
+  m_currentChannel = i.ReadU8 ();
+  return length;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/dsss-parameter-set.h ns-3.34/src/wifi/model/non-ht/dsss-parameter-set.h
--- ns-3.33/src/wifi/model/non-ht/dsss-parameter-set.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/dsss-parameter-set.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,74 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016 Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef DSSS_PARAMETER_SET_H
+#define DSSS_PARAMETER_SET_H
+
+#include "ns3/wifi-information-element.h"
+
+namespace ns3 {
+
+/**
+ * \brief The DSSS Parameter Set
+ * \ingroup wifi
+ *
+ * This class knows how to serialise and deserialise the DSSS Parameter Set.
+ */
+class DsssParameterSet : public WifiInformationElement
+{
+public:
+  DsssParameterSet ();
+
+  // Implementations of pure virtual methods of WifiInformationElement
+  WifiInformationElementId ElementId () const override;
+  uint8_t GetInformationFieldSize () const override;
+  void SerializeInformationField (Buffer::Iterator start) const override;
+  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length) override;
+  /* This information element is a bit special in that it is only
+     included if the STA does support DSSS. To support this we
+     override the Serialize and GetSerializedSize methods of
+     WifiInformationElement. */
+  Buffer::Iterator Serialize (Buffer::Iterator start) const override;
+  uint16_t GetSerializedSize () const override;
+
+  /**
+   * Set DSSS supported
+   * \param dsssSupported the DSSS supported indicator
+   */
+  void SetDsssSupported (uint8_t dsssSupported);
+
+  /**
+   * Set the Current Channel field in the DsssParameterSet information element.
+   *
+   * \param currentChannel the CurrentChannel field in the DsssParameterSet information element
+   */
+  void SetCurrentChannel (uint8_t currentChannel);
+
+
+private:
+  uint8_t m_currentChannel; ///< current channel number
+
+  /// This is used to decide whether this element should be added to the frame or not
+  bool m_dsssSupported;
+};
+
+} //namespace ns3
+
+#endif /* DSSS_PARAMETER_SET_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/dsss-phy.cc ns-3.34/src/wifi/model/non-ht/dsss-phy.cc
--- ns-3.33/src/wifi/model/non-ht/dsss-phy.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/dsss-phy.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,390 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy)
+ *          Mathieu Lacage <mathieu.lacage@sophia.inria.fr> (for logic ported from wifi-phy)
+ */
+
+#include <array>
+#include "dsss-phy.h"
+#include "dsss-ppdu.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/wifi-phy.h" //only used for static mode constructor
+#include "ns3/wifi-utils.h"
+#include "ns3/simulator.h"
+#include "ns3/log.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("DsssPhy");
+
+/*******************************************************
+ *       HR/DSSS PHY (IEEE 802.11-2016, clause 16)
+ *******************************************************/
+
+/* *NS_CHECK_STYLE_OFF* */
+const PhyEntity::PpduFormats DsssPhy::m_dsssPpduFormats {
+  { WIFI_PREAMBLE_LONG,  { WIFI_PPDU_FIELD_PREAMBLE,      //PHY preamble
+                           WIFI_PPDU_FIELD_NON_HT_HEADER, //PHY header
+                           WIFI_PPDU_FIELD_DATA } },
+  { WIFI_PREAMBLE_SHORT, { WIFI_PPDU_FIELD_PREAMBLE,      //Short PHY preamble
+                           WIFI_PPDU_FIELD_NON_HT_HEADER, //Short PHY header
+                           WIFI_PPDU_FIELD_DATA } }
+};
+
+const PhyEntity::ModulationLookupTable DsssPhy::m_dsssModulationLookupTable {
+  // Unique name         Code rate                 Constellation size
+  { "DsssRate1Mbps",   { WIFI_CODE_RATE_UNDEFINED, 2 } },
+  { "DsssRate2Mbps",   { WIFI_CODE_RATE_UNDEFINED, 4 } },
+  { "DsssRate5_5Mbps", { WIFI_CODE_RATE_UNDEFINED, 16 } },
+  { "DsssRate11Mbps",  { WIFI_CODE_RATE_UNDEFINED, 256 } }
+};
+/* *NS_CHECK_STYLE_ON* */
+
+/// DSSS rates in bits per second
+static const std::array<uint64_t, 4> s_dsssRatesBpsList = {1000000,  2000000, 5500000, 11000000};
+
+/**
+ * Get the array of possible DSSS rates.
+ *
+ * \return the DSSS rates in bits per second
+ */
+const std::array<uint64_t, 4>& GetDsssRatesBpsList (void)
+{
+  return s_dsssRatesBpsList;
+};
+
+DsssPhy::DsssPhy ()
+{
+  NS_LOG_FUNCTION (this);
+  for (const auto & rate : GetDsssRatesBpsList ())
+    {
+      WifiMode mode = GetDsssRate (rate);
+      NS_LOG_LOGIC ("Add " << mode << " to list");
+      m_modeList.emplace_back (mode);
+    }
+}
+
+DsssPhy::~DsssPhy ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+WifiMode
+DsssPhy::GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const
+{
+  switch (field)
+    {
+      case WIFI_PPDU_FIELD_PREAMBLE: //consider header mode for preamble (useful for InterferenceHelper)
+      case WIFI_PPDU_FIELD_NON_HT_HEADER:
+        return GetHeaderMode (txVector);
+      default:
+        return PhyEntity::GetSigMode (field, txVector);
+    }
+}
+
+WifiMode
+DsssPhy::GetHeaderMode (const WifiTxVector& txVector) const
+{
+  if (txVector.GetPreambleType () == WIFI_PREAMBLE_LONG
+      || txVector.GetMode () == GetDsssRate1Mbps ())
+    {
+      //Section 16.2.3 "PPDU field definitions" and Section 16.2.2.2 "Long PPDU format"; IEEE Std 802.11-2016
+      return GetDsssRate1Mbps ();
+    }
+  else
+    {
+      //Section 16.2.2.3 "Short PPDU format"; IEEE Std 802.11-2016
+      return GetDsssRate2Mbps ();
+    }
+}
+
+const PhyEntity::PpduFormats &
+DsssPhy::GetPpduFormats (void) const
+{
+  return m_dsssPpduFormats;
+}
+
+Time
+DsssPhy::GetDuration (WifiPpduField field, const WifiTxVector& txVector) const
+{
+  if (field == WIFI_PPDU_FIELD_PREAMBLE)
+    {
+      return GetPreambleDuration (txVector); //SYNC + SFD or shortSYNC + shortSFD
+    }
+  else if (field == WIFI_PPDU_FIELD_NON_HT_HEADER)
+    {
+      return GetHeaderDuration (txVector); //PHY header or short PHY header
+    }
+  else
+    {
+      return PhyEntity::GetDuration (field, txVector);
+    }
+}
+
+Time
+DsssPhy::GetPreambleDuration (const WifiTxVector& txVector) const
+{
+  if (txVector.GetPreambleType () == WIFI_PREAMBLE_SHORT
+      && (txVector.GetMode ().GetDataRate (22) > 1000000))
+    {
+      //Section 16.2.2.3 "Short PPDU format" Figure 16-2 "Short PPDU format"; IEEE Std 802.11-2016
+      return MicroSeconds (72);
+    }
+  else
+    {
+      //Section 16.2.2.2 "Long PPDU format" Figure 16-1 "Long PPDU format"; IEEE Std 802.11-2016
+      return MicroSeconds (144);
+    }
+}
+
+Time
+DsssPhy::GetHeaderDuration (const WifiTxVector& txVector) const
+{
+  if (txVector.GetPreambleType () == WIFI_PREAMBLE_SHORT
+      && (txVector.GetMode ().GetDataRate (22) > 1000000))
+    {
+      //Section 16.2.2.3 "Short PPDU format" and Figure 16-2 "Short PPDU format"; IEEE Std 802.11-2016
+      return MicroSeconds (24);
+    }
+  else
+    {
+      //Section 16.2.2.2 "Long PPDU format" and Figure 16-1 "Short PPDU format"; IEEE Std 802.11-2016
+      return MicroSeconds (48);
+    }
+}
+
+Time
+DsssPhy::GetPayloadDuration (uint32_t size, const WifiTxVector& txVector, WifiPhyBand /* band */, MpduType /* mpdutype */,
+                             bool /* incFlag */, uint32_t & /* totalAmpduSize */, double & /* totalAmpduNumSymbols */,
+                             uint16_t /* staId */) const
+{
+  return MicroSeconds (lrint (ceil ((size * 8.0) / (txVector.GetMode ().GetDataRate (22) / 1.0e6))));
+}
+
+Ptr<WifiPpdu>
+DsssPhy::BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration)
+{
+  NS_LOG_FUNCTION (this << psdus << txVector << ppduDuration);
+  return Create<DsssPpdu> (psdus.begin ()->second, txVector, ppduDuration,
+                           ObtainNextUid (txVector));
+}
+
+PhyEntity::PhyFieldRxStatus
+DsssPhy::DoEndReceiveField (WifiPpduField field, Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << field << *event);
+  if (field == WIFI_PPDU_FIELD_NON_HT_HEADER)
+    {
+      return EndReceiveHeader (event); //PHY header or short PHY header
+    }
+  return PhyEntity::DoEndReceiveField (field, event);
+}
+
+PhyEntity::PhyFieldRxStatus
+DsssPhy::EndReceiveHeader (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  SnrPer snrPer = GetPhyHeaderSnrPer (WIFI_PPDU_FIELD_NON_HT_HEADER, event);
+  NS_LOG_DEBUG ("Long/Short PHY header: SNR(dB)=" << RatioToDb (snrPer.snr) << ", PER=" << snrPer.per);
+  PhyFieldRxStatus status (GetRandomValue () > snrPer.per);
+  if (status.isSuccess)
+    {
+      NS_LOG_DEBUG ("Received long/short PHY header");
+      if (!IsConfigSupported (event->GetPpdu ()))
+        {
+          status = PhyFieldRxStatus (false, UNSUPPORTED_SETTINGS, DROP);
+        }
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Abort reception because long/short PHY header reception failed");
+      status.reason = L_SIG_FAILURE;
+      status.actionIfFailure = ABORT;
+    }
+  return status;
+}
+
+uint16_t
+DsssPhy::GetRxChannelWidth (const WifiTxVector& txVector) const
+{
+  if (m_wifiPhy->GetChannelWidth () > 20)
+    {
+      /*
+       * This is a workaround necessary with HE-capable PHYs,
+       * since their DSSS entity will reuse its RxSpectrumModel.
+       * Without this hack, SpectrumWifiPhy::GetBand will crash.
+       * FIXME: see issue #402 for a better solution.
+       */
+      return 20;
+    }
+  return PhyEntity::GetRxChannelWidth (txVector);
+}
+
+Ptr<SpectrumValue>
+DsssPhy::GetTxPowerSpectralDensity (double txPowerW, Ptr<const WifiPpdu> ppdu) const
+{
+  const WifiTxVector& txVector = ppdu->GetTxVector ();
+  uint16_t centerFrequency = GetCenterFrequencyForChannelWidth (txVector);
+  uint16_t channelWidth = txVector.GetChannelWidth ();
+  NS_LOG_FUNCTION (this << centerFrequency << channelWidth << txPowerW);
+  NS_ABORT_MSG_IF (channelWidth != 22, "Invalid channel width for DSSS");
+  Ptr<SpectrumValue> v = WifiSpectrumValueHelper::CreateDsssTxPowerSpectralDensity (centerFrequency, txPowerW, GetGuardBandwidth (channelWidth));
+  return v;
+}
+
+void
+DsssPhy::InitializeModes (void)
+{
+  for (const auto & rate : GetDsssRatesBpsList ())
+    {
+      GetDsssRate (rate);
+    }
+}
+
+WifiMode
+DsssPhy::GetDsssRate (uint64_t rate)
+{
+  switch (rate)
+    {
+      case 1000000:
+        return GetDsssRate1Mbps ();
+      case 2000000:
+        return GetDsssRate2Mbps ();
+      case 5500000:
+        return GetDsssRate5_5Mbps ();
+      case 11000000:
+        return GetDsssRate11Mbps ();
+      default:
+        NS_ABORT_MSG ("Inexistent rate (" << rate << " bps) requested for HR/DSSS");
+        return WifiMode ();
+    }
+}
+
+#define GET_DSSS_MODE(x, m) \
+WifiMode \
+DsssPhy::Get ## x (void) \
+{ \
+  static WifiMode mode = CreateDsssMode (#x, WIFI_MOD_CLASS_ ## m); \
+  return mode; \
+}; \
+
+// Clause 15 rates (DSSS)
+GET_DSSS_MODE (DsssRate1Mbps,   DSSS)
+GET_DSSS_MODE (DsssRate2Mbps,   DSSS)
+// Clause 16 rates (HR/DSSS)
+GET_DSSS_MODE (DsssRate5_5Mbps, HR_DSSS)
+GET_DSSS_MODE (DsssRate11Mbps,  HR_DSSS)
+#undef GET_DSSS_MODE
+
+WifiMode
+DsssPhy::CreateDsssMode (std::string uniqueName,
+                         WifiModulationClass modClass)
+{
+  // Check whether uniqueName is in lookup table
+  const auto it = m_dsssModulationLookupTable.find (uniqueName);
+  NS_ASSERT_MSG (it != m_dsssModulationLookupTable.end (), "DSSS or HR/DSSS mode cannot be created because it is not in the lookup table!");
+  NS_ASSERT_MSG (modClass == WIFI_MOD_CLASS_DSSS || modClass == WIFI_MOD_CLASS_HR_DSSS, "DSSS or HR/DSSS mode must be either WIFI_MOD_CLASS_DSSS or WIFI_MOD_CLASS_HR_DSSS!");
+
+  return WifiModeFactory::CreateWifiMode (uniqueName,
+                                          modClass,
+                                          true,
+                                          MakeBoundCallback (&GetCodeRate, uniqueName),
+                                          MakeBoundCallback (&GetConstellationSize, uniqueName),
+                                          MakeBoundCallback (&GetDataRate, uniqueName, modClass), //PhyRate is equivalent to DataRate
+                                          MakeCallback (&GetDataRateFromTxVector), //PhyRate is equivalent to DataRate
+                                          MakeBoundCallback (&GetDataRate, uniqueName, modClass),
+                                          MakeCallback (&GetDataRateFromTxVector),
+                                          MakeCallback (&IsModeAllowed));
+}
+
+WifiCodeRate
+DsssPhy::GetCodeRate (const std::string& name)
+{
+  return m_dsssModulationLookupTable.at (name).first;
+}
+
+uint16_t
+DsssPhy::GetConstellationSize (const std::string& name)
+{
+  return m_dsssModulationLookupTable.at (name).second;
+}
+
+uint64_t
+DsssPhy::GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
+{
+  WifiMode mode = txVector.GetMode ();
+  return DsssPhy::GetDataRate (mode.GetUniqueName (),
+                               mode.GetModulationClass (),
+                               22, 0, 1); //dummy values since unused
+}
+
+uint64_t
+DsssPhy::GetDataRate (const std::string& name, WifiModulationClass modClass, uint16_t /* channelWidth */, uint16_t /* guardInterval */, uint8_t /* nss */)
+{
+  uint16_t constellationSize = GetConstellationSize (name);
+  uint16_t divisor = 0;
+  if (modClass == WIFI_MOD_CLASS_DSSS)
+    {
+      divisor = 11;
+    }
+  else if (modClass == WIFI_MOD_CLASS_HR_DSSS)
+    {
+      divisor = 8;
+    }
+  else
+    {
+      NS_FATAL_ERROR ("Incorrect modulation class, must specify either WIFI_MOD_CLASS_DSSS or WIFI_MOD_CLASS_HR_DSSS!");
+    }
+  uint16_t numberOfBitsPerSubcarrier = static_cast<uint16_t> (log2 (constellationSize));
+  uint64_t dataRate = ((11000000 / divisor) * numberOfBitsPerSubcarrier);
+  return dataRate;
+}
+
+bool
+DsssPhy::IsModeAllowed (uint16_t /* channelWidth */, uint8_t /* nss */)
+{
+  return true;
+}
+
+uint32_t
+DsssPhy::GetMaxPsduSize (void) const
+{
+  return 4095;
+}
+
+} //namespace ns3
+
+namespace {
+
+/**
+ * Constructor class for DSSS modes
+ */
+static class ConstructorDsss
+{
+public:
+  ConstructorDsss ()
+  {
+    ns3::DsssPhy::InitializeModes ();
+    ns3::Ptr<ns3::DsssPhy> phyEntity = ns3::Create<ns3::DsssPhy> ();
+    ns3::WifiPhy::AddStaticPhyEntity (ns3::WIFI_MOD_CLASS_HR_DSSS, phyEntity);
+    ns3::WifiPhy::AddStaticPhyEntity (ns3::WIFI_MOD_CLASS_DSSS, phyEntity); //use same entity when plain DSSS modes are used
+  }
+} g_constructor_dsss; ///< the constructor for DSSS modes
+
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/dsss-phy.h ns-3.34/src/wifi/model/non-ht/dsss-phy.h
--- ns-3.33/src/wifi/model/non-ht/dsss-phy.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/dsss-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,208 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy)
+ *          Mathieu Lacage <mathieu.lacage@sophia.inria.fr> (for logic ported from wifi-phy)
+ */
+
+#ifndef DSSS_PHY_H
+#define DSSS_PHY_H
+
+#include "ns3/phy-entity.h"
+#include <vector>
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of ns3::DsssPhy class.
+ */
+
+namespace ns3 {
+
+/**
+ * \brief PHY entity for HR/DSSS (11b)
+ * \ingroup wifi
+ *
+ * Refer to IEEE 802.11-2016, clause 16 (HR/DSSS).
+ * Note that DSSS rates (clause 15) are a subset
+ * of HR/DSSS rates.
+ */
+class DsssPhy : public PhyEntity
+{
+public:
+  /**
+   * Constructor for HR/DSSS PHY
+   */
+  DsssPhy ();
+  /**
+   * Destructor for HR/DSSS PHY
+   */
+  virtual ~DsssPhy ();
+
+  WifiMode GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const override;
+  const PpduFormats & GetPpduFormats (void) const override;
+  Time GetDuration (WifiPpduField field, const WifiTxVector& txVector) const override;
+  Time GetPayloadDuration (uint32_t size, const WifiTxVector& txVector, WifiPhyBand band, MpduType mpdutype,
+                           bool incFlag, uint32_t &totalAmpduSize, double &totalAmpduNumSymbols,
+                           uint16_t staId) const override;
+  Ptr<WifiPpdu> BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration) override;
+  uint32_t GetMaxPsduSize (void) const override;
+
+  /**
+   * Initialize all HR/DSSS modes.
+   */
+  static void InitializeModes (void);
+  /**
+   * Return a WifiMode for HR/DSSS
+   * corresponding to the provided rate.
+   *
+   * \param rate the rate in bps
+   * \return a WifiMode for HR/DSSS
+   */
+  static WifiMode GetDsssRate (uint64_t rate);
+  /**
+   * Return a WifiMode for DSSS at 1 Mbps.
+   *
+   * \return a WifiMode for DSSS at 1 Mbps
+   */
+  static WifiMode GetDsssRate1Mbps (void);
+  /**
+   * Return a WifiMode for DSSS at 2 Mbps.
+   *
+   * \return a WifiMode for DSSS at 2 Mbps
+   */
+  static WifiMode GetDsssRate2Mbps (void);
+  /**
+   * Return a WifiMode for HR/DSSS at 5.5 Mbps.
+   *
+   * \return a WifiMode for HR/DSSS at 5.5 Mbps
+   */
+  static WifiMode GetDsssRate5_5Mbps (void);
+  /**
+   * Return a WifiMode for HR/DSSS at 11 Mbps.
+   *
+   * \return a WifiMode for HR/DSSS at 11 Mbps
+   */
+  static WifiMode GetDsssRate11Mbps (void);
+
+  /**
+   * Return the WifiCodeRate from the DSSS or HR/DSSS mode's unique
+   * name using ModulationLookupTable. This is mainly used as a
+   * callback for WifiMode operation.
+   *
+   * \param name the unique name of the DSSS or HR/DSSS mode
+   * \return WifiCodeRate corresponding to the unique name
+   */
+  static WifiCodeRate GetCodeRate (const std::string& name);
+  /**
+   * Return the constellation size from the DSSS or HR/DSSS mode's
+   * unique name using ModulationLookupTable. This is mainly used
+   * as a callback for WifiMode operation.
+   *
+   * \param name the unique name of the DSSS or HR/DSSS mode
+   * \return constellation size corresponding to the unique name
+   */
+  static uint16_t GetConstellationSize (const std::string& name);
+  /**
+   * Return the data rate corresponding to
+   * the supplied TXVECTOR.
+   * This function is mainly used as a callback
+   * for WifiMode operation.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the station ID (only here to have a common signature for all callbacks)
+   * \return the data bit rate in bps.
+   */
+  static uint64_t GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t staId);
+  /**
+   * Return the data rate from the DSSS or HR/DSSS mode's unique name and
+   * the supplied parameters. This function is mainly used as a callback
+   * for WifiMode operation.
+   *
+   * \param name the unique name of the DSSS or HR/DSSS mode
+   * \param modClass the modulation class, must be either WIFI_MOD_CLASS_DSSS or WIFI_MOD_CLASS_HR_DSSS
+   * \param channelWidth the considered channel width in MHz
+   * \param guardInterval the considered guard interval duration in nanoseconds
+   * \param nss the considered number of streams
+   *
+   * \return the data bit rate of this signal in bps.
+   */
+  static uint64_t GetDataRate (const std::string& name, WifiModulationClass modClass, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  /**
+   * Check whether the combination of <WifiMode, channel width, NSS> is allowed.
+   * This function is used as a callback for WifiMode operation, and always
+   * returns true since there is no limitation for any mode in DsssPhy.
+   *
+   * \param channelWidth the considered channel width in MHz
+   * \param nss the considered number of streams
+   * \returns true.
+   */
+  static bool IsModeAllowed (uint16_t channelWidth, uint8_t nss);
+
+private:
+  PhyFieldRxStatus DoEndReceiveField (WifiPpduField field, Ptr<Event> event) override;
+  Ptr<SpectrumValue> GetTxPowerSpectralDensity (double txPowerW, Ptr<const WifiPpdu> ppdu) const override;
+  uint16_t GetRxChannelWidth (const WifiTxVector& txVector) const override;
+
+  /**
+   * \param txVector the transmission parameters
+   * \return the WifiMode used for the PHY header field
+   */
+  WifiMode GetHeaderMode (const WifiTxVector& txVector) const;
+
+  /**
+   * \param txVector the transmission parameters
+   * \return the duration of the PHY preamble field
+   *
+   * \see WIFI_PPDU_FIELD_PREAMBLE
+   */
+  Time GetPreambleDuration (const WifiTxVector& txVector) const;
+  /**
+   * \param txVector the transmission parameters
+   * \return the duration of the PHY header field
+   */
+  Time GetHeaderDuration (const WifiTxVector& txVector) const;
+
+  /**
+   * End receiving the header, perform DSSS-specific actions, and
+   * provide the status of the reception.
+   *
+   * \param event the event holding incoming PPDU's information
+   * \return status of the reception of the header
+   */
+  PhyFieldRxStatus EndReceiveHeader (Ptr<Event> event);
+
+  /**
+   * Create a DSSS or HR/DSSS mode from a unique name, the unique name
+   * must already be contained inside ModulationLookupTable.
+   * This method binds all the callbacks used by WifiMode.
+   *
+   * \param uniqueName the unique name of the WifiMode
+   * \param modClass the modulation class of the WifiMode, must be either WIFI_MOD_CLASS_DSSS or WIFI_MOD_CLASS_HR_DSSS
+   * \return the DSSS or HR/DSSS WifiMode
+   */
+  static WifiMode CreateDsssMode (std::string uniqueName, WifiModulationClass modClass);
+
+  static const PpduFormats m_dsssPpduFormats; //!< DSSS and HR/DSSS PPDU formats
+
+  static const ModulationLookupTable m_dsssModulationLookupTable; //!< lookup table to retrieve code rate and constellation size corresponding to a unique name of modulation
+}; //class DsssPhy
+
+} //namespace ns3
+
+#endif /* DSSS_PHY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/dsss-ppdu.cc ns-3.34/src/wifi/model/non-ht/dsss-ppdu.cc
--- ns-3.33/src/wifi/model/non-ht/dsss-ppdu.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/dsss-ppdu.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,197 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Rediet <getachew.redieteab@orange.com>
+ *         Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
+ *         Sébastien Deronne <sebastien.deronne@gmail.com> (DsssSigHeader)
+ */
+
+#include "ns3/wifi-phy.h"
+#include "ns3/wifi-psdu.h"
+#include "dsss-phy.h"
+#include "dsss-ppdu.h"
+#include "ns3/log.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("DsssPpdu");
+
+DsssPpdu::DsssPpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, Time ppduDuration, uint64_t uid)
+  : WifiPpdu (psdu, txVector, uid)
+{
+  NS_LOG_FUNCTION (this << psdu << txVector << ppduDuration << uid);
+  m_dsssSig.SetRate (txVector.GetMode ().GetDataRate (22));
+  Time psduDuration = ppduDuration - WifiPhy::CalculatePhyPreambleAndHeaderDuration (txVector);
+  m_dsssSig.SetLength (psduDuration.GetMicroSeconds ());
+}
+
+DsssPpdu::~DsssPpdu ()
+{
+}
+
+WifiTxVector
+DsssPpdu::DoGetTxVector (void) const
+{
+  WifiTxVector txVector;
+  txVector.SetPreambleType (m_preamble);
+  txVector.SetMode (DsssPhy::GetDsssRate (m_dsssSig.GetRate ()));
+  txVector.SetChannelWidth (22);
+  return txVector;
+}
+
+Time
+DsssPpdu::GetTxDuration (void) const
+{
+  Time ppduDuration = Seconds (0);
+  const WifiTxVector& txVector = GetTxVector ();
+  ppduDuration = MicroSeconds (m_dsssSig.GetLength ()) + WifiPhy::CalculatePhyPreambleAndHeaderDuration (txVector);
+  return ppduDuration;
+}
+
+Ptr<WifiPpdu>
+DsssPpdu::Copy (void) const
+{
+  return Create<DsssPpdu> (GetPsdu (), GetTxVector (), GetTxDuration (), m_uid);
+}
+
+DsssPpdu::DsssSigHeader::DsssSigHeader ()
+  : m_rate (0b00001010),
+    m_length (0)
+{
+}
+
+DsssPpdu::DsssSigHeader::~DsssSigHeader ()
+{
+}
+
+TypeId
+DsssPpdu::DsssSigHeader::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::DsssSigHeader")
+    .SetParent<Header> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<DsssSigHeader> ()
+  ;
+  return tid;
+}
+
+TypeId
+DsssPpdu::DsssSigHeader::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+void
+DsssPpdu::DsssSigHeader::Print (std::ostream &os) const
+{
+  os << "SIGNAL=" << GetRate ()
+     << " LENGTH=" << m_length;
+}
+
+uint32_t
+DsssPpdu::DsssSigHeader::GetSerializedSize (void) const
+{
+  return 6;
+}
+
+void
+DsssPpdu::DsssSigHeader::SetRate (uint64_t rate)
+{
+  /* Here is the binary representation for a given rate:
+   * 1 Mbit/s: 00001010
+   * 2 Mbit/s: 00010100
+   * 5.5 Mbit/s: 00110111
+   * 11 Mbit/s: 01101110
+   */
+  switch (rate)
+    {
+      case 1000000:
+        m_rate = 0b00001010;
+        break;
+      case 2000000:
+        m_rate = 0b00010100;
+        break;
+      case 5500000:
+        m_rate = 0b00110111;
+        break;
+      case 11000000:
+        m_rate = 0b01101110;
+        break;
+      default:
+        NS_ASSERT_MSG (false, "Invalid rate");
+        break;
+    }
+}
+
+uint64_t
+DsssPpdu::DsssSigHeader::GetRate (void) const
+{
+  uint64_t rate = 0;
+  switch (m_rate)
+    {
+      case 0b00001010:
+        rate = 1000000;
+        break;
+      case 0b00010100:
+        rate = 2000000;
+        break;
+      case 0b00110111:
+        rate = 5500000;
+        break;
+      case 0b01101110:
+        rate = 11000000;
+        break;
+      default:
+        NS_ASSERT_MSG (false, "Invalid rate");
+        break;
+    }
+  return rate;
+}
+
+void
+DsssPpdu::DsssSigHeader::SetLength (uint16_t length)
+{
+  m_length = length;
+}
+
+uint16_t
+DsssPpdu::DsssSigHeader::GetLength (void) const
+{
+  return m_length;
+}
+
+void
+DsssPpdu::DsssSigHeader::Serialize (Buffer::Iterator start) const
+{
+  start.WriteU8 (m_rate);
+  start.WriteU8 (0); /* SERVICE */
+  start.WriteU16 (m_length);
+  start.WriteU16 (0); /* CRC */
+}
+
+uint32_t
+DsssPpdu::DsssSigHeader::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+  m_rate = i.ReadU8 ();
+  i.ReadU8 (); /* SERVICE */
+  m_length =  i.ReadU16 ();
+  i.ReadU16 (); /* CRC */
+  return i.GetDistanceFrom (start);
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/dsss-ppdu.h ns-3.34/src/wifi/model/non-ht/dsss-ppdu.h
--- ns-3.33/src/wifi/model/non-ht/dsss-ppdu.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/dsss-ppdu.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,126 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Rediet <getachew.redieteab@orange.com>
+ *         Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
+ *         Sébastien Deronne <sebastien.deronne@gmail.com> (DsssSigHeader)
+ */
+
+#ifndef DSSS_PPDU_H
+#define DSSS_PPDU_H
+
+#include "ns3/wifi-ppdu.h"
+#include "ns3/header.h"
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of ns3::DsssPpdu class.
+ */
+
+namespace ns3 {
+
+class WifiPsdu;
+
+/**
+ * \brief DSSS (HR/DSSS) PPDU (11b)
+ * \ingroup wifi
+ *
+ * DsssPpdu stores a preamble, PHY headers and a PSDU of a PPDU with DSSS modulation.
+ */
+class DsssPpdu : public WifiPpdu
+{
+public:
+
+  /**
+   * DSSS SIG PHY header.
+   * See section 16.2.2 in IEEE 802.11-2016.
+   */
+  class DsssSigHeader : public Header
+  {
+  public:
+    DsssSigHeader ();
+    virtual ~DsssSigHeader ();
+
+    /**
+     * \brief Get the type ID.
+     * \return the object TypeId
+     */
+    static TypeId GetTypeId (void);
+
+    TypeId GetInstanceTypeId (void) const override;
+    void Print (std::ostream &os) const override;
+    uint32_t GetSerializedSize (void) const override;
+    void Serialize (Buffer::Iterator start) const override;
+    uint32_t Deserialize (Buffer::Iterator start) override;
+
+    /**
+     * Fill the RATE field of L-SIG (in bit/s).
+     *
+     * \param rate the RATE field of L-SIG expressed in bit/s
+     */
+    void SetRate (uint64_t rate);
+    /**
+     * Return the RATE field of L-SIG (in bit/s).
+     *
+     * \return the RATE field of L-SIG expressed in bit/s
+     */
+    uint64_t GetRate (void) const;
+    /**
+     * Fill the LENGTH field of L-SIG (in bytes).
+     *
+     * \param length the LENGTH field of L-SIG expressed in bytes
+     */
+    void SetLength (uint16_t length);
+    /**
+     * Return the LENGTH field of L-SIG (in bytes).
+     *
+     * \return the LENGTH field of L-SIG expressed in bytes
+     */
+    uint16_t GetLength (void) const;
+
+  private:
+    uint8_t m_rate;    ///< RATE field
+    uint16_t m_length; ///< LENGTH field
+  }; //class DsssSigHeader
+
+  /**
+   * Create a DSSS (HR/DSSS) PPDU.
+   *
+   * \param psdu the PHY payload (PSDU)
+   * \param txVector the TXVECTOR that was used for this PPDU
+   * \param ppduDuration the transmission duration of this PPDU
+   * \param uid the unique ID of this PPDU
+   */
+  DsssPpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, Time ppduDuration, uint64_t uid);
+  /**
+   * Destructor for DsssPpdu.
+   */
+  virtual ~DsssPpdu ();
+
+  Time GetTxDuration (void) const override;
+  Ptr<WifiPpdu> Copy (void) const override;
+
+private:
+  WifiTxVector DoGetTxVector (void) const override;
+
+  DsssSigHeader m_dsssSig;  //!< the DSSS SIG PHY header
+}; //class DsssPpdu
+
+} //namespace ns3
+
+#endif /* DSSS_PPDU_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/erp-information.cc ns-3.34/src/wifi/model/non-ht/erp-information.cc
--- ns-3.33/src/wifi/model/non-ht/erp-information.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/erp-information.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,134 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015 Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "erp-information.h"
+
+namespace ns3 {
+
+ErpInformation::ErpInformation ()
+  : m_erpInformation (0),
+    m_erpSupported (0)
+{
+}
+
+WifiInformationElementId
+ErpInformation::ElementId () const
+{
+  return IE_ERP_INFORMATION;
+}
+
+void
+ErpInformation::SetErpSupported (uint8_t erpSupported)
+{
+  m_erpSupported = erpSupported;
+}
+
+void
+ErpInformation::SetBarkerPreambleMode (uint8_t barkerPreambleMode)
+{
+  m_erpInformation |= (barkerPreambleMode & 0x01) << 2;
+}
+
+void
+ErpInformation::SetUseProtection (uint8_t useProtection)
+{
+  m_erpInformation |= (useProtection & 0x01) << 1;
+}
+
+void
+ErpInformation::SetNonErpPresent (uint8_t nonErpPresent)
+{
+  m_erpInformation |= nonErpPresent & 0x01;
+}
+
+uint8_t
+ErpInformation::GetBarkerPreambleMode (void) const
+{
+  return ((m_erpInformation >> 2) & 0x01);
+}
+
+uint8_t
+ErpInformation::GetUseProtection (void) const
+{
+  return ((m_erpInformation >> 1) & 0x01);
+}
+
+uint8_t
+ErpInformation::GetNonErpPresent (void) const
+{
+  return (m_erpInformation & 0x01);
+}
+
+uint8_t
+ErpInformation::GetInformationFieldSize () const
+{
+  NS_ASSERT (m_erpSupported);
+  return 1;
+}
+
+Buffer::Iterator
+ErpInformation::Serialize (Buffer::Iterator i) const
+{
+  if (!m_erpSupported)
+    {
+      return i;
+    }
+  return WifiInformationElement::Serialize (i);
+}
+
+uint16_t
+ErpInformation::GetSerializedSize () const
+{
+  if (!m_erpSupported)
+    {
+      return 0;
+    }
+  return WifiInformationElement::GetSerializedSize ();
+}
+
+void
+ErpInformation::SerializeInformationField (Buffer::Iterator start) const
+{
+  if (m_erpSupported)
+    {
+      start.WriteU8 (m_erpInformation);
+    }
+}
+
+uint8_t
+ErpInformation::DeserializeInformationField (Buffer::Iterator start,
+                                             uint8_t length)
+{
+  Buffer::Iterator i = start;
+  m_erpInformation = i.ReadU8 ();
+  return length;
+}
+
+std::ostream &
+operator << (std::ostream &os, const ErpInformation &erpInformation)
+{
+  os <<  bool (erpInformation.GetBarkerPreambleMode ())
+     << "|" << bool (erpInformation.GetUseProtection ())
+     << "|" << bool (erpInformation.GetNonErpPresent ());
+
+  return os;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/erp-information.h ns-3.34/src/wifi/model/non-ht/erp-information.h
--- ns-3.33/src/wifi/model/non-ht/erp-information.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/erp-information.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,118 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015 Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef ERP_INFORMATION_H
+#define ERP_INFORMATION_H
+
+#include "ns3/wifi-information-element.h"
+
+namespace ns3 {
+
+/**
+ * \brief The ErpInformation Information Element
+ * \ingroup wifi
+ *
+ * This class knows how to serialise and deserialise the ErpInformation Information Element.
+ */
+class ErpInformation : public WifiInformationElement
+{
+public:
+  ErpInformation ();
+
+  // Implementations of pure virtual methods of WifiInformationElement
+  WifiInformationElementId ElementId () const override;
+  uint8_t GetInformationFieldSize () const override;
+  void SerializeInformationField (Buffer::Iterator start) const override;
+  uint8_t DeserializeInformationField (Buffer::Iterator start,
+                                       uint8_t length) override;
+
+  /* This information element is a bit special in that it is only
+     included if the STA is an ERP STA. To support this we
+     override the Serialize and GetSerializedSize methods of
+     WifiInformationElement. */
+  Buffer::Iterator Serialize (Buffer::Iterator start) const override;
+  uint16_t GetSerializedSize () const override;
+
+  /**
+   * Set the ERP supported field.
+   *
+   * \param erpSupported the ERP supported field in the ErpInformation information element
+   */
+  void SetErpSupported (uint8_t erpSupported);
+
+  /**
+   * Set the Barker_Preamble_Mode field in the ErpInformation information element.
+   *
+   * \param barkerPreambleMode the Barker_Preamble_Mode field in the ErpInformation information element
+   */
+  void SetBarkerPreambleMode (uint8_t barkerPreambleMode);
+  /**
+   * Set the Use_Protection field in the ErpInformation information element.
+   *
+   * \param useProtection the Use_Protection field in the ErpInformation information element
+   */
+  void SetUseProtection (uint8_t useProtection);
+  /**
+   * Set the Non_Erp_Present field in the ErpInformation information element.
+   *
+   * \param nonErpPresent the Non_Erp_Present field in the ErpInformation information element
+   */
+  void SetNonErpPresent (uint8_t nonErpPresent);
+
+  /**
+   * Return the Barker_Preamble_Mode field in the ErpInformation information element.
+   *
+   * \return the Barker_Preamble_Mode field in the ErpInformation information element
+   */
+  uint8_t GetBarkerPreambleMode (void) const;
+  /**
+   * Return the Use_Protection field in the ErpInformation information element.
+   *
+   * \return the Use_Protection field in the ErpInformation information element
+   */
+  uint8_t GetUseProtection (void) const;
+  /**
+   * Return the Non_Erp_Present field in the ErpInformation information element.
+   *
+   * \return the Non_Erp_Present field in the ErpInformation information element
+   */
+  uint8_t GetNonErpPresent (void) const;
+
+
+private:
+  uint8_t m_erpInformation; ///< ERP information
+
+  /// This is used to decide whether this element should be added to the frame or not
+  bool m_erpSupported;
+};
+
+/**
+ * output stream output operator
+ *
+ * \param os output stream
+ * \param erpInformation the ERP Information
+ *
+ * \returns output stream
+ */
+std::ostream &operator << (std::ostream &os, const ErpInformation &erpInformation);
+
+} //namespace ns3
+
+#endif /* ERP_INFORMATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/erp-ofdm-phy.cc ns-3.34/src/wifi/model/non-ht/erp-ofdm-phy.cc
--- ns-3.33/src/wifi/model/non-ht/erp-ofdm-phy.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/erp-ofdm-phy.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,262 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy)
+ *          Mathieu Lacage <mathieu.lacage@sophia.inria.fr> (for logic ported from wifi-phy)
+ */
+
+#include <array>
+#include "erp-ofdm-phy.h"
+#include "erp-ofdm-ppdu.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/wifi-phy.h" //only used for static mode constructor
+#include "ns3/log.h"
+#include "ns3/assert.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("ErpOfdmPhy");
+
+/*******************************************************
+ *       ERP-OFDM PHY (IEEE 802.11-2016, clause 18)
+ *******************************************************/
+
+/* *NS_CHECK_STYLE_OFF* */
+const PhyEntity::ModulationLookupTable ErpOfdmPhy::m_erpOfdmModulationLookupTable {
+  // Unique name           Code rate           Constellation size
+  { "ErpOfdmRate6Mbps",  { WIFI_CODE_RATE_1_2, 2 } },
+  { "ErpOfdmRate9Mbps",  { WIFI_CODE_RATE_3_4, 2 } },
+  { "ErpOfdmRate12Mbps", { WIFI_CODE_RATE_1_2, 4 } },
+  { "ErpOfdmRate18Mbps", { WIFI_CODE_RATE_3_4, 4 } },
+  { "ErpOfdmRate24Mbps", { WIFI_CODE_RATE_1_2, 16 } },
+  { "ErpOfdmRate36Mbps", { WIFI_CODE_RATE_3_4, 16 } },
+  { "ErpOfdmRate48Mbps", { WIFI_CODE_RATE_2_3, 64 } },
+  { "ErpOfdmRate54Mbps", { WIFI_CODE_RATE_3_4, 64 } }
+};
+
+/// ERP OFDM rates in bits per second
+static const std::array<uint64_t, 8> s_erpOfdmRatesBpsList =
+    {  6000000,  9000000, 12000000, 18000000,
+      24000000, 36000000, 48000000, 54000000};
+
+/* *NS_CHECK_STYLE_ON* */
+
+/**
+ * Get the array of possible ERP OFDM rates.
+ *
+ * \return the ERP OFDM rates in bits per second
+ */
+const std::array<uint64_t, 8>& GetErpOfdmRatesBpsList (void)
+{
+  return s_erpOfdmRatesBpsList;
+};
+
+ErpOfdmPhy::ErpOfdmPhy ()
+  : OfdmPhy (OFDM_PHY_DEFAULT, false) //don't add OFDM modes to list
+{
+  NS_LOG_FUNCTION (this);
+  for (const auto & rate : GetErpOfdmRatesBpsList ())
+    {
+      WifiMode mode = GetErpOfdmRate (rate);
+      NS_LOG_LOGIC ("Add " << mode << " to list");
+      m_modeList.emplace_back (mode);
+    }
+}
+
+ErpOfdmPhy::~ErpOfdmPhy ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+WifiMode
+ErpOfdmPhy::GetHeaderMode (const WifiTxVector& txVector) const
+{
+  NS_ASSERT (txVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM);
+  return GetErpOfdmRate6Mbps ();
+}
+
+Time
+ErpOfdmPhy::GetPreambleDuration (const WifiTxVector& /* txVector */) const
+{
+  return MicroSeconds (16); //L-STF + L-LTF
+}
+
+Time
+ErpOfdmPhy::GetHeaderDuration (const WifiTxVector& /* txVector */) const
+{
+  return MicroSeconds (4); //L-SIG
+}
+
+Ptr<WifiPpdu>
+ErpOfdmPhy::BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time /* ppduDuration */)
+{
+  NS_LOG_FUNCTION (this << psdus << txVector);
+  return Create<ErpOfdmPpdu> (psdus.begin ()->second, txVector, m_wifiPhy->GetPhyBand (),
+                              ObtainNextUid (txVector));
+}
+
+void
+ErpOfdmPhy::InitializeModes (void)
+{
+  for (const auto & rate : GetErpOfdmRatesBpsList ())
+    {
+      GetErpOfdmRate (rate);
+    }
+}
+
+WifiMode
+ErpOfdmPhy::GetErpOfdmRate (uint64_t rate)
+{
+  switch (rate)
+    {
+      case 6000000:
+        return GetErpOfdmRate6Mbps ();
+      case 9000000:
+        return GetErpOfdmRate9Mbps ();
+      case 12000000:
+        return GetErpOfdmRate12Mbps ();
+      case 18000000:
+        return GetErpOfdmRate18Mbps ();
+      case 24000000:
+        return GetErpOfdmRate24Mbps ();
+      case 36000000:
+        return GetErpOfdmRate36Mbps ();
+      case 48000000:
+        return GetErpOfdmRate48Mbps ();
+      case 54000000:
+        return GetErpOfdmRate54Mbps ();
+      default:
+        NS_ABORT_MSG ("Inexistent rate (" << rate << " bps) requested for ERP-OFDM");
+        return WifiMode ();
+    }
+}
+
+#define GET_ERP_OFDM_MODE(x, f) \
+WifiMode \
+ErpOfdmPhy::Get ## x (void) \
+{ \
+  static WifiMode mode = CreateErpOfdmMode (#x, f); \
+  return mode; \
+}; \
+
+GET_ERP_OFDM_MODE (ErpOfdmRate6Mbps,  true)
+GET_ERP_OFDM_MODE (ErpOfdmRate9Mbps,  false)
+GET_ERP_OFDM_MODE (ErpOfdmRate12Mbps, true)
+GET_ERP_OFDM_MODE (ErpOfdmRate18Mbps, false)
+GET_ERP_OFDM_MODE (ErpOfdmRate24Mbps, true)
+GET_ERP_OFDM_MODE (ErpOfdmRate36Mbps, false)
+GET_ERP_OFDM_MODE (ErpOfdmRate48Mbps, false)
+GET_ERP_OFDM_MODE (ErpOfdmRate54Mbps, false)
+#undef GET_ERP_OFDM_MODE
+
+WifiMode
+ErpOfdmPhy::CreateErpOfdmMode (std::string uniqueName, bool isMandatory)
+{
+  // Check whether uniqueName is in lookup table
+  const auto it = m_erpOfdmModulationLookupTable.find (uniqueName);
+  NS_ASSERT_MSG (it != m_erpOfdmModulationLookupTable.end (), "ERP-OFDM mode cannot be created because it is not in the lookup table!");
+
+  return WifiModeFactory::CreateWifiMode (uniqueName,
+                                          WIFI_MOD_CLASS_ERP_OFDM,
+                                          isMandatory,
+                                          MakeBoundCallback (&GetCodeRate, uniqueName),
+                                          MakeBoundCallback (&GetConstellationSize, uniqueName),
+                                          MakeBoundCallback (&GetPhyRate, uniqueName),
+                                          MakeCallback (&GetPhyRateFromTxVector),
+                                          MakeBoundCallback (&GetDataRate, uniqueName),
+                                          MakeCallback (&GetDataRateFromTxVector),
+                                          MakeCallback (&IsModeAllowed));
+}
+
+WifiCodeRate
+ErpOfdmPhy::GetCodeRate (const std::string& name)
+{
+  return m_erpOfdmModulationLookupTable.at (name).first;
+}
+
+uint16_t
+ErpOfdmPhy::GetConstellationSize (const std::string& name)
+{
+  return m_erpOfdmModulationLookupTable.at (name).second;
+}
+
+uint64_t
+ErpOfdmPhy::GetPhyRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+{
+  WifiCodeRate codeRate = GetCodeRate (name);
+  uint16_t constellationSize = GetConstellationSize (name);
+  uint64_t dataRate = OfdmPhy::CalculateDataRate (codeRate, constellationSize, channelWidth, guardInterval, nss);
+  return OfdmPhy::CalculatePhyRate (codeRate, dataRate);
+}
+
+uint64_t
+ErpOfdmPhy::GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
+{
+  return GetPhyRate (txVector.GetMode ().GetUniqueName (),
+                     txVector.GetChannelWidth (),
+                     txVector.GetGuardInterval (),
+                     txVector.GetNss ());
+}
+
+uint64_t
+ErpOfdmPhy::GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
+{
+  return GetDataRate (txVector.GetMode ().GetUniqueName (),
+                      txVector.GetChannelWidth (),
+                      txVector.GetGuardInterval (),
+                      txVector.GetNss ());
+}
+
+uint64_t
+ErpOfdmPhy::GetDataRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+{
+  WifiCodeRate codeRate = GetCodeRate (name);
+  uint16_t constellationSize = GetConstellationSize (name);
+  return OfdmPhy::CalculateDataRate (codeRate, constellationSize, channelWidth, guardInterval, nss);
+}
+
+bool
+ErpOfdmPhy::IsModeAllowed (uint16_t /* channelWidth */, uint8_t /* nss */)
+{
+  return true;
+}
+
+uint32_t
+ErpOfdmPhy::GetMaxPsduSize (void) const
+{
+  return 4095;
+}
+
+} //namespace ns3
+
+namespace {
+
+/**
+ * Constructor class for ERP-OFDM modes
+ */
+static class ConstructorErpOfdm
+{
+public:
+  ConstructorErpOfdm ()
+  {
+    ns3::ErpOfdmPhy::InitializeModes ();
+    ns3::WifiPhy::AddStaticPhyEntity (ns3::WIFI_MOD_CLASS_ERP_OFDM, ns3::Create<ns3::ErpOfdmPhy> ());
+  }
+} g_constructor_erp_ofdm; ///< the constructor for ERP-OFDM modes
+
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/erp-ofdm-phy.h ns-3.34/src/wifi/model/non-ht/erp-ofdm-phy.h
--- ns-3.33/src/wifi/model/non-ht/erp-ofdm-phy.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/erp-ofdm-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,220 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy)
+ *          Mathieu Lacage <mathieu.lacage@sophia.inria.fr> (for logic ported from wifi-phy)
+ */
+
+#ifndef ERP_OFDM_PHY_H
+#define ERP_OFDM_PHY_H
+
+#include "ofdm-phy.h"
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of ns3::ErpOfdmPhy class.
+ */
+
+namespace ns3 {
+
+/**
+ * \brief PHY entity for ERP-OFDM (11g)
+ * \ingroup wifi
+ *
+ * ERP-OFDM PHY is based on OFDM PHY.
+ * ERP-DSSS/CCK mode is not supported.
+ *
+ * Refer to IEEE 802.11-2016, clause 18.
+ */
+class ErpOfdmPhy : public OfdmPhy
+{
+public:
+  /**
+   * Constructor for ERP-OFDM PHY
+   */
+  ErpOfdmPhy ();
+  /**
+   * Destructor for ERP-OFDM PHY
+   */
+  virtual ~ErpOfdmPhy ();
+
+  Ptr<WifiPpdu> BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration) override;
+  uint32_t GetMaxPsduSize (void) const override;
+
+  /**
+   * Initialize all ERP-OFDM modes.
+   */
+  static void InitializeModes (void);
+  /**
+   * Return a WifiMode for ERP-OFDM
+   * corresponding to the provided rate.
+   *
+   * \param rate the rate in bps
+   * \return a WifiMode for ERP-OFDM
+   */
+  static WifiMode GetErpOfdmRate (uint64_t rate);
+
+  /**
+   * Return a WifiMode for ERP-OFDM at 6 Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 6 Mbps
+   */
+  static WifiMode GetErpOfdmRate6Mbps (void);
+  /**
+   * Return a WifiMode for ERP-OFDM at 9 Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 9 Mbps
+   */
+  static WifiMode GetErpOfdmRate9Mbps (void);
+  /**
+   * Return a WifiMode for ERP-OFDM at 12 Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 12 Mbps
+   */
+  static WifiMode GetErpOfdmRate12Mbps (void);
+  /**
+   * Return a WifiMode for ERP-OFDM at 18 Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 18 Mbps
+   */
+  static WifiMode GetErpOfdmRate18Mbps (void);
+  /**
+   * Return a WifiMode for ERP-OFDM at 24 Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 24 Mbps
+   */
+  static WifiMode GetErpOfdmRate24Mbps (void);
+  /**
+   * Return a WifiMode for ERP-OFDM at 36 Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 36 Mbps
+   */
+  static WifiMode GetErpOfdmRate36Mbps (void);
+  /**
+   * Return a WifiMode for ERP-OFDM at 48 Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 48 Mbps
+   */
+  static WifiMode GetErpOfdmRate48Mbps (void);
+  /**
+   * Return a WifiMode for ERP-OFDM at 54 Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 54 Mbps
+   */
+  static WifiMode GetErpOfdmRate54Mbps (void);
+
+  /**
+   * Return the WifiCodeRate from the ERP-OFDM mode's unique name using
+   * ModulationLookupTable. This is mainly used as a callback for
+   * WifiMode operation.
+   *
+   * \param name the unique name of the ERP-OFDM mode
+   * \return WifiCodeRate corresponding to the unique name
+   */
+  static WifiCodeRate GetCodeRate (const std::string& name);
+  /**
+   * Return the constellation size from the ERP-OFDM mode's unique name using
+   * ModulationLookupTable. This is mainly used as a callback for
+   * WifiMode operation.
+   *
+   * \param name the unique name of the ERP-OFDM mode
+   * \return constellation size corresponding to the unique name
+   */
+  static uint16_t GetConstellationSize (const std::string& name);
+  /**
+   * Return the PHY rate from the ERP-OFDM mode's unique name and
+   * the supplied parameters. This function calls OfdmPhy::CalculatePhyRate
+   * and is mainly used as a callback for WifiMode operation.
+   *
+   * \param name the unique name of the ERP-OFDM mode
+   * \param channelWidth the considered channel width in MHz
+   * \param guardInterval the considered guard interval duration in nanoseconds
+   * \param nss the considered number of streams
+   *
+   * \return the physical bit rate of this signal in bps.
+   */
+  static uint64_t GetPhyRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  /**
+   * Return the PHY rate corresponding to
+   * the supplied TXVECTOR.
+   * This function is mainly used as a callback
+   * for WifiMode operation.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the station ID (only here to have a common signature for all callbacks)
+   * \return the physical bit rate of this signal in bps.
+   */
+  static uint64_t GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t staId);
+  /**
+   * Return the data rate corresponding to
+   * the supplied TXVECTOR.
+   * This function is mainly used as a callback
+   * for WifiMode operation.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the station ID (only here to have a common signature for all callbacks)
+   * \return the data bit rate in bps.
+   */
+  static uint64_t GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t staId);
+  /**
+   * Return the data rate from the ERP-OFDM mode's unique name and
+   * the supplied parameters. This function calls OfdmPhy::CalculateDataRate
+   * and is mainly used as a callback for WifiMode operation.
+   *
+   * \param name the unique name of the ERP-OFDM mode
+   * \param channelWidth the considered channel width in MHz
+   * \param guardInterval the considered guard interval duration in nanoseconds
+   * \param nss the considered number of streams
+   *
+   * \return the data bit rate of this signal in bps.
+   */
+  static uint64_t GetDataRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  /**
+   * Check whether the combination of <WifiMode, channel width, NSS> is allowed.
+   * This function is used as a callback for WifiMode operation, and always
+   * returns true since there is no limitation for any mode in ErpOfdmPhy.
+   *
+   * \param channelWidth the considered channel width in MHz
+   * \param nss the considered number of streams
+   * \returns true.
+   */
+  static bool IsModeAllowed (uint16_t channelWidth, uint8_t nss);
+
+private:
+  WifiMode GetHeaderMode (const WifiTxVector& txVector) const override;
+  Time GetPreambleDuration (const WifiTxVector& txVector) const override;
+  Time GetHeaderDuration (const WifiTxVector& txVector) const override;
+
+  /**
+   * Create an ERP-OFDM mode from a unique name, the unique name
+   * must already be contained inside ModulationLookupTable.
+   * This method binds all the callbacks used by WifiMode.
+   *
+   * \param uniqueName the unique name of the WifiMode
+   * \param isMandatory whether the WifiMode is mandatory
+   * \return the ERP-OFDM WifiMode
+   */
+  static WifiMode CreateErpOfdmMode (std::string uniqueName, bool isMandatory);
+
+  static const ModulationLookupTable m_erpOfdmModulationLookupTable; //!< lookup table to retrieve code rate and constellation size corresponding to a unique name of modulation
+}; //class ErpOfdmPhy
+
+} //namespace ns3
+
+#endif /* ERP_OFDM_PHY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/erp-ofdm-ppdu.cc ns-3.34/src/wifi/model/non-ht/erp-ofdm-ppdu.cc
--- ns-3.33/src/wifi/model/non-ht/erp-ofdm-ppdu.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/erp-ofdm-ppdu.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,59 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Rediet <getachew.redieteab@orange.com>
+ *         Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
+ */
+
+#include "ns3/wifi-psdu.h"
+#include "erp-ofdm-phy.h"
+#include "erp-ofdm-ppdu.h"
+#include "ns3/log.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("ErpOfdmPpdu");
+
+ErpOfdmPpdu::ErpOfdmPpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector,
+                          WifiPhyBand band, uint64_t uid)
+  : OfdmPpdu (psdu, txVector, band, uid, true) //instantiate LSigHeader of OfdmPpdu
+{
+  NS_LOG_FUNCTION (this << psdu << txVector << band << uid);
+}
+
+ErpOfdmPpdu::~ErpOfdmPpdu ()
+{
+}
+
+WifiTxVector
+ErpOfdmPpdu::DoGetTxVector (void) const
+{
+  WifiTxVector txVector;
+  txVector.SetPreambleType (m_preamble);
+  NS_ASSERT (m_channelWidth == 20);
+  txVector.SetMode (ErpOfdmPhy::GetErpOfdmRate (m_lSig.GetRate ()));
+  txVector.SetChannelWidth (m_channelWidth);
+  return txVector;
+}
+
+Ptr<WifiPpdu>
+ErpOfdmPpdu::Copy (void) const
+{
+  return Create<ErpOfdmPpdu> (GetPsdu (), GetTxVector (), m_band, m_uid);
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/erp-ofdm-ppdu.h ns-3.34/src/wifi/model/non-ht/erp-ofdm-ppdu.h
--- ns-3.33/src/wifi/model/non-ht/erp-ofdm-ppdu.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/erp-ofdm-ppdu.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,70 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Rediet <getachew.redieteab@orange.com>
+ *         Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
+ */
+
+#ifndef ERP_OFDM_PPDU_H
+#define ERP_OFDM_PPDU_H
+
+#include "ofdm-ppdu.h"
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of ns3::ErpOfdmPpdu class.
+ */
+
+namespace ns3 {
+
+class WifiPsdu;
+
+/**
+ * \brief ERP-OFDM PPDU (11g)
+ * \ingroup wifi
+ *
+ * ErpOfdmPpdu stores a preamble, PHY headers and a PSDU of a PPDU with non-HT header,
+ * i.e., PPDU that uses ERP-OFDM modulation.
+ */
+class ErpOfdmPpdu : public OfdmPpdu
+{
+public:
+  /**
+   * Create an ERP-OFDM PPDU.
+   *
+   * \param psdu the PHY payload (PSDU)
+   * \param txVector the TXVECTOR that was used for this PPDU
+   * \param band the WifiPhyBand used for the transmission of this PPDU
+   * \param uid the unique ID of this PPDU
+   */
+  ErpOfdmPpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector,
+               WifiPhyBand band, uint64_t uid);
+  /**
+   * Destructor for ErpOfdmPpdu.
+   */
+  virtual ~ErpOfdmPpdu ();
+
+  Ptr<WifiPpdu> Copy (void) const override;
+
+private:
+  WifiTxVector DoGetTxVector (void) const override;
+}; //class ErpOfdmPpdu
+
+} //namespace ns3
+
+#endif /* ERP_OFDM_PPDU_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/ofdm-phy.cc ns-3.34/src/wifi/model/non-ht/ofdm-phy.cc
--- ns-3.33/src/wifi/model/non-ht/ofdm-phy.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/ofdm-phy.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,630 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy)
+ *          Mathieu Lacage <mathieu.lacage@sophia.inria.fr> (for logic ported from wifi-phy)
+ */
+
+#include "ofdm-phy.h"
+#include "ofdm-ppdu.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/wifi-phy.h"
+#include "ns3/wifi-utils.h"
+#include "ns3/simulator.h"
+#include "ns3/log.h"
+#include <array>
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("OfdmPhy");
+
+/*******************************************************
+ *       OFDM PHY (IEEE 802.11-2016, clause 17)
+ *******************************************************/
+
+/* *NS_CHECK_STYLE_OFF* */
+const PhyEntity::PpduFormats OfdmPhy::m_ofdmPpduFormats {
+  { WIFI_PREAMBLE_LONG, { WIFI_PPDU_FIELD_PREAMBLE,      //STF + LTF
+                          WIFI_PPDU_FIELD_NON_HT_HEADER, //SIG
+                          WIFI_PPDU_FIELD_DATA } }
+};
+
+const PhyEntity::ModulationLookupTable OfdmPhy::m_ofdmModulationLookupTable {
+  // Unique name                Code rate           Constellation size
+  { "OfdmRate6Mbps",          { WIFI_CODE_RATE_1_2, 2 } },  // 20 MHz
+  { "OfdmRate9Mbps",          { WIFI_CODE_RATE_3_4, 2 } },  //  |
+  { "OfdmRate12Mbps",         { WIFI_CODE_RATE_1_2, 4 } },  //  V
+  { "OfdmRate18Mbps",         { WIFI_CODE_RATE_3_4, 4 } },
+  { "OfdmRate24Mbps",         { WIFI_CODE_RATE_1_2, 16 } },
+  { "OfdmRate36Mbps",         { WIFI_CODE_RATE_3_4, 16 } },
+  { "OfdmRate48Mbps",         { WIFI_CODE_RATE_2_3, 64 } },
+  { "OfdmRate54Mbps",         { WIFI_CODE_RATE_3_4, 64 } },
+  { "OfdmRate3MbpsBW10MHz",   { WIFI_CODE_RATE_1_2, 2 } },  // 10 MHz
+  { "OfdmRate4_5MbpsBW10MHz", { WIFI_CODE_RATE_3_4, 2 } },  //  |
+  { "OfdmRate6MbpsBW10MHz",   { WIFI_CODE_RATE_1_2, 4 } },  //  V
+  { "OfdmRate9MbpsBW10MHz",   { WIFI_CODE_RATE_3_4, 4 } },
+  { "OfdmRate12MbpsBW10MHz",  { WIFI_CODE_RATE_1_2, 16 } },
+  { "OfdmRate18MbpsBW10MHz",  { WIFI_CODE_RATE_3_4, 16 } },
+  { "OfdmRate24MbpsBW10MHz",  { WIFI_CODE_RATE_2_3, 64 } },
+  { "OfdmRate27MbpsBW10MHz",  { WIFI_CODE_RATE_3_4, 64 } },
+  { "OfdmRate1_5MbpsBW5MHz",  { WIFI_CODE_RATE_1_2, 2 } },  //  5 MHz
+  { "OfdmRate2_25MbpsBW5MHz", { WIFI_CODE_RATE_3_4, 2 } },  //  |
+  { "OfdmRate3MbpsBW5MHz",    { WIFI_CODE_RATE_1_2, 4 } },  //  V
+  { "OfdmRate4_5MbpsBW5MHz",  { WIFI_CODE_RATE_3_4, 4 } },
+  { "OfdmRate6MbpsBW5MHz",    { WIFI_CODE_RATE_1_2, 16 } },
+  { "OfdmRate9MbpsBW5MHz",    { WIFI_CODE_RATE_3_4, 16 } },
+  { "OfdmRate12MbpsBW5MHz",   { WIFI_CODE_RATE_2_3, 64 } },
+  { "OfdmRate13_5MbpsBW5MHz", { WIFI_CODE_RATE_3_4, 64 } }
+};
+
+/// OFDM rates in bits per second for each bandwidth (MHz)
+const std::map<uint16_t, std::array<uint64_t, 8> > s_ofdmRatesBpsList =
+   {{ 20, // MHz
+     {  6000000,  9000000, 12000000, 18000000,
+       24000000, 36000000, 48000000, 54000000 }},
+   { 10, // MHz
+     {  3000000,  4500000,  6000000,  9000000,
+       12000000, 18000000, 24000000, 27000000 }},
+   { 5, // MHz
+     {  1500000,  2250000,  3000000,  4500000,
+        6000000,  9000000, 12000000, 13500000 }}};
+
+/* *NS_CHECK_STYLE_ON* */
+
+/**
+ * Get the array of possible OFDM rates for each bandwidth (MHz).
+ *
+ * \return the OFDM rates in bits per second
+ */
+const std::map<uint16_t, std::array<uint64_t, 8> >& GetOfdmRatesBpsList (void)
+{
+  return s_ofdmRatesBpsList;
+};
+
+
+OfdmPhy::OfdmPhy (OfdmPhyVariant variant /* = OFDM_PHY_DEFAULT */, bool buildModeList /* = true */)
+{
+  NS_LOG_FUNCTION (this << variant << buildModeList);
+
+  if (buildModeList)
+    {
+      auto bwRatesMap = GetOfdmRatesBpsList ();
+
+      switch (variant)
+        {
+          case OFDM_PHY_DEFAULT:
+            for (const auto & rate : bwRatesMap.at (20))
+              {
+                WifiMode mode = GetOfdmRate (rate, 20);
+                NS_LOG_LOGIC ("Add " << mode << " to list");
+                m_modeList.emplace_back (mode);
+              }
+            break;
+          case OFDM_PHY_10_MHZ:
+            for (const auto & rate : bwRatesMap.at (10))
+              {
+                WifiMode mode = GetOfdmRate (rate, 10);
+                NS_LOG_LOGIC ("Add " << mode << " to list");
+                m_modeList.emplace_back (mode);
+              }
+            break;
+          case OFDM_PHY_5_MHZ:
+            for (const auto & rate : bwRatesMap.at (5))
+              {
+                WifiMode mode = GetOfdmRate (rate, 5);
+                NS_LOG_LOGIC ("Add " << mode << " to list");
+                m_modeList.emplace_back (mode);
+              }
+            break;
+          default:
+            NS_ABORT_MSG ("Unsupported 11a OFDM variant");
+        }
+    }
+}
+
+OfdmPhy::~OfdmPhy ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+WifiMode
+OfdmPhy::GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const
+{
+  switch (field)
+    {
+      case WIFI_PPDU_FIELD_PREAMBLE: //consider header mode for preamble (useful for InterferenceHelper)
+      case WIFI_PPDU_FIELD_NON_HT_HEADER:
+        return GetHeaderMode (txVector);
+      default:
+        return PhyEntity::GetSigMode (field, txVector);
+    }
+}
+
+WifiMode
+OfdmPhy::GetHeaderMode (const WifiTxVector& txVector) const
+{
+  switch (txVector.GetChannelWidth ())
+    {
+      case 5:
+        return GetOfdmRate1_5MbpsBW5MHz ();
+      case 10:
+        return GetOfdmRate3MbpsBW10MHz ();
+      case 20:
+      default:
+        //Section 17.3.2 "PPDU frame format"; IEEE Std 802.11-2016.
+        //Actually this is only the first part of the PhyHeader,
+        //because the last 16 bits of the PhyHeader are using the
+        //same mode of the payload
+        return GetOfdmRate6Mbps ();
+    }
+}
+
+const PhyEntity::PpduFormats &
+OfdmPhy::GetPpduFormats (void) const
+{
+  return m_ofdmPpduFormats;
+}
+
+Time
+OfdmPhy::GetDuration (WifiPpduField field, const WifiTxVector& txVector) const
+{
+  switch (field)
+    {
+      case WIFI_PPDU_FIELD_PREAMBLE:
+        return GetPreambleDuration (txVector); //L-STF + L-LTF
+      case WIFI_PPDU_FIELD_NON_HT_HEADER:
+        return GetHeaderDuration (txVector); //L-SIG
+      default:
+        return PhyEntity::GetDuration (field, txVector);
+    }
+}
+
+Time
+OfdmPhy::GetPreambleDuration (const WifiTxVector& txVector) const
+{
+  switch (txVector.GetChannelWidth ())
+    {
+      case 20:
+      default:
+        //Section 17.3.3 "PHY preamble (SYNC)" Figure 17-4 "OFDM training structure"
+        //also Section 17.3.2.3 "Modulation-dependent parameters" Table 17-4 "Modulation-dependent parameters"; IEEE Std 802.11-2016
+        return MicroSeconds (16);
+      case 10:
+        //Section 17.3.3 "PHY preamble (SYNC)" Figure 17-4 "OFDM training structure"
+        //also Section 17.3.2.3 "Modulation-dependent parameters" Table 17-4 "Modulation-dependent parameters"; IEEE Std 802.11-2016
+        return MicroSeconds (32);
+      case 5:
+        //Section 17.3.3 "PHY preamble (SYNC)" Figure 17-4 "OFDM training structure"
+        //also Section 17.3.2.3 "Modulation-dependent parameters" Table 17-4 "Modulation-dependent parameters"; IEEE Std 802.11-2016
+        return MicroSeconds (64);
+    }
+}
+
+Time
+OfdmPhy::GetHeaderDuration (const WifiTxVector& txVector) const
+{
+  switch (txVector.GetChannelWidth ())
+    {
+      case 20:
+      default:
+        //Section 17.3.3 "PHY preamble (SYNC)" and Figure 17-4 "OFDM training structure"; IEEE Std 802.11-2016
+        //also Section 17.3.2.4 "Timing related parameters" Table 17-5 "Timing-related parameters"; IEEE Std 802.11-2016
+        //We return the duration of the SIGNAL field only, since the
+        //SERVICE field (which strictly speaking belongs to the PHY
+        //header, see Section 17.3.2 and Figure 17-1) is sent using the
+        //payload mode.
+        return MicroSeconds (4);
+      case 10:
+        //Section 17.3.2.4 "Timing related parameters" Table 17-5 "Timing-related parameters"; IEEE Std 802.11-2016
+        return MicroSeconds (8);
+      case 5:
+        //Section 17.3.2.4 "Timing related parameters" Table 17-5 "Timing-related parameters"; IEEE Std 802.11-2016
+        return MicroSeconds (16);
+    }
+}
+
+Time
+OfdmPhy::GetPayloadDuration (uint32_t size, const WifiTxVector& txVector, WifiPhyBand band, MpduType /* mpdutype */,
+                             bool /* incFlag */, uint32_t & /* totalAmpduSize */, double & /* totalAmpduNumSymbols */,
+                             uint16_t /* staId */) const
+{
+  //(Section 17.3.2.4 "Timing related parameters" Table 17-5 "Timing-related parameters"; IEEE Std 802.11-2016
+  //corresponds to T_{SYM} in the table)
+  Time symbolDuration = MicroSeconds (4);
+
+  double numDataBitsPerSymbol = txVector.GetMode ().GetDataRate (txVector) * symbolDuration.GetNanoSeconds () / 1e9;
+
+  //The number of OFDM symbols in the data field when BCC encoding
+  //is used is given in equation 19-32 of the IEEE 802.11-2016 standard.
+  double numSymbols = lrint (ceil ((GetNumberServiceBits () + size * 8.0 + 6.0) / (numDataBitsPerSymbol)));
+
+  Time payloadDuration = FemtoSeconds (static_cast<uint64_t> (numSymbols * symbolDuration.GetFemtoSeconds ()));
+  payloadDuration += GetSignalExtension (band);
+  return payloadDuration;
+}
+
+uint8_t
+OfdmPhy::GetNumberServiceBits (void) const
+{
+  return 16;
+}
+
+Time
+OfdmPhy::GetSignalExtension (WifiPhyBand band) const
+{
+  return (band == WIFI_PHY_BAND_2_4GHZ) ? MicroSeconds (6) : MicroSeconds (0);
+}
+
+Ptr<WifiPpdu>
+OfdmPhy::BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time /* ppduDuration */)
+{
+  NS_LOG_FUNCTION (this << psdus << txVector);
+  return Create<OfdmPpdu> (psdus.begin ()->second, txVector, m_wifiPhy->GetPhyBand (),
+                           ObtainNextUid (txVector));
+}
+
+PhyEntity::PhyFieldRxStatus
+OfdmPhy::DoEndReceiveField (WifiPpduField field, Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << field << *event);
+  if (field == WIFI_PPDU_FIELD_NON_HT_HEADER)
+    {
+      return EndReceiveHeader (event); //L-SIG
+    }
+  return PhyEntity::DoEndReceiveField (field, event);
+}
+
+PhyEntity::PhyFieldRxStatus
+OfdmPhy::EndReceiveHeader (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  SnrPer snrPer = GetPhyHeaderSnrPer (WIFI_PPDU_FIELD_NON_HT_HEADER, event);
+  NS_LOG_DEBUG ("L-SIG: SNR(dB)=" << RatioToDb (snrPer.snr) << ", PER=" << snrPer.per);
+  PhyFieldRxStatus status (GetRandomValue () > snrPer.per);
+  if (status.isSuccess)
+    {
+      NS_LOG_DEBUG ("Received non-HT PHY header");
+      if (!IsAllConfigSupported (WIFI_PPDU_FIELD_NON_HT_HEADER, event->GetPpdu ()))
+        {
+          status = PhyFieldRxStatus (false, UNSUPPORTED_SETTINGS, DROP);
+        }
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Abort reception because non-HT PHY header reception failed");
+      status.reason = L_SIG_FAILURE;
+      status.actionIfFailure = ABORT;
+    }
+  return status;
+}
+
+bool
+OfdmPhy::IsChannelWidthSupported (Ptr<const WifiPpdu> ppdu) const
+{
+  uint16_t channelWidth = ppdu->GetTxVector ().GetChannelWidth ();
+  if ((channelWidth >= 40) && (channelWidth > m_wifiPhy->GetChannelWidth ()))
+    {
+      NS_LOG_DEBUG ("Packet reception could not be started because not enough channel width (" << channelWidth << " vs " << m_wifiPhy->GetChannelWidth () << ")");
+      return false;
+    }
+  return true;
+}
+
+bool
+OfdmPhy::IsAllConfigSupported (WifiPpduField /* field */, Ptr<const WifiPpdu> ppdu) const
+{
+  if (!IsChannelWidthSupported (ppdu))
+    {
+      return false;
+    }
+  return IsConfigSupported (ppdu);
+}
+
+Ptr<SpectrumValue>
+OfdmPhy::GetTxPowerSpectralDensity (double txPowerW, Ptr<const WifiPpdu> ppdu) const
+{
+  const WifiTxVector& txVector = ppdu->GetTxVector ();
+  uint16_t centerFrequency = GetCenterFrequencyForChannelWidth (txVector);
+  uint16_t channelWidth = txVector.GetChannelWidth ();
+  NS_LOG_FUNCTION (this << centerFrequency << channelWidth << txPowerW);
+  const auto & txMaskRejectionParams = GetTxMaskRejectionParams ();
+  Ptr<SpectrumValue> v = WifiSpectrumValueHelper::CreateOfdmTxPowerSpectralDensity (centerFrequency, channelWidth, txPowerW, GetGuardBandwidth (channelWidth),
+                                                                                    std::get<0> (txMaskRejectionParams), std::get<1> (txMaskRejectionParams), std::get<2> (txMaskRejectionParams));
+  return v;
+}
+
+void
+OfdmPhy::InitializeModes (void)
+{
+  for (const auto & ratesPerBw : GetOfdmRatesBpsList ())
+    {
+      for (const auto & rate : ratesPerBw.second)
+        {
+          GetOfdmRate (rate, ratesPerBw.first);
+        }
+    }
+}
+
+WifiMode
+OfdmPhy::GetOfdmRate (uint64_t rate, uint16_t bw)
+{
+  switch (bw)
+    {
+      case 20:
+        switch (rate)
+          {
+            case 6000000:
+              return GetOfdmRate6Mbps ();
+            case 9000000:
+              return GetOfdmRate9Mbps ();
+            case 12000000:
+              return GetOfdmRate12Mbps ();
+            case 18000000:
+              return GetOfdmRate18Mbps ();
+            case 24000000:
+              return GetOfdmRate24Mbps ();
+            case 36000000:
+              return GetOfdmRate36Mbps ();
+            case 48000000:
+              return GetOfdmRate48Mbps ();
+            case 54000000:
+              return GetOfdmRate54Mbps ();
+            default:
+              NS_ABORT_MSG ("Inexistent rate (" << rate << " bps) requested for 11a OFDM (default)");
+              return WifiMode ();
+          }
+        break;
+      case 10:
+        switch (rate)
+          {
+            case 3000000:
+              return GetOfdmRate3MbpsBW10MHz ();
+            case 4500000:
+              return GetOfdmRate4_5MbpsBW10MHz ();
+            case 6000000:
+              return GetOfdmRate6MbpsBW10MHz ();
+            case 9000000:
+              return GetOfdmRate9MbpsBW10MHz ();
+            case 12000000:
+              return GetOfdmRate12MbpsBW10MHz ();
+            case 18000000:
+              return GetOfdmRate18MbpsBW10MHz ();
+            case 24000000:
+              return GetOfdmRate24MbpsBW10MHz ();
+            case 27000000:
+              return GetOfdmRate27MbpsBW10MHz ();
+            default:
+              NS_ABORT_MSG ("Inexistent rate (" << rate << " bps) requested for 11a OFDM (10 MHz)");
+              return WifiMode ();
+          }
+        break;
+      case 5:
+        switch (rate)
+          {
+            case 1500000:
+              return GetOfdmRate1_5MbpsBW5MHz ();
+            case 2250000:
+              return GetOfdmRate2_25MbpsBW5MHz ();
+            case 3000000:
+              return GetOfdmRate3MbpsBW5MHz ();
+            case 4500000:
+              return GetOfdmRate4_5MbpsBW5MHz ();
+            case 6000000:
+              return GetOfdmRate6MbpsBW5MHz ();
+            case 9000000:
+              return GetOfdmRate9MbpsBW5MHz ();
+            case 12000000:
+              return GetOfdmRate12MbpsBW5MHz ();
+            case 13500000:
+              return GetOfdmRate13_5MbpsBW5MHz ();
+            default:
+              NS_ABORT_MSG ("Inexistent rate (" << rate << " bps) requested for 11a OFDM (5 MHz)");
+              return WifiMode ();
+          }
+        break;
+      default:
+        NS_ABORT_MSG ("Inexistent bandwidth (" << +bw << " MHz) requested for 11a OFDM");
+        return WifiMode ();
+    }
+}
+
+#define GET_OFDM_MODE(x, f) \
+WifiMode \
+OfdmPhy::Get ## x (void) \
+{ \
+  static WifiMode mode = CreateOfdmMode (#x, f); \
+  return mode; \
+}; \
+
+// 20 MHz channel rates (default)
+GET_OFDM_MODE (OfdmRate6Mbps,  true)
+GET_OFDM_MODE (OfdmRate9Mbps,  false)
+GET_OFDM_MODE (OfdmRate12Mbps, true)
+GET_OFDM_MODE (OfdmRate18Mbps, false)
+GET_OFDM_MODE (OfdmRate24Mbps, true)
+GET_OFDM_MODE (OfdmRate36Mbps, false)
+GET_OFDM_MODE (OfdmRate48Mbps, false)
+GET_OFDM_MODE (OfdmRate54Mbps, false)
+// 10 MHz channel rates
+GET_OFDM_MODE (OfdmRate3MbpsBW10MHz,   true)
+GET_OFDM_MODE (OfdmRate4_5MbpsBW10MHz, false)
+GET_OFDM_MODE (OfdmRate6MbpsBW10MHz,   true)
+GET_OFDM_MODE (OfdmRate9MbpsBW10MHz,   false)
+GET_OFDM_MODE (OfdmRate12MbpsBW10MHz,  true)
+GET_OFDM_MODE (OfdmRate18MbpsBW10MHz,  false)
+GET_OFDM_MODE (OfdmRate24MbpsBW10MHz,  false)
+GET_OFDM_MODE (OfdmRate27MbpsBW10MHz,  false)
+// 5 MHz channel rates
+GET_OFDM_MODE (OfdmRate1_5MbpsBW5MHz,  true)
+GET_OFDM_MODE (OfdmRate2_25MbpsBW5MHz, false)
+GET_OFDM_MODE (OfdmRate3MbpsBW5MHz,    true)
+GET_OFDM_MODE (OfdmRate4_5MbpsBW5MHz,  false)
+GET_OFDM_MODE (OfdmRate6MbpsBW5MHz,    true)
+GET_OFDM_MODE (OfdmRate9MbpsBW5MHz,    false)
+GET_OFDM_MODE (OfdmRate12MbpsBW5MHz,   false)
+GET_OFDM_MODE (OfdmRate13_5MbpsBW5MHz, false)
+#undef GET_OFDM_MODE
+
+WifiMode
+OfdmPhy::CreateOfdmMode (std::string uniqueName, bool isMandatory)
+{
+  // Check whether uniqueName is in lookup table
+  const auto it = m_ofdmModulationLookupTable.find (uniqueName);
+  NS_ASSERT_MSG (it != m_ofdmModulationLookupTable.end (), "OFDM mode cannot be created because it is not in the lookup table!");
+
+  return WifiModeFactory::CreateWifiMode (uniqueName,
+                                          WIFI_MOD_CLASS_OFDM,
+                                          isMandatory,
+                                          MakeBoundCallback (&GetCodeRate, uniqueName),
+                                          MakeBoundCallback (&GetConstellationSize, uniqueName),
+                                          MakeBoundCallback (&GetPhyRate, uniqueName),
+                                          MakeCallback (&GetPhyRateFromTxVector),
+                                          MakeBoundCallback (&GetDataRate, uniqueName),
+                                          MakeCallback (&GetDataRateFromTxVector),
+                                          MakeCallback (&IsModeAllowed));
+}
+
+WifiCodeRate
+OfdmPhy::GetCodeRate (const std::string& name)
+{
+  return m_ofdmModulationLookupTable.at (name).first;
+}
+
+uint16_t
+OfdmPhy::GetConstellationSize (const std::string& name)
+{
+  return m_ofdmModulationLookupTable.at (name).second;
+}
+
+uint64_t
+OfdmPhy::GetPhyRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+{
+  WifiCodeRate codeRate = GetCodeRate (name);
+  uint64_t dataRate = GetDataRate (name, channelWidth, guardInterval, nss);
+  return CalculatePhyRate (codeRate, dataRate);
+}
+
+uint64_t
+OfdmPhy::CalculatePhyRate (WifiCodeRate codeRate, uint64_t dataRate)
+{
+  return (dataRate / GetCodeRatio (codeRate));
+}
+
+uint64_t
+OfdmPhy::GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
+{
+  return GetPhyRate (txVector.GetMode ().GetUniqueName (),
+                     txVector.GetChannelWidth (),
+                     txVector.GetGuardInterval (),
+                     txVector.GetNss ());
+}
+
+double
+OfdmPhy::GetCodeRatio (WifiCodeRate codeRate)
+{
+  switch (codeRate)
+    {
+      case WIFI_CODE_RATE_3_4:
+        return (3.0 / 4.0);
+      case WIFI_CODE_RATE_2_3:
+        return (2.0 / 3.0);
+      case WIFI_CODE_RATE_1_2:
+        return (1.0 / 2.0);
+      case WIFI_CODE_RATE_UNDEFINED:
+      default:
+        NS_FATAL_ERROR ("trying to get code ratio for undefined coding rate");
+        return 0;
+    }
+}
+
+uint64_t
+OfdmPhy::GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
+{
+  return GetDataRate (txVector.GetMode ().GetUniqueName (),
+                      txVector.GetChannelWidth (),
+                      txVector.GetGuardInterval (),
+                      txVector.GetNss ());
+}
+
+uint64_t
+OfdmPhy::GetDataRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+{
+  WifiCodeRate codeRate = GetCodeRate (name);
+  uint16_t constellationSize = GetConstellationSize (name);
+  return CalculateDataRate (codeRate, constellationSize, channelWidth, guardInterval, nss);
+}
+
+uint64_t
+OfdmPhy::CalculateDataRate (WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth, uint16_t /* guardInterval */, uint8_t /* nss */)
+{
+  double symbolDuration = 3.2; //in us
+  uint16_t guardInterval = 800; //in ns
+  if (channelWidth == 10)
+    {
+      symbolDuration = 6.4;
+      guardInterval = 1600;
+    }
+  else if (channelWidth == 5)
+    {
+      symbolDuration = 12.8;
+      guardInterval = 3200;
+    }
+  return CalculateDataRate (symbolDuration, guardInterval,
+                            48, static_cast<uint16_t> (log2 (constellationSize)),
+                            GetCodeRatio (codeRate));
+}
+
+uint64_t
+OfdmPhy::CalculateDataRate (double symbolDuration, uint16_t guardInterval,
+                            uint16_t usableSubCarriers, uint16_t numberOfBitsPerSubcarrier,
+                            double codingRate)
+{
+  double symbolRate = (1 / (symbolDuration + (static_cast<double> (guardInterval) / 1000))) * 1e6;
+  return lrint (ceil (symbolRate * usableSubCarriers * numberOfBitsPerSubcarrier * codingRate));
+}
+
+bool
+OfdmPhy::IsModeAllowed (uint16_t /* channelWidth */, uint8_t /* nss */)
+{
+  return true;
+}
+
+uint32_t
+OfdmPhy::GetMaxPsduSize (void) const
+{
+  return 4095;
+}
+
+} //namespace ns3
+
+namespace {
+
+/**
+ * Constructor class for OFDM modes
+ */
+static class ConstructorOfdm
+{
+public:
+  ConstructorOfdm ()
+  {
+    ns3::OfdmPhy::InitializeModes ();
+    ns3::WifiPhy::AddStaticPhyEntity (ns3::WIFI_MOD_CLASS_OFDM, ns3::Create<ns3::OfdmPhy> ()); //default variant will do
+  }
+} g_constructor_ofdm; ///< the constructor for OFDM modes
+
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/ofdm-phy.h ns-3.34/src/wifi/model/non-ht/ofdm-phy.h
--- ns-3.33/src/wifi/model/non-ht/ofdm-phy.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/ofdm-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,443 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy)
+ *          Mathieu Lacage <mathieu.lacage@sophia.inria.fr> (for logic ported from wifi-phy)
+ */
+
+#ifndef OFDM_PHY_H
+#define OFDM_PHY_H
+
+#include "ns3/phy-entity.h"
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of ns3::OfdmPhy class
+ * and ns3::OfdmPhyVariant enum.
+ */
+
+namespace ns3 {
+
+/**
+ * \ingroup wifi
+ * The OFDM (11a) PHY variants.
+ *
+ * \see OfdmPhy
+ */
+enum OfdmPhyVariant
+{
+  OFDM_PHY_DEFAULT,
+  OFDM_PHY_10_MHZ,
+  OFDM_PHY_5_MHZ
+};
+
+/**
+ * \brief PHY entity for OFDM (11a)
+ * \ingroup wifi
+ *
+ * This class is also used for the 10 MHz and 5 MHz bandwidth
+ * variants addressing vehicular communications (default is 20 MHz
+ * bandwidth).
+ *
+ * Refer to IEEE 802.11-2016, clause 17.
+ */
+class OfdmPhy : public PhyEntity
+{
+public:
+  /**
+   * Constructor for OFDM PHY
+   *
+   * \param variant the OFDM PHY variant
+   * \param buildModeList flag used to add OFDM modes to list (disabled
+   *                      by child classes to only add child classes' modes)
+   */
+  OfdmPhy (OfdmPhyVariant variant = OFDM_PHY_DEFAULT, bool buildModeList = true);
+  /**
+   * Destructor for OFDM PHY
+   */
+  virtual ~OfdmPhy ();
+
+  WifiMode GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const override;
+  const PpduFormats & GetPpduFormats (void) const override;
+  Time GetDuration (WifiPpduField field, const WifiTxVector& txVector) const override;
+  Time GetPayloadDuration (uint32_t size, const WifiTxVector& txVector, WifiPhyBand band, MpduType mpdutype,
+                           bool incFlag, uint32_t &totalAmpduSize, double &totalAmpduNumSymbols,
+                           uint16_t staId) const override;
+  Ptr<WifiPpdu> BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration) override;
+
+  /**
+   * Initialize all OFDM modes (for all variants).
+   */
+  static void InitializeModes (void);
+  /**
+   * Return a WifiMode for OFDM
+   * corresponding to the provided rate and
+   * the channel bandwidth (20, 10, or 5 MHz).
+   *
+   * \param rate the rate in bps
+   * \param bw the bandwidth in MHz
+   * \return a WifiMode for OFDM
+   */
+  static WifiMode GetOfdmRate (uint64_t rate, uint16_t bw = 20);
+  /**
+   * Return a WifiMode for OFDM at 6 Mbps.
+   *
+   * \return a WifiMode for OFDM at 6 Mbps
+   */
+  static WifiMode GetOfdmRate6Mbps (void);
+  /**
+   * Return a WifiMode for OFDM at 9 Mbps.
+   *
+   * \return a WifiMode for OFDM at 9 Mbps
+   */
+  static WifiMode GetOfdmRate9Mbps (void);
+  /**
+   * Return a WifiMode for OFDM at 12Mbps.
+   *
+   * \return a WifiMode for OFDM at 12 Mbps
+   */
+  static WifiMode GetOfdmRate12Mbps (void);
+  /**
+   * Return a WifiMode for OFDM at 18 Mbps.
+   *
+   * \return a WifiMode for OFDM at 18 Mbps
+   */
+  static WifiMode GetOfdmRate18Mbps (void);
+  /**
+   * Return a WifiMode for OFDM at 24 Mbps.
+   *
+   * \return a WifiMode for OFDM at 24 Mbps
+   */
+  static WifiMode GetOfdmRate24Mbps (void);
+  /**
+   * Return a WifiMode for OFDM at 36 Mbps.
+   *
+   * \return a WifiMode for OFDM at 36 Mbps
+   */
+  static WifiMode GetOfdmRate36Mbps (void);
+  /**
+   * Return a WifiMode for OFDM at 48 Mbps.
+   *
+   * \return a WifiMode for OFDM at 48 Mbps
+   */
+  static WifiMode GetOfdmRate48Mbps (void);
+  /**
+   * Return a WifiMode for OFDM at 54 Mbps.
+   *
+   * \return a WifiMode for OFDM at 54 Mbps
+   */
+  static WifiMode GetOfdmRate54Mbps (void);
+  /**
+   * Return a WifiMode for OFDM at 3 Mbps with 10 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 3 Mbps with 10 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate3MbpsBW10MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 4.5 Mbps with 10 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 4.5 Mbps with 10 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate4_5MbpsBW10MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 6 Mbps with 10 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 6 Mbps with 10 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate6MbpsBW10MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 9 Mbps with 10 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 9 Mbps with 10 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate9MbpsBW10MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 12 Mbps with 10 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 12 Mbps with 10 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate12MbpsBW10MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 18 Mbps with 10 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 18 Mbps with 10 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate18MbpsBW10MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 24 Mbps with 10 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 24 Mbps with 10 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate24MbpsBW10MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 27 Mbps with 10 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 27 Mbps with 10 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate27MbpsBW10MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 1.5 Mbps with 5 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 1.5 Mbps with 5 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate1_5MbpsBW5MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 2.25 Mbps with 5 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 2.25 Mbps with 5 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate2_25MbpsBW5MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 3 Mbps with 5 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 3 Mbps with 5 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate3MbpsBW5MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 4.5 Mbps with 5 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 4.5 Mbps with 5 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate4_5MbpsBW5MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 6 Mbps with 5 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 6 Mbps with 5 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate6MbpsBW5MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 9 Mbps with 5 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 9 Mbps with 5 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate9MbpsBW5MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 12 Mbps with 5 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 12 Mbps with 5 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate12MbpsBW5MHz (void);
+  /**
+   * Return a WifiMode for OFDM at 13.5 Mbps with 5 MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 13.5 Mbps with 5 MHz channel spacing
+   */
+  static WifiMode GetOfdmRate13_5MbpsBW5MHz (void);
+
+  /**
+   * Return the WifiCodeRate from the OFDM mode's unique name using
+   * ModulationLookupTable. This is mainly used as a callback for
+   * WifiMode operation.
+   *
+   * \param name the unique name of the OFDM mode
+   * \return WifiCodeRate corresponding to the unique name
+   */
+  static WifiCodeRate GetCodeRate (const std::string& name);
+  /**
+   * Return the constellation size from the OFDM mode's unique name using
+   * ModulationLookupTable. This is mainly used as a callback for
+   * WifiMode operation.
+   *
+   * \param name the unique name of the OFDM mode
+   * \return constellation size corresponding to the unique name
+   */
+  static uint16_t GetConstellationSize (const std::string& name);
+  /**
+   * Return the PHY rate from the OFDM mode's unique name and
+   * the supplied parameters. This function calls CalculatePhyRate
+   * and is mainly used as a callback for WifiMode operation.
+   *
+   * \param name the unique name of the OFDM mode
+   * \param channelWidth the considered channel width in MHz
+   * \param guardInterval the considered guard interval duration in nanoseconds
+   * \param nss the considered number of streams
+   *
+   * \return the physical bit rate of this signal in bps.
+   */
+  static uint64_t GetPhyRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+
+  /**
+   * Return the PHY rate corresponding to
+   * the supplied TXVECTOR.
+   * This function is mainly used as a callback
+   * for WifiMode operation.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the station ID (only here to have a common signature for all callbacks)
+   * \return the physical bit rate of this signal in bps.
+   */
+  static uint64_t GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t staId);
+  /**
+   * Return the data rate corresponding to
+   * the supplied TXVECTOR.
+   * This function is mainly used as a callback
+   * for WifiMode operation.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the station ID (only here to have a common signature for all callbacks)
+   * \return the data bit rate in bps.
+   */
+  static uint64_t GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t staId);
+  /**
+   * Return the data rate from the OFDM mode's unique name and
+   * the supplied parameters. This function calls CalculateDataRate and
+   * is mainly used as a callback for WifiMode operation.
+   *
+   * \param name the unique name of the OFDM mode
+   * \param channelWidth the considered channel width in MHz
+   * \param guardInterval the considered guard interval duration in nanoseconds
+   * \param nss the considered number of streams
+   *
+   * \return the data bit rate of this signal in bps.
+   */
+  static uint64_t GetDataRate (const std::string& name, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  /**
+   * Check whether the combination of <WifiMode, channel width, NSS> is allowed.
+   * This function is used as a callback for WifiMode operation, and always
+   * returns true since there is no limitation for any mode in OfdmPhy.
+   *
+   * \param channelWidth the considered channel width in MHz
+   * \param nss the considered number of streams
+   * \returns true.
+   */
+  static bool IsModeAllowed (uint16_t channelWidth, uint8_t nss);
+
+protected:
+  PhyFieldRxStatus DoEndReceiveField (WifiPpduField field, Ptr<Event> event) override;
+  Ptr<SpectrumValue> GetTxPowerSpectralDensity (double txPowerW, Ptr<const WifiPpdu> ppdu) const override;
+  uint32_t GetMaxPsduSize (void) const override;
+
+  /**
+   * \param txVector the transmission parameters
+   * \return the WifiMode used for the SIGNAL field
+   */
+  virtual WifiMode GetHeaderMode (const WifiTxVector& txVector) const;
+
+  /**
+   * \param txVector the transmission parameters
+   * \return the duration of the preamble field
+   *
+   * \see WIFI_PPDU_FIELD_PREAMBLE
+   */
+  virtual Time GetPreambleDuration (const WifiTxVector& txVector) const;
+  /**
+   * \param txVector the transmission parameters
+   * \return the duration of the SIGNAL field
+   */
+  virtual Time GetHeaderDuration (const WifiTxVector& txVector) const;
+
+  /**
+   * \return the number of service bits
+   */
+  uint8_t GetNumberServiceBits (void) const;
+  /**
+   * \param band the frequency band being used
+   * \return the signal extension duration
+   */
+  Time GetSignalExtension (WifiPhyBand band) const;
+
+  /**
+   * End receiving the header, perform OFDM-specific actions, and
+   * provide the status of the reception.
+   *
+   * \param event the event holding incoming PPDU's information
+   * \return status of the reception of the header
+   */
+  PhyFieldRxStatus EndReceiveHeader (Ptr<Event> event);
+
+  /**
+   * Checks if the PPDU's bandwidth is supported by the PHY.
+   *
+   * \param ppdu the received PPDU
+   * \return \c true if supported, \c false otherwise
+   */
+  virtual bool IsChannelWidthSupported (Ptr<const WifiPpdu> ppdu) const;
+  /**
+   * Checks if the signaled configuration (including bandwidth)
+   * is supported by the PHY.
+   *
+   * \param field the current PPDU field (SIG used for checking config)
+   * \param ppdu the received PPDU
+   * \return \c true if supported, \c false otherwise
+   */
+  virtual bool IsAllConfigSupported (WifiPpduField field, Ptr<const WifiPpdu> ppdu) const;
+
+  /**
+   * Calculate the PHY rate in bps from code rate and data rate.
+   *
+   * \param codeRate the WifiCodeRate
+   * \param dataRate the data rate in bps
+   * \return the physical rate in bps from WifiCodeRate and data rate.
+   */
+  static uint64_t CalculatePhyRate (WifiCodeRate codeRate, uint64_t dataRate);
+  /**
+   * Convert WifiCodeRate to a ratio, e.g., code ratio of WIFI_CODE_RATE_1_2 is 0.5.
+   *
+   * \param codeRate the WifiCodeRate
+   * \return the ratio form of WifiCodeRate.
+   */
+  static double GetCodeRatio (WifiCodeRate codeRate);
+  /**
+   * Calculates data rate from the supplied parameters.
+   *
+   * \param codeRate the code rate of the mode
+   * \param constellationSize the size of modulation constellation
+   * \param channelWidth the considered channel width in MHz
+   * \param guardInterval the considered guard interval duration in nanoseconds
+   * \param nss the considered number of streams
+   *
+   * \return the data bit rate of this signal in bps.
+   */
+  static uint64_t CalculateDataRate (WifiCodeRate codeRate, uint16_t constellationSize, uint16_t channelWidth,
+                                     uint16_t guardInterval, uint8_t nss);
+  /**
+   * Calculates data rate from the supplied parameters.
+   *
+   * \param symbolDuration the symbol duration (in us) excluding guard interval
+   * \param guardInterval the considered guard interval duration in nanoseconds
+   * \param usableSubCarriers the number of usable subcarriers for data
+   * \param numberOfBitsPerSubcarrier the number of data bits per subcarrier
+   * \param codingRate the coding rate
+   *
+   * \return the data bit rate of this signal in bps.
+   */
+  static uint64_t CalculateDataRate (double symbolDuration, uint16_t guardInterval,
+                                     uint16_t usableSubCarriers, uint16_t numberOfBitsPerSubcarrier,
+                                     double codingRate);
+
+private:
+  /**
+   * Create an OFDM mode from a unique name, the unique name
+   * must already be contained inside ModulationLookupTable.
+   * This method binds all the callbacks used by WifiMode.
+   *
+   * \param uniqueName the unique name of the WifiMode
+   * \param isMandatory whether the WifiMode is mandatory
+   * \return the OFDM WifiMode
+   */
+  static WifiMode CreateOfdmMode (std::string uniqueName, bool isMandatory);
+
+  static const PpduFormats m_ofdmPpduFormats; //!< OFDM PPDU formats
+
+  static const ModulationLookupTable m_ofdmModulationLookupTable; //!< lookup table to retrieve code rate and constellation size corresponding to a unique name of modulation
+}; //class OfdmPhy
+
+} //namespace ns3
+
+#endif /* OFDM_PHY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/ofdm-ppdu.cc ns-3.34/src/wifi/model/non-ht/ofdm-ppdu.cc
--- ns-3.33/src/wifi/model/non-ht/ofdm-ppdu.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/ofdm-ppdu.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,259 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Rediet <getachew.redieteab@orange.com>
+ *         Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
+ *         Sébastien Deronne <sebastien.deronne@gmail.com> (LSigHeader)
+ */
+
+#include "ns3/wifi-phy.h"
+#include "ns3/wifi-psdu.h"
+#include "ofdm-phy.h"
+#include "ofdm-ppdu.h"
+#include "ns3/log.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("OfdmPpdu");
+
+OfdmPpdu::OfdmPpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector,
+                    WifiPhyBand band, uint64_t uid,
+                    bool instantiateLSig /* = true */)
+  : WifiPpdu (psdu, txVector, uid),
+    m_band (band),
+    m_channelWidth (txVector.GetChannelWidth ())
+{
+  NS_LOG_FUNCTION (this << psdu << txVector << band << uid);
+  if (instantiateLSig)
+    {
+      m_lSig.SetRate (txVector.GetMode ().GetDataRate (txVector), m_channelWidth);
+      m_lSig.SetLength (psdu->GetSize ());
+    }
+}
+
+OfdmPpdu::~OfdmPpdu ()
+{
+}
+
+WifiTxVector
+OfdmPpdu::DoGetTxVector (void) const
+{
+  WifiTxVector txVector;
+  txVector.SetPreambleType (m_preamble);
+  //OFDM uses 20 MHz, unless PHY channel width is 5 MHz or 10 MHz
+  uint16_t channelWidth = m_channelWidth < 20 ? m_channelWidth : 20;
+  txVector.SetMode (OfdmPhy::GetOfdmRate (m_lSig.GetRate (m_channelWidth), channelWidth));
+  txVector.SetChannelWidth (channelWidth);
+  return txVector;
+}
+
+Time
+OfdmPpdu::GetTxDuration (void) const
+{
+  Time ppduDuration = Seconds (0);
+  const WifiTxVector& txVector = GetTxVector ();
+  ppduDuration = WifiPhy::CalculateTxDuration (m_lSig.GetLength (), txVector, m_band);
+  return ppduDuration;
+}
+
+Ptr<WifiPpdu>
+OfdmPpdu::Copy (void) const
+{
+  return Create<OfdmPpdu> (GetPsdu (), GetTxVector (), m_band, m_uid);
+}
+
+OfdmPpdu::LSigHeader::LSigHeader ()
+  : m_rate (0b1101),
+    m_length (0)
+{
+}
+
+OfdmPpdu::LSigHeader::~LSigHeader ()
+{
+}
+
+TypeId
+OfdmPpdu::LSigHeader::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::LSigHeader")
+    .SetParent<Header> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<LSigHeader> ()
+  ;
+  return tid;
+}
+
+TypeId
+OfdmPpdu::LSigHeader::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+void
+OfdmPpdu::LSigHeader::Print (std::ostream &os) const
+{
+  os << "SIGNAL=" << GetRate ()
+     << " LENGTH=" << m_length;
+}
+
+uint32_t
+OfdmPpdu::LSigHeader::GetSerializedSize (void) const
+{
+  return 3;
+}
+
+void
+OfdmPpdu::LSigHeader::SetRate (uint64_t rate, uint16_t channelWidth)
+{
+  if (channelWidth == 5)
+    {
+      rate *= 4; //corresponding 20 MHz rate if 5 MHz is used
+    }
+  else if (channelWidth == 10)
+    {
+      rate *= 2; //corresponding 20 MHz rate if 10 MHz is used
+    }
+  /* Here is the binary representation for a given rate:
+   * 6 Mbit/s: 1101
+   * 9 Mbit/s: 1111
+   * 12 Mbit/s: 0101
+   * 18 Mbit/s: 0111
+   * 24 Mbit/s: 1001
+   * 36 Mbit/s: 1011
+   * 48 Mbit/s: 0001
+   * 54 Mbit/s: 0011
+   */
+  switch (rate)
+    {
+      case 6000000:
+        m_rate = 0b1101;
+        break;
+      case 9000000:
+        m_rate = 0b1111;
+        break;
+      case 12000000:
+        m_rate = 0b0101;
+        break;
+      case 18000000:
+        m_rate = 0b0111;
+        break;
+      case 24000000:
+        m_rate = 0b1001;
+        break;
+      case 36000000:
+        m_rate = 0b1011;
+        break;
+      case 48000000:
+        m_rate = 0b0001;
+        break;
+      case 54000000:
+        m_rate = 0b0011;
+        break;
+      default:
+        NS_ASSERT_MSG (false, "Invalid rate");
+        break;
+    }
+}
+
+uint64_t
+OfdmPpdu::LSigHeader::GetRate (uint16_t channelWidth) const
+{
+  uint64_t rate = 0;
+  switch (m_rate)
+    {
+      case 0b1101:
+        rate = 6000000;
+        break;
+      case 0b1111:
+        rate = 9000000;
+        break;
+      case 0b0101:
+        rate = 12000000;
+        break;
+      case 0b0111:
+        rate = 18000000;
+        break;
+      case 0b1001:
+        rate = 24000000;
+        break;
+      case 0b1011:
+        rate = 36000000;
+        break;
+      case 0b0001:
+        rate = 48000000;
+        break;
+      case 0b0011:
+        rate = 54000000;
+        break;
+      default:
+        NS_ASSERT_MSG (false, "Invalid rate");
+        break;
+    }
+  if (channelWidth == 5)
+    {
+      rate /= 4; //compute corresponding 5 MHz rate
+    }
+  else if (channelWidth == 10)
+    {
+      rate /= 2; //compute corresponding 10 MHz rate
+    }
+  return rate;
+}
+
+void
+OfdmPpdu::LSigHeader::SetLength (uint16_t length)
+{
+  NS_ASSERT_MSG (length < 4096, "Invalid length");
+  m_length = length;
+}
+
+uint16_t
+OfdmPpdu::LSigHeader::GetLength (void) const
+{
+  return m_length;
+}
+
+void
+OfdmPpdu::LSigHeader::Serialize (Buffer::Iterator start) const
+{
+  uint8_t byte = 0;
+  uint16_t bytes = 0;
+
+  byte |= m_rate;
+  byte |= (m_length & 0x07) << 5;
+  start.WriteU8 (byte);
+
+  bytes |= (m_length & 0x0ff8) >> 3;
+  start.WriteU16 (bytes);
+}
+
+uint32_t
+OfdmPpdu::LSigHeader::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+
+  uint8_t byte = i.ReadU8 ();
+  m_rate = byte & 0x0f;
+  m_length = (byte >> 5) & 0x07;
+
+  uint16_t bytes = i.ReadU16 ();
+  m_length |= (bytes << 3) & 0x0ff8;
+
+  return i.GetDistanceFrom (start);
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/non-ht/ofdm-ppdu.h ns-3.34/src/wifi/model/non-ht/ofdm-ppdu.h
--- ns-3.33/src/wifi/model/non-ht/ofdm-ppdu.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/non-ht/ofdm-ppdu.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,136 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Rediet <getachew.redieteab@orange.com>
+ *         Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
+ *         Sébastien Deronne <sebastien.deronne@gmail.com> (LSigHeader)
+ */
+
+#ifndef OFDM_PPDU_H
+#define OFDM_PPDU_H
+
+#include "ns3/wifi-phy-band.h"
+#include "ns3/wifi-ppdu.h"
+#include "ns3/header.h"
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of ns3::OfdmPpdu class.
+ */
+
+namespace ns3 {
+
+class WifiPsdu;
+
+/**
+ * \brief OFDM PPDU (11a)
+ * \ingroup wifi
+ *
+ * OfdmPpdu stores a preamble, PHY headers and a PSDU of a PPDU with non-HT header,
+ * i.e., PPDU that uses OFDM modulation.
+ */
+class OfdmPpdu : public WifiPpdu
+{
+public:
+
+  /**
+   * OFDM and ERP OFDM L-SIG PHY header.
+   * See section 17.3.4 in IEEE 802.11-2016.
+   */
+  class LSigHeader : public Header
+  {
+  public:
+    LSigHeader ();
+    virtual ~LSigHeader ();
+
+    /**
+     * \brief Get the type ID.
+     * \return the object TypeId
+     */
+    static TypeId GetTypeId (void);
+
+    TypeId GetInstanceTypeId (void) const override;
+    void Print (std::ostream &os) const override;
+    uint32_t GetSerializedSize (void) const override;
+    void Serialize (Buffer::Iterator start) const override;
+    uint32_t Deserialize (Buffer::Iterator start) override;
+
+    /**
+     * Fill the RATE field of L-SIG (in bit/s).
+     *
+     * \param rate the RATE field of L-SIG expressed in bit/s
+     * \param channelWidth the channel width (in MHz)
+     */
+    void SetRate (uint64_t rate, uint16_t channelWidth = 20);
+    /**
+     * Return the RATE field of L-SIG (in bit/s).
+     *
+     * \param channelWidth the channel width (in MHz)
+     * \return the RATE field of L-SIG expressed in bit/s
+     */
+    uint64_t GetRate (uint16_t channelWidth = 20) const;
+    /**
+     * Fill the LENGTH field of L-SIG (in bytes).
+     *
+     * \param length the LENGTH field of L-SIG expressed in bytes
+     */
+    void SetLength (uint16_t length);
+    /**
+     * Return the LENGTH field of L-SIG (in bytes).
+     *
+     * \return the LENGTH field of L-SIG expressed in bytes
+     */
+    uint16_t GetLength (void) const;
+
+  private:
+    uint8_t m_rate;    ///< RATE field
+    uint16_t m_length; ///< LENGTH field
+  }; //class LSigHeader
+
+  /**
+   * Create an OFDM PPDU.
+   *
+   * \param psdu the PHY payload (PSDU)
+   * \param txVector the TXVECTOR that was used for this PPDU
+   * \param band the WifiPhyBand used for the transmission of this PPDU
+   * \param uid the unique ID of this PPDU
+   * \param instantiateLSig flag used to instantiate LSigHeader (set LSigHeader's
+   *                        rate and length), should be disabled by child classes
+   */
+  OfdmPpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, WifiPhyBand band, uint64_t uid,
+            bool instantiateLSig = true);
+  /**
+   * Destructor for OfdmPpdu.
+   */
+  virtual ~OfdmPpdu ();
+
+  Time GetTxDuration (void) const override;
+  Ptr<WifiPpdu> Copy (void) const override;
+
+protected:
+  WifiPhyBand m_band;       //!< the WifiPhyBand used to transmit that PPDU
+  uint16_t m_channelWidth;  //!< the channel width used to transmit that PPDU in MHz
+  LSigHeader m_lSig;        //!< the L-SIG PHY header
+
+private:
+  WifiTxVector DoGetTxVector (void) const override;
+}; //class OfdmPpdu
+
+} //namespace ns3
+
+#endif /* OFDM_PPDU_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/obss-pd-algorithm.cc ns-3.34/src/wifi/model/obss-pd-algorithm.cc
--- ns-3.33/src/wifi/model/obss-pd-algorithm.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/obss-pd-algorithm.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,111 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018 University of Washington
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "ns3/log.h"
-#include "ns3/double.h"
-#include "ns3/uinteger.h"
-#include "obss-pd-algorithm.h"
-#include "wifi-net-device.h"
-#include "wifi-phy.h"
-#include "wifi-utils.h"
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("ObssPdAlgorithm");
-NS_OBJECT_ENSURE_REGISTERED (ObssPdAlgorithm);
-
-TypeId
-ObssPdAlgorithm::GetTypeId (void)
-{
-  static ns3::TypeId tid = ns3::TypeId ("ns3::ObssPdAlgorithm")
-    .SetParent<Object> ()
-    .SetGroupName ("Wifi")
-    .AddAttribute ("ObssPdLevel",
-                   "The current OBSS PD level (dBm).",
-                   DoubleValue (-82.0),
-                   MakeDoubleAccessor (&ObssPdAlgorithm::m_obssPdLevel),
-                   MakeDoubleChecker<double> (-101, -62))
-    .AddAttribute ("ObssPdLevelMin",
-                   "Minimum value (dBm) of OBSS PD level.",
-                   DoubleValue (-82.0),
-                   MakeDoubleAccessor (&ObssPdAlgorithm::m_obssPdLevelMin),
-                   MakeDoubleChecker<double> (-101, -62))
-    .AddAttribute ("ObssPdLevelMax",
-                   "Maximum value (dBm) of OBSS PD level.",
-                   DoubleValue (-62.0),
-                   MakeDoubleAccessor (&ObssPdAlgorithm::m_obssPdLevelMax),
-                   MakeDoubleChecker<double> (-101, -62))
-    .AddAttribute ("TxPowerRefSiso",
-                   "The SISO reference TX power level (dBm).",
-                   DoubleValue (21),
-                   MakeDoubleAccessor (&ObssPdAlgorithm::m_txPowerRefSiso),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("TxPowerRefMimo",
-                   "The MIMO reference TX power level (dBm).",
-                   DoubleValue (25),
-                   MakeDoubleAccessor (&ObssPdAlgorithm::m_txPowerRefMimo),
-                   MakeDoubleChecker<double> ())
-    .AddTraceSource ("Reset", "Trace CCA Reset event",
-                     MakeTraceSourceAccessor (&ObssPdAlgorithm::m_resetEvent),
-                     "ns3::ObssPdAlgorithm::ResetTracedCallback")
-  ;
-  return tid;
-}
-
-void
-ObssPdAlgorithm::DoDispose (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_device = 0;
-}
-
-void
-ObssPdAlgorithm::ConnectWifiNetDevice (const Ptr<WifiNetDevice> device)
-{
-  NS_LOG_FUNCTION (this << device);
-  m_device = device;
-}
-
-void
-ObssPdAlgorithm::ResetPhy (HePreambleParameters params)
-{
-  double txPowerMaxSiso = 0;
-  double txPowerMaxMimo = 0;
-  bool powerRestricted = false;
-  // Fetch my BSS color
-  Ptr<HeConfiguration> heConfiguration = m_device->GetHeConfiguration ();
-  NS_ASSERT (heConfiguration);
-  UintegerValue bssColorAttribute;
-  heConfiguration->GetAttribute ("BssColor", bssColorAttribute);
-  uint8_t bssColor = bssColorAttribute.Get ();
-  NS_LOG_DEBUG ("My BSS color " << (uint16_t) bssColor << " received frame " << (uint16_t) params.bssColor);
-
-  Ptr<WifiPhy> phy = m_device->GetPhy ();
-  if ((m_obssPdLevel > m_obssPdLevelMin) && (m_obssPdLevel <= m_obssPdLevelMax))
-    {
-      txPowerMaxSiso = m_txPowerRefSiso - (m_obssPdLevel - m_obssPdLevelMin);
-      txPowerMaxMimo = m_txPowerRefMimo - (m_obssPdLevel - m_obssPdLevelMin);
-      powerRestricted = true;
-    }
-  m_resetEvent (bssColor, WToDbm (params.rssiW), powerRestricted, txPowerMaxSiso, txPowerMaxMimo);
-  phy->ResetCca (powerRestricted, txPowerMaxSiso, txPowerMaxMimo);
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/obss-pd-algorithm.h ns-3.34/src/wifi/model/obss-pd-algorithm.h
--- ns-3.33/src/wifi/model/obss-pd-algorithm.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/obss-pd-algorithm.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,106 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018 University of Washington
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef OBSS_PD_ALGORITHM_H
-#define OBSS_PD_ALGORITHM_H
-
-#include "ns3/object.h"
-#include "ns3/traced-callback.h"
-#include "he-configuration.h"
-
-namespace ns3 {
-
-struct HePreambleParameters;
-
-class WifiNetDevice;
-
-/**
- * \brief OBSS PD algorithm interface
- * \ingroup wifi
- *
- * This object provides the interface for all OBSS_PD algorithms
- * and is designed to be subclassed.
- *
- * OBSS_PD stands for Overlapping Basic Service Set Preamble-Detection.
- * OBSS_PD is an 802.11ax feature that allows a STA, under specific
- * conditions, to ignore an inter-BSS PPDU.
- */
-class ObssPdAlgorithm : public Object
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-
-  /**
-   * Connect the WifiNetDevice and setup eventual callbacks.
-   *
-   * \param device the WifiNetDevice
-   */
-  virtual void ConnectWifiNetDevice (const Ptr<WifiNetDevice> device);
-
-  /**
-   * Reset PHY to IDLE.
-   * \param params HePreambleParameters causing PHY reset
-   */
-  void ResetPhy (HePreambleParameters params);
-
-  /**
-   * \param params the HE SIG parameters
-   *
-   * Evaluate the receipt of HE SIG.
-   */
-  virtual void ReceiveHeSig (HePreambleParameters params) = 0;
-
-  /**
-   * TracedCallback signature for OBSS_PD reset events.
-   *
-   * \param [in] bssColor The BSS color of frame triggering the reset
-   * \param [in] rssiDbm The RSSI (dBm) of frame triggering the reset
-   * \param [in] powerRestricted Whether a TX power restriction is triggered
-   * \param [in] txPowerMaxDbmSiso The SISO TX power restricted level (dBm)
-   * \param [in] txPowerMaxDbmMimo The MIMO TX power restricted level (dBm)
-   */
-  typedef void (* ResetTracedCallback)(uint8_t bssColor, double rssiDbm, bool powerRestricted, double txPowerMaxDbmSiso, double txPowerMaxDbmMimo);
-
-protected:
-  virtual void DoDispose (void);
-
-  Ptr<WifiNetDevice> m_device; ///< Pointer to the WifiNetDevice
-  double m_obssPdLevel;        ///< Current OBSS PD level (dBm)
-
-
-private:
-  double m_obssPdLevelMin; ///< Minimum OBSS PD level (dBm)
-  double m_obssPdLevelMax; ///< Maximum OBSS PD level (dBm)
-  double m_txPowerRefSiso; ///< SISO reference TX power level (dBm)
-  double m_txPowerRefMimo; ///< MIMO reference TX power level (dBm)
-
-  /**
-   * TracedCallback signature for PHY reset events.
-   */
-  TracedCallback<uint8_t, double, bool, double, double>  m_resetEvent;
-};
-
-} //namespace ns3
-
-#endif /* OBSS_PD_ALGORITHM_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/onoe-wifi-manager.cc ns-3.34/src/wifi/model/onoe-wifi-manager.cc
--- ns-3.33/src/wifi/model/onoe-wifi-manager.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/onoe-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,367 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2003,2007 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#include "ns3/log.h"
-#include "ns3/simulator.h"
-#include "onoe-wifi-manager.h"
-#include "wifi-tx-vector.h"
-
-#define Min(a,b) ((a < b) ? a : b)
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("OnoeWifiManager");
-
-/**
- * \brief hold per-remote-station state for ONOE Wifi manager.
- *
- * This struct extends from WifiRemoteStation struct to hold additional
- * information required by the ONOE Wifi manager
- */
-struct OnoeWifiRemoteStation : public WifiRemoteStation
-{
-  Time m_nextModeUpdate; ///< next mode update
-  bool m_rateBlocked; ///< whether the rate cannot be changed
-  uint32_t m_shortRetry; ///< short retry
-  uint32_t m_longRetry; ///< long retry
-  uint32_t m_tx_ok; ///< transmit OK
-  uint32_t m_tx_err; ///< transmit error
-  uint32_t m_tx_retr; ///< transmit retry
-  uint32_t m_tx_upper; ///< transmit upper
-  uint8_t m_txrate; ///< transmit rate
-};
-
-NS_OBJECT_ENSURE_REGISTERED (OnoeWifiManager);
-
-TypeId
-OnoeWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::OnoeWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<OnoeWifiManager> ()
-    .AddAttribute ("UpdatePeriod",
-                   "The interval between decisions about rate control changes",
-                   TimeValue (Seconds (1.0)),
-                   MakeTimeAccessor (&OnoeWifiManager::m_updatePeriod),
-                   MakeTimeChecker ())
-    .AddAttribute ("RaiseThreshold", "Attempt to raise the rate if we hit that threshold",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&OnoeWifiManager::m_raiseThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("AddCreditThreshold", "Add credit threshold",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&OnoeWifiManager::m_addCreditThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddTraceSource ("Rate",
-                     "Traced value for rate changes (b/s)",
-                     MakeTraceSourceAccessor (&OnoeWifiManager::m_currentRate),
-                     "ns3::TracedValueCallback::Uint64")
-  ;
-  return tid;
-}
-
-OnoeWifiManager::OnoeWifiManager ()
-  : WifiRemoteStationManager (),
-    m_currentRate (0)
-{
-  NS_LOG_FUNCTION (this);
-}
-
-OnoeWifiManager::~OnoeWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-OnoeWifiManager::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  if (GetHtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
-    }
-  if (GetVhtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
-    }
-  if (GetHeSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
-    }
-}
-
-WifiRemoteStation *
-OnoeWifiManager::DoCreateStation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  OnoeWifiRemoteStation *station = new OnoeWifiRemoteStation ();
-  station->m_nextModeUpdate = Simulator::Now () + m_updatePeriod;
-  station->m_rateBlocked = false;
-  station->m_shortRetry = 0;
-  station->m_longRetry = 0;
-  station->m_tx_ok = 0;
-  station->m_tx_err = 0;
-  station->m_tx_retr = 0;
-  station->m_tx_upper = 0;
-  station->m_txrate = 0;
-  return station;
-}
-
-void
-OnoeWifiManager::DoReportRxOk (WifiRemoteStation *station, double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
-}
-
-void
-OnoeWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
-  station->m_shortRetry++;
-  station->m_rateBlocked = true;  // do not change rate for retransmission
-}
-
-void
-OnoeWifiManager::DoReportDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
-  station->m_longRetry++;
-  station->m_rateBlocked = true;  // do not change rate for retransmission
-}
-
-void
-OnoeWifiManager::DoReportRtsOk (WifiRemoteStation *st, double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
-  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
-  station->m_rateBlocked = true;  // do not change rate
-}
-
-void
-OnoeWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                 double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
-  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
-  UpdateRetry (station);
-  station->m_tx_ok++;
-  station->m_rateBlocked = false;  // we can change the rate for next packet
-}
-
-void
-OnoeWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
-  UpdateRetry (station);
-  station->m_tx_err++;
-  station->m_rateBlocked = false;  // we can change the rate for next packet
-}
-
-void
-OnoeWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
-  UpdateRetry (station);
-  station->m_tx_err++;
-  station->m_rateBlocked = false;  // we can change the rate for next packet
-}
-
-void
-OnoeWifiManager::UpdateRetry (OnoeWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_tx_retr += station->m_shortRetry + station->m_longRetry;
-  station->m_shortRetry = 0;
-  station->m_longRetry = 0;
-}
-
-void
-OnoeWifiManager::UpdateMode (OnoeWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  if (Simulator::Now () < station->m_nextModeUpdate || station->m_rateBlocked)
-    {
-      return;
-    }
-  station->m_nextModeUpdate = Simulator::Now () + m_updatePeriod;
-  /**
-   * The following 20 lines of code were copied from the Onoe
-   * rate control kernel module used in the madwifi driver.
-   */
-
-  int dir = 0, enough;
-  uint8_t nrate;
-  enough = (station->m_tx_ok + station->m_tx_err >= 10);
-
-  /* no packet reached -> down */
-  if (station->m_tx_err > 0 && station->m_tx_ok == 0)
-    {
-      dir = -1;
-    }
-
-  /* all packets needs retry in average -> down */
-  if (enough && station->m_tx_ok < station->m_tx_retr)
-    {
-      dir = -1;
-    }
-
-  /* no error and less than rate_raise% of packets need retry -> up */
-  if (enough && station->m_tx_err == 0
-      && station->m_tx_retr < (station->m_tx_ok * m_addCreditThreshold) / 100)
-    {
-      dir = 1;
-    }
-
-  NS_LOG_DEBUG (this << " ok " << station->m_tx_ok << " err " << station->m_tx_err << " retr " << station->m_tx_retr <<
-                " upper " << station->m_tx_upper << " dir " << dir);
-
-  nrate = station->m_txrate;
-  switch (dir)
-    {
-    case 0:
-      if (enough && station->m_tx_upper > 0)
-        {
-          station->m_tx_upper--;
-        }
-      break;
-    case -1:
-      if (nrate > 0)
-        {
-          nrate--;
-        }
-      station->m_tx_upper = 0;
-      break;
-    case 1:
-      /* raise rate if we hit rate_raise_threshold */
-      if (++station->m_tx_upper < m_raiseThreshold)
-        {
-          break;
-        }
-      station->m_tx_upper = 0;
-      if (nrate + 1 < GetNSupported (station))
-        {
-          nrate++;
-        }
-      break;
-    }
-
-  if (nrate != station->m_txrate)
-    {
-      NS_ASSERT (nrate < GetNSupported (station));
-      station->m_txrate = nrate;
-      station->m_tx_ok = station->m_tx_err = station->m_tx_retr = station->m_tx_upper = 0;
-    }
-  else if (enough)
-    {
-      station->m_tx_ok = station->m_tx_err = station->m_tx_retr = 0;
-    }
-
-}
-
-WifiTxVector
-OnoeWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
-  UpdateMode (station);
-  NS_ASSERT (station->m_txrate < GetNSupported (station));
-  uint8_t rateIndex;
-  if (station->m_longRetry < 4)
-    {
-      rateIndex = station->m_txrate;
-    }
-  else if (station->m_longRetry < 6)
-    {
-      if (station->m_txrate > 0)
-        {
-          rateIndex = station->m_txrate - 1;
-        }
-      else
-        {
-          rateIndex = station->m_txrate;
-        }
-    }
-  else if (station->m_longRetry < 8)
-    {
-      if (station->m_txrate > 1)
-        {
-          rateIndex = station->m_txrate - 2;
-        }
-      else
-        {
-          rateIndex = station->m_txrate;
-        }
-    }
-  else
-    {
-      if (station->m_txrate > 2)
-        {
-          rateIndex = station->m_txrate - 3;
-        }
-      else
-        {
-          rateIndex = station->m_txrate;
-        }
-    }
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiMode mode = GetSupported (station, rateIndex);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
-    {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
-    }
-  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (st))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-}
-
-WifiTxVector
-OnoeWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  UpdateMode (station);
-  WifiTxVector rtsTxVector;
-  WifiMode mode;
-  if (GetUseNonErpProtection () == false)
-    {
-      mode = GetSupported (station, 0);
-    }
-  else
-    {
-      mode = GetNonErpSupported (station, 0);
-    }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (st))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/onoe-wifi-manager.h ns-3.34/src/wifi/model/onoe-wifi-manager.h
--- ns-3.33/src/wifi/model/onoe-wifi-manager.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/onoe-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,97 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2003,2007 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#ifndef ONOE_WIFI_MANAGER_H
-#define ONOE_WIFI_MANAGER_H
-
-#include "ns3/traced-value.h"
-#include "wifi-remote-station-manager.h"
-
-namespace ns3 {
-
-struct OnoeWifiRemoteStation;
-
-/**
- * \brief an implementation of the rate control algorithm developed
- *        by Atsushi Onoe
- *
- * \ingroup wifi
- *
- * This algorithm is well known because it has been used as the default
- * rate control algorithm for the madwifi driver. I am not aware of
- * any publication or reference about this algorithm beyond the madwifi
- * source code.
- *
- * This RAA does not support HT modes and will error
- * exit if the user tries to configure this RAA with a Wi-Fi MAC
- * that supports 802.11n or higher.
- */
-class OnoeWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  OnoeWifiManager ();
-  virtual ~OnoeWifiManager ();
-
-
-private:
-  // Overridden from base class.
-  void DoInitialize (void);
-  WifiRemoteStation * DoCreateStation (void) const;
-  void DoReportRxOk (WifiRemoteStation *station,
-                     double rxSnr, WifiMode txMode);
-  void DoReportRtsFailed (WifiRemoteStation *station);
-  void DoReportDataFailed (WifiRemoteStation *station);
-  void DoReportRtsOk (WifiRemoteStation *station,
-                      double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  void DoReportFinalDataFailed (WifiRemoteStation *station);
-  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-
-  /**
-   * Update the number of retry (both short and long).
-   *
-   * \param station the ONOE wifi remote station
-   */
-  void UpdateRetry (OnoeWifiRemoteStation *station);
-  /**
-   * Update the mode.
-   *
-   * \param station the ONOE wifi remote station
-   */
-  void UpdateMode (OnoeWifiRemoteStation *station);
-
-  Time m_updatePeriod; ///< update period
-  uint32_t m_addCreditThreshold; ///< add credit threshold
-  uint32_t m_raiseThreshold; ///< raise threshold
-
-  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
-};
-
-} //namespace ns3
-
-#endif /* ONOE_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/originator-block-ack-agreement.cc ns-3.34/src/wifi/model/originator-block-ack-agreement.cc
--- ns-3.33/src/wifi/model/originator-block-ack-agreement.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/originator-block-ack-agreement.cc	2021-07-14 10:31:07.000000000 -0700
@@ -88,8 +88,7 @@
 std::size_t
 OriginatorBlockAckAgreement::GetDistance (uint16_t seqNumber) const
 {
-  NS_ASSERT (seqNumber < SEQNO_SPACE_SIZE);
-  return (seqNumber - GetStartingSequence () + SEQNO_SPACE_SIZE) % SEQNO_SPACE_SIZE;
+  return BlockAckAgreement::GetDistance (seqNumber, m_txWindow.GetWinStart ());
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/originator-block-ack-agreement.h ns-3.34/src/wifi/model/originator-block-ack-agreement.h
--- ns-3.33/src/wifi/model/originator-block-ack-agreement.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/originator-block-ack-agreement.h	2021-07-14 10:31:07.000000000 -0700
@@ -155,7 +155,7 @@
    *
    * \return the starting sequence number.
    */
-  uint16_t GetStartingSequence (void) const;
+  uint16_t GetStartingSequence (void) const override;
 
   /**
    * Get the distance between the current starting sequence number and the
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/parf-wifi-manager.cc ns-3.34/src/wifi/model/parf-wifi-manager.cc
--- ns-3.33/src/wifi/model/parf-wifi-manager.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/parf-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,365 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014 Universidad de la República - Uruguay
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Matias Richart <mrichart@fing.edu.uy>
- */
-
-#include "ns3/log.h"
-#include "ns3/uinteger.h"
-#include "ns3/data-rate.h"
-#include "parf-wifi-manager.h"
-#include "wifi-phy.h"
-
-#define Min(a,b) ((a < b) ? a : b)
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("ParfWifiManager");
-
-/**
- * Hold per-remote-station state for PARF Wifi manager.
- *
- * This struct extends from WifiRemoteStation struct to hold additional
- * information required by the PARF Wifi manager
- */
-struct ParfWifiRemoteStation : public WifiRemoteStation
-{
-  uint32_t m_nAttempt;       //!< Number of transmission attempts.
-  uint32_t m_nSuccess;       //!< Number of successful transmission attempts.
-  uint32_t m_nFail;          //!< Number of failed transmission attempts.
-  bool m_usingRecoveryRate;  //!< If using recovery rate.
-  bool m_usingRecoveryPower; //!< If using recovery power.
-  uint32_t m_nRetry;         //!< Number of transmission retries.
-  uint8_t m_prevRateIndex;   //!< Rate index of the previous transmission.
-  uint8_t m_rateIndex;       //!< Current rate index used by the remote station.
-  uint8_t m_prevPowerLevel;  //!< Power level of the previous transmission.
-  uint8_t m_powerLevel;      //!< Current power level used by the remote station.
-  uint8_t m_nSupported;      //!< Number of supported rates by the remote station.
-  bool m_initialized;        //!< For initializing variables.
-};
-
-NS_OBJECT_ENSURE_REGISTERED (ParfWifiManager);
-
-TypeId
-ParfWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ParfWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<ParfWifiManager> ()
-    .AddAttribute ("AttemptThreshold",
-                   "The minimum number of transmission attempts to try a new power or rate.",
-                   UintegerValue (15),
-                   MakeUintegerAccessor (&ParfWifiManager::m_attemptThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("SuccessThreshold",
-                   "The minimum number of successful transmissions to try a new power or rate.",
-                   UintegerValue (10),
-                   MakeUintegerAccessor (&ParfWifiManager::m_successThreshold),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddTraceSource ("PowerChange",
-                     "The transmission power has change",
-                     MakeTraceSourceAccessor (&ParfWifiManager::m_powerChange),
-                     "ns3::WifiRemoteStationManager::PowerChangeTracedCallback")
-    .AddTraceSource ("RateChange",
-                     "The transmission rate has change",
-                     MakeTraceSourceAccessor (&ParfWifiManager::m_rateChange),
-                     "ns3::WifiRemoteStationManager::RateChangeTracedCallback")
-  ;
-  return tid;
-}
-
-ParfWifiManager::ParfWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-ParfWifiManager::~ParfWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-ParfWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
-{
-  NS_LOG_FUNCTION (this << phy);
-  m_minPower = 0;
-  m_maxPower = phy->GetNTxPower () - 1;
-  WifiRemoteStationManager::SetupPhy (phy);
-}
-
-void
-ParfWifiManager::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  if (GetHtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
-    }
-  if (GetVhtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
-    }
-  if (GetHeSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
-    }
-}
-
-WifiRemoteStation *
-ParfWifiManager::DoCreateStation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  ParfWifiRemoteStation *station = new ParfWifiRemoteStation ();
-
-  station->m_nSuccess = 0;
-  station->m_nFail = 0;
-  station->m_usingRecoveryRate = false;
-  station->m_usingRecoveryPower = false;
-  station->m_initialized = false;
-  station->m_nRetry = 0;
-  station->m_nAttempt = 0;
-
-  NS_LOG_DEBUG ("create station=" << station << ", timer=" << station->m_nAttempt
-                                  << ", rate=" << +station->m_rateIndex << ", power=" << +station->m_powerLevel);
-
-  return station;
-}
-
-void
-ParfWifiManager::CheckInit (ParfWifiRemoteStation *station)
-{
-  if (!station->m_initialized)
-    {
-      station->m_nSupported = GetNSupported (station);
-      station->m_rateIndex = station->m_nSupported - 1;
-      station->m_prevRateIndex = station->m_nSupported - 1;
-      station->m_powerLevel = m_maxPower;
-      station->m_prevPowerLevel = m_maxPower;
-      WifiMode mode = GetSupported (station, station->m_rateIndex);
-      uint16_t channelWidth = GetChannelWidth (station);
-      DataRate rate = DataRate (mode.GetDataRate (channelWidth));
-      double power = GetPhy ()->GetPowerDbm (m_maxPower);
-      m_powerChange (power, power, station->m_state->m_address);
-      m_rateChange (rate, rate, station->m_state->m_address);
-      station->m_initialized = true;
-    }
-}
-
-void
-ParfWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-/*
- * It is important to realize that "recovery" mode starts after failure of
- * the first transmission after a rate increase and ends at the first successful
- * transmission. Specifically, recovery mode spans retransmissions boundaries.
- * Fundamentally, ARF handles each data transmission independently, whether it
- * is the initial transmission of a packet or the retransmission of a packet.
- * The fundamental reason for this is that there is a backoff between each data
- * transmission, be it an initial transmission or a retransmission.
- */
-void
-ParfWifiManager::DoReportDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  ParfWifiRemoteStation *station = static_cast<ParfWifiRemoteStation*> (st);
-  CheckInit (station);
-  station->m_nAttempt++;
-  station->m_nFail++;
-  station->m_nRetry++;
-  station->m_nSuccess = 0;
-
-  NS_LOG_DEBUG ("station=" << station << " data fail retry=" << station->m_nRetry << ", timer=" << station->m_nAttempt
-                           << ", rate=" << +station->m_rateIndex << ", power=" << +station->m_powerLevel);
-  if (station->m_usingRecoveryRate)
-    {
-      NS_ASSERT (station->m_nRetry >= 1);
-      if (station->m_nRetry == 1)
-        {
-          //need recovery fallback
-          if (station->m_rateIndex != 0)
-            {
-              NS_LOG_DEBUG ("station=" << station << " dec rate");
-              station->m_rateIndex--;
-              station->m_usingRecoveryRate = false;
-            }
-        }
-      station->m_nAttempt = 0;
-    }
-  else if (station->m_usingRecoveryPower)
-    {
-      NS_ASSERT (station->m_nRetry >= 1);
-      if (station->m_nRetry == 1)
-        {
-          //need recovery fallback
-          if (station->m_powerLevel < m_maxPower)
-            {
-              NS_LOG_DEBUG ("station=" << station << " inc power");
-              station->m_powerLevel++;
-              station->m_usingRecoveryPower = false;
-            }
-        }
-      station->m_nAttempt = 0;
-    }
-  else
-    {
-      NS_ASSERT (station->m_nRetry >= 1);
-      if (((station->m_nRetry - 1) % 2) == 1)
-        {
-          //need normal fallback
-          if (station->m_powerLevel == m_maxPower)
-            {
-              if (station->m_rateIndex != 0)
-                {
-                  NS_LOG_DEBUG ("station=" << station << " dec rate");
-                  station->m_rateIndex--;
-                }
-            }
-          else
-            {
-              NS_LOG_DEBUG ("station=" << station << " inc power");
-              station->m_powerLevel++;
-            }
-        }
-      if (station->m_nRetry >= 2)
-        {
-          station->m_nAttempt = 0;
-        }
-    }
-}
-
-void
-ParfWifiManager::DoReportRxOk (WifiRemoteStation *station,
-                               double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
-}
-
-void ParfWifiManager::DoReportRtsOk (WifiRemoteStation *station,
-                                     double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << station << ctsSnr << ctsMode << rtsSnr);
-}
-
-void ParfWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                      double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
-  ParfWifiRemoteStation *station = static_cast<ParfWifiRemoteStation*> (st);
-  CheckInit (station);
-  station->m_nAttempt++;
-  station->m_nSuccess++;
-  station->m_nFail = 0;
-  station->m_usingRecoveryRate = false;
-  station->m_usingRecoveryPower = false;
-  station->m_nRetry = 0;
-  NS_LOG_DEBUG ("station=" << station << " data ok success=" << station->m_nSuccess << ", timer=" << station->m_nAttempt << ", rate=" << +station->m_rateIndex << ", power=" << +station->m_powerLevel);
-  if ((station->m_nSuccess == m_successThreshold
-       || station->m_nAttempt == m_attemptThreshold)
-      && (station->m_rateIndex < (station->m_state->m_operationalRateSet.size () - 1)))
-    {
-      NS_LOG_DEBUG ("station=" << station << " inc rate");
-      station->m_rateIndex++;
-      station->m_nAttempt = 0;
-      station->m_nSuccess = 0;
-      station->m_usingRecoveryRate = true;
-    }
-  else if (station->m_nSuccess == m_successThreshold || station->m_nAttempt == m_attemptThreshold)
-    {
-      //we are at the maximum rate, we decrease power
-      if (station->m_powerLevel != m_minPower)
-        {
-          NS_LOG_DEBUG ("station=" << station << " dec power");
-          station->m_powerLevel--;
-        }
-      station->m_nAttempt = 0;
-      station->m_nSuccess = 0;
-      station->m_usingRecoveryPower = true;
-    }
-}
-
-void
-ParfWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-void
-ParfWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-}
-
-WifiTxVector
-ParfWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  ParfWifiRemoteStation *station = static_cast<ParfWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  CheckInit (station);
-  WifiMode mode = GetSupported (station, station->m_rateIndex);
-  DataRate rate = DataRate (mode.GetDataRate (channelWidth));
-  DataRate prevRate = DataRate (GetSupported (station, station->m_prevRateIndex).GetDataRate (channelWidth));
-  double power = GetPhy ()->GetPowerDbm (station->m_powerLevel);
-  double prevPower = GetPhy ()->GetPowerDbm (station->m_prevPowerLevel);
-  if (station->m_prevPowerLevel != station->m_powerLevel)
-    {
-      m_powerChange (prevPower, power, station->m_state->m_address);
-      station->m_prevPowerLevel = station->m_powerLevel;
-    }
-  if (station->m_prevRateIndex != station->m_rateIndex)
-    {
-      m_rateChange (prevRate, rate, station->m_state->m_address);
-      station->m_prevRateIndex = station->m_rateIndex;
-    }
-  return WifiTxVector (mode, station->m_powerLevel, GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-}
-
-WifiTxVector
-ParfWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  /// \todo we could/should implement the ARF algorithm for
-  /// RTS only by picking a single rate within the BasicRateSet.
-  ParfWifiRemoteStation *station = static_cast<ParfWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiTxVector rtsTxVector;
-  WifiMode mode;
-  if (GetUseNonErpProtection () == false)
-    {
-      mode = GetSupported (station, 0);
-    }
-  else
-    {
-      mode = GetNonErpSupported (station, 0);
-    }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/parf-wifi-manager.h ns-3.34/src/wifi/model/parf-wifi-manager.h
--- ns-3.33/src/wifi/model/parf-wifi-manager.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/parf-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,108 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014 Universidad de la República - Uruguay
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Matias Richart <mrichart@fing.edu.uy>
- */
-
-#ifndef PARF_WIFI_MANAGER_H
-#define PARF_WIFI_MANAGER_H
-
-#include "wifi-remote-station-manager.h"
-
-namespace ns3 {
-
-struct ParfWifiRemoteStation;
-/**
- * \ingroup wifi
- * PARF Rate control algorithm
- *
- * This class implements the PARF algorithm as described in
- * <i>Self-management in chaotic wireless deployments</i>, by
- * Akella, A.; Judd, G.; Seshan, S. and Steenkiste, P. in
- * Wireless Networks, Kluwer Academic Publishers, 2007, 13, 737-755
- * http://www.cs.odu.edu/~nadeem/classes/cs795-WNS-S13/papers/enter-006.pdf
- *
- * This RAA does not support HT modes and will error
- * exit if the user tries to configure this RAA with a Wi-Fi MAC
- * that supports 802.11n or higher.
- */
-class ParfWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * Register this type.
-   * \return The object TypeId.
-   */
-  static TypeId GetTypeId (void);
-  ParfWifiManager ();
-  virtual ~ParfWifiManager ();
-
-  // Inherited from WifiRemoteStationManager
-  void SetupPhy (const Ptr<WifiPhy> phy);
-
-
-private:
-  // Overridden from base class.
-  void DoInitialize (void);
-  WifiRemoteStation * DoCreateStation (void) const;
-  void DoReportRxOk (WifiRemoteStation *station,
-                     double rxSnr, WifiMode txMode);
-  void DoReportRtsFailed (WifiRemoteStation *station);
-  void DoReportDataFailed (WifiRemoteStation *station);
-  void DoReportRtsOk (WifiRemoteStation *station,
-                      double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  void DoReportFinalDataFailed (WifiRemoteStation *station);
-  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-
-  /** Check for initializations.
-   *
-   * \param station The remote station.
-   */
-  void CheckInit (ParfWifiRemoteStation *station);
-
-  uint32_t m_attemptThreshold; //!< The minimum number of transmission attempts to try a new power or rate. The 'timer' threshold in the ARF algorithm.
-  uint32_t m_successThreshold; //!< The minimum number of successful transmissions to try a new power or rate.
-
-  /**
-   * Minimal power level.
-   * In contrast to rate, power levels do not depend on the remote station.
-   * The levels depend only on the physical layer of the device.
-   */
-  uint8_t m_minPower;
-
-  /**
-   * Maximal power level.
-   */
-  uint8_t m_maxPower;
-
-  /**
-   * The trace source fired when the transmission power changes.
-   */
-  TracedCallback<double, double, Mac48Address> m_powerChange;
-  /**
-   * The trace source fired when the transmission rate changes.
-   */
-  TracedCallback<DataRate, DataRate, Mac48Address> m_rateChange;
-};
-
-} //namespace ns3
-
-#endif /* PARF_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/phy-entity.cc ns-3.34/src/wifi/model/phy-entity.cc
--- ns-3.33/src/wifi/model/phy-entity.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/phy-entity.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,1080 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy and spectrum-wifi-phy)
+ *          Mathieu Lacage <mathieu.lacage@sophia.inria.fr> (for logic ported from wifi-phy)
+ */
+
+#include "phy-entity.h"
+#include "spectrum-wifi-phy.h"
+#include "wifi-psdu.h"
+#include "preamble-detection-model.h"
+#include "frame-capture-model.h"
+#include "wifi-utils.h"
+#include "wifi-spectrum-signal-parameters.h"
+#include "ns3/packet.h"
+#include "ns3/simulator.h"
+#include "ns3/log.h"
+#include "ns3/assert.h"
+#include <algorithm>
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("PhyEntity");
+
+std::ostream & operator << (std::ostream &os, const PhyEntity::PhyRxFailureAction &action)
+{
+  switch (action)
+    {
+      case PhyEntity::DROP:
+        return (os << "DROP");
+      case PhyEntity::ABORT:
+        return (os << "ABORT");
+      case PhyEntity::IGNORE:
+        return (os << "IGNORE");
+      default:
+        NS_FATAL_ERROR ("Unknown action");
+        return (os << "unknown");
+    }
+}
+
+std::ostream & operator << (std::ostream &os, const PhyEntity::PhyFieldRxStatus &status)
+{
+  if (status.isSuccess)
+    {
+      return os << "success";
+    }
+  else
+    {
+      return os << "failure (" << status.reason << "/" << status.actionIfFailure << ")";
+    }
+}
+
+/*******************************************************
+ *       Abstract base class for PHY entities
+ *******************************************************/
+
+uint64_t PhyEntity::m_globalPpduUid = 0;
+
+PhyEntity::~PhyEntity ()
+{
+  NS_LOG_FUNCTION (this);
+  m_modeList.clear ();
+  CancelAllEvents ();
+}
+
+void
+PhyEntity::SetOwner (Ptr<WifiPhy> wifiPhy)
+{
+  NS_LOG_FUNCTION (this << wifiPhy);
+  m_wifiPhy = wifiPhy;
+  m_state = m_wifiPhy->m_state;
+}
+
+bool
+PhyEntity::IsModeSupported (WifiMode mode) const
+{
+  for (const auto & m : m_modeList)
+    {
+      if (m == mode)
+        {
+          return true;
+        }
+    }
+  return false;
+}
+
+uint8_t
+PhyEntity::GetNumModes (void) const
+{
+  return m_modeList.size ();
+}
+
+WifiMode
+PhyEntity::GetMcs (uint8_t /* index */) const
+{
+  NS_ABORT_MSG ("This method should be used only for HtPhy and child classes. Use GetMode instead.");
+  return WifiMode ();
+}
+
+bool
+PhyEntity::IsMcsSupported (uint8_t /* index */) const
+{
+  NS_ABORT_MSG ("This method should be used only for HtPhy and child classes. Use IsModeSupported instead.");
+  return false;
+}
+
+bool
+PhyEntity::HandlesMcsModes (void) const
+{
+  return false;
+}
+
+std::list<WifiMode>::const_iterator
+PhyEntity::begin (void) const
+{
+  return m_modeList.begin ();
+}
+
+std::list<WifiMode>::const_iterator
+PhyEntity::end (void) const
+{
+  return m_modeList.end ();
+}
+
+WifiMode
+PhyEntity::GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const
+{
+  NS_FATAL_ERROR ("PPDU field is not a SIG field (no sense in retrieving the signaled mode) or is unsupported: " << field);
+  return WifiMode (); //should be overloaded
+}
+
+WifiPpduField
+PhyEntity::GetNextField (WifiPpduField currentField, WifiPreamble preamble) const
+{
+  auto ppduFormats = GetPpduFormats ();
+  const auto itPpdu = ppduFormats.find (preamble);
+  if (itPpdu != ppduFormats.end ())
+    {
+      const auto itField = std::find (itPpdu->second.begin (), itPpdu->second.end (), currentField);
+      if (itField != itPpdu->second.end ())
+        {
+          const auto itNextField = std::next (itField, 1);
+          if (itNextField != itPpdu->second.end ())
+            {
+              return *(itNextField);
+            }
+          NS_FATAL_ERROR ("No field after " << currentField << " for " << preamble << " for the provided PPDU formats");
+        }
+      else
+        {
+          NS_FATAL_ERROR ("Unsupported PPDU field " << currentField << " for " << preamble << " for the provided PPDU formats");
+        }
+    }
+  else
+    {
+      NS_FATAL_ERROR ("Unsupported preamble " << preamble << " for the provided PPDU formats");
+    }
+}
+
+Time
+PhyEntity::GetDuration (WifiPpduField field, const WifiTxVector& txVector) const
+{
+  if (field > WIFI_PPDU_FIELD_SIG_B)
+    {
+      NS_FATAL_ERROR ("Unsupported PPDU field");
+    }
+  return MicroSeconds (0); //should be overloaded
+}
+
+Time
+PhyEntity::CalculatePhyPreambleAndHeaderDuration (const WifiTxVector& txVector) const
+{
+  Time duration = MicroSeconds (0);
+  for (uint8_t field = WIFI_PPDU_FIELD_PREAMBLE; field < WIFI_PPDU_FIELD_DATA; ++field)
+    {
+      duration += GetDuration (static_cast<WifiPpduField> (field), txVector);
+    }
+  return duration;
+}
+
+WifiConstPsduMap
+PhyEntity::GetWifiConstPsduMap (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) const
+{
+  return WifiConstPsduMap ({std::make_pair (SU_STA_ID, psdu)});
+}
+
+Ptr<const WifiPsdu>
+PhyEntity::GetAddressedPsduInPpdu (Ptr<const WifiPpdu> ppdu) const
+{
+  return ppdu->GetPsdu ();
+}
+
+PhyEntity::PhyHeaderSections
+PhyEntity::GetPhyHeaderSections (const WifiTxVector& txVector, Time ppduStart) const
+{
+  PhyHeaderSections map;
+  WifiPpduField field = WIFI_PPDU_FIELD_PREAMBLE; //preamble always present
+  Time start = ppduStart;
+
+  while (field != WIFI_PPDU_FIELD_DATA)
+    {
+      Time duration = GetDuration (field, txVector);
+      map[field] = std::make_pair (std::make_pair (start, start + duration),
+                                   GetSigMode (field, txVector));
+      //Move to next field
+      start += duration;
+      field = GetNextField (field, txVector.GetPreambleType ());
+    }
+  return map;
+}
+
+Ptr<WifiPpdu>
+PhyEntity::BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time /* ppduDuration */)
+{
+  NS_LOG_FUNCTION (this << psdus << txVector);
+  NS_FATAL_ERROR ("This method is unsupported for the base PhyEntity class. Use the overloaded version in the amendment-specific subclasses instead!");
+  return Create<WifiPpdu> (psdus.begin ()->second, txVector); //should be overloaded
+}
+
+Time
+PhyEntity::GetDurationUpToField (WifiPpduField field, const WifiTxVector& txVector) const
+{
+  if (field == WIFI_PPDU_FIELD_DATA) //this field is not in the map returned by GetPhyHeaderSections
+    {
+      return CalculatePhyPreambleAndHeaderDuration (txVector);
+    }
+  const auto & sections = GetPhyHeaderSections (txVector, NanoSeconds (0));
+  auto it = sections.find (field);
+  NS_ASSERT (it != sections.end ());
+  const auto & startStopTimes = it->second.first;
+  return startStopTimes.first; //return the start time of field relatively to the beginning of the PPDU
+}
+
+PhyEntity::SnrPer
+PhyEntity::GetPhyHeaderSnrPer (WifiPpduField field, Ptr<Event> event) const
+{
+  uint16_t measurementChannelWidth = GetMeasurementChannelWidth (event->GetPpdu ());
+  return m_wifiPhy->m_interference.CalculatePhyHeaderSnrPer (event, measurementChannelWidth, m_wifiPhy->GetPrimaryBand (measurementChannelWidth),
+                                                             field);
+}
+
+void
+PhyEntity::StartReceiveField (WifiPpduField field, Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << field << *event);
+  NS_ASSERT (m_wifiPhy); //no sense if no owner WifiPhy instance
+  NS_ASSERT (m_wifiPhy->m_endPhyRxEvent.IsExpired ());
+  NS_ABORT_MSG_IF (field == WIFI_PPDU_FIELD_PREAMBLE, "Use the StartReceivePreamble method for preamble reception");
+  //Handle special cases of data reception
+  if (field == WIFI_PPDU_FIELD_DATA)
+    {
+      StartReceivePayload (event);
+      return;
+    }
+
+  bool supported = DoStartReceiveField (field, event);
+  NS_ABORT_MSG_IF (!supported, "Unknown field " << field << " for this PHY entity"); //TODO see what to do if not supported
+  Time duration = GetDuration (field, event->GetTxVector ());
+  m_wifiPhy->m_endPhyRxEvent = Simulator::Schedule (duration, &PhyEntity::EndReceiveField, this, field, event);
+  m_state->SwitchMaybeToCcaBusy (duration); //keep in CCA busy state up to reception of Data (will then switch to RX)
+}
+
+void
+PhyEntity::EndReceiveField (WifiPpduField field, Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << field << *event);
+  NS_ASSERT (m_wifiPhy); //no sense if no owner WifiPhy instance
+  NS_ASSERT (m_wifiPhy->m_endPhyRxEvent.IsExpired ());
+  PhyFieldRxStatus status = DoEndReceiveField (field, event);
+  WifiTxVector txVector = event->GetTxVector ();
+  if (status.isSuccess) //move to next field if reception succeeded
+    {
+      StartReceiveField (GetNextField (field, txVector.GetPreambleType ()), event);
+    }
+  else
+    {
+      Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
+      switch (status.actionIfFailure)
+        {
+          case ABORT:
+            //Abort reception, but consider medium as busy
+            AbortCurrentReception (status.reason);
+            if (event->GetEndTime () > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
+              {
+                m_wifiPhy->MaybeCcaBusyDuration (GetMeasurementChannelWidth (ppdu));
+              }
+            break;
+          case DROP:
+            //Notify drop, keep in CCA busy, and perform same processing as IGNORE case
+            if (status.reason == FILTERED)
+              {
+                //PHY-RXSTART is immediately followed by PHY-RXEND (Filtered)
+                m_wifiPhy->m_phyRxPayloadBeginTrace (txVector, NanoSeconds (0)); //this callback (equivalent to PHY-RXSTART primitive) is also triggered for filtered PPDUs
+              }
+            m_wifiPhy->NotifyRxDrop (GetAddressedPsduInPpdu (ppdu), status.reason);
+            m_state->SwitchMaybeToCcaBusy (GetRemainingDurationAfterField (ppdu, field)); //keep in CCA busy state till the end
+          //no break
+          case IGNORE:
+            //Keep in Rx state and reset at end
+            m_endRxPayloadEvents.push_back (Simulator::Schedule (GetRemainingDurationAfterField (ppdu, field),
+                                                                 &PhyEntity::ResetReceive, this, event));
+            break;
+          default:
+            NS_FATAL_ERROR ("Unknown action in case of failure");
+        }
+    }
+}
+
+Time
+PhyEntity::GetRemainingDurationAfterField (Ptr<const WifiPpdu> ppdu, WifiPpduField field) const
+{
+  const WifiTxVector& txVector = ppdu->GetTxVector ();
+  return ppdu->GetTxDuration () - (GetDurationUpToField (field, txVector) + GetDuration (field, txVector));
+}
+
+bool
+PhyEntity::DoStartReceiveField (WifiPpduField field, Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << field << *event);
+  NS_ASSERT (field != WIFI_PPDU_FIELD_PREAMBLE && field != WIFI_PPDU_FIELD_DATA); //handled apart for the time being
+  auto ppduFormats = GetPpduFormats ();
+  auto itFormat = ppduFormats.find (event->GetPpdu ()->GetPreamble ());
+  if (itFormat != ppduFormats.end ())
+    {
+      auto itField = std::find (itFormat->second.begin (), itFormat->second.end (), field);
+      if (itField != itFormat->second.end ())
+        {
+          return true; //supported field so we can start receiving
+        }
+    }
+  return false; //unsupported otherwise
+}
+
+PhyEntity::PhyFieldRxStatus
+PhyEntity::DoEndReceiveField (WifiPpduField field, Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << field << *event);
+  NS_ASSERT (field != WIFI_PPDU_FIELD_DATA); //handled apart for the time being
+  if (field == WIFI_PPDU_FIELD_PREAMBLE)
+    {
+      return DoEndReceivePreamble (event);
+    }
+  return PhyFieldRxStatus (false); //failed reception by default
+}
+
+void
+PhyEntity::StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW,
+                                 Time /* rxDuration */)
+{
+  //The total RX power corresponds to the maximum over all the bands
+  auto it = std::max_element (rxPowersW.begin (), rxPowersW.end (),
+                              [] (const std::pair<WifiSpectrumBand, double> &p1, const std::pair<WifiSpectrumBand, double> &p2) {
+                                return p1.second < p2.second;
+                              });
+  NS_LOG_FUNCTION (this << ppdu << it->second);
+  Time rxDuration = ppdu->GetTxDuration (); //the actual duration of the PPDU should be considered
+
+  Ptr<Event> event = DoGetEvent (ppdu, rxPowersW);
+  if (event == nullptr)
+    {
+      //PPDU should be simply considered as interference (once it has been accounted for in InterferenceHelper)
+      return;
+    }
+
+  Time endRx = Simulator::Now () + rxDuration;
+  if (m_state->GetState () == WifiPhyState::OFF)
+    {
+      NS_LOG_DEBUG ("Cannot start RX because device is OFF");
+      if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
+        {
+          m_wifiPhy->MaybeCcaBusyDuration (m_wifiPhy->GetMeasurementChannelWidth (nullptr));
+        }
+      return;
+    }
+
+  if (ppdu->IsTruncatedTx ())
+    {
+      NS_LOG_DEBUG ("Packet reception stopped because transmitter has been switched off");
+      if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
+        {
+          m_wifiPhy->MaybeCcaBusyDuration (GetMeasurementChannelWidth (ppdu));
+        }
+      return;
+    }
+
+  switch (m_state->GetState ())
+    {
+      case WifiPhyState::SWITCHING:
+        NS_LOG_DEBUG ("Drop packet because of channel switching");
+        /*
+         * Packets received on the upcoming channel are added to the event list
+         * during the switching state. This way the medium can be correctly sensed
+         * when the device listens to the channel for the first time after the
+         * switching e.g. after channel switching, the channel may be sensed as
+         * busy due to other devices' transmissions started before the end of
+         * the switching.
+         */
+        DropPreambleEvent (ppdu, CHANNEL_SWITCHING, endRx, m_wifiPhy->GetMeasurementChannelWidth (ppdu));
+        break;
+      case WifiPhyState::RX:
+        if (m_wifiPhy->m_frameCaptureModel != 0
+            && m_wifiPhy->m_frameCaptureModel->IsInCaptureWindow (m_wifiPhy->m_timeLastPreambleDetected)
+            && m_wifiPhy->m_frameCaptureModel->CaptureNewFrame (m_wifiPhy->m_currentEvent, event))
+          {
+            AbortCurrentReception (FRAME_CAPTURE_PACKET_SWITCH);
+            NS_LOG_DEBUG ("Switch to new packet");
+            StartPreambleDetectionPeriod (event);
+          }
+        else
+          {
+            NS_LOG_DEBUG ("Drop packet because already in Rx");
+            DropPreambleEvent (ppdu, RXING, endRx, m_wifiPhy->GetMeasurementChannelWidth (ppdu));
+            if (m_wifiPhy->m_currentEvent == 0)
+              {
+                /*
+                 * We are here because the non-legacy PHY header has not been successfully received.
+                 * The PHY is kept in RX state for the duration of the PPDU, but EndReceive function is
+                 * not called when the reception of the PPDU is finished, which is responsible to clear
+                 * m_currentPreambleEvents. As a result, m_currentPreambleEvents should be cleared here.
+                 */
+                m_wifiPhy->m_currentPreambleEvents.clear ();
+              }
+          }
+        break;
+      case WifiPhyState::TX:
+        NS_LOG_DEBUG ("Drop packet because already in Tx");
+        DropPreambleEvent (ppdu, TXING, endRx, m_wifiPhy->GetMeasurementChannelWidth (ppdu));
+        break;
+      case WifiPhyState::CCA_BUSY:
+        if (m_wifiPhy->m_currentEvent != 0)
+          {
+            if (m_wifiPhy->m_frameCaptureModel != 0
+                && m_wifiPhy->m_frameCaptureModel->IsInCaptureWindow (m_wifiPhy->m_timeLastPreambleDetected)
+                && m_wifiPhy->m_frameCaptureModel->CaptureNewFrame (m_wifiPhy->m_currentEvent, event))
+              {
+                AbortCurrentReception (FRAME_CAPTURE_PACKET_SWITCH);
+                NS_LOG_DEBUG ("Switch to new packet");
+                StartPreambleDetectionPeriod (event);
+              }
+            else
+              {
+                NS_LOG_DEBUG ("Drop packet because already decoding preamble");
+                DropPreambleEvent (ppdu, BUSY_DECODING_PREAMBLE, endRx, m_wifiPhy->GetMeasurementChannelWidth (ppdu));
+              }
+          }
+        else
+          {
+            StartPreambleDetectionPeriod (event);
+          }
+        break;
+      case WifiPhyState::IDLE:
+        NS_ASSERT (m_wifiPhy->m_currentEvent == 0);
+        StartPreambleDetectionPeriod (event);
+        break;
+      case WifiPhyState::SLEEP:
+        NS_LOG_DEBUG ("Drop packet because in sleep mode");
+        DropPreambleEvent (ppdu, SLEEPING, endRx, m_wifiPhy->GetMeasurementChannelWidth (nullptr));
+        break;
+      default:
+        NS_FATAL_ERROR ("Invalid WifiPhy state.");
+        break;
+    }
+}
+
+void
+PhyEntity::DropPreambleEvent (Ptr<const WifiPpdu> ppdu, WifiPhyRxfailureReason reason, Time endRx, uint16_t measurementChannelWidth)
+{
+  NS_LOG_FUNCTION (this << ppdu << reason << endRx << measurementChannelWidth);
+  m_wifiPhy->NotifyRxDrop (GetAddressedPsduInPpdu (ppdu), reason);
+  auto it = m_wifiPhy->m_currentPreambleEvents.find (std::make_pair (ppdu->GetUid (), ppdu->GetPreamble ()));
+  if (it != m_wifiPhy->m_currentPreambleEvents.end ())
+    {
+      m_wifiPhy->m_currentPreambleEvents.erase (it);
+    }
+  if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
+    {
+      //that PPDU will be noise _after_ the end of the current event.
+      m_wifiPhy->MaybeCcaBusyDuration (measurementChannelWidth);
+    }
+}
+
+void
+PhyEntity::ErasePreambleEvent (Ptr<const WifiPpdu> ppdu, Time rxDuration)
+{
+  NS_LOG_FUNCTION (this << ppdu << rxDuration);
+  auto it = m_wifiPhy->m_currentPreambleEvents.find (std::make_pair (ppdu->GetUid (), ppdu->GetPreamble ()));
+  if (it != m_wifiPhy->m_currentPreambleEvents.end ())
+    {
+      m_wifiPhy->m_currentPreambleEvents.erase (it);
+    }
+  if (m_wifiPhy->m_currentPreambleEvents.empty ())
+    {
+      m_wifiPhy->Reset ();
+    }
+
+  if (rxDuration > m_state->GetDelayUntilIdle ())
+    {
+      //this PPDU will be noise _after_ the completion of the current event
+      m_wifiPhy->SwitchMaybeToCcaBusy (GetMeasurementChannelWidth (ppdu));
+    }
+}
+
+uint16_t
+PhyEntity::GetStaId (const Ptr<const WifiPpdu> /* ppdu */) const
+{
+  return SU_STA_ID;
+}
+
+void
+PhyEntity::StartReceivePayload (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  NS_ASSERT (m_wifiPhy->m_endPhyRxEvent.IsExpired ());
+  const WifiTxVector& txVector = event->GetTxVector ();
+  Time payloadDuration = event->GetPpdu ()->GetTxDuration () - CalculatePhyPreambleAndHeaderDuration (txVector);
+
+  //TODO: Add method in WifiPhy to clear all other PHYs (since this one is starting Rx)
+  m_state->SwitchToRx (payloadDuration);
+  m_wifiPhy->m_phyRxPayloadBeginTrace (txVector, payloadDuration); //this callback (equivalent to PHY-RXSTART primitive) is triggered only if headers have been correctly decoded and that the mode within is supported
+
+  DoStartReceivePayload (event);
+}
+
+void
+PhyEntity::DoStartReceivePayload (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
+  NS_LOG_DEBUG ("Receiving PSDU");
+  uint16_t staId = GetStaId (ppdu);
+  m_signalNoiseMap.insert ({std::make_pair (ppdu->GetUid (), staId), SignalNoiseDbm ()});
+  m_statusPerMpduMap.insert ({std::make_pair (ppdu->GetUid (), staId), std::vector<bool> ()});
+  ScheduleEndOfMpdus (event);
+  m_endRxPayloadEvents.push_back (Simulator::Schedule (ppdu->GetTxDuration () - CalculatePhyPreambleAndHeaderDuration (event->GetTxVector ()),
+                                                       &PhyEntity::EndReceivePayload, this, event));
+}
+
+void
+PhyEntity::ScheduleEndOfMpdus (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
+  Ptr<const WifiPsdu> psdu = GetAddressedPsduInPpdu (ppdu);
+  const WifiTxVector& txVector = event->GetTxVector ();
+  uint16_t staId = GetStaId (ppdu);
+  Time endOfMpduDuration = NanoSeconds (0);
+  Time relativeStart = NanoSeconds (0);
+  Time psduDuration = ppdu->GetTxDuration () - CalculatePhyPreambleAndHeaderDuration (txVector);
+  Time remainingAmpduDuration = psduDuration;
+  size_t nMpdus = psdu->GetNMpdus ();
+  MpduType mpduType = (nMpdus > 1) ? FIRST_MPDU_IN_AGGREGATE : (psdu->IsSingle () ? SINGLE_MPDU : NORMAL_MPDU);
+  uint32_t totalAmpduSize = 0;
+  double totalAmpduNumSymbols = 0.0;
+  auto mpdu = psdu->begin ();
+  for (size_t i = 0; i < nMpdus && mpdu != psdu->end (); ++mpdu)
+    {
+      uint32_t size = (mpduType == NORMAL_MPDU) ? psdu->GetSize () : psdu->GetAmpduSubframeSize (i);
+      Time mpduDuration = m_wifiPhy->GetPayloadDuration (size, txVector,
+                                                         m_wifiPhy->GetPhyBand (), mpduType, true, totalAmpduSize,
+                                                         totalAmpduNumSymbols, staId);
+
+      remainingAmpduDuration -= mpduDuration;
+      if (i == (nMpdus - 1) && !remainingAmpduDuration.IsZero ()) //no more MPDUs coming
+        {
+          if (remainingAmpduDuration < NanoSeconds (txVector.GetGuardInterval ())) //enables to ignore padding
+            {
+              mpduDuration += remainingAmpduDuration; //apply a correction just in case rounding had induced slight shift
+            }
+        }
+
+      endOfMpduDuration += mpduDuration;
+      NS_LOG_INFO ("Schedule end of MPDU #" << i << " in " << endOfMpduDuration.As (Time::NS) <<
+                   " (relativeStart=" << relativeStart.As (Time::NS) << ", mpduDuration=" << mpduDuration.As (Time::NS) <<
+                   ", remainingAmdpuDuration=" << remainingAmpduDuration.As (Time::NS) << ")");
+      m_endOfMpduEvents.push_back (Simulator::Schedule (endOfMpduDuration, &PhyEntity::EndOfMpdu, this, event, Create<WifiPsdu> (*mpdu, false), i, relativeStart, mpduDuration));
+
+      //Prepare next iteration
+      ++i;
+      relativeStart += mpduDuration;
+      mpduType = (i == (nMpdus - 1)) ? LAST_MPDU_IN_AGGREGATE : MIDDLE_MPDU_IN_AGGREGATE;
+    }
+}
+
+void
+PhyEntity::EndOfMpdu (Ptr<Event> event, Ptr<const WifiPsdu> psdu, size_t mpduIndex, Time relativeStart, Time mpduDuration)
+{
+  NS_LOG_FUNCTION (this << *event << mpduIndex << relativeStart << mpduDuration);
+  Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
+  WifiTxVector txVector = event->GetTxVector ();
+  uint16_t staId = GetStaId (ppdu);
+  const auto & channelWidthAndBand = GetChannelWidthAndBand (event->GetTxVector (), staId);
+  double snr = m_wifiPhy->m_interference.CalculateSnr (event, channelWidthAndBand.first, txVector.GetNss (staId), channelWidthAndBand.second);
+
+  std::pair<bool, SignalNoiseDbm> rxInfo = GetReceptionStatus (psdu, event, staId, relativeStart, mpduDuration);
+  NS_LOG_DEBUG ("Extracted MPDU #" << mpduIndex << ": duration: " << mpduDuration.As (Time::NS) <<
+                ", correct reception: " << rxInfo.first << ", Signal/Noise: " << rxInfo.second.signal << "/" << rxInfo.second.noise << "dBm");
+
+  auto signalNoiseIt = m_signalNoiseMap.find (std::make_pair (ppdu->GetUid (), staId));
+  NS_ASSERT (signalNoiseIt != m_signalNoiseMap.end ());
+  signalNoiseIt->second = rxInfo.second;
+
+  RxSignalInfo rxSignalInfo;
+  rxSignalInfo.snr = snr;
+  rxSignalInfo.rssi = rxInfo.second.signal;
+
+  auto statusPerMpduIt = m_statusPerMpduMap.find (std::make_pair (ppdu->GetUid (), staId));
+  NS_ASSERT (statusPerMpduIt != m_statusPerMpduMap.end ());
+  statusPerMpduIt->second.push_back (rxInfo.first);
+
+  if (rxInfo.first && GetAddressedPsduInPpdu (ppdu)->GetNMpdus () > 1)
+    {
+      //only done for correct MPDU that is part of an A-MPDU
+      m_state->ContinueRxNextMpdu (Copy (psdu), rxSignalInfo, txVector);
+    }
+}
+
+void
+PhyEntity::EndReceivePayload (Ptr<Event> event)
+{
+  Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
+  WifiTxVector txVector = event->GetTxVector ();
+  Time psduDuration = ppdu->GetTxDuration () - CalculatePhyPreambleAndHeaderDuration (txVector);
+  NS_LOG_FUNCTION (this << *event << psduDuration);
+  NS_ASSERT (event->GetEndTime () == Simulator::Now ());
+  uint16_t staId = GetStaId (ppdu);
+  const auto & channelWidthAndBand = GetChannelWidthAndBand (event->GetTxVector (), staId);
+  double snr = m_wifiPhy->m_interference.CalculateSnr (event, channelWidthAndBand.first, txVector.GetNss (staId), channelWidthAndBand.second);
+
+  Ptr<const WifiPsdu> psdu = GetAddressedPsduInPpdu (ppdu);
+  m_wifiPhy->NotifyRxEnd (psdu);
+
+  auto signalNoiseIt = m_signalNoiseMap.find (std::make_pair (ppdu->GetUid (), staId));
+  NS_ASSERT (signalNoiseIt != m_signalNoiseMap.end ());
+  auto statusPerMpduIt = m_statusPerMpduMap.find (std::make_pair (ppdu->GetUid (), staId));
+  NS_ASSERT (statusPerMpduIt != m_statusPerMpduMap.end ());
+
+  if (std::count (statusPerMpduIt->second.begin (), statusPerMpduIt->second.end (), true))
+    {
+      //At least one MPDU has been successfully received
+      m_wifiPhy->NotifyMonitorSniffRx (psdu, m_wifiPhy->GetFrequency (), txVector, signalNoiseIt->second, statusPerMpduIt->second, staId);
+      RxSignalInfo rxSignalInfo;
+      rxSignalInfo.snr = snr;
+      rxSignalInfo.rssi = signalNoiseIt->second.signal; //same information for all MPDUs
+      m_state->SwitchFromRxEndOk (Copy (psdu), rxSignalInfo, txVector, staId, statusPerMpduIt->second);
+      m_wifiPhy->m_previouslyRxPpduUid = ppdu->GetUid (); //store UID only if reception is successful (because otherwise trigger won't be read by MAC layer)
+    }
+  else
+    {
+      m_state->SwitchFromRxEndError (Copy (psdu), snr);
+    }
+
+  DoEndReceivePayload (ppdu);
+  m_wifiPhy->MaybeCcaBusyDuration (GetMeasurementChannelWidth (ppdu));
+}
+
+void
+PhyEntity::DoEndReceivePayload (Ptr<const WifiPpdu> ppdu)
+{
+  NS_LOG_FUNCTION (this << ppdu);
+  NS_ASSERT (m_wifiPhy->GetLastRxEndTime () == Simulator::Now ());
+  NotifyInterferenceRxEndAndClear (false); //don't reset WifiPhy
+
+  m_wifiPhy->m_currentEvent = 0;
+  m_wifiPhy->m_currentPreambleEvents.clear ();
+  m_endRxPayloadEvents.clear ();
+}
+
+std::pair<bool, SignalNoiseDbm>
+PhyEntity::GetReceptionStatus (Ptr<const WifiPsdu> psdu, Ptr<Event> event, uint16_t staId,
+                               Time relativeMpduStart, Time mpduDuration)
+{
+  NS_LOG_FUNCTION (this << *psdu << *event << staId << relativeMpduStart << mpduDuration);
+  const auto & channelWidthAndBand = GetChannelWidthAndBand (event->GetTxVector (), staId);
+  SnrPer snrPer = m_wifiPhy->m_interference.CalculatePayloadSnrPer (event, channelWidthAndBand.first, channelWidthAndBand.second, staId,
+                                                                    std::make_pair (relativeMpduStart, relativeMpduStart + mpduDuration));
+
+  WifiMode mode = event->GetTxVector ().GetMode (staId);
+  NS_LOG_DEBUG ("rate=" << (mode.GetDataRate (event->GetTxVector (), staId)) <<
+                ", SNR(dB)=" << RatioToDb (snrPer.snr) << ", PER=" << snrPer.per << ", size=" << psdu->GetSize () <<
+                ", relativeStart = " << relativeMpduStart.As (Time::NS) << ", duration = " << mpduDuration.As (Time::NS));
+
+  // There are two error checks: PER and receive error model check.
+  // PER check models is typical for Wi-Fi and is based on signal modulation;
+  // Receive error model is optional, if we have an error model and
+  // it indicates that the packet is corrupt, drop the packet.
+  SignalNoiseDbm signalNoise;
+  signalNoise.signal = WToDbm (event->GetRxPowerW (channelWidthAndBand.second));
+  signalNoise.noise = WToDbm (event->GetRxPowerW (channelWidthAndBand.second) / snrPer.snr);
+  if (GetRandomValue () > snrPer.per
+      && !(m_wifiPhy->m_postReceptionErrorModel && m_wifiPhy->m_postReceptionErrorModel->IsCorrupt (psdu->GetPacket ()->Copy ())))
+    {
+      NS_LOG_DEBUG ("Reception succeeded: " << psdu);
+      return std::make_pair (true, signalNoise);
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Reception failed: " << psdu);
+      return std::make_pair (false, signalNoise);
+    }
+}
+
+std::pair<uint16_t, WifiSpectrumBand>
+PhyEntity::GetChannelWidthAndBand (const WifiTxVector& txVector, uint16_t /* staId */) const
+{
+  uint16_t channelWidth = GetRxChannelWidth (txVector);
+  return std::make_pair (channelWidth, m_wifiPhy->GetPrimaryBand (channelWidth));
+}
+
+const std::map <std::pair<uint64_t, WifiPreamble>, Ptr<Event> > &
+PhyEntity::GetCurrentPreambleEvents (void) const
+{
+  return m_wifiPhy->m_currentPreambleEvents;
+}
+
+void
+PhyEntity::AddPreambleEvent (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
+  m_wifiPhy->m_currentPreambleEvents.insert ({std::make_pair (ppdu->GetUid (), ppdu->GetPreamble ()), event});
+}
+
+Ptr<Event>
+PhyEntity::DoGetEvent (Ptr<const WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW)
+{
+  Ptr<Event> event = CreateInterferenceEvent (ppdu, ppdu->GetTxVector (), ppdu->GetTxDuration (), rxPowersW);
+
+  //We store all incoming preamble events, and a decision is made at the end of the preamble detection window.
+  auto uidPreamblePair = std::make_pair (ppdu->GetUid (), ppdu->GetPreamble ());
+  NS_ASSERT (m_wifiPhy->m_currentPreambleEvents.find (uidPreamblePair) == m_wifiPhy->m_currentPreambleEvents.end ());
+  m_wifiPhy->m_currentPreambleEvents.insert ({uidPreamblePair, event});
+  return event;
+}
+
+Ptr<Event>
+PhyEntity::CreateInterferenceEvent (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing /* = false */)
+{
+  return m_wifiPhy->m_interference.Add (ppdu, txVector, duration, rxPower, isStartOfdmaRxing);
+}
+
+void
+PhyEntity::UpdateInterferenceEvent (Ptr<Event> event, RxPowerWattPerChannelBand rxPower)
+{
+  m_wifiPhy->m_interference.UpdateEvent (event, rxPower);
+}
+
+void
+PhyEntity::NotifyInterferenceRxEndAndClear (bool reset)
+{
+  m_wifiPhy->m_interference.NotifyRxEnd (Simulator::Now ());
+  m_signalNoiseMap.clear ();
+  m_statusPerMpduMap.clear ();
+  for (const auto & endOfMpduEvent : m_endOfMpduEvents)
+    {
+      NS_ASSERT (endOfMpduEvent.IsExpired ());
+    }
+  m_endOfMpduEvents.clear ();
+  if (reset)
+    {
+      m_wifiPhy->Reset ();
+    }
+}
+
+PhyEntity::PhyFieldRxStatus
+PhyEntity::DoEndReceivePreamble (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  NS_ASSERT (m_wifiPhy->m_currentPreambleEvents.size () == 1); //Synched on one after detection period
+  return PhyFieldRxStatus (true); //always consider that preamble has been correctly received if preamble detection was OK
+}
+
+void
+PhyEntity::StartPreambleDetectionPeriod (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  NS_LOG_DEBUG ("Sync to signal (power=" << WToDbm (GetRxPowerWForPpdu (event)) << "dBm)");
+  m_wifiPhy->m_interference.NotifyRxStart (); //We need to notify it now so that it starts recording events
+  m_endPreambleDetectionEvents.push_back (Simulator::Schedule (m_wifiPhy->GetPreambleDetectionDuration (), &PhyEntity::EndPreambleDetectionPeriod, this, event));
+}
+
+void
+PhyEntity::EndPreambleDetectionPeriod (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  NS_ASSERT (!m_wifiPhy->IsStateRx ());
+  NS_ASSERT (m_wifiPhy->m_endPhyRxEvent.IsExpired ()); //since end of preamble reception is scheduled by this method upon success
+
+  //calculate PER on the measurement channel for PHY headers
+  uint16_t measurementChannelWidth = GetMeasurementChannelWidth (event->GetPpdu ());
+  auto measurementBand = m_wifiPhy->GetPrimaryBand (measurementChannelWidth);
+  double maxRxPowerW = -1; //in case current event may not be sent on measurement channel (rxPowerW would be equal to 0)
+  Ptr<Event> maxEvent;
+  NS_ASSERT (!m_wifiPhy->m_currentPreambleEvents.empty ());
+  for (auto preambleEvent : m_wifiPhy->m_currentPreambleEvents)
+    {
+      double rxPowerW = preambleEvent.second->GetRxPowerW (measurementBand);
+      if (rxPowerW > maxRxPowerW)
+        {
+          maxRxPowerW = rxPowerW;
+          maxEvent = preambleEvent.second;
+        }
+    }
+
+  NS_ASSERT (maxEvent != 0);
+  if (maxEvent != event)
+    {
+      NS_LOG_DEBUG ("Receiver got a stronger packet with UID " << maxEvent->GetPpdu ()->GetUid () << " during preamble detection: drop packet with UID " << event->GetPpdu ()->GetUid ());
+      m_wifiPhy->NotifyRxDrop (GetAddressedPsduInPpdu (event->GetPpdu ()), BUSY_DECODING_PREAMBLE);
+      auto it = m_wifiPhy->m_currentPreambleEvents.find (std::make_pair (event->GetPpdu ()->GetUid (), event->GetPpdu ()->GetPreamble ()));
+      m_wifiPhy->m_currentPreambleEvents.erase (it);
+      //This is needed to cleanup the m_firstPowerPerBand so that the first power corresponds to the power at the start of the PPDU
+      m_wifiPhy->m_interference.NotifyRxEnd (maxEvent->GetStartTime ());
+      //Make sure InterferenceHelper keeps recording events
+      m_wifiPhy->m_interference.NotifyRxStart ();
+      return;
+    }
+
+  m_wifiPhy->m_currentEvent = event;
+
+  double snr = m_wifiPhy->m_interference.CalculateSnr (m_wifiPhy->m_currentEvent, measurementChannelWidth, 1, measurementBand);
+  NS_LOG_DEBUG ("SNR(dB)=" << RatioToDb (snr) << " at end of preamble detection period");
+
+  if ((!m_wifiPhy->m_preambleDetectionModel && maxRxPowerW > 0.0)
+      || (m_wifiPhy->m_preambleDetectionModel && m_wifiPhy->m_preambleDetectionModel->IsPreambleDetected (m_wifiPhy->m_currentEvent->GetRxPowerW (measurementBand), snr, measurementChannelWidth)))
+    {
+      //A bit convoluted but it enables to sync all PHYs
+      for (auto & it : m_wifiPhy->m_phyEntities)
+        {
+          it.second->CancelRunningEndPreambleDetectionEvents (true);
+        }
+
+      for (auto it = m_wifiPhy->m_currentPreambleEvents.begin (); it != m_wifiPhy->m_currentPreambleEvents.end (); )
+        {
+          if (it->second != m_wifiPhy->m_currentEvent)
+            {
+              NS_LOG_DEBUG ("Drop packet with UID " << it->first.first << " and preamble " << it->first.second << " arrived at time " << it->second->GetStartTime ());
+              WifiPhyRxfailureReason reason;
+              if (m_wifiPhy->m_currentEvent->GetPpdu ()->GetUid () > it->first.first)
+                {
+                  reason = PREAMBLE_DETECTION_PACKET_SWITCH;
+                  //This is needed to cleanup the m_firstPowerPerBand so that the first power corresponds to the power at the start of the PPDU
+                  m_wifiPhy->m_interference.NotifyRxEnd (m_wifiPhy->m_currentEvent->GetStartTime ());
+                }
+              else
+                {
+                  reason = BUSY_DECODING_PREAMBLE;
+                }
+              m_wifiPhy->NotifyRxDrop (GetAddressedPsduInPpdu (it->second->GetPpdu ()), reason);
+              it = m_wifiPhy->m_currentPreambleEvents.erase (it);
+            }
+          else
+            {
+              ++it;
+            }
+        }
+
+      //Make sure InterferenceHelper keeps recording events
+      m_wifiPhy->m_interference.NotifyRxStart ();
+
+      m_wifiPhy->NotifyRxBegin (GetAddressedPsduInPpdu (m_wifiPhy->m_currentEvent->GetPpdu ()), m_wifiPhy->m_currentEvent->GetRxPowerWPerBand ());
+      m_wifiPhy->m_timeLastPreambleDetected = Simulator::Now ();
+
+      //Continue receiving preamble
+      Time durationTillEnd = GetDuration (WIFI_PPDU_FIELD_PREAMBLE, event->GetTxVector ()) - m_wifiPhy->GetPreambleDetectionDuration ();
+      m_state->SwitchMaybeToCcaBusy (durationTillEnd); //will be prolonged by next field
+      m_wifiPhy->m_endPhyRxEvent = Simulator::Schedule (durationTillEnd, &PhyEntity::EndReceiveField, this, WIFI_PPDU_FIELD_PREAMBLE, event);
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Drop packet because PHY preamble detection failed");
+      // Like CCA-SD, CCA-ED is governed by the 4 us CCA window to flag CCA-BUSY
+      // for any received signal greater than the CCA-ED threshold.
+      DropPreambleEvent (m_wifiPhy->m_currentEvent->GetPpdu (), PREAMBLE_DETECT_FAILURE, m_wifiPhy->m_currentEvent->GetEndTime (), m_wifiPhy->GetMeasurementChannelWidth (m_wifiPhy->m_currentEvent->GetPpdu ()));
+      if (m_wifiPhy->m_currentPreambleEvents.empty ())
+        {
+          //Do not erase events if there are still pending preamble events to be processed
+          m_wifiPhy->m_interference.NotifyRxEnd (Simulator::Now ());
+        }
+      m_wifiPhy->m_currentEvent = 0;
+      //Cancel preamble reception
+      m_wifiPhy->m_endPhyRxEvent.Cancel ();
+    }
+}
+
+bool
+PhyEntity::IsConfigSupported (Ptr<const WifiPpdu> ppdu) const
+{
+  WifiMode txMode = ppdu->GetTxVector ().GetMode ();
+  if (!IsModeSupported (txMode))
+    {
+      NS_LOG_DEBUG ("Drop packet because it was sent using an unsupported mode (" << txMode << ")");
+      return false;
+    }
+  return true;
+}
+
+void
+PhyEntity::CancelAllEvents (void)
+{
+  NS_LOG_FUNCTION (this);
+  for (auto & endPreambleDetectionEvent : m_endPreambleDetectionEvents)
+    {
+      endPreambleDetectionEvent.Cancel ();
+    }
+  m_endPreambleDetectionEvents.clear ();
+  for (auto & endRxPayloadEvent : m_endRxPayloadEvents)
+    {
+      endRxPayloadEvent.Cancel ();
+    }
+  m_endRxPayloadEvents.clear ();
+}
+
+bool
+PhyEntity::NoEndPreambleDetectionEvents (void) const
+{
+  return m_endPreambleDetectionEvents.empty ();
+}
+
+void
+PhyEntity::CancelRunningEndPreambleDetectionEvents (bool clear /* = false */)
+{
+  NS_LOG_FUNCTION (this << clear);
+  for (auto & endPreambleDetectionEvent : m_endPreambleDetectionEvents)
+    {
+      if (endPreambleDetectionEvent.IsRunning ())
+        {
+          endPreambleDetectionEvent.Cancel ();
+        }
+    }
+  if (clear)
+    {
+      m_endPreambleDetectionEvents.clear ();
+    }
+}
+
+void
+PhyEntity::AbortCurrentReception (WifiPhyRxfailureReason reason)
+{
+  NS_LOG_FUNCTION (this << reason);
+  DoAbortCurrentReception (reason);
+  m_wifiPhy->AbortCurrentReception (reason);
+}
+
+void
+PhyEntity::DoAbortCurrentReception (WifiPhyRxfailureReason reason)
+{
+  NS_LOG_FUNCTION (this << reason);
+  if (m_wifiPhy->m_currentEvent) //Otherwise abort has already been called just before
+    {
+      for (auto & endMpduEvent : m_endOfMpduEvents)
+        {
+          endMpduEvent.Cancel ();
+        }
+      m_endOfMpduEvents.clear ();
+    }
+}
+
+void
+PhyEntity::ResetReceive (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  DoResetReceive (event);
+  NS_ASSERT (m_endRxPayloadEvents.size () == 1 && m_endRxPayloadEvents.front ().IsExpired ());
+  m_endRxPayloadEvents.clear ();
+  m_wifiPhy->ResetReceive (event);
+}
+
+void
+PhyEntity::DoResetReceive (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  NS_ASSERT (event->GetEndTime () == Simulator::Now ());
+}
+
+double
+PhyEntity::GetRandomValue (void) const
+{
+  return m_wifiPhy->m_random->GetValue ();
+}
+
+double
+PhyEntity::GetRxPowerWForPpdu (Ptr<Event> event) const
+{
+  return event->GetRxPowerW (m_wifiPhy->GetPrimaryBand (GetMeasurementChannelWidth (event->GetPpdu ())));
+}
+
+Ptr<const Event>
+PhyEntity::GetCurrentEvent (void) const
+{
+  return m_wifiPhy->m_currentEvent;
+}
+
+uint16_t
+PhyEntity::GetMeasurementChannelWidth (const Ptr<const WifiPpdu> ppdu) const
+{
+  return GetRxChannelWidth (ppdu->GetTxVector ());
+}
+
+uint16_t
+PhyEntity::GetRxChannelWidth (const WifiTxVector& txVector) const
+{
+  return std::min (m_wifiPhy->GetChannelWidth (), txVector.GetChannelWidth ());
+}
+
+uint64_t
+PhyEntity::ObtainNextUid (const WifiTxVector& /* txVector */)
+{
+  NS_LOG_FUNCTION (this);
+  return m_globalPpduUid++;
+}
+
+uint16_t
+PhyEntity::GetCenterFrequencyForChannelWidth (const WifiTxVector& txVector) const
+{
+  NS_LOG_FUNCTION (this << txVector);
+
+  return m_wifiPhy->GetOperatingChannel ().GetPrimaryChannelCenterFrequency (txVector.GetChannelWidth ());
+}
+
+void
+PhyEntity::StartTx (Ptr<WifiPpdu> ppdu)
+{
+  NS_LOG_FUNCTION (this << ppdu);
+  Transmit (ppdu->GetTxDuration (), ppdu, "transmission");
+}
+
+void
+PhyEntity::Transmit (Time txDuration, Ptr<WifiPpdu> ppdu, std::string type)
+{
+  NS_LOG_FUNCTION (this << txDuration << ppdu << type);
+  double txPowerWatts = DbmToW (m_wifiPhy->GetTxPowerForTransmission (ppdu) + m_wifiPhy->GetTxGain ());
+  NS_LOG_DEBUG ("Start " << type << ": signal power before antenna gain=" << WToDbm (txPowerWatts) << "dBm");
+  Ptr<SpectrumValue> txPowerSpectrum = GetTxPowerSpectralDensity (txPowerWatts, ppdu);
+  Ptr<WifiSpectrumSignalParameters> txParams = Create<WifiSpectrumSignalParameters> ();
+  txParams->duration = txDuration;
+  txParams->psd = txPowerSpectrum;
+  txParams->ppdu = ppdu;
+  NS_LOG_DEBUG ("Starting " << type << " with power " << WToDbm (txPowerWatts) << " dBm on channel " << +m_wifiPhy->GetChannelNumber () << " for " << txParams->duration.As (Time::MS));
+  NS_LOG_DEBUG ("Starting " << type << " with integrated spectrum power " << WToDbm (Integral (*txPowerSpectrum)) << " dBm; spectrum model Uid: " << txPowerSpectrum->GetSpectrumModel ()->GetUid ());
+  auto spectrumWifiPhy = DynamicCast<SpectrumWifiPhy> (m_wifiPhy);
+  NS_ASSERT (spectrumWifiPhy);
+  spectrumWifiPhy->Transmit (txParams);
+}
+
+uint16_t
+PhyEntity::GetGuardBandwidth (uint16_t currentChannelWidth) const
+{
+  return m_wifiPhy->GetGuardBandwidth (currentChannelWidth);
+}
+
+std::tuple<double, double, double>
+PhyEntity::GetTxMaskRejectionParams (void) const
+{
+  return m_wifiPhy->GetTxMaskRejectionParams ();
+}
+
+Time
+PhyEntity::CalculateTxDuration (WifiConstPsduMap psduMap, const WifiTxVector& txVector, WifiPhyBand band) const
+{
+  NS_ASSERT (psduMap.size () == 1);
+  const auto & it = psduMap.begin ();
+  return WifiPhy::CalculateTxDuration (it->second->GetSize (), txVector, band, it->first);
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/phy-entity.h ns-3.34/src/wifi/model/phy-entity.h
--- ns-3.33/src/wifi/model/phy-entity.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/phy-entity.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,823 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy and spectrum-wifi-phy)
+ *          Mathieu Lacage <mathieu.lacage@sophia.inria.fr> (for logic ported from wifi-phy)
+ */
+
+#ifndef PHY_ENTITY_H
+#define PHY_ENTITY_H
+
+#include "wifi-mpdu-type.h"
+#include "wifi-tx-vector.h"
+#include "wifi-phy-band.h"
+#include "wifi-ppdu.h"
+#include "wifi-mpdu-type.h"
+#include "wifi-ppdu.h"
+#include "ns3/event-id.h"
+#include "ns3/simple-ref-count.h"
+#include "ns3/nstime.h"
+#include "ns3/wifi-spectrum-value-helper.h"
+#include <list>
+#include <map>
+#include <tuple>
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of:
+ * - ns3::PhyEntity class
+ * - ns3::SignalNoiseDbm, ns3::MpduInfo, and ns3::RxSignalInfo structs
+ * - ns3::RxPowerWattPerChannelBand typedef
+ */
+
+namespace ns3 {
+
+/// SignalNoiseDbm structure
+struct SignalNoiseDbm
+{
+  double signal; ///< signal strength in dBm
+  double noise;  ///< noise power in dBm
+};
+
+/// MpduInfo structure
+struct MpduInfo
+{
+  MpduType type;          ///< type of MPDU
+  uint32_t mpduRefNumber; ///< MPDU ref number
+};
+
+/// RxSignalInfo structure containing info on the received signal
+struct RxSignalInfo
+{
+  double snr;  ///< SNR in linear scale
+  double rssi; ///< RSSI in dBm
+};
+
+/**
+ * A map of the received power (Watts) for each band
+ */
+typedef std::map <WifiSpectrumBand, double> RxPowerWattPerChannelBand;
+
+class WifiPsdu;
+class WifiPhy;
+class InterferenceHelper;
+class Event;
+class WifiPhyStateHelper;
+class WifiPsdu;
+class WifiPpdu;
+
+/**
+ * \brief Abstract class for PHY entities
+ * \ingroup wifi
+ *
+ * This class enables to have a unique set of APIs
+ * to be used by each PHY entity, corresponding to
+ * the different amendments of the IEEE 802.11 standard.
+ */
+class PhyEntity : public SimpleRefCount<PhyEntity>
+{
+public:
+
+  /**
+   * Action to perform in case of RX failure.
+   */
+  enum PhyRxFailureAction
+  {
+    DROP = 0, //!< drop PPDU and set CCA_BUSY
+    ABORT,    //!< abort reception of PPDU
+    IGNORE    //!< ignore the reception
+  };
+
+  /**
+   * Status of the reception of the PPDU field.
+   */
+  struct PhyFieldRxStatus
+  {
+    /* *NS_CHECK_STYLE_OFF* */
+    bool isSuccess {true}; //!< outcome (\c true if success) of the reception
+    WifiPhyRxfailureReason reason {UNKNOWN}; //!< failure reason
+    PhyRxFailureAction actionIfFailure {DROP}; //!< action to perform in case of failure \see PhyRxFailureAction
+    /**
+     * Constructor setting outcome of reception.
+     *
+     * \param s \c true if success
+     */
+    PhyFieldRxStatus (bool s) : isSuccess (s) {};
+    /**
+     * Constructor.
+     *
+     * \param s \c true if success
+     * \param r reason of failure
+     * \param a action to perform in case of failure
+     */
+    PhyFieldRxStatus (bool s, WifiPhyRxfailureReason r, PhyRxFailureAction a) : isSuccess (s), reason (r), actionIfFailure (a) {};
+    /* *NS_CHECK_STYLE_ON* */
+  };
+
+  /**
+   * A struct for both SNR and PER
+   */
+  struct SnrPer
+  {
+    double snr {0.0}; ///< SNR in linear scale
+    double per {1.0}; ///< PER
+    /**
+     * Default constructor.
+     */
+    SnrPer () {};
+    /**
+     * Constructor for SnrPer.
+     *
+     * \param s the SNR in linear scale
+     * \param p the PER
+     */
+    SnrPer (double s, double p) : snr (s), per (p) {};
+  };
+
+  /**
+   * Destructor for PHY entity
+   */
+  virtual ~PhyEntity ();
+
+  /**
+   * Set the WifiPhy owning this PHY entity.
+   *
+   * \param wifiPhy the WifiPhy owning this PHY entity
+   */
+  void SetOwner (Ptr<WifiPhy> wifiPhy);
+
+  /**
+   * Check if the WifiMode is supported.
+   *
+   * \param mode the WifiMode to check
+   * \return true if the WifiMode is supported,
+   *         false otherwise
+   */
+  virtual bool IsModeSupported (WifiMode mode) const;
+  /**
+   * \return the number of WifiModes supported by this entity
+   */
+  virtual uint8_t GetNumModes (void) const;
+
+  /**
+   * Get the WifiMode corresponding to the given MCS index.
+   *
+   * \param index the index of the MCS
+   * \return the WifiMode corresponding to the MCS index
+   *
+   * This method should be used only for HtPhy and child classes.
+   */
+  virtual WifiMode GetMcs (uint8_t index) const;
+  /**
+   * Check if the WifiMode corresponding to the given MCS index is supported.
+   *
+   * \param index the index of the MCS
+   * \return true if the WifiMode corresponding to the MCS index is supported,
+   *         false otherwise
+   *
+   * Will return false for non-MCS modes.
+   */
+  virtual bool IsMcsSupported (uint8_t index) const;
+  /**
+   * Check if the WifiModes handled by this PHY are MCSs.
+   *
+   * \return true if the handled WifiModes are MCSs,
+   *         false if they are non-MCS modes
+   */
+  virtual bool HandlesMcsModes (void) const;
+
+  /**
+   * Get the WifiMode for the SIG field specified by the PPDU field.
+   *
+   * \param field the PPDU field
+   * \param txVector the transmission parameters
+   *
+   * \return the WifiMode used for the SIG field
+   */
+  virtual WifiMode GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const;
+
+  /**
+   * \brief Return a const iterator to the first WifiMode
+   *
+   * \return a const iterator to the first WifiMode.
+   */
+  std::list<WifiMode>::const_iterator begin (void) const;
+  /**
+   * \brief Return a const iterator to past-the-last WifiMode
+   *
+   * \return a const iterator to past-the-last WifiMode.
+   */
+  std::list<WifiMode>::const_iterator end (void) const;
+
+  /**
+   * Return the field following the provided one.
+   *
+   * \param currentField the considered PPDU field
+   * \param preamble the preamble indicating the PPDU format
+   * \return the PPDU field following the reference one
+   */
+  WifiPpduField GetNextField (WifiPpduField currentField, WifiPreamble preamble) const;
+
+  /**
+   * Get the duration of the PPDU field (or group of fields)
+   * used by this entity for the given transmission parameters.
+   *
+   * \param field the PPDU field (or group of fields)
+   * \param txVector the transmission parameters
+   *
+   * \return the duration of the PPDU field
+   */
+  virtual Time GetDuration (WifiPpduField field, const WifiTxVector& txVector) const;
+  /**
+   * \param txVector the transmission parameters
+   *
+   * \return the total duration of the PHY preamble and PHY header.
+   */
+  Time CalculatePhyPreambleAndHeaderDuration (const WifiTxVector& txVector) const;
+
+  /**
+   * \param size the number of bytes in the packet to send
+   * \param txVector the TXVECTOR used for the transmission of this packet
+   * \param band the frequency band
+   * \param mpdutype the type of the MPDU as defined in WifiPhy::MpduType.
+   * \param incFlag this flag is used to indicate that the variables need to be update or not
+   * This function is called a couple of times for the same packet so variables should not be increased each time.
+   * \param totalAmpduSize the total size of the previously transmitted MPDUs for the concerned A-MPDU.
+   * If incFlag is set, this parameter will be updated.
+   * \param totalAmpduNumSymbols the number of symbols previously transmitted for the MPDUs in the concerned A-MPDU,
+   * used for the computation of the number of symbols needed for the last MPDU.
+   * If incFlag is set, this parameter will be updated.
+   * \param staId the STA-ID of the PSDU (only used for MU PPDUs)
+   *
+   * \return the duration of the PSDU
+   */
+  virtual Time GetPayloadDuration (uint32_t size, const WifiTxVector& txVector, WifiPhyBand band, MpduType mpdutype,
+                                   bool incFlag, uint32_t &totalAmpduSize, double &totalAmpduNumSymbols,
+                                   uint16_t staId) const = 0;
+
+  /**
+   * Get a WifiConstPsduMap from a PSDU and the TXVECTOR to use to send the PSDU.
+   * The STA-ID value is properly determined based on whether the given PSDU has
+   * to be transmitted as a DL or UL frame.
+   *
+   * \param psdu the given PSDU
+   * \param txVector the TXVECTOR to use to send the PSDU
+   * \return a WifiConstPsduMap built from the given PSDU and the given TXVECTOR
+   */
+  virtual WifiConstPsduMap GetWifiConstPsduMap (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) const;
+
+  /**
+   * Get the maximum PSDU size in bytes.
+   *
+   * \return the maximum PSDU size in bytes
+   */
+  virtual uint32_t GetMaxPsduSize (void) const = 0;
+
+  /**
+   * A pair containing information on the PHY header chunk, namely
+   * the start and stop times of the chunk and the WifiMode used.
+   */
+  typedef std::pair<std::pair<Time /* start */, Time /* stop */>, WifiMode> PhyHeaderChunkInfo;
+  /**
+   * A map of PhyHeaderChunkInfo elements per PPDU field.
+   * \see PhyHeaderChunkInfo
+   */
+  typedef std::map<WifiPpduField, PhyHeaderChunkInfo> PhyHeaderSections;
+  /**
+   * Return a map of PHY header chunk information per PPDU field.
+   * This map will contain the PPDU fields that are actually present based
+   * on the \p txVector information.
+   *
+   * \param txVector the transmission parameters
+   * \param ppduStart the time at which the PPDU started
+   * \return the list of preamble sections
+   *
+   * \see PhyHeaderSections
+   */
+  PhyHeaderSections GetPhyHeaderSections (const WifiTxVector& txVector, Time ppduStart) const;
+
+  /**
+   * Build amendment-specific PPDU.
+   *
+   * \param psdus the PHY payloads (PSDUs)
+   * \param txVector the TXVECTOR that was used for the PPDU
+   * \param ppduDuration the transmission duration of the PPDU
+   *
+   * \return the amendment-specific WifiPpdu
+   */
+  virtual Ptr<WifiPpdu> BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration);
+
+  /**
+   * Get the duration of the PPDU up to (but excluding) the given field.
+   *
+   * \param field the considered PPDU field
+   * \param txVector the transmission parameters
+   * \return the duration from the beginning of the PPDU up to the field
+   */
+  Time GetDurationUpToField (WifiPpduField field, const WifiTxVector& txVector) const;
+  /**
+   * Get the remaining duration of the PPDU after the end of the given field.
+   *
+   * \param field the considered PPDU field
+   * \param ppdu the received PPDU
+   * \return the remaining duration of the PPDU after the end of to the field
+   */
+  Time GetRemainingDurationAfterField (Ptr<const WifiPpdu> ppdu, WifiPpduField field) const;
+
+  /**
+   * Get the PSDU addressed to that PHY in a PPDU (useful for MU PPDU).
+   *
+   * \param ppdu the PPDU to extract the PSDU from
+   * \return the PSDU addressed to that PHY
+   */
+  virtual Ptr<const WifiPsdu> GetAddressedPsduInPpdu (Ptr<const WifiPpdu> ppdu) const;
+
+  /**
+   * Start receiving the PHY preamble of a PPDU (i.e. the first bit of the preamble has arrived).
+   *
+   * This method triggers the start of the preamble detection period (\see
+   * StartPreambleDetectionPeriod) if the PHY can process the PPDU.
+   *
+   * \param ppdu the arriving PPDU
+   * \param rxPowersW the receive power in W per band
+   * \param rxDuration the duration of the PPDU
+   */
+  virtual void StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW,
+                                     Time rxDuration);
+  /**
+   * Start receiving a given field.
+   *
+   * This method will call the DoStartReceiveField.
+   * EndReceiveField is also scheduled after the duration of the field
+   * (except for the special case of preambles \see DoStartReceivePreamble).
+   * The PHY is kept in CCA busy during the reception of the field (except for
+   * data field which should be in RX).
+   *
+   * \param field the starting PPDU field
+   * \param event the event holding incoming PPDU's information
+   */
+  void StartReceiveField (WifiPpduField field, Ptr<Event> event);
+  /**
+   * End receiving a given field.
+   *
+   * This method will call the DoEndReceiveField  to obtain the outcome of the reception.
+   * In case of success, reception of the next field is triggered.
+   * In case of failure, the indications in the returned \see PhyFieldRxStatus
+   * are performed.
+   *
+   * \param field the ending PPDU field
+   * \param event the event holding incoming PPDU's information
+   */
+  void EndReceiveField (WifiPpduField field, Ptr<Event> event);
+
+  /**
+   * The last symbol of the PPDU has arrived.
+   *
+   * \param event the event holding incoming PPDU's information
+   */
+  void EndReceivePayload (Ptr<Event> event);
+
+  /**
+   * Reset PHY at the end of the PPDU under reception after it has failed the PHY header.
+   *
+   * \param event the event holding incoming PPDU's information
+   */
+  void ResetReceive (Ptr<Event> event);
+
+  /**
+   * Cancel and clear all running events.
+   */
+  virtual void CancelAllEvents (void);
+  /**
+   * \return \c true if there is no end preamble detection event running, \c false otherwise
+   */
+  bool NoEndPreambleDetectionEvents (void) const;
+  /**
+   * Cancel and eventually clear all end preamble detection events.
+   *
+   * \param clear whether to clear the end preamble detection events' list
+   */
+  void CancelRunningEndPreambleDetectionEvents (bool clear = false);
+
+  /**
+   * Return the STA ID that has been assigned to the station this PHY belongs to.
+   * This is typically called for MU PPDUs, in order to pick the correct PSDU.
+   *
+   * \param ppdu the PPDU for which the STA ID is requested
+   * \return the STA ID
+   */
+  virtual uint16_t GetStaId (const Ptr<const WifiPpdu> ppdu) const;
+
+  /**
+   * Return the channel width used to measure the RSSI.
+   *
+   * \param ppdu the PPDU that is being received
+   * \return the channel width (in MHz) used for RSSI measurement
+   */
+  virtual uint16_t GetMeasurementChannelWidth (const Ptr<const WifiPpdu> ppdu) const;
+
+  /**
+   * Return the channel width used in the reception spectrum model.
+   *
+   * \param txVector the TXVECTOR of the PPDU that is being received
+   * \return the channel width (in MHz) used for RxSpectrumModel
+   */
+  virtual uint16_t GetRxChannelWidth (const WifiTxVector& txVector) const;
+
+  /**
+   * This function is called by SpectrumWifiPhy to send
+   * the PPDU while performing amendment-specific actions.
+   * \see SpectrumWifiPhy::StartTx
+   *
+   * \param ppdu the PPDU to send
+   */
+  virtual void StartTx (Ptr<WifiPpdu> ppdu);
+
+  /**
+   * This function prepares most of the WifiSpectrumSignalParameters
+   * parameters and invokes SpectrumWifiPhy's Transmit method.
+   * \see SpectrumWifiPhy::Transmit
+   *
+   * \param txDuration the duration of the transmission
+   * \param ppdu the PPDU to send
+   * \param type the type of transmission (for logging)
+   */
+  void Transmit (Time txDuration, Ptr<WifiPpdu> ppdu, std::string type);
+
+  /**
+   * \param psduMap the PSDU(s) to transmit indexed by STA-ID
+   * \param txVector the TXVECTOR used for the transmission of the PPDU
+   * \param band the frequency band being used
+   *
+   * \return the total amount of time this PHY will stay busy for the transmission of the PPDU
+   */
+  virtual Time CalculateTxDuration (WifiConstPsduMap psduMap, const WifiTxVector& txVector, WifiPhyBand band) const;
+
+protected:
+  /**
+   * A map of PPDU field elements per preamble type.
+   * This corresponds to the different PPDU formats introduced by each amendment.
+   */
+  typedef std::map<WifiPreamble, std::vector<WifiPpduField> > PpduFormats;
+
+  /**
+   * A pair to hold modulation information: code rate and constellation size.
+   */
+  typedef std::pair<WifiCodeRate, uint16_t> CodeRateConstellationSizePair;
+
+  /**
+   * A modulation lookup table using unique name of modulation as key.
+   */
+  typedef std::map<std::string, CodeRateConstellationSizePair> ModulationLookupTable;
+
+  /**
+   * Return the PPDU formats of the PHY.
+   *
+   * \return the PPDU formats of the PHY
+   */
+  virtual const PpduFormats & GetPpduFormats (void) const = 0;
+
+  /**
+   * Start receiving a given field, perform amendment-specific actions, and
+   * signify if it is supported.
+   *
+   * \param field the starting PPDU field
+   * \param event the event holding incoming PPDU's information
+   * \return \c true if the field is supported, \c false otherwise
+   */
+  virtual bool DoStartReceiveField (WifiPpduField field, Ptr<Event> event);
+  /**
+   * End receiving a given field, perform amendment-specific actions, and
+   * provide the status of the reception.
+   *
+   * \param field the ending PPDU field
+   * \param event the event holding incoming PPDU's information
+   * \return status of the reception of the PPDU field
+   */
+  virtual PhyFieldRxStatus DoEndReceiveField (WifiPpduField field, Ptr<Event> event);
+
+  /**
+   * Get the event corresponding to the incoming PPDU.
+   *
+   * We store all incoming preamble events, perform amendment-specific actions,
+   * and a decision is made at the end of the preamble detection window.
+   *
+   * \param ppdu the incoming PPDU
+   * \param rxPowersW the receive power in W per band
+   * \return the event holding the incoming PPDU's information
+   */
+  virtual Ptr<Event> DoGetEvent (Ptr<const WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW);
+  /**
+   * End receiving the preamble, perform amendment-specific actions, and
+   * provide the status of the reception.
+   *
+   * \param event the event holding incoming PPDU's information
+   * \return status of the reception of the preamble
+   */
+  virtual PhyFieldRxStatus DoEndReceivePreamble (Ptr<Event> event);
+  /**
+   * Start the preamble detection period.
+   *
+   * \param event the event holding incoming PPDU's information
+   */
+  void StartPreambleDetectionPeriod (Ptr<Event> event);
+  /**
+   * End the preamble detection period.
+   *
+   * The PHY will focus on the strongest PPDU and drop others.
+   * In addition, in case of successful detection, the end of the
+   * preamble reception is triggered (\see DoEndReceivePreamble).
+   *
+   * \param event the event holding incoming PPDU's information
+   */
+  void EndPreambleDetectionPeriod (Ptr<Event> event);
+
+  /**
+   * Start receiving the PSDU (i.e. the first symbol of the PSDU has arrived).
+   *
+   * \param event the event holding incoming PPDU's information
+   */
+  void StartReceivePayload (Ptr<Event> event);
+
+  /**
+   * Start receiving the PSDU (i.e. the first symbol of the PSDU has arrived)
+   * and perform amendment-specific actions.
+   *
+   * \param event the event holding incoming PPDU's information
+   */
+  virtual void DoStartReceivePayload (Ptr<Event> event);
+
+  /**
+   * Perform amendment-specific actions before resetting PHY at
+   * the end of the PPDU under reception after it has failed the PHY header.
+   *
+   * \param event the event holding incoming PPDU's information
+   */
+  virtual void DoResetReceive (Ptr<Event> event);
+
+  /**
+   * Perform amendment-specific actions before aborting the
+   * current reception.
+   *
+   * \param reason the reason the reception is aborted
+   */
+  virtual void DoAbortCurrentReception (WifiPhyRxfailureReason reason);
+
+  /**
+   * Checks if the signaled configuration (excluding bandwidth)
+   * is supported by the PHY.
+   *
+   * \param ppdu the received PPDU
+   * \return \c true if supported, \c false otherwise
+   */
+  virtual bool IsConfigSupported (Ptr<const WifiPpdu> ppdu) const;
+
+  /**
+   * Drop the PPDU and the corresponding preamble detection event, but keep CCA busy
+   * state after the completion of the currently processed event.
+   *
+   * \param ppdu the incoming PPDU
+   * \param reason the reason the PPDU is dropped
+   * \param endRx the end of the incoming PPDU's reception
+   * \param measurementChannelWidth the measurement width (in MHz) to consider for the PPDU
+   */
+  void DropPreambleEvent (Ptr<const WifiPpdu> ppdu, WifiPhyRxfailureReason reason, Time endRx, uint16_t measurementChannelWidth);
+
+  /**
+   * Erase the event corresponding to the PPDU from the list of preamble events,
+   * but consider it as noise after the completion of the current event.
+   *
+   * \param ppdu the incoming PPDU
+   * \param rxDuration the duration of the PPDU
+   */
+  void ErasePreambleEvent (Ptr<const WifiPpdu> ppdu, Time rxDuration);
+
+  /**
+   * Get the reception status for the provided MPDU and notify.
+   *
+   * \param psdu the arriving MPDU formatted as a PSDU
+   * \param event the event holding incoming PPDU's information
+   * \param staId the station ID of the PSDU (only used for MU)
+   * \param relativeMpduStart the relative start time of the MPDU within the A-MPDU. 0 for normal MPDUs
+   * \param mpduDuration the duration of the MPDU
+   *
+   * \return information on MPDU reception: status, signal power (dBm), and noise power (in dBm)
+   */
+  std::pair<bool, SignalNoiseDbm> GetReceptionStatus (Ptr<const WifiPsdu> psdu,
+                                                      Ptr<Event> event, uint16_t staId,
+                                                      Time relativeMpduStart,
+                                                      Time mpduDuration);
+  /**
+   * The last symbol of an MPDU in an A-MPDU has arrived.
+   *
+   * \param event the event holding incoming PPDU's information
+   * \param psdu the arriving MPDU formatted as a PSDU containing a normal MPDU
+   * \param mpduIndex the index of the MPDU within the A-MPDU
+   * \param relativeStart the relative start time of the MPDU within the A-MPDU.
+   * \param mpduDuration the duration of the MPDU
+   */
+  void EndOfMpdu (Ptr<Event> event, Ptr<const WifiPsdu> psdu, size_t mpduIndex, Time relativeStart, Time mpduDuration);
+
+  /**
+   * Schedule end of MPDUs events.
+   *
+   * \param event the event holding incoming PPDU's information
+   */
+  void ScheduleEndOfMpdus (Ptr<Event> event);
+
+  /**
+   * Perform amendment-specific actions at the end of the reception of
+   * the payload.
+   *
+   * \param ppdu the incoming PPDU
+   */
+  virtual void DoEndReceivePayload (Ptr<const WifiPpdu> ppdu);
+
+  /**
+   * Get the channel width and band to use (will be overloaded by child classes).
+   *
+   * \param txVector the transmission parameters
+   * \param staId the station ID of the PSDU
+   * \return a pair of channel width (MHz) and band
+   */
+  virtual std::pair<uint16_t, WifiSpectrumBand> GetChannelWidthAndBand (const WifiTxVector& txVector, uint16_t staId) const;
+
+  /**
+   * Abort the current reception.
+   *
+   * \param reason the reason the reception is aborted
+   */
+  void AbortCurrentReception (WifiPhyRxfailureReason reason);
+
+  /**
+   * Obtain a random value from the WifiPhy's generator.
+   * Wrapper used by child classes.
+   *
+   * \return a uniform random value
+   */
+  double GetRandomValue (void) const;
+  /**
+   * Obtain the SNR and PER of the PPDU field from the WifiPhy's InterferenceHelper class.
+   * Wrapper used by child classes.
+   *
+   * \param field the PPDU field
+   * \param event the event holding incoming PPDU's information
+   * \return the SNR and PER
+   */
+  SnrPer GetPhyHeaderSnrPer (WifiPpduField field, Ptr<Event> event) const;
+  /**
+   * Obtain the received power (W) for a given band.
+   * Wrapper used by child classes.
+   *
+   * \param event the event holding incoming PPDU's information
+   * \return the received power (W) for the event over a given band
+   */
+  double GetRxPowerWForPpdu (Ptr<Event> event) const;
+  /**
+   * Get the pointer to the current event (stored in WifiPhy).
+   * Wrapper used by child classes.
+   *
+   * \return the pointer to the current event
+   */
+  Ptr<const Event> GetCurrentEvent (void) const;
+  /**
+   * Get the map of current preamble events (stored in WifiPhy).
+   * Wrapper used by child classes.
+   *
+   * \return the reference to the map of current preamble events
+   */
+  const std::map <std::pair<uint64_t, WifiPreamble>, Ptr<Event> > & GetCurrentPreambleEvents (void) const;
+  /**
+   * Add an entry to the map of current preamble events (stored in WifiPhy).
+   * Wrapper used by child classes.
+   *
+   * \param event the event holding incoming PPDU's information
+   */
+  void AddPreambleEvent (Ptr<Event> event);
+
+  /**
+   * Create an event using WifiPhy's InterferenceHelper class.
+   * Wrapper used by child classes.
+   *
+   * \copydoc InterferenceHelper::Add
+   */
+  Ptr<Event> CreateInterferenceEvent (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing = false);
+  /**
+   * Update an event in WifiPhy's InterferenceHelper class.
+   * Wrapper used by child classes.
+   *
+   * \copydoc InterferenceHelper::UpdateEvent
+   */
+  void UpdateInterferenceEvent (Ptr<Event> event, RxPowerWattPerChannelBand rxPower);
+  /**
+   * Notify WifiPhy's InterferenceHelper of the end of the reception,
+   * clear maps and end of MPDU event, and eventually reset WifiPhy.
+   *
+   * \param reset whether to reset WifiPhy
+   */
+  void NotifyInterferenceRxEndAndClear (bool reset);
+
+  /**
+   * Obtain the next UID for the PPDU to transmit.
+   * Note that the global UID counter could be incremented.
+   *
+   * \param txVector the transmission parameters
+   * \return the UID to use for the PPDU to transmit
+   */
+  virtual uint64_t ObtainNextUid (const WifiTxVector& txVector);
+
+  /**
+   * \param txPowerW power in W to spread across the bands
+   * \param ppdu the PPDU that will be transmitted
+   * \return Pointer to SpectrumValue
+   *
+   * This is a helper function to create the right TX PSD corresponding
+   * to the amendment of this PHY.
+   */
+  virtual Ptr<SpectrumValue> GetTxPowerSpectralDensity (double txPowerW, Ptr<const WifiPpdu> ppdu) const = 0;
+
+  /**
+   * Get the center frequency of the channel corresponding the current TxVector rather than
+   * that of the supported channel width.
+   * Consider that this "primary channel" is on the lower part for the time being.
+   *
+   * \param txVector the TXVECTOR that has the channel width that is to be used
+   * \return the center frequency in MHz corresponding to the channel width to be used
+   */
+  uint16_t GetCenterFrequencyForChannelWidth (const WifiTxVector& txVector) const;
+
+  /**
+   * \param currentChannelWidth channel width of the current transmission (MHz)
+   * \return the width of the guard band (MHz)
+   *
+   * Wrapper method used by child classes for PSD generation.
+   * Note that this method is necessary for testing UL OFDMA.
+   */
+  uint16_t GetGuardBandwidth (uint16_t currentChannelWidth) const;
+  /**
+   * \return a tuple containing the minimum rejection (in dBr) for the inner band,
+   *                            the minimum rejection (in dBr) for the outer band, and
+   *                            the maximum rejection (in dBr) for the outer band
+   *                            for the transmit spectrum mask.
+   *
+   * Wrapper method used by child classes for PSD generation.
+   */
+  std::tuple<double, double, double> GetTxMaskRejectionParams (void) const;
+
+  Ptr<WifiPhy> m_wifiPhy;          //!< Pointer to the owning WifiPhy
+  Ptr<WifiPhyStateHelper> m_state; //!< Pointer to WifiPhyStateHelper of the WifiPhy (to make it reachable for child classes)
+
+  std::list<WifiMode> m_modeList;  //!< the list of supported modes
+
+  std::vector <EventId> m_endPreambleDetectionEvents; //!< the end of preamble detection events
+  std::vector <EventId> m_endOfMpduEvents; //!< the end of MPDU events (only used for A-MPDUs)
+
+  std::vector <EventId> m_endRxPayloadEvents; //!< the end of receive events (only one unless UL MU reception)
+
+  /**
+   * A pair of a UID and STA_ID
+   */
+  typedef std::pair <uint64_t /* UID */, uint16_t /* STA-ID */> UidStaIdPair;
+
+  std::map<UidStaIdPair, std::vector<bool> > m_statusPerMpduMap; //!< Map of the current reception status per MPDU that is filled in as long as MPDUs are being processed by the PHY in case of an A-MPDU
+  std::map<UidStaIdPair, SignalNoiseDbm> m_signalNoiseMap; //!< Map of the latest signal power and noise power in dBm (noise power includes the noise figure)
+
+  static uint64_t m_globalPpduUid; //!< Global counter of the PPDU UID
+}; //class PhyEntity
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the stream
+ * \param action the action to perform in case of failure
+ * \returns a reference to the stream
+ */
+std::ostream& operator<< (std::ostream& os, const PhyEntity::PhyRxFailureAction &action);
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the stream
+ * \param status the status of the reception of a PPDU field
+ * \returns a reference to the stream
+ */
+std::ostream& operator<< (std::ostream& os, const PhyEntity::PhyFieldRxStatus &status);
+
+} //namespace ns3
+
+#endif /* PHY_ENTITY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/qos-frame-exchange-manager.cc ns-3.34/src/wifi/model/qos-frame-exchange-manager.cc
--- ns-3.33/src/wifi/model/qos-frame-exchange-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/qos-frame-exchange-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,697 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "ns3/abort.h"
+#include "qos-frame-exchange-manager.h"
+#include "wifi-mac-queue.h"
+#include "wifi-mac-trailer.h"
+#include "ap-wifi-mac.h"
+
+#undef NS_LOG_APPEND_CONTEXT
+#define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] "
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("QosFrameExchangeManager");
+
+NS_OBJECT_ENSURE_REGISTERED (QosFrameExchangeManager);
+
+TypeId
+QosFrameExchangeManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::QosFrameExchangeManager")
+    .SetParent<FrameExchangeManager> ()
+    .AddConstructor<QosFrameExchangeManager> ()
+    .SetGroupName ("Wifi")
+    .AddAttribute ("PifsRecovery",
+                   "Perform a PIFS recovery as a response to transmission failure "
+                   "within a TXOP",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&QosFrameExchangeManager::m_pifsRecovery),
+                   MakeBooleanChecker ())
+  ;
+  return tid;
+}
+
+QosFrameExchangeManager::QosFrameExchangeManager ()
+  : m_initialFrame (false)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+QosFrameExchangeManager::~QosFrameExchangeManager ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+void
+QosFrameExchangeManager::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_edca = 0;
+  m_edcaBackingOff = 0;
+  m_pifsRecoveryEvent.Cancel ();
+  FrameExchangeManager::DoDispose ();
+}
+
+bool
+QosFrameExchangeManager::SendCfEndIfNeeded (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_edca != 0);
+  NS_ASSERT (m_edca->GetTxopLimit ().IsStrictlyPositive ());
+
+  WifiMacHeader cfEnd;
+  cfEnd.SetType (WIFI_MAC_CTL_END);
+  cfEnd.SetDsNotFrom ();
+  cfEnd.SetDsNotTo ();
+  cfEnd.SetNoRetry ();
+  cfEnd.SetNoMoreFragments ();
+  cfEnd.SetDuration (Seconds (0));
+  cfEnd.SetAddr1 (Mac48Address::GetBroadcast ());
+  cfEnd.SetAddr2 (m_self);
+
+  WifiTxVector cfEndTxVector = m_mac->GetWifiRemoteStationManager ()->GetRtsTxVector (cfEnd.GetAddr1 ());
+
+  Time txDuration = m_phy->CalculateTxDuration (cfEnd.GetSize () + WIFI_MAC_FCS_LENGTH,
+                                                cfEndTxVector, m_phy->GetPhyBand ());
+
+  // Send the CF-End frame if the remaining duration is long enough to transmit this frame
+  if (m_edca->GetRemainingTxop () > txDuration)
+    {
+      NS_LOG_DEBUG ("Send CF-End frame");
+      m_phy->Send (Create<WifiPsdu> (Create<Packet> (), cfEnd), cfEndTxVector);
+      Simulator::Schedule (txDuration, &Txop::NotifyChannelReleased, m_edca);
+      return true;
+    }
+
+  m_edca->NotifyChannelReleased ();
+  m_edca = 0;
+  return false;
+}
+
+void
+QosFrameExchangeManager::PifsRecovery (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_edca != 0);
+  NS_ASSERT (m_edca->IsTxopStarted ());
+
+  // Release the channel if it has not been idle for the last PIFS interval
+  if (m_channelAccessManager->GetAccessGrantStart () - m_phy->GetSifs ()
+      > Simulator::Now () - m_phy->GetPifs ())
+    {
+      m_edca->NotifyChannelReleased ();
+      m_edca = 0;
+    }
+  else
+    {
+      // the txopDuration parameter is unused because we are not starting a new TXOP
+      StartTransmission (m_edca, Seconds (0));
+    }
+}
+
+void
+QosFrameExchangeManager::CancelPifsRecovery (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_pifsRecoveryEvent.IsRunning ());
+  NS_ASSERT (m_edca != 0);
+
+  NS_LOG_DEBUG ("Cancel PIFS recovery being attempted by EDCAF " << m_edca);
+  m_pifsRecoveryEvent.Cancel ();
+  m_edca->NotifyChannelReleased ();
+}
+
+bool
+QosFrameExchangeManager::StartTransmission (Ptr<Txop> edca)
+{
+  NS_LOG_FUNCTION (this << edca);
+
+  if (m_pifsRecoveryEvent.IsRunning ())
+    {
+      // Another AC (having AIFS=1 or lower, if the user changed the default settings)
+      // gained channel access while performing PIFS recovery. Abort PIFS recovery
+      CancelPifsRecovery ();
+    }
+
+  // TODO This will become an assert once no Txop is installed on a QoS station
+  if (!edca->IsQosTxop ())
+    {
+      m_edca = 0;
+      return FrameExchangeManager::StartTransmission (edca);
+    }
+
+  Ptr<QosTxop> qosTxop = StaticCast<QosTxop> (edca);
+  return StartTransmission (qosTxop, qosTxop->GetTxopLimit ());
+}
+
+bool
+QosFrameExchangeManager::StartTransmission (Ptr<QosTxop> edca, Time txopDuration)
+{
+  NS_LOG_FUNCTION (this << edca << txopDuration);
+
+  if (m_pifsRecoveryEvent.IsRunning ())
+    {
+      // Another AC (having AIFS=1 or lower, if the user changed the default settings)
+      // gained channel access while performing PIFS recovery. Abort PIFS recovery
+      CancelPifsRecovery ();
+    }
+
+  if (m_txTimer.IsRunning ())
+    {
+      m_txTimer.Cancel ();
+    }
+  m_dcf = edca;
+  m_edca = edca;
+
+  // We check if this EDCAF invoked the backoff procedure (without terminating
+  // the TXOP) because the transmission of a non-initial frame of a TXOP failed
+  bool backingOff = (m_edcaBackingOff == m_edca);
+
+  if (backingOff)
+    {
+      NS_ASSERT (m_edca->GetTxopLimit ().IsStrictlyPositive ());
+      NS_ASSERT (m_edca->IsTxopStarted ());
+      NS_ASSERT (!m_pifsRecovery);
+      NS_ASSERT (!m_initialFrame);
+
+      // clear the member variable
+      m_edcaBackingOff = 0;
+    }
+
+  if (m_edca->GetTxopLimit ().IsStrictlyPositive ())
+    {
+      // TXOP limit is not null. We have to check if this EDCAF is starting a
+      // new TXOP. This includes the case when the transmission of a non-initial
+      // frame of a TXOP failed and backoff was invoked without terminating the
+      // TXOP. In such a case, we assume that a new TXOP is being started if it
+      // elapsed more than TXOPlimit since the start of the paused TXOP. Note
+      // that GetRemainingTxop returns 0 iff Now - TXOPstart >= TXOPlimit
+      if (!m_edca->IsTxopStarted ()
+          || (backingOff && m_edca->GetRemainingTxop ().IsZero ()))
+        {
+          // starting a new TXOP
+          m_edca->NotifyChannelAccessed (txopDuration);
+
+          if (StartFrameExchange (m_edca, txopDuration, true))
+            {
+              m_initialFrame = true;
+              return true;
+            }
+
+          // TXOP not even started, return false
+          NS_LOG_DEBUG ("No frame transmitted");
+          m_edca->NotifyChannelReleased ();
+          m_edca = 0;
+          return false;
+        }
+
+      // We are continuing a TXOP, check if we can transmit another frame
+      NS_ASSERT (!m_initialFrame);
+
+      if (!StartFrameExchange (m_edca, m_edca->GetRemainingTxop (), false))
+        {
+          NS_LOG_DEBUG ("Not enough remaining TXOP time");
+          return SendCfEndIfNeeded ();
+        }
+
+      return true;
+    }
+
+  // we get here if TXOP limit is null
+  m_initialFrame = true;
+
+  if (StartFrameExchange (m_edca, Time::Min (), true))
+    {
+      m_edca->NotifyChannelAccessed (Seconds (0));
+      return true;
+    }
+
+  NS_LOG_DEBUG ("No frame transmitted");
+  m_edca->NotifyChannelReleased ();
+  m_edca = 0;
+  return false;
+}
+
+bool
+QosFrameExchangeManager::StartFrameExchange (Ptr<QosTxop> edca, Time availableTime, bool initialFrame)
+{
+  NS_LOG_FUNCTION (this << edca << availableTime << initialFrame);
+
+  Ptr<const WifiMacQueueItem> mpdu = edca->PeekNextMpdu ();
+
+  // Even though channel access is requested when the queue is not empty, at
+  // the time channel access is granted the lifetime of the packet might be
+  // expired and the queue might be empty.
+  if (mpdu == 0)
+    {
+      NS_LOG_DEBUG ("Queue empty");
+      return false;
+    }
+
+  WifiTxParameters txParams;
+  txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (mpdu->GetHeader ());
+
+  WifiMacQueueItem::QueueIteratorPair queueIt;
+  Ptr<WifiMacQueueItem> item = edca->GetNextMpdu (mpdu, txParams, availableTime, initialFrame, queueIt);
+
+  if (item == nullptr)
+    {
+      NS_LOG_DEBUG ("Not enough time to transmit a frame");
+      return false;
+    }
+
+  NS_ASSERT_MSG (!item->GetHeader ().IsQosData () || !item->GetHeader ().IsQosAmsdu (),
+                 "We should not get an A-MSDU here");
+
+  // check if the MSDU needs to be fragmented
+  item = GetFirstFragmentIfNeeded (item);
+
+  // update the protection method if the frame was fragmented
+  if (item->IsFragment () && item->GetSize () != mpdu->GetSize ())
+    {
+      WifiTxParameters fragmentTxParams;
+      fragmentTxParams.m_txVector = txParams.m_txVector;
+      txParams.m_protection = GetProtectionManager ()->TryAddMpdu (item, fragmentTxParams);
+      NS_ASSERT (txParams.m_protection != nullptr);
+    }
+
+  SendMpduWithProtection (item, txParams);
+
+  return true;
+}
+
+bool
+QosFrameExchangeManager::TryAddMpdu (Ptr<const WifiMacQueueItem> mpdu, WifiTxParameters& txParams,
+                                     Time availableTime) const
+{
+  NS_ASSERT (mpdu != 0);
+  NS_LOG_FUNCTION (this << *mpdu << &txParams << availableTime);
+
+  // check if adding the given MPDU requires a different protection method
+  Time protectionTime = Time::Min ();  // uninitialized
+  if (txParams.m_protection)
+    {
+      protectionTime = txParams.m_protection->protectionTime;
+    }
+
+  std::unique_ptr<WifiProtection> protection;
+  protection = GetProtectionManager ()->TryAddMpdu (mpdu, txParams);
+  bool protectionSwapped = false;
+
+  if (protection)
+    {
+      // the protection method has changed, calculate the new protection time
+      CalculateProtectionTime (protection.get ());
+      protectionTime = protection->protectionTime;
+      // swap unique pointers, so that the txParams that is passed to the next
+      // call to IsWithinLimitsIfAddMpdu is the most updated one
+      txParams.m_protection.swap (protection);
+      protectionSwapped = true;
+    }
+  NS_ASSERT (protectionTime != Time::Min ());
+  NS_LOG_DEBUG ("protection time=" << protectionTime);
+
+  // check if adding the given MPDU requires a different acknowledgment method
+  Time acknowledgmentTime = Time::Min ();  // uninitialized
+  if (txParams.m_acknowledgment)
+    {
+      acknowledgmentTime = txParams.m_acknowledgment->acknowledgmentTime;
+    }
+
+  std::unique_ptr<WifiAcknowledgment> acknowledgment;
+  acknowledgment = GetAckManager ()->TryAddMpdu (mpdu, txParams);
+  bool acknowledgmentSwapped = false;
+
+  if (acknowledgment)
+    {
+      // the acknowledgment method has changed, calculate the new acknowledgment time
+      CalculateAcknowledgmentTime (acknowledgment.get ());
+      acknowledgmentTime = acknowledgment->acknowledgmentTime;
+      // swap unique pointers, so that the txParams that is passed to the next
+      // call to IsWithinLimitsIfAddMpdu is the most updated one
+      txParams.m_acknowledgment.swap (acknowledgment);
+      acknowledgmentSwapped = true;
+    }
+  NS_ASSERT (acknowledgmentTime != Time::Min ());
+  NS_LOG_DEBUG ("acknowledgment time=" << acknowledgmentTime);
+
+  Time ppduDurationLimit = Time::Min ();
+  if (availableTime != Time::Min ())
+    {
+      ppduDurationLimit = availableTime - protectionTime - acknowledgmentTime;
+    }
+
+  if (!IsWithinLimitsIfAddMpdu (mpdu, txParams, ppduDurationLimit))
+    {
+      // adding MPDU failed, restore protection and acknowledgment methods
+      // if they were swapped
+      if (protectionSwapped)
+        {
+          txParams.m_protection.swap (protection);
+        }
+      if (acknowledgmentSwapped)
+        {
+          txParams.m_acknowledgment.swap (acknowledgment);
+        }
+      return false;
+    }
+
+  // the given MPDU can be added, hence update the txParams
+  txParams.AddMpdu (mpdu);
+  UpdateTxDuration (mpdu->GetHeader ().GetAddr1 (), txParams);
+
+  return true;
+}
+
+bool
+QosFrameExchangeManager::IsWithinLimitsIfAddMpdu (Ptr<const WifiMacQueueItem> mpdu,
+                                                  const WifiTxParameters& txParams,
+                                                  Time ppduDurationLimit) const
+{
+  NS_ASSERT (mpdu != 0);
+  NS_LOG_FUNCTION (this << *mpdu << &txParams << ppduDurationLimit);
+
+  // A QoS station only has to check that the MPDU transmission time does not
+  // exceed the given limit
+  return IsWithinSizeAndTimeLimits (mpdu->GetSize (), mpdu->GetHeader ().GetAddr1 (),
+                                    txParams, ppduDurationLimit);
+}
+
+bool
+QosFrameExchangeManager::IsWithinSizeAndTimeLimits (uint32_t ppduPayloadSize, Mac48Address receiver,
+                                                    const WifiTxParameters& txParams,
+                                                    Time ppduDurationLimit) const
+{
+  NS_LOG_FUNCTION (this << ppduPayloadSize << receiver << &txParams << ppduDurationLimit);
+
+  if (ppduDurationLimit != Time::Min () && ppduDurationLimit.IsNegative ())
+    {
+      NS_LOG_DEBUG ("ppduDurationLimit is null or negative, time limit is trivially exceeded");
+      return false;
+    }
+
+  if (ppduPayloadSize > WifiPhy::GetMaxPsduSize (txParams.m_txVector.GetModulationClass ()))
+    {
+      NS_LOG_DEBUG ("the frame exceeds the max PSDU size");
+      return false;
+    }
+
+  // Get the maximum PPDU Duration based on the preamble type
+  Time maxPpduDuration = GetPpduMaxTime (txParams.m_txVector.GetPreambleType ());
+
+  Time txTime = GetTxDuration (ppduPayloadSize, receiver, txParams);
+  NS_LOG_DEBUG ("PPDU duration: " << txTime.As (Time::MS));
+
+  if ((ppduDurationLimit.IsStrictlyPositive () && txTime > ppduDurationLimit)
+      || (maxPpduDuration.IsStrictlyPositive () && txTime > maxPpduDuration))
+    {
+      NS_LOG_DEBUG ("the frame does not meet the constraint on max PPDU duration or PPDU duration limit");
+      return false;
+    }
+
+  return true;
+}
+
+Time
+QosFrameExchangeManager::GetFrameDurationId (const WifiMacHeader& header, uint32_t size,
+                                             const WifiTxParameters& txParams,
+                                             Ptr<Packet> fragmentedPacket) const
+{
+  NS_LOG_FUNCTION (this << header << size << &txParams << fragmentedPacket);
+
+  // TODO This will be removed once no Txop is installed on a QoS station
+  if (m_edca == 0)
+    {
+      return FrameExchangeManager::GetFrameDurationId (header, size, txParams, fragmentedPacket);
+    }
+
+  if (m_edca->GetTxopLimit ().IsZero ())
+    {
+      return FrameExchangeManager::GetFrameDurationId (header, size, txParams, fragmentedPacket);
+    }
+
+  // under multiple protection settings, if the TXOP limit is not null, Duration/ID
+  // is set to cover the remaining TXOP time (Sec. 9.2.5.2 of 802.11-2016).
+  // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8
+  // of 802.11-2016)
+  return std::max (m_edca->GetRemainingTxop ()
+                   - m_phy->CalculateTxDuration (size, txParams.m_txVector, m_phy->GetPhyBand ()),
+                   Seconds (0));
+}
+
+Time
+QosFrameExchangeManager::GetRtsDurationId (const WifiTxVector& rtsTxVector, Time txDuration, Time response) const
+{
+  NS_LOG_FUNCTION (this << rtsTxVector << txDuration << response);
+
+  // TODO This will be removed once no Txop is installed on a QoS station
+  if (m_edca == 0)
+    {
+      return FrameExchangeManager::GetRtsDurationId (rtsTxVector, txDuration, response);
+    }
+
+  if (m_edca->GetTxopLimit ().IsZero ())
+    {
+      return FrameExchangeManager::GetRtsDurationId (rtsTxVector, txDuration, response);
+    }
+
+  // under multiple protection settings, if the TXOP limit is not null, Duration/ID
+  // is set to cover the remaining TXOP time (Sec. 9.2.5.2 of 802.11-2016).
+  // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8
+  // of 802.11-2016)
+  return std::max (m_edca->GetRemainingTxop ()
+                   - m_phy->CalculateTxDuration (GetRtsSize (), rtsTxVector, m_phy->GetPhyBand ()),
+                   Seconds (0));
+}
+
+Time
+QosFrameExchangeManager::GetCtsToSelfDurationId (const WifiTxVector& ctsTxVector,
+                                                  Time txDuration, Time response) const
+{
+  NS_LOG_FUNCTION (this << ctsTxVector << txDuration << response);
+
+  // TODO This will be removed once no Txop is installed on a QoS station
+  if (m_edca == 0)
+    {
+      return FrameExchangeManager::GetCtsToSelfDurationId (ctsTxVector, txDuration, response);
+    }
+
+  if (m_edca->GetTxopLimit ().IsZero ())
+    {
+      return FrameExchangeManager::GetCtsToSelfDurationId (ctsTxVector, txDuration, response);
+    }
+
+  // under multiple protection settings, if the TXOP limit is not null, Duration/ID
+  // is set to cover the remaining TXOP time (Sec. 9.2.5.2 of 802.11-2016).
+  // The TXOP holder may exceed the TXOP limit in some situations (Sec. 10.22.2.8
+  // of 802.11-2016)
+  return std::max (m_edca->GetRemainingTxop ()
+                   - m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, m_phy->GetPhyBand ()),
+                   Seconds (0));
+}
+
+void
+QosFrameExchangeManager::TransmissionSucceeded (void)
+{
+  NS_LOG_DEBUG (this);
+
+  // TODO This will be removed once no Txop is installed on a QoS station
+  if (m_edca == 0)
+    {
+      FrameExchangeManager::TransmissionSucceeded ();
+      return;
+    }
+
+  if (m_edca->GetTxopLimit ().IsStrictlyPositive ()
+      && m_edca->GetRemainingTxop () > m_phy->GetSifs ())
+    {
+      NS_LOG_DEBUG ("Schedule another transmission in a SIFS");
+      bool (QosFrameExchangeManager::*fp) (Ptr<QosTxop>, Time) = &QosFrameExchangeManager::StartTransmission;
+
+      // we are continuing a TXOP, hence the txopDuration parameter is unused
+      Simulator::Schedule (m_phy->GetSifs (), fp, this, m_edca, Seconds (0));
+    }
+  else
+    {
+      m_edca->NotifyChannelReleased ();
+      m_edca = 0;
+    }
+  m_initialFrame = false;
+}
+
+void
+QosFrameExchangeManager::TransmissionFailed (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  // TODO This will be removed once no Txop is installed on a QoS station
+  if (m_edca == 0)
+    {
+      FrameExchangeManager::TransmissionFailed ();
+      return;
+    }
+
+  if (m_initialFrame)
+    {
+      // The backoff procedure shall be invoked by an EDCAF when the transmission
+      // of an MPDU in the initial PPDU of a TXOP fails (Sec. 10.22.2.2 of 802.11-2016)
+      NS_LOG_DEBUG ("TX of the initial frame of a TXOP failed: terminate TXOP");
+      m_edca->NotifyChannelReleased ();
+      m_edca = 0;
+    }
+  else
+    {
+      NS_ASSERT_MSG (m_edca->GetTxopLimit ().IsStrictlyPositive (),
+                     "Cannot transmit more than one frame if TXOP Limit is zero");
+
+      // A STA can perform a PIFS recovery or perform a backoff as a response to
+      // transmission failure within a TXOP. How it chooses between these two is
+      // implementation dependent. (Sec. 10.22.2.2 of 802.11-2016)
+      if (m_pifsRecovery)
+        {
+          // we can continue the TXOP if the carrier sense mechanism indicates that
+          // the medium is idle in a PIFS
+          NS_LOG_DEBUG ("TX of a non-initial frame of a TXOP failed: perform PIFS recovery");
+          NS_ASSERT (!m_pifsRecoveryEvent.IsRunning ());
+          m_pifsRecoveryEvent = Simulator::Schedule (m_phy->GetPifs (), &QosFrameExchangeManager::PifsRecovery, this);
+        }
+      else
+        {
+          // In order not to terminate (yet) the TXOP, we call the NotifyChannelReleased
+          // method of the Txop class, which only generates a new backoff value and
+          // requests channel access if needed,
+          NS_LOG_DEBUG ("TX of a non-initial frame of a TXOP failed: invoke backoff");
+          m_edca->Txop::NotifyChannelReleased ();
+          m_edcaBackingOff = m_edca;
+          m_edca = 0;
+        }
+    }
+  m_initialFrame = false;
+}
+
+void
+QosFrameExchangeManager::PreProcessFrame (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << psdu << txVector);
+
+  SetTxopHolder (psdu, txVector);
+
+  // APs store buffer size report of associated stations
+  if (m_mac->GetTypeOfStation () == AP && psdu->GetAddr1 () == m_self)
+    {
+      for (const auto& mpdu : *PeekPointer (psdu))
+        {
+          const WifiMacHeader& hdr = mpdu->GetHeader ();
+
+          if (hdr.IsQosData () && hdr.IsQosEosp ())
+            {
+              NS_LOG_DEBUG ("Station " << hdr.GetAddr2 () << " reported a buffer status of "
+                                      << +hdr.GetQosQueueSize () << " for tid=" << +hdr.GetQosTid ());
+              StaticCast<ApWifiMac> (m_mac)->SetBufferStatus (hdr.GetQosTid (), hdr.GetAddr2 (), hdr.GetQosQueueSize ());
+            }
+        }
+    }
+
+  FrameExchangeManager::PreProcessFrame (psdu, txVector);
+}
+
+void
+QosFrameExchangeManager::SetTxopHolder (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << psdu << txVector);
+
+  const WifiMacHeader& hdr = psdu->GetHeader (0);
+
+  if (hdr.IsQosData () || hdr.IsMgt () || hdr.IsRts ())
+    {
+      m_txopHolder = psdu->GetAddr2 ();
+    }
+  else if (hdr.IsCts () || hdr.IsAck ())
+    {
+      m_txopHolder = psdu->GetAddr1 ();
+    }
+}
+
+void
+QosFrameExchangeManager::ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu, RxSignalInfo rxSignalInfo,
+                                      const WifiTxVector& txVector, bool inAmpdu)
+{
+  // The received MPDU is either broadcast or addressed to this station
+  NS_ASSERT (mpdu->GetHeader ().GetAddr1 ().IsGroup ()
+             || mpdu->GetHeader ().GetAddr1 () == m_self);
+
+  double rxSnr = rxSignalInfo.snr;
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
+
+  if (hdr.IsCfEnd ())
+    {
+      // reset NAV
+      NavResetTimeout ();
+      return;
+    }
+
+  if (hdr.IsRts ())
+    {
+      NS_ABORT_MSG_IF (inAmpdu, "Received RTS as part of an A-MPDU");
+
+      // If a non-VHT STA receives an RTS frame with the RA address matching the
+      // MAC address of the STA and the MAC address in the TA field in the RTS
+      // frame matches the saved TXOP holder address, then the STA shall send the
+      // CTS frame after SIFS, without regard for, and without resetting, its NAV.
+      // (sec. 10.22.2.4 of 802.11-2016)
+      if (hdr.GetAddr2 () == m_txopHolder || m_navEnd <= Simulator::Now ())
+        {
+          NS_LOG_DEBUG ("Received RTS from=" << hdr.GetAddr2 () << ", schedule CTS");
+          Simulator::Schedule (m_phy->GetSifs (), &QosFrameExchangeManager::SendCtsAfterRts,
+                                this, hdr, txVector.GetMode (), rxSnr);
+        }
+      else
+        {
+          NS_LOG_DEBUG ("Received RTS from=" << hdr.GetAddr2 () << ", cannot schedule CTS");
+        }
+      return;
+    }
+
+  if (hdr.IsQosData ())
+    {
+      if (hdr.GetAddr1 () == m_self && hdr.GetQosAckPolicy () == WifiMacHeader::NORMAL_ACK)
+        {
+          NS_LOG_DEBUG ("Received " << hdr.GetTypeString () << " from=" << hdr.GetAddr2 () << ", schedule ACK");
+          Simulator::Schedule (m_phy->GetSifs (), &QosFrameExchangeManager::SendNormalAck,
+                               this, hdr, txVector, rxSnr);
+        }
+
+      // Forward up the frame if it is not a QoS Null frame
+      if (hdr.HasData ())
+        {
+          m_rxMiddle->Receive (mpdu);
+        }
+
+      // the received data frame has been processed
+      return;
+    }
+
+  return FrameExchangeManager::ReceiveMpdu (mpdu, rxSignalInfo, txVector, inAmpdu);
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/qos-frame-exchange-manager.h ns-3.34/src/wifi/model/qos-frame-exchange-manager.h
--- ns-3.33/src/wifi/model/qos-frame-exchange-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/qos-frame-exchange-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,177 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef QOS_FRAME_EXCHANGE_MANAGER_H
+#define QOS_FRAME_EXCHANGE_MANAGER_H
+
+#include "frame-exchange-manager.h"
+
+namespace ns3 {
+
+
+/**
+ * \ingroup wifi
+ *
+ * QosFrameExchangeManager handles the frame exchange sequences
+ * for QoS stations.
+ * Note that Basic Block Ack is not supported.
+ */
+class QosFrameExchangeManager : public FrameExchangeManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  QosFrameExchangeManager ();
+  virtual ~QosFrameExchangeManager ();
+
+  bool StartTransmission (Ptr<Txop> edca) override;
+
+  /**
+   * Recompute the protection and acknowledgment methods to use if the given MPDU
+   * is added to the frame being built (as described by the given TX parameters)
+   * and check whether the duration of the frame exchange sequence (including
+   * protection and acknowledgment) does not exceed the given available time.
+   * The protection and acknowledgment methods held by the given TX parameters are
+   * only updated if the given MPDU can be added.
+   *
+   * \param mpdu the MPDU to add to the frame being built
+   * \param txParams the TX parameters describing the frame being built
+   * \param availableTime the time limit on the frame exchange sequence
+   * \return true if the given MPDU can be added to the frame being built
+   */
+  bool TryAddMpdu (Ptr<const WifiMacQueueItem> mpdu, WifiTxParameters& txParams, Time availableTime) const;
+
+  /**
+   * Check whether the given MPDU can be added to the frame being built (as described
+   * by the given TX parameters) without violating the given constraint on the
+   * PPDU transmission duration.
+   *
+   * \param mpdu the MPDU to add to the frame being built
+   * \param txParams the TX parameters describing the frame being built
+   * \param ppduDurationLimit the time limit on the PPDU transmission duration
+   * \return true if the given MPDU can be added to the frame being built
+   */
+  virtual bool IsWithinLimitsIfAddMpdu (Ptr<const WifiMacQueueItem> mpdu, const WifiTxParameters& txParams,
+                                        Time ppduDurationLimit) const;
+
+  /**
+   * Check whether the transmission time of the frame being built (as described
+   * by the given TX parameters) does not exceed the given PPDU duration limit
+   * if the size of the PSDU addressed to the given receiver becomes
+   * <i>ppduPayloadSize</i>. Also check that the PSDU size does not exceed the
+   * max PSDU size for the modulation class being used.
+   *
+   * \param ppduPayloadSize the new PSDU size
+   * \param receiver the MAC address of the receiver of the PSDU
+   * \param txParams the TX parameters describing the frame being built
+   * \param ppduDurationLimit the limit on the PPDU duration
+   * \return true if the constraints on the PPDU duration limit and the maximum PSDU size are met
+   */
+  virtual bool IsWithinSizeAndTimeLimits (uint32_t ppduPayloadSize, Mac48Address receiver,
+                                          const WifiTxParameters& txParams, Time ppduDurationLimit) const;
+
+protected:
+  void DoDispose () override;
+
+  void ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu, RxSignalInfo rxSignalInfo,
+                    const WifiTxVector& txVector, bool inAmpdu) override;
+  void PreProcessFrame (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector) override;
+  Time GetFrameDurationId (const WifiMacHeader& header, uint32_t size,
+                           const WifiTxParameters& txParams,
+                           Ptr<Packet> fragmentedPacket) const override;
+  Time GetRtsDurationId (const WifiTxVector& rtsTxVector, Time txDuration,
+                         Time response) const override;
+  Time GetCtsToSelfDurationId (const WifiTxVector& ctsTxVector, Time txDuration,
+                               Time response) const override;
+  void TransmissionSucceeded (void) override;
+  void TransmissionFailed (void) override;
+
+  /**
+   * Request the FrameExchangeManager to start a frame exchange sequence.
+   *
+   * \param edca the EDCA that gained channel access
+   * \param txopDuration the duration of a TXOP. This value is only used when a
+   *                     new TXOP is started (and hence the TXOP limit for the
+   *                     given EDCAF is non-zero)
+   * \return true if a frame exchange sequence was started, false otherwise
+   */
+  virtual bool StartTransmission (Ptr<QosTxop> edca, Time txopDuration);
+
+  /**
+   * Start a frame exchange (including protection frames and acknowledgment frames
+   * as needed) that fits within the given <i>availableTime</i> (if different than
+   * Time::Min()).
+   *
+   * \param edca the EDCAF which has been granted the opportunity to transmit
+   * \param availableTime the amount of time allowed for the frame exchange. Pass
+   *                      Time::Min() in case the TXOP limit is null
+   * \param initialFrame true if the frame being transmitted is the initial frame
+   *                     of the TXOP. This is used to determine whether the TXOP
+   *                     limit can be exceeded
+   * \return true if a frame exchange is started, false otherwise
+   */
+  virtual bool StartFrameExchange (Ptr<QosTxop> edca, Time availableTime, bool initialFrame);
+
+  /**
+   * Perform a PIFS recovery as a response to transmission failure within a TXOP.
+   * If the carrier sense indicates that the medium is idle, continue the TXOP.
+   * Otherwise, release the channel.
+   */
+  void PifsRecovery (void);
+
+  /**
+   * Send a CF-End frame to indicate the completion of the TXOP, provided that
+   * the remaining duration is long enough to transmit this frame.
+   *
+   * \return true if a CF-End frame was sent, false otherwise
+   */
+  virtual bool SendCfEndIfNeeded (void);
+
+  /**
+   * Set the TXOP holder, if needed, based on the received frame
+   *
+   * \param psdu the received PSDU
+   * \param txVector TX vector of the received PSDU
+   */
+  virtual void SetTxopHolder (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector);
+
+  Ptr<QosTxop> m_edca;                       //!< the EDCAF that gained channel access
+  Mac48Address m_txopHolder;                 //!< MAC address of the TXOP holder
+
+private:
+
+  /**
+   * Cancel the PIFS recovery event and have the EDCAF attempting PIFS recovery
+   * release the channel.
+   */
+  void CancelPifsRecovery (void);
+
+  bool m_initialFrame;                       //!< true if transmitting the initial frame of a TXOP
+  bool m_pifsRecovery;                       //!< true if performing a PIFS recovery after failure
+  EventId m_pifsRecoveryEvent;               //!< event associated with an attempt of PIFS recovery
+  Ptr<Txop> m_edcaBackingOff;                //!< channel access function that invoked backoff during TXOP
+};
+
+} //namespace ns3
+
+#endif /* QOS_FRAME_EXCHANGE_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/qos-txop.cc ns-3.34/src/wifi/model/qos-txop.cc
--- ns-3.33/src/wifi/model/qos-txop.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/qos-txop.cc	2021-07-14 10:31:07.000000000 -0700
@@ -31,18 +31,18 @@
 #include "mgt-headers.h"
 #include "wifi-mac-trailer.h"
 #include "wifi-mac-queue.h"
-#include "mac-low.h"
 #include "qos-blocked-destinations.h"
 #include "wifi-remote-station-manager.h"
 #include "msdu-aggregator.h"
 #include "mpdu-aggregator.h"
 #include "ctrl-headers.h"
 #include "wifi-phy.h"
-#include "wifi-ack-policy-selector.h"
 #include "wifi-psdu.h"
+#include "ns3/ht-frame-exchange-manager.h"
+#include "wifi-tx-parameters.h"
 
 #undef NS_LOG_APPEND_CONTEXT
-#define NS_LOG_APPEND_CONTEXT if (m_low != 0) { std::clog << "[mac=" << m_low->GetAddress () << "] "; }
+#define NS_LOG_APPEND_CONTEXT if (m_stationManager != 0 && m_stationManager->GetMac () != 0) { std::clog << "[mac=" << m_stationManager->GetMac ()->GetAddress () << "] "; }
 
 namespace ns3 {
 
@@ -92,21 +92,15 @@
 }
 
 QosTxop::QosTxop ()
-  : m_typeOfStation (STA),
-    m_blockAckType (COMPRESSED_BLOCK_ACK),
-    m_startTxop (Seconds (0)),
-    m_isAccessRequestedForRts (false),
-    m_currentIsFragmented (false)
+  : m_startTxop (Seconds (0)),
+    m_txopDuration (Seconds (0))
 {
   NS_LOG_FUNCTION (this);
   m_qosBlockedDestinations = Create<QosBlockedDestinations> ();
   m_baManager = CreateObject<BlockAckManager> ();
   m_baManager->SetQueue (m_queue);
-  m_baManager->SetBlockAckType (m_blockAckType);
   m_baManager->SetBlockDestinationCallback (MakeCallback (&QosBlockedDestinations::Block, m_qosBlockedDestinations));
   m_baManager->SetUnblockDestinationCallback (MakeCallback (&QosBlockedDestinations::Unblock, m_qosBlockedDestinations));
-  m_baManager->SetTxOkCallback (MakeCallback (&QosTxop::BaTxOk, this));
-  m_baManager->SetTxFailedCallback (MakeCallback (&QosTxop::BaTxFailed, this));
 }
 
 QosTxop::~QosTxop ()
@@ -118,12 +112,51 @@
 QosTxop::DoDispose (void)
 {
   NS_LOG_FUNCTION (this);
-  m_ackPolicySelector = 0;
   m_baManager = 0;
   m_qosBlockedDestinations = 0;
+  m_qosFem = 0;
   Txop::DoDispose ();
 }
 
+void
+QosTxop::SetQosQueueSize (Ptr<WifiMacQueueItem> mpdu)
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+
+  WifiMacHeader& hdr = mpdu->GetHeader ();
+  NS_ASSERT (hdr.IsQosData ());
+
+  uint32_t bufferSize = m_queue->GetNBytes (hdr.GetQosTid (), hdr.GetAddr1 ())
+                        + m_baManager->GetRetransmitQueue ()->GetNBytes (hdr.GetQosTid (), hdr.GetAddr1 ());
+  // A queue size value of 254 is used for all sizes greater than 64 768 octets.
+  uint8_t queueSize = static_cast<uint8_t> (std::ceil (std::min (bufferSize, 64769u) / 256.0));
+  NS_LOG_DEBUG ("Buffer size=" << bufferSize << " Queue Size=" << +queueSize);
+  hdr.SetQosQueueSize (queueSize);
+}
+
+void
+QosTxop::SetQosFrameExchangeManager (const Ptr<QosFrameExchangeManager> qosFem)
+{
+  NS_LOG_FUNCTION (this << qosFem);
+  m_qosFem = qosFem;
+}
+
+void
+QosTxop::SetDroppedMpduCallback (DroppedMpdu callback)
+{
+  NS_LOG_FUNCTION (this << &callback);
+  Txop::SetDroppedMpduCallback (callback);
+  m_baManager->GetRetransmitQueue ()->TraceConnectWithoutContext ("Expired",
+                                                                  m_droppedMpduCallback
+                                                                  .Bind (WIFI_MAC_DROP_EXPIRED_LIFETIME));
+}
+
+Ptr<BlockAckManager>
+QosTxop::GetBaManager (void)
+{
+  return m_baManager;
+}
+
 bool
 QosTxop::GetBaAgreementEstablished (Mac48Address address, uint8_t tid) const
 {
@@ -146,15 +179,16 @@
 QosTxop::PrepareBlockAckRequest (Mac48Address recipient, uint8_t tid) const
 {
   NS_LOG_FUNCTION (this << recipient << +tid);
+  NS_ASSERT (QosUtilsMapTidToAc (tid) == m_ac);
 
-  CtrlBAckRequestHeader reqHdr = m_low->GetEdca (tid)->m_baManager->GetBlockAckReqHeader (recipient, tid);
+  CtrlBAckRequestHeader reqHdr = m_baManager->GetBlockAckReqHeader (recipient, tid);
   Ptr<Packet> bar = Create<Packet> ();
   bar->AddHeader (reqHdr);
 
   WifiMacHeader hdr;
   hdr.SetType (WIFI_MAC_CTL_BACKREQ);
   hdr.SetAddr1 (recipient);
-  hdr.SetAddr2 (m_low->GetAddress ());
+  hdr.SetAddr2 (m_stationManager->GetMac ()->GetAddress ());
   hdr.SetDsNotTo ();
   hdr.SetDsNotFrom ();
   hdr.SetNoRetry ();
@@ -177,37 +211,27 @@
   m_baManager->SetWifiRemoteStationManager (m_stationManager);
 }
 
-void
-QosTxop::SetAckPolicySelector (Ptr<WifiAckPolicySelector> ackSelector)
-{
-  NS_LOG_FUNCTION (this << ackSelector);
-  m_ackPolicySelector = ackSelector;
-}
-
-Ptr<WifiAckPolicySelector>
-QosTxop::GetAckPolicySelector (void) const
-{
-  return m_ackPolicySelector;
-}
-
-void
-QosTxop::SetTypeOfStation (TypeOfStation type)
-{
-  NS_LOG_FUNCTION (this << +type);
-  m_typeOfStation = type;
-}
-
-TypeOfStation
-QosTxop::GetTypeOfStation (void) const
+bool
+QosTxop::UseExplicitBarAfterMissedBlockAck (void) const
 {
-  return m_typeOfStation;
+  return m_useExplicitBarAfterMissedBlockAck;
 }
 
 bool
 QosTxop::HasFramesToTransmit (void)
 {
-  bool ret = (m_currentPacket != 0 || m_baManager->HasPackets () || !m_queue->IsEmpty ());
-  NS_LOG_FUNCTION (this << ret);
+  // check if the BA manager retransmit queue is empty, so that expired
+  // frames (if any) are removed and a BlockAckRequest is scheduled to advance
+  // the starting sequence number of the transmit (and receiver) window
+  bool baManagerHasPackets = m_baManager->HasPackets ();
+  // remove MSDUs with expired lifetime starting from the head of the queue
+  // TODO Add a WifiMacQueue method that serves this purpose; IsEmpty () can
+  // then reuse such method.
+  m_queue->IsEmpty ();
+  bool queueIsNotEmpty = (m_queue->PeekFirstAvailable (m_qosBlockedDestinations) != m_queue->end ());
+
+  bool ret = (baManagerHasPackets || queueIsNotEmpty);
+  NS_LOG_FUNCTION (this << baManagerHasPackets << queueIsNotEmpty);
   return ret;
 }
 
@@ -250,1234 +274,396 @@
 }
 
 Ptr<const WifiMacQueueItem>
-QosTxop::PeekNextFrame (uint8_t tid, Mac48Address recipient)
+QosTxop::PeekNextMpdu (uint8_t tid, Mac48Address recipient)
 {
-  NS_LOG_FUNCTION (this);
-  WifiMacQueue::ConstIterator it = WifiMacQueue::EMPTY;
+  return PeekNextMpdu ({nullptr, WifiMacQueue::EMPTY}, tid, recipient);
+}
+
+Ptr<const WifiMacQueueItem>
+QosTxop::PeekNextMpdu (WifiMacQueueItem::QueueIteratorPair queueIt, uint8_t tid, Mac48Address recipient)
+{
+  NS_LOG_FUNCTION (this << +tid << recipient);
 
   // lambda to peek the next frame
-  auto peek = [this, &tid, &recipient, &it] (Ptr<WifiMacQueue> queue)
+  auto peek = [this, &tid, &recipient, &queueIt] () -> WifiMacQueue::ConstIterator
     {
-      if (tid == 8 && recipient.IsGroup ())  // undefined TID and recipient
+      if (tid == 8 && recipient.IsBroadcast ())  // undefined TID and recipient
+        {
+          return queueIt.queue->PeekFirstAvailable (m_qosBlockedDestinations, queueIt.it);
+        }
+      if (m_qosBlockedDestinations->IsBlocked (recipient, tid))
         {
-          return queue->PeekFirstAvailable (m_qosBlockedDestinations, it);
+          return queueIt.queue->end ();
         }
-      return queue->PeekByTidAndAddress (tid, recipient, it);
+      return queueIt.queue->PeekByTidAndAddress (tid, recipient, queueIt.it);
     };
 
-  // check if there is a packet in the BlockAckManager retransmit queue
-  it = peek (m_baManager->GetRetransmitQueue ());
-  // remove old packets
-  while (it != m_baManager->GetRetransmitQueue ()->end () && IsQosOldPacket (*it))
+  if (queueIt.queue == nullptr && queueIt.it == WifiMacQueue::EMPTY)
     {
-      NS_LOG_DEBUG ("removing an old packet from BlockAckManager retransmit queue: " << **it);
-      it = m_baManager->GetRetransmitQueue ()->Remove (it);
-      it = peek (m_baManager->GetRetransmitQueue ());
+      // check if there is a packet in the BlockAckManager retransmit queue
+      queueIt.queue = PeekPointer (m_baManager->GetRetransmitQueue ());
     }
-  if (it != m_baManager->GetRetransmitQueue ()->end ())
+
+  if (queueIt.queue == PeekPointer (m_baManager->GetRetransmitQueue ()))
     {
-      NS_LOG_DEBUG ("packet peeked from BlockAckManager retransmit queue: " << **it);
-      return *it;
+      queueIt.it = peek ();
+      // remove old packets
+      while (queueIt.it != m_baManager->GetRetransmitQueue ()->end () && IsQosOldPacket (*queueIt.it))
+        {
+          NS_LOG_DEBUG ("Removing an old packet from BlockAckManager retransmit queue: " << **queueIt.it);
+          queueIt.it = m_baManager->GetRetransmitQueue ()->Remove (queueIt.it);
+          queueIt.it = peek ();
+        }
+      if (queueIt.it != m_baManager->GetRetransmitQueue ()->end ())
+        {
+          NS_LOG_DEBUG ("Packet peeked from BlockAckManager retransmit queue: " << **queueIt.it);
+          return *queueIt.it;
+        }
+      // otherwise, check if there is a packet in the EDCA queue
+      queueIt = {PeekPointer (m_queue), WifiMacQueue::EMPTY};
     }
 
-  // otherwise, check if there is a packet in the EDCA queue
-  it = WifiMacQueue::EMPTY;
-  it = peek (m_queue);
-  if (it != m_queue->end ())
+  queueIt.it = peek ();
+  if (queueIt.it != m_queue->end ())
     {
       // peek the next sequence number and check if it is within the transmit window
       // in case of QoS data frame
-      uint16_t sequence = m_txMiddle->PeekNextSequenceNumberFor (&(*it)->GetHeader ());
-      if ((*it)->GetHeader ().IsQosData ())
+      uint16_t sequence = m_txMiddle->PeekNextSequenceNumberFor (&(*queueIt.it)->GetHeader ());
+      if ((*queueIt.it)->GetHeader ().IsQosData ())
         {
-          Mac48Address recipient = (*it)->GetHeader ().GetAddr1 ();
-          uint8_t tid = (*it)->GetHeader ().GetQosTid ();
+          Mac48Address recipient = (*queueIt.it)->GetHeader ().GetAddr1 ();
+          uint8_t tid = (*queueIt.it)->GetHeader ().GetQosTid ();
 
           if (GetBaAgreementEstablished (recipient, tid)
               && !IsInWindow (sequence, GetBaStartingSequence (recipient, tid), GetBaBufferSize (recipient, tid)))
             {
-              NS_LOG_DEBUG ("packet beyond the end of the current transmit window");
+              NS_LOG_DEBUG ("Packet beyond the end of the current transmit window");
               return 0;
             }
         }
 
-      WifiMacHeader hdr = (*it)->GetHeader ();
-      hdr.SetSequenceNumber (sequence);
-      hdr.SetFragmentNumber (0);
-      hdr.SetNoMoreFragments ();
-      hdr.SetNoRetry ();
-      Ptr<const WifiMacQueueItem> item = Create<const WifiMacQueueItem> ((*it)->GetPacket (), hdr, (*it)->GetTimeStamp ());
-      NS_LOG_DEBUG ("packet peeked from EDCA queue: " << *item);
-      return item;
+      WifiMacHeader& hdr = (*queueIt.it)->GetHeader ();
+      // Assign a sequence number if this is not a fragment nor a retransmission
+      if (!(*queueIt.it)->IsFragment () && !hdr.IsRetry ())
+        {
+          hdr.SetSequenceNumber (sequence);
+        }
+      NS_LOG_DEBUG ("Packet peeked from EDCA queue: " << **queueIt.it);
+      return *queueIt.it;
     }
 
   return 0;
 }
 
 Ptr<WifiMacQueueItem>
-QosTxop::DequeuePeekedFrame (Ptr<const WifiMacQueueItem> peekedItem, WifiTxVector txVector,
-                             bool aggregate, uint32_t ampduSize, Time ppduDurationLimit)
+QosTxop::GetNextMpdu (Ptr<const WifiMacQueueItem> peekedItem, WifiTxParameters& txParams,
+                      Time availableTime, bool initialFrame, WifiMacQueueItem::QueueIteratorPair& queueIt)
 {
-  NS_LOG_FUNCTION (this << peekedItem << txVector << ampduSize << ppduDurationLimit);
   NS_ASSERT (peekedItem != 0);
-
-  // do not dequeue the frame if it is a QoS data frame that does not meet the
-  // max A-MPDU size limit (if applicable) or the duration limit (if applicable)
-  if (peekedItem->GetHeader ().IsQosData () &&
-      !m_low->IsWithinSizeAndTimeLimits (peekedItem, txVector, ampduSize, ppduDurationLimit))
-    {
-      return 0;
-    }
+  NS_ASSERT (m_qosFem != 0);
+  NS_LOG_FUNCTION (this << *peekedItem << &txParams << availableTime << initialFrame);
 
   Mac48Address recipient = peekedItem->GetHeader ().GetAddr1 ();
-  Ptr<WifiMacQueueItem> item;
-  Ptr<const WifiMacQueueItem> testItem;
-  WifiMacQueue::ConstIterator testIt;
-
-  // the packet can only have been peeked from the block ack manager retransmit
-  // queue if:
-  // - the peeked packet is a QoS Data frame AND
-  // - the peeked packet is not a group addressed frame AND
-  // - an agreement has been established
-  if (peekedItem->GetHeader ().IsQosData () && !recipient.IsGroup ()
-      && GetBaAgreementEstablished (recipient, peekedItem->GetHeader ().GetQosTid ()))
-    {
-      uint8_t tid = peekedItem->GetHeader ().GetQosTid ();
-      testIt = m_baManager->GetRetransmitQueue ()->PeekByTidAndAddress (tid, recipient);
 
-      if (testIt != m_baManager->GetRetransmitQueue ()->end ())
-        {
-          testItem = *testIt;
-          // if not null, the test packet must equal the peeked packet
-          NS_ASSERT (testItem->GetPacket () == peekedItem->GetPacket ());
-          // we should not be asked to dequeue an old packet
-          NS_ASSERT (!QosUtilsIsOldPacket (GetBaStartingSequence (recipient, tid),
-                                           testItem->GetHeader ().GetSequenceNumber ()));
-          item = m_baManager->GetRetransmitQueue ()->Dequeue (testIt);
-          NS_LOG_DEBUG ("dequeued from BA manager queue: " << *item);
-          return item;
-        }
-    }
+  // The TXOP limit can be exceeded by the TXOP holder if it does not transmit more
+  // than one Data or Management frame in the TXOP and the frame is not in an A-MPDU
+  // consisting of more than one MPDU (Sec. 10.22.2.8 of 802.11-2016)
+  Time actualAvailableTime = (initialFrame && txParams.GetSize (recipient) == 0
+                              ? Time::Min () : availableTime);
+
+  if (!m_qosFem->TryAddMpdu (peekedItem, txParams, actualAvailableTime))
+    {
+      return nullptr;
+    }
+
+  NS_ASSERT (peekedItem->IsQueued ());
+  NS_ASSERT_MSG (peekedItem->GetQueueIteratorPairs ().size () == 1,
+                 "An item in the MAC queue cannot contain an A-MSDU");
+  WifiMacQueueItem::QueueIteratorPair peekedIt = peekedItem->GetQueueIteratorPairs ().front ();
+  NS_ASSERT ((*peekedIt.it)->GetPacket () == peekedItem->GetPacket ());
+
+  if (peekedIt.queue == PeekPointer (m_baManager->GetRetransmitQueue ()))
+    {
+      // the packet can only have been peeked from the block ack manager retransmit
+      // queue if:
+      // - the peeked packet is a QoS Data frame AND
+      // - the peeked packet is not a broadcast frame AND
+      // - an agreement has been established
+      NS_ASSERT (peekedItem->GetHeader ().IsQosData () && !recipient.IsBroadcast ());
+      uint8_t tid = peekedItem->GetHeader ().GetQosTid ();
+      NS_ASSERT (GetBaAgreementEstablished (recipient, tid));
+      // we should not be asked to dequeue an old packet
+      NS_ASSERT (!QosUtilsIsOldPacket (GetBaStartingSequence (recipient, tid),
+                                       peekedItem->GetHeader ().GetSequenceNumber ()));
+      // we should not be asked to dequeue an MPDU that is beyond the transmit window
+      NS_ASSERT (IsInWindow (peekedItem->GetHeader ().GetSequenceNumber (),
+                             GetBaStartingSequence (recipient, tid),
+                             GetBaBufferSize (recipient, tid)));
+      // A-MSDU aggregation cannot be done on a retransmitted MPDU, hence return
+      // the peeked MPDU
+      NS_LOG_DEBUG ("Got MPDU from BA manager queue: " << *peekedItem);
+
+      queueIt = peekedIt;
+      queueIt.it++;
+
+      return *peekedIt.it;
+    }
+
+  // The MPDU has been peeked from the EDCA queue.
+  NS_ASSERT (peekedIt.queue == PeekPointer (m_queue));
+  Ptr<WifiMacQueueItem> mpdu;
 
-  // The packet has been peeked from the EDCA queue.
-  // If it is a QoS Data frame and it is not a broadcast frame, attempt A-MSDU
-  // aggregation if aggregate is true
+  // If it is a non-broadcast QoS Data frame and it is not a retransmission nor a fragment,
+  // attempt A-MSDU aggregation
   if (peekedItem->GetHeader ().IsQosData ())
     {
       uint8_t tid = peekedItem->GetHeader ().GetQosTid ();
-      testIt = m_queue->PeekByTidAndAddress (tid, recipient);
-
-      NS_ASSERT (testIt != m_queue->end () && (*testIt)->GetPacket () == peekedItem->GetPacket ());
 
-      uint16_t sequence = m_txMiddle->PeekNextSequenceNumberFor (&peekedItem->GetHeader ());
-
-      // check if the peeked packet is within the transmit window
-      if (GetBaAgreementEstablished (recipient, tid)
-          && !IsInWindow (sequence, GetBaStartingSequence (recipient, tid), GetBaBufferSize (recipient, tid)))
-        {
-          NS_LOG_DEBUG ("packet beyond the end of the current transmit window");
-          return 0;
-        }
+      // we should not be asked to dequeue an MPDU that is beyond the transmit window.
+      // Note that PeekNextMpdu() temporarily assigns the next available sequence number
+      // to the peeked frame
+      NS_ASSERT (!GetBaAgreementEstablished (recipient, tid)
+                 || IsInWindow (peekedItem->GetHeader ().GetSequenceNumber (),
+                                GetBaStartingSequence (recipient, tid),
+                                GetBaBufferSize (recipient, tid)));
 
       // try A-MSDU aggregation
-      if (m_low->GetMsduAggregator () != 0 && !recipient.IsGroup () && aggregate)
+      if (m_stationManager->GetHtSupported () && !recipient.IsBroadcast ()
+          && !peekedItem->GetHeader ().IsRetry () && !peekedItem->IsFragment ())
         {
-          item = m_low->GetMsduAggregator ()->GetNextAmsdu (recipient, tid, txVector, ampduSize, ppduDurationLimit);
+          Ptr<HtFrameExchangeManager> htFem = StaticCast<HtFrameExchangeManager> (m_qosFem);
+          mpdu = htFem->GetMsduAggregator ()->GetNextAmsdu (peekedItem, txParams, availableTime, peekedIt);
         }
 
-      if (item != 0)
-        {
-          NS_LOG_DEBUG ("tx unicast A-MSDU");
-        }
-      else  // aggregation was not attempted or failed
+      if (mpdu != 0)
         {
-          item = m_queue->Dequeue (testIt);
+          NS_LOG_DEBUG ("Prepared an MPDU containing an A-MSDU");
         }
+      // else aggregation was not attempted or failed
     }
-  else
+
+  if (mpdu == 0)
     {
-      // the peeked packet is a non-QoS Data frame (e.g., a DELBA Request), hence
-      // it was not peeked by TID, hence it must be the head of the queue
-      item = m_queue->DequeueFirstAvailable (m_qosBlockedDestinations);
-      NS_ASSERT (item != 0 && item->GetPacket () == peekedItem->GetPacket ());
+      mpdu = *peekedIt.it;
+      peekedIt.it++;
     }
 
-  NS_ASSERT (item != 0);
-
-  // Assign a sequence number to the MSDU or A-MSDU dequeued from the EDCA queue
-  uint16_t sequence = m_txMiddle->GetNextSequenceNumberFor (&item->GetHeader ());
-  item->GetHeader ().SetSequenceNumber (sequence);
-  item->GetHeader ().SetFragmentNumber (0);
-  item->GetHeader ().SetNoMoreFragments ();
-  item->GetHeader ().SetNoRetry ();
-  NS_LOG_DEBUG ("dequeued from EDCA queue: " << *item);
+  // Assign a sequence number if this is not a fragment nor a retransmission
+  AssignSequenceNumber (mpdu);
+  NS_LOG_DEBUG ("Got MPDU from EDCA queue: " << *mpdu);
+  queueIt = peekedIt;
 
-  return item;
+  return mpdu;
 }
 
-MacLowTransmissionParameters
-QosTxop::GetTransmissionParameters (Ptr<const WifiMacQueueItem> frame) const
+void
+QosTxop::AssignSequenceNumber (Ptr<WifiMacQueueItem> mpdu) const
 {
-  NS_LOG_FUNCTION (this << *frame);
-
-  MacLowTransmissionParameters params;
-  Mac48Address recipient = frame->GetHeader ().GetAddr1 ();
-
-  params.DisableNextData ();
-
-  // group addressed frames
-  if (recipient.IsGroup ())
-    {
-      params.DisableRts ();
-      params.DisableAck ();
-      return params;
-    }
-  if (frame->GetHeader ().IsMgt ())
-    {
-      params.DisableRts ();
-      params.EnableAck ();
-      return params;
-    }
-
-  // Enable/disable RTS
-  if (!frame->GetHeader ().IsBlockAckReq ()
-      && m_stationManager->NeedRts (frame->GetHeader (), frame->GetSize ())
-      && !m_low->IsCfPeriod ())
-    {
-      params.EnableRts ();
-    }
-  else
-    {
-      params.DisableRts ();
-    }
+  NS_LOG_FUNCTION (this << *mpdu);
 
-  // Select ack technique.
-  if (frame->GetHeader ().IsQosData ())
-    {
-      // Assume normal Ack by default
-      params.EnableAck ();
-    }
-  else if (frame->GetHeader ().IsBlockAckReq ())
+  if (!mpdu->IsFragment () && !mpdu->GetHeader ().IsRetry ())
     {
-      // assume a BlockAck variant. Later, if this frame is not aggregated,
-      // the acknowledgment type will be switched to normal Ack
-      if (m_blockAckType == BASIC_BLOCK_ACK)
-        {
-          params.EnableBlockAck (BlockAckType::BASIC_BLOCK_ACK);
-        }
-      else if (m_blockAckType == COMPRESSED_BLOCK_ACK)
-        {
-          CtrlBAckRequestHeader baReqHdr;
-          frame->GetPacket ()->PeekHeader (baReqHdr);
-          uint8_t tid = baReqHdr.GetTidInfo ();
-
-          if (GetBaBufferSize (recipient, tid) > 64)
-            {
-              params.EnableBlockAck (BlockAckType::EXTENDED_COMPRESSED_BLOCK_ACK);
-            }
-          else
-            {
-              params.EnableBlockAck (BlockAckType::COMPRESSED_BLOCK_ACK);
-            }
-        }
-      else if (m_blockAckType == MULTI_TID_BLOCK_ACK)
-        {
-          NS_FATAL_ERROR ("Multi-tid block ack is not supported");
-        }
+      uint16_t sequence = m_txMiddle->GetNextSequenceNumberFor (&mpdu->GetHeader ());
+      mpdu->GetHeader ().SetSequenceNumber (sequence);
     }
+}
 
-  return params;
+BlockAckReqType
+QosTxop::GetBlockAckReqType (Mac48Address recipient, uint8_t tid) const
+{
+  return m_baManager->GetBlockAckReqType (recipient, tid);
 }
 
-void
-QosTxop::UpdateCurrentPacket (Ptr<WifiMacQueueItem> mpdu)
+BlockAckType
+QosTxop::GetBlockAckType (Mac48Address recipient, uint8_t tid) const
 {
-  NS_LOG_FUNCTION (this << *mpdu);
-  m_currentPacket = mpdu->GetPacket ();
-  m_currentHdr = mpdu->GetHeader ();
-  m_currentPacketTimestamp = mpdu->GetTimeStamp ();
+  return m_baManager->GetBlockAckType (recipient, tid);
 }
 
 void
-QosTxop::NotifyAccessGranted (void)
+QosTxop::NotifyInternalCollision (void)
 {
   NS_LOG_FUNCTION (this);
-  NS_ASSERT (m_accessRequested);
-  m_accessRequested = false;
-  m_isAccessRequestedForRts = false;
-  m_startTxop = Simulator::Now ();
-  // discard the current packet if it is a QoS Data frame with expired lifetime
-  if (m_currentPacket != 0 && m_currentHdr.IsQosData ()
-      && (m_currentPacketTimestamp + m_queue->GetMaxDelay () < Simulator::Now ()))
-    {
-      NS_LOG_DEBUG ("the lifetime of current packet expired");
-      m_currentPacket = 0;
-    }
-  // If the current packet is a QoS Data frame, then there must be no block ack agreement
-  // established with the receiver for the TID of the packet. Indeed, retransmission
-  // of MPDUs sent under a block ack agreement is handled through the retransmit queue.
-  NS_ASSERT (m_currentPacket == 0 || !m_currentHdr.IsQosData ()
-             || !GetBaAgreementEstablished (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid ()));
 
-  if (m_currentPacket == 0)
+  // For internal collisions occurring with the EDCA access method, the appropriate
+  // retry counters (short retry counter for MSDU, A-MSDU, or MMPDU and QSRC[AC] or
+  // long retry counter for MSDU, A-MSDU, or MMPDU and QLRC[AC]) are incremented
+  // (Sec. 10.22.2.11.1 of 802.11-2016).
+  // We do not prepare the PSDU that the AC losing the internal collision would have
+  // sent. As an approximation, we consider the frame peeked from the queues of the AC.
+  Ptr<const WifiMacQueueItem> mpdu = PeekNextMpdu ();
+
+  if (mpdu != nullptr)
     {
-      Ptr<const WifiMacQueueItem> peekedItem = m_baManager->GetBar ();
-      if (peekedItem != 0)
-        {
-          m_currentHdr = peekedItem->GetHeader ();
-          m_currentPacket = peekedItem->GetPacket ();
-          m_currentPacketTimestamp = Simulator::Now ();
-        }
-      else
+      m_stationManager->ReportDataFailed (mpdu);
+
+      if (!mpdu->GetHeader ().GetAddr1 ().IsGroup () && !m_stationManager->NeedRetransmission (mpdu))
         {
-          peekedItem = PeekNextFrame ();
-          if (peekedItem == 0)
-            {
-              NS_LOG_DEBUG ("no packets available for transmission");
-              return;
-            }
-          // check if a block ack agreement needs to be established
-          m_currentHdr = peekedItem->GetHeader ();
-          m_currentPacket = peekedItem->GetPacket ();
-          if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().IsGroup ()
-              && m_stationManager->GetQosSupported (m_currentHdr.GetAddr1 ())
-              && (!m_baManager->ExistsAgreement (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid ())
-                  || m_baManager->ExistsAgreementInState (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid (), OriginatorBlockAckAgreement::RESET))
-              && SetupBlockAckIfNeeded ())
+          NS_LOG_DEBUG ("reset DCF");
+          m_stationManager->ReportFinalDataFailed (mpdu);
+          if (!m_droppedMpduCallback.IsNull ())
             {
-              return;
+              m_droppedMpduCallback (WIFI_MAC_DROP_REACHED_RETRY_LIMIT, mpdu);
             }
+          ResetCw ();
+          // We have to discard mpdu, but first we have to determine whether mpdu
+          // is stored in the Block Ack Manager retransmit queue or in the AC queue
+          Mac48Address receiver = mpdu->GetHeader ().GetAddr1 ();
+          WifiMacQueue::ConstIterator testIt;
+          bool found = false;
 
-          m_stationManager->UpdateFragmentationThreshold ();
-          Ptr<WifiMacQueueItem> item;
-          // non-group addressed QoS Data frames may be sent in MU PPDUs. Given that at this stage
-          // we do not know the bandwidth it would be given nor the selected acknowledgment
-          // sequence, we cannot determine the constraints on size and duration limit. Hence,
-          // we only peek the non-group addressed QoS Data frame. MacLow will be in charge of
-          // computing the correct limits and dequeue the frame.
-          if (peekedItem->GetHeader ().IsQosData () && !peekedItem->GetHeader ().GetAddr1 ().IsGroup ()
-              && !NeedFragmentation ())
-            {
-              item = Copy (peekedItem);
-            }
-          else
+          if (mpdu->GetHeader ().IsQosData ()
+              && GetBaAgreementEstablished (receiver, mpdu->GetHeader ().GetQosTid ()))
             {
-              // compute the limit on the PPDU duration due to the TXOP duration, if any
-              Time ppduDurationLimit = Time::Min ();
-              if (peekedItem->GetHeader ().IsQosData () && GetTxopLimit ().IsStrictlyPositive ())
+              uint8_t tid = mpdu->GetHeader ().GetQosTid ();
+              testIt = m_baManager->GetRetransmitQueue ()->PeekByTidAndAddress (tid, receiver);
+
+              if (testIt != m_baManager->GetRetransmitQueue ()->end ())
                 {
-                  MacLowTransmissionParameters params = GetTransmissionParameters (peekedItem);
-                  ppduDurationLimit = GetTxopRemaining () - m_low->CalculateOverheadTxTime (peekedItem, params);
+                  found = true;
+                  // if not null, the test packet must equal the peeked packet
+                  NS_ASSERT ((*testIt)->GetPacket () == mpdu->GetPacket ());
+                  m_baManager->GetRetransmitQueue ()->Remove (testIt);
+                  m_baManager->NotifyDiscardedMpdu (mpdu);
                 }
-
-                // dequeue the peeked item if it fits within the TXOP duration, if any
-                item = DequeuePeekedFrame (peekedItem, m_low->GetDataTxVector (peekedItem),
-                                          !NeedFragmentation (), 0, ppduDurationLimit);
             }
 
-          if (item == 0)
+          if (!found)
             {
-              NS_LOG_DEBUG ("Not enough time in the current TXOP");
-              return;
+              if (mpdu->GetHeader ().IsQosData ())
+                {
+                  uint8_t tid = mpdu->GetHeader ().GetQosTid ();
+                  testIt = m_queue->PeekByTidAndAddress (tid, receiver);
+                  NS_ASSERT (testIt != m_queue->end () && (*testIt)->GetPacket () == mpdu->GetPacket ());
+                  m_queue->Remove (testIt);
+                }
+              else
+                {
+                  // the peeked packet is a non-QoS Data frame (e.g., a DELBA Request), hence
+                  // it was not peeked by TID, hence it must be the head of the queue
+                  Ptr<WifiMacQueueItem> item;
+                  item = m_queue->DequeueFirstAvailable (m_qosBlockedDestinations);
+                  NS_ASSERT (item != 0 && item->GetPacket () == mpdu->GetPacket ());
+                }
             }
-          m_currentPacket = item->GetPacket ();
-          m_currentHdr = item->GetHeader ();
-          m_currentPacketTimestamp = item->GetTimeStamp ();
-
-          m_fragmentNumber = 0;
-        }
-      NS_ASSERT (m_currentPacket != 0);
-    }
-  Ptr<WifiMacQueueItem> mpdu = Create <WifiMacQueueItem> (m_currentPacket, m_currentHdr,
-                                                          m_currentPacketTimestamp);
-  m_currentParams = GetTransmissionParameters (mpdu);
-
-  if (m_currentHdr.GetAddr1 ().IsGroup ())
-    {
-      NS_LOG_DEBUG ("tx broadcast");
-      m_low->StartTransmission (mpdu, m_currentParams, this);
-    }
-  //With COMPRESSED_BLOCK_ACK fragmentation must be avoided.
-  else if (((m_currentHdr.IsQosData () && !m_currentHdr.IsQosAmsdu ())
-            || (m_currentHdr.IsData () && !m_currentHdr.IsQosData ()))
-           && (GetBlockAckThreshold () == 0 || m_blockAckType == BASIC_BLOCK_ACK)
-           && NeedFragmentation ())
-    {
-      m_currentIsFragmented = true;
-      m_currentParams.DisableRts ();
-      WifiMacHeader hdr;
-      Ptr<Packet> fragment = GetFragmentPacket (&hdr);
-      if (IsLastFragment ())
-        {
-          NS_LOG_DEBUG ("fragmenting last fragment size=" << fragment->GetSize ());
-          m_currentParams.DisableNextData ();
         }
       else
         {
-          NS_LOG_DEBUG ("fragmenting size=" << fragment->GetSize ());
-          m_currentParams.EnableNextData (GetNextFragmentSize ());
+          NS_LOG_DEBUG ("Update CW");
+          UpdateFailedCw ();
         }
-      m_low->StartTransmission (Create<WifiMacQueueItem> (fragment, hdr),
-                                m_currentParams, this);
     }
-  else
+
+  GenerateBackoff ();
+  m_access = NOT_REQUESTED;
+  if (HasFramesToTransmit ())
     {
-      m_currentIsFragmented = false;
-      m_low->StartTransmission (mpdu, m_currentParams, this);
+      m_channelAccessManager->RequestAccess (this);
     }
 }
 
-void QosTxop::NotifyInternalCollision (void)
+void
+QosTxop::NotifyChannelAccessed (Time txopDuration)
 {
-  NS_LOG_FUNCTION (this);
-  bool resetTxop = false;
-  // If an internal collision is experienced, the frame involved may still
-  // be sitting in the queue, and m_currentPacket may still be null.
-  Ptr<const Packet> packet;
-  WifiMacHeader header;
-  if (m_currentPacket == 0)
-    {
-      Ptr<const WifiMacQueueItem> item = PeekNextFrame ();
-      if (item)
-        {
-          packet = item->GetPacket ();
-          header = item->GetHeader ();
-        }
-    }
-  else
-    {
-      packet = m_currentPacket;
-      header = m_currentHdr;
-    }
-  if (packet != 0)
-    {
-      if (m_isAccessRequestedForRts)
-        {
-          if (!NeedRtsRetransmission (packet, header))
-            {
-              resetTxop = true;
-              m_stationManager->ReportFinalRtsFailed (header.GetAddr1 (), &header);
-            }
-          else
-            {
-              m_stationManager->ReportRtsFailed (header.GetAddr1 (), &header);
-            }
-        }
-      else if (header.GetAddr1 () == Mac48Address::GetBroadcast ())
-        {
-          resetTxop = false;
-        }
-      else
-        {
-          if (!NeedDataRetransmission (packet, header))
-            {
-              resetTxop = true;
-              m_stationManager->ReportFinalDataFailed (header.GetAddr1 (), &header, packet->GetSize ());
-            }
-          else
-            {
-              m_stationManager->ReportDataFailed (header.GetAddr1 (), &header, packet->GetSize ());
-            }
-        }
-      if (resetTxop)
-        {
-          NS_LOG_DEBUG ("reset DCF");
-          if (!m_txFailedCallback.IsNull ())
-            {
-              m_txFailedCallback (header);
-            }
-          //to reset the Txop.
-          if (m_currentPacket)
-            {
-              NS_LOG_DEBUG ("Discarding m_currentPacket");
-              m_currentPacket = 0;
-            }
-          else
-            {
-              NS_LOG_DEBUG ("Dequeueing and discarding head of queue");
-              m_queue->Remove ();
-            }
-          ResetCw ();
-        }
-      else
-        {
-          UpdateFailedCw ();
-        }
-    }
-  GenerateBackoff ();
-  RestartAccessIfNeeded ();
+  NS_LOG_FUNCTION (this << txopDuration);
+
+  NS_ASSERT (txopDuration != Time::Min ());
+  m_startTxop = Simulator::Now ();
+  m_txopDuration = txopDuration;
+  Txop::NotifyChannelAccessed ();
+}
+
+bool
+QosTxop::IsTxopStarted (void) const
+{
+  NS_LOG_FUNCTION (this << !m_startTxop.IsZero ());
+  return (!m_startTxop.IsZero ());
 }
 
 void
-QosTxop::NotifyMissedCts (std::list<Ptr<WifiMacQueueItem>> mpduList)
+QosTxop::NotifyChannelReleased (void)
 {
   NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("missed cts");
-  NS_ASSERT (!mpduList.empty ());
-  if (!NeedRtsRetransmission (m_currentPacket, m_currentHdr))
-    {
-      NS_LOG_DEBUG ("Cts Fail");
-      m_stationManager->ReportFinalRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
-      if (!m_txFailedCallback.IsNull ())
-        {
-          m_txFailedCallback (m_currentHdr);
-        }
-      for (auto& mpdu : mpduList)
-        {
-          m_baManager->NotifyDiscardedMpdu (mpdu);
-        }
-      //to reset the Txop.
-      m_currentPacket = 0;
-      ResetCw ();
-      m_cwTrace = GetCw ();
+
+  if (m_startTxop.IsStrictlyPositive ())
+    {
+      NS_LOG_DEBUG ("Terminating TXOP. Duration = " << Simulator::Now () - m_startTxop);
+      m_txopTrace (m_startTxop, Simulator::Now () - m_startTxop);
     }
-  else
+  m_startTxop = Seconds (0);
+  Txop::NotifyChannelReleased ();
+}
+
+Time
+QosTxop::GetRemainingTxop (void) const
+{
+  NS_ASSERT (m_startTxop.IsStrictlyPositive ());
+  Time remainingTxop = m_txopDuration;
+  remainingTxop -= (Simulator::Now () - m_startTxop);
+  if (remainingTxop.IsStrictlyNegative ())
     {
-      UpdateFailedCw ();
-      m_cwTrace = GetCw ();
-      // if a BA agreement is established, store the MPDUs in the block ack manager
-      // retransmission queue. Otherwise, this QosTxop will handle the retransmission
-      // of the (single) frame
-      if (mpduList.size () > 1 ||
-          (mpduList.front ()->GetHeader ().IsQosData ()
-           && GetBaAgreementEstablished (mpduList.front ()->GetHeader ().GetAddr1 (),
-                                         mpduList.front ()->GetHeader ().GetQosTid ())))
-        {
-          for (auto it = mpduList.rbegin (); it != mpduList.rend (); it++)
-            {
-              m_baManager->GetRetransmitQueue ()->PushFront (*it);
-            }
-          m_currentPacket = 0;
-        }
+      remainingTxop = Seconds (0);
     }
-  GenerateBackoff ();
-  RestartAccessIfNeeded ();
+  NS_LOG_FUNCTION (this << remainingTxop);
+  return remainingTxop;
 }
 
 void
-QosTxop::GotAck (void)
+QosTxop::SetAccessCategory (AcIndex ac)
 {
-  NS_LOG_FUNCTION (this);
-  if (!m_currentIsFragmented
-      || !m_currentParams.HasNextPacket ()
-      || m_currentHdr.IsQosAmsdu ())
-    {
-      NS_LOG_DEBUG ("got ack. tx done.");
-      if (!m_txOkCallback.IsNull ())
-        {
-          m_txOkCallback (m_currentHdr);
-        }
+  NS_LOG_FUNCTION (this << +ac);
+  m_ac = ac;
+}
 
-      if (m_currentHdr.IsAction ())
-        {
-          WifiActionHeader actionHdr;
-          Ptr<Packet> p = m_currentPacket->Copy ();
-          p->RemoveHeader (actionHdr);
-          if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK)
-            {
-              if (actionHdr.GetAction ().blockAck == WifiActionHeader::BLOCK_ACK_DELBA)
-                {
-                  MgtDelBaHeader delBa;
-                  p->PeekHeader (delBa);
-                  if (delBa.IsByOriginator ())
-                    {
-                      m_baManager->DestroyAgreement (m_currentHdr.GetAddr1 (), delBa.GetTid ());
-                    }
-                  else
-                    {
-                      m_low->DestroyBlockAckAgreement (m_currentHdr.GetAddr1 (), delBa.GetTid ());
-                    }
-                }
-              else if (actionHdr.GetAction ().blockAck == WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST)
-                {
-                  // Setup ADDBA response timeout
-                  MgtAddBaRequestHeader addBa;
-                  p->PeekHeader (addBa);
-                  Simulator::Schedule (m_addBaResponseTimeout,
-                                       &QosTxop::AddBaResponseTimeout, this,
-                                       m_currentHdr.GetAddr1 (), addBa.GetTid ());
-                }
-            }
-        }
-      if (m_currentHdr.IsQosData () && GetBaAgreementEstablished (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid ()))
-        {
-          // notify the BA manager that the current packet was acknowledged
-          m_baManager->NotifyGotAck (Create<const WifiMacQueueItem> (m_currentPacket, m_currentHdr,
-                                                                     m_currentPacketTimestamp));
-        }
-      m_currentPacket = 0;
-      ResetCw ();
-    }
-  else
+void
+QosTxop::PushFront (Ptr<const Packet> packet, const WifiMacHeader &hdr)
+{
+  NS_LOG_FUNCTION (this << packet << &hdr);
+  WifiMacTrailer fcs;
+  m_queue->PushFront (Create<WifiMacQueueItem> (packet, hdr));
+  if (HasFramesToTransmit () && m_access == NOT_REQUESTED)
     {
-      NS_LOG_DEBUG ("got ack. tx not done, size=" << m_currentPacket->GetSize ());
+      m_channelAccessManager->RequestAccess (this);
     }
 }
 
 void
-QosTxop::MissedAck (void)
+QosTxop::GotAddBaResponse (const MgtAddBaResponseHeader *respHdr, Mac48Address recipient)
 {
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("missed ack");
-  if (!NeedDataRetransmission (m_currentPacket, m_currentHdr))
+  NS_LOG_FUNCTION (this << respHdr << recipient);
+  uint8_t tid = respHdr->GetTid ();
+  if (respHdr->GetStatusCode ().IsSuccess ())
     {
-      NS_LOG_DEBUG ("Ack Fail");
-      m_stationManager->ReportFinalDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                               m_currentPacket->GetSize ());
-      if (!m_txFailedCallback.IsNull ())
-        {
-          m_txFailedCallback (m_currentHdr);
-        }
-      if (m_currentHdr.IsAction ())
-        {
-          WifiActionHeader actionHdr;
-          m_currentPacket->PeekHeader (actionHdr);
-          if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK)
-            {
-              uint8_t tid = GetTid (m_currentPacket, m_currentHdr);
-              if (m_baManager->ExistsAgreementInState (m_currentHdr.GetAddr1 (), tid, OriginatorBlockAckAgreement::PENDING))
-                {
-                  NS_LOG_DEBUG ("No ACK after ADDBA request");
-                  m_baManager->NotifyAgreementNoReply (m_currentHdr.GetAddr1 (), tid);
-                  Simulator::Schedule (m_failedAddBaTimeout, &QosTxop::ResetBa, this, m_currentHdr.GetAddr1 (), tid);
-                }
-            }
-        }
-      if (GetAmpduExist (m_currentHdr.GetAddr1 ()) || m_currentHdr.IsQosData ())
+      NS_LOG_DEBUG ("block ack agreement established with " << recipient << " tid " << +tid);
+      // A (destination, TID) pair is "blocked" (i.e., no more packets are sent)
+      // when an Add BA Request is sent to the destination. However, when the
+      // Add BA Request timer expires, the (destination, TID) pair is "unblocked"
+      // and packets to the destination are sent again (under normal ack policy).
+      // Thus, there may be a packet needing to be retransmitted when the
+      // Add BA Response is received. In this case, the starting sequence number
+      // shall be set equal to the sequence number of such packet.
+      uint16_t startingSeq = m_txMiddle->GetNextSeqNumberByTidAndAddress (tid, recipient);
+      WifiMacQueue::ConstIterator peekedIt = m_queue->PeekByTidAndAddress (tid, recipient);
+      if (peekedIt != m_queue->end () && (*peekedIt)->GetHeader ().IsRetry ())
         {
-          m_baManager->NotifyDiscardedMpdu (Create<const WifiMacQueueItem> (m_currentPacket, m_currentHdr));
+          startingSeq = (*peekedIt)->GetHeader ().GetSequenceNumber ();
         }
-      m_currentPacket = 0;
-      ResetCw ();
-      m_cwTrace = GetCw ();
+      m_baManager->UpdateAgreement (respHdr, recipient, startingSeq);
     }
   else
     {
-      NS_LOG_DEBUG ("Retransmit");
-      m_stationManager->ReportDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                          m_currentPacket->GetSize ());
-      m_currentHdr.SetRetry ();
-      if (m_currentHdr.IsQosData () && GetBaAgreementEstablished (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid ()))
-        {
-          // notify the BA manager that the current packet was not acknowledged
-          m_baManager->NotifyMissedAck (Create<WifiMacQueueItem> (m_currentPacket, m_currentHdr,
-                                                                  m_currentPacketTimestamp));
-          // let the BA manager handle its retransmission
-          m_currentPacket = 0;
-        }
-      UpdateFailedCw ();
-      m_cwTrace = GetCw ();
+      NS_LOG_DEBUG ("discard ADDBA response" << recipient);
+      m_baManager->NotifyAgreementRejected (recipient, tid);
+    }
+
+  if (HasFramesToTransmit () && m_access == NOT_REQUESTED)
+    {
+      m_channelAccessManager->RequestAccess (this);
     }
-  GenerateBackoff ();
-  RestartAccessIfNeeded ();
 }
 
 void
-QosTxop::MissedBlockAck (uint8_t nMpdus)
-{
-  NS_LOG_FUNCTION (this << +nMpdus);
-  /*
-   * If the BlockAck frame is lost, the originator may transmit a BlockAckReq
-   * frame to solicit an immediate BlockAck frame or it may retransmit the Data
-   * frames. (IEEE std 802.11-2016 sec. 10.24.7.7
-   */
-  uint8_t tid = GetTid (m_currentPacket, m_currentHdr);
-  if (m_useExplicitBarAfterMissedBlockAck || m_currentHdr.IsBlockAckReq ())
-    {
-      if (NeedBarRetransmission ())
-        {
-          NS_LOG_DEBUG ("Retransmit block ack request");
-          if (m_currentHdr.IsBlockAckReq ())
-            {
-              m_currentHdr.SetRetry ();
-              UpdateFailedCw ();
-              m_cwTrace = GetCw ();
-            }
-          else // missed BlockAck after data frame with Implicit BAR Ack Policy
-            {
-              Ptr<const WifiMacQueueItem> bar = PrepareBlockAckRequest (m_currentHdr.GetAddr1 (), tid);
-              ScheduleBar (bar);
-              m_currentPacket = 0;
-            }
-        }
-      else
-        {
-          NS_LOG_DEBUG ("Block Ack Request Fail");
-          // if a BA agreement exists, we can get here if there is no outstanding
-          // MPDU whose lifetime has not expired yet.
-          m_stationManager->ReportFinalDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                                   m_currentPacket->GetSize ());
-          if (m_baManager->ExistsAgreementInState (m_currentHdr.GetAddr1 (), tid,
-                                                   OriginatorBlockAckAgreement::ESTABLISHED))
-            {
-              // If there is any (expired) outstanding MPDU, request the BA manager to discard
-              // it, which involves the scheduling of a BAR to advance the recipient's window
-              if (m_baManager->GetNBufferedPackets (m_currentHdr.GetAddr1 (), tid) > 0)
-                {
-                  m_baManager->DiscardOutstandingMpdus (m_currentHdr.GetAddr1 (), tid);
-                }
-              // otherwise, it means that we have not received a BlockAck in response to a
-              // BlockAckRequest sent while no frame was outstanding, whose purpose was therefore
-              // to advance the recipient's window. Schedule a BlockAckRequest with
-              // skipIfNoDataQueued set to true, so that the BlockAckRequest is only sent
-              // if there are data frames queued for this recipient.
-              else
-                {
-                  ScheduleBar (PrepareBlockAckRequest (m_currentHdr.GetAddr1 (), tid), true);
-                }
-            }
-          //to reset the Txop.
-          m_currentPacket = 0;
-          ResetCw ();
-          m_cwTrace = GetCw ();
-        }
-    }
-  else
-    {
-      if (GetAmpduExist (m_currentHdr.GetAddr1 ()))
-        {
-          m_stationManager->ReportAmpduTxStatus (m_currentHdr.GetAddr1 (), 0, nMpdus, 0, 0, WifiTxVector ());
-        }
-      // implicit BAR and do not use BAR after missed BlockAck, hence try to retransmit data frames
-      if (!NeedDataRetransmission (m_currentPacket, m_currentHdr))
-        {
-          NS_LOG_DEBUG ("Block Ack Fail");
-          m_stationManager->ReportFinalDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                                   m_currentPacket->GetSize ());
-          if (!m_txFailedCallback.IsNull ())
-            {
-              m_txFailedCallback (m_currentHdr);
-            }
-          if (m_currentHdr.IsAction ())
-            {
-              WifiActionHeader actionHdr;
-              m_currentPacket->PeekHeader (actionHdr);
-              if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK)
-                {
-                  uint8_t tid = GetTid (m_currentPacket, m_currentHdr);
-                  if (m_baManager->ExistsAgreementInState (m_currentHdr.GetAddr1 (), tid, OriginatorBlockAckAgreement::PENDING))
-                    {
-                      NS_LOG_DEBUG ("No ACK after ADDBA request");
-                      m_baManager->NotifyAgreementNoReply (m_currentHdr.GetAddr1 (), tid);
-                      Simulator::Schedule (m_failedAddBaTimeout, &QosTxop::ResetBa, this, m_currentHdr.GetAddr1 (), tid);
-                    }
-                }
-            }
-          //to reset the Txop.
-          m_baManager->DiscardOutstandingMpdus (m_currentHdr.GetAddr1 (), GetTid (m_currentPacket, m_currentHdr));
-          m_currentPacket = 0;
-          ResetCw ();
-          m_cwTrace = GetCw ();
-        }
-      else
-        {
-          NS_LOG_DEBUG ("Retransmit");
-          m_stationManager->ReportDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr, m_currentPacket->GetSize ());
-          m_baManager->NotifyMissedBlockAck (m_currentHdr.GetAddr1 (), tid);
-          m_currentPacket = 0;
-          UpdateFailedCw ();
-          m_cwTrace = GetCw ();
-        }
-    }
-  GenerateBackoff ();
-  RestartAccessIfNeeded ();
-}
-
-void
-QosTxop::RestartAccessIfNeeded (void)
-{
-  NS_LOG_FUNCTION (this);
-
-  // check if the BA manager retransmit queue is empty, so that expired
-  // frames (if any) are removed and a BlockAckRequest is scheduled to advance
-  // the starting sequence number of the transmit (and receiver) window
-  bool baManagerHasPackets = m_baManager->HasPackets ();
-  // remove MSDUs with expired lifetime starting from the head of the queue
-  bool queueIsNotEmpty = !m_queue->IsEmpty ();
-
-  if ((m_currentPacket != 0 || baManagerHasPackets || queueIsNotEmpty)
-      && !IsAccessRequested ())
-    {
-      Ptr<const WifiMacQueueItem> item;
-      if (m_currentPacket != 0)
-        {
-          item = Create<const WifiMacQueueItem> (m_currentPacket, m_currentHdr);
-        }
-      else
-        {
-          item = PeekNextFrame ();
-        }
-      if (item != 0)
-        {
-          m_isAccessRequestedForRts = m_stationManager->NeedRts (item->GetHeader (), item->GetSize ());
-        }
-      else
-        {
-          m_isAccessRequestedForRts = false;
-        }
-      m_channelAccessManager->RequestAccess (this);
-    }
-}
-
-void
-QosTxop::StartAccessIfNeeded (void)
-{
-  NS_LOG_FUNCTION (this);
-
-  // check if the BA manager retransmit queue is empty, so that expired
-  // frames (if any) are removed and a BlockAckRequest is scheduled to advance
-  // the starting sequence number of the transmit (and receiver) window
-  bool baManagerHasPackets = m_baManager->HasPackets ();
-  // remove MSDUs with expired lifetime starting from the head of the queue
-  bool queueIsNotEmpty = !m_queue->IsEmpty ();
-
-  if (m_currentPacket == 0
-      && (baManagerHasPackets || queueIsNotEmpty)
-      && !IsAccessRequested ())
-    {
-      Ptr<const WifiMacQueueItem> item = PeekNextFrame ();
-      if (item != 0)
-        {
-          m_isAccessRequestedForRts = m_stationManager->NeedRts (item->GetHeader (), item->GetSize ());
-        }
-      else
-        {
-          m_isAccessRequestedForRts = false;
-        }
-      m_channelAccessManager->RequestAccess (this);
-    }
-}
-
-bool
-QosTxop::NeedBarRetransmission (void)
-{
-  uint8_t tid = 0;
-  if (m_currentHdr.IsQosData ())
-    {
-      tid = m_currentHdr.GetQosTid ();
-    }
-  else if (m_currentHdr.IsBlockAckReq ())
-    {
-      CtrlBAckRequestHeader baReqHdr;
-      m_currentPacket->PeekHeader (baReqHdr);
-      tid = baReqHdr.GetTidInfo ();
-    }
-  else if (m_currentHdr.IsBlockAck ())
-    {
-      CtrlBAckResponseHeader baRespHdr;
-      m_currentPacket->PeekHeader (baRespHdr);
-      tid = baRespHdr.GetTidInfo ();
-    }
-  return m_baManager->NeedBarRetransmission (tid, m_currentHdr.GetAddr1 ());
-}
-
-void
-QosTxop::StartNextPacket (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_ASSERT (GetTxopLimit ().IsStrictlyPositive () && GetTxopRemaining ().IsStrictlyPositive ());
-
-  m_currentPacket = 0;
-  // peek the next BlockAckReq, if any
-  Ptr<const WifiMacQueueItem> nextFrame = m_baManager->GetBar (false);
-
-  if (nextFrame == 0)
-    {
-      nextFrame = PeekNextFrame ();
-    }
-
-  if (nextFrame != 0)
-    {
-      MacLowTransmissionParameters params = GetTransmissionParameters (nextFrame);
-
-      if (GetTxopRemaining () >= m_low->CalculateOverallTxTime (nextFrame->GetPacket (), &nextFrame->GetHeader (), params))
-        {
-          // check if a block ack agreement needs to be established
-          m_currentHdr = nextFrame->GetHeader ();
-          m_currentPacket = nextFrame->GetPacket ();
-          if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().IsGroup ()
-              && m_stationManager->GetQosSupported (m_currentHdr.GetAddr1 ())
-              && (!m_baManager->ExistsAgreement (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid ())
-                  || m_baManager->ExistsAgreementInState (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid (), OriginatorBlockAckAgreement::RESET))
-              && SetupBlockAckIfNeeded ())
-            {
-              return;
-            }
-
-          Ptr<WifiMacQueueItem> item;
-          if (nextFrame->GetHeader ().IsBlockAckReq ())
-            {
-              item = Copy (m_baManager->GetBar ());
-            }
-          // non-group addressed QoS Data frames may be sent in MU PPDUs. Given that at this stage
-          // we do not know the bandwidth it would be given nor the selected acknowledgment
-          // sequence, we cannot determine the constraints on size and duration limit. Hence,
-          // we only peek the non-group addressed QoS Data frame. MacLow will be in charge of
-          // computing the correct limits and dequeue the frame.
-          else if (nextFrame->GetHeader ().IsQosData () && !nextFrame->GetHeader ().GetAddr1 ().IsGroup ())
-            {
-              item = Copy (nextFrame);
-            }
-          else
-            {
-              // dequeue the peeked frame
-              item = DequeuePeekedFrame (nextFrame, m_low->GetDataTxVector (nextFrame));
-            }
-
-          NS_ASSERT (item != 0);
-          NS_LOG_DEBUG ("start next packet " << *item << " within the current TXOP");
-          m_currentPacket = item->GetPacket ();
-          m_currentHdr = item->GetHeader ();
-          m_currentPacketTimestamp = item->GetTimeStamp ();
-          NS_ASSERT (m_currentPacket != 0);
-
-          m_currentParams = params;
-          m_stationManager->UpdateFragmentationThreshold ();
-          m_fragmentNumber = 0;
-          GetLow ()->StartTransmission (item, m_currentParams, this);
-          return;
-        }
-    }
-
-  // terminate TXOP because no (suitable) frame was found
-  TerminateTxop ();
-}
-
-void
-QosTxop::TerminateTxop (void)
-{
-  NS_LOG_FUNCTION (this);
-  if (GetTxopLimit ().IsStrictlyPositive ())
-    {
-      NS_LOG_DEBUG ("Terminating TXOP. Duration = " << Simulator::Now () - m_startTxop);
-    }
-  m_txopTrace (m_startTxop, Simulator::Now () - m_startTxop);
-  GenerateBackoff ();
-  RestartAccessIfNeeded ();
-}
-
-Time
-QosTxop::GetTxopRemaining (void) const
-{
-  Time remainingTxop = GetTxopLimit ();
-  remainingTxop -= (Simulator::Now () - m_startTxop);
-  if (remainingTxop.IsStrictlyNegative ())
-    {
-      remainingTxop = Seconds (0);
-    }
-  NS_LOG_FUNCTION (this << remainingTxop);
-  return remainingTxop;
-}
-
-void
-QosTxop::EndTxNoAck (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("a transmission that did not require an ACK just finished");
-  m_currentPacket = 0;
-  ResetCw ();
-  TerminateTxop ();
-}
-
-bool
-QosTxop::NeedFragmentation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  if (m_stationManager->GetVhtSupported ()
-      || m_stationManager->GetHeSupported ()
-      || GetAmpduExist (m_currentHdr.GetAddr1 ())
-      || (m_stationManager->GetHtSupported ()
-          && m_currentHdr.IsQosData ()
-          && GetBaAgreementEstablished (m_currentHdr.GetAddr1 (), GetTid (m_currentPacket, m_currentHdr))
-          && GetLow ()->GetMpduAggregator () != 0
-          && GetLow ()->GetMpduAggregator ()->GetMaxAmpduSize (m_currentHdr.GetAddr1 (), GetTid (m_currentPacket, m_currentHdr),
-                                                               WIFI_MOD_CLASS_HT) >= m_currentPacket->GetSize ()))
-    {
-      //MSDU is not fragmented when it is transmitted using an HT-immediate or
-      //HT-delayed block ack agreement or when it is carried in an A-MPDU.
-      return false;
-    }
-  bool needTxopFragmentation = false;
-  if (GetTxopLimit ().IsStrictlyPositive () && m_currentHdr.IsData ())
-    {
-      needTxopFragmentation = (GetLow ()->CalculateOverallTxTime (m_currentPacket, &m_currentHdr, m_currentParams) > GetTxopLimit ());
-    }
-  return (needTxopFragmentation || m_stationManager->NeedFragmentation (m_currentHdr.GetAddr1 (), &m_currentHdr, m_currentPacket));
-}
-
-bool
-QosTxop::IsTxopFragmentation (void) const
-{
-  if (GetTxopLimit ().IsZero ())
-    {
-      return false;
-    }
-  if (!m_stationManager->NeedFragmentation (m_currentHdr.GetAddr1 (), &m_currentHdr, m_currentPacket)
-      || (GetTxopFragmentSize () < m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,m_currentPacket, 0)))
-    {
-      return true;
-    }
-  return false;
-}
-
-uint32_t
-QosTxop::GetTxopFragmentSize (void) const
-{
-  Time txopDuration = GetTxopLimit ();
-  if (txopDuration.IsZero ())
-    {
-      return 0;
-    }
-  uint32_t maxSize = m_currentPacket->GetSize ();
-  uint32_t minSize = 0;
-  uint32_t size = 0;
-  bool found = false;
-  while (!found)
-    {
-      size = (minSize + ((maxSize - minSize) / 2));
-      if (GetLow ()->CalculateOverallTxTime (m_currentPacket, &m_currentHdr, m_currentParams, size) > txopDuration)
-        {
-          maxSize = size;
-        }
-      else
-        {
-          minSize = size;
-        }
-      if (GetLow ()->CalculateOverallTxTime (m_currentPacket, &m_currentHdr, m_currentParams, size) <= txopDuration
-          && GetLow ()->CalculateOverallTxTime (m_currentPacket, &m_currentHdr, m_currentParams, size + 1) > txopDuration)
-        {
-          found = true;
-        }
-    }
-  NS_ASSERT (size != 0);
-  return size;
-}
-
-uint32_t
-QosTxop::GetNTxopFragment (void) const
-{
-  uint32_t fragmentSize = GetTxopFragmentSize ();
-  uint32_t nFragments = (m_currentPacket->GetSize () / fragmentSize);
-  if ((m_currentPacket->GetSize () % fragmentSize) > 0)
-    {
-      nFragments++;
-    }
-  NS_LOG_DEBUG ("GetNTxopFragment returning " << nFragments);
-  return nFragments;
-}
-
-uint32_t
-QosTxop::GetTxopFragmentOffset (uint32_t fragmentNumber) const
-{
-  if (fragmentNumber == 0)
-    {
-      return 0;
-    }
-  uint32_t offset = 0;
-  uint32_t fragmentSize = GetTxopFragmentSize ();
-  uint32_t nFragments = (m_currentPacket->GetSize () / fragmentSize);
-  if ((m_currentPacket->GetSize () % fragmentSize) > 0)
-    {
-      nFragments++;
-    }
-  if (fragmentNumber < nFragments)
-    {
-      offset = (fragmentNumber * fragmentSize);
-    }
-  else
-    {
-      NS_ASSERT (false);
-    }
-  NS_LOG_DEBUG ("GetTxopFragmentOffset returning " << offset);
-  return offset;
-}
-
-uint32_t
-QosTxop::GetNextTxopFragmentSize (uint32_t fragmentNumber) const
-{
-  NS_LOG_FUNCTION (this << fragmentNumber);
-  uint32_t fragmentSize = GetTxopFragmentSize ();
-  uint32_t nFragments = GetNTxopFragment ();
-  if (fragmentNumber >= nFragments)
-    {
-      NS_LOG_DEBUG ("GetNextTxopFragmentSize returning 0");
-      return 0;
-    }
-  if (fragmentNumber == nFragments - 1)
-    {
-      fragmentSize = (m_currentPacket->GetSize () - ((nFragments - 1) * fragmentSize));
-    }
-  NS_LOG_DEBUG ("GetNextTxopFragmentSize returning " << fragmentSize);
-  return fragmentSize;
-}
-
-uint32_t
-QosTxop::GetFragmentSize (void) const
-{
-  uint32_t size;
-  if (IsTxopFragmentation ())
-    {
-      size = GetNextTxopFragmentSize (m_fragmentNumber);
-    }
-  else
-    {
-      size = m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,m_currentPacket, m_fragmentNumber);
-    }
-  return size;
-}
-
-uint32_t
-QosTxop::GetNextFragmentSize (void) const
-{
-  uint32_t size;
-  if (IsTxopFragmentation ())
-    {
-      size = GetNextTxopFragmentSize (m_fragmentNumber + 1);
-    }
-  else
-    {
-      size = m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,m_currentPacket, m_fragmentNumber + 1);
-    }
-  return size;
-}
-
-uint32_t
-QosTxop::GetFragmentOffset (void) const
-{
-  uint32_t offset;
-  if (IsTxopFragmentation ())
-    {
-      offset = GetTxopFragmentOffset (m_fragmentNumber);
-    }
-  else
-    {
-      offset = m_stationManager->GetFragmentOffset (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                                    m_currentPacket, m_fragmentNumber);
-    }
-  return offset;
-}
-
-bool
-QosTxop::IsLastFragment (void) const
-{
-  bool isLastFragment;
-  if (IsTxopFragmentation ())
-    {
-      isLastFragment = (m_fragmentNumber == GetNTxopFragment () - 1);
-    }
-  else
-    {
-      isLastFragment = m_stationManager->IsLastFragment (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                                         m_currentPacket, m_fragmentNumber);
-    }
-  return isLastFragment;
-}
-
-Ptr<Packet>
-QosTxop::GetFragmentPacket (WifiMacHeader *hdr)
-{
-  NS_LOG_FUNCTION (this << hdr);
-  *hdr = m_currentHdr;
-  hdr->SetFragmentNumber (m_fragmentNumber);
-  uint32_t startOffset = GetFragmentOffset ();
-  Ptr<Packet> fragment;
-  if (IsLastFragment ())
-    {
-      hdr->SetNoMoreFragments ();
-    }
-  else
-    {
-      hdr->SetMoreFragments ();
-    }
-  fragment = m_currentPacket->CreateFragment (startOffset,
-                                              GetFragmentSize ());
-  return fragment;
-}
-
-void
-QosTxop::SetAccessCategory (AcIndex ac)
-{
-  NS_LOG_FUNCTION (this << +ac);
-  m_ac = ac;
-}
-
-Mac48Address
-QosTxop::MapSrcAddressForAggregation (const WifiMacHeader &hdr)
-{
-  NS_LOG_FUNCTION (this << &hdr);
-  Mac48Address retval;
-  if (GetTypeOfStation () == STA || GetTypeOfStation () == ADHOC_STA)
-    {
-      retval = hdr.GetAddr2 ();
-    }
-  else
-    {
-      retval = hdr.GetAddr3 ();
-    }
-  return retval;
-}
-
-Mac48Address
-QosTxop::MapDestAddressForAggregation (const WifiMacHeader &hdr)
-{
-  NS_LOG_FUNCTION (this << &hdr);
-  Mac48Address retval;
-  if (GetTypeOfStation () == AP || GetTypeOfStation () == ADHOC_STA)
-    {
-      retval = hdr.GetAddr1 ();
-    }
-  else
-    {
-      retval = hdr.GetAddr3 ();
-    }
-  return retval;
-}
-
-void
-QosTxop::PushFront (Ptr<const Packet> packet, const WifiMacHeader &hdr)
-{
-  NS_LOG_FUNCTION (this << packet << &hdr);
-  WifiMacTrailer fcs;
-  m_queue->PushFront (Create<WifiMacQueueItem> (packet, hdr));
-  StartAccessIfNeeded ();
-}
-
-void
-QosTxop::GotAddBaResponse (const MgtAddBaResponseHeader *respHdr, Mac48Address recipient)
-{
-  NS_LOG_FUNCTION (this << respHdr << recipient);
-  uint8_t tid = respHdr->GetTid ();
-  if (respHdr->GetStatusCode ().IsSuccess ())
-    {
-      NS_LOG_DEBUG ("block ack agreement established with " << recipient);
-      // Even though a (destination, TID) pair is "blocked" (i.e., no more packets
-      // are sent) when an Add BA Request is sent to the destination,
-      // the current packet may still be non-null when the Add BA Response is received.
-      // In fact, if the Add BA Request timer expires, the (destination, TID) pair is
-      // "unblocked" and packets to the destination are sent again (under normal
-      // ack policy). Thus, there may be a packet needing to be retransmitted
-      // when the Add BA Response is received. If this is the case, let the block
-      // ack manager handle its retransmission.
-      if (m_currentPacket != 0 && m_currentHdr.IsQosData ()
-          && m_currentHdr.GetAddr1 () == recipient && m_currentHdr.GetQosTid () == tid)
-        {
-          Ptr<WifiMacQueueItem> mpdu = Create<WifiMacQueueItem> (m_currentPacket, m_currentHdr,
-                                                                 m_currentPacketTimestamp);
-          m_baManager->GetRetransmitQueue ()->Enqueue (mpdu);
-          m_currentPacket = 0;
-        }
-      m_baManager->UpdateAgreement (respHdr, recipient);
-    }
-  else
-    {
-      NS_LOG_DEBUG ("discard ADDBA response" << recipient);
-      m_baManager->NotifyAgreementRejected (recipient, tid);
-    }
-  RestartAccessIfNeeded ();
-}
-
-void
-QosTxop::GotDelBaFrame (const MgtDelBaHeader *delBaHdr, Mac48Address recipient)
+QosTxop::GotDelBaFrame (const MgtDelBaHeader *delBaHdr, Mac48Address recipient)
 {
   NS_LOG_FUNCTION (this << delBaHdr << recipient);
   NS_LOG_DEBUG ("received DELBA frame from=" << recipient);
@@ -1485,37 +671,6 @@
 }
 
 void
-QosTxop::GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address recipient, double rxSnr, double dataSnr, WifiTxVector dataTxVector)
-{
-  NS_LOG_FUNCTION (this << blockAck << recipient << rxSnr << dataSnr << dataTxVector);
-  NS_LOG_DEBUG ("got block ack from=" << recipient);
-  m_baManager->NotifyGotBlockAck (blockAck, recipient, rxSnr, dataSnr, dataTxVector);
-  if (!m_txOkCallback.IsNull ())
-    {
-      m_txOkCallback (m_currentHdr);
-    }
-  m_currentPacket = 0;
-  ResetCw ();
-}
-
-bool QosTxop::GetAmpduExist (Mac48Address dest) const
-{
-  NS_LOG_FUNCTION (this << dest);
-  auto it = m_aMpduEnabled.find (dest);
-  if (it != m_aMpduEnabled.end ())
-    {
-      return it->second;
-    }
-  return false;
-}
-
-void QosTxop::SetAmpduExist (Mac48Address dest, bool enableAmpdu)
-{
-  NS_LOG_FUNCTION (this << dest << enableAmpdu);
-  m_aMpduEnabled[dest] = enableAmpdu;
-}
-
-void
 QosTxop::CompleteMpduTx (Ptr<WifiMacQueueItem> mpdu)
 {
   NS_ASSERT (mpdu->GetHeader ().IsQosData ());
@@ -1526,35 +681,6 @@
     }
 }
 
-bool
-QosTxop::SetupBlockAckIfNeeded (void)
-{
-  NS_LOG_FUNCTION (this);
-  uint8_t tid = m_currentHdr.GetQosTid ();
-  Mac48Address recipient = m_currentHdr.GetAddr1 ();
-  uint32_t packets = m_queue->GetNPacketsByTidAndAddress (tid, recipient);
-  if ((GetBlockAckThreshold () > 0 && packets >= GetBlockAckThreshold ())
-      || (GetLow ()->GetMpduAggregator () != 0 && GetLow ()->GetMpduAggregator ()->GetMaxAmpduSize (recipient, tid, WIFI_MOD_CLASS_HT) > 0 && packets > 1)
-      || m_stationManager->GetVhtSupported ()
-      || m_stationManager->GetHeSupported ())
-    {
-      /* Block ack setup */
-      uint16_t startingSequence = m_txMiddle->GetNextSeqNumberByTidAndAddress (tid, recipient);
-      SendAddBaRequest (recipient, tid, startingSequence, m_blockAckInactivityTimeout, true);
-      return true;
-    }
-  return false;
-}
-
-void
-QosTxop::CompleteConfig (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_baManager->SetTxMiddle (m_txMiddle);
-  m_low->RegisterEdcaForAc (m_ac, this);
-  m_baManager->SetBlockAckInactivityCallback (MakeCallback (&QosTxop::SendDelbaFrame, this));
-}
-
 void
 QosTxop::SetBlockAckThreshold (uint8_t threshold)
 {
@@ -1577,102 +703,10 @@
   return m_blockAckThreshold;
 }
 
-void
-QosTxop::SendAddBaRequest (Mac48Address dest, uint8_t tid, uint16_t startSeq,
-                           uint16_t timeout, bool immediateBAck)
-{
-  NS_LOG_FUNCTION (this << dest << +tid << startSeq << timeout << immediateBAck);
-  NS_LOG_DEBUG ("sent ADDBA request to " << dest);
-  WifiMacHeader hdr;
-  hdr.SetType (WIFI_MAC_MGT_ACTION);
-  hdr.SetAddr1 (dest);
-  hdr.SetAddr2 (m_low->GetAddress ());
-  hdr.SetAddr3 (m_low->GetBssid ());
-  hdr.SetDsNotTo ();
-  hdr.SetDsNotFrom ();
-
-  WifiActionHeader actionHdr;
-  WifiActionHeader::ActionValue action;
-  action.blockAck = WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST;
-  actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
-
-  Ptr<Packet> packet = Create<Packet> ();
-  /*Setting ADDBARequest header*/
-  MgtAddBaRequestHeader reqHdr;
-  reqHdr.SetAmsduSupport (true);
-  if (immediateBAck)
-    {
-      reqHdr.SetImmediateBlockAck ();
-    }
-  else
-    {
-      reqHdr.SetDelayedBlockAck ();
-    }
-  reqHdr.SetTid (tid);
-  /* For now we don't use buffer size field in the ADDBA request frame. The recipient
-   * will choose how many packets it can receive under block ack.
-   */
-  reqHdr.SetBufferSize (0);
-  reqHdr.SetTimeout (timeout);
-  reqHdr.SetStartingSequence (startSeq);
-
-  m_baManager->CreateAgreement (&reqHdr, dest);
-
-  packet->AddHeader (reqHdr);
-  packet->AddHeader (actionHdr);
-
-  m_currentPacket = packet;
-  m_currentHdr = hdr;
-
-  uint16_t sequence = m_txMiddle->GetNextSequenceNumberFor (&m_currentHdr);
-  m_currentHdr.SetSequenceNumber (sequence);
-  m_stationManager->UpdateFragmentationThreshold ();
-  m_currentHdr.SetFragmentNumber (0);
-  m_currentHdr.SetNoMoreFragments ();
-  m_currentHdr.SetNoRetry ();
-
-  m_currentParams.EnableAck ();
-  m_currentParams.DisableRts ();
-  m_currentParams.DisableNextData ();
-
-  m_low->StartTransmission (Create<WifiMacQueueItem> (m_currentPacket, m_currentHdr), m_currentParams, this);
-}
-
-void
-QosTxop::SendDelbaFrame (Mac48Address addr, uint8_t tid, bool byOriginator)
+uint16_t
+QosTxop::GetBlockAckInactivityTimeout (void) const
 {
-  NS_LOG_FUNCTION (this << addr << +tid << byOriginator);
-  WifiMacHeader hdr;
-  hdr.SetType (WIFI_MAC_MGT_ACTION);
-  hdr.SetAddr1 (addr);
-  hdr.SetAddr2 (m_low->GetAddress ());
-  hdr.SetAddr3 (m_low->GetBssid ());
-  hdr.SetDsNotTo ();
-  hdr.SetDsNotFrom ();
-
-  MgtDelBaHeader delbaHdr;
-  delbaHdr.SetTid (tid);
-  if (byOriginator)
-    {
-      delbaHdr.SetByOriginator ();
-      m_baManager->DestroyAgreement (addr, tid);
-    }
-  else
-    {
-      delbaHdr.SetByRecipient ();
-      m_low->DestroyBlockAckAgreement (addr, tid);
-    }
-
-  WifiActionHeader actionHdr;
-  WifiActionHeader::ActionValue action;
-  action.blockAck = WifiActionHeader::BLOCK_ACK_DELBA;
-  actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
-
-  Ptr<Packet> packet = Create<Packet> ();
-  packet->AddHeader (delbaHdr);
-  packet->AddHeader (actionHdr);
-
-  PushFront (packet, hdr);
+  return m_blockAckInactivityTimeout;
 }
 
 void
@@ -1680,31 +714,10 @@
 {
   NS_LOG_FUNCTION (this);
   ResetCw ();
-  m_cwTrace = GetCw ();
   GenerateBackoff ();
 }
 
 void
-QosTxop::BaTxOk (const WifiMacHeader &hdr)
-{
-  NS_LOG_FUNCTION (this << hdr);
-  if (!m_txOkCallback.IsNull ())
-    {
-      m_txOkCallback (m_currentHdr);
-    }
-}
-
-void
-QosTxop::BaTxFailed (const WifiMacHeader &hdr)
-{
-  NS_LOG_FUNCTION (this << hdr);
-  if (!m_txFailedCallback.IsNull ())
-    {
-      m_txFailedCallback (m_currentHdr);
-    }
-}
-
-void
 QosTxop::AddBaResponseTimeout (Mac48Address recipient, uint8_t tid)
 {
   NS_LOG_FUNCTION (this << recipient << +tid);
@@ -1714,7 +727,10 @@
       m_baManager->NotifyAgreementNoReply (recipient, tid);
       Simulator::Schedule (m_failedAddBaTimeout, &QosTxop::ResetBa, this, recipient, tid);
       GenerateBackoff ();
-      RestartAccessIfNeeded ();
+      if (HasFramesToTransmit () && m_access == NOT_REQUESTED)
+        {
+          m_channelAccessManager->RequestAccess (this);
+        }
     }
 }
 
@@ -1765,4 +781,10 @@
   return true;
 }
 
+AcIndex
+QosTxop::GetAccessCategory (void) const
+{
+  return m_ac;
+}
+
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/qos-txop.h ns-3.34/src/wifi/model/qos-txop.h
--- ns-3.33/src/wifi/model/qos-txop.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/qos-txop.h	2021-07-14 10:31:07.000000000 -0700
@@ -28,10 +28,6 @@
 #include "txop.h"
 #include "qos-utils.h"
 
-class AmpduAggregationTest;
-class TwoLevelAggregationTest;
-class HeAggregationTest;
-
 namespace ns3 {
 
 class QosBlockedDestinations;
@@ -39,22 +35,8 @@
 class MgtDelBaHeader;
 class AggregationCapableTransmissionListener;
 class WifiTxVector;
-class WifiAckPolicySelector;
-
-/**
- * Enumeration for type of station
- */
-enum TypeOfStation
-{
-  STA,
-  AP,
-  ADHOC_STA,
-  MESH,
-  HT_STA,
-  HT_AP,
-  HT_ADHOC_STA,
-  OCB
-};
+class QosFrameExchangeManager;
+class WifiTxParameters;
 
 /**
  * \brief Handle packet fragmentation and retransmissions for QoS data frames as well
@@ -92,15 +74,6 @@
 class QosTxop : public Txop
 {
 public:
-  /// allow AmpduAggregationTest class access
-  friend class ::AmpduAggregationTest;
-  /// allow TwoLevelAggregationTest class access
-  friend class ::TwoLevelAggregationTest;
-  /// allow HeAggregationTest class access
-  friend class ::HeAggregationTest;
-
-  std::map<Mac48Address, bool> m_aMpduEnabled; //!< list containing flags whether A-MPDU is enabled for a given destination address
-
   /**
    * \brief Get the type ID.
    * \return the object TypeId
@@ -110,50 +83,35 @@
   QosTxop ();
   virtual ~QosTxop ();
 
-  // Overridden from Txop
-  bool IsQosTxop (void) const;
-  void SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> remoteManager);
-  virtual bool HasFramesToTransmit (void);
-  void NotifyAccessGranted (void);
-  void NotifyInternalCollision (void);
-  void GotAck (void);
-  void GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address recipient,
-                    double rxSnr, double dataSnr, WifiTxVector dataTxVector);
-  void MissedBlockAck (uint8_t nMpdus);
-  void MissedAck (void);
-  void StartNextPacket (void);
-  void EndTxNoAck (void);
-  void RestartAccessIfNeeded (void);
-  void StartAccessIfNeeded (void);
-  Time GetTxopRemaining (void) const;
-  bool NeedFragmentation (void) const;
-  Ptr<Packet> GetFragmentPacket (WifiMacHeader *hdr);
+  bool IsQosTxop (void) const override;
+  AcIndex GetAccessCategory (void) const override;
+  void SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> remoteManager) override;
+  bool HasFramesToTransmit (void) override;
+  void NotifyInternalCollision (void) override;
+  void NotifyChannelAccessed (Time txopDuration) override;
+  void NotifyChannelReleased (void) override;
+  void SetDroppedMpduCallback (DroppedMpdu callback) override;
 
   /**
-   * Set the ack policy selector.
+   * Set the Frame Exchange Manager associated with this QoS STA.
    *
-   * \param ackSelector the ack policy selector.
+   * \param qosFem the associated QoS Frame Exchange Manager.
    */
-  void SetAckPolicySelector (Ptr<WifiAckPolicySelector> ackSelector);
-  /**
-   * Return the ack policy selector.
-   *
-   * \return the ack policy selector.
-   */
-  Ptr<WifiAckPolicySelector> GetAckPolicySelector (void) const;
+  void SetQosFrameExchangeManager (const Ptr<QosFrameExchangeManager> qosFem);
+
   /**
-   * Set type of station with the given type.
+   * Return true if an explicit BlockAckRequest is sent after a missed BlockAck
    *
-   * \param type the type of station.
+   * \return true if an explicit BlockAckRequest is sent after a missed BlockAck
    */
-  void SetTypeOfStation (TypeOfStation type);
+  bool UseExplicitBarAfterMissedBlockAck (void) const;
+
   /**
-   * Return type of station.
+   * Get the Block Ack Manager associated with this QosTxop.
    *
-   * \return type of station.
+   * \returns the Block Ack Manager
    */
-  TypeOfStation GetTypeOfStation (void) const;
-
+  Ptr<BlockAckManager> GetBaManager (void);
   /**
    * \param address recipient address of the peer station
    * \param tid traffic ID.
@@ -186,9 +144,28 @@
    */
   uint16_t GetBaStartingSequence (Mac48Address address, uint8_t tid) const;
   /**
-   * \param address recipient address
+   * \param recipient MAC address of recipient
    * \param tid traffic ID
    *
+   * \return the type of Block Ack Requests sent to the recipient
+   *
+   * This function returns the type of Block Ack Requests sent to the recipient.
+   */
+  BlockAckReqType GetBlockAckReqType (Mac48Address recipient, uint8_t tid) const;
+  /**
+   * \param recipient MAC address
+   * \param tid traffic ID
+   *
+   * \return the type of Block Acks sent by the recipient
+   *
+   * This function returns the type of Block Acks sent by the recipient.
+   */
+  BlockAckType GetBlockAckType (Mac48Address recipient, uint8_t tid) const;
+  /**
+   * \param recipient Address of recipient.
+   * \param tid traffic ID.
+   * \return the BlockAckRequest to send
+   *
    * Prepare a BlockAckRequest to be sent to <i>recipient</i> for Traffic ID
    * <i>tid</i>. The header for the BlockAckRequest is requested to the QosTxop
    * corresponding to the given TID. A block ack agreement with the given recipient
@@ -206,13 +183,6 @@
 
   /* Event handlers */
   /**
-   * Event handler when a CTS timeout has occurred.
-   *
-   * \param mpduList the list of MPDUs that were not transmitted
-   */
-  void NotifyMissedCts (std::list<Ptr<WifiMacQueueItem>> mpduList);
-
-  /**
    * Event handler when an ADDBA response is received.
    *
    * \param respHdr ADDBA response header.
@@ -226,14 +196,20 @@
    * \param recipient address of the recipient.
    */
   void GotDelBaFrame (const MgtDelBaHeader *delBaHdr, Mac48Address recipient);
-
   /**
-   * Check if BlockAckRequest should be re-transmitted.
+   * Callback when ADDBA response is not received after timeout.
+   *
+   * \param recipient MAC address of recipient
+   * \param tid traffic ID
+   */
+  void AddBaResponseTimeout (Mac48Address recipient, uint8_t tid);
+  /**
+   * Reset BA agreement after BA negotiation failed.
    *
-   * \return true if BAR should be re-transmitted,
-   *         false otherwise.
+   * \param recipient MAC address of recipient
+   * \param tid traffic ID
    */
-  bool NeedBarRetransmission (void);
+  void ResetBa (Mac48Address recipient, uint8_t tid);
 
   /**
    * Set the access category of this EDCAF.
@@ -252,11 +228,6 @@
   void PushFront (Ptr<const Packet> packet, const WifiMacHeader &hdr);
 
   /**
-   * Complete block ack configuration.
-   */
-  void CompleteConfig (void);
-
-  /**
    * Set threshold for block ack mechanism. If number of packets in the
    * queue reaches the threshold, block ack mechanism is used.
    *
@@ -277,14 +248,11 @@
    */
   void SetBlockAckInactivityTimeout (uint16_t timeout);
   /**
-   * Sends DELBA frame to cancel a block ack agreement with STA
-   * addressed by <i>addr</i> for TID <i>tid</i>.
+   * Get the BlockAck inactivity timeout.
    *
-   * \param addr address of the recipient.
-   * \param tid traffic ID.
-   * \param byOriginator flag to indicate whether this is set by the originator.
+   * \return the BlockAck inactivity timeout.
    */
-  void SendDelbaFrame (Mac48Address addr, uint8_t tid, bool byOriginator);
+  uint16_t GetBlockAckInactivityTimeout (void) const;
   /**
    * Stores an MPDU (part of an A-MPDU) in block ack agreement (i.e. the sender is waiting
    * for a BlockAck containing the sequence number of this MPDU).
@@ -293,20 +261,6 @@
    */
   void CompleteMpduTx (Ptr<WifiMacQueueItem> mpdu);
   /**
-   * Return whether A-MPDU is used to transmit data to a peer station.
-   *
-   * \param dest address of peer station
-   * \returns true if A-MPDU is used by the peer station
-   */
-  bool GetAmpduExist (Mac48Address dest) const;
-  /**
-   * Set indication whether A-MPDU is used to transmit data to a peer station.
-   *
-   * \param dest address of peer station.
-   * \param enableAmpdu flag whether A-MPDU is used or not.
-   */
-  void SetAmpduExist (Mac48Address dest, bool enableAmpdu);
-  /**
    * Set the timeout to wait for ADDBA response.
    *
    * \param addBaResponseTimeout the timeout to wait for ADDBA response
@@ -361,116 +315,89 @@
    * \param recipient the receiver station address.
    * \returns the peeked frame.
    */
-  Ptr<const WifiMacQueueItem> PeekNextFrame (uint8_t tid = 8, Mac48Address recipient = Mac48Address::GetBroadcast ());
+  Ptr<const WifiMacQueueItem> PeekNextMpdu (uint8_t tid = 8,
+                                            Mac48Address recipient = Mac48Address::GetBroadcast ());
   /**
-   * Dequeue the frame that has been previously peeked by calling PeekNextFrame.
-   * If the peeked frame is a QoS Data frame, it is actually dequeued if it meets
-   * the constraint on the maximum A-MPDU size (by assuming that the frame has to
-   * be aggregated to an existing A-MPDU of the given size) and its transmission
-   * time does not exceed the given PPDU duration limit (if distinct from Time::Min ()).
-   * If the peeked frame is a unicast QoS Data frame stored in the EDCA queue,
-   * attempt to perform A-MSDU aggregation (while meeting the constraints mentioned
-   * above) if <i>aggregate</i> is true and assign a sequence number to the
-   * dequeued frame.
+   * Peek the next frame to transmit to the given receiver and of the given
+   * TID from the block ack manager retransmit queue first and, if not found, from
+   * the EDCA queue. If <i>tid</i> is equal to 8 (invalid value) and <i>recipient</i>
+   * is the broadcast address, the first available frame is returned.
+   * Note that A-MSDU aggregation is never attempted (this is relevant if the
+   * frame is peeked from the EDCA queue). If the frame is peeked from the EDCA
+   * queue, it is assigned a sequence number peeked from MacTxMiddle.
    *
-   * \param peekedItem the peeked frame.
-   * \param txVector the TX vector used to transmit the peeked frame
-   * \param aggregate whether to attempt A-MSDU aggregation
-   * \param ampduSize the size of the existing A-MPDU in bytes, if any
-   * \param ppduDurationLimit the limit on the PPDU duration
-   * \returns the dequeued frame.
+   * \param queueIt the QueueIteratorPair pointing to the queue item from which the
+   *                search for an MPDU starts, if the QueueIteratorPair is valid
+   * \param tid traffic ID.
+   * \param recipient the receiver station address.
+   * \returns the peeked frame.
    */
-  Ptr<WifiMacQueueItem> DequeuePeekedFrame (Ptr<const WifiMacQueueItem> peekedItem, WifiTxVector txVector,
-                                            bool aggregate = true, uint32_t ampduSize = 0,
-                                            Time ppduDurationLimit = Time::Min ());
-  /**
-   * Compute the MacLow transmission parameters for the given frame. Allowed frames
-   * are those handled by a QosTxop (QoS data frames, BlockAckReq frames, ADDBA
-   * Request/Response, DELBA Request).
+  Ptr<const WifiMacQueueItem> PeekNextMpdu (WifiMacQueueItem::QueueIteratorPair queueIt,
+                                            uint8_t tid = 8,
+                                            Mac48Address recipient = Mac48Address::GetBroadcast ());
+  /**
+   * Prepare the frame to transmit starting from the MPDU that has been previously
+   * peeked by calling PeekNextMpdu. A frame is only returned if it meets the
+   * constraint on the maximum A-MPDU size (by assuming that the frame has to be
+   * aggregated to an existing A-MPDU as specified by the TX parameters) and its
+   * transmission time does not exceed the given PPDU duration limit (if distinct from
+   *  Time::Min ()). If the peeked MPDU is a unicast QoS Data frame stored in the EDCA queue,
+   * attempt to perform A-MSDU aggregation (while meeting the constraints mentioned
+   * above) and assign a sequence number to the dequeued frame.
    *
-   * \param frame the given frame
-   * \return the MacLow transmission parameters.
+   * \param peekedItem the peeked frame.
+   * \param txParams the TX parameters for the frame
+   * \param availableTime the time available for the transmission of the frame
+                          (including protection and acknowledgment); a value of
+   *                      Time::Min() indicates no time constraint
+   * \param initialFrame true if the frame is the initial PPDU of a TXOP
+   * \param[out] queueIt a QueueIteratorPair pointing to the queue item following the
+   *                     last item used to prepare the returned MPDU, if any; if no MPDU
+   *                     is returned, its value is unchanged
+   * \return the frame to transmit or a null pointer if no frame meets the time constraints
    */
-  MacLowTransmissionParameters GetTransmissionParameters (Ptr<const WifiMacQueueItem> frame) const;
+  Ptr<WifiMacQueueItem> GetNextMpdu (Ptr<const WifiMacQueueItem> peekedItem, WifiTxParameters& txParams,
+                                     Time availableTime, bool initialFrame,
+                                     WifiMacQueueItem::QueueIteratorPair& queueIt);
 
   /**
-   * Update the current packet this QosTxop is trying to transmit. This method
-   * is typically called by MacLow when it changes (i.e., by performing A-MSDU
-   * aggregation) the packet received from this QosTxop.
-   *
-   * \param mpdu the MPDU that MacLow is forwarding down to the PHY.
-   */
-  void UpdateCurrentPacket (Ptr<WifiMacQueueItem> mpdu);
-  /**
-   * The packet we sent was successfully received by the receiver.
+   * Assign a sequence number to the given MPDU, if it is not a fragment
+   * and it is not a retransmitted frame.
    *
-   * \param hdr the header of the packet that we successfully sent.
+   * \param mpdu the MPDU
    */
-  void BaTxOk (const WifiMacHeader &hdr);
+  void AssignSequenceNumber (Ptr<WifiMacQueueItem> mpdu) const;
+
   /**
-   * The packet we sent was successfully received by the receiver.
+   * Set the Queue Size subfield of the QoS Control field of the given QoS data frame.
    *
-   * \param hdr the header of the packet that we failed to sent.
+   * \param mpdu the given QoS data frame
    */
-  void BaTxFailed (const WifiMacHeader &hdr);
+  void SetQosQueueSize (Ptr<WifiMacQueueItem> mpdu);
 
   /**
-   * This functions are used only to correctly set source address in A-MSDU subframes.
-   * If aggregating STA is a non-AP STA (in an infrastructure network):
-   *   SA = Address2
-   * If aggregating STA is an AP
-   *   SA = Address3
+   * Return true if a TXOP has started.
    *
-   * \param hdr Wi-Fi header
-   * \return Mac48Address
+   * \return true if a TXOP has started, false otherwise.
    */
-  Mac48Address MapSrcAddressForAggregation (const WifiMacHeader &hdr);
+  virtual bool IsTxopStarted (void) const;
   /**
-   * This functions are used only to correctly set destination address in A-MSDU subframes.
-   * If aggregating STA is a non-AP STA (in an infrastructure network):
-   *   DA = Address3
-   * If aggregating STA is an AP
-   *   DA = Address1
+   * Return the remaining duration in the current TXOP.
    *
-   * \param hdr Wi-Fi header
-   * \return Mac48Address
+   * \return the remaining duration in the current TXOP.
    */
-  Mac48Address MapDestAddressForAggregation (const WifiMacHeader &hdr);
+  virtual Time GetRemainingTxop (void) const;
 
+protected:
+  void DoDispose (void) override;
 
 private:
   /// allow AggregationCapableTransmissionListener class access
   friend class AggregationCapableTransmissionListener;
 
-  // Overridden from Txop
-  void DoDispose (void);
-  void DoInitialize (void);
-  void TerminateTxop (void);
-  uint32_t GetNextFragmentSize (void) const;
-  uint32_t GetFragmentSize (void) const;
-  uint32_t GetFragmentOffset (void) const;
-  bool IsLastFragment (void) const;
+  void DoInitialize (void) override;
 
   /**
-   * If number of packets in the queue reaches m_blockAckThreshold value, an ADDBA Request frame
-   * is sent to destination in order to setup a block ack.
-   *
-   * \return true if we tried to set up block ack, false otherwise.
-   */
-  bool SetupBlockAckIfNeeded (void);
-  /**
-   * Sends an ADDBA Request to establish a block ack agreement with STA
-   * addressed by <i>recipient</i> for TID <i>tid</i>.
-   *
-   * \param recipient address of the recipient.
-   * \param tid traffic ID.
-   * \param startSeq starting sequence.
-   * \param timeout timeout value.
-   * \param immediateBAck flag to indicate whether immediate BlockAck is used.
-   */
-  void SendAddBaRequest (Mac48Address recipient, uint8_t tid, uint16_t startSeq,
-                         uint16_t timeout, bool immediateBAck);
-  /**
    * Check if the given MPDU is to be considered old according to the current
    * starting sequence number of the transmit window, provided that a block ack
    * agreement has been established with the recipient for the given TID.
@@ -480,68 +407,17 @@
    */
   bool IsQosOldPacket (Ptr<const WifiMacQueueItem> mpdu);
 
-  /**
-   * Check if the current packet is fragmented because of an exceeded TXOP duration.
-   *
-   * \return true if the current packet is fragmented because of an exceeded TXOP duration,
-   *         false otherwise
-   */
-  bool IsTxopFragmentation (void) const;
-  /**
-   * Calculate the size of the current TXOP fragment.
-   *
-   * \return the size of the current TXOP fragment in bytes
-   */
-  uint32_t GetTxopFragmentSize (void) const;
-  /**
-   * Calculate the number of TXOP fragments needed for the transmission of the current packet.
-   *
-   * \return the number of TXOP fragments needed for the transmission of the current packet
-   */
-  uint32_t GetNTxopFragment (void) const;
-  /**
-   * Calculate the size of the next TXOP fragment.
-   *
-   * \param fragmentNumber number of the next fragment
-   * \returns the next TXOP fragment size in bytes
-   */
-  uint32_t GetNextTxopFragmentSize (uint32_t fragmentNumber) const;
-  /**
-   * Calculate the offset for the fragment.
-   *
-   * \param fragmentNumber number of the fragment
-   * \returns the TXOP fragment offset in bytes
-   */
-  uint32_t GetTxopFragmentOffset (uint32_t fragmentNumber) const;
-  /**
-   * Callback when ADDBA response is not received after timeout.
-   *
-   * \param recipient MAC address of recipient
-   * \param tid traffic ID
-   */
-  void AddBaResponseTimeout (Mac48Address recipient, uint8_t tid);
-  /**
-   * Reset BA agreement after BA negotiation failed.
-   *
-   * \param recipient MAC address of recipient
-   * \param tid traffic ID
-   */
-  void ResetBa (Mac48Address recipient, uint8_t tid);
-
   AcIndex m_ac;                                         //!< the access category
-  TypeOfStation m_typeOfStation;                        //!< the type of station
-  Ptr<WifiAckPolicySelector> m_ackPolicySelector;       //!< the ack policy selector
+  Ptr<QosFrameExchangeManager> m_qosFem;                //!< the QoS Frame Exchange Manager
   Ptr<QosBlockedDestinations> m_qosBlockedDestinations; //!< the QoS blocked destinations
   Ptr<BlockAckManager> m_baManager;                     //!< the block ack manager
   uint8_t m_blockAckThreshold;                          /**< the block ack threshold (use BA mechanism if number of packets in queue reaches
                                                              this value. If this value is 0, block ack is never used. When A-MPDU is enabled,
                                                              block ack mechanism is used regardless of this value) */
-  BlockAckType m_blockAckType;                          //!< the BlockAck type
   Time m_currentPacketTimestamp;                        //!< the current packet timestamp
   uint16_t m_blockAckInactivityTimeout;                 //!< the BlockAck inactivity timeout value (in TUs, i.e. blocks of 1024 microseconds)
   Time m_startTxop;                                     //!< the start TXOP time
-  bool m_isAccessRequestedForRts;                       //!< flag whether access is requested to transmit a RTS frame
-  bool m_currentIsFragmented;                           //!< flag whether current packet is fragmented
+  Time m_txopDuration;                                  //!< the duration of a TXOP
   Time m_addBaResponseTimeout;                          //!< timeout for ADDBA response
   Time m_failedAddBaTimeout;                            //!< timeout after failed BA agreement
   bool m_useExplicitBarAfterMissedBlockAck;             //!< flag whether explicit BlockAckRequest should be sent upon missed BlockAck Response
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/qos-utils.cc ns-3.34/src/wifi/model/qos-utils.cc
--- ns-3.33/src/wifi/model/qos-utils.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/qos-utils.cc	2021-07-14 10:31:07.000000000 -0700
@@ -28,6 +28,100 @@
 
 namespace ns3 {
 
+std::size_t
+WifiAddressTidHash::operator()(const WifiAddressTidPair& addressTidPair) const
+{
+  uint8_t buffer[7];
+  addressTidPair.first.CopyTo (buffer);
+  buffer[6] = addressTidPair.second;
+
+  std::string s (buffer, buffer + 7);
+  return std::hash<std::string>{} (s);
+}
+
+std::size_t
+WifiAddressHash::operator()(const Mac48Address& address) const
+{
+  uint8_t buffer[6];
+  address.CopyTo (buffer);
+
+  std::string s (buffer, buffer + 6);
+  return std::hash<std::string>{} (s);
+}
+
+WifiAc::WifiAc (uint8_t lowTid, uint8_t highTid)
+  : m_lowTid (lowTid),
+    m_highTid (highTid)
+{
+}
+
+uint8_t
+WifiAc::GetLowTid (void) const
+{
+  return m_lowTid;
+}
+
+uint8_t
+WifiAc::GetHighTid (void) const
+{
+  return m_highTid;
+}
+
+uint8_t
+WifiAc::GetOtherTid (uint8_t tid) const
+{
+  if (tid == m_lowTid)
+    {
+      return m_highTid;
+    }
+  if (tid == m_highTid)
+    {
+      return m_lowTid;
+    }
+  NS_ABORT_MSG ("TID " << tid << " does not belong to this AC");
+}
+
+bool operator> (enum AcIndex left, enum AcIndex right)
+{
+  NS_ABORT_MSG_IF (left > 3 || right > 3, "Cannot compare non-QoS ACs");
+
+  if (left == right)
+    {
+      return false;
+    }
+  if (left == AC_BK)
+    {
+      return false;
+    }
+  if (right == AC_BK)
+    {
+      return true;
+    }
+  return static_cast<uint8_t> (left) > static_cast<uint8_t> (right);
+}
+
+bool operator>= (enum AcIndex left, enum AcIndex right)
+{
+  NS_ABORT_MSG_IF (left > 3 || right > 3, "Cannot compare non-QoS ACs");
+
+  return (left == right || left > right);
+}
+
+bool operator< (enum AcIndex left, enum AcIndex right)
+{
+  return !(left >= right);
+}
+
+bool operator<= (enum AcIndex left, enum AcIndex right)
+{
+  return !(left > right);
+}
+
+const std::map<AcIndex, WifiAc> wifiAcList = { {AC_BE, {0, 3}},
+                                               {AC_BK, {1, 2}},
+                                               {AC_VI, {4, 5}},
+                                               {AC_VO, {6, 7}} };
+
 AcIndex
 QosUtilsMapTidToAc (uint8_t tid)
 {
@@ -89,12 +183,6 @@
   return (distance >= 2048);
 }
 
-/**
- *  \brief Extraction operator for TypeId
- *  \param [in] packet is the packet
- *  \param [in] hdr is Wifi MAC header
- *  \returns the TypeId of the MAC header
- */
 uint8_t
 GetTid (Ptr<const Packet> packet, const WifiMacHeader hdr)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/qos-utils.h ns-3.34/src/wifi/model/qos-utils.h
--- ns-3.33/src/wifi/model/qos-utils.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/qos-utils.h	2021-07-14 10:31:07.000000000 -0700
@@ -22,12 +22,44 @@
 #define QOS_UTILS_H
 
 #include "ns3/ptr.h"
+#include <map>
 
 namespace ns3 {
 
 class Packet;
 class WifiMacHeader;
 class QueueItem;
+class Mac48Address;
+
+typedef std::pair<Mac48Address, uint8_t> WifiAddressTidPair;  //!< (MAC address, TID) pair
+
+/**
+ * Function object to compute the hash of a (MAC address, TID) pair
+ */
+struct WifiAddressTidHash
+{
+  /**
+   * Functional operator for (MAC address, TID) hash computation.
+   *
+   * \param addressTidPair the (MAC address, TID) pair
+   * \return the hash
+   */
+  std::size_t operator() (const WifiAddressTidPair& addressTidPair) const;
+};
+
+/**
+ * Function object to compute the hash of a MAC address
+ */
+struct WifiAddressHash
+{
+  /**
+   * Functional operator for MAC address hash computation.
+   *
+   * \param address the MAC address
+   * \return the hash
+   */
+  std::size_t operator() (const Mac48Address& address) const;
+};
 
 /**
  * \ingroup wifi
@@ -35,7 +67,7 @@
  * with values corresponding to the AC index (ACI) values specified
  * (Table 8-104 "ACI-to-AC coding"; IEEE 802.11-2012).
  */
-enum AcIndex
+enum AcIndex : uint8_t
 {
   /** Best Effort */
   AC_BE = 0,
@@ -52,6 +84,95 @@
 
 /**
  * \ingroup wifi
+ * This class stores the pair of TIDs of an Access Category.
+ */
+class WifiAc
+{
+public:
+  /**
+   * Constructor.
+   *
+   * \param lowTid the TID with lower priority
+   * \param highTid the TID with higher priority
+   */
+  WifiAc (uint8_t lowTid, uint8_t highTid);
+  /**
+   * Get the TID with lower priority
+   *
+   * \return the TID with lower priority
+   */
+  uint8_t GetLowTid (void) const;
+  /**
+   * Get the TID with higher priority
+   *
+   * \return the TID with higher priority
+   */
+  uint8_t GetHighTid (void) const;
+  /**
+   * Given a TID belonging to this Access Category, get the other TID of this AC.
+   *
+   * \param tid a TID belonging to this AC
+   * \return the other TID belonging to this AC
+   */
+  uint8_t GetOtherTid (uint8_t tid) const;
+
+private:
+  uint8_t m_lowTid;      //!< the TID with lower priority
+  uint8_t m_highTid;     //!< the TID with higher priority
+};
+
+/**
+ * \ingroup wifi
+ * Operator> overload returning true if the AC on the left has higher priority
+ * than the AC on the right.
+ *
+ * \param left the AC on the left of operator>
+ * \param right the AC on the right of operator>
+ * \return true if the AC on the left has higher priority than the AC on the right
+ */
+bool operator> (enum AcIndex left, enum AcIndex right);
+
+/**
+ * \ingroup wifi
+ * Operator>= overload returning true if the AC on the left has higher or the same
+ * priority than the AC on the right.
+ *
+ * \param left the AC on the left of operator>=
+ * \param right the AC on the right of operator>=
+ * \return true if the AC on the left has higher or the same priority than the AC on the right
+ */
+bool operator>= (enum AcIndex left, enum AcIndex right);
+
+/**
+ * \ingroup wifi
+ * Operator< overload returning true if the AC on the left has lower priority
+ * than the AC on the right.
+ *
+ * \param left the AC on the left of operator<
+ * \param right the AC on the right of operator<
+ * \return true if the AC on the left has lower priority than the AC on the right
+ */
+bool operator< (enum AcIndex left, enum AcIndex right);
+
+/**
+ * \ingroup wifi
+ * Operator<= overload returning true if the AC on the left has lower or the same
+ * priority than the AC on the right.
+ *
+ * \param left the AC on the left of operator<=
+ * \param right the AC on the right of operator<=
+ * \return true if the AC on the left has lower or the same priority than the AC on the right
+ */
+bool operator<= (enum AcIndex left, enum AcIndex right);
+
+/**
+ * Map containing the four ACs in increasing order of priority (according to
+ * Table 10-1 "UP-to-AC Mappings" of 802.11-2016)
+ */
+extern const std::map<AcIndex, WifiAc> wifiAcList;
+
+/**
+ * \ingroup wifi
  * Maps TID (Traffic ID) to Access classes.
  * For more details see (Table 9-1 "UP-to-AC mapping"; IEEE 802.11-2012).
  *
@@ -126,12 +247,11 @@
 
 /**
  * \ingroup wifi
- * Next function is useful to get traffic id of different packet types.
+ * This function is useful to get traffic id of different packet types.
  *
  * \param packet packet to check
  * \param hdr 802.11 header for packet to check
- *
- * Returns TID of different packet types
+ * \return the TID of different packet types
  */
 uint8_t GetTid (Ptr<const Packet> packet, const WifiMacHeader hdr);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/aarfcd-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/aarfcd-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/aarfcd-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/aarfcd-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,421 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2004,2005,2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Federico Maguolo <maguolof@dei.unipd.it>
+ */
+
+#include "ns3/log.h"
+#include "ns3/packet.h"
+#include "aarfcd-wifi-manager.h"
+#include "ns3/wifi-tx-vector.h"
+
+#define Min(a,b) ((a < b) ? a : b)
+#define Max(a,b) ((a > b) ? a : b)
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("AarfcdWifiManager");
+
+/**
+ * \brief hold per-remote-station state for AARF-CD Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the AARF-CD Wifi manager
+ */
+struct AarfcdWifiRemoteStation : public WifiRemoteStation
+{
+  uint32_t m_timer; ///< timer
+  uint32_t m_success; ///< success
+  uint32_t m_failed; ///< failed
+  bool m_recovery; ///< recovery
+  bool m_justModifyRate; ///< just modify rate
+  uint32_t m_successThreshold; ///< success threshold
+  uint32_t m_timerTimeout; ///< timer timeout
+  uint8_t m_rate; ///< rate
+  bool m_rtsOn; ///< RTS on
+  uint32_t m_rtsWnd; ///< RTS window
+  uint32_t m_rtsCounter; ///< RTS counter
+  bool m_haveASuccess; ///< have a success
+};
+
+NS_OBJECT_ENSURE_REGISTERED (AarfcdWifiManager);
+
+TypeId
+AarfcdWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::AarfcdWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<AarfcdWifiManager> ()
+    .AddAttribute ("SuccessK", "Multiplication factor for the success threshold in the AARF algorithm.",
+                   DoubleValue (2.0),
+                   MakeDoubleAccessor (&AarfcdWifiManager::m_successK),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("TimerK",
+                   "Multiplication factor for the timer threshold in the AARF algorithm.",
+                   DoubleValue (2.0),
+                   MakeDoubleAccessor (&AarfcdWifiManager::m_timerK),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("MaxSuccessThreshold",
+                   "Maximum value of the success threshold in the AARF algorithm.",
+                   UintegerValue (60),
+                   MakeUintegerAccessor (&AarfcdWifiManager::m_maxSuccessThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("MinTimerThreshold",
+                   "The minimum value for the 'timer' threshold in the AARF algorithm.",
+                   UintegerValue (15),
+                   MakeUintegerAccessor (&AarfcdWifiManager::m_minTimerThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("MinSuccessThreshold",
+                   "The minimum value for the success threshold in the AARF algorithm.",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&AarfcdWifiManager::m_minSuccessThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("MinRtsWnd",
+                   "Minimum value for RTS window of AARF-CD",
+                   UintegerValue (1),
+                   MakeUintegerAccessor (&AarfcdWifiManager::m_minRtsWnd),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("MaxRtsWnd",
+                   "Maximum value for RTS window of AARF-CD",
+                   UintegerValue (40),
+                   MakeUintegerAccessor (&AarfcdWifiManager::m_maxRtsWnd),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("TurnOffRtsAfterRateDecrease",
+                   "If true the RTS mechanism will be turned off when the rate will be decreased",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&AarfcdWifiManager::m_turnOffRtsAfterRateDecrease),
+                   MakeBooleanChecker ())
+    .AddAttribute ("TurnOnRtsAfterRateIncrease",
+                   "If true the RTS mechanism will be turned on when the rate will be increased",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&AarfcdWifiManager::m_turnOnRtsAfterRateIncrease),
+                   MakeBooleanChecker ())
+    .AddTraceSource ("Rate",
+                     "Traced value for rate changes (b/s)",
+                     MakeTraceSourceAccessor (&AarfcdWifiManager::m_currentRate),
+                     "ns3::TracedValueCallback::Uint64")
+  ;
+  return tid;
+}
+
+AarfcdWifiManager::AarfcdWifiManager ()
+  : WifiRemoteStationManager (),
+    m_currentRate (0)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+AarfcdWifiManager::~AarfcdWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+AarfcdWifiManager::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  if (GetHtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
+    }
+  if (GetVhtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
+    }
+  if (GetHeSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
+    }
+}
+
+WifiRemoteStation *
+AarfcdWifiManager::DoCreateStation (void) const
+{
+  NS_LOG_FUNCTION (this);
+  AarfcdWifiRemoteStation *station = new AarfcdWifiRemoteStation ();
+
+  //AARF fields below
+  station->m_successThreshold = m_minSuccessThreshold;
+  station->m_timerTimeout = m_minTimerThreshold;
+  station->m_rate = 0;
+  station->m_success = 0;
+  station->m_failed = 0;
+  station->m_recovery = false;
+  station->m_timer = 0;
+
+  //AARF-CD specific fields below
+  station->m_rtsOn = false;
+  station->m_rtsWnd = m_minRtsWnd;
+  station->m_rtsCounter = 0;
+  station->m_justModifyRate = true;
+  station->m_haveASuccess = false;
+
+  return station;
+}
+
+void
+AarfcdWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+AarfcdWifiManager::DoReportDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
+  station->m_timer++;
+  station->m_failed++;
+  station->m_success = 0;
+
+  if (!station->m_rtsOn)
+    {
+      TurnOnRts (station);
+      if (!station->m_justModifyRate && !station->m_haveASuccess)
+        {
+          IncreaseRtsWnd (station);
+        }
+      else
+        {
+          ResetRtsWnd (station);
+        }
+      station->m_rtsCounter = station->m_rtsWnd;
+      if (station->m_failed >= 2)
+        {
+          station->m_timer = 0;
+        }
+    }
+  else if (station->m_recovery)
+    {
+      NS_ASSERT (station->m_failed >= 1);
+      station->m_justModifyRate = false;
+      station->m_rtsCounter = station->m_rtsWnd;
+      if (station->m_failed == 1)
+        {
+          //need recovery fallback
+          if (m_turnOffRtsAfterRateDecrease)
+            {
+              TurnOffRts (station);
+            }
+          station->m_justModifyRate = true;
+          station->m_successThreshold = (int)(Min (station->m_successThreshold * m_successK,
+                                                   m_maxSuccessThreshold));
+          station->m_timerTimeout = (int)(Max (station->m_timerTimeout * m_timerK,
+                                               m_minSuccessThreshold));
+          if (station->m_rate != 0)
+            {
+              station->m_rate--;
+            }
+        }
+      station->m_timer = 0;
+    }
+  else
+    {
+      NS_ASSERT (station->m_failed >= 1);
+      station->m_justModifyRate = false;
+      station->m_rtsCounter = station->m_rtsWnd;
+      if (((station->m_failed - 1) % 2) == 1)
+        {
+          //need normal fallback
+          if (m_turnOffRtsAfterRateDecrease)
+            {
+              TurnOffRts (station);
+            }
+          station->m_justModifyRate = true;
+          station->m_timerTimeout = m_minTimerThreshold;
+          station->m_successThreshold = m_minSuccessThreshold;
+          if (station->m_rate != 0)
+            {
+              station->m_rate--;
+            }
+        }
+      if (station->m_failed >= 2)
+        {
+          station->m_timer = 0;
+        }
+    }
+  CheckRts (station);
+}
+
+void
+AarfcdWifiManager::DoReportRxOk (WifiRemoteStation *station,
+                                 double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
+}
+
+void
+AarfcdWifiManager::DoReportRtsOk (WifiRemoteStation *st,
+                                  double ctsSnr, WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
+  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
+  NS_LOG_DEBUG ("station=" << station << " rts ok");
+  station->m_rtsCounter--;
+}
+
+void
+AarfcdWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                   double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
+  station->m_timer++;
+  station->m_success++;
+  station->m_failed = 0;
+  station->m_recovery = false;
+  station->m_justModifyRate = false;
+  station->m_haveASuccess = true;
+  NS_LOG_DEBUG ("station=" << station << " data ok success=" << station->m_success << ", timer=" << station->m_timer);
+  if ((station->m_success == station->m_successThreshold
+       || station->m_timer == station->m_timerTimeout)
+      && (station->m_rate < (GetNSupported (station) - 1)))
+    {
+      NS_LOG_DEBUG ("station=" << station << " inc rate");
+      station->m_rate++;
+      station->m_timer = 0;
+      station->m_success = 0;
+      station->m_recovery = true;
+      station->m_justModifyRate = true;
+      if (m_turnOnRtsAfterRateIncrease)
+        {
+          TurnOnRts (station);
+          ResetRtsWnd (station);
+          station->m_rtsCounter = station->m_rtsWnd;
+        }
+    }
+  CheckRts (station);
+}
+
+void
+AarfcdWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+AarfcdWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+WifiTxVector
+AarfcdWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiMode mode = GetSupported (station, station->m_rate);
+  if (m_currentRate != mode.GetDataRate (channelWidth))
+    {
+      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
+      m_currentRate = mode.GetDataRate (channelWidth);
+    }
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+}
+
+WifiTxVector
+AarfcdWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  /// \todo we could/should implement the AARF algorithm for
+  /// RTS only by picking a single rate within the BasicRateSet.
+  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiTxVector rtsTxVector;
+  WifiMode mode;
+  if (GetUseNonErpProtection () == false)
+    {
+      mode = GetSupported (station, 0);
+    }
+  else
+    {
+      mode = GetNonErpSupported (station, 0);
+    }
+  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+  return rtsTxVector;
+}
+
+bool
+AarfcdWifiManager::DoNeedRts (WifiRemoteStation *st,
+                              uint32_t size, bool normally)
+{
+  NS_LOG_FUNCTION (this << st << size << normally);
+  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
+  NS_LOG_INFO ("" << station << " rate=" << station->m_rate << " rts=" << (station->m_rtsOn ? "RTS" : "BASIC") <<
+               " rtsCounter=" << station->m_rtsCounter);
+  return station->m_rtsOn;
+}
+
+void
+AarfcdWifiManager::CheckRts (AarfcdWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  if (station->m_rtsCounter == 0 && station->m_rtsOn)
+    {
+      TurnOffRts (station);
+    }
+}
+
+void
+AarfcdWifiManager::TurnOffRts (AarfcdWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_rtsOn = false;
+  station->m_haveASuccess = false;
+}
+
+void
+AarfcdWifiManager::TurnOnRts (AarfcdWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_rtsOn = true;
+}
+
+void
+AarfcdWifiManager::IncreaseRtsWnd (AarfcdWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  if (station->m_rtsWnd == m_maxRtsWnd)
+    {
+      return;
+    }
+
+  station->m_rtsWnd *= 2;
+  if (station->m_rtsWnd > m_maxRtsWnd)
+    {
+      station->m_rtsWnd = m_maxRtsWnd;
+    }
+}
+
+void
+AarfcdWifiManager::ResetRtsWnd (AarfcdWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_rtsWnd = m_minRtsWnd;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/aarfcd-wifi-manager.h ns-3.34/src/wifi/model/rate-control/aarfcd-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/aarfcd-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/aarfcd-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,135 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Federico Maguolo <maguolof@dei.unipd.it>
+ */
+
+#ifndef AARFCD_WIFI_MANAGER_H
+#define AARFCD_WIFI_MANAGER_H
+
+#include "ns3/traced-value.h"
+#include "ns3/wifi-remote-station-manager.h"
+
+namespace ns3 {
+
+struct AarfcdWifiRemoteStation;
+
+/**
+ * \brief an implementation of the AARF-CD algorithm
+ * \ingroup wifi
+ *
+ * This algorithm was first described in "Efficient Collision Detection for Auto Rate Fallback Algorithm".
+ * The implementation available here was done by Federico Maguolo for a very early development
+ * version of ns-3. Federico died before merging this work in ns-3 itself so his code was ported
+ * to ns-3 later without his supervision.
+ *
+ * This RAA does not support HT modes and will error
+ * exit if the user tries to configure this RAA with a Wi-Fi MAC
+ * that supports 802.11n or higher.
+ */
+class AarfcdWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  AarfcdWifiManager ();
+  virtual ~AarfcdWifiManager ();
+
+
+private:
+  void DoInitialize (void) override;
+  WifiRemoteStation * DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  /**
+   * It is important to realize that "recovery" mode starts after failure of
+   * the first transmission after a rate increase and ends at the first successful
+   * transmission. Specifically, recovery mode transcends retransmissions boundaries.
+   * Fundamentally, ARF handles each data transmission independently, whether it
+   * is the initial transmission of a packet or the retransmission of a packet.
+   * The fundamental reason for this is that there is a backoff between each data
+   * transmission, be it an initial transmission or a retransmission.
+   *
+   * \param station the station that we failed to send Data
+   */
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+  bool DoNeedRts (WifiRemoteStation *station,
+                  uint32_t size, bool normally) override;
+
+  /**
+   * Check if the use of RTS for the given station can be turned off.
+   *
+   * \param station the station that we are checking
+   */
+  void CheckRts (AarfcdWifiRemoteStation *station);
+  /**
+   * Increase the RTS window size of the given station.
+   *
+   * \param station the station to increase RTS window
+   */
+  void IncreaseRtsWnd (AarfcdWifiRemoteStation *station);
+  /**
+   * Reset the RTS window of the given station.
+   *
+   * \param station the station to reset RTS window
+   */
+  void ResetRtsWnd (AarfcdWifiRemoteStation *station);
+  /**
+   * Turn off RTS for the given station.
+   *
+   * \param station the station to turn RTS off
+   */
+  void TurnOffRts (AarfcdWifiRemoteStation *station);
+  /**
+   * Turn on RTS for the given station.
+   *
+   * \param station the station to turn RTS on
+   */
+  void TurnOnRts (AarfcdWifiRemoteStation *station);
+
+  //AARF fields below
+  uint32_t m_minTimerThreshold;   ///< minimum timer threshold
+  uint32_t m_minSuccessThreshold; ///< minimum success threshold
+  double m_successK;              ///< Multiplication factor for the success threshold
+  uint32_t m_maxSuccessThreshold; ///< maximum success threshold
+  double m_timerK;                ///< Multiplication factor for the timer threshold
+
+  //AARF-CD fields below
+  uint32_t m_minRtsWnd;               ///< minimum RTS window
+  uint32_t m_maxRtsWnd;               ///< maximum RTS window
+  bool m_turnOffRtsAfterRateDecrease; ///< turn off RTS after rate decrease
+  bool m_turnOnRtsAfterRateIncrease;  ///< turn on RTS after rate increase
+
+  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
+};
+
+} //namespace ns3
+
+#endif /* AARFCD_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/aarf-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/aarf-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/aarf-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/aarf-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,294 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2004,2005,2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#include "ns3/log.h"
+#include "aarf-wifi-manager.h"
+#include "ns3/wifi-tx-vector.h"
+
+#define Min(a,b) ((a < b) ? a : b)
+#define Max(a,b) ((a > b) ? a : b)
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("AarfWifiManager");
+
+/**
+ * \brief hold per-remote-station state for AARF Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the AARF Wifi manager
+ */
+struct AarfWifiRemoteStation : public WifiRemoteStation
+{
+  uint32_t m_timer; ///< timer
+  uint32_t m_success; ///< success
+  uint32_t m_failed; ///< failed
+  bool m_recovery; ///< recovery
+  uint32_t m_timerTimeout; ///< timer timeout
+  uint32_t m_successThreshold; ///< success threshold
+  uint8_t m_rate; ///< rate
+};
+
+NS_OBJECT_ENSURE_REGISTERED (AarfWifiManager);
+
+TypeId
+AarfWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::AarfWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<AarfWifiManager> ()
+    .AddAttribute ("SuccessK", "Multiplication factor for the success threshold in the AARF algorithm.",
+                   DoubleValue (2.0),
+                   MakeDoubleAccessor (&AarfWifiManager::m_successK),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("TimerK",
+                   "Multiplication factor for the timer threshold in the AARF algorithm.",
+                   DoubleValue (2.0),
+                   MakeDoubleAccessor (&AarfWifiManager::m_timerK),
+                   MakeDoubleChecker<double> ())
+    .AddAttribute ("MaxSuccessThreshold",
+                   "Maximum value of the success threshold in the AARF algorithm.",
+                   UintegerValue (60),
+                   MakeUintegerAccessor (&AarfWifiManager::m_maxSuccessThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("MinTimerThreshold",
+                   "The minimum value for the 'timer' threshold in the AARF algorithm.",
+                   UintegerValue (15),
+                   MakeUintegerAccessor (&AarfWifiManager::m_minTimerThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("MinSuccessThreshold",
+                   "The minimum value for the success threshold in the AARF algorithm.",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&AarfWifiManager::m_minSuccessThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddTraceSource ("Rate",
+                     "Traced value for rate changes (b/s)",
+                     MakeTraceSourceAccessor (&AarfWifiManager::m_currentRate),
+                     "ns3::TracedValueCallback::Uint64")
+  ;
+  return tid;
+}
+
+AarfWifiManager::AarfWifiManager ()
+  : WifiRemoteStationManager (),
+    m_currentRate (0)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+AarfWifiManager::~AarfWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+AarfWifiManager::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  if (GetHtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
+    }
+  if (GetVhtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
+    }
+  if (GetHeSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
+    }
+}
+
+WifiRemoteStation *
+AarfWifiManager::DoCreateStation (void) const
+{
+  NS_LOG_FUNCTION (this);
+  AarfWifiRemoteStation *station = new AarfWifiRemoteStation ();
+
+  station->m_successThreshold = m_minSuccessThreshold;
+  station->m_timerTimeout = m_minTimerThreshold;
+  station->m_rate = 0;
+  station->m_success = 0;
+  station->m_failed = 0;
+  station->m_recovery = false;
+  station->m_timer = 0;
+
+  return station;
+}
+
+void
+AarfWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+/**
+ * It is important to realize that "recovery" mode starts after failure of
+ * the first transmission after a rate increase and ends at the first successful
+ * transmission. Specifically, recovery mode transcends retransmissions boundaries.
+ * Fundamentally, ARF handles each data transmission independently, whether it
+ * is the initial transmission of a packet or the retransmission of a packet.
+ * The fundamental reason for this is that there is a backoff between each data
+ * transmission, be it an initial transmission or a retransmission.
+ *
+ * \param st the station that we failed to send Data
+ */
+void
+AarfWifiManager::DoReportDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  AarfWifiRemoteStation *station = static_cast<AarfWifiRemoteStation*> (st);
+  station->m_timer++;
+  station->m_failed++;
+  station->m_success = 0;
+
+  if (station->m_recovery)
+    {
+      NS_ASSERT (station->m_failed >= 1);
+      if (station->m_failed == 1)
+        {
+          //need recovery fallback
+          station->m_successThreshold = (int)(Min (station->m_successThreshold * m_successK,
+                                                   m_maxSuccessThreshold));
+          station->m_timerTimeout = (int)(Max (station->m_timerTimeout * m_timerK,
+                                               m_minSuccessThreshold));
+          if (station->m_rate != 0)
+            {
+              station->m_rate--;
+            }
+        }
+      station->m_timer = 0;
+    }
+  else
+    {
+      NS_ASSERT (station->m_failed >= 1);
+      if (((station->m_failed - 1) % 2) == 1)
+        {
+          //need normal fallback
+          station->m_timerTimeout = m_minTimerThreshold;
+          station->m_successThreshold = m_minSuccessThreshold;
+          if (station->m_rate != 0)
+            {
+              station->m_rate--;
+            }
+        }
+      if (station->m_failed >= 2)
+        {
+          station->m_timer = 0;
+        }
+    }
+}
+
+void
+AarfWifiManager::DoReportRxOk (WifiRemoteStation *station,
+                               double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
+}
+
+void
+AarfWifiManager::DoReportRtsOk (WifiRemoteStation *station,
+                                double ctsSnr, WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << station << ctsSnr << ctsMode << rtsSnr);
+  NS_LOG_DEBUG ("station=" << station << " rts ok");
+}
+
+void
+AarfWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                 double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+  AarfWifiRemoteStation *station = static_cast<AarfWifiRemoteStation*> (st);
+  station->m_timer++;
+  station->m_success++;
+  station->m_failed = 0;
+  station->m_recovery = false;
+  NS_LOG_DEBUG ("station=" << station << " data ok success=" << station->m_success << ", timer=" << station->m_timer);
+  if ((station->m_success == station->m_successThreshold
+       || station->m_timer == station->m_timerTimeout)
+      && (station->m_rate < (GetNSupported (station) - 1)))
+    {
+      NS_LOG_DEBUG ("station=" << station << " inc rate");
+      station->m_rate++;
+      station->m_timer = 0;
+      station->m_success = 0;
+      station->m_recovery = true;
+    }
+}
+
+void
+AarfWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+AarfWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+WifiTxVector
+AarfWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  AarfWifiRemoteStation *station = static_cast<AarfWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiMode mode = GetSupported (station, station->m_rate);
+  if (m_currentRate != mode.GetDataRate (channelWidth))
+    {
+      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
+      m_currentRate = mode.GetDataRate (channelWidth);
+    }
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+}
+
+WifiTxVector
+AarfWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  /// \todo we could/should implement the AARF algorithm for
+  /// RTS only by picking a single rate within the BasicRateSet.
+  AarfWifiRemoteStation *station = static_cast<AarfWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiTxVector rtsTxVector;
+  WifiMode mode;
+  if (GetUseNonErpProtection () == false)
+    {
+      mode = GetSupported (station, 0);
+    }
+  else
+    {
+      mode = GetNonErpSupported (station, 0);
+    }
+  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+  return rtsTxVector;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/aarf-wifi-manager.h ns-3.34/src/wifi/model/rate-control/aarf-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/aarf-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/aarf-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,81 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#ifndef AARF_WIFI_MANAGER_H
+#define AARF_WIFI_MANAGER_H
+
+#include "ns3/traced-value.h"
+#include "ns3/wifi-remote-station-manager.h"
+
+namespace ns3 {
+
+/**
+ * \brief AARF Rate control algorithm
+ * \ingroup wifi
+ *
+ * This class implements the AARF rate control algorithm which
+ * was initially described in <i>IEEE 802.11 Rate Adaptation:
+ * A Practical Approach</i>, by M. Lacage, M.H. Manshaei, and
+ * T. Turletti.
+ *
+ * This RAA does not support HT modes and will error
+ * exit if the user tries to configure this RAA with a Wi-Fi MAC
+ * that supports 802.11n or higher.
+ */
+class AarfWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  AarfWifiManager ();
+  virtual ~AarfWifiManager ();
+
+
+private:
+  void DoInitialize (void) override;
+  WifiRemoteStation * DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+
+  uint32_t m_minTimerThreshold;   ///< minimum timer threshold
+  uint32_t m_minSuccessThreshold; ///< minimum success threshold
+  double m_successK;              ///< Multiplication factor for the success threshold
+  uint32_t m_maxSuccessThreshold; ///< maximum success threshold
+  double m_timerK;                ///< Multiplication factor for the timer threshold
+
+  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
+};
+
+} //namespace ns3
+
+#endif /* AARF_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/amrr-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/amrr-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/amrr-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/amrr-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,405 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2003,2007 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "amrr-wifi-manager.h"
+#include "ns3/wifi-tx-vector.h"
+
+#define Min(a,b) ((a < b) ? a : b)
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("AmrrWifiManager");
+
+/**
+ * \brief hold per-remote-station state for AMRR Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the AMRR Wifi manager
+ */
+struct AmrrWifiRemoteStation : public WifiRemoteStation
+{
+  Time m_nextModeUpdate; ///< next mode update time
+  uint32_t m_tx_ok;      ///< transmit OK
+  uint32_t m_tx_err;     ///< transmit error
+  uint32_t m_tx_retr;    ///< transmit retry
+  uint32_t m_retry;      ///< retry
+  uint8_t m_txrate;      ///< transmit rate
+  uint32_t m_successThreshold; ///< success threshold
+  uint32_t m_success;    ///< success
+  bool m_recovery;       ///< recovery
+};
+
+
+NS_OBJECT_ENSURE_REGISTERED (AmrrWifiManager);
+
+TypeId
+AmrrWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::AmrrWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<AmrrWifiManager> ()
+    .AddAttribute ("UpdatePeriod",
+                   "The interval between decisions about rate control changes",
+                   TimeValue (Seconds (1.0)),
+                   MakeTimeAccessor (&AmrrWifiManager::m_updatePeriod),
+                   MakeTimeChecker ())
+    .AddAttribute ("FailureRatio",
+                   "Ratio of minimum erroneous transmissions needed to switch to a lower rate",
+                   DoubleValue (1.0 / 3.0),
+                   MakeDoubleAccessor (&AmrrWifiManager::m_failureRatio),
+                   MakeDoubleChecker<double> (0.0, 1.0))
+    .AddAttribute ("SuccessRatio",
+                   "Ratio of maximum erroneous transmissions needed to switch to a higher rate",
+                   DoubleValue (1.0 / 10.0),
+                   MakeDoubleAccessor (&AmrrWifiManager::m_successRatio),
+                   MakeDoubleChecker<double> (0.0, 1.0))
+    .AddAttribute ("MaxSuccessThreshold",
+                   "Maximum number of consecutive success periods needed to switch to a higher rate",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&AmrrWifiManager::m_maxSuccessThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("MinSuccessThreshold",
+                   "Minimum number of consecutive success periods needed to switch to a higher rate",
+                   UintegerValue (1),
+                   MakeUintegerAccessor (&AmrrWifiManager::m_minSuccessThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddTraceSource ("Rate",
+                     "Traced value for rate changes (b/s)",
+                     MakeTraceSourceAccessor (&AmrrWifiManager::m_currentRate),
+                     "ns3::TracedValueCallback::Uint64")
+  ;
+  return tid;
+}
+
+AmrrWifiManager::AmrrWifiManager ()
+  : WifiRemoteStationManager (),
+    m_currentRate (0)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+AmrrWifiManager::~AmrrWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+AmrrWifiManager::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  if (GetHtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
+    }
+  if (GetVhtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
+    }
+  if (GetHeSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
+    }
+}
+
+WifiRemoteStation *
+AmrrWifiManager::DoCreateStation (void) const
+{
+  NS_LOG_FUNCTION (this);
+  AmrrWifiRemoteStation *station = new AmrrWifiRemoteStation ();
+  station->m_nextModeUpdate = Simulator::Now () + m_updatePeriod;
+  station->m_tx_ok = 0;
+  station->m_tx_err = 0;
+  station->m_tx_retr = 0;
+  station->m_retry = 0;
+  station->m_txrate = 0;
+  station->m_successThreshold = m_minSuccessThreshold;
+  station->m_success = 0;
+  station->m_recovery = false;
+  return station;
+}
+
+void
+AmrrWifiManager::DoReportRxOk (WifiRemoteStation *station,
+                               double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
+}
+
+void
+AmrrWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+AmrrWifiManager::DoReportDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  AmrrWifiRemoteStation *station = static_cast<AmrrWifiRemoteStation*> (st);
+  station->m_retry++;
+  station->m_tx_retr++;
+}
+
+void
+AmrrWifiManager::DoReportRtsOk (WifiRemoteStation *st,
+                                double ctsSnr, WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
+}
+
+void
+AmrrWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                 double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+  AmrrWifiRemoteStation *station = static_cast<AmrrWifiRemoteStation*> (st);
+  station->m_retry = 0;
+  station->m_tx_ok++;
+}
+
+void
+AmrrWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+AmrrWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  AmrrWifiRemoteStation *station = static_cast<AmrrWifiRemoteStation*> (st);
+  station->m_retry = 0;
+  station->m_tx_err++;
+}
+
+bool
+AmrrWifiManager::IsMinRate (AmrrWifiRemoteStation *station) const
+{
+  NS_LOG_FUNCTION (this << station);
+  return (station->m_txrate == 0);
+}
+
+bool
+AmrrWifiManager::IsMaxRate (AmrrWifiRemoteStation *station) const
+{
+  NS_LOG_FUNCTION (this << station);
+  NS_ASSERT (station->m_txrate + 1 <= GetNSupported (station));
+  return (station->m_txrate + 1 == GetNSupported (station));
+}
+
+bool
+AmrrWifiManager::IsSuccess (AmrrWifiRemoteStation *station) const
+{
+  NS_LOG_FUNCTION (this << station);
+  return (station->m_tx_retr + station->m_tx_err) < station->m_tx_ok * m_successRatio;
+}
+
+bool
+AmrrWifiManager::IsFailure (AmrrWifiRemoteStation *station) const
+{
+  NS_LOG_FUNCTION (this << station);
+  return (station->m_tx_retr + station->m_tx_err) > station->m_tx_ok * m_failureRatio;
+}
+
+bool
+AmrrWifiManager::IsEnough (AmrrWifiRemoteStation *station) const
+{
+  NS_LOG_FUNCTION (this << station);
+  return (station->m_tx_retr + station->m_tx_err + station->m_tx_ok) > 10;
+}
+
+void
+AmrrWifiManager::ResetCnt (AmrrWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_tx_ok = 0;
+  station->m_tx_err = 0;
+  station->m_tx_retr = 0;
+}
+
+void
+AmrrWifiManager::IncreaseRate (AmrrWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_txrate++;
+  NS_ASSERT (station->m_txrate < GetNSupported (station));
+}
+
+void
+AmrrWifiManager::DecreaseRate (AmrrWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_txrate--;
+}
+
+void
+AmrrWifiManager::UpdateMode (AmrrWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  if (Simulator::Now () < station->m_nextModeUpdate)
+    {
+      return;
+    }
+  station->m_nextModeUpdate = Simulator::Now () + m_updatePeriod;
+  NS_LOG_DEBUG ("Update");
+
+  bool needChange = false;
+
+  if (IsSuccess (station) && IsEnough (station))
+    {
+      station->m_success++;
+      NS_LOG_DEBUG ("++ success=" << station->m_success << " successThreshold=" << station->m_successThreshold <<
+                    " tx_ok=" << station->m_tx_ok << " tx_err=" << station->m_tx_err << " tx_retr=" << station->m_tx_retr <<
+                    " rate=" << +station->m_txrate << " n-supported-rates=" << +GetNSupported (station));
+      if (station->m_success >= station->m_successThreshold
+          && !IsMaxRate (station))
+        {
+          station->m_recovery = true;
+          station->m_success = 0;
+          IncreaseRate (station);
+          needChange = true;
+        }
+      else
+        {
+          station->m_recovery = false;
+        }
+    }
+  else if (IsFailure (station))
+    {
+      station->m_success = 0;
+      NS_LOG_DEBUG ("-- success=" << station->m_success << " successThreshold=" << station->m_successThreshold <<
+                    " tx_ok=" << station->m_tx_ok << " tx_err=" << station->m_tx_err << " tx_retr=" << station->m_tx_retr <<
+                    " rate=" << +station->m_txrate << " n-supported-rates=" << +GetNSupported (station));
+      if (!IsMinRate (station))
+        {
+          if (station->m_recovery)
+            {
+              station->m_successThreshold *= 2;
+              station->m_successThreshold = std::min (station->m_successThreshold,
+                                                      m_maxSuccessThreshold);
+            }
+          else
+            {
+              station->m_successThreshold = m_minSuccessThreshold;
+            }
+          station->m_recovery = false;
+          DecreaseRate (station);
+          needChange = true;
+        }
+      else
+        {
+          station->m_recovery = false;
+        }
+    }
+  if (IsEnough (station) || needChange)
+    {
+      NS_LOG_DEBUG ("Reset");
+      ResetCnt (station);
+    }
+}
+
+WifiTxVector
+AmrrWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  AmrrWifiRemoteStation *station = static_cast<AmrrWifiRemoteStation*> (st);
+  UpdateMode (station);
+  NS_ASSERT (station->m_txrate < GetNSupported (station));
+  uint8_t rateIndex;
+  if (station->m_retry < 1)
+    {
+      rateIndex = station->m_txrate;
+    }
+  else if (station->m_retry < 2)
+    {
+      if (station->m_txrate > 0)
+        {
+          rateIndex = station->m_txrate - 1;
+        }
+      else
+        {
+          rateIndex = station->m_txrate;
+        }
+    }
+  else if (station->m_retry < 3)
+    {
+      if (station->m_txrate > 1)
+        {
+          rateIndex = station->m_txrate - 2;
+        }
+      else
+        {
+          rateIndex = station->m_txrate;
+        }
+    }
+  else
+    {
+      if (station->m_txrate > 2)
+        {
+          rateIndex = station->m_txrate - 3;
+        }
+      else
+        {
+          rateIndex = station->m_txrate;
+        }
+    }
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiMode mode = GetSupported (station, rateIndex);
+  if (m_currentRate != mode.GetDataRate (channelWidth))
+    {
+      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
+      m_currentRate = mode.GetDataRate (channelWidth);
+    }
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+}
+
+WifiTxVector
+AmrrWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  AmrrWifiRemoteStation *station = static_cast<AmrrWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  UpdateMode (station);
+  WifiTxVector rtsTxVector;
+  WifiMode mode;
+  if (GetUseNonErpProtection () == false)
+    {
+      mode = GetSupported (station, 0);
+    }
+  else
+    {
+      mode = GetNonErpSupported (station, 0);
+    }
+  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+  return rtsTxVector;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/amrr-wifi-manager.h ns-3.34/src/wifi/model/rate-control/amrr-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/amrr-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/amrr-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,161 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2003,2007 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#ifndef AMRR_WIFI_MANAGER_H
+#define AMRR_WIFI_MANAGER_H
+
+#include "ns3/traced-value.h"
+#include "ns3/wifi-remote-station-manager.h"
+
+namespace ns3 {
+
+struct AmrrWifiRemoteStation;
+
+/**
+ * \brief AMRR Rate control algorithm
+ * \ingroup wifi
+ *
+ * This class implements the AMRR rate control algorithm which
+ * was initially described in <i>IEEE 802.11 Rate Adaptation:
+ * A Practical Approach</i>, by M. Lacage, M.H. Manshaei, and
+ * T. Turletti.
+ *
+ * This RAA does not support HT modes and will error
+ * exit if the user tries to configure this RAA with a Wi-Fi MAC
+ * that supports 802.11n or higher.
+ */
+class AmrrWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  AmrrWifiManager ();
+  virtual ~AmrrWifiManager ();
+
+
+private:
+  void DoInitialize (void) override;
+  WifiRemoteStation * DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+
+  /**
+   * Update the mode used to send to the given station.
+   *
+   * \param station the remote station state
+   */
+  void UpdateMode (AmrrWifiRemoteStation *station);
+  /**
+   * Reset transmission statistics of the given station.
+   *
+   * \param station the remote station state
+   */
+  void ResetCnt (AmrrWifiRemoteStation *station);
+  /**
+   * Increase the transmission rate to the given station.
+   *
+   * \param station the remote station state
+   */
+  void IncreaseRate (AmrrWifiRemoteStation *station);
+  /**
+   * Decrease the transmission rate to the given station.
+   *
+   * \param station the remote station state
+   */
+  void DecreaseRate (AmrrWifiRemoteStation *station);
+  /**
+   * Check if the current rate for the given station is the
+   * minimum rate.
+   *
+   * \param station the remote station state
+   *
+   * \return true if the current rate is the minimum rate,
+   *         false otherwise
+   */
+  bool IsMinRate (AmrrWifiRemoteStation *station) const;
+  /**
+   * Check if the current rate for the given station is the
+   * maximum rate.
+   *
+   * \param station the remote station state
+   *
+   * \return true if the current rate is the maximum rate,
+   *         false otherwise
+   */
+  bool IsMaxRate (AmrrWifiRemoteStation *station) const;
+  /**
+   * Check if the number of retransmission and transmission error
+   * is less than the number of successful transmission (times ratio).
+   *
+   * \param station the remote station state
+   *
+   * \return true if the number of retransmission and transmission error
+   *              is less than the number of successful transmission
+   *              (times ratio), false otherwise
+   */
+  bool IsSuccess (AmrrWifiRemoteStation *station) const;
+  /**
+   * Check if the number of retransmission and transmission error
+   * is greater than the number of successful transmission (times ratio).
+   *
+   * \param station the remote station state
+   *
+   * \return true if the number of retransmission and transmission error
+   *              is less than the number of successful transmission
+   *              (times ratio), false otherwise
+   */
+  bool IsFailure (AmrrWifiRemoteStation *station) const;
+  /**
+   * Check if the number of retransmission, transmission error,
+   * and successful transmission are greater than 10.
+   *
+   * \param station the remote station state
+   * \return true if the number of retransmission, transmission error,
+   *         and successful transmission are greater than 10,
+   *         false otherwise
+   */
+  bool IsEnough (AmrrWifiRemoteStation *station) const;
+
+  Time m_updatePeriod;            ///< update period
+  double m_failureRatio;          ///< failure ratio
+  double m_successRatio;          ///< success ratio
+  uint32_t m_maxSuccessThreshold; ///< maximum success threshold
+  uint32_t m_minSuccessThreshold; ///< minimum success threshold
+
+  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
+};
+
+} //namespace ns3
+
+#endif /* AMRR_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/aparf-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/aparf-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/aparf-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/aparf-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,393 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 Universidad de la República - Uruguay
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Matias Richart <mrichart@fing.edu.uy>
+ */
+
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
+#include "ns3/data-rate.h"
+#include "aparf-wifi-manager.h"
+#include "ns3/wifi-phy.h"
+
+#define Min(a,b) ((a < b) ? a : b)
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("AparfWifiManager");
+
+/**
+ * Hold per-remote-station state for APARF Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the APARF Wifi manager
+ */
+struct
+AparfWifiRemoteStation : public WifiRemoteStation
+{
+  uint32_t m_nSuccess;                  //!< Number of successful transmission attempts.
+  uint32_t m_nFailed;                   //!< Number of failed transmission attempts.
+  uint32_t m_pCount;                    //!< Number of power changes.
+  uint32_t m_successThreshold;          //!< The minimum number of successful transmissions to try a new power or rate.
+  uint32_t m_failThreshold;             //!< The minimum number of failed transmissions to try a new power or rate.
+  uint8_t m_prevRateIndex;              //!< Rate index of the previous transmission.
+  uint8_t m_rateIndex;                  //!< Current rate index.
+  uint8_t m_critRateIndex;              //!< Critical rate.
+  uint8_t m_prevPowerLevel;             //!< Power level of the previous transmission.
+  uint8_t m_powerLevel;                 //!< Current power level.
+  uint8_t m_nSupported;                 //!< Number of supported rates by the remote station.
+  bool m_initialized;                   //!< For initializing variables.
+  AparfWifiManager::State m_aparfState; //!< The estimated state of the channel.
+};
+
+NS_OBJECT_ENSURE_REGISTERED (AparfWifiManager);
+
+TypeId
+AparfWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::AparfWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<AparfWifiManager> ()
+    .AddAttribute ("SuccessThreshold1",
+                   "The minimum number of successful transmissions in \"High\" state to try a new power or rate.",
+                   UintegerValue (3),
+                   MakeUintegerAccessor (&AparfWifiManager::m_succesMax1),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("SuccessThreshold2",
+                   "The minimum number of successful transmissions in \"Low\" state to try a new power or rate.",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&AparfWifiManager::m_succesMax2),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("FailThreshold",
+                   "The minimum number of failed transmissions to try a new power or rate.",
+                   UintegerValue (1),
+                   MakeUintegerAccessor (&AparfWifiManager::m_failMax),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("PowerThreshold",
+                   "The maximum number of power changes.",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&AparfWifiManager::m_powerMax),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("PowerDecrementStep",
+                   "Step size for decrement the power.",
+                   UintegerValue (1),
+                   MakeUintegerAccessor (&AparfWifiManager::m_powerDec),
+                   MakeUintegerChecker<uint8_t> ())
+    .AddAttribute ("PowerIncrementStep",
+                   "Step size for increment the power.",
+                   UintegerValue (1),
+                   MakeUintegerAccessor (&AparfWifiManager::m_powerInc),
+                   MakeUintegerChecker<uint8_t> ())
+    .AddAttribute ("RateDecrementStep",
+                   "Step size for decrement the rate.",
+                   UintegerValue (1),
+                   MakeUintegerAccessor (&AparfWifiManager::m_rateDec),
+                   MakeUintegerChecker<uint8_t> ())
+    .AddAttribute ("RateIncrementStep",
+                   "Step size for increment the rate.",
+                   UintegerValue (1),
+                   MakeUintegerAccessor (&AparfWifiManager::m_rateInc),
+                   MakeUintegerChecker<uint8_t> ())
+    .AddTraceSource ("PowerChange",
+                     "The transmission power has change",
+                     MakeTraceSourceAccessor (&AparfWifiManager::m_powerChange),
+                     "ns3::WifiRemoteStationManager::PowerChangeTracedCallback")
+    .AddTraceSource ("RateChange",
+                     "The transmission rate has change",
+                     MakeTraceSourceAccessor (&AparfWifiManager::m_rateChange),
+                     "ns3::WifiRemoteStationManager::RateChangeTracedCallback")
+  ;
+  return tid;
+}
+
+AparfWifiManager::AparfWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+AparfWifiManager::~AparfWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+AparfWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
+{
+  NS_LOG_FUNCTION (this << phy);
+  m_minPower = 0;
+  m_maxPower = phy->GetNTxPower () - 1;
+  WifiRemoteStationManager::SetupPhy (phy);
+}
+
+void
+AparfWifiManager::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  if (GetHtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
+    }
+  if (GetVhtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
+    }
+  if (GetHeSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
+    }
+}
+
+WifiRemoteStation *
+AparfWifiManager::DoCreateStation (void) const
+{
+  NS_LOG_FUNCTION (this);
+  AparfWifiRemoteStation *station = new AparfWifiRemoteStation ();
+
+  station->m_successThreshold = m_succesMax1;
+  station->m_failThreshold = m_failMax;
+  station->m_nSuccess = 0;
+  station->m_nFailed = 0;
+  station->m_pCount = 0;
+  station->m_aparfState = AparfWifiManager::High;
+  station->m_initialized = false;
+
+  NS_LOG_DEBUG ("create station=" << station << ", rate=" << +station->m_rateIndex
+                                  << ", power=" << +station->m_powerLevel);
+
+  return station;
+}
+
+void
+AparfWifiManager::CheckInit (AparfWifiRemoteStation *station)
+{
+  if (!station->m_initialized)
+    {
+      station->m_nSupported = GetNSupported (station);
+      station->m_rateIndex = station->m_nSupported - 1;
+      station->m_prevRateIndex = station->m_nSupported - 1;
+      station->m_powerLevel = m_maxPower;
+      station->m_prevPowerLevel = m_maxPower;
+      station->m_critRateIndex = 0;
+      WifiMode mode = GetSupported (station, station->m_rateIndex);
+      uint16_t channelWidth = GetChannelWidth (station);
+      DataRate rate = DataRate (mode.GetDataRate (channelWidth));
+      double power = GetPhy ()->GetPowerDbm (m_maxPower);
+      m_powerChange (power, power, station->m_state->m_address);
+      m_rateChange (rate, rate, station->m_state->m_address);
+      station->m_initialized = true;
+    }
+}
+
+void AparfWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void AparfWifiManager::DoReportDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  AparfWifiRemoteStation *station = static_cast<AparfWifiRemoteStation*> (st);
+  CheckInit (station);
+  station->m_nFailed++;
+  station->m_nSuccess = 0;
+  NS_LOG_DEBUG ("station=" << station << ", rate=" << station->m_rateIndex
+                           << ", power=" << (int)station->m_powerLevel);
+
+  if (station->m_aparfState == AparfWifiManager::Low)
+    {
+      station->m_aparfState = AparfWifiManager::High;
+      station->m_successThreshold = m_succesMax1;
+    }
+  else if (station->m_aparfState == AparfWifiManager::Spread)
+    {
+      station->m_aparfState = AparfWifiManager::Low;
+      station->m_successThreshold = m_succesMax2;
+    }
+
+  if (station->m_nFailed == station->m_failThreshold)
+    {
+      station->m_nFailed = 0;
+      station->m_nSuccess = 0;
+      station->m_pCount = 0;
+      if (station->m_powerLevel == m_maxPower)
+        {
+          station->m_critRateIndex = station->m_rateIndex;
+          if (station->m_rateIndex != 0)
+            {
+              NS_LOG_DEBUG ("station=" << station << " dec rate");
+              station->m_rateIndex -= m_rateDec;
+            }
+        }
+      else
+        {
+          NS_LOG_DEBUG ("station=" << station << " inc power");
+          station->m_powerLevel += m_powerInc;
+        }
+    }
+}
+
+void
+AparfWifiManager::DoReportRxOk (WifiRemoteStation *station, double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
+}
+
+void
+AparfWifiManager::DoReportRtsOk (WifiRemoteStation *station, double ctsSnr,
+                                 WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << station << ctsSnr << ctsMode << rtsSnr);
+}
+
+void
+AparfWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                  double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+  AparfWifiRemoteStation *station = static_cast<AparfWifiRemoteStation*> (st);
+  CheckInit (station);
+  station->m_nSuccess++;
+  station->m_nFailed = 0;
+  NS_LOG_DEBUG ("station=" << station << " data ok success=" << station->m_nSuccess << ", rate=" << +station->m_rateIndex << ", power=" << +station->m_powerLevel);
+
+  if ((station->m_aparfState == AparfWifiManager::High) && (station->m_nSuccess >= station->m_successThreshold))
+    {
+      station->m_aparfState = AparfWifiManager::Spread;
+    }
+  else if ((station->m_aparfState == AparfWifiManager::Low) && (station->m_nSuccess >= station->m_successThreshold))
+    {
+      station->m_aparfState = AparfWifiManager::Spread;
+    }
+  else if (station->m_aparfState == AparfWifiManager::Spread)
+    {
+      station->m_aparfState = AparfWifiManager::High;
+      station->m_successThreshold = m_succesMax1;
+    }
+
+  if (station->m_nSuccess == station->m_successThreshold)
+    {
+      station->m_nSuccess = 0;
+      station->m_nFailed = 0;
+      if (station->m_rateIndex == (station->m_state->m_operationalRateSet.size () - 1))
+        {
+          if (station->m_powerLevel != m_minPower)
+            {
+              NS_LOG_DEBUG ("station=" << station << " dec power");
+              station->m_powerLevel -= m_powerDec;
+            }
+        }
+      else
+        {
+          if (station->m_critRateIndex == 0)
+            {
+              if (station->m_rateIndex != (station->m_state->m_operationalRateSet.size () - 1))
+                {
+                  NS_LOG_DEBUG ("station=" << station << " inc rate");
+                  station->m_rateIndex += m_rateInc;
+                }
+            }
+          else
+            {
+              if (station->m_pCount == m_powerMax)
+                {
+                  station->m_powerLevel = m_maxPower;
+                  station->m_rateIndex = station->m_critRateIndex;
+                  station->m_pCount = 0;
+                  station->m_critRateIndex = 0;
+                }
+              else
+                {
+                  if (station->m_powerLevel != m_minPower)
+                    {
+                      station->m_powerLevel -= m_powerDec;
+                      station->m_pCount++;
+                    }
+                }
+            }
+        }
+    }
+}
+
+void
+AparfWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+AparfWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+WifiTxVector
+AparfWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  AparfWifiRemoteStation *station = static_cast<AparfWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  CheckInit (station);
+  WifiMode mode = GetSupported (station, station->m_rateIndex);
+  DataRate rate = DataRate (mode.GetDataRate (channelWidth));
+  DataRate prevRate = DataRate (GetSupported (station, station->m_prevRateIndex).GetDataRate (channelWidth));
+  double power = GetPhy ()->GetPowerDbm (station->m_powerLevel);
+  double prevPower = GetPhy ()->GetPowerDbm (station->m_prevPowerLevel);
+  if (station->m_prevPowerLevel != station->m_powerLevel)
+    {
+      m_powerChange (prevPower, power, station->m_state->m_address);
+      station->m_prevPowerLevel = station->m_powerLevel;
+    }
+  if (station->m_prevRateIndex != station->m_rateIndex)
+    {
+      m_rateChange (prevRate, rate, station->m_state->m_address);
+      station->m_prevRateIndex = station->m_rateIndex;
+    }
+  return WifiTxVector (mode, station->m_powerLevel, GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+}
+
+WifiTxVector
+AparfWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  /// \todo we could/should implement the ARF algorithm for
+  /// RTS only by picking a single rate within the BasicRateSet.
+  AparfWifiRemoteStation *station = static_cast<AparfWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiTxVector rtsTxVector;
+  WifiMode mode;
+  if (GetUseNonErpProtection () == false)
+    {
+      mode = GetSupported (station, 0);
+    }
+  else
+    {
+      mode = GetNonErpSupported (station, 0);
+    }
+  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+  return rtsTxVector;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/aparf-wifi-manager.h ns-3.34/src/wifi/model/rate-control/aparf-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/aparf-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/aparf-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,124 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 Universidad de la República - Uruguay
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Matias Richart <mrichart@fing.edu.uy>
+ */
+
+#ifndef APARF_WIFI_MANAGER_H
+#define APARF_WIFI_MANAGER_H
+
+#include "ns3/wifi-remote-station-manager.h"
+
+namespace ns3 {
+
+struct AparfWifiRemoteStation;
+
+/**
+ * \ingroup wifi
+ * APARF Power and rate control algorithm
+ *
+ * This class implements the High Performance power and rate control algorithm
+ * described in <i>Dynamic data rate and transmit power adjustment
+ * in IEEE 802.11 wireless LANs</i> by Chevillat, P.; Jelitto, J.
+ * and Truong, H. L. in International Journal of Wireless Information
+ * Networks, Springer, 2005, 12, 123-145.
+ * http://www.cs.mun.ca/~yzchen/papers/papers/rate_adaptation/80211_dynamic_rate_power_adjustment_chevillat_j2005.pdf
+ *
+ * This RAA does not support HT modes and will error
+ * exit if the user tries to configure this RAA with a Wi-Fi MAC
+ * that supports 802.11n or higher.
+ */
+class AparfWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * Register this type.
+   * \return The object TypeId.
+   */
+  static TypeId GetTypeId (void);
+  AparfWifiManager ();
+  virtual ~AparfWifiManager ();
+
+  void SetupPhy (const Ptr<WifiPhy> phy) override;
+
+  /**
+   * Enumeration of the possible states of the channel.
+   */
+  enum State
+  {
+    High,
+    Low,
+    Spread
+  };
+
+
+private:
+  void DoInitialize (void) override;
+  WifiRemoteStation * DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+
+  /** Check for initializations.
+   *
+   * \param station The remote station.
+   */
+  void CheckInit (AparfWifiRemoteStation *station);
+
+  uint32_t m_succesMax1; //!< The minimum number of successful transmissions in \"High\" state to try a new power or rate.
+  uint32_t m_succesMax2; //!< The minimum number of successful transmissions in \"Low\" state to try a new power or rate.
+  uint32_t m_failMax;    //!< The minimum number of failed transmissions to try a new power or rate.
+  uint32_t m_powerMax;   //!< The maximum number of power changes.
+  uint8_t m_powerInc;    //!< Step size for increment the power.
+  uint8_t m_powerDec;    //!< Step size for decrement the power.
+  uint8_t m_rateInc;     //!< Step size for increment the rate.
+  uint8_t m_rateDec;     //!< Step size for decrement the rate.
+
+  /**
+   * Minimal power level.
+   * Differently form rate, power levels do not depend on the remote station.
+   * The levels depend only on the physical layer of the device.
+   */
+  uint8_t m_minPower;
+
+  /**
+   * Maximal power level.
+   */
+  uint8_t m_maxPower;
+
+  /**
+   * The trace source fired when the transmission power changes.
+   */
+  TracedCallback<double, double, Mac48Address> m_powerChange;
+  /**
+   * The trace source fired when the transmission rate changes.
+   */
+  TracedCallback<DataRate, DataRate, Mac48Address> m_rateChange;
+};
+
+} //namespace ns3
+
+#endif /* APARF_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/arf-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/arf-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/arf-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/arf-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,271 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2004,2005,2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#include "ns3/log.h"
+#include "arf-wifi-manager.h"
+#include "ns3/wifi-tx-vector.h"
+
+#define Min(a,b) ((a < b) ? a : b)
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("ArfWifiManager");
+
+/**
+ * \brief hold per-remote-station state for ARF Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the ARF Wifi manager
+ */
+struct ArfWifiRemoteStation : public WifiRemoteStation
+{
+  uint32_t m_timer; ///< timer value
+  uint32_t m_success; ///< success count
+  uint32_t m_failed; ///< failed count
+  bool m_recovery; ///< recovery
+  uint32_t m_timerTimeout; ///< timer timeout
+  uint32_t m_successThreshold; ///< success threshold
+  uint8_t m_rate; ///< rate
+};
+
+NS_OBJECT_ENSURE_REGISTERED (ArfWifiManager);
+
+TypeId
+ArfWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::ArfWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<ArfWifiManager> ()
+    .AddAttribute ("TimerThreshold", "The 'timer' threshold in the ARF algorithm.",
+                   UintegerValue (15),
+                   MakeUintegerAccessor (&ArfWifiManager::m_timerThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("SuccessThreshold",
+                   "The minimum number of successful transmissions to try a new rate.",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&ArfWifiManager::m_successThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddTraceSource ("Rate",
+                     "Traced value for rate changes (b/s)",
+                     MakeTraceSourceAccessor (&ArfWifiManager::m_currentRate),
+                     "ns3::TracedValueCallback::Uint64")
+  ;
+  return tid;
+}
+
+ArfWifiManager::ArfWifiManager ()
+  : WifiRemoteStationManager (),
+    m_currentRate (0)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+ArfWifiManager::~ArfWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+ArfWifiManager::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  if (GetHtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
+    }
+  if (GetVhtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
+    }
+  if (GetHeSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
+    }
+}
+
+WifiRemoteStation *
+ArfWifiManager::DoCreateStation (void) const
+{
+  NS_LOG_FUNCTION (this);
+  ArfWifiRemoteStation *station = new ArfWifiRemoteStation ();
+
+  station->m_successThreshold = m_successThreshold;
+  station->m_timerTimeout = m_timerThreshold;
+  station->m_rate = 0;
+  station->m_success = 0;
+  station->m_failed = 0;
+  station->m_recovery = false;
+  station->m_timer = 0;
+
+  return station;
+}
+
+void
+ArfWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+/**
+ * It is important to realize that "recovery" mode starts after failure of
+ * the first transmission after a rate increase and ends at the first successful
+ * transmission. Specifically, recovery mode transcends retransmissions boundaries.
+ * Fundamentally, ARF handles each data transmission independently, whether it
+ * is the initial transmission of a packet or the retransmission of a packet.
+ * The fundamental reason for this is that there is a backoff between each data
+ * transmission, be it an initial transmission or a retransmission.
+ *
+ * \param st the station that we failed to send Data
+ */
+void
+ArfWifiManager::DoReportDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  ArfWifiRemoteStation *station = static_cast<ArfWifiRemoteStation*> (st);
+  station->m_timer++;
+  station->m_failed++;
+  station->m_success = 0;
+
+  if (station->m_recovery)
+    {
+      NS_ASSERT (station->m_failed >= 1);
+      if (station->m_failed == 1)
+        {
+          //need recovery fallback
+          if (station->m_rate != 0)
+            {
+              station->m_rate--;
+            }
+        }
+      station->m_timer = 0;
+    }
+  else
+    {
+      NS_ASSERT (station->m_failed >= 1);
+      if (((station->m_failed - 1) % 2) == 1)
+        {
+          //need normal fallback
+          if (station->m_rate != 0)
+            {
+              station->m_rate--;
+            }
+        }
+      if (station->m_failed >= 2)
+        {
+          station->m_timer = 0;
+        }
+    }
+}
+
+void
+ArfWifiManager::DoReportRxOk (WifiRemoteStation *station,
+                              double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
+}
+
+void ArfWifiManager::DoReportRtsOk (WifiRemoteStation *station,
+                                    double ctsSnr, WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << station << ctsSnr << ctsMode << rtsSnr);
+  NS_LOG_DEBUG ("station=" << station << " rts ok");
+}
+
+void ArfWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                     double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+  ArfWifiRemoteStation *station = static_cast<ArfWifiRemoteStation*> (st);
+  station->m_timer++;
+  station->m_success++;
+  station->m_failed = 0;
+  station->m_recovery = false;
+  NS_LOG_DEBUG ("station=" << station << " data ok success=" << station->m_success << ", timer=" << station->m_timer);
+  if ((station->m_success == m_successThreshold
+       || station->m_timer == m_timerThreshold)
+      && (station->m_rate < (station->m_state->m_operationalRateSet.size () - 1)))
+    {
+      NS_LOG_DEBUG ("station=" << station << " inc rate");
+      station->m_rate++;
+      station->m_timer = 0;
+      station->m_success = 0;
+      station->m_recovery = true;
+    }
+}
+
+void
+ArfWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+ArfWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+WifiTxVector
+ArfWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  ArfWifiRemoteStation *station = static_cast<ArfWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiMode mode = GetSupported (station, station->m_rate);
+  if (m_currentRate != mode.GetDataRate (channelWidth))
+    {
+      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
+      m_currentRate = mode.GetDataRate (channelWidth);
+    }
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+}
+
+WifiTxVector
+ArfWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  /// \todo we could/should implement the ARF algorithm for
+  /// RTS only by picking a single rate within the BasicRateSet.
+  ArfWifiRemoteStation *station = static_cast<ArfWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiTxVector rtsTxVector;
+  WifiMode mode;
+  if (GetUseNonErpProtection () == false)
+    {
+      mode = GetSupported (station, 0);
+    }
+  else
+    {
+      mode = GetNonErpSupported (station, 0);
+    }
+  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+  return rtsTxVector;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/arf-wifi-manager.h ns-3.34/src/wifi/model/rate-control/arf-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/arf-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/arf-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,84 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#ifndef ARF_WIFI_MANAGER_H
+#define ARF_WIFI_MANAGER_H
+
+#include "ns3/traced-value.h"
+#include "ns3/wifi-remote-station-manager.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup wifi
+ * \brief ARF Rate control algorithm
+ *
+ * This class implements the so-called ARF algorithm which was
+ * initially described in <i>WaveLAN-II: A High-performance wireless
+ * LAN for the unlicensed band</i>, by A. Kamerman and L. Monteban. in
+ * Bell Lab Technical Journal, pages 118-133, Summer 1997.
+ *
+ * This implementation differs from the initial description in that it
+ * uses a packet-based timer rather than a time-based timer as described
+ * in XXX (I cannot find back the original paper which described how
+ * the time-based timer could be easily replaced with a packet-based
+ * timer.)
+ *
+ * This RAA does not support HT modes and will error
+ * exit if the user tries to configure this RAA with a Wi-Fi MAC
+ * that supports 802.11n or higher.
+ */
+class ArfWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  ArfWifiManager ();
+  virtual ~ArfWifiManager ();
+
+
+private:
+  void DoInitialize (void) override;
+  WifiRemoteStation * DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+
+  uint32_t m_timerThreshold;   ///< timer threshold
+  uint32_t m_successThreshold; ///< success threshold
+
+  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
+};
+
+} //namespace ns3
+
+#endif /* ARF_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/cara-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/cara-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/cara-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/cara-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,253 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2004,2005,2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Federico Maguolo <maguolof@dei.unipd.it>
+ */
+
+#include "ns3/log.h"
+#include "cara-wifi-manager.h"
+#include "ns3/wifi-tx-vector.h"
+
+#define Min(a,b) ((a < b) ? a : b)
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("CaraWifiManager");
+
+/**
+ * \brief hold per-remote-station state for CARA Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the CARA Wifi manager
+ */
+struct CaraWifiRemoteStation : public WifiRemoteStation
+{
+  uint32_t m_timer;   ///< timer count
+  uint32_t m_success; ///< success count
+  uint32_t m_failed;  ///< failed count
+  uint8_t m_rate;     ///< rate in bps
+};
+
+NS_OBJECT_ENSURE_REGISTERED (CaraWifiManager);
+
+TypeId
+CaraWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::CaraWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<CaraWifiManager> ()
+    .AddAttribute ("ProbeThreshold",
+                   "The number of consecutive transmissions failure to activate the RTS probe.",
+                   UintegerValue (1),
+                   MakeUintegerAccessor (&CaraWifiManager::m_probeThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("FailureThreshold",
+                   "The number of consecutive transmissions failure to decrease the rate.",
+                   UintegerValue (2),
+                   MakeUintegerAccessor (&CaraWifiManager::m_failureThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("SuccessThreshold",
+                   "The minimum number of successful transmissions to try a new rate.",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&CaraWifiManager::m_successThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("Timeout",
+                   "The 'timer' in the CARA algorithm",
+                   UintegerValue (15),
+                   MakeUintegerAccessor (&CaraWifiManager::m_timerTimeout),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddTraceSource ("Rate",
+                     "Traced value for rate changes (b/s)",
+                     MakeTraceSourceAccessor (&CaraWifiManager::m_currentRate),
+                     "ns3::TracedValueCallback::Uint64")
+  ;
+  return tid;
+}
+
+CaraWifiManager::CaraWifiManager ()
+  : WifiRemoteStationManager (),
+    m_currentRate (0)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+CaraWifiManager::~CaraWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+CaraWifiManager::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  if (GetHtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
+    }
+  if (GetVhtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
+    }
+  if (GetHeSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
+    }
+}
+
+WifiRemoteStation *
+CaraWifiManager::DoCreateStation (void) const
+{
+  NS_LOG_FUNCTION (this);
+  CaraWifiRemoteStation *station = new CaraWifiRemoteStation ();
+  station->m_rate = 0;
+  station->m_success = 0;
+  station->m_failed = 0;
+  station->m_timer = 0;
+  return station;
+}
+
+void
+CaraWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+}
+
+void
+CaraWifiManager::DoReportDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  CaraWifiRemoteStation *station = static_cast<CaraWifiRemoteStation*> (st);
+  station->m_timer++;
+  station->m_failed++;
+  station->m_success = 0;
+  if (station->m_failed >= m_failureThreshold)
+    {
+      NS_LOG_DEBUG ("self=" << station << " dec rate");
+      if (station->m_rate != 0)
+        {
+          station->m_rate--;
+        }
+      station->m_failed = 0;
+      station->m_timer = 0;
+    }
+}
+
+void
+CaraWifiManager::DoReportRxOk (WifiRemoteStation *st,
+                               double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << st << rxSnr << txMode);
+}
+
+void
+CaraWifiManager::DoReportRtsOk (WifiRemoteStation *st,
+                                double ctsSnr, WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
+}
+
+void
+CaraWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                 double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+  CaraWifiRemoteStation *station = static_cast<CaraWifiRemoteStation*> (st);
+  station->m_timer++;
+  station->m_success++;
+  station->m_failed = 0;
+  NS_LOG_DEBUG ("self=" << station << " data ok success=" << station->m_success << ", timer=" << station->m_timer);
+  if ((station->m_success == m_successThreshold
+       || station->m_timer >= m_timerTimeout))
+    {
+      if (station->m_rate < GetNSupported (station) - 1)
+        {
+          station->m_rate++;
+        }
+      NS_LOG_DEBUG ("self=" << station << " inc rate=" << +station->m_rate);
+      station->m_timer = 0;
+      station->m_success = 0;
+    }
+}
+
+void
+CaraWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+}
+
+void
+CaraWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+}
+
+WifiTxVector
+CaraWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  CaraWifiRemoteStation *station = static_cast<CaraWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiMode mode = GetSupported (station, station->m_rate);
+  if (m_currentRate != mode.GetDataRate (channelWidth))
+    {
+      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
+      m_currentRate = mode.GetDataRate (channelWidth);
+    }
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+}
+
+WifiTxVector
+CaraWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  CaraWifiRemoteStation *station = static_cast<CaraWifiRemoteStation*> (st);
+  /// \todo we could/should implement the Arf algorithm for
+  /// RTS only by picking a single rate within the BasicRateSet.
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiTxVector rtsTxVector;
+  WifiMode mode;
+  if (GetUseNonErpProtection () == false)
+    {
+      mode = GetSupported (station, 0);
+    }
+  else
+    {
+      mode = GetNonErpSupported (station, 0);
+    }
+  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+  return rtsTxVector;
+}
+
+bool
+CaraWifiManager::DoNeedRts (WifiRemoteStation *st,
+                            uint32_t size, bool normally)
+{
+  NS_LOG_FUNCTION (this << st << size << normally);
+  CaraWifiRemoteStation *station = static_cast<CaraWifiRemoteStation*> (st);
+  return normally || station->m_failed >= m_probeThreshold;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/cara-wifi-manager.h ns-3.34/src/wifi/model/rate-control/cara-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/cara-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/cara-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,84 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Federico Maguolo <maguolof@dei.unipd.it>
+ */
+
+#ifndef CARA_WIFI_MANAGER_H
+#define CARA_WIFI_MANAGER_H
+
+#include "ns3/traced-value.h"
+#include "ns3/wifi-remote-station-manager.h"
+
+namespace ns3 {
+
+/**
+ * \brief implement the CARA rate control algorithm
+ * \ingroup wifi
+ *
+ * Implement the CARA algorithm from:
+ * J. Kim, S. Kim, S. Choi, and D. Qiao.
+ * "CARA: Collision-Aware Rate Adaptation for IEEE 802.11 WLANs."
+ *
+ * Originally implemented by Federico Maguolo for a very early
+ * prototype version of ns-3.
+ *
+ * This RAA does not support HT modes and will error
+ * exit if the user tries to configure this RAA with a Wi-Fi MAC
+ * that supports 802.11n or higher.
+ */
+class CaraWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  CaraWifiManager ();
+  virtual ~CaraWifiManager ();
+
+
+private:
+  void DoInitialize (void) override;
+  WifiRemoteStation * DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+  bool DoNeedRts (WifiRemoteStation *station,
+                  uint32_t size, bool normally) override;
+
+  uint32_t m_timerTimeout;     ///< timer threshold
+  uint32_t m_successThreshold; ///< success threshold
+  uint32_t m_failureThreshold; ///< failure threshold
+  uint32_t m_probeThreshold;   ///< probe threshold
+
+  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
+};
+
+} //namespace ns3
+
+#endif /* CARA_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/constant-rate-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/constant-rate-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/constant-rate-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/constant-rate-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,136 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2004,2005 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#include "ns3/string.h"
+#include "ns3/log.h"
+#include "constant-rate-wifi-manager.h"
+#include "ns3/wifi-tx-vector.h"
+#include "ns3/wifi-utils.h"
+
+#define Min(a,b) ((a < b) ? a : b)
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("ConstantRateWifiManager");
+
+NS_OBJECT_ENSURE_REGISTERED (ConstantRateWifiManager);
+
+TypeId
+ConstantRateWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::ConstantRateWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<ConstantRateWifiManager> ()
+    .AddAttribute ("DataMode", "The transmission mode to use for every data packet transmission",
+                   StringValue ("OfdmRate6Mbps"),
+                   MakeWifiModeAccessor (&ConstantRateWifiManager::m_dataMode),
+                   MakeWifiModeChecker ())
+    .AddAttribute ("ControlMode", "The transmission mode to use for every RTS packet transmission.",
+                   StringValue ("OfdmRate6Mbps"),
+                   MakeWifiModeAccessor (&ConstantRateWifiManager::m_ctlMode),
+                   MakeWifiModeChecker ())
+  ;
+  return tid;
+}
+
+ConstantRateWifiManager::ConstantRateWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+ConstantRateWifiManager::~ConstantRateWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+WifiRemoteStation *
+ConstantRateWifiManager::DoCreateStation (void) const
+{
+  NS_LOG_FUNCTION (this);
+  WifiRemoteStation *station = new WifiRemoteStation ();
+  return station;
+}
+
+void
+ConstantRateWifiManager::DoReportRxOk (WifiRemoteStation *station,
+                                       double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
+}
+
+void
+ConstantRateWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+ConstantRateWifiManager::DoReportDataFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+ConstantRateWifiManager::DoReportRtsOk (WifiRemoteStation *st,
+                                        double ctsSnr, WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
+}
+
+void
+ConstantRateWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                         double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+}
+
+void
+ConstantRateWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+ConstantRateWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+WifiTxVector
+ConstantRateWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  uint8_t nss = Min (GetMaxNumberOfTransmitStreams (), GetNumberOfSupportedStreams (st));
+  if (m_dataMode.GetModulationClass () == WIFI_MOD_CLASS_HT)
+    {
+      nss = 1 + (m_dataMode.GetMcsValue () / 8);
+    }
+  return WifiTxVector (m_dataMode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (m_dataMode.GetModulationClass (), GetShortPreambleEnabled ()), ConvertGuardIntervalToNanoSeconds (m_dataMode, GetShortGuardIntervalSupported (st), NanoSeconds (GetGuardInterval (st))), GetNumberOfAntennas (), nss, 0, GetChannelWidthForTransmission (m_dataMode, GetChannelWidth (st)), GetAggregation (st));
+}
+
+WifiTxVector
+ConstantRateWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  return WifiTxVector (m_ctlMode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (m_ctlMode.GetModulationClass (), GetShortPreambleEnabled ()), ConvertGuardIntervalToNanoSeconds (m_ctlMode, GetShortGuardIntervalSupported (st), NanoSeconds (GetGuardInterval (st))), 1, 1, 0, GetChannelWidthForTransmission (m_ctlMode, GetChannelWidth (st)), GetAggregation (st));
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/constant-rate-wifi-manager.h ns-3.34/src/wifi/model/rate-control/constant-rate-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/constant-rate-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/constant-rate-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,68 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#ifndef CONSTANT_RATE_WIFI_MANAGER_H
+#define CONSTANT_RATE_WIFI_MANAGER_H
+
+#include "ns3/wifi-remote-station-manager.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup wifi
+ * \brief use constant rates for data and RTS transmissions
+ *
+ * This class uses always the same transmission rate for every
+ * packet sent.
+ */
+class ConstantRateWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  ConstantRateWifiManager ();
+  virtual ~ConstantRateWifiManager ();
+
+
+private:
+  WifiRemoteStation* DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+
+  WifiMode m_dataMode; //!< Wifi mode for unicast Data frames
+  WifiMode m_ctlMode;  //!< Wifi mode for RTS frames
+};
+
+} //namespace ns3
+
+#endif /* CONSTANT_RATE_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/ideal-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/ideal-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/ideal-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/ideal-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,587 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#include <algorithm>
+#include "ns3/log.h"
+#include "ideal-wifi-manager.h"
+#include "ns3/wifi-phy.h"
+
+namespace ns3 {
+
+/**
+ * \brief hold per-remote-station state for Ideal Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the Ideal Wifi manager
+ */
+struct IdealWifiRemoteStation : public WifiRemoteStation
+{
+  double m_lastSnrObserved;            //!< SNR of most recently reported packet sent to the remote station
+  uint16_t m_lastChannelWidthObserved; //!< Channel width (in MHz) of most recently reported packet sent to the remote station
+  uint16_t m_lastNssObserved;          //!<  Number of spatial streams of most recently reported packet sent to the remote station
+  double m_lastSnrCached;              //!< SNR most recently used to select a rate
+  uint8_t m_lastNss;                   //!< Number of spatial streams most recently used to the remote station
+  WifiMode m_lastMode;                 //!< Mode most recently used to the remote station
+  uint16_t m_lastChannelWidth;         //!< Channel width (in MHz) most recently used to the remote station
+};
+
+/// To avoid using the cache before a valid value has been cached
+static const double CACHE_INITIAL_VALUE = -100;
+
+NS_OBJECT_ENSURE_REGISTERED (IdealWifiManager);
+
+NS_LOG_COMPONENT_DEFINE ("IdealWifiManager");
+
+TypeId
+IdealWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::IdealWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<IdealWifiManager> ()
+    .AddAttribute ("BerThreshold",
+                   "The maximum Bit Error Rate acceptable at any transmission mode",
+                   DoubleValue (1e-6),
+                   MakeDoubleAccessor (&IdealWifiManager::m_ber),
+                   MakeDoubleChecker<double> ())
+    .AddTraceSource ("Rate",
+                     "Traced value for rate changes (b/s)",
+                     MakeTraceSourceAccessor (&IdealWifiManager::m_currentRate),
+                     "ns3::TracedValueCallback::Uint64")
+  ;
+  return tid;
+}
+
+IdealWifiManager::IdealWifiManager ()
+  : m_currentRate (0)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+IdealWifiManager::~IdealWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+IdealWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
+{
+  NS_LOG_FUNCTION (this << phy);
+  WifiRemoteStationManager::SetupPhy (phy);
+}
+
+uint16_t
+IdealWifiManager::GetChannelWidthForNonHtMode (WifiMode mode) const
+{
+  NS_ASSERT (mode.GetModulationClass () != WIFI_MOD_CLASS_HT
+             && mode.GetModulationClass () != WIFI_MOD_CLASS_VHT
+             && mode.GetModulationClass () != WIFI_MOD_CLASS_HE);
+  if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS
+      || mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS)
+    {
+      return 22;
+    }
+  else
+    {
+      return 20;
+    }
+}
+
+void
+IdealWifiManager::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  BuildSnrThresholds ();
+}
+
+void
+IdealWifiManager::BuildSnrThresholds (void)
+{
+  m_thresholds.clear ();
+  WifiMode mode;
+  WifiTxVector txVector;
+  uint8_t nss = 1;
+  for (const auto & mode : GetPhy ()->GetModeList ())
+    {
+      txVector.SetChannelWidth (GetChannelWidthForNonHtMode (mode));
+      txVector.SetNss (nss);
+      txVector.SetMode (mode);
+      NS_LOG_DEBUG ("Adding mode = " << mode.GetUniqueName ());
+      AddSnrThreshold (txVector, GetPhy ()->CalculateSnr (txVector, m_ber));
+    }
+  // Add all MCSes
+  if (GetHtSupported ())
+    {
+      for (const auto & mode : GetPhy ()->GetMcsList ())
+        {
+          for (uint16_t j = 20; j <= GetPhy ()->GetChannelWidth (); j *= 2)
+            {
+              txVector.SetChannelWidth (j);
+              if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
+                {
+                  uint16_t guardInterval = GetShortGuardIntervalSupported () ? 400 : 800;
+                  txVector.SetGuardInterval (guardInterval);
+                  //derive NSS from the MCS index
+                  nss = (mode.GetMcsValue () / 8) + 1;
+                  NS_LOG_DEBUG ("Adding mode = " << mode.GetUniqueName () <<
+                                " channel width " << j <<
+                                " nss " << +nss <<
+                                " GI " << guardInterval);
+                  txVector.SetNss (nss);
+                  txVector.SetMode (mode);
+                  AddSnrThreshold (txVector, GetPhy ()->CalculateSnr (txVector, m_ber));
+                }
+              else //VHT or HE
+                {
+                  uint16_t guardInterval;
+                  if (mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
+                    {
+                      guardInterval = GetShortGuardIntervalSupported () ? 400 : 800;
+                    }
+                  else
+                    {
+                      guardInterval = GetGuardInterval ();
+                    }
+                  txVector.SetGuardInterval (guardInterval);
+                  for (uint8_t k = 1; k <= GetPhy ()->GetMaxSupportedTxSpatialStreams (); k++)
+                    {
+                      if (mode.IsAllowed (j, k))
+                        {
+                          NS_LOG_DEBUG ("Adding mode = " << mode.GetUniqueName () <<
+                                        " channel width " << j <<
+                                        " nss " << +k <<
+                                        " GI " << guardInterval);
+                          txVector.SetNss (k);
+                          txVector.SetMode (mode);
+                          AddSnrThreshold (txVector, GetPhy ()->CalculateSnr (txVector, m_ber));
+                        }
+                      else
+                        {
+                          NS_LOG_DEBUG ("Mode = " << mode.GetUniqueName () << " disallowed");
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+double
+IdealWifiManager::GetSnrThreshold (WifiTxVector txVector)
+{
+  NS_LOG_FUNCTION (this << txVector);
+  auto it = std::find_if (m_thresholds.begin (), m_thresholds.end (),
+      [&txVector] (const std::pair<double, WifiTxVector>& p) -> bool {
+          return ((txVector.GetMode () == p.second.GetMode ()) && (txVector.GetNss () == p.second.GetNss ()) && (txVector.GetChannelWidth () == p.second.GetChannelWidth ()));
+      }
+  );
+  if (it == m_thresholds.end ())
+    {
+      //This means capabilities have changed in runtime, hence rebuild SNR thresholds
+      BuildSnrThresholds ();
+      it = std::find_if (m_thresholds.begin (), m_thresholds.end (),
+          [&txVector] (const std::pair<double, WifiTxVector>& p) -> bool {
+              return ((txVector.GetMode () == p.second.GetMode ()) && (txVector.GetNss () == p.second.GetNss ()) && (txVector.GetChannelWidth () == p.second.GetChannelWidth ()));
+          }
+      );
+      NS_ASSERT_MSG (it != m_thresholds.end (), "SNR threshold not found");
+  }
+  return it->first;
+}
+
+void
+IdealWifiManager::AddSnrThreshold (WifiTxVector txVector, double snr)
+{
+  NS_LOG_FUNCTION (this << txVector.GetMode ().GetUniqueName () << txVector.GetChannelWidth () << snr);
+  m_thresholds.push_back (std::make_pair (snr, txVector));
+}
+
+WifiRemoteStation *
+IdealWifiManager::DoCreateStation (void) const
+{
+  NS_LOG_FUNCTION (this);
+  IdealWifiRemoteStation *station = new IdealWifiRemoteStation ();
+  Reset (station);
+  return station;
+}
+
+void
+IdealWifiManager::Reset (WifiRemoteStation *station) const
+{
+  NS_LOG_FUNCTION (this << station);
+  IdealWifiRemoteStation *st = static_cast<IdealWifiRemoteStation*> (station);
+  st->m_lastSnrObserved = 0.0;
+  st->m_lastChannelWidthObserved = 0;
+  st->m_lastNssObserved = 1;
+  st->m_lastSnrCached = CACHE_INITIAL_VALUE;
+  st->m_lastMode = GetDefaultMode ();
+  st->m_lastChannelWidth = 0;
+  st->m_lastNss = 1;
+}
+
+void
+IdealWifiManager::DoReportRxOk (WifiRemoteStation *station, double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
+}
+
+void
+IdealWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+IdealWifiManager::DoReportDataFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+IdealWifiManager::DoReportRtsOk (WifiRemoteStation *st,
+                                 double ctsSnr, WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode.GetUniqueName () << rtsSnr);
+  IdealWifiRemoteStation *station = static_cast<IdealWifiRemoteStation*> (st);
+  station->m_lastSnrObserved = rtsSnr;
+  station->m_lastChannelWidthObserved = GetPhy ()->GetChannelWidth () >= 40 ? 20 : GetPhy ()->GetChannelWidth ();
+  station->m_lastNssObserved = 1;
+}
+
+void
+IdealWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                  double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode.GetUniqueName () << dataSnr << dataChannelWidth << +dataNss);
+  IdealWifiRemoteStation *station = static_cast<IdealWifiRemoteStation*> (st);
+  if (dataSnr == 0)
+    {
+      NS_LOG_WARN ("DataSnr reported to be zero; not saving this report.");
+      return;
+    }
+  station->m_lastSnrObserved = dataSnr;
+  station->m_lastChannelWidthObserved = dataChannelWidth;
+  station->m_lastNssObserved = dataNss;
+}
+
+void
+IdealWifiManager::DoReportAmpduTxStatus (WifiRemoteStation *st, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus,
+                                         double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << nSuccessfulMpdus << nFailedMpdus << rxSnr << dataSnr << dataChannelWidth << +dataNss);
+  IdealWifiRemoteStation *station = static_cast<IdealWifiRemoteStation*> (st);
+  if (dataSnr == 0)
+    {
+      NS_LOG_WARN ("DataSnr reported to be zero; not saving this report.");
+      return;
+    }
+  station->m_lastSnrObserved = dataSnr;
+  station->m_lastChannelWidthObserved = dataChannelWidth;
+  station->m_lastNssObserved = dataNss;
+}
+
+void
+IdealWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  Reset (station);
+}
+
+void
+IdealWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  Reset (station);
+}
+
+WifiTxVector
+IdealWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  IdealWifiRemoteStation *station = static_cast<IdealWifiRemoteStation*> (st);
+  //We search within the Supported rate set the mode with the
+  //highest data rate for which the SNR threshold is smaller than m_lastSnr
+  //to ensure correct packet delivery.
+  WifiMode maxMode = GetDefaultMode ();
+  WifiTxVector txVector;
+  WifiMode mode;
+  uint64_t bestRate = 0;
+  uint8_t selectedNss = 1;
+  uint16_t guardInterval;
+  uint16_t channelWidth = std::min (GetChannelWidth (station), GetPhy ()->GetChannelWidth ());
+  txVector.SetChannelWidth (channelWidth);
+  if ((station->m_lastSnrCached != CACHE_INITIAL_VALUE) && (station->m_lastSnrObserved == station->m_lastSnrCached) && (channelWidth == station->m_lastChannelWidth))
+    {
+      // SNR has not changed, so skip the search and use the last mode selected
+      maxMode = station->m_lastMode;
+      selectedNss = station->m_lastNss;
+      NS_LOG_DEBUG ("Using cached mode = " << maxMode.GetUniqueName () <<
+                    " last snr observed " << station->m_lastSnrObserved <<
+                    " cached " << station->m_lastSnrCached <<
+                    " channel width " << station->m_lastChannelWidth <<
+                    " nss " << +selectedNss);
+    }
+  else
+    {
+      if (GetHtSupported () && GetHtSupported (st))
+        {
+          for (uint8_t i = 0; i < GetNMcsSupported (station); i++)
+            {
+              mode = GetMcsSupported (station, i);
+              txVector.SetMode (mode);
+              if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
+                {
+                  guardInterval = static_cast<uint16_t> (std::max (GetShortGuardIntervalSupported (station) ? 400 : 800, GetShortGuardIntervalSupported () ? 400 : 800));
+                  txVector.SetGuardInterval (guardInterval);
+                  // If the node and peer are both VHT capable, only search VHT modes
+                  if (GetVhtSupported () && GetVhtSupported (station))
+                    {
+                      continue;
+                    }
+                  // If the node and peer are both HE capable, only search HE modes
+                  if (GetHeSupported () && GetHeSupported (station))
+                    {
+                      continue;
+                    }
+                  // Derive NSS from the MCS index. There is a different mode for each possible NSS value.
+                  uint8_t nss = (mode.GetMcsValue () / 8) + 1;
+                  txVector.SetNss (nss);
+                  if (!txVector.IsValid ()
+                      || nss > std::min (GetMaxNumberOfTransmitStreams (), GetNumberOfSupportedStreams (st)))
+                    {
+                      NS_LOG_DEBUG ("Skipping mode " << mode.GetUniqueName () <<
+                                    " nss " << +nss <<
+                                    " width " << txVector.GetChannelWidth ());
+                      continue;
+                    }
+                  double threshold = GetSnrThreshold (txVector);
+                  uint64_t dataRate = mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), nss);
+                  NS_LOG_DEBUG ("Testing mode " << mode.GetUniqueName () <<
+                                " data rate " << dataRate <<
+                                " threshold " << threshold  << " last snr observed " <<
+                                station->m_lastSnrObserved << " cached " <<
+                                station->m_lastSnrCached);
+                  double snr = GetLastObservedSnr (station, channelWidth, nss);
+                  if (dataRate > bestRate && threshold < snr)
+                    {
+                      NS_LOG_DEBUG ("Candidate mode = " << mode.GetUniqueName () <<
+                                    " data rate " << dataRate <<
+                                    " threshold " << threshold  <<
+                                    " channel width " << channelWidth <<
+                                    " snr " << snr);
+                      bestRate = dataRate;
+                      maxMode = mode;
+                      selectedNss = nss;
+                    }
+                }
+              else if (mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
+                {
+                  guardInterval = static_cast<uint16_t> (std::max (GetShortGuardIntervalSupported (station) ? 400 : 800, GetShortGuardIntervalSupported () ? 400 : 800));
+                  txVector.SetGuardInterval (guardInterval);
+                  // If the node and peer are both HE capable, only search HE modes
+                  if (GetHeSupported () && GetHeSupported (station))
+                    {
+                      continue;
+                    }
+                  // If the node and peer are not both VHT capable, only search HT modes
+                  if (!GetVhtSupported () || !GetVhtSupported (station))
+                    {
+                      continue;
+                    }
+                  for (uint8_t nss = 1; nss <= std::min (GetMaxNumberOfTransmitStreams (), GetNumberOfSupportedStreams (station)); nss++)
+                    {
+                      txVector.SetNss (nss);
+                      if (!txVector.IsValid ())
+                        {
+                          NS_LOG_DEBUG ("Skipping mode " << mode.GetUniqueName () <<
+                                        " nss " << +nss <<
+                                        " width " << txVector.GetChannelWidth ());
+                          continue;
+                        }
+                      double threshold = GetSnrThreshold (txVector);
+                      uint64_t dataRate = mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), nss);
+                      NS_LOG_DEBUG ("Testing mode = " << mode.GetUniqueName () <<
+                                    " data rate " << dataRate <<
+                                    " threshold " << threshold << " last snr observed " <<
+                                    station->m_lastSnrObserved << " cached " <<
+                                    station->m_lastSnrCached);
+                      double snr = GetLastObservedSnr (station, channelWidth, nss);
+                      if (dataRate > bestRate && threshold < snr)
+                        {
+                          NS_LOG_DEBUG ("Candidate mode = " << mode.GetUniqueName () <<
+                                        " data rate " << dataRate <<
+                                        " channel width " << channelWidth <<
+                                        " snr " << snr);
+                          bestRate = dataRate;
+                          maxMode = mode;
+                          selectedNss = nss;
+                        }
+                    }
+                }
+              else //HE
+                {
+                  guardInterval = std::max (GetGuardInterval (station), GetGuardInterval ());
+                  txVector.SetGuardInterval (guardInterval);
+                  // If the node and peer are not both HE capable, only search (V)HT modes
+                  if (!GetHeSupported () || !GetHeSupported (station))
+                    {
+                      continue;
+                    }
+                  for (uint8_t nss = 1; nss <= std::min (GetMaxNumberOfTransmitStreams (), GetNumberOfSupportedStreams (station)); nss++)
+                    {
+                      txVector.SetNss (nss);
+                      if (!txVector.IsValid ())
+                        {
+                          NS_LOG_DEBUG ("Skipping mode " << mode.GetUniqueName () <<
+                                        " nss " << +nss <<
+                                        " width " << +txVector.GetChannelWidth ());
+                          continue;
+                        }
+                      double threshold = GetSnrThreshold (txVector);
+                      uint64_t dataRate = mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), nss);
+                      NS_LOG_DEBUG ("Testing mode = " << mode.GetUniqueName () <<
+                                    " data rate " << dataRate <<
+                                    " threshold " << threshold  << " last snr observed " <<
+                                    station->m_lastSnrObserved << " cached " <<
+                                    station->m_lastSnrCached);
+                      double snr = GetLastObservedSnr (station, channelWidth, nss);
+                      if (dataRate > bestRate && threshold < snr)
+                        {
+                          NS_LOG_DEBUG ("Candidate mode = " << mode.GetUniqueName () <<
+                                        " data rate " << dataRate <<
+                                        " threshold " << threshold  <<
+                                        " channel width " << channelWidth <<
+                                        " snr " << snr);
+                          bestRate = dataRate;
+                          maxMode = mode;
+                          selectedNss = nss;
+                        }
+                    }
+                }
+            }
+        }
+      else
+        {
+          // Non-HT selection
+          selectedNss = 1;
+          for (uint8_t i = 0; i < GetNSupported (station); i++)
+            {
+              mode = GetSupported (station, i);
+              txVector.SetMode (mode);
+              txVector.SetNss (selectedNss);
+              uint16_t channelWidth = GetChannelWidthForNonHtMode (mode);
+              txVector.SetChannelWidth (channelWidth);
+              double threshold = GetSnrThreshold (txVector);
+              uint64_t dataRate = mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), txVector.GetNss ());
+              NS_LOG_DEBUG ("mode = " << mode.GetUniqueName () <<
+                            " threshold " << threshold  <<
+                            " last snr observed " <<
+                            station->m_lastSnrObserved);
+              double snr = GetLastObservedSnr (station, channelWidth, 1);
+              if (dataRate > bestRate && threshold < snr)
+                {
+                  NS_LOG_DEBUG ("Candidate mode = " << mode.GetUniqueName () <<
+                                " data rate " << dataRate <<
+                                " threshold " << threshold  <<
+                                " snr " << snr);
+                  bestRate = dataRate;
+                  maxMode = mode;
+                }
+            }
+        }
+      NS_LOG_DEBUG ("Updating cached values for station to " <<  maxMode.GetUniqueName () << " snr " << station->m_lastSnrObserved);
+      station->m_lastSnrCached = station->m_lastSnrObserved;
+      station->m_lastMode = maxMode;
+      station->m_lastNss = selectedNss;
+    }
+  NS_LOG_DEBUG ("Found maxMode: " << maxMode << " channelWidth: " << channelWidth << " nss: " << +selectedNss);
+  station->m_lastChannelWidth = channelWidth;
+  if (maxMode.GetModulationClass () == WIFI_MOD_CLASS_HE)
+    {
+      guardInterval = std::max (GetGuardInterval (station), GetGuardInterval ());
+    }
+  else if ((maxMode.GetModulationClass () == WIFI_MOD_CLASS_HT) || (maxMode.GetModulationClass () == WIFI_MOD_CLASS_VHT))
+    {
+      guardInterval = static_cast<uint16_t> (std::max (GetShortGuardIntervalSupported (station) ? 400 : 800, GetShortGuardIntervalSupported () ? 400 : 800));
+    }
+  else
+    {
+      guardInterval = 800;
+    }
+  if (m_currentRate != maxMode.GetDataRate (channelWidth, guardInterval, selectedNss))
+    {
+      NS_LOG_DEBUG ("New datarate: " << maxMode.GetDataRate (channelWidth, guardInterval, selectedNss));
+      m_currentRate = maxMode.GetDataRate (channelWidth, guardInterval, selectedNss);
+    }
+  return WifiTxVector (maxMode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (maxMode.GetModulationClass (), GetShortPreambleEnabled ()), guardInterval, GetNumberOfAntennas (), selectedNss, 0, GetChannelWidthForTransmission (maxMode, channelWidth), GetAggregation (station));
+}
+
+WifiTxVector
+IdealWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  IdealWifiRemoteStation *station = static_cast<IdealWifiRemoteStation*> (st);
+  //We search within the Basic rate set the mode with the highest
+  //SNR threshold possible which is smaller than m_lastSnr to
+  //ensure correct packet delivery.
+  double maxThreshold = 0.0;
+  WifiTxVector txVector;
+  WifiMode mode;
+  uint8_t nss = 1;
+  WifiMode maxMode = GetDefaultMode ();
+  //RTS is sent in a non-HT frame
+  for (uint8_t i = 0; i < GetNBasicModes (); i++)
+    {
+      mode = GetBasicMode (i);
+      txVector.SetMode (mode);
+      txVector.SetNss (nss);
+      txVector.SetChannelWidth (GetChannelWidthForNonHtMode (mode));
+      double threshold = GetSnrThreshold (txVector);
+      if (threshold > maxThreshold && threshold < station->m_lastSnrObserved)
+        {
+          maxThreshold = threshold;
+          maxMode = mode;
+        }
+    }
+  return WifiTxVector (maxMode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (maxMode.GetModulationClass (), GetShortPreambleEnabled ()), 800, GetNumberOfAntennas (), nss, 0, GetChannelWidthForNonHtMode (maxMode), GetAggregation (station));
+}
+
+double
+IdealWifiManager::GetLastObservedSnr (IdealWifiRemoteStation *station, uint16_t channelWidth, uint8_t nss) const
+{
+  double snr = station->m_lastSnrObserved;
+  if (channelWidth != station->m_lastChannelWidthObserved)
+    {
+      snr /= (static_cast<double> (channelWidth) / station->m_lastChannelWidthObserved);
+    }
+  if (nss != station->m_lastNssObserved)
+    {
+      snr /= (static_cast<double> (nss) / station->m_lastNssObserved);
+    }
+  NS_LOG_DEBUG ("Last observed SNR is " << station->m_lastSnrObserved <<
+                " for channel width " << station->m_lastChannelWidthObserved <<
+                " and nss " << +station->m_lastNssObserved <<
+                "; computed SNR is " << snr <<
+                " for channel width " << channelWidth <<
+                " and nss " << +nss);
+  return snr;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/ideal-wifi-manager.h ns-3.34/src/wifi/model/rate-control/ideal-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/ideal-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/ideal-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,143 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#ifndef IDEAL_WIFI_MANAGER_H
+#define IDEAL_WIFI_MANAGER_H
+
+#include "ns3/traced-value.h"
+#include "ns3/wifi-remote-station-manager.h"
+
+namespace ns3 {
+
+struct IdealWifiRemoteStation;
+
+/**
+ * \brief Ideal rate control algorithm
+ * \ingroup wifi
+ *
+ * This class implements an 'ideal' rate control algorithm
+ * similar to RBAR in spirit (see <i>A rate-adaptive MAC
+ * protocol for multihop wireless networks</i> by G. Holland,
+ * N. Vaidya, and P. Bahl.): every station keeps track of the
+ * SNR of every packet received and sends back this SNR to the
+ * original transmitter by an out-of-band mechanism. Each
+ * transmitter keeps track of the last SNR sent back by a receiver
+ * and uses it to pick a transmission mode based on a set
+ * of SNR thresholds built from a target BER and transmission
+ * mode-specific SNR/BER curves.
+ */
+class IdealWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  IdealWifiManager ();
+  virtual ~IdealWifiManager ();
+
+  void SetupPhy (const Ptr<WifiPhy> phy) override;
+
+
+private:
+  void DoInitialize (void) override;
+  WifiRemoteStation* DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportAmpduTxStatus (WifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus,
+                              double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+
+  /**
+   * Reset the station, invoked if the maximum amount of retries has failed.
+   *
+   * \param station the station for which statistics should be reset
+   */
+  void Reset (WifiRemoteStation *station) const;
+
+  /**
+   * Construct the vector of minimum SNRs needed to successfully transmit for
+   * all possible combinations (rate, channel width, nss) based on PHY capabilities.
+   * This is called at initialization and if PHY capabilities changed.
+   */
+  void BuildSnrThresholds (void);
+
+  /**
+   * Return the minimum SNR needed to successfully transmit
+   * data with this WifiTxVector at the specified BER.
+   *
+   * \param txVector WifiTxVector (containing valid mode, width, and Nss)
+   *
+   * \return the minimum SNR for the given WifiTxVector in linear scale
+   */
+  double GetSnrThreshold (WifiTxVector txVector);
+  /**
+   * Adds a pair of WifiTxVector and the minimum SNR for that given vector
+   * to the list.
+   *
+   * \param txVector the WifiTxVector storing mode, channel width, and Nss
+   * \param snr the minimum SNR for the given txVector in linear scale
+   */
+  void AddSnrThreshold (WifiTxVector txVector, double snr);
+
+  /**
+   * Convenience function for selecting a channel width for non-HT mode
+   * \param mode non-HT WifiMode
+   * \return the channel width (MHz) for the selected mode
+   */
+  uint16_t GetChannelWidthForNonHtMode (WifiMode mode) const;
+
+  /**
+   * Convenience function to get the last observed SNR from a given station for a given channel width and a given NSS.
+   * Since the previously received SNR information might be related to a different channel width than the requested one,
+   * and/or a different NSS,  the function does some computations to get the corresponding SNR.
+   *
+   * \param station the station being queried
+   * \param channelWidth the channel width (in MHz)
+   * \param nss the number of spatial streams
+   * \return the SNR in linear scale
+   */
+  double GetLastObservedSnr (IdealWifiRemoteStation *station, uint16_t channelWidth, uint8_t nss) const;
+
+  /**
+   * A vector of <snr, WifiTxVector> pair holding the minimum SNR for the
+   * WifiTxVector
+   */
+  typedef std::vector<std::pair<double, WifiTxVector> > Thresholds;
+
+  double m_ber;             //!< The maximum Bit Error Rate acceptable at any transmission mode
+  Thresholds m_thresholds;  //!< List of WifiTxVector and the minimum SNR pair
+
+  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
+};
+
+} //namespace ns3
+
+#endif /* IDEAL_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,1973 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 Duy Nguyen
+ * Copyright (c) 2015 Ghada Badawy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Duy Nguyen <duy@soe.ucsc.edu>
+ *          Ghada Badawy <gbadawy@gmail.com>
+ *          Matias Richart <mrichart@fing.edu.uy>
+ *
+ * Some Comments:
+ *
+ * 1) By default, Minstrel applies the multi-rate retry (the core of Minstrel
+ *    algorithm). Otherwise, please use ConstantRateWifiManager instead.
+ *
+ * 2) Sampling is done differently from legacy Minstrel. Minstrel-HT tries
+ * to sample all rates in all groups at least once and to avoid many
+ * consecutive samplings.
+ *
+ * 3) Sample rate is tried only once, at first place of the MRR chain.
+ *
+ * reference: http://lwn.net/Articles/376765/
+ */
+
+#include <iomanip>
+#include "ns3/packet.h"
+#include "ns3/simulator.h"
+#include "ns3/log.h"
+#include "ns3/random-variable-stream.h"
+#include "minstrel-ht-wifi-manager.h"
+#include "ns3/wifi-mac.h"
+#include "ns3/wifi-phy.h"
+
+#define Min(a,b) ((a < b) ? a : b)
+#define Max(a,b) ((a > b) ? a : b)
+
+NS_LOG_COMPONENT_DEFINE ("MinstrelHtWifiManager");
+
+namespace ns3 {
+
+///MinstrelHtWifiRemoteStation structure
+struct MinstrelHtWifiRemoteStation : MinstrelWifiRemoteStation
+{
+  uint8_t m_sampleGroup;     //!< The group that the sample rate belongs to.
+
+  uint32_t m_sampleWait;      //!< How many transmission attempts to wait until a new sample.
+  uint32_t m_sampleTries;     //!< Number of sample tries after waiting sampleWait.
+  uint32_t m_sampleCount;     //!< Max number of samples per update interval.
+  uint32_t m_numSamplesSlow;  //!< Number of times a slow rate was sampled.
+
+  uint32_t m_avgAmpduLen;      //!< Average number of MPDUs in an A-MPDU.
+  uint32_t m_ampduLen;         //!< Number of MPDUs in an A-MPDU.
+  uint32_t m_ampduPacketCount; //!< Number of A-MPDUs transmitted.
+
+  McsGroupData m_groupsTable;  //!< Table of groups with stats.
+  bool m_isHt;                 //!< If the station is HT capable.
+
+  std::ofstream m_statsFile;   //!< File where statistics table is written.
+};
+
+NS_OBJECT_ENSURE_REGISTERED (MinstrelHtWifiManager);
+
+TypeId
+MinstrelHtWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::MinstrelHtWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .AddConstructor<MinstrelHtWifiManager> ()
+    .SetGroupName ("Wifi")
+    .AddAttribute ("UpdateStatistics",
+                   "The interval between updating statistics table ",
+                   TimeValue (MilliSeconds (50)),
+                   MakeTimeAccessor (&MinstrelHtWifiManager::m_updateStats),
+                   MakeTimeChecker ())
+    .AddAttribute ("LegacyUpdateStatistics",
+                   "The interval between updating statistics table (for legacy Minstrel) ",
+                   TimeValue (MilliSeconds (100)),
+                   MakeTimeAccessor (&MinstrelHtWifiManager::m_legacyUpdateStats),
+                   MakeTimeChecker ())
+    .AddAttribute ("LookAroundRate",
+                   "The percentage to try other rates (for legacy Minstrel)",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&MinstrelHtWifiManager::m_lookAroundRate),
+                   MakeUintegerChecker<uint8_t>(0, 100))
+    .AddAttribute ("EWMA",
+                   "EWMA level",
+                   UintegerValue (75),
+                   MakeUintegerAccessor (&MinstrelHtWifiManager::m_ewmaLevel),
+                   MakeUintegerChecker<uint8_t>(0, 100))
+    .AddAttribute ("SampleColumn",
+                   "The number of columns used for sampling",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&MinstrelHtWifiManager::m_nSampleCol),
+                   MakeUintegerChecker <uint8_t> ())
+    .AddAttribute ("PacketLength",
+                   "The packet length used for calculating mode TxTime (bytes)",
+                   UintegerValue (1200),
+                   MakeUintegerAccessor (&MinstrelHtWifiManager::m_frameLength),
+                   MakeUintegerChecker <uint32_t> ())
+    .AddAttribute ("UseLatestAmendmentOnly",
+                   "Use only the latest amendment when it is supported by both peers",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&MinstrelHtWifiManager::m_useLatestAmendmentOnly),
+                   MakeBooleanChecker ())
+    .AddAttribute ("PrintStats",
+                   "Control the printing of the statistics table",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&MinstrelHtWifiManager::m_printStats),
+                   MakeBooleanChecker ())
+    .AddTraceSource ("Rate",
+                     "Traced value for rate changes (b/s)",
+                     MakeTraceSourceAccessor (&MinstrelHtWifiManager::m_currentRate),
+                     "ns3::TracedValueCallback::Uint64")
+  ;
+  return tid;
+}
+
+MinstrelHtWifiManager::MinstrelHtWifiManager ()
+  : m_numGroups (0),
+    m_numRates (0),
+    m_currentRate (0)
+{
+  NS_LOG_FUNCTION (this);
+  m_uniformRandomVariable = CreateObject<UniformRandomVariable> ();
+  /**
+   *  Create the legacy Minstrel manager in case HT is not supported by the device
+   *  or non-HT stations want to associate.
+   */
+  m_legacyManager = CreateObject<MinstrelWifiManager> ();
+}
+
+MinstrelHtWifiManager::~MinstrelHtWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+  for (uint8_t i = 0; i < m_numGroups; i++)
+    {
+      m_minstrelGroups[i].ratesFirstMpduTxTimeTable.clear ();
+      m_minstrelGroups[i].ratesTxTimeTable.clear ();
+    }
+}
+
+int64_t
+MinstrelHtWifiManager::AssignStreams (int64_t stream)
+{
+  NS_LOG_FUNCTION (this << stream);
+  int64_t numStreamsAssigned = 0;
+  m_uniformRandomVariable->SetStream (stream);
+  numStreamsAssigned++;
+  numStreamsAssigned += m_legacyManager->AssignStreams (stream);
+  return numStreamsAssigned;
+}
+
+void
+MinstrelHtWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
+{
+  NS_LOG_FUNCTION (this << phy);
+  // Setup PHY for legacy manager.
+  m_legacyManager->SetupPhy (phy);
+  WifiRemoteStationManager::SetupPhy (phy);
+}
+
+void
+MinstrelHtWifiManager::SetupMac (const Ptr<WifiMac> mac)
+{
+  NS_LOG_FUNCTION (this << mac);
+  m_legacyManager->SetupMac (mac);
+  WifiRemoteStationManager::SetupMac (mac);
+}
+
+void
+MinstrelHtWifiManager::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  /**
+   * Here we initialize m_minstrelGroups with all the possible groups.
+   * If a group is not supported by the device, then it is marked as not supported.
+   * Then, after all initializations are finished, we check actual support for each receiving station.
+   */
+
+  if (GetHtSupported ())
+    {
+      m_numGroups = MAX_HT_SUPPORTED_STREAMS * MAX_HT_STREAM_GROUPS;
+      m_numRates = MAX_HT_GROUP_RATES;
+      if (GetVhtSupported ())
+        {
+          m_numGroups += MAX_VHT_SUPPORTED_STREAMS * MAX_VHT_STREAM_GROUPS;
+          m_numRates = MAX_VHT_GROUP_RATES;
+        }
+      if (GetHeSupported ())
+        {
+          m_numGroups += MAX_HE_SUPPORTED_STREAMS * MAX_HE_STREAM_GROUPS;
+          m_numRates = MAX_HE_GROUP_RATES;
+        }
+
+      /**
+       *  Initialize the groups array.
+       *  The HT groups come first, then the VHT ones, and finally the HE ones.
+       *  Minstrel maintains different types of indexes:
+       *  - A global continuous index, which identifies all rates within all groups, in [0, m_numGroups * m_numRates]
+       *  - A groupId, which indexes a group in the array, in [0, m_numGroups]
+       *  - A rateId, which identifies a rate within a group, in [0, m_numRates]
+       *  - A deviceIndex, which indexes a MCS in the PHY MCS array.
+       *  - A mcsIndex, which indexes a MCS in the wifi-remote-station-manager supported MCSs array.
+       */
+      NS_LOG_DEBUG ("Initialize MCS Groups:");
+      m_minstrelGroups = MinstrelMcsGroups (m_numGroups);
+
+      // Initialize all HT groups
+      for (uint16_t chWidth = 20; chWidth <= MAX_HT_WIDTH; chWidth *= 2)
+        {
+          for (int gi = 800; gi >= 400; )
+            {
+              for (uint8_t streams = 1; streams <= MAX_HT_SUPPORTED_STREAMS; streams++)
+                {
+                  uint8_t groupId = GetHtGroupId (streams, gi, chWidth);
+
+                  m_minstrelGroups[groupId].streams = streams;
+                  m_minstrelGroups[groupId].gi = gi;
+                  m_minstrelGroups[groupId].chWidth = chWidth;
+                  m_minstrelGroups[groupId].type = GROUP_HT;
+                  m_minstrelGroups[groupId].isSupported = false;
+
+                  // Check capabilities of the device
+                  if (!(!GetShortGuardIntervalSupported () && (gi == 400)) ///Is SGI supported by the transmitter?
+                      && (GetPhy ()->GetChannelWidth () >= chWidth) ///Is channel width supported by the transmitter?
+                      && (GetPhy ()->GetMaxSupportedTxSpatialStreams () >= streams)) ///Are streams supported by the transmitter?
+                    {
+                      m_minstrelGroups[groupId].isSupported = true;
+
+                      // Calculate TX time for all rates of the group
+                      WifiModeList htMcsList = GetHtDeviceMcsList ();
+                      for (uint8_t i = 0; i < MAX_HT_GROUP_RATES; i++)
+                        {
+                          uint16_t deviceIndex = i + (m_minstrelGroups[groupId].streams - 1) * 8;
+                          WifiMode mode =  htMcsList[deviceIndex];
+                          AddFirstMpduTxTime (groupId, mode, CalculateMpduTxDuration (GetPhy (), streams, gi, chWidth, mode, FIRST_MPDU_IN_AGGREGATE));
+                          AddMpduTxTime (groupId, mode, CalculateMpduTxDuration (GetPhy (), streams, gi, chWidth, mode, MIDDLE_MPDU_IN_AGGREGATE));
+                        }
+                      NS_LOG_DEBUG ("Initialized group " << +groupId << ": (" << +streams << "," << gi << "," << chWidth << ")");
+                    }
+                }
+              gi /= 2;
+            }
+        }
+
+      if (GetVhtSupported ())
+        {
+          // Initialize all VHT groups
+          for (uint16_t chWidth = 20; chWidth <= MAX_VHT_WIDTH; chWidth *= 2)
+            {
+              for (int gi = 800; gi >= 400; )
+                {
+                  for (uint8_t streams = 1; streams <= MAX_VHT_SUPPORTED_STREAMS; streams++)
+                    {
+                      uint8_t groupId = GetVhtGroupId (streams, gi, chWidth);
+
+                      m_minstrelGroups[groupId].streams = streams;
+                      m_minstrelGroups[groupId].gi = gi;
+                      m_minstrelGroups[groupId].chWidth = chWidth;
+                      m_minstrelGroups[groupId].type = GROUP_VHT;
+                      m_minstrelGroups[groupId].isSupported = false;
+
+                      // Check capabilities of the device
+                      if (!(!GetShortGuardIntervalSupported () && (gi == 400)) ///Is SGI supported by the transmitter?
+                          && (GetPhy ()->GetChannelWidth () >= chWidth) ///Is channel width supported by the transmitter?
+                          && (GetPhy ()->GetMaxSupportedTxSpatialStreams () >= streams)) ///Are streams supported by the transmitter?
+                        {
+                          m_minstrelGroups[groupId].isSupported = true;
+
+                          // Calculate TX time for all rates of the group
+                          WifiModeList vhtMcsList = GetVhtDeviceMcsList ();
+                          for (uint8_t i = 0; i < MAX_VHT_GROUP_RATES; i++)
+                            {
+                              WifiMode mode = vhtMcsList[i];
+                              // Check for invalid VHT MCSs and do not add time to array.
+                              if (IsValidMcs (GetPhy (), streams, chWidth, mode))
+                                {
+                                  AddFirstMpduTxTime (groupId, mode, CalculateMpduTxDuration (GetPhy (), streams, gi, chWidth, mode, FIRST_MPDU_IN_AGGREGATE));
+                                  AddMpduTxTime (groupId, mode, CalculateMpduTxDuration (GetPhy (), streams, gi, chWidth, mode, MIDDLE_MPDU_IN_AGGREGATE));
+                                }
+                            }
+                          NS_LOG_DEBUG ("Initialized group " << +groupId << ": (" << +streams << "," << gi << "," << chWidth << ")");
+                        }
+                    }
+                  gi /= 2;
+                }
+            }
+        }
+
+      if (GetHeSupported ())
+        {
+          // Initialize all HE groups
+          for (uint16_t chWidth = 20; chWidth <= MAX_HE_WIDTH; chWidth *= 2)
+            {
+              for (int gi = 3200; gi >= 800; )
+                {
+                  for (uint8_t streams = 1; streams <= MAX_HE_SUPPORTED_STREAMS; streams++)
+                    {
+                      uint8_t groupId = GetHeGroupId (streams, gi, chWidth);
+
+                      m_minstrelGroups[groupId].streams = streams;
+                      m_minstrelGroups[groupId].gi = gi;
+                      m_minstrelGroups[groupId].chWidth = chWidth;
+                      m_minstrelGroups[groupId].type = GROUP_HE;
+                      m_minstrelGroups[groupId].isSupported = false;
+
+                      // Check capabilities of the device
+                      if ((GetGuardInterval () <= gi) ///Is GI supported by the transmitter?
+                          && (GetPhy ()->GetChannelWidth () >= chWidth) ///Is channel width supported by the transmitter?
+                          && (GetPhy ()->GetMaxSupportedTxSpatialStreams () >= streams)) ///Are streams supported by the transmitter?
+                        {
+                          m_minstrelGroups[groupId].isSupported = true;
+
+                          // Calculate tx time for all rates of the group
+                          WifiModeList heMcsList = GetHeDeviceMcsList ();
+                          for (uint8_t i = 0; i < MAX_HE_GROUP_RATES; i++)
+                            {
+                              WifiMode mode = heMcsList.at (i);
+                              // Check for invalid HE MCSs and do not add time to array.
+                              if (IsValidMcs (GetPhy (), streams, chWidth, mode))
+                                {
+                                  AddFirstMpduTxTime (groupId, mode, CalculateMpduTxDuration (GetPhy (), streams, gi, chWidth, mode, FIRST_MPDU_IN_AGGREGATE));
+                                  AddMpduTxTime (groupId, mode, CalculateMpduTxDuration (GetPhy (), streams, gi, chWidth, mode, MIDDLE_MPDU_IN_AGGREGATE));
+                                }
+                            }
+                          NS_LOG_DEBUG ("Initialized group " << +groupId << ": (" << +streams << "," << gi << "," << chWidth << ")");
+                        }
+                    }
+                  gi /= 2;
+                }
+            }
+        }
+    }
+}
+
+bool
+MinstrelHtWifiManager::IsValidMcs (Ptr<WifiPhy> phy, uint8_t streams, uint16_t chWidth, WifiMode mode)
+{
+  NS_LOG_FUNCTION (this << phy << +streams << chWidth << mode);
+  WifiTxVector txvector;
+  txvector.SetNss (streams);
+  txvector.SetChannelWidth (chWidth);
+  txvector.SetMode (mode);
+  return txvector.IsValid ();
+}
+
+Time
+MinstrelHtWifiManager::CalculateMpduTxDuration (Ptr<WifiPhy> phy, uint8_t streams, uint16_t gi,
+                                                uint16_t chWidth, WifiMode mode, MpduType mpduType)
+{
+  NS_LOG_FUNCTION (this << phy << +streams << gi << chWidth << mode << mpduType);
+  WifiTxVector txvector;
+  txvector.SetNss (streams);
+  txvector.SetGuardInterval (gi);
+  txvector.SetChannelWidth (chWidth);
+  txvector.SetNess (0);
+  txvector.SetStbc (0);
+  txvector.SetMode (mode);
+  txvector.SetPreambleType (WIFI_PREAMBLE_HT_MF);
+  return WifiPhy::CalculatePhyPreambleAndHeaderDuration (txvector)
+         + WifiPhy::GetPayloadDuration (m_frameLength, txvector, phy->GetPhyBand (), mpduType);
+}
+
+Time
+MinstrelHtWifiManager::GetFirstMpduTxTime (uint8_t groupId, WifiMode mode) const
+{
+  NS_LOG_FUNCTION (this << +groupId << mode);
+  auto it = m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.find (mode);
+  NS_ASSERT (it != m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.end ());
+  return it->second;
+}
+
+void
+MinstrelHtWifiManager::AddFirstMpduTxTime (uint8_t groupId, WifiMode mode, Time t)
+{
+  NS_LOG_FUNCTION (this << +groupId << mode << t);
+  m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.insert (std::make_pair (mode, t));
+}
+
+Time
+MinstrelHtWifiManager::GetMpduTxTime (uint8_t groupId, WifiMode mode) const
+{
+  NS_LOG_FUNCTION (this << +groupId << mode);
+  auto it = m_minstrelGroups[groupId].ratesTxTimeTable.find (mode);
+  NS_ASSERT (it != m_minstrelGroups[groupId].ratesTxTimeTable.end ());
+  return it->second;
+}
+
+void
+MinstrelHtWifiManager::AddMpduTxTime (uint8_t groupId, WifiMode mode, Time t)
+{
+  NS_LOG_FUNCTION (this << +groupId << mode << t);
+  m_minstrelGroups[groupId].ratesTxTimeTable.insert (std::make_pair (mode, t));
+}
+
+WifiRemoteStation *
+MinstrelHtWifiManager::DoCreateStation (void) const
+{
+  NS_LOG_FUNCTION (this);
+  MinstrelHtWifiRemoteStation *station = new MinstrelHtWifiRemoteStation ();
+
+  // Initialize variables common to both stations.
+  station->m_nextStatsUpdate = Simulator::Now () + m_updateStats;
+  station->m_col = 0;
+  station->m_index = 0;
+  station->m_maxTpRate = 0;
+  station->m_maxTpRate2 = 0;
+  station->m_maxProbRate = 0;
+  station->m_nModes = 0;
+  station->m_totalPacketsCount = 0;
+  station->m_samplePacketsCount = 0;
+  station->m_isSampling = false;
+  station->m_sampleRate = 0;
+  station->m_sampleDeferred = false;
+  station->m_shortRetry = 0;
+  station->m_longRetry = 0;
+  station->m_txrate = 0;
+  station->m_initialized = false;
+
+  // Variables specific to HT station
+  station->m_sampleGroup = 0;
+  station->m_numSamplesSlow = 0;
+  station->m_sampleCount = 16;
+  station->m_sampleWait = 0;
+  station->m_sampleTries = 4;
+
+  station->m_avgAmpduLen = 1;
+  station->m_ampduLen = 0;
+  station->m_ampduPacketCount = 0;
+
+  // If the device supports HT
+  if (GetHtSupported ())
+    {
+      /**
+       * Assume the station is HT.
+       * When correct information available it will be checked.
+       */
+      station->m_isHt = true;
+    }
+  // Use the variable in the station to indicate that the device do not support HT
+  else
+    {
+      station->m_isHt = false;
+    }
+
+  return station;
+}
+
+void
+MinstrelHtWifiManager::CheckInit (MinstrelHtWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  // Note: we appear to be doing late initialization of the table
+  // to make sure that the set of supported rates has been initialized
+  // before we perform our own initialization.
+  if (!station->m_initialized)
+    {
+      /**
+       *  Check if the station supports HT.
+       *  Assume that if the device do not supports HT then
+       *  the station will not support HT either.
+       *  We save from using another check and variable.
+       */
+      if (!GetHtSupported (station))
+        {
+          NS_LOG_INFO ("non-HT station " << station);
+          station->m_isHt = false;
+          // We will use non-HT minstrel for this station. Initialize the manager.
+          m_legacyManager->SetAttribute ("UpdateStatistics", TimeValue (m_legacyUpdateStats));
+          m_legacyManager->SetAttribute ("LookAroundRate", UintegerValue (m_lookAroundRate));
+          m_legacyManager->SetAttribute ("EWMA", UintegerValue (m_ewmaLevel));
+          m_legacyManager->SetAttribute ("SampleColumn", UintegerValue (m_nSampleCol));
+          m_legacyManager->SetAttribute ("PacketLength", UintegerValue (m_frameLength));
+          m_legacyManager->SetAttribute ("PrintStats", BooleanValue (m_printStats));
+          m_legacyManager->CheckInit (station);
+        }
+      else
+        {
+          NS_LOG_DEBUG ("HT station " << station);
+          station->m_isHt = true;
+          station->m_nModes = GetNMcsSupported (station);
+          station->m_minstrelTable = MinstrelRate (station->m_nModes);
+          station->m_sampleTable = SampleRate (m_numRates, std::vector<uint8_t> (m_nSampleCol));
+          InitSampleTable (station);
+          RateInit (station);
+          station->m_initialized = true;
+        }
+    }
+}
+
+void
+MinstrelHtWifiManager::DoReportRxOk (WifiRemoteStation *st, double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << st);
+  NS_LOG_DEBUG ("DoReportRxOk m_txrate=" << static_cast<MinstrelHtWifiRemoteStation*> (st)->m_txrate);
+}
+
+void
+MinstrelHtWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
+  CheckInit (station);
+  if (!station->m_initialized)
+    {
+      return;
+    }
+  NS_LOG_DEBUG ("DoReportRtsFailed m_txrate = " << station->m_txrate);
+  station->m_shortRetry++;
+}
+
+void
+MinstrelHtWifiManager::DoReportRtsOk (WifiRemoteStation *st, double ctsSnr, WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << st);
+}
+
+void
+MinstrelHtWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
+  NS_LOG_DEBUG ("Final RTS failed");
+  CheckInit (station);
+  if (!station->m_initialized)
+    {
+      return;
+    }
+  UpdateRetry (station);
+}
+
+void
+MinstrelHtWifiManager::DoReportDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
+
+  CheckInit (station);
+  if (!station->m_initialized)
+    {
+      return;
+    }
+
+  NS_LOG_DEBUG ("DoReportDataFailed " << station << "\t rate " << station->m_txrate << "\tlongRetry \t" << station->m_longRetry);
+
+  if (!station->m_isHt)
+    {
+      m_legacyManager->UpdateRate (station);
+    }
+  else if (station->m_longRetry < CountRetries (station))
+    {
+      uint8_t rateId = GetRateId (station->m_txrate);
+      uint8_t groupId = GetGroupId (station->m_txrate);
+      station->m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt++; // Increment the attempts counter for the rate used.
+      UpdateRate (station);
+    }
+}
+
+void
+MinstrelHtWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
+
+  CheckInit (station);
+  if (!station->m_initialized)
+    {
+      return;
+    }
+
+  NS_LOG_DEBUG ("DoReportDataOk m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (before update).");
+
+  if (!station->m_isHt)
+    {
+      station->m_minstrelTable[station->m_txrate].numRateSuccess++;
+      station->m_minstrelTable[station->m_txrate].numRateAttempt++;
+
+      m_legacyManager->UpdatePacketCounters (station);
+
+      NS_LOG_DEBUG ("DoReportDataOk m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (after update).");
+
+      UpdateRetry (station);
+      m_legacyManager->UpdateStats (station);
+
+      if (station->m_nModes >= 1)
+        {
+          station->m_txrate = m_legacyManager->FindRate (station);
+        }
+    }
+  else
+    {
+      uint8_t rateId = GetRateId (station->m_txrate);
+      uint8_t groupId = GetGroupId (station->m_txrate);
+      station->m_groupsTable[groupId].m_ratesTable[rateId].numRateSuccess++;
+      station->m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt++;
+
+      UpdatePacketCounters (station, 1, 0);
+
+      NS_LOG_DEBUG ("DoReportDataOk m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (after update).");
+
+      station->m_isSampling = false;
+      station->m_sampleDeferred = false;
+
+      UpdateRetry (station);
+      if (Simulator::Now () >=  station->m_nextStatsUpdate)
+        {
+          UpdateStats (station);
+        }
+
+      if (station->m_nModes >= 1)
+        {
+          station->m_txrate = FindRate (station);
+        }
+    }
+
+  NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate  );
+}
+
+void
+MinstrelHtWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
+
+  CheckInit (station);
+  if (!station->m_initialized)
+    {
+      return;
+    }
+
+  NS_LOG_DEBUG ("DoReportFinalDataFailed - TxRate=" << station->m_txrate);
+
+  if (!station->m_isHt)
+    {
+      m_legacyManager->UpdatePacketCounters (station);
+
+      UpdateRetry (station);
+
+      m_legacyManager->UpdateStats (station);
+      if (station->m_nModes >= 1)
+        {
+          station->m_txrate = m_legacyManager->FindRate (station);
+        }
+    }
+  else
+    {
+      UpdatePacketCounters (station, 0, 1);
+
+      station->m_isSampling = false;
+      station->m_sampleDeferred = false;
+
+      UpdateRetry (station);
+      if (Simulator::Now () >=  station->m_nextStatsUpdate)
+        {
+          UpdateStats (station);
+        }
+
+      if (station->m_nModes >= 1)
+        {
+          station->m_txrate = FindRate (station);
+        }
+    }
+  NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate);
+}
+
+void
+MinstrelHtWifiManager::DoReportAmpduTxStatus (WifiRemoteStation *st, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus,
+                                              double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << nSuccessfulMpdus << nFailedMpdus << rxSnr << dataSnr << dataChannelWidth << +dataNss);
+  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
+
+  CheckInit (station);
+  if (!station->m_initialized)
+    {
+      return;
+    }
+
+  NS_ASSERT_MSG (station->m_isHt, "A-MPDU Tx Status called but this is a non-HT STA.");
+
+  NS_LOG_DEBUG ("DoReportAmpduTxStatus. TxRate=" << station->m_txrate << " SuccMpdus=" <<
+                nSuccessfulMpdus << " FailedMpdus=" << nFailedMpdus);
+
+  station->m_ampduPacketCount++;
+  station->m_ampduLen += nSuccessfulMpdus + nFailedMpdus;
+
+  UpdatePacketCounters (station, nSuccessfulMpdus, nFailedMpdus);
+
+  uint8_t rateId = GetRateId (station->m_txrate);
+  uint8_t groupId = GetGroupId (station->m_txrate);
+  station->m_groupsTable[groupId].m_ratesTable[rateId].numRateSuccess += nSuccessfulMpdus;
+  station->m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt += nSuccessfulMpdus + nFailedMpdus;
+
+  if (nSuccessfulMpdus == 0 && station->m_longRetry < CountRetries (station))
+    {
+      // We do not receive a BlockAck. The entire AMPDU fail.
+      UpdateRate (station);
+    }
+  else
+    {
+      station->m_isSampling = false;
+      station->m_sampleDeferred = false;
+
+      UpdateRetry (station);
+      if (Simulator::Now () >=  station->m_nextStatsUpdate)
+        {
+          UpdateStats (station);
+        }
+
+      if (station->m_nModes >= 1)
+        {
+          station->m_txrate = FindRate (station);
+        }
+      NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate);
+    }
+}
+
+void
+MinstrelHtWifiManager::UpdateRate (MinstrelHtWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+
+  /**
+   * Retry Chain table is implemented here.
+   *
+   * FIXME
+   * Currently, NS3 does not retransmit an entire A-MPDU when BACK is missing
+   * but retransmits each MPDU until MPDUs lifetime expires (or a BACK is received).
+   * Then, there is no way to control A-MPDU retries (no call to NeedDataRetransmission).
+   * So, it is possible that the A-MPDU keeps retrying after longRetry reaches its limit.
+   *
+   *
+   * Try |     LOOKAROUND RATE     | NORMAL RATE
+   * -------------------------------------------------------
+   *  1  |  Random rate            | Best throughput
+   *  2  |  Next best throughput   | Next best throughput
+   *  3  |  Best probability       | Best probability
+   *
+   * Note: For clarity, multiple blocks of if's and else's are used
+   * Following implementation in Linux, in MinstrelHT lowest base rate is not used.
+   * Explanation can be found here: http://marc.info/?l=linux-wireless&m=144602778611966&w=2
+   */
+
+  CheckInit (station);
+  if (!station->m_initialized)
+    {
+      return;
+    }
+  station->m_longRetry++;
+
+  /**
+   * Get the IDs for all rates.
+   */
+  uint8_t maxTpRateId = GetRateId (station->m_maxTpRate);
+  uint8_t maxTpGroupId = GetGroupId (station->m_maxTpRate);
+  uint8_t maxTp2RateId = GetRateId (station->m_maxTpRate2);
+  uint8_t maxTp2GroupId = GetGroupId (station->m_maxTpRate2);
+  uint8_t maxProbRateId = GetRateId (station->m_maxProbRate);
+  uint8_t maxProbGroupId = GetGroupId (station->m_maxProbRate);
+
+  /// For normal rate, we're not currently sampling random rates.
+  if (!station->m_isSampling)
+    {
+      /// Use best throughput rate.
+      if (station->m_longRetry <  station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].retryCount)
+        {
+          NS_LOG_DEBUG ("Not Sampling; use the same rate again");
+          station->m_txrate = station->m_maxTpRate;  //!<  There are still a few retries.
+        }
+
+      /// Use second best throughput rate.
+      else if (station->m_longRetry < ( station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].retryCount +
+                                        station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].retryCount))
+        {
+          NS_LOG_DEBUG ("Not Sampling; use the Max TP2");
+          station->m_txrate = station->m_maxTpRate2;
+        }
+
+      /// Use best probability rate.
+      else if (station->m_longRetry <= ( station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].retryCount +
+                                         station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].retryCount +
+                                         station->m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].retryCount))
+        {
+          NS_LOG_DEBUG ("Not Sampling; use Max Prob");
+          station->m_txrate = station->m_maxProbRate;
+        }
+      else
+        {
+          NS_FATAL_ERROR ("Max retries reached and m_longRetry not cleared properly. longRetry= " << station->m_longRetry);
+        }
+    }
+
+  /// We're currently sampling random rates.
+  else
+    {
+      /// Sample rate is used only once
+      /// Use the best rate.
+      if (station->m_longRetry < 1 + station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTp2RateId].retryCount)
+        {
+          NS_LOG_DEBUG ("Sampling use the MaxTP rate");
+          station->m_txrate = station->m_maxTpRate2;
+        }
+
+      /// Use the best probability rate.
+      else if (station->m_longRetry <= 1 + station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTp2RateId].retryCount +
+               station->m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].retryCount)
+        {
+          NS_LOG_DEBUG ("Sampling use the MaxProb rate");
+          station->m_txrate = station->m_maxProbRate;
+        }
+      else
+        {
+          NS_FATAL_ERROR ("Max retries reached and m_longRetry not cleared properly. longRetry= " << station->m_longRetry);
+        }
+    }
+  NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate);
+}
+
+void
+MinstrelHtWifiManager::UpdateRetry (MinstrelHtWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_shortRetry = 0;
+  station->m_longRetry = 0;
+}
+
+void
+MinstrelHtWifiManager::UpdatePacketCounters (MinstrelHtWifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus)
+{
+  NS_LOG_FUNCTION (this << station << nSuccessfulMpdus << nFailedMpdus);
+
+  station->m_totalPacketsCount += nSuccessfulMpdus + nFailedMpdus;
+  if (station->m_isSampling)
+    {
+      station->m_samplePacketsCount += nSuccessfulMpdus + nFailedMpdus;
+    }
+  if (station->m_totalPacketsCount == ~0)
+    {
+      station->m_samplePacketsCount = 0;
+      station->m_totalPacketsCount = 0;
+    }
+
+  if (!station->m_sampleWait && !station->m_sampleTries && station->m_sampleCount > 0)
+    {
+      station->m_sampleWait = 16 + 2 * station->m_avgAmpduLen;
+      station->m_sampleTries = 1;
+      station->m_sampleCount--;
+    }
+}
+
+WifiTxVector
+MinstrelHtWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
+
+  if (!station->m_initialized)
+    {
+      CheckInit (station);
+    }
+
+  if (!station->m_isHt)
+    {
+      WifiTxVector vector = m_legacyManager->GetDataTxVector (station);
+      uint64_t dataRate = vector.GetMode ().GetDataRate (vector);
+      if (m_currentRate != dataRate && !station->m_isSampling)
+        {
+          NS_LOG_DEBUG ("New datarate: " << dataRate);
+          m_currentRate = dataRate;
+        }
+      return vector;
+    }
+  else
+    {
+      NS_LOG_DEBUG ("DoGetDataMode m_txrate= " << station->m_txrate);
+
+      uint8_t rateId = GetRateId (station->m_txrate);
+      uint8_t groupId = GetGroupId (station->m_txrate);
+      uint8_t mcsIndex = station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex;
+
+      NS_LOG_DEBUG ("DoGetDataMode rateId= " << +rateId << " groupId= " << +groupId << " mode= " << GetMcsSupported (station, mcsIndex));
+
+      McsGroup group = m_minstrelGroups[groupId];
+
+      // Check consistency of rate selected.
+      if (((group.type == GROUP_HE) && (group.gi < GetGuardInterval (station))) ||
+          (((group.type == GROUP_HT) || (group.type == GROUP_VHT)) && (group.gi == 400) && !GetShortGuardIntervalSupported (station)) ||
+          (group.chWidth > GetChannelWidth (station)) ||
+          (group.streams > GetNumberOfSupportedStreams (station)))
+        {
+          NS_FATAL_ERROR ("Inconsistent group selected. Group: (" << +group.streams <<
+                         "," << group.gi << "," << group.chWidth << ")" <<
+                         " Station capabilities: (" << GetNumberOfSupportedStreams (station) <<
+                         "," << ((group.type == GROUP_HE) ? GetGuardInterval (station) : (GetShortGuardIntervalSupported (station) ? 400 : 800)) <<
+                         "," << GetChannelWidth (station) << ")");
+        }
+      WifiMode mode = GetMcsSupported (station, mcsIndex);
+      uint64_t dataRate = mode.GetDataRate (group.chWidth, group.gi, group.streams);
+      if (m_currentRate != dataRate && !station->m_isSampling)
+        {
+          NS_LOG_DEBUG ("New datarate: " << dataRate);
+          m_currentRate = dataRate;
+        }
+      return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), group.gi, GetNumberOfAntennas (), group.streams, GetNess (station), GetChannelWidthForTransmission (mode, group.chWidth), GetAggregation (station) && !station->m_isSampling);
+    }
+}
+
+WifiTxVector
+MinstrelHtWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
+
+  if (!station->m_initialized)
+    {
+      CheckInit (station);
+    }
+
+  if (!station->m_isHt)
+    {
+      return m_legacyManager->GetRtsTxVector (station);
+    }
+  else
+    {
+      NS_LOG_DEBUG ("DoGetRtsMode m_txrate=" << station->m_txrate);
+
+      /* RTS is sent in a non-HT frame. RTS with HT is not supported yet in NS3.
+       * When supported, decision of using HT has to follow rules in Section 9.7.6 from 802.11-2012.
+       * From Sec. 9.7.6.5: "A frame other than a BlockAckReq or BlockAck that is carried in a
+       * non-HT PPDU shall be transmitted by the STA using a rate no higher than the highest
+       * rate in  the BSSBasicRateSet parameter that is less than or equal to the rate or
+       * non-HT reference rate (see 9.7.9) of the previously transmitted frame that was
+       * directed to the same receiving STA. If no rate in the BSSBasicRateSet parameter meets
+       * these conditions, the control frame shall be transmitted at a rate no higher than the
+       * highest mandatory rate of the attached PHY that is less than or equal to the rate
+       * or non-HT reference rate (see 9.7.9) of the previously transmitted frame that was
+       * directed to the same receiving STA."
+       */
+
+      // As we are in Minstrel HT, assume the last rate was an HT rate.
+      uint8_t rateId = GetRateId (station->m_txrate);
+      uint8_t groupId = GetGroupId (station->m_txrate);
+      uint8_t mcsIndex = station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex;
+
+      WifiMode lastRate = GetMcsSupported (station, mcsIndex);
+      uint64_t lastDataRate = lastRate.GetNonHtReferenceRate ();
+      uint8_t nBasicRates = GetNBasicModes ();
+
+      WifiMode rtsRate;
+      bool rateFound = false;
+
+      for (uint8_t i = 0; i < nBasicRates; i++)
+        {
+          uint64_t rate = GetBasicMode (i).GetDataRate (20);
+          if (rate <= lastDataRate)
+            {
+              rtsRate = GetBasicMode (i);
+              rateFound = true;
+            }
+        }
+
+      if (!rateFound)
+        {
+          Ptr<WifiPhy> phy = GetPhy ();
+          for (const auto & mode : phy->GetModeList ())
+            {
+              uint64_t rate = mode.GetDataRate (20);
+              if (rate <= lastDataRate)
+                {
+                  rtsRate = mode;
+                  rateFound = true;
+                }
+            }
+        }
+
+      NS_ASSERT (rateFound);
+
+      return WifiTxVector (rtsRate, GetDefaultTxPowerLevel (), GetPreambleForTransmission (rtsRate.GetModulationClass (), GetShortPreambleEnabled ()),
+                           800, 1, 1, 0, GetChannelWidthForTransmission (rtsRate, GetChannelWidth (station)), GetAggregation (station));
+    }
+}
+
+bool
+MinstrelHtWifiManager::DoNeedRetransmission (WifiRemoteStation *st, Ptr<const Packet> packet, bool normally)
+{
+  NS_LOG_FUNCTION (this << st << packet << normally);
+
+  MinstrelHtWifiRemoteStation *station = static_cast<MinstrelHtWifiRemoteStation*> (st);
+
+  CheckInit (station);
+  if (!station->m_initialized)
+    {
+      return normally;
+    }
+
+  uint32_t maxRetries;
+
+  if (!station->m_isHt)
+    {
+      maxRetries = m_legacyManager->CountRetries (station);
+    }
+  else
+    {
+      maxRetries = CountRetries (station);
+    }
+
+  if (station->m_longRetry >= maxRetries)
+    {
+      NS_LOG_DEBUG ("No re-transmission allowed. Retries: " <<  station->m_longRetry << " Max retries: " << maxRetries);
+      return false;
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Re-transmit. Retries: " <<  station->m_longRetry << " Max retries: " << maxRetries);
+      return true;
+    }
+}
+
+uint32_t
+MinstrelHtWifiManager::CountRetries (MinstrelHtWifiRemoteStation *station)
+{
+  uint8_t maxProbRateId = GetRateId (station->m_maxProbRate);
+  uint8_t maxProbGroupId = GetGroupId (station->m_maxProbRate);
+  uint8_t maxTpRateId = GetRateId (station->m_maxTpRate);
+  uint8_t maxTpGroupId = GetGroupId (station->m_maxTpRate);
+  uint8_t maxTp2RateId = GetRateId (station->m_maxTpRate2);
+  uint8_t maxTp2GroupId = GetGroupId (station->m_maxTpRate2);
+
+  if (!station->m_isSampling)
+    {
+      return station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].retryCount +
+             station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].retryCount +
+             station->m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].retryCount;
+    }
+  else
+    {
+      return 1 + station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTp2RateId].retryCount +
+             station->m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].retryCount;
+    }
+}
+
+uint16_t
+MinstrelHtWifiManager::GetNextSample (MinstrelHtWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  uint8_t sampleGroup = station->m_sampleGroup;
+  uint8_t index = station->m_groupsTable[sampleGroup].m_index;
+  uint8_t col = station->m_groupsTable[sampleGroup].m_col;
+  uint8_t sampleIndex = station->m_sampleTable[index][col];
+  uint16_t rateIndex = GetIndex (sampleGroup, sampleIndex);
+  NS_LOG_DEBUG ("Next Sample is " << rateIndex);
+  SetNextSample (station); //Calculate the next sample rate.
+  return rateIndex;
+}
+
+void
+MinstrelHtWifiManager::SetNextSample (MinstrelHtWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  do
+    {
+      station->m_sampleGroup++;
+      station->m_sampleGroup %= m_numGroups;
+    }
+  while (!station->m_groupsTable[station->m_sampleGroup].m_supported);
+
+  station->m_groupsTable[station->m_sampleGroup].m_index++;
+
+  uint8_t sampleGroup = station->m_sampleGroup;
+  uint8_t index = station->m_groupsTable[station->m_sampleGroup].m_index;
+  uint8_t col = station->m_groupsTable[sampleGroup].m_col;
+
+  if (index >= m_numRates)
+    {
+      station->m_groupsTable[station->m_sampleGroup].m_index = 0;
+      station->m_groupsTable[station->m_sampleGroup].m_col++;
+      if (station->m_groupsTable[station->m_sampleGroup].m_col >= m_nSampleCol)
+        {
+          station->m_groupsTable[station->m_sampleGroup].m_col = 0;
+        }
+      index = station->m_groupsTable[station->m_sampleGroup].m_index;
+      col = station->m_groupsTable[sampleGroup].m_col;
+    }
+  NS_LOG_DEBUG ("New sample set: group= " << +sampleGroup << " index= " << +station->m_sampleTable[index][col]);
+}
+
+uint16_t
+MinstrelHtWifiManager::FindRate (MinstrelHtWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  NS_LOG_DEBUG ("FindRate packet=" << station->m_totalPacketsCount);
+
+  if ((station->m_samplePacketsCount + station->m_totalPacketsCount) == 0)
+    {
+      return station->m_maxTpRate;
+    }
+
+  // If we have waited enough, then sample.
+  if (station->m_sampleWait == 0 && station->m_sampleTries != 0)
+    {
+      //SAMPLING
+      NS_LOG_DEBUG ("Obtaining a sampling rate");
+      /// Now go through the table and find an index rate.
+      uint16_t sampleIdx = GetNextSample (station);
+      NS_LOG_DEBUG ("Sampling rate = " << sampleIdx);
+
+      //Evaluate if the sampling rate selected should be used.
+      uint8_t sampleGroupId = GetGroupId (sampleIdx);
+      uint8_t sampleRateId = GetRateId (sampleIdx);
+
+      // If the rate selected is not supported, then don't sample.
+      if (station->m_groupsTable[sampleGroupId].m_supported && station->m_groupsTable[sampleGroupId].m_ratesTable[sampleRateId].supported)
+        {
+          /**
+           * Sampling might add some overhead to the frame.
+           * Hence, don't use sampling for the currently used rates.
+           *
+           * Also do not sample if the probability is already higher than 95%
+           * to avoid wasting airtime.
+           */
+          MinstrelHtRateInfo sampleRateInfo = station->m_groupsTable[sampleGroupId].m_ratesTable[sampleRateId];
+
+          NS_LOG_DEBUG ("Use sample rate? MaxTpRate= " << station->m_maxTpRate << " CurrentRate= " << station->m_txrate <<
+                        " SampleRate= " << sampleIdx << " SampleProb= " << sampleRateInfo.ewmaProb);
+
+          if (sampleIdx != station->m_maxTpRate && sampleIdx != station->m_maxTpRate2
+              && sampleIdx != station->m_maxProbRate && sampleRateInfo.ewmaProb <= 95)
+            {
+
+              /**
+               * Make sure that lower rates get sampled only occasionally,
+               * if the link is working perfectly.
+               */
+
+              uint8_t maxTpGroupId = GetGroupId (station->m_maxTpRate);
+              uint8_t maxTp2GroupId = GetGroupId (station->m_maxTpRate2);
+              uint8_t maxTp2RateId = GetRateId (station->m_maxTpRate2);
+              uint8_t maxProbGroupId = GetGroupId (station->m_maxProbRate);
+              uint8_t maxProbRateId = GetRateId (station->m_maxProbRate);
+
+              uint8_t maxTpStreams = m_minstrelGroups[maxTpGroupId].streams;
+              uint8_t sampleStreams = m_minstrelGroups[sampleGroupId].streams;
+
+              Time sampleDuration = sampleRateInfo.perfectTxTime;
+              Time maxTp2Duration = station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].perfectTxTime;
+              Time maxProbDuration = station->m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].perfectTxTime;
+
+              NS_LOG_DEBUG ("Use sample rate? SampleDuration= " << sampleDuration << " maxTp2Duration= " << maxTp2Duration <<
+                            " maxProbDuration= " << maxProbDuration << " sampleStreams= " << +sampleStreams <<
+                            " maxTpStreams= " << +maxTpStreams);
+              if (sampleDuration < maxTp2Duration || (sampleStreams < maxTpStreams && sampleDuration < maxProbDuration))
+                {
+                  /// Set flag that we are currently sampling.
+                  station->m_isSampling = true;
+
+                  /// set the rate that we're currently sampling
+                  station->m_sampleRate = sampleIdx;
+
+                  NS_LOG_DEBUG ("FindRate " << "sampleRate=" << sampleIdx);
+                  station->m_sampleTries--;
+                  return sampleIdx;
+                }
+              else
+                {
+                  station->m_numSamplesSlow++;
+                  if (sampleRateInfo.numSamplesSkipped >= 20 && station->m_numSamplesSlow <= 2)
+                    {
+                      /// Set flag that we are currently sampling.
+                      station->m_isSampling = true;
+
+                      /// set the rate that we're currently sampling
+                      station->m_sampleRate = sampleIdx;
+
+                      NS_LOG_DEBUG ("FindRate " << "sampleRate=" << sampleIdx);
+                      station->m_sampleTries--;
+                      return sampleIdx;
+                    }
+                }
+            }
+        }
+    }
+  if (station->m_sampleWait > 0)
+    {
+      station->m_sampleWait--;
+    }
+
+  ///	Continue using the best rate.
+
+  NS_LOG_DEBUG ("FindRate " << "maxTpRrate=" << station->m_maxTpRate);
+  return station->m_maxTpRate;
+}
+void
+MinstrelHtWifiManager::UpdateStats (MinstrelHtWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+
+  station->m_nextStatsUpdate = Simulator::Now () + m_updateStats;
+
+  station->m_numSamplesSlow = 0;
+  station->m_sampleCount = 0;
+
+  double tempProb;
+
+  if (station->m_ampduPacketCount > 0)
+    {
+      uint32_t newLen = station->m_ampduLen / station->m_ampduPacketCount;
+      station->m_avgAmpduLen = ( newLen * (100 - m_ewmaLevel) + (station->m_avgAmpduLen * m_ewmaLevel) ) / 100;
+      station->m_ampduLen = 0;
+      station->m_ampduPacketCount = 0;
+    }
+
+  /* Initialize global rate indexes */
+  station->m_maxTpRate = GetLowestIndex (station);
+  station->m_maxTpRate2 = GetLowestIndex (station);
+  station->m_maxProbRate = GetLowestIndex (station);
+
+  /// Update throughput and EWMA for each rate inside each group.
+  for (uint8_t j = 0; j < m_numGroups; j++)
+    {
+      if (station->m_groupsTable[j].m_supported)
+        {
+          station->m_sampleCount++;
+
+          /* (re)Initialize group rate indexes */
+          station->m_groupsTable[j].m_maxTpRate = GetLowestIndex (station, j);
+          station->m_groupsTable[j].m_maxTpRate2 = GetLowestIndex (station, j);
+          station->m_groupsTable[j].m_maxProbRate = GetLowestIndex (station, j);
+
+          for (uint8_t i = 0; i < m_numRates; i++)
+            {
+              if (station->m_groupsTable[j].m_ratesTable[i].supported)
+                {
+                  station->m_groupsTable[j].m_ratesTable[i].retryUpdated = false;
+
+                  NS_LOG_DEBUG (+i << " " << GetMcsSupported (station, station->m_groupsTable[j].m_ratesTable[i].mcsIndex) <<
+                                "\t attempt=" << station->m_groupsTable[j].m_ratesTable[i].numRateAttempt <<
+                                "\t success=" << station->m_groupsTable[j].m_ratesTable[i].numRateSuccess);
+
+                  /// If we've attempted something.
+                  if (station->m_groupsTable[j].m_ratesTable[i].numRateAttempt > 0)
+                    {
+                      station->m_groupsTable[j].m_ratesTable[i].numSamplesSkipped = 0;
+                      /**
+                       * Calculate the probability of success.
+                       * Assume probability scales from 0 to 100.
+                       */
+                      tempProb = (100 * station->m_groupsTable[j].m_ratesTable[i].numRateSuccess) / station->m_groupsTable[j].m_ratesTable[i].numRateAttempt;
+
+                      /// Bookkeeping.
+                      station->m_groupsTable[j].m_ratesTable[i].prob = tempProb;
+
+                      if (station->m_groupsTable[j].m_ratesTable[i].successHist == 0)
+                        {
+                          station->m_groupsTable[j].m_ratesTable[i].ewmaProb = tempProb;
+                        }
+                      else
+                        {
+                          station->m_groupsTable[j].m_ratesTable[i].ewmsdProb = CalculateEwmsd (station->m_groupsTable[j].m_ratesTable[i].ewmsdProb,
+                                                                                                tempProb, station->m_groupsTable[j].m_ratesTable[i].ewmaProb,
+                                                                                                m_ewmaLevel);
+                          /// EWMA probability
+                          tempProb = (tempProb * (100 - m_ewmaLevel) + station->m_groupsTable[j].m_ratesTable[i].ewmaProb * m_ewmaLevel)  / 100;
+                          station->m_groupsTable[j].m_ratesTable[i].ewmaProb = tempProb;
+                        }
+
+                      station->m_groupsTable[j].m_ratesTable[i].throughput = CalculateThroughput (station, j, i, tempProb);
+
+                      station->m_groupsTable[j].m_ratesTable[i].successHist += station->m_groupsTable[j].m_ratesTable[i].numRateSuccess;
+                      station->m_groupsTable[j].m_ratesTable[i].attemptHist += station->m_groupsTable[j].m_ratesTable[i].numRateAttempt;
+                    }
+                  else
+                    {
+                      station->m_groupsTable[j].m_ratesTable[i].numSamplesSkipped++;
+                    }
+
+                  /// Bookkeeping.
+                  station->m_groupsTable[j].m_ratesTable[i].prevNumRateSuccess = station->m_groupsTable[j].m_ratesTable[i].numRateSuccess;
+                  station->m_groupsTable[j].m_ratesTable[i].prevNumRateAttempt = station->m_groupsTable[j].m_ratesTable[i].numRateAttempt;
+                  station->m_groupsTable[j].m_ratesTable[i].numRateSuccess = 0;
+                  station->m_groupsTable[j].m_ratesTable[i].numRateAttempt = 0;
+
+                  if (station->m_groupsTable[j].m_ratesTable[i].throughput != 0)
+                    {
+                      SetBestStationThRates (station, GetIndex (j, i));
+                      SetBestProbabilityRate (station, GetIndex (j, i));
+                    }
+
+                }
+            }
+        }
+    }
+
+  //Try to sample all available rates during each interval.
+  station->m_sampleCount *= 8;
+
+  //Recalculate retries for the rates selected.
+  CalculateRetransmits (station, station->m_maxTpRate);
+  CalculateRetransmits (station, station->m_maxTpRate2);
+  CalculateRetransmits (station, station->m_maxProbRate);
+
+  NS_LOG_DEBUG ("max tp=" << station->m_maxTpRate << "\nmax tp2=" <<  station->m_maxTpRate2 << "\nmax prob=" << station->m_maxProbRate);
+  if (m_printStats)
+    {
+      PrintTable (station);
+    }
+}
+
+double
+MinstrelHtWifiManager::CalculateThroughput (MinstrelHtWifiRemoteStation *station, uint8_t groupId, uint8_t rateId, double ewmaProb)
+{
+  /**
+  * Calculating throughput.
+  * Do not account throughput if probability of success is below 10%
+  * (as done in minstrel_ht linux implementation).
+  */
+  if (ewmaProb < 10)
+    {
+      return 0;
+    }
+  else
+    {
+      /**
+       * For the throughput calculation, limit the probability value to 90% to
+       * account for collision related packet error rate fluctuation.
+       */
+      Time txTime =  station->m_groupsTable[groupId].m_ratesTable[rateId].perfectTxTime;
+      if (ewmaProb > 90)
+        {
+          return 90 / txTime.GetSeconds ();
+        }
+      else
+        {
+          return ewmaProb / txTime.GetSeconds ();
+        }
+    }
+}
+
+void
+MinstrelHtWifiManager::SetBestProbabilityRate (MinstrelHtWifiRemoteStation *station, uint16_t index)
+{
+  GroupInfo *group;
+  MinstrelHtRateInfo rate;
+  uint8_t tmpGroupId, tmpRateId;
+  double tmpTh, tmpProb;
+  uint8_t groupId, rateId;
+  double currentTh;
+  // maximum group probability (GP) variables
+  uint8_t maxGPGroupId, maxGPRateId;
+  double maxGPTh;
+
+  groupId = GetGroupId (index);
+  rateId = GetRateId (index);
+  group = &station->m_groupsTable[groupId];
+  rate = group->m_ratesTable[rateId];
+
+  tmpGroupId = GetGroupId (station->m_maxProbRate);
+  tmpRateId = GetRateId (station->m_maxProbRate);
+  tmpProb = station->m_groupsTable[tmpGroupId].m_ratesTable[tmpRateId].ewmaProb;
+  tmpTh =  station->m_groupsTable[tmpGroupId].m_ratesTable[tmpRateId].throughput;
+
+  if (rate.ewmaProb > 75)
+    {
+      currentTh = station->m_groupsTable[groupId].m_ratesTable[rateId].throughput;
+      if (currentTh > tmpTh)
+        {
+          station->m_maxProbRate = index;
+        }
+
+      maxGPGroupId = GetGroupId (group->m_maxProbRate);
+      maxGPRateId = GetRateId (group->m_maxProbRate);
+      maxGPTh = station->m_groupsTable[maxGPGroupId].m_ratesTable[maxGPRateId].throughput;
+
+      if (currentTh > maxGPTh)
+        {
+          group->m_maxProbRate = index;
+        }
+    }
+  else
+    {
+      if (rate.ewmaProb > tmpProb)
+        {
+          station->m_maxProbRate = index;
+        }
+      maxGPRateId = GetRateId (group->m_maxProbRate);
+      if (rate.ewmaProb > group->m_ratesTable[maxGPRateId].ewmaProb)
+        {
+          group->m_maxProbRate = index;
+        }
+    }
+}
+
+/*
+ * Find & sort topmost throughput rates
+ *
+ * If multiple rates provide equal throughput the sorting is based on their
+ * current success probability. Higher success probability is preferred among
+ * MCS groups.
+ */
+void
+MinstrelHtWifiManager::SetBestStationThRates (MinstrelHtWifiRemoteStation *station, uint16_t index)
+{
+  uint8_t groupId, rateId;
+  double th, prob;
+  uint8_t maxTpGroupId, maxTpRateId;
+  uint8_t maxTp2GroupId, maxTp2RateId;
+  double maxTpTh, maxTpProb;
+  double maxTp2Th, maxTp2Prob;
+
+  groupId = GetGroupId (index);
+  rateId = GetRateId (index);
+  prob = station->m_groupsTable[groupId].m_ratesTable[rateId].ewmaProb;
+  th = station->m_groupsTable[groupId].m_ratesTable[rateId].throughput;
+
+  maxTpGroupId = GetGroupId (station->m_maxTpRate);
+  maxTpRateId = GetRateId (station->m_maxTpRate);
+  maxTpProb = station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].ewmaProb;
+  maxTpTh = station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].throughput;
+
+  maxTp2GroupId = GetGroupId (station->m_maxTpRate2);
+  maxTp2RateId = GetRateId (station->m_maxTpRate2);
+  maxTp2Prob = station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].ewmaProb;
+  maxTp2Th = station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].throughput;
+
+  if (th > maxTpTh || (th == maxTpTh && prob > maxTpProb))
+    {
+      station->m_maxTpRate2 = station->m_maxTpRate;
+      station->m_maxTpRate = index;
+    }
+  else if (th > maxTp2Th || (th == maxTp2Th && prob > maxTp2Prob))
+    {
+      station->m_maxTpRate2 = index;
+    }
+
+  //Find best rates per group
+
+  GroupInfo *group = &station->m_groupsTable[groupId];
+  maxTpGroupId = GetGroupId (group->m_maxTpRate);
+  maxTpRateId = GetRateId (group->m_maxTpRate);
+  maxTpProb = group->m_ratesTable[maxTpRateId].ewmaProb;
+  maxTpTh = station->m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].throughput;
+
+  maxTp2GroupId = GetGroupId (group->m_maxTpRate2);
+  maxTp2RateId = GetRateId (group->m_maxTpRate2);
+  maxTp2Prob = group->m_ratesTable[maxTp2RateId].ewmaProb;
+  maxTp2Th = station->m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].throughput;
+
+  if (th > maxTpTh || (th == maxTpTh && prob > maxTpProb))
+    {
+      group->m_maxTpRate2 = group->m_maxTpRate;
+      group->m_maxTpRate = index;
+    }
+  else if (th > maxTp2Th || (th == maxTp2Th && prob > maxTp2Prob))
+    {
+      group->m_maxTpRate2 = index;
+    }
+}
+
+void
+MinstrelHtWifiManager::RateInit (MinstrelHtWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+
+  station->m_groupsTable = McsGroupData (m_numGroups);
+
+  /**
+  * Initialize groups supported by the receiver.
+  */
+  NS_LOG_DEBUG ("Supported groups by station:");
+  bool noSupportedGroupFound = true;
+  for (uint8_t groupId = 0; groupId < m_numGroups; groupId++)
+    {
+      if (m_minstrelGroups[groupId].isSupported)
+        {
+          station->m_groupsTable[groupId].m_supported = false;
+
+          if ((m_minstrelGroups[groupId].type == GROUP_HE) && !GetHeSupported (station))
+            {
+              //It is a HE group but the receiver does not support HE: skip
+              continue;
+            }
+          if ((m_minstrelGroups[groupId].type == GROUP_VHT) && !GetVhtSupported (station))
+            {
+              //It is a VHT group but the receiver does not support VHT: skip
+              continue;
+            }
+          if ((m_minstrelGroups[groupId].type != GROUP_HE) && GetHeSupported (station) && m_useLatestAmendmentOnly)
+            {
+              //It is not a HE group and the receiver supports HE: skip since UseLatestAmendmentOnly attribute is enabled
+              continue;
+            }
+          if (!GetHeSupported (station) && (m_minstrelGroups[groupId].type != GROUP_VHT) && GetVhtSupported (station) && m_useLatestAmendmentOnly)
+            {
+              //It is not a VHT group and the receiver supports VHT (but not HE): skip since UseLatestAmendmentOnly attribute is enabled
+              continue;
+            }
+          if (((m_minstrelGroups[groupId].type == GROUP_HT) || (m_minstrelGroups[groupId].type == GROUP_VHT))
+              && (m_minstrelGroups[groupId].gi == 400) && !GetShortGuardIntervalSupported (station))
+            {
+              //It is a SGI group but the receiver does not support SGI: skip
+              continue;
+            }
+          if ((m_minstrelGroups[groupId].type == GROUP_HE) && (m_minstrelGroups[groupId].gi < GetGuardInterval (station)))
+            {
+              //The receiver does not support the GI: skip
+              continue;
+            }
+          if (GetChannelWidth (station) < m_minstrelGroups[groupId].chWidth)
+            {
+              //The receiver does not support the channel width: skip
+              continue;
+            }
+          if (GetNumberOfSupportedStreams (station) < m_minstrelGroups[groupId].streams)
+            {
+              //The receiver does not support the number of spatial streams: skip
+              continue;
+            }
+
+          NS_LOG_DEBUG ("Group: " << +groupId
+                                 << " type: " << m_minstrelGroups[groupId].type
+                                 << " streams: " << +m_minstrelGroups[groupId].streams
+                                 << " GI: " << m_minstrelGroups[groupId].gi
+                                 << " width: " << m_minstrelGroups[groupId].chWidth);
+
+          noSupportedGroupFound = false;
+          station->m_groupsTable[groupId].m_supported = true;
+          station->m_groupsTable[groupId].m_col = 0;
+          station->m_groupsTable[groupId].m_index = 0;
+
+          station->m_groupsTable[groupId].m_ratesTable = MinstrelHtRate (m_numRates); ///Create the rate list for the group.
+          for (uint8_t i = 0; i < m_numRates; i++)
+            {
+              station->m_groupsTable[groupId].m_ratesTable[i].supported = false;
+            }
+
+          // Initialize all modes supported by the remote station that belong to the current group.
+          for (uint8_t i = 0; i < station->m_nModes; i++)
+            {
+              WifiMode mode = GetMcsSupported (station, i);
+
+              ///Use the McsValue as the index in the rate table.
+              ///This way, MCSs not supported are not initialized.
+              uint8_t rateId = mode.GetMcsValue ();
+              if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
+                {
+                  rateId %= MAX_HT_GROUP_RATES;
+                }
+
+              if (((m_minstrelGroups[groupId].type == GROUP_HE)
+                    && (mode.GetModulationClass () == WIFI_MOD_CLASS_HE)                                                   ///If it is a HE MCS only add to a HE group.
+                    && IsValidMcs (GetPhy (), m_minstrelGroups[groupId].streams, m_minstrelGroups[groupId].chWidth, mode)) ///Check validity of the HE MCS
+                  || ((m_minstrelGroups[groupId].type == GROUP_VHT)
+                    && (mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)                                                  ///If it is a VHT MCS only add to a VHT group.
+                    && IsValidMcs (GetPhy (), m_minstrelGroups[groupId].streams, m_minstrelGroups[groupId].chWidth, mode)) ///Check validity of the VHT MCS
+                  || ((m_minstrelGroups[groupId].type == GROUP_HT)
+                      && (mode.GetModulationClass () == WIFI_MOD_CLASS_HT)                                                 ///If it is a HT MCS only add to a HT group.
+                      && (mode.GetMcsValue () < (m_minstrelGroups[groupId].streams * 8))                                     ///Check if the HT MCS corresponds to groups number of streams.
+                      && (mode.GetMcsValue () >= ((m_minstrelGroups[groupId].streams - 1) * 8))))
+                {
+                  NS_LOG_DEBUG ("Mode " << +i << ": " << mode);
+
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].supported = true;
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex = i; ///Mapping between rateId and operationalMcsSet
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt = 0;
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].numRateSuccess = 0;
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].prob = 0;
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].ewmaProb = 0;
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].prevNumRateAttempt = 0;
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].prevNumRateSuccess = 0;
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].numSamplesSkipped = 0;
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].successHist = 0;
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].attemptHist = 0;
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].throughput = 0;
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].perfectTxTime = GetFirstMpduTxTime (groupId, GetMcsSupported (station, i));
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].retryCount = 0;
+                  station->m_groupsTable[groupId].m_ratesTable[rateId].adjustedRetryCount = 0;
+                  CalculateRetransmits (station, groupId, rateId);
+                }
+            }
+        }
+    }
+  ///make sure at least one group is supported, otherwise we end up with an infinite loop in SetNextSample
+  if (noSupportedGroupFound)
+    {
+      NS_FATAL_ERROR ("No supported group has been found");
+    }
+  SetNextSample (station);                  /// Select the initial sample index.
+  UpdateStats (station);                    /// Calculate the initial high throughput rates.
+  station->m_txrate = FindRate (station);   /// Select the rate to use.
+}
+
+void
+MinstrelHtWifiManager::CalculateRetransmits (MinstrelHtWifiRemoteStation *station, uint16_t index)
+{
+  NS_LOG_FUNCTION (this << station << index);
+  uint8_t groupId = GetGroupId (index);
+  uint8_t rateId = GetRateId (index);
+  if (!station->m_groupsTable[groupId].m_ratesTable[rateId].retryUpdated)
+    {
+      CalculateRetransmits (station, groupId, rateId);
+    }
+}
+
+void
+MinstrelHtWifiManager::CalculateRetransmits (MinstrelHtWifiRemoteStation *station, uint8_t groupId, uint8_t rateId)
+{
+  NS_LOG_FUNCTION (this << station << +groupId << +rateId);
+
+  uint32_t cw = 15;                     // Is an approximation.
+  uint32_t cwMax = 1023;
+  Time cwTime, txTime, dataTxTime;
+  Time slotTime = GetPhy ()->GetSlot ();
+  Time ackTime = GetPhy ()->GetSifs () + GetPhy ()->GetBlockAckTxTime ();
+
+  if (station->m_groupsTable[groupId].m_ratesTable[rateId].ewmaProb < 1)
+    {
+      station->m_groupsTable[groupId].m_ratesTable[rateId].retryCount = 1;
+    }
+  else
+    {
+      station->m_groupsTable[groupId].m_ratesTable[rateId].retryCount = 2;
+      station->m_groupsTable[groupId].m_ratesTable[rateId].retryUpdated = true;
+
+      dataTxTime = GetFirstMpduTxTime (groupId, GetMcsSupported (station, station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex)) +
+        GetMpduTxTime (groupId, GetMcsSupported (station, station->m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex)) * (station->m_avgAmpduLen - 1);
+
+      /* Contention time for first 2 tries */
+      cwTime = (cw / 2) * slotTime;
+      cw = Min ((cw + 1) * 2, cwMax);
+      cwTime += (cw / 2) * slotTime;
+      cw = Min ((cw + 1) * 2, cwMax);
+
+      /* Total TX time for data and Contention after first 2 tries */
+      txTime = cwTime + 2 * (dataTxTime + ackTime);
+
+      /* See how many more tries we can fit inside segment size */
+      do
+        {
+          /* Contention time for this try */
+          cwTime = (cw / 2) * slotTime;
+          cw = Min ((cw + 1) * 2, cwMax);
+
+          /* Total TX time after this try */
+          txTime += cwTime + ackTime + dataTxTime;
+        }
+      while ((txTime < MilliSeconds (6))
+             && (++station->m_groupsTable[groupId].m_ratesTable[rateId].retryCount < 7));
+    }
+}
+
+double
+MinstrelHtWifiManager::CalculateEwmsd (double oldEwmsd, double currentProb, double ewmaProb, double weight)
+{
+  double diff, incr, tmp;
+
+  /* calculate exponential weighted moving variance */
+  diff = currentProb - ewmaProb;
+  incr = (100 - weight) * diff / 100;
+  tmp = oldEwmsd * oldEwmsd;
+  tmp = weight * (tmp + diff * incr) / 100;
+
+  /* return standard deviation */
+  return sqrt (tmp);
+}
+
+void
+MinstrelHtWifiManager::InitSampleTable (MinstrelHtWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_col = station->m_index = 0;
+
+  //for off-setting to make rates fall between 0 and nModes
+  uint8_t numSampleRates = m_numRates;
+
+  uint16_t newIndex;
+  for (uint8_t col = 0; col < m_nSampleCol; col++)
+    {
+      for (uint8_t i = 0; i < numSampleRates; i++ )
+        {
+          /**
+           * The next two lines basically tries to generate a random number
+           * between 0 and the number of available rates
+           */
+          int uv = m_uniformRandomVariable->GetInteger (0, numSampleRates);
+          newIndex = (i + uv) % numSampleRates;
+
+          //this loop is used for filling in other uninitialized places
+          while (station->m_sampleTable[newIndex][col] != 0)
+            {
+              newIndex = (newIndex + 1) % m_numRates;
+            }
+          station->m_sampleTable[newIndex][col] = i;
+        }
+    }
+}
+
+void
+MinstrelHtWifiManager::PrintTable (MinstrelHtWifiRemoteStation *station)
+{
+  if (!station->m_statsFile.is_open ())
+    {
+      std::ostringstream tmp;
+      tmp << "minstrel-ht-stats-" << station->m_state->m_address << ".txt";
+      station->m_statsFile.open (tmp.str ().c_str (), std::ios::out);
+    }
+
+  station->m_statsFile << "               best   ____________rate__________    ________statistics________    ________last_______    ______sum-of________\n" <<
+    " mode guard #  rate  [name   idx airtime  max_tp]  [avg(tp) avg(prob) sd(prob)]  [prob.|retry|suc|att]  [#success | #attempts]\n";
+  for (uint8_t i = 0; i < m_numGroups; i++)
+    {
+      StatsDump (station, i, station->m_statsFile);
+    }
+
+  station->m_statsFile << "\nTotal packet count::    ideal " << Max (0, station->m_totalPacketsCount - station->m_samplePacketsCount) <<
+    "              lookaround " << station->m_samplePacketsCount << "\n";
+  station->m_statsFile << "Average # of aggregated frames per A-MPDU: " << station->m_avgAmpduLen << "\n\n";
+
+  station->m_statsFile.flush ();
+}
+
+void
+MinstrelHtWifiManager::StatsDump (MinstrelHtWifiRemoteStation *station, uint8_t groupId, std::ofstream &of)
+{
+  uint8_t numRates = m_numRates;
+  McsGroup group = m_minstrelGroups[groupId];
+  Time txTime;
+  for (uint8_t i = 0; i < numRates; i++)
+    {
+      if (station->m_groupsTable[groupId].m_supported && station->m_groupsTable[groupId].m_ratesTable[i].supported)
+        {
+          of << group.type << " " << group.chWidth << "   " << group.gi << "  " << +group.streams << "   ";
+
+          uint16_t maxTpRate = station->m_maxTpRate;
+          uint16_t maxTpRate2 = station->m_maxTpRate2;
+          uint16_t maxProbRate = station->m_maxProbRate;
+
+          uint16_t idx = GetIndex (groupId, i);
+          if (idx == maxTpRate)
+            {
+              of << 'A';
+            }
+          else
+            {
+              of << ' ';
+            }
+          if (idx == maxTpRate2)
+            {
+              of << 'B';
+            }
+          else
+            {
+              of << ' ';
+            }
+          if (idx == maxProbRate)
+            {
+              of << 'P';
+            }
+          else
+            {
+              of << ' ';
+            }
+
+          if (group.type == GROUP_HT)
+            {
+              of << std::setw (4) << "   MCS" << (group.streams - 1) * 8 + i;
+            }
+          else
+            {
+              of << std::setw (7) << "   MCS" << +i << "/" << static_cast<int>(group.streams);
+            }
+
+          of << "  " << std::setw (3) << +idx << "  ";
+
+          /* tx_time[rate(i)] in usec */
+          txTime = GetFirstMpduTxTime (groupId, GetMcsSupported (station, station->m_groupsTable[groupId].m_ratesTable[i].mcsIndex));
+          of << std::setw (6) << txTime.GetMicroSeconds () << "  ";
+
+          of << std::setw (7) << CalculateThroughput (station, groupId, i, 100) / 100 << "   " <<
+            std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].throughput / 100 << "   " <<
+            std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].ewmaProb << "  " <<
+            std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].ewmsdProb << "  " <<
+            std::setw (7) << station->m_groupsTable[groupId].m_ratesTable[i].prob << "  " <<
+            std::setw (2) << station->m_groupsTable[groupId].m_ratesTable[i].retryCount << "   " <<
+            std::setw (3) << station->m_groupsTable[groupId].m_ratesTable[i].prevNumRateSuccess << "  " <<
+            std::setw (3) << station->m_groupsTable[groupId].m_ratesTable[i].prevNumRateAttempt << "   " <<
+            std::setw (9) << station->m_groupsTable[groupId].m_ratesTable[i].successHist << "   " <<
+            std::setw (9) << station->m_groupsTable[groupId].m_ratesTable[i].attemptHist << "\n";
+        }
+    }
+}
+uint16_t
+MinstrelHtWifiManager::GetIndex (uint8_t groupId, uint8_t rateId)
+{
+  NS_LOG_FUNCTION (this << +groupId << +rateId);
+  uint16_t index;
+  index = groupId * m_numRates + rateId;
+  return index;
+}
+
+uint8_t
+MinstrelHtWifiManager::GetRateId (uint16_t index)
+{
+  NS_LOG_FUNCTION (this << index);
+  uint8_t id;
+  id = index % m_numRates;
+  return id;
+}
+
+uint8_t
+MinstrelHtWifiManager::GetGroupId (uint16_t index)
+{
+  NS_LOG_FUNCTION (this << index);
+  return index / m_numRates;
+}
+
+uint8_t
+MinstrelHtWifiManager::GetHtGroupId (uint8_t txstreams, uint16_t gi, uint16_t chWidth)
+{
+  NS_LOG_FUNCTION (this << +txstreams << gi << chWidth);
+  uint8_t giIndex = (gi == 400) ? 1 : 0;
+  uint8_t widthIndex = (chWidth == 40) ? 1 : 0;
+  return (MAX_HT_SUPPORTED_STREAMS * 2 * widthIndex) + (MAX_HT_SUPPORTED_STREAMS * giIndex) + txstreams - 1;
+}
+
+uint8_t
+MinstrelHtWifiManager::GetVhtGroupId (uint8_t txstreams, uint16_t gi, uint16_t chWidth)
+{
+  NS_LOG_FUNCTION (this << +txstreams << gi << chWidth);
+  uint8_t giIndex = (gi == 400) ? 1 : 0;
+  uint8_t widthIndex;
+  if (chWidth == 160)
+    {
+      widthIndex = 3;
+    }
+  else if (chWidth == 80)
+    {
+      widthIndex = 2;
+    }
+  else if (chWidth == 40)
+    {
+      widthIndex = 1;
+    }
+  else //20 MHz
+    {
+      widthIndex = 0;
+    }
+  uint8_t groupId = (MAX_HT_STREAM_GROUPS * MAX_HT_SUPPORTED_STREAMS); ///add all HT groups
+  groupId += (MAX_VHT_SUPPORTED_STREAMS * 2 * widthIndex) + (MAX_VHT_SUPPORTED_STREAMS * giIndex) + txstreams - 1;
+  return groupId;
+}
+
+uint8_t
+MinstrelHtWifiManager::GetHeGroupId (uint8_t txstreams, uint16_t gi, uint16_t chWidth)
+{
+  NS_LOG_FUNCTION (this << +txstreams << gi << chWidth);
+  uint8_t giIndex;
+  if (gi == 800)
+    {
+      giIndex = 2;
+    }
+  else if (gi == 1600)
+    {
+      giIndex = 1;
+    }
+  else //3200 ns
+    {
+      giIndex = 0;
+    }
+  uint8_t widthIndex;
+  if (chWidth == 160)
+    {
+      widthIndex = 3;
+    }
+  else if (chWidth == 80)
+    {
+      widthIndex = 2;
+    }
+  else if (chWidth == 40)
+    {
+      widthIndex = 1;
+    }
+  else //20 MHz
+    {
+      widthIndex = 0;
+    }
+  uint8_t groupId = (MAX_HT_STREAM_GROUPS * MAX_HT_SUPPORTED_STREAMS); ///add all HT groups
+  if (GetVhtSupported ()) ///This check is needed since we do not support VHT in 2.4 GHz band
+    {
+      groupId += MAX_VHT_STREAM_GROUPS * MAX_VHT_SUPPORTED_STREAMS; ///add all VHT groups
+    }
+  groupId += (MAX_HE_SUPPORTED_STREAMS * 3 * widthIndex) + (MAX_HE_SUPPORTED_STREAMS * giIndex) + txstreams - 1;
+  return groupId;
+}
+
+uint16_t
+MinstrelHtWifiManager::GetLowestIndex (MinstrelHtWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+
+  uint8_t groupId = 0;
+  uint8_t rateId = 0;
+  while (groupId < m_numGroups && !station->m_groupsTable[groupId].m_supported)
+    {
+      groupId++;
+    }
+  while (rateId < m_numRates && !station->m_groupsTable[groupId].m_ratesTable[rateId].supported)
+    {
+      rateId++;
+    }
+  NS_ASSERT (station->m_groupsTable[groupId].m_supported && station->m_groupsTable[groupId].m_ratesTable[rateId].supported);
+  return GetIndex (groupId, rateId);
+}
+
+uint16_t
+MinstrelHtWifiManager::GetLowestIndex (MinstrelHtWifiRemoteStation *station, uint8_t groupId)
+{
+  NS_LOG_FUNCTION (this << station << +groupId);
+
+  uint8_t rateId = 0;
+  while (rateId < m_numRates && !station->m_groupsTable[groupId].m_ratesTable[rateId].supported)
+    {
+      rateId++;
+    }
+  NS_ASSERT (station->m_groupsTable[groupId].m_supported && station->m_groupsTable[groupId].m_ratesTable[rateId].supported);
+  return GetIndex (groupId, rateId);
+}
+
+WifiModeList
+MinstrelHtWifiManager::GetHeDeviceMcsList () const
+{
+  WifiModeList heMcsList;
+  for (const auto & mode : GetPhy ()->GetMcsList (WIFI_MOD_CLASS_HE))
+    {
+      heMcsList.push_back (mode);
+    }
+  return heMcsList;
+}
+
+WifiModeList
+MinstrelHtWifiManager::GetVhtDeviceMcsList (void) const
+{
+  WifiModeList vhtMcsList;
+  for (const auto & mode : GetPhy ()->GetMcsList (WIFI_MOD_CLASS_VHT))
+    {
+      vhtMcsList.push_back (mode);
+    }
+  return vhtMcsList;
+}
+
+WifiModeList
+MinstrelHtWifiManager::GetHtDeviceMcsList (void) const
+{
+  WifiModeList htMcsList;
+  for (const auto & mode : GetPhy ()->GetMcsList (WIFI_MOD_CLASS_HT))
+    {
+      htMcsList.push_back (mode);
+    }
+  return htMcsList;
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h ns-3.34/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,624 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 Duy Nguyen
+ * Copyright (c) 2015 Ghada Badawy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *Authors: Duy Nguyen <duy@soe.ucsc.edu>
+ *         Ghada Badawy <gbadawy@gmail.com>
+ *         Matias Richart <mrichart@fing.edu.uy>
+ *
+ * MinstrelHt is a rate adaptation algorithm for high-throughput (HT) 802.11
+ */
+
+#ifndef MINSTREL_HT_WIFI_MANAGER_H
+#define MINSTREL_HT_WIFI_MANAGER_H
+
+#include "ns3/wifi-remote-station-manager.h"
+#include "minstrel-wifi-manager.h"
+#include "ns3/wifi-mpdu-type.h"
+
+namespace ns3 {
+
+/**
+ * Data structure to save transmission time calculations per rate.
+ */
+typedef std::map<WifiMode, Time> TxTime;
+
+/**
+ * \enum McsGroupType
+ * \brief Available MCS group types
+ */
+enum McsGroupType
+  {
+    GROUP_HT = 0,
+    GROUP_VHT,
+    GROUP_HE
+  };
+
+/**
+* \brief Stream insertion operator.
+*
+* \param os the stream
+* \param type the MCS group type
+* \returns a reference to the stream
+*/
+inline std::ostream& operator<< (std::ostream& os, McsGroupType type)
+{
+  switch (type)
+    {
+      case GROUP_HT:
+        return (os << "HT");
+      case GROUP_VHT:
+        return (os << "VHT");
+      case GROUP_HE:
+        return (os << "HE");
+      default:
+        return (os << "INVALID");
+    }
+}
+
+/**
+ * Data structure to contain the information that defines a group.
+ * It also contains the transmission times for all the MCS in the group.
+ * A group is a collection of MCS defined by the number of spatial streams,
+ * if it uses or not Short Guard Interval, and the channel width used.
+ */
+struct McsGroup
+{
+  uint8_t streams;   ///< number of spatial streams
+  uint16_t gi;       ///< guard interval duration (nanoseconds)
+  uint16_t chWidth;  ///< channel width (MHz)
+  McsGroupType type; ///< identifies the group, \see McsGroupType
+  bool isSupported;  ///< flag whether group is  supported
+  // To accurately account for TX times, we separate the TX time of the first
+  // MPDU in an A-MPDU from the rest of the MPDUs.
+  TxTime ratesTxTimeTable;          ///< rates transmit time table
+  TxTime ratesFirstMpduTxTimeTable; ///< rates MPDU transmit time table
+};
+
+/**
+ * Data structure for a table of group definitions.
+ * A vector of McsGroups.
+ */
+typedef std::vector<McsGroup> MinstrelMcsGroups;
+
+struct MinstrelHtWifiRemoteStation;
+/**
+ * A struct to contain all statistics information related to a data rate.
+ */
+struct MinstrelHtRateInfo
+{
+  /**
+   * Perfect transmission time calculation, or frame calculation.
+   * Given a bit rate and a packet length n bytes.
+   */
+  Time perfectTxTime;
+  bool supported;               //!< If the rate is supported.
+  uint8_t mcsIndex;             //!< The index in the operationalMcsSet of the WifiRemoteStationManager.
+  uint32_t retryCount;          //!< Retry limit.
+  uint32_t adjustedRetryCount;  //!< Adjust the retry limit for this rate.
+  uint32_t numRateAttempt;      //!< Number of transmission attempts so far.
+  uint32_t numRateSuccess;      //!< Number of successful frames transmitted so far.
+  double prob;                  //!< Current probability within last time interval. (# frame success )/(# total frames)
+  bool retryUpdated;            //!< If number of retries was updated already.
+  /**
+   * Exponential weighted moving average of probability.
+   * EWMA calculation:
+   * ewma_prob =[prob *(100 - ewma_level) + (ewma_prob_old * ewma_level)]/100
+   */
+  double ewmaProb;
+  double ewmsdProb;             //!< Exponential weighted moving standard deviation of probability.
+  uint32_t prevNumRateAttempt;  //!< Number of transmission attempts with previous rate.
+  uint32_t prevNumRateSuccess;  //!< Number of successful frames transmitted with previous rate.
+  uint32_t numSamplesSkipped;   //!< Number of times this rate statistics were not updated because no attempts have been made.
+  uint64_t successHist;         //!< Aggregate of all transmission successes.
+  uint64_t attemptHist;         //!< Aggregate of all transmission attempts.
+  double throughput;            //!< Throughput of this rate (in packets per second).
+};
+
+/**
+ * Data structure for a Minstrel Rate table.
+ * A vector of a struct MinstrelHtRateInfo.
+ */
+typedef std::vector<MinstrelHtRateInfo> MinstrelHtRate;
+
+/**
+ * A struct to contain information of a group.
+ */
+struct GroupInfo
+{
+  /**
+   * MCS rates are divided into groups based on the number of streams and flags that they use.
+   */
+  uint8_t m_col;                  //!< Sample table column.
+  uint8_t m_index;                //!< Sample table index.
+  bool m_supported;               //!< If the rates of this group are supported by the station.
+  uint16_t m_maxTpRate;           //!< The max throughput rate of this group in bps.
+  uint16_t m_maxTpRate2;          //!< The second max throughput rate of this group in bps.
+  uint16_t m_maxProbRate;         //!< The highest success probability rate of this group in bps.
+  MinstrelHtRate m_ratesTable;    //!< Information about rates of this group.
+};
+
+/**
+ * Data structure for a table of groups. Each group is of type GroupInfo.
+ * A vector of a GroupInfo.
+ */
+typedef std::vector<struct GroupInfo> McsGroupData;
+
+/**
+ * Constants for maximum values.
+ */
+
+static const uint8_t MAX_HT_SUPPORTED_STREAMS = 4;  //!< Maximal number of streams supported by the HT PHY layer.
+static const uint8_t MAX_VHT_SUPPORTED_STREAMS = 8; //!< Maximal number of streams supported by the VHT PHY layer.
+static const uint8_t MAX_HE_SUPPORTED_STREAMS = 8;  //!< Maximal number of streams supported by the HE PHY layer.
+static const uint8_t MAX_HT_STREAM_GROUPS = 4;      //!< Maximal number of groups per stream in HT (2 possible channel widths and 2 possible GI configurations).
+static const uint8_t MAX_VHT_STREAM_GROUPS = 8;     //!< Maximal number of groups per stream in VHT (4 possible channel widths and 2 possible GI configurations).
+static const uint8_t MAX_HE_STREAM_GROUPS = 12;     //!< Maximal number of groups per stream in HE (4 possible channel widths and 3 possible GI configurations).
+static const uint8_t MAX_HT_GROUP_RATES = 8;        //!< Number of rates (or MCS) per HT group.
+static const uint8_t MAX_VHT_GROUP_RATES = 10;      //!< Number of rates (or MCS) per VHT group.
+static const uint8_t MAX_HE_GROUP_RATES = 12;       //!< Number of rates (or MCS) per HE group.
+static const uint8_t MAX_HT_WIDTH = 40;             //!< Maximal channel width in MHz.
+static const uint8_t MAX_VHT_WIDTH = 160;           //!< Maximal channel width in MHz.
+static const uint8_t MAX_HE_WIDTH = 160;            //!< Maximal channel width in MHz.
+
+/**
+ * \brief Implementation of Minstrel-HT Rate Control Algorithm
+ * \ingroup wifi
+ *
+ * Minstrel-HT is a rate adaptation mechanism for the 802.11n/ac/ax standards
+ * based on Minstrel, and is based on the approach of probing the channel
+ * to dynamically learn about working rates that can be supported.
+ * Minstrel-HT is designed for high-latency devices that implement a
+ * Multiple Rate Retry (MRR) chain. This kind of device does
+ * not give feedback for every frame retransmission, but only when a frame
+ * was correctly transmitted (an Ack is received) or a frame transmission
+ * completely fails (all retransmission attempts fail).
+ * The MRR chain is used to advise the hardware about which rate to use
+ * when retransmitting a frame.
+ *
+ * Minstrel-HT adapts the MCS, channel width, number of streams, and
+ * short guard interval (enabled or disabled).  For keeping statistics,
+ * it arranges MCS in groups, where each group is defined by the
+ * tuple (streams, GI, channel width).  There is a vector of all groups
+ * supported by the PHY layer of the transmitter; for each group, the
+ * capabilities and the estimated duration of its rates are maintained.
+ *
+ * Each station maintains a table of groups statistics. For each group, a flag
+ * indicates if the group is supported by the station. Different stations
+ * communicating with an AP can have different capabilities.
+ *
+ * Stats are updated per A-MPDU when receiving AmpduTxStatus. If the number
+ * of successful or failed MPDUs is greater than zero (a BlockAck was
+ * received), the rates are also updated.
+ * If the number of successful and failed MPDUs is zero (BlockAck timeout),
+ * then the rate selected is based on the MRR chain.
+ *
+ * On each update interval, it sets the maxThrRate, the secondmaxThrRate
+ * and the maxProbRate for the MRR chain. These rates are only used when
+ * an entire A-MPDU fails and is retried.
+ *
+ * Differently from legacy minstrel, sampling is not done based on
+ * "lookaround ratio", but assuring all rates are sampled at least once
+ * each interval. However, it samples less often the low rates and high
+ * probability of error rates.
+ *
+ * When this rate control is configured but non-legacy modes are not supported,
+ * Minstrel-HT uses legacy Minstrel (minstrel-wifi-manager) for rate control.
+ */
+class MinstrelHtWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  MinstrelHtWifiManager ();
+  virtual ~MinstrelHtWifiManager ();
+
+  void SetupPhy (const Ptr<WifiPhy> phy) override;
+  void SetupMac (const Ptr<WifiMac> mac) override;
+  int64_t AssignStreams (int64_t stream) override;
+
+  /**
+   * TracedCallback signature for rate change events.
+   *
+   * \param [in] rate The new rate.
+   * \param [in] address The remote station MAC address.
+   */
+  typedef void (*RateChangeTracedCallback)(const uint64_t rate, const Mac48Address remoteAddress);
+
+
+private:
+  void DoInitialize (void) override;
+  WifiRemoteStation * DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+  void DoReportAmpduTxStatus (WifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus,
+                              double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  bool DoNeedRetransmission (WifiRemoteStation *st, Ptr<const Packet> packet, bool normally) override;
+
+  /**
+   * Check the validity of a combination of number of streams, chWidth and mode.
+   *
+   * \param phy pointer to the wifi PHY
+   * \param streams the number of streams
+   * \param chWidth the channel width (MHz)
+   * \param mode the wifi mode
+   * \returns true if the combination is valid
+   */
+  bool IsValidMcs (Ptr<WifiPhy> phy, uint8_t streams, uint16_t chWidth, WifiMode mode);
+
+  /**
+   * Estimates the TxTime of a frame with a given mode and group (stream, guard interval and channel width).
+   *
+   * \param phy pointer to the wifi PHY
+   * \param streams the number of streams
+   * \param gi guard interval duration (nanoseconds)
+   * \param chWidth the channel width (MHz)
+   * \param mode the wifi mode
+   * \param mpduType the type of the MPDU
+   * \returns the transmit time
+   */
+  Time CalculateMpduTxDuration (Ptr<WifiPhy> phy, uint8_t streams, uint16_t gi,
+                                uint16_t chWidth, WifiMode mode, MpduType mpduType);
+
+  /**
+   * Obtain the TxTime saved in the group information.
+   *
+   * \param groupId the group ID
+   * \param mode the wifi mode
+   * \returns the transmit time
+   */
+  Time GetMpduTxTime (uint8_t groupId, WifiMode mode) const;
+
+  /**
+   * Save a TxTime to the vector of groups.
+   *
+   * \param groupId the group ID
+   * \param mode the wifi mode
+   * \param t the transmit time
+   */
+  void AddMpduTxTime (uint8_t groupId, WifiMode mode, Time t);
+
+  /**
+   * Obtain the TxTime saved in the group information.
+   *
+   * \param groupId the group ID
+   * \param mode the wifi mode
+   * \returns the transmit time
+   */
+  Time GetFirstMpduTxTime (uint8_t groupId, WifiMode mode) const;
+
+  /**
+   * Save a TxTime to the vector of groups.
+   *
+   * \param groupId the group ID
+   * \param mode the wifi mode
+   * \param t the transmit time
+   */
+  void AddFirstMpduTxTime (uint8_t groupId, WifiMode mode, Time t);
+
+  /**
+   * Update the number of retries and reset accordingly.
+   * \param station the wifi remote station
+   */
+  void UpdateRetry (MinstrelHtWifiRemoteStation *station);
+
+  /**
+   * Update the number of sample count variables.
+   *
+   * \param station the wifi remote station
+   * \param nSuccessfulMpdus the number of successfully received MPDUs
+   * \param nFailedMpdus the number of failed MPDUs
+   */
+  void UpdatePacketCounters (MinstrelHtWifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus);
+
+  /**
+   * Getting the next sample from Sample Table.
+   *
+   * \param station the wifi remote station
+   * \returns the next sample
+   */
+  uint16_t GetNextSample (MinstrelHtWifiRemoteStation *station);
+
+  /**
+   * Set the next sample from Sample Table.
+   *
+   * \param station the wifi remote station
+   */
+  void SetNextSample (MinstrelHtWifiRemoteStation *station);
+
+  /**
+   * Find a rate to use from Minstrel Table.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   * \returns the rate in bps
+   */
+  uint16_t FindRate (MinstrelHtWifiRemoteStation *station);
+
+  /**
+   * Update the Minstrel Table.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   */
+  void UpdateStats (MinstrelHtWifiRemoteStation *station);
+
+  /**
+   * Initialize Minstrel Table.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   */
+  void RateInit (MinstrelHtWifiRemoteStation *station);
+
+  /**
+   * Return the average throughput of the MCS defined by groupId and rateId.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   * \param groupId the group ID
+   * \param rateId the rate ID
+   * \param ewmaProb the EWMA probability
+   * \returns the throughput in bps
+   */
+  double CalculateThroughput (MinstrelHtWifiRemoteStation *station, uint8_t groupId, uint8_t rateId, double ewmaProb);
+
+  /**
+   * Set index rate as maxTpRate or maxTp2Rate if is better than current values.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   * \param index the index
+   */
+  void SetBestStationThRates (MinstrelHtWifiRemoteStation *station, uint16_t index);
+
+  /**
+   * Set index rate as maxProbRate if it is better than current value.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   * \param index the index
+   */
+  void SetBestProbabilityRate (MinstrelHtWifiRemoteStation *station, uint16_t index);
+
+  /**
+   * Calculate the number of retransmissions to set for the index rate.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   * \param index the index
+   */
+  void CalculateRetransmits (MinstrelHtWifiRemoteStation *station, uint16_t index);
+
+  /**
+   * Calculate the number of retransmissions to set for the (groupId, rateId) rate.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   * \param groupId the group ID
+   * \param rateId the rate ID
+   */
+  void CalculateRetransmits (MinstrelHtWifiRemoteStation *station, uint8_t groupId, uint8_t rateId);
+
+  /**
+   * Estimate the time to transmit the given packet with the given number of retries.
+   * This function is "roughly" the function "calc_usecs_unicast_packet" in minstrel.c
+   * in the madwifi implementation.
+   *
+   * The basic idea is that, we try to estimate the "average" time used to transmit the
+   * packet for the given number of retries while also accounting for the 802.11 congestion
+   * window change. The original code in the madwifi seems to estimate the number of backoff
+   * slots as the half of the current CW size.
+   *
+   * There are four main parts:
+   *  - wait for DIFS (sense idle channel)
+   *  - Ack timeouts
+   *  - Data transmission
+   *  - backoffs according to CW
+   *
+   * \param dataTransmissionTime the data transmission time
+   * \param shortRetries the short retries
+   * \param longRetries the long retries
+   * \returns the unicast packet time
+   */
+  Time CalculateTimeUnicastPacket (Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries);
+
+  /**
+   * Perform EWMSD (Exponentially Weighted Moving Standard Deviation) calculation.
+   *
+   * \param oldEwmsd the old EWMSD
+   * \param currentProb the current probability
+   * \param ewmaProb the EWMA probability
+   * \param weight the weight
+   * \returns the EWMSD
+   */
+  double CalculateEwmsd (double oldEwmsd, double currentProb, double ewmaProb, double weight);
+
+  /**
+   * Initialize Sample Table.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   */
+  void InitSampleTable (MinstrelHtWifiRemoteStation *station);
+
+  /**
+   * Printing Sample Table.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   */
+  void PrintSampleTable (MinstrelHtWifiRemoteStation *station);
+
+  /**
+   * Printing Minstrel Table.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   */
+  void PrintTable (MinstrelHtWifiRemoteStation *station);
+
+  /**
+   * Print group statistics.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   * \param groupId the group ID
+   * \param of the output file stream
+   */
+  void StatsDump (MinstrelHtWifiRemoteStation *station, uint8_t groupId, std::ofstream &of);
+
+  /**
+   * Check for initializations.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   */
+  void CheckInit (MinstrelHtWifiRemoteStation *station);
+
+  /**
+   * Count retries.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   * \returns the count of retries
+   */
+  uint32_t CountRetries (MinstrelHtWifiRemoteStation * station);
+
+  /**
+   * Update rate.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   */
+  void UpdateRate (MinstrelHtWifiRemoteStation *station);
+
+  /**
+   * Return the rateId inside a group, from the global index.
+   *
+   * \param index the index
+   * \returns the rate ID
+   */
+  uint8_t GetRateId (uint16_t index);
+
+  /**
+   * Return the groupId from the global index.
+   *
+   * \param index the index
+   * \returns the group ID
+   */
+  uint8_t GetGroupId (uint16_t index);
+
+  /**
+   * Returns the global index corresponding to the groupId and rateId.
+   *
+   * For managing rates from different groups, a global index for
+   * all rates in all groups is used.
+   * The group order is fixed by BW -> SGI -> streams.
+   *
+   * \param groupId the group ID
+   * \param rateId the rate ID
+   * \returns the index
+   */
+  uint16_t GetIndex (uint8_t groupId, uint8_t rateId);
+
+  /**
+   * Returns the groupId of an HT MCS with the given number of streams, GI and channel width used.
+   *
+   * \param txstreams the number of streams
+   * \param gi guard interval duration (nanoseconds)
+   * \param chWidth the channel width (MHz)
+   * \returns the HT group ID
+   */
+  uint8_t GetHtGroupId (uint8_t txstreams, uint16_t gi, uint16_t chWidth);
+
+  /**
+   * Returns the groupId of a VHT MCS with the given number of streams, GI and channel width used.
+   *
+   * \param txstreams the number of streams
+   * \param gi guard interval duration (nanoseconds)
+   * \param chWidth the channel width (MHz)
+   * \returns the VHT group ID
+   */
+  uint8_t GetVhtGroupId (uint8_t txstreams, uint16_t gi, uint16_t chWidth);
+
+  /**
+   * Returns the groupId of an HE MCS with the given number of streams, GI and channel width used.
+   *
+   * \param txstreams the number of streams
+   * \param gi guard interval duration (nanoseconds)
+   * \param chWidth the channel width (MHz)
+   * \returns the HE group ID
+   */
+  uint8_t GetHeGroupId (uint8_t txstreams, uint16_t gi, uint16_t chWidth);
+
+  /**
+   * Returns the lowest global index of the rates supported by the station.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   * \returns the lowest global index
+   */
+  uint16_t GetLowestIndex (MinstrelHtWifiRemoteStation *station);
+
+  /**
+   * Returns the lowest global index of the rates supported by in the group.
+   *
+   * \param station the Minstrel-HT wifi remote station
+   * \param groupId the group ID
+   * \returns the lowest global index
+   */
+  uint16_t GetLowestIndex (MinstrelHtWifiRemoteStation *station, uint8_t groupId);
+
+  /**
+   * Returns a list of only the HE MCS supported by the device.
+   * \returns the list of the HE MCS supported
+   */
+  WifiModeList GetHeDeviceMcsList () const;
+
+  /**
+   * Returns a list of only the VHT MCS supported by the device.
+   * \returns the list of the VHT MCS supported
+   */
+  WifiModeList GetVhtDeviceMcsList (void) const;
+
+  /**
+   * Returns a list of only the HT MCS supported by the device.
+   * \returns the list of the HT MCS supported
+   */
+  WifiModeList GetHtDeviceMcsList (void) const;
+
+  Time m_updateStats;            //!< How frequent do we calculate the stats.
+  Time m_legacyUpdateStats;      //!< How frequent do we calculate the stats for legacy MinstrelWifiManager.
+  uint8_t m_lookAroundRate;      //!< The % to try other rates than our current rate.
+  uint8_t m_ewmaLevel;           //!< Exponential weighted moving average level (or coefficient).
+  uint8_t m_nSampleCol;          //!< Number of sample columns.
+  uint32_t m_frameLength;        //!< Frame length used for calculate modes TxTime in bytes.
+  uint8_t m_numGroups;           //!< Number of groups Minstrel should consider.
+  uint8_t m_numRates;            //!< Number of rates per group Minstrel should consider.
+  bool m_useLatestAmendmentOnly; //!< Flag if only the latest supported amendment by both peers should be used.
+  bool m_printStats;             //!< If statistics table should be printed.
+
+  MinstrelMcsGroups m_minstrelGroups;                 //!< Global array for groups information.
+
+  Ptr<MinstrelWifiManager> m_legacyManager;           //!< Pointer to an instance of MinstrelWifiManager. Used when 802.11n/ac/ax not supported.
+
+  Ptr<UniformRandomVariable> m_uniformRandomVariable; //!< Provides uniform random variables.
+
+  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
+};
+
+} // namespace ns3
+
+#endif /* MINSTREL_HT_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/minstrel-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/minstrel-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/minstrel-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/minstrel-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,1098 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 Duy Nguyen
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Duy Nguyen <duy@soe.ucsc.edu>
+ *          Matías Richart <mrichart@fing.edu.uy>
+ *
+ * Some Comments:
+ *
+ * 1) Segment Size is declared for completeness but not used  because it has
+ *    to do more with the requirement of the specific hardware.
+ *
+ * 2) By default, Minstrel applies the multi-rate retry (the core of Minstrel
+ *    algorithm). Otherwise, please use ConstantRateWifiManager instead.
+ *
+ * http://linuxwireless.org/en/developers/Documentation/mac80211/RateControl/minstrel
+ */
+
+#include <iomanip>
+#include "ns3/packet.h"
+#include "ns3/random-variable-stream.h"
+#include "ns3/simulator.h"
+#include "ns3/log.h"
+#include "minstrel-wifi-manager.h"
+#include "ns3/wifi-mac.h"
+#include "ns3/wifi-phy.h"
+
+#define Min(a,b) ((a < b) ? a : b)
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("MinstrelWifiManager");
+
+NS_OBJECT_ENSURE_REGISTERED (MinstrelWifiManager);
+
+TypeId
+MinstrelWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::MinstrelWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<MinstrelWifiManager> ()
+    .AddAttribute ("UpdateStatistics",
+                   "The interval between updating statistics table ",
+                   TimeValue (Seconds (0.1)),
+                   MakeTimeAccessor (&MinstrelWifiManager::m_updateStats),
+                   MakeTimeChecker ())
+    .AddAttribute ("LookAroundRate",
+                   "The percentage to try other rates",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&MinstrelWifiManager::m_lookAroundRate),
+                   MakeUintegerChecker<uint8_t> ())
+    .AddAttribute ("EWMA",
+                   "EWMA level",
+                   UintegerValue (75),
+                   MakeUintegerAccessor (&MinstrelWifiManager::m_ewmaLevel),
+                   MakeUintegerChecker<uint8_t> ())
+    .AddAttribute ("SampleColumn",
+                   "The number of columns used for sampling",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&MinstrelWifiManager::m_sampleCol),
+                   MakeUintegerChecker <uint8_t> ())
+    .AddAttribute ("PacketLength",
+                   "The packet length used for calculating mode TxTime",
+                   UintegerValue (1200),
+                   MakeUintegerAccessor (&MinstrelWifiManager::m_pktLen),
+                   MakeUintegerChecker <uint32_t> ())
+    .AddAttribute ("PrintStats",
+                   "Print statistics table",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&MinstrelWifiManager::m_printStats),
+                   MakeBooleanChecker ())
+    .AddAttribute ("PrintSamples",
+                   "Print samples table",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&MinstrelWifiManager::m_printSamples),
+                   MakeBooleanChecker ())
+    .AddTraceSource ("Rate",
+                     "Traced value for rate changes (b/s)",
+                     MakeTraceSourceAccessor (&MinstrelWifiManager::m_currentRate),
+                     "ns3::TracedValueCallback::Uint64")
+  ;
+  return tid;
+}
+
+MinstrelWifiManager::MinstrelWifiManager ()
+  : WifiRemoteStationManager (),
+    m_currentRate (0)
+{
+  NS_LOG_FUNCTION (this);
+  m_uniformRandomVariable = CreateObject<UniformRandomVariable> ();
+}
+
+MinstrelWifiManager::~MinstrelWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+MinstrelWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
+{
+  NS_LOG_FUNCTION (this << phy);
+  for (const auto & mode : phy->GetModeList ())
+    {
+      WifiTxVector txVector;
+      txVector.SetMode (mode);
+      txVector.SetPreambleType (WIFI_PREAMBLE_LONG);
+      AddCalcTxTime (mode, phy->CalculateTxDuration (m_pktLen, txVector, phy->GetPhyBand ()));
+    }
+  WifiRemoteStationManager::SetupPhy (phy);
+}
+
+void
+MinstrelWifiManager::SetupMac (const Ptr<WifiMac> mac)
+{
+  NS_LOG_FUNCTION (this << mac);
+  WifiRemoteStationManager::SetupMac (mac);
+}
+
+void
+MinstrelWifiManager::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  if (GetHtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
+    }
+  if (GetVhtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
+    }
+  if (GetHeSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
+    }
+}
+
+int64_t
+MinstrelWifiManager::AssignStreams (int64_t stream)
+{
+  NS_LOG_FUNCTION (this << stream);
+  m_uniformRandomVariable->SetStream (stream);
+  return 1;
+}
+
+Time
+MinstrelWifiManager::GetCalcTxTime (WifiMode mode) const
+{
+  NS_LOG_FUNCTION (this << mode);
+  auto it = m_calcTxTime.find (mode);
+  NS_ASSERT (it != m_calcTxTime.end ());
+  return it->second;
+}
+
+void
+MinstrelWifiManager::AddCalcTxTime (WifiMode mode, Time t)
+{
+  NS_LOG_FUNCTION (this << mode << t);
+  m_calcTxTime.insert (std::make_pair (mode, t));
+}
+
+WifiRemoteStation *
+MinstrelWifiManager::DoCreateStation (void) const
+{
+  NS_LOG_FUNCTION (this);
+  MinstrelWifiRemoteStation *station = new MinstrelWifiRemoteStation ();
+
+  station->m_nextStatsUpdate = Simulator::Now () + m_updateStats;
+  station->m_col = 0;
+  station->m_index = 0;
+  station->m_maxTpRate = 0;
+  station->m_maxTpRate2 = 0;
+  station->m_maxProbRate = 0;
+  station->m_nModes = 0;
+  station->m_totalPacketsCount = 0;
+  station->m_samplePacketsCount = 0;
+  station->m_isSampling = false;
+  station->m_sampleRate = 0;
+  station->m_sampleDeferred = false;
+  station->m_shortRetry = 0;
+  station->m_longRetry = 0;
+  station->m_retry = 0;
+  station->m_txrate = 0;
+  station->m_initialized = false;
+
+  return station;
+}
+
+void
+MinstrelWifiManager::CheckInit (MinstrelWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  if (!station->m_initialized && GetNSupported (station) > 1)
+    {
+      //Note: we appear to be doing late initialization of the table
+      //to make sure that the set of supported rates has been initialized
+      //before we perform our own initialization.
+      station->m_nModes = GetNSupported (station);
+      station->m_minstrelTable = MinstrelRate (station->m_nModes);
+      station->m_sampleTable = SampleRate (station->m_nModes, std::vector<uint8_t> (m_sampleCol));
+      InitSampleTable (station);
+      RateInit (station);
+      station->m_initialized = true;
+    }
+}
+
+/**
+ *
+ * Retry Chain table is implemented here
+ *
+ * Try |         LOOKAROUND RATE              | NORMAL RATE
+ *     | random < best    | random > best     |
+ * --------------------------------------------------------------
+ *  1  | Best throughput  | Random rate       | Best throughput
+ *  2  | Random rate      | Best throughput   | Next best throughput
+ *  3  | Best probability | Best probability  | Best probability
+ *  4  | Lowest base rate | Lowest base rate  | Lowest base rate
+ *
+ * Note: For clarity, multiple blocks of if's and else's are used
+ * After failing max retry times, DoReportFinalDataFailed will be called
+ */
+void
+MinstrelWifiManager::UpdateRate (MinstrelWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_longRetry++;
+  station->m_minstrelTable[station->m_txrate].numRateAttempt++;
+
+  NS_LOG_DEBUG ("DoReportDataFailed " << station << " rate " << station->m_txrate << " longRetry " << station->m_longRetry);
+
+  //for normal rate, we're not currently sampling random rates
+  if (!station->m_isSampling)
+    {
+      NS_LOG_DEBUG ("Failed with normal rate: current=" << station->m_txrate << ", sample=" << station->m_sampleRate << ", maxTp=" << station->m_maxTpRate << ", maxTp2=" << station->m_maxTpRate2 << ", maxProb=" << station->m_maxProbRate);
+      //use best throughput rate
+      if (station->m_longRetry < station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount)
+        {
+          NS_LOG_DEBUG (" More retries left for the maximum throughput rate.");
+          station->m_txrate = station->m_maxTpRate;
+        }
+
+      //use second best throughput rate
+      else if (station->m_longRetry <= (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
+                                        station->m_minstrelTable[station->m_maxTpRate2].adjustedRetryCount))
+        {
+          NS_LOG_DEBUG (" More retries left for the second maximum throughput rate.");
+          station->m_txrate = station->m_maxTpRate2;
+        }
+
+      //use best probability rate
+      else if (station->m_longRetry <= (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
+                                        station->m_minstrelTable[station->m_maxTpRate2].adjustedRetryCount +
+                                        station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
+        {
+          NS_LOG_DEBUG (" More retries left for the maximum probability rate.");
+          station->m_txrate = station->m_maxProbRate;
+        }
+
+      //use lowest base rate
+      else if (station->m_longRetry > (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
+                                       station->m_minstrelTable[station->m_maxTpRate2].adjustedRetryCount +
+                                       station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
+        {
+          NS_LOG_DEBUG (" More retries left for the base rate.");
+          station->m_txrate = 0;
+        }
+    }
+
+  //for look-around rate, we're currently sampling random rates
+  else
+    {
+      NS_LOG_DEBUG ("Failed with look around rate: current=" << station->m_txrate << ", sample=" << station->m_sampleRate << ", maxTp=" << station->m_maxTpRate << ", maxTp2=" << station->m_maxTpRate2 << ", maxProb=" << station->m_maxProbRate);
+      //current sampling rate is slower than the current best rate
+      if (station->m_sampleDeferred)
+        {
+          NS_LOG_DEBUG ("Look around rate is slower than the maximum throughput rate.");
+          //use best throughput rate
+          if (station->m_longRetry < station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount)
+            {
+              NS_LOG_DEBUG (" More retries left for the maximum throughput rate.");
+              station->m_txrate = station->m_maxTpRate;
+            }
+
+          //use random rate
+          else if (station->m_longRetry <= (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
+                                            station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount))
+            {
+              NS_LOG_DEBUG (" More retries left for the sampling rate.");
+              station->m_txrate = station->m_sampleRate;
+            }
+
+          //use max probability rate
+          else if (station->m_longRetry <= (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
+                                            station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
+                                            station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount ))
+            {
+              NS_LOG_DEBUG (" More retries left for the maximum probability rate.");
+              station->m_txrate = station->m_maxProbRate;
+            }
+
+          //use lowest base rate
+          else if (station->m_longRetry > (station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
+                                           station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
+                                           station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
+            {
+              NS_LOG_DEBUG (" More retries left for the base rate.");
+              station->m_txrate = 0;
+            }
+        }
+      //current sampling rate is better than current best rate
+      else
+        {
+          NS_LOG_DEBUG ("Look around rate is faster than the maximum throughput rate.");
+          //use random rate
+          if (station->m_longRetry < station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount)
+            {
+              NS_LOG_DEBUG (" More retries left for the sampling rate.");
+              station->m_txrate = station->m_sampleRate;
+            }
+
+          //use the best throughput rate
+          else if (station->m_longRetry <= (station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
+                                            station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount))
+            {
+              NS_LOG_DEBUG (" More retries left for the maximum throughput rate.");
+              station->m_txrate = station->m_maxTpRate;
+            }
+
+          //use the best probability rate
+          else if (station->m_longRetry <= (station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
+                                            station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
+                                            station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
+            {
+              NS_LOG_DEBUG (" More retries left for the maximum probability rate.");
+              station->m_txrate = station->m_maxProbRate;
+            }
+
+          //use the lowest base rate
+          else if (station->m_longRetry > (station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
+                                           station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
+                                           station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount))
+            {
+              NS_LOG_DEBUG (" More retries left for the base rate.");
+              station->m_txrate = 0;
+            }
+        }
+    }
+}
+
+WifiTxVector
+MinstrelWifiManager::GetDataTxVector (MinstrelWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  if (!station->m_initialized)
+    {
+      CheckInit (station);
+    }
+  WifiMode mode = GetSupported (station, station->m_txrate);
+  if (m_currentRate != mode.GetDataRate (channelWidth) && !station->m_isSampling)
+    {
+      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
+      m_currentRate = mode.GetDataRate (channelWidth);
+    }
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+}
+
+WifiTxVector
+MinstrelWifiManager::GetRtsTxVector (MinstrelWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  NS_LOG_DEBUG ("DoGetRtsMode m_txrate=" << station->m_txrate);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiTxVector rtsTxVector;
+  WifiMode mode;
+  if (GetUseNonErpProtection () == false)
+    {
+      mode = GetSupported (station, 0);
+    }
+  else
+    {
+      mode = GetNonErpSupported (station, 0);
+    }
+  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+  return rtsTxVector;
+}
+
+uint32_t
+MinstrelWifiManager::CountRetries (MinstrelWifiRemoteStation *station)
+{
+  if (!station->m_isSampling)
+    {
+      return station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
+             station->m_minstrelTable[station->m_maxTpRate2].adjustedRetryCount +
+             station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount +
+             station->m_minstrelTable[0].adjustedRetryCount;
+    }
+  else
+    {
+      return station->m_minstrelTable[station->m_sampleRate].adjustedRetryCount +
+             station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount +
+             station->m_minstrelTable[station->m_maxProbRate].adjustedRetryCount +
+             station->m_minstrelTable[0].adjustedRetryCount;
+    }
+}
+
+uint16_t
+MinstrelWifiManager::FindRate (MinstrelWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+
+  if (station->m_totalPacketsCount == 0)
+    {
+      return 0;
+    }
+
+  uint16_t idx = 0;
+  NS_LOG_DEBUG ("Total: " << station->m_totalPacketsCount << "  Sample: " << station->m_samplePacketsCount << "  Deferred: " << station->m_numSamplesDeferred);
+
+  int delta = (station->m_totalPacketsCount * m_lookAroundRate / 100) - (station->m_samplePacketsCount + station->m_numSamplesDeferred / 2);
+
+  NS_LOG_DEBUG ("Decide sampling. Delta: " << delta << " lookAroundRatio: " <<  m_lookAroundRate);
+
+  /* delta < 0: no sampling required */
+  if (delta >= 0)
+    {
+      NS_LOG_DEBUG ("Search next sampling rate");
+      uint8_t ratesSupported = station->m_nModes;
+      if (delta > ratesSupported * 2)
+        {
+          /* From Linux implementation:
+           * With multi-rate retry, not every planned sample
+           * attempt actually gets used, due to the way the retry
+           * chain is set up - [max_tp,sample,prob,lowest] for
+           * sample_rate < max_tp.
+           *
+           * If there's too much sampling backlog and the link
+           * starts getting worse, minstrel would start bursting
+           * out lots of sampling frames, which would result
+           * in a large throughput loss. */
+          station->m_samplePacketsCount += (delta - ratesSupported * 2);
+        }
+
+      //now go through the table and find an index rate
+      idx = GetNextSample (station);
+
+      NS_LOG_DEBUG ("Sample rate = " << idx << "(" << GetSupported (station, idx) << ")");
+
+      //error check
+      if (idx >= station->m_nModes)
+        {
+          NS_LOG_DEBUG ("ALERT!!! ERROR");
+        }
+
+      //set the rate that we're currently sampling
+      station->m_sampleRate = idx;
+
+      /* From Linux implementation:
+       * Decide if direct ( 1st MRR stage) or indirect (2nd MRR stage)
+       * rate sampling method should be used.
+       * Respect such rates that are not sampled for 20 iterations.
+       */
+      if ((station->m_minstrelTable[idx].perfectTxTime > station->m_minstrelTable[station->m_maxTpRate].perfectTxTime)
+          && (station->m_minstrelTable[idx].numSamplesSkipped < 20))
+        {
+          // If the rate is slower and we have sample it enough, defer to second stage
+          station->m_sampleDeferred = true;
+          station->m_numSamplesDeferred++;
+
+          //set flag that we are currently sampling
+          station->m_isSampling = true;
+        }
+      else
+        {
+          // if samplieLimit is zero, then don't sample this rate
+          if (!station->m_minstrelTable[idx].sampleLimit)
+            {
+              idx = station->m_maxTpRate;
+              station->m_isSampling = false;
+            }
+          else
+            {
+              //set flag that we are currently sampling
+              station->m_isSampling = true;
+              if (station->m_minstrelTable[idx].sampleLimit > 0)
+                {
+                  station->m_minstrelTable[idx].sampleLimit--;
+                }
+            }
+        }
+
+      //using the best rate instead
+      if (station->m_sampleDeferred)
+        {
+          NS_LOG_DEBUG ("The next look around rate is slower than the maximum throughput rate, continue with the maximum throughput rate: " << station->m_maxTpRate << "(" << GetSupported (station, station->m_maxTpRate) << ")");
+          idx = station->m_maxTpRate;
+        }
+    }
+  //continue using the best rate
+  else
+    {
+      NS_LOG_DEBUG ("Continue using the maximum throughput rate: " << station->m_maxTpRate << "(" << GetSupported (station, station->m_maxTpRate) << ")");
+      idx = station->m_maxTpRate;
+    }
+
+  NS_LOG_DEBUG ("Rate = " << idx << "(" << GetSupported (station, idx) << ")");
+
+  return idx;
+}
+
+void
+MinstrelWifiManager::UpdateStats (MinstrelWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  if (Simulator::Now () <  station->m_nextStatsUpdate)
+    {
+      return;
+    }
+
+  if (!station->m_initialized)
+    {
+      return;
+    }
+  NS_LOG_FUNCTION (this);
+  station->m_nextStatsUpdate = Simulator::Now () + m_updateStats;
+  NS_LOG_DEBUG ("Next update at " << station->m_nextStatsUpdate);
+  NS_LOG_DEBUG ("Currently using rate: " << station->m_txrate << " (" << GetSupported (station, station->m_txrate) << ")");
+
+  Time txTime;
+  uint32_t tempProb;
+
+  NS_LOG_DEBUG ("Index-Rate\t\tAttempt\tSuccess");
+  for (uint8_t i = 0; i < station->m_nModes; i++)
+    {
+
+      //calculate the perfect TX time for this rate
+      txTime = station->m_minstrelTable[i].perfectTxTime;
+
+      //just for initialization
+      if (txTime.GetMicroSeconds () == 0)
+        {
+          txTime = Seconds (1);
+        }
+
+      NS_LOG_DEBUG (+i << " " << GetSupported (station, i) <<
+                    "\t" << station->m_minstrelTable[i].numRateAttempt <<
+                    "\t" << station->m_minstrelTable[i].numRateSuccess);
+
+      //if we've attempted something
+      if (station->m_minstrelTable[i].numRateAttempt)
+        {
+          station->m_minstrelTable[i].numSamplesSkipped = 0;
+          /**
+           * calculate the probability of success
+           * assume probability scales from 0 to 18000
+           */
+          tempProb = (station->m_minstrelTable[i].numRateSuccess * 18000) / station->m_minstrelTable[i].numRateAttempt;
+
+          //bookkeeping
+          station->m_minstrelTable[i].prob = tempProb;
+
+          if (station->m_minstrelTable[i].successHist == 0)
+            {
+              station->m_minstrelTable[i].ewmaProb = tempProb;
+            }
+          else
+            {
+              //EWMA probability (cast for gcc 3.4 compatibility)
+              tempProb = ((tempProb * (100 - m_ewmaLevel)) + (station->m_minstrelTable[i].ewmaProb * m_ewmaLevel) ) / 100;
+
+              station->m_minstrelTable[i].ewmaProb = tempProb;
+            }
+
+          //calculating throughput
+          station->m_minstrelTable[i].throughput = tempProb * static_cast<uint32_t> ((1000000 / txTime.GetMicroSeconds ()));
+        }
+      else
+        {
+          station->m_minstrelTable[i].numSamplesSkipped++;
+        }
+
+      //bookkeeping
+      station->m_minstrelTable[i].successHist += station->m_minstrelTable[i].numRateSuccess;
+      station->m_minstrelTable[i].attemptHist += station->m_minstrelTable[i].numRateAttempt;
+      station->m_minstrelTable[i].prevNumRateSuccess = station->m_minstrelTable[i].numRateSuccess;
+      station->m_minstrelTable[i].prevNumRateAttempt = station->m_minstrelTable[i].numRateAttempt;
+      station->m_minstrelTable[i].numRateSuccess = 0;
+      station->m_minstrelTable[i].numRateAttempt = 0;
+
+      //Sample less often below 10% and  above 95% of success
+      if ((station->m_minstrelTable[i].ewmaProb > 17100) || (station->m_minstrelTable[i].ewmaProb < 1800))
+        {
+          /**
+           * See: http://wireless.kernel.org/en/developers/Documentation/mac80211/RateControl/minstrel/
+           *
+           * Analysis of information showed that the system was sampling too hard at some rates.
+           * For those rates that never work (54mb, 500m range) there is no point in retrying 10 sample packets (< 6 ms time).
+           * Consequently, for the very low probability rates, we try at most twice when fails and not sample more than 4 times.
+           */
+          if (station->m_minstrelTable[i].retryCount > 2)
+            {
+              station->m_minstrelTable[i].adjustedRetryCount = 2;
+            }
+          station->m_minstrelTable[i].sampleLimit = 4;
+        }
+      else
+        {
+          // no sampling limit.
+          station->m_minstrelTable[i].sampleLimit = -1;
+          station->m_minstrelTable[i].adjustedRetryCount = station->m_minstrelTable[i].retryCount;
+        }
+
+      //if it's 0 allow two retries.
+      if (station->m_minstrelTable[i].adjustedRetryCount == 0)
+        {
+          station->m_minstrelTable[i].adjustedRetryCount = 2;
+        }
+    }
+
+  NS_LOG_DEBUG ("Attempt/success reset to 0");
+
+  uint32_t max_tp = 0;
+  uint8_t index_max_tp = 0, index_max_tp2 = 0;
+
+  //go find max throughput, second maximum throughput, high probability of success
+  NS_LOG_DEBUG ("Finding the maximum throughput, second maximum throughput, and highest probability");
+  NS_LOG_DEBUG ("Index-Rate\t\tT-put\tEWMA");
+  for (uint8_t i = 0; i < station->m_nModes; i++)
+    {
+      NS_LOG_DEBUG (+i << " " << GetSupported (station, i) <<
+                    "\t" << station->m_minstrelTable[i].throughput <<
+                    "\t" << station->m_minstrelTable[i].ewmaProb);
+
+      if (max_tp < station->m_minstrelTable[i].throughput)
+        {
+          index_max_tp = i;
+          max_tp = station->m_minstrelTable[i].throughput;
+        }
+    }
+
+  max_tp = 0;
+  //find the second highest max
+  for (uint8_t i = 0; i < station->m_nModes; i++)
+    {
+      if ((i != index_max_tp) && (max_tp < station->m_minstrelTable[i].throughput))
+        {
+          index_max_tp2 = i;
+          max_tp = station->m_minstrelTable[i].throughput;
+        }
+    }
+
+  uint32_t max_prob = 0;
+  uint8_t index_max_prob = 0;
+  for (uint8_t i = 0; i < station->m_nModes; i++)
+    {
+      if ((station->m_minstrelTable[i].ewmaProb >= 95 * 180) && (station->m_minstrelTable[i].throughput >= station->m_minstrelTable[index_max_prob].throughput))
+        {
+          index_max_prob = i;
+          max_prob = station->m_minstrelTable[i].ewmaProb;
+        }
+      else if (station->m_minstrelTable[i].ewmaProb >= max_prob)
+        {
+          index_max_prob = i;
+          max_prob = station->m_minstrelTable[i].ewmaProb;
+        }
+    }
+
+  station->m_maxTpRate = index_max_tp;
+  station->m_maxTpRate2 = index_max_tp2;
+  station->m_maxProbRate = index_max_prob;
+
+  if (index_max_tp > station->m_txrate)
+    {
+      station->m_txrate = index_max_tp;
+    }
+
+  NS_LOG_DEBUG ("max throughput=" << +index_max_tp << "(" << GetSupported (station, index_max_tp) <<
+                ")\tsecond max throughput=" << +index_max_tp2 << "(" << GetSupported (station, index_max_tp2) <<
+                ")\tmax prob=" << +index_max_prob << "(" << GetSupported (station, index_max_prob) << ")");
+  if (m_printStats)
+    {
+      PrintTable (station);
+    }
+  if (m_printSamples)
+    {
+      PrintSampleTable (station);
+    }
+}
+
+void
+MinstrelWifiManager::DoReportRxOk (WifiRemoteStation *st, double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << st << rxSnr << txMode);
+  NS_LOG_DEBUG ("DoReportRxOk m_txrate=" << static_cast<MinstrelWifiRemoteStation*> (st)->m_txrate);
+}
+
+void
+MinstrelWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
+  NS_LOG_DEBUG ("DoReportRtsFailed m_txrate=" << station->m_txrate);
+  station->m_shortRetry++;
+}
+
+void
+MinstrelWifiManager::DoReportRtsOk (WifiRemoteStation *st, double ctsSnr, WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
+}
+
+void
+MinstrelWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
+  UpdateRetry (station);
+}
+
+void
+MinstrelWifiManager::DoReportDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
+  NS_LOG_DEBUG ("DoReportDataFailed " << station << "\t rate " << station->m_txrate << "\tlongRetry \t" << station->m_longRetry);
+  CheckInit (station);
+  if (!station->m_initialized)
+    {
+      return;
+    }
+
+  UpdateRate (station);
+}
+
+void
+MinstrelWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                     double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
+
+  CheckInit (station);
+  if (!station->m_initialized)
+    {
+      return;
+    }
+
+  NS_LOG_DEBUG ("DoReportDataOk m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (before update).");
+
+  station->m_minstrelTable[station->m_txrate].numRateSuccess++;
+  station->m_minstrelTable[station->m_txrate].numRateAttempt++;
+
+  UpdatePacketCounters (station);
+
+  NS_LOG_DEBUG ("DoReportDataOk m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (after update).");
+
+  UpdateRetry (station);
+  UpdateStats (station);
+
+  if (station->m_nModes >= 1)
+    {
+      station->m_txrate = FindRate (station);
+    }
+  NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate);
+}
+
+void
+MinstrelWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
+
+  CheckInit (station);
+  if (!station->m_initialized)
+    {
+      return;
+    }
+
+  NS_LOG_DEBUG ("DoReportFinalDataFailed m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (before update).");
+
+  UpdatePacketCounters (station);
+
+  UpdateRetry (station);
+  UpdateStats (station);
+
+  NS_LOG_DEBUG ("DoReportFinalDataFailed m_txrate = " << station->m_txrate << ", attempt = " << station->m_minstrelTable[station->m_txrate].numRateAttempt << ", success = " << station->m_minstrelTable[station->m_txrate].numRateSuccess << " (after update).");
+
+  if (station->m_nModes >= 1)
+    {
+      station->m_txrate = FindRate (station);
+    }
+  NS_LOG_DEBUG ("Next rate to use TxRate = " << station->m_txrate);
+}
+
+void
+MinstrelWifiManager::UpdatePacketCounters (MinstrelWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+
+  station->m_totalPacketsCount++;
+  // If it is a sampling frame and the sampleRate was used, increase counter
+  if (station->m_isSampling && (!station->m_sampleDeferred || station->m_longRetry >= station->m_minstrelTable[station->m_maxTpRate].adjustedRetryCount))
+    {
+      station->m_samplePacketsCount++;
+    }
+
+  if (station->m_numSamplesDeferred > 0)
+    {
+      station->m_numSamplesDeferred--;
+    }
+
+  if (station->m_totalPacketsCount == ~0)
+    {
+      station->m_numSamplesDeferred = 0;
+      station->m_samplePacketsCount = 0;
+      station->m_totalPacketsCount = 0;
+    }
+  station->m_isSampling = false;
+  station->m_sampleDeferred = false;
+}
+
+void
+MinstrelWifiManager::UpdateRetry (MinstrelWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_retry = station->m_shortRetry + station->m_longRetry;
+  station->m_shortRetry = 0;
+  station->m_longRetry = 0;
+}
+
+WifiTxVector
+MinstrelWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
+  return GetDataTxVector (station);
+}
+
+WifiTxVector
+MinstrelWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
+  return GetRtsTxVector (station);
+}
+
+bool
+MinstrelWifiManager::DoNeedRetransmission (WifiRemoteStation *st, Ptr<const Packet> packet, bool normally)
+{
+  NS_LOG_FUNCTION (this << st << packet << normally);
+  MinstrelWifiRemoteStation *station = static_cast<MinstrelWifiRemoteStation*> (st);
+
+  CheckInit (station);
+  if (!station->m_initialized)
+    {
+      return normally;
+    }
+  if (station->m_longRetry >= CountRetries (station))
+    {
+      NS_LOG_DEBUG ("No re-transmission allowed. Retries: " <<  station->m_longRetry << " Max retries: " << CountRetries (station));
+      return false;
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Re-transmit. Retries: " <<  station->m_longRetry << " Max retries: " << CountRetries (station));
+      return true;
+    }
+}
+
+uint16_t
+MinstrelWifiManager::GetNextSample (MinstrelWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  uint16_t bitrate;
+  bitrate = station->m_sampleTable[station->m_index][station->m_col];
+  station->m_index++;
+
+  //bookkeeping for m_index and m_col variables
+  NS_ABORT_MSG_IF (station->m_nModes < 2, "Integer overflow detected");
+  if (station->m_index > station->m_nModes - 2)
+    {
+      station->m_index = 0;
+      station->m_col++;
+      if (station->m_col >= m_sampleCol)
+        {
+          station->m_col = 0;
+        }
+    }
+  return bitrate;
+}
+
+void
+MinstrelWifiManager::RateInit (MinstrelWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  for (uint8_t i = 0; i < station->m_nModes; i++)
+    {
+      NS_LOG_DEBUG ("Initializing rate index " << +i << " " << GetSupported (station, i));
+      station->m_minstrelTable[i].numRateAttempt = 0;
+      station->m_minstrelTable[i].numRateSuccess = 0;
+      station->m_minstrelTable[i].prevNumRateSuccess = 0;
+      station->m_minstrelTable[i].prevNumRateAttempt = 0;
+      station->m_minstrelTable[i].successHist = 0;
+      station->m_minstrelTable[i].attemptHist = 0;
+      station->m_minstrelTable[i].numSamplesSkipped = 0;
+      station->m_minstrelTable[i].prob = 0;
+      station->m_minstrelTable[i].ewmaProb = 0;
+      station->m_minstrelTable[i].throughput = 0;
+      station->m_minstrelTable[i].perfectTxTime = GetCalcTxTime (GetSupported (station, i));
+      NS_LOG_DEBUG (" perfectTxTime = " << station->m_minstrelTable[i].perfectTxTime);
+      station->m_minstrelTable[i].retryCount = 1;
+      station->m_minstrelTable[i].adjustedRetryCount = 1;
+      //Emulating minstrel.c::ath_rate_ctl_reset
+      //We only check from 2 to 10 retries. This guarantee that
+      //at least one retry is permitted.
+      Time totalTxTimeWithGivenRetries = Seconds (0.0); //tx_time in minstrel.c
+      NS_LOG_DEBUG (" Calculating the number of retries");
+      for (uint32_t retries = 2; retries < 11; retries++)
+        {
+          NS_LOG_DEBUG ("  Checking " << retries << " retries");
+          totalTxTimeWithGivenRetries = CalculateTimeUnicastPacket (station->m_minstrelTable[i].perfectTxTime, 0, retries);
+          NS_LOG_DEBUG ("   totalTxTimeWithGivenRetries = " << totalTxTimeWithGivenRetries);
+          if (totalTxTimeWithGivenRetries > MilliSeconds (6))
+            {
+              break;
+            }
+          station->m_minstrelTable[i].sampleLimit = -1;
+          station->m_minstrelTable[i].retryCount = retries;
+          station->m_minstrelTable[i].adjustedRetryCount = retries;
+        }
+    }
+  UpdateStats (station);
+}
+
+Time
+MinstrelWifiManager::CalculateTimeUnicastPacket (Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries)
+{
+  NS_LOG_FUNCTION (this << dataTransmissionTime << shortRetries << longRetries);
+  //See rc80211_minstrel.c
+
+  //First transmission (Data + Ack timeout)
+  Time tt = dataTransmissionTime + GetPhy ()->GetSifs () + GetPhy ()->GetAckTxTime ();
+
+  uint32_t cwMax = 1023;
+  uint32_t cw = 31;
+  for (uint32_t retry = 0; retry < longRetries; retry++)
+    {
+      //Add one re-transmission (Data + Ack timeout)
+      tt += dataTransmissionTime + GetPhy ()->GetSifs () + GetPhy ()->GetAckTxTime ();
+
+      //Add average back off (half the current contention window)
+      tt += (cw / 2.0) * GetPhy ()->GetSlot ();
+
+      //Update contention window
+      cw = std::min (cwMax, (cw + 1) * 2);
+    }
+
+  return tt;
+}
+
+void
+MinstrelWifiManager::InitSampleTable (MinstrelWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_col = station->m_index = 0;
+
+  //for off-setting to make rates fall between 0 and nModes
+  uint8_t numSampleRates = station->m_nModes;
+
+  uint16_t newIndex;
+  for (uint8_t col = 0; col < m_sampleCol; col++)
+    {
+      for (uint8_t i = 0; i < numSampleRates; i++ )
+        {
+          /**
+           * The next two lines basically tries to generate a random number
+           * between 0 and the number of available rates
+           */
+          int uv = m_uniformRandomVariable->GetInteger (0, numSampleRates);
+          NS_LOG_DEBUG ("InitSampleTable uv: " << uv);
+          newIndex = (i + uv) % numSampleRates;
+
+          //this loop is used for filling in other uninitialized places
+          while (station->m_sampleTable[newIndex][col] != 0)
+            {
+              newIndex = (newIndex + 1) % station->m_nModes;
+            }
+          station->m_sampleTable[newIndex][col] = i;
+        }
+    }
+}
+
+void
+MinstrelWifiManager::PrintSampleTable (MinstrelWifiRemoteStation *station)
+{
+  uint8_t numSampleRates = station->m_nModes;
+  std::stringstream table;
+  for (uint8_t i = 0; i < numSampleRates; i++)
+    {
+      for (uint8_t j = 0; j < m_sampleCol; j++)
+        {
+          table << station->m_sampleTable[i][j] << "\t";
+        }
+      table << std::endl;
+    }
+  NS_LOG_DEBUG (table.str ());
+}
+
+void
+MinstrelWifiManager::PrintTable (MinstrelWifiRemoteStation *station)
+{
+  if (!station->m_statsFile.is_open ())
+    {
+      std::ostringstream tmp;
+      tmp << "minstrel-stats-" << station->m_state->m_address << ".txt";
+      station->m_statsFile.open (tmp.str ().c_str (), std::ios::out);
+    }
+
+  station->m_statsFile << "best   _______________rate________________    ________statistics________    ________last_______    ______sum-of________\n" <<
+    "rate  [      name       idx airtime max_tp]  [avg(tp) avg(prob) sd(prob)]  [prob.|retry|suc|att]  [#success | #attempts]\n";
+
+  uint16_t maxTpRate = station->m_maxTpRate;
+  uint16_t maxTpRate2 = station->m_maxTpRate2;
+  uint16_t maxProbRate = station->m_maxProbRate;
+
+  for (uint8_t i = 0; i < station->m_nModes; i++)
+    {
+      RateInfo rate = station->m_minstrelTable[i];
+
+      if (i == maxTpRate)
+        {
+          station->m_statsFile << 'A';
+        }
+      else
+        {
+          station->m_statsFile << ' ';
+        }
+      if (i == maxTpRate2)
+        {
+          station->m_statsFile << 'B';
+        }
+      else
+        {
+          station->m_statsFile << ' ';
+        }
+      if (i == maxProbRate)
+        {
+          station->m_statsFile << 'P';
+        }
+      else
+        {
+          station->m_statsFile << ' ';
+        }
+
+      float tmpTh = rate.throughput / 100000.0f;
+      station->m_statsFile << "   " <<
+        std::setw (17) << GetSupported (station, i) << "  " <<
+        std::setw (2) << i << "  " <<
+        std::setw (4) << rate.perfectTxTime.GetMicroSeconds () <<
+        std::setw (8) << "    -----    " <<
+        std::setw (8) << tmpTh << "    " <<
+        std::setw (3) << rate.ewmaProb / 180 <<
+        std::setw (3) << "       ---      " <<
+        std::setw (3) << rate.prob / 180 << "     " <<
+        std::setw (1) << rate.adjustedRetryCount << "   " <<
+        std::setw (3) << rate.prevNumRateSuccess << " " <<
+        std::setw (3) << rate.prevNumRateAttempt << "   " <<
+        std::setw (9) << rate.successHist << "   " <<
+        std::setw (9) << rate.attemptHist << "\n";
+    }
+  station->m_statsFile << "\nTotal packet count:    ideal " << station->m_totalPacketsCount - station->m_samplePacketsCount
+                       << "      lookaround " << station->m_samplePacketsCount << "\n\n";
+
+  station->m_statsFile.flush ();
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/minstrel-wifi-manager.h ns-3.34/src/wifi/model/rate-control/minstrel-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/minstrel-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/minstrel-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,357 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 Duy Nguyen
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Duy Nguyen <duy@soe.ucsc.edu>
+ *          Matías Richart <mrichart@fing.edu.uy>
+ */
+
+#ifndef MINSTREL_WIFI_MANAGER_H
+#define MINSTREL_WIFI_MANAGER_H
+
+#include "ns3/traced-value.h"
+#include "ns3/wifi-remote-station-manager.h"
+#include <fstream>
+#include <map>
+
+namespace ns3 {
+
+class UniformRandomVariable;
+
+/**
+ * A struct to contain all information related to a data rate
+ */
+struct RateInfo
+{
+  /**
+   * Perfect transmission time calculation, or frame calculation
+   * Given a bit rate and a packet length n bytes
+   */
+  Time perfectTxTime;
+
+  uint32_t retryCount;          ///< retry limit
+  uint32_t adjustedRetryCount;  ///< adjust the retry limit for this rate
+  uint32_t numRateAttempt;      ///< how many number of attempts so far
+  uint32_t numRateSuccess;      ///< number of successful packets
+  uint32_t prob;                ///< (# packets success)/(# total packets)
+  /**
+   * EWMA calculation
+   * ewma_prob =[prob *(100 - ewma_level) + (ewma_prob_old * ewma_level)]/100
+   */
+  uint32_t ewmaProb;
+  uint32_t throughput;  ///< throughput of a rate in bps
+
+  uint32_t prevNumRateAttempt;  //!< Number of transmission attempts with previous rate.
+  uint32_t prevNumRateSuccess;  //!< Number of successful frames transmitted with previous rate.
+  uint64_t successHist;         //!< Aggregate of all transmission successes.
+  uint64_t attemptHist;         //!< Aggregate of all transmission attempts.
+
+  uint8_t numSamplesSkipped; //!< number of samples skipped
+  int sampleLimit; //!< sample limit
+};
+
+/**
+ * Data structure for a Minstrel Rate table
+ * A vector of a struct RateInfo
+ */
+typedef std::vector<RateInfo> MinstrelRate;
+/**
+ * Data structure for a Sample Rate table
+ * A vector of a vector uint8_t
+ */
+typedef std::vector<std::vector<uint8_t> > SampleRate;
+
+/**
+ * \brief hold per-remote-station state for Minstrel Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the Minstrel Wifi manager
+ */
+struct MinstrelWifiRemoteStation : public WifiRemoteStation
+{
+  Time m_nextStatsUpdate;  ///< 10 times every second
+
+  /**
+   * To keep track of the current position in the our random sample table
+   * going row by row from 1st column until the 10th column(Minstrel defines 10)
+   * then we wrap back to the row 1 column 1.
+   * note: there are many other ways to do this.
+   */
+  uint8_t m_col;                 ///< column index
+  uint8_t m_index;               ///< vector index
+  uint16_t m_maxTpRate;          ///< the current throughput rate in bps
+  uint16_t m_maxTpRate2;         ///< second highest throughput rate in bps
+  uint16_t m_maxProbRate;        ///< rate with highest probability of success in bps
+  uint8_t m_nModes;              ///< number of modes supported
+  int m_totalPacketsCount;       ///< total number of packets as of now
+  int m_samplePacketsCount;      ///< how many packets we have sample so far
+  int m_numSamplesDeferred;      ///< number samples deferred
+  bool m_isSampling;             ///< a flag to indicate we are currently sampling
+  uint16_t m_sampleRate;         ///< current sample rate in bps
+  bool m_sampleDeferred;         ///< a flag to indicate sample rate is on the second stage
+  uint32_t m_shortRetry;         ///< short retries such as control packets
+  uint32_t m_longRetry;          ///< long retries such as data packets
+  uint32_t m_retry;              ///< total retries short + long
+  uint16_t m_txrate;             ///< current transmit rate in bps
+  bool m_initialized;            ///< for initializing tables
+  MinstrelRate m_minstrelTable;  ///< minstrel table
+  SampleRate m_sampleTable;      ///< sample table
+  std::ofstream m_statsFile;     ///< stats file
+};
+
+
+/**
+ * \brief Implementation of Minstrel Rate Control Algorithm
+ * \ingroup wifi
+ *
+ * Minstrel is a rate control algorithm implemented in MadWifi and Linux.
+ * The basic principle is to probe the environment and adapt the rate
+ * based on statistics collected on the probability of successful
+ * transmission.  The algorithm adapts the rate to the highest rate
+ * that it considers successful, and spends a fraction of its time
+ * doing 'look around' by trying other rates.
+ *
+ * Minstrel is appropriate for non-HT configurations; for HT (i.e. 802.11n
+ * or higher), users should use MinstrelHtWifiManager instead.
+ * Minstrel will error exit if the user tries to configure it with a
+ * Wi-Fi MAC that supports 802.11n or higher.
+ *
+ * Some notes on this implementation follow.  The implementation has
+ * been adapted to bring it closer to the Linux implementation.
+ * For each rate, a new parameter samplesSkipped is added. This parameter
+ * is intended to solve an issue regarding the sampling of low rates when
+ * a high rate is working well, which leads to outdated statistics.
+ * This change makes throughput a bit lower in simple, stable scenarios,
+ * but may help in dynamic scenarios to react faster and more accurately
+ * to changes.
+ *
+ * Related to the previous, the logic for deciding when to sample random
+ * rates is as follows.  When a sample rate is deferred to the second MRR
+ * chain stage, a new parameter (numSamplesDeferred) is increased. This
+ * parameters is used (jointly with sampleCount) to compare current
+ * sample count with the lookaround rate.
+ *
+ * Also related with sampling, another parameter sampleLimit is added.
+ * This parameter limits the number of times a very low or very high
+ * probability rate is sampled, avoiding to try a poorly working sample
+ * rate too often.
+ *
+ * When updating the EWMA probability of a rate for the first time, it does
+ * not apply EWMA but instead assigns the entire probability.
+ * Since the EWMA probability is initialized to zero, this generates
+ * a more accurate EWMA.
+ */
+class MinstrelWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  MinstrelWifiManager ();
+  virtual ~MinstrelWifiManager ();
+
+  void SetupPhy (const Ptr<WifiPhy> phy) override;
+  void SetupMac (const Ptr<WifiMac> mac) override;
+  int64_t AssignStreams (int64_t stream) override;
+
+  /**
+   * Update the rate.
+   *
+   * \param station the station object
+   */
+  void UpdateRate (MinstrelWifiRemoteStation *station);
+
+  /**
+   * Update the Minstrel Table.
+   *
+   * \param station the station object
+   */
+  void UpdateStats (MinstrelWifiRemoteStation *station);
+
+  /**
+   * Find a rate to use from Minstrel Table.
+   *
+   * \param station the station object
+   * \returns the rate in bps
+   */
+  uint16_t FindRate (MinstrelWifiRemoteStation *station);
+
+  /**
+   * Get data transmit vector.
+   *
+   * \param station the station object
+   * \returns WifiTxVector
+   */
+  WifiTxVector GetDataTxVector (MinstrelWifiRemoteStation *station);
+
+  /**
+   * Get RTS transmit vector.
+   *
+   * \param station the station object
+   * \returns WifiTxVector
+   */
+  WifiTxVector GetRtsTxVector (MinstrelWifiRemoteStation *station);
+
+  /**
+   * Get the number of retries.
+   *
+   * \param station the station object
+   * \returns the number of retries
+   */
+  uint32_t CountRetries (MinstrelWifiRemoteStation *station);
+
+  /**
+   * Update packet counters.
+   *
+   * \param station the station object
+   */
+  void UpdatePacketCounters (MinstrelWifiRemoteStation *station);
+
+  /**
+   * Update the number of retries and reset accordingly.
+   *
+   * \param station the station object
+   */
+  void UpdateRetry (MinstrelWifiRemoteStation *station);
+
+  /**
+   * Check for initializations.
+   *
+   * \param station the station object
+   */
+  void CheckInit (MinstrelWifiRemoteStation *station);
+
+  /**
+   * Initialize Sample Table.
+   *
+   * \param station the station object
+   */
+  void InitSampleTable (MinstrelWifiRemoteStation *station);
+
+private:
+  void DoInitialize (void) override;
+  WifiRemoteStation * DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+
+  bool DoNeedRetransmission (WifiRemoteStation *st,
+                                 Ptr<const Packet> packet, bool normally) override;
+
+
+  /**
+   * Estimate the TxTime of a packet with a given mode.
+   *
+   * \param mode Wi-Fi mode
+   * \returns the transmission time
+   */
+  Time GetCalcTxTime (WifiMode mode) const;
+  /**
+   * Add transmission time for the given mode to an internal list.
+   *
+   * \param mode Wi-Fi mode
+   * \param t transmission time
+   */
+  void AddCalcTxTime (WifiMode mode, Time t);
+
+  /**
+   * Initialize Minstrel Table.
+   *
+   * \param station the station object
+   */
+  void RateInit (MinstrelWifiRemoteStation *station);
+
+  /**
+   * Get the next sample from Sample Table.
+   *
+   * \param station the station object
+   * \returns the next sample
+   */
+  uint16_t GetNextSample (MinstrelWifiRemoteStation *station);
+
+  /**
+   * Estimate the time to transmit the given packet with the given number of retries.
+   * This function is "roughly" the function "calc_usecs_unicast_packet" in minstrel.c
+   * in the madwifi implementation.
+   *
+   * The basic idea is that, we try to estimate the "average" time used to transmit the
+   * packet for the given number of retries while also accounting for the 802.11 congestion
+   * window change. The original code in the madwifi seems to estimate the number of backoff
+   * slots as the half of the current CW size.
+   *
+   * There are four main parts:
+   *  - wait for DIFS (sense idle channel)
+   *  - Ack timeouts
+   *  - Data transmission
+   *  - backoffs according to CW
+   *
+   * \param dataTransmissionTime the data transmission time
+   * \param shortRetries short retries
+   * \param longRetries long retries
+   * \returns the unicast packet time
+   */
+  Time CalculateTimeUnicastPacket (Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries);
+
+  /**
+   * Print Sample Table.
+   *
+   * \param station the station object
+   */
+  void PrintSampleTable (MinstrelWifiRemoteStation *station);
+
+  /**
+   * Print Minstrel Table.
+   *
+   * \param station the station object
+   */
+  void PrintTable (MinstrelWifiRemoteStation *station);
+
+  /**
+   * typedef for a vector of a pair of Time, WifiMode.
+   * Essentially a map from WifiMode to its corresponding transmission time
+   * to transmit a reference packet.
+   */
+  typedef std::map<WifiMode, Time> TxTime;
+
+  TxTime m_calcTxTime;      ///< to hold all the calculated TxTime for all modes
+  Time m_updateStats;       ///< how frequent do we calculate the stats
+  uint8_t m_lookAroundRate; ///< the % to try other rates than our current rate
+  uint8_t m_ewmaLevel;      ///< exponential weighted moving average
+  uint8_t m_sampleCol;      ///< number of sample columns
+  uint32_t m_pktLen;        ///< packet length used for calculate mode TxTime
+  bool m_printStats;        ///< whether statistics table should be printed.
+  bool m_printSamples;      ///< whether samples table should be printed.
+
+  /// Provides uniform random variables.
+  Ptr<UniformRandomVariable> m_uniformRandomVariable;
+
+  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
+};
+
+} //namespace ns3
+
+#endif /* MINSTREL_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/onoe-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/onoe-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/onoe-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/onoe-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,367 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2003,2007 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "onoe-wifi-manager.h"
+#include "ns3/wifi-tx-vector.h"
+
+#define Min(a,b) ((a < b) ? a : b)
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("OnoeWifiManager");
+
+/**
+ * \brief hold per-remote-station state for ONOE Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the ONOE Wifi manager
+ */
+struct OnoeWifiRemoteStation : public WifiRemoteStation
+{
+  Time m_nextModeUpdate; ///< next mode update
+  bool m_rateBlocked; ///< whether the rate cannot be changed
+  uint32_t m_shortRetry; ///< short retry
+  uint32_t m_longRetry; ///< long retry
+  uint32_t m_tx_ok; ///< transmit OK
+  uint32_t m_tx_err; ///< transmit error
+  uint32_t m_tx_retr; ///< transmit retry
+  uint32_t m_tx_upper; ///< transmit upper
+  uint8_t m_txrate; ///< transmit rate
+};
+
+NS_OBJECT_ENSURE_REGISTERED (OnoeWifiManager);
+
+TypeId
+OnoeWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::OnoeWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<OnoeWifiManager> ()
+    .AddAttribute ("UpdatePeriod",
+                   "The interval between decisions about rate control changes",
+                   TimeValue (Seconds (1.0)),
+                   MakeTimeAccessor (&OnoeWifiManager::m_updatePeriod),
+                   MakeTimeChecker ())
+    .AddAttribute ("RaiseThreshold", "Attempt to raise the rate if we hit that threshold",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&OnoeWifiManager::m_raiseThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("AddCreditThreshold", "Add credit threshold",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&OnoeWifiManager::m_addCreditThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddTraceSource ("Rate",
+                     "Traced value for rate changes (b/s)",
+                     MakeTraceSourceAccessor (&OnoeWifiManager::m_currentRate),
+                     "ns3::TracedValueCallback::Uint64")
+  ;
+  return tid;
+}
+
+OnoeWifiManager::OnoeWifiManager ()
+  : WifiRemoteStationManager (),
+    m_currentRate (0)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+OnoeWifiManager::~OnoeWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+OnoeWifiManager::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  if (GetHtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
+    }
+  if (GetVhtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
+    }
+  if (GetHeSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
+    }
+}
+
+WifiRemoteStation *
+OnoeWifiManager::DoCreateStation (void) const
+{
+  NS_LOG_FUNCTION (this);
+  OnoeWifiRemoteStation *station = new OnoeWifiRemoteStation ();
+  station->m_nextModeUpdate = Simulator::Now () + m_updatePeriod;
+  station->m_rateBlocked = false;
+  station->m_shortRetry = 0;
+  station->m_longRetry = 0;
+  station->m_tx_ok = 0;
+  station->m_tx_err = 0;
+  station->m_tx_retr = 0;
+  station->m_tx_upper = 0;
+  station->m_txrate = 0;
+  return station;
+}
+
+void
+OnoeWifiManager::DoReportRxOk (WifiRemoteStation *station, double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
+}
+
+void
+OnoeWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
+  station->m_shortRetry++;
+  station->m_rateBlocked = true;  // do not change rate for retransmission
+}
+
+void
+OnoeWifiManager::DoReportDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
+  station->m_longRetry++;
+  station->m_rateBlocked = true;  // do not change rate for retransmission
+}
+
+void
+OnoeWifiManager::DoReportRtsOk (WifiRemoteStation *st, double ctsSnr, WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
+  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
+  station->m_rateBlocked = true;  // do not change rate
+}
+
+void
+OnoeWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                 double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
+  UpdateRetry (station);
+  station->m_tx_ok++;
+  station->m_rateBlocked = false;  // we can change the rate for next packet
+}
+
+void
+OnoeWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
+  UpdateRetry (station);
+  station->m_tx_err++;
+  station->m_rateBlocked = false;  // we can change the rate for next packet
+}
+
+void
+OnoeWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
+  UpdateRetry (station);
+  station->m_tx_err++;
+  station->m_rateBlocked = false;  // we can change the rate for next packet
+}
+
+void
+OnoeWifiManager::UpdateRetry (OnoeWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_tx_retr += station->m_shortRetry + station->m_longRetry;
+  station->m_shortRetry = 0;
+  station->m_longRetry = 0;
+}
+
+void
+OnoeWifiManager::UpdateMode (OnoeWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  if (Simulator::Now () < station->m_nextModeUpdate || station->m_rateBlocked)
+    {
+      return;
+    }
+  station->m_nextModeUpdate = Simulator::Now () + m_updatePeriod;
+  /**
+   * The following 20 lines of code were copied from the Onoe
+   * rate control kernel module used in the madwifi driver.
+   */
+
+  int dir = 0, enough;
+  uint8_t nrate;
+  enough = (station->m_tx_ok + station->m_tx_err >= 10);
+
+  /* no packet reached -> down */
+  if (station->m_tx_err > 0 && station->m_tx_ok == 0)
+    {
+      dir = -1;
+    }
+
+  /* all packets needs retry in average -> down */
+  if (enough && station->m_tx_ok < station->m_tx_retr)
+    {
+      dir = -1;
+    }
+
+  /* no error and less than rate_raise% of packets need retry -> up */
+  if (enough && station->m_tx_err == 0
+      && station->m_tx_retr < (station->m_tx_ok * m_addCreditThreshold) / 100)
+    {
+      dir = 1;
+    }
+
+  NS_LOG_DEBUG (this << " ok " << station->m_tx_ok << " err " << station->m_tx_err << " retr " << station->m_tx_retr <<
+                " upper " << station->m_tx_upper << " dir " << dir);
+
+  nrate = station->m_txrate;
+  switch (dir)
+    {
+    case 0:
+      if (enough && station->m_tx_upper > 0)
+        {
+          station->m_tx_upper--;
+        }
+      break;
+    case -1:
+      if (nrate > 0)
+        {
+          nrate--;
+        }
+      station->m_tx_upper = 0;
+      break;
+    case 1:
+      /* raise rate if we hit rate_raise_threshold */
+      if (++station->m_tx_upper < m_raiseThreshold)
+        {
+          break;
+        }
+      station->m_tx_upper = 0;
+      if (nrate + 1 < GetNSupported (station))
+        {
+          nrate++;
+        }
+      break;
+    }
+
+  if (nrate != station->m_txrate)
+    {
+      NS_ASSERT (nrate < GetNSupported (station));
+      station->m_txrate = nrate;
+      station->m_tx_ok = station->m_tx_err = station->m_tx_retr = station->m_tx_upper = 0;
+    }
+  else if (enough)
+    {
+      station->m_tx_ok = station->m_tx_err = station->m_tx_retr = 0;
+    }
+
+}
+
+WifiTxVector
+OnoeWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
+  UpdateMode (station);
+  NS_ASSERT (station->m_txrate < GetNSupported (station));
+  uint8_t rateIndex;
+  if (station->m_longRetry < 4)
+    {
+      rateIndex = station->m_txrate;
+    }
+  else if (station->m_longRetry < 6)
+    {
+      if (station->m_txrate > 0)
+        {
+          rateIndex = station->m_txrate - 1;
+        }
+      else
+        {
+          rateIndex = station->m_txrate;
+        }
+    }
+  else if (station->m_longRetry < 8)
+    {
+      if (station->m_txrate > 1)
+        {
+          rateIndex = station->m_txrate - 2;
+        }
+      else
+        {
+          rateIndex = station->m_txrate;
+        }
+    }
+  else
+    {
+      if (station->m_txrate > 2)
+        {
+          rateIndex = station->m_txrate - 3;
+        }
+      else
+        {
+          rateIndex = station->m_txrate;
+        }
+    }
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiMode mode = GetSupported (station, rateIndex);
+  if (m_currentRate != mode.GetDataRate (channelWidth))
+    {
+      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
+      m_currentRate = mode.GetDataRate (channelWidth);
+    }
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+}
+
+WifiTxVector
+OnoeWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  OnoeWifiRemoteStation *station = static_cast<OnoeWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  UpdateMode (station);
+  WifiTxVector rtsTxVector;
+  WifiMode mode;
+  if (GetUseNonErpProtection () == false)
+    {
+      mode = GetSupported (station, 0);
+    }
+  else
+    {
+      mode = GetNonErpSupported (station, 0);
+    }
+  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+  return rtsTxVector;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/onoe-wifi-manager.h ns-3.34/src/wifi/model/rate-control/onoe-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/onoe-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/onoe-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,96 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2003,2007 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#ifndef ONOE_WIFI_MANAGER_H
+#define ONOE_WIFI_MANAGER_H
+
+#include "ns3/traced-value.h"
+#include "ns3/wifi-remote-station-manager.h"
+
+namespace ns3 {
+
+struct OnoeWifiRemoteStation;
+
+/**
+ * \brief an implementation of the rate control algorithm developed
+ *        by Atsushi Onoe
+ *
+ * \ingroup wifi
+ *
+ * This algorithm is well known because it has been used as the default
+ * rate control algorithm for the madwifi driver. I am not aware of
+ * any publication or reference about this algorithm beyond the madwifi
+ * source code.
+ *
+ * This RAA does not support HT modes and will error
+ * exit if the user tries to configure this RAA with a Wi-Fi MAC
+ * that supports 802.11n or higher.
+ */
+class OnoeWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  OnoeWifiManager ();
+  virtual ~OnoeWifiManager ();
+
+
+private:
+  void DoInitialize (void) override;
+  WifiRemoteStation * DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+
+  /**
+   * Update the number of retry (both short and long).
+   *
+   * \param station the ONOE wifi remote station
+   */
+  void UpdateRetry (OnoeWifiRemoteStation *station);
+  /**
+   * Update the mode.
+   *
+   * \param station the ONOE wifi remote station
+   */
+  void UpdateMode (OnoeWifiRemoteStation *station);
+
+  Time m_updatePeriod; ///< update period
+  uint32_t m_addCreditThreshold; ///< add credit threshold
+  uint32_t m_raiseThreshold; ///< raise threshold
+
+  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
+};
+
+} //namespace ns3
+
+#endif /* ONOE_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/parf-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/parf-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/parf-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/parf-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,365 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 Universidad de la República - Uruguay
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Matias Richart <mrichart@fing.edu.uy>
+ */
+
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
+#include "ns3/data-rate.h"
+#include "parf-wifi-manager.h"
+#include "ns3/wifi-phy.h"
+
+#define Min(a,b) ((a < b) ? a : b)
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("ParfWifiManager");
+
+/**
+ * Hold per-remote-station state for PARF Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the PARF Wifi manager
+ */
+struct ParfWifiRemoteStation : public WifiRemoteStation
+{
+  uint32_t m_nAttempt;       //!< Number of transmission attempts.
+  uint32_t m_nSuccess;       //!< Number of successful transmission attempts.
+  uint32_t m_nFail;          //!< Number of failed transmission attempts.
+  bool m_usingRecoveryRate;  //!< If using recovery rate.
+  bool m_usingRecoveryPower; //!< If using recovery power.
+  uint32_t m_nRetry;         //!< Number of transmission retries.
+  uint8_t m_prevRateIndex;   //!< Rate index of the previous transmission.
+  uint8_t m_rateIndex;       //!< Current rate index used by the remote station.
+  uint8_t m_prevPowerLevel;  //!< Power level of the previous transmission.
+  uint8_t m_powerLevel;      //!< Current power level used by the remote station.
+  uint8_t m_nSupported;      //!< Number of supported rates by the remote station.
+  bool m_initialized;        //!< For initializing variables.
+};
+
+NS_OBJECT_ENSURE_REGISTERED (ParfWifiManager);
+
+TypeId
+ParfWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::ParfWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<ParfWifiManager> ()
+    .AddAttribute ("AttemptThreshold",
+                   "The minimum number of transmission attempts to try a new power or rate.",
+                   UintegerValue (15),
+                   MakeUintegerAccessor (&ParfWifiManager::m_attemptThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("SuccessThreshold",
+                   "The minimum number of successful transmissions to try a new power or rate.",
+                   UintegerValue (10),
+                   MakeUintegerAccessor (&ParfWifiManager::m_successThreshold),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddTraceSource ("PowerChange",
+                     "The transmission power has change",
+                     MakeTraceSourceAccessor (&ParfWifiManager::m_powerChange),
+                     "ns3::WifiRemoteStationManager::PowerChangeTracedCallback")
+    .AddTraceSource ("RateChange",
+                     "The transmission rate has change",
+                     MakeTraceSourceAccessor (&ParfWifiManager::m_rateChange),
+                     "ns3::WifiRemoteStationManager::RateChangeTracedCallback")
+  ;
+  return tid;
+}
+
+ParfWifiManager::ParfWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+ParfWifiManager::~ParfWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+ParfWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
+{
+  NS_LOG_FUNCTION (this << phy);
+  m_minPower = 0;
+  m_maxPower = phy->GetNTxPower () - 1;
+  WifiRemoteStationManager::SetupPhy (phy);
+}
+
+void
+ParfWifiManager::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  if (GetHtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
+    }
+  if (GetVhtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
+    }
+  if (GetHeSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
+    }
+}
+
+WifiRemoteStation *
+ParfWifiManager::DoCreateStation (void) const
+{
+  NS_LOG_FUNCTION (this);
+  ParfWifiRemoteStation *station = new ParfWifiRemoteStation ();
+
+  station->m_nSuccess = 0;
+  station->m_nFail = 0;
+  station->m_usingRecoveryRate = false;
+  station->m_usingRecoveryPower = false;
+  station->m_initialized = false;
+  station->m_nRetry = 0;
+  station->m_nAttempt = 0;
+
+  NS_LOG_DEBUG ("create station=" << station << ", timer=" << station->m_nAttempt
+                                  << ", rate=" << +station->m_rateIndex << ", power=" << +station->m_powerLevel);
+
+  return station;
+}
+
+void
+ParfWifiManager::CheckInit (ParfWifiRemoteStation *station)
+{
+  if (!station->m_initialized)
+    {
+      station->m_nSupported = GetNSupported (station);
+      station->m_rateIndex = station->m_nSupported - 1;
+      station->m_prevRateIndex = station->m_nSupported - 1;
+      station->m_powerLevel = m_maxPower;
+      station->m_prevPowerLevel = m_maxPower;
+      WifiMode mode = GetSupported (station, station->m_rateIndex);
+      uint16_t channelWidth = GetChannelWidth (station);
+      DataRate rate = DataRate (mode.GetDataRate (channelWidth));
+      double power = GetPhy ()->GetPowerDbm (m_maxPower);
+      m_powerChange (power, power, station->m_state->m_address);
+      m_rateChange (rate, rate, station->m_state->m_address);
+      station->m_initialized = true;
+    }
+}
+
+void
+ParfWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+/*
+ * It is important to realize that "recovery" mode starts after failure of
+ * the first transmission after a rate increase and ends at the first successful
+ * transmission. Specifically, recovery mode spans retransmissions boundaries.
+ * Fundamentally, ARF handles each data transmission independently, whether it
+ * is the initial transmission of a packet or the retransmission of a packet.
+ * The fundamental reason for this is that there is a backoff between each data
+ * transmission, be it an initial transmission or a retransmission.
+ */
+void
+ParfWifiManager::DoReportDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  ParfWifiRemoteStation *station = static_cast<ParfWifiRemoteStation*> (st);
+  CheckInit (station);
+  station->m_nAttempt++;
+  station->m_nFail++;
+  station->m_nRetry++;
+  station->m_nSuccess = 0;
+
+  NS_LOG_DEBUG ("station=" << station << " data fail retry=" << station->m_nRetry << ", timer=" << station->m_nAttempt
+                           << ", rate=" << +station->m_rateIndex << ", power=" << +station->m_powerLevel);
+  if (station->m_usingRecoveryRate)
+    {
+      NS_ASSERT (station->m_nRetry >= 1);
+      if (station->m_nRetry == 1)
+        {
+          //need recovery fallback
+          if (station->m_rateIndex != 0)
+            {
+              NS_LOG_DEBUG ("station=" << station << " dec rate");
+              station->m_rateIndex--;
+              station->m_usingRecoveryRate = false;
+            }
+        }
+      station->m_nAttempt = 0;
+    }
+  else if (station->m_usingRecoveryPower)
+    {
+      NS_ASSERT (station->m_nRetry >= 1);
+      if (station->m_nRetry == 1)
+        {
+          //need recovery fallback
+          if (station->m_powerLevel < m_maxPower)
+            {
+              NS_LOG_DEBUG ("station=" << station << " inc power");
+              station->m_powerLevel++;
+              station->m_usingRecoveryPower = false;
+            }
+        }
+      station->m_nAttempt = 0;
+    }
+  else
+    {
+      NS_ASSERT (station->m_nRetry >= 1);
+      if (((station->m_nRetry - 1) % 2) == 1)
+        {
+          //need normal fallback
+          if (station->m_powerLevel == m_maxPower)
+            {
+              if (station->m_rateIndex != 0)
+                {
+                  NS_LOG_DEBUG ("station=" << station << " dec rate");
+                  station->m_rateIndex--;
+                }
+            }
+          else
+            {
+              NS_LOG_DEBUG ("station=" << station << " inc power");
+              station->m_powerLevel++;
+            }
+        }
+      if (station->m_nRetry >= 2)
+        {
+          station->m_nAttempt = 0;
+        }
+    }
+}
+
+void
+ParfWifiManager::DoReportRxOk (WifiRemoteStation *station,
+                               double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
+}
+
+void ParfWifiManager::DoReportRtsOk (WifiRemoteStation *station,
+                                     double ctsSnr, WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << station << ctsSnr << ctsMode << rtsSnr);
+}
+
+void ParfWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                      double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+  ParfWifiRemoteStation *station = static_cast<ParfWifiRemoteStation*> (st);
+  CheckInit (station);
+  station->m_nAttempt++;
+  station->m_nSuccess++;
+  station->m_nFail = 0;
+  station->m_usingRecoveryRate = false;
+  station->m_usingRecoveryPower = false;
+  station->m_nRetry = 0;
+  NS_LOG_DEBUG ("station=" << station << " data ok success=" << station->m_nSuccess << ", timer=" << station->m_nAttempt << ", rate=" << +station->m_rateIndex << ", power=" << +station->m_powerLevel);
+  if ((station->m_nSuccess == m_successThreshold
+       || station->m_nAttempt == m_attemptThreshold)
+      && (station->m_rateIndex < (station->m_state->m_operationalRateSet.size () - 1)))
+    {
+      NS_LOG_DEBUG ("station=" << station << " inc rate");
+      station->m_rateIndex++;
+      station->m_nAttempt = 0;
+      station->m_nSuccess = 0;
+      station->m_usingRecoveryRate = true;
+    }
+  else if (station->m_nSuccess == m_successThreshold || station->m_nAttempt == m_attemptThreshold)
+    {
+      //we are at the maximum rate, we decrease power
+      if (station->m_powerLevel != m_minPower)
+        {
+          NS_LOG_DEBUG ("station=" << station << " dec power");
+          station->m_powerLevel--;
+        }
+      station->m_nAttempt = 0;
+      station->m_nSuccess = 0;
+      station->m_usingRecoveryPower = true;
+    }
+}
+
+void
+ParfWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+ParfWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+WifiTxVector
+ParfWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  ParfWifiRemoteStation *station = static_cast<ParfWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  CheckInit (station);
+  WifiMode mode = GetSupported (station, station->m_rateIndex);
+  DataRate rate = DataRate (mode.GetDataRate (channelWidth));
+  DataRate prevRate = DataRate (GetSupported (station, station->m_prevRateIndex).GetDataRate (channelWidth));
+  double power = GetPhy ()->GetPowerDbm (station->m_powerLevel);
+  double prevPower = GetPhy ()->GetPowerDbm (station->m_prevPowerLevel);
+  if (station->m_prevPowerLevel != station->m_powerLevel)
+    {
+      m_powerChange (prevPower, power, station->m_state->m_address);
+      station->m_prevPowerLevel = station->m_powerLevel;
+    }
+  if (station->m_prevRateIndex != station->m_rateIndex)
+    {
+      m_rateChange (prevRate, rate, station->m_state->m_address);
+      station->m_prevRateIndex = station->m_rateIndex;
+    }
+  return WifiTxVector (mode, station->m_powerLevel, GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+}
+
+WifiTxVector
+ParfWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  /// \todo we could/should implement the ARF algorithm for
+  /// RTS only by picking a single rate within the BasicRateSet.
+  ParfWifiRemoteStation *station = static_cast<ParfWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiTxVector rtsTxVector;
+  WifiMode mode;
+  if (GetUseNonErpProtection () == false)
+    {
+      mode = GetSupported (station, 0);
+    }
+  else
+    {
+      mode = GetNonErpSupported (station, 0);
+    }
+  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+  return rtsTxVector;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/parf-wifi-manager.h ns-3.34/src/wifi/model/rate-control/parf-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/parf-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/parf-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,106 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 Universidad de la República - Uruguay
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Matias Richart <mrichart@fing.edu.uy>
+ */
+
+#ifndef PARF_WIFI_MANAGER_H
+#define PARF_WIFI_MANAGER_H
+
+#include "ns3/wifi-remote-station-manager.h"
+
+namespace ns3 {
+
+struct ParfWifiRemoteStation;
+/**
+ * \ingroup wifi
+ * PARF Rate control algorithm
+ *
+ * This class implements the PARF algorithm as described in
+ * <i>Self-management in chaotic wireless deployments</i>, by
+ * Akella, A.; Judd, G.; Seshan, S. and Steenkiste, P. in
+ * Wireless Networks, Kluwer Academic Publishers, 2007, 13, 737-755
+ * http://www.cs.odu.edu/~nadeem/classes/cs795-WNS-S13/papers/enter-006.pdf
+ *
+ * This RAA does not support HT modes and will error
+ * exit if the user tries to configure this RAA with a Wi-Fi MAC
+ * that supports 802.11n or higher.
+ */
+class ParfWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * Register this type.
+   * \return The object TypeId.
+   */
+  static TypeId GetTypeId (void);
+  ParfWifiManager ();
+  virtual ~ParfWifiManager ();
+
+  void SetupPhy (const Ptr<WifiPhy> phy) override;
+
+
+private:
+  void DoInitialize (void) override;
+  WifiRemoteStation * DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+
+  /** Check for initializations.
+   *
+   * \param station The remote station.
+   */
+  void CheckInit (ParfWifiRemoteStation *station);
+
+  uint32_t m_attemptThreshold; //!< The minimum number of transmission attempts to try a new power or rate. The 'timer' threshold in the ARF algorithm.
+  uint32_t m_successThreshold; //!< The minimum number of successful transmissions to try a new power or rate.
+
+  /**
+   * Minimal power level.
+   * In contrast to rate, power levels do not depend on the remote station.
+   * The levels depend only on the physical layer of the device.
+   */
+  uint8_t m_minPower;
+
+  /**
+   * Maximal power level.
+   */
+  uint8_t m_maxPower;
+
+  /**
+   * The trace source fired when the transmission power changes.
+   */
+  TracedCallback<double, double, Mac48Address> m_powerChange;
+  /**
+   * The trace source fired when the transmission rate changes.
+   */
+  TracedCallback<DataRate, DataRate, Mac48Address> m_rateChange;
+};
+
+} //namespace ns3
+
+#endif /* PARF_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/rraa-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/rraa-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/rraa-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/rraa-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,473 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2004,2005,2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Federico Maguolo <maguolof@dei.unipd.it>
+ */
+
+#include "ns3/log.h"
+#include "ns3/packet.h"
+#include "ns3/simulator.h"
+#include "rraa-wifi-manager.h"
+#include "ns3/wifi-phy.h"
+#include "ns3/wifi-mac.h"
+
+#define Min(a,b) ((a < b) ? a : b)
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("RraaWifiManager");
+
+/**
+ * \brief hold per-remote-station state for RRAA Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the RRAA Wifi manager
+ */
+struct RraaWifiRemoteStation : public WifiRemoteStation
+{
+  uint32_t m_counter;            //!< Counter for transmission attempts.
+  uint32_t m_nFailed;            //!< Number of failed transmission attempts.
+  uint32_t m_adaptiveRtsWnd;     //!< Window size for the Adaptive RTS mechanism.
+  uint32_t m_rtsCounter;         //!< Counter for RTS transmission attempts.
+  Time m_lastReset;              //!< Time of the last reset.
+  bool m_adaptiveRtsOn;          //!< Check if Adaptive RTS mechanism is on.
+  bool m_lastFrameFail;          //!< Flag if the last frame sent has failed.
+  bool m_initialized;            //!< For initializing variables.
+  uint8_t m_nRate;               //!< Number of supported rates.
+  uint8_t m_rateIndex;           //!< Current rate index.
+
+  RraaThresholdsTable m_thresholds; //!< RRAA thresholds for this station.
+};
+
+NS_OBJECT_ENSURE_REGISTERED (RraaWifiManager);
+
+TypeId
+RraaWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::RraaWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<RraaWifiManager> ()
+    .AddAttribute ("Basic",
+                   "If true the RRAA-BASIC algorithm will be used, otherwise the RRAA will be used",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&RraaWifiManager::m_basic),
+                   MakeBooleanChecker ())
+    .AddAttribute ("Timeout",
+                   "Timeout for the RRAA BASIC loss estimation block",
+                   TimeValue (Seconds (0.05)),
+                   MakeTimeAccessor (&RraaWifiManager::m_timeout),
+                   MakeTimeChecker ())
+    .AddAttribute ("FrameLength",
+                   "The Data frame length (in bytes) used for calculating mode TxTime.",
+                   UintegerValue (1420),
+                   MakeUintegerAccessor (&RraaWifiManager::m_frameLength),
+                   MakeUintegerChecker <uint32_t> ())
+    .AddAttribute ("AckFrameLength",
+                   "The Ack frame length (in bytes) used for calculating mode TxTime.",
+                   UintegerValue (14),
+                   MakeUintegerAccessor (&RraaWifiManager::m_ackLength),
+                   MakeUintegerChecker <uint32_t> ())
+    .AddAttribute ("Alpha",
+                   "Constant for calculating the MTL threshold.",
+                   DoubleValue (1.25),
+                   MakeDoubleAccessor (&RraaWifiManager::m_alpha),
+                   MakeDoubleChecker<double> (1))
+    .AddAttribute ("Beta",
+                   "Constant for calculating the ORI threshold.",
+                   DoubleValue (2),
+                   MakeDoubleAccessor (&RraaWifiManager::m_beta),
+                   MakeDoubleChecker<double> (1))
+    .AddAttribute ("Tau",
+                   "Constant for calculating the EWND size.",
+                   DoubleValue (0.012),
+                   MakeDoubleAccessor (&RraaWifiManager::m_tau),
+                   MakeDoubleChecker<double> (0))
+    .AddTraceSource ("Rate",
+                     "Traced value for rate changes (b/s)",
+                     MakeTraceSourceAccessor (&RraaWifiManager::m_currentRate),
+                     "ns3::TracedValueCallback::Uint64")
+  ;
+  return tid;
+}
+
+RraaWifiManager::RraaWifiManager ()
+  : WifiRemoteStationManager (),
+    m_currentRate (0)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+RraaWifiManager::~RraaWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+RraaWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
+{
+  NS_LOG_FUNCTION (this << phy);
+  m_sifs = phy->GetSifs ();
+  m_difs = m_sifs + 2 * phy->GetSlot ();
+  for (const auto & mode : phy->GetModeList ())
+    {
+      WifiTxVector txVector;
+      txVector.SetMode (mode);
+      txVector.SetPreambleType (WIFI_PREAMBLE_LONG);
+      /* Calculate the TX Time of the Data and the corresponding Ack */
+      Time dataTxTime = phy->CalculateTxDuration (m_frameLength, txVector, phy->GetPhyBand ());
+      Time ackTxTime = phy->CalculateTxDuration (m_ackLength, txVector, phy->GetPhyBand ());
+      NS_LOG_DEBUG ("Calculating TX times: Mode= " << mode << " DataTxTime= " << dataTxTime << " AckTxTime= " << ackTxTime);
+      AddCalcTxTime (mode, dataTxTime + ackTxTime);
+    }
+  WifiRemoteStationManager::SetupPhy (phy);
+}
+
+void
+RraaWifiManager::SetupMac (const Ptr<WifiMac> mac)
+{
+  NS_LOG_FUNCTION (this);
+  WifiRemoteStationManager::SetupMac (mac);
+}
+
+void
+RraaWifiManager::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  if (GetHtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
+    }
+  if (GetVhtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
+    }
+  if (GetHeSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
+    }
+}
+
+Time
+RraaWifiManager::GetCalcTxTime (WifiMode mode) const
+{
+  NS_LOG_FUNCTION (this << mode);
+  for (TxTime::const_iterator i = m_calcTxTime.begin (); i != m_calcTxTime.end (); i++)
+    {
+      if (mode == i->second)
+        {
+          return i->first;
+        }
+    }
+  NS_ASSERT (false);
+  return Seconds (0);
+}
+
+void
+RraaWifiManager::AddCalcTxTime (WifiMode mode, Time t)
+{
+  NS_LOG_FUNCTION (this << mode << t);
+  m_calcTxTime.push_back (std::make_pair (t, mode));
+}
+
+WifiRraaThresholds
+RraaWifiManager::GetThresholds (RraaWifiRemoteStation *station, WifiMode mode) const
+{
+  NS_LOG_FUNCTION (this << station << mode);
+  struct WifiRraaThresholds threshold;
+  for (RraaThresholdsTable::const_iterator i = station->m_thresholds.begin (); i != station->m_thresholds.end (); i++)
+    {
+      if (mode == i->second)
+        {
+          return i->first;
+        }
+    }
+  NS_ABORT_MSG ("No thresholds for mode " << mode << " found");
+  return threshold; // Silence compiler warning
+}
+
+WifiRemoteStation *
+RraaWifiManager::DoCreateStation (void) const
+{
+  RraaWifiRemoteStation *station = new RraaWifiRemoteStation ();
+  station->m_initialized = false;
+  station->m_adaptiveRtsWnd = 0;
+  station->m_rtsCounter = 0;
+  station->m_adaptiveRtsOn = false;
+  station->m_lastFrameFail = false;
+  return station;
+}
+
+void
+RraaWifiManager::CheckInit (RraaWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  if (!station->m_initialized)
+    {
+      //Note: we appear to be doing late initialization of the table
+      //to make sure that the set of supported rates has been initialized
+      //before we perform our own initialization.
+      station->m_nRate = GetNSupported (station);
+      //Initialize at maximal rate
+      station->m_rateIndex = GetMaxRate (station);
+
+      station->m_initialized = true;
+
+      station->m_thresholds = RraaThresholdsTable (station->m_nRate);
+      InitThresholds (station);
+      ResetCountersBasic (station);
+    }
+}
+
+void
+RraaWifiManager::InitThresholds (RraaWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  NS_LOG_DEBUG ("InitThresholds = " << station);
+
+  double nextCritical = 0;
+  double nextMtl = 0;
+  double mtl = 0;
+  double ori = 0;
+  for (uint8_t i = 0; i < station->m_nRate; i++)
+    {
+      WifiMode mode = GetSupported (station, i);
+      Time totalTxTime = GetCalcTxTime (mode) + m_sifs + m_difs;
+      if (i == GetMaxRate (station))
+        {
+          ori = 0;
+        }
+      else
+        {
+          WifiMode nextMode = GetSupported (station, i + 1);
+          Time nextTotalTxTime = GetCalcTxTime (nextMode) + m_sifs + m_difs;
+          nextCritical = 1 - (nextTotalTxTime.GetSeconds () / totalTxTime.GetSeconds ());
+          nextMtl = m_alpha * nextCritical;
+          ori = nextMtl / m_beta;
+        }
+      if (i == 0)
+        {
+          mtl = 1;
+        }
+      WifiRraaThresholds th;
+      th.m_ewnd = static_cast<uint32_t> (ceil (m_tau / totalTxTime.GetSeconds ()));
+      th.m_ori = ori;
+      th.m_mtl = mtl;
+      station->m_thresholds.push_back (std::make_pair (th, mode));
+      mtl = nextMtl;
+      NS_LOG_DEBUG (mode << " " << th.m_ewnd << " " << th.m_mtl << " " << th.m_ori);
+    }
+}
+
+void
+RraaWifiManager::ResetCountersBasic (RraaWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_nFailed = 0;
+  station->m_counter = GetThresholds (station, station->m_rateIndex).m_ewnd;
+  station->m_lastReset = Simulator::Now ();
+}
+
+uint8_t
+RraaWifiManager::GetMaxRate (RraaWifiRemoteStation *station) const
+{
+  return station->m_nRate - 1;
+}
+
+void
+RraaWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+}
+
+void
+RraaWifiManager::DoReportDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  RraaWifiRemoteStation *station = static_cast<RraaWifiRemoteStation*> (st);
+  station->m_lastFrameFail = true;
+  CheckTimeout (station);
+  station->m_counter--;
+  station->m_nFailed++;
+  RunBasicAlgorithm (station);
+}
+
+void
+RraaWifiManager::DoReportRxOk (WifiRemoteStation *st,
+                               double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << st << rxSnr << txMode);
+}
+
+void
+RraaWifiManager::DoReportRtsOk (WifiRemoteStation *st,
+                                double ctsSnr, WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
+}
+
+void
+RraaWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                 double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+  RraaWifiRemoteStation *station = static_cast<RraaWifiRemoteStation*> (st);
+  station->m_lastFrameFail = false;
+  CheckTimeout (station);
+  station->m_counter--;
+  RunBasicAlgorithm (station);
+}
+
+void
+RraaWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+}
+
+void
+RraaWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+}
+
+WifiTxVector
+RraaWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  RraaWifiRemoteStation *station = static_cast<RraaWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  CheckInit (station);
+  WifiMode mode = GetSupported (station, station->m_rateIndex);
+  if (m_currentRate != mode.GetDataRate (channelWidth))
+    {
+      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
+      m_currentRate = mode.GetDataRate (channelWidth);
+    }
+  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+}
+
+WifiTxVector
+RraaWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  RraaWifiRemoteStation *station = static_cast<RraaWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiTxVector rtsTxVector;
+  WifiMode mode;
+  if (GetUseNonErpProtection () == false)
+    {
+      mode = GetSupported (station, 0);
+    }
+  else
+    {
+      mode = GetNonErpSupported (station, 0);
+    }
+  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+  return rtsTxVector;
+}
+
+bool
+RraaWifiManager::DoNeedRts (WifiRemoteStation *st,
+                            uint32_t size, bool normally)
+{
+  NS_LOG_FUNCTION (this << st << size << normally);
+  RraaWifiRemoteStation *station = static_cast<RraaWifiRemoteStation*> (st);
+  CheckInit (station);
+  if (m_basic)
+    {
+      return normally;
+    }
+  ARts (station);
+  return station->m_adaptiveRtsOn;
+}
+
+void
+RraaWifiManager::CheckTimeout (RraaWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  Time d = Simulator::Now () - station->m_lastReset;
+  if (station->m_counter == 0 || d > m_timeout)
+    {
+      ResetCountersBasic (station);
+    }
+}
+
+void
+RraaWifiManager::RunBasicAlgorithm (RraaWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  WifiRraaThresholds thresholds = GetThresholds (station, station->m_rateIndex);
+  double ploss = (station->m_nFailed / thresholds.m_ewnd);
+  if (station->m_counter == 0
+      || ploss > thresholds.m_mtl)
+    {
+      if (ploss > thresholds.m_mtl)
+        {
+          station->m_rateIndex--;
+        }
+      else if (station->m_rateIndex < GetMaxRate (station)
+               && ploss < thresholds.m_ori)
+        {
+          station->m_rateIndex++;
+        }
+      ResetCountersBasic (station);
+    }
+}
+
+void
+RraaWifiManager::ARts (RraaWifiRemoteStation *station)
+{
+  if (!station->m_adaptiveRtsOn
+      && station->m_lastFrameFail)
+    {
+      station->m_adaptiveRtsWnd++;
+      station->m_rtsCounter = station->m_adaptiveRtsWnd;
+    }
+  else if ((station->m_adaptiveRtsOn && station->m_lastFrameFail)
+           || (!station->m_adaptiveRtsOn && !station->m_lastFrameFail))
+    {
+      station->m_adaptiveRtsWnd = station->m_adaptiveRtsWnd / 2;
+      station->m_rtsCounter = station->m_adaptiveRtsWnd;
+    }
+  if (station->m_rtsCounter > 0)
+    {
+      station->m_adaptiveRtsOn = true;
+      station->m_rtsCounter--;
+    }
+  else
+    {
+      station->m_adaptiveRtsOn = false;
+    }
+}
+
+WifiRraaThresholds
+RraaWifiManager::GetThresholds (RraaWifiRemoteStation *station, uint8_t index) const
+{
+  NS_LOG_FUNCTION (this << station << +index);
+  WifiMode mode = GetSupported (station, index);
+  return GetThresholds (station, mode);
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/rraa-wifi-manager.h ns-3.34/src/wifi/model/rate-control/rraa-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/rraa-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/rraa-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,195 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Federico Maguolo <maguolof@dei.unipd.it>
+ */
+
+#ifndef RRAA_WIFI_MANAGER_H
+#define RRAA_WIFI_MANAGER_H
+
+#include "ns3/nstime.h"
+#include "ns3/traced-value.h"
+#include "ns3/wifi-remote-station-manager.h"
+
+namespace ns3 {
+
+struct RraaWifiRemoteStation;
+
+/// WifiRraaThresholds structure
+struct WifiRraaThresholds
+  {
+    double m_ori; ///< Opportunistic Rate Increase threshold
+    double m_mtl; ///< Maximum Tolerable Loss threshold
+    uint32_t m_ewnd; ///< Evaluation Window
+  };
+
+/**
+ * List of thresholds for each mode.
+ */
+typedef std::vector<std::pair<WifiRraaThresholds, WifiMode> > RraaThresholdsTable;
+
+/**
+ * \brief Robust Rate Adaptation Algorithm
+ * \ingroup wifi
+ *
+ * This is an implementation of RRAA as described in
+ * "Robust rate adaptation for 802.11 wireless networks"
+ * by "Starsky H. Y. Wong", "Hao Yang", "Songwu Lu", and,
+ * "Vaduvur Bharghavan" published in Mobicom 06.
+ *
+ * This RAA does not support HT modes and will error
+ * exit if the user tries to configure this RAA with a Wi-Fi MAC
+ * that supports 802.11n or higher.
+ */
+class RraaWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  RraaWifiManager ();
+  virtual ~RraaWifiManager ();
+
+  void SetupPhy (const Ptr<WifiPhy> phy) override;
+  void SetupMac (const Ptr<WifiMac> mac) override;
+
+
+private:
+  void DoInitialize (void) override;
+  WifiRemoteStation * DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+  bool DoNeedRts (WifiRemoteStation *st,
+                  uint32_t size, bool normally) override;
+
+  /**
+   * Check for initializations.
+   * \param station The remote station.
+   */
+  void CheckInit (RraaWifiRemoteStation *station);
+  /**
+   * Return the index for the maximum transmission rate for
+   * the given station.
+   *
+   * \param station the remote station
+   *
+   * \return the index for the maximum transmission rate
+   */
+  uint8_t GetMaxRate (RraaWifiRemoteStation *station) const;
+  /**
+   * Check if the counter should be reset.
+   *
+   * \param station the remote station
+   */
+  void CheckTimeout (RraaWifiRemoteStation *station);
+  /**
+   * Find an appropriate rate for the given station, using
+   * a basic algorithm.
+   *
+   * \param station the remote station
+   */
+  void RunBasicAlgorithm (RraaWifiRemoteStation *station);
+  /**
+   * Activate the use of RTS for the given station if the conditions are met.
+   *
+   * \param station the remote station
+   */
+  void ARts (RraaWifiRemoteStation *station);
+  /**
+   * Reset the counters of the given station.
+   *
+   * \param station the remote station
+   */
+  void ResetCountersBasic (RraaWifiRemoteStation *station);
+  /**
+   * Initialize the thresholds internal list for the given station.
+   *
+   * \param station the remote station
+   */
+  void InitThresholds (RraaWifiRemoteStation *station);
+  /**
+   * Get the thresholds for the given station and mode.
+   *
+   * \param station the remote station
+   * \param mode the WifiMode
+   *
+   * \return the RRAA thresholds
+   */
+  WifiRraaThresholds GetThresholds (RraaWifiRemoteStation *station, WifiMode mode) const;
+  /**
+   * Get the thresholds for the given station and mode index.
+   *
+   * \param station the remote station
+   * \param index the mode index in the supported rates
+   *
+   * \return the RRAA thresholds
+   */
+  WifiRraaThresholds GetThresholds (RraaWifiRemoteStation *station, uint8_t index) const;
+  /**
+   * Get the estimated TxTime of a packet with a given mode.
+   *
+   * \param mode the WifiMode
+   *
+   * \return the estimated TX time
+   */
+  Time GetCalcTxTime (WifiMode mode) const;
+  /**
+   * Add transmission time for the given mode to an internal list.
+   *
+   * \param mode the WifiMode
+   * \param t transmission time
+   */
+  void AddCalcTxTime (WifiMode mode, Time t);
+  /**
+   * typedef for a vector of a pair of Time, WifiMode.
+   * Essentially a list for WifiMode and its corresponding transmission time
+   * to transmit a reference packet.
+   */
+  typedef std::vector<std::pair<Time,WifiMode> > TxTime;
+
+  TxTime m_calcTxTime;     //!< To hold all the calculated TxTime for all modes.
+  Time m_sifs;             //!< Value of SIFS configured in the device.
+  Time m_difs;             //!< Value of DIFS configured in the device.
+
+  uint32_t m_frameLength;  //!< Data frame length used for calculate mode TxTime.
+  uint32_t m_ackLength;    //!< Ack frame length used for calculate mode TxTime.
+
+  bool m_basic;    ///< basic
+  Time m_timeout;  ///< timeout
+  double m_alpha;  //!< Alpha value for RRAA (value for calculating MTL threshold)
+  double m_beta;   //!< Beta value for RRAA (value for calculating ORI threshold).
+  double m_tau;    //!< Tau value for RRAA (value for calculating EWND size).
+
+  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
+};
+
+} //namespace ns3
+
+#endif /* RRAA_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/rrpaa-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/rrpaa-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/rrpaa-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/rrpaa-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,611 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2017 Universidad de la República - Uruguay
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Matías Richart <mrichart@fing.edu.uy>
+ */
+
+#include "ns3/packet.h"
+#include "ns3/log.h"
+#include "ns3/boolean.h"
+#include "ns3/double.h"
+#include "ns3/uinteger.h"
+#include "ns3/simulator.h"
+#include "ns3/data-rate.h"
+#include "rrpaa-wifi-manager.h"
+#include "ns3/wifi-phy.h"
+#include "ns3/wifi-mac.h"
+
+NS_LOG_COMPONENT_DEFINE ("RrpaaWifiManager");
+
+namespace ns3 {
+
+/**
+ * Hold per-remote-station state for RRPAA Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the APARF Wifi manager
+ */
+struct RrpaaWifiRemoteStation : public WifiRemoteStation
+{
+  uint32_t m_counter;            //!< Counter for transmission attempts.
+  uint32_t m_nFailed;            //!< Number of failed transmission attempts.
+  uint32_t m_adaptiveRtsWnd;     //!< Window size for the Adaptive RTS mechanism.
+  uint32_t m_rtsCounter;         //!< Counter for RTS transmission attempts.
+  Time m_lastReset;              //!< Time of the last reset.
+  bool m_adaptiveRtsOn;          //!< Check if Adaptive RTS mechanism is on.
+  bool m_lastFrameFail;          //!< Flag if the last frame sent has failed.
+  bool m_initialized;            //!< For initializing variables.
+  uint8_t m_nRate;               //!< Number of supported rates.
+  uint8_t m_prevRateIndex;       //!< Rate index of the previous transmission.
+  uint8_t m_rateIndex;           //!< Current rate index.
+  uint8_t m_prevPowerLevel;      //!< Power level of the previous transmission.
+  uint8_t m_powerLevel;          //!< Current power level.
+  RrpaaThresholdsTable m_thresholds;  //!< RRPAA thresholds for this station.
+  RrpaaProbabilitiesTable m_pdTable;  //!< Probability table for power and rate changes.
+};
+
+NS_OBJECT_ENSURE_REGISTERED (RrpaaWifiManager);
+
+TypeId
+RrpaaWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::RrpaaWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<RrpaaWifiManager> ()
+    .AddAttribute ("Basic",
+                   "If true the RRPAA-BASIC algorithm will be used, otherwise the RRPAA will be used.",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&RrpaaWifiManager::m_basic),
+                   MakeBooleanChecker ())
+    .AddAttribute ("Timeout",
+                   "Timeout for the RRPAA-BASIC loss estimation block.",
+                   TimeValue (MilliSeconds (500)),
+                   MakeTimeAccessor (&RrpaaWifiManager::m_timeout),
+                   MakeTimeChecker ())
+    .AddAttribute ("FrameLength",
+                   "The Data frame length (in bytes) used for calculating mode TxTime.",
+                   UintegerValue (1420),
+                   MakeUintegerAccessor (&RrpaaWifiManager::m_frameLength),
+                   MakeUintegerChecker <uint32_t> ())
+    .AddAttribute ("AckFrameLength",
+                   "The Ack frame length (in bytes) used for calculating mode TxTime.",
+                   UintegerValue (14),
+                   MakeUintegerAccessor (&RrpaaWifiManager::m_ackLength),
+                   MakeUintegerChecker <uint32_t> ())
+    .AddAttribute ("Alpha",
+                   "Constant for calculating the MTL threshold.",
+                   DoubleValue (1.25),
+                   MakeDoubleAccessor (&RrpaaWifiManager::m_alpha),
+                   MakeDoubleChecker<double> (1))
+    .AddAttribute ("Beta",
+                   "Constant for calculating the ORI threshold.",
+                   DoubleValue (2),
+                   MakeDoubleAccessor (&RrpaaWifiManager::m_beta),
+                   MakeDoubleChecker<double> (1))
+    .AddAttribute ("Tau",
+                   "Constant for calculating the EWND size.",
+                   DoubleValue (0.015),
+                   MakeDoubleAccessor (&RrpaaWifiManager::m_tau),
+                   MakeDoubleChecker<double> (0))
+    .AddAttribute ("Gamma",
+                   "Constant for Probabilistic Decision Table decrements.",
+                   DoubleValue (2),
+                   MakeDoubleAccessor (&RrpaaWifiManager::m_gamma),
+                   MakeDoubleChecker<double> (1))
+    .AddAttribute ("Delta",
+                   "Constant for Probabilistic Decision Table increments.",
+                   DoubleValue (1.0905),
+                   MakeDoubleAccessor (&RrpaaWifiManager::m_delta),
+                   MakeDoubleChecker<double> (1))
+    .AddTraceSource ("RateChange",
+                     "The transmission rate has change.",
+                     MakeTraceSourceAccessor (&RrpaaWifiManager::m_rateChange),
+                     "ns3::WifiRemoteStationManager::RateChangeTracedCallback")
+    .AddTraceSource ("PowerChange",
+                     "The transmission power has change.",
+                     MakeTraceSourceAccessor (&RrpaaWifiManager::m_powerChange),
+                     "ns3::WifiRemoteStationManager::PowerChangeTracedCallback")
+  ;
+  return tid;
+}
+
+
+RrpaaWifiManager::RrpaaWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+  m_uniformRandomVariable = CreateObject<UniformRandomVariable> ();
+}
+
+RrpaaWifiManager::~RrpaaWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+int64_t
+RrpaaWifiManager::AssignStreams (int64_t stream)
+{
+  NS_LOG_FUNCTION (this << stream);
+  m_uniformRandomVariable->SetStream (stream);
+  return 1;
+}
+
+void
+RrpaaWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
+{
+  NS_LOG_FUNCTION (this << phy);
+  m_sifs = phy->GetSifs ();
+  m_difs = m_sifs + 2 * phy->GetSlot ();
+  m_nPowerLevels = phy->GetNTxPower ();
+  m_maxPowerLevel = m_nPowerLevels  - 1;
+  m_minPowerLevel = 0;
+  for (const auto & mode : phy->GetModeList ())
+    {
+      WifiTxVector txVector;
+      txVector.SetMode (mode);
+      txVector.SetPreambleType (WIFI_PREAMBLE_LONG);
+      /* Calculate the TX Time of the Data and the corresponding Ack */
+      Time dataTxTime = phy->CalculateTxDuration (m_frameLength, txVector, phy->GetPhyBand ());
+      Time ackTxTime = phy->CalculateTxDuration (m_ackLength, txVector, phy->GetPhyBand ());
+      NS_LOG_DEBUG ("Calculating TX times: Mode= " << mode << " DataTxTime= " << dataTxTime << " AckTxTime= " << ackTxTime);
+      AddCalcTxTime (mode, dataTxTime + ackTxTime);
+    }
+  WifiRemoteStationManager::SetupPhy (phy);
+}
+
+void
+RrpaaWifiManager::SetupMac (const Ptr<WifiMac> mac)
+{
+  NS_LOG_FUNCTION (this << mac);
+  WifiRemoteStationManager::SetupMac (mac);
+}
+
+void
+RrpaaWifiManager::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  if (GetHtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
+    }
+  if (GetVhtSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
+    }
+  if (GetHeSupported ())
+    {
+      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
+    }
+}
+
+Time
+RrpaaWifiManager::GetCalcTxTime (WifiMode mode) const
+{
+  NS_LOG_FUNCTION (this << mode);
+  for (TxTime::const_iterator i = m_calcTxTime.begin (); i != m_calcTxTime.end (); i++)
+    {
+      if (mode == i->second)
+        {
+          return i->first;
+        }
+    }
+  NS_ASSERT (false);
+  return Seconds (0);
+}
+
+void
+RrpaaWifiManager::AddCalcTxTime (WifiMode mode, Time t)
+{
+  NS_LOG_FUNCTION (this << mode << t);
+  m_calcTxTime.push_back (std::make_pair (t, mode));
+}
+
+WifiRrpaaThresholds
+RrpaaWifiManager::GetThresholds (RrpaaWifiRemoteStation *station, WifiMode mode) const
+{
+  NS_LOG_FUNCTION (this << station << mode);
+  struct WifiRrpaaThresholds threshold;
+  for (RrpaaThresholdsTable::const_iterator i = station->m_thresholds.begin (); i != station->m_thresholds.end (); i++)
+    {
+      if (mode == i->second)
+        {
+          return i->first;
+        }
+    }
+  NS_ABORT_MSG ("No thresholds for mode " << mode << " found");
+  return threshold; // Silence compiler warning
+}
+
+WifiRemoteStation *
+RrpaaWifiManager::DoCreateStation (void) const
+{
+  NS_LOG_FUNCTION (this);
+  RrpaaWifiRemoteStation *station = new RrpaaWifiRemoteStation ();
+  station->m_adaptiveRtsWnd = 0;
+  station->m_rtsCounter = 0;
+  station->m_adaptiveRtsOn = false;
+  station->m_lastFrameFail = false;
+  station->m_initialized = false;
+  return station;
+}
+
+void
+RrpaaWifiManager::CheckInit (RrpaaWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  if (!station->m_initialized)
+    {
+      //Note: we appear to be doing late initialization of the table
+      //to make sure that the set of supported rates has been initialized
+      //before we perform our own initialization.
+      station->m_nRate = GetNSupported (station);
+      //Initialize at minimal rate and maximal power.
+      station->m_prevRateIndex = 0;
+      station->m_rateIndex = 0;
+      station->m_prevPowerLevel = m_maxPowerLevel;
+      station->m_powerLevel = m_maxPowerLevel;
+      WifiMode mode = GetSupported (station, 0);
+      uint16_t channelWidth = GetChannelWidth (station);
+      DataRate rate = DataRate (mode.GetDataRate (channelWidth));
+      double power = GetPhy ()->GetPowerDbm (station->m_powerLevel);
+      m_rateChange (rate, rate, station->m_state->m_address);
+      m_powerChange (power, power, station->m_state->m_address);
+
+      station->m_pdTable = RrpaaProbabilitiesTable (station->m_nRate, std::vector<double> (m_nPowerLevels));
+      NS_LOG_DEBUG ("Initializing pdTable");
+      for (uint8_t i = 0; i < station->m_nRate; i++)
+        {
+          for (uint8_t j = 0; j < m_nPowerLevels; j++)
+            {
+              station->m_pdTable[i][j] = 1;
+            }
+        }
+
+      station->m_initialized = true;
+
+      station->m_thresholds = RrpaaThresholdsTable (station->m_nRate);
+      InitThresholds (station);
+      ResetCountersBasic (station);
+    }
+}
+
+void
+RrpaaWifiManager::InitThresholds (RrpaaWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  double nextCritical = 0;
+  double nextMtl = 0;
+  double mtl = 0;
+  double ori = 0;
+  for (uint8_t i = 0; i < station->m_nRate; i++)
+    {
+      WifiMode mode = GetSupported (station, i);
+      Time totalTxTime = GetCalcTxTime (mode) + m_sifs + m_difs;
+      if (i == station->m_nRate - 1)
+        {
+          ori = 0;
+        }
+      else
+        {
+          WifiMode nextMode = GetSupported (station, i + 1);
+          Time nextTotalTxTime = GetCalcTxTime (nextMode) + m_sifs + m_difs;
+          nextCritical = 1 - (nextTotalTxTime.GetSeconds () / totalTxTime.GetSeconds ());
+          nextMtl = m_alpha * nextCritical;
+          ori = nextMtl / m_beta;
+        }
+      if (i == 0)
+        {
+          mtl = nextMtl;
+        }
+      WifiRrpaaThresholds th;
+      th.m_ewnd = static_cast<uint32_t> (ceil (m_tau / totalTxTime.GetSeconds ()));
+      th.m_ori = ori;
+      th.m_mtl = mtl;
+      station->m_thresholds.push_back (std::make_pair (th, mode));
+      mtl = nextMtl;
+      NS_LOG_DEBUG (mode << " " << th.m_ewnd << " " << th.m_mtl << " " << th.m_ori);
+    }
+}
+
+void
+RrpaaWifiManager::ResetCountersBasic (RrpaaWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  station->m_nFailed = 0;
+  station->m_counter = GetThresholds (station, station->m_rateIndex).m_ewnd;
+  station->m_lastReset = Simulator::Now ();
+}
+
+void
+RrpaaWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+}
+
+void
+RrpaaWifiManager::DoReportDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  RrpaaWifiRemoteStation *station = static_cast<RrpaaWifiRemoteStation*> (st);
+  CheckInit (station);
+  station->m_lastFrameFail = true;
+  CheckTimeout (station);
+  station->m_counter--;
+  station->m_nFailed++;
+  RunBasicAlgorithm (station);
+}
+
+void
+RrpaaWifiManager::DoReportRxOk (WifiRemoteStation *st,
+                                double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << st << rxSnr << txMode);
+}
+
+void
+RrpaaWifiManager::DoReportRtsOk (WifiRemoteStation *st,
+                                 double ctsSnr, WifiMode ctsMode, double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
+}
+
+void
+RrpaaWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                  double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
+  RrpaaWifiRemoteStation *station = static_cast<RrpaaWifiRemoteStation*> (st);
+  CheckInit (station);
+  station->m_lastFrameFail = false;
+  CheckTimeout (station);
+  station->m_counter--;
+  RunBasicAlgorithm (station);
+}
+void
+RrpaaWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+}
+void
+RrpaaWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+}
+
+WifiTxVector
+RrpaaWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  RrpaaWifiRemoteStation *station = static_cast<RrpaaWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  CheckInit (station);
+  WifiMode mode = GetSupported (station, station->m_rateIndex);
+  DataRate rate = DataRate (mode.GetDataRate (channelWidth));
+  DataRate prevRate = DataRate (GetSupported (station, station->m_prevRateIndex).GetDataRate (channelWidth));
+  double power = GetPhy ()->GetPowerDbm (station->m_powerLevel);
+  double prevPower = GetPhy ()->GetPowerDbm (station->m_prevPowerLevel);
+  if (station->m_prevRateIndex != station->m_rateIndex)
+    {
+      m_rateChange (prevRate, rate, station->m_state->m_address);
+      station->m_prevRateIndex = station->m_rateIndex;
+    }
+  if (station->m_prevPowerLevel != station->m_powerLevel)
+    {
+      m_powerChange (prevPower, power, station->m_state->m_address);
+      station->m_prevPowerLevel = station->m_powerLevel;
+    }
+  return WifiTxVector (mode, station->m_powerLevel, GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+}
+WifiTxVector
+RrpaaWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  RrpaaWifiRemoteStation *station = static_cast<RrpaaWifiRemoteStation*> (st);
+  uint16_t channelWidth = GetChannelWidth (station);
+  if (channelWidth > 20 && channelWidth != 22)
+    {
+      channelWidth = 20;
+    }
+  WifiTxVector rtsTxVector;
+  WifiMode mode;
+  if (GetUseNonErpProtection () == false)
+    {
+      mode = GetSupported (station, 0);
+    }
+  else
+    {
+      mode = GetNonErpSupported (station, 0);
+    }
+  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()), 800, 1, 1, 0, channelWidth, GetAggregation (station));
+  return rtsTxVector;
+}
+
+bool
+RrpaaWifiManager::DoNeedRts (WifiRemoteStation *st,
+                             uint32_t size, bool normally)
+{
+  NS_LOG_FUNCTION (this << st << size << normally);
+  RrpaaWifiRemoteStation *station = static_cast<RrpaaWifiRemoteStation*> (st);
+  CheckInit (station);
+  if (m_basic)
+    {
+      return normally;
+    }
+  RunAdaptiveRtsAlgorithm (station);
+  return station->m_adaptiveRtsOn;
+}
+
+void
+RrpaaWifiManager::CheckTimeout (RrpaaWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  Time d = Simulator::Now () - station->m_lastReset;
+  if (station->m_counter == 0 || d > m_timeout)
+    {
+      ResetCountersBasic (station);
+    }
+}
+
+void
+RrpaaWifiManager::RunBasicAlgorithm (RrpaaWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  WifiRrpaaThresholds thresholds = GetThresholds (station, station->m_rateIndex);
+  double bploss = (static_cast<double> (station->m_nFailed) / thresholds.m_ewnd);
+  double wploss = (static_cast<double> (station->m_counter + station->m_nFailed) / thresholds.m_ewnd);
+  NS_LOG_DEBUG ("Best loss prob= " << bploss);
+  NS_LOG_DEBUG ("Worst loss prob= " << wploss);
+  if (bploss >= thresholds.m_mtl)
+    {
+      if (station->m_powerLevel < m_maxPowerLevel)
+        {
+          NS_LOG_DEBUG ("bploss >= MTL and power < maxPower => Increase Power");
+          station->m_pdTable[station->m_rateIndex][station->m_powerLevel] /= m_gamma;
+          NS_LOG_DEBUG ("pdTable[" << +station->m_rateIndex << "][" << station->m_powerLevel << "] = " << station->m_pdTable[station->m_rateIndex][station->m_powerLevel]);
+          station->m_powerLevel++;
+          ResetCountersBasic (station);
+        }
+      else if (station->m_rateIndex != 0)
+        {
+          NS_LOG_DEBUG ("bploss >= MTL and power = maxPower => Decrease Rate");
+          station->m_pdTable[station->m_rateIndex][station->m_powerLevel] /= m_gamma;
+          NS_LOG_DEBUG ("pdTable[" << +station->m_rateIndex << "][" << station->m_powerLevel << "] = " << station->m_pdTable[station->m_rateIndex][station->m_powerLevel]);
+          station->m_rateIndex--;
+          ResetCountersBasic (station);
+        }
+      else
+        {
+          NS_LOG_DEBUG ("bploss >= MTL but already at maxPower and minRate");
+        }
+    }
+  else if (wploss <= thresholds.m_ori)
+    {
+      if (station->m_rateIndex < station->m_nRate - 1)
+        {
+          NS_LOG_DEBUG ("wploss <= ORI and rate < maxRate => Probabilistic Rate Increase");
+
+          // Recalculate probabilities of lower rates.
+          for (uint8_t i = 0; i <= station->m_rateIndex; i++)
+            {
+              station->m_pdTable[i][station->m_powerLevel] *= m_delta;
+              if (station->m_pdTable[i][station->m_powerLevel] > 1)
+                {
+                  station->m_pdTable[i][station->m_powerLevel] = 1;
+                }
+              NS_LOG_DEBUG ("pdTable[" << i << "][" << (int)station->m_powerLevel << "] = " << station->m_pdTable[i][station->m_powerLevel]);
+            }
+          double rand = m_uniformRandomVariable->GetValue (0,1);
+          if (rand < station->m_pdTable[station->m_rateIndex + 1][station->m_powerLevel])
+            {
+              NS_LOG_DEBUG ("Increase Rate");
+              station->m_rateIndex++;
+            }
+        }
+      else if (station->m_powerLevel > m_minPowerLevel)
+        {
+          NS_LOG_DEBUG ("wploss <= ORI and rate = maxRate => Probabilistic Power Decrease");
+
+          // Recalculate probabilities of higher powers.
+          for (uint32_t i = m_maxPowerLevel; i > station->m_powerLevel; i--)
+            {
+              station->m_pdTable[station->m_rateIndex][i] *= m_delta;
+              if (station->m_pdTable[station->m_rateIndex][i] > 1)
+                {
+                  station->m_pdTable[station->m_rateIndex][i] = 1;
+                }
+              NS_LOG_DEBUG ("pdTable[" << +station->m_rateIndex << "][" << i << "] = " << station->m_pdTable[station->m_rateIndex][i]);
+            }
+          double rand = m_uniformRandomVariable->GetValue (0,1);
+          if (rand < station->m_pdTable[station->m_rateIndex][station->m_powerLevel - 1])
+            {
+              NS_LOG_DEBUG ("Decrease Power");
+              station->m_powerLevel--;
+            }
+        }
+      ResetCountersBasic (station);
+    }
+  else if (bploss > thresholds.m_ori && wploss < thresholds.m_mtl)
+    {
+      if (station->m_powerLevel > m_minPowerLevel)
+        {
+          NS_LOG_DEBUG ("loss between ORI and MTL and power > minPowerLevel => Probabilistic Power Decrease");
+
+          // Recalculate probabilities of higher powers.
+          for (uint32_t i = m_maxPowerLevel; i >= station->m_powerLevel; i--)
+            {
+              station->m_pdTable[station->m_rateIndex][i] *= m_delta;
+              if (station->m_pdTable[station->m_rateIndex][i] > 1)
+                {
+                  station->m_pdTable[station->m_rateIndex][i] = 1;
+                }
+              NS_LOG_DEBUG ("pdTable[" << +station->m_rateIndex << "][" << i << "] = " << station->m_pdTable[station->m_rateIndex][i]);
+            }
+          double rand = m_uniformRandomVariable->GetValue (0,1);
+          if (rand < station->m_pdTable[station->m_rateIndex][station->m_powerLevel - 1])
+            {
+              NS_LOG_DEBUG ("Decrease Power");
+              station->m_powerLevel--;
+            }
+          ResetCountersBasic (station);
+        }
+    }
+  if (station->m_counter == 0)
+    {
+      ResetCountersBasic (station);
+    }
+}
+
+void
+RrpaaWifiManager::RunAdaptiveRtsAlgorithm (RrpaaWifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+  if (!station->m_adaptiveRtsOn
+      && station->m_lastFrameFail)
+    {
+      station->m_adaptiveRtsWnd += 2;
+      station->m_rtsCounter = station->m_adaptiveRtsWnd;
+    }
+  else if ((station->m_adaptiveRtsOn && station->m_lastFrameFail)
+           || (!station->m_adaptiveRtsOn && !station->m_lastFrameFail))
+    {
+      station->m_adaptiveRtsWnd = station->m_adaptiveRtsWnd / 2;
+      station->m_rtsCounter = station->m_adaptiveRtsWnd;
+    }
+  if (station->m_rtsCounter > 0)
+    {
+      station->m_adaptiveRtsOn = true;
+      station->m_rtsCounter--;
+    }
+  else
+    {
+      station->m_adaptiveRtsOn = false;
+    }
+}
+
+WifiRrpaaThresholds
+RrpaaWifiManager::GetThresholds (RrpaaWifiRemoteStation *station, uint8_t index) const
+{
+  NS_LOG_FUNCTION (this << station << +index);
+  WifiMode mode = GetSupported (station, index);
+  return GetThresholds (station, mode);
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/rrpaa-wifi-manager.h ns-3.34/src/wifi/model/rate-control/rrpaa-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/rrpaa-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/rrpaa-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,237 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2017 Universidad de la República - Uruguay
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Matías Richart <mrichart@fing.edu.uy>
+ */
+
+#ifndef RRPAA_WIFI_MANAGER_H
+#define RRPAA_WIFI_MANAGER_H
+
+#include "ns3/nstime.h"
+#include "ns3/random-variable-stream.h"
+#include "ns3/wifi-remote-station-manager.h"
+
+namespace ns3 {
+
+struct RrpaaWifiRemoteStation;
+
+/**
+ * \ingroup wifi
+ * Robust Rate and Power Adaptation Algorithm
+ *
+ * This class implements the RRPAA algorithm as described in <i>Rate, Power and Carrier-Sense
+ * Threshold Coordinated Management for High-Density IEEE 802.11 Networks</i>
+ * by Matías Richart; Jorge Visca and Javier Baliosian in Integrated Network Management (IM),
+ * 2015 IFIP/IEEE International Symposium on (pp. 139-146). IEEE.
+ * http://dl.ifip.org/db/conf/im/im2015/137430.pdf
+ *
+ * RRPAA adds power control to the RRAA mechanism. RRAA is described in
+ * <i>Robust rate adaptation for 802.11 wireless networks</i> by Starsky H. Y. Wong;
+ * Hao Yang; Songwu Lu and Vaduvur Bharghavan in Proceedings of the 12th annual
+ * international conference on Mobile computing and networking (pp. 146-157). ACM.
+ * http://ocw.cs.pub.ro/courses/_media/isrm/articole/rrate_adapt_mobicom06.pdf
+ *
+ * This RAA does not support HT modes and will error
+ * exit if the user tries to configure this RAA with a Wi-Fi MAC
+ * that supports 802.11n or higher.
+ */
+
+/**
+ * For each rate there is a Opportunistic Rate Increase threshold,
+ * a Maximum Tolerable Loss threshold and an Evaluation Window.
+ */
+struct WifiRrpaaThresholds
+{
+  double m_ori; //!< The Opportunistic Rate Increase threshold.
+  double m_mtl; //!< The Maximum Tolerable Loss threshold.
+  uint32_t m_ewnd; //!< The Estimation Window size.
+};
+
+/**
+ * List of thresholds for each mode.
+ */
+typedef std::vector<std::pair<WifiRrpaaThresholds,WifiMode> > RrpaaThresholdsTable;
+
+/**
+ * List of probabilities.
+ */
+typedef std::vector<std::vector<double> > RrpaaProbabilitiesTable;
+
+class RrpaaWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * Register this type.
+   * \return The object TypeId.
+   */
+  static TypeId GetTypeId (void);
+  RrpaaWifiManager ();
+  virtual ~RrpaaWifiManager ();
+
+  void SetupPhy (const Ptr<WifiPhy> phy) override;
+  void SetupMac (const Ptr<WifiMac> mac) override;
+
+  /**
+   * Assign a fixed random variable stream number to the random variables
+   * used by this model.  Return the number of streams (possibly zero) that
+   * have been assigned.
+   *
+   * \param stream first stream index to use
+   *
+   * \return the number of stream indices assigned by this model
+   */
+  int64_t AssignStreams (int64_t stream) override;
+
+private:
+  void DoInitialize (void) override;
+  WifiRemoteStation * DoCreateStation (void) const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
+                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+  bool DoNeedRts (WifiRemoteStation *st,
+                  uint32_t size, bool normally) override;
+
+  /**
+   * Check for initializations.
+   * \param station the remote station.
+   */
+  void CheckInit (RrpaaWifiRemoteStation *station);
+
+  /**
+   * Check if the counter should be reset.
+   *
+   * \param station the remote station
+   */
+  void CheckTimeout (RrpaaWifiRemoteStation *station);
+  /**
+   * Find an appropriate rate and power for the given station, using
+   * a basic algorithm.
+   *
+   * \param station the remote station
+   */
+  void RunBasicAlgorithm (RrpaaWifiRemoteStation *station);
+  /**
+   * Run an enhanced algorithm which activates the use of RTS
+   * for the given station if the conditions are met.
+   *
+   * \param station the remote station
+   */
+  void RunAdaptiveRtsAlgorithm (RrpaaWifiRemoteStation *station);
+  /**
+   * Reset the counters of the given station.
+   *
+   * \param station the remote station
+   */
+  void ResetCountersBasic (RrpaaWifiRemoteStation *station);
+
+  /**
+   * Initialize the thresholds internal list for the given station.
+   *
+   * \param station the remote station
+   */
+  void InitThresholds (RrpaaWifiRemoteStation *station);
+
+  /**
+   * Get the thresholds for the given station and mode.
+   *
+   * \param station the remote station
+   * \param mode the WifiMode
+   *
+   * \return the RRPAA thresholds
+   */
+  WifiRrpaaThresholds GetThresholds (RrpaaWifiRemoteStation *station, WifiMode mode) const;
+
+  /**
+   * Get the thresholds for the given station and mode index.
+   *
+   * \param station the remote station
+   * \param index the mode index in the supported rates
+   *
+   * \return the RRPAA thresholds
+   */
+  WifiRrpaaThresholds GetThresholds (RrpaaWifiRemoteStation *station, uint8_t index) const;
+
+  /**
+   * Get the estimated TxTime of a packet with a given mode.
+   *
+   * \param mode the WifiMode
+   *
+   * \return the estimated TX time
+   */
+  Time GetCalcTxTime (WifiMode mode) const;
+  /**
+   * Add transmission time for the given mode to an internal list.
+   *
+   * \param mode the WifiMode
+   * \param t transmission time
+   */
+  void AddCalcTxTime (WifiMode mode, Time t);
+
+  /**
+   * typedef for a vector of a pair of Time, WifiMode.
+   * Essentially a list for WifiMode and its corresponding transmission time
+   * to transmit a reference packet.
+   */
+  typedef std::vector<std::pair<Time,WifiMode> > TxTime;
+
+  TxTime m_calcTxTime;     //!< To hold all the calculated TxTime for all modes.
+  Time m_sifs;             //!< Value of SIFS configured in the device.
+  Time m_difs;             //!< Value of DIFS configured in the device.
+
+  uint32_t m_frameLength;  //!< Data frame length used for calculate mode TxTime (in bytes).
+  uint32_t m_ackLength;    //!< Ack frame length used for calculate mode TxTime (in bytes).
+
+  bool m_basic;            //!< If using the basic algorithm (without RTS/CTS).
+  Time m_timeout;          //!< Timeout for the RRAA BASIC loss estimation block.
+  double m_alpha;          //!< Alpha value for RRPAA (value for calculating MTL threshold)
+  double m_beta;           //!< Beta value for RRPAA (value for calculating ORI threshold).
+  double m_tau;            //!< Tau value for RRPAA (value for calculating EWND size).
+  double m_gamma;          //!< Gamma value for RRPAA (value for pdTable decrements).
+  double m_delta;          //!< Delta value for RRPAA (value for pdTable increments).
+
+  /**
+   * Differently form rate, power levels do not depend on the remote station.
+   * The levels depend only on the physical layer of the device.
+   */
+  uint8_t m_minPowerLevel;     //!< Minimal power level.
+  uint8_t m_maxPowerLevel;     //!< Maximal power level.
+  uint8_t m_nPowerLevels;      //!< Number of power levels.
+
+  /**
+   * The trace source fired when the transmission power change
+   */
+  TracedCallback<double, double, Mac48Address> m_powerChange;
+  /**
+   * The trace source fired when the transmission rate change
+   */
+  TracedCallback<DataRate, DataRate, Mac48Address> m_rateChange;
+
+  Ptr<UniformRandomVariable> m_uniformRandomVariable; //!< Provides uniform random variables for probabilistic changes.
+};
+
+} //namespace ns3
+
+#endif /* RRPAA__WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/thompson-sampling-wifi-manager.cc ns-3.34/src/wifi/model/rate-control/thompson-sampling-wifi-manager.cc
--- ns-3.33/src/wifi/model/rate-control/thompson-sampling-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/thompson-sampling-wifi-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,415 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021 IITP RAS
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Krotov <krotov@iitp.ru>
+ */
+
+#include "ns3/log.h"
+#include "ns3/double.h"
+#include "ns3/core-module.h"
+#include "ns3/packet.h"
+
+#include "ns3/wifi-phy.h"
+
+#include "thompson-sampling-wifi-manager.h"
+
+#include <cstdint>
+#include <cstdlib>
+#include <fstream>
+#include <iostream>
+#include <string>
+
+namespace ns3 {
+
+/**
+ * A structure containing parameters of a single rate and its
+ * statistics.
+ */
+struct RateStats {
+  WifiMode mode; ///< MCS
+  uint16_t channelWidth; ///< channel width in MHz
+  uint8_t nss; ///< Number of spatial streams
+
+  double success{0.0}; ///< averaged number of successful transmissions
+  double fails{0.0}; ///< averaged number of failed transmissions
+  Time lastDecay{0}; ///< last time exponential decay was applied to this rate
+};
+
+/**
+ * Holds station state and collected statistics.
+ *
+ * This struct extends from WifiRemoteStation to hold additional
+ * information required by ThompsonSamplingWifiManager.
+ */
+struct ThompsonSamplingWifiRemoteStation : public WifiRemoteStation
+{
+  size_t m_nextMode; //!< Mode to select for the next transmission
+  size_t m_lastMode; //!< Most recently used mode, used to write statistics
+
+  std::vector<RateStats> m_mcsStats; //!< Collected statistics
+};
+
+NS_OBJECT_ENSURE_REGISTERED (ThompsonSamplingWifiManager);
+
+NS_LOG_COMPONENT_DEFINE ("ThompsonSamplingWifiManager");
+
+TypeId
+ThompsonSamplingWifiManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::ThompsonSamplingWifiManager")
+    .SetParent<WifiRemoteStationManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<ThompsonSamplingWifiManager> ()
+    .AddAttribute ("Decay",
+                   "Exponential decay coefficient, Hz; zero is a valid value for static scenarios",
+                   DoubleValue (1.0),
+                   MakeDoubleAccessor (&ThompsonSamplingWifiManager::m_decay),
+                   MakeDoubleChecker<double> (0.0))
+    .AddTraceSource ("Rate",
+                     "Traced value for rate changes (b/s)",
+                     MakeTraceSourceAccessor (&ThompsonSamplingWifiManager::m_currentRate),
+                     "ns3::TracedValueCallback::Uint64")
+  ;
+  return tid;
+}
+
+ThompsonSamplingWifiManager::ThompsonSamplingWifiManager ()
+  : m_currentRate{0}
+{
+  NS_LOG_FUNCTION (this);
+
+  m_gammaRandomVariable = CreateObject<GammaRandomVariable> ();
+}
+
+ThompsonSamplingWifiManager::~ThompsonSamplingWifiManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+WifiRemoteStation *
+ThompsonSamplingWifiManager::DoCreateStation () const
+{
+  NS_LOG_FUNCTION (this);
+  ThompsonSamplingWifiRemoteStation *station = new ThompsonSamplingWifiRemoteStation ();
+  station->m_nextMode = 0;
+  station->m_lastMode = 0;
+  return station;
+}
+
+void
+ThompsonSamplingWifiManager::InitializeStation (WifiRemoteStation *st) const
+{
+  auto station = static_cast<ThompsonSamplingWifiRemoteStation *> (st);
+  if (!station->m_mcsStats.empty ())
+    {
+      return;
+    }
+
+  // Add HT, VHT or HE MCSes
+  for (const auto &mode : GetPhy ()->GetMcsList ())
+    {
+      for (uint16_t j = 20; j <= GetPhy ()->GetChannelWidth (); j *= 2)
+        {
+          WifiModulationClass modulationClass = WIFI_MOD_CLASS_HT;
+          if (GetVhtSupported ())
+            {
+              modulationClass = WIFI_MOD_CLASS_VHT;
+            }
+          if (GetHeSupported ())
+            {
+              modulationClass = WIFI_MOD_CLASS_HE;
+            }
+          if (mode.GetModulationClass () == modulationClass)
+            {
+              for (uint8_t k = 1; k <= GetPhy ()->GetMaxSupportedTxSpatialStreams (); k++)
+                {
+                  if (mode.IsAllowed (j, k))
+                    {
+                      RateStats stats;
+                      stats.mode = mode;
+                      stats.channelWidth = j;
+                      stats.nss = k;
+
+                      station->m_mcsStats.push_back (stats);
+                    }
+                }
+            }
+        }
+    }
+
+  if (station->m_mcsStats.empty ())
+    {
+      // Add legacy non-HT modes.
+      for (uint8_t i = 0; i < GetNSupported (station); i++)
+        {
+          RateStats stats;
+          stats.mode = GetSupported (station, i);
+          if (stats.mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS
+              || stats.mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS)
+            {
+              stats.channelWidth = 22;
+            }
+          else
+            {
+              stats.channelWidth = 20;
+            }
+          stats.nss = 1;
+          station->m_mcsStats.push_back (stats);
+        }
+    }
+
+  NS_ASSERT_MSG (!station->m_mcsStats.empty (), "No usable MCS found");
+
+  UpdateNextMode (st);
+}
+
+void
+ThompsonSamplingWifiManager::DoReportRxOk (WifiRemoteStation *station, double rxSnr, WifiMode txMode)
+{
+  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
+}
+
+void
+ThompsonSamplingWifiManager::DoReportRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+ThompsonSamplingWifiManager::DoReportDataFailed (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  InitializeStation (st);
+  auto station = static_cast<ThompsonSamplingWifiRemoteStation *> (st);
+  Decay (st, station->m_lastMode);
+  station->m_mcsStats.at (station->m_lastMode).fails++;
+  UpdateNextMode (st);
+}
+
+void
+ThompsonSamplingWifiManager::DoReportRtsOk (WifiRemoteStation *st, double ctsSnr, WifiMode ctsMode,
+                                     double rtsSnr)
+{
+  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode.GetUniqueName () << rtsSnr);
+}
+
+void
+ThompsonSamplingWifiManager::UpdateNextMode (WifiRemoteStation *st) const
+{
+  InitializeStation (st);
+  auto station = static_cast<ThompsonSamplingWifiRemoteStation *> (st);
+
+  double maxThroughput = 0.0;
+  double frameSuccessRate = 1.0;
+
+  NS_ASSERT (!station->m_mcsStats.empty ());
+
+  // Use the most robust MCS if frameSuccessRate is 0 for all MCS.
+  station->m_nextMode = 0;
+
+  for (uint32_t i = 0; i < station->m_mcsStats.size (); i++)
+    {
+      Decay (st, i);
+      const WifiMode mode{station->m_mcsStats.at (i).mode};
+
+      uint16_t guardInterval = GetModeGuardInterval (st, mode);
+      double rate = mode.GetDataRate (station->m_mcsStats.at (i).channelWidth,
+                                      guardInterval,
+                                      station->m_mcsStats.at (i).nss);
+
+      // Thompson sampling
+      frameSuccessRate = SampleBetaVariable (1.0 + station->m_mcsStats.at (i).success,
+                                             1.0 + station->m_mcsStats.at (i).fails);
+      NS_LOG_DEBUG ("Draw"
+                    << " success=" << station->m_mcsStats.at (i).success
+                    << " fails=" << station->m_mcsStats.at (i).fails
+                    << " frameSuccessRate=" << frameSuccessRate
+                    << " mode=" << mode);
+      if (frameSuccessRate * rate > maxThroughput)
+        {
+          maxThroughput = frameSuccessRate * rate;
+          station->m_nextMode = i;
+        }
+    }
+}
+
+void
+ThompsonSamplingWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
+                                      double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << ackSnr << ackMode.GetUniqueName () << dataSnr);
+  InitializeStation (st);
+  auto station = static_cast<ThompsonSamplingWifiRemoteStation *> (st);
+  Decay (st, station->m_lastMode);
+  station->m_mcsStats.at (station->m_lastMode).success++;
+  UpdateNextMode (st);
+}
+
+void
+ThompsonSamplingWifiManager::DoReportAmpduTxStatus (WifiRemoteStation *st, uint16_t nSuccessfulMpdus,
+                                             uint16_t nFailedMpdus, double rxSnr, double dataSnr,
+                                             uint16_t dataChannelWidth, uint8_t dataNss)
+{
+  NS_LOG_FUNCTION (this << st << nSuccessfulMpdus << nFailedMpdus << rxSnr << dataSnr);
+  InitializeStation (st);
+  auto station = static_cast<ThompsonSamplingWifiRemoteStation *> (st);
+
+  Decay (st, station->m_lastMode);
+  station->m_mcsStats.at (station->m_lastMode).success += nSuccessfulMpdus;
+  station->m_mcsStats.at (station->m_lastMode).fails += nFailedMpdus;
+
+  UpdateNextMode (st);
+}
+
+void
+ThompsonSamplingWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+void
+ThompsonSamplingWifiManager::DoReportFinalDataFailed (WifiRemoteStation *station)
+{
+  NS_LOG_FUNCTION (this << station);
+}
+
+uint16_t
+ThompsonSamplingWifiManager::GetModeGuardInterval (WifiRemoteStation *st, WifiMode mode) const
+{
+  if (mode.GetModulationClass () == WIFI_MOD_CLASS_HE)
+    {
+      return std::max (GetGuardInterval (st), GetGuardInterval ());
+    }
+  else if ((mode.GetModulationClass () == WIFI_MOD_CLASS_HT) ||
+           (mode.GetModulationClass () == WIFI_MOD_CLASS_VHT))
+    {
+      return std::max<uint16_t> (GetShortGuardIntervalSupported (st) ? 400 : 800,
+                                 GetShortGuardIntervalSupported () ? 400 : 800);
+    }
+  else
+    {
+      return 800;
+    }
+}
+
+WifiTxVector
+ThompsonSamplingWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  InitializeStation (st);
+  auto station = static_cast<ThompsonSamplingWifiRemoteStation *> (st);
+
+  auto &stats = station->m_mcsStats.at (station->m_nextMode);
+  WifiMode mode = stats.mode;
+  uint16_t channelWidth = std::min (stats.channelWidth, GetPhy ()->GetChannelWidth ());
+  uint8_t nss = stats.nss;
+  uint16_t guardInterval = GetModeGuardInterval (st, mode);
+
+  station->m_lastMode = station->m_nextMode;
+
+  NS_LOG_DEBUG ("Using"
+                << " mode=" << mode
+                << " channelWidth=" << channelWidth
+                << " nss=" << +nss
+                << " guardInterval=" << guardInterval);
+
+  uint64_t rate = mode.GetDataRate (channelWidth, guardInterval, nss);
+  if (m_currentRate != rate)
+    {
+      NS_LOG_DEBUG ("New datarate: " << rate);
+      m_currentRate = rate;
+    }
+
+  return WifiTxVector (
+      mode,
+      GetDefaultTxPowerLevel (),
+      GetPreambleForTransmission (mode.GetModulationClass (),
+                                  GetShortPreambleEnabled ()),
+      GetModeGuardInterval (st, mode),
+      GetNumberOfAntennas (),
+      nss,
+      0, // NESS
+      GetChannelWidthForTransmission (mode, channelWidth),
+      GetAggregation (station),
+      false);
+}
+
+WifiTxVector
+ThompsonSamplingWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
+{
+  NS_LOG_FUNCTION (this << st);
+  InitializeStation (st);
+  auto station = static_cast<ThompsonSamplingWifiRemoteStation *> (st);
+
+  // Use the most robust MCS for the control channel.
+  auto &stats = station->m_mcsStats.at (0);
+  WifiMode mode = stats.mode;
+  uint16_t channelWidth = std::min (stats.channelWidth, GetPhy ()->GetChannelWidth ());
+  uint8_t nss = stats.nss;
+
+  // Make sure control frames are sent using 1 spatial stream.
+  NS_ASSERT (nss == 1);
+
+  return WifiTxVector (
+      mode, GetDefaultTxPowerLevel (),
+      GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()),
+      GetModeGuardInterval (st, mode),
+      GetNumberOfAntennas (),
+      nss,
+      0, // NESS
+      GetChannelWidthForTransmission (mode, channelWidth),
+      GetAggregation (station),
+      false);
+}
+
+double
+ThompsonSamplingWifiManager::SampleBetaVariable (uint64_t alpha, uint64_t beta) const
+{
+  double X = m_gammaRandomVariable->GetValue (alpha, 1.0);
+  double Y = m_gammaRandomVariable->GetValue (beta, 1.0);
+  return X / (X + Y);
+}
+
+void
+ThompsonSamplingWifiManager::Decay (WifiRemoteStation *st, size_t i) const
+{
+  NS_LOG_FUNCTION (this << st << i);
+  InitializeStation (st);
+  auto station = static_cast<ThompsonSamplingWifiRemoteStation *> (st);
+
+  Time now = Simulator::Now ();
+  auto &stats = station->m_mcsStats.at (i);
+  if (now > stats.lastDecay)
+    {
+      const double coefficient =
+          std::exp (m_decay * (stats.lastDecay - now).GetSeconds ());
+
+      stats.success *= coefficient;
+      stats.fails *= coefficient;
+      stats.lastDecay = now;
+    }
+}
+
+int64_t
+ThompsonSamplingWifiManager::AssignStreams (int64_t stream)
+{
+  NS_LOG_FUNCTION (this << stream);
+  m_gammaRandomVariable->SetStream (stream);
+  return 1;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rate-control/thompson-sampling-wifi-manager.h ns-3.34/src/wifi/model/rate-control/thompson-sampling-wifi-manager.h
--- ns-3.33/src/wifi/model/rate-control/thompson-sampling-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/rate-control/thompson-sampling-wifi-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,126 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021 IITP RAS
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Krotov <krotov@iitp.ru>
+ */
+
+#ifndef THOMPSON_SAMPLING_WIFI_MANAGER_H
+#define THOMPSON_SAMPLING_WIFI_MANAGER_H
+
+#include "ns3/random-variable-stream.h"
+
+#include "ns3/wifi-remote-station-manager.h"
+
+namespace ns3 {
+
+/**
+ * \brief Thompson Sampling rate control algorithm
+ * \ingroup wifi
+ *
+ * This class implements Thompson Sampling rate control algorithm.
+ *
+ * It was implemented for use as a baseline in
+ * https://doi.org/10.1109/ACCESS.2020.3023552
+ */
+class ThompsonSamplingWifiManager : public WifiRemoteStationManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  ThompsonSamplingWifiManager ();
+  virtual ~ThompsonSamplingWifiManager ();
+
+  int64_t AssignStreams (int64_t stream) override;
+
+private:
+  WifiRemoteStation *DoCreateStation () const override;
+  void DoReportRxOk (WifiRemoteStation *station,
+                     double rxSnr, WifiMode txMode) override;
+  void DoReportRtsFailed (WifiRemoteStation *station) override;
+  void DoReportDataFailed (WifiRemoteStation *station) override;
+  void DoReportRtsOk (WifiRemoteStation *station,
+                      double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
+  void DoReportDataOk (WifiRemoteStation *station,
+                       double ackSnr, WifiMode ackMode, double dataSnr,
+                       uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportAmpduTxStatus (WifiRemoteStation *station,
+                              uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus,
+                              double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
+  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
+  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
+  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station) override;
+  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
+
+  /**
+   * Initializes station rate tables. If station is already initialized,
+   * nothing is done.
+   *
+   * \param station Station which should be initialized.
+   */
+  void InitializeStation (WifiRemoteStation *station) const;
+
+  /**
+   * Draws a new MCS and related parameters to try next time for this
+   * station.
+   *
+   * This method should only be called between TXOPs to avoid sending
+   * multiple frames using different modes. Otherwise it is impossible
+   * to tell which mode was used for succeeded/failed frame when
+   * feedback is received.
+   *
+   * \param station Station for which a new mode should be drawn.
+   */
+  void UpdateNextMode (WifiRemoteStation *station) const;
+
+  /**
+   * Applies exponential decay to MCS statistics.
+   *
+   * \param st Remote STA for which MCS statistics is to be updated.
+   * \param i MCS index.
+   */
+  void Decay (WifiRemoteStation *st, size_t i) const;
+
+  /**
+   * Returns guard interval in nanoseconds for the given mode.
+   *
+   * \param st Remote STA.
+   * \param mode The WifiMode.
+   * \return the guard interval in nanoseconds
+   */
+  uint16_t GetModeGuardInterval (WifiRemoteStation *st, WifiMode mode) const;
+
+  /**
+   * Sample beta random variable with given parameters
+   * \param alpha first parameter of beta distribution
+   * \param beta second parameter of beta distribution
+   * \return beta random variable sample
+   */
+  double SampleBetaVariable (uint64_t alpha, uint64_t beta) const;
+
+  Ptr<GammaRandomVariable> m_gammaRandomVariable; //!< Variable used to sample beta-distributed random variables
+
+  double m_decay; //!< Exponential decay coefficient, Hz
+
+  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
+};
+
+} //namespace ns3
+
+#endif /* THOMPSON_SAMPLING_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/recipient-block-ack-agreement.cc ns-3.34/src/wifi/model/recipient-block-ack-agreement.cc
--- ns-3.33/src/wifi/model/recipient-block-ack-agreement.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/recipient-block-ack-agreement.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,258 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "ns3/packet.h"
+#include "recipient-block-ack-agreement.h"
+#include "wifi-mac-queue-item.h"
+#include "wifi-utils.h"
+#include "mac-rx-middle.h"
+#include "ctrl-headers.h"
+#include <algorithm>
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("RecipientBlockAckAgreement");
+
+bool
+RecipientBlockAckAgreement::Compare::operator() (const Key& a, const Key& b) const
+{
+  return ((a.first - *a.second + SEQNO_SPACE_SIZE) % SEQNO_SPACE_SIZE)
+         < ((b.first - *b.second + SEQNO_SPACE_SIZE) % SEQNO_SPACE_SIZE);
+}
+
+RecipientBlockAckAgreement::RecipientBlockAckAgreement (Mac48Address originator, bool amsduSupported,
+                                                        uint8_t tid, uint16_t bufferSize, uint16_t timeout,
+                                                        uint16_t startingSeq, bool htSupported)
+  : BlockAckAgreement (originator, tid)
+{
+  NS_LOG_FUNCTION (this << originator << amsduSupported << +tid << bufferSize
+                   << timeout << startingSeq << htSupported);
+
+  m_amsduSupported = amsduSupported;
+  m_bufferSize = bufferSize;
+  m_timeout = timeout;
+  m_startingSeq = startingSeq;
+  m_htSupported = htSupported;
+
+  m_scoreboard.Init (startingSeq, bufferSize);
+  m_winStartB = startingSeq;
+  m_winSizeB = bufferSize;
+}
+
+RecipientBlockAckAgreement::~RecipientBlockAckAgreement ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  m_bufferedMpdus.clear ();
+  m_rxMiddle = 0;
+}
+
+void
+RecipientBlockAckAgreement::SetMacRxMiddle (const Ptr<MacRxMiddle> rxMiddle)
+{
+  NS_LOG_FUNCTION (this << rxMiddle);
+  m_rxMiddle = rxMiddle;
+}
+
+void
+RecipientBlockAckAgreement::PassBufferedMpdusUntilFirstLost (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  // There cannot be old MPDUs in the buffer (we just check the MPDU with the
+  // highest sequence number)
+  NS_ASSERT (m_bufferedMpdus.empty () ||
+             GetDistance (m_bufferedMpdus.rbegin ()->first.first, m_winStartB) < SEQNO_SPACE_HALF_SIZE);
+  
+  auto it = m_bufferedMpdus.begin ();
+
+  while (it != m_bufferedMpdus.end () && it->first.first == m_winStartB)
+    {
+      NS_LOG_DEBUG ("Forwarding up: " << *it->second);
+      m_rxMiddle->Receive (it->second);
+      it = m_bufferedMpdus.erase (it);
+      m_winStartB = (m_winStartB + 1) % SEQNO_SPACE_SIZE;
+    }
+}
+
+void
+RecipientBlockAckAgreement::PassBufferedMpdusWithSeqNumberLessThan (uint16_t newWinStartB)
+{
+  NS_LOG_FUNCTION (this << newWinStartB);
+
+  // There cannot be old MPDUs in the buffer (we just check the MPDU with the
+  // highest sequence number)
+  NS_ASSERT (m_bufferedMpdus.empty () ||
+             GetDistance (m_bufferedMpdus.rbegin ()->first.first, m_winStartB) < SEQNO_SPACE_HALF_SIZE);
+  
+  auto it = m_bufferedMpdus.begin ();
+
+  while (it != m_bufferedMpdus.end ()
+         && GetDistance (it->first.first, m_winStartB) < GetDistance (newWinStartB, m_winStartB))
+    {
+      NS_LOG_DEBUG ("Forwarding up: " << *it->second);
+      m_rxMiddle->Receive (it->second);
+      it = m_bufferedMpdus.erase (it);
+    }
+  m_winStartB = newWinStartB;
+}
+
+void
+RecipientBlockAckAgreement::NotifyReceivedMpdu (Ptr<WifiMacQueueItem> mpdu)
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+
+  uint16_t mpduSeqNumber = mpdu->GetHeader ().GetSequenceNumber ();
+  uint16_t distance = GetDistance (mpduSeqNumber, m_scoreboard.GetWinStart ());
+
+  /* Update the scoreboard (see Section 10.24.7.3 of 802.11-2016) */
+  if (distance < m_scoreboard.GetWinSize ())
+    {
+      // set to 1 the bit in position SN within the bitmap
+      m_scoreboard.At (distance) = true;
+    }
+  else if (distance < SEQNO_SPACE_HALF_SIZE)
+    {
+      m_scoreboard.Advance (distance - m_scoreboard.GetWinSize () + 1);
+      m_scoreboard.At (m_scoreboard.GetWinSize () - 1) = true;
+    }
+
+  distance = GetDistance (mpduSeqNumber, m_winStartB);
+
+  /* Update the receive reordering buffer (see Section 10.24.7.6.2 of 802.11-2016) */
+  if (distance < m_winSizeB)
+    {
+      // 1. Store the received MPDU in the buffer, if no MSDU with the same sequence
+      // number is already present
+      m_bufferedMpdus.insert ({{mpdu->GetHeader ().GetSequenceNumber (), &m_winStartB}, mpdu});
+
+      // 2. Pass MSDUs or A-MSDUs up to the next MAC process if they are stored in
+      // the buffer in order of increasing value of the Sequence Number subfield
+      // starting with the MSDU or A-MSDU that has SN=WinStartB
+      // 3. Set WinStartB to the value of the Sequence Number subfield of the last
+      // MSDU or A-MSDU that was passed up to the next MAC process plus one.
+      PassBufferedMpdusUntilFirstLost ();
+    }
+  else if (distance < SEQNO_SPACE_HALF_SIZE)
+    {
+      // 1. Store the received MPDU in the buffer, if no MSDU with the same sequence
+      // number is already present
+      m_bufferedMpdus.insert ({{mpdu->GetHeader ().GetSequenceNumber (), &m_winStartB}, mpdu});
+
+      // 2. Set WinEndB = SN
+      // 3. Set WinStartB = WinEndB – WinSizeB + 1
+      // 4. Pass any complete MSDUs or A-MSDUs stored in the buffer with Sequence Number
+      // subfield values that are lower than the new value of WinStartB up to the next
+      // MAC process in order of increasing Sequence Number subfield value. Gaps may
+      // exist in the Sequence Number subfield values of the MSDUs or A-MSDUs that are
+      // passed up to the next MAC process.
+      PassBufferedMpdusWithSeqNumberLessThan (mpdu->GetHeader ().GetSequenceNumber () - m_winSizeB + 1);
+
+      // 5. Pass MSDUs or A-MSDUs stored in the buffer up to the next MAC process in
+      // order of increasing value of the Sequence Number subfield starting with
+      // WinStartB and proceeding sequentially until there is no buffered MSDU or
+      // A-MSDU for the next sequential Sequence Number subfield value
+      PassBufferedMpdusUntilFirstLost ();
+    }
+}
+
+void
+RecipientBlockAckAgreement::Flush (void)
+{
+  NS_LOG_FUNCTION (this);
+  PassBufferedMpdusWithSeqNumberLessThan (m_scoreboard.GetWinStart ());
+  PassBufferedMpdusUntilFirstLost ();
+}
+
+void
+RecipientBlockAckAgreement::NotifyReceivedBar (uint16_t startingSequenceNumber)
+{
+  NS_LOG_FUNCTION (this << startingSequenceNumber);
+
+  uint16_t distance = GetDistance (startingSequenceNumber, m_scoreboard.GetWinStart ());
+
+  /* Update the scoreboard (see Section 10.24.7.3 of 802.11-2016) */
+  if (distance > 0 && distance < m_scoreboard.GetWinSize ())
+    {
+      // advance by SSN - WinStartR, so that WinStartR becomes equal to SSN
+      m_scoreboard.Advance (distance);
+      NS_ASSERT (m_scoreboard.GetWinStart () == startingSequenceNumber);
+    }
+  else if (distance > 0 && distance < SEQNO_SPACE_HALF_SIZE)
+    {
+      // reset the window and set WinStartR to SSN
+      m_scoreboard.Reset (startingSequenceNumber);
+    }
+
+  distance = GetDistance (startingSequenceNumber, m_winStartB);
+
+  /* Update the receive reordering buffer (see Section 10.24.7.6.2 of 802.11-2016) */
+  if (distance > 0 && distance < SEQNO_SPACE_HALF_SIZE)
+    {
+      // 1. set WinStartB = SSN
+      // 3. Pass any complete MSDUs or A-MSDUs stored in the buffer with Sequence
+      // Number subfield values that are lower than the new value of WinStartB up to
+      // the next MAC process in order of increasing Sequence Number subfield value
+      PassBufferedMpdusWithSeqNumberLessThan (startingSequenceNumber);
+
+      // 4. Pass MSDUs or A-MSDUs stored in the buffer up to the next MAC process
+      // in order of increasing Sequence Number subfield value starting with
+      // SN=WinStartB and proceeding sequentially until there is no buffered MSDU
+      // or A-MSDU for the next sequential Sequence Number subfield value
+      PassBufferedMpdusUntilFirstLost ();
+    }
+}
+
+void
+RecipientBlockAckAgreement::FillBlockAckBitmap (CtrlBAckResponseHeader *blockAckHeader, std::size_t index) const
+{
+  NS_LOG_FUNCTION (this << blockAckHeader << index);
+  if (blockAckHeader->IsBasic ())
+    {
+      NS_FATAL_ERROR ("Basic block ack is not supported.");
+    }
+  else if (blockAckHeader->IsMultiTid ())
+    {
+      NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
+    }
+  else if (blockAckHeader->IsCompressed () || blockAckHeader->IsExtendedCompressed ()
+           || blockAckHeader->IsMultiSta ())
+    {
+      // The Starting Sequence Number subfield of the Block Ack Starting Sequence
+      // Control subfield of the BlockAck frame shall be set to any value in the
+      // range (WinEndR – 63) to WinStartR (Sec. 10.24.7.5 of 802.11-2016).
+      // We set it to WinStartR
+      uint16_t ssn = m_scoreboard.GetWinStart ();
+      NS_LOG_DEBUG ("SSN=" << ssn);
+      blockAckHeader->SetStartingSequence (ssn, index);
+      blockAckHeader->ResetBitmap (index);
+
+      for (std::size_t i = 0; i < m_scoreboard.GetWinSize (); i++)
+        {
+          if (m_scoreboard.At (i))
+            {
+              blockAckHeader->SetReceivedPacket ((ssn + i) % SEQNO_SPACE_SIZE, index);
+            }
+        }
+    }
+}
+
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/recipient-block-ack-agreement.h ns-3.34/src/wifi/model/recipient-block-ack-agreement.h
--- ns-3.33/src/wifi/model/recipient-block-ack-agreement.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/recipient-block-ack-agreement.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,140 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+#ifndef RECIPIENT_BLOCK_ACK_AGREEMENT_H
+#define RECIPIENT_BLOCK_ACK_AGREEMENT_H
+
+#include "block-ack-agreement.h"
+#include "block-ack-window.h"
+#include <map>
+
+
+namespace ns3 {
+
+class WifiMacQueueItem;
+class MacRxMiddle;
+class CtrlBAckResponseHeader;
+
+/**
+ * \ingroup wifi
+ * Maintains the scoreboard and the receive reordering buffer used by a recipient
+ * of a Block Ack agreement.
+ */
+class RecipientBlockAckAgreement : public BlockAckAgreement
+{
+public:
+  /**
+   * Constructor
+   *
+   * \param originator MAC address
+   * \param amsduSupported whether A-MSDU support is enabled
+   * \param tid Traffic ID
+   * \param bufferSize the buffer size (in number of MPDUs)
+   * \param timeout the timeout value
+   * \param startingSeq the starting sequence number
+   * \param htSupported whether HT support is enabled
+   */
+  RecipientBlockAckAgreement (Mac48Address originator, bool amsduSupported, uint8_t tid,
+                              uint16_t bufferSize, uint16_t timeout, uint16_t startingSeq,
+                              bool htSupported);
+  ~RecipientBlockAckAgreement ();
+
+  /**
+   * Set the MAC RX Middle to use.
+   *
+   * \param rxMiddle the MAC RX Middle to use
+   */
+  void SetMacRxMiddle (const Ptr<MacRxMiddle> rxMiddle);
+
+  /**
+   * Update both the scoreboard and the receive reordering buffer upon reception
+   * of the given MPDU.
+   *
+   * \param mpdu the received MPDU
+   */
+  void NotifyReceivedMpdu (Ptr<WifiMacQueueItem> mpdu);
+  /**
+   * Update both the scoreboard and the receive reordering buffer upon reception
+   * of a Block Ack Request.
+   *
+   * \param startingSequenceNumber the starting sequence number included in the
+   *                               received Block Ack Request
+   */
+  void NotifyReceivedBar (uint16_t startingSequenceNumber);
+  /**
+   * Set the Starting Sequence Number subfield of the Block Ack Starting Sequence
+   * Control subfield of the Block Ack frame and fill the block ack bitmap.
+   * For Multi-STA Block Acks, <i>index</i> identifies the Per AID TID Info
+   * subfield whose bitmap has to be filled.
+   *
+   * \param blockAckHeader the block ack header
+   * \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
+   */
+  void FillBlockAckBitmap (CtrlBAckResponseHeader *blockAckHeader, std::size_t index = 0) const;
+  /**
+   * This is called when a Block Ack agreement is destroyed to flush the
+   * received packets.
+   */
+  void Flush (void);
+
+private:
+  /**
+   * Pass MSDUs or A-MSDUs up to the next MAC process if they are stored in
+   * the buffer in order of increasing value of the Sequence Number subfield
+   * starting with the MSDU or A-MSDU that has SN=WinStartB.
+   * Set WinStartB to the value of the Sequence Number subfield of the last
+   * MSDU or A-MSDU that was passed up to the next MAC process plus one.
+   */
+  void PassBufferedMpdusUntilFirstLost (void);
+
+  /**
+   * Pass any complete MSDUs or A-MSDUs stored in the buffer with Sequence Number
+   * subfield values that are lower than the new value of WinStartB up to the next
+   * MAC process in order of increasing Sequence Number subfield value.
+   *
+   * \param newWinStartB the new value of WinStartB
+   */
+  void PassBufferedMpdusWithSeqNumberLessThan (uint16_t newWinStartB);
+
+  /// The key of a buffered MPDU is the pair (MPDU sequence number, pointer to WinStartB)
+  typedef std::pair<uint16_t, uint16_t*> Key;
+
+  /// Comparison functor used to sort the buffered MPDUs
+  struct Compare
+  {
+    /**
+     * Functional operator for sorting the buffered MPDUs.
+     *
+     * \param a the key of first buffered MPDU (\see Key)
+     * \param b the key of second buffered MPDU (\see Key)
+     * \return true if first key is smaller than second
+     */
+    bool operator() (const Key& a, const Key& b) const;
+  };
+
+  BlockAckWindow m_scoreboard;                                   ///< recipient's scoreboard
+  uint16_t m_winStartB;                                          ///< starting SN for the reordering buffer
+  std::size_t m_winSizeB;                                        ///< size of the receive reordering buffer
+  std::map<Key, Ptr<WifiMacQueueItem>, Compare> m_bufferedMpdus; ///< buffered MPDUs sorted by Seq Number
+  Ptr<MacRxMiddle> m_rxMiddle;                                   ///< the MAC RX Middle on this station
+};
+
+} //namespace ns3
+
+#endif /* RECIPIENT_BLOCK_ACK_AGREEMENT_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/reference/error-rate-tables.h ns-3.34/src/wifi/model/reference/error-rate-tables.h
--- ns-3.33/src/wifi/model/reference/error-rate-tables.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/reference/error-rate-tables.h	2021-07-14 10:31:07.000000000 -0700
@@ -20,205 +20,170 @@
  *          Sian Jin <sianjin@uw.edu>
  */
 
+// This file contains table data for the TableBasedErrorRateModel.  For more
+// information on the source of this data, see wifi module documentation.
+
 #ifndef ERROR_RATE_TABLES_H
 #define ERROR_RATE_TABLES_H
 
 namespace ns3 {
 
-const uint16_t ERROR_TABLE_BCC_SMALL_FRAME_SIZE = 32;
-const uint16_t ERROR_TABLE_BCC_LARGE_FRAME_SIZE = 1458;
-const uint16_t ERROR_TABLE_LDPC_FRAME_SIZE = 1458;
-const uint8_t ERROR_TABLE_BCC_MAX_NUM_MCS = 9;
-const uint8_t ERROR_TABLE_LDPC_MAX_NUM_MCS = 11;
+const uint16_t ERROR_TABLE_BCC_SMALL_FRAME_SIZE = 32;   //!< reference size (bytes) of small frames for BCC
+const uint16_t ERROR_TABLE_BCC_LARGE_FRAME_SIZE = 1458; //!< reference size (bytes) of large frames for BCC
+const uint16_t ERROR_TABLE_LDPC_FRAME_SIZE = 1458;      //!< reference size (bytes) for LDPC
+const uint8_t ERROR_TABLE_BCC_MAX_NUM_MCS = 9;          //!< maximum number of MCSs for BCC
+const uint8_t ERROR_TABLE_LDPC_MAX_NUM_MCS = 11;        //!< maximum number of MCSs for LDPC
+
+/// Table of SNR (dB) and PER pairs
+typedef std::vector<std::pair<double /* SNR (dB) */, double /* PER */> > SnrPerTable;
 
-static const std::vector<std::pair<double /* SNR (dB) */, double /* PER */> > AwgnErrorTableBcc32 [ERROR_TABLE_BCC_MAX_NUM_MCS + 1] = {
+/// AWGN error table for BCC with reference size of 32 bytes
+static const SnrPerTable AwgnErrorTableBcc32 [ERROR_TABLE_BCC_MAX_NUM_MCS + 1] = {
   // MCS-0
   {
-    {-3.20000, 1.00000}, {-3.00000, 0.99751}, {-2.80000, 0.98526}, {-2.60000, 0.97805}, {-2.40000, 0.95933},
-    {-2.20000, 0.90724}, {-2.00000, 0.87939}, {-1.80000, 0.73985}, {-1.60000, 0.63150}, {-1.40000, 0.57615},
-    {-1.20000, 0.42980}, {-1.00000, 0.34749}, {-0.80000, 0.22253}, {-0.60000, 0.14667}, {-0.40000, 0.10149},
-    {-0.20000, 0.06517}, {0.00000, 0.03774}, {0.20000, 0.02305}, {0.40000, 0.01258}, {0.60000, 0.00725},
-    {0.80000, 0.00388}, {1.00000, 0.00220}, {1.20000, 0.00120}, {1.40000, 0.00042}, {1.60000, 0.00030},
-    {1.80000, 0.00020}, {2.00000, 0.00007}, {2.20000, 0.00003}, {2.40000, 0.00000},
+    {-3.50000, 1.00000}, {-3.00000, 0.99500}, {-2.50000, 0.94080}, {-2.00000, 0.82590},
+    {-1.50000, 0.58950}, {-1.00000, 0.30830}, {-0.50000, 0.12540}, {0.00000, 0.03440},
+    {0.50000, 0.00850}, {1.00000, 0.00150}, {1.50000, 0.00024}, {2.00000, 0.00009},
+    {2.50000, 0.00000},
   },
   // MCS-1
   {
-    {-0.20000, 1.00000}, {0.00000, 0.99504}, {0.20000, 0.99504}, {0.40000, 0.98044}, {0.60000, 0.94799},
-    {0.80000, 0.90519}, {1.00000, 0.84958}, {1.20000, 0.75518}, {1.40000, 0.66281}, {1.60000, 0.53113},
-    {1.80000, 0.41128}, {2.00000, 0.29792}, {2.20000, 0.21889}, {2.40000, 0.15850}, {2.60000, 0.08589},
-    {2.80000, 0.05338}, {3.00000, 0.03401}, {3.20000, 0.02251}, {3.40000, 0.01171}, {3.60000, 0.00653},
-    {3.80000, 0.00340}, {4.00000, 0.00185}, {4.20000, 0.00080}, {4.40000, 0.00042}, {4.60000, 0.00015},
-    {4.80000, 0.00005}, {5.00000, 0.00005}, {5.20000, 0.00000},
+    {-0.50000, 1.00000}, {0.00000, 0.99210}, {0.50000, 0.96710}, {1.00000, 0.83490},
+    {1.50000, 0.58740}, {2.00000, 0.31690}, {2.50000, 0.11820}, {3.00000, 0.03640},
+    {3.50000, 0.00850}, {4.00000, 0.00160}, {4.50000, 0.00026}, {5.00000, 0.00003},
+    {5.50000, 0.00000},
   },
   // MCS-2
   {
-    {2.80000, 1.00000}, {3.00000, 0.96394}, {3.20000, 0.94353}, {3.40000, 0.91553}, {3.60000, 0.81837},
-    {3.80000, 0.71993}, {4.00000, 0.56879}, {4.20000, 0.50695}, {4.40000, 0.35644}, {4.60000, 0.28440},
-    {4.80000, 0.18496}, {5.00000, 0.11938}, {5.20000, 0.08119}, {5.40000, 0.04399}, {5.60000, 0.02675},
-    {5.80000, 0.01540}, {6.00000, 0.00822}, {6.20000, 0.00470}, {6.40000, 0.00205}, {6.60000, 0.00140},
-    {6.80000, 0.00060}, {7.00000, 0.00038}, {7.20000, 0.00015}, {7.40000, 0.00011}, {7.60000, 0.00007},
-    {7.80000, 0.00000},
+    {2.00000, 1.00000}, {2.50000, 0.99400}, {3.00000, 0.95880}, {3.50000, 0.85120},
+    {4.00000, 0.59900}, {4.50000, 0.31250}, {5.00000, 0.11710}, {5.50000, 0.03390},
+    {6.00000, 0.00780}, {6.50000, 0.00160}, {7.00000, 0.00028}, {7.50000, 0.00008},
+    {8.00000, 0.00000},
   },
   // MCS-3
   {
-    {5.60000, 1.00000}, {5.80000, 0.99257}, {6.00000, 0.96860}, {6.20000, 0.95094}, {6.40000, 0.94353},
-    {6.60000, 0.85138}, {6.80000, 0.78474}, {7.00000, 0.69019}, {7.20000, 0.56006}, {7.40000, 0.48547},
-    {7.60000, 0.36257}, {7.80000, 0.25722}, {8.00000, 0.18471}, {8.20000, 0.12046}, {8.40000, 0.08022},
-    {8.60000, 0.05137}, {8.80000, 0.03217}, {9.00000, 0.01752}, {9.20000, 0.01129}, {9.40000, 0.00613},
-    {9.60000, 0.00350}, {9.80000, 0.00200}, {10.00000, 0.00083}, {10.20000, 0.00055}, {10.40000, 0.00028},
-    {10.60000, 0.00005}, {10.80000, 0.00001}, {11.00000, 0.00000},
+    {4.00000, 1.00000}, {4.50000, 0.99900}, {5.00000, 0.99800}, {5.50000, 0.96900},
+    {6.00000, 0.88430}, {6.50000, 0.74090}, {7.00000, 0.46510}, {7.50000, 0.25710},
+    {8.00000, 0.10800}, {8.50000, 0.03810}, {9.00000, 0.01190}, {9.50000, 0.00320},
+    {10.00000, 0.00076}, {10.50000, 0.00017}, {11.00000, 0.00003}, {11.50000, 0.00000},
   },
   // MCS-4
   {
-    {8.40000, 1.00000}, {8.60000, 0.99930}, {8.80000, 0.98937}, {9.00000, 0.97814}, {9.20000, 0.96570},
-    {9.40000, 0.91493}, {9.60000, 0.86559}, {9.80000, 0.83368}, {10.00000, 0.74157}, {10.20000, 0.64457},
-    {10.40000, 0.56077}, {10.60000, 0.42837}, {10.80000, 0.31723}, {11.00000, 0.21704}, {11.20000, 0.15537},
-    {11.40000, 0.10741}, {11.60000, 0.06370}, {11.80000, 0.04047}, {12.00000, 0.02421}, {12.20000, 0.01397},
-    {12.40000, 0.00803}, {12.60000, 0.00444}, {12.80000, 0.00257}, {13.00000, 0.00139}, {13.20000, 0.00082},
-    {13.40000, 0.00063}, {13.60000, 0.00034}, {13.80000, 0.00011}, {14.00000, 0.00005}, {14.20000, 0.00000},
+    {8.00000, 1.00000}, {8.50000, 0.99900}, {9.00000, 0.94790}, {9.50000, 0.79890},
+    {10.00000, 0.59230}, {10.50000, 0.33700}, {11.00000, 0.15720}, {11.50000, 0.05420},
+    {12.00000, 0.01580}, {12.50000, 0.00400}, {13.00000, 0.00110}, {13.50000, 0.00027},
+    {14.00000, 0.00009}, {14.50000, 0.00000},
   },
   // MCS-5
   {
-    {12.00000, 1.00000}, {12.20000, 0.99257}, {12.40000, 0.99012}, {12.60000, 0.95933}, {12.80000, 0.95933},
-    {13.00000, 0.92396}, {13.20000, 0.86237}, {13.40000, 0.78937}, {13.60000, 0.72383}, {13.80000, 0.68547},
-    {14.00000, 0.59673}, {14.20000, 0.46901}, {14.40000, 0.37095}, {14.60000, 0.29616}, {14.80000, 0.21594},
-    {15.00000, 0.16150}, {15.20000, 0.12067}, {15.40000, 0.08217}, {15.60000, 0.05459}, {15.80000, 0.03878},
-    {16.00000, 0.02268}, {16.20000, 0.01605}, {16.40000, 0.00933}, {16.60000, 0.00590}, {16.80000, 0.00355},
-    {17.00000, 0.00248}, {17.20000, 0.00143}, {17.40000, 0.00077}, {17.60000, 0.00065}, {17.80000, 0.00035},
-    {18.00000, 0.00025}, {18.20000, 0.00013}, {18.40000, 0.00009}, {18.60000, 0.00003}, {18.80000, 0.00000},
+    {11.50000, 1.00000}, {12.00000, 0.99800}, {12.50000, 0.96530}, {13.00000, 0.89700},
+    {13.50000, 0.73010}, {14.00000, 0.52570}, {14.50000, 0.30580}, {15.00000, 0.15750},
+    {15.50000, 0.06460}, {16.00000, 0.02410}, {16.50000, 0.00790}, {17.00000, 0.00230},
+    {17.50000, 0.00069}, {18.00000, 0.00018}, {18.50000, 0.00004}, {19.00000, 0.00002},
+    {19.50000, 0.00000},
   },
   // MCS-6
   {
-    {13.40000, 1.00000}, {13.60000, 0.99257}, {13.80000, 0.99012}, {14.00000, 0.95704}, {14.20000, 0.94163},
-    {14.40000, 0.93473}, {14.60000, 0.87174}, {14.80000, 0.80847}, {15.00000, 0.72777}, {15.20000, 0.62461},
-    {15.40000, 0.57948}, {15.60000, 0.47232}, {15.80000, 0.34659}, {16.00000, 0.30402}, {16.20000, 0.20864},
-    {16.40000, 0.16778}, {16.60000, 0.10941}, {16.80000, 0.07152}, {17.00000, 0.04993}, {17.20000, 0.03387},
-    {17.40000, 0.02261}, {17.60000, 0.01324}, {17.80000, 0.00912}, {18.00000, 0.00515}, {18.20000, 0.00382},
-    {18.40000, 0.00190}, {18.60000, 0.00088}, {18.80000, 0.00072}, {19.00000, 0.00045}, {19.20000, 0.00022},
-    {19.40000, 0.00015}, {19.60000, 0.00007}, {19.80000, 0.00003}, {20.00000, 0.00000},
+    {13.00000, 1.00000}, {13.50000, 0.99010}, {14.00000, 0.96250}, {14.50000, 0.83980},
+    {15.00000, 0.68660}, {15.50000, 0.46340}, {16.00000, 0.25200}, {16.50000, 0.11450},
+    {17.00000, 0.04610}, {17.50000, 0.01580}, {18.00000, 0.00490}, {18.50000, 0.00160},
+    {19.00000, 0.00039}, {19.50000, 0.00011}, {20.00000, 0.00002}, {20.50000, 0.00000},
   },
   // MCS-7
   {
-    {14.80000, 1.00000}, {15.00000, 0.98768}, {15.20000, 0.97504}, {15.40000, 0.95476}, {15.60000, 0.94353},
-    {15.80000, 0.91553}, {16.00000, 0.84067}, {16.20000, 0.76820}, {16.40000, 0.67282}, {16.60000, 0.57781},
-    {16.80000, 0.52214}, {17.00000, 0.43921}, {17.20000, 0.32788}, {17.40000, 0.24347}, {17.60000, 0.19123},
-    {17.80000, 0.12722}, {18.00000, 0.08600}, {18.20000, 0.05338}, {18.40000, 0.03655}, {18.60000, 0.02303},
-    {18.80000, 0.01483}, {19.00000, 0.00890}, {19.20000, 0.00543}, {19.40000, 0.00335}, {19.60000, 0.00165},
-    {19.80000, 0.00110}, {20.00000, 0.00065}, {20.20000, 0.00040}, {20.40000, 0.00032}, {20.60000, 0.00028},
-    {20.80000, 0.00010}, {21.00000, 0.00007}, {21.20000, 0.00003}, {21.40000, 0.00000},
+    {14.00000, 1.00000}, {14.50000, 0.99700}, {15.00000, 0.98330}, {15.50000, 0.94260},
+    {16.00000, 0.84830}, {16.50000, 0.63470}, {17.00000, 0.43770}, {17.50000, 0.22260},
+    {18.00000, 0.11110}, {18.50000, 0.04400}, {19.00000, 0.01730}, {19.50000, 0.00530},
+    {20.00000, 0.00190}, {20.50000, 0.00052}, {21.00000, 0.00016}, {21.50000, 0.00004},
+    {22.00000, 0.00000},
   },
   // MCS-8
   {
-    {19.80000, 1.00000}, {20.00000, 0.99012}, {20.20000, 0.96163}, {20.40000, 0.89709}, {20.60000, 0.85501},
-    {20.80000, 0.78782}, {21.00000, 0.70475}, {21.20000, 0.59320}, {21.40000, 0.50062}, {21.60000, 0.37582},
-    {21.80000, 0.29792}, {22.00000, 0.22707}, {22.20000, 0.17262}, {22.40000, 0.14036}, {22.60000, 0.09376},
-    {22.80000, 0.06519}, {23.00000, 0.05036}, {23.20000, 0.03603}, {23.40000, 0.02608}, {23.60000, 0.02247},
-    {23.80000, 0.01413}, {24.00000, 0.01113}, {24.20000, 0.00775}, {24.40000, 0.00580}, {24.60000, 0.00428},
-    {24.80000, 0.00305}, {25.00000, 0.00290}, {25.20000, 0.00180}, {25.40000, 0.00097}, {25.60000, 0.00090},
-    {25.80000, 0.00065}, {26.00000, 0.00032}, {26.20000, 0.00028}, {26.40000, 0.00020}, {26.60000, 0.00018},
-    {26.80000, 0.00015}, {27.00000, 0.00000},
+    {17.50000, 1.00000}, {18.00000, 0.99600}, {18.50000, 0.98040}, {19.00000, 0.92860},
+    {19.50000, 0.82250}, {20.00000, 0.67500}, {20.50000, 0.44140}, {21.00000, 0.26660},
+    {21.50000, 0.13380}, {22.00000, 0.05950}, {22.50000, 0.02450}, {23.00000, 0.00910},
+    {23.50000, 0.00320}, {24.00000, 0.00098}, {24.50000, 0.00033}, {25.00000, 0.00014},
+    {25.50000, 0.00004}, {26.00000, 0.00000},
   },
   // MCS-9
   {
-    {21.60000, 1.00000}, {21.80000, 0.99751}, {22.00000, 0.98768}, {22.20000, 0.96163}, {22.40000, 0.93911},
-    {22.60000, 0.86609}, {22.80000, 0.80040}, {23.00000, 0.66172}, {23.20000, 0.57368}, {23.40000, 0.47625},
-    {23.60000, 0.34629}, {23.80000, 0.25428}, {24.00000, 0.18871}, {24.20000, 0.13644}, {24.40000, 0.10722},
-    {24.60000, 0.08231}, {24.80000, 0.05274}, {25.00000, 0.03870}, {25.20000, 0.02931}, {25.40000, 0.02209},
-    {25.60000, 0.01624}, {25.80000, 0.01290}, {26.00000, 0.00932}, {26.20000, 0.00653}, {26.40000, 0.00532},
-    {26.60000, 0.00380}, {26.80000, 0.00313}, {27.00000, 0.00225}, {27.20000, 0.00153}, {27.40000, 0.00097},
-    {27.60000, 0.00075}, {27.80000, 0.00057}, {28.00000, 0.00047}, {28.20000, 0.00032}, {28.40000, 0.00022},
-    {28.60000, 0.00013}, {28.80000, 0.00007}, {29.00000, 0.00005}, {29.20000, 0.00000},
+    {19.00000, 1.00000}, {19.50000, 0.99800}, {20.00000, 0.98910}, {20.50000, 0.95970},
+    {21.00000, 0.87500}, {21.50000, 0.73170}, {22.00000, 0.51540}, {22.50000, 0.30380},
+    {23.00000, 0.15240}, {23.50000, 0.06340}, {24.00000, 0.02470}, {24.50000, 0.00850},
+    {25.00000, 0.00290}, {25.50000, 0.00100}, {26.00000, 0.00017}, {26.50000, 0.00014},
+    {27.00000, 0.00002}, {27.50000, 0.00000},
   },
 };
 
-static const std::vector<std::pair<double /* SNR (dB) */, double /* PER */> > AwgnErrorTableBcc1458 [ERROR_TABLE_BCC_MAX_NUM_MCS + 1] = {
+/// AWGN error table for BCC with reference size of 1458 bytes
+static const SnrPerTable AwgnErrorTableBcc1458 [ERROR_TABLE_BCC_MAX_NUM_MCS + 1] = {
   // MCS-0
   {
-    {-0.80000, 1.00000}, {-0.60000, 0.99751}, {-0.40000, 0.98284}, {-0.20000, 0.93473}, {0.00000, 0.77713},
-    {0.20000, 0.61598}, {0.40000, 0.39391}, {0.60000, 0.23602}, {0.80000, 0.12170}, {1.00000, 0.06643},
-    {1.20000, 0.03463}, {1.40000, 0.01655}, {1.60000, 0.00670}, {1.80000, 0.00343}, {2.00000, 0.00155},
-    {2.20000, 0.00063}, {2.40000, 0.00032}, {2.60000, 0.00018}, {2.80000, 0.00005}, {3.00000, 0.00000},
+    {-1.00000, 1.00000}, {-0.50000, 0.99400}, {0.00000, 0.81850}, {0.50000, 0.29080},
+    {1.00000, 0.06630}, {1.50000, 0.01120}, {2.00000, 0.00150}, {2.50000, 0.00015},
+    {3.00000, 0.00001}, {3.50000, 0.00000},
   },
   // MCS-1
   {
-    {2.40000, 1.00000}, {2.60000, 0.99504}, {2.80000, 0.93911}, {3.00000, 0.80847}, {3.20000, 0.60850},
-    {3.40000, 0.41255}, {3.60000, 0.23700}, {3.80000, 0.12812}, {4.00000, 0.07167}, {4.20000, 0.03566},
-    {4.40000, 0.01664}, {4.60000, 0.00777}, {4.80000, 0.00443}, {5.00000, 0.00160}, {5.20000, 0.00083},
-    {5.40000, 0.00050}, {5.60000, 0.00022}, {5.80000, 0.00010}, {6.00000, 0.00000},
+    {2.00000, 1.00000}, {2.50000, 0.99700}, {3.00000, 0.79440}, {3.50000, 0.30080},
+    {4.00000, 0.07280}, {4.50000, 0.01200}, {5.00000, 0.00150}, {5.50000, 0.00023},
+    {6.00000, 0.00000},
   },
   // MCS-2
   {
-    {4.80000, 1.00000}, {5.00000, 0.99751}, {5.20000, 0.94575}, {5.40000, 0.86985}, {5.60000, 0.67282},
-    {5.80000, 0.48313}, {6.00000, 0.27809}, {6.20000, 0.19251}, {6.40000, 0.09300}, {6.60000, 0.05184},
-    {6.80000, 0.02559}, {7.00000, 0.01407}, {7.20000, 0.00670}, {7.40000, 0.00360}, {7.60000, 0.00175},
-    {7.80000, 0.00088}, {8.00000, 0.00055}, {8.20000, 0.00025}, {8.40000, 0.00007}, {8.60000, 0.00005},
-    {8.80000, 0.00000},
+    {4.50000, 1.00000}, {5.00000, 0.99800}, {5.50000, 0.75780}, {6.00000, 0.30100},
+    {6.50000, 0.06760}, {7.00000, 0.01220}, {7.50000, 0.00230}, {8.00000, 0.00035},
+    {8.50000, 0.00004}, {9.00000, 0.00000},
   },
   // MCS-3
   {
-    {8.00000, 1.00000}, {8.20000, 0.99751}, {8.40000, 0.97567}, {8.60000, 0.89709}, {8.80000, 0.76820},
-    {9.00000, 0.60392}, {9.20000, 0.38857}, {9.40000, 0.26841}, {9.60000, 0.15543}, {9.80000, 0.08695},
-    {10.00000, 0.04018}, {10.20000, 0.02370}, {10.40000, 0.01189}, {10.60000, 0.00643}, {10.80000, 0.00313},
-    {11.00000, 0.00173}, {11.20000, 0.00090}, {11.40000, 0.00032}, {11.60000, 0.00018}, {11.80000, 0.00005},
-    {12.00000, 0.00003}, {12.20000, 0.00000},
+    {7.50000, 1.00000}, {8.00000, 0.99400}, {8.50000, 0.84050}, {9.00000, 0.43410},
+    {9.50000, 0.14190}, {10.00000, 0.03740}, {10.50000, 0.00860}, {11.00000, 0.00190},
+    {11.50000, 0.00036}, {12.00000, 0.00005}, {12.50000, 0.00000},
   },
   // MCS-4
   {
-    {11.20000, 1.00000}, {11.40000, 0.99012}, {11.60000, 0.94131}, {11.80000, 0.80200}, {12.00000, 0.66391},
-    {12.20000, 0.43730}, {12.40000, 0.28911}, {12.60000, 0.17115}, {12.80000, 0.10219}, {13.00000, 0.05927},
-    {13.20000, 0.03395}, {13.40000, 0.01924}, {13.60000, 0.01083}, {13.80000, 0.00588}, {14.00000, 0.00265},
-    {14.20000, 0.00145}, {14.40000, 0.00068}, {14.60000, 0.00035}, {14.80000, 0.00018}, {15.00000, 0.00005},
-    {15.20000, 0.00000},
+    {11.00000, 1.00000}, {11.50000, 0.92690}, {12.00000, 0.51390}, {12.50000, 0.18260},
+    {13.00000, 0.04650}, {13.50000, 0.01100}, {14.00000, 0.00260}, {14.50000, 0.00041},
+    {15.00000, 0.00010}, {15.50000, 0.00000},
   },
   // MCS-5
   {
-    {15.00000, 1.00000}, {15.20000, 0.99257}, {15.40000, 0.96394}, {15.60000, 0.92184}, {15.80000, 0.81010},
-    {16.00000, 0.65846}, {16.20000, 0.50631}, {16.40000, 0.37938}, {16.60000, 0.23672}, {16.80000, 0.15382},
-    {17.00000, 0.10256}, {17.20000, 0.06430}, {17.40000, 0.03643}, {17.60000, 0.02224}, {17.80000, 0.01320},
-    {18.00000, 0.00790}, {18.20000, 0.00453}, {18.40000, 0.00273}, {18.60000, 0.00115}, {18.80000, 0.00070},
-    {19.00000, 0.00052}, {19.20000, 0.00025}, {19.40000, 0.00015}, {19.60000, 0.00010}, {19.80000, 0.00003},
-    {20.00000, 0.00000},
+    {14.50000, 1.00000}, {15.00000, 0.99900}, {15.50000, 0.94790}, {16.00000, 0.66250},
+    {16.50000, 0.29780}, {17.00000, 0.10580}, {17.50000, 0.03340}, {18.00000, 0.00910},
+    {18.50000, 0.00230}, {19.00000, 0.00064}, {19.50000, 0.00017}, {20.00000, 0.00002},
+    {20.50000, 0.00000},
   },
   // MCS-6
   {
-    {16.00000, 1.00000}, {16.20000, 0.99751}, {16.40000, 0.99751}, {16.60000, 0.99012}, {16.80000, 0.93911},
-    {17.00000, 0.89509}, {17.20000, 0.76967}, {17.40000, 0.60483}, {17.60000, 0.45881}, {17.80000, 0.31109},
-    {18.00000, 0.20470}, {18.20000, 0.12686}, {18.40000, 0.08283}, {18.60000, 0.05102}, {18.80000, 0.03264},
-    {19.00000, 0.01910}, {19.20000, 0.01107}, {19.40000, 0.00677}, {19.60000, 0.00445}, {19.80000, 0.00228},
-    {20.00000, 0.00110}, {20.20000, 0.00050}, {20.40000, 0.00038}, {20.60000, 0.00015}, {20.80000, 0.00010},
-    {21.00000, 0.00007}, {21.20000, 0.00003}, {21.40000, 0.00000},
+    {16.00000, 1.00000}, {16.50000, 0.99500}, {17.00000, 0.87960}, {17.50000, 0.51390},
+    {18.00000, 0.20910}, {18.50000, 0.06390}, {19.00000, 0.01860}, {19.50000, 0.00460},
+    {20.00000, 0.00130}, {20.50000, 0.00023}, {21.00000, 0.00002}, {21.50000, 0.00000},
   },
   // MCS-7
   {
-    {17.80000, 1.00000}, {18.00000, 0.98284}, {18.20000, 0.91972}, {18.40000, 0.78937}, {18.60000, 0.65203},
-    {18.80000, 0.48902}, {19.00000, 0.32869}, {19.20000, 0.21817}, {19.40000, 0.14835}, {19.60000, 0.08870},
-    {19.80000, 0.05506}, {20.00000, 0.03440}, {20.20000, 0.02175}, {20.40000, 0.01328}, {20.60000, 0.00673},
-    {20.80000, 0.00415}, {21.00000, 0.00285}, {21.20000, 0.00150}, {21.40000, 0.00090}, {21.60000, 0.00040},
-    {21.80000, 0.00032}, {22.00000, 0.00010}, {22.20000, 0.00007}, {22.40000, 0.00005}, {22.60000, 0.00000},
+    {17.50000, 1.00000}, {18.00000, 0.97850}, {18.50000, 0.73930}, {19.00000, 0.33750},
+    {19.50000, 0.12340}, {20.00000, 0.03550}, {20.50000, 0.01000}, {21.00000, 0.00270},
+    {21.50000, 0.00050}, {22.00000, 0.00009}, {22.50000, 0.00001}, {23.00000, 0.00000},
   },
   // MCS-8
   {
-    {20.80000, 1.00000}, {21.00000, 0.99257}, {21.20000, 0.98768}, {21.40000, 0.96394}, {21.60000, 0.90930},
-    {21.80000, 0.80522}, {22.00000, 0.67966}, {22.20000, 0.59584}, {22.40000, 0.44605}, {22.60000, 0.35330},
-    {22.80000, 0.25955}, {23.00000, 0.19391}, {23.20000, 0.15323}, {23.40000, 0.09721}, {23.60000, 0.07040},
-    {23.80000, 0.04871}, {24.00000, 0.03459}, {24.20000, 0.02438}, {24.40000, 0.01740}, {24.60000, 0.01167},
-    {24.80000, 0.00822}, {25.00000, 0.00570}, {25.20000, 0.00420}, {25.40000, 0.00293}, {25.60000, 0.00185},
-    {25.80000, 0.00143}, {26.00000, 0.00100}, {26.20000, 0.00085}, {26.40000, 0.00068}, {26.60000, 0.00047},
-    {26.80000, 0.00040}, {27.00000, 0.00020}, {27.20000, 0.00000},
+    {21.00000, 1.00000}, {21.50000, 0.99800}, {22.00000, 0.93990}, {22.50000, 0.67090},
+    {23.00000, 0.35250}, {23.50000, 0.13760}, {24.00000, 0.04750}, {24.50000, 0.01540},
+    {25.00000, 0.00520}, {25.50000, 0.00150}, {26.00000, 0.00036}, {26.50000, 0.00007},
+    {27.00000, 0.00000},
   },
   // MCS-9
   {
-    {22.80000, 1.00000}, {23.00000, 0.99751}, {23.20000, 0.98526}, {23.40000, 0.93473}, {23.60000, 0.83195},
-    {23.80000, 0.71352}, {24.00000, 0.58200}, {24.20000, 0.43682}, {24.40000, 0.30356}, {24.60000, 0.21375},
-    {24.80000, 0.15621}, {25.00000, 0.10932}, {25.20000, 0.06856}, {25.40000, 0.04815}, {25.60000, 0.03408},
-    {25.80000, 0.02385}, {26.00000, 0.01641}, {26.20000, 0.01043}, {26.40000, 0.00685}, {26.60000, 0.00480},
-    {26.80000, 0.00360}, {27.00000, 0.00240}, {27.20000, 0.00168}, {27.40000, 0.00108}, {27.60000, 0.00072},
-    {27.80000, 0.00055}, {28.00000, 0.00035}, {28.20000, 0.00020}, {28.40000, 0.00015}, {28.60000, 0.00008},
-    {28.80000, 0.00000},
+    {22.50000, 1.00000}, {23.00000, 0.99900}, {23.50000, 0.95060}, {24.00000, 0.68470},
+    {24.50000, 0.32610}, {25.00000, 0.12480}, {25.50000, 0.04090}, {26.00000, 0.01300},
+    {26.50000, 0.00360}, {27.00000, 0.00082}, {27.50000, 0.00010}, {28.00000, 0.00002},
+    {28.50000, 0.00001}, {29.00000, 0.00000},
   },
 };
 
-static const std::vector<std::pair<double /* SNR (dB) */, double /* PER */> > AwgnErrorTableLdpc1458 [ERROR_TABLE_LDPC_MAX_NUM_MCS + 1] = {
+/// AWGN error table for LDPC with reference size of 1458 bytes
+static const SnrPerTable AwgnErrorTableLdpc1458 [ERROR_TABLE_LDPC_MAX_NUM_MCS + 1] = {
   // MCS-0
   {
     {-1.50000, 1.00000}, {-1.25000, 0.97950}, {-1.00000, 0.60480}, {-0.75000, 0.17050},
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/regular-wifi-mac.cc ns-3.34/src/wifi/model/regular-wifi-mac.cc
--- ns-3.33/src/wifi/model/regular-wifi-mac.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/regular-wifi-mac.cc	2021-07-14 10:31:07.000000000 -0700
@@ -25,17 +25,18 @@
 #include "wifi-phy.h"
 #include "mac-rx-middle.h"
 #include "mac-tx-middle.h"
-#include "mac-low.h"
 #include "msdu-aggregator.h"
 #include "mpdu-aggregator.h"
 #include "mgt-headers.h"
 #include "amsdu-subframe-header.h"
 #include "wifi-net-device.h"
-#include "ht-configuration.h"
-#include "vht-configuration.h"
-#include "he-configuration.h"
+#include "ns3/ht-configuration.h"
+#include "ns3/vht-configuration.h"
+#include "ns3/he-configuration.h"
 #include <algorithm>
 #include <cmath>
+#include "ns3/he-frame-exchange-manager.h"
+#include "channel-access-manager.h"
 
 namespace ns3 {
 
@@ -54,20 +55,13 @@
 
   m_txMiddle = Create<MacTxMiddle> ();
 
-  m_low = CreateObject<MacLow> ();
-  m_low->SetRxCallback (MakeCallback (&MacRxMiddle::Receive, m_rxMiddle));
-  m_low->SetMac (this);
-
   m_channelAccessManager = CreateObject<ChannelAccessManager> ();
-  m_channelAccessManager->SetupLow (m_low);
 
   m_txop = CreateObject<Txop> ();
-  m_txop->SetMacLow (m_low);
   m_txop->SetChannelAccessManager (m_channelAccessManager);
   m_txop->SetTxMiddle (m_txMiddle);
-  m_txop->SetTxOkCallback (MakeCallback (&RegularWifiMac::TxOk, this));
-  m_txop->SetTxFailedCallback (MakeCallback (&RegularWifiMac::TxFailed, this));
-  m_txop->SetTxDroppedCallback (MakeCallback (&RegularWifiMac::NotifyTxDrop, this));
+  m_txop->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
+                                                &m_droppedMpduCallback));
 
   //Construct the EDCAFs. The ordering is important - highest
   //priority (Table 9-1 UP-to-AC mapping; IEEE 802.11-2012) must be created
@@ -103,11 +97,13 @@
   m_rxMiddle = 0;
   m_txMiddle = 0;
 
-  m_low->Dispose ();
-  m_low = 0;
-
   m_phy = 0;
   m_stationManager = 0;
+  if (m_feManager != 0)
+    {
+      m_feManager->Dispose ();
+    }
+  m_feManager = 0;
 
   m_txop->Dispose ();
   m_txop = 0;
@@ -125,11 +121,67 @@
 }
 
 void
+RegularWifiMac::SetupFrameExchangeManager (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  if (GetHeSupported ())
+    {
+      m_feManager = CreateObject<HeFrameExchangeManager> ();
+    }
+  else if (GetVhtSupported ())
+    {
+      m_feManager = CreateObject<VhtFrameExchangeManager> ();
+    }
+  else if (GetHtSupported ())
+    {
+      m_feManager = CreateObject<HtFrameExchangeManager> ();
+    }
+  else if (GetQosSupported ())
+    {
+      m_feManager = CreateObject<QosFrameExchangeManager> ();
+    }
+  else
+    {
+      m_feManager = CreateObject<FrameExchangeManager> ();
+    }
+
+  m_feManager->SetWifiMac (this);
+  m_feManager->SetMacTxMiddle (m_txMiddle);
+  m_feManager->SetMacRxMiddle (m_rxMiddle);
+  m_feManager->SetAddress (GetAddress ());
+  m_feManager->SetBssid (GetBssid ());
+  m_feManager->GetWifiTxTimer ().SetMpduResponseTimeoutCallback (MakeCallback (&MpduResponseTimeoutTracedCallback::operator(),
+                                                                               &m_mpduResponseTimeoutCallback));
+  m_feManager->GetWifiTxTimer ().SetPsduResponseTimeoutCallback (MakeCallback (&PsduResponseTimeoutTracedCallback::operator(),
+                                                                               &m_psduResponseTimeoutCallback));
+  m_feManager->GetWifiTxTimer ().SetPsduMapResponseTimeoutCallback (MakeCallback (&PsduMapResponseTimeoutTracedCallback::operator(),
+                                                                                  &m_psduMapResponseTimeoutCallback));
+  m_feManager->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
+                                                     &m_droppedMpduCallback));
+  m_feManager->SetAckedMpduCallback (MakeCallback (&MpduTracedCallback::operator(),
+                                                   &m_ackedMpduCallback));
+  m_channelAccessManager->SetupFrameExchangeManager (m_feManager);
+  if (GetQosSupported ())
+    {
+      for (const auto& pair : m_edca)
+        {
+          pair.second->SetQosFrameExchangeManager (DynamicCast<QosFrameExchangeManager> (m_feManager));
+        }
+    }
+}
+
+Ptr<FrameExchangeManager>
+RegularWifiMac::GetFrameExchangeManager (void) const
+{
+  return m_feManager;
+}
+
+void
 RegularWifiMac::SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> stationManager)
 {
   NS_LOG_FUNCTION (this << stationManager);
   m_stationManager = stationManager;
-  m_low->SetWifiRemoteStationManager (stationManager);
   m_txop->SetWifiRemoteStationManager (stationManager);
   for (EdcaQueues::const_iterator i = m_edca.begin (); i != m_edca.end (); ++i)
     {
@@ -162,14 +214,12 @@
   if (GetHtSupported ())
     {
       Ptr<HtConfiguration> htConfiguration = GetHtConfiguration ();
-      bool greenfieldSupported = htConfiguration->GetGreenfieldSupported ();
       bool sgiSupported = htConfiguration->GetShortGuardIntervalSupported ();
       capabilities.SetHtSupported (1);
       capabilities.SetLdpc (htConfiguration->GetLdpcSupported ());
       capabilities.SetSupportedChannelWidth (m_phy->GetChannelWidth () >= 40);
       capabilities.SetShortGuardInterval20 (sgiSupported);
       capabilities.SetShortGuardInterval40 (m_phy->GetChannelWidth () >= 40 && sgiSupported);
-      capabilities.SetGreenfield (greenfieldSupported);
       // Set Maximum A-MSDU Length subfield
       uint16_t maxAmsduSize = std::max ({m_voMaxAmsduSize, m_viMaxAmsduSize,
                                          m_beMaxAmsduSize, m_bkMaxAmsduSize});
@@ -188,15 +238,10 @@
       // The maximum A-MPDU length in HT capabilities elements ranges from 2^13-1 to 2^16-1
       capabilities.SetMaxAmpduLength (std::min (std::max (maxAmpduLength, 8191u), 65535u));
 
-      capabilities.SetLSigProtectionSupport (!greenfieldSupported);
+      capabilities.SetLSigProtectionSupport (true);
       uint64_t maxSupportedRate = 0; //in bit/s
-      for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HT))
         {
-          WifiMode mcs = m_phy->GetMcs (i);
-          if (mcs.GetModulationClass () != WIFI_MOD_CLASS_HT)
-            {
-              continue;
-            }
           capabilities.SetRxMcsBitmask (mcs.GetMcsValue ());
           uint8_t nss = (mcs.GetMcsValue () / 8) + 1;
           NS_ASSERT (nss > 0 && nss < 5);
@@ -262,11 +307,9 @@
       capabilities.SetShortGuardIntervalFor80Mhz ((m_phy->GetChannelWidth () == 80) && sgiSupported);
       capabilities.SetShortGuardIntervalFor160Mhz ((m_phy->GetChannelWidth () == 160) && sgiSupported);
       uint8_t maxMcs = 0;
-      for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_VHT))
         {
-          WifiMode mcs = m_phy->GetMcs (i);
-          if ((mcs.GetModulationClass () == WIFI_MOD_CLASS_VHT)
-              && (mcs.GetMcsValue () > maxMcs))
+          if (mcs.GetMcsValue () > maxMcs)
             {
               maxMcs = mcs.GetMcsValue ();
             }
@@ -281,10 +324,9 @@
           capabilities.SetTxMcsMap (maxMcs, nss);
         }
       uint64_t maxSupportedRateLGI = 0; //in bit/s
-      for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_VHT))
         {
-          WifiMode mcs = m_phy->GetMcs (i);
-          if (mcs.GetModulationClass () != WIFI_MOD_CLASS_VHT || !mcs.IsAllowed (m_phy->GetChannelWidth (), 1))
+          if (!mcs.IsAllowed (m_phy->GetChannelWidth (), 1))
             {
               continue;
             }
@@ -347,11 +389,9 @@
       capabilities.SetMaxAmpduLength (std::min (std::max (maxAmpduLength, 1048575u), 8388607u));
 
       uint8_t maxMcs = 0;
-      for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HE))
         {
-          WifiMode mcs = m_phy->GetMcs (i);
-          if ((mcs.GetModulationClass () == WIFI_MOD_CLASS_HE)
-              && (mcs.GetMcsValue () > maxMcs))
+          if (mcs.GetMcsValue () > maxMcs)
             {
               maxMcs = mcs.GetMcsValue ();
             }
@@ -428,14 +468,15 @@
   NS_ASSERT (m_edca.find (ac) == m_edca.end ());
 
   Ptr<QosTxop> edca = CreateObject<QosTxop> ();
-  edca->SetMacLow (m_low);
   edca->SetChannelAccessManager (m_channelAccessManager);
   edca->SetTxMiddle (m_txMiddle);
-  edca->SetTxOkCallback (MakeCallback (&RegularWifiMac::TxOk, this));
-  edca->SetTxFailedCallback (MakeCallback (&RegularWifiMac::TxFailed, this));
-  edca->SetTxDroppedCallback (MakeCallback (&RegularWifiMac::NotifyTxDrop, this));
+  edca->GetBaManager ()->SetTxOkCallback (MakeCallback (&MpduTracedCallback::operator(),
+                                                        &m_ackedMpduCallback));
+  edca->GetBaManager ()->SetTxFailedCallback (MakeCallback (&MpduTracedCallback::operator(),
+                                                            &m_nackedMpduCallback));
+  edca->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
+                                              &m_droppedMpduCallback));
   edca->SetAccessCategory (ac);
-  edca->CompleteConfig ();
 
   m_edca.insert (std::make_pair (ac, edca));
 }
@@ -444,10 +485,13 @@
 RegularWifiMac::SetTypeOfStation (TypeOfStation type)
 {
   NS_LOG_FUNCTION (this << type);
-  for (EdcaQueues::const_iterator i = m_edca.begin (); i != m_edca.end (); ++i)
-    {
-      i->second->SetTypeOfStation (type);
-    }
+  m_typeOfStation = type;
+}
+
+TypeOfStation
+RegularWifiMac::GetTypeOfStation (void) const
+{
+  return m_typeOfStation;
 }
 
 Ptr<Txop>
@@ -457,6 +501,18 @@
 }
 
 Ptr<QosTxop>
+RegularWifiMac::GetQosTxop (AcIndex ac) const
+{
+  return m_edca.find (ac)->second;
+}
+
+Ptr<QosTxop>
+RegularWifiMac::GetQosTxop (uint8_t tid) const
+{
+  return GetQosTxop (QosUtilsMapTidToAc (tid));
+}
+
+Ptr<QosTxop>
 RegularWifiMac::GetVOQueue () const
 {
   return m_edca.find (AC_VO)->second;
@@ -486,7 +542,8 @@
   NS_LOG_FUNCTION (this << phy);
   m_phy = phy;
   m_channelAccessManager->SetupPhyListener (phy);
-  m_low->SetPhy (phy);
+  NS_ASSERT (m_feManager != 0);
+  m_feManager->SetWifiPhy (phy);
 }
 
 Ptr<WifiPhy>
@@ -500,7 +557,8 @@
 RegularWifiMac::ResetWifiPhy (void)
 {
   NS_LOG_FUNCTION (this);
-  m_low->ResetPhy ();
+  NS_ASSERT (m_feManager != 0);
+  m_feManager->ResetPhy ();
   m_channelAccessManager->RemovePhyListener (m_phy);
   m_phy = 0;
 }
@@ -603,20 +661,20 @@
 RegularWifiMac::SetCtsToSelfSupported (bool enable)
 {
   NS_LOG_FUNCTION (this);
-  m_low->SetCtsToSelfSupported (enable);
+  m_ctsToSelfSupported = enable;
 }
 
 void
 RegularWifiMac::SetAddress (Mac48Address address)
 {
   NS_LOG_FUNCTION (this << address);
-  m_low->SetAddress (address);
+  m_address = address;
 }
 
 Mac48Address
 RegularWifiMac::GetAddress (void) const
 {
-  return m_low->GetAddress ();
+  return m_address;
 }
 
 void
@@ -636,19 +694,24 @@
 RegularWifiMac::SetBssid (Mac48Address bssid)
 {
   NS_LOG_FUNCTION (this << bssid);
-  m_low->SetBssid (bssid);
+  m_bssid = bssid;
+  if (m_feManager)
+    {
+      m_feManager->SetBssid (bssid);
+    }
 }
 
 Mac48Address
 RegularWifiMac::GetBssid (void) const
 {
-  return m_low->GetBssid ();
+  return m_bssid;
 }
 
 void
 RegularWifiMac::SetPromisc (void)
 {
-  m_low->SetPromisc ();
+  NS_ASSERT (m_feManager != 0);
+  m_feManager->SetPromisc ();
 }
 
 void
@@ -733,7 +796,12 @@
                 //We've received an ADDBA Request. Our policy here is
                 //to automatically accept it, so we get the ADDBA
                 //Response on it's way immediately.
-                SendAddBaResponse (&reqHdr, from);
+                NS_ASSERT (m_feManager != 0);
+                Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (m_feManager);
+                if (htFem != 0)
+                  {
+                    htFem->SendAddBaResponse (&reqHdr, from);
+                  }
                 //This frame is now completely dealt with, so we're done.
                 return;
               }
@@ -762,9 +830,14 @@
                   {
                     //This DELBA frame was sent by the originator, so
                     //this means that an ingoing established
-                    //agreement exists in MacLow and we need to
+                    //agreement exists in HtFrameExchangeManager and we need to
                     //destroy it.
-                    m_low->DestroyBlockAckAgreement (from, delBaHdr.GetTid ());
+                    NS_ASSERT (m_feManager != 0);
+                    Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (m_feManager);
+                    if (htFem != 0)
+                      {
+                        htFem->DestroyBlockAckAgreement (from, delBaHdr.GetTid ());
+                      }
                   }
                 else
                   {
@@ -800,67 +873,6 @@
     }
 }
 
-void
-RegularWifiMac::SendAddBaResponse (const MgtAddBaRequestHeader *reqHdr,
-                                   Mac48Address originator)
-{
-  NS_LOG_FUNCTION (this);
-  WifiMacHeader hdr;
-  hdr.SetType (WIFI_MAC_MGT_ACTION);
-  hdr.SetAddr1 (originator);
-  hdr.SetAddr2 (GetAddress ());
-  hdr.SetAddr3 (GetBssid ());
-  hdr.SetDsNotFrom ();
-  hdr.SetDsNotTo ();
-
-  MgtAddBaResponseHeader respHdr;
-  StatusCode code;
-  code.SetSuccess ();
-  respHdr.SetStatusCode (code);
-  //Here a control about queues type?
-  respHdr.SetAmsduSupport (reqHdr->IsAmsduSupported ());
-
-  if (reqHdr->IsImmediateBlockAck ())
-    {
-      respHdr.SetImmediateBlockAck ();
-    }
-  else
-    {
-      respHdr.SetDelayedBlockAck ();
-    }
-  respHdr.SetTid (reqHdr->GetTid ());
-
-  Ptr<HeConfiguration> heConfiguration = GetHeConfiguration ();
-  if (heConfiguration && heConfiguration->GetMpduBufferSize () > 64)
-    {
-      respHdr.SetBufferSize (255);
-    }
-  else
-    {
-      respHdr.SetBufferSize (63);
-    }
-  respHdr.SetTimeout (reqHdr->GetTimeout ());
-
-  WifiActionHeader actionHdr;
-  WifiActionHeader::ActionValue action;
-  action.blockAck = WifiActionHeader::BLOCK_ACK_ADDBA_RESPONSE;
-  actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
-
-  Ptr<Packet> packet = Create<Packet> ();
-  packet->AddHeader (respHdr);
-  packet->AddHeader (actionHdr);
-
-  //We need to notify our MacLow object as it will have to buffer all
-  //correctly received packets for this Block Ack session
-  m_low->CreateBlockAckAgreement (&respHdr, originator,
-                                  reqHdr->GetStartingSequence ());
-
-  //It is unclear which queue this frame should go into. For now we
-  //bung it into the queue corresponding to the TID for which we are
-  //establishing an agreement, and push it to the head.
-  m_edca[QosUtilsMapTidToAc (reqHdr->GetTid ())]->PushFront (packet, hdr);
-}
-
 TypeId
 RegularWifiMac::GetTypeId (void)
 {
@@ -908,32 +920,32 @@
                    MakeUintegerChecker<uint16_t> (0, 11398))
     .AddAttribute ("VO_MaxAmpduSize",
                    "Maximum length in bytes of an A-MPDU for AC_VO access class "
-                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 8388607 for HE PPDUs). "
+                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
                    "Value 0 means A-MPDU aggregation is disabled for that AC.",
                    UintegerValue (0),
                    MakeUintegerAccessor (&RegularWifiMac::m_voMaxAmpduSize),
-                   MakeUintegerChecker<uint32_t> ())
+                   MakeUintegerChecker<uint32_t> (0, 6500631))
     .AddAttribute ("VI_MaxAmpduSize",
                    "Maximum length in bytes of an A-MPDU for AC_VI access class "
-                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 8388607 for HE PPDUs). "
+                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
                    "Value 0 means A-MPDU aggregation is disabled for that AC.",
                    UintegerValue (65535),
                    MakeUintegerAccessor (&RegularWifiMac::m_viMaxAmpduSize),
-                   MakeUintegerChecker<uint32_t> ())
+                   MakeUintegerChecker<uint32_t> (0, 6500631))
     .AddAttribute ("BE_MaxAmpduSize",
                    "Maximum length in bytes of an A-MPDU for AC_BE access class "
-                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 8388607 for HE PPDUs). "
+                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
                    "Value 0 means A-MPDU aggregation is disabled for that AC.",
                    UintegerValue (65535),
                    MakeUintegerAccessor (&RegularWifiMac::m_beMaxAmpduSize),
-                   MakeUintegerChecker<uint32_t> ())
+                   MakeUintegerChecker<uint32_t> (0, 6500631))
     .AddAttribute ("BK_MaxAmpduSize",
                    "Maximum length in bytes of an A-MPDU for AC_BK access class "
-                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 8388607 for HE PPDUs). "
+                   "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
                    "Value 0 means A-MPDU aggregation is disabled for that AC.",
                    UintegerValue (0),
                    MakeUintegerAccessor (&RegularWifiMac::m_bkMaxAmpduSize),
-                   MakeUintegerChecker<uint32_t> ())
+                   MakeUintegerChecker<uint32_t> (0, 6500631))
     .AddAttribute ("VO_BlockAckThreshold",
                    "If number of packets in VO queue reaches this value, "
                    "block ack mechanism is used. If this value is 0, block ack is never used."
@@ -1028,11 +1040,56 @@
     .AddTraceSource ("TxOkHeader",
                      "The header of successfully transmitted packet.",
                      MakeTraceSourceAccessor (&RegularWifiMac::m_txOkCallback),
-                     "ns3::WifiMacHeader::TracedCallback")
+                     "ns3::WifiMacHeader::TracedCallback",
+                     TypeId::OBSOLETE,
+                     "Use the AckedMpdu trace instead.")
     .AddTraceSource ("TxErrHeader",
                      "The header of unsuccessfully transmitted packet.",
                      MakeTraceSourceAccessor (&RegularWifiMac::m_txErrCallback),
-                     "ns3::WifiMacHeader::TracedCallback")
+                     "ns3::WifiMacHeader::TracedCallback",
+                     TypeId::OBSOLETE,
+                     "Depending on the failure type, use the NAckedMpdu trace, the "
+                     "DroppedMpdu trace or one of the traces associated with TX timeouts.")
+    .AddTraceSource ("AckedMpdu",
+                     "An MPDU that was successfully acknowledged, via either a "
+                     "Normal Ack or a Block Ack.",
+                     MakeTraceSourceAccessor (&RegularWifiMac::m_ackedMpduCallback),
+                     "ns3::WifiMacQueueItem::TracedCallback")
+    .AddTraceSource ("NAckedMpdu",
+                     "An MPDU that was negatively acknowledged via a Block Ack.",
+                     MakeTraceSourceAccessor (&RegularWifiMac::m_nackedMpduCallback),
+                     "ns3::WifiMacQueueItem::TracedCallback")
+    .AddTraceSource ("DroppedMpdu",
+                     "An MPDU that was dropped for the given reason (see WifiMacDropReason).",
+                     MakeTraceSourceAccessor (&RegularWifiMac::m_droppedMpduCallback),
+                     "ns3::RegularWifiMac::DroppedMpduCallback")
+    .AddTraceSource ("MpduResponseTimeout",
+                     "An MPDU whose response was not received before the timeout, along with "
+                     "an identifier of the type of timeout (see WifiTxTimer::Reason) and the "
+                     "TXVECTOR used to transmit the MPDU. This trace source is fired when a "
+                     "CTS is missing after an RTS or a Normal Ack is missing after an MPDU "
+                     "or after a DL MU PPDU acknowledged in SU format.",
+                     MakeTraceSourceAccessor (&RegularWifiMac::m_mpduResponseTimeoutCallback),
+                     "ns3::RegularWifiMac::MpduResponseTimeoutCallback")
+    .AddTraceSource ("PsduResponseTimeout",
+                     "A PSDU whose response was not received before the timeout, along with "
+                     "an identifier of the type of timeout (see WifiTxTimer::Reason) and the "
+                     "TXVECTOR used to transmit the PSDU. This trace source is fired when a "
+                     "BlockAck is missing after an A-MPDU, a BlockAckReq (possibly in the "
+                     "context of the acknowledgment of a DL MU PPDU in SU format) or a TB PPDU "
+                     "(in the latter case the missing BlockAck is a Multi-STA BlockAck).",
+                     MakeTraceSourceAccessor (&RegularWifiMac::m_psduResponseTimeoutCallback),
+                     "ns3::RegularWifiMac::PsduResponseTimeoutCallback")
+    .AddTraceSource ("PsduMapResponseTimeout",
+                     "A PSDU map for which not all the responses were received before the timeout, "
+                     "along with an identifier of the type of timeout (see WifiTxTimer::Reason), "
+                     "the set of MAC addresses of the stations that did not respond and the total "
+                     "number of stations that had to respond. This trace source is fired when not "
+                     "all the addressed stations responded to an MU-BAR Trigger frame (either sent as "
+                     "a SU frame or aggregated to PSDUs in the DL MU PPDU), a Basic Trigger Frame or "
+                     "a BSRP Trigger Frame.",
+                     MakeTraceSourceAccessor (&RegularWifiMac::m_psduMapResponseTimeoutCallback),
+                     "ns3::RegularWifiMac::PsduMapResponseTimeoutCallback")
   ;
   return tid;
 }
@@ -1050,7 +1107,6 @@
     case WIFI_STANDARD_80211ax_5GHZ:
     case WIFI_STANDARD_80211ax_6GHZ:
       {
-        EnableAggregation ();
         SetQosSupported (true);
         cwmin = 15;
         cwmax = 1023;
@@ -1059,12 +1115,10 @@
     case WIFI_STANDARD_80211ax_2_4GHZ:
     case WIFI_STANDARD_80211n_2_4GHZ:
       {
-        EnableAggregation ();
         SetQosSupported (true);
       }
     case WIFI_STANDARD_80211g:
       SetErpSupported (true);
-    case WIFI_STANDARD_holland:
     case WIFI_STANDARD_80211a:
     case WIFI_STANDARD_80211p:
       cwmin = 15;
@@ -1079,6 +1133,7 @@
       NS_FATAL_ERROR ("Unsupported WifiPhyStandard in RegularWifiMac::FinishConfigureStandard ()");
     }
 
+  SetupFrameExchangeManager ();
   ConfigureContentionWindow (cwmin, cwmax);
 }
 
@@ -1097,44 +1152,4 @@
     }
 }
 
-void
-RegularWifiMac::TxOk (const WifiMacHeader &hdr)
-{
-  NS_LOG_FUNCTION (this << hdr);
-  m_txOkCallback (hdr);
-}
-
-void
-RegularWifiMac::TxFailed (const WifiMacHeader &hdr)
-{
-  NS_LOG_FUNCTION (this << hdr);
-  m_txErrCallback (hdr);
-}
-
-void
-RegularWifiMac::EnableAggregation (void)
-{
-  NS_LOG_FUNCTION (this);
-  if (m_low->GetMsduAggregator () == 0)
-    {
-      Ptr<MsduAggregator> msduAggregator = CreateObject<MsduAggregator> ();
-      msduAggregator->SetEdcaQueues (m_edca);
-      m_low->SetMsduAggregator (msduAggregator);
-    }
-  if (m_low->GetMpduAggregator () == 0)
-    {
-      Ptr<MpduAggregator> mpduAggregator = CreateObject<MpduAggregator> ();
-      mpduAggregator->SetEdcaQueues (m_edca);
-      m_low->SetMpduAggregator (mpduAggregator);
-    }
-}
-
-void
-RegularWifiMac::DisableAggregation (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_low->SetMsduAggregator (0);
-  m_low->SetMpduAggregator (0);
-}
-
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/regular-wifi-mac.h ns-3.34/src/wifi/model/regular-wifi-mac.h
--- ns-3.33/src/wifi/model/regular-wifi-mac.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/regular-wifi-mac.h	2021-07-14 10:31:07.000000000 -0700
@@ -24,14 +24,20 @@
 #include "wifi-mac.h"
 #include "qos-txop.h"
 #include "ssid.h"
+#include <set>
+#include <unordered_map>
 
 namespace ns3 {
 
-class MacLow;
 class MacRxMiddle;
 class MacTxMiddle;
 class ChannelAccessManager;
 class ExtendedCapabilities;
+class FrameExchangeManager;
+class WifiPsdu;
+enum WifiTxTimerReason : uint8_t;
+
+typedef std::unordered_map <uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */> WifiPsduMap;
 
 /**
  * \brief base class for all MAC-level wifi objects.
@@ -54,38 +60,36 @@
   virtual ~RegularWifiMac ();
 
   // Implementations of pure virtual methods.
-  void SetShortSlotTimeSupported (bool enable);
-  void SetSsid (Ssid ssid);
-  void SetAddress (Mac48Address address);
-  void SetPromisc (void);
-  bool GetShortSlotTimeSupported (void) const;
-  Ssid GetSsid (void) const;
-  Mac48Address GetAddress (void) const;
-  Mac48Address GetBssid (void) const;
-  virtual void Enqueue (Ptr<Packet> packet, Mac48Address to, Mac48Address from);
-  virtual bool SupportsSendFrom (void) const;
-  virtual void SetWifiPhy (const Ptr<WifiPhy> phy);
-  Ptr<WifiPhy> GetWifiPhy (void) const;
-  void ResetWifiPhy (void);
-  virtual void SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> stationManager);
-  void ConfigureStandard (WifiStandard standard);
-
-  /**
-   * This type defines the callback of a higher layer that a
-   * WifiMac(-derived) object invokes to pass a packet up the stack.
-   *
-   * \param packet the packet that has been received.
-   * \param from the MAC address of the device that sent the packet.
-   * \param to the MAC address of the device that the packet is destined for.
-   */
-  typedef Callback<void, Ptr<const Packet>, Mac48Address, Mac48Address> ForwardUpCallback;
-
-  void SetForwardUpCallback (ForwardUpCallback upCallback);
-  void SetLinkUpCallback (Callback<void> linkUp);
-  void SetLinkDownCallback (Callback<void> linkDown);
+  void SetShortSlotTimeSupported (bool enable) override;
+  void SetSsid (Ssid ssid) override;
+  void SetAddress (Mac48Address address) override;
+  void SetPromisc (void) override;
+  bool GetShortSlotTimeSupported (void) const override;
+  Ssid GetSsid (void) const override;
+  Mac48Address GetAddress (void) const override;
+  Mac48Address GetBssid (void) const override;
+  void Enqueue (Ptr<Packet> packet, Mac48Address to, Mac48Address from) override;
+  bool SupportsSendFrom (void) const override;
+  void SetWifiPhy (const Ptr<WifiPhy> phy) override;
+  Ptr<WifiPhy> GetWifiPhy (void) const override;
+  void ResetWifiPhy (void) override;
+  void SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> stationManager) override;
+  void ConfigureStandard (WifiStandard standard) override;
+  TypeOfStation GetTypeOfStation (void) const override;
+  void SetForwardUpCallback (ForwardUpCallback upCallback) override;
+  void SetLinkUpCallback (Callback<void> linkUp) override;
+  void SetLinkDownCallback (Callback<void> linkDown) override;
+  Ptr<WifiRemoteStationManager> GetWifiRemoteStationManager (void) const override;
 
   // Should be implemented by child classes
-  virtual void Enqueue (Ptr<Packet> packet, Mac48Address to) = 0;
+  void Enqueue (Ptr<Packet> packet, Mac48Address to) override = 0;
+
+  /**
+   * Get the Frame Exchange Manager
+   *
+   * \return the Frame Exchange Manager
+   */
+  Ptr<FrameExchangeManager> GetFrameExchangeManager (void) const;
 
   /**
    * Enable or disable CTS-to-self feature.
@@ -100,9 +104,26 @@
   void SetBssid (Mac48Address bssid);
 
   /**
-   * \return the station manager attached to this MAC.
+   * Accessor for the DCF object
+   *
+   * \return a smart pointer to Txop
    */
-  Ptr<WifiRemoteStationManager> GetWifiRemoteStationManager (void) const;
+  Ptr<Txop> GetTxop (void) const;
+  /**
+   * Accessor for a specified EDCA object
+   *
+   * \param ac the Access Category
+   * \return a smart pointer to a QosTxop
+   */
+  Ptr<QosTxop> GetQosTxop (AcIndex ac) const;
+  /**
+   * Accessor for a specified EDCA object
+   *
+   * \param tid the Traffic ID
+   * \return a smart pointer to a QosTxop
+   */
+  Ptr<QosTxop> GetQosTxop (uint8_t tid) const;
+
   /**
    * Return the extended capabilities of the device.
    *
@@ -129,14 +150,15 @@
   HeCapabilities GetHeCapabilities (void) const;
 
 protected:
-  virtual void DoInitialize ();
-  virtual void DoDispose ();
+  void DoInitialize () override;
+  void DoDispose () override;
+  void SetTypeOfStation (TypeOfStation type) override;
 
-  Ptr<MacRxMiddle> m_rxMiddle;  //!< RX middle (defragmentation etc.)
-  Ptr<MacTxMiddle> m_txMiddle;  //!< TX middle (aggregation etc.)
-  Ptr<MacLow> m_low;            //!< MacLow (RTS, CTS, Data, Ack etc.)
+  Ptr<MacRxMiddle> m_rxMiddle;                      //!< RX middle (defragmentation etc.)
+  Ptr<MacTxMiddle> m_txMiddle;                      //!< TX middle (aggregation etc.)
   Ptr<ChannelAccessManager> m_channelAccessManager; //!< channel access manager
-  Ptr<WifiPhy> m_phy;           //!< Wifi PHY
+  Ptr<WifiPhy> m_phy;                               //!< Wifi PHY
+  Ptr<FrameExchangeManager> m_feManager;            //!< Frame Exchange Manager
 
   Ptr<WifiRemoteStationManager> m_stationManager; //!< Remote station manager (rate control, RTS/CTS/fragmentation thresholds etc.)
 
@@ -159,13 +181,6 @@
   EdcaQueues m_edca;
 
   /**
-   * Accessor for the DCF object
-   *
-   * \return a smart pointer to Txop
-   */
-  Ptr<Txop> GetTxop (void) const;
-
-  /**
    * Accessor for the AC_VO channel access function
    *
    * \return a smart pointer to QosTxop
@@ -200,16 +215,6 @@
   void ConfigureContentionWindow (uint32_t cwMin, uint32_t cwMax);
 
   /**
-   * This method is invoked by a subclass to specify what type of
-   * station it is implementing. This is something that the channel
-   * access functions (instantiated within this class as QosTxop's)
-   * need to know.
-   *
-   * \param type the type of station.
-   */
-  void SetTypeOfStation (TypeOfStation type);
-
-  /**
    * This method acts as the MacRxMiddle receive callback and is
    * invoked to notify us that a frame has been received. The
    * implementation is intended to capture logic that is going to be
@@ -223,20 +228,6 @@
    * \param mpdu the MPDU that has been received.
    */
   virtual void Receive (Ptr<WifiMacQueueItem> mpdu);
-  /**
-   * The packet we sent was successfully received by the receiver
-   * (i.e. we received an Ack from the receiver).
-   *
-   * \param hdr the header of the packet that we successfully sent
-   */
-  virtual void TxOk (const WifiMacHeader &hdr);
-  /**
-   * The packet we sent was successfully received by the receiver
-   * (i.e. we did not receive an Ack from the receiver).
-   *
-   * \param hdr the header of the packet that we failed to sent
-   */
-  virtual void TxFailed (const WifiMacHeader &hdr);
 
   /**
    * Forward the packet up to the device.
@@ -256,16 +247,6 @@
   virtual void DeaggregateAmsduAndForward (Ptr<WifiMacQueueItem> mpdu);
 
   /**
-   * This method can be called to accept a received ADDBA Request. An
-   * ADDBA Response will be constructed and queued for transmission.
-   *
-   * \param reqHdr a pointer to the received ADDBA Request header.
-   * \param originator the MAC address of the originator.
-   */
-  void SendAddBaResponse (const MgtAddBaRequestHeader *reqHdr,
-                          Mac48Address originator);
-
-  /**
    * Enable or disable QoS support for the device.
    *
    * \param enable whether QoS is supported
@@ -279,6 +260,12 @@
   bool GetQosSupported () const;
 
   /**
+   * Create a Frame Exchange Manager depending on the supported version
+   * of the standard.
+   */
+  void SetupFrameExchangeManager (void);
+
+  /**
    * Return whether the device supports HT.
    *
    * \return true if HT is supported, false otherwise
@@ -394,6 +381,8 @@
    */
   void SetBkBlockAckInactivityTimeout (uint16_t timeout);
 
+  TypeOfStation m_typeOfStation;                        //!< the type of station
+
   /**
    * This Boolean is set \c true iff this WifiMac is to model
    * 802.11e/WMM style Quality of Service. It is exposed through the
@@ -419,10 +408,8 @@
    */
   bool m_dsssSupported;
 
-  /// Enable aggregation function
-  void EnableAggregation (void);
-  /// Disable aggregation function
-  void DisableAggregation (void);
+  Mac48Address m_address;   ///< MAC address of this station
+  Mac48Address m_bssid;     ///< the BSSID
 
   uint16_t m_voMaxAmsduSize; ///< maximum A-MSDU size for AC_VO (in bytes)
   uint16_t m_viMaxAmsduSize; ///< maximum A-MSDU size for AC_VI (in bytes)
@@ -437,7 +424,89 @@
   TracedCallback<const WifiMacHeader &> m_txOkCallback; ///< transmit OK callback
   TracedCallback<const WifiMacHeader &> m_txErrCallback; ///< transmit error callback
 
+  /// TracedCallback for acked/nacked MPDUs typedef
+  typedef TracedCallback<Ptr<const WifiMacQueueItem>> MpduTracedCallback;
+
+  MpduTracedCallback m_ackedMpduCallback;  ///< ack'ed MPDU callback
+  MpduTracedCallback m_nackedMpduCallback; ///< nack'ed MPDU callback
+
+  /**
+   * TracedCallback signature for MPDU drop events.
+   *
+   * \param reason the reason why the MPDU was dropped (\see WifiMacDropReason)
+   * \param mpdu the dropped MPDU
+   */
+  typedef void (* DroppedMpduCallback)(WifiMacDropReason reason, Ptr<const WifiMacQueueItem> mpdu);
+
+  /// TracedCallback for MPDU drop events typedef
+  typedef TracedCallback<WifiMacDropReason, Ptr<const WifiMacQueueItem>> DroppedMpduTracedCallback;
+
+  /**
+   * This trace indicates that an MPDU was dropped for the given reason.
+   */
+  DroppedMpduTracedCallback m_droppedMpduCallback;
+
+  /**
+   * TracedCallback signature for MPDU response timeout events.
+   *
+   * \param reason the reason why the timer was started
+   * \param mpdu the MPDU whose response was not received before the timeout
+   * \param txVector the TXVECTOR used to transmit the MPDU
+   */
+  typedef void (* MpduResponseTimeoutCallback)(uint8_t reason, Ptr<const WifiMacQueueItem> mpdu,
+                                               const WifiTxVector& txVector);
+
+  /// TracedCallback for MPDU response timeout events typedef
+  typedef TracedCallback<uint8_t, Ptr<const WifiMacQueueItem>, const WifiTxVector&> MpduResponseTimeoutTracedCallback;
+
+  /**
+   * MPDU response timeout traced callback.
+   * This trace source is fed by a WifiTxTimer object.
+   */
+  MpduResponseTimeoutTracedCallback m_mpduResponseTimeoutCallback;
+
+  /**
+   * TracedCallback signature for PSDU response timeout events.
+   *
+   * \param reason the reason why the timer was started
+   * \param psdu the PSDU whose response was not received before the timeout
+   * \param txVector the TXVECTOR used to transmit the PSDU
+   */
+  typedef void (* PsduResponseTimeoutCallback)(uint8_t reason, Ptr<const WifiPsdu> psdu,
+                                               const WifiTxVector& txVector);
+
+  /// TracedCallback for PSDU response timeout events typedef
+  typedef TracedCallback<uint8_t, Ptr<const WifiPsdu>, const WifiTxVector&> PsduResponseTimeoutTracedCallback;
+
+  /**
+   * PSDU response timeout traced callback.
+   * This trace source is fed by a WifiTxTimer object.
+   */
+  PsduResponseTimeoutTracedCallback m_psduResponseTimeoutCallback;
+
+  /**
+   * TracedCallback signature for PSDU map response timeout events.
+   *
+   * \param reason the reason why the timer was started
+   * \param psduMap the PSDU map for which not all responses were received before the timeout
+   * \param missingStations the MAC addresses of the stations that did not respond
+   * \param nTotalStations the total number of stations that had to respond
+   */
+  typedef void (* PsduMapResponseTimeoutCallback)(uint8_t reason, WifiPsduMap* psduMap,
+                                                  const std::set<Mac48Address>* missingStations,
+                                                  std::size_t nTotalStations);
+
+  /// TracedCallback for PSDU map response timeout events typedef
+  typedef TracedCallback<uint8_t, WifiPsduMap*, const std::set<Mac48Address>*, std::size_t> PsduMapResponseTimeoutTracedCallback;
+
+  /**
+   * PSDU map response timeout traced callback.
+   * This trace source is fed by a WifiTxTimer object.
+   */
+  PsduMapResponseTimeoutTracedCallback m_psduMapResponseTimeoutCallback;
+
   bool m_shortSlotTimeSupported; ///< flag whether short slot time is supported
+  bool m_ctsToSelfSupported;     ///< flag indicating whether CTS-To-Self is supported
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rraa-wifi-manager.cc ns-3.34/src/wifi/model/rraa-wifi-manager.cc
--- ns-3.33/src/wifi/model/rraa-wifi-manager.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/rraa-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,475 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2004,2005,2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Federico Maguolo <maguolof@dei.unipd.it>
- */
-
-#include "ns3/log.h"
-#include "ns3/packet.h"
-#include "ns3/simulator.h"
-#include "rraa-wifi-manager.h"
-#include "wifi-phy.h"
-#include "wifi-mac.h"
-
-#define Min(a,b) ((a < b) ? a : b)
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("RraaWifiManager");
-
-/**
- * \brief hold per-remote-station state for RRAA Wifi manager.
- *
- * This struct extends from WifiRemoteStation struct to hold additional
- * information required by the RRAA Wifi manager
- */
-struct RraaWifiRemoteStation : public WifiRemoteStation
-{
-  uint32_t m_counter;            //!< Counter for transmission attempts.
-  uint32_t m_nFailed;            //!< Number of failed transmission attempts.
-  uint32_t m_adaptiveRtsWnd;     //!< Window size for the Adaptive RTS mechanism.
-  uint32_t m_rtsCounter;         //!< Counter for RTS transmission attempts.
-  Time m_lastReset;              //!< Time of the last reset.
-  bool m_adaptiveRtsOn;          //!< Check if Adaptive RTS mechanism is on.
-  bool m_lastFrameFail;          //!< Flag if the last frame sent has failed.
-  bool m_initialized;            //!< For initializing variables.
-  uint8_t m_nRate;               //!< Number of supported rates.
-  uint8_t m_rateIndex;           //!< Current rate index.
-
-  RraaThresholdsTable m_thresholds; //!< RRAA thresholds for this station.
-};
-
-NS_OBJECT_ENSURE_REGISTERED (RraaWifiManager);
-
-TypeId
-RraaWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::RraaWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<RraaWifiManager> ()
-    .AddAttribute ("Basic",
-                   "If true the RRAA-BASIC algorithm will be used, otherwise the RRAA will be used",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&RraaWifiManager::m_basic),
-                   MakeBooleanChecker ())
-    .AddAttribute ("Timeout",
-                   "Timeout for the RRAA BASIC loss estimation block",
-                   TimeValue (Seconds (0.05)),
-                   MakeTimeAccessor (&RraaWifiManager::m_timeout),
-                   MakeTimeChecker ())
-    .AddAttribute ("FrameLength",
-                   "The Data frame length (in bytes) used for calculating mode TxTime.",
-                   UintegerValue (1420),
-                   MakeUintegerAccessor (&RraaWifiManager::m_frameLength),
-                   MakeUintegerChecker <uint32_t> ())
-    .AddAttribute ("AckFrameLength",
-                   "The Ack frame length (in bytes) used for calculating mode TxTime.",
-                   UintegerValue (14),
-                   MakeUintegerAccessor (&RraaWifiManager::m_ackLength),
-                   MakeUintegerChecker <uint32_t> ())
-    .AddAttribute ("Alpha",
-                   "Constant for calculating the MTL threshold.",
-                   DoubleValue (1.25),
-                   MakeDoubleAccessor (&RraaWifiManager::m_alpha),
-                   MakeDoubleChecker<double> (1))
-    .AddAttribute ("Beta",
-                   "Constant for calculating the ORI threshold.",
-                   DoubleValue (2),
-                   MakeDoubleAccessor (&RraaWifiManager::m_beta),
-                   MakeDoubleChecker<double> (1))
-    .AddAttribute ("Tau",
-                   "Constant for calculating the EWND size.",
-                   DoubleValue (0.012),
-                   MakeDoubleAccessor (&RraaWifiManager::m_tau),
-                   MakeDoubleChecker<double> (0))
-    .AddTraceSource ("Rate",
-                     "Traced value for rate changes (b/s)",
-                     MakeTraceSourceAccessor (&RraaWifiManager::m_currentRate),
-                     "ns3::TracedValueCallback::Uint64")
-  ;
-  return tid;
-}
-
-RraaWifiManager::RraaWifiManager ()
-  : WifiRemoteStationManager (),
-    m_currentRate (0)
-{
-  NS_LOG_FUNCTION (this);
-}
-
-RraaWifiManager::~RraaWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-RraaWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
-{
-  NS_LOG_FUNCTION (this << phy);
-  m_sifs = phy->GetSifs ();
-  m_difs = m_sifs + 2 * phy->GetSlot ();
-  uint8_t nModes = phy->GetNModes ();
-  for (uint8_t i = 0; i < nModes; i++)
-    {
-      WifiMode mode = phy->GetMode (i);
-      WifiTxVector txVector;
-      txVector.SetMode (mode);
-      txVector.SetPreambleType (WIFI_PREAMBLE_LONG);
-      /* Calculate the TX Time of the Data and the corresponding Ack */
-      Time dataTxTime = phy->CalculateTxDuration (m_frameLength, txVector, phy->GetPhyBand ());
-      Time ackTxTime = phy->CalculateTxDuration (m_ackLength, txVector, phy->GetPhyBand ());
-      NS_LOG_DEBUG ("Calculating TX times: Mode= " << mode << " DataTxTime= " << dataTxTime << " AckTxTime= " << ackTxTime);
-      AddCalcTxTime (mode, dataTxTime + ackTxTime);
-    }
-  WifiRemoteStationManager::SetupPhy (phy);
-}
-
-void
-RraaWifiManager::SetupMac (const Ptr<WifiMac> mac)
-{
-  NS_LOG_FUNCTION (this);
-  WifiRemoteStationManager::SetupMac (mac);
-}
-
-void
-RraaWifiManager::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  if (GetHtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
-    }
-  if (GetVhtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
-    }
-  if (GetHeSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
-    }
-}
-
-Time
-RraaWifiManager::GetCalcTxTime (WifiMode mode) const
-{
-  NS_LOG_FUNCTION (this << mode);
-  for (TxTime::const_iterator i = m_calcTxTime.begin (); i != m_calcTxTime.end (); i++)
-    {
-      if (mode == i->second)
-        {
-          return i->first;
-        }
-    }
-  NS_ASSERT (false);
-  return Seconds (0);
-}
-
-void
-RraaWifiManager::AddCalcTxTime (WifiMode mode, Time t)
-{
-  NS_LOG_FUNCTION (this << mode << t);
-  m_calcTxTime.push_back (std::make_pair (t, mode));
-}
-
-WifiRraaThresholds
-RraaWifiManager::GetThresholds (RraaWifiRemoteStation *station, WifiMode mode) const
-{
-  NS_LOG_FUNCTION (this << station << mode);
-  struct WifiRraaThresholds threshold;
-  for (RraaThresholdsTable::const_iterator i = station->m_thresholds.begin (); i != station->m_thresholds.end (); i++)
-    {
-      if (mode == i->second)
-        {
-          return i->first;
-        }
-    }
-  NS_ABORT_MSG ("No thresholds for mode " << mode << " found");
-  return threshold; // Silence compiler warning
-}
-
-WifiRemoteStation *
-RraaWifiManager::DoCreateStation (void) const
-{
-  RraaWifiRemoteStation *station = new RraaWifiRemoteStation ();
-  station->m_initialized = false;
-  station->m_adaptiveRtsWnd = 0;
-  station->m_rtsCounter = 0;
-  station->m_adaptiveRtsOn = false;
-  station->m_lastFrameFail = false;
-  return station;
-}
-
-void
-RraaWifiManager::CheckInit (RraaWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  if (!station->m_initialized)
-    {
-      //Note: we appear to be doing late initialization of the table
-      //to make sure that the set of supported rates has been initialized
-      //before we perform our own initialization.
-      station->m_nRate = GetNSupported (station);
-      //Initialize at maximal rate
-      station->m_rateIndex = GetMaxRate (station);
-
-      station->m_initialized = true;
-
-      station->m_thresholds = RraaThresholdsTable (station->m_nRate);
-      InitThresholds (station);
-      ResetCountersBasic (station);
-    }
-}
-
-void
-RraaWifiManager::InitThresholds (RraaWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  NS_LOG_DEBUG ("InitThresholds = " << station);
-
-  double nextCritical = 0;
-  double nextMtl = 0;
-  double mtl = 0;
-  double ori = 0;
-  for (uint8_t i = 0; i < station->m_nRate; i++)
-    {
-      WifiMode mode = GetSupported (station, i);
-      Time totalTxTime = GetCalcTxTime (mode) + m_sifs + m_difs;
-      if (i == GetMaxRate (station))
-        {
-          ori = 0;
-        }
-      else
-        {
-          WifiMode nextMode = GetSupported (station, i + 1);
-          Time nextTotalTxTime = GetCalcTxTime (nextMode) + m_sifs + m_difs;
-          nextCritical = 1 - (nextTotalTxTime.GetSeconds () / totalTxTime.GetSeconds ());
-          nextMtl = m_alpha * nextCritical;
-          ori = nextMtl / m_beta;
-        }
-      if (i == 0)
-        {
-          mtl = 1;
-        }
-      WifiRraaThresholds th;
-      th.m_ewnd = static_cast<uint32_t> (ceil (m_tau / totalTxTime.GetSeconds ()));
-      th.m_ori = ori;
-      th.m_mtl = mtl;
-      station->m_thresholds.push_back (std::make_pair (th, mode));
-      mtl = nextMtl;
-      NS_LOG_DEBUG (mode << " " << th.m_ewnd << " " << th.m_mtl << " " << th.m_ori);
-    }
-}
-
-void
-RraaWifiManager::ResetCountersBasic (RraaWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_nFailed = 0;
-  station->m_counter = GetThresholds (station, station->m_rateIndex).m_ewnd;
-  station->m_lastReset = Simulator::Now ();
-}
-
-uint8_t
-RraaWifiManager::GetMaxRate (RraaWifiRemoteStation *station) const
-{
-  return station->m_nRate - 1;
-}
-
-void
-RraaWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-}
-
-void
-RraaWifiManager::DoReportDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  RraaWifiRemoteStation *station = static_cast<RraaWifiRemoteStation*> (st);
-  station->m_lastFrameFail = true;
-  CheckTimeout (station);
-  station->m_counter--;
-  station->m_nFailed++;
-  RunBasicAlgorithm (station);
-}
-
-void
-RraaWifiManager::DoReportRxOk (WifiRemoteStation *st,
-                               double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << st << rxSnr << txMode);
-}
-
-void
-RraaWifiManager::DoReportRtsOk (WifiRemoteStation *st,
-                                double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
-}
-
-void
-RraaWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                 double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
-  RraaWifiRemoteStation *station = static_cast<RraaWifiRemoteStation*> (st);
-  station->m_lastFrameFail = false;
-  CheckTimeout (station);
-  station->m_counter--;
-  RunBasicAlgorithm (station);
-}
-
-void
-RraaWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-}
-
-void
-RraaWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-}
-
-WifiTxVector
-RraaWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  RraaWifiRemoteStation *station = static_cast<RraaWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  CheckInit (station);
-  WifiMode mode = GetSupported (station, station->m_rateIndex);
-  if (m_currentRate != mode.GetDataRate (channelWidth))
-    {
-      NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
-      m_currentRate = mode.GetDataRate (channelWidth);
-    }
-  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-}
-
-WifiTxVector
-RraaWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  RraaWifiRemoteStation *station = static_cast<RraaWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiTxVector rtsTxVector;
-  WifiMode mode;
-  if (GetUseNonErpProtection () == false)
-    {
-      mode = GetSupported (station, 0);
-    }
-  else
-    {
-      mode = GetNonErpSupported (station, 0);
-    }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
-}
-
-bool
-RraaWifiManager::DoNeedRts (WifiRemoteStation *st,
-                            uint32_t size, bool normally)
-{
-  NS_LOG_FUNCTION (this << st << size << normally);
-  RraaWifiRemoteStation *station = static_cast<RraaWifiRemoteStation*> (st);
-  CheckInit (station);
-  if (m_basic)
-    {
-      return normally;
-    }
-  ARts (station);
-  return station->m_adaptiveRtsOn;
-}
-
-void
-RraaWifiManager::CheckTimeout (RraaWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  Time d = Simulator::Now () - station->m_lastReset;
-  if (station->m_counter == 0 || d > m_timeout)
-    {
-      ResetCountersBasic (station);
-    }
-}
-
-void
-RraaWifiManager::RunBasicAlgorithm (RraaWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  WifiRraaThresholds thresholds = GetThresholds (station, station->m_rateIndex);
-  double ploss = (station->m_nFailed / thresholds.m_ewnd);
-  if (station->m_counter == 0
-      || ploss > thresholds.m_mtl)
-    {
-      if (ploss > thresholds.m_mtl)
-        {
-          station->m_rateIndex--;
-        }
-      else if (station->m_rateIndex < GetMaxRate (station)
-               && ploss < thresholds.m_ori)
-        {
-          station->m_rateIndex++;
-        }
-      ResetCountersBasic (station);
-    }
-}
-
-void
-RraaWifiManager::ARts (RraaWifiRemoteStation *station)
-{
-  if (!station->m_adaptiveRtsOn
-      && station->m_lastFrameFail)
-    {
-      station->m_adaptiveRtsWnd++;
-      station->m_rtsCounter = station->m_adaptiveRtsWnd;
-    }
-  else if ((station->m_adaptiveRtsOn && station->m_lastFrameFail)
-           || (!station->m_adaptiveRtsOn && !station->m_lastFrameFail))
-    {
-      station->m_adaptiveRtsWnd = station->m_adaptiveRtsWnd / 2;
-      station->m_rtsCounter = station->m_adaptiveRtsWnd;
-    }
-  if (station->m_rtsCounter > 0)
-    {
-      station->m_adaptiveRtsOn = true;
-      station->m_rtsCounter--;
-    }
-  else
-    {
-      station->m_adaptiveRtsOn = false;
-    }
-}
-
-WifiRraaThresholds
-RraaWifiManager::GetThresholds (RraaWifiRemoteStation *station, uint8_t index) const
-{
-  NS_LOG_FUNCTION (this << station << +index);
-  WifiMode mode = GetSupported (station, index);
-  return GetThresholds (station, mode);
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rraa-wifi-manager.h ns-3.34/src/wifi/model/rraa-wifi-manager.h
--- ns-3.33/src/wifi/model/rraa-wifi-manager.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/rraa-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,197 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2005,2006 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Federico Maguolo <maguolof@dei.unipd.it>
- */
-
-#ifndef RRAA_WIFI_MANAGER_H
-#define RRAA_WIFI_MANAGER_H
-
-#include "ns3/nstime.h"
-#include "ns3/traced-value.h"
-#include "wifi-remote-station-manager.h"
-
-namespace ns3 {
-
-struct RraaWifiRemoteStation;
-
-/// WifiRraaThresholds structure
-struct WifiRraaThresholds
-  {
-    double m_ori; ///< Opportunistic Rate Increase threshold
-    double m_mtl; ///< Maximum Tolerable Loss threshold
-    uint32_t m_ewnd; ///< Evaluation Window
-  };
-
-/**
- * List of thresholds for each mode.
- */
-typedef std::vector<std::pair<WifiRraaThresholds, WifiMode> > RraaThresholdsTable;
-
-/**
- * \brief Robust Rate Adaptation Algorithm
- * \ingroup wifi
- *
- * This is an implementation of RRAA as described in
- * "Robust rate adaptation for 802.11 wireless networks"
- * by "Starsky H. Y. Wong", "Hao Yang", "Songwu Lu", and,
- * "Vaduvur Bharghavan" published in Mobicom 06.
- *
- * This RAA does not support HT modes and will error
- * exit if the user tries to configure this RAA with a Wi-Fi MAC
- * that supports 802.11n or higher.
- */
-class RraaWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-
-  RraaWifiManager ();
-  virtual ~RraaWifiManager ();
-
-  // Inherited from WifiRemoteStationManager
-  virtual void SetupPhy (const Ptr<WifiPhy> phy);
-  virtual void SetupMac (const Ptr<WifiMac> mac);
-
-
-private:
-  // Overridden from base class.
-  void DoInitialize (void);
-  WifiRemoteStation * DoCreateStation (void) const;
-  void DoReportRxOk (WifiRemoteStation *station,
-                     double rxSnr, WifiMode txMode);
-  void DoReportRtsFailed (WifiRemoteStation *station);
-  void DoReportDataFailed (WifiRemoteStation *station);
-  void DoReportRtsOk (WifiRemoteStation *station,
-                      double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                       double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  void DoReportFinalDataFailed (WifiRemoteStation *station);
-  WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-  bool DoNeedRts (WifiRemoteStation *st,
-                  uint32_t size, bool normally);
-
-  /**
-   * Check for initializations.
-   * \param station The remote station.
-   */
-  void CheckInit (RraaWifiRemoteStation *station);
-  /**
-   * Return the index for the maximum transmission rate for
-   * the given station.
-   *
-   * \param station the remote station
-   *
-   * \return the index for the maximum transmission rate
-   */
-  uint8_t GetMaxRate (RraaWifiRemoteStation *station) const;
-  /**
-   * Check if the counter should be reset.
-   *
-   * \param station the remote station
-   */
-  void CheckTimeout (RraaWifiRemoteStation *station);
-  /**
-   * Find an appropriate rate for the given station, using
-   * a basic algorithm.
-   *
-   * \param station the remote station
-   */
-  void RunBasicAlgorithm (RraaWifiRemoteStation *station);
-  /**
-   * Activate the use of RTS for the given station if the conditions are met.
-   *
-   * \param station the remote station
-   */
-  void ARts (RraaWifiRemoteStation *station);
-  /**
-   * Reset the counters of the given station.
-   *
-   * \param station the remote station
-   */
-  void ResetCountersBasic (RraaWifiRemoteStation *station);
-  /**
-   * Initialize the thresholds internal list for the given station.
-   *
-   * \param station the remote station
-   */
-  void InitThresholds (RraaWifiRemoteStation *station);
-  /**
-   * Get the thresholds for the given station and mode.
-   *
-   * \param station the remote station
-   * \param mode the WifiMode
-   *
-   * \return the RRAA thresholds
-   */
-  WifiRraaThresholds GetThresholds (RraaWifiRemoteStation *station, WifiMode mode) const;
-  /**
-   * Get the thresholds for the given station and mode index.
-   *
-   * \param station the remote station
-   * \param index the mode index in the supported rates
-   *
-   * \return the RRAA thresholds
-   */
-  WifiRraaThresholds GetThresholds (RraaWifiRemoteStation *station, uint8_t index) const;
-  /**
-   * Get the estimated TxTime of a packet with a given mode.
-   *
-   * \param mode the WifiMode
-   *
-   * \return the estimated TX time
-   */
-  Time GetCalcTxTime (WifiMode mode) const;
-  /**
-   * Add transmission time for the given mode to an internal list.
-   *
-   * \param mode the WifiMode
-   * \param t transmission time
-   */
-  void AddCalcTxTime (WifiMode mode, Time t);
-  /**
-   * typedef for a vector of a pair of Time, WifiMode.
-   * Essentially a list for WifiMode and its corresponding transmission time
-   * to transmit a reference packet.
-   */
-  typedef std::vector<std::pair<Time,WifiMode> > TxTime;
-
-  TxTime m_calcTxTime;     //!< To hold all the calculated TxTime for all modes.
-  Time m_sifs;             //!< Value of SIFS configured in the device.
-  Time m_difs;             //!< Value of DIFS configured in the device.
-
-  uint32_t m_frameLength;  //!< Data frame length used for calculate mode TxTime.
-  uint32_t m_ackLength;    //!< Ack frame length used for calculate mode TxTime.
-
-  bool m_basic;    ///< basic
-  Time m_timeout;  ///< timeout
-  double m_alpha;  //!< Alpha value for RRAA (value for calculating MTL threshold)
-  double m_beta;   //!< Beta value for RRAA (value for calculating ORI threshold).
-  double m_tau;    //!< Tau value for RRAA (value for calculating EWND size).
-
-  TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
-};
-
-} //namespace ns3
-
-#endif /* RRAA_WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rrpaa-wifi-manager.cc ns-3.34/src/wifi/model/rrpaa-wifi-manager.cc
--- ns-3.33/src/wifi/model/rrpaa-wifi-manager.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/rrpaa-wifi-manager.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,613 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2017 Universidad de la República - Uruguay
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Matías Richart <mrichart@fing.edu.uy>
- */
-
-#include "ns3/packet.h"
-#include "ns3/log.h"
-#include "ns3/boolean.h"
-#include "ns3/double.h"
-#include "ns3/uinteger.h"
-#include "ns3/simulator.h"
-#include "ns3/data-rate.h"
-#include "rrpaa-wifi-manager.h"
-#include "wifi-phy.h"
-#include "wifi-mac.h"
-
-NS_LOG_COMPONENT_DEFINE ("RrpaaWifiManager");
-
-namespace ns3 {
-
-/**
- * Hold per-remote-station state for RRPAA Wifi manager.
- *
- * This struct extends from WifiRemoteStation struct to hold additional
- * information required by the APARF Wifi manager
- */
-struct RrpaaWifiRemoteStation : public WifiRemoteStation
-{
-  uint32_t m_counter;            //!< Counter for transmission attempts.
-  uint32_t m_nFailed;            //!< Number of failed transmission attempts.
-  uint32_t m_adaptiveRtsWnd;     //!< Window size for the Adaptive RTS mechanism.
-  uint32_t m_rtsCounter;         //!< Counter for RTS transmission attempts.
-  Time m_lastReset;              //!< Time of the last reset.
-  bool m_adaptiveRtsOn;          //!< Check if Adaptive RTS mechanism is on.
-  bool m_lastFrameFail;          //!< Flag if the last frame sent has failed.
-  bool m_initialized;            //!< For initializing variables.
-  uint8_t m_nRate;               //!< Number of supported rates.
-  uint8_t m_prevRateIndex;       //!< Rate index of the previous transmission.
-  uint8_t m_rateIndex;           //!< Current rate index.
-  uint8_t m_prevPowerLevel;      //!< Power level of the previous transmission.
-  uint8_t m_powerLevel;          //!< Current power level.
-  RrpaaThresholdsTable m_thresholds;  //!< RRPAA thresholds for this station.
-  RrpaaProbabilitiesTable m_pdTable;  //!< Probability table for power and rate changes.
-};
-
-NS_OBJECT_ENSURE_REGISTERED (RrpaaWifiManager);
-
-TypeId
-RrpaaWifiManager::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::RrpaaWifiManager")
-    .SetParent<WifiRemoteStationManager> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<RrpaaWifiManager> ()
-    .AddAttribute ("Basic",
-                   "If true the RRPAA-BASIC algorithm will be used, otherwise the RRPAA will be used.",
-                   BooleanValue (true),
-                   MakeBooleanAccessor (&RrpaaWifiManager::m_basic),
-                   MakeBooleanChecker ())
-    .AddAttribute ("Timeout",
-                   "Timeout for the RRPAA-BASIC loss estimation block.",
-                   TimeValue (MilliSeconds (500)),
-                   MakeTimeAccessor (&RrpaaWifiManager::m_timeout),
-                   MakeTimeChecker ())
-    .AddAttribute ("FrameLength",
-                   "The Data frame length (in bytes) used for calculating mode TxTime.",
-                   UintegerValue (1420),
-                   MakeUintegerAccessor (&RrpaaWifiManager::m_frameLength),
-                   MakeUintegerChecker <uint32_t> ())
-    .AddAttribute ("AckFrameLength",
-                   "The Ack frame length (in bytes) used for calculating mode TxTime.",
-                   UintegerValue (14),
-                   MakeUintegerAccessor (&RrpaaWifiManager::m_ackLength),
-                   MakeUintegerChecker <uint32_t> ())
-    .AddAttribute ("Alpha",
-                   "Constant for calculating the MTL threshold.",
-                   DoubleValue (1.25),
-                   MakeDoubleAccessor (&RrpaaWifiManager::m_alpha),
-                   MakeDoubleChecker<double> (1))
-    .AddAttribute ("Beta",
-                   "Constant for calculating the ORI threshold.",
-                   DoubleValue (2),
-                   MakeDoubleAccessor (&RrpaaWifiManager::m_beta),
-                   MakeDoubleChecker<double> (1))
-    .AddAttribute ("Tau",
-                   "Constant for calculating the EWND size.",
-                   DoubleValue (0.015),
-                   MakeDoubleAccessor (&RrpaaWifiManager::m_tau),
-                   MakeDoubleChecker<double> (0))
-    .AddAttribute ("Gamma",
-                   "Constant for Probabilistic Decision Table decrements.",
-                   DoubleValue (2),
-                   MakeDoubleAccessor (&RrpaaWifiManager::m_gamma),
-                   MakeDoubleChecker<double> (1))
-    .AddAttribute ("Delta",
-                   "Constant for Probabilistic Decision Table increments.",
-                   DoubleValue (1.0905),
-                   MakeDoubleAccessor (&RrpaaWifiManager::m_delta),
-                   MakeDoubleChecker<double> (1))
-    .AddTraceSource ("RateChange",
-                     "The transmission rate has change.",
-                     MakeTraceSourceAccessor (&RrpaaWifiManager::m_rateChange),
-                     "ns3::WifiRemoteStationManager::RateChangeTracedCallback")
-    .AddTraceSource ("PowerChange",
-                     "The transmission power has change.",
-                     MakeTraceSourceAccessor (&RrpaaWifiManager::m_powerChange),
-                     "ns3::WifiRemoteStationManager::PowerChangeTracedCallback")
-  ;
-  return tid;
-}
-
-
-RrpaaWifiManager::RrpaaWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-  m_uniformRandomVariable = CreateObject<UniformRandomVariable> ();
-}
-
-RrpaaWifiManager::~RrpaaWifiManager ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-int64_t
-RrpaaWifiManager::AssignStreams (int64_t stream)
-{
-  NS_LOG_FUNCTION (this << stream);
-  m_uniformRandomVariable->SetStream (stream);
-  return 1;
-}
-
-void
-RrpaaWifiManager::SetupPhy (const Ptr<WifiPhy> phy)
-{
-  NS_LOG_FUNCTION (this << phy);
-  m_sifs = phy->GetSifs ();
-  m_difs = m_sifs + 2 * phy->GetSlot ();
-  m_nPowerLevels = phy->GetNTxPower ();
-  m_maxPowerLevel = m_nPowerLevels  - 1;
-  m_minPowerLevel = 0;
-  uint8_t nModes = phy->GetNModes ();
-  for (uint8_t i = 0; i < nModes; i++)
-    {
-      WifiMode mode = phy->GetMode (i);
-      WifiTxVector txVector;
-      txVector.SetMode (mode);
-      txVector.SetPreambleType (WIFI_PREAMBLE_LONG);
-      /* Calculate the TX Time of the Data and the corresponding Ack */
-      Time dataTxTime = phy->CalculateTxDuration (m_frameLength, txVector, phy->GetPhyBand ());
-      Time ackTxTime = phy->CalculateTxDuration (m_ackLength, txVector, phy->GetPhyBand ());
-      NS_LOG_DEBUG ("Calculating TX times: Mode= " << mode << " DataTxTime= " << dataTxTime << " AckTxTime= " << ackTxTime);
-      AddCalcTxTime (mode, dataTxTime + ackTxTime);
-    }
-  WifiRemoteStationManager::SetupPhy (phy);
-}
-
-void
-RrpaaWifiManager::SetupMac (const Ptr<WifiMac> mac)
-{
-  NS_LOG_FUNCTION (this << mac);
-  WifiRemoteStationManager::SetupMac (mac);
-}
-
-void
-RrpaaWifiManager::DoInitialize ()
-{
-  NS_LOG_FUNCTION (this);
-  if (GetHtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
-    }
-  if (GetVhtSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
-    }
-  if (GetHeSupported ())
-    {
-      NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
-    }
-}
-
-Time
-RrpaaWifiManager::GetCalcTxTime (WifiMode mode) const
-{
-  NS_LOG_FUNCTION (this << mode);
-  for (TxTime::const_iterator i = m_calcTxTime.begin (); i != m_calcTxTime.end (); i++)
-    {
-      if (mode == i->second)
-        {
-          return i->first;
-        }
-    }
-  NS_ASSERT (false);
-  return Seconds (0);
-}
-
-void
-RrpaaWifiManager::AddCalcTxTime (WifiMode mode, Time t)
-{
-  NS_LOG_FUNCTION (this << mode << t);
-  m_calcTxTime.push_back (std::make_pair (t, mode));
-}
-
-WifiRrpaaThresholds
-RrpaaWifiManager::GetThresholds (RrpaaWifiRemoteStation *station, WifiMode mode) const
-{
-  NS_LOG_FUNCTION (this << station << mode);
-  struct WifiRrpaaThresholds threshold;
-  for (RrpaaThresholdsTable::const_iterator i = station->m_thresholds.begin (); i != station->m_thresholds.end (); i++)
-    {
-      if (mode == i->second)
-        {
-          return i->first;
-        }
-    }
-  NS_ABORT_MSG ("No thresholds for mode " << mode << " found");
-  return threshold; // Silence compiler warning
-}
-
-WifiRemoteStation *
-RrpaaWifiManager::DoCreateStation (void) const
-{
-  NS_LOG_FUNCTION (this);
-  RrpaaWifiRemoteStation *station = new RrpaaWifiRemoteStation ();
-  station->m_adaptiveRtsWnd = 0;
-  station->m_rtsCounter = 0;
-  station->m_adaptiveRtsOn = false;
-  station->m_lastFrameFail = false;
-  station->m_initialized = false;
-  return station;
-}
-
-void
-RrpaaWifiManager::CheckInit (RrpaaWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  if (!station->m_initialized)
-    {
-      //Note: we appear to be doing late initialization of the table
-      //to make sure that the set of supported rates has been initialized
-      //before we perform our own initialization.
-      station->m_nRate = GetNSupported (station);
-      //Initialize at minimal rate and maximal power.
-      station->m_prevRateIndex = 0;
-      station->m_rateIndex = 0;
-      station->m_prevPowerLevel = m_maxPowerLevel;
-      station->m_powerLevel = m_maxPowerLevel;
-      WifiMode mode = GetSupported (station, 0);
-      uint16_t channelWidth = GetChannelWidth (station);
-      DataRate rate = DataRate (mode.GetDataRate (channelWidth));
-      double power = GetPhy ()->GetPowerDbm (station->m_powerLevel);
-      m_rateChange (rate, rate, station->m_state->m_address);
-      m_powerChange (power, power, station->m_state->m_address);
-
-      station->m_pdTable = RrpaaProbabilitiesTable (station->m_nRate, std::vector<double> (m_nPowerLevels));
-      NS_LOG_DEBUG ("Initializing pdTable");
-      for (uint8_t i = 0; i < station->m_nRate; i++)
-        {
-          for (uint8_t j = 0; j < m_nPowerLevels; j++)
-            {
-              station->m_pdTable[i][j] = 1;
-            }
-        }
-
-      station->m_initialized = true;
-
-      station->m_thresholds = RrpaaThresholdsTable (station->m_nRate);
-      InitThresholds (station);
-      ResetCountersBasic (station);
-    }
-}
-
-void
-RrpaaWifiManager::InitThresholds (RrpaaWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  double nextCritical = 0;
-  double nextMtl = 0;
-  double mtl = 0;
-  double ori = 0;
-  for (uint8_t i = 0; i < station->m_nRate; i++)
-    {
-      WifiMode mode = GetSupported (station, i);
-      Time totalTxTime = GetCalcTxTime (mode) + m_sifs + m_difs;
-      if (i == station->m_nRate - 1)
-        {
-          ori = 0;
-        }
-      else
-        {
-          WifiMode nextMode = GetSupported (station, i + 1);
-          Time nextTotalTxTime = GetCalcTxTime (nextMode) + m_sifs + m_difs;
-          nextCritical = 1 - (nextTotalTxTime.GetSeconds () / totalTxTime.GetSeconds ());
-          nextMtl = m_alpha * nextCritical;
-          ori = nextMtl / m_beta;
-        }
-      if (i == 0)
-        {
-          mtl = nextMtl;
-        }
-      WifiRrpaaThresholds th;
-      th.m_ewnd = static_cast<uint32_t> (ceil (m_tau / totalTxTime.GetSeconds ()));
-      th.m_ori = ori;
-      th.m_mtl = mtl;
-      station->m_thresholds.push_back (std::make_pair (th, mode));
-      mtl = nextMtl;
-      NS_LOG_DEBUG (mode << " " << th.m_ewnd << " " << th.m_mtl << " " << th.m_ori);
-    }
-}
-
-void
-RrpaaWifiManager::ResetCountersBasic (RrpaaWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  station->m_nFailed = 0;
-  station->m_counter = GetThresholds (station, station->m_rateIndex).m_ewnd;
-  station->m_lastReset = Simulator::Now ();
-}
-
-void
-RrpaaWifiManager::DoReportRtsFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-}
-
-void
-RrpaaWifiManager::DoReportDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  RrpaaWifiRemoteStation *station = static_cast<RrpaaWifiRemoteStation*> (st);
-  CheckInit (station);
-  station->m_lastFrameFail = true;
-  CheckTimeout (station);
-  station->m_counter--;
-  station->m_nFailed++;
-  RunBasicAlgorithm (station);
-}
-
-void
-RrpaaWifiManager::DoReportRxOk (WifiRemoteStation *st,
-                                double rxSnr, WifiMode txMode)
-{
-  NS_LOG_FUNCTION (this << st << rxSnr << txMode);
-}
-
-void
-RrpaaWifiManager::DoReportRtsOk (WifiRemoteStation *st,
-                                 double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
-}
-
-void
-RrpaaWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode ackMode,
-                                  double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
-{
-  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
-  RrpaaWifiRemoteStation *station = static_cast<RrpaaWifiRemoteStation*> (st);
-  CheckInit (station);
-  station->m_lastFrameFail = false;
-  CheckTimeout (station);
-  station->m_counter--;
-  RunBasicAlgorithm (station);
-}
-void
-RrpaaWifiManager::DoReportFinalRtsFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-}
-void
-RrpaaWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-}
-
-WifiTxVector
-RrpaaWifiManager::DoGetDataTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  RrpaaWifiRemoteStation *station = static_cast<RrpaaWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  CheckInit (station);
-  WifiMode mode = GetSupported (station, station->m_rateIndex);
-  DataRate rate = DataRate (mode.GetDataRate (channelWidth));
-  DataRate prevRate = DataRate (GetSupported (station, station->m_prevRateIndex).GetDataRate (channelWidth));
-  double power = GetPhy ()->GetPowerDbm (station->m_powerLevel);
-  double prevPower = GetPhy ()->GetPowerDbm (station->m_prevPowerLevel);
-  if (station->m_prevRateIndex != station->m_rateIndex)
-    {
-      m_rateChange (prevRate, rate, station->m_state->m_address);
-      station->m_prevRateIndex = station->m_rateIndex;
-    }
-  if (station->m_prevPowerLevel != station->m_powerLevel)
-    {
-      m_powerChange (prevPower, power, station->m_state->m_address);
-      station->m_prevPowerLevel = station->m_powerLevel;
-    }
-  return WifiTxVector (mode, station->m_powerLevel, GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-}
-WifiTxVector
-RrpaaWifiManager::DoGetRtsTxVector (WifiRemoteStation *st)
-{
-  NS_LOG_FUNCTION (this << st);
-  RrpaaWifiRemoteStation *station = static_cast<RrpaaWifiRemoteStation*> (st);
-  uint16_t channelWidth = GetChannelWidth (station);
-  if (channelWidth > 20 && channelWidth != 22)
-    {
-      channelWidth = 20;
-    }
-  WifiTxVector rtsTxVector;
-  WifiMode mode;
-  if (GetUseNonErpProtection () == false)
-    {
-      mode = GetSupported (station, 0);
-    }
-  else
-    {
-      mode = GetNonErpSupported (station, 0);
-    }
-  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station));
-  return rtsTxVector;
-}
-
-bool
-RrpaaWifiManager::DoNeedRts (WifiRemoteStation *st,
-                             uint32_t size, bool normally)
-{
-  NS_LOG_FUNCTION (this << st << size << normally);
-  RrpaaWifiRemoteStation *station = static_cast<RrpaaWifiRemoteStation*> (st);
-  CheckInit (station);
-  if (m_basic)
-    {
-      return normally;
-    }
-  RunAdaptiveRtsAlgorithm (station);
-  return station->m_adaptiveRtsOn;
-}
-
-void
-RrpaaWifiManager::CheckTimeout (RrpaaWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  Time d = Simulator::Now () - station->m_lastReset;
-  if (station->m_counter == 0 || d > m_timeout)
-    {
-      ResetCountersBasic (station);
-    }
-}
-
-void
-RrpaaWifiManager::RunBasicAlgorithm (RrpaaWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  WifiRrpaaThresholds thresholds = GetThresholds (station, station->m_rateIndex);
-  double bploss = (static_cast<double> (station->m_nFailed) / thresholds.m_ewnd);
-  double wploss = (static_cast<double> (station->m_counter + station->m_nFailed) / thresholds.m_ewnd);
-  NS_LOG_DEBUG ("Best loss prob= " << bploss);
-  NS_LOG_DEBUG ("Worst loss prob= " << wploss);
-  if (bploss >= thresholds.m_mtl)
-    {
-      if (station->m_powerLevel < m_maxPowerLevel)
-        {
-          NS_LOG_DEBUG ("bploss >= MTL and power < maxPower => Increase Power");
-          station->m_pdTable[station->m_rateIndex][station->m_powerLevel] /= m_gamma;
-          NS_LOG_DEBUG ("pdTable[" << +station->m_rateIndex << "][" << station->m_powerLevel << "] = " << station->m_pdTable[station->m_rateIndex][station->m_powerLevel]);
-          station->m_powerLevel++;
-          ResetCountersBasic (station);
-        }
-      else if (station->m_rateIndex != 0)
-        {
-          NS_LOG_DEBUG ("bploss >= MTL and power = maxPower => Decrease Rate");
-          station->m_pdTable[station->m_rateIndex][station->m_powerLevel] /= m_gamma;
-          NS_LOG_DEBUG ("pdTable[" << +station->m_rateIndex << "][" << station->m_powerLevel << "] = " << station->m_pdTable[station->m_rateIndex][station->m_powerLevel]);
-          station->m_rateIndex--;
-          ResetCountersBasic (station);
-        }
-      else
-        {
-          NS_LOG_DEBUG ("bploss >= MTL but already at maxPower and minRate");
-        }
-    }
-  else if (wploss <= thresholds.m_ori)
-    {
-      if (station->m_rateIndex < station->m_nRate - 1)
-        {
-          NS_LOG_DEBUG ("wploss <= ORI and rate < maxRate => Probabilistic Rate Increase");
-
-          // Recalculate probabilities of lower rates.
-          for (uint8_t i = 0; i <= station->m_rateIndex; i++)
-            {
-              station->m_pdTable[i][station->m_powerLevel] *= m_delta;
-              if (station->m_pdTable[i][station->m_powerLevel] > 1)
-                {
-                  station->m_pdTable[i][station->m_powerLevel] = 1;
-                }
-              NS_LOG_DEBUG ("pdTable[" << i << "][" << (int)station->m_powerLevel << "] = " << station->m_pdTable[i][station->m_powerLevel]);
-            }
-          double rand = m_uniformRandomVariable->GetValue (0,1);
-          if (rand < station->m_pdTable[station->m_rateIndex + 1][station->m_powerLevel])
-            {
-              NS_LOG_DEBUG ("Increase Rate");
-              station->m_rateIndex++;
-            }
-        }
-      else if (station->m_powerLevel > m_minPowerLevel)
-        {
-          NS_LOG_DEBUG ("wploss <= ORI and rate = maxRate => Probabilistic Power Decrease");
-
-          // Recalculate probabilities of higher powers.
-          for (uint32_t i = m_maxPowerLevel; i > station->m_powerLevel; i--)
-            {
-              station->m_pdTable[station->m_rateIndex][i] *= m_delta;
-              if (station->m_pdTable[station->m_rateIndex][i] > 1)
-                {
-                  station->m_pdTable[station->m_rateIndex][i] = 1;
-                }
-              NS_LOG_DEBUG ("pdTable[" << +station->m_rateIndex << "][" << i << "] = " << station->m_pdTable[station->m_rateIndex][i]);
-            }
-          double rand = m_uniformRandomVariable->GetValue (0,1);
-          if (rand < station->m_pdTable[station->m_rateIndex][station->m_powerLevel - 1])
-            {
-              NS_LOG_DEBUG ("Decrease Power");
-              station->m_powerLevel--;
-            }
-        }
-      ResetCountersBasic (station);
-    }
-  else if (bploss > thresholds.m_ori && wploss < thresholds.m_mtl)
-    {
-      if (station->m_powerLevel > m_minPowerLevel)
-        {
-          NS_LOG_DEBUG ("loss between ORI and MTL and power > minPowerLevel => Probabilistic Power Decrease");
-
-          // Recalculate probabilities of higher powers.
-          for (uint32_t i = m_maxPowerLevel; i >= station->m_powerLevel; i--)
-            {
-              station->m_pdTable[station->m_rateIndex][i] *= m_delta;
-              if (station->m_pdTable[station->m_rateIndex][i] > 1)
-                {
-                  station->m_pdTable[station->m_rateIndex][i] = 1;
-                }
-              NS_LOG_DEBUG ("pdTable[" << +station->m_rateIndex << "][" << i << "] = " << station->m_pdTable[station->m_rateIndex][i]);
-            }
-          double rand = m_uniformRandomVariable->GetValue (0,1);
-          if (rand < station->m_pdTable[station->m_rateIndex][station->m_powerLevel - 1])
-            {
-              NS_LOG_DEBUG ("Decrease Power");
-              station->m_powerLevel--;
-            }
-          ResetCountersBasic (station);
-        }
-    }
-  if (station->m_counter == 0)
-    {
-      ResetCountersBasic (station);
-    }
-}
-
-void
-RrpaaWifiManager::RunAdaptiveRtsAlgorithm (RrpaaWifiRemoteStation *station)
-{
-  NS_LOG_FUNCTION (this << station);
-  if (!station->m_adaptiveRtsOn
-      && station->m_lastFrameFail)
-    {
-      station->m_adaptiveRtsWnd += 2;
-      station->m_rtsCounter = station->m_adaptiveRtsWnd;
-    }
-  else if ((station->m_adaptiveRtsOn && station->m_lastFrameFail)
-           || (!station->m_adaptiveRtsOn && !station->m_lastFrameFail))
-    {
-      station->m_adaptiveRtsWnd = station->m_adaptiveRtsWnd / 2;
-      station->m_rtsCounter = station->m_adaptiveRtsWnd;
-    }
-  if (station->m_rtsCounter > 0)
-    {
-      station->m_adaptiveRtsOn = true;
-      station->m_rtsCounter--;
-    }
-  else
-    {
-      station->m_adaptiveRtsOn = false;
-    }
-}
-
-WifiRrpaaThresholds
-RrpaaWifiManager::GetThresholds (RrpaaWifiRemoteStation *station, uint8_t index) const
-{
-  NS_LOG_FUNCTION (this << station << +index);
-  WifiMode mode = GetSupported (station, index);
-  return GetThresholds (station, mode);
-}
-
-} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/rrpaa-wifi-manager.h ns-3.34/src/wifi/model/rrpaa-wifi-manager.h
--- ns-3.33/src/wifi/model/rrpaa-wifi-manager.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/rrpaa-wifi-manager.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,239 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2017 Universidad de la República - Uruguay
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Matías Richart <mrichart@fing.edu.uy>
- */
-
-#ifndef RRPAA_WIFI_MANAGER_H
-#define RRPAA_WIFI_MANAGER_H
-
-#include "ns3/nstime.h"
-#include "ns3/random-variable-stream.h"
-#include "wifi-remote-station-manager.h"
-
-namespace ns3 {
-
-struct RrpaaWifiRemoteStation;
-
-/**
- * \ingroup wifi
- * Robust Rate and Power Adaptation Algorithm
- *
- * This class implements the RRPAA algorithm as described in <i>Rate, Power and Carrier-Sense
- * Threshold Coordinated Management for High-Density IEEE 802.11 Networks</i>
- * by Matías Richart; Jorge Visca and Javier Baliosian in Integrated Network Management (IM),
- * 2015 IFIP/IEEE International Symposium on (pp. 139-146). IEEE.
- * http://dl.ifip.org/db/conf/im/im2015/137430.pdf
- *
- * RRPAA adds power control to the RRAA mechanism. RRAA is described in
- * <i>Robust rate adaptation for 802.11 wireless networks</i> by Starsky H. Y. Wong;
- * Hao Yang; Songwu Lu and Vaduvur Bharghavan in Proceedings of the 12th annual
- * international conference on Mobile computing and networking (pp. 146-157). ACM.
- * http://ocw.cs.pub.ro/courses/_media/isrm/articole/rrate_adapt_mobicom06.pdf
- *
- * This RAA does not support HT modes and will error
- * exit if the user tries to configure this RAA with a Wi-Fi MAC
- * that supports 802.11n or higher.
- */
-
-/**
- * For each rate there is a Opportunistic Rate Increase threshold,
- * a Maximum Tolerable Loss threshold and an Evaluation Window.
- */
-struct WifiRrpaaThresholds
-{
-  double m_ori; //!< The Opportunistic Rate Increase threshold.
-  double m_mtl; //!< The Maximum Tolerable Loss threshold.
-  uint32_t m_ewnd; //!< The Estimation Window size.
-};
-
-/**
- * List of thresholds for each mode.
- */
-typedef std::vector<std::pair<WifiRrpaaThresholds,WifiMode> > RrpaaThresholdsTable;
-
-/**
- * List of probabilities.
- */
-typedef std::vector<std::vector<double> > RrpaaProbabilitiesTable;
-
-class RrpaaWifiManager : public WifiRemoteStationManager
-{
-public:
-  /**
-   * Register this type.
-   * \return The object TypeId.
-   */
-  static TypeId GetTypeId (void);
-  RrpaaWifiManager ();
-  virtual ~RrpaaWifiManager ();
-
-  // Inherited from WifiRemoteStationManager
-  virtual void SetupPhy (const Ptr<WifiPhy> phy);
-  virtual void SetupMac (const Ptr<WifiMac> mac);
-
-  /**
-   * Assign a fixed random variable stream number to the random variables
-   * used by this model.  Return the number of streams (possibly zero) that
-   * have been assigned.
-   *
-   * \param stream first stream index to use
-   *
-   * \return the number of stream indices assigned by this model
-   */
-  int64_t AssignStreams (int64_t stream);
-
-private:
-  // Overridden from base class.
-  void DoInitialize (void);
-  virtual WifiRemoteStation * DoCreateStation (void) const;
-  virtual void DoReportRxOk (WifiRemoteStation *station,
-                             double rxSnr, WifiMode txMode);
-  virtual void DoReportRtsFailed (WifiRemoteStation *station);
-  virtual void DoReportDataFailed (WifiRemoteStation *station);
-  virtual void DoReportRtsOk (WifiRemoteStation *station,
-                              double ctsSnr, WifiMode ctsMode, double rtsSnr);
-  virtual void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
-                               double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
-  virtual void DoReportFinalRtsFailed (WifiRemoteStation *station);
-  virtual void DoReportFinalDataFailed (WifiRemoteStation *station);
-  virtual WifiTxVector DoGetDataTxVector (WifiRemoteStation *station);
-  virtual WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
-  virtual bool DoNeedRts (WifiRemoteStation *st,
-                          uint32_t size, bool normally);
-
-  /**
-   * Check for initializations.
-   * \param station the remote station.
-   */
-  void CheckInit (RrpaaWifiRemoteStation *station);
-
-  /**
-   * Check if the counter should be reset.
-   *
-   * \param station the remote station
-   */
-  void CheckTimeout (RrpaaWifiRemoteStation *station);
-  /**
-   * Find an appropriate rate and power for the given station, using
-   * a basic algorithm.
-   *
-   * \param station the remote station
-   */
-  void RunBasicAlgorithm (RrpaaWifiRemoteStation *station);
-  /**
-   * Run an enhanced algorithm which activates the use of RTS
-   * for the given station if the conditions are met.
-   *
-   * \param station the remote station
-   */
-  void RunAdaptiveRtsAlgorithm (RrpaaWifiRemoteStation *station);
-  /**
-   * Reset the counters of the given station.
-   *
-   * \param station the remote station
-   */
-  void ResetCountersBasic (RrpaaWifiRemoteStation *station);
-
-  /**
-   * Initialize the thresholds internal list for the given station.
-   *
-   * \param station the remote station
-   */
-  void InitThresholds (RrpaaWifiRemoteStation *station);
-
-  /**
-   * Get the thresholds for the given station and mode.
-   *
-   * \param station the remote station
-   * \param mode the WifiMode
-   *
-   * \return the RRPAA thresholds
-   */
-  WifiRrpaaThresholds GetThresholds (RrpaaWifiRemoteStation *station, WifiMode mode) const;
-
-  /**
-   * Get the thresholds for the given station and mode index.
-   *
-   * \param station the remote station
-   * \param index the mode index in the supported rates
-   *
-   * \return the RRPAA thresholds
-   */
-  WifiRrpaaThresholds GetThresholds (RrpaaWifiRemoteStation *station, uint8_t index) const;
-
-  /**
-   * Get the estimated TxTime of a packet with a given mode.
-   *
-   * \param mode the WifiMode
-   *
-   * \return the estimated TX time
-   */
-  Time GetCalcTxTime (WifiMode mode) const;
-  /**
-   * Add transmission time for the given mode to an internal list.
-   *
-   * \param mode the WifiMode
-   * \param t transmission time
-   */
-  void AddCalcTxTime (WifiMode mode, Time t);
-
-  /**
-   * typedef for a vector of a pair of Time, WifiMode.
-   * Essentially a list for WifiMode and its corresponding transmission time
-   * to transmit a reference packet.
-   */
-  typedef std::vector<std::pair<Time,WifiMode> > TxTime;
-
-  TxTime m_calcTxTime;     //!< To hold all the calculated TxTime for all modes.
-  Time m_sifs;             //!< Value of SIFS configured in the device.
-  Time m_difs;             //!< Value of DIFS configured in the device.
-
-  uint32_t m_frameLength;  //!< Data frame length used for calculate mode TxTime (in bytes).
-  uint32_t m_ackLength;    //!< Ack frame length used for calculate mode TxTime (in bytes).
-
-  bool m_basic;            //!< If using the basic algorithm (without RTS/CTS).
-  Time m_timeout;          //!< Timeout for the RRAA BASIC loss estimation block.
-  double m_alpha;          //!< Alpha value for RRPAA (value for calculating MTL threshold)
-  double m_beta;           //!< Beta value for RRPAA (value for calculating ORI threshold).
-  double m_tau;            //!< Tau value for RRPAA (value for calculating EWND size).
-  double m_gamma;          //!< Gamma value for RRPAA (value for pdTable decrements).
-  double m_delta;          //!< Delta value for RRPAA (value for pdTable increments).
-
-  /**
-   * Differently form rate, power levels do not depend on the remote station.
-   * The levels depend only on the physical layer of the device.
-   */
-  uint8_t m_minPowerLevel;     //!< Minimal power level.
-  uint8_t m_maxPowerLevel;     //!< Maximal power level.
-  uint8_t m_nPowerLevels;      //!< Number of power levels.
-
-  /**
-   * The trace source fired when the transmission power change
-   */
-  TracedCallback<double, double, Mac48Address> m_powerChange;
-  /**
-   * The trace source fired when the transmission rate change
-   */
-  TracedCallback<DataRate, DataRate, Mac48Address> m_rateChange;
-
-  Ptr<UniformRandomVariable> m_uniformRandomVariable; //!< Provides uniform random variables for probabilistic changes.
-};
-
-} //namespace ns3
-
-#endif /* RRPAA__WIFI_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/simple-frame-capture-model.h ns-3.34/src/wifi/model/simple-frame-capture-model.h
--- ns-3.33/src/wifi/model/simple-frame-capture-model.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/simple-frame-capture-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -69,7 +69,7 @@
    * \return true if the reception should be switched to a new incoming frame,
    *         false otherwise
    */
-  bool CaptureNewFrame (Ptr<Event> currentEvent, Ptr<Event> newEvent) const;
+  bool CaptureNewFrame (Ptr<Event> currentEvent, Ptr<Event> newEvent) const override;
 
 
 private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/snr-tag.h ns-3.34/src/wifi/model/snr-tag.h
--- ns-3.33/src/wifi/model/snr-tag.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/snr-tag.h	2021-07-14 10:31:07.000000000 -0700
@@ -39,17 +39,17 @@
    * \return the object TypeId
    */
   static TypeId GetTypeId (void);
-  TypeId GetInstanceTypeId (void) const;
 
   /**
    * Create a SnrTag with the default SNR 0
    */
   SnrTag ();
 
-  uint32_t GetSerializedSize (void) const;
-  void Serialize (TagBuffer i) const;
-  void Deserialize (TagBuffer i);
-  void Print (std::ostream &os) const;
+  TypeId GetInstanceTypeId (void) const override;
+  uint32_t GetSerializedSize (void) const override;
+  void Serialize (TagBuffer i) const override;
+  void Deserialize (TagBuffer i) override;
+  void Print (std::ostream &os) const override;
 
   /**
    * Set the SNR to the given value.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/spectrum-wifi-phy.cc ns-3.34/src/wifi/model/spectrum-wifi-phy.cc
--- ns-3.33/src/wifi/model/spectrum-wifi-phy.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/spectrum-wifi-phy.cc	2021-07-14 10:31:07.000000000 -0700
@@ -26,13 +26,13 @@
 #include "ns3/log.h"
 #include "ns3/double.h"
 #include "ns3/boolean.h"
-#include "ns3/net-device.h"
+#include "ns3/wifi-net-device.h"
 #include "ns3/node.h"
+#include "ns3/simulator.h"
 #include "spectrum-wifi-phy.h"
-#include "wifi-spectrum-signal-parameters.h"
 #include "wifi-spectrum-phy-interface.h"
+#include "wifi-spectrum-signal-parameters.h"
 #include "wifi-utils.h"
-#include "wifi-ppdu.h"
 #include "wifi-psdu.h"
 
 namespace ns3 {
@@ -92,6 +92,9 @@
   NS_LOG_FUNCTION (this);
   m_channel = 0;
   m_wifiSpectrumPhyInterface = 0;
+  m_antenna = 0;
+  m_rxSpectrumModel = 0;
+  m_ruBands.clear ();
   WifiPhy::DoDispose ();
 }
 
@@ -160,17 +163,49 @@
     }
   if (GetPhyStandard () >= WIFI_PHY_STANDARD_80211ax)
     {
-      for (unsigned int type = 0; type < 7; type++)
+      // For a given RU type, some RUs over a channel occupy the same tones as
+      // the corresponding RUs over a subchannel, while some others not. For instance,
+      // the first nine 26-tone RUs over an 80 MHz channel occupy the same tones as
+      // the first nine 26-tone RUs over the lowest 40 MHz subchannel. Therefore, we
+      // need to store all the bands in a set (which removes duplicates) and then
+      // pass the elements in the set to AddBand (to which we cannot pass duplicates)
+      if (m_ruBands[channelWidth].empty ())
         {
-          HeRu::RuType ruType = static_cast <HeRu::RuType> (type);
-          for (std::size_t index = 1; index <= HeRu::GetNRus (channelWidth, ruType); index++)
+          for (uint16_t bw = 160; bw >= 20; bw = bw / 2)
             {
-              HeRu::SubcarrierGroup group = HeRu::GetSubcarrierGroup (channelWidth, ruType, index);
-              HeRu::SubcarrierRange range = std::make_pair (group.front ().first, group.back ().second);
-              WifiSpectrumBand band = ConvertHeRuSubcarriers (channelWidth, range);
-              m_interference.AddBand (band);
+              for (uint8_t i = 0; i < (channelWidth / bw); ++i)
+                {
+                  for (unsigned int type = 0; type < 7; type++)
+                    {
+                      HeRu::RuType ruType = static_cast <HeRu::RuType> (type);
+                      std::size_t nRus = HeRu::GetNRus (bw, ruType);
+                      for (std::size_t phyIndex = 1; phyIndex <= nRus; phyIndex++)
+                        {
+                          HeRu::SubcarrierGroup group = HeRu::GetSubcarrierGroup (bw, ruType, phyIndex);
+                          HeRu::SubcarrierRange range = std::make_pair (group.front ().first, group.back ().second);
+                          WifiSpectrumBand band = ConvertHeRuSubcarriers (bw, GetGuardBandwidth (channelWidth),
+                                                                          range, i);
+                          std::size_t index = (bw == 160 && phyIndex > nRus / 2
+                                               ? phyIndex - nRus / 2 : phyIndex);
+                          bool primary80IsLower80 = (GetOperatingChannel ().GetPrimaryChannelIndex (20)
+                                                     < bw / 40);
+                          bool primary80 = (bw < 160
+                                            || ruType == HeRu::RU_2x996_TONE
+                                            || (primary80IsLower80 && phyIndex <= nRus / 2)
+                                            || (!primary80IsLower80 && phyIndex > nRus / 2));
+                          HeRu::RuSpec ru (ruType, index, primary80);
+                          ru.SetPhyIndex (bw, GetOperatingChannel ().GetPrimaryChannelIndex (20));
+                          NS_ABORT_IF (ru.GetPhyIndex () != phyIndex);
+                          m_ruBands[channelWidth].insert ({band, ru});
+                        }
+                    }
+                }
             }
         }
+      for (const auto& bandRuPair : m_ruBands[channelWidth])
+        {
+          m_interference.AddBand (bandRuPair.first);
+        }
     }
 }
 
@@ -286,10 +321,10 @@
           WifiSpectrumBand filteredBand = GetBand (bw, i);
           Ptr<SpectrumValue> filter = WifiSpectrumValueHelper::CreateRfFilter (GetFrequency (), channelWidth, GetBandBandwidth (), GetGuardBandwidth (channelWidth), filteredBand);
           SpectrumValue filteredSignal = (*filter) * (*receivedSignalPsd);
-          NS_LOG_DEBUG ("Signal power received (watts) before antenna gain for" << bw << " MHz channel band " << +i << ": " << Integral (filteredSignal));
+          NS_LOG_DEBUG ("Signal power received (watts) before antenna gain for " << bw << " MHz channel band " << +i << ": " << Integral (filteredSignal));
           double rxPowerPerBandW = Integral (filteredSignal) * DbToRatio (GetRxGain ());
           rxPowerW.insert ({filteredBand, rxPowerPerBandW});
-          NS_LOG_DEBUG ("Signal power received after antenna gain for" << bw << " MHz channel band " << +i << ": " << rxPowerPerBandW << " W (" << WToDbm (rxPowerPerBandW) << " dBm)");
+          NS_LOG_DEBUG ("Signal power received after antenna gain for " << bw << " MHz channel band " << +i << ": " << rxPowerPerBandW << " W (" << WToDbm (rxPowerPerBandW) << " dBm)");
         }
     }
 
@@ -308,21 +343,15 @@
   
   if (GetPhyStandard () >= WIFI_PHY_STANDARD_80211ax)
     {
-      for (unsigned int type = 0; type < 7; type++)
+      NS_ASSERT (!m_ruBands[channelWidth].empty ());
+      for (const auto& bandRuPair : m_ruBands[channelWidth])
         {
-          HeRu::RuType ruType = static_cast <HeRu::RuType> (type);
-          for (std::size_t index = 1; index <= HeRu::GetNRus (channelWidth, ruType); index++)
-            {
-              HeRu::SubcarrierGroup group = HeRu::GetSubcarrierGroup (channelWidth, ruType, index);
-              HeRu::SubcarrierRange range = std::make_pair (group.front ().first, group.back ().second);
-              WifiSpectrumBand band = ConvertHeRuSubcarriers (channelWidth, range);
-              Ptr<SpectrumValue> filter = WifiSpectrumValueHelper::CreateRfFilter (GetFrequency (), channelWidth, GetBandBandwidth (), GetGuardBandwidth (channelWidth), band);
-              SpectrumValue filteredSignal = (*filter) * (*receivedSignalPsd);
-              NS_LOG_DEBUG ("Signal power received (watts) before antenna gain for RU with type " << ruType << " and range (" << range.first << "; " << range.second << ") -> (" << band.first << "; " << band.second <<  "): " << Integral (filteredSignal));
-              double rxPowerPerBandW = Integral (filteredSignal) * DbToRatio (GetRxGain ());
-              NS_LOG_DEBUG ("Signal power received after antenna gain for RU with type " << ruType << " and range (" << range.first << "; " << range.second << ") -> (" << band.first << "; " << band.second <<  "): " << rxPowerPerBandW << " W (" << WToDbm (rxPowerPerBandW) << " dBm)");
-              rxPowerW.insert ({band, rxPowerPerBandW});
-            }
+          Ptr<SpectrumValue> filter = WifiSpectrumValueHelper::CreateRfFilter (GetFrequency (), channelWidth, GetBandBandwidth (), GetGuardBandwidth (channelWidth), bandRuPair.first);
+          SpectrumValue filteredSignal = (*filter) * (*receivedSignalPsd);
+          NS_LOG_DEBUG ("Signal power received (watts) before antenna gain for RU with type " << bandRuPair.second.GetRuType () << " and index " << bandRuPair.second.GetIndex () << " -> (" << bandRuPair.first.first << "; " << bandRuPair.first.second <<  "): " << Integral (filteredSignal));
+          double rxPowerPerBandW = Integral (filteredSignal) * DbToRatio (GetRxGain ());
+          NS_LOG_DEBUG ("Signal power received after antenna gain for RU with type " << bandRuPair.second.GetRuType () << " and index " << bandRuPair.second.GetIndex () << " -> (" << bandRuPair.first.first << "; " << bandRuPair.first.second <<  "): " << rxPowerPerBandW << " W (" << WToDbm (rxPowerPerBandW) << " dBm)");
+          rxPowerW.insert ({bandRuPair.first, rxPowerPerBandW});
         }
     }
 
@@ -333,31 +362,61 @@
   // Log the signal arrival to the trace source
   m_signalCb (wifiRxParams ? true : false, senderNodeId, WToDbm (totalRxPowerW), rxDuration);
 
-  // Do no further processing if signal is too weak
-  // Current implementation assumes constant RX power over the PPDU duration
-  if (WToDbm (totalRxPowerW) < GetRxSensitivity ())
-    {
-      NS_LOG_INFO ("Received signal too weak to process: " << WToDbm (totalRxPowerW) << " dBm");
-      return;
-    }
   if (wifiRxParams == 0)
     {
       NS_LOG_INFO ("Received non Wi-Fi signal");
       m_interference.AddForeignSignal (rxDuration, rxPowerW);
-      SwitchMaybeToCcaBusy ();
+      SwitchMaybeToCcaBusy (GetMeasurementChannelWidth (nullptr));
       return;
     }
   if (wifiRxParams && m_disableWifiReception)
     {
       NS_LOG_INFO ("Received Wi-Fi signal but blocked from syncing");
       m_interference.AddForeignSignal (rxDuration, rxPowerW);
-      SwitchMaybeToCcaBusy ();
+      SwitchMaybeToCcaBusy (GetMeasurementChannelWidth (nullptr));
+      return;
+    }
+  // Do no further processing if signal is too weak
+  // Current implementation assumes constant RX power over the PPDU duration
+  // Compare received TX power per MHz to normalized RX sensitivity
+  uint16_t txWidth = wifiRxParams->ppdu->GetTransmissionChannelWidth ();
+  if (totalRxPowerW < DbmToW (GetRxSensitivity ()) * (txWidth / 20.0))
+    {
+      NS_LOG_INFO ("Received signal too weak to process: " << WToDbm (totalRxPowerW) << " dBm");
       return;
     }
 
+  // Unless we are receiving a TB PPDU, do not sync with this signal if the PPDU
+  // does not overlap with the receiver's primary20 channel
+  if (wifiRxParams->txPhy != 0)
+    {
+      Ptr<WifiNetDevice> dev = DynamicCast<WifiNetDevice> (rxParams->txPhy->GetDevice ());
+      NS_ASSERT (dev != 0);
+      Ptr<WifiPhy> txPhy = dev->GetPhy ();
+      NS_ASSERT (txPhy != 0);
+      uint16_t txChannelWidth = wifiRxParams->ppdu->GetTxVector ().GetChannelWidth ();
+      uint16_t txCenterFreq = txPhy->GetOperatingChannel ().GetPrimaryChannelCenterFrequency (txChannelWidth);
+
+      // if the channel width is a multiple of 20 MHz, then we consider the primary20 channel
+      uint16_t width = (GetChannelWidth () % 20 == 0 ? 20 : GetChannelWidth ());
+      uint16_t p20MinFreq =
+          GetOperatingChannel ().GetPrimaryChannelCenterFrequency (width) - width / 2;
+      uint16_t p20MaxFreq =
+          GetOperatingChannel ().GetPrimaryChannelCenterFrequency (width) + width / 2;
+
+      if (!wifiRxParams->ppdu->CanBeReceived (txCenterFreq, p20MinFreq, p20MaxFreq))
+        {
+          NS_LOG_INFO ("Cannot receive the PPDU, consider it as interference");
+          m_interference.Add (wifiRxParams->ppdu, wifiRxParams->ppdu->GetTxVector (),
+                              rxDuration, rxPowerW);
+          SwitchMaybeToCcaBusy (GetMeasurementChannelWidth (wifiRxParams->ppdu));
+          return;
+        }
+    }
+
   NS_LOG_INFO ("Received Wi-Fi signal");
-  Ptr<WifiPpdu> ppdu = Copy (wifiRxParams->ppdu);
-  StartReceivePreamble (ppdu, rxPowerW);
+  Ptr<WifiPpdu> ppdu = wifiRxParams->ppdu->Copy ();
+  StartReceivePreamble (ppdu, rxPowerW, rxDuration);
 }
 
 Ptr<AntennaModel>
@@ -382,72 +441,23 @@
   m_wifiSpectrumPhyInterface->SetDevice (device);
 }
 
-Ptr<SpectrumValue>
-SpectrumWifiPhy::GetTxPowerSpectralDensity (uint16_t centerFrequency, uint16_t channelWidth, double txPowerW, WifiModulationClass modulationClass) const
-{
-  NS_LOG_FUNCTION (centerFrequency << channelWidth << txPowerW);
-  Ptr<SpectrumValue> v;
-  switch (modulationClass)
-    {
-    case WIFI_MOD_CLASS_OFDM:
-    case WIFI_MOD_CLASS_ERP_OFDM:
-      v = WifiSpectrumValueHelper::CreateOfdmTxPowerSpectralDensity (centerFrequency, channelWidth, txPowerW, GetGuardBandwidth (channelWidth),
-                                                                     m_txMaskInnerBandMinimumRejection, m_txMaskOuterBandMinimumRejection, m_txMaskOuterBandMaximumRejection);
-      break;
-    case WIFI_MOD_CLASS_DSSS:
-    case WIFI_MOD_CLASS_HR_DSSS:
-      NS_ABORT_MSG_IF (channelWidth != 22, "Invalid channel width for DSSS");
-      v = WifiSpectrumValueHelper::CreateDsssTxPowerSpectralDensity (centerFrequency, txPowerW, GetGuardBandwidth (channelWidth));
-      break;
-    case WIFI_MOD_CLASS_HT:
-    case WIFI_MOD_CLASS_VHT:
-      v = WifiSpectrumValueHelper::CreateHtOfdmTxPowerSpectralDensity (centerFrequency, channelWidth, txPowerW, GetGuardBandwidth (channelWidth),
-                                                                       m_txMaskInnerBandMinimumRejection, m_txMaskOuterBandMinimumRejection, m_txMaskOuterBandMaximumRejection);
-      break;
-    case WIFI_MOD_CLASS_HE:
-      v = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (centerFrequency, channelWidth, txPowerW, GetGuardBandwidth (channelWidth),
-                                                                       m_txMaskInnerBandMinimumRejection, m_txMaskOuterBandMinimumRejection, m_txMaskOuterBandMaximumRejection);
-      break;
-    default:
-      NS_FATAL_ERROR ("modulation class unknown: " << modulationClass);
-      break;
-    }
-  return v;
-}
-
-uint16_t
-SpectrumWifiPhy::GetCenterFrequencyForChannelWidth (WifiTxVector txVector) const
+void
+SpectrumWifiPhy::StartTx (Ptr<WifiPpdu> ppdu)
 {
-  NS_LOG_FUNCTION (this << txVector);
-  uint16_t centerFrequencyForSupportedWidth = GetFrequency ();
-  uint16_t supportedWidth = GetChannelWidth ();
-  uint16_t currentWidth = txVector.GetChannelWidth ();
-  if (currentWidth != supportedWidth)
-    {
-      uint16_t startingFrequency = centerFrequencyForSupportedWidth - (supportedWidth / 2);
-      return startingFrequency + (currentWidth / 2); // primary channel is in the lower part (for the time being)
-    }
-  return centerFrequencyForSupportedWidth;
+  NS_LOG_FUNCTION (this << ppdu);
+  GetPhyEntity (ppdu->GetModulation ())->StartTx (ppdu);
 }
 
 void
-SpectrumWifiPhy::StartTx (Ptr<WifiPpdu> ppdu)
+SpectrumWifiPhy::Transmit (Ptr<WifiSpectrumSignalParameters> txParams)
 {
-  NS_LOG_FUNCTION (this << ppdu);
-  WifiTxVector txVector = ppdu->GetTxVector ();
-  double txPowerDbm = GetTxPowerForTransmission (txVector) + GetTxGain ();
-  NS_LOG_DEBUG ("Start transmission: signal power before antenna gain=" << txPowerDbm << "dBm");
-  double txPowerWatts = DbmToW (txPowerDbm);
-  Ptr<SpectrumValue> txPowerSpectrum = GetTxPowerSpectralDensity (GetCenterFrequencyForChannelWidth (txVector), txVector.GetChannelWidth (), txPowerWatts, ppdu->GetModulation ());
-  Ptr<WifiSpectrumSignalParameters> txParams = Create<WifiSpectrumSignalParameters> ();
-  txParams->duration = ppdu->GetTxDuration ();
-  txParams->psd = txPowerSpectrum;
+  NS_LOG_FUNCTION (this << txParams);
+
+  //Finish configuration
   NS_ASSERT_MSG (m_wifiSpectrumPhyInterface, "SpectrumPhy() is not set; maybe forgot to call CreateWifiSpectrumPhyInterface?");
   txParams->txPhy = m_wifiSpectrumPhyInterface->GetObject<SpectrumPhy> ();
   txParams->txAntenna = m_antenna;
-  txParams->ppdu = ppdu;
-  NS_LOG_DEBUG ("Starting transmission with power " << WToDbm (txPowerWatts) << " dBm on channel " << +GetChannelNumber ());
-  NS_LOG_DEBUG ("Starting transmission with integrated spectrum power " << WToDbm (Integral (*txPowerSpectrum)) << " dBm; spectrum model Uid: " << txPowerSpectrum->GetSpectrumModel ()->GetUid ());
+
   m_channel->StartTx (txParams);
 }
 
@@ -459,7 +469,6 @@
     {
     case WIFI_PHY_STANDARD_80211a:
     case WIFI_PHY_STANDARD_80211g:
-    case WIFI_PHY_STANDARD_holland:
     case WIFI_PHY_STANDARD_80211b:
     case WIFI_PHY_STANDARD_80211n:
     case WIFI_PHY_STANDARD_80211ac:
@@ -537,12 +546,13 @@
 }
 
 WifiSpectrumBand
-SpectrumWifiPhy::ConvertHeRuSubcarriers (uint16_t channelWidth, HeRu::SubcarrierRange range) const
+SpectrumWifiPhy::ConvertHeRuSubcarriers (uint16_t bandWidth, uint16_t guardBandwidth,
+                                         HeRu::SubcarrierRange range, uint8_t bandIndex) const
 {
   WifiSpectrumBand convertedSubcarriers;
-  uint32_t nGuardBands = static_cast<uint32_t> (((2 * GetGuardBandwidth (channelWidth) * 1e6) / GetBandBandwidth ()) + 0.5);
+  uint32_t nGuardBands = static_cast<uint32_t> (((2 * guardBandwidth * 1e6) / GetBandBandwidth ()) + 0.5);
   uint32_t centerFrequencyIndex = 0;
-  switch (channelWidth)
+  switch (bandWidth)
     {
     case 20:
       centerFrequencyIndex = (nGuardBands / 2) + 6 + 122;
@@ -557,12 +567,24 @@
       centerFrequencyIndex = (nGuardBands / 2) + 12 + 1012;
       break;
     default:
-      NS_FATAL_ERROR ("ChannelWidth " << channelWidth << " unsupported");
+      NS_FATAL_ERROR ("ChannelWidth " << bandWidth << " unsupported");
       break;
     }
+
+  size_t numBandsInBand = static_cast<size_t> (bandWidth * 1e6 / GetBandBandwidth ());
+  centerFrequencyIndex += numBandsInBand * bandIndex;
+
   convertedSubcarriers.first = centerFrequencyIndex + range.first;
   convertedSubcarriers.second = centerFrequencyIndex + range.second;
   return convertedSubcarriers;
 }
 
+std::tuple<double, double, double>
+SpectrumWifiPhy::GetTxMaskRejectionParams (void) const
+{
+  return std::make_tuple (m_txMaskInnerBandMinimumRejection,
+                          m_txMaskOuterBandMinimumRejection,
+                          m_txMaskOuterBandMaximumRejection);
+}
+
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/spectrum-wifi-phy.h ns-3.34/src/wifi/model/spectrum-wifi-phy.h
--- ns-3.33/src/wifi/model/spectrum-wifi-phy.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/spectrum-wifi-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -29,13 +29,15 @@
 #include "ns3/antenna-model.h"
 #include "ns3/spectrum-channel.h"
 #include "ns3/spectrum-model.h"
-#include "ns3/wifi-spectrum-value-helper.h"
 #include "wifi-phy.h"
+#include <map>
+
+class SpectrumWifiPhyFilterTest;
 
 namespace ns3 {
 
 class WifiSpectrumPhyInterface;
-class WifiPpdu;
+struct WifiSpectrumSignalParameters;
 
 /**
  * \brief 802.11 PHY layer model
@@ -52,6 +54,9 @@
 class SpectrumWifiPhy : public WifiPhy
 {
 public:
+  /// allow SpectrumWifiPhyFilterTest class access
+  friend class ::SpectrumWifiPhyFilterTest;
+
   /**
    * \brief Get the type ID.
    * \return the object TypeId
@@ -62,8 +67,10 @@
   virtual ~SpectrumWifiPhy ();
 
   // Implementation of pure virtual method.
-  void StartTx (Ptr<WifiPpdu> ppdu);
-  Ptr<Channel> GetChannel (void) const;
+  void StartTx (Ptr<WifiPpdu> ppdu) override;
+  Ptr<Channel> GetChannel (void) const override;
+  uint16_t GetGuardBandwidth (uint16_t currentChannelWidth) const override;
+  std::tuple<double, double, double> GetTxMaskRejectionParams (void) const override;
 
   /**
    * Set the SpectrumChannel this SpectrumWifiPhy is to be connected to.
@@ -81,16 +88,6 @@
   void StartRx (Ptr<SpectrumSignalParameters> rxParams);
 
   /**
-   * Get the center frequency of the channel corresponding the current TxVector rather than
-   * that of the supported channel width.
-   * Consider that this "primary channel" is on the lower part for the time being.
-   *
-   * \param txVector the TXVECTOR that has the channel width that is to be used
-   * \return the center frequency in MHz corresponding to the channel width to be used
-   */
-  uint16_t GetCenterFrequencyForChannelWidth (WifiTxVector txVector) const;
-
-  /**
    * Method to encapsulate the creation of the WifiSpectrumPhyInterface
    * object (used to bind the WifiSpectrumPhy to a SpectrumChannel) and
    * to link it to this SpectrumWifiPhy instance
@@ -129,19 +126,6 @@
   uint32_t GetBandBandwidth (void) const;
 
   /**
-   * \param currentChannelWidth channel width of the current transmission (MHz)
-   * \return the width of the guard band (MHz)
-   *
-   * Note: in order to properly model out of band transmissions for OFDM, the guard
-   * band has been configured so as to expand the modeled spectrum up to the
-   * outermost referenced point in "Transmit spectrum mask" sections' PSDs of
-   * each PHY specification of 802.11-2016 standard. It thus ultimately corresponds
-   * to the current channel bandwidth (which can be different from devices max
-   * channel width).
-   */
-  uint16_t GetGuardBandwidth (uint16_t currentChannelWidth) const;
-
-  /**
    * Callback invoked when the PHY model starts to process a signal
    *
    * \param signalType Whether signal is WiFi (true) or foreign (false)
@@ -153,17 +137,22 @@
 
   // The following four methods call to the base WifiPhy class method
   // but also generate a new SpectrumModel if called during runtime
-  virtual void SetChannelNumber (uint8_t id);
-  virtual void SetFrequency (uint16_t freq);
-  virtual void SetChannelWidth (uint16_t channelwidth);
-  virtual void ConfigureStandardAndBand (WifiPhyStandard standard, WifiPhyBand band);
-
+  void SetChannelNumber (uint8_t id) override;
+  void SetFrequency (uint16_t freq) override;
+  void SetChannelWidth (uint16_t channelwidth) override;
+  void ConfigureStandardAndBand (WifiPhyStandard standard, WifiPhyBand band) override;
 
+  /**
+   * This function is sending the signal to the Spectrum channel
+   * after finishing the configuration of the transmit parameters.
+   *
+   * \param txParams the parameters to be provided to the Spectrum channel
+   */
+  void Transmit (Ptr<WifiSpectrumSignalParameters> txParams);
 
 protected:
-  // Inherited
-  void DoDispose (void);
-  void DoInitialize (void);
+  void DoDispose (void) override;
+  void DoInitialize (void) override;
 
   /**
    * Get the start band index and the stop band index for a given band
@@ -173,30 +162,21 @@
    *
    * \return a pair of start and stop indexes that defines the band
    */
-  WifiSpectrumBand GetBand (uint16_t bandWidth, uint8_t bandIndex = 0);
-
+  WifiSpectrumBand GetBand (uint16_t bandWidth, uint8_t bandIndex = 0) override;
 
 private:
   /**
-   * \param centerFrequency center frequency (MHz)
-   * \param channelWidth channel width (MHz) of the channel for the current transmission
-   * \param txPowerW power in W to spread across the bands
-   * \param modulationClass the modulation class
-   * \return Pointer to SpectrumValue
-   *
-   * This is a helper function to create the right TX PSD corresponding
-   * to the standard in use.
-   */
-  Ptr<SpectrumValue> GetTxPowerSpectralDensity (uint16_t centerFrequency, uint16_t channelWidth, double txPowerW, WifiModulationClass modulationClass) const;
-
-  /**
-   * \param channelWidth the total channel width (MHz) used for the OFDMA transmission
+   * \param bandWidth the width (MHz) of the band used for the OFDMA transmission. Must be
+   *                  a multiple of 20 MHz
+   * \param guardBandwidth width of the guard band (MHz)
    * \param range the subcarrier range of the HE RU
+   * \param bandIndex the index (starting at 0) of the band within the operating channel
    * \return the converted subcarriers
    *
    * This is a helper function to convert HE RU subcarriers, which are relative to the center frequency subcarrier, to the indexes used by the Spectrum model.
    */
-  WifiSpectrumBand ConvertHeRuSubcarriers (uint16_t channelWidth, HeRu::SubcarrierRange range) const;
+  WifiSpectrumBand ConvertHeRuSubcarriers (uint16_t bandWidth, uint16_t guardBandwidth,
+                                           HeRu::SubcarrierRange range, uint8_t bandIndex = 0) const override;
 
   /**
    * Perform run-time spectrum model change
@@ -212,6 +192,12 @@
   Ptr<WifiSpectrumPhyInterface> m_wifiSpectrumPhyInterface; //!< Spectrum PHY interface
   Ptr<AntennaModel> m_antenna;                              //!< antenna model
   mutable Ptr<const SpectrumModel> m_rxSpectrumModel;       //!< receive spectrum model
+
+  /// Map a spectrum band associated with an RU to the RU specification
+  typedef std::map<WifiSpectrumBand, HeRu::RuSpec> RuBand;
+
+  std::map<uint16_t, RuBand> m_ruBands;  /**< For each channel width, store all the distinct spectrum
+                                              bands associated with every RU in a channel of that width */
   bool m_disableWifiReception;                              //!< forces this PHY to fail to sync on any signal
   TracedCallback<bool, uint32_t, double, Time> m_signalCb;  //!< Signal callback
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/ssid.h ns-3.34/src/wifi/model/ssid.h
--- ns-3.33/src/wifi/model/ssid.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/ssid.h	2021-07-14 10:31:07.000000000 -0700
@@ -47,11 +47,11 @@
   Ssid (std::string s);
 
   // Implementations of pure virtual methods of WifiInformationElement
-  WifiInformationElementId ElementId () const;
-  uint8_t GetInformationFieldSize () const;
-  void SerializeInformationField (Buffer::Iterator start) const;
+  WifiInformationElementId ElementId () const override;
+  uint8_t GetInformationFieldSize () const override;
+  void SerializeInformationField (Buffer::Iterator start) const override;
   uint8_t DeserializeInformationField (Buffer::Iterator start,
-                                       uint8_t length);
+                                       uint8_t length) override;
 
   /**
    * Check if the two SSIDs are equal.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/sta-wifi-mac.cc ns-3.34/src/wifi/model/sta-wifi-mac.cc
--- ns-3.33/src/wifi/model/sta-wifi-mac.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/sta-wifi-mac.cc	2021-07-14 10:31:07.000000000 -0700
@@ -25,12 +25,11 @@
 #include "ns3/simulator.h"
 #include "sta-wifi-mac.h"
 #include "wifi-phy.h"
-#include "mac-low.h"
 #include "mgt-headers.h"
 #include "snr-tag.h"
 #include "wifi-net-device.h"
-#include "ht-configuration.h"
-#include "he-configuration.h"
+#include "ns3/ht-configuration.h"
+#include "ns3/he-configuration.h"
 
 namespace ns3 {
 
@@ -42,7 +41,7 @@
 StaWifiMac::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::StaWifiMac")
-    .SetParent<InfrastructureWifiMac> ()
+    .SetParent<RegularWifiMac> ()
     .SetGroupName ("Wifi")
     .AddConstructor<StaWifiMac> ()
     .AddAttribute ("ProbeRequestTimeout", "The duration to actively probe the channel.",
@@ -147,14 +146,6 @@
 }
 
 void
-StaWifiMac::SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> stationManager)
-{
-  NS_LOG_FUNCTION (this << stationManager);
-  RegularWifiMac::SetWifiRemoteStationManager (stationManager);
-  m_stationManager->SetPcfSupported (GetPcfSupported ());
-}
-
-void
 StaWifiMac::SendProbeRequest (void)
 {
   NS_LOG_FUNCTION (this);
@@ -264,14 +255,6 @@
 }
 
 void
-StaWifiMac::SendCfPollResponse (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_ASSERT (GetPcfSupported ());
-  m_txop->SendCfFrame (WIFI_MAC_DATA_NULL, GetBssid ());
-}
-
-void
 StaWifiMac::TryToEnsureAssociated (void)
 {
   NS_LOG_FUNCTION (this);
@@ -402,8 +385,16 @@
       return;
     }
   NS_LOG_DEBUG ("beacon missed");
-  SetState (UNASSOCIATED);
-  TryToEnsureAssociated ();
+  // We need to switch to the UNASSOCIATED state. However, if we are receiving
+  // a frame, wait until the RX is completed (otherwise, crashes may occur if
+  // we are receiving a MU frame because its reception requires the STA-ID)
+  Time delay = Seconds (0);
+  if (m_phy->IsStateRx ())
+    {
+      delay = m_phy->GetDelayUntilIdle ();
+    }
+  Simulator::Schedule (delay, &StaWifiMac::SetState, this, UNASSOCIATED);
+  Simulator::Schedule (delay, &StaWifiMac::TryToEnsureAssociated, this);
 }
 
 void
@@ -484,7 +475,7 @@
     }
 
   hdr.SetAddr1 (GetBssid ());
-  hdr.SetAddr2 (m_low->GetAddress ());
+  hdr.SetAddr2 (GetAddress ());
   hdr.SetAddr3 (to);
   hdr.SetDsNotFrom ();
   hdr.SetDsTo ();
@@ -520,10 +511,6 @@
       NotifyRxDrop (packet);
       return;
     }
-  else if ((hdr->GetAddr1 () == GetAddress ()) && (hdr->GetAddr2 () == GetBssid ()) && hdr->IsCfPoll ())
-    {
-      SendCfPollResponse ();
-    }
   if (hdr->IsData ())
     {
       if (!IsAssociated ())
@@ -586,31 +573,18 @@
           NS_LOG_LOGIC ("Beacon is for our SSID");
           goodBeacon = true;
         }
-      CfParameterSet cfParameterSet = beacon.GetCfParameterSet ();
-      if (cfParameterSet.GetCFPCount () == 0)
-        {
-          //see section 9.3.2.2 802.11-1999
-          if (GetPcfSupported ())
-            {
-              m_low->DoNavStartNow (MicroSeconds (cfParameterSet.GetCFPMaxDurationUs ()));
-            }
-          else
-            {
-              m_low->DoNavStartNow (MicroSeconds (cfParameterSet.GetCFPDurRemainingUs ()));
-            }
-        }
       SupportedRates rates = beacon.GetSupportedRates ();
       bool bssMembershipSelectorMatch = false;
-      for (uint8_t i = 0; i < m_phy->GetNBssMembershipSelectors (); i++)
+      auto selectorList = m_phy->GetBssMembershipSelectorList ();
+      for (const auto & selector : selectorList)
         {
-          uint8_t selector = m_phy->GetBssMembershipSelector (i);
           if (rates.IsBssMembershipSelectorRate (selector))
             {
               NS_LOG_LOGIC ("Beacon is matched to our BSS membership selector");
               bssMembershipSelectorMatch = true;
             }
         }
-      if (m_phy->GetNBssMembershipSelectors () > 0 && bssMembershipSelectorMatch == false)
+      if (selectorList.size () > 0 && bssMembershipSelectorMatch == false)
         {
           NS_LOG_LOGIC ("No match for BSS membership selector");
           goodBeacon = false;
@@ -752,9 +726,8 @@
   SetBssid (bssid);
   CapabilityInformation capabilities = beacon.GetCapabilities ();
   SupportedRates rates = beacon.GetSupportedRates ();
-  for (uint8_t i = 0; i < m_phy->GetNModes (); i++)
+  for (const auto & mode : m_phy->GetModeList ())
     {
-      WifiMode mode = m_phy->GetMode (i);
       if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
         {
           m_stationManager->AddSupportedMode (apAddr, mode);
@@ -809,15 +782,6 @@
       else
         {
           m_stationManager->AddStationHtCapabilities (apAddr, htCapabilities);
-          HtOperation htOperation = beacon.GetHtOperation ();
-          if (htOperation.GetNonGfHtStasPresent ())
-            {
-              m_stationManager->SetUseGreenfieldProtection (true);
-            }
-          else
-            {
-              m_stationManager->SetUseGreenfieldProtection (false);
-            }
         }
     }
   if (GetVhtSupported ())
@@ -828,10 +792,9 @@
         {
           m_stationManager->AddStationVhtCapabilities (apAddr, vhtCapabilities);
           VhtOperation vhtOperation = beacon.GetVhtOperation ();
-          for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+          for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_VHT))
             {
-              WifiMode mcs = m_phy->GetMcs (i);
-              if (mcs.GetModulationClass () == WIFI_MOD_CLASS_VHT && vhtCapabilities.IsSupportedRxMcs (mcs.GetMcsValue ()))
+              if (vhtCapabilities.IsSupportedRxMcs (mcs.GetMcsValue ()))
                 {
                   m_stationManager->AddSupportedMcs (apAddr, mcs);
                 }
@@ -850,10 +813,9 @@
         {
           m_stationManager->AddStationHeCapabilities (apAddr, heCapabilities);
           HeOperation heOperation = beacon.GetHeOperation ();
-          for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+          for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HE))
             {
-              WifiMode mcs = m_phy->GetMcs (i);
-              if (mcs.GetModulationClass () == WIFI_MOD_CLASS_HE && heCapabilities.IsSupportedRxMcs (mcs.GetMcsValue ()))
+              if (heCapabilities.IsSupportedRxMcs (mcs.GetMcsValue ()))
                 {
                   m_stationManager->AddSupportedMcs (apAddr, mcs);
                 }
@@ -870,18 +832,16 @@
   NS_LOG_FUNCTION (this << probeResp << apAddr << bssid);
   CapabilityInformation capabilities = probeResp.GetCapabilities ();
   SupportedRates rates = probeResp.GetSupportedRates ();
-  for (uint8_t i = 0; i < m_phy->GetNBssMembershipSelectors (); i++)
+  for (const auto & selector : m_phy->GetBssMembershipSelectorList ())
     {
-      uint8_t selector = m_phy->GetBssMembershipSelector (i);
       if (!rates.IsBssMembershipSelectorRate (selector))
         {
           NS_LOG_DEBUG ("Supported rates do not fit with the BSS membership selector");
           return;
         }
     }
-  for (uint8_t i = 0; i < m_phy->GetNModes (); i++)
+  for (const auto & mode : m_phy->GetModeList ())
     {
-      WifiMode mode = m_phy->GetMode (i);
       if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
         {
           m_stationManager->AddSupportedMode (apAddr, mode);
@@ -896,10 +856,9 @@
   if (GetErpSupported ())
     {
       bool isErpAllowed = false;
-      for (uint8_t i = 0; i < m_phy->GetNModes (); i++)
+      for (const auto & mode : m_phy->GetModeList (WIFI_MOD_CLASS_ERP_OFDM))
         {
-          WifiMode mode = m_phy->GetMode (i);
-          if (mode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM && rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
+          if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
             {
               isErpAllowed = true;
               break;
@@ -943,10 +902,9 @@
   if (GetErpSupported ())
     {
       bool isErpAllowed = false;
-      for (uint8_t i = 0; i < m_phy->GetNModes (); i++)
+      for (const auto & mode : m_phy->GetModeList (WIFI_MOD_CLASS_ERP_OFDM))
         {
-          WifiMode mode = m_phy->GetMode (i);
-          if (mode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM && rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
+          if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
             {
               isErpAllowed = true;
               break;
@@ -1002,15 +960,6 @@
       else
         {
           m_stationManager->AddStationHtCapabilities (apAddr, htCapabilities);
-          HtOperation htOperation = assocResp.GetHtOperation ();
-          if (htOperation.GetNonGfHtStasPresent ())
-            {
-              m_stationManager->SetUseGreenfieldProtection (true);
-            }
-          else
-            {
-              m_stationManager->SetUseGreenfieldProtection (false);
-            }
         }
     }
   if (GetVhtSupported ())
@@ -1033,9 +982,8 @@
           GetHeConfiguration ()->SetAttribute ("BssColor", UintegerValue (heOperation.GetBssColor ()));
         }
     }
-  for (uint8_t i = 0; i < m_phy->GetNModes (); i++)
+  for (const auto & mode : m_phy->GetModeList ())
     {
-      WifiMode mode = m_phy->GetMode (i);
       if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth ())))
         {
           m_stationManager->AddSupportedMode (apAddr, mode);
@@ -1048,10 +996,9 @@
   if (GetHtSupported ())
     {
       HtCapabilities htCapabilities = assocResp.GetHtCapabilities ();
-      for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HT))
         {
-          WifiMode mcs = m_phy->GetMcs (i);
-          if (mcs.GetModulationClass () == WIFI_MOD_CLASS_HT && htCapabilities.IsSupportedMcs (mcs.GetMcsValue ()))
+          if (htCapabilities.IsSupportedMcs (mcs.GetMcsValue ()))
             {
               m_stationManager->AddSupportedMcs (apAddr, mcs);
               //here should add a control to add basic MCS when it is implemented
@@ -1061,10 +1008,9 @@
   if (GetVhtSupported ())
     {
       VhtCapabilities vhtcapabilities = assocResp.GetVhtCapabilities ();
-      for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_VHT))
         {
-          WifiMode mcs = m_phy->GetMcs (i);
-          if (mcs.GetModulationClass () == WIFI_MOD_CLASS_VHT && vhtcapabilities.IsSupportedRxMcs (mcs.GetMcsValue ()))
+          if (vhtcapabilities.IsSupportedRxMcs (mcs.GetMcsValue ()))
             {
               m_stationManager->AddSupportedMcs (apAddr, mcs);
               //here should add a control to add basic MCS when it is implemented
@@ -1079,10 +1025,9 @@
   if (GetHeSupported ())
     {
       HeCapabilities heCapabilities = assocResp.GetHeCapabilities ();
-      for (uint8_t i = 0; i < m_phy->GetNMcs (); i++)
+      for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HE))
         {
-          WifiMode mcs = m_phy->GetMcs (i);
-          if (mcs.GetModulationClass () == WIFI_MOD_CLASS_HE && heCapabilities.IsSupportedRxMcs (mcs.GetMcsValue ()))
+          if (heCapabilities.IsSupportedRxMcs (mcs.GetMcsValue ()))
             {
               m_stationManager->AddSupportedMcs (apAddr, mcs);
               //here should add a control to add basic MCS when it is implemented
@@ -1095,18 +1040,17 @@
 StaWifiMac::GetSupportedRates (void) const
 {
   SupportedRates rates;
-  for (uint8_t i = 0; i < m_phy->GetNModes (); i++)
+  for (const auto & mode : m_phy->GetModeList ())
     {
-      WifiMode mode = m_phy->GetMode (i);
       uint64_t modeDataRate = mode.GetDataRate (m_phy->GetChannelWidth ());
       NS_LOG_DEBUG ("Adding supported rate of " << modeDataRate);
       rates.AddSupportedRate (modeDataRate);
     }
   if (GetHtSupported ())
     {
-      for (uint8_t i = 0; i < m_phy->GetNBssMembershipSelectors (); i++)
+      for (const auto & selector : m_phy->GetBssMembershipSelectorList ())
         {
-          rates.AddBssMembershipSelectorRate (m_phy->GetBssMembershipSelector (i));
+          rates.AddBssMembershipSelectorRate (selector);
         }
     }
   return rates;
@@ -1118,10 +1062,6 @@
   CapabilityInformation capabilities;
   capabilities.SetShortPreamble (m_phy->GetShortPhyPreambleSupported () || GetErpSupported ());
   capabilities.SetShortSlotTime (GetShortSlotTimeSupported () && GetErpSupported ());
-  if (GetPcfSupported ())
-    {
-      capabilities.SetCfPollable ();
-    }
   return capabilities;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/sta-wifi-mac.h ns-3.34/src/wifi/model/sta-wifi-mac.h
--- ns-3.33/src/wifi/model/sta-wifi-mac.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/sta-wifi-mac.h	2021-07-14 10:31:07.000000000 -0700
@@ -23,7 +23,7 @@
 #ifndef STA_WIFI_MAC_H
 #define STA_WIFI_MAC_H
 
-#include "infrastructure-wifi-mac.h"
+#include "regular-wifi-mac.h"
 #include "mgt-headers.h"
 
 class TwoLevelAggregationTest;
@@ -103,7 +103,7 @@
  * 7. The transition from Associated to Unassociated occurs if the number
  *    of missed beacons exceeds the threshold.
  */
-class StaWifiMac : public InfrastructureWifiMac
+class StaWifiMac : public RegularWifiMac
 {
 public:
   /// Allow test cases to access private members
@@ -122,13 +122,6 @@
   virtual ~StaWifiMac ();
 
   /**
-   * Set up WifiRemoteStationManager associated with this StaWifiMac.
-   *
-   * \param stationManager the station manager attached to this MAC.
-   */
-  void SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> stationManager);
-
-  /**
    * \param packet the packet to send.
    * \param to the address to which the packet should be sent.
    *
@@ -136,12 +129,12 @@
    * dequeued as soon as the channel access function determines that
    * access is granted to this MAC.
    */
-  void Enqueue (Ptr<Packet> packet, Mac48Address to);
+  void Enqueue (Ptr<Packet> packet, Mac48Address to) override;
 
   /**
    * \param phy the physical layer attached to this MAC.
    */
-  void SetWifiPhy (const Ptr<WifiPhy> phy);
+  void SetWifiPhy (const Ptr<WifiPhy> phy) override;
 
   /**
    * Return whether we are associated with an AP.
@@ -189,7 +182,7 @@
    *
    * \param mpdu the received MPDU
    */
-  void Receive (Ptr<WifiMacQueueItem> mpdu);
+  void Receive (Ptr<WifiMacQueueItem> mpdu) override;
   /**
    * Update associated AP's information from beacon. If STA is not associated,
    * this information will used for the association process.
@@ -238,10 +231,6 @@
    */
   void SendAssociationRequest (bool isReassoc);
   /**
-   * Forward a CF-Poll response packet to the CFP queue.
-   */
-  void SendCfPollResponse (void);
-  /**
    * Try to ensure that we are associated with an AP by taking an appropriate action
    * depending on the current association status.
    */
@@ -313,7 +302,7 @@
    */
   void PhyCapabilitiesChanged (void);
 
-  void DoInitialize (void);
+  void DoInitialize (void) override;
 
   MacState m_state;            ///< MAC state
   uint16_t m_aid;              ///< Association AID
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/supported-rates.h ns-3.34/src/wifi/model/supported-rates.h
--- ns-3.33/src/wifi/model/supported-rates.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/supported-rates.h	2021-07-14 10:31:07.000000000 -0700
@@ -52,17 +52,17 @@
   ExtendedSupportedRatesIE (SupportedRates *rates);
 
   // Implementations of pure virtual methods of WifiInformationElement
-  WifiInformationElementId ElementId () const;
-  uint8_t GetInformationFieldSize () const;
-  void SerializeInformationField (Buffer::Iterator start) const;
+  WifiInformationElementId ElementId () const override;
+  uint8_t GetInformationFieldSize () const override;
+  void SerializeInformationField (Buffer::Iterator start) const override;
   uint8_t DeserializeInformationField (Buffer::Iterator start,
-                                       uint8_t length);
+                                       uint8_t length) override;
   /* This information element is a bit special in that it is only
     included if there are more than 8 rates. To support this we
     override the Serialize and GetSerializedSize methods of
     WifiInformationElement. */
-  Buffer::Iterator Serialize (Buffer::Iterator start) const;
-  uint16_t GetSerializedSize () const;
+  Buffer::Iterator Serialize (Buffer::Iterator start) const override;
+  uint16_t GetSerializedSize () const override;
 
   /**
    * Set supported rates.
@@ -97,8 +97,12 @@
 public:
   SupportedRates ();
 
-  /// type conversion operator
-  SupportedRates (const SupportedRates &);
+  /**
+   * Type conversion operator
+   *
+   * \param rates the reference const SupportedRates
+   */
+  SupportedRates (const SupportedRates & rates);
 
   // Implementations of pure virtual methods of WifiInformationElement
   WifiInformationElementId ElementId () const;
@@ -108,7 +112,7 @@
                                        uint8_t length);
 
   /**
-   * assignment operator
+   * Assignment operator
    *
    * \param rates the rates to assign
    * \returns the assigned value
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/table-based-error-rate-model.cc ns-3.34/src/wifi/model/table-based-error-rate-model.cc
--- ns-3.33/src/wifi/model/table-based-error-rate-model.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/table-based-error-rate-model.cc	2021-07-14 10:31:07.000000000 -0700
@@ -28,13 +28,14 @@
 #include "table-based-error-rate-model.h"
 #include "wifi-utils.h"
 #include "wifi-tx-vector.h"
-#include "dsss-error-rate-model.h"
+#include "ns3/dsss-error-rate-model.h"
 #include "yans-error-rate-model.h"
 
-static const double SNR_PRECISION = 2;
-
 namespace ns3 {
 
+static const double SNR_PRECISION = 2; //!< precision for SNR
+static const double TABLED_BASED_ERROR_MODEL_PRECISION = 1e-5; //!< precision for PER
+
 NS_OBJECT_ENSURE_REGISTERED (TableBasedErrorRateModel);
 
 NS_LOG_COMPONENT_DEFINE ("TableBasedErrorRateModel");
@@ -140,9 +141,9 @@
 }
 
 double
-TableBasedErrorRateModel::DoGetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint64_t nbits) const
+TableBasedErrorRateModel::DoGetChunkSuccessRate (WifiMode mode, const WifiTxVector& txVector, double snr, uint64_t nbits, uint8_t numRxAntennas, WifiPpduField field, uint16_t staId) const
 {
-  NS_LOG_FUNCTION (this << mode << txVector << snr << nbits);
+  NS_LOG_FUNCTION (this << mode << txVector << snr << nbits << +numRxAntennas << field << staId);
   uint64_t size = std::max<uint64_t> (1, (nbits / 8));
   double roundedSnr = RoundSnr (RatioToDb (snr), SNR_PRECISION);
   uint8_t mcs = GetMcsForMode (mode);
@@ -158,7 +159,7 @@
   if (mcs > (ldpc ? ERROR_TABLE_LDPC_MAX_NUM_MCS : ERROR_TABLE_BCC_MAX_NUM_MCS))
     {
       NS_LOG_WARN ("Table missing for MCS: " << +mcs << " in TableBasedErrorRateModel: use fallback error rate model");
-      return m_fallbackErrorModel->GetChunkSuccessRate (mode, txVector, snr, nbits);
+      return m_fallbackErrorModel->GetChunkSuccessRate (mode, txVector, snr, nbits, staId);
     }
 
   auto errorTable = (ldpc ? AwgnErrorTableLdpc1458 : (size < m_threshold ? AwgnErrorTableBcc32 : AwgnErrorTableBcc1458));
@@ -212,6 +213,11 @@
       per = (1.0 - std::pow ((1 - per), (static_cast<double> (size) / tableSize)));
     }
 
+  if (per < TABLED_BASED_ERROR_MODEL_PRECISION)
+    {
+      per = 0.0;
+    }
+
   return 1.0 - per;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/table-based-error-rate-model.h ns-3.34/src/wifi/model/table-based-error-rate-model.h
--- ns-3.33/src/wifi/model/table-based-error-rate-model.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/table-based-error-rate-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -47,9 +47,6 @@
   TableBasedErrorRateModel ();
   ~TableBasedErrorRateModel ();
 
-  //Inherited from ErrorRateModel
-  double DoGetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint64_t nbits) const;
-
   /**
    * \brief Utility function to convert WifiMode to an MCS value
    * \param mode the WifiMode
@@ -59,6 +56,9 @@
 
 
 private:
+  double DoGetChunkSuccessRate (WifiMode mode, const WifiTxVector& txVector, double snr, uint64_t nbits,
+                                uint8_t numRxAntennas, WifiPpduField field, uint16_t staId) const override;
+
   /**
    * Round SNR (in dB) to the specified precision
    *
@@ -76,7 +76,7 @@
    * \param nbits the number of bits
    * \return the frame success rate for a given Wi-Fi mode, TXVECTOR, SNR and frame size
    */
-  double FetchFsr (WifiMode mode, WifiTxVector txVector, double snr, uint64_t nbits) const;
+  double FetchFsr (WifiMode mode, const WifiTxVector& txVector, double snr, uint64_t nbits) const;
 
   Ptr<ErrorRateModel> m_fallbackErrorModel; //!< Error rate model to fallback to if no value is found in the table
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/threshold-preamble-detection-model.h ns-3.34/src/wifi/model/threshold-preamble-detection-model.h
--- ns-3.33/src/wifi/model/threshold-preamble-detection-model.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/threshold-preamble-detection-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -53,7 +53,7 @@
    * \return true if the preamble has been detected,
    *         false otherwise
    */
-  bool IsPreambleDetected (double rssi, double snr, double channelWidth) const;
+  bool IsPreambleDetected (double rssi, double snr, double channelWidth) const override;
 
 
 private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/txop.cc ns-3.34/src/wifi/model/txop.cc
--- ns-3.33/src/wifi/model/txop.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/txop.cc	2021-07-14 10:31:07.000000000 -0700
@@ -25,14 +25,14 @@
 #include "ns3/socket.h"
 #include "txop.h"
 #include "channel-access-manager.h"
+#include "wifi-mac.h"
 #include "wifi-mac-queue.h"
 #include "mac-tx-middle.h"
-#include "mac-low.h"
 #include "wifi-remote-station-manager.h"
 #include "wifi-mac-trailer.h"
 
 #undef NS_LOG_APPEND_CONTEXT
-#define NS_LOG_APPEND_CONTEXT if (m_low != 0) { std::clog << "[mac=" << m_low->GetAddress () << "] "; }
+#define NS_LOG_APPEND_CONTEXT if (m_stationManager != 0 && m_stationManager->GetMac () != 0) { std::clog << "[mac=" << m_stationManager->GetMac ()->GetAddress () << "] "; }
 
 namespace ns3 {
 
@@ -89,10 +89,9 @@
     m_cwMax (0),
     m_cw (0),
     m_backoff (0),
-    m_accessRequested (false),
+    m_access (NOT_REQUESTED),
     m_backoffSlots (0),
-    m_backoffStart (Seconds (0.0)),
-    m_currentPacket (0)
+    m_backoffStart (Seconds (0.0))
 {
   NS_LOG_FUNCTION (this);
   m_queue = CreateObject<WifiMacQueue> ();
@@ -109,7 +108,6 @@
 {
   NS_LOG_FUNCTION (this);
   m_queue = 0;
-  m_low = 0;
   m_stationManager = 0;
   m_rng = 0;
   m_txMiddle = 0;
@@ -131,13 +129,6 @@
 }
 
 void
-Txop::SetMacLow (const Ptr<MacLow> low)
-{
-  NS_LOG_FUNCTION (this << low);
-  m_low = low;
-}
-
-void
 Txop::SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> remoteManager)
 {
   NS_LOG_FUNCTION (this << remoteManager);
@@ -145,34 +136,14 @@
 }
 
 void
-Txop::SetTxOkCallback (TxOk callback)
-{
-  NS_LOG_FUNCTION (this << &callback);
-  m_txOkCallback = callback;
-}
-
-void
-Txop::SetTxFailedCallback (TxFailed callback)
-{
-  NS_LOG_FUNCTION (this << &callback);
-  m_txFailedCallback = callback;
-}
-
-void
-Txop::SetTxDroppedCallback (TxDropped callback)
+Txop::SetDroppedMpduCallback (DroppedMpdu callback)
 {
   NS_LOG_FUNCTION (this << &callback);
-  m_txDroppedCallback = callback;
-  m_queue->TraceConnectWithoutContext ("Drop", MakeCallback (&Txop::TxDroppedPacket, this));
-}
-
-void
-Txop::TxDroppedPacket (Ptr<const WifiMacQueueItem> item)
-{
-  if (!m_txDroppedCallback.IsNull ())
-    {
-      m_txDroppedCallback (item->GetPacket ());
-    }
+  m_droppedMpduCallback = callback;
+  m_queue->TraceConnectWithoutContext ("DropBeforeEnqueue",
+                                       m_droppedMpduCallback.Bind (WIFI_MAC_DROP_FAILED_ENQUEUE));
+  m_queue->TraceConnectWithoutContext ("Expired",
+                                       m_droppedMpduCallback.Bind (WIFI_MAC_DROP_EXPIRED_LIFETIME));
 }
 
 Ptr<WifiMacQueue >
@@ -191,7 +162,6 @@
   if (changed == true)
     {
       ResetCw ();
-      m_cwTrace = GetCw ();
     }
 }
 
@@ -204,7 +174,6 @@
   if (changed == true)
     {
       ResetCw ();
-      m_cwTrace = GetCw ();
     }
 }
 
@@ -219,6 +188,7 @@
 {
   NS_LOG_FUNCTION (this);
   m_cw = m_cwMin;
+  m_cwTrace = m_cw;
 }
 
 void
@@ -227,6 +197,7 @@
   NS_LOG_FUNCTION (this);
   //see 802.11-2012, section 9.19.2.5
   m_cw = std::min ( 2 * (m_cw + 1) - 1, m_cwMax);
+  m_cwTrace = m_cw;
 }
 
 uint32_t
@@ -308,7 +279,7 @@
 bool
 Txop::HasFramesToTransmit (void)
 {
-  bool ret = (m_currentPacket != 0 || !m_queue->IsEmpty ());
+  bool ret = (!m_queue->IsEmpty ());
   NS_LOG_FUNCTION (this << ret);
   return ret;
 }
@@ -337,215 +308,61 @@
 }
 
 void
-Txop::RestartAccessIfNeeded (void)
-{
-  NS_LOG_FUNCTION (this);
-  if ((m_currentPacket != 0
-       || !m_queue->IsEmpty ())
-      && !IsAccessRequested ()
-      && !m_low->IsCfPeriod ())
-    {
-      m_channelAccessManager->RequestAccess (this);
-    }
-}
-
-void
 Txop::StartAccessIfNeeded (void)
 {
   NS_LOG_FUNCTION (this);
-  if (m_currentPacket == 0
-      && !m_queue->IsEmpty ()
-      && !IsAccessRequested ()
-      && !m_low->IsCfPeriod ())
+  if (HasFramesToTransmit () && m_access == NOT_REQUESTED)
     {
       m_channelAccessManager->RequestAccess (this);
     }
 }
 
-Ptr<MacLow>
-Txop::GetLow (void) const
-{
-  return m_low;
-}
-
 void
 Txop::DoInitialize ()
 {
   NS_LOG_FUNCTION (this);
   ResetCw ();
-  m_cwTrace = GetCw ();
   GenerateBackoff ();
 }
 
-bool
-Txop::NeedRtsRetransmission (Ptr<const Packet> packet, const WifiMacHeader &hdr)
-{
-  NS_LOG_FUNCTION (this);
-  return m_stationManager->NeedRetransmission (hdr.GetAddr1 (), &hdr, packet);
-}
-
-bool
-Txop::NeedDataRetransmission (Ptr<const Packet> packet, const WifiMacHeader &hdr)
-{
-  NS_LOG_FUNCTION (this);
-  return m_stationManager->NeedRetransmission (hdr.GetAddr1 (), &hdr, packet);
-}
-
-bool
-Txop::NeedFragmentation (void) const
+Txop::ChannelAccessStatus
+Txop::GetAccessStatus (void) const
 {
-  NS_LOG_FUNCTION (this);
-  return m_stationManager->NeedFragmentation (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                              m_currentPacket);
+  return m_access;
 }
 
 void
-Txop::NextFragment (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_fragmentNumber++;
-}
-
-uint32_t
-Txop::GetFragmentSize (void) const
-{
-  NS_LOG_FUNCTION (this);
-  return m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                            m_currentPacket, m_fragmentNumber);
-}
-
-bool
-Txop::IsLastFragment (void) const
+Txop::NotifyAccessRequested (void)
 {
   NS_LOG_FUNCTION (this);
-  return m_stationManager->IsLastFragment (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                           m_currentPacket, m_fragmentNumber);
+  m_access = REQUESTED;
 }
 
-uint32_t
-Txop::GetNextFragmentSize (void) const
+void
+Txop::NotifyChannelAccessed (Time txopDuration)
 {
-  NS_LOG_FUNCTION (this);
-  return m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                            m_currentPacket, m_fragmentNumber + 1);
+  NS_LOG_FUNCTION (this << txopDuration);
+  m_access = GRANTED;
 }
 
-uint32_t
-Txop::GetFragmentOffset (void) const
+void
+Txop::NotifyChannelReleased (void)
 {
   NS_LOG_FUNCTION (this);
-  return m_stationManager->GetFragmentOffset (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                              m_currentPacket, m_fragmentNumber);
-}
-
-Ptr<Packet>
-Txop::GetFragmentPacket (WifiMacHeader *hdr)
-{
-  NS_LOG_FUNCTION (this << hdr);
-  *hdr = m_currentHdr;
-  hdr->SetFragmentNumber (m_fragmentNumber);
-  uint32_t startOffset = GetFragmentOffset ();
-  Ptr<Packet> fragment;
-  if (IsLastFragment ())
-    {
-      hdr->SetNoMoreFragments ();
-    }
-  else
+  m_access = NOT_REQUESTED;
+  GenerateBackoff ();
+  if (HasFramesToTransmit ())
     {
-      hdr->SetMoreFragments ();
+      Simulator::ScheduleNow (&Txop::RequestAccess, this);
     }
-  fragment = m_currentPacket->CreateFragment (startOffset,
-                                              GetFragmentSize ());
-  return fragment;
-}
-
-bool
-Txop::IsAccessRequested (void) const
-{
-  return m_accessRequested;
 }
 
 void
-Txop::NotifyAccessRequested (void)
+Txop::RequestAccess (void)
 {
-  NS_LOG_FUNCTION (this);
-  m_accessRequested = true;
-}
-
-void
-Txop::NotifyAccessGranted (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_ASSERT (m_accessRequested);
-  m_accessRequested = false;
-  if (m_currentPacket == 0)
-    {
-      if (m_queue->IsEmpty ())
-        {
-          NS_LOG_DEBUG ("queue empty");
-          return;
-        }
-      Ptr<WifiMacQueueItem> item = m_queue->Dequeue ();
-      NS_ASSERT (item != 0);
-      m_currentPacket = item->GetPacket ();
-      m_currentHdr = item->GetHeader ();
-      NS_ASSERT (m_currentPacket != 0);
-      uint16_t sequence = m_txMiddle->GetNextSequenceNumberFor (&m_currentHdr);
-      m_currentHdr.SetSequenceNumber (sequence);
-      m_stationManager->UpdateFragmentationThreshold ();
-      m_currentHdr.SetFragmentNumber (0);
-      m_currentHdr.SetNoMoreFragments ();
-      m_currentHdr.SetNoRetry ();
-      m_fragmentNumber = 0;
-      NS_LOG_DEBUG ("dequeued size=" << m_currentPacket->GetSize () <<
-                    ", to=" << m_currentHdr.GetAddr1 () <<
-                    ", seq=" << m_currentHdr.GetSequenceControl ());
-    }
-  if (m_currentHdr.GetAddr1 ().IsGroup ())
+  if (m_access == NOT_REQUESTED)
     {
-      m_currentParams.DisableRts ();
-      m_currentParams.DisableAck ();
-      m_currentParams.DisableNextData ();
-      NS_LOG_DEBUG ("tx broadcast");
-      GetLow ()->StartTransmission (Create<WifiMacQueueItem> (m_currentPacket, m_currentHdr),
-                                    m_currentParams, this);
-    }
-  else
-    {
-      m_currentParams.EnableAck ();
-      if (NeedFragmentation ())
-        {
-          m_currentParams.DisableRts ();
-          WifiMacHeader hdr;
-          Ptr<Packet> fragment = GetFragmentPacket (&hdr);
-          if (IsLastFragment ())
-            {
-              NS_LOG_DEBUG ("fragmenting last fragment size=" << fragment->GetSize ());
-              m_currentParams.DisableNextData ();
-            }
-          else
-            {
-              NS_LOG_DEBUG ("fragmenting size=" << fragment->GetSize ());
-              m_currentParams.EnableNextData (GetNextFragmentSize ());
-            }
-          GetLow ()->StartTransmission (Create<WifiMacQueueItem> (fragment, hdr),
-                                        m_currentParams, this);
-        }
-      else
-        {
-          uint32_t size = m_currentHdr.GetSize () + m_currentPacket->GetSize () + WIFI_MAC_FCS_LENGTH;
-          if (m_stationManager->NeedRts (m_currentHdr, size) && !m_low->IsCfPeriod ())
-            {
-              m_currentParams.EnableRts ();
-            }
-          else
-            {
-              m_currentParams.DisableRts ();
-            }
-          m_currentParams.DisableNextData ();
-          GetLow ()->StartTransmission (Create<WifiMacQueueItem> (m_currentPacket, m_currentHdr),
-                                        m_currentParams, this);
-        }
+      m_channelAccessManager->RequestAccess (this);
     }
 }
 
@@ -563,7 +380,7 @@
 {
   NS_LOG_FUNCTION (this);
   GenerateBackoff ();
-  RestartAccessIfNeeded ();
+  StartAccessIfNeeded ();
 }
 
 void
@@ -571,18 +388,12 @@
 {
   NS_LOG_FUNCTION (this);
   m_queue->Flush ();
-  m_currentPacket = 0;
 }
 
 void
 Txop::NotifySleep (void)
 {
   NS_LOG_FUNCTION (this);
-  if (m_currentPacket != 0)
-    {
-      m_queue->PushFront (Create<WifiMacQueueItem> (m_currentPacket, m_currentHdr));
-      m_currentPacket = 0;
-    }
 }
 
 void
@@ -590,308 +401,32 @@
 {
   NS_LOG_FUNCTION (this);
   m_queue->Flush ();
-  m_currentPacket = 0;
 }
 
 void
 Txop::NotifyWakeUp (void)
 {
   NS_LOG_FUNCTION (this);
-  RestartAccessIfNeeded ();
-}
-
-void
-Txop::NotifyOn (void)
-{
-  NS_LOG_FUNCTION (this);
   StartAccessIfNeeded ();
 }
 
 void
-Txop::MissedCts (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("missed cts");
-  if (!NeedRtsRetransmission (m_currentPacket, m_currentHdr))
-    {
-      NS_LOG_DEBUG ("Cts Fail");
-      m_stationManager->ReportFinalRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
-      if (!m_txFailedCallback.IsNull ())
-        {
-          m_txFailedCallback (m_currentHdr);
-        }
-      //to reset the Txop.
-      m_currentPacket = 0;
-      ResetCw ();
-      m_cwTrace = GetCw ();
-    }
-  else
-    {
-      UpdateFailedCw ();
-      m_cwTrace = GetCw ();
-    }
-  GenerateBackoff ();
-  RestartAccessIfNeeded ();
-}
-
-void
-Txop::GotAck (void)
-{
-  NS_LOG_FUNCTION (this);
-  if (!NeedFragmentation ()
-      || IsLastFragment ())
-    {
-      NS_LOG_DEBUG ("got ack. tx done.");
-      if (!m_txOkCallback.IsNull ())
-        {
-          m_txOkCallback (m_currentHdr);
-        }
-
-      /* we are not fragmenting or we are done fragmenting
-       * so we can get rid of that packet now.
-       */
-      m_currentPacket = 0;
-      ResetCw ();
-      m_cwTrace = GetCw ();
-      GenerateBackoff ();
-      RestartAccessIfNeeded ();
-    }
-  else
-    {
-      NS_LOG_DEBUG ("got ack. tx not done, size=" << m_currentPacket->GetSize ());
-    }
-}
-
-void
-Txop::MissedAck (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("missed ack");
-  if (!NeedDataRetransmission (m_currentPacket, m_currentHdr))
-    {
-      NS_LOG_DEBUG ("Ack Fail");
-      m_stationManager->ReportFinalDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                               m_currentPacket->GetSize ());
-      if (!m_txFailedCallback.IsNull ())
-        {
-          m_txFailedCallback (m_currentHdr);
-        }
-      //to reset the Txop.
-      m_currentPacket = 0;
-      ResetCw ();
-      m_cwTrace = GetCw ();
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Retransmit");
-      m_stationManager->ReportDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                          m_currentPacket->GetSize ());
-      m_currentHdr.SetRetry ();
-      UpdateFailedCw ();
-      m_cwTrace = GetCw ();
-    }
-  GenerateBackoff ();
-  RestartAccessIfNeeded ();
-}
-
-void
-Txop::GotCfEnd (void)
-{
-  NS_LOG_FUNCTION (this);
-  if (m_currentPacket != 0)
-    {
-      RestartAccessIfNeeded ();
-    }
-  else
-    {
-      StartAccessIfNeeded ();
-    }
-}
-
-void
-Txop::MissedCfPollResponse (bool expectedCfAck)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("missed response to CF-POLL");
-  if (expectedCfAck)
-    {
-      if (!NeedDataRetransmission (m_currentPacket, m_currentHdr))
-        {
-          NS_LOG_DEBUG ("Ack Fail");
-          m_stationManager->ReportFinalDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                                   m_currentPacket->GetSize ());
-          m_currentPacket = 0;
-        }
-      else
-        {
-          NS_LOG_DEBUG ("Retransmit");
-          m_currentHdr.SetRetry ();
-        }
-    }
-  if (!m_txFailedCallback.IsNull ())
-    {
-      m_txFailedCallback (m_currentHdr);
-    }
-}
-
-void
-Txop::StartNextFragment (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("start next packet fragment");
-  /* this callback is used only for fragments. */
-  NextFragment ();
-  WifiMacHeader hdr;
-  Ptr<Packet> fragment = GetFragmentPacket (&hdr);
-  m_currentParams.EnableAck ();
-  m_currentParams.DisableRts ();
-  if (IsLastFragment ())
-    {
-      m_currentParams.DisableNextData ();
-    }
-  else
-    {
-      m_currentParams.EnableNextData (GetNextFragmentSize ());
-    }
-  GetLow ()->StartTransmission (Create<WifiMacQueueItem> (fragment, hdr), m_currentParams, this);
-}
-
-void
-Txop::Cancel (void)
-{
-  NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("transmission cancelled");
-}
-
-void
-Txop::EndTxNoAck (void)
+Txop::NotifyOn (void)
 {
   NS_LOG_FUNCTION (this);
-  NS_LOG_DEBUG ("a transmission that did not require an ACK just finished");
-  m_currentPacket = 0;
-  ResetCw ();
-  m_cwTrace = GetCw ();
-  GenerateBackoff ();
-  if (!m_txOkCallback.IsNull ())
-    {
-      m_txOkCallback (m_currentHdr);
-    }
   StartAccessIfNeeded ();
 }
 
-void
-Txop::SendCfFrame (WifiMacType frameType, Mac48Address addr)
-{
-  NS_LOG_FUNCTION (this << frameType << addr);
-  NS_ASSERT (m_low->IsCfPeriod ());
-  if (m_currentPacket != 0 && frameType != WIFI_MAC_CTL_END)
-    {
-      if (!NeedDataRetransmission (m_currentPacket, m_currentHdr))
-        {
-          m_stationManager->ReportFinalDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr,
-                                                   m_currentPacket->GetSize ());
-          m_currentPacket = 0;
-        }
-      else
-        {
-          m_currentHdr.SetRetry ();
-        }
-    }
-  else if ((m_queue->GetNPacketsByAddress (addr) > 0) && (frameType != WIFI_MAC_CTL_END)) //if no packet for that dest, send to another dest?
-    {
-      Ptr<WifiMacQueueItem> item = m_queue->DequeueByAddress (addr);
-      NS_ASSERT (item != 0);
-      m_currentPacket = item->GetPacket ();
-      m_currentHdr = item->GetHeader ();
-      uint16_t sequence = m_txMiddle->GetNextSequenceNumberFor (&m_currentHdr);
-      m_currentHdr.SetSequenceNumber (sequence);
-      m_currentHdr.SetFragmentNumber (0);
-      m_currentHdr.SetNoMoreFragments ();
-      m_currentHdr.SetNoRetry ();
-    }
-  else
-    {
-      m_currentPacket = Create<Packet> ();
-      m_currentHdr.SetNoRetry ();
-    }
-
-  if (m_currentPacket->GetSize () > 0)
-    {
-      switch (frameType)
-        {
-        case WIFI_MAC_DATA_NULL_CFPOLL:
-          m_currentHdr.SetType (WIFI_MAC_DATA_CFPOLL);
-          break;
-        case WIFI_MAC_DATA_NULL:
-          m_currentHdr.SetType (WIFI_MAC_DATA);
-          break;
-        default:
-          NS_ASSERT (false);
-          break;
-        }
-    }
-  else
-    {
-      m_currentHdr.SetType (frameType);
-    }
-  m_currentHdr.SetAddr1 (addr);
-  m_currentHdr.SetAddr2 (m_low->GetAddress ());
-  if (frameType == WIFI_MAC_DATA_NULL)
-    {
-      m_currentHdr.SetAddr3 (m_low->GetBssid ());
-      m_currentHdr.SetDsTo ();
-      m_currentHdr.SetDsNotFrom ();
-    }
-  else
-    {
-      m_currentHdr.SetAddr3 (m_low->GetAddress ());
-      m_currentHdr.SetDsNotTo ();
-      m_currentHdr.SetDsFrom ();
-    }
-  m_channelAccessManager->RequestAccess (this, true);
-}
-
-bool
-Txop::CanStartNextPolling () const
-{
-  return (!m_channelAccessManager->IsBusy () && GetLow ()->CanTransmitNextCfFrame ());
-}
-
 bool
 Txop::IsQosTxop () const
 {
   return false;
 }
 
-void
-Txop::StartNextPacket (void)
-{
-  NS_LOG_WARN ("StartNext should not be called for non QoS!");
-}
-
-void
-Txop::GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address recipient, double rxSnr, double dataSnr, WifiTxVector dataTxVector)
-{
-  NS_LOG_WARN ("GotBlockAck should not be called for non QoS!");
-}
-
-void
-Txop::MissedBlockAck (uint8_t nMpdus)
-{
-  NS_LOG_WARN ("MissedBlockAck should not be called for non QoS!");
-}
-
-Time
-Txop::GetTxopRemaining (void) const
-{
-  NS_LOG_WARN ("GetTxopRemaining should not be called for non QoS!");
-  return Seconds (0);
-}
-
-void
-Txop::TerminateTxop (void)
+AcIndex
+Txop::GetAccessCategory (void) const
 {
-  NS_LOG_WARN ("TerminateTxop should not be called for non QoS!");
+  return AC_BE_NQOS;
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/txop.h ns-3.34/src/wifi/model/txop.h
--- ns-3.33/src/wifi/model/txop.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/txop.h	2021-07-14 10:31:07.000000000 -0700
@@ -22,7 +22,6 @@
 #define TXOP_H
 
 #include "ns3/traced-value.h"
-#include "mac-low-transmission-parameters.h"
 #include "wifi-mac-header.h"
 
 namespace ns3 {
@@ -30,14 +29,14 @@
 class Packet;
 class ChannelAccessManager;
 class MacTxMiddle;
-class MacLow;
 class WifiMode;
 class WifiMacQueue;
 class WifiMacQueueItem;
 class UniformRandomVariable;
 class CtrlBAckResponseHeader;
 class WifiRemoteStationManager;
-class WifiTxVector;
+enum WifiMacDropReason : uint8_t;  // opaque enum declaration
+enum AcIndex : uint8_t;
 
 /**
  * \brief Handle packet fragmentation and retransmissions
@@ -79,20 +78,19 @@
   static TypeId GetTypeId (void);
 
   /**
-   * typedef for a callback to invoke when a
-   * packet transmission was completed successfully.
+   * typedef for a callback to invoke when an MPDU is dropped.
    */
-  typedef Callback <void, const WifiMacHeader&> TxOk;
-  /**
-   * typedef for a callback to invoke when a
-   * packet transmission was failed.
-   */
-  typedef Callback <void, const WifiMacHeader&> TxFailed;
+  typedef Callback <void, WifiMacDropReason, Ptr<const WifiMacQueueItem> > DroppedMpdu;
+
   /**
-   * typedef for a callback to invoke when a
-   * packet is dropped.
+   * Enumeration for channel access status
    */
-  typedef Callback <void, Ptr<const Packet> > TxDropped;
+  enum ChannelAccessStatus
+  {
+    NOT_REQUESTED = 0,
+    REQUESTED,
+    GRANTED
+  };
 
   /**
    * Check for QoS TXOP.
@@ -100,13 +98,13 @@
    * \returns true if QoS TXOP.
    */
   virtual bool IsQosTxop () const;
-
   /**
-   * Set MacLow associated with this Txop.
+   * Get the access category.
    *
-   * \param low MacLow to associate.
+   * \return the access category.
    */
-  void SetMacLow (const Ptr<MacLow> low);
+  virtual AcIndex GetAccessCategory (void) const;
+
   /**
    * Set ChannelAccessManager this Txop is associated to.
    *
@@ -127,27 +125,9 @@
   void SetTxMiddle (const Ptr<MacTxMiddle> txMiddle);
 
   /**
-   * \param callback the callback to invoke when a
-   * packet transmission was completed successfully.
-   */
-  void SetTxOkCallback (TxOk callback);
-  /**
-   * \param callback the callback to invoke when a
-   *        packet transmission was completed unsuccessfully.
+   * \param callback the callback to invoke when an MPDU is dropped
    */
-  void SetTxFailedCallback (TxFailed callback);
-  /**
-   * \param callback the callback to invoke when a
-   *        packet is dropped.
-   */
-  void SetTxDroppedCallback (TxDropped callback);
-
-  /**
-   * Return the MacLow associated with this Txop.
-   *
-   * \return the associated MacLow
-   */
-  Ptr<MacLow> GetLow (void) const;
+  virtual void SetDroppedMpduCallback (DroppedMpdu callback);
 
   /**
    * Return the packet queue associated with this Txop.
@@ -205,6 +185,19 @@
    * \return the TXOP limit.
    */
   Time GetTxopLimit (void) const;
+  /**
+   * Update the value of the CW variable to take into account
+   * a transmission success or a transmission abort (stop transmission
+   * of a packet after the maximum number of retransmissions has been
+   * reached). By default, this resets the CW variable to minCW.
+   */
+  void ResetCw (void);
+  /**
+   * Update the value of the CW variable to take into account
+   * a transmission failure. By default, this triggers a doubling
+   * of CW (capped by maxCW).
+   */
+  void UpdateFailedCw (void);
 
   /**
    * When a channel switching occurs, enqueued packets are removed.
@@ -239,91 +232,17 @@
   virtual void Queue (Ptr<Packet> packet, const WifiMacHeader &hdr);
 
   /**
-   * Sends CF frame to STA with address <i>addr</i>.
-   *
-   * \param frameType the type of frame to be transmitted.
-   * \param addr address of the recipient.
-   */
-  void SendCfFrame (WifiMacType frameType, Mac48Address addr);
-
-  /* Event handlers */
-  /**
-   * Event handler when a CTS timeout has occurred.
-   */
-  virtual void MissedCts (void);
-  /**
-   * Event handler when an Ack is received.
-   */
-  virtual void GotAck (void);
-  /**
-   * Event handler when an Ack is missed.
-   */
-  virtual void MissedAck (void);
-  /**
-   * Event handler when a CF-END frame is received.
-   */
-  void GotCfEnd (void);
-  /**
-   * Event handler when a response to a CF-POLL frame is missed.
-   *
-   * \param expectedCfAck flag to indicate whether a CF-Ack was expected in the response.
-   */
-  void MissedCfPollResponse (bool expectedCfAck);
-  /**
-   * Event handler when a BlockAck is received.
-   *
-   * \param blockAck BlockAck header.
-   * \param recipient address of the recipient.
-   * \param rxSnr SNR of the BlockAck itself in linear scale.
-   * \param dataSnr reported data SNR from the peer in linear scale.
-   * \param dataTxVector TXVECTOR used to send the Data.
-   */
-  virtual void GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address recipient,
-                            double rxSnr, double dataSnr, WifiTxVector dataTxVector);
-  /**
-   * Event handler when a BlockAck timeout has occurred.
-   * \param nMpdus the number of MPDUs sent in the A-MPDU transmission that results in a BlockAck timeout.
-   */
-  virtual void MissedBlockAck (uint8_t nMpdus);
-
-  /**
-   * Start transmission for the next fragment.
-   * This is called for fragment only.
-   */
-  virtual void StartNextFragment (void);
-  /**
-   * Cancel the transmission.
-   */
-  virtual void Cancel (void);
-  /**
-   * Start transmission for the next packet if allowed by the TxopLimit.
-   */
-  virtual void StartNextPacket (void);
-  /**
-   * Event handler when a transmission that
-   * does not require an Ack has completed.
-   */
-  virtual void EndTxNoAck (void);
-
-  /**
-   * Return the remaining duration in the current TXOP.
+   * Called by the FrameExchangeManager to notify that channel access has
+   * been granted for the given amount of time.
    *
-   * \return the remaining duration in the current TXOP.
+   * \param txopDuration the duration of the TXOP gained (zero for DCF)
    */
-  virtual Time GetTxopRemaining (void) const;
+  virtual void NotifyChannelAccessed (Time txopDuration = Seconds (0));
   /**
-   * Update backoff and restart access if needed.
+   * Called by the FrameExchangeManager to notify the completion of the transmissions.
+   * This method generates a new backoff and restarts access if needed.
    */
-  virtual void TerminateTxop (void);
-
-  /**
-   * Check if the next PCF transmission can fit in the remaining CFP duration.
-   *
-   * \return true if the next PCF transmission can fit in the remaining CFP duration,
-   *         false otherwise
-   */
-  bool CanStartNextPolling (void) const;
-
+  virtual void NotifyChannelReleased (void);
 
   /**
    * Assign a fixed random variable stream number to the random variables
@@ -337,10 +256,9 @@
   int64_t AssignStreams (int64_t stream);
 
   /**
-   * \returns true if access has been requested for this function and
-   *          has not been granted already, false otherwise.
+   * \return the current channel access status.
    */
-  virtual bool IsAccessRequested (void) const;
+  virtual ChannelAccessStatus GetAccessStatus (void) const;
 
   /**
    * \param nSlots the number of slots of the backoff.
@@ -354,8 +272,8 @@
   ///< ChannelAccessManager associated class
   friend class ChannelAccessManager;
 
-  virtual void DoDispose (void);
-  virtual void DoInitialize (void);
+  void DoDispose (void) override;
+  void DoInitialize (void) override;
 
   /* Txop notifications forwarded here */
   /**
@@ -363,10 +281,6 @@
    */
   virtual void NotifyAccessRequested (void);
   /**
-   * Notify the Txop that access has been granted.
-   */
-  virtual void NotifyAccessGranted (void);
-  /**
    * Notify the Txop that internal collision has occurred.
    */
   virtual void NotifyInternalCollision (void);
@@ -381,13 +295,13 @@
    */
   virtual void GenerateBackoff (void);
   /**
-   * Restart access request if needed.
-   */
-  virtual void RestartAccessIfNeeded (void);
-  /**
    * Request access from Txop if needed.
    */
   virtual void StartAccessIfNeeded (void);
+  /**
+   * Request access to the ChannelAccessManager
+   */
+  void RequestAccess (void);
 
   /**
    * \returns the current value of the CW variable. The initial value is
@@ -395,19 +309,6 @@
    */
   uint32_t GetCw (void) const;
   /**
-   * Update the value of the CW variable to take into account
-   * a transmission success or a transmission abort (stop transmission
-   * of a packet after the maximum number of retransmissions has been
-   * reached). By default, this resets the CW variable to minCW.
-   */
-  void ResetCw (void);
-  /**
-   * Update the value of the CW variable to take into account
-   * a transmission failure. By default, this triggers a doubling
-   * of CW (capped by maxCW).
-   */
-  void UpdateFailedCw (void);
-  /**
    * Return the current number of backoff slots.
    *
    * \return the current number of backoff slots
@@ -427,97 +328,19 @@
    */
   void UpdateBackoffSlotsNow (uint32_t nSlots, Time backoffUpdateBound);
 
-  /**
-   * Check if RTS should be re-transmitted if CTS was missed.
-   *
-   * \param packet current packet being transmitted.
-   * \param hdr current header being transmitted.
-   * \return true if RTS should be re-transmitted,
-   *         false otherwise.
-   */
-  bool NeedRtsRetransmission (Ptr<const Packet> packet, const WifiMacHeader &hdr);
-  /**
-   * Check if Data should be re-transmitted if Ack was missed.
-   *
-   * \param packet current packet being transmitted.
-   * \param hdr current header being transmitted.
-   * \return true if Data should be re-transmitted,
-   *         false otherwise.
-   */
-  bool NeedDataRetransmission (Ptr<const Packet> packet, const WifiMacHeader &hdr);
-  /**
-   * Check if the current packet should be fragmented.
-   *
-   * \return true if the current packet should be fragmented,
-   *         false otherwise
-   */
-  virtual bool NeedFragmentation (void) const;
-
-  /**
-   * Continue to the next fragment. This method simply
-   * increments the internal variable that keep track
-   * of the current fragment number.
-   */
-  void NextFragment (void);
-  /**
-   * Get the next fragment from the packet with
-   * appropriate Wifi header for the fragment.
-   *
-   * \param hdr Wi-Fi header.
-   *
-   * \return the fragment with the current fragment number.
-   */
-  virtual Ptr<Packet> GetFragmentPacket (WifiMacHeader *hdr);
-  /**
-   * Calculate the size of the next fragment.
-   *
-   * \return the size of the next fragment in bytes.
-   */
-  virtual uint32_t GetNextFragmentSize (void) const;
-  /**
-   * Calculate the size of the current fragment.
-   *
-   * \return the size of the current fragment in bytes.
-   */
-  virtual uint32_t GetFragmentSize (void) const;
-  /**
-   * Calculate the offset for the current fragment.
-   *
-   * \return the offset for the current fragment in bytes.
-   */
-  virtual uint32_t GetFragmentOffset (void) const;
-  /**
-   * Check if the current fragment is the last fragment.
-   *
-   * \return true if the current fragment is the last fragment,
-   *         false otherwise.
-   */
-  virtual bool IsLastFragment (void) const;
-  /**
-   *
-   * Pass the packet included in the wifi MAC queue item to the
-   * packet dropped callback.
-   *
-   * \param item the wifi MAC queue item.
-   */
-  void TxDroppedPacket (Ptr<const WifiMacQueueItem> item);
-
   Ptr<ChannelAccessManager> m_channelAccessManager; //!< the channel access manager
-  TxOk m_txOkCallback;                              //!< the transmit OK callback
-  TxFailed m_txFailedCallback;                      //!< the transmit failed callback
-  TxDropped m_txDroppedCallback;                    //!< the packet dropped callback
+  DroppedMpdu m_droppedMpduCallback;                //!< the dropped MPDU callback
   Ptr<WifiMacQueue> m_queue;                        //!< the wifi MAC queue
   Ptr<MacTxMiddle> m_txMiddle;                      //!< the MacTxMiddle
-  Ptr <MacLow> m_low;                               //!< the MacLow
   Ptr<WifiRemoteStationManager> m_stationManager;   //!< the wifi remote station manager
   Ptr<UniformRandomVariable> m_rng;                 //!< the random stream
 
-  uint32_t m_cwMin;        //!< the minimum contention window
-  uint32_t m_cwMax;        //!< the maximum contention window
-  uint32_t m_cw;           //!< the current contention window
-  uint32_t m_backoff;      //!< the current backoff
-  bool m_accessRequested;  //!< flag whether channel access is already requested
-  uint32_t m_backoffSlots; //!< the number of backoff slots
+  uint32_t m_cwMin;              //!< the minimum contention window
+  uint32_t m_cwMax;              //!< the maximum contention window
+  uint32_t m_cw;                 //!< the current contention window
+  uint32_t m_backoff;            //!< the current backoff
+  ChannelAccessStatus m_access;  //!< channel access status
+  uint32_t m_backoffSlots;       //!< the number of backoff slots
   /**
    * the backoffStart variable is used to keep track of the
    * time at which a backoff was started or the time at which
@@ -528,10 +351,6 @@
   uint8_t m_aifsn;        //!< the AIFSN
   Time m_txopLimit;       //!< the TXOP limit time
 
-  Ptr<const Packet> m_currentPacket;            //!< the current packet
-  WifiMacHeader m_currentHdr;                   //!< the current header
-  MacLowTransmissionParameters m_currentParams; //!< current transmission parameters
-  uint8_t m_fragmentNumber;                     //!< the fragment number
   TracedCallback<uint32_t> m_backoffTrace;      //!< backoff trace value
   TracedValue<uint32_t> m_cwTrace;              //!< CW trace value
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht/vht-capabilities.cc ns-3.34/src/wifi/model/vht/vht-capabilities.cc
--- ns-3.33/src/wifi/model/vht/vht-capabilities.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/vht/vht-capabilities.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,426 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Ghada Badawy <gbadawy@rim.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "vht-capabilities.h"
+
+namespace ns3 {
+
+VhtCapabilities::VhtCapabilities ()
+  : m_maxMpduLength (0),
+    m_supportedChannelWidthSet (0),
+    m_rxLdpc (0),
+    m_shortGuardIntervalFor80Mhz (0),
+    m_shortGuardIntervalFor160Mhz (0),
+    m_txStbc (0),
+    m_rxStbc (0),
+    m_suBeamformerCapable (0),
+    m_suBeamformeeCapable (0),
+    m_beamformeeStsCapable (0),
+    m_numberOfSoundingDimensions (0),
+    m_muBeamformerCapable (0),
+    m_muBeamformeeCapable (0),
+    m_vhtTxopPs (0),
+    m_htcVhtCapable (0),
+    m_maxAmpduLengthExponent (0),
+    m_vhtLinkAdaptationCapable (0),
+    m_rxAntennaPatternConsistency (0),
+    m_txAntennaPatternConsistency (0),
+    m_rxHighestSupportedLongGuardIntervalDataRate (0),
+    m_txHighestSupportedLongGuardIntervalDataRate (0),
+    m_vhtSupported (0)
+{
+  m_rxMcsMap.resize (8,0);
+  m_txMcsMap.resize (8,0);
+  for (uint8_t i = 0; i < 8; i++) //set to 3 by default, i.e. #spatial streams not supported. 0 means supported up to MCS 7, not what we want to imply at this stage.
+    {
+      m_rxMcsMap[i] = 3;
+      m_txMcsMap[i] = 3;
+    }
+}
+
+WifiInformationElementId
+VhtCapabilities::ElementId () const
+{
+  return IE_VHT_CAPABILITIES;
+}
+
+void
+VhtCapabilities::SetVhtSupported (uint8_t vhtSupported)
+{
+  m_vhtSupported = vhtSupported;
+}
+
+uint8_t
+VhtCapabilities::GetInformationFieldSize () const
+{
+  //we should not be here if vht is not supported
+  NS_ASSERT (m_vhtSupported > 0);
+  return 12;
+}
+
+Buffer::Iterator
+VhtCapabilities::Serialize (Buffer::Iterator i) const
+{
+  if (m_vhtSupported < 1)
+    {
+      return i;
+    }
+  return WifiInformationElement::Serialize (i);
+}
+
+uint16_t
+VhtCapabilities::GetSerializedSize () const
+{
+  if (m_vhtSupported < 1)
+    {
+      return 0;
+    }
+  return WifiInformationElement::GetSerializedSize ();
+}
+
+void
+VhtCapabilities::SerializeInformationField (Buffer::Iterator start) const
+{
+  if (m_vhtSupported == 1)
+    {
+      //write the corresponding value for each bit
+      start.WriteHtolsbU32 (GetVhtCapabilitiesInfo ());
+      start.WriteHtolsbU64 (GetSupportedMcsAndNssSet ());
+    }
+}
+
+uint8_t
+VhtCapabilities::DeserializeInformationField (Buffer::Iterator start,
+                                              uint8_t length)
+{
+  Buffer::Iterator i = start;
+  uint32_t vhtinfo = i.ReadLsbtohU32 ();
+  uint64_t mcsset = i.ReadLsbtohU64 ();
+  SetVhtCapabilitiesInfo (vhtinfo);
+  SetSupportedMcsAndNssSet (mcsset);
+  return length;
+}
+
+void
+VhtCapabilities::SetVhtCapabilitiesInfo (uint32_t ctrl)
+{
+  m_maxMpduLength = ctrl & 0x03;
+  m_supportedChannelWidthSet = (ctrl >> 2) & 0x03;
+  m_rxLdpc = (ctrl >> 4) & 0x01;
+  m_shortGuardIntervalFor80Mhz = (ctrl >> 5) & 0x01;
+  m_shortGuardIntervalFor160Mhz = (ctrl >> 6) & 0x01;
+  m_txStbc = (ctrl >> 7) & 0x01;
+  m_rxStbc = (ctrl >> 8) & 0x07;
+  m_suBeamformerCapable = (ctrl >> 11) & 0x01;
+  m_suBeamformeeCapable = (ctrl >> 12) & 0x01;
+  m_beamformeeStsCapable = (ctrl >> 13) & 0x07;
+  m_numberOfSoundingDimensions = (ctrl >> 16) & 0x07;
+  m_muBeamformerCapable = (ctrl >> 19) & 0x01;
+  m_muBeamformeeCapable = (ctrl >> 20) & 0x01;
+  m_vhtTxopPs = (ctrl >> 21) & 0x01;
+  m_htcVhtCapable = (ctrl >> 22) & 0x01;
+  m_maxAmpduLengthExponent = (ctrl >> 23) & 0x07;
+  m_vhtLinkAdaptationCapable = (ctrl >> 26) & 0x03;
+  m_rxAntennaPatternConsistency = (ctrl >> 28) & 0x01;
+  m_txAntennaPatternConsistency = (ctrl >> 29) & 0x01;
+}
+
+uint32_t
+VhtCapabilities::GetVhtCapabilitiesInfo () const
+{
+  uint32_t val = 0;
+  val |= m_maxMpduLength & 0x03;
+  val |= (m_supportedChannelWidthSet & 0x03) << 2;
+  val |= (m_rxLdpc & 0x01) << 4;
+  val |= (m_shortGuardIntervalFor80Mhz & 0x01) << 5;
+  val |= (m_shortGuardIntervalFor160Mhz & 0x01) << 6;
+  val |= (m_txStbc & 0x01) << 7;
+  val |= (m_rxStbc & 0x07) << 8;
+  val |= (m_suBeamformerCapable & 0x01) << 11;
+  val |= (m_suBeamformeeCapable & 0x01) << 12;
+  val |= (m_beamformeeStsCapable & 0x07) << 13;
+  val |= (m_numberOfSoundingDimensions & 0x07) << 16;
+  val |= (m_muBeamformerCapable & 0x01) << 19;
+  val |= (m_muBeamformeeCapable & 0x01) << 20;
+  val |= (m_vhtTxopPs & 0x01) << 21;
+  val |= (m_htcVhtCapable & 0x01) << 22;
+  val |= (m_maxAmpduLengthExponent & 0x07) << 23;
+  val |= (m_vhtLinkAdaptationCapable & 0x03) << 26;
+  val |= (m_rxAntennaPatternConsistency & 0x01) << 28;
+  val |= (m_txAntennaPatternConsistency & 0x01) << 29;
+  return val;
+}
+
+void
+VhtCapabilities::SetSupportedMcsAndNssSet (uint64_t ctrl)
+{
+  uint16_t n;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      n = i * 2;
+      m_rxMcsMap[i] = (ctrl >> n) & 0x03;
+    }
+  m_rxHighestSupportedLongGuardIntervalDataRate = (ctrl >> 16) & 0x1fff;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      n = (i * 2) + 32;
+      m_txMcsMap[i] = (ctrl >> n) & 0x03;
+    }
+  m_txHighestSupportedLongGuardIntervalDataRate = (ctrl >> 48) & 0x1fff;
+}
+
+uint64_t
+VhtCapabilities::GetSupportedMcsAndNssSet () const
+{
+  uint64_t val = 0;
+  uint16_t n;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      n = i * 2;
+      val |= (static_cast<uint64_t> (m_rxMcsMap[i]) & 0x03) << n;
+    }
+  val |=  (static_cast<uint64_t> (m_rxHighestSupportedLongGuardIntervalDataRate) & 0x1fff) << 16;
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      n = (i * 2) + 32;
+      val |= (static_cast<uint64_t> (m_txMcsMap[i]) & 0x03) << n;
+    }
+  val |= (static_cast<uint64_t> (m_txHighestSupportedLongGuardIntervalDataRate) & 0x1fff) << 48;
+  return val;
+}
+
+void
+VhtCapabilities::SetMaxMpduLength (uint16_t length)
+{
+  NS_ABORT_MSG_IF (length != 3895 && length != 7991 && length != 11454,
+                   "Invalid MPDU Max Length value");
+  if (length == 11454)
+    {
+      m_maxMpduLength = 2;
+    }
+  else if (length == 7991)
+    {
+      m_maxMpduLength = 1;
+    }
+  else
+    {
+      m_maxMpduLength = 0;
+    }
+}
+
+void
+VhtCapabilities::SetSupportedChannelWidthSet (uint8_t channelWidthSet)
+{
+  m_supportedChannelWidthSet = channelWidthSet;
+}
+
+void
+VhtCapabilities::SetRxLdpc (uint8_t rxLdpc)
+{
+  m_rxLdpc = rxLdpc;
+}
+
+void
+VhtCapabilities::SetShortGuardIntervalFor80Mhz (uint8_t shortGuardInterval)
+{
+  m_shortGuardIntervalFor80Mhz = shortGuardInterval;
+}
+
+void
+VhtCapabilities::SetShortGuardIntervalFor160Mhz (uint8_t shortGuardInterval)
+{
+  m_shortGuardIntervalFor160Mhz = shortGuardInterval;
+}
+
+void
+VhtCapabilities::SetRxStbc (uint8_t rxStbc)
+{
+  m_rxStbc = rxStbc;
+}
+
+void
+VhtCapabilities::SetTxStbc (uint8_t txStbc)
+{
+  m_txStbc = txStbc;
+}
+
+void
+VhtCapabilities::SetMaxAmpduLength (uint32_t maxampdulength)
+{
+  for (uint8_t i = 0; i <= 7; i++)
+    {
+      if ((1ul << (13 + i)) - 1 == maxampdulength)
+        {
+          m_maxAmpduLengthExponent = i;
+          return;
+        }
+    }
+  NS_ABORT_MSG ("Invalid A-MPDU Max Length value");
+}
+
+void
+VhtCapabilities::SetRxMcsMap (uint8_t mcs, uint8_t nss)
+{
+  //MCS index should be at least 7 and should not exceed 9
+  NS_ASSERT (mcs >= 7 && mcs <= 9);
+  m_rxMcsMap[nss - 1] = mcs - 7; //1 = MCS 8; 2 = MCS 9
+}
+
+void
+VhtCapabilities::SetTxMcsMap (uint8_t mcs, uint8_t nss)
+{
+  //MCS index should be at least 7 and should not exceed 9
+  NS_ASSERT (mcs >= 7 && mcs <= 9);
+  m_txMcsMap[nss - 1] = mcs - 7; //1 = MCS 8; 2 = MCS 9
+}
+
+bool
+VhtCapabilities::IsSupportedTxMcs (uint8_t mcs) const
+{
+  NS_ASSERT (mcs >= 0 && mcs <= 9);
+  if (mcs <= 7)
+    {
+      return true;
+    }
+  if (mcs == 8 && (m_txMcsMap[0] == 1 || m_txMcsMap[0] == 2))
+    {
+      return true;
+    }
+  if (mcs == 9 && m_txMcsMap[0] == 2)
+    {
+      return true;
+    }
+  return false;
+}
+
+bool
+VhtCapabilities::IsSupportedRxMcs (uint8_t mcs) const
+{
+  NS_ASSERT (mcs >= 0 && mcs <= 9);
+  if (mcs <= 7)
+    {
+      return true;
+    }
+  if (mcs == 8 && (m_rxMcsMap[0] == 1 || m_rxMcsMap[0] == 2))
+    {
+      return true;
+    }
+  if (mcs == 9 && m_rxMcsMap[0] == 2)
+    {
+      return true;
+    }
+  return false;
+}
+
+void
+VhtCapabilities::SetRxHighestSupportedLgiDataRate (uint16_t supportedDatarate)
+{
+  m_rxHighestSupportedLongGuardIntervalDataRate = supportedDatarate;
+}
+
+void
+VhtCapabilities::SetTxHighestSupportedLgiDataRate (uint16_t supportedDatarate)
+{
+  m_txHighestSupportedLongGuardIntervalDataRate = supportedDatarate;
+}
+
+uint16_t
+VhtCapabilities::GetMaxMpduLength (void) const
+{
+  if (m_maxMpduLength == 0)
+    {
+      return 3895;
+    }
+  if (m_maxMpduLength == 1)
+    {
+      return 7991;
+    }
+  if (m_maxMpduLength == 2)
+    {
+      return 11454;
+    }
+  NS_ABORT_MSG ("The value 3 is reserved");
+}
+
+uint8_t
+VhtCapabilities::GetSupportedChannelWidthSet () const
+{
+  return m_supportedChannelWidthSet;
+}
+
+uint8_t
+VhtCapabilities::GetRxLdpc () const
+{
+  return m_rxLdpc;
+}
+
+uint8_t
+VhtCapabilities::GetRxStbc () const
+{
+  return m_rxStbc;
+}
+
+uint8_t
+VhtCapabilities::GetTxStbc () const
+{
+  return m_txStbc;
+}
+
+uint32_t
+VhtCapabilities::GetMaxAmpduLength (void) const
+{
+  return (1ul << (13 + m_maxAmpduLengthExponent)) - 1;
+}
+
+bool
+VhtCapabilities::IsSupportedMcs (uint8_t mcs, uint8_t nss) const
+{
+  //The MCS index starts at 0 and NSS starts at 1
+  if (mcs <= 7 && m_rxMcsMap[nss - 1] < 3)
+    {
+      return true;
+    }
+  if (mcs == 8 && m_rxMcsMap[nss - 1] > 0 && m_rxMcsMap[nss - 1] < 3)
+    {
+      return true;
+    }
+  if (mcs == 9 && m_rxMcsMap[nss - 1] == 2)
+    {
+      return true;
+    }
+  return false;
+}
+
+uint16_t
+VhtCapabilities::GetRxHighestSupportedLgiDataRate () const
+{
+  return m_rxHighestSupportedLongGuardIntervalDataRate;
+}
+
+std::ostream &
+operator << (std::ostream &os, const VhtCapabilities &vhtCapabilities)
+{
+  os <<  vhtCapabilities.GetVhtCapabilitiesInfo () << "|" << vhtCapabilities.GetSupportedMcsAndNssSet ();
+
+  return os;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht/vht-capabilities.h ns-3.34/src/wifi/model/vht/vht-capabilities.h
--- ns-3.33/src/wifi/model/vht/vht-capabilities.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/vht/vht-capabilities.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,270 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Ghada Badawy <gbadawy@gmail.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef VHT_CAPABILITIES_H
+#define VHT_CAPABILITIES_H
+
+#include "ns3/wifi-information-element.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup wifi
+ *
+ * The IEEE 802.11ac VHT Capabilities
+ */
+class VhtCapabilities : public WifiInformationElement
+{
+public:
+  VhtCapabilities ();
+
+  // Implementations of pure virtual methods of WifiInformationElement
+  WifiInformationElementId ElementId () const override;
+  uint8_t GetInformationFieldSize () const override;
+  void SerializeInformationField (Buffer::Iterator start) const override;
+  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length) override;
+  /* This information element is a bit special in that it is only
+     included if the STA is an VHT STA. To support this we
+     override the Serialize and GetSerializedSize methods of
+     WifiInformationElement. */
+  Buffer::Iterator Serialize (Buffer::Iterator start) const override;
+  uint16_t GetSerializedSize () const override;
+
+  /**
+   * Set the VHT supported field.
+   *
+   * \param vhtSupported the VHT supported field
+   */
+  void SetVhtSupported (uint8_t vhtSupported);
+
+  /**
+   * Set the VHT Capabilities Info field in the VHT Capabilities information element.
+   *
+   * \param ctrl the VHT Capabilities Info field in the VHT Capabilities information element
+   */
+  void SetVhtCapabilitiesInfo (uint32_t ctrl);
+  /**
+   * Set the MCS and NSS field in the VHT Capabilities information element.
+   *
+   * \param ctrl the MCS and NSS field in the VHT Capabilities information element
+   */
+  void SetSupportedMcsAndNssSet (uint64_t ctrl);
+
+  /**
+   * Return the VHT Capabilities Info field in the VHT Capabilities information element.
+   *
+   * \return the VHT Capabilities Info field in the VHT Capabilities information element
+   */
+  uint32_t GetVhtCapabilitiesInfo () const;
+  /**
+   * Return the MCS and NSS field in the VHT Capabilities information element.
+   *
+   * \return the MCS and NSS field in the VHT Capabilities information element
+   */
+  uint64_t GetSupportedMcsAndNssSet () const;
+
+  //Capabilities Info fields
+  /**
+   * Set the maximum MPDU length.
+   *
+   * \param length the maximum MPDU length (3895, 7991 or 11454)
+   */
+  void SetMaxMpduLength (uint16_t length);
+  /**
+   * Set the supported channel width set.
+   *
+   * \param channelWidthSet the supported channel width set
+   */
+  void SetSupportedChannelWidthSet (uint8_t channelWidthSet);
+  /**
+   * Set the receive LDPC.
+   *
+   * \param rxLdpc the receive LDPC
+   */
+  void SetRxLdpc (uint8_t rxLdpc);
+  /**
+   * Set the short guard interval 80 MHz.
+   *
+   * \param shortGuardInterval the short guard interval 80 MHz
+   */
+  void SetShortGuardIntervalFor80Mhz (uint8_t shortGuardInterval);
+  /**
+   * Set the short guard interval 160 MHz.
+   *
+   * \param shortGuardInterval the short guard interval 160 MHz
+   */
+  void SetShortGuardIntervalFor160Mhz (uint8_t shortGuardInterval);
+  /**
+   * Set the receive STBC.
+   *
+   * \param rxStbc the receive STBC
+   */
+  void SetRxStbc (uint8_t rxStbc);
+  /**
+   * Set the transmit STBC.
+   *
+   * \param txStbc the receive STBC
+   */
+  void SetTxStbc (uint8_t txStbc);
+  /**
+   * Set the maximum AMPDU length.
+   *
+   * \param maxAmpduLength 2^(13 + x) - 1, x in the range 0 to 7
+   */
+  void SetMaxAmpduLength (uint32_t maxAmpduLength);
+
+  /**
+   * Get the maximum MPDU length.
+   *
+   * \return the maximum MPDU length in bytes
+   */
+  uint16_t GetMaxMpduLength (void) const;
+  /**
+   * Get the supported channel width set.
+   *
+   * \returns the supported channel width set
+   */
+  uint8_t GetSupportedChannelWidthSet () const;
+  /**
+   * Get the receive LDPC.
+   *
+   * \returns the receive LDPC
+   */
+  uint8_t GetRxLdpc () const;
+  /**
+   * Get the receive STBC.
+   *
+   * \returns the receive STBC
+   */
+  uint8_t GetRxStbc () const;
+  /**
+   * Get the transmit STBC.
+   *
+   * \returns the transmit STBC
+   */
+  uint8_t GetTxStbc () const;
+
+  /**
+   * \param mcs Max MCS value (between 7 and 9)
+   * \param nss Spatial stream for which the Max MCS value is being set
+   */
+  void SetRxMcsMap (uint8_t mcs, uint8_t nss);
+  /**
+   * \param mcs Max MCS value (between 7 and 9)
+   * \param nss Spatial stream for which the Max MCS value is being set
+   */
+  void SetTxMcsMap (uint8_t mcs, uint8_t nss);
+  /**
+   * Set the receive highest supported LGI data rate.
+   *
+   * \param supportedDatarate receive highest supported LGI data rate
+   */
+  void SetRxHighestSupportedLgiDataRate (uint16_t supportedDatarate);
+  /**
+   * Set the transmit highest supported LGI data rate.
+   *
+   * \param supportedDatarate transmit highest supported LGI data rate
+   */
+  void SetTxHighestSupportedLgiDataRate (uint16_t supportedDatarate);
+  /**
+   * Get the is MCS supported.
+   *
+   * \param mcs the MCS
+   * \param nss the NSS
+   * \returns the is MCS supported
+   */
+  bool IsSupportedMcs (uint8_t mcs, uint8_t nss) const;
+
+  /**
+   * Get the receive highest supported LGI data rate.
+   *
+   * \returns the receive highest supported LGI data rate.
+   */
+  uint16_t GetRxHighestSupportedLgiDataRate () const;
+
+  /**
+   * Returns true if transmit MCS is supported.
+   *
+   * \param mcs the MCS
+   * \returns whether transmit MCS is supported
+   */
+  bool IsSupportedTxMcs (uint8_t mcs) const;
+  /**
+   * Returns true if receive MCS is supported.
+   *
+   * \param mcs the MCS
+   * \returns whether receive MCS is supported
+   */
+  bool IsSupportedRxMcs (uint8_t mcs) const;
+
+  /**
+   * Return the maximum A-MPDU length.
+   *
+   * \return the maximum A-MPDU length in bytes
+   */
+  uint32_t GetMaxAmpduLength (void) const;
+
+
+private:
+  //Capabilities Info fields
+  uint8_t m_maxMpduLength;               ///< maximum MPDU length
+  uint8_t m_supportedChannelWidthSet;    ///< supported channel width set
+  uint8_t m_rxLdpc;                      ///< receive LDPC
+  uint8_t m_shortGuardIntervalFor80Mhz;  ///< short guard interval for 80 MHz
+  uint8_t m_shortGuardIntervalFor160Mhz; ///< short guard interval for 160 MHz
+  uint8_t m_txStbc;                      ///< transmit STBC
+  uint8_t m_rxStbc;                      ///< receive STBC
+  uint8_t m_suBeamformerCapable;         ///< SU beamformer capable
+  uint8_t m_suBeamformeeCapable;         ///< SU beamformee capable
+  uint8_t m_beamformeeStsCapable;        ///< beamformee STS capable
+  uint8_t m_numberOfSoundingDimensions;  ///< number of sounding dimensions
+  uint8_t m_muBeamformerCapable;         ///< MU beamformer capable
+  uint8_t m_muBeamformeeCapable;         ///< MU beamformee capable
+  uint8_t m_vhtTxopPs;                   ///< VHT TXOP PS
+  uint8_t m_htcVhtCapable;               ///< HTC VHT capable
+  uint8_t m_maxAmpduLengthExponent;      ///< maximum A-MPDU length exponent
+  uint8_t m_vhtLinkAdaptationCapable;    ///< VHT link adaptation capable
+  uint8_t m_rxAntennaPatternConsistency; ///< receive antenna pattern consistency
+  uint8_t m_txAntennaPatternConsistency; ///< transmit antenna pattern consistency
+
+  //MCS and NSS field information
+  std::vector<uint8_t> m_rxMcsMap;                        ///< receive MCS map
+  uint16_t m_rxHighestSupportedLongGuardIntervalDataRate; ///< receive highest supported long guard interval data rate
+  std::vector<uint8_t> m_txMcsMap;                        ///< transmit MCS map
+  uint16_t m_txHighestSupportedLongGuardIntervalDataRate; ///< transmit highest supported long guard interval data rate
+
+  /// This is used to decide if this element should be added to the frame or not
+  uint8_t m_vhtSupported;
+};
+
+/**
+ * output stream output operator
+ *
+ * \param os the output stream
+ * \param vhtCapabilities the VHT capabilities
+ *
+ * \returns output stream
+ */
+std::ostream &operator << (std::ostream &os, const VhtCapabilities &vhtCapabilities);
+
+} //namespace ns3
+
+#endif /* VHT_CAPABILITY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht/vht-configuration.cc ns-3.34/src/wifi/model/vht/vht-configuration.cc
--- ns-3.33/src/wifi/model/vht/vht-configuration.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/vht/vht-configuration.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,51 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018  Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "ns3/log.h"
+#include "vht-configuration.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("VhtConfiguration");
+
+NS_OBJECT_ENSURE_REGISTERED (VhtConfiguration);
+
+VhtConfiguration::VhtConfiguration ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+VhtConfiguration::~VhtConfiguration ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+TypeId
+VhtConfiguration::GetTypeId (void)
+{
+  static ns3::TypeId tid = ns3::TypeId ("ns3::VhtConfiguration")
+    .SetParent<Object> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<VhtConfiguration> ()
+    ;
+    return tid;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht/vht-configuration.h ns-3.34/src/wifi/model/vht/vht-configuration.h
--- ns-3.33/src/wifi/model/vht/vht-configuration.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/vht/vht-configuration.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,52 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2018  Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef VHT_CONFIGURATION_H
+#define VHT_CONFIGURATION_H
+
+#include "ns3/object.h"
+
+namespace ns3 {
+
+/**
+ * \brief VHT configuration
+ * \ingroup wifi
+ *
+ * This object stores VHT configuration information, for use in modifying
+ * AP or STA behavior and for constructing VHT-related information elements.
+ *
+ */
+class VhtConfiguration : public Object
+{
+public:
+  VhtConfiguration ();
+  virtual ~VhtConfiguration ();
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+};
+
+} //namespace ns3
+
+#endif /* VHT_CONFIGURATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht/vht-frame-exchange-manager.cc ns-3.34/src/wifi/model/vht/vht-frame-exchange-manager.cc
--- ns-3.33/src/wifi/model/vht/vht-frame-exchange-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/vht/vht-frame-exchange-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,61 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "ns3/abort.h"
+#include "vht-frame-exchange-manager.h"
+
+#undef NS_LOG_APPEND_CONTEXT
+#define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] "
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("VhtFrameExchangeManager");
+
+NS_OBJECT_ENSURE_REGISTERED (VhtFrameExchangeManager);
+
+TypeId
+VhtFrameExchangeManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::VhtFrameExchangeManager")
+    .SetParent<HtFrameExchangeManager> ()
+    .AddConstructor<VhtFrameExchangeManager> ()
+    .SetGroupName ("Wifi")
+  ;
+  return tid;
+}
+
+VhtFrameExchangeManager::VhtFrameExchangeManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+VhtFrameExchangeManager::~VhtFrameExchangeManager ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+Ptr<WifiPsdu>
+VhtFrameExchangeManager::GetWifiPsdu (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector) const
+{
+  return Create<WifiPsdu> (mpdu, txVector.GetModulationClass () >= WIFI_MOD_CLASS_VHT);
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht/vht-frame-exchange-manager.h ns-3.34/src/wifi/model/vht/vht-frame-exchange-manager.h
--- ns-3.33/src/wifi/model/vht/vht-frame-exchange-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/vht/vht-frame-exchange-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,51 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef VHT_FRAME_EXCHANGE_MANAGER_H
+#define VHT_FRAME_EXCHANGE_MANAGER_H
+
+#include "ns3/ht-frame-exchange-manager.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup wifi
+ *
+ * VhtFrameExchangeManager handles the frame exchange sequences
+ * for VHT stations.
+ */
+class VhtFrameExchangeManager : public HtFrameExchangeManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  VhtFrameExchangeManager ();
+  virtual ~VhtFrameExchangeManager ();
+
+protected:
+  Ptr<WifiPsdu> GetWifiPsdu (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector) const override;
+};
+
+} //namespace ns3
+
+#endif /* VHT_FRAME_EXCHANGE_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht/vht-operation.cc ns-3.34/src/wifi/model/vht/vht-operation.cc
--- ns-3.33/src/wifi/model/vht/vht-operation.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/vht/vht-operation.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,174 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016 Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "vht-operation.h"
+
+namespace ns3 {
+
+VhtOperation::VhtOperation ()
+  : m_channelWidth (0),
+    m_channelCenterFrequencySegment0 (0),
+    m_channelCenterFrequencySegment1 (0),
+    m_basicVhtMcsAndNssSet (0),
+    m_vhtSupported (0)
+{
+}
+
+WifiInformationElementId
+VhtOperation::ElementId () const
+{
+  return IE_VHT_OPERATION;
+}
+
+void
+VhtOperation::SetVhtSupported (uint8_t vhtSupported)
+{
+  m_vhtSupported = vhtSupported;
+}
+
+uint8_t
+VhtOperation::GetInformationFieldSize () const
+{
+  //we should not be here if VHT is not supported
+  NS_ASSERT (m_vhtSupported > 0);
+  return 5;
+}
+
+void
+VhtOperation::SetChannelWidth (uint8_t channelWidth)
+{
+  m_channelWidth = channelWidth;
+}
+
+void
+VhtOperation::SetChannelCenterFrequencySegment0 (uint8_t channelCenterFrequencySegment0)
+{
+  m_channelCenterFrequencySegment0 = channelCenterFrequencySegment0;
+}
+
+void
+VhtOperation::SetChannelCenterFrequencySegment1 (uint8_t channelCenterFrequencySegment1)
+{
+  m_channelCenterFrequencySegment1 = channelCenterFrequencySegment1;
+}
+
+void
+VhtOperation::SetMaxVhtMcsPerNss (uint8_t nss, uint8_t maxVhtMcs)
+{
+  NS_ASSERT ((maxVhtMcs == 0 || (maxVhtMcs >= 7 && maxVhtMcs <= 9)) && (nss >= 1 && nss <= 8));
+  if (maxVhtMcs != 0)
+    {
+      m_basicVhtMcsAndNssSet |= (((maxVhtMcs - 7) & 0x03) << ((nss - 1) * 2));
+    }
+  else
+    {
+      m_basicVhtMcsAndNssSet |= (3 << ((nss - 1) * 2));
+    }
+}
+
+void
+VhtOperation::SetBasicVhtMcsAndNssSet (uint16_t basicVhtMcsAndNssSet)
+{
+  m_basicVhtMcsAndNssSet = basicVhtMcsAndNssSet;
+}
+
+uint8_t
+VhtOperation::GetChannelWidth (void) const
+{
+  return m_channelWidth;
+}
+
+uint8_t
+VhtOperation::GetChannelCenterFrequencySegment0 (void) const
+{
+  return m_channelCenterFrequencySegment0;
+}
+
+uint8_t
+VhtOperation::GetChannelCenterFrequencySegment1 (void) const
+{
+  return m_channelCenterFrequencySegment1;
+}
+
+uint16_t
+VhtOperation::GetBasicVhtMcsAndNssSet (void) const
+{
+  return m_basicVhtMcsAndNssSet;
+}
+
+Buffer::Iterator
+VhtOperation::Serialize (Buffer::Iterator i) const
+{
+  if (m_vhtSupported < 1)
+    {
+      return i;
+    }
+  return WifiInformationElement::Serialize (i);
+}
+
+uint16_t
+VhtOperation::GetSerializedSize () const
+{
+  if (m_vhtSupported < 1)
+    {
+      return 0;
+    }
+  return WifiInformationElement::GetSerializedSize ();
+}
+
+void
+VhtOperation::SerializeInformationField (Buffer::Iterator start) const
+{
+  if (m_vhtSupported == 1)
+    {
+      //write the corresponding value for each bit
+      start.WriteU8 (GetChannelWidth ());
+      start.WriteU8 (GetChannelCenterFrequencySegment0 ());
+      start.WriteU8 (GetChannelCenterFrequencySegment1 ());
+      start.WriteU16 (GetBasicVhtMcsAndNssSet ());
+    }
+}
+
+uint8_t
+VhtOperation::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
+{
+  Buffer::Iterator i = start;
+  uint8_t channelWidth = i.ReadU8 ();
+  uint8_t channelCenterFrequencySegment0 = i.ReadU8 ();
+  uint8_t channelCenterFrequencySegment1 = i.ReadU8 ();
+  uint16_t basicVhtMcsAndNssSet = i.ReadU16 ();
+  SetChannelWidth (channelWidth);
+  SetChannelCenterFrequencySegment0 (channelCenterFrequencySegment0);
+  SetChannelCenterFrequencySegment1 (channelCenterFrequencySegment1);
+  SetBasicVhtMcsAndNssSet (basicVhtMcsAndNssSet);
+  return length;
+}
+
+std::ostream &
+operator << (std::ostream &os, const VhtOperation &VhtOperation)
+{
+  os << +VhtOperation.GetChannelWidth () << "|"
+     << +VhtOperation.GetChannelCenterFrequencySegment0 () << "|"
+     << +VhtOperation.GetChannelCenterFrequencySegment1 () << "|"
+     << VhtOperation.GetBasicVhtMcsAndNssSet ();
+  return os;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht/vht-operation.h ns-3.34/src/wifi/model/vht/vht-operation.h
--- ns-3.33/src/wifi/model/vht/vht-operation.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/vht/vht-operation.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,143 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2016 Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef VHT_OPERATION_H
+#define VHT_OPERATION_H
+
+#include "ns3/wifi-information-element.h"
+
+namespace ns3 {
+
+/**
+ * \brief The VHT Operation Information Element
+ * \ingroup wifi
+ *
+ * This class knows how to serialise and deserialise
+ * the VHT Operation Information Element
+ */
+class VhtOperation : public WifiInformationElement
+{
+public:
+  VhtOperation ();
+
+  // Implementations of pure virtual methods of WifiInformationElement
+  WifiInformationElementId ElementId () const override;
+  uint8_t GetInformationFieldSize () const override;
+  void SerializeInformationField (Buffer::Iterator start) const override;
+  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length) override;
+  /* This information element is a bit special in that it is only
+     included if the STA is a VHT STA. To support this we
+     override the Serialize and GetSerializedSize methods of
+     WifiInformationElement. */
+  Buffer::Iterator Serialize (Buffer::Iterator start) const override;
+  uint16_t GetSerializedSize () const override;
+
+  /**
+   * Set the VHT supported information element.
+   *
+   * \param vhtSupported the VHT supported information element
+   */
+  void SetVhtSupported (uint8_t vhtSupported);
+
+  /**
+   * Set the Channel Width field in the VHT Operation information element.
+   *
+   * \param channelWidth the Channel Width field in the VHT Operation information element
+   */
+  void SetChannelWidth (uint8_t channelWidth);
+  /**
+   * Set the Channel Center Frequency Segment 0 field in the VHT Operation information element.
+   *
+   * \param channelCenterFrequencySegment0 the Channel Center Frequency Segment 0 field in the VHT Operation information element
+   */
+  void SetChannelCenterFrequencySegment0 (uint8_t channelCenterFrequencySegment0);
+  /**
+   * Set the Channel Center Frequency Segment 1 field in the VHT Operation information element.
+   *
+   * \param channelCenterFrequencySegment1 the Channel Center Frequency Segment 1 field in the VHT Operation information element
+   */
+  void SetChannelCenterFrequencySegment1 (uint8_t channelCenterFrequencySegment1);
+  /**
+   * Set the Basic VHT-MCS and NSS field in the VHT Operation information element.
+   *
+   * \param basicVhtMcsAndNssSet the Basic VHT-MCS and NSS field in the VHT Operation information element
+   */
+  void SetBasicVhtMcsAndNssSet (uint16_t basicVhtMcsAndNssSet);
+  /**
+   * Set the Basic VHT-MCS and NSS field in the VHT Operation information element
+   * by specifying the tuple (nss, maxMcs).
+   *
+   * \param nss the NSS
+   * \param maxVhtMcs the maximum supported VHT-MCS value corresponding to that NSS
+   */
+  void SetMaxVhtMcsPerNss (uint8_t nss, uint8_t maxVhtMcs);
+
+  /**
+   * Return the Channel Width field in the VHT Operation information element.
+   *
+   * \return the Channel Width field in the VHT Operation information element
+   */
+  uint8_t GetChannelWidth (void) const;
+  /**
+   * Return the Channel Center Frequency Segment 0 field in the VHT Operation information element.
+   *
+   * \return the Channel Center Frequency Segment 0 field in the VHT Operation information element
+   */
+  uint8_t GetChannelCenterFrequencySegment0 (void) const;
+  /**
+   * Return the Channel Center Frequency Segment 1 field in the VHT Operation information element.
+   *
+   * \return the Channel Center Frequency Segment 1 field in the VHT Operation information element
+   */
+  uint8_t GetChannelCenterFrequencySegment1 (void) const;
+  /**
+   * Return the Basic VHT-MCS And Nss field in the VHT Operation information element.
+   *
+   * \return the Basic VHT-MCS And Nss field in the VHT Operation information element
+   */
+  uint16_t GetBasicVhtMcsAndNssSet (void) const;
+
+
+private:
+  //VHT Operation Information
+  uint8_t m_channelWidth; ///< channel width
+  uint8_t m_channelCenterFrequencySegment0; ///< channel center frequency segment 0
+  uint8_t m_channelCenterFrequencySegment1; ///< channel center frequency segment 1
+
+  //Basic VHT-MCS and NSS Set
+  uint16_t m_basicVhtMcsAndNssSet; ///< basic VHT MCS NSS set
+
+  /// This is used to decide whether this element should be added to the frame or not
+  uint8_t m_vhtSupported;
+};
+
+/**
+ * output stream output operator
+ *
+ * \param os the output stream
+ * \param VhtOperation the VHT operation
+ *
+ * \returns output stream
+ */
+std::ostream &operator << (std::ostream &os, const VhtOperation &VhtOperation);
+
+} //namespace ns3
+
+#endif /* VHT_OPERATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht/vht-phy.cc ns-3.34/src/wifi/model/vht/vht-phy.cc
--- ns-3.33/src/wifi/model/vht/vht-phy.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/vht/vht-phy.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,536 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy)
+ */
+
+#include "vht-phy.h"
+#include "vht-ppdu.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/wifi-phy.h" //only used for static mode constructor
+#include "ns3/wifi-utils.h"
+#include "ns3/log.h"
+#include "ns3/assert.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("VhtPhy");
+
+/*******************************************************
+ *       VHT PHY (IEEE 802.11-2016, clause 21)
+ *******************************************************/
+
+/* *NS_CHECK_STYLE_OFF* */
+const PhyEntity::PpduFormats VhtPhy::m_vhtPpduFormats {
+  { WIFI_PREAMBLE_VHT_SU, { WIFI_PPDU_FIELD_PREAMBLE,      //L-STF + L-LTF
+                            WIFI_PPDU_FIELD_NON_HT_HEADER, //L-SIG
+                            WIFI_PPDU_FIELD_SIG_A,         //VHT-SIG-A
+                            WIFI_PPDU_FIELD_TRAINING,      //VHT-STF + VHT-LTFs
+                            WIFI_PPDU_FIELD_DATA } },
+  { WIFI_PREAMBLE_VHT_MU, { WIFI_PPDU_FIELD_PREAMBLE,      //L-STF + L-LTF
+                            WIFI_PPDU_FIELD_NON_HT_HEADER, //L-SIG
+                            WIFI_PPDU_FIELD_SIG_A,         //VHT-SIG-A
+                            WIFI_PPDU_FIELD_TRAINING,      //VHT-STF + VHT-LTFs
+                            WIFI_PPDU_FIELD_SIG_B,         //VHT-SIG-B
+                            WIFI_PPDU_FIELD_DATA } }
+};
+
+const VhtPhy::NesExceptionMap VhtPhy::m_exceptionsMap {
+                 /* {BW,Nss,MCS} Nes */
+  { std::make_tuple ( 80, 7, 2),  3 },   //instead of 2
+  { std::make_tuple ( 80, 7, 7),  6 },   //instead of 4
+  { std::make_tuple ( 80, 7, 8),  6 },   //instead of 5
+  { std::make_tuple ( 80, 8, 7),  6 },   //instead of 5
+  { std::make_tuple (160, 4, 7),  6 },   //instead of 5
+  { std::make_tuple (160, 5, 8),  8 },   //instead of 7
+  { std::make_tuple (160, 6, 7),  8 },   //instead of 7
+  { std::make_tuple (160, 7, 3),  4 },   //instead of 3
+  { std::make_tuple (160, 7, 4),  6 },   //instead of 5
+  { std::make_tuple (160, 7, 5),  7 },   //instead of 6
+  { std::make_tuple (160, 7, 7),  9 },   //instead of 8
+  { std::make_tuple (160, 7, 8), 12 },   //instead of 9
+  { std::make_tuple (160, 7, 9), 12 }    //instead of 10
+};
+/* *NS_CHECK_STYLE_ON* */
+
+VhtPhy::VhtPhy (bool buildModeList /* = true */)
+  : HtPhy (1, false) //don't add HT modes to list
+{
+  NS_LOG_FUNCTION (this << buildModeList);
+  m_bssMembershipSelector = VHT_PHY;
+  m_maxMcsIndexPerSs = 9;
+  m_maxSupportedMcsIndexPerSs = m_maxMcsIndexPerSs;
+  if (buildModeList)
+    {
+      BuildModeList ();
+    }
+}
+
+VhtPhy::~VhtPhy ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+VhtPhy::BuildModeList (void)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_modeList.empty ());
+  NS_ASSERT (m_bssMembershipSelector == VHT_PHY);
+  for (uint8_t index = 0; index <= m_maxSupportedMcsIndexPerSs; ++index)
+    {
+      NS_LOG_LOGIC ("Add VhtMcs" << +index << " to list");
+      m_modeList.emplace_back (CreateVhtMcs (index));
+    }
+}
+
+const PhyEntity::PpduFormats &
+VhtPhy::GetPpduFormats (void) const
+{
+  return m_vhtPpduFormats;
+}
+
+WifiMode
+VhtPhy::GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const
+{
+  switch (field)
+    {
+      case WIFI_PPDU_FIELD_TRAINING: //consider SIG-A mode for training (useful for InterferenceHelper)
+      case WIFI_PPDU_FIELD_SIG_A:
+        return GetSigAMode ();
+      case WIFI_PPDU_FIELD_SIG_B:
+        return GetSigBMode (txVector);
+      default:
+        return HtPhy::GetSigMode (field, txVector);
+    }
+}
+
+WifiMode
+VhtPhy::GetHtSigMode (void) const
+{
+  NS_ASSERT (m_bssMembershipSelector != HT_PHY);
+  NS_FATAL_ERROR ("No HT-SIG");
+  return WifiMode ();
+}
+
+WifiMode
+VhtPhy::GetSigAMode (void) const
+{
+  return GetLSigMode (); //same number of data tones as OFDM (i.e. 48)
+}
+
+WifiMode
+VhtPhy::GetSigBMode (const WifiTxVector& txVector) const
+{
+  NS_ABORT_MSG_IF (txVector.GetPreambleType () != WIFI_PREAMBLE_VHT_MU, "VHT-SIG-B only available for VHT MU");
+  return GetVhtMcs0 ();
+}
+
+Time
+VhtPhy::GetDuration (WifiPpduField field, const WifiTxVector& txVector) const
+{
+  switch (field)
+    {
+      case WIFI_PPDU_FIELD_SIG_A:
+        return GetSigADuration (txVector.GetPreambleType ());
+      case WIFI_PPDU_FIELD_SIG_B:
+        return GetSigBDuration (txVector);
+      default:
+        return HtPhy::GetDuration (field, txVector);
+    }
+}
+
+Time
+VhtPhy::GetLSigDuration (WifiPreamble /* preamble */) const
+{
+  return MicroSeconds (4); //L-SIG
+}
+
+Time
+VhtPhy::GetHtSigDuration (void) const
+{
+  return MicroSeconds (0); //no HT-SIG
+}
+
+Time
+VhtPhy::GetTrainingDuration (const WifiTxVector& txVector,
+                             uint8_t nDataLtf, uint8_t nExtensionLtf /* = 0 */) const
+{
+  NS_ABORT_MSG_IF (nDataLtf > 8, "Unsupported number of LTFs " << +nDataLtf << " for VHT");
+  NS_ABORT_MSG_IF (nExtensionLtf > 0, "No extension LTFs expected for VHT");
+  return MicroSeconds (4 + 4 * nDataLtf); //VHT-STF + VHT-LTFs
+}
+
+Time
+VhtPhy::GetSigADuration (WifiPreamble /* preamble */) const
+{
+  return MicroSeconds (8); //VHT-SIG-A (first and second symbol)
+}
+
+Time
+VhtPhy::GetSigBDuration (const WifiTxVector& txVector) const
+{
+  return (txVector.GetPreambleType () == WIFI_PREAMBLE_VHT_MU) ? MicroSeconds (4) : MicroSeconds (0); //HE-SIG-B only for MU
+}
+
+uint8_t
+VhtPhy::GetNumberBccEncoders (const WifiTxVector& txVector) const
+{
+  WifiMode payloadMode = txVector.GetMode ();
+  /**
+   * General rule: add an encoder when crossing maxRatePerCoder frontier
+   *
+   * The value of 540 Mbps and 600 Mbps for normal GI and short GI (resp.)
+   * were obtained by observing the rates for which Nes was incremented in tables
+   * 21-30 to 21-61 of IEEE 802.11-2016.
+   * These values are the last values before changing encoders.
+   */
+  double maxRatePerCoder = (txVector.GetGuardInterval () == 800) ? 540e6 : 600e6;
+  uint8_t nes = ceil (payloadMode.GetDataRate (txVector) / maxRatePerCoder);
+
+  //Handle exceptions to the rule
+  auto iter = m_exceptionsMap.find (std::make_tuple (txVector.GetChannelWidth (),
+                                                     txVector.GetNss (),
+                                                     payloadMode.GetMcsValue ()));
+  if (iter != m_exceptionsMap.end ())
+    {
+      nes = iter->second;
+    }
+  return nes;
+}
+
+Ptr<WifiPpdu>
+VhtPhy::BuildPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, Time ppduDuration)
+{
+  NS_LOG_FUNCTION (this << psdus << txVector << ppduDuration);
+  return Create<VhtPpdu> (psdus.begin ()->second, txVector, ppduDuration, m_wifiPhy->GetPhyBand (),
+                          ObtainNextUid (txVector));
+}
+
+PhyEntity::PhyFieldRxStatus
+VhtPhy::DoEndReceiveField (WifiPpduField field, Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << field << *event);
+  switch (field)
+    {
+      case WIFI_PPDU_FIELD_SIG_A:
+        return EndReceiveSigA (event);
+      case WIFI_PPDU_FIELD_SIG_B:
+        return EndReceiveSigB (event);
+      default:
+        return HtPhy::DoEndReceiveField (field, event);
+    }
+}
+
+PhyEntity::PhyFieldRxStatus
+VhtPhy::EndReceiveSigA (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  NS_ASSERT (event->GetTxVector ().GetPreambleType () >= WIFI_PREAMBLE_VHT_SU);
+  SnrPer snrPer = GetPhyHeaderSnrPer (WIFI_PPDU_FIELD_SIG_A, event);
+  NS_LOG_DEBUG ("SIG-A: SNR(dB)=" << RatioToDb (snrPer.snr) << ", PER=" << snrPer.per);
+  PhyFieldRxStatus status (GetRandomValue () > snrPer.per);
+  if (status.isSuccess)
+    {
+      NS_LOG_DEBUG ("Received SIG-A");
+      if (!IsAllConfigSupported (WIFI_PPDU_FIELD_SIG_A, event->GetPpdu ()))
+        {
+          status = PhyFieldRxStatus (false, UNSUPPORTED_SETTINGS, DROP);
+        }
+      status = ProcessSigA (event, status);
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Drop packet because SIG-A reception failed");
+      status.reason = SIG_A_FAILURE;
+      status.actionIfFailure = DROP;
+    }
+  return status;
+}
+
+PhyEntity::PhyFieldRxStatus
+VhtPhy::ProcessSigA (Ptr<Event> event, PhyFieldRxStatus status)
+{
+  NS_LOG_FUNCTION (this << *event << status);
+  //TODO see if something should be done here once MU-MIMO is supported
+  return status; //nothing special for VHT
+}
+
+PhyEntity::PhyFieldRxStatus
+VhtPhy::EndReceiveSigB (Ptr<Event> event)
+{
+  NS_LOG_FUNCTION (this << *event);
+  NS_ASSERT (event->GetPpdu ()->GetType () == WIFI_PPDU_TYPE_DL_MU);
+  SnrPer snrPer = GetPhyHeaderSnrPer (WIFI_PPDU_FIELD_SIG_B, event);
+  NS_LOG_DEBUG ("SIG-B: SNR(dB)=" << RatioToDb (snrPer.snr) << ", PER=" << snrPer.per);
+  PhyFieldRxStatus status (GetRandomValue () > snrPer.per);
+  if (status.isSuccess)
+    {
+      NS_LOG_DEBUG ("Received SIG-B");
+      if (!IsAllConfigSupported (WIFI_PPDU_FIELD_SIG_A, event->GetPpdu ()))
+        {
+          status = PhyFieldRxStatus (false, UNSUPPORTED_SETTINGS, DROP);
+        }
+      status = ProcessSigB (event, status);
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Drop reception because SIG-B reception failed");
+      status.reason = SIG_B_FAILURE;
+      status.actionIfFailure = DROP;
+    }
+  return status;
+}
+
+PhyEntity::PhyFieldRxStatus
+VhtPhy::ProcessSigB (Ptr<Event> event, PhyFieldRxStatus status)
+{
+  NS_LOG_FUNCTION (this << *event << status);
+  //TODO see if something should be done here once MU-MIMO is supported
+  return status; //nothing special for VHT
+}
+
+bool
+VhtPhy::IsAllConfigSupported (WifiPpduField field, Ptr<const WifiPpdu> ppdu) const
+{
+  if (ppdu->GetType () == WIFI_PPDU_TYPE_DL_MU && field == WIFI_PPDU_FIELD_SIG_A)
+    {
+      return IsChannelWidthSupported (ppdu); //perform the full check after SIG-B
+    }
+  return HtPhy::IsAllConfigSupported (field, ppdu);
+}
+
+void
+VhtPhy::InitializeModes (void)
+{
+  for (uint8_t i = 0; i < 10; ++i)
+    {
+      GetVhtMcs (i);
+    }
+}
+
+WifiMode
+VhtPhy::GetVhtMcs (uint8_t index)
+{
+#define CASE(x) \
+case x: \
+  return GetVhtMcs ## x (); \
+
+  switch (index)
+    {
+      CASE ( 0)
+      CASE ( 1)
+      CASE ( 2)
+      CASE ( 3)
+      CASE ( 4)
+      CASE ( 5)
+      CASE ( 6)
+      CASE ( 7)
+      CASE ( 8)
+      CASE ( 9)
+      default:
+        NS_ABORT_MSG ("Inexistent index (" << +index << ") requested for VHT");
+        return WifiMode ();
+    }
+#undef CASE
+}
+
+#define GET_VHT_MCS(x) \
+WifiMode \
+VhtPhy::GetVhtMcs ## x (void) \
+{ \
+  static WifiMode mcs = CreateVhtMcs (x); \
+  return mcs; \
+}; \
+
+GET_VHT_MCS (0)
+GET_VHT_MCS (1)
+GET_VHT_MCS (2)
+GET_VHT_MCS (3)
+GET_VHT_MCS (4)
+GET_VHT_MCS (5)
+GET_VHT_MCS (6)
+GET_VHT_MCS (7)
+GET_VHT_MCS (8)
+GET_VHT_MCS (9)
+#undef GET_VHT_MCS
+
+WifiMode
+VhtPhy::CreateVhtMcs (uint8_t index)
+{
+  NS_ASSERT_MSG (index <= 9, "VhtMcs index must be <= 9!");
+  return WifiModeFactory::CreateWifiMcs ("VhtMcs" + std::to_string (index),
+                                         index,
+                                         WIFI_MOD_CLASS_VHT,
+                                         MakeBoundCallback (&GetCodeRate, index),
+                                         MakeBoundCallback (&GetConstellationSize, index),
+                                         MakeBoundCallback (&GetPhyRate, index),
+                                         MakeCallback (&GetPhyRateFromTxVector),
+                                         MakeBoundCallback (&GetDataRate, index),
+                                         MakeCallback (&GetDataRateFromTxVector),
+                                         MakeBoundCallback (&GetNonHtReferenceRate, index),
+                                         MakeBoundCallback (&IsModeAllowed, index));
+}
+
+WifiCodeRate
+VhtPhy::GetCodeRate (uint8_t mcsValue)
+{
+  switch (mcsValue)
+    {
+      case 8:
+        return WIFI_CODE_RATE_3_4;
+      case 9:
+        return WIFI_CODE_RATE_5_6;
+      default:
+        return HtPhy::GetCodeRate (mcsValue);
+    }
+}
+
+uint16_t
+VhtPhy::GetConstellationSize (uint8_t mcsValue)
+{
+  switch (mcsValue)
+    {
+      case 8:
+      case 9:
+        return 256;
+      default:
+        return HtPhy::GetConstellationSize (mcsValue);
+    }
+}
+
+uint64_t
+VhtPhy::GetPhyRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+{
+  WifiCodeRate codeRate = GetCodeRate (mcsValue);
+  uint64_t dataRate = GetDataRate (mcsValue, channelWidth, guardInterval, nss);
+  return HtPhy::CalculatePhyRate (codeRate, dataRate);
+}
+
+uint64_t
+VhtPhy::GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
+{
+  return GetPhyRate (txVector.GetMode ().GetMcsValue (),
+                     txVector.GetChannelWidth (),
+                     txVector.GetGuardInterval (),
+                     txVector.GetNss ());
+}
+
+uint64_t
+VhtPhy::GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t /* staId */)
+{
+  return GetDataRate (txVector.GetMode ().GetMcsValue (),
+                      txVector.GetChannelWidth (),
+                      txVector.GetGuardInterval (),
+                      txVector.GetNss ());
+}
+
+uint64_t
+VhtPhy::GetDataRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss)
+{
+  NS_ASSERT (guardInterval == 800 || guardInterval == 400);
+  NS_ASSERT (nss <= 8);
+  NS_ASSERT_MSG (IsModeAllowed (mcsValue, channelWidth, nss), "VHT MCS " << +mcsValue << " forbidden at " << channelWidth << " MHz when NSS is " << +nss);
+  return HtPhy::CalculateDataRate (3.2, guardInterval,
+                                   GetUsableSubcarriers (channelWidth),
+                                   static_cast<uint16_t> (log2 (GetConstellationSize (mcsValue))),
+                                   HtPhy::GetCodeRatio (GetCodeRate (mcsValue)), nss);
+}
+
+uint16_t
+VhtPhy::GetUsableSubcarriers (uint16_t channelWidth)
+{
+  switch (channelWidth)
+    {
+      case 80:
+        return 234;
+      case 160:
+        return 468;
+      default:
+        return HtPhy::GetUsableSubcarriers (channelWidth);
+    }
+}
+
+uint64_t
+VhtPhy::GetNonHtReferenceRate (uint8_t mcsValue)
+{
+  WifiCodeRate codeRate = GetCodeRate (mcsValue);
+  uint16_t constellationSize = GetConstellationSize (mcsValue);
+  return CalculateNonHtReferenceRate (codeRate, constellationSize);
+}
+
+uint64_t
+VhtPhy::CalculateNonHtReferenceRate (WifiCodeRate codeRate, uint16_t constellationSize)
+{
+  uint64_t dataRate;
+  switch (constellationSize)
+    {
+      case 256:
+        if (codeRate == WIFI_CODE_RATE_3_4 || codeRate == WIFI_CODE_RATE_5_6)
+          {
+            dataRate = 54000000;
+          }
+        else
+          {
+            NS_FATAL_ERROR ("Trying to get reference rate for a MCS with wrong combination of coding rate and modulation");
+          }
+        break;
+      default:
+        dataRate = HtPhy::CalculateNonHtReferenceRate (codeRate, constellationSize);
+    }
+  return dataRate;
+}
+
+bool
+VhtPhy::IsModeAllowed (uint8_t mcsValue, uint16_t channelWidth, uint8_t nss)
+{
+  if (mcsValue == 9 && channelWidth == 20 && nss != 3)
+    {
+      return false;
+    }
+  if (mcsValue == 6 && channelWidth == 80 && nss == 3)
+    {
+      return false;
+    }
+  return true;
+}
+
+uint32_t
+VhtPhy::GetMaxPsduSize (void) const
+{
+  return 4692480;
+}
+
+} //namespace ns3
+
+namespace {
+
+/**
+ * Constructor class for VHT modes
+ */
+static class ConstructorVht
+{
+public:
+  ConstructorVht ()
+  {
+    ns3::VhtPhy::InitializeModes ();
+    ns3::WifiPhy::AddStaticPhyEntity (ns3::WIFI_MOD_CLASS_VHT, ns3::Create<ns3::VhtPhy> ());
+  }
+} g_constructor_vht; ///< the constructor for VHT modes
+
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht/vht-phy.h ns-3.34/src/wifi/model/vht/vht-phy.h
--- ns-3.33/src/wifi/model/vht/vht-phy.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/vht/vht-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,353 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Rediet <getachew.redieteab@orange.com>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com> (for logic ported from wifi-phy)
+ */
+
+#ifndef VHT_PHY_H
+#define VHT_PHY_H
+
+#include "ns3/ht-phy.h"
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of ns3::VhtPhy class.
+ */
+
+namespace ns3 {
+
+/**
+ * This defines the BSS membership value for VHT PHY.
+ */
+#define VHT_PHY 126
+
+/**
+ * \brief PHY entity for VHT (11ac)
+ * \ingroup wifi
+ *
+ * VHT PHY is based on HT PHY.
+ *
+ * Refer to IEEE 802.11-2016, clause 21.
+ */
+class VhtPhy : public HtPhy
+{
+public:
+  /**
+   * Constructor for VHT PHY
+   *
+   * \param buildModeList flag used to add VHT modes to list (disabled
+   *                      by child classes to only add child classes' modes)
+   */
+  VhtPhy (bool buildModeList = true);
+  /**
+   * Destructor for VHT PHY
+   */
+  virtual ~VhtPhy ();
+
+  WifiMode GetSigMode (WifiPpduField field, const WifiTxVector& txVector) const override;
+  const PpduFormats & GetPpduFormats (void) const override;
+  Time GetDuration (WifiPpduField field, const WifiTxVector& txVector) const override;
+  Time GetLSigDuration (WifiPreamble preamble) const override;
+  Time GetTrainingDuration (const WifiTxVector& txVector,
+                            uint8_t nDataLtf,
+                            uint8_t nExtensionLtf = 0) const override;
+  Ptr<WifiPpdu> BuildPpdu (const WifiConstPsduMap & psdus,
+                           const WifiTxVector& txVector,
+                           Time ppduDuration) override;
+
+  /**
+   * \return the WifiMode used for the SIG-A field
+   */
+  virtual WifiMode GetSigAMode (void) const;
+  /**
+   * \param txVector the transmission parameters
+   * \return the WifiMode used for the SIG-B field
+   */
+  virtual WifiMode GetSigBMode (const WifiTxVector& txVector) const;
+
+  /**
+   * \param preamble the type of preamble
+   * \return the duration of the SIG-A field
+   */
+  virtual Time GetSigADuration (WifiPreamble preamble) const;
+  /**
+   * \param txVector the transmission parameters
+   * \return the duration of the SIG-B field
+   */
+  virtual Time GetSigBDuration (const WifiTxVector& txVector) const;
+
+  /**
+   * Initialize all VHT modes.
+   */
+  static void InitializeModes (void);
+  /**
+   * Return the VHT MCS corresponding to
+   * the provided index.
+   *
+   * \param index the index of the MCS
+   * \return an VHT MCS
+   */
+  static WifiMode GetVhtMcs (uint8_t index);
+
+  /**
+   * Return MCS 0 from VHT MCS values.
+   *
+   * \return MCS 0 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs0 (void);
+  /**
+   * Return MCS 1 from VHT MCS values.
+   *
+   * \return MCS 1 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs1 (void);
+  /**
+   * Return MCS 2 from VHT MCS values.
+   *
+   * \return MCS 2 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs2 (void);
+  /**
+   * Return MCS 3 from VHT MCS values.
+   *
+   * \return MCS 3 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs3 (void);
+  /**
+   * Return MCS 4 from VHT MCS values.
+   *
+   * \return MCS 4 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs4 (void);
+  /**
+   * Return MCS 5 from VHT MCS values.
+   *
+   * \return MCS 5 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs5 (void);
+  /**
+   * Return MCS 6 from VHT MCS values.
+   *
+   * \return MCS 6 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs6 (void);
+  /**
+   * Return MCS 7 from VHT MCS values.
+   *
+   * \return MCS 7 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs7 (void);
+  /**
+   * Return MCS 8 from VHT MCS values.
+   *
+   * \return MCS 8 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs8 (void);
+  /**
+   * Return MCS 9 from VHT MCS values.
+   *
+   * \return MCS 9 from VHT MCS values
+   */
+  static WifiMode GetVhtMcs9 (void);
+
+  /**
+   * Return the coding rate corresponding to
+   * the supplied VHT MCS index. This function is
+   * reused by child classes and is used as a callback
+   * for WifiMode operation.
+   *
+   * \param mcsValue the MCS index
+   * \return the coding rate.
+   */
+  static WifiCodeRate GetCodeRate (uint8_t mcsValue);
+  /**
+   * Return the constellation size corresponding
+   * to the supplied VHT MCS index. This function is
+   * reused by child classes and is used as a callback for
+   * WifiMode operation.
+   *
+   * \param mcsValue the MCS index
+   * \return the size of modulation constellation.
+   */
+  static uint16_t GetConstellationSize (uint8_t mcsValue);
+  /**
+   * Return the PHY rate corresponding to the supplied VHT MCS
+   * index, channel width, guard interval, and number of
+   * spatial stream. This function calls HtPhy::CalculatePhyRate
+   * and is mainly used as a callback for WifiMode operation.
+   *
+   * \param mcsValue the VHT MCS index
+   * \param channelWidth the considered channel width in MHz
+   * \param guardInterval the considered guard interval duration in nanoseconds
+   * \param nss the considered number of stream
+   *
+   * \return the physical bit rate of this signal in bps.
+   */
+  static uint64_t GetPhyRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  /**
+   * Return the PHY rate corresponding to
+   * the supplied TXVECTOR.
+   * This function is mainly used as a callback
+   * for WifiMode operation.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the station ID (only here to have a common signature for all callbacks)
+   * \return the physical bit rate of this signal in bps.
+   */
+  static uint64_t GetPhyRateFromTxVector (const WifiTxVector& txVector, uint16_t staId);
+  /**
+   * Return the data rate corresponding to
+   * the supplied TXVECTOR.
+   * This function is mainly used as a callback
+   * for WifiMode operation.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the station ID (only here to have a common signature for all callbacks)
+   * \return the data bit rate in bps.
+   */
+  static uint64_t GetDataRateFromTxVector (const WifiTxVector& txVector, uint16_t staId);
+  /**
+   * Return the data rate corresponding to
+   * the supplied VHT MCS index, channel width,
+   * guard interval, and number of spatial
+   * streams.
+   *
+   * \param mcsValue the MCS index
+   * \param channelWidth the channel width in MHz
+   * \param guardInterval the guard interval duration in nanoseconds
+   * \param nss the number of spatial streams
+   * \return the data bit rate in bps.
+   */
+  static uint64_t GetDataRate (uint8_t mcsValue, uint16_t channelWidth, uint16_t guardInterval, uint8_t nss);
+  /**
+   * Calculate the rate in bps of the non-HT Reference Rate corresponding
+   * to the supplied VHT MCS index. This function calls CalculateNonHtReferenceRate
+   * and is used as a callback for WifiMode operation.
+   *
+   * \param mcsValue the VHT MCS index
+   * \return the rate in bps of the non-HT Reference Rate.
+   */
+  static uint64_t GetNonHtReferenceRate (uint8_t mcsValue);
+  /**
+   * Check whether the combination of <MCS, channel width, NSS> is allowed.
+   * This function is used as a callback for WifiMode operation.
+   *
+   * \param mcsValue the considered MCS index
+   * \param channelWidth the considered channel width in MHz
+   * \param nss the considered number of streams
+   * \returns true if this <MCS, channel width, NSS> combination is allowed, false otherwise.
+   */
+  static bool IsModeAllowed (uint8_t mcsValue, uint16_t channelWidth, uint8_t nss);
+
+protected:
+  WifiMode GetHtSigMode (void) const override;
+  Time GetHtSigDuration (void) const override;
+  uint8_t GetNumberBccEncoders (const WifiTxVector& txVector) const override;
+  PhyFieldRxStatus DoEndReceiveField (WifiPpduField field, Ptr<Event> event) override;
+  bool IsAllConfigSupported (WifiPpduField field, Ptr<const WifiPpdu> ppdu) const override;
+  uint32_t GetMaxPsduSize (void) const override;
+
+  /**
+   * End receiving the SIG-A, perform VHT-specific actions, and
+   * provide the status of the reception.
+   *
+   * Child classes can perform amendment-specific actions by specializing
+   * \see ProcessSigA.
+   *
+   * \param event the event holding incoming PPDU's information
+   * \return status of the reception of the SIG-A
+   */
+  PhyFieldRxStatus EndReceiveSigA (Ptr<Event> event);
+  /**
+   * End receiving the SIG-B, perform VHT-specific actions, and
+   * provide the status of the reception.
+   *
+   * Child classes can perform amendment-specific actions by specializing
+   * \see ProcessSigB.
+   *
+   * \param event the event holding incoming PPDU's information
+   * \return status of the reception of the SIG-B
+   */
+  PhyFieldRxStatus EndReceiveSigB (Ptr<Event> event);
+
+  /**
+   * Process SIG-A, perform amendment-specific actions, and
+   * provide an updated status of the reception.
+   *
+   * \param event the event holding incoming PPDU's information
+   * \param status the status of the reception of the correctly received SIG-A after the configuration support check
+   * \return the updated status of the reception of the SIG-A
+   */
+  virtual PhyFieldRxStatus ProcessSigA (Ptr<Event> event, PhyFieldRxStatus status);
+  /**
+   * Process SIG-B, perform amendment-specific actions, and
+   * provide an updated status of the reception.
+   *
+   * \param event the event holding incoming PPDU's information
+   * \param status the status of the reception of the correctly received SIG-B after the configuration support check
+   * \return the updated status of the reception of the SIG-B
+   */
+  virtual PhyFieldRxStatus ProcessSigB (Ptr<Event> event, PhyFieldRxStatus status);
+
+  /**
+   * Return the rate (in bps) of the non-HT Reference Rate
+   * which corresponds to the supplied code rate and
+   * constellation size.
+   *
+   * \param codeRate the convolutional coding rate
+   * \param constellationSize the size of modulation constellation
+   * \returns the rate in bps.
+   *
+   * To convert an VHT MCS to its corresponding non-HT Reference Rate
+   * use the modulation and coding rate of the HT MCS
+   * and lookup in Table 10-7 of IEEE 802.11-2016.
+   */
+  static uint64_t CalculateNonHtReferenceRate (WifiCodeRate codeRate, uint16_t constellationSize);
+  /**
+   * \param channelWidth the channel width in MHz
+   * \return he number of usable subcarriers for data
+   */
+  static uint16_t GetUsableSubcarriers (uint16_t channelWidth);
+
+private:
+  void BuildModeList (void) override;
+
+  /**
+   * Return the VHT MCS corresponding to
+   * the provided index.
+   * This method binds all the callbacks used by WifiMode.
+   *
+   * \param index the index of the MCS
+   * \return a VHT MCS
+   */
+  static WifiMode CreateVhtMcs (uint8_t index);
+
+  /**
+   * Typedef for storing exceptions in the number of BCC encoders for VHT MCSs
+   */
+  typedef std::map< std::tuple<uint16_t /* channelWidth in MHz */,
+                               uint8_t /* Nss */,
+                               uint8_t /* MCS index */>, uint8_t /* Nes */ > NesExceptionMap;
+  static const NesExceptionMap m_exceptionsMap; //!< exception map for number of BCC encoders (extracted from VHT-MCS tables)
+  static const PpduFormats m_vhtPpduFormats;    //!< VHT PPDU formats
+}; //class VhtPhy
+
+} //namespace ns3
+
+#endif /* VHT_PHY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht/vht-ppdu.cc ns-3.34/src/wifi/model/vht/vht-ppdu.cc
--- ns-3.33/src/wifi/model/vht/vht-ppdu.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/vht/vht-ppdu.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,303 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2019 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Rediet <getachew.redieteab@orange.com>
+ *         Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
+ *         Sébastien Deronne <sebastien.deronne@gmail.com> (VhtSigHeader)
+ */
+
+#include "ns3/wifi-phy.h"
+#include "ns3/wifi-psdu.h"
+#include "vht-phy.h"
+#include "vht-ppdu.h"
+#include "ns3/log.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("VhtPpdu");
+
+VhtPpdu::VhtPpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, Time ppduDuration,
+                  WifiPhyBand band, uint64_t uid)
+  : OfdmPpdu (psdu, txVector, band, uid, false) //don't instantiate LSigHeader of OfdmPpdu
+{
+  NS_LOG_FUNCTION (this << psdu << txVector << ppduDuration << band << uid);
+  uint16_t length = ((ceil ((static_cast<double> (ppduDuration.GetNanoSeconds () - (20 * 1000)) / 1000) / 4.0) * 3) - 3);
+  m_lSig.SetLength (length);
+  m_vhtSig.SetMuFlag (m_preamble == WIFI_PREAMBLE_VHT_MU);
+  m_vhtSig.SetChannelWidth (m_channelWidth);
+  m_vhtSig.SetShortGuardInterval (txVector.GetGuardInterval () == 400);
+  uint32_t nSymbols = (static_cast<double> ((ppduDuration - WifiPhy::CalculatePhyPreambleAndHeaderDuration (txVector)).GetNanoSeconds ()) / (3200 + txVector.GetGuardInterval ()));
+  if (txVector.GetGuardInterval () == 400)
+    {
+      m_vhtSig.SetShortGuardIntervalDisambiguation ((nSymbols % 10) == 9);
+    }
+  m_vhtSig.SetSuMcs (txVector.GetMode ().GetMcsValue ());
+  m_vhtSig.SetNStreams (txVector.GetNss ());
+}
+
+VhtPpdu::~VhtPpdu ()
+{
+}
+
+WifiTxVector
+VhtPpdu::DoGetTxVector (void) const
+{
+  WifiTxVector txVector;
+  txVector.SetPreambleType (m_preamble);
+  txVector.SetMode (VhtPhy::GetVhtMcs (m_vhtSig.GetSuMcs ()));
+  txVector.SetChannelWidth (m_vhtSig.GetChannelWidth ());
+  txVector.SetNss (m_vhtSig.GetNStreams ());
+  txVector.SetGuardInterval (m_vhtSig.GetShortGuardInterval () ? 400 : 800);
+  txVector.SetAggregation (GetPsdu ()->IsAggregate ());
+  return txVector;
+}
+
+Time
+VhtPpdu::GetTxDuration (void) const
+{
+  Time ppduDuration = Seconds (0);
+  const WifiTxVector& txVector = GetTxVector ();
+  Time tSymbol = NanoSeconds (3200 + txVector.GetGuardInterval ());
+  Time preambleDuration = WifiPhy::CalculatePhyPreambleAndHeaderDuration (txVector);
+  Time calculatedDuration = MicroSeconds (((ceil (static_cast<double> (m_lSig.GetLength () + 3) / 3)) * 4) + 20);
+  uint32_t nSymbols = floor (static_cast<double> ((calculatedDuration - preambleDuration).GetNanoSeconds ()) / tSymbol.GetNanoSeconds ());
+  if (m_vhtSig.GetShortGuardInterval () && m_vhtSig.GetShortGuardIntervalDisambiguation ())
+    {
+      nSymbols--;
+    }
+  ppduDuration = preambleDuration + (nSymbols * tSymbol);
+  return ppduDuration;
+}
+
+Ptr<WifiPpdu>
+VhtPpdu::Copy (void) const
+{
+  return Create<VhtPpdu> (GetPsdu (), GetTxVector (), GetTxDuration (), m_band, m_uid);
+}
+
+WifiPpduType
+VhtPpdu::GetType (void) const
+{
+  return (m_preamble == WIFI_PREAMBLE_VHT_MU) ? WIFI_PPDU_TYPE_DL_MU : WIFI_PPDU_TYPE_SU;
+}
+
+VhtPpdu::VhtSigHeader::VhtSigHeader ()
+  : m_bw (0),
+    m_nsts (0),
+    m_sgi (0),
+    m_sgi_disambiguation (0),
+    m_suMcs (0),
+    m_mu (false)
+{
+}
+
+VhtPpdu::VhtSigHeader::~VhtSigHeader ()
+{
+}
+
+TypeId
+VhtPpdu::VhtSigHeader::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::VhtSigHeader")
+    .SetParent<Header> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<VhtSigHeader> ()
+  ;
+  return tid;
+}
+
+TypeId
+VhtPpdu::VhtSigHeader::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+void
+VhtPpdu::VhtSigHeader::Print (std::ostream &os) const
+{
+  os << "SU_MCS=" << +m_suMcs
+     << " CHANNEL_WIDTH=" << GetChannelWidth ()
+     << " SGI=" << +m_sgi
+     << " NSTS=" << +m_nsts
+     << " MU=" << +m_mu;
+}
+
+uint32_t
+VhtPpdu::VhtSigHeader::GetSerializedSize (void) const
+{
+  uint32_t size = 0;
+  size += 3; //VHT-SIG-A1
+  size += 3; //VHT-SIG-A2
+  if (m_mu)
+    {
+      size += 4; //VHT-SIG-B
+    }
+  return size;
+}
+
+void
+VhtPpdu::VhtSigHeader::SetMuFlag (bool mu)
+{
+  m_mu = mu;
+}
+
+void
+VhtPpdu::VhtSigHeader::SetChannelWidth (uint16_t channelWidth)
+{
+  if (channelWidth == 160)
+    {
+      m_bw = 3;
+    }
+  else if (channelWidth == 80)
+    {
+      m_bw = 2;
+    }
+  else if (channelWidth == 40)
+    {
+      m_bw = 1;
+    }
+  else
+    {
+      m_bw = 0;
+    }
+}
+
+uint16_t
+VhtPpdu::VhtSigHeader::GetChannelWidth (void) const
+{
+  if (m_bw == 3)
+    {
+      return 160;
+    }
+  else if (m_bw == 2)
+    {
+      return 80;
+    }
+  else if (m_bw == 1)
+    {
+      return 40;
+    }
+  else
+    {
+      return 20;
+    }
+}
+
+void
+VhtPpdu::VhtSigHeader::SetNStreams (uint8_t nStreams)
+{
+  NS_ASSERT (nStreams <= 8);
+  m_nsts = (nStreams - 1);
+}
+
+uint8_t
+VhtPpdu::VhtSigHeader::GetNStreams (void) const
+{
+  return (m_nsts + 1);
+}
+
+void
+VhtPpdu::VhtSigHeader::SetShortGuardInterval (bool sgi)
+{
+  m_sgi = sgi ? 1 : 0;
+}
+
+bool
+VhtPpdu::VhtSigHeader::GetShortGuardInterval (void) const
+{
+  return m_sgi ? true : false;
+}
+
+void
+VhtPpdu::VhtSigHeader::SetShortGuardIntervalDisambiguation (bool disambiguation)
+{
+  m_sgi_disambiguation = disambiguation ? 1 : 0;
+}
+
+bool
+VhtPpdu::VhtSigHeader::GetShortGuardIntervalDisambiguation (void) const
+{
+  return m_sgi_disambiguation ? true : false;
+}
+
+void
+VhtPpdu::VhtSigHeader::SetSuMcs (uint8_t mcs)
+{
+  NS_ASSERT (mcs <= 9);
+  m_suMcs = mcs;
+}
+
+uint8_t
+VhtPpdu::VhtSigHeader::GetSuMcs (void) const
+{
+  return m_suMcs;
+}
+
+void
+VhtPpdu::VhtSigHeader::Serialize (Buffer::Iterator start) const
+{
+  //VHT-SIG-A1
+  uint8_t byte = m_bw;
+  byte |= (0x01 << 2); //Set Reserved bit #2 to 1
+  start.WriteU8 (byte);
+  uint16_t bytes = (m_nsts & 0x07) << 2;
+  bytes |= (0x01 << (23 - 8)); //Set Reserved bit #23 to 1
+  start.WriteU16 (bytes);
+
+  //VHT-SIG-A2
+  byte = m_sgi & 0x01;
+  byte |= ((m_sgi_disambiguation & 0x01) << 1);
+  byte |= ((m_suMcs & 0x0f) << 4);
+  start.WriteU8 (byte);
+  bytes = (0x01 << (9 - 8)); //Set Reserved bit #9 to 1
+  start.WriteU16 (bytes);
+
+  if (m_mu)
+    {
+      //VHT-SIG-B
+      start.WriteU32 (0);
+    }
+}
+
+uint32_t
+VhtPpdu::VhtSigHeader::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+
+  //VHT-SIG-A1
+  uint8_t byte = i.ReadU8 ();
+  m_bw = byte & 0x03;
+  uint16_t bytes = i.ReadU16 ();
+  m_nsts = ((bytes >> 2) & 0x07);
+
+  //VHT-SIG-A2
+  byte = i.ReadU8 ();
+  m_sgi = byte & 0x01;
+  m_sgi_disambiguation = ((byte >> 1) & 0x01);
+  m_suMcs = ((byte >> 4) & 0x0f);
+  i.ReadU16 ();
+
+  if (m_mu)
+    {
+      //VHT-SIG-B
+      i.ReadU32 ();
+    }
+
+  return i.GetDistanceFrom (start);
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht/vht-ppdu.h ns-3.34/src/wifi/model/vht/vht-ppdu.h
--- ns-3.33/src/wifi/model/vht/vht-ppdu.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/vht/vht-ppdu.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,181 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2019 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Rediet <getachew.redieteab@orange.com>
+ *         Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
+ *         Sébastien Deronne <sebastien.deronne@gmail.com> (VhtSigHeader)
+ */
+
+#ifndef VHT_PPDU_H
+#define VHT_PPDU_H
+
+#include "ns3/ofdm-ppdu.h"
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of ns3::VhtPpdu class.
+ */
+
+namespace ns3 {
+
+class WifiPsdu;
+
+/**
+ * \brief VHT PPDU (11ac)
+ * \ingroup wifi
+ *
+ * VhtPpdu stores a preamble, PHY headers and a PSDU of a PPDU with VHT header
+ */
+class VhtPpdu : public OfdmPpdu
+{
+public:
+
+  /**
+   * VHT PHY header (VHT-SIG-A1/A2/B).
+   * See section 21.3.8 in IEEE 802.11-2016.
+   */
+  class VhtSigHeader : public Header
+  {
+  public:
+    VhtSigHeader ();
+    virtual ~VhtSigHeader ();
+
+    /**
+     * \brief Get the type ID.
+     * \return the object TypeId
+     */
+    static TypeId GetTypeId (void);
+
+    TypeId GetInstanceTypeId (void) const override;
+    void Print (std::ostream &os) const override;
+    uint32_t GetSerializedSize (void) const override;
+    void Serialize (Buffer::Iterator start) const override;
+    uint32_t Deserialize (Buffer::Iterator start) override;
+
+    /**
+     * Set the Multi-User (MU) flag.
+     *
+     * \param mu the MU flag
+     */
+    void SetMuFlag (bool mu);
+
+    /**
+     * Fill the channel width field of VHT-SIG-A1 (in MHz).
+     *
+     * \param channelWidth the channel width (in MHz)
+     */
+    void SetChannelWidth (uint16_t channelWidth);
+    /**
+     * Return the channel width (in MHz).
+     *
+     * \return the channel width (in MHz)
+     */
+    uint16_t GetChannelWidth (void) const;
+    /**
+     * Fill the number of streams field of VHT-SIG-A1.
+     *
+     * \param nStreams the number of streams
+     */
+    void SetNStreams (uint8_t nStreams);
+    /**
+     * Return the number of streams.
+     *
+     * \return the number of streams
+     */
+    uint8_t GetNStreams (void) const;
+
+    /**
+     * Fill the short guard interval field of VHT-SIG-A2.
+     *
+     * \param sgi whether short guard interval is used or not
+     */
+    void SetShortGuardInterval (bool sgi);
+    /**
+     * Return the short GI field of VHT-SIG-A2.
+     *
+     * \return the short GI field of VHT-SIG-A2
+     */
+    bool GetShortGuardInterval (void) const;
+    /**
+     * Fill the short GI NSYM disambiguation field of VHT-SIG-A2.
+     *
+     * \param disambiguation whether short GI NSYM disambiguation is set or not
+     */
+    void SetShortGuardIntervalDisambiguation (bool disambiguation);
+    /**
+     * Return the short GI NSYM disambiguation field of VHT-SIG-A2.
+     *
+     * \return the short GI NSYM disambiguation field of VHT-SIG-A2
+     */
+    bool GetShortGuardIntervalDisambiguation (void) const;
+    /**
+     * Fill the SU VHT MCS field of VHT-SIG-A2.
+     *
+     * \param mcs the SU VHT MCS field of VHT-SIG-A2
+     */
+    void SetSuMcs (uint8_t mcs);
+    /**
+     * Return the SU VHT MCS field of VHT-SIG-A2.
+     *
+     * \return the SU VHT MCS field of VHT-SIG-A2
+     */
+    uint8_t GetSuMcs (void) const;
+
+  private:
+    //VHT-SIG-A1 fields
+    uint8_t m_bw;   ///< BW
+    uint8_t m_nsts; ///< NSTS
+
+    //VHT-SIG-A2 fields
+    uint8_t m_sgi;                ///< Short GI
+    uint8_t m_sgi_disambiguation; ///< Short GI NSYM Disambiguation
+    uint8_t m_suMcs;              ///< SU VHT MCS
+
+    /// This is used to decide whether MU SIG-B should be added or not
+    bool m_mu;
+  }; //class VhtSigHeader
+
+  /**
+   * Create a VHT PPDU.
+   *
+   * \param psdu the PHY payload (PSDU)
+   * \param txVector the TXVECTOR that was used for this PPDU
+   * \param ppduDuration the transmission duration of this PPDU
+   * \param band the WifiPhyBand used for the transmission of this PPDU
+   * \param uid the unique ID of this PPDU
+   */
+  VhtPpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, Time ppduDuration,
+           WifiPhyBand band, uint64_t uid);
+  /**
+   * Destructor for VhtPpdu.
+   */
+  virtual ~VhtPpdu ();
+
+  Time GetTxDuration (void) const override;
+  Ptr<WifiPpdu> Copy (void) const override;
+  WifiPpduType GetType (void) const override;
+
+private:
+  WifiTxVector DoGetTxVector (void) const override;
+
+  VhtSigHeader m_vhtSig;  //!< the VHT-SIG PHY header
+}; //class VhtPpdu
+
+} //namespace ns3
+
+#endif /* VHT_PPDU_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht-capabilities.cc ns-3.34/src/wifi/model/vht-capabilities.cc
--- ns-3.33/src/wifi/model/vht-capabilities.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/vht-capabilities.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,426 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2015
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Authors: Ghada Badawy <gbadawy@rim.com>
- *          Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "vht-capabilities.h"
-
-namespace ns3 {
-
-VhtCapabilities::VhtCapabilities ()
-  : m_maxMpduLength (0),
-    m_supportedChannelWidthSet (0),
-    m_rxLdpc (0),
-    m_shortGuardIntervalFor80Mhz (0),
-    m_shortGuardIntervalFor160Mhz (0),
-    m_txStbc (0),
-    m_rxStbc (0),
-    m_suBeamformerCapable (0),
-    m_suBeamformeeCapable (0),
-    m_beamformeeStsCapable (0),
-    m_numberOfSoundingDimensions (0),
-    m_muBeamformerCapable (0),
-    m_muBeamformeeCapable (0),
-    m_vhtTxopPs (0),
-    m_htcVhtCapable (0),
-    m_maxAmpduLengthExponent (0),
-    m_vhtLinkAdaptationCapable (0),
-    m_rxAntennaPatternConsistency (0),
-    m_txAntennaPatternConsistency (0),
-    m_rxHighestSupportedLongGuardIntervalDataRate (0),
-    m_txHighestSupportedLongGuardIntervalDataRate (0),
-    m_vhtSupported (0)
-{
-  m_rxMcsMap.resize (8,0);
-  m_txMcsMap.resize (8,0);
-  for (uint8_t i = 0; i < 8; i++) //set to 3 by default, i.e. #spatial streams not supported. 0 means supported up to MCS 7, not what we want to imply at this stage.
-    {
-      m_rxMcsMap[i] = 3;
-      m_txMcsMap[i] = 3;
-    }
-}
-
-WifiInformationElementId
-VhtCapabilities::ElementId () const
-{
-  return IE_VHT_CAPABILITIES;
-}
-
-void
-VhtCapabilities::SetVhtSupported (uint8_t vhtSupported)
-{
-  m_vhtSupported = vhtSupported;
-}
-
-uint8_t
-VhtCapabilities::GetInformationFieldSize () const
-{
-  //we should not be here if vht is not supported
-  NS_ASSERT (m_vhtSupported > 0);
-  return 12;
-}
-
-Buffer::Iterator
-VhtCapabilities::Serialize (Buffer::Iterator i) const
-{
-  if (m_vhtSupported < 1)
-    {
-      return i;
-    }
-  return WifiInformationElement::Serialize (i);
-}
-
-uint16_t
-VhtCapabilities::GetSerializedSize () const
-{
-  if (m_vhtSupported < 1)
-    {
-      return 0;
-    }
-  return WifiInformationElement::GetSerializedSize ();
-}
-
-void
-VhtCapabilities::SerializeInformationField (Buffer::Iterator start) const
-{
-  if (m_vhtSupported == 1)
-    {
-      //write the corresponding value for each bit
-      start.WriteHtolsbU32 (GetVhtCapabilitiesInfo ());
-      start.WriteHtolsbU64 (GetSupportedMcsAndNssSet ());
-    }
-}
-
-uint8_t
-VhtCapabilities::DeserializeInformationField (Buffer::Iterator start,
-                                              uint8_t length)
-{
-  Buffer::Iterator i = start;
-  uint32_t vhtinfo = i.ReadLsbtohU32 ();
-  uint64_t mcsset = i.ReadLsbtohU64 ();
-  SetVhtCapabilitiesInfo (vhtinfo);
-  SetSupportedMcsAndNssSet (mcsset);
-  return length;
-}
-
-void
-VhtCapabilities::SetVhtCapabilitiesInfo (uint32_t ctrl)
-{
-  m_maxMpduLength = ctrl & 0x03;
-  m_supportedChannelWidthSet = (ctrl >> 2) & 0x03;
-  m_rxLdpc = (ctrl >> 4) & 0x01;
-  m_shortGuardIntervalFor80Mhz = (ctrl >> 5) & 0x01;
-  m_shortGuardIntervalFor160Mhz = (ctrl >> 6) & 0x01;
-  m_txStbc = (ctrl >> 7) & 0x01;
-  m_rxStbc = (ctrl >> 8) & 0x07;
-  m_suBeamformerCapable = (ctrl >> 11) & 0x01;
-  m_suBeamformeeCapable = (ctrl >> 12) & 0x01;
-  m_beamformeeStsCapable = (ctrl >> 13) & 0x07;
-  m_numberOfSoundingDimensions = (ctrl >> 16) & 0x07;
-  m_muBeamformerCapable = (ctrl >> 19) & 0x01;
-  m_muBeamformeeCapable = (ctrl >> 20) & 0x01;
-  m_vhtTxopPs = (ctrl >> 21) & 0x01;
-  m_htcVhtCapable = (ctrl >> 22) & 0x01;
-  m_maxAmpduLengthExponent = (ctrl >> 23) & 0x07;
-  m_vhtLinkAdaptationCapable = (ctrl >> 26) & 0x03;
-  m_rxAntennaPatternConsistency = (ctrl >> 28) & 0x01;
-  m_txAntennaPatternConsistency = (ctrl >> 29) & 0x01;
-}
-
-uint32_t
-VhtCapabilities::GetVhtCapabilitiesInfo () const
-{
-  uint32_t val = 0;
-  val |= m_maxMpduLength & 0x03;
-  val |= (m_supportedChannelWidthSet & 0x03) << 2;
-  val |= (m_rxLdpc & 0x01) << 4;
-  val |= (m_shortGuardIntervalFor80Mhz & 0x01) << 5;
-  val |= (m_shortGuardIntervalFor160Mhz & 0x01) << 6;
-  val |= (m_txStbc & 0x01) << 7;
-  val |= (m_rxStbc & 0x07) << 8;
-  val |= (m_suBeamformerCapable & 0x01) << 11;
-  val |= (m_suBeamformeeCapable & 0x01) << 12;
-  val |= (m_beamformeeStsCapable & 0x07) << 13;
-  val |= (m_numberOfSoundingDimensions & 0x07) << 16;
-  val |= (m_muBeamformerCapable & 0x01) << 19;
-  val |= (m_muBeamformeeCapable & 0x01) << 20;
-  val |= (m_vhtTxopPs & 0x01) << 21;
-  val |= (m_htcVhtCapable & 0x01) << 22;
-  val |= (m_maxAmpduLengthExponent & 0x07) << 23;
-  val |= (m_vhtLinkAdaptationCapable & 0x03) << 26;
-  val |= (m_rxAntennaPatternConsistency & 0x01) << 28;
-  val |= (m_txAntennaPatternConsistency & 0x01) << 29;
-  return val;
-}
-
-void
-VhtCapabilities::SetSupportedMcsAndNssSet (uint64_t ctrl)
-{
-  uint16_t n;
-  for (uint8_t i = 0; i < 8; i++)
-    {
-      n = i * 2;
-      m_rxMcsMap[i] = (ctrl >> n) & 0x03;
-    }
-  m_rxHighestSupportedLongGuardIntervalDataRate = (ctrl >> 16) & 0x1fff;
-  for (uint8_t i = 0; i < 8; i++)
-    {
-      n = (i * 2) + 32;
-      m_txMcsMap[i] = (ctrl >> n) & 0x03;
-    }
-  m_txHighestSupportedLongGuardIntervalDataRate = (ctrl >> 48) & 0x1fff;
-}
-
-uint64_t
-VhtCapabilities::GetSupportedMcsAndNssSet () const
-{
-  uint64_t val = 0;
-  uint16_t n;
-  for (uint8_t i = 0; i < 8; i++)
-    {
-      n = i * 2;
-      val |= (static_cast<uint64_t> (m_rxMcsMap[i]) & 0x03) << n;
-    }
-  val |=  (static_cast<uint64_t> (m_rxHighestSupportedLongGuardIntervalDataRate) & 0x1fff) << 16;
-  for (uint8_t i = 0; i < 8; i++)
-    {
-      n = (i * 2) + 32;
-      val |= (static_cast<uint64_t> (m_txMcsMap[i]) & 0x03) << n;
-    }
-  val |= (static_cast<uint64_t> (m_txHighestSupportedLongGuardIntervalDataRate) & 0x1fff) << 48;
-  return val;
-}
-
-void
-VhtCapabilities::SetMaxMpduLength (uint16_t length)
-{
-  NS_ABORT_MSG_IF (length != 3895 && length != 7991 && length != 11454,
-                   "Invalid MPDU Max Length value");
-  if (length == 11454)
-    {
-      m_maxMpduLength = 2;
-    }
-  else if (length == 7991)
-    {
-      m_maxMpduLength = 1;
-    }
-  else
-    {
-      m_maxMpduLength = 0;
-    }
-}
-
-void
-VhtCapabilities::SetSupportedChannelWidthSet (uint8_t channelWidthSet)
-{
-  m_supportedChannelWidthSet = channelWidthSet;
-}
-
-void
-VhtCapabilities::SetRxLdpc (uint8_t rxLdpc)
-{
-  m_rxLdpc = rxLdpc;
-}
-
-void
-VhtCapabilities::SetShortGuardIntervalFor80Mhz (uint8_t shortGuardInterval)
-{
-  m_shortGuardIntervalFor80Mhz = shortGuardInterval;
-}
-
-void
-VhtCapabilities::SetShortGuardIntervalFor160Mhz (uint8_t shortGuardInterval)
-{
-  m_shortGuardIntervalFor160Mhz = shortGuardInterval;
-}
-
-void
-VhtCapabilities::SetRxStbc (uint8_t rxStbc)
-{
-  m_rxStbc = rxStbc;
-}
-
-void
-VhtCapabilities::SetTxStbc (uint8_t txStbc)
-{
-  m_txStbc = txStbc;
-}
-
-void
-VhtCapabilities::SetMaxAmpduLength (uint32_t maxampdulength)
-{
-  for (uint8_t i = 0; i <= 7; i++)
-    {
-      if ((1ul << (13 + i)) - 1 == maxampdulength)
-        {
-          m_maxAmpduLengthExponent = i;
-          return;
-        }
-    }
-  NS_ABORT_MSG ("Invalid A-MPDU Max Length value");
-}
-
-void
-VhtCapabilities::SetRxMcsMap (uint8_t mcs, uint8_t nss)
-{
-  //MCS index should be at least 7 and should not exceed 9
-  NS_ASSERT (mcs >= 7 && mcs <= 9);
-  m_rxMcsMap[nss - 1] = mcs - 7; //1 = MCS 8; 2 = MCS 9
-}
-
-void
-VhtCapabilities::SetTxMcsMap (uint8_t mcs, uint8_t nss)
-{
-  //MCS index should be at least 7 and should not exceed 9
-  NS_ASSERT (mcs >= 7 && mcs <= 9);
-  m_txMcsMap[nss - 1] = mcs - 7; //1 = MCS 8; 2 = MCS 9
-}
-
-bool
-VhtCapabilities::IsSupportedTxMcs (uint8_t mcs) const
-{
-  NS_ASSERT (mcs >= 0 && mcs <= 9);
-  if (mcs <= 7)
-    {
-      return true;
-    }
-  if (mcs == 8 && (m_txMcsMap[0] == 1 || m_txMcsMap[0] == 2))
-    {
-      return true;
-    }
-  if (mcs == 9 && m_txMcsMap[0] == 2)
-    {
-      return true;
-    }
-  return false;
-}
-
-bool
-VhtCapabilities::IsSupportedRxMcs (uint8_t mcs) const
-{
-  NS_ASSERT (mcs >= 0 && mcs <= 9);
-  if (mcs <= 7)
-    {
-      return true;
-    }
-  if (mcs == 8 && (m_rxMcsMap[0] == 1 || m_rxMcsMap[0] == 2))
-    {
-      return true;
-    }
-  if (mcs == 9 && m_rxMcsMap[0] == 2)
-    {
-      return true;
-    }
-  return false;
-}
-
-void
-VhtCapabilities::SetRxHighestSupportedLgiDataRate (uint16_t supportedDatarate)
-{
-  m_rxHighestSupportedLongGuardIntervalDataRate = supportedDatarate;
-}
-
-void
-VhtCapabilities::SetTxHighestSupportedLgiDataRate (uint16_t supportedDatarate)
-{
-  m_txHighestSupportedLongGuardIntervalDataRate = supportedDatarate;
-}
-
-uint16_t
-VhtCapabilities::GetMaxMpduLength (void) const
-{
-  if (m_maxMpduLength == 0)
-    {
-      return 3895;
-    }
-  if (m_maxMpduLength == 1)
-    {
-      return 7991;
-    }
-  if (m_maxMpduLength == 2)
-    {
-      return 11454;
-    }
-  NS_ABORT_MSG ("The value 3 is reserved");
-}
-
-uint8_t
-VhtCapabilities::GetSupportedChannelWidthSet () const
-{
-  return m_supportedChannelWidthSet;
-}
-
-uint8_t
-VhtCapabilities::GetRxLdpc () const
-{
-  return m_rxLdpc;
-}
-
-uint8_t
-VhtCapabilities::GetRxStbc () const
-{
-  return m_rxStbc;
-}
-
-uint8_t
-VhtCapabilities::GetTxStbc () const
-{
-  return m_txStbc;
-}
-
-uint32_t
-VhtCapabilities::GetMaxAmpduLength (void) const
-{
-  return (1ul << (13 + m_maxAmpduLengthExponent)) - 1;
-}
-
-bool
-VhtCapabilities::IsSupportedMcs (uint8_t mcs, uint8_t nss) const
-{
-  //The MCS index starts at 0 and NSS starts at 1
-  if (mcs <= 7 && m_rxMcsMap[nss - 1] < 3)
-    {
-      return true;
-    }
-  if (mcs == 8 && m_rxMcsMap[nss - 1] > 0 && m_rxMcsMap[nss - 1] < 3)
-    {
-      return true;
-    }
-  if (mcs == 9 && m_rxMcsMap[nss - 1] == 2)
-    {
-      return true;
-    }
-  return false;
-}
-
-uint16_t
-VhtCapabilities::GetRxHighestSupportedLgiDataRate () const
-{
-  return m_rxHighestSupportedLongGuardIntervalDataRate;
-}
-
-std::ostream &
-operator << (std::ostream &os, const VhtCapabilities &VhtCapabilities)
-{
-  os <<  VhtCapabilities.GetVhtCapabilitiesInfo () << "|" << VhtCapabilities.GetSupportedMcsAndNssSet ();
-
-  return os;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht-capabilities.h ns-3.34/src/wifi/model/vht-capabilities.h
--- ns-3.33/src/wifi/model/vht-capabilities.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/vht-capabilities.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,270 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2015
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Authors: Ghada Badawy <gbadawy@gmail.com>
- *          Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef VHT_CAPABILITIES_H
-#define VHT_CAPABILITIES_H
-
-#include "wifi-information-element.h"
-
-namespace ns3 {
-
-/**
- * \ingroup wifi
- *
- * The IEEE 802.11ac VHT Capabilities
- */
-class VhtCapabilities : public WifiInformationElement
-{
-public:
-  VhtCapabilities ();
-
-  // Implementations of pure virtual methods of WifiInformationElement
-  WifiInformationElementId ElementId () const;
-  uint8_t GetInformationFieldSize () const;
-  void SerializeInformationField (Buffer::Iterator start) const;
-  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length);
-  /* This information element is a bit special in that it is only
-     included if the STA is an VHT STA. To support this we
-     override the Serialize and GetSerializedSize methods of
-     WifiInformationElement. */
-  Buffer::Iterator Serialize (Buffer::Iterator start) const;
-  uint16_t GetSerializedSize () const;
-
-  /**
-   * Set the VHT supported field.
-   *
-   * \param vhtSupported the VHT supported field
-   */
-  void SetVhtSupported (uint8_t vhtSupported);
-
-  /**
-   * Set the VHT Capabilities Info field in the VHT Capabilities information element.
-   *
-   * \param ctrl the VHT Capabilities Info field in the VHT Capabilities information element
-   */
-  void SetVhtCapabilitiesInfo (uint32_t ctrl);
-  /**
-   * Set the MCS and NSS field in the VHT Capabilities information element.
-   *
-   * \param ctrl the MCS and NSS field in the VHT Capabilities information element
-   */
-  void SetSupportedMcsAndNssSet (uint64_t ctrl);
-
-  /**
-   * Return the VHT Capabilities Info field in the VHT Capabilities information element.
-   *
-   * \return the VHT Capabilities Info field in the VHT Capabilities information element
-   */
-  uint32_t GetVhtCapabilitiesInfo () const;
-  /**
-   * Return the MCS and NSS field in the VHT Capabilities information element.
-   *
-   * \return the MCS and NSS field in the VHT Capabilities information element
-   */
-  uint64_t GetSupportedMcsAndNssSet () const;
-
-  //Capabilities Info fields
-  /**
-   * Set the maximum MPDU length.
-   *
-   * \param length the maximum MPDU length (3895, 7991 or 11454)
-   */
-  void SetMaxMpduLength (uint16_t length);
-  /**
-   * Set the supported channel width set.
-   *
-   * \param channelWidthSet the supported channel width set
-   */
-  void SetSupportedChannelWidthSet (uint8_t channelWidthSet);
-  /**
-   * Set the receive LDPC.
-   *
-   * \param rxLdpc the receive LDPC
-   */
-  void SetRxLdpc (uint8_t rxLdpc);
-  /**
-   * Set the short guard interval 80 MHz.
-   *
-   * \param shortGuardInterval the short guard interval 80 MHz
-   */
-  void SetShortGuardIntervalFor80Mhz (uint8_t shortGuardInterval);
-  /**
-   * Set the short guard interval 160 MHz.
-   *
-   * \param shortGuardInterval the short guard interval 160 MHz
-   */
-  void SetShortGuardIntervalFor160Mhz (uint8_t shortGuardInterval);
-  /**
-   * Set the receive STBC.
-   *
-   * \param rxStbc the receive STBC
-   */
-  void SetRxStbc (uint8_t rxStbc);
-  /**
-   * Set the transmit STBC.
-   *
-   * \param txStbc the receive STBC
-   */
-  void SetTxStbc (uint8_t txStbc);
-  /**
-   * Set the maximum AMPDU length.
-   *
-   * \param maxAmpduLength 2^(13 + x) - 1, x in the range 0 to 7
-   */
-  void SetMaxAmpduLength (uint32_t maxAmpduLength);
-
-  /**
-   * Get the maximum MPDU length.
-   *
-   * \return the maximum MPDU length in bytes
-   */
-  uint16_t GetMaxMpduLength (void) const;
-  /**
-   * Get the supported channel width set.
-   *
-   * \returns the supported channel width set
-   */
-  uint8_t GetSupportedChannelWidthSet () const;
-  /**
-   * Get the receive LDPC.
-   *
-   * \returns the receive LDPC
-   */
-  uint8_t GetRxLdpc () const;
-  /**
-   * Get the receive STBC.
-   *
-   * \returns the receive STBC
-   */
-  uint8_t GetRxStbc () const;
-  /**
-   * Get the transmit STBC.
-   *
-   * \returns the transmit STBC
-   */
-  uint8_t GetTxStbc () const;
-
-  /**
-   * \param mcs Max MCS value (between 7 and 9)
-   * \param nss Spatial stream for which the Max MCS value is being set
-   */
-  void SetRxMcsMap (uint8_t mcs, uint8_t nss);
-  /**
-   * \param mcs Max MCS value (between 7 and 9)
-   * \param nss Spatial stream for which the Max MCS value is being set
-   */
-  void SetTxMcsMap (uint8_t mcs, uint8_t nss);
-  /**
-   * Set the receive highest supported LGI data rate.
-   *
-   * \param supportedDatarate receive highest supported LGI data rate
-   */
-  void SetRxHighestSupportedLgiDataRate (uint16_t supportedDatarate);
-  /**
-   * Set the transmit highest supported LGI data rate.
-   *
-   * \param supportedDatarate transmit highest supported LGI data rate
-   */
-  void SetTxHighestSupportedLgiDataRate (uint16_t supportedDatarate);
-  /**
-   * Get the is MCS supported.
-   *
-   * \param mcs the MCS
-   * \param nss the NSS
-   * \returns the is MCS supported
-   */
-  bool IsSupportedMcs (uint8_t mcs, uint8_t nss) const;
-
-  /**
-   * Get the receive highest supported LGI data rate.
-   *
-   * \returns the receive highest supported LGI data rate.
-   */
-  uint16_t GetRxHighestSupportedLgiDataRate () const;
-
-  /**
-   * Returns true if transmit MCS is supported.
-   *
-   * \param mcs the MCS
-   * \returns whether transmit MCS is supported
-   */
-  bool IsSupportedTxMcs (uint8_t mcs) const;
-  /**
-   * Returns true if receive MCS is supported.
-   *
-   * \param mcs the MCS
-   * \returns whether receive MCS is supported
-   */
-  bool IsSupportedRxMcs (uint8_t mcs) const;
-
-  /**
-   * Return the maximum A-MPDU length.
-   *
-   * \return the maximum A-MPDU length in bytes
-   */
-  uint32_t GetMaxAmpduLength (void) const;
-
-
-private:
-  //Capabilities Info fields
-  uint8_t m_maxMpduLength;               ///< maximum MPDU length
-  uint8_t m_supportedChannelWidthSet;    ///< supported channel width set
-  uint8_t m_rxLdpc;                      ///< receive LDPC
-  uint8_t m_shortGuardIntervalFor80Mhz;  ///< short guard interval for 80 MHz
-  uint8_t m_shortGuardIntervalFor160Mhz; ///< short guard interval for 160 MHz
-  uint8_t m_txStbc;                      ///< transmit STBC
-  uint8_t m_rxStbc;                      ///< receive STBC
-  uint8_t m_suBeamformerCapable;         ///< SU beamformer capable
-  uint8_t m_suBeamformeeCapable;         ///< SU beamformee capable
-  uint8_t m_beamformeeStsCapable;        ///< beamformee STS capable
-  uint8_t m_numberOfSoundingDimensions;  ///< number of sounding dimensions
-  uint8_t m_muBeamformerCapable;         ///< MU beamformer capable
-  uint8_t m_muBeamformeeCapable;         ///< MU beamformee capable
-  uint8_t m_vhtTxopPs;                   ///< VHT TXOP PS
-  uint8_t m_htcVhtCapable;               ///< HTC VHT capable
-  uint8_t m_maxAmpduLengthExponent;      ///< maximum A-MPDU length exponent
-  uint8_t m_vhtLinkAdaptationCapable;    ///< VHT link adaptation capable
-  uint8_t m_rxAntennaPatternConsistency; ///< receive antenna pattern consistency
-  uint8_t m_txAntennaPatternConsistency; ///< transmit antenna pattern consistency
-
-  //MCS and NSS field information
-  std::vector<uint8_t> m_rxMcsMap;                        ///< receive MCS map
-  uint16_t m_rxHighestSupportedLongGuardIntervalDataRate; ///< receive highest supported long guard interval data rate
-  std::vector<uint8_t> m_txMcsMap;                        ///< transmit MCS map
-  uint16_t m_txHighestSupportedLongGuardIntervalDataRate; ///< transmit highest supported long guard interval data rate
-
-  /// This is used to decide if this element should be added to the frame or not
-  uint8_t m_vhtSupported;
-};
-
-/**
- * output stream output operator
- *
- * \param os the output stream
- * \param VhtCapabilities the VHT capabilities
- *
- * \returns output stream
- */
-std::ostream &operator << (std::ostream &os, const VhtCapabilities &vhtcapabilities);
-
-} //namespace ns3
-
-#endif /* VHT_CAPABILITY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht-configuration.cc ns-3.34/src/wifi/model/vht-configuration.cc
--- ns-3.33/src/wifi/model/vht-configuration.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/vht-configuration.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,51 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018  Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "ns3/log.h"
-#include "vht-configuration.h"
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("VhtConfiguration");
-
-NS_OBJECT_ENSURE_REGISTERED (VhtConfiguration);
-
-VhtConfiguration::VhtConfiguration ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-VhtConfiguration::~VhtConfiguration ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-TypeId
-VhtConfiguration::GetTypeId (void)
-{
-  static ns3::TypeId tid = ns3::TypeId ("ns3::VhtConfiguration")
-    .SetParent<Object> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<VhtConfiguration> ()
-    ;
-    return tid;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht-configuration.h ns-3.34/src/wifi/model/vht-configuration.h
--- ns-3.33/src/wifi/model/vht-configuration.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/vht-configuration.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,52 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018  Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef VHT_CONFIGURATION_H
-#define VHT_CONFIGURATION_H
-
-#include "ns3/object.h"
-
-namespace ns3 {
-
-/**
- * \brief VHT configuration
- * \ingroup wifi
- *
- * This object stores VHT configuration information, for use in modifying
- * AP or STA behavior and for constructing VHT-related information elements.
- *
- */
-class VhtConfiguration : public Object
-{
-public:
-  VhtConfiguration ();
-  virtual ~VhtConfiguration ();
-
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-
-};
-
-} //namespace ns3
-
-#endif /* VHT_CONFIGURATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht-operation.cc ns-3.34/src/wifi/model/vht-operation.cc
--- ns-3.33/src/wifi/model/vht-operation.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/vht-operation.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,174 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2016 Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "vht-operation.h"
-
-namespace ns3 {
-
-VhtOperation::VhtOperation ()
-  : m_channelWidth (0),
-    m_channelCenterFrequencySegment0 (0),
-    m_channelCenterFrequencySegment1 (0),
-    m_basicVhtMcsAndNssSet (0),
-    m_vhtSupported (0)
-{
-}
-
-WifiInformationElementId
-VhtOperation::ElementId () const
-{
-  return IE_VHT_OPERATION;
-}
-
-void
-VhtOperation::SetVhtSupported (uint8_t vhtSupported)
-{
-  m_vhtSupported = vhtSupported;
-}
-
-uint8_t
-VhtOperation::GetInformationFieldSize () const
-{
-  //we should not be here if VHT is not supported
-  NS_ASSERT (m_vhtSupported > 0);
-  return 5;
-}
-
-void
-VhtOperation::SetChannelWidth (uint8_t channelWidth)
-{
-  m_channelWidth = channelWidth;
-}
-
-void
-VhtOperation::SetChannelCenterFrequencySegment0 (uint8_t channelCenterFrequencySegment0)
-{
-  m_channelCenterFrequencySegment0 = channelCenterFrequencySegment0;
-}
-
-void
-VhtOperation::SetChannelCenterFrequencySegment1 (uint8_t channelCenterFrequencySegment1)
-{
-  m_channelCenterFrequencySegment1 = channelCenterFrequencySegment1;
-}
-
-void
-VhtOperation::SetMaxVhtMcsPerNss (uint8_t nss, uint8_t maxVhtMcs)
-{
-  NS_ASSERT ((maxVhtMcs == 0 || (maxVhtMcs >= 7 && maxVhtMcs <= 9)) && (nss >= 1 && nss <= 8));
-  if (maxVhtMcs != 0)
-    {
-      m_basicVhtMcsAndNssSet |= (((maxVhtMcs - 7) & 0x03) << ((nss - 1) * 2));
-    }
-  else
-    {
-      m_basicVhtMcsAndNssSet |= (3 << ((nss - 1) * 2));
-    }
-}
-
-void
-VhtOperation::SetBasicVhtMcsAndNssSet (uint16_t basicVhtMcsAndNssSet)
-{
-  m_basicVhtMcsAndNssSet = basicVhtMcsAndNssSet;
-}
-
-uint8_t
-VhtOperation::GetChannelWidth (void) const
-{
-  return m_channelWidth;
-}
-
-uint8_t
-VhtOperation::GetChannelCenterFrequencySegment0 (void) const
-{
-  return m_channelCenterFrequencySegment0;
-}
-
-uint8_t
-VhtOperation::GetChannelCenterFrequencySegment1 (void) const
-{
-  return m_channelCenterFrequencySegment1;
-}
-
-uint16_t
-VhtOperation::GetBasicVhtMcsAndNssSet (void) const
-{
-  return m_basicVhtMcsAndNssSet;
-}
-
-Buffer::Iterator
-VhtOperation::Serialize (Buffer::Iterator i) const
-{
-  if (m_vhtSupported < 1)
-    {
-      return i;
-    }
-  return WifiInformationElement::Serialize (i);
-}
-
-uint16_t
-VhtOperation::GetSerializedSize () const
-{
-  if (m_vhtSupported < 1)
-    {
-      return 0;
-    }
-  return WifiInformationElement::GetSerializedSize ();
-}
-
-void
-VhtOperation::SerializeInformationField (Buffer::Iterator start) const
-{
-  if (m_vhtSupported == 1)
-    {
-      //write the corresponding value for each bit
-      start.WriteU8 (GetChannelWidth ());
-      start.WriteU8 (GetChannelCenterFrequencySegment0 ());
-      start.WriteU8 (GetChannelCenterFrequencySegment1 ());
-      start.WriteU16 (GetBasicVhtMcsAndNssSet ());
-    }
-}
-
-uint8_t
-VhtOperation::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
-{
-  Buffer::Iterator i = start;
-  uint8_t channelWidth = i.ReadU8 ();
-  uint8_t channelCenterFrequencySegment0 = i.ReadU8 ();
-  uint8_t channelCenterFrequencySegment1 = i.ReadU8 ();
-  uint16_t basicVhtMcsAndNssSet = i.ReadU16 ();
-  SetChannelWidth (channelWidth);
-  SetChannelCenterFrequencySegment0 (channelCenterFrequencySegment0);
-  SetChannelCenterFrequencySegment1 (channelCenterFrequencySegment1);
-  SetBasicVhtMcsAndNssSet (basicVhtMcsAndNssSet);
-  return length;
-}
-
-std::ostream &
-operator << (std::ostream &os, const VhtOperation &VhtOperation)
-{
-  os << +VhtOperation.GetChannelWidth () << "|"
-     << +VhtOperation.GetChannelCenterFrequencySegment0 () << "|"
-     << +VhtOperation.GetChannelCenterFrequencySegment1 () << "|"
-     << VhtOperation.GetBasicVhtMcsAndNssSet ();
-  return os;
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/vht-operation.h ns-3.34/src/wifi/model/vht-operation.h
--- ns-3.33/src/wifi/model/vht-operation.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/vht-operation.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,143 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2016 Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef VHT_OPERATION_H
-#define VHT_OPERATION_H
-
-#include "wifi-information-element.h"
-
-namespace ns3 {
-
-/**
- * \brief The VHT Operation Information Element
- * \ingroup wifi
- *
- * This class knows how to serialise and deserialise
- * the VHT Operation Information Element
- */
-class VhtOperation : public WifiInformationElement
-{
-public:
-  VhtOperation ();
-
-  // Implementations of pure virtual methods of WifiInformationElement
-  WifiInformationElementId ElementId () const;
-  uint8_t GetInformationFieldSize () const;
-  void SerializeInformationField (Buffer::Iterator start) const;
-  uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length);
-  /* This information element is a bit special in that it is only
-     included if the STA is a VHT STA. To support this we
-     override the Serialize and GetSerializedSize methods of
-     WifiInformationElement. */
-  Buffer::Iterator Serialize (Buffer::Iterator start) const;
-  uint16_t GetSerializedSize () const;
-
-  /**
-   * Set the VHT supported information element.
-   *
-   * \param vhtSupported the VHT supported information element
-   */
-  void SetVhtSupported (uint8_t vhtSupported);
-
-  /**
-   * Set the Channel Width field in the VHT Operation information element.
-   *
-   * \param channelWidth the Channel Width field in the VHT Operation information element
-   */
-  void SetChannelWidth (uint8_t channelWidth);
-  /**
-   * Set the Channel Center Frequency Segment 0 field in the VHT Operation information element.
-   *
-   * \param channelCenterFrequencySegment0 the Channel Center Frequency Segment 0 field in the VHT Operation information element
-   */
-  void SetChannelCenterFrequencySegment0 (uint8_t channelCenterFrequencySegment0);
-  /**
-   * Set the Channel Center Frequency Segment 1 field in the VHT Operation information element.
-   *
-   * \param channelCenterFrequencySegment1 the Channel Center Frequency Segment 1 field in the VHT Operation information element
-   */
-  void SetChannelCenterFrequencySegment1 (uint8_t channelCenterFrequencySegment1);
-  /**
-   * Set the Basic VHT-MCS and NSS field in the VHT Operation information element.
-   *
-   * \param basicVhtMcsAndNssSet the Basic VHT-MCS and NSS field in the VHT Operation information element
-   */
-  void SetBasicVhtMcsAndNssSet (uint16_t basicVhtMcsAndNssSet);
-  /**
-   * Set the Basic VHT-MCS and NSS field in the VHT Operation information element
-   * by specifying the tuple (nss, maxMcs).
-   *
-   * \param nss the NSS
-   * \param maxVhtMcs the maximum supported VHT-MCS value corresponding to that NSS
-   */
-  void SetMaxVhtMcsPerNss (uint8_t nss, uint8_t maxVhtMcs);
-
-  /**
-   * Return the Channel Width field in the VHT Operation information element.
-   *
-   * \return the Channel Width field in the VHT Operation information element
-   */
-  uint8_t GetChannelWidth (void) const;
-  /**
-   * Return the Channel Center Frequency Segment 0 field in the VHT Operation information element.
-   *
-   * \return the Channel Center Frequency Segment 0 field in the VHT Operation information element
-   */
-  uint8_t GetChannelCenterFrequencySegment0 (void) const;
-  /**
-   * Return the Channel Center Frequency Segment 1 field in the VHT Operation information element.
-   *
-   * \return the Channel Center Frequency Segment 1 field in the VHT Operation information element
-   */
-  uint8_t GetChannelCenterFrequencySegment1 (void) const;
-  /**
-   * Return the Basic VHT-MCS And Nss field in the VHT Operation information element.
-   *
-   * \return the Basic VHT-MCS And Nss field in the VHT Operation information element
-   */
-  uint16_t GetBasicVhtMcsAndNssSet (void) const;
-
-
-private:
-  //VHT Operation Information
-  uint8_t m_channelWidth; ///< channel width
-  uint8_t m_channelCenterFrequencySegment0; ///< channel center frequency segment 0
-  uint8_t m_channelCenterFrequencySegment1; ///< channel center frequency segment 1
-
-  //Basic VHT-MCS and NSS Set
-  uint16_t m_basicVhtMcsAndNssSet; ///< basic VHT MCS NSS set
-
-  /// This is used to decide whether this element should be added to the frame or not
-  uint8_t m_vhtSupported;
-};
-
-/**
- * output stream output operator
- *
- * \param os the output stream
- * \param VhtOperation the VHT operation
- *
- * \returns output stream
- */
-std::ostream &operator << (std::ostream &os, const VhtOperation &VhtOperation);
-
-} //namespace ns3
-
-#endif /* VHT_OPERATION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-ack-manager.cc ns-3.34/src/wifi/model/wifi-ack-manager.cc
--- ns-3.33/src/wifi/model/wifi-ack-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-ack-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,97 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "wifi-ack-manager.h"
+#include "wifi-psdu.h"
+#include "regular-wifi-mac.h"
+
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("WifiAckManager");
+
+NS_OBJECT_ENSURE_REGISTERED (WifiAckManager);
+
+TypeId
+WifiAckManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::WifiAckManager")
+    .SetParent<Object> ()
+    .SetGroupName ("Wifi")
+  ;
+  return tid;
+}
+
+WifiAckManager::~WifiAckManager ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+void
+WifiAckManager::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_mac = 0;
+  Object::DoDispose ();
+}
+
+void
+WifiAckManager::SetWifiMac (Ptr<RegularWifiMac> mac)
+{
+  NS_LOG_FUNCTION (this << mac);
+  m_mac = mac;
+}
+
+void
+WifiAckManager::SetQosAckPolicy (Ptr<WifiMacQueueItem> item, const WifiAcknowledgment* acknowledgment)
+{
+  NS_LOG_FUNCTION (*item << acknowledgment);
+
+  WifiMacHeader& hdr = item->GetHeader ();
+  if (!hdr.IsQosData ())
+    {
+      return;
+    }
+  NS_ASSERT (acknowledgment != nullptr);
+
+  hdr.SetQosAckPolicy (acknowledgment->GetQosAckPolicy (hdr.GetAddr1 (), hdr.GetQosTid ()));
+}
+
+void
+WifiAckManager::SetQosAckPolicy (Ptr<WifiPsdu> psdu, const WifiAcknowledgment* acknowledgment)
+{
+  NS_LOG_FUNCTION (*psdu << acknowledgment);
+
+  if (psdu->GetNMpdus () == 1)
+    {
+      SetQosAckPolicy (*psdu->begin (), acknowledgment);
+      return;
+    }
+
+  NS_ASSERT (acknowledgment != nullptr);
+
+  for (const auto& tid : psdu->GetTids ())
+    {
+      psdu->SetAckPolicyForTid (tid, acknowledgment->GetQosAckPolicy (psdu->GetAddr1 (), tid));
+    }
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-ack-manager.h ns-3.34/src/wifi/model/wifi-ack-manager.h
--- ns-3.33/src/wifi/model/wifi-ack-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-ack-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,111 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef WIFI_ACK_MANAGER_H
+#define WIFI_ACK_MANAGER_H
+
+#include "wifi-acknowledgment.h"
+#include <memory>
+#include "ns3/object.h"
+
+
+namespace ns3 {
+
+class WifiTxParameters;
+class WifiMacQueueItem;
+class WifiPsdu;
+class RegularWifiMac;
+
+/**
+ * \ingroup wifi
+ *
+ * WifiAckManager is an abstract base class. Each subclass defines a logic
+ * to select the acknowledgment method for a given frame.
+ */
+class WifiAckManager : public Object
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  virtual ~WifiAckManager ();
+
+  /**
+   * Set the MAC which is using this Acknowledgment Manager
+   *
+   * \param mac a pointer to the MAC
+   */
+  void SetWifiMac (Ptr<RegularWifiMac> mac);
+
+  /**
+   * Set the QoS Ack policy for the given MPDU, which must be a QoS data frame.
+   *
+   * \param item the MPDU
+   * \param acknowledgment the WifiAcknowledgment object storing the QoS Ack policy to set
+   */
+  static void SetQosAckPolicy (Ptr<WifiMacQueueItem> item, const WifiAcknowledgment* acknowledgment);
+
+  /**
+   * Set the QoS Ack policy for the given PSDU, which must include at least a QoS data frame.
+   *
+   * \param psdu the PSDU
+   * \param acknowledgment the WifiAcknowledgment object storing the QoS Ack policy to set
+   */
+  static void SetQosAckPolicy (Ptr<WifiPsdu> psdu, const WifiAcknowledgment* acknowledgment);
+
+  /**
+   * Determine the acknowledgment method to use if the given MPDU is added to the current
+   * frame. Return a null pointer if the acknowledgment method is unchanged or the new
+   * acknowledgment method otherwise.
+   *
+   * \param mpdu the MPDU to be added to the current frame
+   * \param txParams the current TX parameters for the current frame
+   * \return a null pointer if the acknowledgment method is unchanged or the new
+   *         acknowledgment method otherwise
+   */
+  virtual std::unique_ptr<WifiAcknowledgment> TryAddMpdu (Ptr<const WifiMacQueueItem> mpdu,
+                                                          const WifiTxParameters& txParams) = 0;
+
+  /**
+   * Determine the acknowledgment method to use if the given MSDU is aggregated to the current
+   * frame. Return a null pointer if the acknowledgment method is unchanged or the new
+   * acknowledgment method otherwise.
+   *
+   * \param msdu the MSDU to be aggregated to the current frame
+   * \param txParams the current TX parameters for the current frame
+   * \return a null pointer if the acknowledgment method is unchanged or the new
+   *         acknowledgment method otherwise
+   */
+  virtual std::unique_ptr<WifiAcknowledgment> TryAggregateMsdu (Ptr<const WifiMacQueueItem> msdu,
+                                                                const WifiTxParameters& txParams) = 0;
+
+protected:
+  void DoDispose (void) override;
+
+  Ptr<RegularWifiMac> m_mac;     //!< MAC which is using this Acknowledgment Manager
+};
+
+
+
+} //namespace ns3
+
+#endif /* WIFI_ACK_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-acknowledgment.cc ns-3.34/src/wifi/model/wifi-acknowledgment.cc
--- ns-3.33/src/wifi/model/wifi-acknowledgment.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-acknowledgment.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,407 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "wifi-acknowledgment.h"
+#include "wifi-utils.h"
+#include "ns3/mac48-address.h"
+
+namespace ns3 {
+
+/*
+ * WifiAcknowledgment
+ */
+
+WifiAcknowledgment::WifiAcknowledgment (Method m)
+  : method (m),
+    acknowledgmentTime (Time::Min ())   // uninitialized
+{
+}
+
+WifiAcknowledgment::~WifiAcknowledgment ()
+{
+}
+
+WifiMacHeader::QosAckPolicy
+WifiAcknowledgment::GetQosAckPolicy (Mac48Address receiver, uint8_t tid) const
+{
+  auto it = m_ackPolicy.find ({receiver, tid});
+  NS_ASSERT (it != m_ackPolicy.end ());
+  return it->second;
+}
+
+void
+WifiAcknowledgment::SetQosAckPolicy (Mac48Address receiver, uint8_t tid,
+                                     WifiMacHeader::QosAckPolicy ackPolicy)
+{
+  NS_ABORT_MSG_IF (!CheckQosAckPolicy (receiver, tid, ackPolicy), "QoS Ack policy not admitted");
+  m_ackPolicy[{receiver, tid}] = ackPolicy;
+}
+
+/*
+ * WifiNoAck
+ */
+
+WifiNoAck::WifiNoAck ()
+  : WifiAcknowledgment (NONE)
+{
+  acknowledgmentTime = Seconds (0);
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiNoAck::Copy (void) const
+{
+  return std::unique_ptr<WifiAcknowledgment> (new WifiNoAck (*this));
+}
+
+bool
+WifiNoAck::CheckQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy) const
+{
+  if (ackPolicy == WifiMacHeader::NO_ACK || ackPolicy == WifiMacHeader::BLOCK_ACK)
+    {
+      return true;
+    }
+  return false;
+}
+
+void
+WifiNoAck::Print (std::ostream &os) const
+{
+  os << "NONE";
+}
+
+
+/*
+ * WifiNormalAck
+ */
+
+WifiNormalAck::WifiNormalAck ()
+  : WifiAcknowledgment (NORMAL_ACK)
+{
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiNormalAck::Copy (void) const
+{
+  return std::unique_ptr<WifiAcknowledgment> (new WifiNormalAck (*this));
+}
+
+bool
+WifiNormalAck::CheckQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy) const
+{
+  if (ackPolicy == WifiMacHeader::NORMAL_ACK)
+    {
+      return true;
+    }
+  return false;
+}
+
+void
+WifiNormalAck::Print (std::ostream &os) const
+{
+  os << "NORMAL_ACK";
+}
+
+/*
+ * WifiBlockAck
+ */
+
+WifiBlockAck::WifiBlockAck ()
+  : WifiAcknowledgment (BLOCK_ACK)
+{
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiBlockAck::Copy (void) const
+{
+  return std::unique_ptr<WifiAcknowledgment> (new WifiBlockAck (*this));
+}
+
+bool
+WifiBlockAck::CheckQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy) const
+{
+  if (ackPolicy == WifiMacHeader::NORMAL_ACK)
+    {
+      return true;
+    }
+  return false;
+}
+
+void
+WifiBlockAck::Print (std::ostream &os) const
+{
+  os << "BLOCK_ACK";
+}
+
+
+/*
+ * WifiBarBlockAck
+ */
+
+WifiBarBlockAck::WifiBarBlockAck ()
+  : WifiAcknowledgment (BAR_BLOCK_ACK)
+{
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiBarBlockAck::Copy (void) const
+{
+  return std::unique_ptr<WifiAcknowledgment> (new WifiBarBlockAck (*this));
+}
+
+bool
+WifiBarBlockAck::CheckQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy) const
+{
+  if (ackPolicy == WifiMacHeader::BLOCK_ACK)
+    {
+      return true;
+    }
+  return false;
+}
+
+void
+WifiBarBlockAck::Print (std::ostream &os) const
+{
+  os << "BAR_BLOCK_ACK";
+}
+
+
+/*
+ * WifiDlMuBarBaSequence
+ */
+
+WifiDlMuBarBaSequence::WifiDlMuBarBaSequence ()
+  : WifiAcknowledgment (DL_MU_BAR_BA_SEQUENCE)
+{
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiDlMuBarBaSequence::Copy (void) const
+{
+  return std::unique_ptr<WifiAcknowledgment> (new WifiDlMuBarBaSequence (*this));
+}
+
+bool
+WifiDlMuBarBaSequence::CheckQosAckPolicy (Mac48Address receiver, uint8_t tid,
+                                          WifiMacHeader::QosAckPolicy ackPolicy) const
+{
+  if (ackPolicy == WifiMacHeader::NORMAL_ACK)
+    {
+      // The given receiver must be the only one to send an immediate reply
+      if (stationsReplyingWithNormalAck.size () == 1
+          && stationsReplyingWithNormalAck.begin ()->first == receiver)
+        {
+          return true;
+        }
+
+      if (stationsReplyingWithBlockAck.size () == 1
+          && stationsReplyingWithBlockAck.begin ()->first == receiver)
+        {
+          return true;
+        }
+
+      return false;
+    }
+
+  if (ackPolicy == WifiMacHeader::BLOCK_ACK)
+    {
+      return true;
+    }
+
+  return false;
+}
+
+void
+WifiDlMuBarBaSequence::Print (std::ostream &os) const
+{
+  os << "DL_MU_BAR_BA_SEQUENCE [";
+  for (const auto& sta : stationsReplyingWithNormalAck)
+    {
+      os << " (ACK) " << sta.first;
+    }
+  for (const auto& sta : stationsReplyingWithBlockAck)
+    {
+      os << " (BA) " << sta.first;
+    }
+  for (const auto& sta : stationsSendBlockAckReqTo)
+    {
+      os << " (BAR+BA) " << sta.first;
+    }
+  os << "]";
+}
+
+
+/*
+ * WifiDlMuTfMuBar
+ */
+
+WifiDlMuTfMuBar::WifiDlMuTfMuBar ()
+  : WifiAcknowledgment (DL_MU_TF_MU_BAR),
+    ulLength (0)
+{
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiDlMuTfMuBar::Copy (void) const
+{
+  return std::unique_ptr<WifiAcknowledgment> (new WifiDlMuTfMuBar (*this));
+}
+
+bool
+WifiDlMuTfMuBar::CheckQosAckPolicy (Mac48Address receiver, uint8_t tid,
+                                    WifiMacHeader::QosAckPolicy ackPolicy) const
+{
+  // the only admitted ack policy is Block Ack because stations need to wait for a MU-BAR
+  if (ackPolicy == WifiMacHeader::BLOCK_ACK)
+    {
+      return true;
+    }
+
+  return false;
+}
+
+void
+WifiDlMuTfMuBar::Print (std::ostream &os) const
+{
+  os << "DL_MU_TF_MU_BAR [";
+  for (const auto& sta : stationsReplyingWithBlockAck)
+    {
+      os << " (BA) " << sta.first;
+    }
+  os << "]";
+}
+
+
+/*
+ * WifiDlMuAggregateTf
+ */
+
+WifiDlMuAggregateTf::WifiDlMuAggregateTf ()
+  : WifiAcknowledgment (DL_MU_AGGREGATE_TF),
+    ulLength (0)
+{
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiDlMuAggregateTf::Copy (void) const
+{
+  return std::unique_ptr<WifiAcknowledgment> (new WifiDlMuAggregateTf (*this));
+}
+
+bool
+WifiDlMuAggregateTf::CheckQosAckPolicy (Mac48Address receiver, uint8_t tid,
+                                        WifiMacHeader::QosAckPolicy ackPolicy) const
+{
+  // the only admitted ack policy is No explicit acknowledgment or TB PPDU Ack policy
+  if (ackPolicy == WifiMacHeader::NO_EXPLICIT_ACK)
+    {
+      return true;
+    }
+
+  return false;
+}
+
+void
+WifiDlMuAggregateTf::Print (std::ostream &os) const
+{
+  os << "DL_MU_AGGREGATE_TF [";
+  for (const auto& sta : stationsReplyingWithBlockAck)
+    {
+      os << " (BA) " << sta.first;
+    }
+  os << "]";
+}
+
+
+/*
+ * WifiUlMuMultiStaBa
+ */
+
+WifiUlMuMultiStaBa::WifiUlMuMultiStaBa ()
+  : WifiAcknowledgment (UL_MU_MULTI_STA_BA)
+{
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiUlMuMultiStaBa::Copy (void) const
+{
+  return std::unique_ptr<WifiAcknowledgment> (new WifiUlMuMultiStaBa (*this));
+}
+
+bool
+WifiUlMuMultiStaBa::CheckQosAckPolicy (Mac48Address receiver, uint8_t tid,
+                                       WifiMacHeader::QosAckPolicy ackPolicy) const
+{
+  // a Basic Trigger Frame has no QoS ack policy
+  return true;
+}
+
+void
+WifiUlMuMultiStaBa::Print (std::ostream &os) const
+{
+  os << "UL_MU_MULTI_STA_BA [";
+  for (const auto& sta : stationsReceivingMultiStaBa)
+    {
+      os << "(" << sta.first.first << "," << +sta.first.second << ") ";
+    }
+  os << "]";
+}
+
+
+/*
+ * WifiAckAfterTbPpdu
+ */
+
+WifiAckAfterTbPpdu::WifiAckAfterTbPpdu ()
+  : WifiAcknowledgment (ACK_AFTER_TB_PPDU)
+{
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiAckAfterTbPpdu::Copy (void) const
+{
+  return std::unique_ptr<WifiAcknowledgment> (new WifiAckAfterTbPpdu (*this));
+}
+
+bool
+WifiAckAfterTbPpdu::CheckQosAckPolicy (Mac48Address receiver, uint8_t tid,
+                                        WifiMacHeader::QosAckPolicy ackPolicy) const
+{
+  if (ackPolicy == WifiMacHeader::NORMAL_ACK)
+    {
+      return true;
+    }
+
+  return false;
+}
+
+void
+WifiAckAfterTbPpdu::Print (std::ostream &os) const
+{
+  os << "ACK_AFTER_TB_PPDU";
+}
+
+
+std::ostream & operator << (std::ostream &os, const WifiAcknowledgment* acknowledgment)
+{
+  acknowledgment->Print (os);
+  return os;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-acknowledgment.h ns-3.34/src/wifi/model/wifi-acknowledgment.h
--- ns-3.33/src/wifi/model/wifi-acknowledgment.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-acknowledgment.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,351 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef WIFI_ACKNOWLEDGMENT_H
+#define WIFI_ACKNOWLEDGMENT_H
+
+#include "ns3/nstime.h"
+#include "wifi-tx-vector.h"
+#include "block-ack-type.h"
+#include "wifi-mac-header.h"
+#include "ctrl-headers.h"
+#include <map>
+#include <memory>
+
+
+namespace ns3 {
+
+class Mac48Address;
+
+/**
+ * \ingroup wifi
+ *
+ * WifiAcknowledgment is an abstract base struct. Each derived struct defines an acknowledgment
+ * method and stores the information needed to perform acknowledgment according to
+ * that method.
+ */
+struct WifiAcknowledgment
+{
+  /**
+   * \enum Method
+   * \brief Available acknowledgment methods
+   */
+  enum Method
+    {
+      NONE = 0,
+      NORMAL_ACK,
+      BLOCK_ACK,
+      BAR_BLOCK_ACK,
+      DL_MU_BAR_BA_SEQUENCE,
+      DL_MU_TF_MU_BAR,
+      DL_MU_AGGREGATE_TF,
+      UL_MU_MULTI_STA_BA,
+      ACK_AFTER_TB_PPDU
+    };
+
+  /**
+   * Constructor.
+   * \param m the acknowledgment method for this object
+   */
+  WifiAcknowledgment (Method m);
+  virtual ~WifiAcknowledgment ();
+
+  /**
+   * Clone this object.
+   * \return a pointer to the cloned object
+   */
+  virtual std::unique_ptr<WifiAcknowledgment> Copy (void) const = 0;
+
+  /**
+   * Get the QoS Ack policy to use for the MPDUs addressed to the given receiver
+   * and belonging to the given TID.
+   *
+   * \param receiver the MAC address of the receiver
+   * \param tid the TID
+   * \return the QoS Ack policy to use
+   */
+  WifiMacHeader::QosAckPolicy GetQosAckPolicy (Mac48Address receiver, uint8_t tid) const;
+
+  /**
+   * Set the QoS Ack policy to use for the MPDUs addressed to the given receiver
+   * and belonging to the given TID. If the pair (receiver, TID) already exists,
+   * it is overwritten with the given QoS Ack policy.
+   *
+   * \param receiver the MAC address of the receiver
+   * \param tid the TID
+   * \param ackPolicy the QoS Ack policy to use
+   */
+  void SetQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy);
+
+  /**
+   * \brief Print the object contents.
+   * \param os output stream in which the data should be printed.
+   */
+  virtual void Print (std::ostream &os) const = 0;
+
+  const Method method;       //!< acknowledgment method
+  Time acknowledgmentTime;   //!< time required by the acknowledgment method
+
+private:
+  /**
+   * Check whether the given QoS Ack policy can be used for the MPDUs addressed
+   * to the given receiver and belonging to the given TID.
+   *
+   * \param receiver the MAC address of the receiver
+   * \param tid the TID
+   * \param ackPolicy the QoS Ack policy to use
+   * \return true if the given QoS Ack policy can be used, false otherwise
+   */
+  virtual bool CheckQosAckPolicy (Mac48Address receiver, uint8_t tid,
+                                  WifiMacHeader::QosAckPolicy ackPolicy) const = 0;
+
+  /// Qos Ack Policy to set for MPDUs addressed to a given receiver and having a given TID
+  std::map<std::pair<Mac48Address, uint8_t>, WifiMacHeader::QosAckPolicy> m_ackPolicy;
+};
+
+
+/**
+ * \ingroup wifi
+ *
+ * WifiNoAck specifies that no acknowledgment is required.
+ */
+struct WifiNoAck : public WifiAcknowledgment
+{
+  WifiNoAck ();
+
+  std::unique_ptr<WifiAcknowledgment> Copy (void) const override;
+  bool CheckQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy) const override;
+  void Print (std::ostream &os) const override;
+};
+
+
+/**
+ * \ingroup wifi
+ *
+ * WifiNormalAck specifies that acknowledgment via Normal Ack is required.
+ */
+struct WifiNormalAck : public WifiAcknowledgment
+{
+  WifiNormalAck ();
+
+  std::unique_ptr<WifiAcknowledgment> Copy (void) const override;
+  bool CheckQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy) const override;
+  void Print (std::ostream &os) const override;
+
+  WifiTxVector ackTxVector;       //!< Ack TXVECTOR
+};
+
+
+/**
+ * \ingroup wifi
+ *
+ * WifiBlockAck specifies that acknowledgment via Block Ack is required.
+ */
+struct WifiBlockAck : public WifiAcknowledgment
+{
+  WifiBlockAck ();
+
+  std::unique_ptr<WifiAcknowledgment> Copy (void) const override;
+  bool CheckQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy) const override;
+  void Print (std::ostream &os) const override;
+
+  WifiTxVector blockAckTxVector;       //!< BlockAck TXVECTOR
+  BlockAckType baType;                 //!< BlockAck type
+};
+
+
+/**
+ * \ingroup wifi
+ *
+ * WifiBarBlockAck specifies that a BlockAckReq is sent to solicit a Block Ack response.
+ */
+struct WifiBarBlockAck : public WifiAcknowledgment
+{
+  WifiBarBlockAck ();
+
+  std::unique_ptr<WifiAcknowledgment> Copy (void) const override;
+  bool CheckQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy) const override;
+  void Print (std::ostream &os) const override;
+
+  WifiTxVector blockAckReqTxVector;    //!< BlockAckReq TXVECTOR
+  WifiTxVector blockAckTxVector;       //!< BlockAck TXVECTOR
+  BlockAckReqType barType;             //!< BlockAckReq type
+  BlockAckType baType;                 //!< BlockAck type
+};
+
+
+/**
+ * \ingroup wifi
+ *
+ * WifiDlMuBarBaSequence specifies that a DL MU PPDU is acknowledged through a
+ * sequence of BlockAckReq and BlockAck frames. Only one station may be allowed
+ * to reply a SIFS after the DL MU PPDU by sending either a Normal Ack or a BlockAck.
+ */
+struct WifiDlMuBarBaSequence : public WifiAcknowledgment
+{
+  WifiDlMuBarBaSequence ();
+
+  std::unique_ptr<WifiAcknowledgment> Copy (void) const override;
+  bool CheckQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy) const override;
+  void Print (std::ostream &os) const override;
+
+  /// information related to an Ack frame sent by a station
+  struct AckInfo
+  {
+    WifiTxVector ackTxVector;          //!< TXVECTOR for the Ack frame
+  };
+  /// information related to a BlockAck frame sent by a station
+  struct BlockAckInfo
+  {
+    WifiTxVector blockAckTxVector;     //!< TXVECTOR for the BlockAck frame
+    BlockAckType baType;               //!< BlockAck type
+  };
+  /// information related to a BlockAckReq frame sent to a station
+  struct BlockAckReqInfo
+  {
+    WifiTxVector blockAckReqTxVector;  //!< TXVECTOR for the BlockAckReq frame
+    BlockAckReqType barType;           //!< BlockAckReq type
+    WifiTxVector blockAckTxVector;     //!< TXVECTOR for the BlockAck frame
+    BlockAckType baType;               //!< BlockAck type
+  };
+
+  /// Set of stations replying with an Ack frame (no more than one)
+  std::map<Mac48Address, AckInfo> stationsReplyingWithNormalAck;
+  /// Set of stations replying with a BlockAck frame (no more than one)
+  std::map<Mac48Address, BlockAckInfo> stationsReplyingWithBlockAck;
+  /// Set of stations receiving a BlockAckReq frame and replying with a BlockAck frame
+  std::map<Mac48Address, BlockAckReqInfo> stationsSendBlockAckReqTo;
+};
+
+
+/**
+ * \ingroup wifi
+ *
+ * WifiDlMuTfMuBar specifies that a DL MU PPDU is followed after a SIFS duration
+ * by a MU-BAR Trigger Frame (sent as single user frame) soliciting BlockAck
+ * frames sent as HE TB PPDUs.
+ */
+struct WifiDlMuTfMuBar : public WifiAcknowledgment
+{
+  WifiDlMuTfMuBar ();
+
+  std::unique_ptr<WifiAcknowledgment> Copy (void) const override;
+  bool CheckQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy) const override;
+  void Print (std::ostream &os) const override;
+
+  /// information related to a BlockAck frame sent by a station
+  struct BlockAckInfo
+  {
+    CtrlBAckRequestHeader barHeader;   //!< BlockAckReq header
+    WifiTxVector blockAckTxVector;     //!< TXVECTOR for the BlockAck frame
+    BlockAckType baType;               //!< BlockAck type
+  };
+
+  /// Set of stations replying with a BlockAck frame
+  std::map<Mac48Address, BlockAckInfo> stationsReplyingWithBlockAck;
+  std::list<BlockAckReqType> barTypes; //!< BAR types
+  uint16_t ulLength;                   //!< the UL Length field of the MU-BAR Trigger Frame
+  WifiTxVector muBarTxVector;          //!< TXVECTOR used to transmit the MU-BAR Trigger Frame
+};
+
+
+/**
+ * \ingroup wifi
+ *
+ * WifiDlMuAggregateTf specifies that a DL MU PPDU made of PSDUs including each
+ * a MU-BAR Trigger Frame is acknowledged through BlockAck frames sent as
+ * HE TB PPDUs.
+ */
+struct WifiDlMuAggregateTf : public WifiAcknowledgment
+{
+  WifiDlMuAggregateTf ();
+
+  std::unique_ptr<WifiAcknowledgment> Copy (void) const override;
+  bool CheckQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy) const override;
+  void Print (std::ostream &os) const override;
+
+  /// information related to a BlockAck frame sent by a station
+  struct BlockAckInfo
+  {
+    uint32_t muBarSize;                //!< size in bytes of a MU-BAR Trigger Frame
+    CtrlBAckRequestHeader barHeader;   //!< BlockAckReq header
+    WifiTxVector blockAckTxVector;     //!< TXVECTOR for the BlockAck frame
+    BlockAckType baType;               //!< BlockAck type
+  };
+
+  /// Set of stations replying with a BlockAck frame
+  std::map<Mac48Address, BlockAckInfo> stationsReplyingWithBlockAck;
+  uint16_t ulLength;                   //!< the UL Length field of the MU-BAR Trigger Frames
+};
+
+
+/**
+ * \ingroup wifi
+ *
+ * WifiUlMuMultiStaBa specifies that a Basic Trigger Frame is being sent to
+ * solicit TB PPDUs that will be acknowledged through a multi-STA BlockAck frame.
+ */
+struct WifiUlMuMultiStaBa : public WifiAcknowledgment
+{
+  WifiUlMuMultiStaBa ();
+
+  std::unique_ptr<WifiAcknowledgment> Copy (void) const override;
+  bool CheckQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy) const override;
+  void Print (std::ostream &os) const override;
+
+  /// Map (originator, tid) pairs to the their index in baType
+  std::map<std::pair<Mac48Address, uint8_t>, std::size_t> stationsReceivingMultiStaBa;
+  BlockAckType baType;                 //!< BlockAck type
+  WifiTxVector tbPpduTxVector;         //!< TXVECTOR for a TB PPDU
+  WifiTxVector multiStaBaTxVector;     //!< TXVECTOR for the Multi-STA BlockAck
+};
+
+
+/**
+ * \ingroup wifi
+ *
+ * WifiAckAfterTbPpdu is used when a station prepares a TB PPDU to send in
+ * response to a Basic Trigger Frame. The acknowledgment time must be
+ * zero because the time taken by the actual acknowledgment is not included
+ * in the duration indicated by the Trigger Frame. The QoS ack policy instead
+ * must be Normal Ack/Implicit Block Ack Request.
+ */
+struct WifiAckAfterTbPpdu : public WifiAcknowledgment
+{
+  WifiAckAfterTbPpdu ();
+
+  std::unique_ptr<WifiAcknowledgment> Copy (void) const override;
+  bool CheckQosAckPolicy (Mac48Address receiver, uint8_t tid, WifiMacHeader::QosAckPolicy ackPolicy) const override;
+  void Print (std::ostream &os) const override;
+};
+
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the output stream
+ * \param acknowledgment the acknowledgment method
+ * \returns a reference to the stream
+ */
+std::ostream& operator<< (std::ostream& os, const WifiAcknowledgment* acknowledgment);
+
+} //namespace ns3
+
+#endif /* WIFI_ACKNOWLEDGMENT_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-ack-policy-selector.cc ns-3.34/src/wifi/model/wifi-ack-policy-selector.cc
--- ns-3.33/src/wifi/model/wifi-ack-policy-selector.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-ack-policy-selector.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,87 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2019 Universita' degli Studi di Napoli Federico II
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Stefano Avallone <stavallo@unina.it>
- */
-
-#include "ns3/log.h"
-#include "wifi-ack-policy-selector.h"
-#include <set>
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("WifiAckPolicySelector");
-
-NS_OBJECT_ENSURE_REGISTERED (WifiAckPolicySelector);
-
-TypeId
-WifiAckPolicySelector::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::WifiAckPolicySelector")
-    .SetParent<Object> ()
-    .SetGroupName("Wifi")
-  ;
-  return tid;
-}
-
-WifiAckPolicySelector::~WifiAckPolicySelector ()
-{
-  NS_LOG_FUNCTION (this);
-}
-
-void
-WifiAckPolicySelector::DoDispose ()
-{
-  NS_LOG_FUNCTION (this);
-  m_qosTxop = 0;
-}
-
-void
-WifiAckPolicySelector::SetQosTxop (Ptr<QosTxop> qosTxop)
-{
-  NS_LOG_FUNCTION (this << qosTxop);
-  m_qosTxop = qosTxop;
-}
-
-Ptr<QosTxop>
-WifiAckPolicySelector::GetQosTxop (void) const
-{
-  return m_qosTxop;
-}
-
-void
-WifiAckPolicySelector::SetAckPolicy (Ptr<WifiPsdu> psdu, const MacLowTransmissionParameters & params)
-{
-  NS_LOG_FUNCTION (psdu << params);
-
-  std::set<uint8_t> tids = psdu->GetTids ();
-  NS_ASSERT (tids.size () == 1);
-  uint8_t tid = *tids.begin ();
-
-  if (params.MustWaitNormalAck () || params.MustWaitBlockAck ())
-    {
-      // Normal Ack or Implicit Block Ack Request policy
-      psdu->SetAckPolicyForTid (tid, WifiMacHeader::NORMAL_ACK);
-    }
-  else
-    {
-      // Block Ack policy
-      psdu->SetAckPolicyForTid (tid, WifiMacHeader::BLOCK_ACK);
-    }
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-ack-policy-selector.h ns-3.34/src/wifi/model/wifi-ack-policy-selector.h
--- ns-3.33/src/wifi/model/wifi-ack-policy-selector.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-ack-policy-selector.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,93 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2019 Universita' degli Studi di Napoli Federico II
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Stefano Avallone <stavallo@unina.it>
- */
-
-#ifndef WIFI_ACK_POLICY_SELECTOR_H
-#define WIFI_ACK_POLICY_SELECTOR_H
-
-#include "ns3/object.h"
-#include "mac-low-transmission-parameters.h"
-#include "qos-txop.h"
-#include "wifi-psdu.h"
-
-namespace ns3 {
-
-/**
- * \ingroup wifi
- *
- * WifiAckPolicySelector is in charge of selecting the acknowledgment policy
- * for PSDUs containing QoS Data frames.
- */
-class WifiAckPolicySelector : public Object
-{
-public:
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  virtual ~WifiAckPolicySelector();
-
-  virtual void DoDispose (void);
-
-  /**
-   * Set the QoS Txop associated with this ack policy selector.
-   *
-   * \param qosTxop the QoS Txop.
-   */
-  void SetQosTxop (Ptr<QosTxop> qosTxop);
-
-  /**
-   * Get the QoS Txop associated with this ack policy selector.
-   *
-   * \return the QoS Txop.
-   */
-  Ptr<QosTxop> GetQosTxop (void) const;
-
-  /**
-   * Set the QoS Ack Policy for the QoS Data frames contained in the given PSDU
-   * according to the given MacLow transmission parameters. Only single-TID A-MPDUs
-   * are supported at the moment, hence it is expected that all the QoS Data frames
-   * contained in the given PSDU have the same TID. This function is typically
-   * called by MacLow before forwarding the PSDU down to the PHY layer.
-   *
-   * \param psdu the given PSDU.
-   * \param params the given MacLow transmission parameters.
-   */
-  static void SetAckPolicy (Ptr<WifiPsdu> psdu, const MacLowTransmissionParameters & params);
-
-  /**
-   * Update the transmission parameters related to the acknowledgment policy for
-   * the given PSDU. This method is typically called by the MPDU aggregator when
-   * trying to aggregate another MPDU to the current A-MPDU. In fact, the
-   * AckPolicySelector may switch to a different acknowledgment policy when a
-   * new MPDU is aggregated to an A-MPDU.
-   *
-   * \param psdu the given PSDU.
-   * \param params the MacLow parameters to update.
-   */
-  virtual void UpdateTxParams (Ptr<WifiPsdu> psdu, MacLowTransmissionParameters & params) = 0;
-
-protected:
-  Ptr<QosTxop> m_qosTxop;      //!< the QoS Txop this selector is associated with
-};
-
-} //namespace ns3
-
-#endif /* WIFI_ACK_POLICY_SELECTOR_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-default-ack-manager.cc ns-3.34/src/wifi/model/wifi-default-ack-manager.cc
--- ns-3.33/src/wifi/model/wifi-default-ack-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-default-ack-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,703 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "wifi-default-ack-manager.h"
+#include "wifi-tx-parameters.h"
+#include "wifi-mac-queue-item.h"
+#include "qos-utils.h"
+#include "wifi-mac-queue.h"
+#include "wifi-protection.h"
+#include "ap-wifi-mac.h"
+#include "ctrl-headers.h"
+#include "ns3/he-phy.h"
+#include "ns3/he-frame-exchange-manager.h"
+
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("WifiDefaultAckManager");
+
+NS_OBJECT_ENSURE_REGISTERED (WifiDefaultAckManager);
+
+TypeId
+WifiDefaultAckManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::WifiDefaultAckManager")
+    .SetParent<WifiAckManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<WifiDefaultAckManager> ()
+    .AddAttribute ("UseExplicitBar",
+                   "Specify whether to send Block Ack Requests (if true) or use"
+                   " Implicit Block Ack Request ack policy (if false).",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&WifiDefaultAckManager::m_useExplicitBar),
+                   MakeBooleanChecker ())
+    .AddAttribute ("BaThreshold",
+                   "Immediate acknowledgment is requested upon transmission of a frame "
+                   "whose sequence number is distant at least BaThreshold multiplied "
+                   "by the transmit window size from the starting sequence number of "
+                   "the transmit window. Set to zero to request a response for every "
+                   "transmitted frame.",
+                   DoubleValue (0.0),
+                   MakeDoubleAccessor (&WifiDefaultAckManager::m_baThreshold),
+                   MakeDoubleChecker<double> (0.0, 1.0))
+    .AddAttribute ("DlMuAckSequenceType",
+                   "Type of the acknowledgment sequence for DL MU PPDUs.",
+                   EnumValue (WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE),
+                   MakeEnumAccessor (&WifiDefaultAckManager::m_dlMuAckType),
+                   MakeEnumChecker (WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE, "DL_MU_BAR_BA_SEQUENCE",
+                                    WifiAcknowledgment::DL_MU_TF_MU_BAR, "DL_MU_TF_MU_BAR",
+                                    WifiAcknowledgment::DL_MU_AGGREGATE_TF, "DL_MU_AGGREGATE_TF"))
+    .AddAttribute ("MaxBlockAckMcs",
+                   "The MCS used to send a BlockAck in a TB PPDU is the minimum between "
+                   "the MCS used for the PSDU sent in the preceding DL MU PPDU and the "
+                   "value of this attribute.",
+                   UintegerValue (5),
+                   MakeUintegerAccessor (&WifiDefaultAckManager::m_maxMcsForBlockAckInTbPpdu),
+                   MakeUintegerChecker<uint8_t> (0, 11))
+  ;
+  return tid;
+}
+
+WifiDefaultAckManager::WifiDefaultAckManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+WifiDefaultAckManager::~WifiDefaultAckManager ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+uint16_t
+WifiDefaultAckManager::GetMaxDistFromStartingSeq (Ptr<const WifiMacQueueItem> mpdu,
+                                                  const WifiTxParameters& txParams) const
+{
+  NS_LOG_FUNCTION (this << *mpdu << &txParams);
+
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
+  Mac48Address receiver = hdr.GetAddr1 ();
+
+  uint8_t tid = hdr.GetQosTid ();
+  Ptr<QosTxop> edca = m_mac->GetQosTxop (tid);
+  NS_ABORT_MSG_IF (!edca->GetBaAgreementEstablished (receiver, tid),
+                   "An established Block Ack agreement is required");
+
+  uint16_t startingSeq = edca->GetBaStartingSequence (receiver, tid);
+  uint16_t maxDistFromStartingSeq = (mpdu->GetHeader ().GetSequenceNumber () - startingSeq + SEQNO_SPACE_SIZE) % SEQNO_SPACE_SIZE;
+  NS_ABORT_MSG_IF (maxDistFromStartingSeq >= SEQNO_SPACE_HALF_SIZE,
+                   "The given QoS data frame is too old");
+
+  const WifiTxParameters::PsduInfo* psduInfo = txParams.GetPsduInfo (receiver);
+
+  if (psduInfo == nullptr || psduInfo->seqNumbers.find (tid) == psduInfo->seqNumbers.end ())
+    {
+      // there are no aggregated MPDUs (so far)
+      return maxDistFromStartingSeq;
+    }
+
+  for (const auto& seqNumber : psduInfo->seqNumbers.at (tid))
+    {
+      if (!QosUtilsIsOldPacket (startingSeq, seqNumber))
+        {
+          uint16_t currDistToStartingSeq = (seqNumber - startingSeq + SEQNO_SPACE_SIZE) % SEQNO_SPACE_SIZE;
+
+          if (currDistToStartingSeq > maxDistFromStartingSeq)
+            {
+              maxDistFromStartingSeq = currDistToStartingSeq;
+            }
+        }
+    }
+
+  NS_LOG_DEBUG ("Returning " << maxDistFromStartingSeq);
+  return maxDistFromStartingSeq;
+}
+
+bool
+WifiDefaultAckManager::IsResponseNeeded (Ptr<const WifiMacQueueItem> mpdu,
+                                         const WifiTxParameters& txParams) const
+{
+  NS_LOG_FUNCTION (this << *mpdu << &txParams);
+
+  uint8_t tid = mpdu->GetHeader ().GetQosTid ();
+  Mac48Address receiver = mpdu->GetHeader ().GetAddr1 ();
+  Ptr<QosTxop> edca = m_mac->GetQosTxop (tid);
+
+  // An immediate response (Ack or Block Ack) is needed if any of the following holds:
+  // * the maximum distance between the sequence number of an MPDU to transmit
+  //   and the starting sequence number of the transmit window is greater than
+  //   or equal to the window size multiplied by the BaThreshold
+  // * no other frame belonging to this BA agreement is queued (because, in such
+  //   a case, a Block Ack is not going to be requested anytime soon)
+  // * this is the initial frame of a transmission opportunity and it is not
+  //   protected by RTS/CTS (see Annex G.3 of IEEE 802.11-2016)
+  if (m_baThreshold > 0
+      && GetMaxDistFromStartingSeq (mpdu, txParams) < m_baThreshold * edca->GetBaBufferSize (receiver, tid)
+      && (edca->GetWifiMacQueue ()->GetNPackets (tid, receiver)
+         + edca->GetBaManager ()->GetRetransmitQueue ()->GetNPackets (tid, receiver) > 1)
+      && !(edca->GetTxopLimit ().IsStrictlyPositive ()
+           && edca->GetRemainingTxop () == edca->GetTxopLimit ()
+           && !(txParams.m_protection && txParams.m_protection->method == WifiProtection::RTS_CTS)))
+    {
+      return false;
+    }
+
+  return true;
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiDefaultAckManager::TryAddMpdu (Ptr<const WifiMacQueueItem> mpdu,
+                                   const WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << *mpdu << &txParams);
+
+  // If the TXVECTOR indicates a DL MU PPDU, call a separate method
+  if (txParams.m_txVector.IsDlMu ())
+    {
+      switch (m_dlMuAckType)
+        {
+          case WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE:
+            return GetAckInfoIfBarBaSequence (mpdu, txParams);
+          case WifiAcknowledgment::DL_MU_TF_MU_BAR:
+            return GetAckInfoIfTfMuBar (mpdu, txParams);
+          case WifiAcknowledgment::DL_MU_AGGREGATE_TF:
+            return GetAckInfoIfAggregatedMuBar (mpdu, txParams);
+          default:
+            NS_ABORT_MSG ("Unknown DL acknowledgment method");
+            return nullptr;
+        }
+    }
+
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
+  Mac48Address receiver = hdr.GetAddr1 ();
+
+  // Acknowledgment for TB PPDUs
+  if (txParams.m_txVector.IsUlMu ())
+    {
+      if (hdr.IsQosData () && !hdr.HasData ())
+        {
+          // QoS Null frame
+          WifiNoAck* acknowledgment = nullptr;
+
+          if (txParams.m_acknowledgment)
+            {
+              NS_ASSERT (txParams.m_acknowledgment->method == WifiAcknowledgment::NONE);
+              acknowledgment = static_cast<WifiNoAck*> (txParams.m_acknowledgment.get ());
+              acknowledgment = new WifiNoAck (*acknowledgment);
+            }
+          else
+            {
+              acknowledgment = new WifiNoAck;
+            }
+          acknowledgment->SetQosAckPolicy (receiver, hdr.GetQosTid (), WifiMacHeader::NO_ACK);
+          return std::unique_ptr<WifiAcknowledgment> (acknowledgment);
+        }
+
+      if (txParams.m_acknowledgment)
+        {
+          NS_ASSERT (txParams.m_acknowledgment->method == WifiAcknowledgment::ACK_AFTER_TB_PPDU);
+          return nullptr;
+        }
+
+      WifiAckAfterTbPpdu* acknowledgment = new WifiAckAfterTbPpdu;
+      if (hdr.IsQosData ())
+        {
+          acknowledgment->SetQosAckPolicy (receiver, hdr.GetQosTid (), WifiMacHeader::NORMAL_ACK);
+        }
+      return std::unique_ptr<WifiAcknowledgment> (acknowledgment);
+    }
+
+  // if this is a Trigger Frame, call a separate method
+  if (hdr.IsTrigger ())
+    {
+      return TryUlMuTransmission (mpdu, txParams);
+    }
+
+  // if the current protection method (if any) is already BLOCK_ACK or BAR_BLOCK_ACK,
+  // it will not change by adding an MPDU
+  if (txParams.m_acknowledgment
+      && (txParams.m_acknowledgment->method == WifiAcknowledgment::BLOCK_ACK
+          || txParams.m_acknowledgment->method == WifiAcknowledgment::BAR_BLOCK_ACK))
+    {
+      return nullptr;
+    }
+
+  if (receiver.IsGroup ())
+    {
+      NS_ABORT_MSG_IF (txParams.GetSize (receiver) > 0,
+                       "Unicast frames only can be aggregated");
+      WifiNoAck* acknowledgment = new WifiNoAck;
+      if (hdr.IsQosData ())
+        {
+          acknowledgment->SetQosAckPolicy (receiver, hdr.GetQosTid (),
+                                           WifiMacHeader::NO_ACK);
+        }
+      return std::unique_ptr<WifiAcknowledgment> (acknowledgment);
+    }
+
+  if ((!hdr.IsQosData ()
+       || !m_mac->GetQosTxop (hdr.GetQosTid ())->GetBaAgreementEstablished (receiver, hdr.GetQosTid ()))
+      && !hdr.IsBlockAckReq ())
+    {
+      NS_LOG_DEBUG ("Non-QoS data frame or Block Ack agreement not established, request Normal Ack");
+      WifiNormalAck* acknowledgment = new WifiNormalAck;
+      acknowledgment->ackTxVector = m_mac->GetWifiRemoteStationManager ()->GetAckTxVector (receiver, txParams.m_txVector);
+      if (hdr.IsQosData ())
+        {
+          acknowledgment->SetQosAckPolicy (receiver, hdr.GetQosTid (), WifiMacHeader::NORMAL_ACK);
+        }
+      return std::unique_ptr<WifiAcknowledgment> (acknowledgment);
+    }
+
+  // we get here if mpdu is a QoS data frame related to an established Block Ack agreement
+  // or mpdu is a BlockAckReq frame
+  if (!hdr.IsBlockAckReq () && !IsResponseNeeded (mpdu, txParams))
+    {
+      NS_LOG_DEBUG ("A response is not needed: no ack for now, use Block Ack policy");
+      if (txParams.m_acknowledgment
+          && txParams.m_acknowledgment->method == WifiAcknowledgment::NONE)
+        {
+          // no change if the ack method is already NONE
+          return nullptr;
+        }
+
+      WifiNoAck* acknowledgment = new WifiNoAck;
+      if (hdr.IsQosData ())
+        {
+          acknowledgment->SetQosAckPolicy (receiver, hdr.GetQosTid (),
+                                           WifiMacHeader::BLOCK_ACK);
+        }
+      return std::unique_ptr<WifiAcknowledgment> (acknowledgment);
+    }
+
+  // we get here if a response is needed
+  uint8_t tid = GetTid (mpdu->GetPacket (), hdr);
+  if (!hdr.IsBlockAckReq ()
+      && txParams.GetSize (receiver) == 0
+      && hdr.GetSequenceNumber ()
+         == m_mac->GetQosTxop (tid)->GetBaStartingSequence (receiver, tid))
+    {
+      NS_LOG_DEBUG ("Sending a single MPDU, no previous frame to ack: request Normal Ack");
+      WifiNormalAck* acknowledgment = new WifiNormalAck;
+      acknowledgment->ackTxVector = m_mac->GetWifiRemoteStationManager ()->GetAckTxVector (receiver, txParams.m_txVector);
+      acknowledgment->SetQosAckPolicy (receiver, tid, WifiMacHeader::NORMAL_ACK);
+      return std::unique_ptr<WifiAcknowledgment> (acknowledgment);
+    }
+
+  // we get here if multiple MPDUs are being/have been sent
+  if (!hdr.IsBlockAckReq ()
+      && (txParams.GetSize (receiver) == 0 || m_useExplicitBar))
+    {
+      // in case of single MPDU, there are previous unacknowledged frames, thus
+      // we cannot use Implicit Block Ack Request policy, otherwise we get a
+      // normal ack as response
+      NS_LOG_DEBUG ("Request to schedule a Block Ack Request");
+
+      WifiBarBlockAck* acknowledgment = new WifiBarBlockAck;
+      acknowledgment->blockAckReqTxVector = m_mac->GetWifiRemoteStationManager ()->GetBlockAckTxVector (receiver, txParams.m_txVector);
+      acknowledgment->blockAckTxVector = acknowledgment->blockAckReqTxVector;
+      acknowledgment->barType = m_mac->GetQosTxop (tid)->GetBlockAckReqType (receiver, tid);
+      acknowledgment->baType = m_mac->GetQosTxop (tid)->GetBlockAckType (receiver, tid);
+      acknowledgment->SetQosAckPolicy (receiver, tid, WifiMacHeader::BLOCK_ACK);
+      return std::unique_ptr<WifiAcknowledgment> (acknowledgment);
+    }
+
+  NS_LOG_DEBUG ("A-MPDU using Implicit Block Ack Request policy or BlockAckReq, request Block Ack");
+  WifiBlockAck* acknowledgment = new WifiBlockAck;
+  acknowledgment->blockAckTxVector = m_mac->GetWifiRemoteStationManager ()->GetBlockAckTxVector (receiver, txParams.m_txVector);
+  acknowledgment->baType = m_mac->GetQosTxop (tid)->GetBlockAckType (receiver, tid);
+  acknowledgment->SetQosAckPolicy (receiver, tid, WifiMacHeader::NORMAL_ACK);
+  return std::unique_ptr<WifiAcknowledgment> (acknowledgment);
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiDefaultAckManager::TryAggregateMsdu (Ptr<const WifiMacQueueItem> msdu,
+                                         const WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << *msdu << &txParams);
+
+  // Aggregating an MSDU does not change the acknowledgment method
+  return nullptr;
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiDefaultAckManager::GetAckInfoIfBarBaSequence (Ptr<const WifiMacQueueItem> mpdu,
+                                                  const WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << *mpdu << &txParams);
+  NS_ASSERT (txParams.m_txVector.IsDlMu ());
+  NS_ASSERT (m_dlMuAckType == WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE);
+
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
+  Mac48Address receiver = hdr.GetAddr1 ();
+
+  const WifiTxParameters::PsduInfo* psduInfo = txParams.GetPsduInfo (receiver);
+
+  NS_ABORT_MSG_IF (!hdr.IsQosData (),
+                    "QoS data frames only can be aggregated when transmitting a "
+                    "DL MU PPDU acknowledged via a sequence of BAR and BA frames");
+  uint8_t tid = hdr.GetQosTid ();
+  Ptr<QosTxop> edca = m_mac->GetQosTxop (QosUtilsMapTidToAc (tid));
+
+  NS_ASSERT (!txParams.m_acknowledgment
+             || txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE);
+
+  WifiDlMuBarBaSequence* acknowledgment = nullptr;
+  if (txParams.m_acknowledgment)
+    {
+      acknowledgment = static_cast<WifiDlMuBarBaSequence*> (txParams.m_acknowledgment.get ());
+    }
+
+  if (psduInfo != nullptr)
+    {
+      // an MPDU addressed to the same receiver has been already added
+      NS_ASSERT (acknowledgment != nullptr);
+
+      if ((acknowledgment->stationsSendBlockAckReqTo.find (receiver)
+            != acknowledgment->stationsSendBlockAckReqTo.end ())
+          || (acknowledgment->stationsReplyingWithBlockAck.find (receiver)
+              != acknowledgment->stationsReplyingWithBlockAck.end ()))
+        {
+          // the receiver either is already listed among the stations that will
+          // receive a BlockAckReq frame or is the station that will immediately
+          // respond with a BlockAck frame, hence no change is needed
+          return nullptr;
+        }
+
+      // the receiver was scheduled for responding immediately with a Normal Ack.
+      // Given that we are adding an MPDU, the receiver must be scheduled for
+      // responding immediately with a Block Ack
+      NS_ASSERT (acknowledgment->stationsReplyingWithNormalAck.size () == 1
+                  && acknowledgment->stationsReplyingWithNormalAck.begin ()->first == receiver);
+
+
+      // acknowledgment points to the m_acknowledgment member of txParams, which is
+      // passed as const reference because it must not be modified. Therefore, we
+      // make a copy of the object pointed to by acknowledgment and make changes to
+      // the copy
+      acknowledgment = new WifiDlMuBarBaSequence (*acknowledgment);
+      acknowledgment->stationsReplyingWithNormalAck.clear ();
+
+      acknowledgment->stationsReplyingWithBlockAck.emplace
+        (receiver,
+          WifiDlMuBarBaSequence::BlockAckInfo
+          {
+            m_mac->GetWifiRemoteStationManager ()->GetBlockAckTxVector (receiver, txParams.m_txVector),
+            edca->GetBlockAckType (receiver, tid)
+          });
+      return std::unique_ptr<WifiDlMuBarBaSequence> (acknowledgment);
+    }
+
+  // we get here if this is the first MPDU for this receiver
+  if (edca->GetBaManager ()->GetBar (true, tid, receiver) != 0
+      || (acknowledgment != nullptr
+          && (!acknowledgment->stationsReplyingWithNormalAck.empty ()
+              || !acknowledgment->stationsReplyingWithBlockAck.empty ())))
+    {
+      // there is a pending BlockAckReq for this receiver or another receiver
+      // was selected for immediate response.
+      // Add this receiver to the list of stations receiving a BlockAckReq.
+      if (acknowledgment != nullptr)
+        {
+          // txParams.m_acknowledgment points to an existing WifiDlMuBarBaSequence object.
+          // We have to return a copy of this object including the needed changes
+          acknowledgment = new WifiDlMuBarBaSequence (*acknowledgment);
+        }
+      else
+        {
+          // we have to create a new WifiDlMuBarBaSequence object
+          acknowledgment = new WifiDlMuBarBaSequence;
+        }
+
+      NS_LOG_DEBUG ("Adding STA " << receiver << " to the list of stations receiving a BlockAckReq");
+      acknowledgment->stationsSendBlockAckReqTo.emplace
+        (receiver,
+          WifiDlMuBarBaSequence::BlockAckReqInfo
+          {
+            m_mac->GetWifiRemoteStationManager ()->GetBlockAckTxVector (receiver, txParams.m_txVector),
+            edca->GetBlockAckReqType (receiver, tid),
+            m_mac->GetWifiRemoteStationManager ()->GetBlockAckTxVector (receiver, txParams.m_txVector),
+            edca->GetBlockAckType (receiver, tid)
+          });
+
+      acknowledgment->SetQosAckPolicy (receiver, tid, WifiMacHeader::BLOCK_ACK);
+      return std::unique_ptr<WifiDlMuBarBaSequence> (acknowledgment);
+    }
+
+  // Add the receiver as the station that will immediately reply with a Normal Ack
+  if (acknowledgment != nullptr)
+    {
+      // txParams.m_acknowledgment points to an existing WifiDlMuBarBaSequence object.
+      // We have to return a copy of this object including the needed changes
+      acknowledgment = new WifiDlMuBarBaSequence (*acknowledgment);
+    }
+  else
+    {
+      // we have to create a new WifiDlMuBarBaSequence object
+      acknowledgment = new WifiDlMuBarBaSequence;
+    }
+
+  NS_LOG_DEBUG ("Adding STA " << receiver << " as the station that will immediately reply with a Normal Ack");
+  acknowledgment->stationsReplyingWithNormalAck.emplace
+    (receiver,
+      WifiDlMuBarBaSequence::AckInfo
+      {
+        m_mac->GetWifiRemoteStationManager ()->GetAckTxVector (receiver, txParams.m_txVector)
+      });
+
+  acknowledgment->SetQosAckPolicy (receiver, tid, WifiMacHeader::NORMAL_ACK);
+  return std::unique_ptr<WifiDlMuBarBaSequence> (acknowledgment);
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiDefaultAckManager::GetAckInfoIfTfMuBar (Ptr<const WifiMacQueueItem> mpdu,
+                                            const WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << *mpdu << &txParams);
+  NS_ASSERT (txParams.m_txVector.IsDlMu ());
+  NS_ASSERT (m_dlMuAckType == WifiAcknowledgment::DL_MU_TF_MU_BAR);
+
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
+  Mac48Address receiver = hdr.GetAddr1 ();
+
+  const WifiTxParameters::PsduInfo* psduInfo = txParams.GetPsduInfo (receiver);
+
+  NS_ASSERT (!txParams.m_acknowledgment
+             || txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_TF_MU_BAR);
+
+  WifiDlMuTfMuBar* acknowledgment = nullptr;
+  if (txParams.m_acknowledgment)
+    {
+      acknowledgment = static_cast<WifiDlMuTfMuBar*> (txParams.m_acknowledgment.get ());
+    }
+
+  if (psduInfo == nullptr)
+    {
+      // we get here if this is the first MPDU for this receiver.
+      Ptr<ApWifiMac> apMac = DynamicCast<ApWifiMac> (m_mac);
+      NS_ABORT_MSG_IF (apMac == 0, "HE APs only can send DL MU PPDUs");
+      uint16_t staId = apMac->GetAssociationId (receiver);
+
+      NS_ABORT_MSG_IF (!hdr.IsQosData (),
+                      "QoS data frames only can be aggregated when transmitting a "
+                      "DL MU PPDU acknowledged via a MU-BAR sent as SU frame");
+      uint8_t tid = hdr.GetQosTid ();
+
+      // Add the receiver to the list of stations that will reply with a Block Ack
+      if (acknowledgment != nullptr)
+        {
+          // txParams.m_acknowledgment points to an existing WifiDlMuTfMuBar object.
+          // We have to return a copy of this object including the needed changes
+          acknowledgment = new WifiDlMuTfMuBar (*acknowledgment);
+        }
+      else
+        {
+          // we have to create a new WifiDlMuTfMuBar object
+          acknowledgment = new WifiDlMuTfMuBar;
+        }
+
+      // determine the TX vector used to send the BlockAck frame
+      WifiTxVector blockAckTxVector;
+      blockAckTxVector.SetPreambleType (WifiPreamble::WIFI_PREAMBLE_HE_TB);
+      blockAckTxVector.SetChannelWidth (txParams.m_txVector.GetChannelWidth ());
+      blockAckTxVector.SetGuardInterval (txParams.m_txVector.GetGuardInterval ());
+      const auto& userInfo = txParams.m_txVector.GetHeMuUserInfo (staId);
+      blockAckTxVector.SetHeMuUserInfo (staId, {userInfo.ru,
+                                                HePhy::GetHeMcs (std::min (userInfo.mcs.GetMcsValue (),
+                                                                           m_maxMcsForBlockAckInTbPpdu)),
+                                                userInfo.nss});
+
+      NS_LOG_DEBUG ("Adding STA " << receiver << " to the list of stations that will be solicited by the MU-BAR");
+      Ptr<QosTxop> edca = m_mac->GetQosTxop (QosUtilsMapTidToAc (tid));
+      acknowledgment->stationsReplyingWithBlockAck.emplace
+        (receiver,
+          WifiDlMuTfMuBar::BlockAckInfo
+          {
+            edca->GetBaManager ()->GetBlockAckReqHeader (receiver, tid),
+            blockAckTxVector,
+            edca->GetBlockAckType (receiver, tid)
+          });
+
+      acknowledgment->barTypes.push_back (edca->GetBlockAckReqType (receiver, tid));
+      acknowledgment->muBarTxVector = m_mac->GetWifiRemoteStationManager ()->GetRtsTxVector (receiver);
+      acknowledgment->SetQosAckPolicy (receiver, tid, WifiMacHeader::BLOCK_ACK);
+      return std::unique_ptr<WifiDlMuTfMuBar> (acknowledgment);
+    }
+
+  // an MPDU addressed to the same receiver has been already added
+  NS_ASSERT (acknowledgment != nullptr);
+  NS_ABORT_MSG_IF (!hdr.IsQosData (),
+                    "QoS data frames only can be aggregated when transmitting a DL MU PPDU");
+
+  // no change is needed
+  return nullptr;
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiDefaultAckManager::GetAckInfoIfAggregatedMuBar (Ptr<const WifiMacQueueItem> mpdu,
+                                                    const WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << *mpdu << &txParams);
+  NS_ASSERT (txParams.m_txVector.IsDlMu ());
+  NS_ASSERT (m_dlMuAckType == WifiAcknowledgment::DL_MU_AGGREGATE_TF);
+
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
+  Mac48Address receiver = hdr.GetAddr1 ();
+
+  const WifiTxParameters::PsduInfo* psduInfo = txParams.GetPsduInfo (receiver);
+
+  NS_ASSERT (!txParams.m_acknowledgment
+             || txParams.m_acknowledgment->method == WifiAcknowledgment::DL_MU_AGGREGATE_TF);
+
+  WifiDlMuAggregateTf* acknowledgment = nullptr;
+  if (txParams.m_acknowledgment)
+    {
+      acknowledgment = static_cast<WifiDlMuAggregateTf*> (txParams.m_acknowledgment.get ());
+    }
+
+  if (psduInfo == nullptr)
+    {
+      // we get here if this is the first MPDU for this receiver.
+      Ptr<ApWifiMac> apMac = DynamicCast<ApWifiMac> (m_mac);
+      NS_ABORT_MSG_IF (apMac == 0, "HE APs only can send DL MU PPDUs");
+      uint16_t staId = apMac->GetAssociationId (receiver);
+
+      NS_ABORT_MSG_IF (!hdr.IsQosData (),
+                      "QoS data frames only can be aggregated when transmitting a "
+                      "DL MU PPDU acknowledged via a sequence of BAR and BA frames");
+      uint8_t tid = hdr.GetQosTid ();
+
+      // Add the receiver to the list of stations that will reply with a Block Ack
+      if (acknowledgment != nullptr)
+        {
+          // txParams.m_acknowledgment points to an existing WifiDlMuAggregateTf object.
+          // We have to return a copy of this object including the needed changes
+          acknowledgment = new WifiDlMuAggregateTf (*acknowledgment);
+        }
+      else
+        {
+          // we have to create a new WifiDlMuAggregateTf object
+          acknowledgment = new WifiDlMuAggregateTf;
+        }
+
+      // determine the TX vector used to send the BlockAck frame
+      WifiTxVector blockAckTxVector;
+      blockAckTxVector.SetPreambleType (WifiPreamble::WIFI_PREAMBLE_HE_TB);
+      blockAckTxVector.SetChannelWidth (txParams.m_txVector.GetChannelWidth ());
+      blockAckTxVector.SetGuardInterval (txParams.m_txVector.GetGuardInterval ());
+      const auto& userInfo = txParams.m_txVector.GetHeMuUserInfo (staId);
+      blockAckTxVector.SetHeMuUserInfo (staId, {userInfo.ru,
+                                                HePhy::GetHeMcs (std::min (userInfo.mcs.GetMcsValue (),
+                                                                           m_maxMcsForBlockAckInTbPpdu)),
+                                                userInfo.nss});
+
+      NS_LOG_DEBUG ("Adding STA " << receiver << " to the list of stations that will reply with a Block Ack");
+      Ptr<QosTxop> edca = m_mac->GetQosTxop (QosUtilsMapTidToAc (tid));
+      acknowledgment->stationsReplyingWithBlockAck.emplace
+        (receiver,
+          WifiDlMuAggregateTf::BlockAckInfo
+          {
+            GetMuBarSize ({edca->GetBlockAckReqType (receiver, tid)}),
+            edca->GetBaManager ()->GetBlockAckReqHeader (receiver, tid),
+            blockAckTxVector,
+            edca->GetBlockAckType (receiver, tid)
+          });
+
+      acknowledgment->SetQosAckPolicy (receiver, tid, WifiMacHeader::NO_EXPLICIT_ACK);
+      return std::unique_ptr<WifiDlMuAggregateTf> (acknowledgment);
+    }
+
+  // an MPDU addressed to the same receiver has been already added
+  NS_ASSERT (acknowledgment != nullptr);
+  NS_ABORT_MSG_IF (!hdr.IsQosData (),
+                   "QoS data and MU-BAR Trigger frames only can be aggregated when transmitting a DL MU PPDU");
+
+  // no change is needed
+  return nullptr;
+}
+
+std::unique_ptr<WifiAcknowledgment>
+WifiDefaultAckManager::TryUlMuTransmission (Ptr<const WifiMacQueueItem> mpdu,
+                                            const WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << *mpdu << &txParams);
+  NS_ASSERT (mpdu->GetHeader ().IsTrigger ());
+
+  Ptr<ApWifiMac> apMac = DynamicCast<ApWifiMac> (m_mac);
+  NS_ABORT_MSG_IF (apMac == nullptr, "HE APs only can send Trigger Frames");
+
+  Ptr<HeFrameExchangeManager> heFem = DynamicCast<HeFrameExchangeManager> (m_mac->GetFrameExchangeManager ());
+  NS_ABORT_MSG_IF (heFem == nullptr, "HE APs only can send Trigger Frames");
+
+  CtrlTriggerHeader trigger;
+  mpdu->GetPacket ()->PeekHeader (trigger);
+
+  if (trigger.IsBasic ())
+    {
+      // the only supported ack method for now is through a multi-STA BlockAck frame
+      WifiUlMuMultiStaBa* acknowledgment = new WifiUlMuMultiStaBa;
+      acknowledgment->baType.m_variant = BlockAckType::MULTI_STA;
+
+      for (const auto& userInfo : trigger)
+        {
+          uint16_t aid12 = userInfo.GetAid12 ();
+
+          if (aid12 == 2046)
+            {
+              NS_LOG_INFO ("Unallocated RU");
+              continue;
+            }
+          NS_ABORT_MSG_IF (aid12 == 0 || aid12 > 2007, "Allocation of RA-RUs is not supported");
+
+          NS_ASSERT (apMac->GetStaList ().find (aid12) != apMac->GetStaList ().end ());
+          Mac48Address staAddress = apMac->GetStaList ().find (aid12)->second;
+
+          // find a TID for which a BA agreement exists with the given originator
+          uint8_t tid = 0;
+          while (tid < 8 && !heFem->GetBaAgreementEstablished (staAddress, tid))
+            {
+              tid++;
+            }
+          NS_ASSERT_MSG (tid < 8, "No Block Ack agreement established with originator " << staAddress);
+
+          std::size_t index = acknowledgment->baType.m_bitmapLen.size ();
+          acknowledgment->stationsReceivingMultiStaBa.emplace (std::make_pair (staAddress, tid), index);
+
+          // we assume the Block Acknowledgment context is used for the multi-STA BlockAck frame
+          // (since it requires the longest TX time due to the presence of a bitmap)
+          acknowledgment->baType.m_bitmapLen.push_back (heFem->GetBlockAckType (staAddress, tid).m_bitmapLen.at (0));
+        }
+
+      uint16_t staId = trigger.begin ()->GetAid12 ();
+      acknowledgment->tbPpduTxVector = trigger.GetHeTbTxVector (staId);
+      acknowledgment->multiStaBaTxVector = m_mac->GetWifiRemoteStationManager ()->GetBlockAckTxVector (apMac->GetStaList ().find (staId)->second,
+                                                                                                       acknowledgment->tbPpduTxVector);
+      return std::unique_ptr<WifiUlMuMultiStaBa> (acknowledgment);
+    }
+  else if (trigger.IsBsrp ())
+    {
+      return std::unique_ptr<WifiAcknowledgment> (new WifiNoAck);
+    }
+
+  return nullptr;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-default-ack-manager.h ns-3.34/src/wifi/model/wifi-default-ack-manager.h
--- ns-3.33/src/wifi/model/wifi-default-ack-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-default-ack-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,151 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef WIFI_DEFAULT_ACK_MANAGER_H
+#define WIFI_DEFAULT_ACK_MANAGER_H
+
+#include "wifi-ack-manager.h"
+
+
+namespace ns3 {
+
+class WifiTxParameters;
+class WifiMacQueueItem;
+
+/**
+ * \ingroup wifi
+ *
+ * WifiDefaultAckManager is the default ack manager.
+ */
+class WifiDefaultAckManager : public WifiAckManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  WifiDefaultAckManager ();
+  virtual ~WifiDefaultAckManager ();
+
+  virtual std::unique_ptr<WifiAcknowledgment> TryAddMpdu (Ptr<const WifiMacQueueItem> mpdu,
+                                                          const WifiTxParameters& txParams) override;
+  virtual std::unique_ptr<WifiAcknowledgment> TryAggregateMsdu (Ptr<const WifiMacQueueItem> msdu,
+                                                                const WifiTxParameters& txParams) override;
+
+  /**
+   * Get the maximum distance between the starting sequence number of the Block
+   * Ack agreement which the given MPDU belongs to and each of the sequence numbers
+   * of the given MPDU and of all the QoS data frames included in the given TX
+   * parameters.
+   *
+   * \param mpdu the given MPDU
+   * \param txParams the given TX parameters
+   * \return the maximum distance between the starting sequence number of the Block
+   *         Ack agreement which the given MPDU belongs to and each of the sequence
+   *         numbers of the given MPDU and of all the QoS data frames included in
+   *         the given TX parameters
+   */
+  uint16_t GetMaxDistFromStartingSeq (Ptr<const WifiMacQueueItem> mpdu,
+                                      const WifiTxParameters& txParams) const;
+
+protected:
+  /**
+   * Determine whether the (A-)MPDU containing the given MPDU and the MPDUs (if any)
+   * included in the given TX parameters requires an immediate response (Normal Ack,
+   * Block Ack or Block Ack Request followed by Block Ack).
+   *
+   * \param mpdu the given MPDU.
+   * \param txParams the given TX parameters.
+   * \return true if the given PSDU requires an immediate response
+   */
+  bool IsResponseNeeded (Ptr<const WifiMacQueueItem> mpdu,
+                         const WifiTxParameters& txParams) const;
+private:
+  /**
+   * Compute the information about the acknowledgment of the current multi-user frame
+   * (as described by the given TX parameters) if the given MPDU is added. If the
+   * computed information is the same as the current one, a null pointer is returned.
+   * Otherwise, the computed information is returned.
+   * This method can only be called if the selected acknowledgment method for DL
+   * multi-user frames consists of a sequence of BlockAckReq and BlockAck frames.
+   *
+   * \param mpdu the given MPDU
+   * \param txParams the TX parameters describing the current multi-user frame
+   * \return the new acknowledgment method or a null pointer if the acknowledgment method
+   *         is unchanged
+   */
+  virtual std::unique_ptr<WifiAcknowledgment> GetAckInfoIfBarBaSequence (Ptr<const WifiMacQueueItem> mpdu,
+                                                                         const WifiTxParameters& txParams);
+  /**
+   * Compute the information about the acknowledgment of the current multi-user frame
+   * (as described by the given TX parameters) if the given MPDU is added. If the
+   * computed information is the same as the current one, a null pointer is returned.
+   * Otherwise, the computed information is returned.
+   * This method can only be called if the selected acknowledgment method for DL
+   * multi-user frames consists of a MU-BAR Trigger Frame sent as single-user frame.
+   *
+   * \param mpdu the given MPDU
+   * \param txParams the TX parameters describing the current multi-user frame
+   * \return the new acknowledgment method or a null pointer if the acknowledgment method
+   *         is unchanged
+   */
+  virtual std::unique_ptr<WifiAcknowledgment> GetAckInfoIfTfMuBar (Ptr<const WifiMacQueueItem> mpdu,
+                                                                   const WifiTxParameters& txParams);
+  /**
+   * Compute the information about the acknowledgment of the current multi-user frame
+   * (as described by the given TX parameters) if the given MPDU is added. If the
+   * computed information is the same as the current one, a null pointer is returned.
+   * Otherwise, the computed information is returned.
+   * This method can only be called if the selected acknowledgment method for DL
+   * multi-user frames consists of MU-BAR Trigger Frames aggregated to the PSDUs of
+   * the MU PPDU.
+   *
+   * \param mpdu the given MPDU
+   * \param txParams the TX parameters describing the current multi-user frame
+   * \return the new acknowledgment method or a null pointer if the acknowledgment method
+   *         is unchanged
+   */
+  virtual std::unique_ptr<WifiAcknowledgment> GetAckInfoIfAggregatedMuBar (Ptr<const WifiMacQueueItem> mpdu,
+                                                                           const WifiTxParameters& txParams);
+
+  /**
+   * Calculate the acknowledgment method for the TB PPDUs solicited by the given
+   * Trigger Frame.
+   *
+   * \param mpdu the given Trigger Frame
+   * \param txParams the current TX parameters (just the TXVECTOR needs to be set)
+   * \return the acknowledgment method for the TB PPDUs solicited by the given Trigger Frame
+   */
+  virtual std::unique_ptr<WifiAcknowledgment> TryUlMuTransmission (Ptr<const WifiMacQueueItem> mpdu,
+                                                                   const WifiTxParameters& txParams);
+
+  bool m_useExplicitBar;                    //!< true for sending BARs, false for using Implicit BAR policy
+  double m_baThreshold;                     //!< Threshold to determine when a BlockAck must be requested
+  WifiAcknowledgment::Method m_dlMuAckType; //!< Type of the ack sequence for DL MU PPDUs
+  uint8_t m_maxMcsForBlockAckInTbPpdu;      //!< Max MCS used to send a BlockAck in a TB PPDU
+};
+
+
+
+} //namespace ns3
+
+#endif /* WIFI_DEFAULT_ACK_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-default-protection-manager.cc ns-3.34/src/wifi/model/wifi-default-protection-manager.cc
--- ns-3.33/src/wifi/model/wifi-default-protection-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-default-protection-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,151 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "wifi-default-protection-manager.h"
+#include "wifi-tx-parameters.h"
+#include "wifi-mac-queue-item.h"
+#include "regular-wifi-mac.h"
+
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("WifiDefaultProtectionManager");
+
+NS_OBJECT_ENSURE_REGISTERED (WifiDefaultProtectionManager);
+
+TypeId
+WifiDefaultProtectionManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::WifiDefaultProtectionManager")
+    .SetParent<WifiProtectionManager> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<WifiDefaultProtectionManager> ()
+  ;
+  return tid;
+}
+
+WifiDefaultProtectionManager::WifiDefaultProtectionManager ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+WifiDefaultProtectionManager::~WifiDefaultProtectionManager ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+std::unique_ptr<WifiProtection>
+WifiDefaultProtectionManager::TryAddMpdu (Ptr<const WifiMacQueueItem> mpdu,
+                                          const WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << *mpdu << &txParams);
+
+  // if the current protection method (if any) is already RTS/CTS or CTS-to-Self,
+  // it will not change by adding an MPDU
+  if (txParams.m_protection
+      && (txParams.m_protection->method == WifiProtection::RTS_CTS
+          || txParams.m_protection->method == WifiProtection::CTS_TO_SELF))
+    {
+      return nullptr;
+    }
+
+  // if a protection method is set, it must be NONE
+  NS_ASSERT (!txParams.m_protection || txParams.m_protection->method == WifiProtection::NONE);
+
+  std::unique_ptr<WifiProtection> protection;
+  protection = GetPsduProtection (mpdu->GetHeader (), txParams.GetSizeIfAddMpdu (mpdu),
+                                  txParams.m_txVector);
+
+  // return the newly computed method if none was set or it is not NONE
+  if (!txParams.m_protection || protection->method != WifiProtection::NONE)
+    {
+      return protection;
+    }
+  // the protection method has not changed
+  return nullptr;
+}
+
+std::unique_ptr<WifiProtection>
+WifiDefaultProtectionManager::TryAggregateMsdu (Ptr<const WifiMacQueueItem> msdu,
+                                                const WifiTxParameters& txParams)
+{
+  NS_LOG_FUNCTION (this << *msdu << &txParams);
+
+  // if the current protection method is already RTS/CTS or CTS-to-Self,
+  // it will not change by aggregating an MSDU
+  NS_ASSERT (txParams.m_protection);
+  if (txParams.m_protection->method == WifiProtection::RTS_CTS
+      || txParams.m_protection->method == WifiProtection::CTS_TO_SELF)
+    {
+      return nullptr;
+    }
+
+  NS_ASSERT (txParams.m_protection->method == WifiProtection::NONE);
+
+  std::unique_ptr<WifiProtection> protection;
+  protection = GetPsduProtection (msdu->GetHeader (), txParams.GetSizeIfAggregateMsdu (msdu).second,
+                                  txParams.m_txVector);
+
+  // the protection method may still be none
+  if (protection->method == WifiProtection::NONE)
+    {
+      return nullptr;
+    }
+
+  // the protection method has changed
+  return protection;
+}
+
+std::unique_ptr<WifiProtection>
+WifiDefaultProtectionManager::GetPsduProtection (const WifiMacHeader& hdr, uint32_t size,
+                                                 const WifiTxVector& txVector) const
+{
+  NS_LOG_FUNCTION (this << hdr << size << txVector);
+
+  // a non-initial fragment does not need to be protected, unless it is being retransmitted
+  if (hdr.GetFragmentNumber () > 0 && !hdr.IsRetry ())
+    {
+      return std::unique_ptr<WifiProtection> (new WifiNoProtection ());
+    }
+
+  // check if RTS/CTS is needed
+  if (m_mac->GetWifiRemoteStationManager ()->NeedRts (hdr, size))
+    {
+      WifiRtsCtsProtection* protection = new WifiRtsCtsProtection;
+      protection->rtsTxVector = m_mac->GetWifiRemoteStationManager ()->GetRtsTxVector (hdr.GetAddr1 ());
+      protection->ctsTxVector = m_mac->GetWifiRemoteStationManager ()->GetCtsTxVector (hdr.GetAddr1 (),
+                                                                                       protection->rtsTxVector.GetMode ());
+      return std::unique_ptr<WifiProtection> (protection);
+    }
+
+  // check if CTS-to-Self is needed
+  if (m_mac->GetWifiRemoteStationManager ()->GetUseNonErpProtection ()
+      && m_mac->GetWifiRemoteStationManager ()->NeedCtsToSelf (txVector))
+    {
+      WifiCtsToSelfProtection* protection = new WifiCtsToSelfProtection;
+      protection->ctsTxVector = m_mac->GetWifiRemoteStationManager ()->GetCtsToSelfTxVector ();
+      return std::unique_ptr<WifiProtection> (protection);
+    }
+
+  return std::unique_ptr<WifiProtection> (new WifiNoProtection ());
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-default-protection-manager.h ns-3.34/src/wifi/model/wifi-default-protection-manager.h
--- ns-3.33/src/wifi/model/wifi-default-protection-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-default-protection-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,71 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef WIFI_DEFAULT_PROTECTION_MANAGER_H
+#define WIFI_DEFAULT_PROTECTION_MANAGER_H
+
+#include "wifi-protection-manager.h"
+
+
+namespace ns3 {
+
+class WifiTxParameters;
+class WifiMacQueueItem;
+class WifiMacHeader;
+
+/**
+ * \ingroup wifi
+ *
+ * WifiDefaultProtectionManager is the default protection manager, which selects
+ * the protection method for a frame based on its size.
+ */
+class WifiDefaultProtectionManager : public WifiProtectionManager
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  WifiDefaultProtectionManager ();
+  virtual ~WifiDefaultProtectionManager ();
+
+  virtual std::unique_ptr<WifiProtection> TryAddMpdu (Ptr<const WifiMacQueueItem> mpdu,
+                                                      const WifiTxParameters& txParams) override;
+  virtual std::unique_ptr<WifiProtection> TryAggregateMsdu (Ptr<const WifiMacQueueItem> msdu,
+                                                            const WifiTxParameters& txParams) override;
+
+protected:
+  /**
+   * Select the protection method for a single PSDU.
+   *
+   * \param hdr the MAC header of the PSDU
+   * \param size the size in bytes of the PSDU
+   * \param txVector the TxVector used to transmit the PSDU
+   * \return the selected protection method
+   */
+  virtual std::unique_ptr<WifiProtection> GetPsduProtection (const WifiMacHeader& hdr, uint32_t size,
+                                                             const WifiTxVector& txVector) const;
+};
+
+} //namespace ns3
+
+#endif /* WIFI_DEFAULT_PROTECTION_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-information-element.h ns-3.34/src/wifi/model/wifi-information-element.h
--- ns-3.33/src/wifi/model/wifi-information-element.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-information-element.h	2021-07-14 10:31:07.000000000 -0700
@@ -239,7 +239,7 @@
    *
    * \return an iterator
    */
-  Buffer::Iterator Serialize (Buffer::Iterator i) const;
+  virtual Buffer::Iterator Serialize (Buffer::Iterator i) const;
   /**
    * Deserialize entire IE, which must be present. The iterator
    * passed in must be pointing at the Element ID (i.e., the very
@@ -268,7 +268,7 @@
    *
    * \return the size of the serialized IE in bytes
    */
-  uint16_t GetSerializedSize () const;
+  virtual uint16_t GetSerializedSize () const;
 
   // Each subclass must implement these pure virtual functions:
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-information-element-vector.h ns-3.34/src/wifi/model/wifi-information-element-vector.h
--- ns-3.33/src/wifi/model/wifi-information-element-vector.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-information-element-vector.h	2021-07-14 10:31:07.000000000 -0700
@@ -47,9 +47,10 @@
    * \return the object TypeId
    */
   static TypeId GetTypeId ();
-  TypeId GetInstanceTypeId () const;
-  virtual uint32_t GetSerializedSize () const;
-  virtual void Serialize (Buffer::Iterator start) const;
+
+  TypeId GetInstanceTypeId () const override;
+  uint32_t GetSerializedSize () const override;
+  void Serialize (Buffer::Iterator start) const override;
   /**
    * \attention This variant should not be used but is implemented due to
    * backward compatibility reasons
@@ -57,7 +58,7 @@
    * \param start buffer location to start deserializing from
    * \return number of bytes deserialized
    */
-  virtual uint32_t Deserialize (Buffer::Iterator start);
+  uint32_t Deserialize (Buffer::Iterator start) override;
   /**
    * Deserialize a number of WifiInformationElements 
    *
@@ -67,8 +68,8 @@
    * \param end ending buffer location
    * \return number of bytes deserialized
    */
-  virtual uint32_t Deserialize (Buffer::Iterator start, Buffer::Iterator end);
-  virtual void Print (std::ostream &os) const;
+  uint32_t Deserialize (Buffer::Iterator start, Buffer::Iterator end) override;
+  void Print (std::ostream &os) const override;
 
   /**
    * \brief Needed when you try to deserialize a lonely IE inside other header
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-mac.cc ns-3.34/src/wifi/model/wifi-mac.cc
--- ns-3.33/src/wifi/model/wifi-mac.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-mac.cc	2021-07-14 10:31:07.000000000 -0700
@@ -24,9 +24,9 @@
 #include "txop.h"
 #include "ssid.h"
 #include "wifi-net-device.h"
-#include "ht-configuration.h"
-#include "vht-configuration.h"
-#include "he-configuration.h"
+#include "ns3/ht-configuration.h"
+#include "ns3/vht-configuration.h"
+#include "ns3/he-configuration.h"
 
 namespace ns3 {
 
@@ -51,7 +51,10 @@
                      MakeTraceSourceAccessor (&WifiMac::m_macTxTrace),
                      "ns3::Packet::TracedCallback")
     .AddTraceSource ("MacTxDrop",
-                     "A packet has been dropped in the MAC layer before transmission.",
+                     "A packet has been dropped in the MAC layer before being queued for transmission. "
+                     "This trace source is fired, e.g., when an AP's MAC receives from the upper layer "
+                     "a packet destined to a station that is not associated with the AP or a STA's MAC "
+                     "receives a packet from the upper layer while it is not associated with any AP.",
                      MakeTraceSourceAccessor (&WifiMac::m_macTxDropTrace),
                      "ns3::Packet::TracedCallback")
     .AddTraceSource ("MacPromiscRx",
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-mac.h ns-3.34/src/wifi/model/wifi-mac.h
--- ns-3.33/src/wifi/model/wifi-mac.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-mac.h	2021-07-14 10:31:07.000000000 -0700
@@ -35,6 +35,30 @@
 class HeConfiguration;
 
 /**
+ * Enumeration for type of station
+ */
+enum TypeOfStation
+{
+  STA,
+  AP,
+  ADHOC_STA,
+  MESH,
+  OCB
+};
+
+/**
+ * \ingroup wifi
+  * \enum WifiMacDropReason
+  * \brief The reason why an MPDU was dropped
+  */
+enum WifiMacDropReason : uint8_t
+{
+  WIFI_MAC_DROP_FAILED_ENQUEUE = 0,
+  WIFI_MAC_DROP_EXPIRED_LIFETIME,
+  WIFI_MAC_DROP_REACHED_RETRY_LIMIT
+};
+
+/**
  * \brief base class for all MAC-level wifi objects.
  * \ingroup wifi
  *
@@ -67,7 +91,22 @@
    */
   Ptr<NetDevice> GetDevice (void) const;
 
+   /**
+   * This method is invoked by a subclass to specify what type of
+   * station it is implementing. This is something that the channel
+   * access functions need to know.
+   *
+   * \param type the type of station.
+   */
+  virtual void SetTypeOfStation (TypeOfStation type) = 0;
   /**
+   * Return the type of station.
+   *
+   * \return the type of station.
+   */
+  virtual TypeOfStation GetTypeOfStation (void) const = 0;
+
+ /**
    * \param ssid the current SSID of this MAC layer.
    */
   virtual void SetSsid (Ssid ssid) = 0;
@@ -159,10 +198,20 @@
   virtual Ptr<WifiRemoteStationManager> GetWifiRemoteStationManager (void) const = 0;
 
   /**
+   * This type defines the callback of a higher layer that a
+   * WifiMac(-derived) object invokes to pass a packet up the stack.
+   *
+   * \param packet the packet that has been received.
+   * \param from the MAC address of the device that sent the packet.
+   * \param to the MAC address of the device that the packet is destined for.
+   */
+  typedef Callback<void, Ptr<const Packet>, Mac48Address, Mac48Address> ForwardUpCallback;
+
+  /**
    * \param upCallback the callback to invoke when a packet must be
    *        forwarded up the stack.
    */
-  virtual void SetForwardUpCallback (Callback<void, Ptr<const Packet>, Mac48Address, Mac48Address> upCallback) = 0;
+  virtual void SetForwardUpCallback (ForwardUpCallback upCallback) = 0;
   /**
    * \param linkUp the callback to invoke when the link becomes up.
    */
@@ -186,9 +235,9 @@
   /**
    * \param packet the packet being dropped
    *
-   * Public method used to fire a MacTxDrop trace. Implemented for encapsulation purposes.
-   * This trace indicates that the packet was dropped before it was transmitted
-   * (e.g. when a STA is not associated with an AP).
+   * Public method used to fire a MacTxDrop trace.
+   * This trace indicates that the packet was dropped before it was queued for
+   * transmission (e.g. when a STA is not associated with an AP).
    */
   void NotifyTxDrop (Ptr<const Packet> packet);
   /**
@@ -258,7 +307,7 @@
   TracedCallback<Ptr<const Packet> > m_macTxTrace;
   /**
    * The trace source fired when packets coming into the "top" of the device
-   * are dropped at the MAC layer during transmission.
+   * are dropped at the MAC layer before being queued for transmission.
    *
    * \see class CallBackTraceSource
    */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-mac-header.cc ns-3.34/src/wifi/model/wifi-mac-header.cc
--- ns-3.33/src/wifi/model/wifi-mac-header.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-mac-header.cc	2021-07-14 10:31:07.000000000 -0700
@@ -39,7 +39,12 @@
 /// subtype enumeration
 enum
 {
-  //Reserved: 0 - 6
+  //Reserved: 0 - 1
+  SUBTYPE_CTL_TRIGGER = 2,
+  //Reserved: 3
+  SUBTYPE_CTL_BEAMFORMINGRPOLL = 4,
+  SUBTYPE_CTL_NDPANNOUNCE = 5,
+  SUBTYPE_CTL_CTLFRAMEEXT = 6,
   SUBTYPE_CTL_CTLWRAPPER = 7,
   SUBTYPE_CTL_BACKREQ = 8,
   SUBTYPE_CTL_BACKRESP = 9,
@@ -51,13 +56,26 @@
 };
 
 WifiMacHeader::WifiMacHeader ()
-  : m_ctrlMoreData (0),
+  : m_ctrlMoreFrag (0),
+    m_ctrlRetry (0),
+    m_ctrlMoreData (0),
     m_ctrlWep (0),
     m_ctrlOrder (0),
+    m_duration (0),
+    m_seqFrag (0),
+    m_seqSeq (0),
+    m_qosEosp (0),
+    m_qosAckPolicy (0),  // Normal Ack
     m_amsduPresent (0)
 {
 }
 
+WifiMacHeader::WifiMacHeader (WifiMacType type)
+  : WifiMacHeader ()
+{
+  SetType (type);
+}
+
 WifiMacHeader::~WifiMacHeader ()
 {
 }
@@ -115,6 +133,10 @@
 {
   switch (type)
     {
+    case WIFI_MAC_CTL_TRIGGER:
+      m_ctrlType = TYPE_CTL;
+      m_ctrlSubtype = SUBTYPE_CTL_TRIGGER;
+      break;
     case WIFI_MAC_CTL_CTLWRAPPER:
       m_ctrlType = TYPE_CTL;
       m_ctrlSubtype = SUBTYPE_CTL_CTLWRAPPER;
@@ -376,6 +398,13 @@
   m_qosStuff = txop;
 }
 
+void
+WifiMacHeader::SetQosQueueSize (uint8_t size)
+{
+  m_qosEosp = 1;
+  m_qosStuff = size;
+}
+
 void WifiMacHeader::SetQosMeshControlPresent (void)
 {
   //Mark bit 0 of this variable instead of bit 8, since m_qosStuff is
@@ -454,6 +483,8 @@
     case TYPE_CTL:
       switch (m_ctrlSubtype)
         {
+        case SUBTYPE_CTL_TRIGGER:
+          return WIFI_MAC_CTL_TRIGGER;
         case SUBTYPE_CTL_BACKREQ:
           return WIFI_MAC_CTL_BACKREQ;
         case SUBTYPE_CTL_BACKRESP:
@@ -718,6 +749,12 @@
   return (GetType () == WIFI_MAC_CTL_BACKRESP) ? true : false;
 }
 
+bool
+WifiMacHeader::IsTrigger (void) const
+{
+  return (GetType () == WIFI_MAC_CTL_TRIGGER) ? true : false;
+}
+
 uint16_t
 WifiMacHeader::GetRawDuration (void) const
 {
@@ -828,6 +865,13 @@
   return m_qosTid;
 }
 
+uint8_t
+WifiMacHeader::GetQosQueueSize (void) const
+{
+  NS_ASSERT (m_qosEosp == 1);
+  return m_qosStuff;
+}
+
 uint16_t
 WifiMacHeader::GetFrameControl (void) const
 {
@@ -900,6 +944,7 @@
         case SUBTYPE_CTL_RTS:
         case SUBTYPE_CTL_BACKREQ:
         case SUBTYPE_CTL_BACKRESP:
+        case SUBTYPE_CTL_TRIGGER:
         case SUBTYPE_CTL_END:
         case SUBTYPE_CTL_END_ACK:
           size = 2 + 2 + 6 + 6;
@@ -945,6 +990,7 @@
       FOO (CTL_BACKRESP);
       FOO (CTL_END);
       FOO (CTL_END_ACK);
+      FOO (CTL_TRIGGER);
 
       FOO (MGT_BEACON);
       FOO (MGT_ASSOCIATION_REQUEST);
@@ -1018,6 +1064,7 @@
   switch (GetType ())
     {
     case WIFI_MAC_CTL_RTS:
+    case WIFI_MAC_CTL_TRIGGER:
       os << "Duration/ID=" << m_duration << "us"
          << ", RA=" << m_addr1 << ", TA=" << m_addr2;
       break;
@@ -1127,6 +1174,7 @@
       switch (m_ctrlSubtype)
         {
         case SUBTYPE_CTL_RTS:
+        case SUBTYPE_CTL_TRIGGER:
         case SUBTYPE_CTL_BACKREQ:
         case SUBTYPE_CTL_BACKRESP:
         case SUBTYPE_CTL_END:
@@ -1182,6 +1230,7 @@
       switch (m_ctrlSubtype)
         {
         case SUBTYPE_CTL_RTS:
+        case SUBTYPE_CTL_TRIGGER:
         case SUBTYPE_CTL_BACKREQ:
         case SUBTYPE_CTL_BACKRESP:
         case SUBTYPE_CTL_END:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-mac-header.h ns-3.34/src/wifi/model/wifi-mac-header.h
--- ns-3.33/src/wifi/model/wifi-mac-header.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-mac-header.h	2021-07-14 10:31:07.000000000 -0700
@@ -35,7 +35,8 @@
  */
 enum WifiMacType
 {
-  WIFI_MAC_CTL_CTLWRAPPER = 0,
+  WIFI_MAC_CTL_TRIGGER = 0,
+  WIFI_MAC_CTL_CTLWRAPPER,
   WIFI_MAC_CTL_RTS,
   WIFI_MAC_CTL_CTS,
   WIFI_MAC_CTL_ACK,
@@ -106,6 +107,12 @@
   };
 
   WifiMacHeader ();
+  /**
+   * Construct a MAC header of the given type
+   *
+   * \param type the MAC header type
+   */
+  WifiMacHeader (WifiMacType type);
   virtual ~WifiMacHeader ();
 
   /**
@@ -113,11 +120,12 @@
    * \return the object TypeId
    */
   static TypeId GetTypeId (void);
-  TypeId GetInstanceTypeId (void) const;
-  void Print (std::ostream &os) const;
-  uint32_t GetSerializedSize (void) const;
-  void Serialize (Buffer::Iterator start) const;
-  uint32_t Deserialize (Buffer::Iterator start);
+
+  TypeId GetInstanceTypeId (void) const override;
+  void Print (std::ostream &os) const override;
+  uint32_t GetSerializedSize (void) const override;
+  void Serialize (Buffer::Iterator start) const override;
+  uint32_t Deserialize (Buffer::Iterator start) override;
 
   /**
    * Set the From DS bit in the Frame Control field.
@@ -250,6 +258,12 @@
    */
   void SetQosTxopLimit (uint8_t txop);
   /**
+   * Set the Queue Size subfield in the QoS control field.
+   *
+   * \param size the value for the Queue Size subfield
+   */
+  void SetQosQueueSize (uint8_t size);
+  /**
    * Set the Mesh Control Present flag for the QoS header.
    */
   void SetQosMeshControlPresent ();
@@ -387,6 +401,12 @@
    */
   bool IsBlockAck (void) const;
   /**
+   * Return true if the header is a Trigger header.
+   *
+   * \return true if the header is a Trigger header, false otherwise
+   */
+  bool IsTrigger (void) const;
+  /**
    * Return true if the header is an Association Request header.
    *
    * \return true if the header is an Association Request header, false otherwise
@@ -545,6 +565,12 @@
    */
   QosAckPolicy GetQosAckPolicy (void) const;
   /**
+   * Get the Queue Size subfield in the QoS control field.
+   *
+   * \return the value of the Queue Size subfield
+   */
+  uint8_t GetQosQueueSize (void) const;
+  /**
    * Return the size of the WifiMacHeader in octets.
    * GetSerializedSize calls this function.
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-mac-queue.cc ns-3.34/src/wifi/model/wifi-mac-queue.cc
--- ns-3.33/src/wifi/model/wifi-mac-queue.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-mac-queue.cc	2021-07-14 10:31:07.000000000 -0700
@@ -24,6 +24,7 @@
 #include "ns3/simulator.h"
 #include "wifi-mac-queue.h"
 #include "qos-blocked-destinations.h"
+#include <functional>
 
 namespace ns3 {
 
@@ -70,9 +71,11 @@
 WifiMacQueue::~WifiMacQueue ()
 {
   NS_LOG_FUNCTION_NOARGS ();
+  m_nQueuedPackets.clear ();
+  m_nQueuedBytes.clear ();
 }
 
-static std::list<Ptr<WifiMacQueueItem>> g_emptyWifiMacQueue;
+static std::list<Ptr<WifiMacQueueItem>> g_emptyWifiMacQueue; //!< empty Wi-Fi MAC queue
 
 const WifiMacQueue::ConstIterator WifiMacQueue::EMPTY = g_emptyWifiMacQueue.end ();
 
@@ -92,8 +95,6 @@
 bool
 WifiMacQueue::TtlExceeded (ConstIterator &it)
 {
-  NS_LOG_FUNCTION (this);
-
   if (Simulator::Now () > (*it)->GetTimeStamp () + m_maxDelay)
     {
       NS_LOG_DEBUG ("Removing packet that stayed in the queue for too long (" <<
@@ -154,7 +155,16 @@
   if (m_dropPolicy == DROP_OLDEST)
     {
       NS_LOG_DEBUG ("Remove the oldest item in the queue");
-      DoRemove (begin ());
+      if (pos == begin ())
+        {
+          // Avoid invalidating pos
+          DoRemove (begin ());
+          pos = begin ();
+        }
+      else
+        {
+          DoRemove (begin ());
+        }
     }
 
   return DoEnqueue (pos, item);
@@ -558,4 +568,104 @@
   return QueueBase::GetNBytes ();
 }
 
+uint32_t
+WifiMacQueue::GetNPackets (uint8_t tid, Mac48Address dest) const
+{
+  WifiAddressTidPair addressTidPair (dest, tid);
+  auto it = m_nQueuedPackets.find (addressTidPair);
+  if (it == m_nQueuedPackets.end ())
+    {
+      return 0;
+    }
+  return m_nQueuedPackets.at (addressTidPair);
+}
+
+uint32_t
+WifiMacQueue::GetNBytes (uint8_t tid, Mac48Address dest) const
+{
+  WifiAddressTidPair addressTidPair (dest, tid);
+  auto it = m_nQueuedBytes.find (addressTidPair);
+  if (it == m_nQueuedBytes.end ())
+    {
+      return 0;
+    }
+  return m_nQueuedBytes.at (addressTidPair);
+}
+
+bool
+WifiMacQueue::DoEnqueue (ConstIterator pos, Ptr<WifiMacQueueItem> item)
+{
+  Iterator ret;
+  if (Queue<WifiMacQueueItem>::DoEnqueue (pos, item, ret))
+    {
+      // update statistics about queued packets
+      if (item->GetHeader ().IsQosData ())
+        {
+          WifiAddressTidPair addressTidPair (item->GetHeader ().GetAddr1 (), item->GetHeader ().GetQosTid ());
+          auto it = m_nQueuedPackets.find (addressTidPair);
+          if (it == m_nQueuedPackets.end ())
+            {
+              m_nQueuedPackets[addressTidPair] = 0;
+              m_nQueuedBytes[addressTidPair] = 0;
+            }
+          m_nQueuedPackets[addressTidPair]++;
+          m_nQueuedBytes[addressTidPair] += item->GetSize ();
+        }
+      // set item's information about its position in the queue
+      item->m_queueIts = {{this, ret}};
+      return true;
+    }
+  return false;
+}
+
+Ptr<WifiMacQueueItem>
+WifiMacQueue::DoDequeue (ConstIterator pos)
+{
+  Ptr<WifiMacQueueItem> item = Queue<WifiMacQueueItem>::DoDequeue (pos);
+
+  if (item != 0 && item->GetHeader ().IsQosData ())
+    {
+      WifiAddressTidPair addressTidPair (item->GetHeader ().GetAddr1 (), item->GetHeader ().GetQosTid ());
+      NS_ASSERT (m_nQueuedPackets.find (addressTidPair) != m_nQueuedPackets.end ());
+      NS_ASSERT (m_nQueuedPackets[addressTidPair] >= 1);
+      NS_ASSERT (m_nQueuedBytes[addressTidPair] >= item->GetSize ());
+
+      m_nQueuedPackets[addressTidPair]--;
+      m_nQueuedBytes[addressTidPair] -= item->GetSize ();
+    }
+
+  if (item != 0)
+    {
+      NS_ASSERT (item->m_queueIts.size () == 1);
+      item->m_queueIts.clear ();
+    }
+
+  return item;
+}
+
+Ptr<WifiMacQueueItem>
+WifiMacQueue::DoRemove (ConstIterator pos)
+{
+  Ptr<WifiMacQueueItem> item = Queue<WifiMacQueueItem>::DoRemove (pos);
+
+  if (item != 0 && item->GetHeader ().IsQosData ())
+    {
+      WifiAddressTidPair addressTidPair (item->GetHeader ().GetAddr1 (), item->GetHeader ().GetQosTid ());
+      NS_ASSERT (m_nQueuedPackets.find (addressTidPair) != m_nQueuedPackets.end ());
+      NS_ASSERT (m_nQueuedPackets[addressTidPair] >= 1);
+      NS_ASSERT (m_nQueuedBytes[addressTidPair] >= item->GetSize ());
+
+      m_nQueuedPackets[addressTidPair]--;
+      m_nQueuedBytes[addressTidPair] -= item->GetSize ();
+    }
+
+  if (item != 0)
+    {
+      NS_ASSERT (item->m_queueIts.size () == 1);
+      item->m_queueIts.clear ();
+    }
+
+  return item;
+}
+
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-mac-queue.h ns-3.34/src/wifi/model/wifi-mac-queue.h
--- ns-3.33/src/wifi/model/wifi-mac-queue.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-mac-queue.h	2021-07-14 10:31:07.000000000 -0700
@@ -26,6 +26,8 @@
 
 #include "wifi-mac-queue-item.h"
 #include "ns3/queue.h"
+#include <unordered_map>
+#include "qos-utils.h"
 
 namespace ns3 {
 
@@ -97,7 +99,7 @@
    * \param item the Wifi MAC queue item to be enqueued at the end
    * \return true if success, false if the packet has been dropped
    */
-  bool Enqueue (Ptr<WifiMacQueueItem> item);
+  bool Enqueue (Ptr<WifiMacQueueItem> item) override;
   /**
    * Enqueue the given Wifi MAC queue item at the <i>front</i> of the queue.
    *
@@ -118,7 +120,7 @@
    *
    * \return the packet
    */
-  Ptr<WifiMacQueueItem> Dequeue (void);
+  Ptr<WifiMacQueueItem> Dequeue (void) override;
   /**
    * Search and return, if present in the queue, the first packet (either Data
    * frame or QoS Data frame) having the receiver address equal to <i>addr</i>.
@@ -180,7 +182,7 @@
    *
    * \return the packet
    */
-  Ptr<const WifiMacQueueItem> Peek (void) const;
+  Ptr<const WifiMacQueueItem> Peek (void) const override;
   /**
    * Search and return, if present in the queue, the first packet (either Data
    * frame or QoS Data frame) having the receiver address equal to <i>addr</i>.
@@ -236,7 +238,7 @@
    *
    * \return the packet
    */
-  Ptr<WifiMacQueueItem> Remove (void);
+  Ptr<WifiMacQueueItem> Remove (void) override;
   /**
    * If exists, removes <i>packet</i> from queue and returns true. Otherwise it
    * takes no effects and return false. Deletion of the packet is
@@ -260,7 +262,7 @@
   ConstIterator Remove (ConstIterator pos, bool removeExpired = false);
   /**
    * Return the number of packets having destination address specified by
-   * <i>dest</i>.
+   * <i>dest</i>. The complexity is linear in the size of the queue.
    *
    * \param dest the given destination
    *
@@ -269,7 +271,8 @@
   uint32_t GetNPacketsByAddress (Mac48Address dest);
   /**
    * Return the number of QoS packets having TID equal to <i>tid</i> and
-   * destination address equal to <i>dest</i>.
+   * destination address equal to <i>dest</i>.  The complexity is linear in
+   * the size of the queue.
    *
    * \param tid the given TID
    * \param dest the given destination
@@ -279,6 +282,31 @@
   uint32_t GetNPacketsByTidAndAddress (uint8_t tid, Mac48Address dest);
 
   /**
+   * Return the number of QoS packets in the queue having tid equal to <i>tid</i>
+   * and destination address equal to <i>dest</i>. The complexity in the average
+   * case is constant. However, packets expired since the last non-const
+   * operation on the queue are included in the returned count.
+   *
+   * \param tid the given TID
+   * \param dest the given destination
+   *
+   * \return the number of QoS packets in the queue
+   */
+  uint32_t GetNPackets (uint8_t tid, Mac48Address dest) const;
+  /**
+   * Return the number of bytes in the queue having tid equal to <i>tid</i> and
+   * destination address equal to <i>dest</i>. The complexity in the average
+   * case is constant. However, packets expired since the last non-const
+   * operation on the queue are included in the returned count.
+   *
+   * \param tid the given TID
+   * \param dest the given destination
+   *
+   * \return the number of bytes in the queue
+   */
+  uint32_t GetNBytes (uint8_t tid, Mac48Address dest) const;
+
+  /**
    * \return true if the queue is empty; false otherwise
    *
    * Overrides the IsEmpty method provided by QueueBase
@@ -312,11 +340,44 @@
    * \return true if the item is removed, false otherwise
    */
   bool TtlExceeded (ConstIterator &it);
+  /**
+   * Wrapper for the DoEnqueue method provided by the base class that additionally
+   * sets the iterator field of the item and updates internal statistics, if
+   * insertion succeeded.
+   *
+   * \param pos the position before where the item will be inserted
+   * \param item the item to enqueue
+   * \return true if success, false if the packet has been dropped.
+   */
+  bool DoEnqueue (ConstIterator pos, Ptr<WifiMacQueueItem> item);
+  /**
+   * Wrapper for the DoDequeue method provided by the base class that additionally
+   * resets the iterator field of the item and updates internal statistics, if
+   * an item was dequeued.
+   *
+   * \param pos the position of the item to dequeue
+   * \return the item.
+   */
+  Ptr<WifiMacQueueItem> DoDequeue (ConstIterator pos);
+  /**
+   * Wrapper for the DoRemove method provided by the base class that additionally
+   * resets the iterator field of the item and updates internal statistics, if
+   * an item was dropped.
+   *
+   * \param pos the position of the item to drop
+   * \return the item.
+   */
+  Ptr<WifiMacQueueItem> DoRemove (ConstIterator pos);
 
   Time m_maxDelay;                          //!< Time to live for packets in the queue
   DropPolicy m_dropPolicy;                  //!< Drop behavior of queue
   mutable bool m_expiredPacketsPresent;     //!< True if expired packets are in the queue
 
+  /// Per (MAC address, TID) pair queued packets
+  std::unordered_map<WifiAddressTidPair, uint32_t, WifiAddressTidHash> m_nQueuedPackets;
+  /// Per (MAC address, TID) pair queued bytes
+  std::unordered_map<WifiAddressTidPair, uint32_t, WifiAddressTidHash> m_nQueuedBytes;
+
   /// Traced callback: fired when a packet is dropped due to lifetime expiration
   TracedCallback<Ptr<const WifiMacQueueItem> > m_traceExpired;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-mac-queue-item.cc ns-3.34/src/wifi/model/wifi-mac-queue-item.cc
--- ns-3.33/src/wifi/model/wifi-mac-queue-item.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-mac-queue-item.cc	2021-07-14 10:31:07.000000000 -0700
@@ -27,6 +27,7 @@
 #include "wifi-mac-queue-item.h"
 #include "wifi-mac-trailer.h"
 #include "wifi-utils.h"
+#include "msdu-aggregator.h"
 
 namespace ns3 {
 
@@ -83,9 +84,21 @@
 }
 
 uint32_t
+WifiMacQueueItem::GetPacketSize (void) const
+{
+  return m_packet->GetSize ();
+}
+
+uint32_t
 WifiMacQueueItem::GetSize (void) const
 {
-  return m_packet->GetSize () + m_header.GetSerializedSize () + WIFI_MAC_FCS_LENGTH;
+  return GetPacketSize () + m_header.GetSerializedSize () + WIFI_MAC_FCS_LENGTH;
+}
+
+bool
+WifiMacQueueItem::IsFragment (void) const
+{
+  return m_header.IsMoreFragments () || m_header.GetFragmentNumber () > 0;
 }
 
 Ptr<Packet>
@@ -110,6 +123,7 @@
       // An MSDU is going to be aggregated to this MPDU, hence this has to be an A-MSDU now
       Ptr<const WifiMacQueueItem> firstMsdu = Create<const WifiMacQueueItem> (*this);
       m_packet = Create<Packet> ();
+      m_queueIts.clear ();
       DoAggregate (firstMsdu);
 
       m_header.SetQosAmsdu ();
@@ -156,6 +170,7 @@
   hdr.SetLength (static_cast<uint16_t> (msdu->GetPacket ()->GetSize ()));
 
   m_msduList.push_back ({msdu->GetPacket (), hdr});
+  m_queueIts.insert (m_queueIts.end (), msdu->m_queueIts.begin (), msdu->m_queueIts.end ());
 
   // build the A-MSDU
   NS_ASSERT (m_packet);
@@ -186,14 +201,25 @@
   m_tstamp = Max (m_tstamp, msdu->GetTimeStamp ());
 }
 
+bool
+WifiMacQueueItem::IsQueued (void) const
+{
+  return !m_queueIts.empty ();
+}
+
+const std::list<WifiMacQueueItem::QueueIteratorPair>&
+WifiMacQueueItem::GetQueueIteratorPairs (void) const
+{
+  return m_queueIts;
+}
 
-MsduAggregator::DeaggregatedMsdusCI
+WifiMacQueueItem::DeaggregatedMsdusCI
 WifiMacQueueItem::begin (void)
 {
   return m_msduList.begin ();
 }
 
-MsduAggregator::DeaggregatedMsdusCI
+WifiMacQueueItem::DeaggregatedMsdusCI
 WifiMacQueueItem::end (void)
 {
   return m_msduList.end ();
@@ -202,9 +228,11 @@
 void
 WifiMacQueueItem::Print (std::ostream& os) const
 {
-  os << "size=" << m_packet->GetSize ()
+  os << m_header.GetTypeString ()
+     << ", payloadSize=" << GetPacketSize ()
      << ", to=" << m_header.GetAddr1 ()
      << ", seqN=" << m_header.GetSequenceNumber ()
+     << ", duration/ID=" << m_header.GetDuration ()
      << ", lifetime=" << (Simulator::Now () - m_tstamp).As (Time::US);
   if (m_header.IsQosData ())
     {
@@ -222,6 +250,7 @@
           os << ", ack=BlockAck";
         }
     }
+  os << ", packet=" << m_packet;
 }
 
 std::ostream & operator << (std::ostream &os, const WifiMacQueueItem &item)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-mac-queue-item.h ns-3.34/src/wifi/model/wifi-mac-queue-item.h
--- ns-3.33/src/wifi/model/wifi-mac-queue-item.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-mac-queue-item.h	2021-07-14 10:31:07.000000000 -0700
@@ -26,13 +26,14 @@
 
 #include "ns3/nstime.h"
 #include "wifi-mac-header.h"
-#include "msdu-aggregator.h"
 #include "amsdu-subframe-header.h"
+#include <list>
 
 namespace ns3 {
 
 class QosBlockedDestinations;
 class Packet;
+class WifiMacQueue;
 
 /**
  * \ingroup wifi
@@ -99,6 +100,21 @@
   uint32_t GetSize (void) const;
 
   /**
+   * \brief Return the size in bytes of the packet or control header or management
+   *        header stored by this item.
+   *
+   * \return the size in bytes of the packet or control header or management header
+   *         stored by this item
+   */
+  uint32_t GetPacketSize (void) const;
+
+  /**
+   * Return true if this item contains an MSDU fragment, false otherwise
+   * \return true if this item contains an MSDU fragment, false otherwise
+   */
+  bool IsFragment (void) const;
+
+  /**
    * \brief Aggregate the MSDU contained in the given MPDU to this MPDU (thus
    *        constituting an A-MSDU). Note that the given MPDU cannot contain
    *        an A-MSDU.
@@ -106,18 +122,49 @@
    */
   void Aggregate (Ptr<const WifiMacQueueItem> msdu);
 
+  /// DeaggregatedMsdus typedef
+  typedef std::list<std::pair<Ptr<const Packet>, AmsduSubframeHeader> > DeaggregatedMsdus;
+  /// DeaggregatedMsdusCI typedef
+  typedef std::list<std::pair<Ptr<const Packet>, AmsduSubframeHeader> >::const_iterator DeaggregatedMsdusCI;
+
   /**
    * \brief Get a constant iterator pointing to the first MSDU in the list of aggregated MSDUs.
    *
    * \return a constant iterator pointing to the first MSDU in the list of aggregated MSDUs
    */
-  MsduAggregator::DeaggregatedMsdusCI begin (void);
+  DeaggregatedMsdusCI begin (void);
   /**
    * \brief Get a constant iterator indicating past-the-last MSDU in the list of aggregated MSDUs.
    *
    * \return a constant iterator indicating past-the-last MSDU in the list of aggregated MSDUs
    */
-  MsduAggregator::DeaggregatedMsdusCI end (void);
+  DeaggregatedMsdusCI end (void);
+
+  /// Const iterator typedef
+  typedef std::list<Ptr<WifiMacQueueItem>>::const_iterator ConstIterator;
+  /// Information needed to remove an MSDU from the queue
+  struct QueueIteratorPair
+  {
+    WifiMacQueue* queue;  //!< pointer to the queue where the MSDU is enqueued
+    ConstIterator it;     //!< iterator pointing to the MSDU in the queue
+  };
+
+  /**
+   * Return true if this item is stored in some queue, false otherwise.
+   *
+   * \return true if this item is stored in some queue, false otherwise
+   */
+  bool IsQueued (void) const;
+
+  /**
+   * Get a const reference to the list of iterators pointing to the positions
+   * of the items in the queue. The list is empty if the item is not stored in
+   * a queue. The list contains multiple iterators in case of A-MSDU that is not
+   * stored in the Block Ack Manager retransmit queue.
+   *
+   * \return the list of iterators pointing to the positions of the items in the queue
+   */
+  const std::list<QueueIteratorPair>& GetQueueIteratorPairs (void) const;
 
   /**
    * \brief Get the MAC protocol data unit (MPDU) corresponding to this item
@@ -142,10 +189,13 @@
    */
   void DoAggregate (Ptr<const WifiMacQueueItem> msdu);
 
+  friend class WifiMacQueue;  // to set QueueIteratorPair information
+
   Ptr<const Packet> m_packet;                   //!< The packet (MSDU or A-MSDU) contained in this queue item
   WifiMacHeader m_header;                       //!< Wifi MAC header associated with the packet
   Time m_tstamp;                                //!< timestamp when the packet arrived at the queue
-  MsduAggregator::DeaggregatedMsdus m_msduList; //!< The list of aggregated MSDUs included in this MPDU
+  DeaggregatedMsdus m_msduList;                 //!< The list of aggregated MSDUs included in this MPDU
+  std::list<QueueIteratorPair> m_queueIts;      //!< Queue iterators pointing to this MSDU(s), if queued
 };
 
 /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-mode.cc ns-3.34/src/wifi/model/wifi-mode.cc
--- ns-3.33/src/wifi/model/wifi-mode.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-mode.cc	2021-07-14 10:31:07.000000000 -0700
@@ -23,7 +23,7 @@
 #include "ns3/log.h"
 #include "wifi-mode.h"
 #include "wifi-tx-vector.h"
-#include "he-ru.h"
+#include "ns3/he-ru.h"
 
 namespace ns3 {
 
@@ -32,6 +32,11 @@
   return a.GetUid () == b.GetUid ();
 }
 
+bool operator != (const WifiMode &a, const WifiMode &b)
+{
+  return a.GetUid () != b.GetUid ();
+}
+
 bool operator < (const WifiMode &a, const WifiMode &b)
 {
   return a.GetUid () < b.GetUid ();
@@ -55,53 +60,27 @@
 WifiMode::IsAllowed (uint16_t channelWidth, uint8_t nss) const
 {
   WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  if (item->modClass == WIFI_MOD_CLASS_VHT)
-    {
-      if (item->mcsValue == 9 && channelWidth == 20 && nss != 3)
-        {
-          return false;
-        }
-      if (item->mcsValue == 6 && channelWidth == 80 && nss == 3)
-        {
-          return false;
-        }
-    }
-  return true;
+  return item->IsModeAllowedCallback (channelWidth, nss);
+}
+
+uint64_t
+WifiMode::GetPhyRate (uint16_t channelWidth) const
+{
+  return GetPhyRate (channelWidth, 800, 1);
 }
 
 uint64_t
 WifiMode::GetPhyRate (uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
 {
-  //TODO: nss > 4 not supported yet
-  NS_ASSERT (nss <= 4);
-  uint64_t dataRate, phyRate;
-  dataRate = GetDataRate (channelWidth, guardInterval, nss);
-  switch (GetCodeRate ())
-    {
-    case WIFI_CODE_RATE_5_6:
-      phyRate = dataRate * 6 / 5;
-      break;
-    case WIFI_CODE_RATE_3_4:
-      phyRate = dataRate * 4 / 3;
-      break;
-    case WIFI_CODE_RATE_2_3:
-      phyRate = dataRate * 3 / 2;
-      break;
-    case WIFI_CODE_RATE_1_2:
-      phyRate = dataRate * 2 / 1;
-      break;
-    case WIFI_CODE_RATE_UNDEFINED:
-    default:
-      phyRate = dataRate;
-      break;
-    }
-  return phyRate;
+  WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
+  return item->GetPhyRateCallback (channelWidth, guardInterval, nss);
 }
 
 uint64_t
-WifiMode::GetPhyRate (WifiTxVector txVector) const
+WifiMode::GetPhyRate (const WifiTxVector& txVector, uint16_t staId) const
 {
-  return GetPhyRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), txVector.GetNss ());
+  WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
+  return item->GetPhyRateFromTxVectorCallback (txVector, staId);
 }
 
 uint64_t
@@ -111,332 +90,32 @@
 }
 
 uint64_t
-WifiMode::GetDataRate (WifiTxVector txVector, uint16_t staId) const
+WifiMode::GetDataRate (const WifiTxVector& txVector, uint16_t staId) const
 {
-  uint16_t bw = txVector.GetChannelWidth ();
-  uint8_t nss = txVector.GetNss (staId);
-  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU
-      || txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB)
-    {
-      bw = HeRu::GetBandwidth (txVector.GetRu (staId).ruType);
-    }
-  return GetDataRate (bw, txVector.GetGuardInterval (), nss);
+  WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
+  return item->GetDataRateFromTxVectorCallback (txVector, staId);
 }
 
 uint64_t
 WifiMode::GetDataRate (uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
 {
-  //TODO: nss > 4 not supported yet
-  NS_ASSERT (nss <= 4);
+  NS_ASSERT (nss <= 8);
   WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  uint64_t dataRate = 0;
-  uint16_t usableSubCarriers = 0;
-  double symbolRate = 0;
-  double codingRate = 0;
-  uint16_t numberOfBitsPerSubcarrier = static_cast<uint16_t> (log2 (GetConstellationSize ()));
-  if (item->modClass == WIFI_MOD_CLASS_DSSS)
-    {
-      dataRate = ((11000000 / 11) * numberOfBitsPerSubcarrier);
-    }
-  else if (item->modClass == WIFI_MOD_CLASS_HR_DSSS)
-    {
-      dataRate = ((11000000 / 8) * numberOfBitsPerSubcarrier);
-    }
-  else if (item->modClass == WIFI_MOD_CLASS_OFDM || item->modClass == WIFI_MOD_CLASS_ERP_OFDM)
-    {
-      usableSubCarriers = 48;
-      switch (channelWidth)
-        {
-        case 20:
-        default:
-          symbolRate = (1 / 4.0) * 1e6;
-          break;
-        case 10:
-          symbolRate = (1 / 8.0) * 1e6;
-          break;
-        case 5:
-          symbolRate = (1 / 16.0) * 1e6;
-          break;
-        }
-
-      switch (GetCodeRate ())
-        {
-        case WIFI_CODE_RATE_3_4:
-          codingRate = (3.0 / 4.0);
-          break;
-        case WIFI_CODE_RATE_2_3:
-          codingRate = (2.0 / 3.0);
-          break;
-        case WIFI_CODE_RATE_1_2:
-          codingRate = (1.0 / 2.0);
-          break;
-        case WIFI_CODE_RATE_UNDEFINED:
-        default:
-          NS_FATAL_ERROR ("trying to get datarate for a mcs without any coding rate defined");
-          break;
-        }
-
-      dataRate = lrint (ceil (symbolRate * usableSubCarriers * numberOfBitsPerSubcarrier * codingRate));
-    }
-  else if (item->modClass == WIFI_MOD_CLASS_HT || item->modClass == WIFI_MOD_CLASS_VHT)
-    {
-      if (item->modClass == WIFI_MOD_CLASS_VHT)
-        {
-          NS_ASSERT_MSG (IsAllowed (channelWidth, nss), "VHT MCS " << +item->mcsValue << " forbidden at " << channelWidth << " MHz when NSS is " << +nss);
-        }
-
-      NS_ASSERT (guardInterval == 800 || guardInterval == 400);
-      symbolRate = (1 / (3.2 + (static_cast<double> (guardInterval) / 1000))) * 1e6;
-
-      if (item->modClass == WIFI_MOD_CLASS_HT)
-        {
-          switch (channelWidth)
-            {
-            case 20:
-            default:
-              usableSubCarriers = 52;
-              break;
-            case 40:
-            case 80:
-            case 160:
-              usableSubCarriers = 108;
-              break;
-            }
-        }
-      else //WIFI_MOD_CLASS_VHT
-        {
-          switch (channelWidth)
-            {
-            case 20:
-            default:
-              usableSubCarriers = 52;
-              break;
-            case 40:
-              usableSubCarriers = 108;
-              break;
-            case 80:
-              usableSubCarriers = 234;
-              break;
-            case 160:
-              usableSubCarriers = 468;
-              break;
-            }
-        }
-
-      switch (GetCodeRate ())
-        {
-        case WIFI_CODE_RATE_5_6:
-          codingRate = (5.0 / 6.0);
-          break;
-        case WIFI_CODE_RATE_3_4:
-          codingRate = (3.0 / 4.0);
-          break;
-        case WIFI_CODE_RATE_2_3:
-          codingRate = (2.0 / 3.0);
-          break;
-        case WIFI_CODE_RATE_1_2:
-          codingRate = (1.0 / 2.0);
-          break;
-        case WIFI_CODE_RATE_UNDEFINED:
-        default:
-          NS_FATAL_ERROR ("trying to get datarate for a mcs without any coding rate defined with nss: " << +nss);
-          break;
-        }
-
-      dataRate = lrint (ceil (symbolRate * usableSubCarriers * numberOfBitsPerSubcarrier * codingRate));
-    }
-  else if (item->modClass == WIFI_MOD_CLASS_HE)
-    {
-      NS_ASSERT (guardInterval == 800 || guardInterval == 1600 || guardInterval == 3200);
-      symbolRate = (1 / (12.8 + (static_cast<double> (guardInterval) / 1000))) * 1e6;
-
-      switch (channelWidth)
-        {
-        case 2: //26-tone RU
-          usableSubCarriers = 24;
-          break;
-        case 4: //52-tone RU
-          usableSubCarriers = 48;
-          break;
-        case 8: //106-tone RU
-          usableSubCarriers = 102;
-          break;
-        case 20:
-        default:
-          usableSubCarriers = 234;
-          break;
-        case 40:
-          usableSubCarriers = 468;
-          break;
-        case 80:
-          usableSubCarriers = 980;
-          break;
-        case 160:
-          usableSubCarriers = 1960;
-          break;
-        }
-
-      switch (GetCodeRate ())
-        {
-        case WIFI_CODE_RATE_5_6:
-          codingRate = (5.0 / 6.0);
-          break;
-        case WIFI_CODE_RATE_3_4:
-          codingRate = (3.0 / 4.0);
-          break;
-        case WIFI_CODE_RATE_2_3:
-          codingRate = (2.0 / 3.0);
-          break;
-        case WIFI_CODE_RATE_1_2:
-          codingRate = (1.0 / 2.0);
-          break;
-        case WIFI_CODE_RATE_UNDEFINED:
-        default:
-          NS_FATAL_ERROR ("trying to get datarate for a mcs without any coding rate defined with nss: " << +nss);
-          break;
-        }
-
-      dataRate = lrint (ceil (symbolRate * usableSubCarriers * numberOfBitsPerSubcarrier * codingRate));
-    }
-  else
-    {
-      NS_ASSERT ("undefined datarate for the modulation class!");
-    }
-  dataRate *= nss; // number of spatial streams
-  return dataRate;
+  return item->GetDataRateCallback (channelWidth, guardInterval, nss);
 }
 
 WifiCodeRate
 WifiMode::GetCodeRate (void) const
 {
   WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  if (item->modClass == WIFI_MOD_CLASS_HT)
-    {
-      switch (item->mcsValue % 8)
-        {
-        case 0:
-        case 1:
-        case 3:
-          return WIFI_CODE_RATE_1_2;
-        case 2:
-        case 4:
-        case 6:
-          return WIFI_CODE_RATE_3_4;
-        case 5:
-          return WIFI_CODE_RATE_2_3;
-        case 7:
-          return WIFI_CODE_RATE_5_6;
-        default:
-          return WIFI_CODE_RATE_UNDEFINED;
-        }
-    }
-  else if (item->modClass == WIFI_MOD_CLASS_VHT)
-    {
-      switch (item->mcsValue)
-        {
-        case 0:
-        case 1:
-        case 3:
-          return WIFI_CODE_RATE_1_2;
-        case 2:
-        case 4:
-        case 6:
-        case 8:
-          return WIFI_CODE_RATE_3_4;
-        case 5:
-          return WIFI_CODE_RATE_2_3;
-        case 7:
-        case 9:
-          return WIFI_CODE_RATE_5_6;
-        default:
-          return WIFI_CODE_RATE_UNDEFINED;
-        }
-    }
-  else if (item->modClass == WIFI_MOD_CLASS_HE)
-    {
-      switch (item->mcsValue)
-        {
-        case 0:
-        case 1:
-        case 3:
-          return WIFI_CODE_RATE_1_2;
-        case 2:
-        case 4:
-        case 6:
-        case 8:
-        case 10:
-          return WIFI_CODE_RATE_3_4;
-        case 5:
-          return WIFI_CODE_RATE_2_3;
-        case 7:
-        case 9:
-        case 11:
-          return WIFI_CODE_RATE_5_6;
-        default:
-          return WIFI_CODE_RATE_UNDEFINED;
-        }
-    }
-  else
-    {
-      return item->codingRate;
-    }
+  return item->GetCodeRateCallback ();
 }
 
 uint16_t
 WifiMode::GetConstellationSize (void) const
 {
   WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  if (item->modClass == WIFI_MOD_CLASS_HT)
-    {
-      switch (item->mcsValue % 8)
-        {
-        case 0:
-          return 2;
-        case 1:
-        case 2:
-          return 4;
-        case 3:
-        case 4:
-          return 16;
-        case 5:
-        case 6:
-        case 7:
-          return 64;
-        default:
-          return 0;
-        }
-    }
-  else if (item->modClass == WIFI_MOD_CLASS_VHT || item->modClass == WIFI_MOD_CLASS_HE)
-    {
-      switch (item->mcsValue)
-        {
-        case 0:
-          return 2;
-        case 1:
-        case 2:
-          return 4;
-        case 3:
-        case 4:
-          return 16;
-        case 5:
-        case 6:
-        case 7:
-          return 64;
-        case 8:
-        case 9:
-          return 256;
-        case 10:
-        case 11:
-          NS_ASSERT (item->modClass != WIFI_MOD_CLASS_VHT);
-          return 1024;
-        default:
-          return 0;
-        }
-    }
-  else
-    {
-      return item->constellationSize;
-    }
+  return item->GetConstellationSizeCallback ();
 }
 
 std::string
@@ -486,167 +165,56 @@
 uint64_t
 WifiMode::GetNonHtReferenceRate (void) const
 {
-  uint64_t dataRate;
   WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  if (item->modClass >= WIFI_MOD_CLASS_HT)
-    {
-      WifiCodeRate codeRate = GetCodeRate ();
-      switch (GetConstellationSize ())
-        {
-        case 2:
-          if (codeRate == WIFI_CODE_RATE_1_2)
-            {
-              dataRate = 6000000;
-            }
-          else if (codeRate == WIFI_CODE_RATE_3_4)
-            {
-              dataRate = 9000000;
-            }
-          else
-            {
-              NS_FATAL_ERROR ("Trying to get reference rate for a MCS with wrong combination of coding rate and modulation");
-            }
-          break;
-        case 4:
-          if (codeRate == WIFI_CODE_RATE_1_2)
-            {
-              dataRate = 12000000;
-            }
-          else if (codeRate == WIFI_CODE_RATE_3_4)
-            {
-              dataRate = 18000000;
-            }
-          else
-            {
-              NS_FATAL_ERROR ("Trying to get reference rate for a MCS with wrong combination of coding rate and modulation");
-            }
-          break;
-        case 16:
-          if (codeRate == WIFI_CODE_RATE_1_2)
-            {
-              dataRate = 24000000;
-            }
-          else if (codeRate == WIFI_CODE_RATE_3_4)
-            {
-              dataRate = 36000000;
-            }
-          else
-            {
-              NS_FATAL_ERROR ("Trying to get reference rate for a MCS with wrong combination of coding rate and modulation");
-            }
-          break;
-        case 64:
-          if (codeRate == WIFI_CODE_RATE_1_2 || codeRate == WIFI_CODE_RATE_2_3)
-            {
-              dataRate = 48000000;
-            }
-          else if (codeRate == WIFI_CODE_RATE_3_4 || codeRate == WIFI_CODE_RATE_5_6)
-            {
-              dataRate = 54000000;
-            }
-          else
-            {
-              NS_FATAL_ERROR ("Trying to get reference rate for a MCS with wrong combination of coding rate and modulation");
-            }
-          break;
-        case 256:
-        case 1024:
-          if (codeRate == WIFI_CODE_RATE_3_4 || codeRate == WIFI_CODE_RATE_5_6)
-            {
-              dataRate = 54000000;
-            }
-          else
-            {
-              NS_FATAL_ERROR ("Trying to get reference rate for a MCS with wrong combination of coding rate and modulation");
-            }
-          break;
-        default:
-          NS_FATAL_ERROR ("Wrong constellation size");
-        }
-    }
-  else
-    {
-      NS_FATAL_ERROR ("Trying to get reference rate for a non-HT rate");
-    }
-  return dataRate;
+  NS_ASSERT_MSG (!item->GetNonHtReferenceRateCallback.IsNull (), "Trying to get HT reference rate for a non-HT rate");
+  return item->GetNonHtReferenceRateCallback ();
 }
 
 bool
 WifiMode::IsHigherCodeRate (WifiMode mode) const
 {
-  WifiCodeRate codeRate = mode.GetCodeRate ();
-  switch (GetCodeRate ())
-    {
-    case WIFI_CODE_RATE_1_2:
-      return false; //This is the smallest code rate.
-    case WIFI_CODE_RATE_2_3:
-      return (codeRate == WIFI_CODE_RATE_1_2);
-    case WIFI_CODE_RATE_3_4:
-      return (codeRate == WIFI_CODE_RATE_1_2 || codeRate == WIFI_CODE_RATE_2_3);
-    case WIFI_CODE_RATE_5_6:
-      return (codeRate == WIFI_CODE_RATE_1_2 || codeRate == WIFI_CODE_RATE_2_3 || codeRate == WIFI_CODE_RATE_3_4);
-    default:
-      NS_FATAL_ERROR ("Wifi Code Rate not defined");
-      return false;
-    }
+  NS_ASSERT_MSG (GetCodeRate () != WIFI_CODE_RATE_UNDEFINED, "Wifi Code Rate not defined");
+  return (GetCodeRate () > mode.GetCodeRate ());
 }
 
 bool
 WifiMode::IsHigherDataRate (WifiMode mode) const
 {
-  WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
-  switch (item->modClass)
+  // If current modulation class is DSSS and other is not, the other is always higher
+  if (GetModulationClass () == WIFI_MOD_CLASS_DSSS
+      && mode.GetModulationClass () != WIFI_MOD_CLASS_DSSS)
     {
-    case WIFI_MOD_CLASS_DSSS:
-      if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS)
-        {
-          return (GetConstellationSize () > mode.GetConstellationSize ());
-        }
-      else
-        {
-          return false;
-        }
-    case WIFI_MOD_CLASS_HR_DSSS:
-      if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS)
-        {
-          return true;
-        }
-      else
-        {
-          return (GetConstellationSize () > mode.GetConstellationSize ());
-        }
-    case WIFI_MOD_CLASS_ERP_OFDM:
-    case WIFI_MOD_CLASS_OFDM:
-    case WIFI_MOD_CLASS_HT:
-    case WIFI_MOD_CLASS_VHT:
-    case WIFI_MOD_CLASS_HE:
-      if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS)
-        {
-          return true;
-        }
-      else if (mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS)
-        {
-          return (mode.GetConstellationSize () > GetConstellationSize ());
-        }
-      else
-        {
-          if (GetConstellationSize () > mode.GetConstellationSize ())
-            {
-              return true;
-            }
-          else if (GetConstellationSize () == mode.GetConstellationSize ())
-            {
-              return IsHigherCodeRate (mode);
-            }
-          else
-            {
-              return false;
-            }
-        }
-    default:
-      NS_FATAL_ERROR ("Modulation class not defined");
       return false;
     }
+  // If other modulation class is DSSS and current is not, the current is always higher
+  else if (GetModulationClass () != WIFI_MOD_CLASS_DSSS
+           && mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS)
+    {
+      return true;
+    }
+  // If current is not HR/DSSS while other is not, check constellation size of other against current
+  else if (GetModulationClass () != WIFI_MOD_CLASS_HR_DSSS
+           && mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS)
+    {
+      return (mode.GetConstellationSize () > GetConstellationSize ());
+    }
+  // This block is for current and other mode > HR/DSSS, if constellation size
+  // is the same, check the code rate (DSSS and HR/DSSS does not define code rate)
+  else if (GetConstellationSize () == mode.GetConstellationSize ()
+           && GetCodeRate () != WIFI_CODE_RATE_UNDEFINED
+           && mode.GetCodeRate () != WIFI_CODE_RATE_UNDEFINED)
+    {
+      return IsHigherCodeRate (mode);
+    }
+  // Otherwise, check constellation size of current against other,
+  // the code go here if:
+  //   - both current and other mode is DSSS
+  //   - current mode is HR/DSSS and other mode is not HR/DSSS
+  //   - current and other mode > HR/DSSS and both constellation size is not equal
+  else
+    {
+      return (GetConstellationSize () > mode.GetConstellationSize ());
+    }
 }
 
 WifiMode::WifiMode ()
@@ -674,8 +242,13 @@
 WifiModeFactory::CreateWifiMode (std::string uniqueName,
                                  WifiModulationClass modClass,
                                  bool isMandatory,
-                                 WifiCodeRate codingRate,
-                                 uint16_t constellationSize)
+                                 CodeRateCallback codeRateCallback,
+                                 ConstellationSizeCallback constellationSizeCallback,
+                                 PhyRateCallback phyRateCallback,
+                                 PhyRateFromTxVectorCallback phyRateFromTxVectorCallback,
+                                 DataRateCallback dataRateCallback,
+                                 DataRateFromTxVectorCallback dataRateFromTxVectorCallback,
+                                 ModeAllowedCallback isModeAllowedCallback)
 {
   WifiModeFactory *factory = GetFactory ();
   uint32_t uid = factory->AllocateUid (uniqueName);
@@ -684,7 +257,6 @@
   item->modClass = modClass;
   //The modulation class for this WifiMode must be valid.
   NS_ASSERT (modClass != WIFI_MOD_CLASS_UNKNOWN);
-  item->codingRate = codingRate;
 
   //Check for compatibility between modulation class and coding
   //rate. If modulation class is DSSS then coding rate must be
@@ -692,14 +264,21 @@
   //assertion, but it seems better to always give the error (i.e.,
   //not only in non-optimised builds) and the cycles that extra test
   //here costs are only suffered at simulation setup.
-  if ((codingRate == WIFI_CODE_RATE_UNDEFINED) && modClass != WIFI_MOD_CLASS_DSSS && modClass != WIFI_MOD_CLASS_HR_DSSS)
+  if ((codeRateCallback () == WIFI_CODE_RATE_UNDEFINED) && modClass != WIFI_MOD_CLASS_DSSS && modClass != WIFI_MOD_CLASS_HR_DSSS)
     {
       NS_FATAL_ERROR ("Error in creation of WifiMode named " << uniqueName << std::endl
                                                              << "Code rate must be WIFI_CODE_RATE_UNDEFINED iff Modulation Class is WIFI_MOD_CLASS_DSSS or WIFI_MOD_CLASS_HR_DSSS");
     }
 
-  item->constellationSize = constellationSize;
   item->isMandatory = isMandatory;
+  item->GetCodeRateCallback = codeRateCallback;
+  item->GetConstellationSizeCallback = constellationSizeCallback;
+  item->GetPhyRateCallback = phyRateCallback;
+  item->GetPhyRateFromTxVectorCallback = phyRateFromTxVectorCallback;
+  item->GetDataRateCallback = dataRateCallback;
+  item->GetDataRateFromTxVectorCallback = dataRateFromTxVectorCallback;
+  item->GetNonHtReferenceRateCallback = MakeNullCallback<uint64_t> ();
+  item->IsModeAllowedCallback = isModeAllowedCallback;
 
   NS_ASSERT (modClass < WIFI_MOD_CLASS_HT);
   //fill unused MCS item with a dummy value
@@ -711,7 +290,15 @@
 WifiMode
 WifiModeFactory::CreateWifiMcs (std::string uniqueName,
                                 uint8_t mcsValue,
-                                WifiModulationClass modClass)
+                                WifiModulationClass modClass,
+                                CodeRateCallback codeRateCallback,
+                                ConstellationSizeCallback constellationSizeCallback,
+                                PhyRateCallback phyRateCallback,
+                                PhyRateFromTxVectorCallback phyRateFromTxVectorCallback,
+                                DataRateCallback dataRateCallback,
+                                DataRateFromTxVectorCallback dataRateFromTxVectorCallback,
+                                NonHtReferenceRateCallback nonHtReferenceRateCallback,
+                                ModeAllowedCallback isModeAllowedCallback)
 {
   WifiModeFactory *factory = GetFactory ();
   uint32_t uid = factory->AllocateUid (uniqueName);
@@ -722,9 +309,16 @@
   NS_ASSERT (modClass >= WIFI_MOD_CLASS_HT);
 
   item->mcsValue = mcsValue;
+  item->GetCodeRateCallback = codeRateCallback;
+  item->GetConstellationSizeCallback = constellationSizeCallback;
+  item->GetPhyRateCallback = phyRateCallback;
+  item->GetPhyRateFromTxVectorCallback = phyRateFromTxVectorCallback;
+  item->GetDataRateCallback = dataRateCallback;
+  item->GetDataRateFromTxVectorCallback = dataRateFromTxVectorCallback;
+  item->GetNonHtReferenceRateCallback = nonHtReferenceRateCallback;
+  item->IsModeAllowedCallback = isModeAllowedCallback;
+
   //fill unused items with dummy values
-  item->constellationSize = 0;
-  item->codingRate = WIFI_CODE_RATE_UNDEFINED;
   item->isMandatory = false;
 
   return WifiMode (uid);
@@ -801,10 +395,16 @@
       WifiModeItem *item = factory.Get (uid);
       item->uniqueUid = "Invalid-WifiMode";
       item->modClass = WIFI_MOD_CLASS_UNKNOWN;
-      item->constellationSize = 0;
-      item->codingRate = WIFI_CODE_RATE_UNDEFINED;
       item->isMandatory = false;
       item->mcsValue = 0;
+      item->GetCodeRateCallback = MakeNullCallback<WifiCodeRate> ();
+      item->GetConstellationSizeCallback = MakeNullCallback<uint16_t> ();
+      item->GetPhyRateCallback = MakeNullCallback<uint64_t, uint16_t, uint16_t, uint8_t> ();
+      item->GetPhyRateFromTxVectorCallback = MakeNullCallback<uint64_t, const WifiTxVector&, uint16_t> ();
+      item->GetDataRateCallback = MakeNullCallback<uint64_t, uint16_t, uint16_t, uint8_t> ();
+      item->GetDataRateFromTxVectorCallback = MakeNullCallback<uint64_t, const WifiTxVector&, uint16_t> ();
+      item->GetNonHtReferenceRateCallback = MakeNullCallback<uint64_t> ();
+      item->IsModeAllowedCallback = MakeNullCallback<bool, uint16_t, uint8_t> ();
       isFirstTime = false;
     }
   return &factory;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-mode.h ns-3.34/src/wifi/model/wifi-mode.h
--- ns-3.33/src/wifi/model/wifi-mode.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-mode.h	2021-07-14 10:31:07.000000000 -0700
@@ -22,8 +22,10 @@
 #ifndef WIFI_MODE_H
 #define WIFI_MODE_H
 
-#include <vector>
+#include "wifi-phy-common.h"
 #include "ns3/attribute-helper.h"
+#include "ns3/callback.h"
+#include <vector>
 
 namespace ns3 {
 
@@ -32,60 +34,6 @@
 class WifiTxVector;
 
 /**
- * This enumeration defines the modulation classes per
- * (Table 9-4 "Modulation classes"; IEEE 802.11-2012).
- */
-enum WifiModulationClass
-{
-  /** Modulation class unknown or unspecified. A WifiMode with this
-  WifiModulationClass has not been properly initialised. */
-  WIFI_MOD_CLASS_UNKNOWN = 0,
-  /** Infrared (IR) (Clause 16) */
-  WIFI_MOD_CLASS_IR,
-  /** Frequency-hopping spread spectrum (FHSS) PHY (Clause 14) */
-  WIFI_MOD_CLASS_FHSS,
-  /** DSSS PHY (Clause 15) */
-  WIFI_MOD_CLASS_DSSS,
-  /** HR/DSSS PHY (Clause 18) */
-  WIFI_MOD_CLASS_HR_DSSS,
-  /** ERP-PBCC PHY (19.6) */
-  WIFI_MOD_CLASS_ERP_PBCC,
-  /** DSSS-OFDM PHY (19.7) */
-  WIFI_MOD_CLASS_DSSS_OFDM,
-  /** ERP-OFDM PHY (19.5) */
-  WIFI_MOD_CLASS_ERP_OFDM,
-  /** OFDM PHY (Clause 17) */
-  WIFI_MOD_CLASS_OFDM,
-  /** HT PHY (Clause 20) */
-  WIFI_MOD_CLASS_HT,
-  /** VHT PHY (Clause 22) */
-  WIFI_MOD_CLASS_VHT,
-  /** HE PHY (Clause 26) */
-  WIFI_MOD_CLASS_HE
-};
-
-/**
- * This enumeration defines the various convolutional coding rates
- * used for the OFDM transmission modes in the IEEE 802.11
- * standard. DSSS (for example) rates which do not have an explicit
- * coding stage in their generation should have this parameter set to
- * WIFI_CODE_RATE_UNDEFINED.
- */
-enum WifiCodeRate
-{
-  /** No explicit coding (e.g., DSSS rates) */
-  WIFI_CODE_RATE_UNDEFINED,
-  /** Rate 3/4 */
-  WIFI_CODE_RATE_3_4,
-  /** Rate 2/3 */
-  WIFI_CODE_RATE_2_3,
-  /** Rate 1/2 */
-  WIFI_CODE_RATE_1_2,
-  /** Rate 5/6 */
-  WIFI_CODE_RATE_5_6
-};
-
-/**
  * \brief represent a single transmission mode
  * \ingroup wifi
  *
@@ -119,14 +67,21 @@
    */
   uint64_t GetPhyRate (uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const;
   /**
-   * \param txVector the WifiTxVector of the signal
+   * \param txVector the const WifiTxVector& of the signal
+   * \param staId the station ID for MU (unused if SU)
    *
    * \returns the physical bit rate of this signal in bps.
    *
    * If a transmission mode uses 1/2 FEC, and if its
    * data rate is 3.25Mbps, the PHY rate is 6.5Mbps
    */
-  uint64_t GetPhyRate (WifiTxVector txVector) const;
+  uint64_t GetPhyRate (const WifiTxVector& txVector, uint16_t staId = SU_STA_ID) const;
+  /**
+   * \param channelWidth the considered channel width in MHz
+   *
+   * \returns the physical bit rate of this non-HT signal.
+  */
+  uint64_t GetPhyRate (uint16_t channelWidth) const;
   /**
    *
    * \param channelWidth the considered channel width in MHz
@@ -137,16 +92,16 @@
    */
   uint64_t GetDataRate (uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const;
   /**
-   * \param txVector the WifiTxVector of the signal
+   * \param txVector the const WifiTxVector& of the signal
    * \param staId the station ID for MU (unused if SU)
    *
    * \returns the data bit rate of this signal.
    */
-  uint64_t GetDataRate (WifiTxVector txVector, uint16_t staId = SU_STA_ID) const;
+  uint64_t GetDataRate (const WifiTxVector& txVector, uint16_t staId = SU_STA_ID) const;
   /**
    * \param channelWidth the considered channel width in MHz
    *
-   * \returns the data bit rate of this non-HT or non-VHT signal.
+   * \returns the data bit rate of this non-HT.
   */
   uint64_t GetDataRate (uint16_t channelWidth) const;
 
@@ -246,6 +201,18 @@
  *         false otherwise
  */
 bool operator == (const WifiMode &a, const WifiMode &b);
+
+/**
+ * Check if the two WifiModes are different.
+ *
+ * \param a WifiMode
+ * \param b WifiMode
+ *
+ * \return true if the two WifiModes are different,
+ *         false otherwise
+ */
+bool operator != (const WifiMode &a, const WifiMode &b);
+
 /**
  * Compare two WifiModes
  *
@@ -256,6 +223,7 @@
  *         false otherwise
  */
 bool operator < (const WifiMode &a, const WifiMode &b);
+
 /**
  * Serialize WifiMode to ostream (human-readable).
  *
@@ -298,17 +266,96 @@
 class WifiModeFactory
 {
 public:
+  // Typedefs for callbacks used by WifiModeItem
+  /**
+   * Typedef for callback used to retrieve code rate of a WifiMode
+   * \return the code rate of the WifiMode.
+   */
+  typedef Callback<WifiCodeRate> CodeRateCallback;
+  /**
+   * Typedef for callback used to retrieve constellation size of a WifiMode
+   * \return the size of modulation constellation of the WifiMode.
+   */
+  typedef Callback<uint16_t> ConstellationSizeCallback;
+  /**
+   * Typedef for callback used to calculate PHY rate of a WifiMode
+   *
+   * \param channelWidth the channel width in MHz
+   * \param guardInterval the guard interval duration in nanoseconds
+   * \param nss the number of streams
+   * \return the physical bit rate of the signal in bps.
+   */
+  typedef Callback<uint64_t, uint16_t /* channelWidth */, uint16_t /* guardInterval */, uint8_t /* nss */> PhyRateCallback;
+  /**
+   * Typedef for callback used to calculate PHY rate of a WifiMode
+   * from a TXVECTOR. This is mostly useful in HE or later amendments.
+   * For the others it's a simple wrapper of \see PhyRateCallback.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the station ID
+   * \return the physical bit rate of the signal in bps.
+   */
+  typedef Callback<uint64_t, const WifiTxVector& /* txVector */, uint16_t /* staId */> PhyRateFromTxVectorCallback;
+  /**
+   * Typedef for callback used to calculate data rate of a WifiMode
+   *
+   * \param channelWidth the channel width in MHz
+   * \param guardInterval the guard interval duration in nanoseconds
+   * \param nss the number of streams
+   * \return the data rate of the signal in bps.
+   */
+  typedef Callback<uint64_t, uint16_t /* channelWidth */, uint16_t /* guardInterval */, uint8_t /* nss */> DataRateCallback;
+  /**
+   * Typedef for callback used to calculate data rate of a WifiMode
+   * from a TXVECTOR. This is mostly useful in HE or later amendments.
+   * For the others it's a simple wrapper of \see DataRateCallback.
+   *
+   * \param txVector the TXVECTOR used for the transmission
+   * \param staId the station ID
+   * \return the data rate of the signal in bps.
+   */
+  typedef Callback<uint64_t, const WifiTxVector& /* txVector */, uint16_t /* staId */> DataRateFromTxVectorCallback;
+  /**
+   * Typedef for callback used to calculate Non-HT Reference Rate of
+   * an MCS defined in HT or later amendment. For Non-HT modes (DSSS, OFDM,
+   * etc) this should be defined as null.
+   *
+   * \return the rate (in bps) of the non-HT Reference Rate.
+   */
+  typedef Callback<uint64_t> NonHtReferenceRateCallback;
+  /**
+   * Typedef for callback used to check whether the combination of <current
+   * WifiMode, channel width (in MHz), number of stream> is allowed
+   *
+   * \param channelWidth the channel width in MHz
+   * \param nss the number of streams
+   * \return true if combination of current WifiMode and supplied parameters is allowed.
+   */
+  typedef Callback<bool, uint16_t /* channelWidth */, uint8_t /* nss */> ModeAllowedCallback;
+
   /**
    * \param uniqueName the name of the associated WifiMode. This name
    *        must be unique across _all_ instances.
    * \param modClass the class of modulation
    * \param isMandatory true if this WifiMode is mandatory, false otherwise.
-   * \param codingRate if convolutional coding is used for this rate
-   *        then this parameter specifies the convolutional coding rate
-   *        used. If there is no explicit convolutional coding step (e.g.,
-   *        for DSSS rates) then the caller should set this parameter to
-   *        WIFI_CODE_RATE_UNCODED.
-   * \param constellationSize the order of the constellation used.
+   * \param codeRateCallback a callback function to retrieve coding rate of
+   *        this WifiMode. If convolutional coding is used for this rate
+   *        then the callback returns the convolutional coding rate used. If
+   *        there is no explicit convolutional coding step (e.g., for DSSS
+   *        rates) then the callback should returns WIFI_CODE_RATE_UNDEFINED.
+   * \param constellationSizeCallback a callback function that returns the
+   *        order of the constellation used.
+   * \param phyRateCallback a callback function to calculate the PHY rate (in
+   *        bps) of this WifiMode.
+   * \param phyRateFromTxVectorCallback a callback function to calculate the PHY rate
+   *        (in bps) of this WifiMode using a TXVECTOR as input.
+   * \param dataRateCallback a callback function to calculate the data rate
+   *        (in bps) of this WifiMode.
+   * \param dataRateFromTxVectorCallback a callback function to calculate the data rate
+   *        (in bps) of this WifiMode using a TXVECTOR as input.
+   * \param isModeAllowedCallback a callback function to check whether a
+   *        specific combination of this WifiMode, channel width (MHz), and
+   *        NSS are allowed.
    *
    * \return WifiMode
    *
@@ -317,22 +364,52 @@
   static WifiMode CreateWifiMode (std::string uniqueName,
                                   WifiModulationClass modClass,
                                   bool isMandatory,
-                                  WifiCodeRate codingRate,
-                                  uint16_t constellationSize);
+                                  CodeRateCallback codeRateCallback,
+                                  ConstellationSizeCallback constellationSizeCallback,
+                                  PhyRateCallback phyRateCallback,
+                                  PhyRateFromTxVectorCallback phyRateFromTxVectorCallback,
+                                  DataRateCallback dataRateCallback,
+                                  DataRateFromTxVectorCallback dataRateFromTxVectorCallback,
+                                  ModeAllowedCallback isModeAllowedCallback);
 
   /**
    * \param uniqueName the name of the associated WifiMode. This name
    *        must be unique across _all_ instances.
    * \param mcsValue the MCS value
    * \param modClass the class of modulation
+   * \param codeRateCallback a callback function that returns the coding rate
+   *        of this WifiMode.
+   * \param constellationSizeCallback a callback function that returns the size
+   *        of modulation constellation of this WifiMode.
+   * \param phyRateCallback a callback function to calculate the PHY rate (in
+   *        bps) of this WifiMode.
+   * \param phyRateFromTxVectorCallback a callback function to calculate the PHY rate
+   *        (in bps) of this WifiMode using a TXVECTOR as input.
+   * \param dataRateCallback a callback function to calculate the data rate (in
+   *        bps) of this WifiMode.
+   * \param dataRateFromTxVectorCallback a callback function to calculate the data rate
+   *        (in bps) of this WifiMode using a TXVECTOR as input.
+   * \param nonHtReferenceRateCallback a callback function to calculate the rate
+   *        (in bps) of the non-HT Reference Rate of this WifiMode.
+   * \param isModeAllowedCallback a callback function to calculate whether a
+   *        combination of <MCS index, channel width (MHz), number of spatial
+   *        stream> is allowed for this WifiMode.
    *
    * \return WifiMode
    *
-   * Create a HT WifiMode.
+   * Create a HT or later WifiMode.
    */
   static WifiMode CreateWifiMcs (std::string uniqueName,
                                  uint8_t mcsValue,
-                                 WifiModulationClass modClass);
+                                 WifiModulationClass modClass,
+                                 CodeRateCallback codeRateCallback,
+                                 ConstellationSizeCallback constellationSizeCallback,
+                                 PhyRateCallback phyRateCallback,
+                                 PhyRateFromTxVectorCallback phyRateFromTxVectorCallback,
+                                 DataRateCallback dataRateCallback,
+                                 DataRateFromTxVectorCallback dataRateFromTxVectorCallback,
+                                 NonHtReferenceRateCallback nonHtReferenceRateCallback,
+                                 ModeAllowedCallback isModeAllowedCallback);
 
 
 private:
@@ -355,12 +432,18 @@
    */
   struct WifiModeItem
   {
-    std::string uniqueUid; ///< unique UID
+    std::string uniqueUid;        ///< unique UID
     WifiModulationClass modClass; ///< modulation class
-    uint16_t constellationSize; ///< constellation size
-    WifiCodeRate codingRate; ///< coding rate
-    bool isMandatory; ///< flag to indicate whether this mode is mandatory
-    uint8_t mcsValue; ///< MCS value
+    bool isMandatory;             ///< flag to indicate whether this mode is mandatory
+    uint8_t mcsValue;             ///< MCS value
+    CodeRateCallback GetCodeRateCallback;                         ///< Callback to retrieve code rate of this WifiModeItem
+    ConstellationSizeCallback GetConstellationSizeCallback;       ///< Callback to retrieve constellation size of this WifiModeItem
+    PhyRateCallback GetPhyRateCallback;                           ///< Callback to calculate PHY rate in bps of this WifiModeItem
+    PhyRateFromTxVectorCallback GetPhyRateFromTxVectorCallback;   ///< Callback to calculate PHY rate in bps of this WifiModeItem using a TXVECTOR as input
+    DataRateCallback GetDataRateCallback;                         ///< Callback to calculate data rate in bps of this WifiModeItem
+    DataRateFromTxVectorCallback GetDataRateFromTxVectorCallback; ///< Callback to calculate data rate in bps of this WifiModeItem using a TXVECTOR as input
+    NonHtReferenceRateCallback GetNonHtReferenceRateCallback;     ///< Callback to calculate non-HT reference rate of this WifiModeItem
+    ModeAllowedCallback IsModeAllowedCallback;                    ///< Callback to check whether the combination of <MCS, channel width (MHz), NSS> is allowed
   };
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-net-device.cc ns-3.34/src/wifi/model/wifi-net-device.cc
--- ns-3.33/src/wifi/model/wifi-net-device.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-net-device.cc	2021-07-14 10:31:07.000000000 -0700
@@ -27,9 +27,9 @@
 #include "wifi-net-device.h"
 #include "wifi-phy.h"
 #include "wifi-mac.h"
-#include "ht-configuration.h"
-#include "vht-configuration.h"
-#include "he-configuration.h"
+#include "ns3/ht-configuration.h"
+#include "ns3/vht-configuration.h"
+#include "ns3/he-configuration.h"
 
 namespace ns3 {
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-net-device.h ns-3.34/src/wifi/model/wifi-net-device.h
--- ns-3.33/src/wifi/model/wifi-net-device.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-net-device.h	2021-07-14 10:31:07.000000000 -0700
@@ -112,36 +112,35 @@
    */
   Ptr<HeConfiguration> GetHeConfiguration (void) const;
 
-  //inherited from NetDevice base class.
-  void SetIfIndex (const uint32_t index);
-  uint32_t GetIfIndex (void) const;
-  Ptr<Channel> GetChannel (void) const;
-  void SetAddress (Address address);
-  Address GetAddress (void) const;
-  bool SetMtu (const uint16_t mtu);
-  uint16_t GetMtu (void) const;
-  bool IsLinkUp (void) const;
-  void AddLinkChangeCallback (Callback<void> callback);
-  bool IsBroadcast (void) const;
-  Address GetBroadcast (void) const;
-  bool IsMulticast (void) const;
-  Address GetMulticast (Ipv4Address multicastGroup) const;
-  bool IsPointToPoint (void) const;
-  bool IsBridge (void) const;
-  bool Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber);
-  Ptr<Node> GetNode (void) const;
-  void SetNode (const Ptr<Node> node);
-  bool NeedsArp (void) const;
-  void SetReceiveCallback (NetDevice::ReceiveCallback cb);
-  Address GetMulticast (Ipv6Address addr) const;
-  bool SendFrom (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber);
-  void SetPromiscReceiveCallback (PromiscReceiveCallback cb);
-  bool SupportsSendFrom (void) const;
+  void SetIfIndex (const uint32_t index) override;
+  uint32_t GetIfIndex (void) const override;
+  Ptr<Channel> GetChannel (void) const override;
+  void SetAddress (Address address) override;
+  Address GetAddress (void) const override;
+  bool SetMtu (const uint16_t mtu) override;
+  uint16_t GetMtu (void) const override;
+  bool IsLinkUp (void) const override;
+  void AddLinkChangeCallback (Callback<void> callback) override;
+  bool IsBroadcast (void) const override;
+  Address GetBroadcast (void) const override;
+  bool IsMulticast (void) const override;
+  Address GetMulticast (Ipv4Address multicastGroup) const override;
+  bool IsPointToPoint (void) const override;
+  bool IsBridge (void) const override;
+  bool Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber) override;
+  Ptr<Node> GetNode (void) const override;
+  void SetNode (const Ptr<Node> node) override;
+  bool NeedsArp (void) const override;
+  void SetReceiveCallback (NetDevice::ReceiveCallback cb) override;
+  Address GetMulticast (Ipv6Address addr) const override;
+  bool SendFrom (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber) override;
+  void SetPromiscReceiveCallback (PromiscReceiveCallback cb) override;
+  bool SupportsSendFrom (void) const override;
 
 
 protected:
-  void DoDispose (void);
-  void DoInitialize (void);
+  void DoDispose (void) override;
+  void DoInitialize (void) override;
   /**
    * Receive a packet from the lower layer and pass the
    * packet up the stack.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-phy-band.h ns-3.34/src/wifi/model/wifi-phy-band.h
--- ns-3.33/src/wifi/model/wifi-phy-band.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-phy-band.h	2021-07-14 10:31:07.000000000 -0700
@@ -21,6 +21,8 @@
 #ifndef WIFI_PHY_BAND_H
 #define WIFI_PHY_BAND_H
 
+#include <iostream>
+
 namespace ns3 {
 
 /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-phy.cc ns-3.34/src/wifi/model/wifi-phy.cc
--- ns-3.33/src/wifi/model/wifi-phy.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-phy.cc	2021-07-14 10:31:07.000000000 -0700
@@ -35,10 +35,15 @@
 #include "wifi-radio-energy-model.h"
 #include "error-rate-model.h"
 #include "wifi-net-device.h"
-#include "ht-configuration.h"
-#include "he-configuration.h"
+#include "ns3/ht-configuration.h"
+#include "ns3/he-configuration.h"
 #include "mpdu-aggregator.h"
 #include "wifi-psdu.h"
+#include "wifi-ppdu.h"
+#include "ap-wifi-mac.h"
+#include "ns3/dsss-phy.h"
+#include "ns3/erp-ofdm-phy.h"
+#include "ns3/he-phy.h" //includes OFDM, HT, and VHT
 
 namespace ns3 {
 
@@ -50,240 +55,244 @@
 
 NS_OBJECT_ENSURE_REGISTERED (WifiPhy);
 
-/**
- * This table maintains the mapping of valid ChannelNumber to
- * Frequency/ChannelWidth pairs.  If you want to make a channel applicable
- * to all standards, then you may use the WIFI_PHY_STANDARD_UNSPECIFIED
- * standard to represent this, as a wildcard.  If you want to limit the
- * configuration of a particular channel/frequency/width to a particular
- * standard(s), then you can specify one or more such bindings.
- */
-WifiPhy::ChannelToFrequencyWidthMap WifiPhy::m_channelToFrequencyWidth =
+const std::set<FrequencyChannelInfo> WifiPhy::m_frequencyChannels =
 {
   //2.4 GHz channels
   // 802.11b uses width of 22, while OFDM modes use width of 20
-  { { {1, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2412, 22} },
-  { { {1, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {2412, 20} },
-  { { {2, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2417, 22} },
-  { { {2, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {2417, 20} },
-  { { {3, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2422, 22} },
-  { { {3, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {2422, 20} },
-  { { {4, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2427, 22} },
-  { { {4, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {2427, 20} },
-  { { {5, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2432, 22} },
-  { { {5, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {2432, 20} },
-  { { {6, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2437, 22} },
-  { { {6, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {2437, 20} },
-  { { {7, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2442, 22} },
-  { { {7, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {2442, 20} },
-  { { {8, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2447, 22} },
-  { { {8, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {2447, 20} },
-  { { {9, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2452, 22} },
-  { { {9, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {2452, 20} },
-  { { {10, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2457, 22} },
-  { { {10, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {2457, 20} },
-  { { {11, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2462, 22} },
-  { { {11, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {2462, 20} },
-  { { {12, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2467, 22} },
-  { { {12, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {2467, 20} },
-  { { {13, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2472, 22} },
-  { { {13, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {2472, 20} },
+  { std::make_tuple (1, 2412, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (1, 2412, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (2, 2417, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (2, 2417, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (3, 2422, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (3, 2422, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (4, 2427, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (4, 2427, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (5, 2432, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (5, 2432, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (6, 2437, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (6, 2437, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (7, 2442, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (7, 2442, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (8, 2447, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (8, 2447, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (9, 2452, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (9, 2452, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (10, 2457, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (10, 2457, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (11, 2462, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (11, 2462, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (12, 2467, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (12, 2467, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (13, 2472, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (13, 2472, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
   // Only defined for 802.11b
-  { { {14, WIFI_PHY_BAND_2_4GHZ}, WIFI_PHY_STANDARD_80211b}, {2484, 22} },
+  { std::make_tuple (14, 2484, 22, WIFI_PHY_DSSS_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  // 40 MHz channels
+  { std::make_tuple (3, 2422, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (4, 2427, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (5, 2432, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (6, 2437, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (7, 2442, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (8, 2447, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (9, 2452, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (10, 2457, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
+  { std::make_tuple (11, 2462, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_2_4GHZ) },
 
-  // Now the 5 GHz channels; UNSPECIFIED for 802.11a/n/ac/ax channels
+  // Now the 5 GHz channels used for 802.11a/n/ac/ax
   // 20 MHz channels
-  { { {36, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5180, 20} },
-  { { {40, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5200, 20} },
-  { { {44, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5220, 20} },
-  { { {48, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5240, 20} },
-  { { {52, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5260, 20} },
-  { { {56, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5280, 20} },
-  { { {60, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5300, 20} },
-  { { {64, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5320, 20} },
-  { { {100, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5500, 20} },
-  { { {104, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5520, 20} },
-  { { {108, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5540, 20} },
-  { { {112, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5560, 20} },
-  { { {116, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5580, 20} },
-  { { {120, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5600, 20} },
-  { { {124, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5620, 20} },
-  { { {128, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5640, 20} },
-  { { {132, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5660, 20} },
-  { { {136, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5680, 20} },
-  { { {140, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5700, 20} },
-  { { {144, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5720, 20} },
-  { { {149, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5745, 20} },
-  { { {153, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5765, 20} },
-  { { {157, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5785, 20} },
-  { { {161, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5805, 20} },
-  { { {165, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5825, 20} },
-  { { {169, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5845, 20} },
-  { { {173, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5865, 20} },
-  { { {177, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5885, 20} },
-  { { {181, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5905, 20} },
+  { std::make_tuple (36, 5180, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (40, 5200, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (44, 5220, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (48, 5240, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (52, 5260, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (56, 5280, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (60, 5300, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (64, 5320, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (100, 5500, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (104, 5520, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (108, 5540, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (112, 5560, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (116, 5580, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (120, 5600, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (124, 5620, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (128, 5640, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (132, 5660, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (136, 5680, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (140, 5700, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (144, 5720, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (149, 5745, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (153, 5765, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (157, 5785, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (161, 5805, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (165, 5825, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (169, 5845, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (173, 5865, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (177, 5885, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (181, 5905, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
   // 40 MHz channels
-  { { {38, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5190, 40} },
-  { { {46, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5230, 40} },
-  { { {54, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5270, 40} },
-  { { {62, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5310, 40} },
-  { { {102, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5510, 40} },
-  { { {110, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5550, 40} },
-  { { {118, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5590, 40} },
-  { { {126, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5630, 40} },
-  { { {134, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5670, 40} },
-  { { {142, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5710, 40} },
-  { { {151, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5755, 40} },
-  { { {159, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5795, 40} },
-  { { {167, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5835, 40} },
-  { { {175, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5875, 40} },
+  { std::make_tuple (38, 5190, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (46, 5230, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (54, 5270, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (62, 5310, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (102, 5510, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (110, 5550, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (118, 5590, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (126, 5630, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (134, 5670, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (142, 5710, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (151, 5755, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (159, 5795, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (167, 5835, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (175, 5875, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
   // 80 MHz channels
-  { { {42, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5210, 80} },
-  { { {58, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5290, 80} },
-  { { {106, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5530, 80} },
-  { { {122, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5610, 80} },
-  { { {138, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5690, 80} },
-  { { {155, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5775, 80} },
-  { { {171, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5855, 80} },
+  { std::make_tuple (42, 5210, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (58, 5290, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (106, 5530, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (122, 5610, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (138, 5690, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (155, 5775, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (171, 5855, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
   // 160 MHz channels
-  { { {50, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5250, 160} },
-  { { {114, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5570, 160} },
-  { { {163, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_UNSPECIFIED}, {5815, 160} },
+  { std::make_tuple (50, 5250, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (114, 5570, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (163, 5815, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_5GHZ) },
 
   // 802.11p 10 MHz channels at the 5.855-5.925 band
-  { { {172, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5860, 10} },
-  { { {174, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5870, 10} },
-  { { {176, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5880, 10} },
-  { { {178, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5890, 10} },
-  { { {180, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5900, 10} },
-  { { {182, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5910, 10} },
-  { { {184, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5920, 10} },
+  { std::make_tuple (172, 5860, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (174, 5870, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (176, 5880, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (178, 5890, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (180, 5900, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (182, 5910, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (184, 5920, 10, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
 
   // 802.11p 5 MHz channels at the 5.855-5.925 band (for simplification, we consider the same center frequencies as the 10 MHz channels)
-  { { {171, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5860, 5} },
-  { { {173, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5870, 5} },
-  { { {175, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5880, 5} },
-  { { {177, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5890, 5} },
-  { { {179, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5900, 5} },
-  { { {181, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5910, 5} },
-  { { {183, WIFI_PHY_BAND_5GHZ}, WIFI_PHY_STANDARD_80211p}, {5920, 5} },
+  { std::make_tuple (171, 5860, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (173, 5870, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (175, 5880, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (177, 5890, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (179, 5900, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (181, 5910, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
+  { std::make_tuple (183, 5920, 5, WIFI_PHY_80211p_CHANNEL, WIFI_PHY_BAND_5GHZ) },
 
   // Now the 6 GHz channels (802.11ax only)
   // 20 MHz channels
-  { { {1, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {5945, 20} },
-  { { {5, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {5965, 20} },
-  { { {9, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {5985, 20} },
-  { { {13, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6005, 20} },
-  { { {17, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6025, 20} },
-  { { {21, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6045, 20} },
-  { { {25, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6065, 20} },
-  { { {29, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6085, 20} },
-  { { {33, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6105, 20} },
-  { { {37, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6125, 20} },
-  { { {41, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6145, 20} },
-  { { {45, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6165, 20} },
-  { { {49, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6185, 20} },
-  { { {53, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6205, 20} },
-  { { {57, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6225, 20} },
-  { { {61, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6245, 20} },
-  { { {65, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6265, 20} },
-  { { {69, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6285, 20} },
-  { { {73, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6305, 20} },
-  { { {77, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6325, 20} },
-  { { {81, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6345, 20} },
-  { { {85, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6365, 20} },
-  { { {89, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6385, 20} },
-  { { {93, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6405, 20} },
-  { { {97, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6425, 20} },
-  { { {101, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6445, 20} },
-  { { {105, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6465, 20} },
-  { { {109, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6485, 20} },
-  { { {113, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6505, 20} },
-  { { {117, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6525, 20} },
-  { { {121, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6545, 20} },
-  { { {125, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6565, 20} },
-  { { {129, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6585, 20} },
-  { { {133, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6605, 20} },
-  { { {137, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6625, 20} },
-  { { {141, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6645, 20} },
-  { { {145, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6665, 20} },
-  { { {149, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6685, 20} },
-  { { {153, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6705, 20} },
-  { { {157, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6725, 20} },
-  { { {161, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6745, 20} },
-  { { {165, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6765, 20} },
-  { { {169, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6785, 20} },
-  { { {173, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6805, 20} },
-  { { {177, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6825, 20} },
-  { { {181, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6845, 20} },
-  { { {185, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6865, 20} },
-  { { {189, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6885, 20} },
-  { { {193, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6905, 20} },
-  { { {197, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6925, 20} },
-  { { {201, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6945, 20} },
-  { { {205, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6965, 20} },
-  { { {209, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6985, 20} },
-  { { {213, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {7005, 20} },
-  { { {217, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {7025, 20} },
-  { { {221, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {7045, 20} },
-  { { {225, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {7065, 20} },
-  { { {229, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {7085, 20} },
-  { { {233, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {7105, 20} },
+  { std::make_tuple (1, 5945, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (5, 5965, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (9, 5985, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (13, 6005, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (17, 6025, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (21, 6045, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (25, 6065, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (29, 6085, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (33, 6105, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (37, 6125, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (41, 6145, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (45, 6165, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (49, 6185, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (53, 6205, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (57, 6225, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (61, 6245, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (65, 6265, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (69, 6285, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (73, 6305, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (77, 6325, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (81, 6345, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (85, 6365, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (89, 6385, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (93, 6405, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (97, 6425, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (101, 6445, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (105, 6465, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (109, 6485, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (113, 6505, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (117, 6525, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (121, 6545, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (125, 6565, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (129, 6585, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (133, 6605, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (137, 6625, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (141, 6645, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (145, 6665, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (149, 6685, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (153, 6705, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (157, 6725, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (161, 6745, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (165, 6765, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (169, 6785, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (173, 6805, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (177, 6825, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (181, 6845, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (185, 6865, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (189, 6885, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (193, 6905, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (197, 6925, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (201, 6945, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (205, 6965, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (209, 6985, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (213, 7005, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (217, 7025, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (221, 7045, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (225, 7065, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (229, 7085, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (233, 7105, 20, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
   // 40 MHz channels
-  { { {3, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {5955, 40} },
-  { { {11, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {5995, 40} },
-  { { {19, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6035, 40} },
-  { { {27, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6075, 40} },
-  { { {35, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6115, 40} },
-  { { {43, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6155, 40} },
-  { { {51, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6195, 40} },
-  { { {59, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6235, 40} },
-  { { {67, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6275, 40} },
-  { { {75, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6315, 40} },
-  { { {83, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6355, 40} },
-  { { {91, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6395, 40} },
-  { { {99, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6435, 40} },
-  { { {107, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6475, 40} },
-  { { {115, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6515, 40} },
-  { { {123, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6555, 40} },
-  { { {131, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6595, 40} },
-  { { {139, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6635, 40} },
-  { { {147, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6675, 40} },
-  { { {155, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6715, 40} },
-  { { {163, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6755, 40} },
-  { { {171, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6795, 40} },
-  { { {179, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6835, 40} },
-  { { {187, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6875, 40} },
-  { { {195, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6915, 40} },
-  { { {203, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6955, 40} },
-  { { {211, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6995, 40} },
-  { { {219, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {7035, 40} },
-  { { {227, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {7075, 40} },
+  { std::make_tuple (3, 5955, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (11, 5995, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (19, 6035, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (27, 6075, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (35, 6115, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (43, 6155, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (51, 6195, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (59, 6235, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (67, 6275, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (75, 6315, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (83, 6355, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (91, 6395, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (99, 6435, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (107, 6475, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (115, 6515, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (123, 6555, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (131, 6595, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (139, 6635, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (147, 6675, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (155, 6715, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (163, 6755, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (171, 6795, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (179, 6835, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (187, 6875, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (195, 6915, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (203, 6955, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (211, 6995, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (219, 7035, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (227, 7075, 40, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
   // 80 MHz channels
-  { { {7, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {5975, 80} },
-  { { {23, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6055, 80} },
-  { { {39, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6135, 80} },
-  { { {55, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6215, 80} },
-  { { {71, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6295, 80} },
-  { { {87, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6375, 80} },
-  { { {103, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6455, 80} },
-  { { {119, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6535, 80} },
-  { { {135, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6615, 80} },
-  { { {151, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6695, 80} },
-  { { {167, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6775, 80} },
-  { { {183, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6855, 80} },
-  { { {199, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6935, 80} },
-  { { {215, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {7015, 80} },
+  { std::make_tuple (7, 5975, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (23, 6055, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (39, 6135, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (55, 6215, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (71, 6295, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (87, 6375, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (103, 6455, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (119, 6535, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (135, 6615, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (151, 6695, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (167, 6775, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (183, 6855, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (199, 6935, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (215, 7015, 80, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
   // 160 MHz channels
-  { { {15, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6015, 160} },
-  { { {47, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6175, 160} },
-  { { {79, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6335, 160} },
-  { { {111, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6495, 160} },
-  { { {143, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6655, 160} },
-  { { {175, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6815, 160} },
-  { { {207, WIFI_PHY_BAND_6GHZ}, WIFI_PHY_STANDARD_80211ax}, {6975, 160} }
+  { std::make_tuple (15, 6015, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (47, 6175, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (79, 6335, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (111, 6495, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (143, 6655, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (175, 6815, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) },
+  { std::make_tuple (207, 6975, 160, WIFI_PHY_OFDM_CHANNEL, WIFI_PHY_BAND_6GHZ) }
 };
 
+std::map<WifiModulationClass, Ptr<PhyEntity> > WifiPhy::m_staticPhyEntities; //will be filled by g_constructor_XXX
+
 TypeId
 WifiPhy::GetTypeId (void)
 {
@@ -291,26 +300,69 @@
     .SetParent<Object> ()
     .SetGroupName ("Wifi")
     .AddAttribute ("Frequency",
-                   "The operating center frequency (MHz)",
+                   "The center frequency (MHz) of the operating channel. "
+                   "If the operating channel for this object has not been set yet, the "
+                   "value of this attribute is saved and will be used, along with the channel "
+                   "number and width configured via other attributes, to set the operating "
+                   "channel when the standard and band are configured. The default value of "
+                   "this attribute is 0, which means unspecified center frequency. Note that "
+                   "if center frequency and channel number are both 0 when the standard and "
+                   "band are configured, a default channel (of the configured width, if any, "
+                   "or the default width for the current standard and band, otherwise) is set. "
+                   "If the operating channel for this object has been already set, the "
+                   "specified center frequency must uniquely identify a channel in the "
+                   "band being used.",
                    UintegerValue (0),
                    MakeUintegerAccessor (&WifiPhy::GetFrequency,
                                          &WifiPhy::SetFrequency),
                    MakeUintegerChecker<uint16_t> ())
-    .AddAttribute ("ChannelWidth",
-                   "Whether 5MHz, 10MHz, 20MHz, 22MHz, 40MHz, 80 MHz or 160 MHz.",
-                   UintegerValue (20),
-                   MakeUintegerAccessor (&WifiPhy::GetChannelWidth,
-                                         &WifiPhy::SetChannelWidth),
-                   MakeUintegerChecker<uint16_t> (5, 160))
     .AddAttribute ("ChannelNumber",
-                   "If set to non-zero defined value, will control Frequency and ChannelWidth assignment",
+                   "The channel number of the operating channel. "
+                   "If the operating channel for this object has not been set yet, the "
+                   "value of this attribute is saved and will be used, along with the center "
+                   "frequency and width configured via other attributes, to set the operating "
+                   "channel when the standard and band are configured. The default value of "
+                   "this attribute is 0, which means unspecified channel number. Note that "
+                   "if center frequency and channel number are both 0 when the standard and "
+                   "band are configured, a default channel (of the configured width, if any, "
+                   "or the default width for the current standard and band, otherwise) is set. "
+                   "If the operating channel for this object has been already set, the "
+                   "specified channel number must uniquely identify a channel in the "
+                   "band being used.",
                    UintegerValue (0),
                    MakeUintegerAccessor (&WifiPhy::SetChannelNumber,
                                          &WifiPhy::GetChannelNumber),
                    MakeUintegerChecker<uint8_t> (0, 233))
+    .AddAttribute ("ChannelWidth",
+                   "The width in MHz of the operating channel (5, 10, 20, 22, 40, 80 or 160). "
+                   "If the operating channel for this object has not been set yet, the "
+                   "value of this attribute is saved and will be used, along with the center "
+                   "frequency and channel number configured via other attributes, to set the "
+                   "operating channel when the standard and band are configured. The default value "
+                   "of this attribute is 0, which means unspecified channel width. Note that "
+                   "if center frequency and channel number are both 0 when the standard and "
+                   "band are configured, a default channel (of the configured width, if any, "
+                   "or the default width for the current standard and band, otherwise) is set. "
+                   "Do not set this attribute when the standard and band of this object have "
+                   "been already configured, because it cannot uniquely identify a channel in "
+                   "the band being used.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiPhy::GetChannelWidth,
+                                         &WifiPhy::SetChannelWidth),
+                   MakeUintegerChecker<uint16_t> (5, 160))
+    .AddAttribute ("Primary20MHzIndex",
+                   "The index of the primary 20 MHz channel within the operating channel "
+                   "(0 indicates the 20 MHz subchannel with the lowest center frequency). "
+                   "This attribute is only valid if the width of the operating channel is "
+                   "a multiple of 20 MHz.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&WifiPhy::SetPrimary20Index),
+                   MakeUintegerChecker<uint8_t> (0, 7))
     .AddAttribute ("RxSensitivity",
                    "The energy of a received signal should be higher than "
-                   "this threshold (dBm) for the PHY to detect the signal.",
+                   "this threshold (dBm) for the PHY to detect the signal. "
+                   "This threshold refers to a width of 20 MHz and will be "
+                   "scaled to match the width of the received signal.",
                    DoubleValue (-101.0),
                    MakeDoubleAccessor (&WifiPhy::SetRxSensitivity,
                                        &WifiPhy::GetRxSensitivity),
@@ -443,6 +495,12 @@
                    TimeValue (MicroSeconds (0)),
                    MakeTimeAccessor (&WifiPhy::m_pifs),
                    MakeTimeChecker ())
+    .AddAttribute ("PowerDensityLimit",
+                   "The mean equivalent isotropically radiated power density"
+                   "limit (in dBm/MHz) set by regulators.",
+                   DoubleValue (100.0), //set to a high value so as to have no effect
+                   MakeDoubleAccessor (&WifiPhy::m_powerDensityLimit),
+                   MakeDoubleChecker<double> ())
     .AddTraceSource ("PhyTxBegin",
                      "Trace source indicating a packet "
                      "has begun transmitting over the channel medium",
@@ -495,10 +553,6 @@
                      "in monitor mode to sniff all frames being transmitted",
                      MakeTraceSourceAccessor (&WifiPhy::m_phyMonitorSniffTxTrace),
                      "ns3::WifiPhy::MonitorSnifferTxTracedCallback")
-    .AddTraceSource ("EndOfHePreamble",
-                     "Trace source indicating the end of the 802.11ax preamble (after training fields)",
-                     MakeTraceSourceAccessor (&WifiPhy::m_phyEndOfHePreambleTrace),
-                     "ns3::WifiPhy::EndOfHePreambleTracedCallback")
   ;
   return tid;
 }
@@ -506,17 +560,16 @@
 WifiPhy::WifiPhy ()
   : m_txMpduReferenceNumber (0xffffffff),
     m_rxMpduReferenceNumber (0xffffffff),
-    m_endRxEvent (),
     m_endPhyRxEvent (),
-    m_endPreambleDetectionEvent (),
     m_endTxEvent (),
+    m_currentEvent (0),
+    m_previouslyRxPpduUid (UINT64_MAX),
     m_standard (WIFI_PHY_STANDARD_UNSPECIFIED),
     m_band (WIFI_PHY_BAND_UNSPECIFIED),
-    m_isConstructed (false),
-    m_channelCenterFrequency (0),
     m_initialFrequency (0),
-    m_frequencyChannelNumberInitialized (false),
-    m_channelWidth (0),
+    m_initialChannelNumber (0),
+    m_initialChannelWidth (0),
+    m_initialPrimary20Index (0),
     m_sifs (Seconds (0)),
     m_slot (Seconds (0)),
     m_pifs (Seconds (0)),
@@ -526,9 +579,6 @@
     m_channelAccessRequested (false),
     m_txSpatialStreams (0),
     m_rxSpatialStreams (0),
-    m_channelNumber (0),
-    m_initialChannelNumber (0),
-    m_currentEvent (0),
     m_wifiRadioEnergyModel (0),
     m_timeLastPreambleDetected (Seconds (0))
 {
@@ -547,30 +597,32 @@
 {
   NS_LOG_FUNCTION (this);
   m_endTxEvent.Cancel ();
-  m_endRxEvent.Cancel ();
   m_endPhyRxEvent.Cancel ();
-  m_endPreambleDetectionEvent.Cancel ();
+  for (auto & phyEntity : m_phyEntities)
+    {
+      phyEntity.second->CancelAllEvents ();
+    }
   m_device = 0;
   m_mobility = 0;
-  m_state = 0;
+  m_frameCaptureModel = 0;
+  m_preambleDetectionModel = 0;
   m_wifiRadioEnergyModel = 0;
   m_postReceptionErrorModel = 0;
-  m_deviceRateSet.clear ();
-  m_deviceMcsSet.clear ();
-  m_mcsIndexMap.clear ();
-}
+  m_supportedChannelWidthSet.clear ();
+  m_random = 0;
+  m_state = 0;
+  m_currentEvent = 0;
+  for (auto & preambleEvent : m_currentPreambleEvents)
+    {
+      preambleEvent.second = 0;
+    }
+  m_currentPreambleEvents.clear ();
 
-void
-WifiPhy::DoInitialize (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_isConstructed = true;
-  if (m_frequencyChannelNumberInitialized == true)
+  for (auto & phyEntity : m_phyEntities)
     {
-      NS_LOG_DEBUG ("Frequency already initialized");
-      return;
+      phyEntity.second = 0;
     }
-  InitializeFrequencyChannelNumber ();
+  m_phyEntities.clear ();
 }
 
 Ptr<WifiPhyStateHelper>
@@ -610,34 +662,6 @@
 }
 
 void
-WifiPhy::InitializeFrequencyChannelNumber (void)
-{
-  NS_LOG_FUNCTION (this);
-
-  NS_ASSERT_MSG (m_frequencyChannelNumberInitialized == false, "Initialization called twice");
-
-  // If frequency has been set to a non-zero value during attribute
-  // construction phase, the frequency and channel width will drive the
-  // initial configuration.  If frequency has not been set, but both
-  // standard and channel number have been set, that pair will instead
-  // drive the configuration, and frequency and channel number will be
-  // aligned
-  if (m_initialFrequency != 0)
-    {
-      SetFrequency (m_initialFrequency);
-    }
-  else if (m_initialChannelNumber != 0 && GetPhyStandard () != WIFI_PHY_STANDARD_UNSPECIFIED)
-    {
-      SetChannelNumber (m_initialChannelNumber);
-    }
-  else if (m_initialChannelNumber != 0 && GetPhyStandard () == WIFI_PHY_STANDARD_UNSPECIFIED)
-    {
-      NS_FATAL_ERROR ("Error, ChannelNumber " << +GetChannelNumber () << " was set by user, but neither a standard nor a frequency");
-    }
-  m_frequencyChannelNumberInitialized = true;
-}
-
-void
 WifiPhy::SetRxSensitivity (double threshold)
 {
   NS_LOG_FUNCTION (this << threshold);
@@ -837,107 +861,43 @@
 }
 
 double
-WifiPhy::CalculateSnr (WifiTxVector txVector, double ber) const
+WifiPhy::CalculateSnr (const WifiTxVector& txVector, double ber) const
 {
   return m_interference.GetErrorRateModel ()->CalculateSnr (txVector, ber);
 }
 
+const Ptr<const PhyEntity>
+WifiPhy::GetStaticPhyEntity (WifiModulationClass modulation)
+{
+  const auto it = m_staticPhyEntities.find (modulation);
+  NS_ABORT_MSG_IF (it == m_staticPhyEntities.end (), "Unimplemented Wi-Fi modulation class");
+  return it->second;
+}
+
+Ptr<PhyEntity>
+WifiPhy::GetPhyEntity (WifiModulationClass modulation) const
+{
+  const auto it = m_phyEntities.find (modulation);
+  NS_ABORT_MSG_IF (it == m_phyEntities.end (), "Unsupported Wi-Fi modulation class");
+  return it->second;
+}
+
 void
-WifiPhy::ConfigureDefaultsForStandard (void)
+WifiPhy::AddStaticPhyEntity (WifiModulationClass modulation, Ptr<PhyEntity> phyEntity)
 {
-  NS_LOG_FUNCTION (this);
-  switch (m_standard)
-    {
-    case WIFI_PHY_STANDARD_80211a:
-      SetChannelWidth (20);
-      SetFrequency (5180);
-      // Channel number should be aligned by SetFrequency () to 36
-      NS_ASSERT (GetChannelNumber () == 36);
-      break;
-    case WIFI_PHY_STANDARD_80211b:
-      SetChannelWidth (22);
-      SetFrequency (2412);
-      // Channel number should be aligned by SetFrequency () to 1
-      NS_ASSERT (GetChannelNumber () == 1);
-      break;
-    case WIFI_PHY_STANDARD_80211g:
-      SetChannelWidth (20);
-      SetFrequency (2412);
-      // Channel number should be aligned by SetFrequency () to 1
-      NS_ASSERT (GetChannelNumber () == 1);
-      break;
-    case WIFI_PHY_STANDARD_80211p:
-      if (GetChannelWidth () > 10)
-        {
-          SetChannelWidth (10);
-        }
-      SetFrequency (5860);
-      // Channel number should be aligned by SetFrequency () to either 172 or 171
-      NS_ASSERT ((GetChannelWidth () == 10 && GetChannelNumber () == 172) || (GetChannelWidth () == 5 && GetChannelNumber () == 171)) ;
-      break;
-    case WIFI_PHY_STANDARD_holland:
-      SetChannelWidth (20);
-      SetFrequency (5180);
-      // Channel number should be aligned by SetFrequency () to 36
-      NS_ASSERT (GetChannelNumber () == 36);
-      break;
-    case WIFI_PHY_STANDARD_80211n:
-      SetChannelWidth (20);
-      if (m_band == WIFI_PHY_BAND_2_4GHZ)
-        {
-          SetFrequency (2412);
-          // Channel number should be aligned by SetFrequency () to 1
-          NS_ASSERT (GetChannelNumber () == 1);
-        }
-      else if (m_band == WIFI_PHY_BAND_5GHZ)
-        {
-          SetFrequency (5180);
-          // Channel number should be aligned by SetFrequency () to 36
-          NS_ASSERT (GetChannelNumber () == 36);
-        }
-      else
-        {
-          NS_FATAL_ERROR ("Invalid band");
-        }
-      break;
-    case WIFI_PHY_STANDARD_80211ac:
-      SetChannelWidth (80);
-      SetFrequency (5210);
-      // Channel number should be aligned by SetFrequency () to 42
-      NS_ASSERT (GetChannelNumber () == 42);
-      break;
-    case WIFI_PHY_STANDARD_80211ax:
-      if (m_band == WIFI_PHY_BAND_2_4GHZ)
-        {
-          SetChannelWidth (20);
-          SetFrequency (2412);
-          // Channel number should be aligned by SetFrequency () to 1
-          NS_ASSERT (GetChannelNumber () == 1);
-        }
-      else if (m_band == WIFI_PHY_BAND_5GHZ)
-        {
-          SetChannelWidth (80);
-          SetFrequency (5210);
-          // Channel number should be aligned by SetFrequency () to 42
-          NS_ASSERT (GetChannelNumber () == 42);
-        }
-      else if (m_band == WIFI_PHY_BAND_6GHZ)
-        {
-          SetChannelWidth (80);
-          SetFrequency (5975);
-          // Channel number should be aligned by SetFrequency () to 7
-          NS_ASSERT (GetChannelNumber () == 7);
-        }
-      else
-        {
-          NS_FATAL_ERROR ("Invalid band");
-        }
-      break;
-    case WIFI_PHY_STANDARD_UNSPECIFIED:
-    default:
-      NS_LOG_WARN ("Configuring unspecified standard; performing no action");
-      break;
-    }
+  NS_LOG_FUNCTION (modulation);
+  NS_ASSERT_MSG (m_staticPhyEntities.find (modulation) == m_staticPhyEntities.end (), "The PHY entity has already been added. The setting should only be done once per modulation class");
+  m_staticPhyEntities[modulation] = phyEntity;
+}
+
+void
+WifiPhy::AddPhyEntity (WifiModulationClass modulation, Ptr<PhyEntity> phyEntity)
+{
+  NS_LOG_FUNCTION (this << modulation);
+  NS_ABORT_MSG_IF (m_staticPhyEntities.find (modulation) == m_staticPhyEntities.end (), "Cannot add an unimplemented PHY to supported list. Update the former first.");
+  NS_ASSERT_MSG (m_phyEntities.find (modulation) == m_phyEntities.end (), "The PHY entity has already been added. The setting should only be done once per modulation class");
+  phyEntity->SetOwner (this);
+  m_phyEntities[modulation] = phyEntity;
 }
 
 void
@@ -992,6 +952,7 @@
 WifiPhy::Configure80211a (void)
 {
   NS_LOG_FUNCTION (this);
+  AddPhyEntity (WIFI_MOD_CLASS_OFDM, Create<OfdmPhy> ());
 
   // See Table 17-21 "OFDM PHY characteristics" of 802.11-2016
   SetSifs (MicroSeconds (16));
@@ -1000,21 +961,15 @@
   // See Table 10-5 "Determination of the EstimatedAckTxTime based on properties
   // of the PPDU causing the EIFS" of 802.11-2016
   m_ackTxTime = MicroSeconds (44);
-
-  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate6Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate9Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate12Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate18Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate24Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate36Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate48Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate54Mbps ());
 }
 
 void
 WifiPhy::Configure80211b (void)
 {
   NS_LOG_FUNCTION (this);
+  Ptr<DsssPhy> phyEntity = Create<DsssPhy> ();
+  AddPhyEntity (WIFI_MOD_CLASS_HR_DSSS, phyEntity);
+  AddPhyEntity (WIFI_MOD_CLASS_DSSS, phyEntity); //when plain DSSS modes are used
 
   // See Table 16-4 "HR/DSSS PHY characteristics" of 802.11-2016
   SetSifs (MicroSeconds (10));
@@ -1023,11 +978,6 @@
   // See Table 10-5 "Determination of the EstimatedAckTxTime based on properties
   // of the PPDU causing the EIFS" of 802.11-2016
   m_ackTxTime = MicroSeconds (304);
-
-  m_deviceRateSet.push_back (WifiPhy::GetDsssRate1Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetDsssRate2Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetDsssRate5_5Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetDsssRate11Mbps ());
 }
 
 void
@@ -1040,15 +990,7 @@
   // if the user sets the ShortSlotTimeSupported flag to true and when the BSS
   // consists of only ERP STAs capable of supporting this option.
   Configure80211b ();
-
-  m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate6Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate9Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate12Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate18Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate24Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate36Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate48Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetErpOfdmRate54Mbps ());
+  AddPhyEntity (WIFI_MOD_CLASS_ERP_OFDM, Create<ErpOfdmPhy> ());
 }
 
 void
@@ -1057,37 +999,23 @@
   NS_LOG_FUNCTION (this);
   if (GetChannelWidth () == 10)
     {
+      AddPhyEntity (WIFI_MOD_CLASS_OFDM, Create<OfdmPhy> (OFDM_PHY_10_MHZ));
+
       // See Table 17-21 "OFDM PHY characteristics" of 802.11-2016
       SetSifs (MicroSeconds (32));
       SetSlot (MicroSeconds (13));
       SetPifs (GetSifs () + GetSlot ());
       m_ackTxTime = MicroSeconds (88);
-
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate3MbpsBW10MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate4_5MbpsBW10MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate6MbpsBW10MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate9MbpsBW10MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate12MbpsBW10MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate18MbpsBW10MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate24MbpsBW10MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate27MbpsBW10MHz ());
     }
   else if (GetChannelWidth () == 5)
     {
+      AddPhyEntity (WIFI_MOD_CLASS_OFDM, Create<OfdmPhy> (OFDM_PHY_5_MHZ));
+
       // See Table 17-21 "OFDM PHY characteristics" of 802.11-2016
       SetSifs (MicroSeconds (64));
       SetSlot (MicroSeconds (21));
       SetPifs (GetSifs () + GetSlot ());
       m_ackTxTime = MicroSeconds (176);
-
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate1_5MbpsBW5MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate2_25MbpsBW5MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate3MbpsBW5MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate4_5MbpsBW5MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate6MbpsBW5MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate9MbpsBW5MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate12MbpsBW5MHz ());
-      m_deviceRateSet.push_back (WifiPhy::GetOfdmRate13_5MbpsBW5MHz ());
     }
   else
     {
@@ -1096,117 +1024,6 @@
 }
 
 void
-WifiPhy::ConfigureHolland (void)
-{
-  NS_LOG_FUNCTION (this);
-
-  SetSifs (MicroSeconds (16));
-  SetSlot (MicroSeconds (9));
-  SetPifs (GetSifs () + GetSlot ());
-
-  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate6Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate12Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate18Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate36Mbps ());
-  m_deviceRateSet.push_back (WifiPhy::GetOfdmRate54Mbps ());
-}
-
-void
-WifiPhy::PushMcs (WifiMode mode)
-{
-  NS_LOG_FUNCTION (this << mode);
-
-  WifiModulationClass modulation = mode.GetModulationClass ();
-  NS_ASSERT (modulation == WIFI_MOD_CLASS_HT || modulation == WIFI_MOD_CLASS_VHT
-             || modulation == WIFI_MOD_CLASS_HE);
-
-  m_mcsIndexMap[modulation][mode.GetMcsValue ()] = m_deviceMcsSet.size ();
-  m_deviceMcsSet.push_back (mode);
-}
-
-void
-WifiPhy::RebuildMcsMap (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_mcsIndexMap.clear ();
-  uint8_t index = 0;
-  for (auto& mode : m_deviceMcsSet)
-    {
-      m_mcsIndexMap[mode.GetModulationClass ()][mode.GetMcsValue ()] = index++;
-    }
-}
-
-void
-WifiPhy::ConfigureHtDeviceMcsSet (void)
-{
-  NS_LOG_FUNCTION (this);
-
-  bool htFound = false;
-  for (std::vector<uint8_t>::size_type i = 0; i < m_bssMembershipSelectorSet.size (); i++)
-    {
-      if (m_bssMembershipSelectorSet[i] == HT_PHY)
-        {
-          htFound = true;
-          break;
-        }
-    }
-  if (htFound)
-    {
-      // erase all HtMcs modes from deviceMcsSet
-      std::size_t index = m_deviceMcsSet.size () - 1;
-      for (std::vector<WifiMode>::reverse_iterator rit = m_deviceMcsSet.rbegin (); rit != m_deviceMcsSet.rend (); ++rit, --index)
-        {
-          if (m_deviceMcsSet[index].GetModulationClass () == WIFI_MOD_CLASS_HT)
-            {
-              m_deviceMcsSet.erase (m_deviceMcsSet.begin () + index);
-            }
-        }
-      RebuildMcsMap ();
-      PushMcs (WifiPhy::GetHtMcs0 ());
-      PushMcs (WifiPhy::GetHtMcs1 ());
-      PushMcs (WifiPhy::GetHtMcs2 ());
-      PushMcs (WifiPhy::GetHtMcs3 ());
-      PushMcs (WifiPhy::GetHtMcs4 ());
-      PushMcs (WifiPhy::GetHtMcs5 ());
-      PushMcs (WifiPhy::GetHtMcs6 ());
-      PushMcs (WifiPhy::GetHtMcs7 ());
-      if (GetMaxSupportedTxSpatialStreams () > 1)
-        {
-          PushMcs (WifiPhy::GetHtMcs8 ());
-          PushMcs (WifiPhy::GetHtMcs9 ());
-          PushMcs (WifiPhy::GetHtMcs10 ());
-          PushMcs (WifiPhy::GetHtMcs11 ());
-          PushMcs (WifiPhy::GetHtMcs12 ());
-          PushMcs (WifiPhy::GetHtMcs13 ());
-          PushMcs (WifiPhy::GetHtMcs14 ());
-          PushMcs (WifiPhy::GetHtMcs15 ());
-        }
-      if (GetMaxSupportedTxSpatialStreams () > 2)
-        {
-          PushMcs (WifiPhy::GetHtMcs16 ());
-          PushMcs (WifiPhy::GetHtMcs17 ());
-          PushMcs (WifiPhy::GetHtMcs18 ());
-          PushMcs (WifiPhy::GetHtMcs19 ());
-          PushMcs (WifiPhy::GetHtMcs20 ());
-          PushMcs (WifiPhy::GetHtMcs21 ());
-          PushMcs (WifiPhy::GetHtMcs22 ());
-          PushMcs (WifiPhy::GetHtMcs23 ());
-        }
-      if (GetMaxSupportedTxSpatialStreams () > 3)
-        {
-          PushMcs (WifiPhy::GetHtMcs24 ());
-          PushMcs (WifiPhy::GetHtMcs25 ());
-          PushMcs (WifiPhy::GetHtMcs26 ());
-          PushMcs (WifiPhy::GetHtMcs27 ());
-          PushMcs (WifiPhy::GetHtMcs28 ());
-          PushMcs (WifiPhy::GetHtMcs29 ());
-          PushMcs (WifiPhy::GetHtMcs30 ());
-          PushMcs (WifiPhy::GetHtMcs31 ());
-        }
-    }
-}
-
-void
 WifiPhy::Configure80211n (void)
 {
   NS_LOG_FUNCTION (this);
@@ -1218,11 +1035,11 @@
     {
       Configure80211a ();
     }
+  AddPhyEntity (WIFI_MOD_CLASS_HT, Create<HtPhy> (m_txSpatialStreams));
+
   // See Table 10-5 "Determination of the EstimatedAckTxTime based on properties
   // of the PPDU causing the EIFS" of 802.11-2016
   m_blockAckTxTime = MicroSeconds (68);
-  m_bssMembershipSelectorSet.push_back (HT_PHY);
-  ConfigureHtDeviceMcsSet ();
 }
 
 void
@@ -1230,19 +1047,7 @@
 {
   NS_LOG_FUNCTION (this);
   Configure80211n ();
-
-  PushMcs (WifiPhy::GetVhtMcs0 ());
-  PushMcs (WifiPhy::GetVhtMcs1 ());
-  PushMcs (WifiPhy::GetVhtMcs2 ());
-  PushMcs (WifiPhy::GetVhtMcs3 ());
-  PushMcs (WifiPhy::GetVhtMcs4 ());
-  PushMcs (WifiPhy::GetVhtMcs5 ());
-  PushMcs (WifiPhy::GetVhtMcs6 ());
-  PushMcs (WifiPhy::GetVhtMcs7 ());
-  PushMcs (WifiPhy::GetVhtMcs8 ());
-  PushMcs (WifiPhy::GetVhtMcs9 ());
-
-  m_bssMembershipSelectorSet.push_back (VHT_PHY);
+  AddPhyEntity (WIFI_MOD_CLASS_VHT, Create<VhtPhy> ());
 }
 
 void
@@ -1257,116 +1062,7 @@
     {
       Configure80211ac ();
     }
-
-  PushMcs (WifiPhy::GetHeMcs0 ());
-  PushMcs (WifiPhy::GetHeMcs1 ());
-  PushMcs (WifiPhy::GetHeMcs2 ());
-  PushMcs (WifiPhy::GetHeMcs3 ());
-  PushMcs (WifiPhy::GetHeMcs4 ());
-  PushMcs (WifiPhy::GetHeMcs5 ());
-  PushMcs (WifiPhy::GetHeMcs6 ());
-  PushMcs (WifiPhy::GetHeMcs7 ());
-  PushMcs (WifiPhy::GetHeMcs8 ());
-  PushMcs (WifiPhy::GetHeMcs9 ());
-  PushMcs (WifiPhy::GetHeMcs10 ());
-  PushMcs (WifiPhy::GetHeMcs11 ());
-
-  m_bssMembershipSelectorSet.push_back (HE_PHY);
-}
-
-bool
-WifiPhy::DefineChannelNumber (uint8_t channelNumber, WifiPhyBand band, WifiPhyStandard standard, uint16_t frequency, uint16_t channelWidth)
-{
-  NS_LOG_FUNCTION (this << +channelNumber << band << standard << frequency << channelWidth);
-  ChannelNumberStandardPair p = std::make_pair (std::make_pair (channelNumber, band), standard);
-  ChannelToFrequencyWidthMap::const_iterator it;
-  it = m_channelToFrequencyWidth.find (p);
-  if (it != m_channelToFrequencyWidth.end ())
-    {
-      NS_LOG_DEBUG ("channel number/standard already defined; returning false");
-      return false;
-    }
-  FrequencyWidthPair f = std::make_pair (frequency, channelWidth);
-  m_channelToFrequencyWidth[p] = f;
-  return true;
-}
-
-uint8_t
-WifiPhy::FindChannelNumberForFrequencyWidth (uint16_t frequency, uint16_t width) const
-{
-  NS_LOG_FUNCTION (this << frequency << width);
-  bool found = false;
-  FrequencyWidthPair f = std::make_pair (frequency, width);
-  ChannelToFrequencyWidthMap::const_iterator it = m_channelToFrequencyWidth.begin ();
-  while (it != m_channelToFrequencyWidth.end ())
-    {
-      if (it->second == f)
-        {
-          found = true;
-          break;
-        }
-      ++it;
-    }
-  if (found)
-    {
-      NS_LOG_DEBUG ("Found, returning " << +it->first.first.first);
-      return (it->first.first.first);
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Not found, returning 0");
-      return 0;
-    }
-}
-
-void
-WifiPhy::ConfigureChannelForStandard (void)
-{
-  NS_LOG_FUNCTION (this);
-  // If the user has configured both Frequency and ChannelNumber, Frequency
-  // takes precedence
-  if (GetFrequency () != 0)
-    {
-      // If Frequency is already set, then see whether a ChannelNumber can
-      // be found that matches Frequency and ChannelWidth. If so, configure
-      // the ChannelNumber to that channel number. If not, set ChannelNumber to zero.
-      NS_LOG_DEBUG ("Frequency set; checking whether a channel number corresponds");
-      uint8_t channelNumberSearched = FindChannelNumberForFrequencyWidth (GetFrequency (), GetChannelWidth ());
-      if (channelNumberSearched)
-        {
-          NS_LOG_DEBUG ("Channel number found; setting to " << +channelNumberSearched);
-          SetChannelNumber (channelNumberSearched);
-        }
-      else
-        {
-          NS_LOG_DEBUG ("Channel number not found; setting to zero");
-          SetChannelNumber (0);
-        }
-    }
-  else if (GetChannelNumber () != 0)
-    {
-      // If the channel number is known for this particular standard or for
-      // the unspecified standard, configure using the known values;
-      // otherwise, this is a configuration error
-      NS_LOG_DEBUG ("Configuring for channel number " << +GetChannelNumber ());
-      FrequencyWidthPair f = GetFrequencyWidthForChannelNumberStandard (GetChannelNumber (), GetPhyBand (), GetPhyStandard ());
-      if (f.first == 0)
-        {
-          // the specific pair of number/standard is not known
-          NS_LOG_DEBUG ("Falling back to check WIFI_PHY_STANDARD_UNSPECIFIED");
-          f = GetFrequencyWidthForChannelNumberStandard (GetChannelNumber (), GetPhyBand (), WIFI_PHY_STANDARD_UNSPECIFIED);
-        }
-      if (f.first == 0)
-        {
-          NS_FATAL_ERROR ("Error, ChannelNumber " << +GetChannelNumber () << " is unknown for this standard");
-        }
-      else
-        {
-          NS_LOG_DEBUG ("Setting frequency to " << f.first << "; width to " << +f.second);
-          SetFrequency (f.first);
-          SetChannelWidth (f.second);
-        }
-    }
+  AddPhyEntity (WIFI_MOD_CLASS_HE, Create<HePhy> ());
 }
 
 void
@@ -1375,20 +1071,25 @@
   NS_LOG_FUNCTION (this << standard << band);
   m_standard = standard;
   m_band = band;
-  m_isConstructed = true;
-  if (m_frequencyChannelNumberInitialized == false)
-    {
-      InitializeFrequencyChannelNumber ();
-    }
-  if (GetFrequency () == 0 && GetChannelNumber () == 0)
+
+  if (m_initialFrequency == 0 && m_initialChannelNumber == 0)
     {
-      ConfigureDefaultsForStandard ();
+      // set a default channel if the user did not specify anything
+      if (m_initialChannelWidth == 0)
+        {
+          // set a default channel width
+          m_initialChannelWidth = GetDefaultChannelWidth (m_standard, m_band);
+        }
+
+      m_operatingChannel.SetDefault (m_initialChannelWidth, m_standard, m_band);
     }
   else
     {
-      // The user has configured either (or both) Frequency or ChannelNumber
-      ConfigureChannelForStandard ();
+      m_operatingChannel.Set (m_initialChannelNumber, m_initialFrequency, m_initialChannelWidth,
+                              m_standard, m_band);
     }
+  m_operatingChannel.SetPrimary20Index (m_initialPrimary20Index);
+
   switch (standard)
     {
     case WIFI_PHY_STANDARD_80211a:
@@ -1403,9 +1104,6 @@
     case WIFI_PHY_STANDARD_80211p:
       Configure80211p ();
       break;
-    case WIFI_PHY_STANDARD_holland:
-      ConfigureHolland ();
-      break;
     case WIFI_PHY_STANDARD_80211n:
       Configure80211n ();
       break;
@@ -1417,7 +1115,7 @@
       break;
     case WIFI_PHY_STANDARD_UNSPECIFIED:
     default:
-      NS_ASSERT (false);
+      NS_ASSERT_MSG (false, "Unsupported standard");
       break;
     }
 }
@@ -1435,358 +1133,330 @@
   return m_standard;
 }
 
+const WifiPhyOperatingChannel&
+WifiPhy::GetOperatingChannel (void) const
+{
+  return m_operatingChannel;
+}
+
 void
 WifiPhy::SetFrequency (uint16_t frequency)
 {
   NS_LOG_FUNCTION (this << frequency);
-  if (m_isConstructed == false)
+
+  if (!m_operatingChannel.IsSet ())
     {
+      // ConfigureStandardAndBand has not been called yet, so store the frequency
+      // into m_initialFrequency
       NS_LOG_DEBUG ("Saving frequency configuration for initialization");
       m_initialFrequency = frequency;
       return;
     }
+
   if (GetFrequency () == frequency)
     {
       NS_LOG_DEBUG ("No frequency change requested");
       return;
     }
-  if (frequency == 0)
+
+  // if the frequency does not uniquely identify an operating channel,
+  // the simulation aborts
+  SetOperatingChannel (0, frequency, 0);
+}
+
+uint16_t
+WifiPhy::GetFrequency (void) const
+{
+  return m_operatingChannel.GetFrequency ();
+}
+
+void
+WifiPhy::SetChannelNumber (uint8_t nch)
+{
+  NS_LOG_FUNCTION (this << +nch);
+
+  if (!m_operatingChannel.IsSet ())
     {
-      DoFrequencySwitch (0);
-      NS_LOG_DEBUG ("Setting frequency and channel number to zero");
-      m_channelCenterFrequency = 0;
-      m_channelNumber = 0;
+      // ConfigureStandardAndBand has not been called yet, so store the channel
+      // into m_initialChannelNumber
+      NS_LOG_DEBUG ("Saving channel number configuration for initialization");
+      m_initialChannelNumber = nch;
       return;
     }
-  // If the user has configured both Frequency and ChannelNumber, Frequency
-  // takes precedence.  Lookup the channel number corresponding to the
-  // requested frequency.
-  uint8_t nch = FindChannelNumberForFrequencyWidth (frequency, GetChannelWidth ());
-  if (nch != 0)
-    {
-      NS_LOG_DEBUG ("Setting frequency " << frequency << " corresponds to channel " << +nch);
-      if (DoFrequencySwitch (frequency))
-        {
-          NS_LOG_DEBUG ("Channel frequency switched to " << frequency << "; channel number to " << +nch);
-          m_channelCenterFrequency = frequency;
-          m_channelNumber = nch;
-        }
-      else
-        {
-          NS_LOG_DEBUG ("Suppressing reassignment of frequency");
-        }
-    }
-  else
+
+  if (GetChannelNumber () == nch)
     {
-      NS_LOG_DEBUG ("Channel number is unknown for frequency " << frequency);
-      if (DoFrequencySwitch (frequency))
-        {
-          NS_LOG_DEBUG ("Channel frequency switched to " << frequency << "; channel number to " << 0);
-          m_channelCenterFrequency = frequency;
-          m_channelNumber = 0;
-        }
-      else
-        {
-          NS_LOG_DEBUG ("Suppressing reassignment of frequency");
-        }
+      NS_LOG_DEBUG ("No channel change requested");
+      return;
     }
+
+  // if the channel number does not uniquely identify an operating channel,
+  // the simulation aborts
+  SetOperatingChannel (nch, 0, 0);
 }
 
-uint16_t
-WifiPhy::GetFrequency (void) const
+uint8_t
+WifiPhy::GetChannelNumber (void) const
 {
-  return m_channelCenterFrequency;
+  return m_operatingChannel.GetNumber ();
 }
 
 void
 WifiPhy::SetChannelWidth (uint16_t channelWidth)
 {
   NS_LOG_FUNCTION (this << channelWidth);
-  NS_ASSERT_MSG (channelWidth == 5 || channelWidth == 10 || channelWidth == 20 || channelWidth == 22 || channelWidth == 40 || channelWidth == 80 || channelWidth == 160, "wrong channel width value");
-  bool changed = (m_channelWidth != channelWidth);
-  m_channelWidth = channelWidth;
-  AddSupportedChannelWidth (channelWidth);
-  if (changed && !m_capabilitiesChangedCallback.IsNull ())
+
+  if (channelWidth != 0)
     {
-      m_capabilitiesChangedCallback ();
+      AddSupportedChannelWidth (channelWidth);
+    }
+
+  if (!m_operatingChannel.IsSet ())
+    {
+      // ConfigureStandardAndBand has not been called yet, so store the channel width
+      // into m_initialChannelWidth
+      NS_LOG_DEBUG ("Saving channel width configuration for initialization");
+      m_initialChannelWidth = channelWidth;
+      return;
+    }
+
+  if (GetChannelWidth () == channelWidth)
+    {
+      NS_LOG_DEBUG ("No channel width change requested");
+      return;
     }
+
+  NS_ABORT_MSG ("The channel width does not uniquely identify an operating channel.");
 }
 
 uint16_t
 WifiPhy::GetChannelWidth (void) const
 {
-  return m_channelWidth;
+  return m_operatingChannel.GetWidth ();
 }
 
 void
-WifiPhy::SetNumberOfAntennas (uint8_t antennas)
+WifiPhy::SetPrimary20Index (uint8_t index)
 {
-  NS_ASSERT_MSG (antennas > 0 && antennas <= 4, "unsupported number of antennas");
-  m_numberOfAntennas = antennas;
-  m_interference.SetNumberOfReceiveAntennas (antennas);
-}
+  NS_LOG_FUNCTION (this << +index);
 
-uint8_t
-WifiPhy::GetNumberOfAntennas (void) const
-{
-  return m_numberOfAntennas;
-}
-
-void
-WifiPhy::SetMaxSupportedTxSpatialStreams (uint8_t streams)
-{
-  NS_ASSERT (streams <= GetNumberOfAntennas ());
-  bool changed = (m_txSpatialStreams != streams);
-  m_txSpatialStreams = streams;
-  ConfigureHtDeviceMcsSet ();
-  if (changed && !m_capabilitiesChangedCallback.IsNull ())
+  if (!m_operatingChannel.IsSet ())
     {
-      m_capabilitiesChangedCallback ();
+      // ConfigureStandardAndBand has not been called yet, so store the primary20
+      // index into m_initialPrimary20Index
+      NS_LOG_DEBUG ("Saving primary20 index configuration for initialization");
+      m_initialPrimary20Index = index;
+      return;
     }
-}
 
-uint8_t
-WifiPhy::GetMaxSupportedTxSpatialStreams (void) const
-{
-  return m_txSpatialStreams;
+  m_operatingChannel.SetPrimary20Index (index);
 }
 
 void
-WifiPhy::SetMaxSupportedRxSpatialStreams (uint8_t streams)
-{
-  NS_ASSERT (streams <= GetNumberOfAntennas ());
-  bool changed = (m_rxSpatialStreams != streams);
-  m_rxSpatialStreams = streams;
-  if (changed && !m_capabilitiesChangedCallback.IsNull ())
-    {
-      m_capabilitiesChangedCallback ();
-    }
-}
-
-uint8_t
-WifiPhy::GetMaxSupportedRxSpatialStreams (void) const
-{
-  return m_rxSpatialStreams;
-}
-
-uint8_t
-WifiPhy::GetNBssMembershipSelectors (void) const
-{
-  return static_cast<uint8_t> (m_bssMembershipSelectorSet.size ());
-}
-
-uint8_t
-WifiPhy::GetBssMembershipSelector (uint8_t selector) const
+WifiPhy::SetOperatingChannel (uint8_t number, uint16_t frequency, uint16_t width)
 {
-  return m_bssMembershipSelectorSet[selector];
-}
+  Time delay = Seconds (0);
 
-void
-WifiPhy::AddSupportedChannelWidth (uint16_t width)
-{
-  NS_LOG_FUNCTION (this << width);
-  for (std::vector<uint32_t>::size_type i = 0; i != m_supportedChannelWidthSet.size (); i++)
+  if (IsInitialized ())
     {
-      if (m_supportedChannelWidthSet[i] == width)
-        {
-          return;
-        }
+      delay = DoChannelSwitch ();
     }
-  NS_LOG_FUNCTION ("Adding " << width << " to supported channel width set");
-  m_supportedChannelWidthSet.push_back (width);
-}
-
-std::vector<uint16_t>
-WifiPhy::GetSupportedChannelWidthSet (void) const
-{
-  return m_supportedChannelWidthSet;
-}
-
-WifiPhy::FrequencyWidthPair
-WifiPhy::GetFrequencyWidthForChannelNumberStandard (uint8_t channelNumber, WifiPhyBand band, WifiPhyStandard standard) const
-{
-  ChannelNumberStandardPair p = std::make_pair (std::make_pair (channelNumber, band), standard);
-  FrequencyWidthPair f = m_channelToFrequencyWidth[p];
-  return f;
-}
 
-void
-WifiPhy::SetChannelNumber (uint8_t nch)
-{
-  NS_LOG_FUNCTION (this << +nch);
-  if (m_isConstructed == false)
-    {
-      NS_LOG_DEBUG ("Saving channel number configuration for initialization");
-      m_initialChannelNumber = nch;
-      return;
-    }
-  if (GetChannelNumber () == nch)
+  if (delay.IsStrictlyNegative ())
     {
-      NS_LOG_DEBUG ("No channel change requested");
+      // switching channel is not possible now
       return;
     }
-  if (nch == 0)
+  if (delay.IsStrictlyPositive ())
     {
-      // This case corresponds to when there is not a known channel
-      // number for the requested frequency.  There is no need to call
-      // DoChannelSwitch () because DoFrequencySwitch () should have been
-      // called by the client
-      NS_LOG_DEBUG ("Setting channel number to zero");
-      m_channelNumber = 0;
+      // switching channel has been postponed
+      Simulator::Schedule (delay, &WifiPhy::SetOperatingChannel, this, number, frequency, width);
       return;
     }
 
-  // First make sure that the channel number is defined for the standard in use
-  FrequencyWidthPair f = GetFrequencyWidthForChannelNumberStandard (nch, GetPhyBand (), GetPhyStandard ());
-  if (f.first == 0)
+  // channel can be switched now.
+  uint16_t prevChannelWidth = 0;
+  if (m_operatingChannel.IsSet ())
     {
-      f = GetFrequencyWidthForChannelNumberStandard (nch, GetPhyBand (), WIFI_PHY_STANDARD_UNSPECIFIED);
+      prevChannelWidth = GetChannelWidth ();
     }
-  if (f.first != 0)
+
+  m_operatingChannel.Set (number, frequency, width, m_standard, m_band);
+
+  if (GetChannelWidth () != prevChannelWidth)
     {
-      if (DoChannelSwitch (nch))
-        {
-          NS_LOG_DEBUG ("Setting frequency to " << f.first << "; width to " << +f.second);
-          m_channelCenterFrequency = f.first;
-          SetChannelWidth (f.second);
-          m_channelNumber = nch;
-        }
-      else
+      AddSupportedChannelWidth (GetChannelWidth ());
+
+      // If channel width changed after initialization, invoke the capabilities changed callback
+      if (IsInitialized () && !m_capabilitiesChangedCallback.IsNull ())
         {
-          // Subclass may have suppressed (e.g. waiting for state change)
-          NS_LOG_DEBUG ("Channel switch suppressed");
+          m_capabilitiesChangedCallback ();
         }
     }
-  else
-    {
-      NS_FATAL_ERROR ("Frequency not found for channel number " << +nch);
-    }
-}
-
-uint8_t
-WifiPhy::GetChannelNumber (void) const
-{
-  return m_channelNumber;
 }
 
-bool
-WifiPhy::DoChannelSwitch (uint8_t nch)
+Time
+WifiPhy::DoChannelSwitch (void)
 {
   m_powerRestricted = false;
   m_channelAccessRequested = false;
+  m_currentEvent = 0;
+  m_currentPreambleEvents.clear ();
   if (!IsInitialized ())
     {
       //this is not channel switch, this is initialization
-      NS_LOG_DEBUG ("initialize to channel " << +nch);
-      return true;
+      NS_LOG_DEBUG ("Before initialization, nothing to do");
+      return Seconds (0);
     }
 
+  Time delay = Seconds (0);
+
   NS_ASSERT (!IsStateSwitching ());
   switch (m_state->GetState ())
     {
     case WifiPhyState::RX:
       NS_LOG_DEBUG ("drop packet because of channel switching while reception");
       m_endPhyRxEvent.Cancel ();
-      m_endRxEvent.Cancel ();
-      m_endPreambleDetectionEvent.Cancel ();
-      goto switchChannel;
+      for (auto & phyEntity : m_phyEntities)
+        {
+          phyEntity.second->CancelAllEvents ();
+        }
       break;
     case WifiPhyState::TX:
       NS_LOG_DEBUG ("channel switching postponed until end of current transmission");
-      Simulator::Schedule (GetDelayUntilIdle (), &WifiPhy::SetChannelNumber, this, nch);
+      delay = GetDelayUntilIdle ();
       break;
     case WifiPhyState::CCA_BUSY:
     case WifiPhyState::IDLE:
-      if (m_endPreambleDetectionEvent.IsRunning ())
+      for (auto & phyEntity : m_phyEntities)
         {
-          m_endPreambleDetectionEvent.Cancel ();
-          m_endRxEvent.Cancel ();
+          phyEntity.second->CancelAllEvents ();
         }
-      goto switchChannel;
       break;
     case WifiPhyState::SLEEP:
       NS_LOG_DEBUG ("channel switching ignored in sleep mode");
+      delay = Seconds (-1);  // negative value to indicate switching not possible
       break;
     default:
       NS_ASSERT (false);
       break;
     }
 
-  return false;
+  if (delay.IsZero ())
+    {
+      // channel switch can be done now
+      NS_LOG_DEBUG ("switching channel");
+      m_state->SwitchToChannelSwitching (GetChannelSwitchDelay ());
+      m_interference.EraseEvents ();
+      /*
+      * Needed here to be able to correctly sensed the medium for the first
+      * time after the switching. The actual switching is not performed until
+      * after m_channelSwitchDelay. Packets received during the switching
+      * state are added to the event list and are employed later to figure
+      * out the state of the medium after the switching.
+      */
+    }
 
-switchChannel:
+  return delay;
+}
 
-  NS_LOG_DEBUG ("switching channel " << +GetChannelNumber () << " -> " << +nch);
-  m_state->SwitchToChannelSwitching (GetChannelSwitchDelay ());
-  m_interference.EraseEvents ();
-  /*
-   * Needed here to be able to correctly sensed the medium for the first
-   * time after the switching. The actual switching is not performed until
-   * after m_channelSwitchDelay. Packets received during the switching
-   * state are added to the event list and are employed later to figure
-   * out the state of the medium after the switching.
-   */
-  return true;
+void
+WifiPhy::SetNumberOfAntennas (uint8_t antennas)
+{
+  NS_ASSERT_MSG (antennas > 0 && antennas <= 4, "unsupported number of antennas");
+  m_numberOfAntennas = antennas;
+  m_interference.SetNumberOfReceiveAntennas (antennas);
 }
 
-bool
-WifiPhy::DoFrequencySwitch (uint16_t frequency)
+uint8_t
+WifiPhy::GetNumberOfAntennas (void) const
 {
-  m_powerRestricted = false;
-  m_channelAccessRequested = false;
-  if (!IsInitialized ())
+  return m_numberOfAntennas;
+}
+
+void
+WifiPhy::SetMaxSupportedTxSpatialStreams (uint8_t streams)
+{
+  NS_ASSERT (streams <= GetNumberOfAntennas ());
+  bool changed = (m_txSpatialStreams != streams);
+  m_txSpatialStreams = streams;
+  if (changed)
     {
-      //this is not channel switch, this is initialization
-      NS_LOG_DEBUG ("start at frequency " << frequency);
-      return true;
+      auto phyEntity = m_phyEntities.find (WIFI_MOD_CLASS_HT);
+      if (phyEntity != m_phyEntities.end ())
+        {
+          Ptr<HtPhy> htPhy = DynamicCast<HtPhy> (phyEntity->second);
+          if (htPhy)
+            {
+              htPhy->SetMaxSupportedNss (m_txSpatialStreams); //this is essential to have the right MCSs configured
+            }
+
+          if (!m_capabilitiesChangedCallback.IsNull ())
+            {
+              m_capabilitiesChangedCallback ();
+            }
+        }
     }
+}
 
-  NS_ASSERT (!IsStateSwitching ());
-  switch (m_state->GetState ())
+uint8_t
+WifiPhy::GetMaxSupportedTxSpatialStreams (void) const
+{
+  return m_txSpatialStreams;
+}
+
+void
+WifiPhy::SetMaxSupportedRxSpatialStreams (uint8_t streams)
+{
+  NS_ASSERT (streams <= GetNumberOfAntennas ());
+  bool changed = (m_rxSpatialStreams != streams);
+  m_rxSpatialStreams = streams;
+  if (changed && !m_capabilitiesChangedCallback.IsNull ())
     {
-    case WifiPhyState::RX:
-      NS_LOG_DEBUG ("drop packet because of channel/frequency switching while reception");
-      m_endPhyRxEvent.Cancel ();
-      m_endRxEvent.Cancel ();
-      m_endPreambleDetectionEvent.Cancel ();
-      goto switchFrequency;
-      break;
-    case WifiPhyState::TX:
-      NS_LOG_DEBUG ("channel/frequency switching postponed until end of current transmission");
-      Simulator::Schedule (GetDelayUntilIdle (), &WifiPhy::SetFrequency, this, frequency);
-      break;
-    case WifiPhyState::CCA_BUSY:
-    case WifiPhyState::IDLE:
-      if (m_endPreambleDetectionEvent.IsRunning ())
+      m_capabilitiesChangedCallback ();
+    }
+}
+
+uint8_t
+WifiPhy::GetMaxSupportedRxSpatialStreams (void) const
+{
+  return m_rxSpatialStreams;
+}
+
+std::list<uint8_t>
+WifiPhy::GetBssMembershipSelectorList (void) const
+{
+  std::list<uint8_t> list;
+  for (const auto & phyEntity : m_phyEntities)
+    {
+      Ptr<HtPhy> htPhy = DynamicCast<HtPhy> (phyEntity.second);
+      if (htPhy)
         {
-          m_endPreambleDetectionEvent.Cancel ();
-          m_endRxEvent.Cancel ();
+          list.emplace_back (htPhy->GetBssMembershipSelector ());
         }
-      goto switchFrequency;
-      break;
-    case WifiPhyState::SLEEP:
-      NS_LOG_DEBUG ("frequency switching ignored in sleep mode");
-      break;
-    default:
-      NS_ASSERT (false);
-      break;
     }
+  return list;
+}
 
-  return false;
-
-switchFrequency:
+void
+WifiPhy::AddSupportedChannelWidth (uint16_t width)
+{
+  NS_LOG_FUNCTION (this << width);
+  for (std::vector<uint32_t>::size_type i = 0; i != m_supportedChannelWidthSet.size (); i++)
+    {
+      if (m_supportedChannelWidthSet[i] == width)
+        {
+          return;
+        }
+    }
+  NS_LOG_FUNCTION ("Adding " << width << " to supported channel width set");
+  m_supportedChannelWidthSet.push_back (width);
+}
 
-  NS_LOG_DEBUG ("switching frequency " << GetFrequency () << " -> " << frequency);
-  m_state->SwitchToChannelSwitching (GetChannelSwitchDelay ());
-  m_interference.EraseEvents ();
-  /*
-   * Needed here to be able to correctly sensed the medium for the first
-   * time after the switching. The actual switching is not performed until
-   * after m_channelSwitchDelay. Packets received during the switching
-   * state are added to the event list and are employed later to figure
-   * out the state of the medium after the switching.
-   */
-  return true;
+std::vector<uint16_t>
+WifiPhy::GetSupportedChannelWidthSet (void) const
+{
+  return m_supportedChannelWidthSet;
 }
 
 void
@@ -1830,9 +1500,11 @@
   m_powerRestricted = false;
   m_channelAccessRequested = false;
   m_endPhyRxEvent.Cancel ();
-  m_endRxEvent.Cancel ();
-  m_endPreambleDetectionEvent.Cancel ();
   m_endTxEvent.Cancel ();
+  for (auto & phyEntity : m_phyEntities)
+    {
+      phyEntity.second->CancelAllEvents ();
+    }
   m_state->SwitchToOff ();
 }
 
@@ -1840,6 +1512,7 @@
 WifiPhy::ResumeFromSleep (void)
 {
   NS_LOG_FUNCTION (this);
+  m_currentPreambleEvents.clear ();
   switch (m_state->GetState ())
     {
     case WifiPhyState::TX:
@@ -1854,8 +1527,7 @@
     case WifiPhyState::SLEEP:
       {
         NS_LOG_DEBUG ("resuming from sleep mode");
-        uint16_t primaryChannelWidth = GetChannelWidth () >= 40 ? 20 : GetChannelWidth ();
-        Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaEdThresholdW, GetBand (primaryChannelWidth));
+        Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaEdThresholdW, GetPrimaryBand (GetMeasurementChannelWidth (nullptr)));
         m_state->SwitchFromSleep (delayUntilCcaEnd);
         break;
       }
@@ -1886,8 +1558,7 @@
     case WifiPhyState::OFF:
       {
         NS_LOG_DEBUG ("resuming from off mode");
-        uint16_t primaryChannelWidth = GetChannelWidth () >= 40 ? 20 : GetChannelWidth ();
-        Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaEdThresholdW, GetBand (primaryChannelWidth));
+        Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaEdThresholdW, GetPrimaryBand (GetMeasurementChannelWidth (nullptr)));
         m_state->SwitchFromOff (delayUntilCcaEnd);
         break;
       }
@@ -1899,683 +1570,73 @@
     }
 }
 
-WifiMode
-WifiPhy::GetHtPhyHeaderMode ()
+Time
+WifiPhy::GetPreambleDetectionDuration (void)
 {
-  return WifiPhy::GetHtMcs0 ();
+  return MicroSeconds (4);
 }
 
-WifiMode
-WifiPhy::GetVhtPhyHeaderMode ()
+Time
+WifiPhy::GetStartOfPacketDuration (const WifiTxVector& txVector)
 {
-  return WifiPhy::GetVhtMcs0 ();
+  return MicroSeconds (4);
 }
 
-WifiMode
-WifiPhy::GetHePhyHeaderMode ()
+Time
+WifiPhy::GetPayloadDuration (uint32_t size, const WifiTxVector& txVector, WifiPhyBand band, MpduType mpdutype, uint16_t staId)
 {
-  return WifiPhy::GetHeMcs0 ();
+  uint32_t totalAmpduSize;
+  double totalAmpduNumSymbols;
+  return GetPayloadDuration (size, txVector, band, mpdutype, false, totalAmpduSize, totalAmpduNumSymbols, staId);
 }
 
 Time
-WifiPhy::GetPreambleDetectionDuration (void)
+WifiPhy::GetPayloadDuration (uint32_t size, const WifiTxVector& txVector, WifiPhyBand band, MpduType mpdutype,
+                             bool incFlag, uint32_t &totalAmpduSize, double &totalAmpduNumSymbols,
+                             uint16_t staId)
 {
-  return MicroSeconds (4);
+  return GetStaticPhyEntity (txVector.GetModulationClass ())->GetPayloadDuration (size, txVector, band, mpdutype,
+                                                                                  incFlag, totalAmpduSize, totalAmpduNumSymbols,
+                                                                                  staId);
 }
 
 Time
-WifiPhy::GetPhyTrainingSymbolDuration (WifiTxVector txVector)
+WifiPhy::CalculatePhyPreambleAndHeaderDuration (const WifiTxVector& txVector)
 {
-  uint8_t Ndltf, Neltf;
-  //We suppose here that STBC = 0.
-  //If STBC > 0, we need a different mapping between Nss and Nltf (IEEE 802.11n-2012 standard, page 1682).
-  uint8_t nss = txVector.GetNssMax (); //so as to cover also HE MU case (see section 27.3.10.10 of IEEE P802.11ax/D4.0)
-  if (nss < 3)
-    {
-      Ndltf = nss;
-    }
-  else if (nss < 5)
-    {
-      Ndltf = 4;
-    }
-  else if (nss < 7)
-    {
-      Ndltf = 6;
-    }
-  else
-    {
-      Ndltf = 8;
-    }
-
-  if (txVector.GetNess () < 3)
-    {
-      Neltf = txVector.GetNess ();
-    }
-  else
-    {
-      Neltf = 4;
-    }
-
-  switch (txVector.GetPreambleType ())
-    {
-    case WIFI_PREAMBLE_HT_MF:
-      return MicroSeconds (4 + (4 * Ndltf) + (4 * Neltf));
-    case WIFI_PREAMBLE_HT_GF:
-      return MicroSeconds ((4 * Ndltf) + (4 * Neltf));
-    case WIFI_PREAMBLE_VHT_SU:
-    case WIFI_PREAMBLE_VHT_MU:
-      return MicroSeconds (4 + (4 * Ndltf));
-    case WIFI_PREAMBLE_HE_SU:
-    case WIFI_PREAMBLE_HE_MU:
-    case WIFI_PREAMBLE_HE_TB:
-      return MicroSeconds (4 + (8 * Ndltf));
-    default:
-      return MicroSeconds (0);
-    }
+  return GetStaticPhyEntity (txVector.GetModulationClass ())->CalculatePhyPreambleAndHeaderDuration (txVector);
 }
 
 Time
-WifiPhy::GetPhyHtSigHeaderDuration (WifiPreamble preamble)
+WifiPhy::CalculateTxDuration (uint32_t size, const WifiTxVector& txVector, WifiPhyBand band, uint16_t staId)
 {
-  switch (preamble)
-    {
-    case WIFI_PREAMBLE_HT_MF:
-    case WIFI_PREAMBLE_HT_GF:
-      //HT-SIG
-      return MicroSeconds (8);
-    default:
-      //no HT-SIG for non HT
-      return MicroSeconds (0);
-    }
+  Time duration = CalculatePhyPreambleAndHeaderDuration (txVector)
+    + GetPayloadDuration (size, txVector, band, NORMAL_MPDU, staId);
+  NS_ASSERT (duration.IsStrictlyPositive ());
+  return duration;
 }
 
 Time
-WifiPhy::GetPhySigA1Duration (WifiPreamble preamble)
+WifiPhy::CalculateTxDuration (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, WifiPhyBand band)
 {
-  switch (preamble)
-    {
-    case WIFI_PREAMBLE_VHT_SU:
-    case WIFI_PREAMBLE_HE_SU:
-    case WIFI_PREAMBLE_VHT_MU:
-    case WIFI_PREAMBLE_HE_MU:
-    case WIFI_PREAMBLE_HE_TB:
-      //VHT-SIG-A1 and HE-SIG-A1
-      return MicroSeconds (4);
-    default:
-      // no SIG-A1
-      return MicroSeconds (0);
-    }
+  return CalculateTxDuration (GetWifiConstPsduMap (psdu, txVector), txVector, band);
 }
 
 Time
-WifiPhy::GetPhySigA2Duration (WifiPreamble preamble)
+WifiPhy::CalculateTxDuration (WifiConstPsduMap psduMap, const WifiTxVector& txVector, WifiPhyBand band)
 {
-  switch (preamble)
-    {
-    case WIFI_PREAMBLE_VHT_SU:
-    case WIFI_PREAMBLE_HE_SU:
-    case WIFI_PREAMBLE_VHT_MU:
-    case WIFI_PREAMBLE_HE_MU:
-      //VHT-SIG-A2 and HE-SIG-A2
-      return MicroSeconds (4);
-    default:
-      // no SIG-A2
-      return MicroSeconds (0);
-    }
+  return GetStaticPhyEntity (txVector.GetModulationClass ())->CalculateTxDuration (psduMap, txVector, band);
 }
 
-Time
-WifiPhy::GetPhySigBDuration (WifiPreamble preamble)
+uint32_t
+WifiPhy::GetMaxPsduSize (WifiModulationClass modulation)
 {
-  switch (preamble)
-    {
-    case WIFI_PREAMBLE_VHT_MU:
-    case WIFI_PREAMBLE_HE_MU:
-      return MicroSeconds (4);
-    default:
-      // no SIG-B
-      return MicroSeconds (0);
-    }
+  return GetStaticPhyEntity (modulation)->GetMaxPsduSize ();
 }
 
-WifiMode
-WifiPhy::GetPhyHeaderMode (WifiTxVector txVector)
+void
+WifiPhy::NotifyTxBegin (WifiConstPsduMap psdus, double txPowerW)
 {
-  WifiPreamble preamble = txVector.GetPreambleType ();
-  switch (preamble)
-    {
-    case WIFI_PREAMBLE_LONG:
-    case WIFI_PREAMBLE_SHORT:
-      {
-        switch (txVector.GetMode ().GetModulationClass ())
-          {
-            case WIFI_MOD_CLASS_OFDM:
-              {
-                switch (txVector.GetChannelWidth ())
-                  {
-                    case 5:
-                      return WifiPhy::GetOfdmRate1_5MbpsBW5MHz ();
-                    case 10:
-                      return WifiPhy::GetOfdmRate3MbpsBW10MHz ();
-                    case 20:
-                    default:
-                      //(Section 17.3.2 "PPDU frame format"; IEEE Std 802.11-2016)
-                      //actually this is only the first part of the PhyHeader,
-                      //because the last 16 bits of the PhyHeader are using the
-                      //same mode of the payload
-                      return WifiPhy::GetOfdmRate6Mbps ();
-                  }
-              }
-            case WIFI_MOD_CLASS_ERP_OFDM:
-              return WifiPhy::GetErpOfdmRate6Mbps ();
-            case WIFI_MOD_CLASS_DSSS:
-            case WIFI_MOD_CLASS_HR_DSSS:
-              {
-                if (preamble == WIFI_PREAMBLE_LONG || txVector.GetMode () == WifiPhy::GetDsssRate1Mbps ())
-                  {
-                    //(Section 16.2.3 "PPDU field definitions" and Section 16.2.2.2 "Long PPDU format"; IEEE Std 802.11-2016)
-                    return WifiPhy::GetDsssRate1Mbps ();
-                  }
-                else
-                  {
-                    //(Section 16.2.2.3 "Short PPDU format"; IEEE Std 802.11-2016)
-                    return WifiPhy::GetDsssRate2Mbps ();
-                  }
-              }
-            default:
-              NS_FATAL_ERROR ("unsupported modulation class");
-              return WifiMode ();
-          }
-      }
-    case WIFI_PREAMBLE_HT_MF:
-    case WIFI_PREAMBLE_HT_GF:
-    case WIFI_PREAMBLE_VHT_SU:
-    case WIFI_PREAMBLE_VHT_MU:
-    case WIFI_PREAMBLE_HE_SU:
-    case WIFI_PREAMBLE_HE_ER_SU:
-    case WIFI_PREAMBLE_HE_MU:
-    case WIFI_PREAMBLE_HE_TB:
-      return WifiPhy::GetOfdmRate6Mbps ();
-    default:
-      NS_FATAL_ERROR ("unsupported preamble type");
-      return WifiMode ();
-    }
-}
-
-Time
-WifiPhy::GetPhyHeaderDuration (WifiTxVector txVector)
-{
-  WifiPreamble preamble = txVector.GetPreambleType ();
-  switch (txVector.GetPreambleType ())
-    {
-    case WIFI_PREAMBLE_LONG:
-    case WIFI_PREAMBLE_SHORT:
-      {
-        switch (txVector.GetMode ().GetModulationClass ())
-          {
-          case WIFI_MOD_CLASS_OFDM:
-            {
-              switch (txVector.GetChannelWidth ())
-                {
-                case 20:
-                default:
-                  //(Section 17.3.3 "PHY preamble (SYNC))" and Figure 17-4 "OFDM training structure"; IEEE Std 802.11-2016)
-                  //also (Section 17.3.2.4 "Timing related parameters" Table 17-5 "Timing-related parameters"; IEEE Std 802.11-2016)
-                  //We return the duration of the SIGNAL field only, since the
-                  //SERVICE field (which strictly speaking belongs to the PHY
-                  //header, see Section 17.3.2 and Figure 17-1) is sent using the
-                  //payload mode.
-                  return MicroSeconds (4);
-                case 10:
-                  //(Section 17.3.2.4 "Timing related parameters" Table 17-5 "Timing-related parameters"; IEEE Std 802.11-2016)
-                  return MicroSeconds (8);
-                case 5:
-                  //(Section 17.3.2.4 "Timing related parameters" Table 17-5 "Timing-related parameters"; IEEE Std 802.11-2016)
-                  return MicroSeconds (16);
-                }
-            }
-          case WIFI_MOD_CLASS_ERP_OFDM:
-            return MicroSeconds (4);
-          case WIFI_MOD_CLASS_DSSS:
-          case WIFI_MOD_CLASS_HR_DSSS:
-            {
-              if ((preamble == WIFI_PREAMBLE_SHORT) && (txVector.GetMode ().GetDataRate (22) > 1000000))
-                {
-                  //(Section 16.2.2.3 "Short PPDU format" and Figure 16-2 "Short PPDU format"; IEEE Std 802.11-2016)
-                  return MicroSeconds (24);
-                }
-              else
-                {
-                  //(Section 16.2.2.2 "Long PPDU format" and Figure 16-1 "Short PPDU format"; IEEE Std 802.11-2016)
-                  return MicroSeconds (48);
-                }
-            }
-          default:
-            NS_FATAL_ERROR ("modulation class is not matching the preamble type");
-            return MicroSeconds (0);
-          }
-      }
-    case WIFI_PREAMBLE_HT_MF:
-    case WIFI_PREAMBLE_VHT_SU:
-    case WIFI_PREAMBLE_VHT_MU:
-      //L-SIG
-      return MicroSeconds (4);
-    case WIFI_PREAMBLE_HE_SU:
-    case WIFI_PREAMBLE_HE_ER_SU:
-    case WIFI_PREAMBLE_HE_MU:
-    case WIFI_PREAMBLE_HE_TB:
-      //LSIG + R-LSIG
-      return MicroSeconds (8);
-    case WIFI_PREAMBLE_HT_GF:
-      return MicroSeconds (0);
-    default:
-      NS_FATAL_ERROR ("unsupported preamble type");
-      return MicroSeconds (0);
-    }
-}
-
-Time
-WifiPhy::GetStartOfPacketDuration (WifiTxVector txVector)
-{
-  return MicroSeconds (4);
-}
-
-Time
-WifiPhy::GetPhyPreambleDuration (WifiTxVector txVector)
-{
-  WifiPreamble preamble = txVector.GetPreambleType ();
-  switch (txVector.GetPreambleType ())
-    {
-    case WIFI_PREAMBLE_LONG:
-    case WIFI_PREAMBLE_SHORT:
-      {
-        switch (txVector.GetMode ().GetModulationClass ())
-          {
-            case WIFI_MOD_CLASS_OFDM:
-              {
-                switch (txVector.GetChannelWidth ())
-                  {
-                    case 20:
-                    default:
-                      //(Section 17.3.3 "PHY preamble (SYNC))" Figure 17-4 "OFDM training structure"
-                      //also Section 17.3.2.3 "Modulation-dependent parameters" Table 17-4 "Modulation-dependent parameters"; IEEE Std 802.11-2016)
-                      return MicroSeconds (16);
-                    case 10:
-                      //(Section 17.3.3 "PHY preamble (SYNC))" Figure 17-4 "OFDM training structure"
-                      //also Section 17.3.2.3 "Modulation-dependent parameters" Table 17-4 "Modulation-dependent parameters"; IEEE Std 802.11-2016)
-                      return MicroSeconds (32);
-                    case 5:
-                      //(Section 17.3.3 "PHY preamble (SYNC))" Figure 17-4 "OFDM training structure"
-                      //also Section 17.3.2.3 "Modulation-dependent parameters" Table 17-4 "Modulation-dependent parameters"; IEEE Std 802.11-2016)
-                      return MicroSeconds (64);
-                  }
-              }
-            case WIFI_MOD_CLASS_ERP_OFDM:
-              return MicroSeconds (16);
-            case WIFI_MOD_CLASS_DSSS:
-            case WIFI_MOD_CLASS_HR_DSSS:
-              {
-                if ((preamble == WIFI_PREAMBLE_SHORT) && (txVector.GetMode ().GetDataRate (22) > 1000000))
-                  {
-                    //(Section 17.2.2.3 "Short PPDU format)" Figure 17-2 "Short PPDU format"; IEEE Std 802.11-2012)
-                    return MicroSeconds (72);
-                  }
-                else
-                  {
-                    //(Section 17.2.2.2 "Long PPDU format)" Figure 17-1 "Long PPDU format"; IEEE Std 802.11-2012)
-                    return MicroSeconds (144);
-                  }
-              }
-            default:
-              NS_FATAL_ERROR ("modulation class is not matching the preamble type");
-              return MicroSeconds (0);
-          }
-      }
-    case WIFI_PREAMBLE_HT_MF:
-    case WIFI_PREAMBLE_VHT_SU:
-    case WIFI_PREAMBLE_VHT_MU:
-    case WIFI_PREAMBLE_HE_SU:
-    case WIFI_PREAMBLE_HE_ER_SU:
-    case WIFI_PREAMBLE_HE_MU:
-    case WIFI_PREAMBLE_HE_TB:
-      //L-STF + L-LTF
-      return MicroSeconds (16);
-    case WIFI_PREAMBLE_HT_GF:
-      //HT-GF-STF + HT-LTF1
-      return MicroSeconds (16);
-    default:
-      NS_FATAL_ERROR ("unsupported preamble type");
-      return MicroSeconds (0);
-    }
-}
-
-Time
-WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txVector, WifiPhyBand band, MpduType mpdutype, uint16_t staId)
-{
-  uint32_t totalAmpduSize;
-  double totalAmpduNumSymbols;
-  return GetPayloadDuration (size, txVector, band, mpdutype, false, totalAmpduSize, totalAmpduNumSymbols, staId);
-}
-
-Time
-WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txVector, WifiPhyBand band, MpduType mpdutype,
-                             bool incFlag, uint32_t &totalAmpduSize, double &totalAmpduNumSymbols,
-                             uint16_t staId)
-{
-  WifiMode payloadMode = txVector.GetMode (staId);
-  NS_LOG_FUNCTION (size << payloadMode);
-
-  double stbc = 1;
-  if (txVector.IsStbc ()
-      && (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_HT
-          || payloadMode.GetModulationClass () == WIFI_MOD_CLASS_VHT))
-    {
-      stbc = 2;
-    }
-
-  double Nes = 1;
-  //todo: improve logic to reduce the number of if cases
-  //todo: extend to NSS > 4 for VHT rates
-  if (payloadMode == GetHtMcs21 ()
-      || payloadMode == GetHtMcs22 ()
-      || payloadMode == GetHtMcs23 ()
-      || payloadMode == GetHtMcs28 ()
-      || payloadMode == GetHtMcs29 ()
-      || payloadMode == GetHtMcs30 ()
-      || payloadMode == GetHtMcs31 ())
-    {
-      Nes = 2;
-    }
-  if (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
-    {
-      if (txVector.GetChannelWidth () == 40
-          && txVector.GetNss (staId) == 3
-          && payloadMode.GetMcsValue () >= 8)
-        {
-          Nes = 2;
-        }
-      if (txVector.GetChannelWidth () == 80
-          && txVector.GetNss (staId) == 2
-          && payloadMode.GetMcsValue () >= 7)
-        {
-          Nes = 2;
-        }
-      if (txVector.GetChannelWidth () == 80
-          && txVector.GetNss (staId) == 3
-          && payloadMode.GetMcsValue () >= 7)
-        {
-          Nes = 2;
-        }
-      if (txVector.GetChannelWidth () == 80
-          && txVector.GetNss (staId) == 3
-          && payloadMode.GetMcsValue () == 9)
-        {
-          Nes = 3;
-        }
-      if (txVector.GetChannelWidth () == 80
-          && txVector.GetNss (staId) == 4
-          && payloadMode.GetMcsValue () >= 4)
-        {
-          Nes = 2;
-        }
-      if (txVector.GetChannelWidth () == 80
-          && txVector.GetNss (staId) == 4
-          && payloadMode.GetMcsValue () >= 7)
-        {
-          Nes = 3;
-        }
-      if (txVector.GetChannelWidth () == 160
-          && payloadMode.GetMcsValue () >= 7)
-        {
-          Nes = 2;
-        }
-      if (txVector.GetChannelWidth () == 160
-          && txVector.GetNss (staId) == 2
-          && payloadMode.GetMcsValue () >= 4)
-        {
-          Nes = 2;
-        }
-      if (txVector.GetChannelWidth () == 160
-          && txVector.GetNss (staId) == 2
-          && payloadMode.GetMcsValue () >= 7)
-        {
-          Nes = 3;
-        }
-      if (txVector.GetChannelWidth () == 160
-          && txVector.GetNss (staId) == 3
-          && payloadMode.GetMcsValue () >= 3)
-        {
-          Nes = 2;
-        }
-      if (txVector.GetChannelWidth () == 160
-          && txVector.GetNss (staId) == 3
-          && payloadMode.GetMcsValue () >= 5)
-        {
-          Nes = 3;
-        }
-      if (txVector.GetChannelWidth () == 160
-          && txVector.GetNss (staId) == 3
-          && payloadMode.GetMcsValue () >= 7)
-        {
-          Nes = 4;
-        }
-      if (txVector.GetChannelWidth () == 160
-          && txVector.GetNss (staId) == 4
-          && payloadMode.GetMcsValue () >= 2)
-        {
-          Nes = 2;
-        }
-      if (txVector.GetChannelWidth () == 160
-          && txVector.GetNss (staId) == 4
-          && payloadMode.GetMcsValue () >= 4)
-        {
-          Nes = 3;
-        }
-      if (txVector.GetChannelWidth () == 160
-          && txVector.GetNss (staId) == 4
-          && payloadMode.GetMcsValue () >= 5)
-        {
-          Nes = 4;
-        }
-      if (txVector.GetChannelWidth () == 160
-          && txVector.GetNss (staId) == 4
-          && payloadMode.GetMcsValue () >= 7)
-        {
-          Nes = 6;
-        }
-    }
-
-  Time symbolDuration = Seconds (0);
-  switch (payloadMode.GetModulationClass ())
-    {
-    case WIFI_MOD_CLASS_OFDM:
-    case WIFI_MOD_CLASS_ERP_OFDM:
-      {
-        //(Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012
-        //corresponds to T_{SYM} in the table)
-        switch (txVector.GetChannelWidth ())
-          {
-          case 20:
-          default:
-            symbolDuration = MicroSeconds (4);
-            break;
-          case 10:
-            symbolDuration = MicroSeconds (8);
-            break;
-          case 5:
-            symbolDuration = MicroSeconds (16);
-            break;
-          }
-        break;
-      }
-    case WIFI_MOD_CLASS_HT:
-    case WIFI_MOD_CLASS_VHT:
-      {
-        //if short GI data rate is used then symbol duration is 3.6us else symbol duration is 4us
-        //In the future has to create a station manager that only uses these data rates if sender and receiver support GI
-        uint16_t gi = txVector.GetGuardInterval ();
-        NS_ASSERT (gi == 400 || gi == 800);
-        symbolDuration = NanoSeconds (3200 + gi);
-      }
-      break;
-    case WIFI_MOD_CLASS_HE:
-      {
-        //if short GI data rate is used then symbol duration is 3.6us else symbol duration is 4us
-        //In the future has to create a station manager that only uses these data rates if sender and receiver support GI
-        uint16_t gi = txVector.GetGuardInterval ();
-        NS_ASSERT (gi == 800 || gi == 1600 || gi == 3200);
-        symbolDuration = NanoSeconds (12800 + gi);
-      }
-      break;
-    default:
-      break;
-    }
-
-  double numDataBitsPerSymbol = payloadMode.GetDataRate (txVector, staId) * symbolDuration.GetNanoSeconds () / 1e9;
-
-  double numSymbols = 0;
-  if (mpdutype == FIRST_MPDU_IN_AGGREGATE)
-    {
-      //First packet in an A-MPDU
-      numSymbols = (stbc * (16 + size * 8.0 + 6 * Nes) / (stbc * numDataBitsPerSymbol));
-      if (incFlag == 1)
-        {
-          totalAmpduSize += size;
-          totalAmpduNumSymbols += numSymbols;
-        }
-    }
-  else if (mpdutype == MIDDLE_MPDU_IN_AGGREGATE)
-    {
-      //consecutive packets in an A-MPDU
-      numSymbols = (stbc * size * 8.0) / (stbc * numDataBitsPerSymbol);
-      if (incFlag == 1)
-        {
-          totalAmpduSize += size;
-          totalAmpduNumSymbols += numSymbols;
-        }
-    }
-  else if (mpdutype == LAST_MPDU_IN_AGGREGATE)
-    {
-      //last packet in an A-MPDU
-      uint32_t totalSize = totalAmpduSize + size;
-      numSymbols = lrint (stbc * ceil ((16 + totalSize * 8.0 + 6 * Nes) / (stbc * numDataBitsPerSymbol)));
-      NS_ASSERT (totalAmpduNumSymbols <= numSymbols);
-      numSymbols -= totalAmpduNumSymbols;
-      if (incFlag == 1)
-        {
-          totalAmpduSize = 0;
-          totalAmpduNumSymbols = 0;
-        }
-    }
-  else if (mpdutype == NORMAL_MPDU || mpdutype == SINGLE_MPDU)
-    {
-      //Not an A-MPDU or single MPDU (i.e. the current payload contains both service and padding)
-      //The number of OFDM symbols in the data field when BCC encoding
-      //is used is given in equation 19-32 of the IEEE 802.11-2016 standard.
-      numSymbols = lrint (stbc * ceil ((16 + size * 8.0 + 6.0 * Nes) / (stbc * numDataBitsPerSymbol)));
-    }
-  else
-    {
-      NS_FATAL_ERROR ("Unknown MPDU type");
-    }
-
-  switch (payloadMode.GetModulationClass ())
-    {
-    case WIFI_MOD_CLASS_OFDM:
-    case WIFI_MOD_CLASS_ERP_OFDM:
-      {
-        //Add signal extension for ERP PHY
-        if (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM)
-          {
-            return FemtoSeconds (static_cast<uint64_t> (numSymbols * symbolDuration.GetFemtoSeconds ())) + MicroSeconds (6);
-          }
-        else
-          {
-            return FemtoSeconds (static_cast<uint64_t> (numSymbols * symbolDuration.GetFemtoSeconds ()));
-          }
-      }
-    case WIFI_MOD_CLASS_HT:
-    case WIFI_MOD_CLASS_VHT:
-      {
-        if ((payloadMode.GetModulationClass () == WIFI_MOD_CLASS_HT) && (band == WIFI_PHY_BAND_2_4GHZ)
-            && (mpdutype == NORMAL_MPDU || mpdutype == SINGLE_MPDU || mpdutype == LAST_MPDU_IN_AGGREGATE)) //at 2.4 GHz
-          {
-            return FemtoSeconds (static_cast<uint64_t> (numSymbols * symbolDuration.GetFemtoSeconds ())) + MicroSeconds (6);
-          }
-        else //at 5 GHz
-          {
-            return FemtoSeconds (static_cast<uint64_t> (numSymbols * symbolDuration.GetFemtoSeconds ()));
-          }
-      }
-    case WIFI_MOD_CLASS_HE:
-      {
-        if ((band == WIFI_PHY_BAND_2_4GHZ)
-            && ((mpdutype == NORMAL_MPDU || mpdutype == SINGLE_MPDU || mpdutype == LAST_MPDU_IN_AGGREGATE))) //at 2.4 GHz
-          {
-            return FemtoSeconds (static_cast<uint64_t> (numSymbols * symbolDuration.GetFemtoSeconds ())) + MicroSeconds (6);
-          }
-        else //at 5 GHz or 6 GHz
-          {
-            return FemtoSeconds (static_cast<uint64_t> (numSymbols * symbolDuration.GetFemtoSeconds ()));
-          }
-      }
-    case WIFI_MOD_CLASS_DSSS:
-    case WIFI_MOD_CLASS_HR_DSSS:
-      return MicroSeconds (lrint (ceil ((size * 8.0) / (payloadMode.GetDataRate (22) / 1.0e6))));
-    default:
-      NS_FATAL_ERROR ("unsupported modulation class");
-      return MicroSeconds (0);
-    }
-}
-
-Time
-WifiPhy::CalculatePhyPreambleAndHeaderDuration (WifiTxVector txVector)
-{
-  WifiPreamble preamble = txVector.GetPreambleType ();
-  Time duration = GetPhyPreambleDuration (txVector)
-    + GetPhyHeaderDuration (txVector)
-    + GetPhyHtSigHeaderDuration (preamble)
-    + GetPhySigA1Duration (preamble)
-    + GetPhySigA2Duration (preamble)
-    + GetPhyTrainingSymbolDuration (txVector)
-    + GetPhySigBDuration (preamble);
-  return duration;
-}
-
-Time
-WifiPhy::CalculateTxDuration (uint32_t size, WifiTxVector txVector, WifiPhyBand band, uint16_t staId)
-{
-  Time duration = CalculatePhyPreambleAndHeaderDuration (txVector)
-    + GetPayloadDuration (size, txVector, band, NORMAL_MPDU, staId);
-  NS_ASSERT (duration.IsStrictlyPositive ());
-  return duration;
-}
-
-Time
-WifiPhy::CalculateTxDuration (WifiConstPsduMap psduMap, WifiTxVector txVector, WifiPhyBand band)
-{
-  Time maxDuration = Seconds (0);
-  for (auto & staIdPsdu : psduMap)
-    {
-      if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU)
-        {
-          WifiTxVector::HeMuUserInfoMap userInfoMap = txVector.GetHeMuUserInfoMap ();
-          NS_ABORT_MSG_IF (userInfoMap.find (staIdPsdu.first) == userInfoMap.end (), "STA-ID in psduMap (" << staIdPsdu.first << ") should be referenced in txVector");
-        }
-      Time current = CalculateTxDuration (staIdPsdu.second->GetSize (), txVector, band, staIdPsdu.first);
-      if (current > maxDuration)
-        {
-          maxDuration = current;
-        }
-    }
-  NS_ASSERT (maxDuration.IsStrictlyPositive ());
-  return maxDuration;
-}
-
-void
-WifiPhy::NotifyTxBegin (WifiConstPsduMap psdus, double txPowerW)
-{
-  for (auto const& psdu : psdus)
+  for (auto const& psdu : psdus)
     {
       for (auto& mpdu : *PeekPointer (psdu.second))
         {
@@ -2697,19 +1758,17 @@
     }
 }
 
-void
-WifiPhy::NotifyEndOfHePreamble (HePreambleParameters params)
+WifiConstPsduMap
+WifiPhy::GetWifiConstPsduMap (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector)
 {
-  m_phyEndOfHePreambleTrace (params);
+  return GetStaticPhyEntity (txVector.GetModulationClass ())->GetWifiConstPsduMap (psdu, txVector);
 }
 
 void
-WifiPhy::Send (Ptr<const WifiPsdu> psdu, WifiTxVector txVector)
+WifiPhy::Send (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector)
 {
   NS_LOG_FUNCTION (this << *psdu << txVector);
-  WifiConstPsduMap psdus;
-  psdus.insert (std::make_pair (SU_STA_ID, psdu));
-  Send (psdus, txVector);
+  Send (GetWifiConstPsduMap (psdu, txVector), txVector);
 }
 
 void
@@ -2739,1526 +1798,175 @@
         }
       return;
     }
-
-  Time txDuration = CalculateTxDuration (psdus, txVector, GetPhyBand ());
-
-  if ((m_currentEvent != 0) && (m_currentEvent->GetEndTime () > (Simulator::Now () + m_state->GetDelayUntilIdle ())))
-    {
-      //that packet will be noise _after_ the transmission.
-      MaybeCcaBusyDuration ();
-    }
-
-  if (m_currentEvent != 0)
-    {
-      AbortCurrentReception (RECEPTION_ABORTED_BY_TX);
-    }
-
-  if (m_powerRestricted)
-    {
-      NS_LOG_DEBUG ("Transmitting with power restriction");
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Transmitting without power restriction");
-    }
-
-  if (m_state->GetState () == WifiPhyState::OFF)
-    {
-      NS_LOG_DEBUG ("Transmission canceled because device is OFF");
-      return;
-    }
-
-  double txPowerW = DbmToW (GetTxPowerForTransmission (txVector) + GetTxGain ());
-  NotifyTxBegin (psdus, txPowerW);
-  m_phyTxPsduBeginTrace (psdus, txVector, txPowerW);
-  for (auto const& psdu : psdus)
-    {
-      NotifyMonitorSniffTx (psdu.second, GetFrequency (), txVector, psdu.first);
-    }
-  m_state->SwitchToTx (txDuration, psdus, GetPowerDbm (txVector.GetTxPowerLevel ()), txVector);
-
-  Ptr<WifiPpdu> ppdu = Create<WifiPpdu> (psdus, txVector, txDuration, GetPhyBand ());
-
-  if (m_wifiRadioEnergyModel != 0 && m_wifiRadioEnergyModel->GetMaximumTimeInState (WifiPhyState::TX) < txDuration)
-    {
-      ppdu->SetTruncatedTx ();
-    }
-
-  m_endTxEvent = Simulator::Schedule (txDuration, &WifiPhy::NotifyTxEnd, this, psdus); //TODO: fix for MU
-
-  StartTx (ppdu);
-
-  m_channelAccessRequested = false;
-  m_powerRestricted = false;
-}
-
-void
-WifiPhy::StartReceiveHeader (Ptr<Event> event)
-{
-  NS_LOG_FUNCTION (this << *event);
-  NS_ASSERT (!IsStateRx ());
-  NS_ASSERT (m_endPhyRxEvent.IsExpired ());
-  NS_ASSERT (m_currentEvent != 0);
-  NS_ASSERT (event->GetStartTime () == m_currentEvent->GetStartTime ());
-  NS_ASSERT (event->GetEndTime () == m_currentEvent->GetEndTime ());
-
-  uint16_t channelWidth;
-  if (event->GetTxVector ().GetChannelWidth () >= 40)
-    {
-      channelWidth = 20; //calculate PER on the 20 MHz primary channel for PHY headers
-    }
-  else
-    {
-      channelWidth = event->GetTxVector ().GetChannelWidth ();
-    }
-  auto band = GetBand (channelWidth);
-  InterferenceHelper::SnrPer snrPer = m_interference.CalculateNonHtPhyHeaderSnrPer (event, band);
-  double snr = snrPer.snr;
-  NS_LOG_DEBUG ("snr(dB)=" << RatioToDb (snrPer.snr) << ", per=" << snrPer.per);
-
-  if (!m_preambleDetectionModel || (m_preambleDetectionModel->IsPreambleDetected (event->GetRxPowerW (band), snr, m_channelWidth)))
-    {
-      NotifyRxBegin (GetAddressedPsduInPpdu (event->GetPpdu ()), event->GetRxPowerWPerBand ());
-
-      m_timeLastPreambleDetected = Simulator::Now ();
-      WifiTxVector txVector = event->GetTxVector ();
-
-      if (txVector.GetPreambleType () == WIFI_PREAMBLE_HT_GF)
-        {
-          //No non-HT PHY header for HT GF
-          Time remainingPreambleHeaderDuration = CalculatePhyPreambleAndHeaderDuration (txVector) - GetPreambleDetectionDuration ();
-          m_state->SwitchMaybeToCcaBusy (remainingPreambleHeaderDuration);
-          m_endPhyRxEvent = Simulator::Schedule (remainingPreambleHeaderDuration, &WifiPhy::StartReceivePayload, this, event);
-        }
-      else
-        {
-          //Schedule end of non-HT PHY header
-          Time remainingPreambleAndNonHtHeaderDuration = GetPhyPreambleDuration (txVector) + GetPhyHeaderDuration (txVector) - GetPreambleDetectionDuration ();
-          m_state->SwitchMaybeToCcaBusy (remainingPreambleAndNonHtHeaderDuration);
-          m_endPhyRxEvent = Simulator::Schedule (remainingPreambleAndNonHtHeaderDuration, &WifiPhy::ContinueReceiveHeader, this, event);
-        }
-    }
-  else
+  
+  // Set RU PHY indices
+  if (txVector.IsMu ())
     {
-      NS_LOG_DEBUG ("Drop packet because PHY preamble detection failed");
-      NotifyRxDrop (GetAddressedPsduInPpdu (event->GetPpdu ()), PREAMBLE_DETECT_FAILURE);
-      m_interference.NotifyRxEnd ();
-      m_currentEvent = 0;
-
-      // Like CCA-SD, CCA-ED is governed by the 4μs CCA window to flag CCA-BUSY
-      // for any received signal greater than the CCA-ED threshold.
-      if (event->GetEndTime () > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
+      for (auto& heMuUserInfo : txVector.GetHeMuUserInfoMap ())
         {
-          MaybeCcaBusyDuration ();
+          heMuUserInfo.second.ru.SetPhyIndex (txVector.GetChannelWidth (),
+                                              m_operatingChannel.GetPrimaryChannelIndex (20));
         }
     }
-}
-
-void
-WifiPhy::ContinueReceiveHeader (Ptr<Event> event)
-{
-  NS_LOG_FUNCTION (this << *event);
-  NS_ASSERT (m_endPhyRxEvent.IsExpired ());
 
-  uint16_t channelWidth;
-  if (event->GetTxVector ().GetChannelWidth () >= 40)
-    {
-      channelWidth = 20; //calculate PER on the 20 MHz primary channel for PHY headers
-    }
-  else
-    {
-      channelWidth = event->GetTxVector ().GetChannelWidth ();
-    }
-  InterferenceHelper::SnrPer snrPer = m_interference.CalculateNonHtPhyHeaderSnrPer (event, GetBand (channelWidth));
+  Time txDuration = CalculateTxDuration (psdus, txVector, GetPhyBand ());
 
-  NS_LOG_DEBUG ("snr(dB)=" << RatioToDb (snrPer.snr) << ", per=" << snrPer.per);
-  if (m_random->GetValue () > snrPer.per) //non-HT PHY header reception succeeded
+  bool noEndPreambleDetectionEvent = true;
+  for (const auto & it : m_phyEntities)
     {
-      NS_LOG_DEBUG ("Received non-HT PHY header");
-      WifiTxVector txVector = event->GetTxVector ();
-      Time remainingRxDuration = event->GetEndTime () - Simulator::Now ();
-      m_state->SwitchMaybeToCcaBusy (remainingRxDuration);
-      Time remainingPreambleHeaderDuration = CalculatePhyPreambleAndHeaderDuration (txVector) - GetPhyPreambleDuration (txVector) - GetPhyHeaderDuration (txVector);
-      m_endPhyRxEvent = Simulator::Schedule (remainingPreambleHeaderDuration, &WifiPhy::StartReceivePayload, this, event);
+      noEndPreambleDetectionEvent &= it.second->NoEndPreambleDetectionEvents ();
     }
-  else //non-HT PHY header reception failed
+  if (!noEndPreambleDetectionEvent || ((m_currentEvent != 0) && (m_currentEvent->GetEndTime () > (Simulator::Now () + m_state->GetDelayUntilIdle ()))))
     {
-      NS_LOG_DEBUG ("Abort reception because non-HT PHY header reception failed");
-      AbortCurrentReception (L_SIG_FAILURE);
-      if (event->GetEndTime () > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
-        {
-          MaybeCcaBusyDuration ();
-        }
+      AbortCurrentReception (RECEPTION_ABORTED_BY_TX);
+      //that packet will be noise _after_ the transmission.
+      MaybeCcaBusyDuration (GetMeasurementChannelWidth (m_currentEvent != 0 ? m_currentEvent->GetPpdu () : nullptr));
     }
-}
-
-void
-WifiPhy::StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW)
-{
-  //The total RX power corresponds to the maximum over all the bands
-  auto it = std::max_element (rxPowersW.begin (), rxPowersW.end (),
-    [] (const std::pair<WifiSpectrumBand, double>& p1, const std::pair<WifiSpectrumBand, double>& p2) {
-      return p1.second < p2.second;
-    });
-  NS_LOG_FUNCTION (this << *ppdu << it->second);
-  WifiTxVector txVector = ppdu->GetTxVector ();
-  Time rxDuration = ppdu->GetTxDuration ();
-  Ptr<Event> event = m_interference.Add (ppdu, txVector, rxDuration, rxPowersW);
-  Time endRx = Simulator::Now () + rxDuration;
 
-  if (m_state->GetState () == WifiPhyState::OFF)
+  for (auto & it : m_phyEntities)
     {
-      NS_LOG_DEBUG ("Cannot start RX because device is OFF");
-      if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
-        {
-          MaybeCcaBusyDuration ();
-        }
-      return;
+      it.second->CancelRunningEndPreambleDetectionEvents ();
     }
+  m_currentPreambleEvents.clear ();
+  m_endPhyRxEvent.Cancel ();
 
-  if (ppdu->IsTruncatedTx ())
+  if (m_powerRestricted)
     {
-      NS_LOG_DEBUG ("Packet reception stopped because transmitter has been switched off");
-      if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
-        {
-          MaybeCcaBusyDuration ();
-        }
-      return;
+      NS_LOG_DEBUG ("Transmitting with power restriction for " << txDuration.As (Time::NS));
     }
-
-  if (!txVector.GetModeInitialized ())
+  else
     {
-      //If SetRate method was not called above when filling in txVector, this means the PHY does support the rate indicated in PHY SIG headers
-      NS_LOG_DEBUG ("drop packet because of unsupported RX mode");
-      NotifyRxDrop (GetAddressedPsduInPpdu (ppdu), UNSUPPORTED_SETTINGS);
-      if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
-        {
-          MaybeCcaBusyDuration ();
-        }
-      return;
+      NS_LOG_DEBUG ("Transmitting without power restriction for " << txDuration.As (Time::NS));
     }
 
-  switch (m_state->GetState ())
-    {
-    case WifiPhyState::SWITCHING:
-      NS_LOG_DEBUG ("drop packet because of channel switching");
-      NotifyRxDrop (GetAddressedPsduInPpdu (ppdu), CHANNEL_SWITCHING);
-      /*
-       * Packets received on the upcoming channel are added to the event list
-       * during the switching state. This way the medium can be correctly sensed
-       * when the device listens to the channel for the first time after the
-       * switching e.g. after channel switching, the channel may be sensed as
-       * busy due to other devices' transmissions started before the end of
-       * the switching.
-       */
-      if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
-        {
-          //that packet will be noise _after_ the completion of the channel switching.
-          MaybeCcaBusyDuration ();
-        }
-      break;
-    case WifiPhyState::RX:
-      NS_ASSERT (m_currentEvent != 0);
-      if (m_frameCaptureModel != 0
-          && m_frameCaptureModel->IsInCaptureWindow (m_timeLastPreambleDetected)
-          && m_frameCaptureModel->CaptureNewFrame (m_currentEvent, event))
-        {
-          AbortCurrentReception (FRAME_CAPTURE_PACKET_SWITCH);
-          NS_LOG_DEBUG ("Switch to new packet");
-          StartRx (event);
-        }
-      else
-        {
-          NS_LOG_DEBUG ("Drop packet because already in Rx");
-          NotifyRxDrop (GetAddressedPsduInPpdu (ppdu), RXING);
-          if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
-            {
-              //that packet will be noise _after_ the reception of the currently-received packet.
-              MaybeCcaBusyDuration ();
-            }
-        }
-      break;
-    case WifiPhyState::TX:
-      NS_LOG_DEBUG ("Drop packet because already in Tx");
-      NotifyRxDrop (GetAddressedPsduInPpdu (ppdu), TXING);
-      if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
-        {
-          //that packet will be noise _after_ the transmission of the currently-transmitted packet.
-          MaybeCcaBusyDuration ();
-        }
-      break;
-    case WifiPhyState::CCA_BUSY:
-      if (m_currentEvent != 0)
-        {
-          if (m_frameCaptureModel != 0
-              && m_frameCaptureModel->IsInCaptureWindow (m_timeLastPreambleDetected)
-              && m_frameCaptureModel->CaptureNewFrame (m_currentEvent, event))
-            {
-              AbortCurrentReception (FRAME_CAPTURE_PACKET_SWITCH);
-              NS_LOG_DEBUG ("Switch to new packet");
-              StartRx (event);
-            }
-          else
-            {
-              NS_LOG_DEBUG ("Drop packet because already in Rx");
-              NotifyRxDrop (ppdu->GetPsdu (), RXING);
-              if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
-                {
-                  //that packet will be noise _after_ the reception of the currently-received packet.
-                  MaybeCcaBusyDuration ();
-                }
-            }
-        }
-      else
-        {
-          StartRx (event);
-        }
-      break;
-    case WifiPhyState::IDLE:
-      StartRx (event);
-      break;
-    case WifiPhyState::SLEEP:
-      NS_LOG_DEBUG ("Drop packet because in sleep mode");
-      NotifyRxDrop (GetAddressedPsduInPpdu (ppdu), SLEEPING);
-      if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
-        {
-          //that packet will be noise _after_ the sleep period.
-          MaybeCcaBusyDuration ();
-        }
-      break;
-    default:
-      NS_FATAL_ERROR ("Invalid WifiPhy state.");
-      break;
-    }
-}
-
-void
-WifiPhy::MaybeCcaBusyDuration ()
-{
-  //We are here because we have received the first bit of a packet and we are
-  //not going to be able to synchronize on it
-  //In this model, CCA becomes busy when the aggregation of all signals as
-  //tracked by the InterferenceHelper class is higher than the CcaBusyThreshold
-  uint16_t primaryChannelWidth = GetChannelWidth () >= 40 ? 20 : GetChannelWidth ();
-  Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaEdThresholdW, GetBand (primaryChannelWidth));
-  if (!delayUntilCcaEnd.IsZero ())
-    {
-      m_state->SwitchMaybeToCcaBusy (delayUntilCcaEnd);
-    }
-}
-
-void
-WifiPhy::StartReceivePayload (Ptr<Event> event)
-{
-  NS_LOG_FUNCTION (this << *event);
-  NS_ASSERT (m_endPhyRxEvent.IsExpired ());
-  NS_ASSERT (m_endRxEvent.IsExpired ());
-  bool canReceivePayload = false;
-  Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
-  WifiModulationClass modulation = ppdu->GetModulation ();
-  //calculate PER on the primary 20 MHz channel for PHY headers
-  uint16_t primaryChannelWidth = std::min (event->GetTxVector ().GetChannelWidth (), static_cast<uint16_t> (20));
-  auto primaryBand = GetBand (primaryChannelWidth);
-  if (modulation >= WIFI_MOD_CLASS_HT)
-    {
-      InterferenceHelper::SnrPer snrPer = m_interference.CalculateHtPhyHeaderSnrPer (event, primaryBand);
-      NS_LOG_DEBUG ("snr(dB)=" << RatioToDb (snrPer.snr) << ", per=" << snrPer.per);
-      canReceivePayload = (m_random->GetValue () > snrPer.per);
-    }
-  else
-    {
-      //If we are here, this means non-HT PHY header was already successfully received
-      canReceivePayload = true;
-    }
-  WifiTxVector txVector = event->GetTxVector ();
-  Time payloadDuration = event->GetEndTime () - event->GetStartTime () - CalculatePhyPreambleAndHeaderDuration (txVector);
-  bool success = false;
-  if (canReceivePayload) //PHY reception succeeded
-    {
-      Ptr<const WifiPsdu> psdu = GetAddressedPsduInPpdu (ppdu);
-      if (psdu)
-        {
-          WifiMode txMode = txVector.GetMode (GetStaId ());
-          uint8_t nss = txVector.GetNssMax();
-          if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU)
-            {
-              uint16_t staId = GetStaId ();
-              for (const auto & info : txVector.GetHeMuUserInfoMap ())
-                {
-                  if (info.first == staId)
-                    {
-                      nss = info.second.nss; //no need to look at other PSDUs
-                      break;
-                    }
-                }
-            }
-          if (nss > GetMaxSupportedRxSpatialStreams ())
-            {
-              NS_LOG_DEBUG ("Packet reception could not be started because not enough RX antennas");
-              NotifyRxDrop (psdu, UNSUPPORTED_SETTINGS);
-            }
-          else if ((txVector.GetChannelWidth () >= 40) && (txVector.GetChannelWidth () > GetChannelWidth ()))
-            {
-              NS_LOG_DEBUG ("Packet reception could not be started because not enough channel width");
-              NotifyRxDrop (psdu, UNSUPPORTED_SETTINGS);
-            }
-          else if (IsModeSupported (txMode) || IsMcsSupported (txMode))
-            {
-              m_statusPerMpdu.clear();
-              if (psdu->GetNMpdus () > 1)
-                {
-                  ScheduleEndOfMpdus (event);
-                }
-              m_state->SwitchToRx (payloadDuration);
-              m_phyRxPayloadBeginTrace (txVector, payloadDuration); //this callback (equivalent to PHY-RXSTART primitive) is triggered only if headers have been correctly decoded and that the mode within is supported
-              m_endRxEvent = Simulator::Schedule (payloadDuration, &WifiPhy::EndReceive, this, event);
-              success = true;
-              NS_LOG_DEBUG ("Receiving PSDU");
-            }
-          else //mode is not allowed
-            {
-              NS_LOG_DEBUG ("Drop packet because it was sent using an unsupported mode (" << txMode << ")");
-              NotifyRxDrop (psdu, UNSUPPORTED_SETTINGS);
-            }
-        }
-      else
-        {
-          NS_ASSERT (ppdu->IsMu ());
-          NS_LOG_DEBUG ("No PSDU addressed to that PHY in the received MU PPDU. The PPDU is filtered.");
-          payloadDuration = NanoSeconds (0); //so as to call AbortCurrentReception below
-          m_phyRxPayloadBeginTrace (txVector, payloadDuration); //this callback (equivalent to PHY-RXSTART primitive) is also triggered for filtered PPDUs
-        }
-      if (modulation == WIFI_MOD_CLASS_HE)
-        {
-          HePreambleParameters params;
-          params.rssiW = event->GetRxPowerW (primaryBand);
-          params.bssColor = event->GetTxVector ().GetBssColor ();
-          NotifyEndOfHePreamble (params);
-        }
-    }
-  else //PHY reception failed
-    {
-      NS_LOG_DEBUG ("Drop packet because HT PHY header reception failed");
-      NotifyRxDrop (GetAddressedPsduInPpdu (ppdu), SIG_A_FAILURE);
-    }
-  if (!success)
-    {
-      if (payloadDuration.IsStrictlyPositive ())
-        {
-          m_endRxEvent = Simulator::Schedule (payloadDuration, &WifiPhy::ResetReceive, this, event);
-        }
-      else
-        {
-          AbortCurrentReception (FILTERED); //immediately followed by PHY-RXEND (Filtered)
-          if (event->GetEndTime () > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
-            {
-              MaybeCcaBusyDuration ();
-            }
-        }
-    }
-}
-
-void
-WifiPhy::ScheduleEndOfMpdus (Ptr<Event> event)
-{
-  NS_LOG_FUNCTION (this << *event);
-  Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
-  WifiTxVector txVector = event->GetTxVector ();
-  Time endOfMpduDuration = NanoSeconds (0);
-  Time relativeStart = NanoSeconds (0);
-  Time psduDuration = ppdu->GetTxDuration () - CalculatePhyPreambleAndHeaderDuration (txVector);
-  Time remainingAmpduDuration = psduDuration;
-  MpduType mpdutype = FIRST_MPDU_IN_AGGREGATE;
-  uint32_t totalAmpduSize = 0;
-  double totalAmpduNumSymbols = 0.0;
-  Ptr<const WifiPsdu> psdu = GetAddressedPsduInPpdu (ppdu);
-  size_t nMpdus = psdu->GetNMpdus ();
-  uint16_t staId = SU_STA_ID;
-  auto mpdu = psdu->begin ();
-  for (size_t i = 0; i < nMpdus && mpdu != psdu->end (); ++mpdu)
-    {
-      Time mpduDuration = GetPayloadDuration (psdu->GetAmpduSubframeSize (i), txVector,
-                                              GetPhyBand (), mpdutype, true,
-                                              totalAmpduSize, totalAmpduNumSymbols,
-                                              staId);
-
-      remainingAmpduDuration -= mpduDuration;
-      if (i == (nMpdus - 1) && !remainingAmpduDuration.IsZero ()) //no more MPDU coming
-        {
-          mpduDuration += remainingAmpduDuration; //apply a correction just in case rounding had induced slight shift
-        }
-
-      endOfMpduDuration += mpduDuration;
-      Simulator::Schedule (endOfMpduDuration, &WifiPhy::EndOfMpdu, this, event, Create<WifiPsdu> (*mpdu, false), i, relativeStart, mpduDuration);
-
-      //Prepare next iteration
-      ++i;
-      relativeStart += mpduDuration;
-      mpdutype = (i == (nMpdus - 1)) ? LAST_MPDU_IN_AGGREGATE : MIDDLE_MPDU_IN_AGGREGATE;
-    }
-}
-
-void
-WifiPhy::EndOfMpdu (Ptr<Event> event, Ptr<const WifiPsdu> psdu, size_t mpduIndex, Time relativeStart, Time mpduDuration)
-{
-  NS_LOG_FUNCTION (this << *event << mpduIndex << relativeStart << mpduDuration);
-  Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
-  uint16_t staId = GetStaId ();
-  WifiTxVector txVector = event->GetTxVector ();
-  uint16_t channelWidth = std::min (GetChannelWidth (), txVector.GetChannelWidth ());
-  double snr = m_interference.CalculateSnr (event, channelWidth, txVector.GetNss (staId), GetBand (channelWidth));
-
-  std::pair<bool, SignalNoiseDbm> rxInfo = GetReceptionStatus (psdu, event, staId, relativeStart, mpduDuration);
-  NS_LOG_DEBUG ("Extracted MPDU #" << mpduIndex << ": duration: " << mpduDuration.GetNanoSeconds () << "ns" <<
-                ", correct reception: " << rxInfo.first << ", Signal/Noise: " << rxInfo.second.signal << "/" << rxInfo.second.noise << "dBm");
-
-  m_signalNoise = rxInfo.second;
-  m_statusPerMpdu.push_back (rxInfo.first);
-
-  if (rxInfo.first)
-    {
-      m_state->ContinueRxNextMpdu (Copy (psdu), snr, event->GetTxVector ());
-    }
-}
-
-void
-WifiPhy::EndReceive (Ptr<Event> event)
-{
-  Time psduDuration = event->GetEndTime () - event->GetStartTime ();
-  NS_LOG_FUNCTION (this << *event << psduDuration);
-  NS_ASSERT (GetLastRxEndTime () == Simulator::Now ());
-  NS_ASSERT (event->GetEndTime () == Simulator::Now ());
-
-  uint16_t staId = GetStaId ();
-  Ptr<const WifiPsdu> psdu = GetAddressedPsduInPpdu (event->GetPpdu ());
-  if (psdu->GetNMpdus () == 1)
-    {
-      //We do not enter here for A-MPDU since this is done in WifiPhy::EndOfMpdu
-      std::pair<bool, SignalNoiseDbm> rxInfo = GetReceptionStatus (psdu, event, staId, NanoSeconds (0), psduDuration);
-      m_signalNoise = rxInfo.second;
-      m_statusPerMpdu.push_back (rxInfo.first);
-    }
-
-  NotifyRxEnd (psdu);
-  WifiTxVector txVector = event->GetTxVector ();
-  uint16_t channelWidth = std::min (GetChannelWidth (), txVector.GetChannelWidth ());
-  WifiSpectrumBand band;
-  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU)
-    {
-      band = GetRuBand (txVector, staId);
-      channelWidth = HeRu::GetBandwidth (txVector.GetRu (staId).ruType);
-    }
-  else
-    {
-      band = GetBand (channelWidth);
-    }
-  double snr = m_interference.CalculateSnr (event, channelWidth, txVector.GetNss (staId), band);
-  if (std::count (m_statusPerMpdu.begin (), m_statusPerMpdu.end (), true))
-    {
-      //At least one MPDU has been successfully received
-      WifiTxVector txVector = event->GetTxVector ();
-      NotifyMonitorSniffRx (psdu, GetFrequency (), txVector, m_signalNoise, m_statusPerMpdu, staId);
-      m_state->SwitchFromRxEndOk (Copy (psdu), snr, txVector, staId, m_statusPerMpdu);
-    }
-  else
-    {
-      m_state->SwitchFromRxEndError (Copy (psdu), snr);
-    }
-
-  m_interference.NotifyRxEnd ();
-  m_currentEvent = 0;
-  MaybeCcaBusyDuration ();
-}
-
-std::pair<bool, SignalNoiseDbm>
-WifiPhy::GetReceptionStatus (Ptr<const WifiPsdu> psdu, Ptr<Event> event, uint16_t staId,
-                             Time relativeMpduStart, Time mpduDuration)
-{
-  NS_LOG_FUNCTION (this << *psdu << *event << staId << relativeMpduStart << mpduDuration);
-  uint16_t channelWidth = std::min (GetChannelWidth (), event->GetTxVector ().GetChannelWidth ());
-  WifiTxVector txVector = event->GetTxVector ();
-  WifiSpectrumBand band;
-  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU)
-    {
-      band = GetRuBand (txVector, staId);
-      channelWidth = HeRu::GetBandwidth (txVector.GetRu (staId).ruType);
-    }
-  else
-    {
-      band = GetBand (channelWidth);
-    }
-  InterferenceHelper::SnrPer snrPer = m_interference.CalculatePayloadSnrPer (event, channelWidth, band, staId, std::make_pair (relativeMpduStart, relativeMpduStart + mpduDuration));
-
-  WifiMode mode = event->GetTxVector ().GetMode (staId);
-  NS_LOG_DEBUG ("mode=" << (mode.GetDataRate (event->GetTxVector (), staId)) <<
-                ", snr(dB)=" << RatioToDb (snrPer.snr) << ", per=" << snrPer.per << ", size=" << psdu->GetSize () <<
-                ", relativeStart = " << relativeMpduStart.As (Time::NS) << ", duration = " << mpduDuration.As (Time::NS));
-
-  // There are two error checks: PER and receive error model check.
-  // PER check models is typical for Wi-Fi and is based on signal modulation;
-  // Receive error model is optional, if we have an error model and
-  // it indicates that the packet is corrupt, drop the packet.
-  SignalNoiseDbm signalNoise;
-  signalNoise.signal = WToDbm (event->GetRxPowerW (band));
-  signalNoise.noise = WToDbm (event->GetRxPowerW (band) / snrPer.snr);
-  if (m_random->GetValue () > snrPer.per &&
-      !(m_postReceptionErrorModel && m_postReceptionErrorModel->IsCorrupt (psdu->GetPacket ()->Copy ())))
-    {
-      NS_LOG_DEBUG ("Reception succeeded: " << psdu);
-      return std::make_pair (true, signalNoise);
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Reception failed: " << psdu);
-      return std::make_pair (false, signalNoise);
-    }
-}
-
-WifiSpectrumBand
-WifiPhy::GetRuBand (WifiTxVector txVector, uint16_t staId)
-{
-  NS_ASSERT (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU);
-  WifiSpectrumBand band;
-  HeRu::RuSpec ru = txVector.GetRu (staId);
-  uint16_t channelWidth = txVector.GetChannelWidth ();
-  NS_ASSERT (channelWidth <= GetChannelWidth ());
-  HeRu::SubcarrierGroup group = HeRu::GetSubcarrierGroup (channelWidth, ru.ruType, ru.index);
-  HeRu::SubcarrierRange range = std::make_pair (group.front ().first, group.back ().second);
-  band = ConvertHeRuSubcarriers (channelWidth, range);
-  return band;
-}
-
-WifiSpectrumBand
-WifiPhy::ConvertHeRuSubcarriers (uint16_t channelWidth, HeRu::SubcarrierRange range) const
-{
-  NS_ASSERT_MSG (false, "802.11ax can only be used with SpectrumWifiPhy");
-  WifiSpectrumBand convertedSubcarriers;
-  return convertedSubcarriers;
-}
-
-void
-WifiPhy::EndReceiveInterBss (void)
-{
-  NS_LOG_FUNCTION (this);
-  if (!m_channelAccessRequested)
-    {
-      m_powerRestricted = false;
-    }
-}
-
-void
-WifiPhy::ResetReceive (Ptr<Event> event)
-{
-  NS_LOG_FUNCTION (this << *event);
-  NS_ASSERT (event->GetEndTime () == Simulator::Now ());
-  NS_ASSERT (!IsStateRx ());
-  m_interference.NotifyRxEnd ();
-  m_currentEvent = 0;
-  MaybeCcaBusyDuration ();
-}
-
-void
-WifiPhy::NotifyChannelAccessRequested (void)
-{
-  NS_LOG_FUNCTION (this);
-  m_channelAccessRequested = true;
-}
-
-// Clause 15 rates (DSSS)
-
-WifiMode
-WifiPhy::GetDsssRate1Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("DsssRate1Mbps",
-                                     WIFI_MOD_CLASS_DSSS,
-                                     true,
-                                     WIFI_CODE_RATE_UNDEFINED,
-                                     2);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetDsssRate2Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("DsssRate2Mbps",
-                                     WIFI_MOD_CLASS_DSSS,
-                                     true,
-                                     WIFI_CODE_RATE_UNDEFINED,
-                                     4);
-  return mode;
-}
-
-
-// Clause 18 rates (HR/DSSS)
-
-WifiMode
-WifiPhy::GetDsssRate5_5Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("DsssRate5_5Mbps",
-                                     WIFI_MOD_CLASS_HR_DSSS,
-                                     true,
-                                     WIFI_CODE_RATE_UNDEFINED,
-                                     16);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetDsssRate11Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("DsssRate11Mbps",
-                                     WIFI_MOD_CLASS_HR_DSSS,
-                                     true,
-                                     WIFI_CODE_RATE_UNDEFINED,
-                                     256);
-  return mode;
-}
-
-
-// Clause 19.5 rates (ERP-OFDM)
-
-WifiMode
-WifiPhy::GetErpOfdmRate6Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("ErpOfdmRate6Mbps",
-                                     WIFI_MOD_CLASS_ERP_OFDM,
-                                     true,
-                                     WIFI_CODE_RATE_1_2,
-                                     2);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetErpOfdmRate9Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("ErpOfdmRate9Mbps",
-                                     WIFI_MOD_CLASS_ERP_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     2);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetErpOfdmRate12Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("ErpOfdmRate12Mbps",
-                                     WIFI_MOD_CLASS_ERP_OFDM,
-                                     true,
-                                     WIFI_CODE_RATE_1_2,
-                                     4);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetErpOfdmRate18Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("ErpOfdmRate18Mbps",
-                                     WIFI_MOD_CLASS_ERP_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     4);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetErpOfdmRate24Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("ErpOfdmRate24Mbps",
-                                     WIFI_MOD_CLASS_ERP_OFDM,
-                                     true,
-                                     WIFI_CODE_RATE_1_2,
-                                     16);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetErpOfdmRate36Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("ErpOfdmRate36Mbps",
-                                     WIFI_MOD_CLASS_ERP_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     16);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetErpOfdmRate48Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("ErpOfdmRate48Mbps",
-                                     WIFI_MOD_CLASS_ERP_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_2_3,
-                                     64);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetErpOfdmRate54Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("ErpOfdmRate54Mbps",
-                                     WIFI_MOD_CLASS_ERP_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     64);
-  return mode;
-}
-
-
-// Clause 17 rates (OFDM)
-
-WifiMode
-WifiPhy::GetOfdmRate6Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate6Mbps",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     true,
-                                     WIFI_CODE_RATE_1_2,
-                                     2);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate9Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate9Mbps",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     2);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate12Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate12Mbps",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     true,
-                                     WIFI_CODE_RATE_1_2,
-                                     4);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate18Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate18Mbps",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     4);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate24Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate24Mbps",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     true,
-                                     WIFI_CODE_RATE_1_2,
-                                     16);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate36Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate36Mbps",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     16);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate48Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate48Mbps",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_2_3,
-                                     64);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate54Mbps ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate54Mbps",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     64);
-  return mode;
-}
-
-
-// 10 MHz channel rates
-
-WifiMode
-WifiPhy::GetOfdmRate3MbpsBW10MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate3MbpsBW10MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     true,
-                                     WIFI_CODE_RATE_1_2,
-                                     2);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate4_5MbpsBW10MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate4_5MbpsBW10MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     2);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate6MbpsBW10MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate6MbpsBW10MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     true,
-                                     WIFI_CODE_RATE_1_2,
-                                     4);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate9MbpsBW10MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate9MbpsBW10MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     4);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate12MbpsBW10MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate12MbpsBW10MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     true,
-                                     WIFI_CODE_RATE_1_2,
-                                     16);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate18MbpsBW10MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate18MbpsBW10MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     16);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate24MbpsBW10MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate24MbpsBW10MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_2_3,
-                                     64);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate27MbpsBW10MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate27MbpsBW10MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     64);
-  return mode;
-}
-
-
-// 5 MHz channel rates
-
-WifiMode
-WifiPhy::GetOfdmRate1_5MbpsBW5MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate1_5MbpsBW5MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     true,
-                                     WIFI_CODE_RATE_1_2,
-                                     2);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate2_25MbpsBW5MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate2_25MbpsBW5MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     2);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate3MbpsBW5MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate3MbpsBW5MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     true,
-                                     WIFI_CODE_RATE_1_2,
-                                     4);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate4_5MbpsBW5MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate4_5MbpsBW5MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     4);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate6MbpsBW5MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate6MbpsBW5MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     true,
-                                     WIFI_CODE_RATE_1_2,
-                                     16);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate9MbpsBW5MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate9MbpsBW5MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     16);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate12MbpsBW5MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate12MbpsBW5MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_2_3,
-                                     64);
-  return mode;
-}
-
-WifiMode
-WifiPhy::GetOfdmRate13_5MbpsBW5MHz ()
-{
-  static WifiMode mode =
-    WifiModeFactory::CreateWifiMode ("OfdmRate13_5MbpsBW5MHz",
-                                     WIFI_MOD_CLASS_OFDM,
-                                     false,
-                                     WIFI_CODE_RATE_3_4,
-                                     64);
-  return mode;
-}
-
-
-// Clause 20
-
-WifiMode
-WifiPhy::GetHtMcs0 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs0", 0, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs1 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs1", 1, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs2 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs2", 2, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs3 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs3", 3, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs4 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs4", 4, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs5 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs5", 5, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs6 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs6", 6, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs7 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs7", 7, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs8 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs8", 8, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs9 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs9", 9, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs10 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs10", 10, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs11 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs11", 11, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs12 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs12", 12, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs13 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs13", 13, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs14 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs14", 14, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs15 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs15", 15, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs16 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs16", 16, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs17 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs17", 17, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs18 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs18", 18, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs19 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs19", 19, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs20 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs20", 20, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs21 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs21", 21, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs22 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs22", 22, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs23 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs23", 23, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs24 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs24", 24, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs25 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs25", 25, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs26 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs26", 26, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs27 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs27", 27, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs28 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs28", 28, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs29 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs29", 29, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs30 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs30", 30, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetHtMcs31 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HtMcs31", 31, WIFI_MOD_CLASS_HT);
-  return mcs;
-}
-
-
-// Clause 22
-
-WifiMode
-WifiPhy::GetVhtMcs0 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("VhtMcs0", 0, WIFI_MOD_CLASS_VHT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetVhtMcs1 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("VhtMcs1", 1, WIFI_MOD_CLASS_VHT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetVhtMcs2 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("VhtMcs2", 2, WIFI_MOD_CLASS_VHT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetVhtMcs3 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("VhtMcs3", 3, WIFI_MOD_CLASS_VHT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetVhtMcs4 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("VhtMcs4", 4, WIFI_MOD_CLASS_VHT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetVhtMcs5 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("VhtMcs5", 5, WIFI_MOD_CLASS_VHT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetVhtMcs6 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("VhtMcs6", 6, WIFI_MOD_CLASS_VHT);
-  return mcs;
-}
-
-WifiMode
-WifiPhy::GetVhtMcs7 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("VhtMcs7", 7, WIFI_MOD_CLASS_VHT);
-  return mcs;
-}
+  if (m_state->GetState () == WifiPhyState::OFF)
+    {
+      NS_LOG_DEBUG ("Transmission canceled because device is OFF");
+      return;
+    }
 
-WifiMode
-WifiPhy::GetVhtMcs8 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("VhtMcs8", 8, WIFI_MOD_CLASS_VHT);
-  return mcs;
-}
+  Ptr<WifiPpdu> ppdu = GetPhyEntity (txVector.GetModulationClass ())->BuildPpdu (psdus, txVector, txDuration);
+  m_previouslyRxPpduUid = UINT64_MAX; //reset (after creation of PPDU) to use it only once
 
-WifiMode
-WifiPhy::GetVhtMcs9 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("VhtMcs9", 9, WIFI_MOD_CLASS_VHT);
-  return mcs;
-}
+  double txPowerW = DbmToW (GetTxPowerForTransmission (ppdu) + GetTxGain ());
+  NotifyTxBegin (psdus, txPowerW);
+  m_phyTxPsduBeginTrace (psdus, txVector, txPowerW);
+  for (auto const& psdu : psdus)
+    {
+      NotifyMonitorSniffTx (psdu.second, GetFrequency (), txVector, psdu.first);
+    }
+  m_state->SwitchToTx (txDuration, psdus, GetPowerDbm (txVector.GetTxPowerLevel ()), txVector);
 
-// Clause 26
+  if (m_wifiRadioEnergyModel != 0 && m_wifiRadioEnergyModel->GetMaximumTimeInState (WifiPhyState::TX) < txDuration)
+    {
+      ppdu->SetTruncatedTx ();
+    }
 
-WifiMode
-WifiPhy::GetHeMcs0 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HeMcs0", 0, WIFI_MOD_CLASS_HE);
-  return mcs;
-}
+  m_endTxEvent = Simulator::Schedule (txDuration, &WifiPhy::NotifyTxEnd, this, psdus); //TODO: fix for MU
 
-WifiMode
-WifiPhy::GetHeMcs1 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HeMcs1", 1, WIFI_MOD_CLASS_HE);
-  return mcs;
-}
+  StartTx (ppdu);
 
-WifiMode
-WifiPhy::GetHeMcs2 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HeMcs2", 2, WIFI_MOD_CLASS_HE);
-  return mcs;
-}
+  m_channelAccessRequested = false;
+  m_powerRestricted = false;
 
-WifiMode
-WifiPhy::GetHeMcs3 ()
-{
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HeMcs3", 3, WIFI_MOD_CLASS_HE);
-  return mcs;
+  Simulator::Schedule (txDuration, &WifiPhy::Reset, this);
 }
 
-WifiMode
-WifiPhy::GetHeMcs4 ()
+uint64_t
+WifiPhy::GetPreviouslyRxPpduUid (void) const
 {
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HeMcs4", 4, WIFI_MOD_CLASS_HE);
-  return mcs;
+  return m_previouslyRxPpduUid;
 }
 
-WifiMode
-WifiPhy::GetHeMcs5 ()
+void
+WifiPhy::Reset (void)
 {
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HeMcs5", 5, WIFI_MOD_CLASS_HE);
-  return mcs;
+  NS_LOG_FUNCTION (this);
+  m_currentPreambleEvents.clear ();
+  m_currentEvent = 0;
+  for (auto & phyEntity : m_phyEntities)
+    {
+      phyEntity.second->CancelAllEvents ();
+    }
 }
 
-WifiMode
-WifiPhy::GetHeMcs6 ()
+void
+WifiPhy::StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW, Time rxDuration)
 {
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HeMcs6", 6, WIFI_MOD_CLASS_HE);
-  return mcs;
+  WifiModulationClass modulation = ppdu->GetTxVector ().GetModulationClass ();
+  auto it = m_phyEntities.find (modulation);
+  if (it != m_phyEntities.end ())
+    {
+      it->second->StartReceivePreamble (ppdu, rxPowersW, rxDuration);
+    }
+  else
+    {
+      //TODO find a fallback PHY for receiving the PPDU (e.g. 11a for 11ax due to preamble structure)
+      NS_LOG_DEBUG ("Unsupported modulation received (" << modulation << "), consider as noise");
+      if (ppdu->GetTxDuration () > m_state->GetDelayUntilIdle ())
+        {
+          MaybeCcaBusyDuration (GetMeasurementChannelWidth (nullptr));
+        }
+    }
 }
 
-WifiMode
-WifiPhy::GetHeMcs7 ()
+void
+WifiPhy::MaybeCcaBusyDuration (uint16_t channelWidth)
 {
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HeMcs7", 7, WIFI_MOD_CLASS_HE);
-  return mcs;
+  //We are here because we have received the first bit of a packet and we are
+  //not going to be able to synchronize on it
+  //In this model, CCA becomes busy when the aggregation of all signals as
+  //tracked by the InterferenceHelper class is higher than the CcaBusyThreshold
+  Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaEdThresholdW, GetPrimaryBand (channelWidth));
+  if (!delayUntilCcaEnd.IsZero ())
+    {
+      m_state->SwitchMaybeToCcaBusy (delayUntilCcaEnd);
+    }
 }
 
-WifiMode
-WifiPhy::GetHeMcs8 ()
+WifiSpectrumBand
+WifiPhy::ConvertHeRuSubcarriers (uint16_t bandWidth, uint16_t guardBandwidth,
+                                 HeRu::SubcarrierRange range, uint8_t bandIndex) const
 {
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HeMcs8", 8, WIFI_MOD_CLASS_HE);
-  return mcs;
+  NS_ASSERT_MSG (false, "802.11ax can only be used with SpectrumWifiPhy");
+  WifiSpectrumBand convertedSubcarriers;
+  return convertedSubcarriers;
 }
 
-WifiMode
-WifiPhy::GetHeMcs9 ()
+void
+WifiPhy::EndReceiveInterBss (void)
 {
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HeMcs9", 9, WIFI_MOD_CLASS_HE);
-  return mcs;
+  NS_LOG_FUNCTION (this);
+  if (!m_channelAccessRequested)
+    {
+      m_powerRestricted = false;
+    }
 }
 
-WifiMode
-WifiPhy::GetHeMcs10 ()
+void
+WifiPhy::ResetReceive (Ptr<Event> event)
 {
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HeMcs10", 10, WIFI_MOD_CLASS_HE);
-  return mcs;
+  NS_LOG_FUNCTION (this << *event);
+  NS_ASSERT (!IsStateRx ());
+  m_interference.NotifyRxEnd (Simulator::Now ());
+  m_currentEvent = 0;
+  m_currentPreambleEvents.clear ();
+  MaybeCcaBusyDuration (GetMeasurementChannelWidth (event->GetPpdu ()));
 }
 
-WifiMode
-WifiPhy::GetHeMcs11 ()
+void
+WifiPhy::NotifyChannelAccessRequested (void)
 {
-  static WifiMode mcs =
-    WifiModeFactory::CreateWifiMcs ("HeMcs11", 11, WIFI_MOD_CLASS_HE);
-  return mcs;
+  NS_LOG_FUNCTION (this);
+  m_channelAccessRequested = true;
 }
 
 bool
 WifiPhy::IsModeSupported (WifiMode mode) const
 {
-  for (uint8_t i = 0; i < GetNModes (); i++)
+  for (const auto & phyEntity : m_phyEntities)
     {
-      if (mode == GetMode (i))
+      if (phyEntity.second->IsModeSupported (mode))
         {
           return true;
         }
@@ -4266,267 +1974,121 @@
   return false;
 }
 
-bool
-WifiPhy::IsMcsSupported (WifiMode mcs) const
+WifiMode
+WifiPhy::GetDefaultMode (void) const
 {
-  WifiModulationClass modulation = mcs.GetModulationClass ();
-  if (modulation == WIFI_MOD_CLASS_HT || modulation == WIFI_MOD_CLASS_VHT
-      || modulation == WIFI_MOD_CLASS_HE)
+  //Start from oldest standards and move up (guaranteed by fact that WifModulationClass is ordered)
+  for (const auto & phyEntity : m_phyEntities)
     {
-      return IsMcsSupported (modulation, mcs.GetMcsValue ());
+      for (const auto & mode : *(phyEntity.second))
+        {
+          return mode;
+        }
     }
-  return false;
+  NS_ASSERT_MSG (false, "Should have found at least one default mode");
+  return WifiMode ();
 }
 
 bool
-WifiPhy::IsMcsSupported (WifiModulationClass mc, uint8_t mcs) const
+WifiPhy::IsMcsSupported (WifiModulationClass modulation, uint8_t mcs) const
 {
-  if (m_mcsIndexMap.find (mc) == m_mcsIndexMap.end ())
-    {
-      return false;
-    }
-  if (m_mcsIndexMap.at (mc).find (mcs) == m_mcsIndexMap.at (mc).end ())
+  const auto phyEntity = m_phyEntities.find (modulation);
+  if (phyEntity == m_phyEntities.end ())
     {
       return false;
     }
-  return true;
+  return phyEntity->second->IsMcsSupported (mcs);
 }
 
-uint8_t
-WifiPhy::GetNModes (void) const
+std::list<WifiMode>
+WifiPhy::GetModeList (void) const
 {
-  return static_cast<uint8_t> (m_deviceRateSet.size ());
+  std::list<WifiMode> list;
+  for (const auto & phyEntity : m_phyEntities)
+    {
+      if (!phyEntity.second->HandlesMcsModes ()) //to exclude MCSs from search
+        {
+          for (const auto & mode : *(phyEntity.second))
+            {
+              list.emplace_back (mode);
+            }
+        }
+    }
+  return list;
 }
 
-WifiMode
-WifiPhy::GetMode (uint8_t mode) const
+std::list<WifiMode>
+WifiPhy::GetModeList (WifiModulationClass modulation) const
 {
-  return m_deviceRateSet[mode];
+  std::list<WifiMode> list;
+  const auto phyEntity = m_phyEntities.find (modulation);
+  if (phyEntity != m_phyEntities.end ())
+    {
+      if (!phyEntity->second->HandlesMcsModes ()) //to exclude MCSs from search
+        {
+          for (const auto & mode : *(phyEntity->second))
+            {
+              list.emplace_back (mode);
+            }
+        }
+    }
+  return list;
 }
 
-uint8_t
+uint16_t
 WifiPhy::GetNMcs (void) const
 {
-  return static_cast<uint8_t> (m_deviceMcsSet.size ());
-}
-
-WifiMode
-WifiPhy::GetMcs (uint8_t mcs) const
-{
-  return m_deviceMcsSet[mcs];
-}
-
-WifiMode
-WifiPhy::GetMcs (WifiModulationClass modulation, uint8_t mcs) const
-{
-  NS_ASSERT_MSG (IsMcsSupported (modulation, mcs), "Unsupported MCS");
-  uint8_t index = m_mcsIndexMap.at (modulation).at (mcs);
-  NS_ASSERT (index < m_deviceMcsSet.size ());
-  WifiMode mode = m_deviceMcsSet[index];
-  NS_ASSERT (mode.GetModulationClass () == modulation);
-  NS_ASSERT (mode.GetMcsValue () == mcs);
-  return mode;
+  uint16_t numMcs = 0;
+  for (const auto & phyEntity : m_phyEntities)
+    {
+      if (phyEntity.second->HandlesMcsModes ()) //to exclude non-MCS modes from search
+        {
+          numMcs += phyEntity.second->GetNumModes ();
+        }
+    }
+  return numMcs;
 }
 
-WifiMode
-WifiPhy::GetHtMcs (uint8_t mcs)
+std::list<WifiMode>
+WifiPhy::GetMcsList (void) const
 {
-  WifiMode mode;
-  switch (mcs)
+  std::list<WifiMode> list;
+  for (const auto & phyEntity : m_phyEntities)
     {
-      case 0:
-        mode = WifiPhy::GetHtMcs0 ();
-        break;
-      case 1:
-        mode = WifiPhy::GetHtMcs1 ();
-        break;
-      case 2:
-        mode = WifiPhy::GetHtMcs2 ();
-        break;
-      case 3:
-        mode = WifiPhy::GetHtMcs3 ();
-        break;
-      case 4:
-        mode = WifiPhy::GetHtMcs4 ();
-        break;
-      case 5:
-        mode = WifiPhy::GetHtMcs5 ();
-        break;
-      case 6:
-        mode = WifiPhy::GetHtMcs6 ();
-        break;
-      case 7:
-        mode = WifiPhy::GetHtMcs7 ();
-        break;
-      case 8:
-        mode = WifiPhy::GetHtMcs8 ();
-        break;
-      case 9:
-        mode = WifiPhy::GetHtMcs9 ();
-        break;
-      case 10:
-        mode = WifiPhy::GetHtMcs10 ();
-        break;
-      case 11:
-        mode = WifiPhy::GetHtMcs11 ();
-        break;
-      case 12:
-        mode = WifiPhy::GetHtMcs12 ();
-        break;
-      case 13:
-        mode = WifiPhy::GetHtMcs13 ();
-        break;
-      case 14:
-        mode = WifiPhy::GetHtMcs14 ();
-        break;
-      case 15:
-        mode = WifiPhy::GetHtMcs15 ();
-        break;
-      case 16:
-        mode = WifiPhy::GetHtMcs16 ();
-        break;
-      case 17:
-        mode = WifiPhy::GetHtMcs17 ();
-        break;
-      case 18:
-        mode = WifiPhy::GetHtMcs18 ();
-        break;
-      case 19:
-        mode = WifiPhy::GetHtMcs19 ();
-        break;
-      case 20:
-        mode = WifiPhy::GetHtMcs20 ();
-        break;
-      case 21:
-        mode = WifiPhy::GetHtMcs21 ();
-        break;
-      case 22:
-        mode = WifiPhy::GetHtMcs22 ();
-        break;
-      case 23:
-        mode = WifiPhy::GetHtMcs23 ();
-        break;
-      case 24:
-        mode = WifiPhy::GetHtMcs24 ();
-        break;
-      case 25:
-        mode = WifiPhy::GetHtMcs25 ();
-        break;
-      case 26:
-        mode = WifiPhy::GetHtMcs26 ();
-        break;
-      case 27:
-        mode = WifiPhy::GetHtMcs27 ();
-        break;
-      case 28:
-        mode = WifiPhy::GetHtMcs28 ();
-        break;
-      case 29:
-        mode = WifiPhy::GetHtMcs29 ();
-        break;
-      case 30:
-        mode = WifiPhy::GetHtMcs30 ();
-        break;
-      case 31:
-        mode = WifiPhy::GetHtMcs31 ();
-        break;
-      default:
-        NS_ABORT_MSG ("Invalid HT MCS");
-        break;
+      if (phyEntity.second->HandlesMcsModes ()) //to exclude non-MCS modes from search
+        {
+          for (const auto & mode : *(phyEntity.second))
+            {
+              list.emplace_back (mode);
+            }
+        }
     }
-  return mode;
+  return list;
 }
 
-WifiMode
-WifiPhy::GetVhtMcs (uint8_t mcs)
+std::list<WifiMode>
+WifiPhy::GetMcsList (WifiModulationClass modulation) const
 {
-  WifiMode mode;
-  switch (mcs)
+  std::list<WifiMode> list;
+  auto phyEntity = m_phyEntities.find (modulation);
+  if (phyEntity != m_phyEntities.end ())
     {
-      case 0:
-        mode = WifiPhy::GetVhtMcs0 ();
-        break;
-      case 1:
-        mode = WifiPhy::GetVhtMcs1 ();
-        break;
-      case 2:
-        mode = WifiPhy::GetVhtMcs2 ();
-        break;
-      case 3:
-        mode = WifiPhy::GetVhtMcs3 ();
-        break;
-      case 4:
-        mode = WifiPhy::GetVhtMcs4 ();
-        break;
-      case 5:
-        mode = WifiPhy::GetVhtMcs5 ();
-        break;
-      case 6:
-        mode = WifiPhy::GetVhtMcs6 ();
-        break;
-      case 7:
-        mode = WifiPhy::GetVhtMcs7 ();
-        break;
-      case 8:
-        mode = WifiPhy::GetVhtMcs8 ();
-        break;
-      case 9:
-        mode = WifiPhy::GetVhtMcs9 ();
-        break;
-      default:
-        NS_ABORT_MSG ("Invalid VHT MCS");
-        break;
+      if (phyEntity->second->HandlesMcsModes ()) //to exclude non-MCS modes from search
+        {
+          for (const auto & mode : *(phyEntity->second))
+            {
+              list.emplace_back (mode);
+            }
+        }
     }
-  return mode;
+  return list;
 }
 
 WifiMode
-WifiPhy::GetHeMcs (uint8_t mcs)
+WifiPhy::GetMcs (WifiModulationClass modulation, uint8_t mcs) const
 {
-  WifiMode mode;
-  switch (mcs)
-    {
-      case 0:
-        mode = WifiPhy::GetHeMcs0 ();
-        break;
-      case 1:
-        mode = WifiPhy::GetHeMcs1 ();
-        break;
-      case 2:
-        mode = WifiPhy::GetHeMcs2 ();
-        break;
-      case 3:
-        mode = WifiPhy::GetHeMcs3 ();
-        break;
-      case 4:
-        mode = WifiPhy::GetHeMcs4 ();
-        break;
-      case 5:
-        mode = WifiPhy::GetHeMcs5 ();
-        break;
-      case 6:
-        mode = WifiPhy::GetHeMcs6 ();
-        break;
-      case 7:
-        mode = WifiPhy::GetHeMcs7 ();
-        break;
-      case 8:
-        mode = WifiPhy::GetHeMcs8 ();
-        break;
-      case 9:
-        mode = WifiPhy::GetHeMcs9 ();
-        break;
-      case 10:
-        mode = WifiPhy::GetHeMcs10 ();
-        break;
-      case 11:
-        mode = WifiPhy::GetHeMcs11 ();
-        break;
-      default:
-        NS_ABORT_MSG ("Invalid HE MCS");
-        break;
-    }
-  return mode;
+  NS_ASSERT_MSG (IsMcsSupported (modulation, mcs), "Unsupported MCS");
+  return m_phyEntities.at (modulation)->GetMcs (mcs);
 }
 
 bool
@@ -4590,16 +2152,14 @@
 }
 
 void
-WifiPhy::SwitchMaybeToCcaBusy (void)
+WifiPhy::SwitchMaybeToCcaBusy (uint16_t channelWidth)
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << channelWidth);
   //We are here because we have received the first bit of a packet and we are
   //not going to be able to synchronize on it
   //In this model, CCA becomes busy when the aggregation of all signals as
   //tracked by the InterferenceHelper class is higher than the CcaBusyThreshold
-
-  uint16_t primaryChannelWidth = GetChannelWidth () >= 40 ? 20 : GetChannelWidth ();
-  Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaEdThresholdW, GetBand (primaryChannelWidth));
+  Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaEdThresholdW, GetPrimaryBand (channelWidth));
   if (!delayUntilCcaEnd.IsZero ())
     {
       NS_LOG_DEBUG ("Calling SwitchMaybeToCcaBusy for " << delayUntilCcaEnd.As (Time::S));
@@ -4611,138 +2171,107 @@
 WifiPhy::AbortCurrentReception (WifiPhyRxfailureReason reason)
 {
   NS_LOG_FUNCTION (this << reason);
-  if (m_endPreambleDetectionEvent.IsRunning ())
-    {
-      m_endPreambleDetectionEvent.Cancel ();
-    }
-  if (m_endPhyRxEvent.IsRunning ())
+  if (reason != OBSS_PD_CCA_RESET || m_currentEvent) //Otherwise abort has already been called previously
     {
-      m_endPhyRxEvent.Cancel ();
-    }
-  if (m_endRxEvent.IsRunning ())
-    {
-      m_endRxEvent.Cancel ();
-    }
-  NotifyRxDrop (GetAddressedPsduInPpdu (m_currentEvent->GetPpdu ()), reason);
-  m_interference.NotifyRxEnd ();
-  if (reason == OBSS_PD_CCA_RESET)
-    {
-      m_state->SwitchFromRxAbort ();
+      for (auto & phyEntity : m_phyEntities)
+        {
+          phyEntity.second->CancelAllEvents ();
+        }
+      if (m_endPhyRxEvent.IsRunning ())
+        {
+          m_endPhyRxEvent.Cancel ();
+        }
+      m_interference.NotifyRxEnd (Simulator::Now ());
+      if (!m_currentEvent)
+        {
+          return;
+        }
+      NotifyRxDrop (GetAddressedPsduInPpdu (m_currentEvent->GetPpdu ()), reason);
+      if (reason == OBSS_PD_CCA_RESET)
+        {
+          m_state->SwitchFromRxAbort ();
+        }
+      for (auto it = m_currentPreambleEvents.begin (); it != m_currentPreambleEvents.end (); ++it)
+        {
+          if (it->second == m_currentEvent)
+            {
+              it = m_currentPreambleEvents.erase (it);
+              break;
+            }
+        }
+      m_currentEvent = 0;
     }
-  m_currentEvent = 0;
 }
 
 void
 WifiPhy::ResetCca (bool powerRestricted, double txPowerMaxSiso, double txPowerMaxMimo)
 {
   NS_LOG_FUNCTION (this << powerRestricted << txPowerMaxSiso << txPowerMaxMimo);
-  m_powerRestricted = powerRestricted;
-  m_txPowerMaxSiso = txPowerMaxSiso;
-  m_txPowerMaxMimo = txPowerMaxMimo;
-  NS_ASSERT ((m_currentEvent->GetEndTime () - Simulator::Now ()).IsPositive ());
-  Simulator::Schedule (m_currentEvent->GetEndTime () - Simulator::Now (), &WifiPhy::EndReceiveInterBss, this);
-  AbortCurrentReception (OBSS_PD_CCA_RESET);
+  // This method might be called multiple times when receiving TB PPDUs with a BSS color
+  // different than the one of the receiver. The first time this method is called, the call
+  // to AbortCurrentReception sets m_currentEvent to 0. Therefore, we need to check whether
+  // m_currentEvent is not 0 before executing the instructions below.
+  if (m_currentEvent != 0)
+    {
+      m_powerRestricted = powerRestricted;
+      m_txPowerMaxSiso = txPowerMaxSiso;
+      m_txPowerMaxMimo = txPowerMaxMimo;
+      NS_ASSERT ((m_currentEvent->GetEndTime () - Simulator::Now ()).IsPositive ());
+      Simulator::Schedule (m_currentEvent->GetEndTime () - Simulator::Now (), &WifiPhy::EndReceiveInterBss, this);
+      Simulator::ScheduleNow (&WifiPhy::AbortCurrentReception, this, OBSS_PD_CCA_RESET); //finish processing field first
+    }
 }
 
 double
-WifiPhy::GetTxPowerForTransmission (WifiTxVector txVector) const
+WifiPhy::GetTxPowerForTransmission (Ptr<const WifiPpdu> ppdu) const
 {
-  NS_LOG_FUNCTION (this << m_powerRestricted);
+  NS_LOG_FUNCTION (this << m_powerRestricted << ppdu);
+  const WifiTxVector& txVector = ppdu->GetTxVector ();
+  // Get transmit power before antenna gain
+  double txPowerDbm;
   if (!m_powerRestricted)
     {
-      return GetPowerDbm (txVector.GetTxPowerLevel ());
+      txPowerDbm = GetPowerDbm (txVector.GetTxPowerLevel ());
     }
   else
     {
       if (txVector.GetNssMax () > 1)
         {
-          return std::min (m_txPowerMaxMimo, GetPowerDbm (txVector.GetTxPowerLevel ()));
+          txPowerDbm = std::min (m_txPowerMaxMimo, GetPowerDbm (txVector.GetTxPowerLevel ()));
         }
       else
         {
-          return std::min (m_txPowerMaxSiso, GetPowerDbm (txVector.GetTxPowerLevel ()));
+          txPowerDbm = std::min (m_txPowerMaxSiso, GetPowerDbm (txVector.GetTxPowerLevel ()));
         }
     }
-}
 
-void
-WifiPhy::StartRx (Ptr<Event> event)
-{
-  uint16_t primaryChannelWidth = GetChannelWidth () >= 40 ? 20 : GetChannelWidth ();
-  auto primaryBand = GetBand (primaryChannelWidth);
-  double rxPowerW = event->GetRxPowerW (primaryBand);
-  NS_LOG_FUNCTION (this << *event << rxPowerW);
-
-  NS_LOG_DEBUG ("sync to signal (power=" << rxPowerW << "W)");
-  m_interference.NotifyRxStart (); //We need to notify it now so that it starts recording events
-
-  if (!m_endPreambleDetectionEvent.IsRunning ())
-    {
-      Time startOfPreambleDuration = GetPreambleDetectionDuration ();
-      Time remainingRxDuration = event->GetDuration () - startOfPreambleDuration;
-      m_endPreambleDetectionEvent = Simulator::Schedule (startOfPreambleDuration, &WifiPhy::StartReceiveHeader, this, event);
-    }
-  else if ((m_frameCaptureModel != 0) && (rxPowerW > m_currentEvent->GetRxPowerW (primaryBand)))
-    {
-      NS_LOG_DEBUG ("Received a stronger signal during preamble detection: drop current packet and switch to new packet");
-      NotifyRxDrop (GetAddressedPsduInPpdu (m_currentEvent->GetPpdu ()), PREAMBLE_DETECTION_PACKET_SWITCH);
-      m_interference.NotifyRxEnd ();
-      m_endPreambleDetectionEvent.Cancel ();
-      m_interference.NotifyRxStart ();
-      Time startOfPreambleDuration = GetPreambleDetectionDuration ();
-      Time remainingRxDuration = event->GetDuration () - startOfPreambleDuration;
-      m_endPreambleDetectionEvent = Simulator::Schedule (startOfPreambleDuration, &WifiPhy::StartReceiveHeader, this, event);
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Drop packet because RX is already decoding preamble");
-      NotifyRxDrop (GetAddressedPsduInPpdu (event->GetPpdu ()), BUSY_DECODING_PREAMBLE);
-      return;
-    }
-  m_currentEvent = event;
+  //Apply power density constraint on EIRP
+  uint16_t channelWidth = ppdu->GetTransmissionChannelWidth ();
+  double txPowerDbmPerMhz = (txPowerDbm + GetTxGain ()) - RatioToDb (channelWidth); //account for antenna gain since EIRP
+  NS_LOG_INFO ("txPowerDbm=" << txPowerDbm << " with txPowerDbmPerMhz=" << txPowerDbmPerMhz << " over " << channelWidth << " MHz");
+  txPowerDbm = std::min (txPowerDbmPerMhz, m_powerDensityLimit) + RatioToDb (channelWidth);
+  txPowerDbm -= GetTxGain (); //remove antenna gain since will be added right afterwards
+  NS_LOG_INFO ("txPowerDbm=" << txPowerDbm << " after applying m_powerDensityLimit=" << m_powerDensityLimit);
+  return txPowerDbm;
 }
 
 Ptr<const WifiPsdu>
 WifiPhy::GetAddressedPsduInPpdu (Ptr<const WifiPpdu> ppdu) const
 {
-  Ptr<const WifiPsdu> psdu;
-  if (!ppdu->IsMu ())
-    {
-      psdu = ppdu->GetPsdu ();
-    }
-  else
-    {
-      uint8_t bssColor = 0;
-      Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (GetDevice ());
-      if (device)
-        {
-          Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
-          if (heConfiguration)
-            {
-              UintegerValue bssColorAttribute;
-              heConfiguration->GetAttribute ("BssColor", bssColorAttribute);
-              bssColor = bssColorAttribute.Get ();
-            }
-        }
-      uint16_t staId = GetStaId ();
-      psdu = ppdu->GetPsdu (bssColor, staId);
-    }
-    return psdu;
+  //TODO: wrapper. See if still needed
+  return GetPhyEntity (ppdu->GetModulation ())->GetAddressedPsduInPpdu (ppdu);
 }
 
 uint16_t
-WifiPhy::GetStaId (void) const
+WifiPhy::GetMeasurementChannelWidth (const Ptr<const WifiPpdu> ppdu) const
 {
-  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (GetDevice ());
-  if (device)
+  if (ppdu == nullptr)
     {
-      Ptr<StaWifiMac> mac = DynamicCast<StaWifiMac> (device->GetMac ());
-      if (mac && mac->IsAssociated ())
-        {
-          return mac->GetAssociationId ();
-        }
+      // Here because PHY was not receiving anything (e.g. resuming from OFF) nor expecting anything (e.g. sleep)
+      // nor processing a Wi-Fi signal.
+      return GetChannelWidth () >= 40 ? 20 : GetChannelWidth ();
     }
-  return SU_STA_ID;
+  return GetPhyEntity (ppdu->GetModulation ())->GetMeasurementChannelWidth (ppdu);
 }
 
 WifiSpectrumBand
@@ -4754,117 +2283,32 @@
   return band;
 }
 
+WifiSpectrumBand
+WifiPhy::GetPrimaryBand (uint16_t bandWidth)
+{
+  if (GetChannelWidth () % 20 != 0)
+    {
+      return GetBand (bandWidth);
+    }
+
+  return GetBand (bandWidth, m_operatingChannel.GetPrimaryChannelIndex (bandWidth));
+}
+
 int64_t
 WifiPhy::AssignStreams (int64_t stream)
 {
   NS_LOG_FUNCTION (this << stream);
-  m_random->SetStream (stream);
-  return 1;
+  int64_t currentStream = stream;
+  m_random->SetStream (currentStream++);
+  currentStream += m_interference.GetErrorRateModel ()->AssignStreams (currentStream);
+  return (currentStream - stream);
 }
 
-} //namespace ns3
-
-namespace {
-
-/**
- * Constructor class
- */
-static class Constructor
-{
-public:
-  Constructor ()
-  {
-    ns3::WifiPhy::GetDsssRate1Mbps ();
-    ns3::WifiPhy::GetDsssRate2Mbps ();
-    ns3::WifiPhy::GetDsssRate5_5Mbps ();
-    ns3::WifiPhy::GetDsssRate11Mbps ();
-    ns3::WifiPhy::GetErpOfdmRate6Mbps ();
-    ns3::WifiPhy::GetErpOfdmRate9Mbps ();
-    ns3::WifiPhy::GetErpOfdmRate12Mbps ();
-    ns3::WifiPhy::GetErpOfdmRate18Mbps ();
-    ns3::WifiPhy::GetErpOfdmRate24Mbps ();
-    ns3::WifiPhy::GetErpOfdmRate36Mbps ();
-    ns3::WifiPhy::GetErpOfdmRate48Mbps ();
-    ns3::WifiPhy::GetErpOfdmRate54Mbps ();
-    ns3::WifiPhy::GetOfdmRate6Mbps ();
-    ns3::WifiPhy::GetOfdmRate9Mbps ();
-    ns3::WifiPhy::GetOfdmRate12Mbps ();
-    ns3::WifiPhy::GetOfdmRate18Mbps ();
-    ns3::WifiPhy::GetOfdmRate24Mbps ();
-    ns3::WifiPhy::GetOfdmRate36Mbps ();
-    ns3::WifiPhy::GetOfdmRate48Mbps ();
-    ns3::WifiPhy::GetOfdmRate54Mbps ();
-    ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz ();
-    ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz ();
-    ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz ();
-    ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz ();
-    ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz ();
-    ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz ();
-    ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz ();
-    ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz ();
-    ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz ();
-    ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz ();
-    ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz ();
-    ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz ();
-    ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz ();
-    ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz ();
-    ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz ();
-    ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz ();
-    ns3::WifiPhy::GetHtMcs0 ();
-    ns3::WifiPhy::GetHtMcs1 ();
-    ns3::WifiPhy::GetHtMcs2 ();
-    ns3::WifiPhy::GetHtMcs3 ();
-    ns3::WifiPhy::GetHtMcs4 ();
-    ns3::WifiPhy::GetHtMcs5 ();
-    ns3::WifiPhy::GetHtMcs6 ();
-    ns3::WifiPhy::GetHtMcs7 ();
-    ns3::WifiPhy::GetHtMcs8 ();
-    ns3::WifiPhy::GetHtMcs9 ();
-    ns3::WifiPhy::GetHtMcs10 ();
-    ns3::WifiPhy::GetHtMcs11 ();
-    ns3::WifiPhy::GetHtMcs12 ();
-    ns3::WifiPhy::GetHtMcs13 ();
-    ns3::WifiPhy::GetHtMcs14 ();
-    ns3::WifiPhy::GetHtMcs15 ();
-    ns3::WifiPhy::GetHtMcs16 ();
-    ns3::WifiPhy::GetHtMcs17 ();
-    ns3::WifiPhy::GetHtMcs18 ();
-    ns3::WifiPhy::GetHtMcs19 ();
-    ns3::WifiPhy::GetHtMcs20 ();
-    ns3::WifiPhy::GetHtMcs21 ();
-    ns3::WifiPhy::GetHtMcs22 ();
-    ns3::WifiPhy::GetHtMcs23 ();
-    ns3::WifiPhy::GetHtMcs24 ();
-    ns3::WifiPhy::GetHtMcs25 ();
-    ns3::WifiPhy::GetHtMcs26 ();
-    ns3::WifiPhy::GetHtMcs27 ();
-    ns3::WifiPhy::GetHtMcs28 ();
-    ns3::WifiPhy::GetHtMcs29 ();
-    ns3::WifiPhy::GetHtMcs30 ();
-    ns3::WifiPhy::GetHtMcs31 ();
-    ns3::WifiPhy::GetVhtMcs0 ();
-    ns3::WifiPhy::GetVhtMcs1 ();
-    ns3::WifiPhy::GetVhtMcs2 ();
-    ns3::WifiPhy::GetVhtMcs3 ();
-    ns3::WifiPhy::GetVhtMcs4 ();
-    ns3::WifiPhy::GetVhtMcs5 ();
-    ns3::WifiPhy::GetVhtMcs6 ();
-    ns3::WifiPhy::GetVhtMcs7 ();
-    ns3::WifiPhy::GetVhtMcs8 ();
-    ns3::WifiPhy::GetVhtMcs9 ();
-    ns3::WifiPhy::GetHeMcs0 ();
-    ns3::WifiPhy::GetHeMcs1 ();
-    ns3::WifiPhy::GetHeMcs2 ();
-    ns3::WifiPhy::GetHeMcs3 ();
-    ns3::WifiPhy::GetHeMcs4 ();
-    ns3::WifiPhy::GetHeMcs5 ();
-    ns3::WifiPhy::GetHeMcs6 ();
-    ns3::WifiPhy::GetHeMcs7 ();
-    ns3::WifiPhy::GetHeMcs8 ();
-    ns3::WifiPhy::GetHeMcs9 ();
-    ns3::WifiPhy::GetHeMcs10 ();
-    ns3::WifiPhy::GetHeMcs11 ();
-  }
-} g_constructor; ///< the constructor
-
+std::ostream& operator<< (std::ostream& os, RxSignalInfo rxSignalInfo)
+{
+  os << "SNR:" << RatioToDb (rxSignalInfo.snr) << " dB"
+     << ", RSSI:" << rxSignalInfo.rssi << " dBm";
+  return os;
 }
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-phy-common.h ns-3.34/src/wifi/model/wifi-phy-common.h
--- ns-3.33/src/wifi/model/wifi-phy-common.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-phy-common.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,333 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006,2007 INRIA
+ * Copyright (c) 2020 Orange Labs
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *          Rediet <getachew.redieteab@orange.com>
+ */
+
+#ifndef WIFI_PHY_COMMON_H
+#define WIFI_PHY_COMMON_H
+
+#include <ostream>
+#include "ns3/fatal-error.h"
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of the following enums:
+ * - ns3::WifiPreamble
+ * - ns3::WifiModulationClass
+ * - ns3::WifiPpduField
+ * - ns3::WifiPpduType
+ * - ns3::WifiPhyRxfailureReason
+ */
+
+namespace ns3 {
+
+/**
+ * These constants define the various convolutional coding rates
+ * used for the OFDM transmission modes in the IEEE 802.11
+ * standard. DSSS (for example) rates which do not have an explicit
+ * coding stage in their generation should have this parameter set to
+ * WIFI_CODE_RATE_UNDEFINED.
+ * \note This typedef and constants could be converted to an enum or scoped
+ * enum if pybindgen is upgraded to support Callback<WifiCodeRate>
+ */
+typedef uint16_t WifiCodeRate;
+const uint16_t WIFI_CODE_RATE_UNDEFINED = 0; //!< undefined coding rate
+const uint16_t WIFI_CODE_RATE_1_2 = 1;       //!< 1/2 coding rate
+const uint16_t WIFI_CODE_RATE_2_3 = 2;       //!< 2/3 coding rate
+const uint16_t WIFI_CODE_RATE_3_4 = 3;       //!< 3/4 coding rate
+const uint16_t WIFI_CODE_RATE_5_6 = 4;       //!< 5/6 coding rate
+
+/**
+ * \ingroup wifi
+ * The type of preamble to be used by an IEEE 802.11 transmission
+ */
+enum WifiPreamble
+{
+  WIFI_PREAMBLE_LONG,
+  WIFI_PREAMBLE_SHORT,
+  WIFI_PREAMBLE_HT_MF,
+  WIFI_PREAMBLE_VHT_SU,
+  WIFI_PREAMBLE_VHT_MU,
+  WIFI_PREAMBLE_HE_SU,
+  WIFI_PREAMBLE_HE_ER_SU,
+  WIFI_PREAMBLE_HE_MU,
+  WIFI_PREAMBLE_HE_TB
+};
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the stream
+ * \param preamble the preamble
+ * \returns a reference to the stream
+ */
+inline std::ostream& operator<< (std::ostream &os, const WifiPreamble &preamble)
+{
+  switch (preamble)
+    {
+      case WIFI_PREAMBLE_LONG:
+        return (os << "LONG");
+      case WIFI_PREAMBLE_SHORT:
+        return (os << "SHORT");
+      case WIFI_PREAMBLE_HT_MF:
+        return (os << "HT_MF");
+      case WIFI_PREAMBLE_VHT_SU:
+        return (os << "VHT_SU");
+      case WIFI_PREAMBLE_VHT_MU:
+        return (os << "VHT_MU");
+      case WIFI_PREAMBLE_HE_SU:
+        return (os << "HE_SU");
+      case WIFI_PREAMBLE_HE_ER_SU:
+        return (os << "HE_ER_SU");
+      case WIFI_PREAMBLE_HE_MU:
+        return (os << "HE_MU");
+      case WIFI_PREAMBLE_HE_TB:
+        return (os << "HE_TB");
+      default:
+        NS_FATAL_ERROR ("Invalid preamble");
+        return (os << "INVALID");
+    }
+}
+
+/**
+ * \ingroup wifi
+ * This enumeration defines the modulation classes per
+ * (Table 10-6 "Modulation classes"; IEEE 802.11-2016, with
+ * updated in 802.11ax/D6.0 as Table 10-9).
+ */
+enum WifiModulationClass
+{
+  /** Modulation class unknown or unspecified. A WifiMode with this
+  WifiModulationClass has not been properly initialized. */
+  WIFI_MOD_CLASS_UNKNOWN = 0,
+  WIFI_MOD_CLASS_DSSS,     //!< DSSS (Clause 15)
+  WIFI_MOD_CLASS_HR_DSSS,  //!< HR/DSSS (Clause 16)
+  WIFI_MOD_CLASS_ERP_OFDM, //!< ERP-OFDM (18.4)
+  WIFI_MOD_CLASS_OFDM,     //!< OFDM (Clause 17)
+  WIFI_MOD_CLASS_HT,       //!< HT (Clause 19)
+  WIFI_MOD_CLASS_VHT,      //!< VHT (Clause 22)
+  WIFI_MOD_CLASS_HE        //!< HE (Clause 27)
+};
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the stream
+ * \param modulation the WifiModulationClass
+ * \returns a reference to the stream
+ */
+inline std::ostream& operator<< (std::ostream &os, const WifiModulationClass &modulation)
+{
+  switch (modulation)
+    {
+      case WIFI_MOD_CLASS_DSSS:
+        return (os << "DSSS");
+      case WIFI_MOD_CLASS_HR_DSSS:
+        return (os << "HR/DSSS");
+      case WIFI_MOD_CLASS_ERP_OFDM:
+        return (os << "ERP-OFDM");
+      case WIFI_MOD_CLASS_OFDM:
+        return (os << "OFDM");
+      case WIFI_MOD_CLASS_HT:
+        return (os << "HT");
+      case WIFI_MOD_CLASS_VHT:
+        return (os << "VHT");
+      case WIFI_MOD_CLASS_HE:
+        return (os << "HE");
+      default:
+        NS_FATAL_ERROR ("Unknown modulation");
+        return (os << "unknown");
+    }
+}
+
+/**
+ * \ingroup wifi
+ * The type of PPDU field (grouped for convenience)
+ */
+enum WifiPpduField
+{
+  /**
+   * SYNC + SFD fields for DSSS or ERP,
+   * shortSYNC + shortSFD fields for HR/DSSS or ERP,
+   * HT-GF-STF + HT-GF-LTF1 fields for HT-GF,
+   * L-STF + L-LTF fields otherwise.
+   */
+  WIFI_PPDU_FIELD_PREAMBLE = 0,
+  /**
+   * PHY header field for DSSS or ERP,
+   * short PHY header field for HR/DSSS or ERP,
+   * field not present for HT-GF,
+   * L-SIG field or L-SIG + RL-SIG fields otherwise.
+   */
+  WIFI_PPDU_FIELD_NON_HT_HEADER,
+  WIFI_PPDU_FIELD_HT_SIG,   //!< HT-SIG field
+  WIFI_PPDU_FIELD_TRAINING, //!< STF + LTF fields (excluding those in preamble for HT-GF)
+  WIFI_PPDU_FIELD_SIG_A,    //!< SIG-A field
+  WIFI_PPDU_FIELD_SIG_B,    //!< SIG-B field
+  WIFI_PPDU_FIELD_DATA      //!< data field
+};
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the stream
+ * \param field the PPDU field
+ * \returns a reference to the stream
+ */
+inline std::ostream& operator<< (std::ostream &os, const WifiPpduField &field)
+{
+  switch (field)
+    {
+      case WIFI_PPDU_FIELD_PREAMBLE:
+        return (os << "preamble");
+      case WIFI_PPDU_FIELD_NON_HT_HEADER:
+        return (os << "non-HT header");
+      case WIFI_PPDU_FIELD_HT_SIG:
+        return (os << "HT-SIG");
+      case WIFI_PPDU_FIELD_TRAINING:
+        return (os << "training");
+      case WIFI_PPDU_FIELD_SIG_A:
+        return (os << "SIG-A");
+      case WIFI_PPDU_FIELD_SIG_B:
+        return (os << "SIG-B");
+      case WIFI_PPDU_FIELD_DATA:
+        return (os << "data");
+      default:
+        NS_FATAL_ERROR ("Unknown field");
+        return (os << "unknown");
+    }
+}
+
+/**
+ * \ingroup wifi
+ * The type of PPDU (SU, DL MU, or UL MU)
+ */
+enum WifiPpduType
+{
+  WIFI_PPDU_TYPE_SU = 0,
+  WIFI_PPDU_TYPE_DL_MU,
+  WIFI_PPDU_TYPE_UL_MU
+};
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the stream
+ * \param type the PPDU type
+ * \returns a reference to the stream
+ */
+inline std::ostream& operator<< (std::ostream &os, const WifiPpduType &type)
+{
+  switch (type)
+    {
+      case WIFI_PPDU_TYPE_SU:
+        return (os << "SU");
+      case WIFI_PPDU_TYPE_DL_MU:
+        return (os << "DL MU");
+      case WIFI_PPDU_TYPE_UL_MU:
+        return (os << "UL MU");
+      default:
+        NS_FATAL_ERROR ("Unknown type");
+        return (os << "unknown");
+    }
+}
+
+/**
+ * \ingroup wifi
+ * Enumeration of the possible reception failure reasons.
+ */
+enum WifiPhyRxfailureReason
+{
+  UNKNOWN = 0,
+  UNSUPPORTED_SETTINGS,
+  CHANNEL_SWITCHING,
+  RXING,
+  TXING,
+  SLEEPING,
+  BUSY_DECODING_PREAMBLE,
+  PREAMBLE_DETECT_FAILURE,
+  RECEPTION_ABORTED_BY_TX,
+  L_SIG_FAILURE,
+  HT_SIG_FAILURE,
+  SIG_A_FAILURE,
+  SIG_B_FAILURE,
+  PREAMBLE_DETECTION_PACKET_SWITCH,
+  FRAME_CAPTURE_PACKET_SWITCH,
+  OBSS_PD_CCA_RESET,
+  HE_TB_PPDU_TOO_LATE,
+  FILTERED
+};
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the stream
+ * \param reason the failure reason
+ * \returns a reference to the stream
+ */
+inline std::ostream& operator<< (std::ostream &os, const WifiPhyRxfailureReason &reason)
+{
+  switch (reason)
+    {
+      case UNSUPPORTED_SETTINGS:
+        return (os << "UNSUPPORTED_SETTINGS");
+      case CHANNEL_SWITCHING:
+        return (os << "CHANNEL_SWITCHING");
+      case RXING:
+        return (os << "RXING");
+      case TXING:
+        return (os << "TXING");
+      case SLEEPING:
+        return (os << "SLEEPING");
+      case BUSY_DECODING_PREAMBLE:
+        return (os << "BUSY_DECODING_PREAMBLE");
+      case PREAMBLE_DETECT_FAILURE:
+        return (os << "PREAMBLE_DETECT_FAILURE");
+      case RECEPTION_ABORTED_BY_TX:
+        return (os << "RECEPTION_ABORTED_BY_TX");
+      case L_SIG_FAILURE:
+        return (os << "L_SIG_FAILURE");
+      case HT_SIG_FAILURE:
+        return (os << "HT_SIG_FAILURE");
+      case SIG_A_FAILURE:
+        return (os << "SIG_A_FAILURE");
+      case SIG_B_FAILURE:
+        return (os << "SIG_B_FAILURE");
+      case PREAMBLE_DETECTION_PACKET_SWITCH:
+        return (os << "PREAMBLE_DETECTION_PACKET_SWITCH");
+      case FRAME_CAPTURE_PACKET_SWITCH:
+        return (os << "FRAME_CAPTURE_PACKET_SWITCH");
+      case OBSS_PD_CCA_RESET:
+        return (os << "OBSS_PD_CCA_RESET");
+      case HE_TB_PPDU_TOO_LATE:
+        return (os << "HE_TB_PPDU_TOO_LATE");
+      case FILTERED:
+        return (os << "FILTERED");
+      case UNKNOWN:
+      default:
+        NS_FATAL_ERROR ("Unknown reason");
+        return (os << "UNKNOWN");
+    }
+}
+
+} //namespace ns3
+
+#endif /* WIFI_PHY_COMMON_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-phy.h ns-3.34/src/wifi/model/wifi-phy.h
--- ns-3.33/src/wifi/model/wifi-phy.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -22,20 +22,15 @@
 #ifndef WIFI_PHY_H
 #define WIFI_PHY_H
 
-#include "ns3/event-id.h"
 #include "ns3/error-model.h"
-#include "wifi-mpdu-type.h"
 #include "wifi-standards.h"
 #include "interference-helper.h"
 #include "wifi-phy-state-helper.h"
-#include "wifi-ppdu.h"
+#include "phy-entity.h"
+#include "wifi-phy-operating-channel.h"
 
 namespace ns3 {
 
-#define HE_PHY 125
-#define VHT_PHY 126
-#define HT_PHY 127
-
 class Channel;
 class NetDevice;
 class MobilityModel;
@@ -44,97 +39,6 @@
 class PreambleDetectionModel;
 class WifiRadioEnergyModel;
 class UniformRandomVariable;
-class WifiPsdu;
-
-/**
- * Enumeration of the possible reception failure reasons.
- */
-enum WifiPhyRxfailureReason
-{
-  UNKNOWN = 0,
-  UNSUPPORTED_SETTINGS,
-  CHANNEL_SWITCHING,
-  RXING,
-  TXING,
-  SLEEPING,
-  BUSY_DECODING_PREAMBLE,
-  PREAMBLE_DETECT_FAILURE,
-  RECEPTION_ABORTED_BY_TX,
-  L_SIG_FAILURE,
-  SIG_A_FAILURE,
-  PREAMBLE_DETECTION_PACKET_SWITCH,
-  FRAME_CAPTURE_PACKET_SWITCH,
-  OBSS_PD_CCA_RESET,
-  FILTERED
-};
-
-/**
-* \brief Stream insertion operator.
-*
-* \param os the stream
-* \param reason the failure reason
-* \returns a reference to the stream
-*/
-inline std::ostream& operator<< (std::ostream& os, WifiPhyRxfailureReason reason)
-{
-  switch (reason)
-    {
-    case UNSUPPORTED_SETTINGS:
-      return (os << "UNSUPPORTED_SETTINGS");
-    case CHANNEL_SWITCHING:
-      return (os << "CHANNEL_SWITCHING");
-    case RXING:
-      return (os << "RXING");
-    case TXING:
-      return (os << "TXING");
-    case SLEEPING:
-      return (os << "SLEEPING");
-    case BUSY_DECODING_PREAMBLE:
-      return (os << "BUSY_DECODING_PREAMBLE");
-    case PREAMBLE_DETECT_FAILURE:
-      return (os << "PREAMBLE_DETECT_FAILURE");
-    case RECEPTION_ABORTED_BY_TX:
-      return (os << "RECEPTION_ABORTED_BY_TX");
-    case L_SIG_FAILURE:
-      return (os << "L_SIG_FAILURE");
-    case SIG_A_FAILURE:
-      return (os << "SIG_A_FAILURE");
-    case PREAMBLE_DETECTION_PACKET_SWITCH:
-      return (os << "PREAMBLE_DETECTION_PACKET_SWITCH");
-    case FRAME_CAPTURE_PACKET_SWITCH:
-      return (os << "FRAME_CAPTURE_PACKET_SWITCH");
-    case OBSS_PD_CCA_RESET:
-      return (os << "OBSS_PD_CCA_RESET");
-    case FILTERED:
-      return (os << "FILTERED");
-    case UNKNOWN:
-    default:
-      NS_FATAL_ERROR ("Unknown reason");
-      return (os << "UNKNOWN");
-    }
-}
-
-
-/// SignalNoiseDbm structure
-struct SignalNoiseDbm
-{
-  double signal; ///< in dBm
-  double noise; ///< in dBm
-};
-
-/// MpduInfo structure
-struct MpduInfo
-{
-  MpduType type; ///< type
-  uint32_t mpduRefNumber; ///< MPDU ref number
-};
-
-/// Parameters for receive HE preamble
-struct HePreambleParameters
-{
-  double rssiW; ///< RSSI in W
-  uint8_t bssColor; ///< BSS color
-};
 
 /**
  * \brief 802.11 PHY layer model
@@ -144,6 +48,7 @@
 class WifiPhy : public Object
 {
 public:
+  friend class PhyEntity;
   /**
    * \brief Get the type ID.
    * \return the object TypeId
@@ -153,19 +58,8 @@
   WifiPhy ();
   virtual ~WifiPhy ();
 
-  /**
-   * A pair of a channel number and a WifiPhyBand
-   */
-  typedef std::pair<uint8_t, WifiPhyBand> ChannelNumberBandPair;
-  /**
-   * A pair of a ChannelNumberBandPair and a WifiPhyStandard
-   */
-  typedef std::pair<ChannelNumberBandPair, WifiPhyStandard> ChannelNumberStandardPair;
-  /**
-   * A pair of a center frequency (MHz) and a channel width (MHz)
-   */
-  typedef std::pair<uint16_t, uint16_t> FrequencyWidthPair;
-  
+  static const std::set<FrequencyChannelInfo> m_frequencyChannels;  //!< Available frequency channels
+
   /**
    * Return the WifiPhyStateHelper of this PHY
    *
@@ -208,37 +102,10 @@
    * Start receiving the PHY preamble of a PPDU (i.e. the first bit of the preamble has arrived).
    *
    * \param ppdu the arriving PPDU
-   * \param rxPowersW the receive power in W per 20 MHz channel band
-   */
-  void StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW);
-
-  /**
-   * Start receiving the PHY header of a PPDU (i.e. after the end of receiving the preamble).
-   *
-   * \param event the event holding incoming PPDU's information
-   */
-  void StartReceiveHeader (Ptr<Event> event);
-
-  /**
-   * Continue receiving the PHY header of a PPDU (i.e. after the end of receiving the non-HT header part).
-   *
-   * \param event the event holding incoming PPDU's information
+   * \param rxPowersW the receive power in W per band
+   * \param rxDuration the duration of the PPDU
    */
-  void ContinueReceiveHeader (Ptr<Event> event);
-
-  /**
-   * Start receiving the PSDU (i.e. the first symbol of the PSDU has arrived).
-   *
-   * \param event the event holding incoming PPDU's information
-   */
-  void StartReceivePayload (Ptr<Event> event);
-
-  /**
-   * The last symbol of the PPDU has arrived.
-   *
-   * \param event the event holding incoming PPDU's information
-   */
-  void EndReceive (Ptr<Event> event);
+  void StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW, Time rxDuration);
 
   /**
    * Reset PHY at the end of the packet under reception after it has failed the PHY header.
@@ -254,12 +121,28 @@
   void EndReceiveInterBss (void);
 
   /**
-   * \param psdu the PSDU to send
+   * Get a WifiConstPsduMap from a PSDU and the TXVECTOR to use to send the PSDU.
+   * The STA-ID value is properly determined based on whether the given PSDU has
+   * to be transmitted as a DL or UL frame.
+   *
+   * \param psdu the given PSDU
+   * \param txVector the TXVECTOR to use to send the PSDU
+   * \return a WifiConstPsduMap built from the given PSDU and the given TXVECTOR
+   */
+  static WifiConstPsduMap GetWifiConstPsduMap (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector);
+
+  /**
+   * This function is a wrapper for the Send variant that accepts a WifiConstPsduMap
+   * as first argument. This function inserts the given PSDU in a WifiConstPsduMap
+   * along with a STA-ID value that is determined based on whether the given PSDU has
+   * to be transmitted as a DL or UL frame.
+   *
+   * \param psdu the PSDU to send (in a SU PPDU)
    * \param txVector the TXVECTOR that has TX parameters such as mode, the transmission mode to use to send
    *        this PSDU, and txPowerLevel, a power level to use to send the whole PPDU. The real transmission
    *        power is calculated as txPowerMin + txPowerLevel * (txPowerMax - txPowerMin) / nTxLevels
    */
-  void Send (Ptr<const WifiPsdu> psdu, WifiTxVector txVector);
+  void Send (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector);
   /**
    * \param psdus the PSDUs to send
    * \param txVector the TXVECTOR that has tx parameters such as mode, the transmission mode to use to send
@@ -348,90 +231,43 @@
    *
    * \return the total amount of time this PHY will stay busy for the transmission of these bytes.
    */
-  static Time CalculateTxDuration (uint32_t size, WifiTxVector txVector, WifiPhyBand band,
+  static Time CalculateTxDuration (uint32_t size, const WifiTxVector& txVector, WifiPhyBand band,
                                    uint16_t staId = SU_STA_ID);
   /**
+   * This function is a wrapper for the CalculateTxDuration variant that accepts a
+   * WifiConstPsduMap as first argument. This function inserts the given PSDU in a
+   * WifiConstPsduMap along with a STA-ID value that is determined based on whether
+   * the given PSDU has to be transmitted as a DL or UL frame, thus allowing to
+   * properly calculate the TX duration in case the PSDU has to be transmitted as
+   * an UL frame.
+   *
+   * \param psdu the PSDU to transmit
+   * \param txVector the TXVECTOR used for the transmission of the PSDU
+   * \param band the frequency band
+   *
+   * \return the total amount of time this PHY will stay busy for the transmission of the PPDU
+   */
+  static Time CalculateTxDuration (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, WifiPhyBand band);
+  /**
    * \param psduMap the PSDU(s) to transmit indexed by STA-ID
    * \param txVector the TXVECTOR used for the transmission of the PPDU
    * \param band the frequency band being used
    *
    * \return the total amount of time this PHY will stay busy for the transmission of the PPDU
    */
-  static Time CalculateTxDuration (WifiConstPsduMap psduMap, WifiTxVector txVector, WifiPhyBand band);
+  static Time CalculateTxDuration (WifiConstPsduMap psduMap, const WifiTxVector& txVector, WifiPhyBand band);
 
   /**
    * \param txVector the transmission parameters used for this packet
    *
    * \return the total amount of time this PHY will stay busy for the transmission of the PHY preamble and PHY header.
    */
-  static Time CalculatePhyPreambleAndHeaderDuration (WifiTxVector txVector);
+  static Time CalculatePhyPreambleAndHeaderDuration (const WifiTxVector& txVector);
   /**
-   *
    * \return the preamble detection duration, which is the time correlation needs to detect the start of an incoming frame.
    */
   static Time GetPreambleDetectionDuration (void);
   /**
-   * \param txVector the transmission parameters used for this packet
-   *
-   * \return the training symbol duration
-   */
-  static Time GetPhyTrainingSymbolDuration (WifiTxVector txVector);
-  /**
-   * \return the WifiMode used for the transmission of the HT-SIG and the HT training fields
-   *         in Mixed Format and Greenfield format PHY header
-   */
-  static WifiMode GetHtPhyHeaderMode ();
-  /**
-   * \return the WifiMode used for the transmission of the VHT-STF, VHT-LTF and VHT-SIG-B fields
-   */
-  static WifiMode GetVhtPhyHeaderMode ();
-  /**
-   * \return the WifiMode used for the transmission of the HE-STF, HE-LTF and HE-SIG-B fields
-   */
-  static WifiMode GetHePhyHeaderMode ();
-  /**
-   * \param preamble the type of preamble
-   *
-   * \return the duration of the HT-SIG in Mixed Format and Greenfield format PHY header
-   */
-  static Time GetPhyHtSigHeaderDuration (WifiPreamble preamble);
-  /**
-   * \param preamble the type of preamble
-   *
-   * \return the duration of the SIG-A1 in PHY header
-   */
-  static Time GetPhySigA1Duration (WifiPreamble preamble);
-  /**
-   * \param preamble the type of preamble
-   *
-   * \return the duration of the SIG-A2 in PHY header
-   */
-  static Time GetPhySigA2Duration (WifiPreamble preamble);
-  /**
-   * \param preamble the type of preamble
-   *
-   * \return the duration of the SIG-B in PHY header
-   */
-  static Time GetPhySigBDuration (WifiPreamble preamble);
-  /**
-   * \param txVector the transmission parameters used for this packet
-   *
-   * \return the WifiMode used for the transmission of the PHY header
-   */
-  static WifiMode GetPhyHeaderMode (WifiTxVector txVector);
-  /**
-   * \param txVector the transmission parameters used for this packet
-   *
-   * \return the duration of the PHY header
-   */
-  static Time GetPhyHeaderDuration (WifiTxVector txVector);
-  /**
-   * \param txVector the transmission parameters used for this packet
-   *
-   * \return the duration of the PHY preamble
-   */
-  static Time GetPhyPreambleDuration (WifiTxVector txVector);
-  /**
    * \param size the number of bytes in the packet to send
    * \param txVector the TXVECTOR used for the transmission of this packet
    * \param band the frequency band
@@ -440,7 +276,7 @@
    *
    * \return the duration of the PSDU
    */
-  static Time GetPayloadDuration (uint32_t size, WifiTxVector txVector, WifiPhyBand band, MpduType mpdutype = NORMAL_MPDU,
+  static Time GetPayloadDuration (uint32_t size, const WifiTxVector& txVector, WifiPhyBand band, MpduType mpdutype = NORMAL_MPDU,
                                   uint16_t staId = SU_STA_ID);
   /**
    * \param size the number of bytes in the packet to send
@@ -456,843 +292,254 @@
    * If incFlag is set, this parameter will be updated.
    * \param staId the STA-ID of the PSDU (only used for MU PPDUs)
    *
-   * \return the duration of the PSDU
-   */
-  static Time GetPayloadDuration (uint32_t size, WifiTxVector txVector, WifiPhyBand band, MpduType mpdutype,
-                                  bool incFlag, uint32_t &totalAmpduSize, double &totalAmpduNumSymbols,
-                                  uint16_t staId);
-  /**
-   * \param txVector the transmission parameters used for this packet
-   *
-   * \return the duration until the start of the packet
-   */
-  static Time GetStartOfPacketDuration (WifiTxVector txVector);
-
-  /**
-   * The WifiPhy::GetNModes() and WifiPhy::GetMode() methods are used
-   * (e.g., by a WifiRemoteStationManager) to determine the set of
-   * transmission/reception modes that this WifiPhy(-derived class)
-   * can support - a set of WifiMode objects which we call the
-   * DeviceRateSet, and which is stored as WifiPhy::m_deviceRateSet.
-   *
-   * It is important to note that the DeviceRateSet is a superset (not
-   * necessarily proper) of the OperationalRateSet (which is
-   * logically, if not actually, a property of the associated
-   * WifiRemoteStationManager), which itself is a superset (again, not
-   * necessarily proper) of the BSSBasicRateSet.
-   *
-   * \return the number of transmission modes supported by this PHY.
-   *
-   * \sa WifiPhy::GetMode()
-   */
-  uint8_t GetNModes (void) const;
-  /**
-   * The WifiPhy::GetNModes() and WifiPhy::GetMode() methods are used
-   * (e.g., by a WifiRemoteStationManager) to determine the set of
-   * transmission/reception modes that this WifiPhy(-derived class)
-   * can support - a set of WifiMode objects which we call the
-   * DeviceRateSet, and which is stored as WifiPhy::m_deviceRateSet.
-   *
-   * It is important to note that the DeviceRateSet is a superset (not
-   * necessarily proper) of the OperationalRateSet (which is
-   * logically, if not actually, a property of the associated
-   * WifiRemoteStationManager), which itself is a superset (again, not
-   * necessarily proper) of the BSSBasicRateSet.
-   *
-   * \param mode index in array of supported modes
-   *
-   * \return the mode whose index is specified.
-   *
-   * \sa WifiPhy::GetNModes()
-   */
-  WifiMode GetMode (uint8_t mode) const;
-  /**
-   * Check if the given WifiMode is supported by the PHY.
-   *
-   * \param mode the wifi mode to check
-   *
-   * \return true if the given mode is supported,
-   *         false otherwise
-   */
-  bool IsModeSupported (WifiMode mode) const;
-  /**
-   * Check if the given WifiMode is supported by the PHY.
-   *
-   * \param mcs the wifi mode to check
-   *
-   * \return true if the given mode is supported,
-   *         false otherwise
-   */
-  bool IsMcsSupported (WifiMode mcs) const;
-  /**
-   * Check if the given MCS of the given modulation class is supported by the PHY.
-   *
-   * \param mc the modulation class
-   * \param mcs the MCS value
-   *
-   * \return true if the given mode is supported,
-   *         false otherwise
-   */
-  bool IsMcsSupported (WifiModulationClass mc, uint8_t mcs) const;
-
-  /**
-   * \param txVector the transmission vector
-   * \param ber the probability of bit error rate
-   *
-   * \return the minimum SNR which is required to achieve
-   *          the requested BER for the specified transmission vector. (W/W)
-   */
-  double CalculateSnr (WifiTxVector txVector, double ber) const;
-
-  /**
-   * Set the Short Interframe Space (SIFS) for this PHY.
-   *
-   * \param sifs the SIFS duration
-   */
-  void SetSifs (Time sifs);
-  /**
-   * Return the Short Interframe Space (SIFS) for this PHY.
-   *
-   * \return the SIFS duration
-   */
-  Time GetSifs (void) const;
-  /**
-   * Set the slot duration for this PHY.
-   *
-   * \param slot the slot duration
-   */
-  void SetSlot (Time slot);
-  /**
-   * Return the slot duration for this PHY.
-   *
-   * \return the slot duration
-   */
-  Time GetSlot (void) const;
-  /**
-   * Set the PCF Interframe Space (PIFS) for this PHY.
-   *
-   * \param pifs the PIFS duration
-   */
-  void SetPifs (Time pifs);
-  /**
-   * Return the PCF Interframe Space (PIFS) for this PHY.
-   *
-   * \return the PIFS duration
-   */
-  Time GetPifs (void) const;
-  /**
-   * Return the estimated Ack TX time for this PHY.
-   *
-   * \return the estimated Ack TX time
-   */
-  Time GetAckTxTime (void) const;
-  /**
-   * Return the estimated BlockAck TX time for this PHY.
-   *
-   * \return the estimated BlockAck TX time
-   */
-  Time GetBlockAckTxTime (void) const;
-
-  /**
-  * The WifiPhy::NBssMembershipSelectors() method is used
-  * (e.g., by a WifiRemoteStationManager) to determine the set of
-  * transmission/reception modes that this WifiPhy(-derived class)
-  * can support - a set of WifiMode objects which we call the
-  * BssMembershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet.
-  *
-  * \return the membership selector whose index is specified.
-  */
-  uint8_t GetNBssMembershipSelectors (void) const;
-  /**
-  * The WifiPhy::BssMembershipSelector() method is used
-  * (e.g., by a WifiRemoteStationManager) to determine the set of
-  * transmission/reception modes that this WifiPhy(-derived class)
-  * can support - a set of WifiMode objects which we call the
-  * BssMembershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet.
-  *
-  * \param selector index in array of supported memberships
-  *
-  * \return the membership selector whose index is specified.
-  */
-  uint8_t GetBssMembershipSelector (uint8_t selector) const;
-  /**
-   * The WifiPhy::GetNMcs() method is used
-   * (e.g., by a WifiRemoteStationManager) to determine the set of
-   * transmission/reception MCS indexes that this WifiPhy(-derived class)
-   * can support - a set of MCS indexes which we call the
-   * DeviceMcsSet, and which is stored as WifiPhy::m_deviceMcsSet.
-   *
-   * \return the MCS index whose index is specified.
-   */
-  uint8_t GetNMcs (void) const;
-  /**
-   * The WifiPhy::GetMcs() method is used
-   * (e.g., by a WifiRemoteStationManager) to determine the set of
-   * transmission/reception MCS indexes that this WifiPhy(-derived class)
-   * can support - a set of MCS indexes which we call the
-   * DeviceMcsSet, and which is stored as WifiPhy::m_deviceMcsSet.
-   *
-   * \param mcs index in array of supported MCS
-   *
-   * \return the MCS index whose index is specified.
-   */
-  WifiMode GetMcs (uint8_t mcs) const;
-  /**
-   * Get the WifiMode object corresponding to the given MCS of the given
-   * modulation class.
-   *
-   * \param modulation the modulation class
-   * \param mcs the MCS value
-   *
-   * \return the WifiMode object corresponding to the given MCS of the given
-   *         modulation class
-   */
-  WifiMode GetMcs (WifiModulationClass modulation, uint8_t mcs) const;
-  /**
-   * Get the WifiMode object corresponding to the given MCS of the
-   * HT modulation class.
-   *
-   * \param mcs the MCS value
-   *
-   * \return the WifiMode object corresponding to the given MCS of the
-   *         HT modulation class
-   */
-  static WifiMode GetHtMcs (uint8_t mcs);
-  /**
-   * Get the WifiMode object corresponding to the given MCS of the
-   * VHT modulation class.
-   *
-   * \param mcs the MCS value
-   *
-   * \return the WifiMode object corresponding to the given MCS of the
-   *         VHT modulation class
-   */
-  static WifiMode GetVhtMcs (uint8_t mcs);
-  /**
-   * Get the WifiMode object corresponding to the given MCS of the
-   * HE modulation class.
-   *
-   * \param mcs the MCS value
-   *
-   * \return the WifiMode object corresponding to the given MCS of the
-   *         HE modulation class
-   */
-  static WifiMode GetHeMcs (uint8_t mcs);
-
-  /**
-   * \brief Set channel number.
-   *
-   * Channel center frequency = Channel starting frequency + 5 MHz * (nch - 1)
-   *
-   * where Starting channel frequency is standard-dependent,
-   * as defined in (Section 18.3.8.4.2 "Channel numbering"; IEEE Std 802.11-2012).
-   * This method may fail to take action if the PHY model determines that
-   * the channel number cannot be switched for some reason (e.g. sleep state)
-   *
-   * \param id the channel number
-   */
-  virtual void SetChannelNumber (uint8_t id);
-  /**
-   * Return current channel number.
-   *
-   * \return the current channel number
-   */
-  uint8_t GetChannelNumber (void) const;
-  /**
-   * \return the required time for channel switch operation of this WifiPhy
-   */
-  Time GetChannelSwitchDelay (void) const;
-
-  /**
-   * Configure the PHY-level parameters for different Wi-Fi standard.
-   *
-   * \param standard the Wi-Fi standard
-   * \param band the Wi-Fi band
-   */
-  virtual void ConfigureStandardAndBand (WifiPhyStandard standard, WifiPhyBand band);
-
-  /**
-   * Get the configured Wi-Fi standard
-   *
-   * \return the Wi-Fi standard that has been configured
-   */
-  WifiPhyStandard GetPhyStandard (void) const;
-
-  /**
-   * Get the configured Wi-Fi band
-   *
-   * \return the Wi-Fi band that has been configured
-   */
-  WifiPhyBand GetPhyBand (void) const;
-
-  /**
-   * Add a channel definition to the WifiPhy. The channelNumber, PHY
-   * band and PHY standard informations may then be used to lookup a
-   * pair (frequency, channelWidth).
-   *
-   * If the channel is not already defined for the standard, the method
-   * should return true; otherwise false.
-   *
-   * \param channelNumber the channel number to define
-   * \param band the PHY band which the channel belongs to
-   * \param standard the applicable WifiPhyStandard
-   * \param frequency the frequency (MHz)
-   * \param channelWidth the channel width (MHz)
-   *
-   * \return true if the channel definition succeeded
-   */
-  bool DefineChannelNumber (uint8_t channelNumber, WifiPhyBand band, WifiPhyStandard standard, uint16_t frequency, uint16_t channelWidth);
-
-  /**
-   * Return the Channel this WifiPhy is connected to.
-   *
-   * \return the Channel this WifiPhy is connected to
-   */
-  virtual Ptr<Channel> GetChannel (void) const = 0;
-
-  /**
-   * Return a WifiMode for DSSS at 1Mbps.
-   *
-   * \return a WifiMode for DSSS at 1Mbps
-   */
-  static WifiMode GetDsssRate1Mbps ();
-  /**
-   * Return a WifiMode for DSSS at 2Mbps.
-   *
-   * \return a WifiMode for DSSS at 2Mbps
-   */
-  static WifiMode GetDsssRate2Mbps ();
-  /**
-   * Return a WifiMode for DSSS at 5.5Mbps.
-   *
-   * \return a WifiMode for DSSS at 5.5Mbps
-   */
-  static WifiMode GetDsssRate5_5Mbps ();
-  /**
-   * Return a WifiMode for DSSS at 11Mbps.
-   *
-   * \return a WifiMode for DSSS at 11Mbps
-   */
-  static WifiMode GetDsssRate11Mbps ();
-  /**
-   * Return a WifiMode for ERP-OFDM at 6Mbps.
-   *
-   * \return a WifiMode for ERP-OFDM at 6Mbps
-   */
-  static WifiMode GetErpOfdmRate6Mbps ();
-  /**
-   * Return a WifiMode for ERP-OFDM at 9Mbps.
-   *
-   * \return a WifiMode for ERP-OFDM at 9Mbps
-   */
-  static WifiMode GetErpOfdmRate9Mbps ();
-  /**
-   * Return a WifiMode for ERP-OFDM at 12Mbps.
-   *
-   * \return a WifiMode for ERP-OFDM at 12Mbps
-   */
-  static WifiMode GetErpOfdmRate12Mbps ();
-  /**
-   * Return a WifiMode for ERP-OFDM at 18Mbps.
-   *
-   * \return a WifiMode for ERP-OFDM at 18Mbps
-   */
-  static WifiMode GetErpOfdmRate18Mbps ();
-  /**
-   * Return a WifiMode for ERP-OFDM at 24Mbps.
-   *
-   * \return a WifiMode for ERP-OFDM at 24Mbps
-   */
-  static WifiMode GetErpOfdmRate24Mbps ();
-  /**
-   * Return a WifiMode for ERP-OFDM at 36Mbps.
-   *
-   * \return a WifiMode for ERP-OFDM at 36Mbps
-   */
-  static WifiMode GetErpOfdmRate36Mbps ();
-  /**
-   * Return a WifiMode for ERP-OFDM at 48Mbps.
-   *
-   * \return a WifiMode for ERP-OFDM at 48Mbps
-   */
-  static WifiMode GetErpOfdmRate48Mbps ();
-  /**
-   * Return a WifiMode for ERP-OFDM at 54Mbps.
-   *
-   * \return a WifiMode for ERP-OFDM at 54Mbps
-   */
-  static WifiMode GetErpOfdmRate54Mbps ();
-  /**
-   * Return a WifiMode for OFDM at 6Mbps.
-   *
-   * \return a WifiMode for OFDM at 6Mbps
-   */
-  static WifiMode GetOfdmRate6Mbps ();
-  /**
-   * Return a WifiMode for OFDM at 9Mbps.
-   *
-   * \return a WifiMode for OFDM at 9Mbps
-   */
-  static WifiMode GetOfdmRate9Mbps ();
-  /**
-   * Return a WifiMode for OFDM at 12Mbps.
-   *
-   * \return a WifiMode for OFDM at 12Mbps
-   */
-  static WifiMode GetOfdmRate12Mbps ();
-  /**
-   * Return a WifiMode for OFDM at 18Mbps.
-   *
-   * \return a WifiMode for OFDM at 18Mbps
-   */
-  static WifiMode GetOfdmRate18Mbps ();
-  /**
-   * Return a WifiMode for OFDM at 24Mbps.
-   *
-   * \return a WifiMode for OFDM at 24Mbps
-   */
-  static WifiMode GetOfdmRate24Mbps ();
-  /**
-   * Return a WifiMode for OFDM at 36Mbps.
-   *
-   * \return a WifiMode for OFDM at 36Mbps
-   */
-  static WifiMode GetOfdmRate36Mbps ();
-  /**
-   * Return a WifiMode for OFDM at 48Mbps.
-   *
-   * \return a WifiMode for OFDM at 48Mbps
-   */
-  static WifiMode GetOfdmRate48Mbps ();
-  /**
-   * Return a WifiMode for OFDM at 54Mbps.
-   *
-   * \return a WifiMode for OFDM at 54Mbps
-   */
-  static WifiMode GetOfdmRate54Mbps ();
-  /**
-   * Return a WifiMode for OFDM at 3Mbps with 10MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 3Mbps with 10MHz channel spacing
-   */
-  static WifiMode GetOfdmRate3MbpsBW10MHz ();
-  /**
-   * Return a WifiMode for OFDM at 4.5Mbps with 10MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 4.5Mbps with 10MHz channel spacing
-   */
-  static WifiMode GetOfdmRate4_5MbpsBW10MHz ();
-  /**
-   * Return a WifiMode for OFDM at 6Mbps with 10MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 6Mbps with 10MHz channel spacing
-   */
-  static WifiMode GetOfdmRate6MbpsBW10MHz ();
-  /**
-   * Return a WifiMode for OFDM at 9Mbps with 10MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 9Mbps with 10MHz channel spacing
-   */
-  static WifiMode GetOfdmRate9MbpsBW10MHz ();
-  /**
-   * Return a WifiMode for OFDM at 12Mbps with 10MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 12Mbps with 10MHz channel spacing
-   */
-  static WifiMode GetOfdmRate12MbpsBW10MHz ();
-  /**
-   * Return a WifiMode for OFDM at 18Mbps with 10MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 18Mbps with 10MHz channel spacing
-   */
-  static WifiMode GetOfdmRate18MbpsBW10MHz ();
-  /**
-   * Return a WifiMode for OFDM at 24Mbps with 10MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 24Mbps with 10MHz channel spacing
-   */
-  static WifiMode GetOfdmRate24MbpsBW10MHz ();
-  /**
-   * Return a WifiMode for OFDM at 27Mbps with 10MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 27Mbps with 10MHz channel spacing
-   */
-  static WifiMode GetOfdmRate27MbpsBW10MHz ();
-  /**
-   * Return a WifiMode for OFDM at 1.5Mbps with 5MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 1.5Mbps with 5MHz channel spacing
-   */
-  static WifiMode GetOfdmRate1_5MbpsBW5MHz ();
-  /**
-   * Return a WifiMode for OFDM at 2.25Mbps with 5MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 2.25Mbps with 5MHz channel spacing
-   */
-  static WifiMode GetOfdmRate2_25MbpsBW5MHz ();
-  /**
-   * Return a WifiMode for OFDM at 3Mbps with 5MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 3Mbps with 5MHz channel spacing
-   */
-  static WifiMode GetOfdmRate3MbpsBW5MHz ();
-  /**
-   * Return a WifiMode for OFDM at 4.5Mbps with 5MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 4.5Mbps with 5MHz channel spacing
-   */
-  static WifiMode GetOfdmRate4_5MbpsBW5MHz ();
-  /**
-   * Return a WifiMode for OFDM at 6Mbps with 5MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 6Mbps with 5MHz channel spacing
-   */
-  static WifiMode GetOfdmRate6MbpsBW5MHz ();
-  /**
-   * Return a WifiMode for OFDM at 9Mbps with 5MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 9Mbps with 5MHz channel spacing
-   */
-  static WifiMode GetOfdmRate9MbpsBW5MHz ();
-  /**
-   * Return a WifiMode for OFDM at 12Mbps with 5MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 12Mbps with 5MHz channel spacing
-   */
-  static WifiMode GetOfdmRate12MbpsBW5MHz ();
-  /**
-   * Return a WifiMode for OFDM at 13.5Mbps with 5MHz channel spacing.
-   *
-   * \return a WifiMode for OFDM at 13.5Mbps with 5MHz channel spacing
-   */
-  static WifiMode GetOfdmRate13_5MbpsBW5MHz ();
-
-  /**
-   * Return MCS 0 from HT MCS values.
-   *
-   * \return MCS 0 from HT MCS values
-   */
-  static WifiMode GetHtMcs0 ();
-  /**
-   * Return MCS 1 from HT MCS values.
-   *
-   * \return MCS 1 from HT MCS values
-   */
-  static WifiMode GetHtMcs1 ();
-  /**
-   * Return MCS 2 from HT MCS values.
-   *
-   * \return MCS 2 from HT MCS values
-   */
-  static WifiMode GetHtMcs2 ();
-  /**
-   * Return MCS 3 from HT MCS values.
-   *
-   * \return MCS 3 from HT MCS values
-   */
-  static WifiMode GetHtMcs3 ();
-  /**
-   * Return MCS 4 from HT MCS values.
-   *
-   * \return MCS 4 from HT MCS values
-   */
-  static WifiMode GetHtMcs4 ();
-  /**
-   * Return MCS 5 from HT MCS values.
-   *
-   * \return MCS 5 from HT MCS values
-   */
-  static WifiMode GetHtMcs5 ();
-  /**
-   * Return MCS 6 from HT MCS values.
-   *
-   * \return MCS 6 from HT MCS values
-   */
-  static WifiMode GetHtMcs6 ();
-  /**
-   * Return MCS 7 from HT MCS values.
-   *
-   * \return MCS 7 from HT MCS values
-   */
-  static WifiMode GetHtMcs7 ();
-  /**
-   * Return MCS 8 from HT MCS values.
-   *
-   * \return MCS 8 from HT MCS values
-   */
-  static WifiMode GetHtMcs8 ();
-  /**
-   * Return MCS 9 from HT MCS values.
-   *
-   * \return MCS 9 from HT MCS values
-   */
-  static WifiMode GetHtMcs9 ();
-  /**
-   * Return MCS 10 from HT MCS values.
-   *
-   * \return MCS 10 from HT MCS values
-   */
-  static WifiMode GetHtMcs10 ();
-  /**
-   * Return MCS 11 from HT MCS values.
-   *
-   * \return MCS 11 from HT MCS values
-   */
-  static WifiMode GetHtMcs11 ();
-  /**
-   * Return MCS 12 from HT MCS values.
-   *
-   * \return MCS 12 from HT MCS values
-   */
-  static WifiMode GetHtMcs12 ();
-  /**
-   * Return MCS 13 from HT MCS values.
-   *
-   * \return MCS 13 from HT MCS values
-   */
-  static WifiMode GetHtMcs13 ();
-  /**
-   * Return MCS 14 from HT MCS values.
-   *
-   * \return MCS 14 from HT MCS values
-   */
-  static WifiMode GetHtMcs14 ();
-  /**
-   * Return MCS 15 from HT MCS values.
-   *
-   * \return MCS 15 from HT MCS values
+   * \return the duration of the PSDU
    */
-  static WifiMode GetHtMcs15 ();
+  static Time GetPayloadDuration (uint32_t size, const WifiTxVector& txVector, WifiPhyBand band, MpduType mpdutype,
+                                  bool incFlag, uint32_t &totalAmpduSize, double &totalAmpduNumSymbols,
+                                  uint16_t staId);
   /**
-   * Return MCS 16 from HT MCS values.
+   * \param txVector the transmission parameters used for this packet
    *
-   * \return MCS 16 from HT MCS values
+   * \return the duration until the start of the packet
    */
-  static WifiMode GetHtMcs16 ();
+  static Time GetStartOfPacketDuration (const WifiTxVector& txVector);
+
   /**
-   * Return MCS 17 from HT MCS values.
+   * The WifiPhy::GetModeList() method is used
+   * (e.g., by a WifiRemoteStationManager) to determine the set of
+   * transmission/reception (non-MCS) modes that this WifiPhy(-derived class)
+   * can support - a set of modes which is stored by each non-HT PHY.
    *
-   * \return MCS 17 from HT MCS values
-   */
-  static WifiMode GetHtMcs17 ();
-  /**
-   * Return MCS 18 from HT MCS values.
+   * It is important to note that this list is a superset (not
+   * necessarily proper) of the OperationalRateSet (which is
+   * logically, if not actually, a property of the associated
+   * WifiRemoteStationManager), which itself is a superset (again, not
+   * necessarily proper) of the BSSBasicRateSet.
    *
-   * \return MCS 18 from HT MCS values
+   * \return the list of supported (non-MCS) modes.
    */
-  static WifiMode GetHtMcs18 ();
+  std::list<WifiMode> GetModeList (void) const;
   /**
-   * Return MCS 19 from HT MCS values.
+   * Get the list of supported (non-MCS) modes for the given modulation class (i.e.
+   * corresponding to a given PHY entity).
    *
-   * \return MCS 19 from HT MCS values
-   */
-  static WifiMode GetHtMcs19 ();
-  /**
-   * Return MCS 20 from HT MCS values.
+   * \param modulation the modulation class
+   * \return the list of supported (non-MCS) modes for the given modulation class.
    *
-   * \return MCS 20 from HT MCS values
+   * \see GetModeList (void)
    */
-  static WifiMode GetHtMcs20 ();
+  std::list<WifiMode> GetModeList (WifiModulationClass modulation) const;
   /**
-   * Return MCS 21 from HT MCS values.
+   * Check if the given WifiMode is supported by the PHY.
    *
-   * \return MCS 21 from HT MCS values
-   */
-  static WifiMode GetHtMcs21 ();
-  /**
-   * Return MCS 22 from HT MCS values.
+   * \param mode the wifi mode to check
    *
-   * \return MCS 22 from HT MCS values
+   * \return true if the given mode is supported,
+   *         false otherwise
    */
-  static WifiMode GetHtMcs22 ();
+  bool IsModeSupported (WifiMode mode) const;
   /**
-   * Return MCS 23 from HT MCS values.
+   * Get the default WifiMode supported by the PHY.
+   * This is the first mode to be added (i.e. the lowest one
+   * over all supported PHY entities).
    *
-   * \return MCS 23 from HT MCS values
+   * \return the default WifiMode
    */
-  static WifiMode GetHtMcs23 ();
+  WifiMode GetDefaultMode (void) const;
   /**
-   * Return MCS 24 from HT MCS values.
+   * Check if the given MCS of the given modulation class is supported by the PHY.
    *
-   * \return MCS 24 from HT MCS values
-   */
-  static WifiMode GetHtMcs24 ();
-  /**
-   * Return MCS 25 from HT MCS values.
+   * \param modulation the modulation class
+   * \param mcs the MCS value
    *
-   * \return MCS 25 from HT MCS values
+   * \return true if the given mode is supported,
+   *         false otherwise
    */
-  static WifiMode GetHtMcs25 ();
+  bool IsMcsSupported (WifiModulationClass modulation, uint8_t mcs) const;
+
   /**
-   * Return MCS 26 from HT MCS values.
+   * \param txVector the transmission vector
+   * \param ber the probability of bit error rate
    *
-   * \return MCS 26 from HT MCS values
+   * \return the minimum SNR which is required to achieve
+   *          the requested BER for the specified transmission vector. (W/W)
    */
-  static WifiMode GetHtMcs26 ();
+  double CalculateSnr (const WifiTxVector& txVector, double ber) const;
+
   /**
-   * Return MCS 27 from HT MCS values.
+   * Set the Short Interframe Space (SIFS) for this PHY.
    *
-   * \return MCS 27 from HT MCS values
+   * \param sifs the SIFS duration
    */
-  static WifiMode GetHtMcs27 ();
+  void SetSifs (Time sifs);
   /**
-   * Return MCS 28 from HT MCS values.
+   * Return the Short Interframe Space (SIFS) for this PHY.
    *
-   * \return MCS 28 from HT MCS values
+   * \return the SIFS duration
    */
-  static WifiMode GetHtMcs28 ();
+  Time GetSifs (void) const;
   /**
-   * Return MCS 29 from HT MCS values.
+   * Set the slot duration for this PHY.
    *
-   * \return MCS 29 from HT MCS values
+   * \param slot the slot duration
    */
-  static WifiMode GetHtMcs29 ();
+  void SetSlot (Time slot);
   /**
-   * Return MCS 30 from HT MCS values.
+   * Return the slot duration for this PHY.
    *
-   * \return MCS 30 from HT MCS values
+   * \return the slot duration
    */
-  static WifiMode GetHtMcs30 ();
+  Time GetSlot (void) const;
   /**
-   * Return MCS 31 from HT MCS values.
+   * Set the PCF Interframe Space (PIFS) for this PHY.
    *
-   * \return MCS 31 from HT MCS values
+   * \param pifs the PIFS duration
    */
-  static WifiMode GetHtMcs31 ();
-
+  void SetPifs (Time pifs);
   /**
-   * Return MCS 0 from VHT MCS values.
+   * Return the PCF Interframe Space (PIFS) for this PHY.
    *
-   * \return MCS 0 from VHT MCS values
+   * \return the PIFS duration
    */
-  static WifiMode GetVhtMcs0 ();
+  Time GetPifs (void) const;
   /**
-   * Return MCS 1 from VHT MCS values.
+   * Return the estimated Ack TX time for this PHY.
    *
-   * \return MCS 1 from VHT MCS values
+   * \return the estimated Ack TX time
    */
-  static WifiMode GetVhtMcs1 ();
+  Time GetAckTxTime (void) const;
   /**
-   * Return MCS 2 from VHT MCS values.
+   * Return the estimated BlockAck TX time for this PHY.
    *
-   * \return MCS 2 from VHT MCS values
+   * \return the estimated BlockAck TX time
    */
-  static WifiMode GetVhtMcs2 ();
+  Time GetBlockAckTxTime (void) const;
+
   /**
-   * Return MCS 3 from VHT MCS values.
+   * Get the maximum PSDU size in bytes for the given modulation class.
    *
-   * \return MCS 3 from VHT MCS values
+   * \param modulation the modulation class
+   * \return the maximum PSDU size in bytes for the given modulation class
    */
-  static WifiMode GetVhtMcs3 ();
+  static uint32_t GetMaxPsduSize (WifiModulationClass modulation);
+
   /**
-   * Return MCS 4 from VHT MCS values.
-   *
-   * \return MCS 4 from VHT MCS values
-   */
-  static WifiMode GetVhtMcs4 ();
+  * The WifiPhy::BssMembershipSelector() method is used
+  * (e.g., by a WifiRemoteStationManager) to determine the set of
+  * transmission/reception modes that this WifiPhy(-derived class)
+  * can support - a set of WifiMode objects which we call the
+  * BssMembershipSelectorSet, and which is stored inside HT PHY (and above)
+  * instances.
+  *
+  * \return the list of BSS membership selectors.
+  */
+  std::list<uint8_t> GetBssMembershipSelectorList (void) const;
   /**
-   * Return MCS 5 from VHT MCS values.
+   * \return the number of supported MCSs.
    *
-   * \return MCS 5 from VHT MCS values
+   * \see GetMcsList (void)
    */
-  static WifiMode GetVhtMcs5 ();
+  uint16_t GetNMcs (void) const;
   /**
-   * Return MCS 6 from VHT MCS values.
+   * The WifiPhy::GetMcsList() method is used
+   * (e.g., by a WifiRemoteStationManager) to determine the set of
+   * transmission/reception MCS indices that this WifiPhy(-derived class)
+   * can support - a set of MCS indices which is stored by each HT PHY (and above).
    *
-   * \return MCS 6 from VHT MCS values
+   * \return the list of supported MCSs.
    */
-  static WifiMode GetVhtMcs6 ();
+  std::list<WifiMode> GetMcsList (void) const;
   /**
-   * Return MCS 7 from VHT MCS values.
+   * Get the list of supported MCSs for the given modulation class (i.e.
+   * corresponding to a given PHY entity).
    *
-   * \return MCS 7 from VHT MCS values
-   */
-  static WifiMode GetVhtMcs7 ();
-  /**
-   * Return MCS 8 from VHT MCS values.
+   * \param modulation the modulation class
+   * \return the list of supported MCSs for the given modulation class.
    *
-   * \return MCS 8 from VHT MCS values
+   * \see GetMcsList (void)
    */
-  static WifiMode GetVhtMcs8 ();
+  std::list<WifiMode> GetMcsList (WifiModulationClass modulation) const;
   /**
-   * Return MCS 9 from VHT MCS values.
+   * Get the WifiMode object corresponding to the given MCS of the given
+   * modulation class.
    *
-   * \return MCS 9 from VHT MCS values
-   */
-  static WifiMode GetVhtMcs9 ();
-
-  /**
-   * Return MCS 0 from HE MCS values.
+   * \param modulation the modulation class
+   * \param mcs the MCS value
    *
-   * \return MCS 0 from HE MCS values
+   * \return the WifiMode object corresponding to the given MCS of the given
+   *         modulation class
    */
-  static WifiMode GetHeMcs0 ();
+  WifiMode GetMcs (WifiModulationClass modulation, uint8_t mcs) const;
+
   /**
-   * Return MCS 1 from HE MCS values.
+   * \brief Set channel number.
    *
-   * \return MCS 1 from HE MCS values
-   */
-  static WifiMode GetHeMcs1 ();
-  /**
-   * Return MCS 2 from HE MCS values.
+   * Channel center frequency = Channel starting frequency + 5 MHz * (nch - 1)
    *
-   * \return MCS 2 from HE MCS values
-   */
-  static WifiMode GetHeMcs2 ();
-  /**
-   * Return MCS 3 from HE MCS values.
+   * where Starting channel frequency is standard-dependent,
+   * as defined in (Section 18.3.8.4.2 "Channel numbering"; IEEE Std 802.11-2012).
    *
-   * \return MCS 3 from HE MCS values
-   */
-  static WifiMode GetHeMcs3 ();
-  /**
-   * Return MCS 4 from HE MCS values.
+   * If the operating channel for this object has not been set yet, the given
+   * channel number is saved and will be used, along with the center frequency and
+   * width that have been saved similarly, to set the operating channel when the
+   * standard and band are configured. Note that if center frequency and channel
+   * number are both 0 when the standard and band are configured, a default channel
+   * (of the configured width, if any, or the default width for the current standard
+   * and band, otherwise) is set.
+   * If the operating channel for this object has been already set, the specified
+   * channel number must uniquely identify a channel in the band being used. If so,
+   * this method may still fail to take action if the PHY model determines that
+   * the channel number cannot be switched for some reason (e.g. sleep state)
    *
-   * \return MCS 4 from HE MCS values
+   * \param id the channel number
    */
-  static WifiMode GetHeMcs4 ();
+  virtual void SetChannelNumber (uint8_t id);
   /**
-   * Return MCS 5 from HE MCS values.
+   * Return current channel number.
    *
-   * \return MCS 5 from HE MCS values
+   * \return the current channel number
    */
-  static WifiMode GetHeMcs5 ();
+  uint8_t GetChannelNumber (void) const;
   /**
-   * Return MCS 6 from HE MCS values.
-   *
-   * \return MCS 6 from HE MCS values
+   * \return the required time for channel switch operation of this WifiPhy
    */
-  static WifiMode GetHeMcs6 ();
+  Time GetChannelSwitchDelay (void) const;
+
   /**
-   * Return MCS 7 from HE MCS values.
+   * Configure the PHY-level parameters for different Wi-Fi standard.
    *
-   * \return MCS 7 from HE MCS values
+   * \param standard the Wi-Fi standard
+   * \param band the Wi-Fi band
    */
-  static WifiMode GetHeMcs7 ();
+  virtual void ConfigureStandardAndBand (WifiPhyStandard standard, WifiPhyBand band);
+
   /**
-   * Return MCS 8 from HE MCS values.
+   * Get the configured Wi-Fi standard
    *
-   * \return MCS 8 from HE MCS values
+   * \return the Wi-Fi standard that has been configured
    */
-  static WifiMode GetHeMcs8 ();
+  WifiPhyStandard GetPhyStandard (void) const;
+
   /**
-   * Return MCS 9 from HE MCS values.
+   * Get the configured Wi-Fi band
    *
-   * \return MCS 9 from HE MCS values
+   * \return the Wi-Fi band that has been configured
    */
-  static WifiMode GetHeMcs9 ();
+  WifiPhyBand GetPhyBand (void) const;
+
   /**
-   * Return MCS 10 from HE MCS values.
+   * Get a const reference to the operating channel
    *
-   * \return MCS 10 from HE MCS values
+   * \return a const reference to the operating channel
    */
-  static WifiMode GetHeMcs10 ();
+  const WifiPhyOperatingChannel& GetOperatingChannel (void) const;
+
   /**
-   * Return MCS 11 from HE MCS values.
+   * Return the Channel this WifiPhy is connected to.
    *
-   * \return MCS 11 from HE MCS values
+   * \return the Channel this WifiPhy is connected to
    */
-  static WifiMode GetHeMcs11 ();
+  virtual Ptr<Channel> GetChannel (void) const = 0;
 
   /**
    * Public method used to fire a PhyTxBegin trace.
@@ -1441,21 +688,6 @@
   typedef void (* PsduTxBeginCallback)(WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
 
   /**
-   * Public method used to fire a EndOfHePreamble trace once both HE SIG fields have been received, as well as training fields.
-   *
-   * \param params the HE preamble parameters
-   */
-  void NotifyEndOfHePreamble (HePreambleParameters params);
-
-  /**
-   * TracedCallback signature for end of HE-SIG-A events.
-   *
-   *
-   * \param params the HE preamble parameters
-   */
-  typedef void (* EndOfHePreambleCallback)(HePreambleParameters params);
-
-  /**
    * TracedCallback signature for start of PSDU reception events.
    *
    * \param txVector the TXVECTOR decoded from the PHY header
@@ -1605,6 +837,29 @@
   Ptr<MobilityModel> GetMobility (void) const;
 
   /**
+   * Set the operating channel according to the specified parameters. If this object
+   * has been already initialized, setting the operating channel involves a channel
+   * switch, which might be suppressed (e.g., if this object is in sleep mode) or
+   * delayed (e.g., if this object is transmitting a frame).
+   *
+   * \param number the channel number (use 0 to leave it unspecified)
+   * \param frequency the channel center frequency in MHz (use 0 to leave it unspecified)
+   * \param width the channel width in MHz (use 0 to leave it unspecified)
+   */
+  void SetOperatingChannel (uint8_t number, uint16_t frequency, uint16_t width);
+  /**
+   * If the operating channel for this object has not been set yet, the given
+   * center frequency is saved and will be used, along with the channel number and
+   * width that have been saved similarly, to set the operating channel when the
+   * standard and band are configured. Note that if center frequency and
+   * channel number are both 0 when the standard and band are configured, a default
+   * channel (of the configured width, if any, or the default width for the current
+   * standard and band, otherwise) is set.
+   * If the operating channel for this object has been already set, the specified
+   * center frequency must uniquely identify a channel in the band being used. If so,
+   * this method may still fail to take action if the PHY model determines that
+   * the operating channel cannot be switched for some reason (e.g. sleep state)
+   *
    * \param freq the operating center frequency (MHz) on this node.
    */
   virtual void SetFrequency (uint16_t freq);
@@ -1613,6 +868,13 @@
    */
   uint16_t GetFrequency (void) const;
   /**
+   * Set the index of the primary 20 MHz channel (0 indicates the 20 MHz subchannel
+   * with the lowest center frequency).
+   *
+   * \param index the index of the primary 20 MHz channel
+   */
+  void SetPrimary20Index (uint8_t index);
+  /**
    * \param antennas the number of antennas on this node.
    */
   void SetNumberOfAntennas (uint8_t antennas);
@@ -1691,6 +953,17 @@
    */
   uint16_t GetChannelWidth (void) const;
   /**
+   * If the operating channel for this object has not been set yet, the given
+   * channel width is saved and will be used, along with the center frequency and
+   * channel number that have been saved similarly, to set the operating channel
+   * when the standard and band are configured. Note that if center frequency and
+   * channel number are both 0 when the standard and band are configured, a default
+   * channel (of the configured width, if any, or the default width for the current
+   * standard and band, otherwise) is set.
+   * Do not call this method when the standard and band of this object have been
+   * already configured, because it cannot uniquely identify a channel in the band
+   * being used.
+   *
    * \param channelWidth the channel width (in MHz)
    */
   virtual void SetChannelWidth (uint16_t channelWidth);
@@ -1722,12 +995,14 @@
    */
   void ResetCca (bool powerRestricted, double txPowerMaxSiso = 0, double txPowerMaxMimo = 0);
   /**
-   * Compute the transmit power (in dBm) for the next transmission.
+   * Compute the transmit power for the next transmission.
+   * The returned power will satisfy the power density constraints
+   * after addition of antenna gain.
    *
-   * \param txVector the TXVECTOR
+   * \param ppdu the PPDU to transmit
    * \return the transmit power in dBm for the next transmission
    */
-  double GetTxPowerForTransmission (WifiTxVector txVector) const;
+  double GetTxPowerForTransmission (Ptr<const WifiPpdu> ppdu) const;
   /**
    * Notify the PHY that an access to the channel was requested.
    * This is typically called by the channel access manager to
@@ -1738,47 +1013,116 @@
   void NotifyChannelAccessRequested (void);
 
 
+  /**
+   * \param bandWidth the width (MHz) of the band used for the OFDMA transmission. Must be
+   *                  a multiple of 20 MHz
+   * \param guardBandwidth width of the guard band (MHz)
+   * \param range the subcarrier range of the HE RU
+   * \param bandIndex the index (starting at 0) of the band within the operating channel
+   * \return the converted subcarriers
+   *
+   * This is a helper function to convert HE RU subcarriers, which are relative to the center frequency subcarrier, to the indexes used by the Spectrum model.
+   */
+  virtual WifiSpectrumBand ConvertHeRuSubcarriers (uint16_t bandWidth, uint16_t guardBandwidth,
+                                                   HeRu::SubcarrierRange range, uint8_t bandIndex = 0) const;
+
+  /**
+   * Add the PHY entity to the map of __implemented__ PHY entities for the
+   * given modulation class.
+   * Through this method, child classes can add their own PHY entities in
+   * a static manner.
+   *
+   * \param modulation the modulation class
+   * \param phyEntity the PHY entity
+   */
+  static void AddStaticPhyEntity (WifiModulationClass modulation, Ptr<PhyEntity> phyEntity);
+
+  /**
+   * Get the __implemented__ PHY entity corresponding to the modulation class.
+   * This is used to compute the different amendment-specific parameters within
+   * calling static methods.
+   *
+   * \param modulation the modulation class
+   * \return the pointer to the static implemented PHY entity
+   */
+  static const Ptr<const PhyEntity> GetStaticPhyEntity (WifiModulationClass modulation);
+
+  /**
+   * Get the supported PHY entity corresponding to the modulation class, for
+   * the WifiPhy instance.
+   *
+   * \param modulation the modulation class
+   * \return the pointer to the supported PHY entity
+   */
+  Ptr<PhyEntity> GetPhyEntity (WifiModulationClass modulation) const;
+
+  /**
+   * \return the UID of the previously received PPDU (reset to UINT64_MAX upon transmission)
+   */
+  uint64_t GetPreviouslyRxPpduUid (void) const;
+
+  /**
+   * \param currentChannelWidth channel width of the current transmission (MHz)
+   * \return the width of the guard band (MHz)
+   *
+   * Note: in order to properly model out of band transmissions for OFDM, the guard
+   * band has been configured so as to expand the modeled spectrum up to the
+   * outermost referenced point in "Transmit spectrum mask" sections' PSDs of
+   * each PHY specification of 802.11-2016 standard. It thus ultimately corresponds
+   * to the current channel bandwidth (which can be different from devices max
+   * channel width).
+   *
+   * This method is only relevant for SpectrumWifiPhy.
+   */
+  virtual uint16_t GetGuardBandwidth (uint16_t currentChannelWidth) const = 0;
+  /**
+   * \return a tuple containing the minimum rejection (in dBr) for the inner band,
+   *                            the minimum rejection (in dBr) for the outer band, and
+   *                            the maximum rejection (in dBr) for the outer band
+   *                            for the transmit spectrum mask.
+   *
+   * This method is only relevant for SpectrumWifiPhy.
+   */
+  virtual std::tuple<double, double, double> GetTxMaskRejectionParams (void) const = 0;
+
 protected:
-  // Inherited
-  virtual void DoInitialize (void);
   virtual void DoDispose (void);
 
   /**
-   * The default implementation does nothing and returns true.  This method
-   * is typically called internally by SetChannelNumber ().
-   *
-   * \brief Perform any actions necessary when user changes channel number
-   * \param id channel number to try to switch to
-   * \return true if WifiPhy can actually change the number; false if not
-   * \see SetChannelNumber
+   * Reset data upon end of TX or RX
    */
-  bool DoChannelSwitch (uint8_t id);
+  void Reset (void);
+
   /**
-   * The default implementation does nothing and returns true.  This method
-   * is typically called internally by SetFrequency ().
+   * Perform any actions necessary when user changes operating channel after
+   * initialization.
    *
-   * \brief Perform any actions necessary when user changes frequency
-   * \param frequency frequency to try to switch to in MHz
-   * \return true if WifiPhy can actually change the frequency; false if not
-   * \see SetFrequency
+   * \return zero if the PHY can immediately switch channel, a positive value
+   *         indicating the amount of time to wait until the channel switch can
+   *         be performed or a negative value indicating that channel switch is
+   *         currently not possible (i.e., the radio is in sleep mode)
    */
-  bool DoFrequencySwitch (uint16_t frequency);
+  Time DoChannelSwitch (void);
 
   /**
    * Check if PHY state should move to CCA busy state based on current
    * state of interference tracker.  In this model, CCA becomes busy when
    * the aggregation of all signals as tracked by the InterferenceHelper
    * class is higher than the CcaEdThreshold
+   *
+   * \param channelWidth the channel width in MHz used for RSSI measurement
    */
-  void SwitchMaybeToCcaBusy (void);
+  void SwitchMaybeToCcaBusy (uint16_t channelWidth);
 
   /**
-   * Return the STA ID that has been assigned to the station this PHY belongs to.
-   * This is typically called for MU PPDUs, in order to pick the correct PSDU.
+   * Return the channel width used to measure the RSSI.
+   * This corresponds to the primary channel unless it corresponds to the
+   * HE TB PPDU solicited by the AP.
    *
-   * \return the STA ID
+   * \param ppdu the PPDU that is being received
+   * \return the channel width (in MHz) used for RSSI measurement
    */
-  virtual uint16_t GetStaId (void) const;
+  uint16_t GetMeasurementChannelWidth (const Ptr<const WifiPpdu> ppdu) const;
 
   /**
    * Get the start band index and the stop band index for a given band
@@ -1791,39 +1135,66 @@
   virtual WifiSpectrumBand GetBand (uint16_t bandWidth, uint8_t bandIndex = 0);
 
   /**
-   * \param channelWidth the total channel width (MHz) used for the OFDMA transmission
-   * \param range the subcarrier range of the HE RU
-   * \return the converted subcarriers
+   * If the operating channel width is a multiple of 20 MHz, return the start
+   * band index and the stop band index for the primary channel of the given
+   * bandwidth (which must be a multiple of 20 MHz and not exceed the operating
+   * channel width). Otherwise, this call is equivalent to GetBand with
+   * <i>bandIndex</i> equal to zero.
    *
-   * This is a helper function to convert HE RU subcarriers, which are relative to the center frequency subcarrier, to the indexes used by the Spectrum model.
+   * \param bandWidth the width of the band to be returned (MHz)
+   *
+   * \return a pair of start and stop indexes that defines the band
+   */
+  WifiSpectrumBand GetPrimaryBand (uint16_t bandWidth);
+
+  /**
+   * Add the PHY entity to the map of supported PHY entities for the
+   * given modulation class for the WifiPhy instance.
+   * This is a wrapper method used to check that the PHY entity is
+   * in the static map of implemented PHY entities (\see m_staticPhyEntities).
+   * In addition, child classes can add their own PHY entities.
+   *
+   * \param modulation the modulation class
+   * \param phyEntity the PHY entity
    */
-  virtual WifiSpectrumBand ConvertHeRuSubcarriers (uint16_t channelWidth, HeRu::SubcarrierRange range) const;
+  void AddPhyEntity (WifiModulationClass modulation, Ptr<PhyEntity> phyEntity);
 
-  InterferenceHelper m_interference;   //!< Pointer to InterferenceHelper
+  InterferenceHelper m_interference;   //!< the class handling interference computations
   Ptr<UniformRandomVariable> m_random; //!< Provides uniform random variables.
   Ptr<WifiPhyStateHelper> m_state;     //!< Pointer to WifiPhyStateHelper
 
   uint32_t m_txMpduReferenceNumber;    //!< A-MPDU reference number to identify all transmitted subframes belonging to the same received A-MPDU
   uint32_t m_rxMpduReferenceNumber;    //!< A-MPDU reference number to identify all received subframes belonging to the same received A-MPDU
 
-  EventId m_endRxEvent;                //!< the end of receive event
   EventId m_endPhyRxEvent;             //!< the end of PHY receive event
-  EventId m_endPreambleDetectionEvent; //!< the end of preamble detection event
-
   EventId m_endTxEvent;                //!< the end of transmit event
 
-private:
+  Ptr<Event> m_currentEvent; //!< Hold the current event
+  std::map <std::pair<uint64_t /* UID*/, WifiPreamble>, Ptr<Event> > m_currentPreambleEvents; //!< store event associated to a PPDU (that has a unique ID and preamble combination) whose preamble is being received
+
+  uint64_t m_previouslyRxPpduUid;  //!< UID of the previously received PPDU, reset to UINT64_MAX upon transmission
+
   /**
-   * \brief post-construction setting of frequency and/or channel number
+   * This map holds the supported PHY entities.
+   *
+   * The set of parameters (e.g. mode) that this WifiPhy(-derived class) can
+   * support can be obtained through it.
+   *
+   * When it comes to modes, in conversation we call this set
+   * the DeviceRateSet (not a term you'll find in the standard), and
+   * it is a superset of standard-defined parameters such as the
+   * OperationalRateSet, and the BSSBasicRateSet (which, themselves,
+   * have a superset/subset relationship).
    *
-   * This method exists to handle the fact that two attribute values,
-   * Frequency and ChannelNumber, are coupled.  The initialization of
-   * these values needs to be deferred until after attribute construction
-   * time, to avoid static initialization order issues.  This method is
-   * typically called either when ConfigureStandard () is called or when
-   * DoInitialize () is called.
+   * Mandatory rates relevant to this WifiPhy can be found by
+   * iterating over the elements of this map, for each modulation class,
+   * looking for WifiMode objects for which
+   * WifiMode::IsMandatory() is true.
    */
-  void InitializeFrequencyChannelNumber (void);
+  std::map<WifiModulationClass, Ptr<PhyEntity> > m_phyEntities;
+
+
+private:
   /**
    * Configure WifiPhy with appropriate channel frequency and
    * supported rates for 802.11a standard.
@@ -1846,11 +1217,6 @@
   void Configure80211p (void);
   /**
    * Configure WifiPhy with appropriate channel frequency and
-   * supported rates for Holland.
-   */
-  void ConfigureHolland (void);
-  /**
-   * Configure WifiPhy with appropriate channel frequency and
    * supported rates for 802.11n standard.
    */
   void Configure80211n (void);
@@ -1879,35 +1245,6 @@
    * Rebuild the mapping of MCS values to indices in the device MCS set.
    */
   void RebuildMcsMap (void);
-  /**
-   * Configure the PHY-level parameters for different Wi-Fi standard.
-   * This method is called when defaults for each standard must be
-   * selected.
-   */
-  void ConfigureDefaultsForStandard (void);
-  /**
-   * Configure the PHY-level parameters for different Wi-Fi standard.
-   * This method is called when the Frequency or ChannelNumber attributes
-   * are set by the user.  If the Frequency or ChannelNumber are valid for
-   * the standard, they are used instead.
-   */
-  void ConfigureChannelForStandard (void);
-
-  /**
-   * Look for channel number matching the frequency and width
-   * \param frequency The center frequency to use in MHz
-   * \param width The channel width to use in MHz
-   * \return the channel number if found, zero if not
-   */
-  uint8_t FindChannelNumberForFrequencyWidth (uint16_t frequency, uint16_t width) const;
-  /**
-   * Lookup frequency/width pair for channelNumber/standard pair
-   * \param channelNumber The channel number to check
-   * \param band the PHY band to check
-   * \param standard The WifiPhyStandard to check
-   * \return the FrequencyWidthPair found
-   */
-  FrequencyWidthPair GetFrequencyWidthForChannelNumberStandard (uint8_t channelNumber, WifiPhyBand band, WifiPhyStandard standard) const;
 
   /**
    * Due to newly arrived signal, the current reception cannot be continued and has to be aborted
@@ -1918,47 +1255,9 @@
 
   /**
    * Eventually switch to CCA busy
+   * \param channelWidth the channel width in MHz used for RSSI measurement
    */
-  void MaybeCcaBusyDuration (void);
-
-  /**
-   * Starting receiving the PPDU after having detected the medium is idle or after a reception switch.
-   *
-   * \param event the event holding incoming PPDU's information
-   */
-  void StartRx (Ptr<Event> event);
-  /**
-   * Get the reception status for the provided MPDU and notify.
-   *
-   * \param psdu the arriving MPDU formatted as a PSDU
-   * \param event the event holding incoming PPDU's information
-   * \param staId the station ID of the PSDU (only used for MU)
-   * \param relativeMpduStart the relative start time of the MPDU within the A-MPDU. 0 for normal MPDUs
-   * \param mpduDuration the duration of the MPDU
-   *
-   * \return information on MPDU reception: status, signal power (dBm), and noise power (in dBm)
-   */
-  std::pair<bool, SignalNoiseDbm> GetReceptionStatus (Ptr<const WifiPsdu> psdu,
-                                                      Ptr<Event> event, uint16_t staId,
-                                                      Time relativeMpduStart,
-                                                      Time mpduDuration);
-  /**
-   * The last symbol of an MPDU in an A-MPDU has arrived.
-   *
-   * \param event the event holding incoming PPDU's information
-   * \param psdu the arriving MPDU formatted as a PSDU containing a normal MPDU
-   * \param mpduIndex the index of the MPDU within the A-MPDU
-   * \param relativeMpduStart the relative start time of the MPDU within the A-MPDU.
-   * \param mpduDuration the duration of the MPDU
-   */  
-  void EndOfMpdu (Ptr<Event> event, Ptr<const WifiPsdu> psdu, size_t mpduIndex, Time relativeStart, Time mpduDuration);
-
-  /**
-   * Schedule end of MPDUs events.
-   *
-   * \param event the event holding incoming PPDU's information
-   */
-  void ScheduleEndOfMpdus (Ptr<Event> event);
+  void MaybeCcaBusyDuration (uint16_t channelWidth);
 
   /**
    * Get the PSDU addressed to that PHY in a PPDU (useful for MU PPDU).
@@ -1969,16 +1268,6 @@
   Ptr<const WifiPsdu> GetAddressedPsduInPpdu (Ptr<const WifiPpdu> ppdu) const;
 
   /**
-   * Get the RU band used to transmit a PSDU to a given STA in a HE MU PPDU
-   *
-   * \param txVector the TXVECTOR used for the transmission
-   * \param staId the STA-ID of the recipient
-   *
-   * \return the RU band used to transmit a PSDU to a given STA in a HE MU PPDU
-   */
-  WifiSpectrumBand GetRuBand (WifiTxVector txVector, uint16_t staId);
-
-  /**
    * The trace source fired when a packet begins the transmission process on
    * the medium.
    *
@@ -2077,62 +1366,22 @@
   TracedCallback<Ptr<const Packet>, uint16_t /* frequency (MHz) */, WifiTxVector, MpduInfo, uint16_t /* STA-ID*/> m_phyMonitorSniffTxTrace;
 
   /**
-   * A trace source that indicates the end of both HE SIG fields as well as training fields for received 802.11ax packets
-   *
-   * \see class CallBackTraceSource
+   * Map of __implemented__ PHY entities. This is used to compute the different
+   * amendment-specific parameters in a static manner.
+   * For PHY entities supported by a given WifiPhy instance,
+   * \see m_phyEntities.
    */
-  TracedCallback<HePreambleParameters> m_phyEndOfHePreambleTrace;
-
-  /**
-   * This vector holds the set of transmission modes that this
-   * WifiPhy(-derived class) can support. In conversation we call this
-   * the DeviceRateSet (not a term you'll find in the standard), and
-   * it is a superset of standard-defined parameters such as the
-   * OperationalRateSet, and the BSSBasicRateSet (which, themselves,
-   * have a superset/subset relationship).
-   *
-   * Mandatory rates relevant to this WifiPhy can be found by
-   * iterating over this vector looking for WifiMode objects for which
-   * WifiMode::IsMandatory() is true.
-   *
-   * A quick note is appropriate here (well, here is as good a place
-   * as any I can find)...
-   *
-   * In the standard there is no text that explicitly precludes
-   * production of a device that does not support some rates that are
-   * mandatory (according to the standard) for PHYs that the device
-   * happens to fully or partially support.
-   *
-   * This approach is taken by some devices which choose to only support,
-   * for example, 6 and 9 Mbps ERP-OFDM rates for cost and power
-   * consumption reasons (i.e., these devices don't need to be designed
-   * for and waste current on the increased linearity requirement of
-   * higher-order constellations when 6 and 9 Mbps more than meet their
-   * data requirements). The wording of the standard allows such devices
-   * to have an OperationalRateSet which includes 6 and 9 Mbps ERP-OFDM
-   * rates, despite 12 and 24 Mbps being "mandatory" rates for the
-   * ERP-OFDM PHY.
-   *
-   * Now this doesn't actually have any impact on code, yet. It is,
-   * however, something that we need to keep in mind for the
-   * future. Basically, the key point is that we can't be making
-   * assumptions like "the Operational Rate Set will contain all the
-   * mandatory rates".
-   */
-  WifiModeList m_deviceRateSet;
-  WifiModeList m_deviceMcsSet; //!< the device MCS set
-  /// Maps MCS values to indices in m_deviceMcsSet, for HT, VHT and HE modulation classes
-  std::map<WifiModulationClass, std::map<uint8_t /* MCS value */, uint8_t /* index */>> m_mcsIndexMap;
-
-  std::vector<uint8_t> m_bssMembershipSelectorSet; //!< the BSS membership selector set
+  static std::map<WifiModulationClass, Ptr<PhyEntity> > m_staticPhyEntities;
 
   WifiPhyStandard m_standard;               //!< WifiPhyStandard
   WifiPhyBand m_band;                       //!< WifiPhyBand
-  bool m_isConstructed;                     //!< true when ready to set frequency
-  uint16_t m_channelCenterFrequency;        //!< Center frequency in MHz
   uint16_t m_initialFrequency;              //!< Store frequency until initialization (MHz)
-  bool m_frequencyChannelNumberInitialized; //!< Store initialization state
-  uint16_t m_channelWidth;                  //!< Channel width (MHz)
+  uint8_t m_initialChannelNumber;           //!< Store channel number until initialization
+  uint16_t m_initialChannelWidth;           //!< Store channel width (MHz) until initialization
+  uint8_t m_initialPrimary20Index;          //!< Store the index of primary20 until initialization
+
+  WifiPhyOperatingChannel m_operatingChannel;       //!< Operating channel
+  std::vector<uint16_t> m_supportedChannelWidthSet; //!< Supported channel width set (MHz)
 
   Time m_sifs;                              //!< Short Interframe Space (SIFS) duration
   Time m_slot;                              //!< Slot duration
@@ -2147,6 +1396,7 @@
   double   m_txPowerBaseDbm;      //!< Minimum transmission power (dBm)
   double   m_txPowerEndDbm;       //!< Maximum transmission power (dBm)
   uint8_t  m_nTxPower;            //!< Number of available transmission power levels
+  double m_powerDensityLimit;     //!< the power density limit (dBm/MHz)
 
   bool m_powerRestricted;        //!< Flag whether transmit power is restricted by OBSS PD SR
   double m_txPowerMaxSiso;       //!< SISO maximum transmit power due to OBSS PD SR power restriction (dBm)
@@ -2158,31 +1408,27 @@
   uint8_t m_txSpatialStreams;  //!< Number of supported TX spatial streams
   uint8_t m_rxSpatialStreams;  //!< Number of supported RX spatial streams
 
-  typedef std::map<ChannelNumberStandardPair, FrequencyWidthPair> ChannelToFrequencyWidthMap; //!< channel to frequency width map typedef
-  static ChannelToFrequencyWidthMap m_channelToFrequencyWidth;                               //!< the channel to frequency width map
-
-  std::vector<uint16_t> m_supportedChannelWidthSet; //!< Supported channel width set (MHz)
-  uint8_t               m_channelNumber;            //!< Operating channel number
-  uint8_t               m_initialChannelNumber;     //!< Initial channel number
-
   Time m_channelSwitchDelay;     //!< Time required to switch between channel
 
   Ptr<NetDevice>     m_device;   //!< Pointer to the device
   Ptr<MobilityModel> m_mobility; //!< Pointer to the mobility model
 
-  Ptr<Event> m_currentEvent;                            //!< Hold the current event
   Ptr<FrameCaptureModel> m_frameCaptureModel;           //!< Frame capture model
   Ptr<PreambleDetectionModel> m_preambleDetectionModel; //!< Preamble detection model
   Ptr<WifiRadioEnergyModel> m_wifiRadioEnergyModel;     //!< Wifi radio energy model
   Ptr<ErrorModel> m_postReceptionErrorModel;            //!< Error model for receive packet events
   Time m_timeLastPreambleDetected;                      //!< Record the time the last preamble was detected
 
-  std::vector<bool> m_statusPerMpdu; //!<  current reception status per MPDU that is filled in as long as MPDUs are being processed by the PHY in case of an A-MPDU
-  SignalNoiseDbm m_signalNoise;      //!< latest signal power and noise power in dBm (noise power includes the noise figure)
-
-  Callback<void> m_capabilitiesChangedCallback;         //!< Callback when PHY capabilities changed
+  Callback<void> m_capabilitiesChangedCallback; //!< Callback when PHY capabilities changed
 };
 
+/**
+ * \param os           output stream
+ * \param rxSignalInfo received signal info to stringify
+ * \return output stream
+ */
+std::ostream& operator<< (std::ostream& os, RxSignalInfo rxSignalInfo);
+
 } //namespace ns3
 
 #endif /* WIFI_PHY_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-phy-header.cc ns-3.34/src/wifi/model/wifi-phy-header.cc
--- ns-3.33/src/wifi/model/wifi-phy-header.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-phy-header.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,971 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018 Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#include "wifi-phy-header.h"
-
-namespace ns3 {
-
-NS_OBJECT_ENSURE_REGISTERED (DsssSigHeader);
-
-DsssSigHeader::DsssSigHeader ()
-  : m_rate (0b00001010),
-    m_length (0)
-{
-}
-
-DsssSigHeader::~DsssSigHeader ()
-{
-}
-
-TypeId
-DsssSigHeader::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::DsssSigHeader")
-    .SetParent<Header> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<DsssSigHeader> ()
-  ;
-  return tid;
-}
-
-TypeId
-DsssSigHeader::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-
-void
-DsssSigHeader::Print (std::ostream &os) const
-{
-  os << "SIGNAL=" << GetRate ()
-     << " LENGTH=" << m_length;
-}
-
-uint32_t
-DsssSigHeader::GetSerializedSize (void) const
-{
-  return 6;
-}
-
-void
-DsssSigHeader::SetRate (uint64_t rate)
-{
-  /* Here is the binary representation for a given rate:
-   * 1 Mbit/s: 00001010
-   * 2 Mbit/s: 00010100
-   * 5.5 Mbit/s: 00110111
-   * 11 Mbit/s: 01101110
-   */
-  switch (rate)
-    {
-      case 1000000:
-        m_rate = 0b00001010;
-        break;
-      case 2000000:
-        m_rate = 0b00010100;
-        break;
-      case 5500000:
-        m_rate = 0b00110111;
-        break;
-      case 11000000:
-        m_rate = 0b01101110;
-        break;
-      default:
-        NS_ASSERT_MSG (false, "Invalid rate");
-        break;
-    }
-}
-
-uint64_t
-DsssSigHeader::GetRate (void) const
-{
-  uint64_t rate = 0;
-  switch (m_rate)
-    {
-      case 0b00001010:
-        rate = 1000000;
-        break;
-      case 0b00010100:
-        rate = 2000000;
-        break;
-      case 0b00110111:
-        rate = 5500000;
-        break;
-      case 0b01101110:
-        rate = 11000000;
-        break;
-      default:
-        NS_ASSERT_MSG (false, "Invalid rate");
-        break;
-    }
-  return rate;
-}
-
-void
-DsssSigHeader::SetLength (uint16_t length)
-{
-  m_length = length;
-}
-
-uint16_t
-DsssSigHeader::GetLength (void) const
-{
-  return m_length;
-}
-
-void
-DsssSigHeader::Serialize (Buffer::Iterator start) const
-{
-  start.WriteU8 (m_rate);
-  start.WriteU8 (0); /* SERVICE */
-  start.WriteU16 (m_length);
-  start.WriteU16 (0); /* CRC */
-}
-
-uint32_t
-DsssSigHeader::Deserialize (Buffer::Iterator start)
-{
-  Buffer::Iterator i = start;
-  m_rate = i.ReadU8 ();
-  i.ReadU8 (); /* SERVICE */
-  m_length =  i.ReadU16 ();
-  i.ReadU16 (); /* CRC */
-  return i.GetDistanceFrom (start);
-}
-
-NS_OBJECT_ENSURE_REGISTERED (LSigHeader);
-
-LSigHeader::LSigHeader ()
-  : m_rate (0b1101),
-    m_length (0)
-{
-}
-
-LSigHeader::~LSigHeader ()
-{
-}
-
-TypeId
-LSigHeader::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::LSigHeader")
-    .SetParent<Header> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<LSigHeader> ()
-  ;
-  return tid;
-}
-
-TypeId
-LSigHeader::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-
-void
-LSigHeader::Print (std::ostream &os) const
-{
-  os << "SIGNAL=" << GetRate ()
-     << " LENGTH=" << m_length;
-}
-
-uint32_t
-LSigHeader::GetSerializedSize (void) const
-{
-  return 3;
-}
-
-void
-LSigHeader::SetRate (uint64_t rate, uint16_t channelWidth)
-{
-  if (channelWidth < 20)
-    {
-      //conversion for 5 MHz and 10 MHz
-      rate *= (20 / channelWidth);
-    }
-  /* Here is the binary representation for a given rate:
-   * 6 Mbit/s: 1101
-   * 9 Mbit/s: 1111
-   * 12 Mbit/s: 0101
-   * 18 Mbit/s: 0111
-   * 24 Mbit/s: 1001
-   * 36 Mbit/s: 1011
-   * 48 Mbit/s: 0001
-   * 54 Mbit/s: 0011
-   */
-  switch (rate)
-    {
-      case 6000000:
-        m_rate = 0b1101;
-        break;
-      case 9000000:
-        m_rate = 0b1111;
-        break;
-      case 12000000:
-        m_rate = 0b0101;
-        break;
-      case 18000000:
-        m_rate = 0b0111;
-        break;
-      case 24000000:
-        m_rate = 0b1001;
-        break;
-      case 36000000:
-        m_rate = 0b1011;
-        break;
-      case 48000000:
-        m_rate = 0b0001;
-        break;
-      case 54000000:
-        m_rate = 0b0011;
-        break;
-      default:
-        NS_ASSERT_MSG (false, "Invalid rate");
-        break;
-    }
-}
-
-uint64_t
-LSigHeader::GetRate (uint16_t channelWidth) const
-{
-  uint64_t rate = 0;
-  switch (m_rate)
-    {
-      case 0b1101:
-        rate = 6000000;
-        break;
-      case 0b1111:
-        rate = 9000000;
-        break;
-      case 0b0101:
-        rate = 12000000;
-        break;
-      case 0b0111:
-        rate = 18000000;
-        break;
-      case 0b1001:
-        rate = 24000000;
-        break;
-      case 0b1011:
-        rate = 36000000;
-        break;
-      case 0b0001:
-        rate = 48000000;
-        break;
-      case 0b0011:
-        rate = 54000000;
-        break;
-      default:
-        NS_ASSERT_MSG (false, "Invalid rate");
-        break;
-    }
-  if (channelWidth == 5)
-    {
-      rate /= 4; //compute corresponding 5 MHz rate
-    }
-  else if (channelWidth == 10)
-    {
-      rate /= 2; //compute corresponding 10 MHz rate
-    }
-  return rate;
-}
-
-void
-LSigHeader::SetLength (uint16_t length)
-{
-  NS_ASSERT_MSG (length < 4096, "Invalid length");
-  m_length = length;
-}
-
-uint16_t
-LSigHeader::GetLength (void) const
-{
-  return m_length;
-}
-
-void
-LSigHeader::Serialize (Buffer::Iterator start) const
-{
-  uint8_t byte = 0;
-  uint16_t bytes = 0;
-
-  byte |= m_rate;
-  byte |= (m_length & 0x07) << 5;
-  start.WriteU8 (byte);
-
-  bytes |= (m_length & 0x0ff8) >> 3;
-  start.WriteU16 (bytes);
-}
-
-uint32_t
-LSigHeader::Deserialize (Buffer::Iterator start)
-{
-  Buffer::Iterator i = start;
-
-  uint8_t byte = i.ReadU8 ();
-  m_rate = byte & 0x0f;
-  m_length = (byte >> 5) & 0x07;
-
-  uint16_t bytes = i.ReadU16 ();
-  m_length |= (bytes << 3) & 0x0ff8;
-
-  return i.GetDistanceFrom (start);
-}
-
-NS_OBJECT_ENSURE_REGISTERED (HtSigHeader);
-
-HtSigHeader::HtSigHeader ()
-  : m_mcs (0),
-    m_cbw20_40 (0),
-    m_htLength (0),
-    m_aggregation (0),
-    m_sgi (0)
-{
-}
-
-HtSigHeader::~HtSigHeader ()
-{
-}
-
-TypeId
-HtSigHeader::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::HtSigHeader")
-    .SetParent<Header> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<HtSigHeader> ()
-  ;
-  return tid;
-}
-
-TypeId
-HtSigHeader::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-
-void
-HtSigHeader::Print (std::ostream &os) const
-{
-  os << "MCS=" << +m_mcs
-     << " HT_LENGTH=" << m_htLength
-     << " CHANNEL_WIDTH=" << GetChannelWidth ()
-     << " FEC_CODING=" << (m_fecCoding ? "LDPC" : "BCC")
-     << " SGI=" << +m_sgi
-     << " AGGREGATION=" << +m_aggregation;
-}
-
-uint32_t
-HtSigHeader::GetSerializedSize (void) const
-{
-  return 6;
-}
-
-void
-HtSigHeader::SetMcs (uint8_t mcs)
-{
-  NS_ASSERT (mcs <= 31);
-  m_mcs = mcs;
-}
-
-uint8_t
-HtSigHeader::GetMcs (void) const
-{
-  return m_mcs;
-}
-
-void
-HtSigHeader::SetChannelWidth (uint16_t channelWidth)
-{
-  m_cbw20_40 = (channelWidth > 20) ? 1 : 0;
-}
-
-uint16_t
-HtSigHeader::GetChannelWidth (void) const
-{
-  return m_cbw20_40 ? 40 : 20;
-}
-
-void
-HtSigHeader::SetHtLength (uint16_t length)
-{
-  m_htLength = length;
-}
-
-uint16_t
-HtSigHeader::GetHtLength (void) const
-{
-  return m_htLength;
-}
-
-void
-HtSigHeader::SetAggregation (bool aggregation)
-{
-  m_aggregation = aggregation ? 1 : 0;
-}
-
-bool
-HtSigHeader::GetAggregation (void) const
-{
-  return m_aggregation ? true : false;
-}
-
-void
-HtSigHeader::SetFecCoding (bool ldpc)
-{
-  m_fecCoding = ldpc ? 1 : 0;
-}
-
-bool
-HtSigHeader::IsLdpcFecCoding (void) const
-{
-  return m_fecCoding ? true : false;
-}
-
-void
-HtSigHeader::SetShortGuardInterval (bool sgi)
-{
-  m_sgi = sgi ? 1 : 0;
-}
-
-bool
-HtSigHeader::GetShortGuardInterval (void) const
-{
-  return m_sgi ? true : false;
-}
-
-void
-HtSigHeader::Serialize (Buffer::Iterator start) const
-{
-  uint8_t byte = m_mcs;
-  byte |= ((m_cbw20_40 & 0x01) << 7);
-  start.WriteU8 (byte);
-  start.WriteU16 (m_htLength);
-  byte = (0x01 << 2); //Set Reserved bit #2 to 1
-  byte |= ((m_aggregation & 0x01) << 3);
-  byte |= ((m_fecCoding & 0x01) << 6);
-  byte |= ((m_sgi & 0x01) << 7);
-  start.WriteU8 (byte);
-  start.WriteU16 (0);
-}
-
-uint32_t
-HtSigHeader::Deserialize (Buffer::Iterator start)
-{
-  Buffer::Iterator i = start;
-  uint8_t byte = i.ReadU8 ();
-  m_mcs = byte & 0x7f;
-  m_cbw20_40 = ((byte >> 7) & 0x01);
-  m_htLength = i.ReadU16 ();
-  byte = i.ReadU8 ();
-  m_aggregation = ((byte >> 3) & 0x01);
-  m_fecCoding = ((byte >> 6) & 0x01);
-  m_sgi = ((byte >> 7) & 0x01);
-  i.ReadU16 ();
-  return i.GetDistanceFrom (start);
-}
-
-NS_OBJECT_ENSURE_REGISTERED (VhtSigHeader);
-
-VhtSigHeader::VhtSigHeader ()
-  : m_bw (0),
-    m_nsts (0),
-    m_sgi (0),
-    m_sgi_disambiguation (0),
-    m_suMcs (0),
-    m_mu (false)
-{
-}
-
-VhtSigHeader::~VhtSigHeader ()
-{
-}
-
-TypeId
-VhtSigHeader::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::VhtSigHeader")
-    .SetParent<Header> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<VhtSigHeader> ()
-  ;
-  return tid;
-}
-
-TypeId
-VhtSigHeader::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-
-void
-VhtSigHeader::Print (std::ostream &os) const
-{
-  os << "SU_MCS=" << +m_suMcs
-     << " CHANNEL_WIDTH=" << GetChannelWidth ()
-     << " SGI=" << +m_sgi
-     << " NSTS=" << +m_nsts
-     << " CODING=" << (m_coding ? "LDPC" : "BCC")
-     << " MU=" << +m_mu;
-}
-
-uint32_t
-VhtSigHeader::GetSerializedSize (void) const
-{
-  uint32_t size = 0;
-  size += 3; //VHT-SIG-A1
-  size += 3; //VHT-SIG-A2
-  if (m_mu)
-    {
-      size += 4; //VHT-SIG-B
-    }
-  return size;
-}
-
-void
-VhtSigHeader::SetMuFlag (bool mu)
-{
-  m_mu = mu;
-}
-
-void
-VhtSigHeader::SetChannelWidth (uint16_t channelWidth)
-{
-  if (channelWidth == 160)
-    {
-      m_bw = 3;
-    }
-  else if (channelWidth == 80)
-    {
-      m_bw = 2;
-    }
-  else if (channelWidth == 40)
-    {
-      m_bw = 1;
-    }
-  else
-    {
-      m_bw = 0;
-    }
-}
-
-uint16_t
-VhtSigHeader::GetChannelWidth (void) const
-{
-  if (m_bw == 3)
-    {
-      return 160;
-    }
-  else if (m_bw == 2)
-    {
-      return 80;
-    }
-  else if (m_bw == 1)
-    {
-      return 40;
-    }
-  else
-    {
-      return 20;
-    }
-}
-
-void
-VhtSigHeader::SetNStreams (uint8_t nStreams)
-{
-  NS_ASSERT (nStreams <= 8);
-  m_nsts = (nStreams - 1);
-}
-
-uint8_t
-VhtSigHeader::GetNStreams (void) const
-{
-  return (m_nsts + 1);
-}
-
-void
-VhtSigHeader::SetShortGuardInterval (bool sgi)
-{
-  m_sgi = sgi ? 1 : 0;
-}
-
-bool
-VhtSigHeader::GetShortGuardInterval (void) const
-{
-  return m_sgi ? true : false;
-}
-
-void
-VhtSigHeader::SetShortGuardIntervalDisambiguation (bool disambiguation)
-{
-  m_sgi_disambiguation = disambiguation ? 1 : 0;
-}
-  
-bool
-VhtSigHeader::GetShortGuardIntervalDisambiguation (void) const
-{
-  return m_sgi_disambiguation ? true : false;
-}
-
-void
-VhtSigHeader::SetCoding (bool ldpc)
-{
-  m_coding = ldpc ? 1 : 0;
-}
-
-bool
-VhtSigHeader::IsLdpcCoding (void) const
-{
-  return m_coding ? true : false;
-
-}
-
-void
-VhtSigHeader::SetSuMcs (uint8_t mcs)
-{
-  NS_ASSERT (mcs <= 9);
-  m_suMcs = mcs;
-}
-
-uint8_t
-VhtSigHeader::GetSuMcs (void) const
-{
-  return m_suMcs;
-}
-
-void
-VhtSigHeader::Serialize (Buffer::Iterator start) const
-{
-  //VHT-SIG-A1
-  uint8_t byte = m_bw;
-  byte |= (0x01 << 2); //Set Reserved bit #2 to 1
-  start.WriteU8 (byte);
-  uint16_t bytes = (m_nsts & 0x07) << 2;
-  bytes |= (0x01 << (23 - 8)); //Set Reserved bit #23 to 1
-  start.WriteU16 (bytes);
-
-  //VHT-SIG-A2
-  byte = m_sgi & 0x01;
-  byte |= ((m_sgi_disambiguation & 0x01) << 1);
-  byte |= ((m_coding & 0x01) << 2);
-  byte |= ((m_suMcs & 0x0f) << 4);
-  start.WriteU8 (byte);
-  bytes = (0x01 << (9 - 8)); //Set Reserved bit #9 to 1
-  start.WriteU16 (bytes);
-
-  if (m_mu)
-    {
-      //VHT-SIG-B
-      start.WriteU32 (0);
-    }
-}
-
-uint32_t
-VhtSigHeader::Deserialize (Buffer::Iterator start)
-{
-  Buffer::Iterator i = start;
-
-  //VHT-SIG-A1
-  uint8_t byte = i.ReadU8 ();
-  m_bw = byte & 0x03;
-  uint16_t bytes = i.ReadU16 ();
-  m_nsts = ((bytes >> 2) & 0x07);
-
-  //VHT-SIG-A2
-  byte = i.ReadU8 ();
-  m_sgi = byte & 0x01;
-  m_sgi_disambiguation = ((byte >> 1) & 0x01);
-  m_coding = ((byte >> 2) & 0x01);
-  m_suMcs = ((byte >> 4) & 0x0f);
-  i.ReadU16 ();
-
-  if (m_mu)
-    {
-      //VHT-SIG-B
-      i.ReadU32 ();
-    }
-
-  return i.GetDistanceFrom (start);
-}
-
-
-NS_OBJECT_ENSURE_REGISTERED (HeSigHeader);
-
-HeSigHeader::HeSigHeader ()
-  : m_format (1),
-    m_bssColor (0),
-    m_ul_dl (0),
-    m_mcs (0),
-    m_spatialReuse (0),
-    m_bandwidth (0),
-    m_gi_ltf_size (0),
-    m_nsts (0),
-    m_mu (false)
-{
-}
-
-HeSigHeader::~HeSigHeader ()
-{
-}
-
-TypeId
-HeSigHeader::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::HeSigHeader")
-    .SetParent<Header> ()
-    .SetGroupName ("Wifi")
-    .AddConstructor<HeSigHeader> ()
-  ;
-  return tid;
-}
-
-TypeId
-HeSigHeader::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-
-void
-HeSigHeader::Print (std::ostream &os) const
-{
-  os << "MCS=" << +m_mcs
-     << " CHANNEL_WIDTH=" << GetChannelWidth ()
-     << " GI=" << GetGuardInterval ()
-     << " NSTS=" << +m_nsts
-     << " BSSColor=" << +m_bssColor
-     << " CODING=" << (m_coding ? "LDPC" : "BCC")
-     << " MU=" << +m_mu;
-}
-
-uint32_t
-HeSigHeader::GetSerializedSize (void) const
-{
-  uint32_t size = 0;
-  size += 4; //HE-SIG-A1
-  size += 4; //HE-SIG-A2
-  if (m_mu)
-    {
-      size += 1; //HE-SIG-B
-    }
-  return size;
-}
-
-void
-HeSigHeader::SetMuFlag (bool mu)
-{
-  m_mu = mu;
-}
-
-void
-HeSigHeader::SetMcs (uint8_t mcs)
-{
-  NS_ASSERT (mcs <= 11);
-  m_mcs = mcs;
-}
-
-uint8_t
-HeSigHeader::GetMcs (void) const
-{
-  return m_mcs;
-}
-
-void
-HeSigHeader::SetBssColor (uint8_t bssColor)
-{
-  NS_ASSERT (bssColor < 64);
-  m_bssColor = bssColor;
-}
-
-uint8_t
-HeSigHeader::GetBssColor (void) const
-{
-  return m_bssColor;
-}
-
-void
-HeSigHeader::SetChannelWidth (uint16_t channelWidth)
-{
-  if (channelWidth == 160)
-    {
-      m_bandwidth = 3;
-    }
-  else if (channelWidth == 80)
-    {
-      m_bandwidth = 2;
-    }
-  else if (channelWidth == 40)
-    {
-      m_bandwidth = 1;
-    }
-  else
-    {
-      m_bandwidth = 0;
-    }
-}
-
-uint16_t
-HeSigHeader::GetChannelWidth (void) const
-{
-  if (m_bandwidth == 3)
-    {
-      return 160;
-    }
-  else if (m_bandwidth == 2)
-    {
-      return 80;
-    }
-  else if (m_bandwidth == 1)
-    {
-      return 40;
-    }
-  else
-    {
-      return 20;
-    }
-}
-
-void
-HeSigHeader::SetGuardIntervalAndLtfSize (uint16_t gi, uint8_t ltf)
-{
-  if (gi == 800 && ltf == 1)
-    {
-      m_gi_ltf_size = 0;
-    }
-  else if (gi == 800 && ltf == 2)
-    {
-      m_gi_ltf_size = 1;
-    }
-  else if (gi == 1600 && ltf == 2)
-    {
-      m_gi_ltf_size = 2;
-    }
-  else
-    {
-      m_gi_ltf_size = 3;
-    }
-}
-
-uint16_t
-HeSigHeader::GetGuardInterval (void) const
-{
-  if (m_gi_ltf_size == 3)
-    {
-      //we currently do not consider DCM nor STBC fields
-      return 3200;
-    }
-  else if (m_gi_ltf_size == 2)
-    {
-      return 1600;
-    }
-  else
-    {
-      return 800;
-    }
-}
-
-void
-HeSigHeader::SetNStreams (uint8_t nStreams)
-{
-  NS_ASSERT (nStreams <= 8);
-  m_nsts = (nStreams - 1);
-}
-
-uint8_t
-HeSigHeader::GetNStreams (void) const
-{
-  return (m_nsts + 1);
-}
-
-void
-HeSigHeader::SetCoding (bool ldpc)
-{
-  m_coding = ldpc ? 1 : 0;
-}
-
-bool
-HeSigHeader::IsLdpcCoding (void) const
-{
-  return m_coding ? true : false;
-
-}
-
-void
-HeSigHeader::Serialize (Buffer::Iterator start) const
-{
-  //HE-SIG-A1
-  uint8_t byte = m_format & 0x01;
-  byte |= ((m_ul_dl & 0x01) << 2);
-  byte |= ((m_mcs & 0x0f) << 3);
-  start.WriteU8 (byte);
-  uint16_t bytes = (m_bssColor & 0x3f);
-  bytes |= (0x01 << 6); //Reserved set to 1
-  bytes |= ((m_spatialReuse & 0x0f) << 7);
-  bytes |= ((m_bandwidth & 0x03) << 11);
-  bytes |= ((m_gi_ltf_size & 0x03) << 13);
-  bytes |= ((m_nsts & 0x01) << 15);
-  start.WriteU16 (bytes);
-  start.WriteU8 ((m_nsts >> 1) & 0x03);
-
-  //HE-SIG-A2
-  uint32_t sigA2 = 0;
-  sigA2 |= ((m_coding & 0x01) << 7);
-  sigA2 |= (0x01 << 14); //Set Reserved bit #14 to 1
-  start.WriteU32 (sigA2);
-
-  if (m_mu)
-    {
-      //HE-SIG-B
-      start.WriteU8 (0);
-    }
-}
-
-uint32_t
-HeSigHeader::Deserialize (Buffer::Iterator start)
-{
-  Buffer::Iterator i = start;
-
-  //HE-SIG-A1
-  uint8_t byte = i.ReadU8 ();
-  m_format = (byte & 0x01);
-  m_ul_dl = ((byte >> 2) & 0x01);
-  m_mcs = ((byte >> 3) & 0x0f);
-  uint16_t bytes = i.ReadU16 ();
-  m_bssColor = (bytes & 0x3f);
-  m_spatialReuse = ((bytes >> 7) & 0x0f);
-  m_bandwidth = ((bytes >> 11) & 0x03);
-  m_gi_ltf_size = ((bytes >> 13) & 0x03);
-  m_nsts = ((bytes >> 15) & 0x01);
-  byte = i.ReadU8 ();
-  m_nsts |= (byte & 0x03) << 1;
-
-  //HE-SIG-A2
-  uint32_t sigA2 = i.ReadU32 ();
-  m_coding = ((sigA2 >> 7) & 0x01);
-
-  if (m_mu)
-    {
-      //HE-SIG-B
-      i.ReadU8 ();
-    }
-
-  return i.GetDistanceFrom (start);
-}
-
-} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-phy-header.h ns-3.34/src/wifi/model/wifi-phy-header.h
--- ns-3.33/src/wifi/model/wifi-phy-header.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-phy-header.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,490 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2018 Sébastien Deronne
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
- */
-
-#ifndef WIFI_PHY_HEADER_H
-#define WIFI_PHY_HEADER_H
-
-#include "ns3/header.h"
-
-namespace ns3 {
-
-/**
- * \ingroup wifi
- *
- * Implements the IEEE 802.11 DSSS SIG PHY header.
- * See section 16.2.2 in IEEE 802.11-2016.
- */
-class DsssSigHeader : public Header
-{
-public:
-  DsssSigHeader ();
-  virtual ~DsssSigHeader ();
-
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  TypeId GetInstanceTypeId (void) const;
-  void Print (std::ostream &os) const;
-  uint32_t GetSerializedSize (void) const;
-  void Serialize (Buffer::Iterator start) const;
-  uint32_t Deserialize (Buffer::Iterator start);
-
-  /**
-   * Fill the RATE field of L-SIG (in bit/s).
-   *
-   * \param rate the RATE field of L-SIG expressed in bit/s
-   */
-  void SetRate (uint64_t rate);
-  /**
-   * Return the RATE field of L-SIG (in bit/s).
-   *
-   * \return the RATE field of L-SIG expressed in bit/s
-   */
-  uint64_t GetRate (void) const;
-  /**
-   * Fill the LENGTH field of L-SIG (in bytes).
-   *
-   * \param length the LENGTH field of L-SIG expressed in bytes
-   */
-  void SetLength (uint16_t length);
-  /**
-   * Return the LENGTH field of L-SIG (in bytes).
-   *
-   * \return the LENGTH field of L-SIG expressed in bytes
-   */
-  uint16_t GetLength (void) const;
-
-
-private:
-  uint8_t m_rate;    ///< RATE field
-  uint16_t m_length; ///< LENGTH field
-};
-
-
-/**
- * \ingroup wifi
- *
- * Implements the IEEE 802.11 OFDM and ERP OFDM L-SIG PHY header.
- * See section 17.3.4 in IEEE 802.11-2016.
- */
-class LSigHeader : public Header
-{
-public:
-  LSigHeader ();
-  virtual ~LSigHeader ();
-
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  TypeId GetInstanceTypeId (void) const;
-  void Print (std::ostream &os) const;
-  uint32_t GetSerializedSize (void) const;
-  void Serialize (Buffer::Iterator start) const;
-  uint32_t Deserialize (Buffer::Iterator start);
-
-  /**
-   * Fill the RATE field of L-SIG (in bit/s).
-   *
-   * \param rate the RATE field of L-SIG expressed in bit/s
-   * \param channelWidth the channel width (in MHz)
-   */
-  void SetRate (uint64_t rate, uint16_t channelWidth = 20);
-  /**
-   * Return the RATE field of L-SIG (in bit/s).
-   *
-   * \param channelWidth the channel width (in MHz)
-   * \return the RATE field of L-SIG expressed in bit/s
-   */
-  uint64_t GetRate (uint16_t channelWidth = 20) const;
-  /**
-   * Fill the LENGTH field of L-SIG (in bytes).
-   *
-   * \param length the LENGTH field of L-SIG expressed in bytes
-   */
-  void SetLength (uint16_t length);
-  /**
-   * Return the LENGTH field of L-SIG (in bytes).
-   *
-   * \return the LENGTH field of L-SIG expressed in bytes
-   */
-  uint16_t GetLength (void) const;
-
-
-private:
-  uint8_t m_rate;    ///< RATE field
-  uint16_t m_length; ///< LENGTH field
-};
-
-
-/**
- * \ingroup wifi
- *
- * Implements the IEEE 802.11n PHY header (HT-SIG1/2).
-  * See section 19.3.9 in IEEE 802.11-2016.
- */
-class HtSigHeader : public Header
-{
-public:
-  HtSigHeader ();
-  virtual ~HtSigHeader ();
-
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  TypeId GetInstanceTypeId (void) const;
-  void Print (std::ostream &os) const;
-  uint32_t GetSerializedSize (void) const;
-  void Serialize (Buffer::Iterator start) const;
-  uint32_t Deserialize (Buffer::Iterator start);
-
-  /**
-   * Fill the MCS field of HT-SIG.
-   *
-   * \param mcs the MCS field of HT-SIG
-   */
-  void SetMcs (uint8_t mcs);
-  /**
-   * Return the MCS field of HT-SIG.
-   *
-   * \return the MCS field of HT-SIG
-   */
-  uint8_t GetMcs (void) const;
-  /**
-   * Fill the channel width field of HT-SIG (in MHz).
-   *
-   * \param channelWidth the channel width (in MHz)
-   */
-  void SetChannelWidth (uint16_t channelWidth);
-  /**
-   * Return the channel width (in MHz).
-   *
-   * \return the channel width (in MHz)
-   */
-  uint16_t GetChannelWidth (void) const;
-  /**
-   * Fill the aggregation field of HT-SIG.
-   *
-   * \param aggregation whether the PSDU contains A-MPDU or not
-   */
-  void SetAggregation (bool aggregation);
-  /**
-   * Return the aggregation field of HT-SIG.
-   *
-   * \return the aggregation field of HT-SIG
-   */
-  bool GetAggregation (void) const;
-  /**
-   * Fill the FEC coding field of HT-SIG.
-   *
-   * \param ldpc whether LDPC is used or not
-   */
-  void SetFecCoding (bool ldpc);
-  /**
-   * Return whether LDPC is used or not.
-   *
-   * \return whether LDPC is used or not
-   */
-  bool IsLdpcFecCoding (void) const;
-  /**
-   * Fill the short guard interval field of HT-SIG.
-   *
-   * \param sgi whether short guard interval is used or not
-   */
-  void SetShortGuardInterval (bool sgi);
-  /**
-   * Return the short guard interval field of HT-SIG.
-   *
-   * \return the short guard interval field of HT-SIG
-   */
-  bool GetShortGuardInterval (void) const;
-  /**
-   * Fill the HT length field of HT-SIG (in bytes).
-   *
-   * \param length the HT length field of HT-SIG (in bytes)
-   */
-  void SetHtLength (uint16_t length);
-  /**
-   * Return the HT length field of HT-SIG (in bytes).
-   *
-   * \return the HT length field of HT-SIG (in bytes)
-   */
-  uint16_t GetHtLength (void) const;
-
-
-private:
-  uint8_t m_mcs;         ///< Modulation and Coding Scheme index
-  uint8_t m_cbw20_40;    ///< CBW 20/40
-  uint16_t m_htLength;   ///< HT length
-  uint8_t m_aggregation; ///< Aggregation
-  uint8_t m_fecCoding;   ///< FEC coding (0 for BCC or 1 for LDPC)
-  uint8_t m_sgi;         ///< Short Guard Interval
-};
-
-/**
- * \ingroup wifi
- *
- * Implements the IEEE 802.11ac PHY header (VHT-SIG-A1/A2/B).
- * See section 21.3.8 in IEEE 802.11-2016.
- */
-class VhtSigHeader : public Header
-{
-public:
-  VhtSigHeader ();
-  virtual ~VhtSigHeader ();
-
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  TypeId GetInstanceTypeId (void) const;
-  void Print (std::ostream &os) const;
-  uint32_t GetSerializedSize (void) const;
-  void Serialize (Buffer::Iterator start) const;
-  uint32_t Deserialize (Buffer::Iterator start);
-
-  /**
-   * Set the Multi-User (MU) flag.
-   *
-   * \param mu the MU flag
-   */
-  void SetMuFlag (bool mu);
-
-  /**
-   * Fill the channel width field of VHT-SIG-A1 (in MHz).
-   *
-   * \param channelWidth the channel width (in MHz)
-   */
-  void SetChannelWidth (uint16_t channelWidth);
-  /**
-   * Return the channel width (in MHz).
-   *
-   * \return the channel width (in MHz)
-   */
-  uint16_t GetChannelWidth (void) const;
-  /**
-   * Fill the number of streams field of VHT-SIG-A1.
-   *
-   * \param nStreams the number of streams
-   */
-  void SetNStreams (uint8_t nStreams);
-  /**
-   * Return the number of streams.
-   *
-   * \return the number of streams
-   */
-  uint8_t GetNStreams (void) const;
-
-  /**
-   * Fill the short guard interval field of VHT-SIG-A2.
-   *
-   * \param sgi whether short guard interval is used or not
-   */
-  void SetShortGuardInterval (bool sgi);
-  /**
-   * Return the short GI field of VHT-SIG-A2.
-   *
-   * \return the short GI field of VHT-SIG-A2
-   */
-  bool GetShortGuardInterval (void) const;
-  /**
-   * Fill the short GI NSYM disambiguation field of VHT-SIG-A2.
-   *
-   * \param disambiguation whether short GI NSYM disambiguation is set or not
-   */
-  void SetShortGuardIntervalDisambiguation (bool disambiguation);
-  /**
-   * Return the short GI NSYM disambiguation field of VHT-SIG-A2.
-   *
-   * \return the short GI NSYM disambiguation field of VHT-SIG-A2
-   */
-  bool GetShortGuardIntervalDisambiguation (void) const;
-  /**
-   * Fill the coding field of VHT-SIG-A2.
-   *
-   * \param ldpc whether LDPC is used or not
-   */
-  void SetCoding (bool ldpc);
-  /**
-   * Return whether LDPC is used or not.
-   *
-   * \return whether LDPC is used or not
-   */
-  bool IsLdpcCoding (void) const;
-  /**
-   * Fill the SU VHT MCS field of VHT-SIG-A2.
-   *
-   * \param mcs the SU VHT MCS field of VHT-SIG-A2
-   */
-  void SetSuMcs (uint8_t mcs);
-  /**
-   * Return the SU VHT MCS field of VHT-SIG-A2.
-   *
-   * \return the SU VHT MCS field of VHT-SIG-A2
-   */
-  uint8_t GetSuMcs (void) const;
-
-
-private:
-  //VHT-SIG-A1 fields
-  uint8_t m_bw;   ///< BW
-  uint8_t m_nsts; ///< NSTS
-
-  //VHT-SIG-A2 fields
-  uint8_t m_sgi;                ///< Short GI
-  uint8_t m_sgi_disambiguation; ///< Short GI NSYM Disambiguation
-  uint8_t m_coding;             ///< SU/MU coding (0 for BCC, 1 for LDPC)
-  uint8_t m_suMcs;              ///< SU VHT MCS
-
-  /// This is used to decide whether MU SIG-B should be added or not
-  bool m_mu;
-  };
-
-
-/**
- * \ingroup wifi
- *
- * Implements the IEEE 802.11ax HE-SIG PHY header (HE-SIG-A1/A2/B)
- */
-class HeSigHeader : public Header
-{
-public:
-  HeSigHeader ();
-  virtual ~HeSigHeader ();
-
-  /**
-   * \brief Get the type ID.
-   * \return the object TypeId
-   */
-  static TypeId GetTypeId (void);
-  TypeId GetInstanceTypeId (void) const;
-  void Print (std::ostream &os) const;
-  uint32_t GetSerializedSize (void) const;
-  void Serialize (Buffer::Iterator start) const;
-  uint32_t Deserialize (Buffer::Iterator start);
-
-  /**
-   * Set the Multi-User (MU) flag.
-   *
-   * \param mu the MU flag
-   */
-  void SetMuFlag (bool mu);
-
-  /**
-   * Fill the MCS field of HE-SIG-A1.
-   *
-   * \param mcs the MCS field of HE-SIG-A1
-   */
-  void SetMcs (uint8_t mcs);
-  /**
-   * Return the MCS field of HE-SIG-A1.
-   *
-   * \return the MCS field of HE-SIG-A1
-   */
-  uint8_t GetMcs (void) const;
-  /**
-   * Fill the BSS Color field of HE-SIG-A1.
-   *
-   * \param bssColor the BSS Color value
-   */
-  void SetBssColor (uint8_t bssColor);
-  /**
-   * Return the BSS Color field in the HE-SIG-A1.
-   *
-   * \return the BSS Color field in the HE-SIG-A1
-   */
-  uint8_t GetBssColor (void) const;
-  /**
-   * Fill the channel width field of HE-SIG-A1 (in MHz).
-   *
-   * \param channelWidth the channel width (in MHz)
-   */
-  void SetChannelWidth (uint16_t channelWidth);
-  /**
-   * Return the channel width (in MHz).
-   *
-   * \return the channel width (in MHz)
-   */
-  uint16_t GetChannelWidth (void) const;
-  /**
-   * Fill the GI + LTF size field of HE-SIG-A1.
-   *
-   * \param gi the guard interval (in nanoseconds)
-   * \param ltf the sequence of HE-LTF
-   */
-  void SetGuardIntervalAndLtfSize (uint16_t gi, uint8_t ltf);
-  /**
-   * Return the guard interval (in nanoseconds).
-   *
-   * \return the guard interval (in nanoseconds)
-   */
-  uint16_t GetGuardInterval (void) const;
-  /**
-   * Fill the number of streams field of HE-SIG-A1.
-   *
-   * \param nStreams the number of streams
-   */
-  void SetNStreams (uint8_t nStreams);
-  /**
-   * Return the number of streams.
-   *
-   * \return the number of streams
-   */
-  uint8_t GetNStreams (void) const;
-  /**
-   * Fill the coding field of HE-SIG-A2.
-   *
-   * \param ldpc whether LDPC is used or not
-   */
-  void SetCoding (bool ldpc);
-  /**
-   * Return whether LDPC is used or not.
-   *
-   * \return whether LDPC is used or not
-   */
-  bool IsLdpcCoding (void) const;
-
-private:
-  //HE-SIG-A1 fields
-  uint8_t m_format;       ///< Format bit
-  uint8_t m_bssColor;     ///< BSS color field
-  uint8_t m_ul_dl;        ///< UL/DL bit
-  uint8_t m_mcs;          ///< MCS field
-  uint8_t m_spatialReuse; ///< Spatial Reuse field
-  uint8_t m_bandwidth;    ///< Bandwidth field
-  uint8_t m_gi_ltf_size;  ///< GI+LTF Size field
-  uint8_t m_nsts;         ///< NSTS
-
-  //HE-SIG-A2 fields
-  uint8_t m_coding; ///< Coding (0 for BCC, 1 for LDPC)
-
-  /// This is used to decide whether MU SIG-B should be added or not
-  bool m_mu;
-};
-
-} //namespace ns3
-
-#endif /* WIFI_PHY_HEADER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-phy-operating-channel.cc ns-3.34/src/wifi/model/wifi-phy-operating-channel.cc
--- ns-3.33/src/wifi/model/wifi-phy-operating-channel.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-phy-operating-channel.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,196 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Stefano Avallone <stavallo@unina.it>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "ns3/log.h"
+#include "wifi-phy.h"
+#include <algorithm>
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("WifiPhyOperatingChannel");
+
+WifiPhyOperatingChannel::WifiPhyOperatingChannel ()
+  : m_channelIt (WifiPhy::m_frequencyChannels.end ()),
+    m_primary20Index (0)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+WifiPhyOperatingChannel::~WifiPhyOperatingChannel ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+bool
+WifiPhyOperatingChannel::IsSet (void) const
+{
+  return m_channelIt != WifiPhy::m_frequencyChannels.end ();
+}
+
+void
+WifiPhyOperatingChannel::Set (uint8_t number, uint16_t frequency, uint16_t width,
+                              WifiPhyStandard standard, WifiPhyBand band)
+{
+  NS_LOG_FUNCTION (this << +number << frequency << width << standard << band);
+
+  auto channelIt = FindFirst (number, frequency, width, standard, band, WifiPhy::m_frequencyChannels.begin ());
+
+  if (channelIt != WifiPhy::m_frequencyChannels.end ()
+      && FindFirst (number, frequency, width, standard, band, std::next (channelIt))
+         == WifiPhy::m_frequencyChannels.end ())
+    {
+      // a unique channel matches the specified criteria
+      m_channelIt = channelIt;
+      m_primary20Index = 0;
+      return;
+    }
+
+  // if a unique channel was not found, throw an exception (mainly for unit testing this code)
+  throw std::runtime_error ("WifiPhyOperatingChannel: No unique channel found given the specified criteria");
+}
+
+void
+WifiPhyOperatingChannel::SetDefault (uint16_t width, WifiPhyStandard standard, WifiPhyBand band)
+{
+  NS_LOG_FUNCTION (this << width << standard << band);
+
+  auto channelIt = FindFirst (0, 0, width, standard, band, WifiPhy::m_frequencyChannels.begin ());
+
+  if (channelIt != WifiPhy::m_frequencyChannels.end ())
+    {
+      // a channel matches the specified criteria
+      m_channelIt = channelIt;
+      m_primary20Index = 0;
+      return;
+    }
+
+  // if a default channel was not found, throw an exception (mainly for unit testing this code)
+  throw std::runtime_error ("WifiPhyOperatingChannel: No default channel found of the given width and for the given PHY standard and band");
+}
+
+WifiPhyOperatingChannel::ConstIterator
+WifiPhyOperatingChannel::FindFirst (uint8_t number, uint16_t frequency, uint16_t width,
+                                    WifiPhyStandard standard, WifiPhyBand band,
+                                    ConstIterator start) const
+{
+  NS_LOG_FUNCTION (this << +number << frequency << width << standard << band);
+
+  // lambda used to match channels against the specified criteria
+  auto predicate = [&](const FrequencyChannelInfo& channel)
+    {
+      if (number != 0 && std::get<0> (channel) != number)
+        {
+          return false;
+        }
+      if (frequency != 0 && std::get<1> (channel) != frequency)
+        {
+          return false;
+        }
+      if (width > GetMaximumChannelWidth (standard))
+        {
+          return false;
+        }
+      if (width != 0 && std::get<2> (channel) != width)
+        {
+          return false;
+        }
+      if (std::get<3> (channel) != GetFrequencyChannelType (standard))
+        {
+          return false;
+        }
+      if (std::get<4> (channel) != band)
+        {
+          return false;
+        }
+      return true;
+    };
+
+  return std::find_if (start, WifiPhy::m_frequencyChannels.end (), predicate);
+}
+
+uint8_t
+WifiPhyOperatingChannel::GetNumber (void) const
+{
+  NS_ASSERT (IsSet ());
+  return std::get<0> (*m_channelIt);
+}
+
+uint16_t
+WifiPhyOperatingChannel::GetFrequency (void) const
+{
+  NS_ASSERT (IsSet ());
+  return std::get<1> (*m_channelIt);
+}
+
+uint16_t
+WifiPhyOperatingChannel::GetWidth (void) const
+{
+  NS_ASSERT (IsSet ());
+  return std::get<2> (*m_channelIt);
+}
+
+uint8_t
+WifiPhyOperatingChannel::GetPrimaryChannelIndex (uint16_t primaryChannelWidth) const
+{
+  NS_LOG_FUNCTION (this << primaryChannelWidth);
+
+  if (primaryChannelWidth % 20 != 0)
+    {
+      NS_LOG_DEBUG ("The operating channel width is not a multiple of 20 MHz; return 0");
+      return 0;
+    }
+
+  NS_ASSERT (primaryChannelWidth <= GetWidth ());
+
+  // the index of primary40 is half the index of primary20; the index of
+  // primary80 is half the index of primary40, ...
+  uint16_t width = 20;
+  uint8_t index = m_primary20Index;
+
+  while (width < primaryChannelWidth)
+    {
+      index /= 2;
+      width *= 2;
+    }
+  NS_LOG_LOGIC ("Return " << +index);
+  return index;
+}
+
+void
+WifiPhyOperatingChannel::SetPrimary20Index (uint8_t index)
+{
+  NS_LOG_FUNCTION (this << +index);
+
+  NS_ABORT_MSG_IF (index > 0 && index >= GetWidth () / 20, "Primary20 index out of range");
+  m_primary20Index = index;
+}
+
+uint16_t
+WifiPhyOperatingChannel::GetPrimaryChannelCenterFrequency (uint16_t primaryChannelWidth) const
+{
+  uint16_t freq = GetFrequency () - GetWidth () / 2.
+                  + (GetPrimaryChannelIndex (primaryChannelWidth) + 0.5) * primaryChannelWidth;
+
+  NS_LOG_FUNCTION (this << primaryChannelWidth << freq);
+  return freq;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-phy-operating-channel.h ns-3.34/src/wifi/model/wifi-phy-operating-channel.h
--- ns-3.33/src/wifi/model/wifi-phy-operating-channel.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-phy-operating-channel.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,155 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Authors: Stefano Avallone <stavallo@unina.it>
+ *          Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#ifndef WIFI_PHY_OPERATING_CHANNEL_H
+#define WIFI_PHY_OPERATING_CHANNEL_H
+
+#include "wifi-phy-band.h"
+#include "wifi-standards.h"
+#include <tuple>
+#include <set>
+
+namespace ns3 {
+
+/**
+  * A tuple (number, frequency, width, type, band) identifying a frequency channel
+  */
+typedef std::tuple<uint8_t, uint16_t, uint16_t, FrequencyChannelType, WifiPhyBand> FrequencyChannelInfo;
+
+
+/**
+ * \ingroup wifi
+ *
+ * Class that keeps track of all information about the current PHY operating channel.
+ */
+class WifiPhyOperatingChannel
+{
+public:
+  /**
+   * Create an uninitialized PHY operating channel.
+   */
+  WifiPhyOperatingChannel ();
+
+  virtual ~WifiPhyOperatingChannel ();
+
+  /**
+   * Return true if a valid channel has been set, false otherwise.
+   *
+   * \return true if a valid channel has been set, false otherwise
+   */
+  bool IsSet (void) const;
+  /**
+   * Set the channel according to the specified parameters if a unique
+   * frequency channel matches the specified criteria, or abort the
+   * simulation otherwise.
+   * If the channel width is a multiple of 20 MHz, the primary 20 MHz channel
+   * is set to the 20 MHz subchannel with the lowest center frequency.
+   *
+   * \param number the channel number (use 0 to leave it unspecified)
+   * \param frequency the channel center frequency in MHz (use 0 to leave it unspecified)
+   * \param width the channel width in MHz (use 0 to leave it unspecified)
+   * \param standard the PHY standard
+   * \param band the PHY band
+   */
+  void Set (uint8_t number, uint16_t frequency, uint16_t width,
+            WifiPhyStandard standard, WifiPhyBand band);
+  /**
+   * Set the default channel of the given width and for the given PHY standard and band.
+   * If the channel width is a multiple of 20 MHz, the primary 20 MHz channel
+   * is set to the 20 MHz subchannel with the lowest center frequency.
+   *
+   * \param width the channel width in MHz
+   * \param standard the PHY standard
+   * \param band the PHY band
+   */
+  void SetDefault (uint16_t width, WifiPhyStandard standard, WifiPhyBand band);
+
+  /**
+   * Return the channel number identifying the whole operating channel.
+   *
+   * \return the channel number identifying the whole operating channel
+   */
+  uint8_t GetNumber (void) const;
+  /**
+   * Return the center frequency of the operating channel (in MHz).
+   *
+   * \return the center frequency of the operating channel (in MHz)
+   */
+  uint16_t GetFrequency (void) const;
+  /**
+   * Return the width of the whole operating channel (in MHz).
+   *
+   * \return the width of the whole operating channel (in MHz)
+   */
+  uint16_t GetWidth (void) const;
+
+  /**
+   * If the operating channel width is a multiple of 20 MHz, return the index of the
+   * primary channel of the given width within the operating channel (0 indicates
+   * the 20 MHz subchannel with the lowest center frequency). Otherwise, return 0.
+   *
+   * \param primaryChannelWidth the width of the primary channel in MHz
+   * \return the index of the requested primary channel within the operating channel
+   */
+  uint8_t GetPrimaryChannelIndex (uint16_t primaryChannelWidth) const;
+  /**
+   * Set the index of the primary 20 MHz channel (0 indicates the 20 MHz subchannel
+   * with the lowest center frequency).
+   *
+   * \param index the index of the primary 20 MHz channel
+   */
+  void SetPrimary20Index (uint8_t index);
+  /**
+   * Get the center frequency of the primary channel of the given width.
+   *
+   * \param primaryChannelWidth the width of the primary channel in MHz
+   * \return the center frequency of the primary channel of the given width
+   */
+  uint16_t GetPrimaryChannelCenterFrequency (uint16_t primaryChannelWidth) const;
+
+private:
+  /// Typedef for a const iterator pointing to a channel in the set of available channels
+  typedef std::set<FrequencyChannelInfo>::const_iterator ConstIterator;
+
+  /**
+   * Find the first channel matching the specified parameters.
+   *
+   * \param number the channel number (use 0 to leave it unspecified)
+   * \param frequency the channel center frequency in MHz (use 0 to leave it unspecified)
+   * \param width the channel width in MHz (use 0 to leave it unspecified)
+   * \param standard the PHY standard
+   * \param band the PHY band
+   * \param start an iterator pointing to the channel to start the search with
+   * \return an iterator pointing to the found channel, if any, or to past-the-end
+   *         of the set of available channels
+   */
+  ConstIterator FindFirst (uint8_t number, uint16_t frequency, uint16_t width,
+                           WifiPhyStandard standard, WifiPhyBand band,
+                           ConstIterator start) const;
+
+  ConstIterator m_channelIt;   //!< const iterator pointing to the configured frequency channel
+  uint8_t m_primary20Index;    /**< index of the primary20 channel (0 indicates the 20 MHz
+                                    subchannel with the lowest center frequency) */
+};
+
+} //namespace ns3
+
+#endif /* WIFI_PHY_OPERATING_CHANNEL_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-phy-state-helper.cc ns-3.34/src/wifi/model/wifi-phy-state-helper.cc
--- ns-3.33/src/wifi/model/wifi-phy-state-helper.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-phy-state-helper.cc	2021-07-14 10:31:07.000000000 -0700
@@ -26,6 +26,7 @@
 #include "wifi-tx-vector.h"
 #include "wifi-phy-listener.h"
 #include "wifi-psdu.h"
+#include "wifi-phy.h"
 
 namespace ns3 {
 
@@ -464,29 +465,30 @@
 }
 
 void
-WifiPhyStateHelper::ContinueRxNextMpdu (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector)
+WifiPhyStateHelper::ContinueRxNextMpdu (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector)
 {
-  NS_LOG_FUNCTION (this << *psdu << snr << txVector);
+  NS_LOG_FUNCTION (this << *psdu << rxSignalInfo << txVector);
   std::vector<bool> statusPerMpdu;
   if (!m_rxOkCallback.IsNull ())
     {
-      m_rxOkCallback (psdu, snr, txVector, statusPerMpdu);
+      m_rxOkCallback (psdu, rxSignalInfo, txVector, statusPerMpdu);
     }
 }
 
 void
-WifiPhyStateHelper::SwitchFromRxEndOk (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, uint16_t staId, std::vector<bool> statusPerMpdu)
+WifiPhyStateHelper::SwitchFromRxEndOk (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, uint16_t staId, std::vector<bool> statusPerMpdu)
 {
-  NS_LOG_FUNCTION (this << *psdu << snr << txVector << statusPerMpdu.size () <<
+  NS_LOG_FUNCTION (this << *psdu << rxSignalInfo << txVector << staId << statusPerMpdu.size () <<
                    std::all_of(statusPerMpdu.begin(), statusPerMpdu.end(), [](bool v) { return v; })); //returns true if all true
   NS_ASSERT (statusPerMpdu.size () != 0);
-  NS_ASSERT (m_endRx == Simulator::Now ());
-  m_rxOkTrace (psdu->GetPacket (), snr, txVector.GetMode (staId), txVector.GetPreambleType ());
+  NS_ASSERT (Abs (m_endRx - Simulator::Now ()) < MicroSeconds (1)); //1us corresponds to the maximum propagation delay (delay spread)
+  //TODO: a better fix would be to call the function once all HE TB PPDUs are received
+  m_rxOkTrace (psdu->GetPacket (), rxSignalInfo.snr, txVector.GetMode (staId), txVector.GetPreambleType ());
   NotifyRxEndOk ();
   DoSwitchFromRx ();
   if (!m_rxOkCallback.IsNull ())
     {
-      m_rxOkCallback (psdu, snr, txVector, statusPerMpdu);
+      m_rxOkCallback (psdu, rxSignalInfo, txVector, statusPerMpdu);
     }
 }
 
@@ -494,7 +496,8 @@
 WifiPhyStateHelper::SwitchFromRxEndError (Ptr<WifiPsdu> psdu, double snr)
 {
   NS_LOG_FUNCTION (this << *psdu << snr);
-  NS_ASSERT (m_endRx == Simulator::Now ());
+  NS_ASSERT (Abs (m_endRx - Simulator::Now ()) < MicroSeconds (1)); //1us corresponds to the maximum propagation delay (delay spread)
+  //TODO: a better fix would be to call the function once all HE TB PPDUs are received
   m_rxErrorTrace (psdu->GetPacket (), snr);
   NotifyRxEndError ();
   DoSwitchFromRx ();
@@ -591,7 +594,7 @@
 WifiPhyStateHelper::SwitchFromRxAbort (void)
 {
   NS_LOG_FUNCTION (this);
-  NS_ASSERT (IsStateRx ());
+  NS_ASSERT (IsStateCcaBusy ()); //abort is called (with OBSS_PD_CCA_RESET reason) before RX is set by payload start
   NotifyRxEndOk ();
   DoSwitchFromRx ();
   m_endCcaBusy = Simulator::Now ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-phy-state-helper.h ns-3.34/src/wifi/model/wifi-phy-state-helper.h
--- ns-3.33/src/wifi/model/wifi-phy-state-helper.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-phy-state-helper.h	2021-07-14 10:31:07.000000000 -0700
@@ -26,7 +26,7 @@
 #include "ns3/traced-callback.h"
 #include "ns3/nstime.h"
 #include "wifi-phy-state.h"
-#include "wifi-preamble.h"
+#include "wifi-phy-common.h"
 #include "wifi-ppdu.h"
 
 namespace ns3 {
@@ -36,6 +36,7 @@
 class WifiMode;
 class Packet;
 class WifiPsdu;
+struct RxSignalInfo;
 
 /**
  * Callback if PSDU successfully received (i.e. if aggregate,
@@ -43,11 +44,12 @@
  * considering that the per-MPDU reception status is also provided).
  *
  * arg1: PSDU received successfully
- * arg2: SNR of PSDU in linear scale
+ * arg2: info on the received signal (\see RxSignalInfo)
  * arg3: TXVECTOR of PSDU
  * arg4: vector of per-MPDU status of reception.
  */
-typedef Callback<void, Ptr<WifiPsdu>, double, WifiTxVector, std::vector<bool>> RxOkCallback;
+typedef Callback<void, Ptr<WifiPsdu>, RxSignalInfo,
+                       WifiTxVector, std::vector<bool>> RxOkCallback;
 /**
  * Callback if PSDU unsuccessfully received
  *
@@ -187,20 +189,21 @@
    * Continue RX after the reception of an MPDU in an A-MPDU was successful.
    *
    * \param psdu the successfully received PSDU
-   * \param snr the SNR of the received PSDU in linear scale
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
    * \param txVector TXVECTOR of the PSDU
    */
-  void ContinueRxNextMpdu (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector);
+  void ContinueRxNextMpdu (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector);
   /**
    * Switch from RX after the reception was successful.
    *
    * \param psdu the successfully received PSDU
-   * \param snr the SNR of the received PSDU in linear scale
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
    * \param txVector TXVECTOR of the PSDU
    * \param staId the station ID of the PSDU (only used for MU)
    * \param statusPerMpdu reception status per MPDU
    */
-  void SwitchFromRxEndOk (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, uint16_t staId, std::vector<bool> statusPerMpdu);
+  void SwitchFromRxEndOk (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector,
+                          uint16_t staId, std::vector<bool> statusPerMpdu);
   /**
    * Switch from RX after the reception failed.
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-phy-tag.h ns-3.34/src/wifi/model/wifi-phy-tag.h
--- ns-3.33/src/wifi/model/wifi-phy-tag.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-phy-tag.h	2021-07-14 10:31:07.000000000 -0700
@@ -22,7 +22,7 @@
 #define WIFI_PHY_TAG_H
 
 #include "ns3/tag.h"
-#include "wifi-preamble.h"
+#include "wifi-phy-common.h"
 #include "wifi-mode.h"
 
 namespace ns3 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-ppdu.cc ns-3.34/src/wifi/model/wifi-ppdu.cc
--- ns-3.33/src/wifi/model/wifi-ppdu.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-ppdu.cc	2021-07-14 10:31:07.000000000 -0700
@@ -18,377 +18,67 @@
  * Author: Rediet <getachew.redieteab@orange.com>
  */
 
-#include "ns3/log.h"
-#include "ns3/packet.h"
 #include "wifi-ppdu.h"
 #include "wifi-psdu.h"
-#include "wifi-phy.h"
-#include "wifi-utils.h"
+#include "ns3/log.h"
+#include "ns3/packet.h"
 
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("WifiPpdu");
 
-WifiPpdu::WifiPpdu (Ptr<const WifiPsdu> psdu, WifiTxVector txVector, Time ppduDuration, WifiPhyBand band)
+WifiPpdu::WifiPpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, uint64_t uid /* = UINT64_MAX */)
   : m_preamble (txVector.GetPreambleType ()),
-    m_modulation (txVector.IsValid () ? txVector.GetMode ().GetModulationClass () : WIFI_MOD_CLASS_UNKNOWN),
+    m_modulation (txVector.IsValid () ? txVector.GetModulationClass () : WIFI_MOD_CLASS_UNKNOWN),
+    m_uid (uid),
     m_truncatedTx (false),
-    m_band (band),
-    m_channelWidth (txVector.GetChannelWidth ()),
     m_txPowerLevel (txVector.GetTxPowerLevel ())
 {
-  NS_LOG_FUNCTION (this << *psdu << txVector << ppduDuration << band);
+  NS_LOG_FUNCTION (this << *psdu << txVector << uid);
   m_psdus.insert (std::make_pair (SU_STA_ID, psdu));
-  SetPhyHeaders (txVector, ppduDuration, band);
 }
 
-WifiPpdu::WifiPpdu (const WifiConstPsduMap & psdus, WifiTxVector txVector, Time ppduDuration, WifiPhyBand band)
+WifiPpdu::WifiPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, uint64_t uid)
   : m_preamble (txVector.GetPreambleType ()),
     m_modulation (txVector.IsValid () ? txVector.GetMode (psdus.begin()->first).GetModulationClass () : WIFI_MOD_CLASS_UNKNOWN),
-    m_psdus (psdus),
+    m_uid (uid),
     m_truncatedTx (false),
-    m_band (band),
-    m_channelWidth (txVector.GetChannelWidth ()),
-    m_txPowerLevel (txVector.GetTxPowerLevel ())
+    m_txPowerLevel (txVector.GetTxPowerLevel ()),
+    m_txAntennas (txVector.GetNTx ())
 {
-  NS_LOG_FUNCTION (this << psdus << txVector << ppduDuration << band);
-  if (m_preamble == WIFI_PREAMBLE_HE_MU)
-    {
-      m_muUserInfos = txVector.GetHeMuUserInfoMap ();
-    }
-  SetPhyHeaders (txVector, ppduDuration, band);
+  NS_LOG_FUNCTION (this << psdus << txVector << uid);
+  m_psdus = psdus;
 }
 
 WifiPpdu::~WifiPpdu ()
 {
-}
-
-void
-WifiPpdu::SetPhyHeaders (WifiTxVector txVector, Time ppduDuration, WifiPhyBand band)
-{
-  if (!txVector.IsValid ())
-    {
-      return;
-    }
-  NS_LOG_FUNCTION (this << txVector << ppduDuration << band);
-  switch (m_modulation)
+  for (auto & psdu : m_psdus)
     {
-      case WIFI_MOD_CLASS_DSSS:
-      case WIFI_MOD_CLASS_HR_DSSS:
-        {
-          NS_ASSERT (m_psdus.size () == 1);
-          m_dsssSig.SetRate (txVector.GetMode ().GetDataRate (22));
-          Time psduDuration = ppduDuration - WifiPhy::CalculatePhyPreambleAndHeaderDuration (txVector);
-          m_dsssSig.SetLength (psduDuration.GetMicroSeconds ());
-          break;
-        }
-      case WIFI_MOD_CLASS_OFDM:
-      case WIFI_MOD_CLASS_ERP_OFDM:
-        {
-          NS_ASSERT (m_psdus.size () == 1);
-          m_lSig.SetRate (txVector.GetMode ().GetDataRate (txVector), m_channelWidth);
-          m_lSig.SetLength (m_psdus.at (SU_STA_ID)->GetSize ());
-          break;
-        }
-      case WIFI_MOD_CLASS_HT:
-        {
-          NS_ASSERT (m_psdus.size () == 1);
-          uint8_t sigExtension = 0;
-          if (m_band == WIFI_PHY_BAND_2_4GHZ)
-            {
-              sigExtension = 6;
-            }
-          uint16_t length = ((ceil ((static_cast<double> (ppduDuration.GetNanoSeconds () - (20 * 1000) - (sigExtension * 1000)) / 1000) / 4.0) * 3) - 3);
-          m_lSig.SetLength (length);
-          m_htSig.SetMcs (txVector.GetMode ().GetMcsValue ());
-          m_htSig.SetChannelWidth (m_channelWidth);
-          m_htSig.SetHtLength (m_psdus.at (SU_STA_ID)->GetSize ());
-          m_htSig.SetAggregation (txVector.IsAggregation ());
-          m_htSig.SetShortGuardInterval (txVector.GetGuardInterval () == 400);
-          m_htSig.SetFecCoding (txVector.IsLdpc ());
-          break;
-        }
-      case WIFI_MOD_CLASS_VHT:
-        {
-          uint16_t length = ((ceil ((static_cast<double> (ppduDuration.GetNanoSeconds () - (20 * 1000)) / 1000) / 4.0) * 3) - 3);
-          m_lSig.SetLength (length);
-          m_vhtSig.SetMuFlag (m_preamble == WIFI_PREAMBLE_VHT_MU);
-          m_vhtSig.SetChannelWidth (m_channelWidth);
-          m_vhtSig.SetShortGuardInterval (txVector.GetGuardInterval () == 400);
-          uint32_t nSymbols = (static_cast<double> ((ppduDuration - WifiPhy::CalculatePhyPreambleAndHeaderDuration (txVector)).GetNanoSeconds ()) / (3200 + txVector.GetGuardInterval ()));
-          if (txVector.GetGuardInterval () == 400)
-            {
-              m_vhtSig.SetShortGuardIntervalDisambiguation ((nSymbols % 10) == 9);
-            }
-          m_vhtSig.SetSuMcs (txVector.GetMode ().GetMcsValue ());
-          m_vhtSig.SetNStreams (txVector.GetNss ());
-          m_vhtSig.SetCoding (txVector.IsLdpc ());
-          break;
-        }
-      case WIFI_MOD_CLASS_HE:
-        {
-          uint8_t sigExtension = 0;
-          if (m_band == WIFI_PHY_BAND_2_4GHZ)
-            {
-              sigExtension = 6;
-            }
-          uint8_t m = 0;
-          if ((m_preamble == WIFI_PREAMBLE_HE_SU) || (m_preamble == WIFI_PREAMBLE_HE_TB))
-            {
-              m = 2;
-            }
-          else if (m_preamble == WIFI_PREAMBLE_HE_MU)
-            {
-              m = 1;
-            }
-          else
-            {
-              NS_ASSERT_MSG (false, "Unsupported preamble type");
-            }
-          uint16_t length = ((ceil ((static_cast<double> (ppduDuration.GetNanoSeconds () - (20 * 1000) - (sigExtension * 1000)) / 1000) / 4.0) * 3) - 3 - m);
-          m_lSig.SetLength (length);
-          if (m_preamble == WIFI_PREAMBLE_HE_MU)
-            {
-              m_heSig.SetMuFlag (true);
-            }
-          else if (m_preamble != WIFI_PREAMBLE_HE_TB)
-            {
-              m_heSig.SetMcs (txVector.GetMode ().GetMcsValue ());
-              m_heSig.SetNStreams (txVector.GetNss ());
-            }
-          m_heSig.SetBssColor (txVector.GetBssColor ());
-          m_heSig.SetChannelWidth (m_channelWidth);
-          m_heSig.SetGuardIntervalAndLtfSize (txVector.GetGuardInterval (), 2/*NLTF currently unused*/);
-          m_heSig.SetCoding (txVector.IsLdpc ());
-          break;
-        }
-        default:
-          NS_FATAL_ERROR ("unsupported modulation class");
-          break;
+      psdu.second = 0;
     }
+  m_psdus.clear ();
 }
 
 WifiTxVector
 WifiPpdu::GetTxVector (void) const
 {
-  WifiTxVector txVector;
-  txVector.SetPreambleType (m_preamble);
-  switch (m_modulation)
-    {
-      case WIFI_MOD_CLASS_DSSS:
-      case WIFI_MOD_CLASS_HR_DSSS:
-        {
-          WifiMode mode;
-          switch (m_dsssSig.GetRate ())
-            {
-              case 1000000:
-                mode = WifiPhy::GetDsssRate1Mbps ();
-                break;
-              case 2000000:
-                mode = WifiPhy::GetDsssRate2Mbps ();
-                break;
-              case 5500000:
-                mode = WifiPhy::GetDsssRate5_5Mbps ();
-                break;
-              case 11000000:
-                mode = WifiPhy::GetDsssRate11Mbps ();
-                break;
-              default:
-                NS_ASSERT_MSG (false, "Invalid rate encoded in DSSS SIG header");
-                break;
-            }
-          txVector.SetMode (mode);
-          txVector.SetChannelWidth (22);
-          break;
-        }
-      case WIFI_MOD_CLASS_OFDM:
-        {
-          WifiMode mode;
-          switch (m_lSig.GetRate (m_channelWidth))
-            {
-              case 1500000:
-                mode = WifiPhy::GetOfdmRate1_5MbpsBW5MHz ();
-                break;
-              case 2250000:
-                mode = WifiPhy::GetOfdmRate2_25MbpsBW5MHz ();
-                break;
-              case 3000000:
-                mode = (m_channelWidth == 5) ? WifiPhy::GetOfdmRate3MbpsBW5MHz () : WifiPhy::GetOfdmRate3MbpsBW10MHz ();
-                break;
-              case 4500000:
-                mode = (m_channelWidth == 5) ? WifiPhy::GetOfdmRate4_5MbpsBW5MHz () : WifiPhy::GetOfdmRate4_5MbpsBW10MHz ();
-                break;
-              case 6000000:
-                if (m_channelWidth == 5)
-                  {
-                    mode = WifiPhy::GetOfdmRate6MbpsBW5MHz ();
-                  }
-                else if (m_channelWidth == 10)
-                  {
-                    mode = WifiPhy::GetOfdmRate6MbpsBW10MHz ();
-                  }
-                else
-                  {
-                    mode = WifiPhy::GetOfdmRate6Mbps ();
-                  }
-                break;
-              case 9000000:
-                if (m_channelWidth == 5)
-                  {
-                    mode = WifiPhy::GetOfdmRate9MbpsBW5MHz ();
-                  }
-                else if (m_channelWidth == 10)
-                  {
-                    mode = WifiPhy::GetOfdmRate9MbpsBW10MHz ();
-                  }
-                else
-                  {
-                    mode = WifiPhy::GetOfdmRate9Mbps ();
-                  }
-                break;
-              case 12000000:
-                if (m_channelWidth == 5)
-                  {
-                    mode = WifiPhy::GetOfdmRate12MbpsBW5MHz ();
-                  }
-                else if (m_channelWidth == 10)
-                  {
-                    mode = WifiPhy::GetOfdmRate12MbpsBW10MHz ();
-                  }
-                else
-                  {
-                    mode = WifiPhy::GetOfdmRate12Mbps ();
-                  }
-                break;
-              case 13500000:
-                mode = WifiPhy::GetOfdmRate13_5MbpsBW5MHz ();
-                break;
-              case 18000000:
-                mode = (m_channelWidth == 10) ? WifiPhy::GetOfdmRate18MbpsBW10MHz () : WifiPhy::GetOfdmRate18Mbps ();
-                break;
-              case 24000000:
-                mode = (m_channelWidth == 10) ? WifiPhy::GetOfdmRate24MbpsBW10MHz () : WifiPhy::GetOfdmRate24Mbps ();
-                break;
-              case 27000000:
-                mode = WifiPhy::GetOfdmRate27MbpsBW10MHz ();
-                break;
-              case 36000000:
-                mode = WifiPhy::GetOfdmRate36Mbps ();
-                break;
-              case 48000000:
-                mode = WifiPhy::GetOfdmRate48Mbps ();
-                break;
-              case 54000000:
-                mode = WifiPhy::GetOfdmRate54Mbps ();
-                break;
-              default:
-                NS_ASSERT_MSG (false, "Invalid rate encoded in L-SIG header");
-                break;
-            }
-          txVector.SetMode (mode);
-          //OFDM uses 20 MHz, unless PHY channel width is 5 MHz or 10 MHz
-          txVector.SetChannelWidth (m_channelWidth < 20 ? m_channelWidth : 20);
-          break;
-        }
-      case WIFI_MOD_CLASS_ERP_OFDM:
-        {
-          WifiMode mode;
-          switch (m_lSig.GetRate ())
-            {
-              case 6000000:
-                mode = WifiPhy::GetErpOfdmRate6Mbps ();
-                break;
-              case 9000000:
-                mode = WifiPhy::GetErpOfdmRate9Mbps ();
-                break;
-              case 12000000:
-                mode = WifiPhy::GetErpOfdmRate12Mbps ();
-                break;
-              case 18000000:
-                mode = WifiPhy::GetErpOfdmRate18Mbps ();
-                break;
-              case 24000000:
-                mode = WifiPhy::GetErpOfdmRate24Mbps ();
-                break;
-              case 36000000:
-                mode = WifiPhy::GetErpOfdmRate36Mbps ();
-                break;
-              case 48000000:
-                mode = WifiPhy::GetErpOfdmRate48Mbps ();
-                break;
-              case 54000000:
-                mode = WifiPhy::GetErpOfdmRate54Mbps ();
-                break;
-              default:
-                NS_ASSERT_MSG (false, "Invalid rate encoded in L-SIG header");
-                break;
-            }
-          txVector.SetMode (mode);
-          //ERP-OFDM uses 20 MHz, unless PHY channel width is 5 MHz or 10 MHz
-          txVector.SetChannelWidth (m_channelWidth < 20 ? m_channelWidth : 20);
-          break;
-        }
-      case WIFI_MOD_CLASS_HT:
-        {
-          txVector.SetMode (WifiPhy::GetHtMcs (m_htSig.GetMcs ()));
-          txVector.SetChannelWidth (m_htSig.GetChannelWidth ());
-          txVector.SetNss (1 + (m_htSig.GetMcs () / 8));
-          txVector.SetGuardInterval(m_htSig.GetShortGuardInterval () ? 400 : 800);
-          txVector.SetLdpc (m_htSig.IsLdpcFecCoding ());
-          break;
-        }
-      case WIFI_MOD_CLASS_VHT:
-        {
-          txVector.SetMode (WifiPhy::GetVhtMcs (m_vhtSig.GetSuMcs ()));
-          txVector.SetChannelWidth (m_vhtSig.GetChannelWidth ());
-          txVector.SetNss (m_vhtSig.GetNStreams ());
-          txVector.SetGuardInterval (m_vhtSig.GetShortGuardInterval () ? 400 : 800);
-          txVector.SetLdpc (m_vhtSig.IsLdpcCoding ());
-          break;
-        }
-      case WIFI_MOD_CLASS_HE:
-        {
-          txVector.SetMode (WifiPhy::GetHeMcs (m_heSig.GetMcs ()));
-          txVector.SetChannelWidth (m_heSig.GetChannelWidth ());
-          txVector.SetNss (m_heSig.GetNStreams ());
-          txVector.SetGuardInterval (m_heSig.GetGuardInterval ());
-          txVector.SetBssColor (m_heSig.GetBssColor ());
-          txVector.SetLdpc (m_heSig.IsLdpcCoding ());
-          break;
-        }
-      default:
-        NS_FATAL_ERROR ("unsupported modulation class");
-        break;
-    }
+  WifiTxVector txVector = DoGetTxVector ();
   txVector.SetTxPowerLevel (m_txPowerLevel);
-  txVector.SetAggregation (m_psdus.size () > 1 || m_psdus.begin ()->second->IsAggregate ());
-  for (auto const& muUserInfo : m_muUserInfos)
-    {
-      txVector.SetHeMuUserInfo (muUserInfo.first, muUserInfo.second);
-    }
+  txVector.SetNTx (m_txAntennas);
   return txVector;
 }
 
+WifiTxVector
+WifiPpdu::DoGetTxVector (void) const
+{
+  NS_FATAL_ERROR ("This method should not be called for the base WifiPpdu class. Use the overloaded version in the amendment-specific PPDU subclasses instead!");
+  return WifiTxVector (); //should be overloaded
+}
+
 Ptr<const WifiPsdu>
-WifiPpdu::GetPsdu (uint8_t bssColor, uint16_t staId) const
+WifiPpdu::GetPsdu (void) const
 {
-  if (!IsMu ())
-    {
-      NS_ASSERT (m_psdus.size () == 1);
-      return m_psdus.at (SU_STA_ID);
-    }
-  else
-    {
-      if (bssColor == m_heSig.GetBssColor ())
-        {
-          auto it = m_psdus.find (staId);
-          if (it != m_psdus.end ())
-            {
-              return it->second;
-            }
-        }
-    }
-  return nullptr;
+  return m_psdus.begin ()->second;
 }
 
 bool
@@ -404,103 +94,108 @@
   m_truncatedTx = true;
 }
 
-Time
-WifiPpdu::GetTxDuration (void) const
+WifiModulationClass
+WifiPpdu::GetModulation (void) const
+{
+  return m_modulation;
+}
+
+uint16_t
+WifiPpdu::GetTransmissionChannelWidth (void) const
+{
+  return GetTxVector ().GetChannelWidth ();
+}
+
+bool
+WifiPpdu::CanBeReceived (uint16_t txCenterFreq, uint16_t p20MinFreq,
+                              uint16_t p20MaxFreq) const
 {
-  Time ppduDuration = Seconds (0);
-  WifiTxVector txVector = GetTxVector ();
-  switch (m_modulation)
+  NS_LOG_FUNCTION (this << txCenterFreq << p20MinFreq << p20MaxFreq);
+
+  uint16_t txChannelWidth = GetTxVector ().GetChannelWidth ();
+  uint16_t minTxFreq = txCenterFreq - txChannelWidth / 2;
+  uint16_t maxTxFreq = txCenterFreq + txChannelWidth / 2;
+
+  if (minTxFreq > p20MinFreq || maxTxFreq < p20MaxFreq)
     {
-      case WIFI_MOD_CLASS_DSSS:
-      case WIFI_MOD_CLASS_HR_DSSS:
-          ppduDuration = MicroSeconds (m_dsssSig.GetLength ()) + WifiPhy::CalculatePhyPreambleAndHeaderDuration (txVector);
-          break;
-      case WIFI_MOD_CLASS_OFDM:
-      case WIFI_MOD_CLASS_ERP_OFDM:
-          ppduDuration = WifiPhy::CalculateTxDuration (m_lSig.GetLength (), txVector, m_band);
-          break;
-      case WIFI_MOD_CLASS_HT:
-          ppduDuration = WifiPhy::CalculateTxDuration (m_htSig.GetHtLength (), txVector, m_band);
-          break;
-      case WIFI_MOD_CLASS_VHT:
-        {
-          Time tSymbol = NanoSeconds (3200 + txVector.GetGuardInterval ());
-          Time preambleDuration = WifiPhy::CalculatePhyPreambleAndHeaderDuration (txVector);
-          Time calculatedDuration = MicroSeconds (((ceil (static_cast<double> (m_lSig.GetLength () + 3) / 3)) * 4) + 20);
-          uint32_t nSymbols = floor (static_cast<double> ((calculatedDuration - preambleDuration).GetNanoSeconds ()) / tSymbol.GetNanoSeconds ());
-          if (m_vhtSig.GetShortGuardInterval () && m_vhtSig.GetShortGuardIntervalDisambiguation ())
-            {
-              nSymbols--;
-            }
-          ppduDuration = preambleDuration + (nSymbols * tSymbol);
-          break;
-        }
-      case WIFI_MOD_CLASS_HE:
-        {
-          Time tSymbol = NanoSeconds (12800 + txVector.GetGuardInterval ());
-          Time preambleDuration = WifiPhy::CalculatePhyPreambleAndHeaderDuration (txVector);
-          uint8_t sigExtension = 0;
-          if (m_band == WIFI_PHY_BAND_2_4GHZ)
-            {
-              sigExtension = 6;
-            }
-          uint8_t m = 0;
-          if ((m_preamble == WIFI_PREAMBLE_HE_SU) || (m_preamble == WIFI_PREAMBLE_HE_TB))
-            {
-              m = 2;
-            }
-          else if (m_preamble == WIFI_PREAMBLE_HE_MU)
-            {
-              m = 1;
-            }
-          //Equation 27-11 of IEEE P802.11ax/D4.0
-          Time calculatedDuration = MicroSeconds (((ceil (static_cast<double> (m_lSig.GetLength () + 3 + m) / 3)) * 4) + 20 + sigExtension);
-          uint32_t nSymbols = floor (static_cast<double> ((calculatedDuration - preambleDuration).GetNanoSeconds () - (sigExtension * 1000)) / tSymbol.GetNanoSeconds ());
-          ppduDuration = preambleDuration + (nSymbols * tSymbol) + MicroSeconds (sigExtension);
-          break;
-        }
-      default:
-        NS_FATAL_ERROR ("unsupported modulation class");
-        break;
+      NS_LOG_INFO ("Received PPDU does not overlap with the primary20 channel");
+      return false;
     }
-  return ppduDuration;
+  return true;
 }
 
-bool
-WifiPpdu::IsMu (void) const
+
+uint64_t
+WifiPpdu::GetUid (void) const
 {
-  return ((m_preamble == WIFI_PREAMBLE_VHT_MU) || (m_preamble == WIFI_PREAMBLE_HE_MU) || (m_preamble == WIFI_PREAMBLE_HE_TB));
+  return m_uid;
 }
 
-WifiModulationClass
-WifiPpdu::GetModulation (void) const
+WifiPreamble
+WifiPpdu::GetPreamble (void) const
 {
-  return m_modulation;
+  return m_preamble;
+}
+
+WifiPpduType
+WifiPpdu::GetType (void) const
+{
+  return WIFI_PPDU_TYPE_SU;
+}
+
+uint16_t
+WifiPpdu::GetStaId (void) const
+{
+  return SU_STA_ID;
+}
+
+Time
+WifiPpdu::GetTxDuration (void) const
+{
+  NS_FATAL_ERROR ("This method should not be called for the base WifiPpdu class. Use the overloaded version in the amendment-specific PPDU subclasses instead!");
+  return MicroSeconds (0); //should be overloaded
 }
 
 void
 WifiPpdu::Print (std::ostream& os) const
 {
-  os << "preamble=" << m_preamble
+  os << "[ preamble=" << m_preamble
      << ", modulation=" << m_modulation
-     << ", truncatedTx=" << (m_truncatedTx ? "Y" : "N");
-  IsMu () ? (os << ", " << m_psdus) : (os << ", PSDU=" << m_psdus.at (SU_STA_ID));
+     << ", truncatedTx=" << (m_truncatedTx ? "Y" : "N")
+     << ", UID=" << m_uid
+     << ", " << PrintPayload ()
+     << "]";
+}
+
+std::string
+WifiPpdu::PrintPayload (void) const
+{
+  std::ostringstream ss;
+  ss << "PSDU=" << GetPsdu () << " ";
+  return ss.str ();
+}
+
+Ptr<WifiPpdu>
+WifiPpdu::Copy (void) const
+{
+  NS_FATAL_ERROR ("This method should not be called for the base WifiPpdu class. Use the overloaded version in the amendment-specific PPDU subclasses instead!");
+  return Create<WifiPpdu> (GetPsdu (), GetTxVector ());
 }
 
-std::ostream & operator << (std::ostream &os, const WifiPpdu &ppdu)
+std::ostream & operator << (std::ostream &os, const Ptr<const WifiPpdu> &ppdu)
 {
-  ppdu.Print (os);
+  ppdu->Print (os);
   return os;
 }
 
 std::ostream & operator << (std::ostream &os, const WifiConstPsduMap &psdus)
 {
   for (auto const& psdu : psdus)
-    {
-      os << "PSDU for STA_ID=" << psdu.first
-         << " (" << *psdu.second << ") ";
-    }
-  return os;
+   {
+     os << "PSDU for STA_ID=" << psdu.first
+        << " (" << *psdu.second << ") ";
+   }
+   return os;
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-ppdu.h ns-3.34/src/wifi/model/wifi-ppdu.h
--- ns-3.33/src/wifi/model/wifi-ppdu.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-ppdu.h	2021-07-14 10:31:07.000000000 -0700
@@ -21,67 +21,73 @@
 #ifndef WIFI_PPDU_H
 #define WIFI_PPDU_H
 
+#include "wifi-tx-vector.h"
+#include "ns3/nstime.h"
 #include <list>
 #include <unordered_map>
-#include "ns3/nstime.h"
-#include "wifi-tx-vector.h"
-#include "wifi-phy-header.h"
-#include "wifi-phy-band.h"
+
+/**
+ * \file
+ * \ingroup wifi
+ * Declaration of ns3::WifiPpdu class
+ * and ns3::WifiConstPsduMap.
+ */
 
 namespace ns3 {
 
 class WifiPsdu;
 
-typedef std::unordered_map <uint16_t /* staId */, Ptr<const WifiPsdu> /* PSDU */> WifiConstPsduMap;
+/**
+ * Map of const PSDUs indexed by STA-ID
+ */
+typedef std::unordered_map <uint16_t /* STA-ID */, Ptr<const WifiPsdu> /* PSDU */> WifiConstPsduMap;
 
 /**
  * \ingroup wifi
  *
  * WifiPpdu stores a preamble, a modulation class, PHY headers and a PSDU.
- * This class should be extended later on to handle MU PPDUs.
+ * This class should be subclassed for each amendment.
  */
 class WifiPpdu : public SimpleRefCount<WifiPpdu>
 {
 public:
   /**
-   * Create a SU PPDU storing a PSDU.
+   * Create a PPDU storing a PSDU.
    *
    * \param psdu the PHY payload (PSDU)
    * \param txVector the TXVECTOR that was used for this PPDU
-   * \param ppduDuration the transmission duration of this PPDU
-   * \param band the WifiPhyBand used for the transmission of this PPDU
+   * \param uid the unique ID of this PPDU
    */
-  WifiPpdu (Ptr<const WifiPsdu> psdu, WifiTxVector txVector, Time ppduDuration, WifiPhyBand band);
-
+  WifiPpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, uint64_t uid = UINT64_MAX);
   /**
-   * Create a MU PPDU storing a vector of PSDUs.
+   * Create a PPDU storing a map of PSDUs.
    *
    * \param psdus the PHY payloads (PSDUs)
    * \param txVector the TXVECTOR that was used for this PPDU
-   * \param ppduDuration the transmission duration of this PPDU
-   * \param band the WifiPhyBand used for the transmission of this PPDU
+   * \param uid the unique ID of this PPDU
+   */
+  WifiPpdu (const WifiConstPsduMap & psdus, const WifiTxVector& txVector, uint64_t uid);
+  /**
+   * Destructor for WifiPpdu.
    */
-  WifiPpdu (const WifiConstPsduMap & psdus, WifiTxVector txVector, Time ppduDuration, WifiPhyBand band);
-
   virtual ~WifiPpdu ();
 
   /**
    * Get the TXVECTOR used to send the PPDU.
+   *
    * \return the TXVECTOR of the PPDU.
    */
   WifiTxVector GetTxVector (void) const;
 
   /**
    * Get the payload of the PPDU.
-   * \param bssColor the BSS color of the PHY calling this function.
-   * \param staId the staId of the PHY calling this function.
+   *
    * \return the PSDU
    */
-  Ptr<const WifiPsdu> GetPsdu (uint8_t bssColor = 64, uint16_t staId = SU_STA_ID) const;
+  Ptr<const WifiPsdu> GetPsdu (void) const;
 
   /**
-   * Return true if the PPDU's transmission was aborted due to transmitter switch off
-   * \return true if the PPDU's transmission was aborted due to transmitter switch off
+   * \return c\ true if the PPDU's transmission was aborted due to transmitter switch off
    */
   bool IsTruncatedTx (void) const;
 
@@ -92,15 +98,34 @@
 
   /**
    * Get the total transmission duration of the PPDU.
+   *
    * \return the transmission duration of the PPDU
    */
-  Time GetTxDuration () const;
+  virtual Time GetTxDuration (void) const;
+
+  /**
+   * Get the channel width over which the PPDU will effectively be
+   * transmitted.
+   *
+   * \param ppdu the PPDU to send
+   * \return the effective channel width (in MHz) used for the tranmsission
+   */
+  virtual uint16_t GetTransmissionChannelWidth (void) const;
 
   /**
-   * Return true if the PPDU is a MU PPDU
-   * \return true if the PPDU is a MU PPDU
+   * Check whether the given PPDU can be received on the specified primary
+   * channel. Normally, a PPDU can be received if it is transmitted over a
+   * channel that overlaps the primary20 channel of a PHY entity.
+   *
+   * \param ppdu the given PPDU
+   * \param txCenterFreq the center frequency (MHz) of the channel over which the
+   *        PPDU is transmitted
+   * \param p20MinFreq the minimum frequency (MHz) of the primary channel
+   * \param p20MaxFreq the maximum frequency (MHz) of the primary channel
+   * \return true if this PPDU can be received, false otherwise
    */
-  bool IsMu (void) const;
+  virtual bool CanBeReceived (uint16_t txCenterFreq, uint16_t p20MinFreq,
+                              uint16_t p20MaxFreq) const;
 
   /**
    * Get the modulation used for the PPDU.
@@ -109,45 +134,74 @@
   WifiModulationClass GetModulation (void) const;
 
   /**
+   * Get the UID of the PPDU.
+   * \return the UID of the PPDU
+   */
+  uint64_t GetUid (void) const;
+
+  /**
+   * Get the preamble of the PPDU.
+   * \return the preamble of the PPDU
+   */
+  WifiPreamble GetPreamble (void) const;
+
+  /**
    * \brief Print the PPDU contents.
    * \param os output stream in which the data should be printed.
    */
   void Print (std::ostream &os) const;
+  /**
+   * \brief Copy this instance.
+   * \return a Ptr to a copy of this instance.
+   */
+  virtual Ptr<WifiPpdu> Copy (void) const;
 
+  /**
+   * Return the PPDU type (\see WifiPpduType)
+   * \return the PPDU type
+   */
+  virtual WifiPpduType GetType (void) const;
+
+  /**
+   * Get the ID of the STA that transmitted the PPDU for UL MU,
+   * SU_STA_ID otherwise.
+   * \return the ID of the STA that transmitted the PPDU for UL MU, SU_STA_ID otherwise
+   */
+  virtual uint16_t GetStaId (void) const;
+
+protected:
+  /**
+   * \brief Print the payload of the PPDU.
+   * \return information on the payload part of the PPDU
+   */
+  virtual std::string PrintPayload (void) const;
+
+  WifiPreamble m_preamble;          //!< the PHY preamble
+  WifiModulationClass m_modulation; //!< the modulation used for the transmission of this PPDU
+  WifiConstPsduMap m_psdus;         //!< the PSDUs contained in this PPDU
+  uint64_t m_uid;                   //!< the unique ID of this PPDU
 
 private:
   /**
-   * Fill in the PHY headers.
+   * Get the TXVECTOR used to send the PPDU.
    *
-   * \param txVector the TXVECTOR that was used for this PPDU
-   * \param ppduDuration the transmission duration of this PPDU
-   * \param band the WifiPhyBand used for the transmission of this PPDU
+   * \return the TXVECTOR of the PPDU.
    */
-  void SetPhyHeaders (WifiTxVector txVector, Time ppduDuration, WifiPhyBand band);
+  virtual WifiTxVector DoGetTxVector (void) const;
 
-  DsssSigHeader m_dsssSig;                     //!< the DSSS SIG PHY header
-  LSigHeader m_lSig;                           //!< the L-SIG PHY header
-  HtSigHeader m_htSig;                         //!< the HT-SIG PHY header
-  VhtSigHeader m_vhtSig;                       //!< the VHT-SIG PHY header
-  HeSigHeader m_heSig;                         //!< the HE-SIG PHY header
-  WifiPreamble m_preamble;                     //!< the PHY preamble
-  WifiModulationClass m_modulation;            //!< the modulation used for the transmission of this PPDU
-  WifiConstPsduMap m_psdus;                    //!< the PSDUs contained in this PPDU
-  bool m_truncatedTx;                          //!< flag indicating whether the frame's transmission was aborted due to transmitter switch off
-  WifiPhyBand m_band;                          //!< the WifiPhyBand used to transmit that PPDU
-  uint16_t m_channelWidth;                     //!< the channel width used to transmit that PPDU in MHz
-  uint8_t m_txPowerLevel;                      //!< the transmission power level (used only for TX and initializing the returned WifiTxVector)
-  WifiTxVector::HeMuUserInfoMap m_muUserInfos; //!< the HE MU specific per-user information (to be removed once HE-SIG-B headers are implemented)
-};
+  bool m_truncatedTx;     //!< flag indicating whether the frame's transmission was aborted due to transmitter switch off
+  uint8_t m_txPowerLevel; //!< the transmission power level (used only for TX and initializing the returned WifiTxVector)
+  uint8_t m_txAntennas;   //!< the number of antennas used to transmit this PPDU
+}; //class WifiPpdu
 
 /**
  * \brief Stream insertion operator.
  *
  * \param os the stream
- * \param ppdu the PPDU
+ * \param ppdu the const pointer to the PPDU
  * \returns a reference to the stream
  */
-std::ostream& operator<< (std::ostream& os, const WifiPpdu &ppdu);
+std::ostream& operator<< (std::ostream& os, const Ptr<const WifiPpdu> &ppdu);
 
 /**
  * \brief Stream insertion operator.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-preamble.h ns-3.34/src/wifi/model/wifi-preamble.h
--- ns-3.33/src/wifi/model/wifi-preamble.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-preamble.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,85 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2005,2006,2007 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-
-#ifndef WIFI_PREAMBLE_H
-#define WIFI_PREAMBLE_H
-
-#include "ns3/fatal-error.h"
-
-namespace ns3 {
-
-/**
- * \ingroup wifi
- * The type of preamble to be used by an IEEE 802.11 transmission
- */
-enum WifiPreamble
-{
-  WIFI_PREAMBLE_LONG,
-  WIFI_PREAMBLE_SHORT,
-  WIFI_PREAMBLE_HT_MF,
-  WIFI_PREAMBLE_HT_GF,
-  WIFI_PREAMBLE_VHT_SU,
-  WIFI_PREAMBLE_VHT_MU,
-  WIFI_PREAMBLE_HE_SU,
-  WIFI_PREAMBLE_HE_ER_SU,
-  WIFI_PREAMBLE_HE_MU,
-  WIFI_PREAMBLE_HE_TB
-};
-
-/**
-* \brief Stream insertion operator.
-*
-* \param os the stream
-* \param preamble the preamble
-* \returns a reference to the stream
-*/
-inline std::ostream& operator<< (std::ostream& os, WifiPreamble preamble)
-{
-  switch (preamble)
-    {
-    case WIFI_PREAMBLE_LONG:
-      return (os << "LONG");
-    case WIFI_PREAMBLE_SHORT:
-      return (os << "SHORT");
-    case WIFI_PREAMBLE_HT_MF:
-      return (os << "HT_MF");
-    case WIFI_PREAMBLE_HT_GF:
-      return (os << "HT_GF");
-    case WIFI_PREAMBLE_VHT_SU:
-      return (os << "VHT_SU");
-    case WIFI_PREAMBLE_VHT_MU:
-      return (os << "VHT_MU");
-    case WIFI_PREAMBLE_HE_SU:
-      return (os << "HE_SU");
-    case WIFI_PREAMBLE_HE_ER_SU:
-      return (os << "HE_ER_SU");
-    case WIFI_PREAMBLE_HE_MU:
-      return (os << "HE_MU");
-    case WIFI_PREAMBLE_HE_TB:
-      return (os << "HE_TB");
-    default:
-      NS_FATAL_ERROR ("Invalid preamble");
-      return (os << "INVALID");
-    }
-}
-
-} //namespace ns3
-
-#endif /* WIFI_PREAMBLE_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-protection.cc ns-3.34/src/wifi/model/wifi-protection.cc
--- ns-3.33/src/wifi/model/wifi-protection.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-protection.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,114 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "wifi-protection.h"
+#include "wifi-utils.h"
+
+namespace ns3 {
+
+/*
+ * WifiProtection
+ */
+
+WifiProtection::WifiProtection (Method m)
+  : method (m),
+    protectionTime (Time::Min ())   // uninitialized
+{
+}
+
+WifiProtection::~WifiProtection ()
+{
+}
+
+
+/*
+ * WifiNoProtection
+ */
+
+WifiNoProtection::WifiNoProtection ()
+  : WifiProtection (NONE)
+{
+  protectionTime = Seconds (0);
+}
+
+std::unique_ptr<WifiProtection>
+WifiNoProtection::Copy (void) const
+{
+  return std::unique_ptr<WifiProtection> (new WifiNoProtection (*this));
+}
+
+void
+WifiNoProtection::Print (std::ostream &os) const
+{
+  os << "NONE";
+}
+
+
+/*
+ * WifiRtsCtsProtection
+ */
+
+WifiRtsCtsProtection::WifiRtsCtsProtection ()
+  : WifiProtection (RTS_CTS)
+{
+}
+
+std::unique_ptr<WifiProtection>
+WifiRtsCtsProtection::Copy (void) const
+{
+  return std::unique_ptr<WifiProtection> (new WifiRtsCtsProtection (*this));
+}
+
+void
+WifiRtsCtsProtection::Print (std::ostream &os) const
+{
+  os << "RTS_CTS";
+}
+
+
+/*
+ * WifiCtsToSelfProtection
+ */
+
+WifiCtsToSelfProtection::WifiCtsToSelfProtection ()
+  : WifiProtection (CTS_TO_SELF)
+{
+}
+
+std::unique_ptr<WifiProtection>
+WifiCtsToSelfProtection::Copy (void) const
+{
+  return std::unique_ptr<WifiProtection> (new WifiCtsToSelfProtection (*this));
+}
+
+void
+WifiCtsToSelfProtection::Print (std::ostream &os) const
+{
+  os << "CTS_TO_SELF";
+}
+
+
+std::ostream & operator << (std::ostream &os, const WifiProtection* protection)
+{
+  protection->Print (os);
+  return os;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-protection.h ns-3.34/src/wifi/model/wifi-protection.h
--- ns-3.33/src/wifi/model/wifi-protection.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-protection.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,134 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef WIFI_PROTECTION_H
+#define WIFI_PROTECTION_H
+
+#include "ns3/nstime.h"
+#include "wifi-tx-vector.h"
+#include "ctrl-headers.h"
+#include <memory>
+
+
+namespace ns3 {
+
+/**
+ * \ingroup wifi
+ *
+ * WifiProtection is an abstract base struct. Each derived struct defines a protection
+ * method and stores the information needed to perform protection according to
+ * that method.
+ */
+struct WifiProtection
+{
+  /**
+   * \enum Method
+   * \brief Available protection methods
+   */
+  enum Method
+    {
+      NONE = 0,
+      RTS_CTS,
+      CTS_TO_SELF
+    };
+
+  /**
+   * Constructor.
+   * \param m the protection method for this object
+   */
+  WifiProtection (Method m);
+  virtual ~WifiProtection ();
+
+  /**
+   * Clone this object.
+   * \return a pointer to the cloned object
+   */
+  virtual std::unique_ptr<WifiProtection> Copy (void) const = 0;
+
+  /**
+   * \brief Print the object contents.
+   * \param os output stream in which the data should be printed.
+   */
+  virtual void Print (std::ostream &os) const = 0;
+
+  const Method method;   //!< protection method
+  Time protectionTime;   //!< time required by the protection method
+};
+
+
+/**
+ * \ingroup wifi
+ *
+ * WifiNoProtection specifies that no protection method is used.
+ */
+struct WifiNoProtection : public WifiProtection
+{
+  WifiNoProtection ();
+
+  std::unique_ptr<WifiProtection> Copy (void) const override;
+  void Print (std::ostream &os) const override;
+};
+
+
+/**
+ * \ingroup wifi
+ *
+ * WifiRtsCtsProtection specifies that RTS/CTS protection method is used.
+ */
+struct WifiRtsCtsProtection : public WifiProtection
+{
+  WifiRtsCtsProtection ();
+
+  std::unique_ptr<WifiProtection> Copy (void) const override;
+  void Print (std::ostream &os) const override;
+
+  WifiTxVector rtsTxVector;       //!< RTS TXVECTOR
+  WifiTxVector ctsTxVector;       //!< CTS TXVECTOR
+};
+
+
+/**
+ * \ingroup wifi
+ *
+ * WifiCtsToSelfProtection specifies that CTS-to-self protection method is used.
+ */
+struct WifiCtsToSelfProtection : public WifiProtection
+{
+  WifiCtsToSelfProtection ();
+
+  std::unique_ptr<WifiProtection> Copy (void) const override;
+  void Print (std::ostream &os) const override;
+
+  WifiTxVector ctsTxVector;       //!< CTS TXVECTOR
+};
+
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the output stream
+ * \param protection the protection method
+ * \returns a reference to the stream
+ */
+std::ostream& operator<< (std::ostream& os, const WifiProtection* protection);
+
+} //namespace ns3
+
+#endif /* WIFI_PROTECTION_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-protection-manager.cc ns-3.34/src/wifi/model/wifi-protection-manager.cc
--- ns-3.33/src/wifi/model/wifi-protection-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-protection-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,62 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "wifi-protection-manager.h"
+#include "regular-wifi-mac.h"
+
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("WifiProtectionManager");
+
+NS_OBJECT_ENSURE_REGISTERED (WifiProtectionManager);
+
+TypeId
+WifiProtectionManager::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::WifiProtectionManager")
+    .SetParent<Object> ()
+    .SetGroupName ("Wifi")
+  ;
+  return tid;
+}
+
+WifiProtectionManager::~WifiProtectionManager ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+void
+WifiProtectionManager::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_mac = 0;
+  Object::DoDispose ();
+}
+
+void
+WifiProtectionManager::SetWifiMac (Ptr<RegularWifiMac> mac)
+{
+  NS_LOG_FUNCTION (this << mac);
+  m_mac = mac;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-protection-manager.h ns-3.34/src/wifi/model/wifi-protection-manager.h
--- ns-3.33/src/wifi/model/wifi-protection-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-protection-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,94 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef WIFI_PROTECTION_MANAGER_H
+#define WIFI_PROTECTION_MANAGER_H
+
+#include "wifi-protection.h"
+#include <memory>
+#include "ns3/object.h"
+
+
+namespace ns3 {
+
+class WifiTxParameters;
+class WifiMacQueueItem;
+class RegularWifiMac;
+
+/**
+ * \ingroup wifi
+ *
+ * WifiProtectionManager is an abstract base class. Each subclass defines a logic
+ * to select the protection method for a given frame.
+ */
+class WifiProtectionManager : public Object
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  virtual ~WifiProtectionManager ();
+
+  /**
+   * Set the MAC which is using this Protection Manager
+   *
+   * \param mac a pointer to the MAC
+   */
+  void SetWifiMac (Ptr<RegularWifiMac> mac);
+
+  /**
+   * Determine the protection method to use if the given MPDU is added to the current
+   * frame. Return a null pointer if the protection method is unchanged or the new
+   * protection method otherwise.
+   *
+   * \param mpdu the MPDU to be added to the current frame
+   * \param txParams the current TX parameters for the current frame
+   * \return a null pointer if the protection method is unchanged or the new
+   *         protection method otherwise
+   */
+  virtual std::unique_ptr<WifiProtection> TryAddMpdu (Ptr<const WifiMacQueueItem> mpdu,
+                                                      const WifiTxParameters& txParams) = 0;
+
+  /**
+   * Determine the protection method to use if the given MSDU is aggregated to the
+   * current frame. Return a null pointer if the protection method is unchanged or
+   * the new protection method otherwise.
+   *
+   * \param msdu the MSDU to be aggregated to the current frame
+   * \param txParams the current TX parameters for the current frame
+   * \return a null pointer if the protection method is unchanged or the new
+   *         protection method otherwise
+   */
+  virtual std::unique_ptr<WifiProtection> TryAggregateMsdu (Ptr<const WifiMacQueueItem> msdu,
+                                                            const WifiTxParameters& txParams) = 0;
+
+protected:
+  virtual void DoDispose (void);
+
+  Ptr<RegularWifiMac> m_mac;     //!< MAC which is using this Protection Manager
+};
+
+
+
+} //namespace ns3
+
+#endif /* WIFI_PROTECTION_MANAGER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-psdu.h ns-3.34/src/wifi/model/wifi-psdu.h
--- ns-3.33/src/wifi/model/wifi-psdu.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-psdu.h	2021-07-14 10:31:07.000000000 -0700
@@ -125,13 +125,14 @@
 
   /**
    * \brief Get a copy of the i-th A-MPDU subframe (includes subframe header, MPDU, and possibly padding)
+   * \param i the index in the list of A-MPDU subframes
    * \return the i-th A-MPDU subframe.
    */
   Ptr<Packet> GetAmpduSubframe (std::size_t i) const;
 
   /**
    * \brief Return the size of the i-th A-MPDU subframe.
-   *
+   * \param i the index in the list of A-MPDU subframes
    * \return the size of the i-th A-MPDU subframe.
    */
   std::size_t GetAmpduSubframeSize (std::size_t i) const;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-radio-energy-model.h ns-3.34/src/wifi/model/wifi-radio-energy-model.h
--- ns-3.33/src/wifi/model/wifi-radio-energy-model.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-radio-energy-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -71,7 +71,7 @@
    *
    * Defined in ns3::WifiPhyListener
    */
-  void NotifyRxStart (Time duration);
+  void NotifyRxStart (Time duration) override;
 
   /**
    * \brief Switches the WifiRadioEnergyModel back to IDLE state.
@@ -81,7 +81,7 @@
    * Note that for the WifiRadioEnergyModel, the behavior of the function is the
    * same as NotifyRxEndError.
    */
-  void NotifyRxEndOk (void);
+  void NotifyRxEndOk (void) override;
 
   /**
    * \brief Switches the WifiRadioEnergyModel back to IDLE state.
@@ -91,7 +91,7 @@
    * Note that for the WifiRadioEnergyModel, the behavior of the function is the
    * same as NotifyRxEndOk.
    */
-  void NotifyRxEndError (void);
+  void NotifyRxEndError (void) override;
 
   /**
    * \brief Switches the WifiRadioEnergyModel to TX state and switches back to
@@ -102,41 +102,41 @@
    *
    * Defined in ns3::WifiPhyListener
    */
-  void NotifyTxStart (Time duration, double txPowerDbm);
+  void NotifyTxStart (Time duration, double txPowerDbm) override;
 
   /**
    * \param duration the expected busy duration.
    *
    * Defined in ns3::WifiPhyListener
    */
-  void NotifyMaybeCcaBusyStart (Time duration);
+  void NotifyMaybeCcaBusyStart (Time duration) override;
 
   /**
    * \param duration the expected channel switching duration.
    *
    * Defined in ns3::WifiPhyListener
    */
-  void NotifySwitchingStart (Time duration);
+  void NotifySwitchingStart (Time duration) override;
 
   /**
    * Defined in ns3::WifiPhyListener
    */
-  void NotifySleep (void);
+  void NotifySleep (void) override;
 
   /**
    * Defined in ns3::WifiPhyListener
    */
-  void NotifyOff (void);
+  void NotifyOff (void) override;
 
   /**
    * Defined in ns3::WifiPhyListener
    */
-  void NotifyWakeup (void);
+  void NotifyWakeup (void) override;
 
   /**
    * Defined in ns3::WifiPhyListener
    */
-  void NotifyOn (void);
+  void NotifyOn (void) override;
 
 
 private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-remote-station-manager.cc ns-3.34/src/wifi/model/wifi-remote-station-manager.cc
--- ns-3.33/src/wifi/model/wifi-remote-station-manager.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-remote-station-manager.cc	2021-07-14 10:31:07.000000000 -0700
@@ -25,12 +25,15 @@
 #include "ns3/simulator.h"
 #include "wifi-remote-station-manager.h"
 #include "wifi-phy.h"
-#include "wifi-mac.h"
+#include "ap-wifi-mac.h"
+#include "sta-wifi-mac.h"
 #include "wifi-mac-header.h"
+#include "wifi-mac-queue-item.h"
 #include "wifi-mac-trailer.h"
-#include "ht-configuration.h"
-#include "vht-configuration.h"
-#include "he-configuration.h"
+#include "ns3/ht-configuration.h"
+#include "ns3/ht-phy.h"
+#include "ns3/vht-configuration.h"
+#include "ns3/he-configuration.h"
 #include "wifi-net-device.h"
 
 namespace ns3 {
@@ -115,10 +118,8 @@
 }
 
 WifiRemoteStationManager::WifiRemoteStationManager ()
-  : m_pcfSupported (false),
-    m_useNonErpProtection (false),
+  : m_useNonErpProtection (false),
     m_useNonHtProtection (false),
-    m_useGreenfieldProtection (false),
     m_shortPreambleEnabled (false),
     m_shortSlotTimeEnabled (false)
 {
@@ -147,11 +148,11 @@
   //transmit rate for automatic control responses like
   //acknowledgments.
   m_wifiPhy = phy;
-  m_defaultTxMode = phy->GetMode (0);
+  m_defaultTxMode = phy->GetDefaultMode ();
   NS_ASSERT (m_defaultTxMode.IsMandatory ());
   if (GetHtSupported ())
     {
-      m_defaultTxMcs = phy->GetMcs (0);
+      m_defaultTxMcs = HtPhy::GetHtMcs (0);
     }
   Reset ();
 }
@@ -166,6 +167,13 @@
   Reset ();
 }
 
+int64_t
+WifiRemoteStationManager::AssignStreams (int64_t stream)
+{
+  NS_LOG_FUNCTION (this << stream);
+  return 0;
+}
+
 void
 WifiRemoteStationManager::SetMaxSsrc (uint32_t maxSsrc)
 {
@@ -256,34 +264,6 @@
   return false;
 }
 
-void
-WifiRemoteStationManager::SetPcfSupported (bool enable)
-{
-  m_pcfSupported = enable;
-}
-
-bool
-WifiRemoteStationManager::GetPcfSupported (void) const
-{
-  return m_pcfSupported;
-}
-
-bool
-WifiRemoteStationManager::GetGreenfieldSupported (void) const
-{
-  if (GetHtSupported ())
-    {
-      Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
-      Ptr<HtConfiguration> htConfiguration = device->GetHtConfiguration ();
-      NS_ASSERT (htConfiguration); //If HT is supported, we should have a HT configuration attached
-      if (htConfiguration->GetGreenfieldSupported ())
-        {
-          return true;
-        }
-    }
-  return false;
-}
-
 bool
 WifiRemoteStationManager::GetLdpcSupported (void) const
 {
@@ -365,6 +345,18 @@
           return;
         }
     }
+  if ((mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS) || (mode.GetModulationClass () == WIFI_MOD_CLASS_HR_DSSS))
+    {
+      state->m_dsssSupported = true;
+    }
+  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM)
+    {
+      state->m_erpOfdmSupported = true;
+    }
+  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM)
+    {
+      state->m_ofdmSupported = true;
+    }
   state->m_operationalRateSet.push_back (mode);
 }
 
@@ -375,12 +367,12 @@
   NS_ASSERT (!address.IsGroup ());
   WifiRemoteStationState *state = LookupState (address);
   state->m_operationalRateSet.clear ();
-  for (uint8_t i = 0; i < m_wifiPhy->GetNModes (); i++)
+  for (const auto & mode : m_wifiPhy->GetModeList ())
     {
-      state->m_operationalRateSet.push_back (m_wifiPhy->GetMode (i));
-      if (m_wifiPhy->GetMode (i).IsMandatory ())
+      state->m_operationalRateSet.push_back (mode);
+      if (mode.IsMandatory ())
         {
-          AddBasicMode (m_wifiPhy->GetMode (i));
+          AddBasicMode (mode);
         }
     }
 }
@@ -392,9 +384,9 @@
   NS_ASSERT (!address.IsGroup ());
   WifiRemoteStationState *state = LookupState (address);
   state->m_operationalMcsSet.clear ();
-  for (uint8_t i = 0; i < m_wifiPhy->GetNMcs (); i++)
+  for (const auto & mcs : m_wifiPhy->GetMcsList ())
     {
-      state->m_operationalMcsSet.push_back (m_wifiPhy->GetMcs (i));
+      state->m_operationalMcsSet.push_back (mcs);
     }
 }
 
@@ -500,6 +492,33 @@
   LookupState (address)->m_state = WifiRemoteStationState::DISASSOC;
 }
 
+uint16_t
+WifiRemoteStationManager::GetStaId (Mac48Address address, const WifiTxVector& txVector) const
+{
+  NS_LOG_FUNCTION (this << address << txVector);
+
+  uint16_t staId = SU_STA_ID;
+
+  if (txVector.IsMu ())
+    {
+      if (m_wifiMac->GetTypeOfStation () == AP)
+        {
+          staId = StaticCast<ApWifiMac> (m_wifiMac)->GetAssociationId (address);
+        }
+      else if (m_wifiMac->GetTypeOfStation () == STA)
+        {
+          Ptr<StaWifiMac> staMac = StaticCast<StaWifiMac> (m_wifiMac);
+          if (staMac->IsAssociated ())
+            {
+              staId = staMac->GetAssociationId ();
+            }
+        }
+    }
+
+  NS_LOG_DEBUG ("Returning STAID = " << staId);
+  return staId;
+}
+
 WifiTxVector
 WifiRemoteStationManager::GetDataTxVector (const WifiMacHeader &header)
 {
@@ -510,11 +529,11 @@
       WifiMode mode = GetNonUnicastMode ();
       WifiTxVector v;
       v.SetMode (mode);
-      v.SetPreambleType (GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (address)));
+      v.SetPreambleType (GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()));
       v.SetTxPowerLevel (m_defaultTxPowerLevel);
       v.SetChannelWidth (GetChannelWidthForTransmission (mode, m_wifiPhy->GetChannelWidth ()));
       v.SetGuardInterval (ConvertGuardIntervalToNanoSeconds (mode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ())));
-      v.SetNTx (1);
+      v.SetNTx (GetNumberOfAntennas ());
       v.SetNss (1);
       v.SetNess (0);
       return v;
@@ -533,7 +552,7 @@
           mgtMode = GetDefaultMode ();
         }
       txVector.SetMode (mgtMode);
-      txVector.SetPreambleType (GetPreambleForTransmission (mgtMode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (address)));
+      txVector.SetPreambleType (GetPreambleForTransmission (mgtMode.GetModulationClass (), GetShortPreambleEnabled ()));
       txVector.SetTxPowerLevel (m_defaultTxPowerLevel);
       txVector.SetChannelWidth (GetChannelWidthForTransmission (mgtMode, m_wifiPhy->GetChannelWidth ()));
       txVector.SetGuardInterval (ConvertGuardIntervalToNanoSeconds (mgtMode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ())));
@@ -547,9 +566,7 @@
   Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
   if (heConfiguration)
     {
-      UintegerValue bssColor;
-      heConfiguration->GetAttribute ("BssColor", bssColor);
-      txVector.SetBssColor (bssColor.Get ());
+      txVector.SetBssColor (heConfiguration->GetBssColor ());
     }
   return txVector;
 }
@@ -581,7 +598,7 @@
                        defaultPreamble,
                        ConvertGuardIntervalToNanoSeconds (defaultMode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ())),
                        GetNumberOfAntennas (),
-                       GetMaxNumberOfTransmitStreams (),
+                       1,
                        0,
                        GetChannelWidthForTransmission (defaultMode, m_wifiPhy->GetChannelWidth ()),
                        false);
@@ -596,11 +613,11 @@
         WifiMode mode = GetNonUnicastMode ();
         WifiTxVector v;
         v.SetMode (mode);
-        v.SetPreambleType (GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (address)));
+        v.SetPreambleType (GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled ()));
         v.SetTxPowerLevel (m_defaultTxPowerLevel);
         v.SetChannelWidth (GetChannelWidthForTransmission (mode, m_wifiPhy->GetChannelWidth ()));
         v.SetGuardInterval (ConvertGuardIntervalToNanoSeconds (mode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ())));
-        v.SetNTx (1);
+        v.SetNTx (GetNumberOfAntennas ());
         v.SetNss (1);
         v.SetNess (0);
         return v;
@@ -608,25 +625,212 @@
   return DoGetRtsTxVector (Lookup (address));
 }
 
+WifiTxVector
+WifiRemoteStationManager::GetCtsTxVector (Mac48Address to, WifiMode rtsTxMode) const
+{
+  NS_ASSERT (!to.IsGroup ());
+  WifiMode ctsMode = GetControlAnswerMode (rtsTxMode);
+  WifiTxVector v;
+  v.SetMode (ctsMode);
+  v.SetPreambleType (GetPreambleForTransmission (ctsMode.GetModulationClass (), GetShortPreambleEnabled ()));
+  v.SetTxPowerLevel (GetDefaultTxPowerLevel ());
+  v.SetChannelWidth (GetChannelWidthForTransmission (ctsMode, m_wifiPhy->GetChannelWidth ()));
+  uint16_t ctsTxGuardInterval = ConvertGuardIntervalToNanoSeconds (ctsMode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ()));
+  v.SetGuardInterval (ctsTxGuardInterval);
+  v.SetNss (1);
+  return v;
+}
+
+WifiTxVector
+WifiRemoteStationManager::GetAckTxVector (Mac48Address to, const WifiTxVector& dataTxVector) const
+{
+  NS_ASSERT (!to.IsGroup ());
+  WifiMode ackMode = GetControlAnswerMode (dataTxVector.GetMode (GetStaId (to, dataTxVector)));
+  WifiTxVector v;
+  v.SetMode (ackMode);
+  v.SetPreambleType (GetPreambleForTransmission (ackMode.GetModulationClass (), GetShortPreambleEnabled ()));
+  v.SetTxPowerLevel (GetDefaultTxPowerLevel ());
+  v.SetChannelWidth (GetChannelWidthForTransmission (ackMode, m_wifiPhy->GetChannelWidth ()));
+  uint16_t ackTxGuardInterval = ConvertGuardIntervalToNanoSeconds (ackMode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ()));
+  v.SetGuardInterval (ackTxGuardInterval);
+  v.SetNss (1);
+  return v;
+}
+
+WifiTxVector
+WifiRemoteStationManager::GetBlockAckTxVector (Mac48Address to, const WifiTxVector& dataTxVector) const
+{
+  NS_ASSERT (!to.IsGroup ());
+  WifiMode blockAckMode = GetControlAnswerMode (dataTxVector.GetMode (GetStaId (to, dataTxVector)));
+  WifiTxVector v;
+  v.SetMode (blockAckMode);
+  v.SetPreambleType (GetPreambleForTransmission (blockAckMode.GetModulationClass (), GetShortPreambleEnabled ()));
+  v.SetTxPowerLevel (GetDefaultTxPowerLevel ());
+  v.SetChannelWidth (GetChannelWidthForTransmission (blockAckMode, m_wifiPhy->GetChannelWidth ()));
+  uint16_t blockAckTxGuardInterval = ConvertGuardIntervalToNanoSeconds (blockAckMode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ()));
+  v.SetGuardInterval (blockAckTxGuardInterval);
+  v.SetNss (1);
+  return v;
+}
+
+WifiMode
+WifiRemoteStationManager::GetControlAnswerMode (WifiMode reqMode) const
+{
+  /**
+   * The standard has relatively unambiguous rules for selecting a
+   * control response rate (the below is quoted from IEEE 802.11-2012,
+   * Section 9.7):
+   *
+   * To allow the transmitting STA to calculate the contents of the
+   * Duration/ID field, a STA responding to a received frame shall
+   * transmit its Control Response frame (either CTS or Ack), other
+   * than the BlockAck control frame, at the highest rate in the
+   * BSSBasicRateSet parameter that is less than or equal to the
+   * rate of the immediately previous frame in the frame exchange
+   * sequence (as defined in Annex G) and that is of the same
+   * modulation class (see Section 9.7.8) as the received frame...
+   */
+  NS_LOG_FUNCTION (this << reqMode);
+  WifiMode mode = GetDefaultMode ();
+  bool found = false;
+  //First, search the BSS Basic Rate set
+  for (uint8_t i = 0; i < GetNBasicModes (); i++)
+    {
+      WifiMode testMode = GetBasicMode (i);
+      if ((!found || testMode.IsHigherDataRate (mode))
+          && (!testMode.IsHigherDataRate (reqMode))
+          && (IsAllowedControlAnswerModulationClass (reqMode.GetModulationClass (), testMode.GetModulationClass ())))
+        {
+          mode = testMode;
+          //We've found a potentially-suitable transmit rate, but we
+          //need to continue and consider all the basic rates before
+          //we can be sure we've got the right one.
+          found = true;
+        }
+    }
+  if (GetHtSupported ())
+    {
+      if (!found)
+        {
+          mode = GetDefaultMcs ();
+          for (uint8_t i = 0; i != GetNBasicMcs (); i++)
+            {
+              WifiMode testMode = GetBasicMcs (i);
+              if ((!found || testMode.IsHigherDataRate (mode))
+                  && (!testMode.IsHigherDataRate (reqMode))
+                  && (testMode.GetModulationClass () == reqMode.GetModulationClass ()))
+                {
+                  mode = testMode;
+                  //We've found a potentially-suitable transmit rate, but we
+                  //need to continue and consider all the basic rates before
+                  //we can be sure we've got the right one.
+                  found = true;
+                }
+            }
+        }
+    }
+  //If we found a suitable rate in the BSSBasicRateSet, then we are
+  //done and can return that mode.
+  if (found)
+    {
+      NS_LOG_DEBUG ("WifiRemoteStationManager::GetControlAnswerMode returning " << mode);
+      return mode;
+    }
+
+  /**
+   * If no suitable basic rate was found, we search the mandatory
+   * rates. The standard (IEEE 802.11-2007, Section 9.6) says:
+   *
+   *   ...If no rate contained in the BSSBasicRateSet parameter meets
+   *   these conditions, then the control frame sent in response to a
+   *   received frame shall be transmitted at the highest mandatory
+   *   rate of the PHY that is less than or equal to the rate of the
+   *   received frame, and that is of the same modulation class as the
+   *   received frame. In addition, the Control Response frame shall
+   *   be sent using the same PHY options as the received frame,
+   *   unless they conflict with the requirement to use the
+   *   BSSBasicRateSet parameter.
+   *
+   * \todo Note that we're ignoring the last sentence for now, because
+   * there is not yet any manipulation here of PHY options.
+   */
+  for (const auto & thismode : m_wifiPhy->GetModeList ())
+    {
+      /* If the rate:
+       *
+       *  - is a mandatory rate for the PHY, and
+       *  - is equal to or faster than our current best choice, and
+       *  - is less than or equal to the rate of the received frame, and
+       *  - is of the same modulation class as the received frame
+       *
+       * ...then it's our best choice so far.
+       */
+      if (thismode.IsMandatory ()
+          && (!found || thismode.IsHigherDataRate (mode))
+          && (!thismode.IsHigherDataRate (reqMode))
+          && (IsAllowedControlAnswerModulationClass (reqMode.GetModulationClass (), thismode.GetModulationClass ())))
+        {
+          mode = thismode;
+          //As above; we've found a potentially-suitable transmit
+          //rate, but we need to continue and consider all the
+          //mandatory rates before we can be sure we've got the right one.
+          found = true;
+        }
+    }
+  if (GetHtSupported () )
+    {
+      for (const auto & thismode : m_wifiPhy->GetMcsList ())
+        {
+          if (thismode.IsMandatory ()
+              && (!found || thismode.IsHigherDataRate (mode))
+              && (!thismode.IsHigherCodeRate (reqMode))
+              && (thismode.GetModulationClass () == reqMode.GetModulationClass ()))
+            {
+              mode = thismode;
+              //As above; we've found a potentially-suitable transmit
+              //rate, but we need to continue and consider all the
+              //mandatory rates before we can be sure we've got the right one.
+              found = true;
+            }
+        }
+    }
+
+  /**
+   * If we still haven't found a suitable rate for the response then
+   * someone has messed up the simulation configuration. This probably means
+   * that the WifiPhyStandard is not set correctly, or that a rate that
+   * is not supported by the PHY has been explicitly requested.
+   *
+   * Either way, it is serious - we can either disobey the standard or
+   * fail, and I have chosen to do the latter...
+   */
+  if (!found)
+    {
+      NS_FATAL_ERROR ("Can't find response rate for " << reqMode);
+    }
+
+  NS_LOG_DEBUG ("WifiRemoteStationManager::GetControlAnswerMode returning " << mode);
+  return mode;
+}
+
 void
-WifiRemoteStationManager::ReportRtsFailed (Mac48Address address, const WifiMacHeader *header)
+WifiRemoteStationManager::ReportRtsFailed (const WifiMacHeader& header)
 {
-  NS_LOG_FUNCTION (this << address << *header);
-  NS_ASSERT (!address.IsGroup ());
-  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
+  NS_LOG_FUNCTION (this << header);
+  NS_ASSERT (!header.GetAddr1 ().IsGroup ());
+  AcIndex ac = QosUtilsMapTidToAc ((header.IsQosData ()) ? header.GetQosTid () : 0);
   m_ssrc[ac]++;
-  m_macTxRtsFailed (address);
-  DoReportRtsFailed (Lookup (address));
+  m_macTxRtsFailed (header.GetAddr1 ());
+  DoReportRtsFailed (Lookup (header.GetAddr1 ()));
 }
 
 void
-WifiRemoteStationManager::ReportDataFailed (Mac48Address address, const WifiMacHeader *header,
-                                            uint32_t packetSize)
+WifiRemoteStationManager::ReportDataFailed (Ptr<const WifiMacQueueItem> mpdu)
 {
-  NS_LOG_FUNCTION (this << address << *header);
-  NS_ASSERT (!address.IsGroup ());
-  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
-  bool longMpdu = (packetSize + header->GetSize () + WIFI_MAC_FCS_LENGTH) > m_rtsCtsThreshold;
+  NS_LOG_FUNCTION (this << *mpdu);
+  NS_ASSERT (!mpdu->GetHeader ().GetAddr1 ().IsGroup ());
+  AcIndex ac = QosUtilsMapTidToAc ((mpdu->GetHeader ().IsQosData ()) ? mpdu->GetHeader ().GetQosTid () : 0);
+  bool longMpdu = (mpdu->GetSize () > m_rtsCtsThreshold);
   if (longMpdu)
     {
       m_slrc[ac]++;
@@ -635,33 +839,33 @@
     {
       m_ssrc[ac]++;
     }
-  m_macTxDataFailed (address);
-  DoReportDataFailed (Lookup (address));
+  m_macTxDataFailed (mpdu->GetHeader ().GetAddr1 ());
+  DoReportDataFailed (Lookup (mpdu->GetHeader ().GetAddr1 ()));
 }
 
 void
-WifiRemoteStationManager::ReportRtsOk (Mac48Address address, const WifiMacHeader *header,
+WifiRemoteStationManager::ReportRtsOk (const WifiMacHeader& header,
                                        double ctsSnr, WifiMode ctsMode, double rtsSnr)
 {
-  NS_LOG_FUNCTION (this << address << *header << ctsSnr << ctsMode << rtsSnr);
-  NS_ASSERT (!address.IsGroup ());
-  WifiRemoteStation *station = Lookup (address);
-  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
+  NS_LOG_FUNCTION (this << header << ctsSnr << ctsMode << rtsSnr);
+  NS_ASSERT (!header.GetAddr1 ().IsGroup ());
+  WifiRemoteStation *station = Lookup (header.GetAddr1 ());
+  AcIndex ac = QosUtilsMapTidToAc ((header.IsQosData ()) ? header.GetQosTid () : 0);
   station->m_state->m_info.NotifyTxSuccess (m_ssrc[ac]);
   m_ssrc[ac] = 0;
   DoReportRtsOk (station, ctsSnr, ctsMode, rtsSnr);
 }
 
 void
-WifiRemoteStationManager::ReportDataOk (Mac48Address address, const WifiMacHeader *header,
-                                        double ackSnr, WifiMode ackMode, double dataSnr,
-                                        WifiTxVector dataTxVector, uint32_t packetSize)
+WifiRemoteStationManager::ReportDataOk (Ptr<const WifiMacQueueItem> mpdu, double ackSnr,
+                                        WifiMode ackMode, double dataSnr, WifiTxVector dataTxVector)
 {
-  NS_LOG_FUNCTION (this << address << *header << ackSnr << ackMode << dataSnr << dataTxVector << packetSize);
-  NS_ASSERT (!address.IsGroup ());
-  WifiRemoteStation *station = Lookup (address);
-  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
-  bool longMpdu = (packetSize + header->GetSize () + WIFI_MAC_FCS_LENGTH) > m_rtsCtsThreshold;
+  NS_LOG_FUNCTION (this << *mpdu << ackSnr << ackMode << dataSnr << dataTxVector);
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
+  NS_ASSERT (!hdr.GetAddr1 ().IsGroup ());
+  WifiRemoteStation *station = Lookup (hdr.GetAddr1 ());
+  AcIndex ac = QosUtilsMapTidToAc ((hdr.IsQosData ()) ? hdr.GetQosTid () : 0);
+  bool longMpdu = (mpdu->GetSize () > m_rtsCtsThreshold);
   if (longMpdu)
     {
       station->m_state->m_info.NotifyTxSuccess (m_slrc[ac]);
@@ -672,32 +876,32 @@
       station->m_state->m_info.NotifyTxSuccess (m_ssrc[ac]);
       m_ssrc[ac] = 0;
     }
-  DoReportDataOk (station, ackSnr, ackMode, dataSnr, dataTxVector.GetChannelWidth (), dataTxVector.GetNss ());
+  DoReportDataOk (station, ackSnr, ackMode, dataSnr, dataTxVector.GetChannelWidth (),
+                  dataTxVector.GetNss (GetStaId (hdr.GetAddr1 (), dataTxVector)));
 }
 
 void
-WifiRemoteStationManager::ReportFinalRtsFailed (Mac48Address address, const WifiMacHeader *header)
+WifiRemoteStationManager::ReportFinalRtsFailed (const WifiMacHeader& header)
 {
-  NS_LOG_FUNCTION (this << address << *header);
-  NS_ASSERT (!address.IsGroup ());
-  WifiRemoteStation *station = Lookup (address);
-  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
+  NS_LOG_FUNCTION (this << header);
+  NS_ASSERT (!header.GetAddr1 ().IsGroup ());
+  WifiRemoteStation *station = Lookup (header.GetAddr1 ());
+  AcIndex ac = QosUtilsMapTidToAc ((header.IsQosData ()) ? header.GetQosTid () : 0);
   station->m_state->m_info.NotifyTxFailed ();
   m_ssrc[ac] = 0;
-  m_macTxFinalRtsFailed (address);
+  m_macTxFinalRtsFailed (header.GetAddr1 ());
   DoReportFinalRtsFailed (station);
 }
 
 void
-WifiRemoteStationManager::ReportFinalDataFailed (Mac48Address address, const WifiMacHeader *header,
-                                                 uint32_t packetSize)
+WifiRemoteStationManager::ReportFinalDataFailed (Ptr<const WifiMacQueueItem> mpdu)
 {
-  NS_LOG_FUNCTION (this << address << *header);
-  NS_ASSERT (!address.IsGroup ());
-  WifiRemoteStation *station = Lookup (address);
-  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
+  NS_LOG_FUNCTION (this << *mpdu);
+  NS_ASSERT (!mpdu->GetHeader ().GetAddr1 ().IsGroup ());
+  WifiRemoteStation *station = Lookup (mpdu->GetHeader ().GetAddr1 ());
+  AcIndex ac = QosUtilsMapTidToAc ((mpdu->GetHeader ().IsQosData ()) ? mpdu->GetHeader ().GetQosTid () : 0);
   station->m_state->m_info.NotifyTxFailed ();
-  bool longMpdu = (packetSize + header->GetSize () + WIFI_MAC_FCS_LENGTH) > m_rtsCtsThreshold;
+  bool longMpdu = (mpdu->GetSize () > m_rtsCtsThreshold);
   if (longMpdu)
     {
       m_slrc[ac] = 0;
@@ -706,33 +910,35 @@
     {
       m_ssrc[ac] = 0;
     }
-  m_macTxFinalDataFailed (address);
+  m_macTxFinalDataFailed (mpdu->GetHeader ().GetAddr1 ());
   DoReportFinalDataFailed (station);
 }
 
 void
-WifiRemoteStationManager::ReportRxOk (Mac48Address address, double rxSnr, WifiMode txMode)
+WifiRemoteStationManager::ReportRxOk (Mac48Address address, RxSignalInfo rxSignalInfo, WifiTxVector txVector)
 {
-  NS_LOG_FUNCTION (this << address << rxSnr << txMode);
+  NS_LOG_FUNCTION (this << address << rxSignalInfo << txVector);
   if (address.IsGroup ())
     {
       return;
     }
-  DoReportRxOk (Lookup (address), rxSnr, txMode);
+  WifiRemoteStation *station = Lookup (address);
+  DoReportRxOk (station, rxSignalInfo.snr, txVector.GetMode (GetStaId (address, txVector)));
+  station->m_rssiAndUpdateTimePair = std::make_pair (rxSignalInfo.rssi, Simulator::Now ());
 }
 
 void
 WifiRemoteStationManager::ReportAmpduTxStatus (Mac48Address address,
-                                               uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus,
+                                               uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus,
                                                double rxSnr, double dataSnr, WifiTxVector dataTxVector)
 {
-  NS_LOG_FUNCTION (this << address << +nSuccessfulMpdus << +nFailedMpdus << rxSnr << dataSnr << dataTxVector);
+  NS_LOG_FUNCTION (this << address << nSuccessfulMpdus << nFailedMpdus << rxSnr << dataSnr << dataTxVector);
   NS_ASSERT (!address.IsGroup ());
   for (uint8_t i = 0; i < nFailedMpdus; i++)
     {
       m_macTxDataFailed (address);
     }
-  DoReportAmpduTxStatus (Lookup (address), nSuccessfulMpdus, nFailedMpdus, rxSnr, dataSnr, dataTxVector.GetChannelWidth (), dataTxVector.GetNss ());
+  DoReportAmpduTxStatus (Lookup (address), nSuccessfulMpdus, nFailedMpdus, rxSnr, dataSnr, dataTxVector.GetChannelWidth (), dataTxVector.GetNss (GetStaId (address, dataTxVector)));
 }
 
 bool
@@ -848,27 +1054,13 @@
   return m_useNonHtProtection;
 }
 
-void
-WifiRemoteStationManager::SetUseGreenfieldProtection (bool enable)
-{
-  NS_LOG_FUNCTION (this << enable);
-  m_useGreenfieldProtection = enable;
-}
-
 bool
-WifiRemoteStationManager::GetUseGreenfieldProtection (void) const
+WifiRemoteStationManager::NeedRetransmission (Ptr<const WifiMacQueueItem> mpdu)
 {
-  return m_useGreenfieldProtection;
-}
-
-bool
-WifiRemoteStationManager::NeedRetransmission (Mac48Address address, const WifiMacHeader *header,
-                                              Ptr<const Packet> packet)
-{
-  NS_LOG_FUNCTION (this << address << packet << *header);
-  NS_ASSERT (!address.IsGroup ());
-  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
-  bool longMpdu = (packet->GetSize () + header->GetSize () + WIFI_MAC_FCS_LENGTH) > m_rtsCtsThreshold;
+  NS_LOG_FUNCTION (this << *mpdu);
+  NS_ASSERT (!mpdu->GetHeader ().GetAddr1 ().IsGroup ());
+  AcIndex ac = QosUtilsMapTidToAc ((mpdu->GetHeader ().IsQosData ()) ? mpdu->GetHeader ().GetQosTid () : 0);
+  bool longMpdu = (mpdu->GetSize () > m_rtsCtsThreshold);
   uint32_t retryCount, maxRetryCount;
   if (longMpdu)
     {
@@ -882,21 +1074,20 @@
     }
   bool normally = retryCount < maxRetryCount;
   NS_LOG_DEBUG ("WifiRemoteStationManager::NeedRetransmission count: " << retryCount << " result: " << std::boolalpha << normally);
-  return DoNeedRetransmission (Lookup (address), packet, normally);
+  return DoNeedRetransmission (Lookup (mpdu->GetHeader ().GetAddr1 ()), mpdu->GetPacket (), normally);
 }
 
 bool
-WifiRemoteStationManager::NeedFragmentation (Mac48Address address, const WifiMacHeader *header,
-                                             Ptr<const Packet> packet)
+WifiRemoteStationManager::NeedFragmentation (Ptr<const WifiMacQueueItem> mpdu)
 {
-  NS_LOG_FUNCTION (this << address << packet << *header);
-  if (address.IsGroup ())
+  NS_LOG_FUNCTION (this << *mpdu);
+  if (mpdu->GetHeader ().GetAddr1 ().IsGroup ())
     {
       return false;
     }
-  bool normally = (packet->GetSize () + header->GetSize () + WIFI_MAC_FCS_LENGTH) > GetFragmentationThreshold ();
+  bool normally = mpdu->GetSize () > GetFragmentationThreshold ();
   NS_LOG_DEBUG ("WifiRemoteStationManager::NeedFragmentation result: " << std::boolalpha << normally);
-  return DoNeedFragmentation (Lookup (address), packet, normally);
+  return DoNeedFragmentation (Lookup (mpdu->GetHeader ().GetAddr1 ()), mpdu->GetPacket (), normally);
 }
 
 void
@@ -909,7 +1100,7 @@
        * ASN.1 encoding of the MAC and PHY MIB (256 ... 8000)
        */
       NS_LOG_WARN ("Fragmentation threshold should be larger than 256. Setting to 256.");
-      m_nextFragmentationThreshold = 256;
+      m_fragmentationThreshold = 256;
     }
   else
     {
@@ -920,21 +1111,15 @@
       if (threshold % 2 != 0)
         {
           NS_LOG_WARN ("Fragmentation threshold should be an even number. Setting to " << threshold - 1);
-          m_nextFragmentationThreshold = threshold - 1;
+          m_fragmentationThreshold = threshold - 1;
         }
       else
         {
-          m_nextFragmentationThreshold = threshold;
+          m_fragmentationThreshold = threshold;
         }
     }
 }
 
-void
-WifiRemoteStationManager::UpdateFragmentationThreshold (void)
-{
-  m_fragmentationThreshold = m_nextFragmentationThreshold;
-}
-
 uint32_t
 WifiRemoteStationManager::DoGetFragmentationThreshold (void) const
 {
@@ -942,14 +1127,14 @@
 }
 
 uint32_t
-WifiRemoteStationManager::GetNFragments (const WifiMacHeader *header, Ptr<const Packet> packet)
+WifiRemoteStationManager::GetNFragments (Ptr<const WifiMacQueueItem> mpdu)
 {
-  NS_LOG_FUNCTION (this << *header << packet);
+  NS_LOG_FUNCTION (this << *mpdu);
   //The number of bytes a fragment can support is (Threshold - WIFI_HEADER_SIZE - WIFI_FCS).
-  uint32_t nFragments = (packet->GetSize () / (GetFragmentationThreshold () - header->GetSize () - WIFI_MAC_FCS_LENGTH));
+  uint32_t nFragments = (mpdu->GetPacket ()->GetSize () / (GetFragmentationThreshold () - mpdu->GetHeader ().GetSize () - WIFI_MAC_FCS_LENGTH));
 
   //If the size of the last fragment is not 0.
-  if ((packet->GetSize () % (GetFragmentationThreshold () - header->GetSize () - WIFI_MAC_FCS_LENGTH)) > 0)
+  if ((mpdu->GetPacket ()->GetSize () % (GetFragmentationThreshold () - mpdu->GetHeader ().GetSize () - WIFI_MAC_FCS_LENGTH)) > 0)
     {
       nFragments++;
     }
@@ -958,12 +1143,11 @@
 }
 
 uint32_t
-WifiRemoteStationManager::GetFragmentSize (Mac48Address address, const WifiMacHeader *header,
-                                           Ptr<const Packet> packet, uint32_t fragmentNumber)
+WifiRemoteStationManager::GetFragmentSize (Ptr<const WifiMacQueueItem> mpdu, uint32_t fragmentNumber)
 {
-  NS_LOG_FUNCTION (this << address << *header << packet << fragmentNumber);
-  NS_ASSERT (!address.IsGroup ());
-  uint32_t nFragment = GetNFragments (header, packet);
+  NS_LOG_FUNCTION (this << *mpdu << fragmentNumber);
+  NS_ASSERT (!mpdu->GetHeader ().GetAddr1 ().IsGroup ());
+  uint32_t nFragment = GetNFragments (mpdu);
   if (fragmentNumber >= nFragment)
     {
       NS_LOG_DEBUG ("WifiRemoteStationManager::GetFragmentSize returning 0");
@@ -972,38 +1156,36 @@
   //Last fragment
   if (fragmentNumber == nFragment - 1)
     {
-      uint32_t lastFragmentSize = packet->GetSize () - (fragmentNumber * (GetFragmentationThreshold () - header->GetSize () - WIFI_MAC_FCS_LENGTH));
+      uint32_t lastFragmentSize = mpdu->GetPacket ()->GetSize () - (fragmentNumber * (GetFragmentationThreshold () - mpdu->GetHeader ().GetSize () - WIFI_MAC_FCS_LENGTH));
       NS_LOG_DEBUG ("WifiRemoteStationManager::GetFragmentSize returning " << lastFragmentSize);
       return lastFragmentSize;
     }
   //All fragments but the last, the number of bytes is (Threshold - WIFI_HEADER_SIZE - WIFI_FCS).
   else
     {
-      uint32_t fragmentSize = GetFragmentationThreshold () - header->GetSize () - WIFI_MAC_FCS_LENGTH;
+      uint32_t fragmentSize = GetFragmentationThreshold () - mpdu->GetHeader ().GetSize () - WIFI_MAC_FCS_LENGTH;
       NS_LOG_DEBUG ("WifiRemoteStationManager::GetFragmentSize returning " << fragmentSize);
       return fragmentSize;
     }
 }
 
 uint32_t
-WifiRemoteStationManager::GetFragmentOffset (Mac48Address address, const WifiMacHeader *header,
-                                             Ptr<const Packet> packet, uint32_t fragmentNumber)
+WifiRemoteStationManager::GetFragmentOffset (Ptr<const WifiMacQueueItem> mpdu, uint32_t fragmentNumber)
 {
-  NS_LOG_FUNCTION (this << address << *header << packet << fragmentNumber);
-  NS_ASSERT (!address.IsGroup ());
-  NS_ASSERT (fragmentNumber < GetNFragments (header, packet));
-  uint32_t fragmentOffset = fragmentNumber * (GetFragmentationThreshold () - header->GetSize () - WIFI_MAC_FCS_LENGTH);
+  NS_LOG_FUNCTION (this << *mpdu << fragmentNumber);
+  NS_ASSERT (!mpdu->GetHeader ().GetAddr1 ().IsGroup ());
+  NS_ASSERT (fragmentNumber < GetNFragments (mpdu));
+  uint32_t fragmentOffset = fragmentNumber * (GetFragmentationThreshold () - mpdu->GetHeader ().GetSize () - WIFI_MAC_FCS_LENGTH);
   NS_LOG_DEBUG ("WifiRemoteStationManager::GetFragmentOffset returning " << fragmentOffset);
   return fragmentOffset;
 }
 
 bool
-WifiRemoteStationManager::IsLastFragment (Mac48Address address, const WifiMacHeader *header,
-                                          Ptr<const Packet> packet, uint32_t fragmentNumber)
+WifiRemoteStationManager::IsLastFragment (Ptr<const WifiMacQueueItem> mpdu, uint32_t fragmentNumber)
 {
-  NS_LOG_FUNCTION (this << address << *header << packet << fragmentNumber);
-  NS_ASSERT (!address.IsGroup ());
-  bool isLast = fragmentNumber == (GetNFragments (header, packet) - 1);
+  NS_LOG_FUNCTION (this << *mpdu << fragmentNumber);
+  NS_ASSERT (!mpdu->GetHeader ().GetAddr1 ().IsGroup ());
+  bool isLast = fragmentNumber == (GetNFragments (mpdu) - 1);
   NS_LOG_DEBUG ("WifiRemoteStationManager::IsLastFragment returning " << std::boolalpha << isLast);
   return isLast;
 }
@@ -1021,6 +1203,26 @@
   return state->m_info;
 }
 
+double
+WifiRemoteStationManager::GetMostRecentRssi (Mac48Address address) const
+{
+  double rssi = 0.0;
+  Time mostRecentUpdateTime = NanoSeconds (0);
+  for (const auto & station : m_stations)
+    {
+      if (station->m_state->m_address == address) //get most recent RSSI irrespective of TID
+        {
+          if (station->m_rssiAndUpdateTimePair.second >= mostRecentUpdateTime)
+            {
+              rssi = station->m_rssiAndUpdateTimePair.first;
+              mostRecentUpdateTime = station->m_rssiAndUpdateTimePair.second;
+            }
+        }
+    }
+  NS_ASSERT (mostRecentUpdateTime.IsStrictlyPositive ());
+  return rssi;
+}
+
 WifiRemoteStationState *
 WifiRemoteStationManager::LookupState (Mac48Address address) const
 {
@@ -1038,6 +1240,9 @@
   state->m_address = address;
   state->m_operationalRateSet.push_back (GetDefaultMode ());
   state->m_operationalMcsSet.push_back (GetDefaultMcs ());
+  state->m_dsssSupported = false;
+  state->m_erpOfdmSupported = false;
+  state->m_ofdmSupported = false;
   state->m_htCapabilities = 0;
   state->m_vhtCapabilities = 0;
   state->m_heCapabilities = 0;
@@ -1066,6 +1271,7 @@
 
   WifiRemoteStation *station = DoCreateStation ();
   station->m_state = state;
+  station->m_rssiAndUpdateTimePair = std::make_pair (0, Seconds (0));
   const_cast<WifiRemoteStationManager *> (this)->m_stations.push_back (station);
   return station;
 }
@@ -1095,10 +1301,9 @@
       state->m_channelWidth = 20;
     }
   SetQosSupport (from, true);
-  for (uint8_t j = 0; j < m_wifiPhy->GetNMcs (); j++)
+  for (const auto & mcs : m_wifiPhy->GetMcsList (WIFI_MOD_CLASS_HT))
     {
-      WifiMode mcs = m_wifiPhy->GetMcs (j);
-      if (mcs.GetModulationClass () == WIFI_MOD_CLASS_HT && htCapabilities.IsSupportedMcs (mcs.GetMcsValue ()))
+      if (htCapabilities.IsSupportedMcs (mcs.GetMcsValue ()))
         {
           AddSupportedMcs (from, mcs);
         }
@@ -1129,10 +1334,9 @@
     }
   for (uint8_t i = 1; i <= m_wifiPhy->GetMaxSupportedTxSpatialStreams (); i++)
     {
-      for (uint8_t j = 0; j < m_wifiPhy->GetNMcs (); j++)
+      for (const auto & mcs : m_wifiPhy->GetMcsList (WIFI_MOD_CLASS_VHT))
         {
-          WifiMode mcs = m_wifiPhy->GetMcs (j);
-          if (mcs.GetModulationClass () == WIFI_MOD_CLASS_VHT && vhtCapabilities.IsSupportedMcs (mcs.GetMcsValue (), i))
+          if (vhtCapabilities.IsSupportedMcs (mcs.GetMcsValue (), i))
             {
               AddSupportedMcs (from, mcs);
             }
@@ -1185,12 +1389,10 @@
     }
   for (uint8_t i = 1; i <= m_wifiPhy->GetMaxSupportedTxSpatialStreams (); i++)
     {
-      for (uint8_t j = 0; j < m_wifiPhy->GetNMcs (); j++)
+      for (const auto & mcs : m_wifiPhy->GetMcsList (WIFI_MOD_CLASS_HE))
         {
-          WifiMode mcs = m_wifiPhy->GetMcs (j);
-          if (mcs.GetModulationClass () == WIFI_MOD_CLASS_HE
-              && heCapabilities.GetHighestNssSupported () >= i
-              && heCapabilities.GetHighestMcsSupported () >= j)
+          if (heCapabilities.GetHighestNssSupported () >= i
+              && heCapabilities.GetHighestMcsSupported () >= mcs.GetMcsValue ())
             {
               AddSupportedMcs (from, mcs);
             }
@@ -1219,18 +1421,6 @@
 }
 
 bool
-WifiRemoteStationManager::GetGreenfieldSupported (Mac48Address address) const
-{
-  Ptr<const HtCapabilities> htCapabilities = LookupState (address)->m_htCapabilities;
-
-  if (!htCapabilities)
-    {
-      return false;
-    }
-  return htCapabilities->GetGreenfield ();
-}
-
-bool
 WifiRemoteStationManager::GetLdpcSupported (Mac48Address address) const
 {
   Ptr<const HtCapabilities> htCapabilities = LookupState (address)->m_htCapabilities;
@@ -1424,7 +1614,7 @@
 }
 
 void
-WifiRemoteStationManager::DoReportAmpduTxStatus (WifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
+WifiRemoteStationManager::DoReportAmpduTxStatus (WifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
 {
   NS_LOG_DEBUG ("DoReportAmpduTxStatus received but the manager does not handle A-MPDUs!");
 }
@@ -1502,18 +1692,6 @@
 }
 
 bool
-WifiRemoteStationManager::GetGreenfield (const WifiRemoteStation *station) const
-{
-  Ptr<const HtCapabilities> htCapabilities = station->m_state->m_htCapabilities;
-
-  if (!htCapabilities)
-    {
-      return false;
-    }
-  return htCapabilities->GetGreenfield ();
-}
-
-bool
 WifiRemoteStationManager::GetAggregation (const WifiRemoteStation *station) const
 {
   return station->m_state->m_aggregation;
@@ -1637,6 +1815,24 @@
 }
 
 bool
+WifiRemoteStationManager::GetDsssSupported (const Mac48Address& address) const
+{
+  return (LookupState (address)->m_dsssSupported);
+}
+
+bool
+WifiRemoteStationManager::GetErpOfdmSupported (const Mac48Address& address) const
+{
+  return (LookupState (address)->m_erpOfdmSupported);
+}
+
+bool
+WifiRemoteStationManager::GetOfdmSupported (const Mac48Address& address) const
+{
+  return (LookupState (address)->m_ofdmSupported);
+}
+
+bool
 WifiRemoteStationManager::GetHtSupported (Mac48Address address) const
 {
   return (LookupState (address)->m_htCapabilities != 0);
@@ -1673,12 +1869,6 @@
 }
 
 bool
-WifiRemoteStationManager::UseGreenfieldForDestination (Mac48Address dest) const
-{
-  return (GetGreenfieldSupported () && GetGreenfieldSupported (dest) && !GetUseGreenfieldProtection ());
-}
-
-bool
 WifiRemoteStationManager::UseLdpcForDestination (Mac48Address dest) const
 {
   return (GetLdpcSupported () && GetLdpcSupported (dest));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-remote-station-manager.h ns-3.34/src/wifi/model/wifi-remote-station-manager.h
--- ns-3.33/src/wifi/model/wifi-remote-station-manager.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-remote-station-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -30,9 +30,9 @@
 #include "wifi-utils.h"
 #include "qos-utils.h"
 #include "wifi-remote-station-info.h"
-#include "ht-capabilities.h"
-#include "vht-capabilities.h"
-#include "he-capabilities.h"
+#include "ns3/ht-capabilities.h"
+#include "ns3/vht-capabilities.h"
+#include "ns3/he-capabilities.h"
 
 namespace ns3 {
 
@@ -40,9 +40,11 @@
 class WifiMac;
 class WifiMacHeader;
 class Packet;
+class WifiMacQueueItem;
 class WifiTxVector;
 
 struct WifiRemoteStationState;
+struct RxSignalInfo;
 
 /**
  * \brief hold per-remote-station state.
@@ -58,7 +60,8 @@
 struct WifiRemoteStation
 {
   virtual ~WifiRemoteStation () {};
-  WifiRemoteStationState *m_state;  //!< Remote station state
+  WifiRemoteStationState *m_state;                 //!< Remote station state
+  std::pair<double, Time> m_rssiAndUpdateTimePair; //!< RSSI (in dBm) of the most recent packet received from the remote station along with update time
 };
 
 /**
@@ -90,10 +93,12 @@
   WifiModeList m_operationalMcsSet;  //!< operational MCS set
   Mac48Address m_address;            //!< Mac48Address of the remote station
   WifiRemoteStationInfo m_info;      //!< remote station info
+  bool m_dsssSupported;              //!< Flag if DSSS is supported by the remote station
+  bool m_erpOfdmSupported;           //!< Flag if ERP OFDM is supported by the remote station
+  bool m_ofdmSupported;              //!< Flag if OFDM is supported by the remote station
   Ptr<const HtCapabilities> m_htCapabilities;   //!< remote station HT capabilities
   Ptr<const VhtCapabilities> m_vhtCapabilities; //!< remote station VHT capabilities
   Ptr<const HeCapabilities> m_heCapabilities;   //!< remote station HE capabilities
-
   uint16_t m_channelWidth;    //!< Channel width (in MHz) supported by the remote station
   uint16_t m_guardInterval;   //!< HE Guard interval duration (in nanoseconds) supported by the remote station
   uint8_t m_ness;             //!< Number of extended spatial streams of the remote station
@@ -153,6 +158,16 @@
   virtual void SetupMac (const Ptr<WifiMac> mac);
 
   /**
+   * Assign a fixed random variable stream number to the random variables
+   * used by this model.  Return the number of streams (possibly zero) that
+   * have been assigned.
+   *
+   * \param stream first stream index to use
+   * \return the number of stream indices assigned by this model
+   */
+  virtual int64_t AssignStreams (int64_t stream);
+
+  /**
    * Sets the maximum STA short retry count (SSRC).
    *
    * \param maxSsrc the maximum SSRC
@@ -184,11 +199,6 @@
    * \param threshold the fragmentation threshold
    */
   void SetFragmentationThreshold (uint32_t threshold);
-  /**
-   * Typically called to update the fragmentation threshold at the start of a new transmission.
-   * This avoid that the fragmentation threshold gets changed during a transmission (see bug 730).
-   */
-  void UpdateFragmentationThreshold (void);
 
   /**
    * Records QoS support of the remote station.
@@ -258,24 +268,6 @@
    */
   bool GetHeSupported (void) const;
   /**
-   * Enable or disable PCF capability support.
-   *
-   * \param enable enable or disable PCF capability support
-   */
-  void SetPcfSupported (bool enable);
-  /**
-   * Return whether the device has PCF capability support enabled.
-   *
-   * \return true if PCF capability support is enabled, false otherwise
-   */
-  bool GetPcfSupported (void) const;
-  /**
-   * Return whether the device has HT Greenfield support enabled.
-   *
-   * \return true if HT Grenfield support is enabled, false otherwise
-   */
-  bool GetGreenfieldSupported (void) const;
-  /**
    * Return whether the device has LDPC support enabled.
    *
    * \return true if LDPC support is enabled, false otherwise
@@ -320,19 +312,6 @@
    */
   bool GetUseNonHtProtection (void) const;
   /**
-   * Enable or disable protection for stations that do not support HT Greenfield format.
-   *
-   * \param enable enable or disable protection for stations that do not support HT Greenfield format
-   */
-  void SetUseGreenfieldProtection (bool enable);
-  /**
-   * Return whether protection for stations that do not support HT Greenfield format is enabled.
-   *
-   * \return true if protection for stations that do not support HT Greenfield is enabled,
-   *         false otherwise
-   */
-  bool GetUseGreenfieldProtection (void) const;
-  /**
    * Enable or disable short PHY preambles.
    *
    * \param enable enable or disable short PHY preambles
@@ -407,15 +386,6 @@
    */
   WifiMode GetNonErpBasicMode (uint8_t i) const;
   /**
-   * Return whether the station supports Greenfield or not.
-   *
-   * \param address the address of the station
-   *
-   * \return true if Greenfield is supported by the station,
-   *         false otherwise
-   */
-  bool GetGreenfieldSupported (Mac48Address address) const;
-  /**
    * Return whether the station supports LDPC or not.
    *
    * \param address the address of the station
@@ -519,6 +489,33 @@
    */
   uint8_t GetNMcsSupported (Mac48Address address) const;
   /**
+   * Return whether the station supports DSSS or not.
+   *
+   * \param address the address of the station
+   *
+   * \return true if DSSS is supported by the station,
+   *         false otherwise
+   */
+  bool GetDsssSupported (const Mac48Address& address) const;
+  /**
+   * Return whether the station supports ERP OFDM or not.
+   *
+   * \param address the address of the station
+   *
+   * \return true if ERP OFDM is supported by the station,
+   *         false otherwise
+   */
+  bool GetErpOfdmSupported (const Mac48Address& address) const;
+  /**
+   * Return whether the station supports OFDM or not.
+   *
+   * \param address the address of the station
+   *
+   * \return true if OFDM is supported by the station,
+   *         false otherwise
+   */
+  bool GetOfdmSupported (const Mac48Address& address) const;
+  /**
    * Return whether the station supports HT or not.
    *
    * \param address the address of the station
@@ -669,6 +666,15 @@
    */
   WifiTxVector GetRtsTxVector (Mac48Address address);
   /**
+   * Return a TXVECTOR for the CTS frame given the destination and the mode of the RTS
+   * used by the sender.
+   *
+   * \param to the MAC address of the CTS receiver
+   * \param rtsTxMode the mode of the RTS used by the sender
+   * \return TXVECTOR for the CTS
+   */
+  WifiTxVector GetCtsTxVector (Mac48Address to, WifiMode rtsTxMode) const;
+  /**
    * Since CTS-to-self parameters are not dependent on the station,
    * it is implemented in wifi remote station manager
    *
@@ -676,72 +682,84 @@
    *         transmission of the data packet itself.
    */
   WifiTxVector GetCtsToSelfTxVector (void);
+  /**
+   * Return a TXVECTOR for the Ack frame given the destination and the mode of the Data
+   * used by the sender.
+   *
+   * \param to the MAC address of the Ack receiver
+   * \param dataTxVector the TXVECTOR of the Data used by the sender
+   * \return TXVECTOR for the Ack
+   */
+  WifiTxVector GetAckTxVector (Mac48Address to, const WifiTxVector& dataTxVector) const;
+  /**
+   * Return a TXVECTOR for the BlockAck frame given the destination and the mode of the Data
+   * used by the sender.
+   *
+   * \param to the MAC address of the BlockAck receiver
+   * \param dataTxVector the TXVECTOR of the Data used by the sender
+   * \return TXVECTOR for the BlockAck
+   */
+  WifiTxVector GetBlockAckTxVector (Mac48Address to, const WifiTxVector& dataTxVector) const;
+  /**
+   * Get control answer mode function.
+   *
+   * \param reqMode request mode
+   * \return control answer mode
+   */
+  WifiMode GetControlAnswerMode (WifiMode reqMode) const;
 
   /**
    * Should be invoked whenever the RtsTimeout associated to a transmission
    * attempt expires.
    *
-   * \param address the address of the receiver
    * \param header MAC header of the DATA packet
    */
-  void ReportRtsFailed (Mac48Address address, const WifiMacHeader *header);
+  void ReportRtsFailed (const WifiMacHeader& header);
   /**
    * Should be invoked whenever the AckTimeout associated to a transmission
    * attempt expires.
    *
-   * \param address the address of the receiver
-   * \param header MAC header of the DATA packet
-   * \param packetSize the size of the DATA packet
+   * \param mpdu the MPDU whose transmission failed
    */
-  void ReportDataFailed (Mac48Address address, const WifiMacHeader *header,
-                         uint32_t packetSize);
+  void ReportDataFailed (Ptr<const WifiMacQueueItem> mpdu);
   /**
    * Should be invoked whenever we receive the CTS associated to an RTS
    * we just sent. Note that we also get the SNR of the RTS we sent since
    * the receiver put a SnrTag in the CTS.
    *
-   * \param address the address of the receiver
    * \param header MAC header of the DATA packet
    * \param ctsSnr the SNR of the CTS we received
    * \param ctsMode the WifiMode the receiver used to send the CTS
    * \param rtsSnr the SNR of the RTS we sent
    */
-  void ReportRtsOk (Mac48Address address, const WifiMacHeader *header,
+  void ReportRtsOk (const WifiMacHeader& header,
                     double ctsSnr, WifiMode ctsMode, double rtsSnr);
   /**
    * Should be invoked whenever we receive the ACK associated to a data packet
    * we just sent.
    *
-   * \param address the address of the receiver
-   * \param header MAC header of the DATA packet
+   * \param mpdu the MPDU
    * \param ackSnr the SNR of the ACK we received
    * \param ackMode the WifiMode the receiver used to send the ACK
    * \param dataSnr the SNR of the DATA we sent
    * \param dataTxVector the TXVECTOR of the DATA we sent
-   * \param packetSize the size of the DATA packet
    */
-  void ReportDataOk (Mac48Address address, const WifiMacHeader *header,
-                     double ackSnr, WifiMode ackMode,
-                     double dataSnr, WifiTxVector dataTxVector,
-                     uint32_t packetSize);
+  void ReportDataOk (Ptr<const WifiMacQueueItem> mpdu, double ackSnr,
+                     WifiMode ackMode, double dataSnr, WifiTxVector dataTxVector);
   /**
    * Should be invoked after calling ReportRtsFailed if
    * NeedRetransmission returns false
    *
-   * \param address the address of the receiver
    * \param header MAC header of the DATA packet
    */
-  void ReportFinalRtsFailed (Mac48Address address, const WifiMacHeader *header);
+  void ReportFinalRtsFailed (const WifiMacHeader& header);
   /**
    * Should be invoked after calling ReportDataFailed if
    * NeedRetransmission returns false
    *
-   * \param address the address of the receiver
-   * \param header MAC header of the DATA packet
-   * \param packetSize the size of the DATA packet
+   * \param mpdu the MPDU which was discarded
    */
-  void ReportFinalDataFailed (Mac48Address address, const WifiMacHeader *header,
-                              uint32_t packetSize);
+  void ReportFinalDataFailed (Ptr<const WifiMacQueueItem> mpdu);
   /**
    * Typically called per A-MPDU, either when a Block ACK was successfully
    * received or when a BlockAckTimeout has elapsed.
@@ -754,17 +772,17 @@
    * \param dataSnr data SNR reported by remote station
    * \param dataTxVector the TXVECTOR of the MPDUs we sent
    */
-  void ReportAmpduTxStatus (Mac48Address address, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus,
+  void ReportAmpduTxStatus (Mac48Address address, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus,
                             double rxSnr, double dataSnr, WifiTxVector dataTxVector);
 
   /**
    * \param address remote address
-   * \param rxSnr the SNR of the packet received
-   * \param txMode the transmission mode used for the packet received
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+   * \param txVector the TXVECTOR used for the packet received
    *
    * Should be invoked whenever a packet is successfully received.
    */
-  void ReportRxOk (Mac48Address address, double rxSnr, WifiMode txMode);
+  void ReportRxOk (Mac48Address address, RxSignalInfo rxSignalInfo, WifiTxVector txVector);
 
   /**
    * \param header MAC header
@@ -785,55 +803,40 @@
   bool NeedCtsToSelf (WifiTxVector txVector);
 
   /**
-   * \param address remote address
-   * \param header MAC header
-   * \param packet the packet to send
+   * \param mpdu the MPDU to send
    *
    * \return true if we want to resend a packet after a failed transmission attempt,
    *         false otherwise.
    */
-  bool NeedRetransmission (Mac48Address address, const WifiMacHeader *header,
-                           Ptr<const Packet> packet);
+  bool NeedRetransmission (Ptr<const WifiMacQueueItem> mpdu);
   /**
-   * \param address remote address
-   * \param header MAC header
-   * \param packet the packet to send
+   * \param mpdu the MPDU to send
    *
    * \return true if this packet should be fragmented,
    *         false otherwise.
    */
-  bool NeedFragmentation (Mac48Address address, const WifiMacHeader *header,
-                          Ptr<const Packet> packet);
+  bool NeedFragmentation (Ptr<const WifiMacQueueItem> mpdu);
   /**
-   * \param address remote address
-   * \param header MAC header
-   * \param packet the packet to send
+   * \param mpdu the MPDU to send
    * \param fragmentNumber the fragment index of the next fragment to send (starts at zero).
    *
    * \return the size of the corresponding fragment.
    */
-  uint32_t GetFragmentSize (Mac48Address address, const WifiMacHeader *header,
-                            Ptr<const Packet> packet, uint32_t fragmentNumber);
+  uint32_t GetFragmentSize (Ptr<const WifiMacQueueItem> mpdu, uint32_t fragmentNumber);
   /**
-   * \param address remote address
-   * \param header MAC header
-   * \param packet the packet to send
+   * \param mpdu the packet to send
    * \param fragmentNumber the fragment index of the next fragment to send (starts at zero).
    *
    * \return the offset within the original packet where this fragment starts.
    */
-  uint32_t GetFragmentOffset (Mac48Address address, const WifiMacHeader *header,
-                              Ptr<const Packet> packet, uint32_t fragmentNumber);
+  uint32_t GetFragmentOffset (Ptr<const WifiMacQueueItem> mpdu, uint32_t fragmentNumber);
   /**
-   * \param address remote address
-   * \param header MAC header
-   * \param packet the packet to send
+   * \param mpdu the packet to send
    * \param fragmentNumber the fragment index of the next fragment to send (starts at zero).
    *
    * \return true if this is the last fragment, false otherwise.
    */
-  bool IsLastFragment (Mac48Address address, const WifiMacHeader *header,
-                       Ptr<const Packet> packet, uint32_t fragmentNumber);
+  bool IsLastFragment (Ptr<const WifiMacQueueItem> mpdu, uint32_t fragmentNumber);
 
   /**
    * \return the default transmission power
@@ -846,6 +849,16 @@
    */
   WifiRemoteStationInfo GetInfo (Mac48Address address);
   /**
+   * \param address of the remote station
+   *
+   * \return the RSSI (in dBm) of the most recent packet received from the remote station (irrespective of TID)
+   *
+   * This method is typically used when the device needs
+   * to estimate the target UL RSSI info to put in the
+   * Trigger frame to send to the remote station.
+   */
+  double GetMostRecentRssi (Mac48Address address) const;
+  /**
    * Set the default transmission power level
    *
    * \param txPower the default transmission power level
@@ -860,14 +873,6 @@
    */
   uint8_t GetMaxNumberOfTransmitStreams (void) const;
   /**
-   * \returns whether HT greenfield should be used for a given destination address.
-   *
-   * \param dest the destination address
-   *
-   * \return whether HT greenfield should be used for a given destination address
-   */
-  bool UseGreenfieldForDestination (Mac48Address dest) const;
-  /**
    * \returns whether LDPC should be used for a given destination address.
    *
    * \param dest the destination address
@@ -894,6 +899,19 @@
    */
   typedef void (*RateChangeTracedCallback)(DataRate oldRate, DataRate newRate, Mac48Address remoteAddress);
 
+  /**
+   * Return the WifiPhy.
+   *
+   * \return a pointer to the WifiPhy
+   */
+  Ptr<WifiPhy> GetPhy (void) const;
+  /**
+   * Return the WifiMac.
+   *
+   * \return a pointer to the WifiMac
+   */
+  Ptr<WifiMac> GetMac (void) const;
+
 
 protected:
   virtual void DoDispose (void);
@@ -1027,15 +1045,6 @@
    *         false otherwise
    */
   bool GetAggregation (const WifiRemoteStation *station) const;
-  /**
-   * Return whether the station supports Greenfield or not.
-   *
-   * \param station the station being queried
-   *
-   * \return true if Greenfield is supported by the station,
-   *         false otherwise
-   */
-  bool GetGreenfield (const WifiRemoteStation *station) const;
 
   /**
    * Return the number of supported streams the station has.
@@ -1054,21 +1063,19 @@
    */
   uint8_t GetNess (const WifiRemoteStation *station) const;
 
+
+private:
   /**
-   * Return the WifiPhy.
+   * If the given TXVECTOR is used for a MU transmission, return the STAID of
+   * the station with the given address if we are an AP or our own STAID if we
+   * are a STA associated with some AP. Otherwise, return SU_STA_ID.
    *
-   * \return a pointer to the WifiPhy
-   */
-  Ptr<WifiPhy> GetPhy (void) const;
-  /**
-   * Return the WifiMac.
-   *
-   * \return a pointer to the WifiMac
+   * \param address the address of the station
+   * \param txVector the TXVECTOR used for a MU transmission
+   * \return the STA-ID of the station
    */
-  Ptr<WifiMac> GetMac (void) const;
+  uint16_t GetStaId (Mac48Address address, const WifiTxVector& txVector) const;
 
-
-private:
   /**
    * \param station the station that we need to communicate
    * \param size the size of the frame to send in bytes
@@ -1208,7 +1215,7 @@
    * \param dataChannelWidth the channel width (in MHz) of the A-MPDU we sent
    * \param dataNss the number of spatial streams used to send the A-MPDU
    */
-  virtual void DoReportAmpduTxStatus (WifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus,
+  virtual void DoReportAmpduTxStatus (WifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus,
                                       double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss);
 
   /**
@@ -1243,12 +1250,11 @@
   /**
    * Return the number of fragments needed for the given packet.
    *
-   * \param header MAC header
-   * \param packet the packet to be fragmented
+   * \param mpdu the packet to be fragmented
    *
    * \return the number of fragments needed
    */
-  uint32_t GetNFragments (const WifiMacHeader *header, Ptr<const Packet> packet);
+  uint32_t GetNFragments (Ptr<const WifiMacQueueItem> mpdu);
 
   /**
    * This is a pointer to the WifiPhy associated with this
@@ -1285,17 +1291,14 @@
   WifiMode m_defaultTxMode; //!< The default transmission mode
   WifiMode m_defaultTxMcs;  //!< The default transmission modulation-coding scheme (MCS)
 
-  bool m_pcfSupported; //!< Flag if PCF capability is supported
   uint32_t m_maxSsrc;  //!< Maximum STA short retry count (SSRC)
   uint32_t m_maxSlrc;  //!< Maximum STA long retry count (SLRC)
   uint32_t m_rtsCtsThreshold;             //!< Threshold for RTS/CTS
   uint32_t m_fragmentationThreshold;      //!< Current threshold for fragmentation
-  uint32_t m_nextFragmentationThreshold;  //!< Threshold for fragmentation that will be used for the next transmission
   uint8_t m_defaultTxPowerLevel;          //!< Default transmission power level
   WifiMode m_nonUnicastMode;      //!< Transmission mode for non-unicast Data frames
   bool m_useNonErpProtection;     //!< flag if protection for non-ERP stations against ERP transmissions is enabled
   bool m_useNonHtProtection;      //!< flag if protection for non-HT stations against HT transmissions is enabled
-  bool m_useGreenfieldProtection; //!< flag if protection for stations that do not support HT Greenfield format is enabled
   bool m_shortPreambleEnabled;    //!< flag if short PHY preamble is enabled
   bool m_shortSlotTimeEnabled;    //!< flag if short slot time is enabled
   ProtectionMode m_erpProtectionMode; //!< Protection mode for ERP stations when non-ERP stations are detected
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-spectrum-phy-interface.cc ns-3.34/src/wifi/model/wifi-spectrum-phy-interface.cc
--- ns-3.33/src/wifi/model/wifi-spectrum-phy-interface.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-spectrum-phy-interface.cc	2021-07-14 10:31:07.000000000 -0700
@@ -66,7 +66,7 @@
 }
 
 Ptr<MobilityModel>
-WifiSpectrumPhyInterface::GetMobility ()
+WifiSpectrumPhyInterface::GetMobility () const
 {
   return m_spectrumWifiPhy->GetMobility ();
 }
@@ -97,7 +97,7 @@
 }
 
 Ptr<AntennaModel>
-WifiSpectrumPhyInterface::GetRxAntenna (void)
+WifiSpectrumPhyInterface::GetRxAntenna (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_spectrumWifiPhy->GetRxAntenna ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-spectrum-phy-interface.h ns-3.34/src/wifi/model/wifi-spectrum-phy-interface.h
--- ns-3.33/src/wifi/model/wifi-spectrum-phy-interface.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-spectrum-phy-interface.h	2021-07-14 10:31:07.000000000 -0700
@@ -53,19 +53,19 @@
    */
   void SetSpectrumWifiPhy (const Ptr<SpectrumWifiPhy> phy);
 
-  // Inherited from SpectrumPhy
-  Ptr<NetDevice> GetDevice () const;
-  void SetDevice (const Ptr<NetDevice> d);
-  void SetMobility (const Ptr<MobilityModel> m);
-  Ptr<MobilityModel> GetMobility ();
-  void SetChannel (const Ptr<SpectrumChannel> c);
-  Ptr<const SpectrumModel> GetRxSpectrumModel () const;
-  Ptr<AntennaModel> GetRxAntenna ();
-  void StartRx (Ptr<SpectrumSignalParameters> params);
+  Ptr<NetDevice> GetDevice () const override;
+  void SetDevice (const Ptr<NetDevice> d) override;
+  void SetMobility (const Ptr<MobilityModel> m) override;
+  Ptr<MobilityModel> GetMobility () const override;
+  void SetChannel (const Ptr<SpectrumChannel> c) override;
+  Ptr<const SpectrumModel> GetRxSpectrumModel () const override;
+  Ptr<AntennaModel> GetRxAntenna () const override;
+  void StartRx (Ptr<SpectrumSignalParameters> params) override;
 
 
 private:
-  virtual void DoDispose (void);
+  void DoDispose (void) override;
+
   Ptr<SpectrumWifiPhy> m_spectrumWifiPhy; ///< spectrum PHY
   Ptr<NetDevice> m_netDevice; ///< the device
   Ptr<SpectrumChannel> m_channel; ///< spectrum channel
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-spectrum-signal-parameters.h ns-3.34/src/wifi/model/wifi-spectrum-signal-parameters.h
--- ns-3.33/src/wifi/model/wifi-spectrum-signal-parameters.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-spectrum-signal-parameters.h	2021-07-14 10:31:07.000000000 -0700
@@ -36,8 +36,7 @@
 struct WifiSpectrumSignalParameters : public SpectrumSignalParameters
 {
 
-  // inherited from SpectrumSignalParameters
-  virtual Ptr<SpectrumSignalParameters> Copy ();
+  Ptr<SpectrumSignalParameters> Copy () override;
 
   /**
    * default constructor
@@ -51,7 +50,7 @@
    */
   WifiSpectrumSignalParameters (const WifiSpectrumSignalParameters& p);
 
-  Ptr<WifiPpdu> ppdu; ///< The PPDU being transmitted
+  Ptr<WifiPpdu> ppdu;                  ///< The PPDU being transmitted
 };
 
 }  // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-standards.h ns-3.34/src/wifi/model/wifi-standards.h
--- ns-3.33/src/wifi/model/wifi-standards.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-standards.h	2021-07-14 10:31:07.000000000 -0700
@@ -23,6 +23,7 @@
 
 #include <map>
 #include "wifi-phy-band.h"
+#include "ns3/abort.h"
 
 namespace ns3 {
 
@@ -46,12 +47,6 @@
   WIFI_PHY_STANDARD_80211_5MHZ,
   /** OFDM PHY (Clause 17 - amendment for 10 MHz and 5 MHz channels) */
   WIFI_PHY_STANDARD_80211p,
-  /** This is intended to be the configuration used in this paper:
-   *  Gavin Holland, Nitin Vaidya and Paramvir Bahl, "A Rate-Adaptive
-   *  MAC Protocol for Multi-Hop Wireless Networks", in Proc. of
-   *  ACM MOBICOM, 2001.
-   */
-  WIFI_PHY_STANDARD_holland,
   /** HT PHY for the 2.4 GHz band (clause 20) */
   /** this value is NS_DEPRECATED_3_32 */
   WIFI_PHY_STANDARD_80211n_2_4GHZ,
@@ -87,8 +82,6 @@
       return (os << "802.11g");
     case WIFI_PHY_STANDARD_80211p:
       return (os << "802.11p");
-    case WIFI_PHY_STANDARD_holland:
-      return (os << "802.11a-holland");
     case WIFI_PHY_STANDARD_80211n:
       return (os << "802.11n");
     case WIFI_PHY_STANDARD_80211ac:
@@ -147,7 +140,6 @@
   WIFI_STANDARD_80211b,
   WIFI_STANDARD_80211g,
   WIFI_STANDARD_80211p,
-  WIFI_STANDARD_holland,
   WIFI_STANDARD_80211n_2_4GHZ,
   WIFI_STANDARD_80211n_5GHZ,
   WIFI_STANDARD_80211ac,
@@ -175,8 +167,6 @@
       return (os << "802.11g");
     case WIFI_STANDARD_80211p:
       return (os << "802.11p");
-    case WIFI_STANDARD_holland:
-      return (os << "802.11a-holland");
     case WIFI_STANDARD_80211n_2_4GHZ:
       return (os << "802.11n-2.4GHz");
     case WIFI_STANDARD_80211n_5GHZ:
@@ -187,6 +177,8 @@
       return (os << "802.11ax-2.4GHz");
     case WIFI_STANDARD_80211ax_5GHZ:
       return (os << "802.11ax-5GHz");
+    case WIFI_STANDARD_80211ax_6GHZ:
+      return (os << "802.11ax-6GHz");
     default:
       return (os << "UNSPECIFIED");
     }
@@ -197,9 +189,9 @@
  */
 struct WifiStandardInfo
 {
-  WifiPhyStandard phyStandard;
-  WifiPhyBand phyBand;
-  WifiMacStandard macStandard;
+  WifiPhyStandard phyStandard; //!< the PHY standard
+  WifiPhyBand phyBand;         //!< the PHY band
+  WifiMacStandard macStandard; //!< the MAC standard
 };
 
 /**
@@ -211,7 +203,6 @@
   { WIFI_STANDARD_80211b, { WIFI_PHY_STANDARD_80211b, WIFI_PHY_BAND_2_4GHZ, WIFI_MAC_STANDARD_80211 } },
   { WIFI_STANDARD_80211g, { WIFI_PHY_STANDARD_80211g, WIFI_PHY_BAND_2_4GHZ, WIFI_MAC_STANDARD_80211 } },
   { WIFI_STANDARD_80211p, { WIFI_PHY_STANDARD_80211p, WIFI_PHY_BAND_5GHZ, WIFI_MAC_STANDARD_80211 } },
-  { WIFI_STANDARD_holland, { WIFI_PHY_STANDARD_holland, WIFI_PHY_BAND_5GHZ, WIFI_MAC_STANDARD_80211 } },
   { WIFI_STANDARD_80211n_2_4GHZ, { WIFI_PHY_STANDARD_80211n, WIFI_PHY_BAND_2_4GHZ, WIFI_MAC_STANDARD_80211n } },
   { WIFI_STANDARD_80211n_5GHZ, { WIFI_PHY_STANDARD_80211n, WIFI_PHY_BAND_5GHZ, WIFI_MAC_STANDARD_80211n } },
   { WIFI_STANDARD_80211ac, { WIFI_PHY_STANDARD_80211ac, WIFI_PHY_BAND_5GHZ, WIFI_MAC_STANDARD_80211ac } },
@@ -220,6 +211,88 @@
   { WIFI_STANDARD_80211ax_6GHZ, { WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_6GHZ, WIFI_MAC_STANDARD_80211ax } }
 };
 
+/**
+ * \ingroup wifi
+ * \brief Enumeration of frequency channel types
+ */
+enum FrequencyChannelType : uint8_t
+{
+  WIFI_PHY_DSSS_CHANNEL = 0,
+  WIFI_PHY_OFDM_CHANNEL,
+  WIFI_PHY_80211p_CHANNEL
+};
+
+/**
+ * Get the type of the frequency channel for the given PHY standard
+ *
+ * \param standard the PHY standard
+ * \return the type of the frequency channel for the given PHY standard
+ */
+inline FrequencyChannelType GetFrequencyChannelType (WifiPhyStandard standard)
+{
+  switch (standard)
+    {
+      case WIFI_PHY_STANDARD_80211b:
+        return WIFI_PHY_DSSS_CHANNEL;
+      case WIFI_PHY_STANDARD_80211p:
+        return WIFI_PHY_80211p_CHANNEL;
+      default:
+        return WIFI_PHY_OFDM_CHANNEL;
+    }
+}
+
+/**
+ * Get the maximum channel width in MHz allowed for the given PHY standard.
+ *
+ * \param standard the PHY standard
+ * \return the maximum channel width in MHz allowed for the given PHY standard
+ */
+inline uint16_t GetMaximumChannelWidth (WifiPhyStandard standard)
+{
+  switch (standard)
+    {
+      case WIFI_PHY_STANDARD_80211b:
+        return 22;
+      case WIFI_PHY_STANDARD_80211p:
+        return 10;
+      case WIFI_PHY_STANDARD_80211a:
+      case WIFI_PHY_STANDARD_80211g:
+        return 20;
+      case WIFI_PHY_STANDARD_80211n:
+        return 40;
+      case WIFI_PHY_STANDARD_80211ac:
+      case WIFI_PHY_STANDARD_80211ax:
+        return 160;
+      default:
+        NS_ABORT_MSG ("Unknown standard: " << standard);
+        return 0;
+    }
+}
+
+/**
+ * Get the default channel width for the given PHY standard and band.
+ *
+ * \param standard the given PHY standard
+ * \param band the given PHY band
+ * \return the default channel width (MHz) for the given PHY standard
+ */
+inline uint16_t GetDefaultChannelWidth (WifiPhyStandard standard, WifiPhyBand band)
+{
+  switch (standard)
+    {
+    case WIFI_PHY_STANDARD_80211b:
+      return 22;
+    case WIFI_PHY_STANDARD_80211p:
+      return 10;
+    case WIFI_PHY_STANDARD_80211ac:
+      return 80;
+    case WIFI_PHY_STANDARD_80211ax:
+      return (band == WIFI_PHY_BAND_2_4GHZ ? 20 : 80);
+    default:
+      return 20;
+    }
+}
+
 } //namespace ns3
 
 #endif /* WIFI_STANDARD_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-tx-parameters.cc ns-3.34/src/wifi/model/wifi-tx-parameters.cc
--- ns-3.33/src/wifi/model/wifi-tx-parameters.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-tx-parameters.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,274 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "wifi-tx-parameters.h"
+#include "wifi-mac-queue-item.h"
+#include "wifi-mac-trailer.h"
+#include "msdu-aggregator.h"
+#include "mpdu-aggregator.h"
+#include "wifi-protection.h"
+#include "wifi-acknowledgment.h"
+#include "ns3/packet.h"
+#include "ns3/log.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("WifiTxParameters");
+
+WifiTxParameters::WifiTxParameters ()
+{
+}
+
+WifiTxParameters::WifiTxParameters (const WifiTxParameters& txParams)
+{
+  m_txVector = txParams.m_txVector;
+  m_protection = (txParams.m_protection ? txParams.m_protection->Copy () : nullptr);
+  m_acknowledgment = (txParams.m_acknowledgment ? txParams.m_acknowledgment->Copy () : nullptr);
+  m_txDuration = txParams.m_txDuration;
+  m_info = txParams.m_info;
+}
+
+WifiTxParameters&
+WifiTxParameters::operator= (const WifiTxParameters& txParams)
+{
+  // check for self-assignment
+  if (&txParams == this)
+    {
+      return *this;
+    }
+
+  m_txVector = txParams.m_txVector;
+  m_protection = (txParams.m_protection ? txParams.m_protection->Copy () : nullptr);
+  m_acknowledgment = (txParams.m_acknowledgment ? txParams.m_acknowledgment->Copy () : nullptr);
+  m_txDuration = txParams.m_txDuration;
+  m_info = txParams.m_info;
+
+  return *this;
+}
+
+void
+WifiTxParameters::Clear (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  // Reset the current info
+  m_info.clear ();
+  m_txVector = WifiTxVector ();
+  m_protection.reset (nullptr);
+  m_acknowledgment.reset (nullptr);
+  m_txDuration = Time::Min ();
+}
+
+const WifiTxParameters::PsduInfo*
+WifiTxParameters::GetPsduInfo (Mac48Address receiver) const
+{
+  auto infoIt = m_info.find (receiver);
+
+  if (infoIt == m_info.end ())
+    {
+      return nullptr;
+    }
+  return &infoIt->second;
+}
+
+const WifiTxParameters::PsduInfoMap&
+WifiTxParameters::GetPsduInfoMap (void) const
+{
+  return m_info;
+}
+
+void
+WifiTxParameters::AddMpdu (Ptr<const WifiMacQueueItem> mpdu)
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+
+  const WifiMacHeader& hdr = mpdu->GetHeader ();
+
+  auto infoIt = m_info.find (hdr.GetAddr1 ());
+
+  if (infoIt == m_info.end ())
+    {
+      // this is an MPDU starting a new PSDU
+      std::map<uint8_t, std::set<uint16_t>> seqNumbers;
+      if (hdr.IsQosData ())
+        {
+          seqNumbers[hdr.GetQosTid ()] = {hdr.GetSequenceNumber ()};
+        }
+
+      // Insert the info about the given frame
+      m_info.emplace (hdr.GetAddr1 (),
+                      PsduInfo {hdr, mpdu->GetPacketSize (), 0, seqNumbers});
+      return;
+    }
+
+  // a PSDU for the receiver of the given MPDU is already being built
+  NS_ASSERT_MSG ((hdr.IsQosData () && !hdr.HasData ()) || infoIt->second.amsduSize > 0,
+                 "An MPDU can only be aggregated to an existing (A-)MPDU");
+
+  // The (A-)MSDU being built is included in an A-MPDU subframe
+  infoIt->second.ampduSize = MpduAggregator::GetSizeIfAggregated (infoIt->second.header.GetSize ()
+                                                                  + infoIt->second.amsduSize
+                                                                  + WIFI_MAC_FCS_LENGTH,
+                                                                  infoIt->second.ampduSize);
+  infoIt->second.header = hdr;
+  infoIt->second.amsduSize = mpdu->GetPacketSize ();
+
+  if (hdr.IsQosData ())
+    {
+      auto ret = infoIt->second.seqNumbers.emplace (hdr.GetQosTid (),
+                                                    std::set<uint16_t> {hdr.GetSequenceNumber ()});
+      
+      if (!ret.second)
+        {
+          // insertion did not happen because an entry with the same TID already exists
+          ret.first->second.insert (hdr.GetSequenceNumber ());
+        }
+    }
+}
+
+uint32_t
+WifiTxParameters::GetSizeIfAddMpdu (Ptr<const WifiMacQueueItem> mpdu) const
+{
+  NS_LOG_FUNCTION (this << *mpdu);
+
+  auto infoIt = m_info.find (mpdu->GetHeader ().GetAddr1 ());
+
+  if (infoIt == m_info.end ())
+    {
+      // this is an MPDU starting a new PSDU
+      if (m_txVector.GetModulationClass () >= WIFI_MOD_CLASS_VHT)
+        {
+          // All MPDUs are sent with the A-MPDU structure
+          return MpduAggregator::GetSizeIfAggregated (mpdu->GetSize (), 0);
+        }
+      return mpdu->GetSize ();
+    }
+
+  // aggregate the (A-)MSDU being built to the existing A-MPDU (if any)
+  uint32_t ampduSize = MpduAggregator::GetSizeIfAggregated (infoIt->second.header.GetSize ()
+                                                            + infoIt->second.amsduSize
+                                                            + WIFI_MAC_FCS_LENGTH,
+                                                            infoIt->second.ampduSize);
+  // aggregate the new MPDU to the A-MPDU
+  return MpduAggregator::GetSizeIfAggregated (mpdu->GetSize (), ampduSize);
+}
+
+void
+WifiTxParameters::AggregateMsdu (Ptr<const WifiMacQueueItem> msdu)
+{
+  NS_LOG_FUNCTION (this << *msdu);
+
+  auto infoIt = m_info.find (msdu->GetHeader ().GetAddr1 ());
+  NS_ASSERT_MSG (infoIt != m_info.end (),
+                 "There must be already an MPDU addressed to the same receiver");
+
+  infoIt->second.amsduSize = GetSizeIfAggregateMsdu (msdu).first;
+  infoIt->second.header.SetQosAmsdu ();
+}
+
+std::pair<uint32_t, uint32_t>
+WifiTxParameters::GetSizeIfAggregateMsdu (Ptr<const WifiMacQueueItem> msdu) const
+{
+  NS_LOG_FUNCTION (this << *msdu);
+
+  NS_ASSERT_MSG (msdu->GetHeader ().IsQosData (), "Can only aggregate a QoS data frame to an A-MSDU");
+
+  auto infoIt = m_info.find (msdu->GetHeader ().GetAddr1 ());
+  NS_ASSERT_MSG (infoIt != m_info.end (),
+                 "There must be already an MPDU addressed to the same receiver");
+
+  NS_ASSERT_MSG (infoIt->second.amsduSize > 0,
+                 "The amsduSize should be set to the size of the previous MSDU(s)");
+  NS_ASSERT_MSG (infoIt->second.header.IsQosData (),
+                 "The MPDU being built for this receiver must be a QoS data frame");
+  NS_ASSERT_MSG (infoIt->second.header.GetQosTid () == msdu->GetHeader ().GetQosTid (),
+                 "The MPDU being built must belong to the same TID as the MSDU to aggregate");
+  NS_ASSERT_MSG (infoIt->second.seqNumbers.find (msdu->GetHeader ().GetQosTid ()) != infoIt->second.seqNumbers.end (),
+                 "At least one MPDU with the same TID must have been added previously");
+
+  // all checks passed
+  uint32_t currAmsduSize = infoIt->second.amsduSize;
+
+  if (!infoIt->second.header.IsQosAmsdu ())
+    {
+      // consider the A-MSDU subframe for the first MSDU
+      currAmsduSize = MsduAggregator::GetSizeIfAggregated (currAmsduSize, 0);
+    }
+
+  uint32_t newAmsduSize = MsduAggregator::GetSizeIfAggregated (msdu->GetPacket ()->GetSize (), currAmsduSize);
+  uint32_t newMpduSize = infoIt->second.header.GetSize () + newAmsduSize + WIFI_MAC_FCS_LENGTH;
+
+  if (infoIt->second.ampduSize > 0 || m_txVector.GetModulationClass () >= WIFI_MOD_CLASS_VHT)
+    {
+      return {newAmsduSize, MpduAggregator::GetSizeIfAggregated (newMpduSize, infoIt->second.ampduSize)};
+    }
+  
+  return {newAmsduSize, newMpduSize};
+}
+
+uint32_t
+WifiTxParameters::GetSize (Mac48Address receiver) const
+{
+  NS_LOG_FUNCTION (this << receiver);
+
+  auto infoIt = m_info.find (receiver);
+
+  if (infoIt == m_info.end ())
+    {
+      return 0;
+    }
+
+  uint32_t newMpduSize = infoIt->second.header.GetSize () + infoIt->second.amsduSize + WIFI_MAC_FCS_LENGTH;
+
+  if (infoIt->second.ampduSize > 0 || m_txVector.GetModulationClass () >= WIFI_MOD_CLASS_VHT)
+    {
+      return MpduAggregator::GetSizeIfAggregated (newMpduSize, infoIt->second.ampduSize);
+    }
+  
+  return newMpduSize;  
+}
+
+void
+WifiTxParameters::Print (std::ostream& os) const
+{
+  os << "TXVECTOR=" << m_txVector;
+  if (m_protection)
+    {
+      os << ", Protection=" << m_protection.get ();
+    }
+  if (m_acknowledgment)
+    {
+      os << ", Acknowledgment=" << m_acknowledgment.get ();
+    }
+  os << ", PSDUs:";
+  for (const auto& info : m_info)
+    {
+      os << " [To=" << info.second.header.GetAddr1 () << ", A-MSDU size="
+         << info.second.amsduSize << ", A-MPDU size=" << info.second.ampduSize << "]";
+    }
+}
+
+std::ostream & operator << (std::ostream &os, const WifiTxParameters* txParams)
+{
+  txParams->Print (os);
+  return os;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-tx-parameters.h ns-3.34/src/wifi/model/wifi-tx-parameters.h
--- ns-3.33/src/wifi/model/wifi-tx-parameters.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-tx-parameters.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,166 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef WIFI_TX_PARAMETERS_H
+#define WIFI_TX_PARAMETERS_H
+
+#include "wifi-tx-vector.h"
+#include "wifi-mac-header.h"
+#include "ns3/nstime.h"
+#include <map>
+#include <set>
+#include <memory>
+
+namespace ns3 {
+
+class WifiMacQueueItem;
+struct WifiProtection;
+struct WifiAcknowledgment;
+
+/**
+ * \ingroup wifi
+ *
+ * This class stores the TX parameters (TX vector, protection mechanism,
+ * acknowledgment mechanism, TX duration, ...) for a frame of different types
+ * (MPDU, A-MPDU, multi-TID A-MPDU, MU PPDU, ...).
+ */
+class WifiTxParameters
+{
+public:
+  WifiTxParameters ();
+  /**
+   * Copy constructor.
+   *
+   * \param txParams the WifiTxParameters to copy
+   */
+  WifiTxParameters (const WifiTxParameters& txParams);
+
+  /**
+   * Copy assignment operator.
+   * \param txParams the TX parameters to assign to this object
+   * \return the reference to this object
+   */
+  WifiTxParameters& operator= (const WifiTxParameters& txParams);
+
+  WifiTxVector m_txVector;                               //!< TXVECTOR of the frame being prepared
+  std::unique_ptr<WifiProtection> m_protection;          //!< protection method
+  std::unique_ptr<WifiAcknowledgment> m_acknowledgment;  //!< acknowledgment method
+  Time m_txDuration {Time::Min ()};                      //!< TX duration of the frame
+
+  /**
+   * Reset the TX parameters.
+   */
+  void Clear (void);
+
+  /**
+   * Record that an MPDU is being added to the current frame. If an MPDU addressed
+   * to the same receiver already exists in the frame, A-MPDU aggregation is considered.
+   *
+   * \param mpdu the MPDU being added
+   */
+  void AddMpdu (Ptr<const WifiMacQueueItem> mpdu);
+
+  /**
+   * Record that an MSDU is being aggregated to the last MPDU added to the frame
+   * that hase the same receiver.
+   *
+   * \param msdu the MSDU being aggregated
+   */
+  void AggregateMsdu (Ptr<const WifiMacQueueItem> msdu);
+
+  /**
+   * Get the size in bytes of the frame in case the given MPDU is added.
+   *
+   * \param mpdu the given MPDU
+   * \return the size in bytes of the frame in case the given MPDU is added
+   */
+  uint32_t GetSizeIfAddMpdu (Ptr<const WifiMacQueueItem> mpdu) const;
+
+  /**
+   * Get the size in bytes of the frame in case the given MSDU is aggregated.
+   *
+   * \param msdu the given MSDU
+   * \return a pair (size in bytes of the current A-MSDU, size in bytes of the frame)
+             in case the given MSDU is aggregated
+   */
+  std::pair<uint32_t, uint32_t> GetSizeIfAggregateMsdu (Ptr<const WifiMacQueueItem> msdu) const;
+
+  /**
+   * Get the size in bytes of the (A-)MPDU addressed to the given receiver.
+   *
+   * \param receiver the MAC address of the given receiver
+   * \return the size in bytes of the (A-)MPDU addressed to the given receiver
+   */
+  uint32_t GetSize (Mac48Address receiver) const;
+
+  /// information about the frame being prepared for a specific receiver
+  struct PsduInfo
+    {
+      WifiMacHeader header;                             //!< MAC header of the last MPDU added
+      uint32_t amsduSize;                               //!< the size in bytes of the MSDU or A-MSDU
+                                                        //!< included in the last MPDU added
+      uint32_t ampduSize;                               //!< the size in bytes of the A-MPDU if multiple
+                                                        //!< MPDUs have been added, and zero otherwise
+      std::map<uint8_t, std::set<uint16_t>> seqNumbers; //!< set of the sequence numbers of the MPDUs added
+                                                        //!< for each TID
+    };
+
+  /**
+   * Get a pointer to the information about the PSDU addressed to the given
+   * receiver, if present, and a null pointer otherwise.
+   *
+   * \param receiver the MAC address of the receiver
+   * \return a pointer to an entry in the PSDU information map or a null pointer
+   */
+  const PsduInfo* GetPsduInfo (Mac48Address receiver) const;
+
+  /// Map containing information about the PSDUs addressed to every receiver
+  typedef std::map<Mac48Address, PsduInfo> PsduInfoMap;
+
+  /**
+   * Get a const reference to the map containing information about PSDUs.
+   *
+   * \return a const reference to the map containing information about PSDUs
+   */
+  const PsduInfoMap& GetPsduInfoMap (void) const;
+
+  /**
+   * \brief Print the object contents.
+   * \param os output stream in which the data should be printed.
+   */
+  void Print (std::ostream &os) const;
+
+private:
+  PsduInfoMap m_info;                  //!< information about the frame being prepared. Handles
+                                       //!< multi-TID A-MPDUs, MU PPDUs, etc.
+};
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the output stream
+ * \param txParams the TX parameters
+ * \returns a reference to the stream
+ */
+std::ostream& operator<< (std::ostream& os, const WifiTxParameters* txParams);
+
+} //namespace ns3
+
+#endif /* WIFI_TX_PARAMETERS_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-tx-timer.cc ns-3.34/src/wifi/model/wifi-tx-timer.cc
--- ns-3.33/src/wifi/model/wifi-tx-timer.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-tx-timer.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,159 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/log.h"
+#include "wifi-tx-timer.h"
+#include "wifi-mac-queue-item.h"
+#include "wifi-tx-vector.h"
+#include "wifi-psdu.h"
+
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("WifiTxTimer");
+
+WifiTxTimer::WifiTxTimer ()
+  : m_reason (NOT_RUNNING),
+    m_rescheduled (false)
+{
+}
+
+WifiTxTimer::~WifiTxTimer ()
+{
+  m_timeoutEvent.Cancel ();
+  m_endRxEvent = 0;
+}
+
+void
+WifiTxTimer::Reschedule (const Time& delay)
+{
+  NS_LOG_FUNCTION (this << delay);
+
+  if (m_timeoutEvent.IsRunning () && !m_rescheduled)
+    {
+      NS_LOG_DEBUG ("Rescheduling " << GetReasonString (m_reason) << " timeout in "
+                    << delay.As (Time::US));
+      m_timeoutEvent.Cancel ();
+      m_timeoutEvent = Simulator::Schedule (delay, m_endRxEvent);
+      m_rescheduled = true;
+    }
+}
+
+WifiTxTimer::Reason
+WifiTxTimer::GetReason (void) const
+{
+  NS_ASSERT (IsRunning ());
+  return m_reason;
+}
+
+std::string
+WifiTxTimer::GetReasonString (Reason reason) const
+{
+#define FOO(x) \
+case WAIT_ ## x: \
+  return # x; \
+  break;
+
+  switch (reason)
+    {
+    case NOT_RUNNING:
+      return "NOT_RUNNING";
+      break;
+    FOO (CTS);
+    FOO (NORMAL_ACK);
+    FOO (BLOCK_ACK);
+    FOO (NORMAL_ACK_AFTER_DL_MU_PPDU);
+    FOO (BLOCK_ACKS_IN_TB_PPDU);
+    FOO (TB_PPDU_AFTER_BASIC_TF);
+    FOO (QOS_NULL_AFTER_BSRP_TF);
+    FOO (BLOCK_ACK_AFTER_TB_PPDU);
+    default:
+      NS_ABORT_MSG ("Unknown reason");
+    }
+#undef FOO
+}
+
+bool
+WifiTxTimer::IsRunning (void) const
+{
+  return m_timeoutEvent.IsRunning ();
+}
+
+void
+WifiTxTimer::Cancel (void)
+{
+  NS_LOG_FUNCTION (this << GetReasonString (m_reason));
+  m_timeoutEvent.Cancel ();
+  m_endRxEvent = 0;
+}
+
+Time
+WifiTxTimer::GetDelayLeft (void) const
+{
+  return Simulator::GetDelayLeft (m_timeoutEvent);
+}
+
+void
+WifiTxTimer::SetMpduResponseTimeoutCallback (MpduResponseTimeout callback) const
+{
+  m_mpduResponseTimeoutCallback = callback;
+}
+
+void
+WifiTxTimer::FeedTraceSource (Ptr<WifiMacQueueItem> item, WifiTxVector txVector)
+{
+  if (!m_mpduResponseTimeoutCallback.IsNull ())
+    {
+      m_mpduResponseTimeoutCallback (m_reason, item, txVector);
+    }
+}
+
+void
+WifiTxTimer::SetPsduResponseTimeoutCallback (PsduResponseTimeout callback) const
+{
+  m_psduResponseTimeoutCallback = callback;
+}
+
+void
+WifiTxTimer::FeedTraceSource (Ptr<WifiPsdu> psdu, WifiTxVector txVector)
+{
+  if (!m_psduResponseTimeoutCallback.IsNull ())
+    {
+      m_psduResponseTimeoutCallback (m_reason, psdu, txVector);
+    }
+}
+
+void
+WifiTxTimer::SetPsduMapResponseTimeoutCallback (PsduMapResponseTimeout callback) const
+{
+  m_psduMapResponseTimeoutCallback = callback;
+}
+
+void
+WifiTxTimer::FeedTraceSource (WifiPsduMap* psduMap, std::set<Mac48Address>* missingStations,
+                              std::size_t nTotalStations)
+{
+  if (!m_psduMapResponseTimeoutCallback.IsNull ())
+    {
+      m_psduMapResponseTimeoutCallback (m_reason, psduMap, missingStations, nTotalStations);
+    }
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-tx-timer.h ns-3.34/src/wifi/model/wifi-tx-timer.h
--- ns-3.33/src/wifi/model/wifi-tx-timer.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-tx-timer.h	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,267 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#ifndef WIFI_TX_TIMER_H
+#define WIFI_TX_TIMER_H
+
+#include "ns3/event-id.h"
+#include "ns3/nstime.h"
+#include "ns3/simulator.h"
+#include "ns3/traced-callback.h"
+#include <functional>
+#include <unordered_map>
+
+namespace ns3 {
+
+class WifiMacQueueItem;
+class WifiPsdu;
+class WifiTxVector;
+class Mac48Address;
+
+typedef std::unordered_map <uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */> WifiPsduMap;
+
+/**
+ * \ingroup wifi
+ *
+ * This class is used to handle the timer that a station starts when transmitting
+ * a frame that solicits a response. The timeout can be rescheduled (only once)
+ * when the RXSTART.indication is received from the PHY.
+ */
+class WifiTxTimer
+{
+public:
+  /**
+   * \enum Reason
+   * \brief The reason why the timer was started
+   */
+  enum Reason : uint8_t
+    {
+      NOT_RUNNING = 0,
+      WAIT_CTS,
+      WAIT_NORMAL_ACK,
+      WAIT_BLOCK_ACK,
+      WAIT_NORMAL_ACK_AFTER_DL_MU_PPDU,
+      WAIT_BLOCK_ACKS_IN_TB_PPDU,
+      WAIT_TB_PPDU_AFTER_BASIC_TF,
+      WAIT_QOS_NULL_AFTER_BSRP_TF,
+      WAIT_BLOCK_ACK_AFTER_TB_PPDU,
+    };
+
+  /** Default constructor */
+  WifiTxTimer ();
+
+  virtual ~WifiTxTimer ();
+
+  /**
+   * This method is called when a frame soliciting a response is transmitted.
+   * This method starts a timer of the given duration and schedules a call to
+   * the given method in case the timer expires.
+   *
+   * \tparam MEM \deduced Class method function signature type
+   * \tparam OBJ \deduced Class type of the object
+   * \tparam Args \deduced Type template parameter pack
+   * \param reason the reason why the timer was started
+   * \param delay the time to the expiration of the timer
+   * \param mem_ptr Member method pointer to invoke
+   * \param obj The object on which to invoke the member method
+   * \param args The arguments to pass to the invoked method
+   */
+  template<typename MEM, typename OBJ, typename... Args>
+  void Set (Reason reason, const Time &delay, MEM mem_ptr, OBJ obj, Args... args);
+
+  /**
+   * Reschedule the timer to time out the given amount of time from the moment
+   * this function is called. Note that the timer must be running and must not
+   * have been already rescheduled.
+   *
+   * \param delay the time to the expiration of the timer
+   */
+  void Reschedule (const Time &delay);
+
+  /**
+   * Get the reason why the timer was started. Call
+   * this method only if the timer is running
+   *
+   * \return the reason why the timer was started
+   */
+  Reason GetReason (void) const;
+
+  /**
+   * Get a string associated with the given reason
+   *
+   * \param reason the given reason
+   * \return a string associated with the given reason
+   */
+  std::string GetReasonString (Reason reason) const;
+
+  /**
+   * Return true if the timer is running
+   *
+   * \return true if the timer is running
+   */
+  bool IsRunning (void) const;
+
+  /**
+   * Cancel the timer.
+   */
+  void Cancel (void);
+
+  /**
+   * Get the remaining time until the timer will expire.
+   *
+   * \return the remaining time until the timer will expire.
+   *         If the timer is not running, this method returns zero.
+   */
+  Time GetDelayLeft (void) const;
+
+  /**
+   * MPDU response timeout callback typedef
+   */
+  typedef Callback<void, uint8_t, Ptr<const WifiMacQueueItem>, const WifiTxVector&> MpduResponseTimeout;
+
+  /**
+   * PSDU response timeout callback typedef
+   */
+  typedef Callback<void, uint8_t, Ptr<const WifiPsdu>, const WifiTxVector&> PsduResponseTimeout;
+
+  /**
+   * PSDU map response timeout callback typedef
+   */
+  typedef Callback<void, uint8_t, WifiPsduMap*, const std::set<Mac48Address>*, std::size_t> PsduMapResponseTimeout;
+
+  /**
+   * Set the callback to invoke when the TX timer following the transmission of an MPDU expires.
+   *
+   * \param callback the callback to invoke when the TX timer following the transmission
+   *                 of an MPDU expires
+   */
+  void SetMpduResponseTimeoutCallback (MpduResponseTimeout callback) const;
+
+  /**
+   * Set the callback to invoke when the TX timer following the transmission of a PSDU expires.
+   *
+   * \param callback the callback to invoke when the TX timer following the transmission
+   *                 of a PSDU expires
+   */
+  void SetPsduResponseTimeoutCallback (PsduResponseTimeout callback) const;
+
+  /**
+   * Set the callback to invoke when the TX timer following the transmission of a PSDU map expires.
+   *
+   * \param callback the callback to invoke when the TX timer following the transmission
+   *                 of a PSDU map expires
+   */
+  void SetPsduMapResponseTimeoutCallback (PsduMapResponseTimeout callback) const;
+
+private:
+  /**
+   * This method is called when the timer expires. It invokes the callbacks
+   * and the method set by the user.
+   *
+   * \tparam MEM \deduced Class method function signature type
+   * \tparam OBJ \deduced Class type of the object
+   * \tparam Args \deduced Type template parameter pack
+   * \param mem_ptr Member method pointer to invoke
+   * \param obj The object on which to invoke the member method
+   * \param args The arguments to pass to the invoked method
+   */
+  template<typename MEM, typename OBJ, typename... Args>
+  void Timeout (MEM mem_ptr, OBJ obj, Args... args);
+
+  /**
+   * This method is called when the timer expires to feed the MPDU response
+   * timeout callback.
+   *
+   * \param item the MPDU followed by no response
+   * \param txVector the TXVECTOR used to transmit the MPDU
+   */
+  void FeedTraceSource (Ptr<WifiMacQueueItem> item, WifiTxVector txVector);
+
+  /**
+   * This method is called when the timer expires to feed the PSDU response
+   * timeout callback.
+   *
+   * \param psdu the PSDU followed by no response
+   * \param txVector the TXVECTOR used to transmit the PSDU
+   */
+  void FeedTraceSource (Ptr<WifiPsdu> psdu, WifiTxVector txVector);
+
+  /**
+   * This method is called when the timer expires to feed the PSDU map response
+   * timeout callback.
+   *
+   * \param psduMap the PSDU map for which not all responses were received
+   * \param missingStations the set of stations that did not respond
+   * \param nTotalStations the total number of expected responses
+   */
+  void FeedTraceSource (WifiPsduMap* psduMap, std::set<Mac48Address>* missingStations,
+                        std::size_t nTotalStations);
+
+  EventId m_timeoutEvent;         //!< the timeout event after a missing response
+  Reason m_reason;                //!< the reason why the timer was started
+  Ptr<EventImpl> m_endRxEvent;       //!< event to schedule upon RXSTART.indication
+  bool m_rescheduled;             //!< whether the timer has been already rescheduled
+
+  /// the MPDU response timeout callback
+  mutable MpduResponseTimeout m_mpduResponseTimeoutCallback;
+  /// the PSDU response timeout callback
+  mutable PsduResponseTimeout m_psduResponseTimeoutCallback;
+  /// the PSDU map response timeout callback
+  mutable PsduMapResponseTimeout m_psduMapResponseTimeoutCallback;
+};
+
+} // namespace ns3
+
+
+/***************************************************************
+ *  Implementation of the templates declared above.
+ ***************************************************************/
+
+namespace ns3 {
+
+template<typename MEM, typename OBJ, typename... Args>
+void
+WifiTxTimer::Set (Reason reason, const Time &delay, MEM mem_ptr, OBJ obj, Args... args)
+{
+  typedef void (WifiTxTimer::*TimeoutType)(MEM, OBJ, Args...);
+
+  m_timeoutEvent = Simulator::Schedule<TimeoutType> (delay, &WifiTxTimer::Timeout, this, mem_ptr, obj, args...);
+  m_reason = reason;
+  m_rescheduled = false;
+
+  // create an event to schedule if the PHY notifies the reception of a response
+  m_endRxEvent = Ptr<EventImpl> (MakeEvent<TimeoutType> (&WifiTxTimer::Timeout, this, mem_ptr, obj,
+                                                      std::forward<Args> (args)... ), false);
+}
+
+template<typename MEM, typename OBJ, typename... Args>
+void
+WifiTxTimer::Timeout (MEM mem_ptr, OBJ obj, Args... args)
+{
+  FeedTraceSource (std::forward<Args> (args)...);
+
+  // Invoke the method set by the user
+  ((*obj).*mem_ptr)(std::forward<Args> (args)...);
+}
+
+} //namespace ns3
+
+#endif /* WIFI_TX_TIMER_H */
+
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-tx-vector.cc ns-3.34/src/wifi/model/wifi-tx-vector.cc
--- ns-3.33/src/wifi/model/wifi-tx-vector.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-tx-vector.cc	2021-07-14 10:31:07.000000000 -0700
@@ -35,6 +35,7 @@
     m_stbc (false),
     m_ldpc (false),
     m_bssColor (0),
+    m_length (0),
     m_modeInitialized (false)
 {
 }
@@ -50,7 +51,8 @@
                             bool aggregation,
                             bool stbc,
                             bool ldpc,
-                            uint8_t bssColor)
+                            uint8_t bssColor,
+                            uint16_t length)
   : m_mode (mode),
     m_txPowerLevel (powerLevel),
     m_preamble (preamble),
@@ -63,6 +65,7 @@
     m_stbc (stbc),
     m_ldpc (ldpc),
     m_bssColor (bssColor),
+    m_length (length),
     m_modeInitialized (true)
 {
 }
@@ -80,6 +83,7 @@
     m_stbc (txVector.m_stbc),
     m_ldpc (txVector.m_ldpc),
     m_bssColor (txVector.m_bssColor),
+    m_length (txVector.m_length),
     m_modeInitialized (txVector.m_modeInitialized)
 {
   m_muUserInfos.clear ();
@@ -110,7 +114,7 @@
     {
       NS_FATAL_ERROR ("WifiTxVector mode must be set before using");
     }
-  if (m_preamble == WIFI_PREAMBLE_HE_MU || m_preamble == WIFI_PREAMBLE_HE_TB)
+  if (IsMu ())
     {
       NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for HE MU (" << staId << ")");
       NS_ASSERT (m_muUserInfos.find (staId) != m_muUserInfos.end ());
@@ -119,6 +123,20 @@
   return m_mode;
 }
 
+WifiModulationClass
+WifiTxVector::GetModulationClass (void) const
+{
+  NS_ABORT_MSG_IF (!m_modeInitialized, "WifiTxVector mode must be set before using");
+
+  if (IsMu ())
+    {
+      NS_ASSERT (!m_muUserInfos.empty ());
+      // all the modes belong to the same modulation class
+      return m_muUserInfos.begin ()->second.mcs.GetModulationClass ();
+    }
+  return m_mode.GetModulationClass ();
+}
+
 uint8_t
 WifiTxVector::GetTxPowerLevel (void) const
 {
@@ -152,7 +170,7 @@
 uint8_t
 WifiTxVector::GetNss (uint16_t staId) const
 {
-  if (m_preamble == WIFI_PREAMBLE_HE_MU || m_preamble == WIFI_PREAMBLE_HE_TB)
+  if (IsMu ())
     {
       NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for HE MU (" << staId << ")");
       NS_ASSERT (m_muUserInfos.find (staId) != m_muUserInfos.end ());
@@ -165,7 +183,7 @@
 WifiTxVector::GetNssMax (void) const
 {
   uint8_t nss = 0;
-  if (m_preamble == WIFI_PREAMBLE_HE_MU || m_preamble == WIFI_PREAMBLE_HE_TB)
+  if (IsMu ())
     {
       for (const auto & info : m_muUserInfos)
         {
@@ -213,7 +231,7 @@
 void
 WifiTxVector::SetMode (WifiMode mode, uint16_t staId)
 {
-  NS_ABORT_MSG_IF (m_preamble != WIFI_PREAMBLE_HE_MU, "Not an HE MU transmission");
+  NS_ABORT_MSG_IF (!IsMu (), "Not an HE MU transmission");
   NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for HE MU");
   m_muUserInfos[staId].mcs = mode;
   m_modeInitialized = true;
@@ -258,7 +276,7 @@
 void
 WifiTxVector::SetNss (uint8_t nss, uint16_t staId)
 {
-  NS_ABORT_MSG_IF (m_preamble != WIFI_PREAMBLE_HE_MU, "Not an HE MU transmission");
+  NS_ABORT_MSG_IF (!IsMu (), "Not an HE MU transmission");
   NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for HE MU");
   m_muUserInfos[staId].nss = nss;
 }
@@ -299,6 +317,18 @@
   return m_bssColor;
 }
 
+void
+WifiTxVector::SetLength (uint16_t length)
+{
+  m_length = length;
+}
+
+uint16_t
+WifiTxVector::GetLength (void) const
+{
+  return m_length;
+}
+
 bool
 WifiTxVector::IsValid (void) const
 {
@@ -335,10 +365,28 @@
   return true;
 }
 
+bool
+WifiTxVector::IsMu (void) const
+{
+  return (m_preamble == WIFI_PREAMBLE_HE_MU || m_preamble == WIFI_PREAMBLE_HE_TB);
+}
+
+bool
+WifiTxVector::IsDlMu (void) const
+{
+  return ((m_preamble == WIFI_PREAMBLE_VHT_MU) || (m_preamble == WIFI_PREAMBLE_HE_MU));
+}
+
+bool
+WifiTxVector::IsUlMu (void) const
+{
+  return (m_preamble == WIFI_PREAMBLE_HE_TB);
+}
+
 HeRu::RuSpec
 WifiTxVector::GetRu (uint16_t staId) const
 {
-  NS_ABORT_MSG_IF (m_preamble != WIFI_PREAMBLE_HE_MU, "RU only available for MU");
+  NS_ABORT_MSG_IF (!IsMu (), "RU only available for MU");
   NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for HE MU");
   return m_muUserInfos.at (staId).ru;
 }
@@ -346,7 +394,7 @@
 void
 WifiTxVector::SetRu (HeRu::RuSpec ru, uint16_t staId)
 {
-  NS_ABORT_MSG_IF (m_preamble != WIFI_PREAMBLE_HE_MU, "RU only available for MU");
+  NS_ABORT_MSG_IF (!IsMu (), "RU only available for MU");
   NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for HE MU");
   m_muUserInfos[staId].ru = ru;
 }
@@ -354,14 +402,14 @@
 HeMuUserInfo
 WifiTxVector::GetHeMuUserInfo (uint16_t staId) const
 {
-  NS_ABORT_MSG_IF (m_preamble != WIFI_PREAMBLE_HE_MU, "HE MU user info only available for MU");
+  NS_ABORT_MSG_IF (!IsMu (), "HE MU user info only available for MU");
   return m_muUserInfos.at (staId);
 }
 
 void
 WifiTxVector::SetHeMuUserInfo (uint16_t staId, HeMuUserInfo userInfo)
 {
-  NS_ABORT_MSG_IF (m_preamble != WIFI_PREAMBLE_HE_MU, "HE MU user info only available for MU");
+  NS_ABORT_MSG_IF (!IsMu (), "HE MU user info only available for MU");
   NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for HE MU");
   NS_ABORT_MSG_IF (userInfo.mcs.GetModulationClass () != WIFI_MOD_CLASS_HE, "Only HE modes authorized for HE MU");
   m_muUserInfos[staId] = userInfo;
@@ -371,10 +419,85 @@
 const WifiTxVector::HeMuUserInfoMap&
 WifiTxVector::GetHeMuUserInfoMap (void) const
 {
-  NS_ABORT_MSG_IF (m_preamble != WIFI_PREAMBLE_HE_MU, "HE MU user info map only available for MU");
+  NS_ABORT_MSG_IF (!IsMu (), "HE MU user info map only available for MU");
   return m_muUserInfos;
 }
 
+WifiTxVector::HeMuUserInfoMap&
+WifiTxVector::GetHeMuUserInfoMap (void)
+{
+  NS_ABORT_MSG_IF (!IsMu (), "HE MU user info map only available for MU");
+  return m_muUserInfos;
+}
+
+std::pair<std::size_t, std::size_t>
+WifiTxVector::GetNumRusPerHeSigBContentChannel (void) const
+{
+  NS_ABORT_MSG_IF (m_preamble != WIFI_PREAMBLE_HE_MU, "HE-SIG-B content channels only available for HE MU");
+  //MU-MIMO is not handled for now, i.e. one station per RU
+
+  if (m_channelWidth == 20)
+    {
+      return std::make_pair (m_muUserInfos.size (), 0); //all RUs are in HE-SIG-B content channel 1
+    }
+
+  HeRu::SubcarrierGroup toneRangesContentChannel1, toneRangesContentChannel2;
+  // See section 27.3.10.8.3 of IEEE 802.11ax draft 4.0 for tone ranges per HE-SIG-B content channel
+  switch (m_channelWidth)
+    {
+      case 40:
+        toneRangesContentChannel1.push_back (std::make_pair (-244, -3));
+        toneRangesContentChannel2.push_back (std::make_pair (3, 244));
+        break;
+      case 80:
+        toneRangesContentChannel1.push_back (std::make_pair (-500, -259));
+        toneRangesContentChannel2.push_back (std::make_pair (-258, -17));
+        toneRangesContentChannel1.push_back (std::make_pair (-16, -4)); //first part of center carrier (in HE-SIG-B content channel 1)
+        toneRangesContentChannel1.push_back (std::make_pair (4, 16)); //second part of center carrier (in HE-SIG-B content channel 1)
+        toneRangesContentChannel1.push_back (std::make_pair (17, 258));
+        toneRangesContentChannel2.push_back (std::make_pair (259, 500));
+        break;
+      case 160:
+        toneRangesContentChannel1.push_back (std::make_pair (-1012, -771));
+        toneRangesContentChannel2.push_back (std::make_pair (-770, -529));
+        toneRangesContentChannel1.push_back (std::make_pair (-528, -516)); //first part of center carrier of lower 80 MHz band (in HE-SIG-B content channel 1)
+        toneRangesContentChannel1.push_back (std::make_pair (-508, -496)); //second part of center carrier of lower 80 MHz band (in HE-SIG-B content channel 1)
+        toneRangesContentChannel1.push_back (std::make_pair (-495, -254));
+        toneRangesContentChannel2.push_back (std::make_pair (-253, -12));
+        toneRangesContentChannel1.push_back (std::make_pair (12, 253));
+        toneRangesContentChannel2.push_back (std::make_pair (254, 495));
+        toneRangesContentChannel2.push_back (std::make_pair (496, 508)); //first part of center carrier of upper 80 MHz band (in HE-SIG-B content channel 2)
+        toneRangesContentChannel2.push_back (std::make_pair (516, 528)); //second part of center carrier of upper 80 MHz band (in HE-SIG-B content channel 2)
+        toneRangesContentChannel1.push_back (std::make_pair (529, 770));
+        toneRangesContentChannel2.push_back (std::make_pair (771, 1012));
+        break;
+      default:
+        NS_ABORT_MSG ("Unknown channel width: " << m_channelWidth);
+    }
+
+  std::size_t numRusContentChannel1 = 0;
+  std::size_t numRusContentChannel2 = 0;
+  for (auto & userInfo : m_muUserInfos)
+    {
+      HeRu::RuSpec ru = userInfo.second.ru;
+      if (!ru.IsPhyIndexSet ())
+        {
+          // this method can be called when calculating the TX duration of a frame
+          // and at that time the RU PHY index may have not been set yet
+          ru.SetPhyIndex (m_channelWidth, 0);
+        }
+      if (HeRu::DoesOverlap (m_channelWidth, ru, toneRangesContentChannel1))
+        {
+          numRusContentChannel1++;
+        }
+      if (HeRu::DoesOverlap (m_channelWidth, ru, toneRangesContentChannel2))
+        {
+          numRusContentChannel2++;
+        }
+    }
+  return std::make_pair (numRusContentChannel1, numRusContentChannel2);
+}
+
 std::ostream & operator << ( std::ostream &os, const WifiTxVector &v)
 {
   if (!v.IsValid ())
@@ -391,7 +514,15 @@
      << " MPDU aggregation: " << v.IsAggregation ()
      << " STBC: " << v.IsStbc ()
      << " FEC coding: " << (v.IsLdpc () ? "LDPC" : "BCC");
-  if (v.GetPreambleType () == WIFI_PREAMBLE_HE_MU)
+  if (v.GetPreambleType () >= WIFI_PREAMBLE_HE_SU)
+    {
+      os << " BSS color: " << +v.GetBssColor ();
+    }
+  if (v.GetPreambleType () == WIFI_PREAMBLE_HE_TB)
+    {
+      os << " Length: " << v.GetLength ();
+    }
+  if (v.IsMu ())
     {
       WifiTxVector::HeMuUserInfoMap userInfoMap = v.GetHeMuUserInfoMap ();
       os << " num User Infos: " << userInfoMap.size ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-tx-vector.h ns-3.34/src/wifi/model/wifi-tx-vector.h
--- ns-3.33/src/wifi/model/wifi-tx-vector.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-tx-vector.h	2021-07-14 10:31:07.000000000 -0700
@@ -24,8 +24,8 @@
 
 #include <list>
 #include "wifi-mode.h"
-#include "wifi-preamble.h"
-#include "he-ru.h"
+#include "wifi-phy-common.h"
+#include "ns3/he-ru.h"
 
 namespace ns3 {
 
@@ -90,6 +90,7 @@
    * \param stbc enable or disable STBC
    * \param ldpc enable or disable LDPC (BCC is used otherwise)
    * \param bssColor the BSS color
+   * \param length the LENGTH field of the L-SIG
    */
   WifiTxVector (WifiMode mode,
                 uint8_t powerLevel,
@@ -102,7 +103,8 @@
                 bool aggregation,
                 bool stbc = false,
                 bool ldpc = false,
-                uint8_t bssColor = 0);
+                uint8_t bssColor = 0,
+                uint16_t length = 0);
   /**
    * Copy constructor
    * \param txVector the TXVECTOR to copy
@@ -138,6 +140,13 @@
   void SetMode (WifiMode mode, uint16_t staId);
 
   /**
+   * Get the modulation class specified by this TXVECTOR.
+   *
+   * \return the Modulation Class specified by this TXVECTOR
+   */
+  WifiModulationClass GetModulationClass (void) const;
+
+  /**
    * \returns the transmission power level
    */
   uint8_t GetTxPowerLevel (void) const;
@@ -273,6 +282,16 @@
    */
   uint8_t GetBssColor (void) const;
   /**
+   * Set the LENGTH field of the L-SIG
+   * \param length the LENGTH field of the L-SIG
+   */
+  void SetLength (uint16_t length);
+  /**
+   * Get the LENGTH field of the L-SIG
+   * \return the LENGTH field of the L-SIG
+   */
+  uint16_t GetLength (void) const;
+  /**
    * The standard disallows certain combinations of WifiMode, number of
    * spatial streams, and channel widths.  This method can be used to
    * check whether this WifiTxVector contains an invalid combination.
@@ -281,6 +300,24 @@
    */
   bool IsValid (void) const;
    /**
+   * Return true if this TX vector is used for a multi-user transmission.
+   *
+   * \return true if this TX vector is used for a multi-user transmission
+   */
+  bool IsMu (void) const;
+   /**
+   * Return true if this TX vector is used for a downlink multi-user transmission.
+   *
+   * \return true if this TX vector is used for a downlink multi-user transmission
+   */
+  bool IsDlMu (void) const;
+   /**
+   * Return true if this TX vector is used for an uplink multi-user transmission.
+   *
+   * \return true if this TX vector is used for an uplink multi-user transmission
+   */
+  bool IsUlMu (void) const;
+  /**
     * Get the RU specification for the STA-ID.
     * This is applicable only for HE MU.
     *
@@ -313,12 +350,28 @@
     */
    void SetHeMuUserInfo (uint16_t staId, HeMuUserInfo userInfo);
    /**
-    * Get the map HE MU user-specific transmission information indexed by STA-ID.
+    * Get a const reference to the map HE MU user-specific transmission information indexed by STA-ID.
     * This is applicable only for HE MU.
     *
-    * \return the map of HE MU user-specific information indexed by STA-ID
+    * \return a const reference to the map of HE MU user-specific information indexed by STA-ID
     */
    const HeMuUserInfoMap& GetHeMuUserInfoMap (void) const;
+   /**
+    * Get a reference to the map HE MU user-specific transmission information indexed by STA-ID.
+    * This is applicable only for HE MU.
+    *
+    * \return a reference to the map of HE MU user-specific information indexed by STA-ID
+    */
+   HeMuUserInfoMap& GetHeMuUserInfoMap (void);
+   /**
+    * Get the number of RUs per HE-SIG-B content channel.
+    * This is applicable only for HE MU. MU-MIMO (i.e. multiple stations
+    * per RU) is not supported yet.
+    * See section 27.3.10.8.3 of IEEE 802.11ax draft 4.0.
+    *
+    * \return a pair containing the number of RUs in each HE-SIG-B content channel (resp. 1 and 2)
+    */
+   std::pair<std::size_t, std::size_t> GetNumRusPerHeSigBContentChannel (void) const;
 
 
 private:
@@ -338,6 +391,7 @@
   bool     m_stbc;               /**< STBC used or not */
   bool     m_ldpc;               /**< LDPC FEC coding if true, BCC otherwise*/
   uint8_t  m_bssColor;           /**< BSS color */
+  uint16_t m_length;             /**< LENGTH field of the L-SIG */
 
   bool     m_modeInitialized;         /**< Internal initialization flag */
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-utils.cc ns-3.34/src/wifi/model/wifi-utils.cc
--- ns-3.33/src/wifi/model/wifi-utils.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-utils.cc	2021-07-14 10:31:07.000000000 -0700
@@ -24,8 +24,8 @@
 #include "wifi-mac-header.h"
 #include "wifi-mac-trailer.h"
 #include "wifi-net-device.h"
-#include "ht-configuration.h"
-#include "he-configuration.h"
+#include "ns3/ht-configuration.h"
+#include "ns3/he-configuration.h"
 #include "wifi-mode.h"
 #include "ampdu-subframe-header.h"
 
@@ -113,7 +113,7 @@
 }
 
 WifiPreamble
-GetPreambleForTransmission (WifiModulationClass modulation, bool useShortPreamble, bool useGreenfield)
+GetPreambleForTransmission (WifiModulationClass modulation, bool useShortPreamble)
 {
   if (modulation == WIFI_MOD_CLASS_HE)
     {
@@ -123,16 +123,11 @@
     {
       return WIFI_PREAMBLE_VHT_SU;
     }
-  else if (modulation == WIFI_MOD_CLASS_HT && useGreenfield)
-    {
-      //If protection for Greenfield is used we go for HT_MF preamble which is the default protection for GF format defined in the standard.
-      return WIFI_PREAMBLE_HT_GF;
-    }
   else if (modulation == WIFI_MOD_CLASS_HT)
     {
-      return WIFI_PREAMBLE_HT_MF;
+      return WIFI_PREAMBLE_HT_MF; // HT_GF has been removed
     }
-  else if (useShortPreamble)
+  else if (modulation == WIFI_MOD_CLASS_HR_DSSS && useShortPreamble) //ERP_DSSS is modeled through HR_DSSS (since same preamble and modulation)
     {
       return WIFI_PREAMBLE_SHORT;
     }
@@ -184,7 +179,7 @@
 }
 
 uint32_t
-GetBlockAckRequestSize (BlockAckType type)
+GetBlockAckRequestSize (BlockAckReqType type)
 {
   WifiMacHeader hdr;
   hdr.SetType (WIFI_MAC_CTL_BACKREQ);
@@ -194,6 +189,23 @@
 }
 
 uint32_t
+GetMuBarSize (std::list<BlockAckReqType> types)
+{
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_CTL_TRIGGER);
+  CtrlTriggerHeader trigger;
+  trigger.SetType (MU_BAR_TRIGGER);
+  for (auto& t : types)
+    {
+      auto userInfo = trigger.AddUserInfoField ();
+      CtrlBAckRequestHeader bar;
+      bar.SetType (t);
+      userInfo.SetMuBarTriggerDepUserInfo (bar);
+    }
+  return hdr.GetSize () + trigger.GetSerializedSize () + 4;
+}
+
+uint32_t
 GetRtsSize (void)
 {
   WifiMacHeader rts;
@@ -245,21 +257,18 @@
 
   switch (preamble)
     {
-    case WIFI_PREAMBLE_HT_GF:
-      duration = MicroSeconds (10000);
-      break;
-    case WIFI_PREAMBLE_HT_MF:
-    case WIFI_PREAMBLE_VHT_SU:
-    case WIFI_PREAMBLE_VHT_MU:
-    case WIFI_PREAMBLE_HE_SU:
-    case WIFI_PREAMBLE_HE_ER_SU:
-    case WIFI_PREAMBLE_HE_MU:
-    case WIFI_PREAMBLE_HE_TB:
-      duration = MicroSeconds (5484);
-      break;
-    default:
-      duration = MicroSeconds (0);
-      break;
+      case WIFI_PREAMBLE_HT_MF:
+      case WIFI_PREAMBLE_VHT_SU:
+      case WIFI_PREAMBLE_VHT_MU:
+      case WIFI_PREAMBLE_HE_SU:
+      case WIFI_PREAMBLE_HE_ER_SU:
+      case WIFI_PREAMBLE_HE_MU:
+      case WIFI_PREAMBLE_HE_TB:
+        duration = MicroSeconds (5484);
+        break;
+      default:
+        duration = MicroSeconds (0);
+        break;
     }
   return duration;
 }
@@ -267,7 +276,7 @@
 bool
 IsHt (WifiPreamble preamble)
 {
-   return (preamble == WIFI_PREAMBLE_HT_MF || preamble == WIFI_PREAMBLE_HT_GF);
+   return (preamble == WIFI_PREAMBLE_HT_MF);
 }
 
 bool
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/wifi-utils.h ns-3.34/src/wifi/model/wifi-utils.h
--- ns-3.33/src/wifi/model/wifi-utils.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/wifi-utils.h	2021-07-14 10:31:07.000000000 -0700
@@ -22,8 +22,9 @@
 #define WIFI_UTILS_H
 
 #include "block-ack-type.h"
-#include "wifi-preamble.h"
+#include "wifi-phy-common.h"
 #include "wifi-mode.h"
+#include <list>
 
 namespace ns3 {
 
@@ -89,11 +90,10 @@
  *
  * \param modulation the modulation selected for the transmission
  * \param useShortPreamble whether short preamble should be used
- * \param useGreenfield whether HT Greenfield should be used
  *
  * \return the preamble to be used for the transmission
  */
-WifiPreamble GetPreambleForTransmission (WifiModulationClass modulation, bool useShortPreamble, bool useGreenfield);
+WifiPreamble GetPreambleForTransmission (WifiModulationClass modulation, bool useShortPreamble);
 /**
  * Return the channel width that corresponds to the selected mode (instead of
  * letting the PHY's default channel width). This is especially useful when using
@@ -134,7 +134,14 @@
  * \param type the BlockAckRequest type
  * \return the total BlockAckRequest size in bytes
  */
-uint32_t GetBlockAckRequestSize (BlockAckType type);
+uint32_t GetBlockAckRequestSize (BlockAckReqType type);
+/**
+ * Return the total MU-BAR size (including FCS trailer).
+ *
+ * \param types the list of Block Ack Request types of the individual BARs
+ * \return the total MU-BAR size in bytes
+ */
+uint32_t GetMuBarSize (std::list<BlockAckReqType> types);
 /**
  * Return the total RTS size (including FCS trailer).
  *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/yans-error-rate-model.cc ns-3.34/src/wifi/model/yans-error-rate-model.cc
--- ns-3.33/src/wifi/model/yans-error-rate-model.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/yans-error-rate-model.cc	2021-07-14 10:31:07.000000000 -0700
@@ -179,15 +179,24 @@
 }
 
 double
-YansErrorRateModel::DoGetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint64_t nbits) const
+YansErrorRateModel::DoGetChunkSuccessRate (WifiMode mode, const WifiTxVector& txVector, double snr, uint64_t nbits, uint8_t numRxAntennas, WifiPpduField field, uint16_t staId) const
 {
-  NS_LOG_FUNCTION (this << mode << txVector.GetMode () << snr << nbits);
+  NS_LOG_FUNCTION (this << mode << txVector << snr << nbits << +numRxAntennas << field << staId);
   if (mode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM
       || mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM
       || mode.GetModulationClass () == WIFI_MOD_CLASS_HT
       || mode.GetModulationClass () == WIFI_MOD_CLASS_VHT
       || mode.GetModulationClass () == WIFI_MOD_CLASS_HE)
     {
+      uint64_t phyRate;
+      if ((txVector.IsMu () && (staId == SU_STA_ID)) || (mode != txVector.GetMode ()))
+        {
+          phyRate = mode.GetPhyRate (txVector.GetChannelWidth () >= 40 ? 20 : txVector.GetChannelWidth ()); //This is the PHY header
+        }
+      else
+        {
+          phyRate = mode.GetPhyRate (txVector, staId);
+        }
       if (mode.GetConstellationSize () == 2)
         {
           if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
@@ -195,7 +204,7 @@
               return GetFecBpskBer (snr,
                                     nbits,
                                     txVector.GetChannelWidth () * 1000000, //signal spread
-                                    mode.GetPhyRate (txVector), //PHY rate
+                                    phyRate, //PHY rate
                                     10, //dFree
                                     11); //adFree
             }
@@ -204,7 +213,7 @@
               return GetFecBpskBer (snr,
                                     nbits,
                                     txVector.GetChannelWidth () * 1000000, //signal spread
-                                    mode.GetPhyRate (txVector), //PHY rate
+                                    phyRate, //PHY rate
                                     5, //dFree
                                     8); //adFree
             }
@@ -216,7 +225,7 @@
               return GetFecQamBer (snr,
                                    nbits,
                                    txVector.GetChannelWidth () * 1000000, //signal spread
-                                   mode.GetPhyRate (txVector), //PHY rate
+                                   phyRate, //PHY rate
                                    4, //m
                                    10, //dFree
                                    11, //adFree
@@ -227,7 +236,7 @@
               return GetFecQamBer (snr,
                                    nbits,
                                    txVector.GetChannelWidth () * 1000000, //signal spread
-                                   mode.GetPhyRate (txVector), //PHY rate
+                                   phyRate, //PHY rate
                                    4, //m
                                    5, //dFree
                                    8, //adFree
@@ -241,7 +250,7 @@
               return GetFecQamBer (snr,
                                    nbits,
                                    txVector.GetChannelWidth () * 1000000, //signal spread
-                                   mode.GetPhyRate (txVector), //PHY rate
+                                   phyRate, //PHY rate
                                    16, //m
                                    10, //dFree
                                    11, //adFree
@@ -252,7 +261,7 @@
               return GetFecQamBer (snr,
                                    nbits,
                                    txVector.GetChannelWidth () * 1000000, //signal spread
-                                   mode.GetPhyRate (txVector), //PHY rate
+                                   phyRate, //PHY rate
                                    16, //m
                                    5, //dFree
                                    8, //adFree
@@ -266,7 +275,7 @@
               return GetFecQamBer (snr,
                                    nbits,
                                    txVector.GetChannelWidth () * 1000000, //signal spread
-                                   mode.GetPhyRate (txVector), //PHY rate
+                                   phyRate, //PHY rate
                                    64, //m
                                    6, //dFree
                                    1, //adFree
@@ -278,7 +287,7 @@
               return GetFecQamBer (snr,
                                    nbits,
                                    txVector.GetChannelWidth () * 1000000, //signal spread
-                                   mode.GetPhyRate (txVector), //PHY rate
+                                   phyRate, //PHY rate
                                    64, //m
                                    4, //dFree
                                    14, //adFree
@@ -289,7 +298,7 @@
               return GetFecQamBer (snr,
                                    nbits,
                                    txVector.GetChannelWidth () * 1000000, //signal spread
-                                   mode.GetPhyRate (txVector), //PHY rate
+                                   phyRate, //PHY rate
                                    64, //m
                                    5, //dFree
                                    8, //adFree
@@ -303,7 +312,7 @@
               return GetFecQamBer (snr,
                                    nbits,
                                    txVector.GetChannelWidth () * 1000000, // signal spread
-                                   mode.GetPhyRate (txVector), //PHY rate
+                                   phyRate, //PHY rate
                                    256, // m
                                    4,  // dFree
                                    14,  // adFree
@@ -315,7 +324,7 @@
               return GetFecQamBer (snr,
                                    nbits,
                                    txVector.GetChannelWidth () * 1000000, // signal spread
-                                   mode.GetPhyRate (txVector), //PHY rate
+                                   phyRate, //PHY rate
                                    256, // m
                                    5,  // dFree
                                    8,  // adFree
@@ -330,7 +339,7 @@
               return GetFecQamBer (snr,
                                    nbits,
                                    txVector.GetChannelWidth () * 1000000, // signal spread
-                                   mode.GetPhyRate (txVector), //PHY rate
+                                   phyRate, //PHY rate
                                    1024, // m
                                    4,  // dFree
                                    14,  // adFree
@@ -342,7 +351,7 @@
               return GetFecQamBer (snr,
                                    nbits,
                                    txVector.GetChannelWidth () * 1000000, // signal spread
-                                   mode.GetPhyRate (txVector), //PHY rate
+                                   phyRate, //PHY rate
                                    1024, // m
                                    5,  // dFree
                                    8,  // adFree
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/yans-error-rate-model.h ns-3.34/src/wifi/model/yans-error-rate-model.h
--- ns-3.33/src/wifi/model/yans-error-rate-model.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/yans-error-rate-model.h	2021-07-14 10:31:07.000000000 -0700
@@ -63,8 +63,8 @@
 
 
 private:
-  //Inherited from ErrorRateModel
-  double DoGetChunkSuccessRate (WifiMode mode, WifiTxVector txVector, double snr, uint64_t nbits) const;
+  double DoGetChunkSuccessRate (WifiMode mode, const WifiTxVector& txVector, double snr, uint64_t nbits,
+                                uint8_t numRxAntennas, WifiPpduField field, uint16_t staId) const override;
   /**
    * Return BER of BPSK with the given parameters.
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/yans-wifi-channel.cc ns-3.34/src/wifi/model/yans-wifi-channel.cc
--- ns-3.33/src/wifi/model/yans-wifi-channel.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/yans-wifi-channel.cc	2021-07-14 10:31:07.000000000 -0700
@@ -103,7 +103,7 @@
           double rxPowerDbm = m_loss->CalcRxPower (txPowerDbm, senderMobility, receiverMobility);
           NS_LOG_DEBUG ("propagation: txPower=" << txPowerDbm << "dbm, rxPower=" << rxPowerDbm << "dbm, " <<
                         "distance=" << senderMobility->GetDistanceFrom (receiverMobility) << "m, delay=" << delay);
-          Ptr<WifiPpdu> copy = Copy (ppdu);
+          Ptr<WifiPpdu> copy = ppdu->Copy ();
           Ptr<NetDevice> dstNetDevice = (*i)->GetDevice ();
           uint32_t dstNode;
           if (dstNetDevice == 0)
@@ -135,7 +135,7 @@
     }
   RxPowerWattPerChannelBand rxPowerW;
   rxPowerW.insert ({std::make_pair (0, 0), (DbmToW (rxPowerDbm + phy->GetRxGain ()))}); //dummy band for YANS
-  phy->StartReceivePreamble (ppdu, rxPowerW);
+  phy->StartReceivePreamble (ppdu, rxPowerW, ppdu->GetTxDuration ());
 }
 
 std::size_t
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/yans-wifi-channel.h ns-3.34/src/wifi/model/yans-wifi-channel.h
--- ns-3.33/src/wifi/model/yans-wifi-channel.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/yans-wifi-channel.h	2021-07-14 10:31:07.000000000 -0700
@@ -54,9 +54,8 @@
   YansWifiChannel ();
   virtual ~YansWifiChannel ();
 
-  //inherited from Channel.
-  virtual std::size_t GetNDevices (void) const;
-  virtual Ptr<NetDevice> GetDevice (std::size_t i) const;
+  std::size_t GetNDevices (void) const override;
+  Ptr<NetDevice> GetDevice (std::size_t i) const override;
 
   /**
    * Adds the given YansWifiPhy to the PHY list
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/yans-wifi-phy.cc ns-3.34/src/wifi/model/yans-wifi-phy.cc
--- ns-3.33/src/wifi/model/yans-wifi-phy.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/yans-wifi-phy.cc	2021-07-14 10:31:07.000000000 -0700
@@ -23,7 +23,6 @@
 #include "ns3/log.h"
 #include "yans-wifi-phy.h"
 #include "yans-wifi-channel.h"
-#include "wifi-ppdu.h"
 
 namespace ns3 {
 
@@ -83,9 +82,22 @@
 YansWifiPhy::StartTx (Ptr<WifiPpdu> ppdu)
 {
   NS_LOG_FUNCTION (this << ppdu);
-  WifiTxVector txVector = ppdu->GetTxVector ();
-  NS_LOG_DEBUG ("Start transmission: signal power before antenna gain=" << GetPowerDbm (txVector.GetTxPowerLevel ()) << "dBm");
-  m_channel->Send (this, ppdu, GetTxPowerForTransmission (txVector) + GetTxGain ());
+  NS_LOG_DEBUG ("Start transmission: signal power before antenna gain=" << GetPowerDbm (ppdu->GetTxVector ().GetTxPowerLevel ()) << "dBm");
+  m_channel->Send (this, ppdu, GetTxPowerForTransmission (ppdu) + GetTxGain ());
+}
+
+uint16_t
+YansWifiPhy::GetGuardBandwidth (uint16_t currentChannelWidth) const
+{
+  NS_ABORT_MSG ("Guard bandwidth not relevant for Yans");
+  return 0;
+}
+
+std::tuple<double, double, double>
+YansWifiPhy::GetTxMaskRejectionParams (void) const
+{
+  NS_ABORT_MSG ("Tx mask rejection params not relevant for Yans");
+  return std::make_tuple (0.0, 0.0, 0.0);
 }
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/model/yans-wifi-phy.h ns-3.34/src/wifi/model/yans-wifi-phy.h
--- ns-3.33/src/wifi/model/yans-wifi-phy.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/model/yans-wifi-phy.h	2021-07-14 10:31:07.000000000 -0700
@@ -28,7 +28,6 @@
 namespace ns3 {
 
 class YansWifiChannel;
-class WifiPpdu;
 
 /**
  * \brief 802.11 PHY layer model
@@ -58,8 +57,10 @@
   virtual ~YansWifiPhy ();
 
   // Implementation of pure virtual method.
-  void StartTx (Ptr<WifiPpdu> ppdu);
-  virtual Ptr<Channel> GetChannel (void) const;
+  void StartTx (Ptr<WifiPpdu> ppdu) override;
+  Ptr<Channel> GetChannel (void) const override;
+  uint16_t GetGuardBandwidth (uint16_t currentChannelWidth) const override;
+  std::tuple<double, double, double> GetTxMaskRejectionParams (void) const override;
 
   /**
    * Set the YansWifiChannel this YansWifiPhy is to be connected to.
@@ -69,8 +70,7 @@
   void SetChannel (const Ptr<YansWifiChannel> channel);
 
 protected:
-  // Inherited
-  virtual void DoDispose (void);
+  void DoDispose (void) override;
 
 
 private:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/block-ack-test-suite.cc ns-3.34/src/wifi/test/block-ack-test-suite.cc
--- ns-3.33/src/wifi/test/block-ack-test-suite.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/block-ack-test-suite.cc	2021-07-14 10:31:07.000000000 -0700
@@ -33,6 +33,9 @@
 #include "ns3/packet-socket-helper.h"
 #include "ns3/config.h"
 #include "ns3/pointer.h"
+#include "ns3/recipient-block-ack-agreement.h"
+#include "ns3/mac-rx-middle.h"
+#include <list>
 
 using namespace ns3;
 
@@ -79,7 +82,7 @@
   PacketBufferingCaseA ();
   virtual ~PacketBufferingCaseA ();
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
   std::list<uint16_t> m_expectedBuffer; ///< expected test buffer
 };
 
@@ -176,7 +179,7 @@
   PacketBufferingCaseB ();
   virtual ~PacketBufferingCaseB ();
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
   std::list<uint16_t> m_expectedBuffer; ///< expected test buffer
 };
 
@@ -262,7 +265,7 @@
 public:
   OriginatorBlockAckWindowTest ();
 private:
-  virtual void DoRun ();
+  void DoRun (void) override;
 };
 
 OriginatorBlockAckWindowTest::OriginatorBlockAckWindowTest ()
@@ -557,7 +560,7 @@
 public:
   CtrlBAckResponseHeaderTest ();
 private:
-  virtual void DoRun ();
+  void DoRun (void) override;
   CtrlBAckResponseHeader m_blockAckHdr; ///< block ack header
 };
 
@@ -569,7 +572,7 @@
 void
 CtrlBAckResponseHeaderTest::DoRun (void)
 {
-  m_blockAckHdr.SetType (COMPRESSED_BLOCK_ACK);
+  m_blockAckHdr.SetType (BlockAckType::COMPRESSED);
 
   //Case 1: startSeq < endSeq
   //          179        242
@@ -582,9 +585,23 @@
     {
       m_blockAckHdr.SetReceivedPacket (i);
     }
-  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetCompressedBitmap (), 0xffffc1ffffffffffLL, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[0], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[1], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[2], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[3], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[4], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[5], 0xc1, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[6], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[7], 0xff, "error in compressed bitmap");
   m_blockAckHdr.SetReceivedPacket (1500);
-  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetCompressedBitmap (), 0xffffc1ffffffffffLL, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[0], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[1], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[2], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[3], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[4], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[5], 0xc1, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[6], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[7], 0xff, "error in compressed bitmap");
   NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.IsPacketReceived (220), false, "error in compressed bitmap");
   NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.IsPacketReceived (225), true, "error in compressed bitmap");
   NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.IsPacketReceived (1500), false, "error in compressed bitmap");
@@ -602,9 +619,23 @@
     {
       m_blockAckHdr.SetReceivedPacket (i);
     }
-  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetCompressedBitmap (), 0x00000000007000ffffLL, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[0], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[1], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[2], 0x00, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[3], 0x70, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[4], 0x00, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[5], 0x00, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[6], 0x00, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[7], 0x00, "error in compressed bitmap");
   m_blockAckHdr.SetReceivedPacket (80);
-  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetCompressedBitmap (), 0x00000000007000ffffLL, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[0], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[1], 0xff, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[2], 0x00, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[3], 0x70, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[4], 0x00, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[5], 0x00, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[6], 0x00, "error in compressed bitmap");
+  NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.GetBitmap ()[7], 0x00, "error in compressed bitmap");
   NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.IsPacketReceived (4090), true, "error in compressed bitmap");
   NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.IsPacketReceived (4095), true, "error in compressed bitmap");
   NS_TEST_EXPECT_MSG_EQ (m_blockAckHdr.IsPacketReceived (10), false, "error in compressed bitmap");
@@ -617,6 +648,656 @@
  * \ingroup wifi-test
  * \ingroup tests
  *
+ * \brief Test for recipient reordering buffer operations
+ */
+class BlockAckRecipientBufferTest : public TestCase
+{
+public:
+  /**
+   * \brief Constructor
+   * \param ssn the Starting Sequence Number used to initialize WinStartB
+   */
+  BlockAckRecipientBufferTest (uint16_t ssn);
+  virtual ~BlockAckRecipientBufferTest ();
+
+  void DoRun (void) override;
+
+  /**
+   * Keep track of MPDUs that are forwarded up.
+   *
+   * \param mpdu an MPDU that is forwarded up
+   */
+  void ForwardUp (Ptr<WifiMacQueueItem> mpdu);
+
+private:
+  uint16_t m_ssn;                          //!< the Starting Sequence Number used to initialize WinStartB
+  std::list<Ptr<WifiMacQueueItem>> m_fwup; //!< list of MPDUs that have been forwarded up
+};
+
+BlockAckRecipientBufferTest::BlockAckRecipientBufferTest (uint16_t ssn)
+  : TestCase ("Test case for Block Ack recipient reordering buffer operations"),
+    m_ssn (ssn)
+{
+}
+
+BlockAckRecipientBufferTest::~BlockAckRecipientBufferTest ()
+{
+}
+
+void
+BlockAckRecipientBufferTest::ForwardUp (Ptr<WifiMacQueueItem> mpdu)
+{
+  m_fwup.push_back (mpdu);
+}
+
+void
+BlockAckRecipientBufferTest::DoRun (void)
+{
+  Ptr<MacRxMiddle> rxMiddle = Create<MacRxMiddle> ();
+  rxMiddle->SetForwardCallback (MakeCallback (&BlockAckRecipientBufferTest::ForwardUp, this));
+
+  RecipientBlockAckAgreement agreement (Mac48Address::Allocate () /* originator */,
+                                        true /* amsduSupported */, 0 /* tid */, 10 /* bufferSize */,
+                                        0 /* timeout */, m_ssn, true /* htSupported */);
+  agreement.SetMacRxMiddle (rxMiddle);
+
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_QOSDATA);
+  hdr.SetAddr1 (Mac48Address::Allocate ());
+  hdr.SetQosTid (0);
+
+  // Notify the reception of an MPDU with SN = SSN.
+  hdr.SetSequenceNumber (m_ssn);
+  agreement.NotifyReceivedMpdu (Create<WifiMacQueueItem> (Create<Packet>(), hdr));
+
+  // This MPDU is forwarded up and WinStartB is set to SSN + 1.
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.size (), 1, "MPDU with SN=SSN must have been forwarded up");
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.front ()->GetHeader ().GetSequenceNumber (), m_ssn,
+                         "The MPDU forwarded up is not the expected one");
+
+  m_fwup.clear ();
+
+  // Notify the reception of MPDUs with SN = SSN + {4, 2, 5, 3, 10, 7}
+  // Recipient buffer:   | |X|X|X|X| |X| | |X|
+  //                      ^
+  //                      |
+  //                   SSN + 1
+  hdr.SetSequenceNumber ((m_ssn + 4) % SEQNO_SPACE_SIZE);
+  agreement.NotifyReceivedMpdu (Create<WifiMacQueueItem> (Create<Packet>(), hdr));
+  hdr.SetSequenceNumber ((m_ssn + 2) % SEQNO_SPACE_SIZE);
+  agreement.NotifyReceivedMpdu (Create<WifiMacQueueItem> (Create<Packet>(), hdr));
+  hdr.SetSequenceNumber ((m_ssn + 5) % SEQNO_SPACE_SIZE);
+  agreement.NotifyReceivedMpdu (Create<WifiMacQueueItem> (Create<Packet>(), hdr));
+  hdr.SetSequenceNumber ((m_ssn + 3) % SEQNO_SPACE_SIZE);
+  agreement.NotifyReceivedMpdu (Create<WifiMacQueueItem> (Create<Packet>(), hdr));
+  hdr.SetSequenceNumber ((m_ssn + 10) % SEQNO_SPACE_SIZE);
+  agreement.NotifyReceivedMpdu (Create<WifiMacQueueItem> (Create<Packet>(), hdr));
+  hdr.SetSequenceNumber ((m_ssn + 7) % SEQNO_SPACE_SIZE);
+  agreement.NotifyReceivedMpdu (Create<WifiMacQueueItem> (Create<Packet>(), hdr));
+
+  // No MPDU is forwarded up because the one with SN = SSN + 1 is missing
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.empty (), true, "No MPDU must have been forwarded up");
+
+  // Notify the reception of an "old" MPDU (SN = SSN)
+  hdr.SetSequenceNumber (m_ssn);
+  agreement.NotifyReceivedMpdu (Create<WifiMacQueueItem> (Create<Packet>(), hdr));
+
+  // No MPDU is forwarded up
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.empty (), true, "No MPDU must have been forwarded up");
+
+  // Notify the reception of a duplicate MPDU (SN = SSN + 2)
+  hdr.SetSequenceNumber ((m_ssn + 2) % SEQNO_SPACE_SIZE);
+  agreement.NotifyReceivedMpdu (Create<WifiMacQueueItem> (Create<Packet>(10), hdr));
+
+  // No MPDU is forwarded up
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.empty (), true, "No MPDU must have been forwarded up");
+
+  // Notify the reception of an MPDU with SN = SSN + 1
+  // Recipient buffer:   |X|X|X|X|X| |X| | |X|
+  //                      ^
+  //                      |
+  //                   SSN + 1
+  hdr.SetSequenceNumber ((m_ssn + 1) % SEQNO_SPACE_SIZE);
+  agreement.NotifyReceivedMpdu (Create<WifiMacQueueItem> (Create<Packet>(), hdr));
+
+  // All the MPDUs with SN = SSN + {1, 2, 3, 4, 5} must have been forwarded up in order
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.size (), 5, "5 MPDUs must have been forwarded up");
+
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.front ()->GetHeader ().GetSequenceNumber (),
+                         (m_ssn + 1) % SEQNO_SPACE_SIZE,
+                         "The MPDU forwarded up is not the expected one");
+  m_fwup.pop_front ();
+
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.front ()->GetHeader ().GetSequenceNumber (),
+                         (m_ssn + 2) % SEQNO_SPACE_SIZE,
+                         "The MPDU forwarded up is not the expected one");
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.front ()->GetPacketSize (), 0,
+                         "The MPDU forwarded up is not the expected one");
+  m_fwup.pop_front ();
+
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.front ()->GetHeader ().GetSequenceNumber (),
+                         (m_ssn + 3) % SEQNO_SPACE_SIZE,
+                         "The MPDU forwarded up is not the expected one");
+  m_fwup.pop_front ();
+
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.front ()->GetHeader ().GetSequenceNumber (),
+                         (m_ssn + 4) % SEQNO_SPACE_SIZE,
+                         "The MPDU forwarded up is not the expected one");
+  m_fwup.pop_front ();
+
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.front ()->GetHeader ().GetSequenceNumber (),
+                         (m_ssn + 5) % SEQNO_SPACE_SIZE,
+                         "The MPDU forwarded up is not the expected one");
+  m_fwup.pop_front ();
+
+  // Recipient buffer:   | |X| | |X| | | | | |
+  //                      ^                 ^
+  //                      |                 |
+  //                   SSN + 6           SSN + 15
+  // Notify the reception of an MPDU beyond the current window (SN = SSN + 17)
+  hdr.SetSequenceNumber ((m_ssn + 17) % SEQNO_SPACE_SIZE);
+  agreement.NotifyReceivedMpdu (Create<WifiMacQueueItem> (Create<Packet>(), hdr));
+
+  // WinStartB is set to SSN + 8 (so that WinEndB = SSN + 17). The MPDU with
+  // SN = SSN + 7 is forwarded up, irrespective of the missed reception of the
+  // MPDU with SN = SSN + 6
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.size (), 1, "One MPDU must have been forwarded up");
+
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.front ()->GetHeader ().GetSequenceNumber (),
+                         (m_ssn + 7) % SEQNO_SPACE_SIZE,
+                         "The MPDU forwarded up is not the expected one");
+  m_fwup.pop_front ();
+
+  // Recipient buffer:   | | |X| | | | | | |X|
+  //                      ^                 ^
+  //                      |                 |
+  //                   SSN + 8           SSN + 17
+  // Notify the reception of a BlockAckReq with SSN = SSN + 7
+  agreement.NotifyReceivedBar ((m_ssn + 7) % SEQNO_SPACE_SIZE);
+
+  // No MPDU is forwarded up
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.empty (), true, "No MPDU must have been forwarded up");
+
+  // Notify the reception of a BlockAckReq with SSN = SSN + 8
+  agreement.NotifyReceivedBar ((m_ssn + 8) % SEQNO_SPACE_SIZE);
+
+  // No MPDU is forwarded up
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.empty (), true, "No MPDU must have been forwarded up");
+
+  // Notify the reception of MPDUs with SN = SSN + {9, 11}
+  // Recipient buffer:   | |X|X|X| | | | | |X|
+  //                      ^                 ^
+  //                      |                 |
+  //                   SSN + 8           SSN + 17
+  hdr.SetSequenceNumber ((m_ssn + 9) % SEQNO_SPACE_SIZE);
+  agreement.NotifyReceivedMpdu (Create<WifiMacQueueItem> (Create<Packet>(), hdr));
+  hdr.SetSequenceNumber ((m_ssn + 11) % SEQNO_SPACE_SIZE);
+  agreement.NotifyReceivedMpdu (Create<WifiMacQueueItem> (Create<Packet>(), hdr));
+
+  // No MPDU is forwarded up because the one with SN = SSN + 8 is missing
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.empty (), true, "No MPDU must have been forwarded up");
+
+  // Notify the reception of a BlockAckReq with SSN = SSN + 10
+  agreement.NotifyReceivedBar ((m_ssn + 10) % SEQNO_SPACE_SIZE);
+
+  // Forward up buffered MPDUs with SN < SSN + 10 (the MPDU with SN = SSN + 9)
+  // and then buffered MPDUs with SN >= SSN + 10 until a hole is found (MPDUs
+  // with SN = SSN + 10 and SN = SSN + 11)
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.size (), 3, "3 MPDUs must have been forwarded up");
+
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.front ()->GetHeader ().GetSequenceNumber (),
+                         (m_ssn + 9) % SEQNO_SPACE_SIZE,
+                         "The MPDU forwarded up is not the expected one");
+  m_fwup.pop_front ();
+
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.front ()->GetHeader ().GetSequenceNumber (),
+                         (m_ssn + 10) % SEQNO_SPACE_SIZE,
+                         "The MPDU forwarded up is not the expected one");
+  m_fwup.pop_front ();
+
+  NS_TEST_ASSERT_MSG_EQ (m_fwup.front ()->GetHeader ().GetSequenceNumber (),
+                         (m_ssn + 11) % SEQNO_SPACE_SIZE,
+                         "The MPDU forwarded up is not the expected one");
+  m_fwup.pop_front ();
+
+  Simulator::Run ();
+  Simulator::Destroy ();
+}
+
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief Test for Multi-STA block ack header
+ */
+class MultiStaCtrlBAckResponseHeaderTest : public TestCase
+{
+public:
+  MultiStaCtrlBAckResponseHeaderTest ();
+private:
+  virtual void DoRun (void);
+};
+
+MultiStaCtrlBAckResponseHeaderTest::MultiStaCtrlBAckResponseHeaderTest ()
+  : TestCase ("Check the correctness of Multi-STA block ack")
+{
+}
+
+void
+MultiStaCtrlBAckResponseHeaderTest::DoRun (void)
+{
+  // Create a Multi-STA Block Ack with 6 Per AID TID Info subfields
+  BlockAckType baType (BlockAckType::MULTI_STA, {0, 4, 8, 16, 32, 8});
+
+  CtrlBAckResponseHeader blockAck;
+  blockAck.SetType (baType);
+
+  /* 1st Per AID TID Info subfield */
+  uint16_t aid1 = 100;
+  bool ackType1 = true;
+  uint8_t tid1 = 1;
+
+  blockAck.SetAid11 (aid1, 0);
+  blockAck.SetAckType (ackType1, 0);
+  blockAck.SetTidInfo (tid1, 0);
+
+  /* 2nd Per AID TID Info subfield */
+  uint16_t aid2 = 200;
+  bool ackType2 = false;
+  uint8_t tid2 = 2;
+  uint16_t startSeq2 = 1000;
+
+  blockAck.SetAid11 (aid2, 1);
+  blockAck.SetAckType (ackType2, 1);
+  blockAck.SetTidInfo (tid2, 1);
+  blockAck.SetStartingSequence (startSeq2, 1);
+  // 1st byte of the bitmap: 01010101
+  for (uint16_t i = startSeq2; i < startSeq2 + 8; i+=2)
+    {
+      blockAck.SetReceivedPacket (i, 1);
+    }
+  // 2nd byte of the bitmap: 10101010
+  for (uint16_t i = startSeq2 + 9; i < startSeq2 + 16; i+=2)
+    {
+      blockAck.SetReceivedPacket (i, 1);
+    }
+  // 3rd byte of the bitmap: 00000000
+  // 4th byte of the bitmap: 11111111
+  for (uint16_t i = startSeq2 + 24; i < startSeq2 + 32; i++)
+    {
+      blockAck.SetReceivedPacket (i, 1);
+    }
+
+  /* 3rd Per AID TID Info subfield */
+  uint16_t aid3 = 300;
+  bool ackType3 = false;
+  uint8_t tid3 = 3;
+  uint16_t startSeq3 = 2000;
+
+  blockAck.SetAid11 (aid3, 2);
+  blockAck.SetAckType (ackType3, 2);
+  blockAck.SetTidInfo (tid3, 2);
+  blockAck.SetStartingSequence (startSeq3, 2);
+  // 1st byte of the bitmap: 01010101
+  for (uint16_t i = startSeq3; i < startSeq3 + 8; i+=2)
+    {
+      blockAck.SetReceivedPacket (i, 2);
+    }
+  // 2nd byte of the bitmap: 10101010
+  for (uint16_t i = startSeq3 + 9; i < startSeq3 + 16; i+=2)
+    {
+      blockAck.SetReceivedPacket (i, 2);
+    }
+  // 3rd byte of the bitmap: 00000000
+  // 4th byte of the bitmap: 11111111
+  for (uint16_t i = startSeq3 + 24; i < startSeq3 + 32; i++)
+    {
+      blockAck.SetReceivedPacket (i, 2);
+    }
+  // 5th byte of the bitmap: 00001111
+  for (uint16_t i = startSeq3 + 32; i < startSeq3 + 36; i++)
+    {
+      blockAck.SetReceivedPacket (i, 2);
+    }
+  // 6th byte of the bitmap: 11110000
+  for (uint16_t i = startSeq3 + 44; i < startSeq3 + 48; i++)
+    {
+      blockAck.SetReceivedPacket (i, 2);
+    }
+  // 7th byte of the bitmap: 00000000
+  // 8th byte of the bitmap: 11111111
+  for (uint16_t i = startSeq3 + 56; i < startSeq3 + 64; i++)
+    {
+      blockAck.SetReceivedPacket (i, 2);
+    }
+
+  /* 4th Per AID TID Info subfield */
+  uint16_t aid4 = 400;
+  bool ackType4 = false;
+  uint8_t tid4 = 4;
+  uint16_t startSeq4 = 3000;
+
+  blockAck.SetAid11 (aid4, 3);
+  blockAck.SetAckType (ackType4, 3);
+  blockAck.SetTidInfo (tid4, 3);
+  blockAck.SetStartingSequence (startSeq4, 3);
+  // 1st byte of the bitmap: 01010101
+  for (uint16_t i = startSeq4; i < startSeq4 + 8; i+=2)
+    {
+      blockAck.SetReceivedPacket (i, 3);
+    }
+  // 2nd byte of the bitmap: 10101010
+  for (uint16_t i = startSeq4 + 9; i < startSeq4 + 16; i+=2)
+    {
+      blockAck.SetReceivedPacket (i, 3);
+    }
+  // 3rd byte of the bitmap: 00000000
+  // 4th byte of the bitmap: 11111111
+  for (uint16_t i = startSeq4 + 24; i < startSeq4 + 32; i++)
+    {
+      blockAck.SetReceivedPacket (i, 3);
+    }
+  // 5th byte of the bitmap: 00001111
+  for (uint16_t i = startSeq4 + 32; i < startSeq4 + 36; i++)
+    {
+      blockAck.SetReceivedPacket (i, 3);
+    }
+  // 6th byte of the bitmap: 11110000
+  for (uint16_t i = startSeq4 + 44; i < startSeq4 + 48; i++)
+    {
+      blockAck.SetReceivedPacket (i, 3);
+    }
+  // 7th byte of the bitmap: 00000000
+  // 8th byte of the bitmap: 11111111
+  for (uint16_t i = startSeq4 + 56; i < startSeq4 + 64; i++)
+    {
+      blockAck.SetReceivedPacket (i, 3);
+    }
+  // 9th byte of the bitmap: 00000000
+  // 10th byte of the bitmap: 11111111
+  for (uint16_t i = startSeq4 + 72; i < startSeq4 + 80; i++)
+    {
+      blockAck.SetReceivedPacket (i, 3);
+    }
+  // 11th byte of the bitmap: 00000000
+  // 12th byte of the bitmap: 11111111
+  for (uint16_t i = startSeq4 + 88; i < startSeq4 + 96; i++)
+    {
+      blockAck.SetReceivedPacket (i, 3);
+    }
+  // 13th byte of the bitmap: 00000000
+  // 14th byte of the bitmap: 11111111
+  for (uint16_t i = startSeq4 + 104; i < startSeq4 + 112; i++)
+    {
+      blockAck.SetReceivedPacket (i, 3);
+    }
+  // 15th byte of the bitmap: 00000000
+  // 16th byte of the bitmap: 11111111
+  for (uint16_t i = startSeq4 + 120; i < startSeq4 + 128; i++)
+    {
+      blockAck.SetReceivedPacket (i, 3);
+    }
+
+  /* 5th Per AID TID Info subfield */
+  uint16_t aid5 = 500;
+  bool ackType5 = false;
+  uint8_t tid5 = 5;
+  uint16_t startSeq5 = 4000;
+
+  blockAck.SetAid11 (aid5, 4);
+  blockAck.SetAckType (ackType5, 4);
+  blockAck.SetTidInfo (tid5, 4);
+  blockAck.SetStartingSequence (startSeq5, 4);
+  // 1st byte of the bitmap: 01010101
+  for (uint16_t i = startSeq5; i < startSeq5 + 8; i+=2)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 2nd byte of the bitmap: 10101010
+  for (uint16_t i = startSeq5 + 9; i < startSeq5 + 16; i+=2)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 3rd byte of the bitmap: 00000000
+  // 4th byte of the bitmap: 11111111
+  for (uint16_t i = startSeq5 + 24; i < startSeq5 + 32; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 5th byte of the bitmap: 00001111
+  for (uint16_t i = startSeq5 + 32; i < startSeq5 + 36; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 6th byte of the bitmap: 11110000
+  for (uint16_t i = startSeq5 + 44; i < startSeq5 + 48; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 7th byte of the bitmap: 00000000
+  // 8th byte of the bitmap: 11111111
+  for (uint16_t i = startSeq5 + 56; i < startSeq5 + 64; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 9th byte of the bitmap: 00000000
+  // 10th byte of the bitmap: 11111111
+  for (uint16_t i = startSeq5 + 72; i < startSeq5 + 80; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 11th byte of the bitmap: 00000000
+  // 12th byte of the bitmap: 11111111
+  for (uint16_t i = startSeq5 + 88; i < startSeq5 + 96; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 13th byte of the bitmap: 00000000
+  // 14th byte of the bitmap: 11111111
+  for (uint16_t i = (startSeq5 + 104) % 4096; i < (startSeq5 + 112) % 4096; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 15th byte of the bitmap: 00000000
+  // 16th byte of the bitmap: 11111111
+  for (uint16_t i = (startSeq5 + 120) % 4096; i < (startSeq5 + 128) % 4096; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 17th byte of the bitmap: 00000000
+  // 18th byte of the bitmap: 11111111
+  for (uint16_t i = (startSeq5 + 136) % 4096; i < (startSeq5 + 144) % 4096; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 19th byte of the bitmap: 00000000
+  // 20th byte of the bitmap: 11111111
+  for (uint16_t i = (startSeq5 + 152) % 4096; i < (startSeq5 + 160) % 4096; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 21th byte of the bitmap: 00000000
+  // 22th byte of the bitmap: 11111111
+  for (uint16_t i = (startSeq5 + 168) % 4096; i < (startSeq5 + 176) % 4096; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 23th byte of the bitmap: 00000000
+  // 24th byte of the bitmap: 11111111
+  for (uint16_t i = (startSeq5 + 184) % 4096; i < (startSeq5 + 192) % 4096; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 25th byte of the bitmap: 00000000
+  // 26th byte of the bitmap: 11111111
+  for (uint16_t i = (startSeq5 + 200) % 4096; i < (startSeq5 + 208) % 4096; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 27th byte of the bitmap: 00000000
+  // 28th byte of the bitmap: 11111111
+  for (uint16_t i = (startSeq5 + 216) % 4096; i < (startSeq5 + 224) % 4096; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 29th byte of the bitmap: 00000000
+  // 30th byte of the bitmap: 11111111
+  for (uint16_t i = (startSeq5 + 232) % 4096; i < (startSeq5 + 240) % 4096; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+  // 31th byte of the bitmap: 00000000
+  // 32th byte of the bitmap: 11111111
+  for (uint16_t i = (startSeq5 + 248) % 4096; i < (startSeq5 + 256) % 4096; i++)
+    {
+      blockAck.SetReceivedPacket (i, 4);
+    }
+
+  /* 6th Per AID TID Info subfield */
+  uint16_t aid6 = 2045;
+  bool ackType6 = true;
+  uint8_t tid6 = 6;
+  Mac48Address address6 = Mac48Address ("00:00:00:00:00:01");
+
+  blockAck.SetAid11 (aid6, 5);
+  blockAck.SetAckType (ackType6, 5);
+  blockAck.SetTidInfo (tid6, 5);
+  blockAck.SetUnassociatedStaAddress (address6, 5);
+
+  // Serialize the header
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader (blockAck);
+
+  // Deserialize the header
+  CtrlBAckResponseHeader blockAckCopy;
+  packet->RemoveHeader (blockAckCopy);
+
+  // Check that the header has been correctly deserialized
+  BlockAckType baTypeCopy = blockAckCopy.GetType ();
+
+  NS_TEST_EXPECT_MSG_EQ (baTypeCopy.m_variant, BlockAckType::MULTI_STA, "Different block ack variant");
+  NS_TEST_EXPECT_MSG_EQ (baTypeCopy.m_bitmapLen.size (), 6, "Different number of bitmaps");
+  NS_TEST_EXPECT_MSG_EQ (baTypeCopy.m_bitmapLen[0], 0, "Different length of the first bitmap");
+  NS_TEST_EXPECT_MSG_EQ (baTypeCopy.m_bitmapLen[1], 4, "Different length of the second bitmap");
+  NS_TEST_EXPECT_MSG_EQ (baTypeCopy.m_bitmapLen[2], 8, "Different length of the third bitmap");
+  NS_TEST_EXPECT_MSG_EQ (baTypeCopy.m_bitmapLen[3], 16, "Different length of the fourth bitmap");
+  NS_TEST_EXPECT_MSG_EQ (baTypeCopy.m_bitmapLen[4], 32, "Different length of the fifth bitmap");
+  NS_TEST_EXPECT_MSG_EQ (baTypeCopy.m_bitmapLen[5], 8, "Different length for the sixth bitmap");
+
+  /* Check 1st Per AID TID Info subfield */
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetAid11 (0), aid1, "Different AID for the first Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetAckType (0), ackType1, "Different Ack Type for the first Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetTidInfo (0), tid1, "Different TID for the first Per AID TID Info subfield");
+
+  /* Check 2nd Per AID TID Info subfield */
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetAid11 (1), aid2, "Different AID for the second Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetAckType (1), ackType2, "Different Ack Type for the second Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetTidInfo (1), tid2, "Different TID for the second Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetStartingSequence (1), startSeq2, "Different starting sequence number for the second Per AID TID Info subfield");
+
+  auto& bitmap2 = blockAckCopy.GetBitmap (1);
+  NS_TEST_EXPECT_MSG_EQ (bitmap2.size (), 4, "Different bitmap length for the second Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap2[0], 0x55, "Error in the 1st byte of the bitmap for the second Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap2[1], 0xaa, "Error in the 2nd byte of the bitmap for the second Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap2[2], 0x00, "Error in the 3rd byte of the bitmap for the second Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap2[3], 0xff, "Error in the 4th byte of the bitmap for the second Per AID TID Info subfield");
+
+  /* Check 3rd Per AID TID Info subfield */
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetAid11 (2), aid3, "Different AID for the third Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetAckType (2), ackType3, "Different Ack Type for the third Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetTidInfo (2), tid3, "Different TID for the third Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetStartingSequence (2), startSeq3, "Different starting sequence number for the third Per AID TID Info subfield");
+
+  auto& bitmap3 = blockAckCopy.GetBitmap (2);
+  NS_TEST_EXPECT_MSG_EQ (bitmap3.size (), 8, "Different bitmap length for the third Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap3[0], 0x55, "Error in the 1st byte of the bitmap for the third Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap3[1], 0xaa, "Error in the 2nd byte of the bitmap for the third Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap3[2], 0x00, "Error in the 3rd byte of the bitmap for the third Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap3[3], 0xff, "Error in the 4th byte of the bitmap for the third Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap3[4], 0x0f, "Error in the 5th byte of the bitmap for the third Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap3[5], 0xf0, "Error in the 6th byte of the bitmap for the third Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap3[6], 0x00, "Error in the 7th byte of the bitmap for the third Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap3[7], 0xff, "Error in the 8th byte of the bitmap for the third Per AID TID Info subfield");
+
+  /* Check 4th Per AID TID Info subfield */
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetAid11 (3), aid4, "Different AID for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetAckType (3), ackType4, "Different Ack Type for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetTidInfo (3), tid4, "Different TID for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetStartingSequence (3), startSeq4, "Different starting sequence number for the fourth Per AID TID Info subfield");
+
+  auto& bitmap4 = blockAckCopy.GetBitmap (3);
+  NS_TEST_EXPECT_MSG_EQ (bitmap4.size (), 16, "Different bitmap length for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[0], 0x55, "Error in the 1st byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[1], 0xaa, "Error in the 2nd byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[2], 0x00, "Error in the 3rd byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[3], 0xff, "Error in the 4th byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[4], 0x0f, "Error in the 5th byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[5], 0xf0, "Error in the 6th byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[6], 0x00, "Error in the 7th byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[7], 0xff, "Error in the 8th byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[8], 0x00, "Error in the 9th byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[9], 0xff, "Error in the 10th byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[10], 0x00, "Error in the 11th byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[11], 0xff, "Error in the 12th byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[12], 0x00, "Error in the 13th byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[13], 0xff, "Error in the 14th byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[14], 0x00, "Error in the 15th byte of the bitmap for the fourth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap4[15], 0xff, "Error in the 16th byte of the bitmap for the fourth Per AID TID Info subfield");
+
+  /* Check 5th Per AID TID Info subfield */
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetAid11 (4), aid5, "Different AID for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetAckType (4), ackType5, "Different Ack Type for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetTidInfo (4), tid5, "Different TID for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetStartingSequence (4), startSeq5, "Different starting sequence number for the fifth Per AID TID Info subfield");
+
+  auto& bitmap5 = blockAckCopy.GetBitmap (4);
+  NS_TEST_EXPECT_MSG_EQ (bitmap5.size (), 32, "Different bitmap length for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[0], 0x55, "Error in the 1st byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[1], 0xaa, "Error in the 2nd byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[2], 0x00, "Error in the 3rd byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[3], 0xff, "Error in the 4th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[4], 0x0f, "Error in the 5th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[5], 0xf0, "Error in the 6th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[6], 0x00, "Error in the 7th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[7], 0xff, "Error in the 8th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[8], 0x00, "Error in the 9th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[9], 0xff, "Error in the 10th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[10], 0x00, "Error in the 11th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[11], 0xff, "Error in the 12th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[12], 0x00, "Error in the 13th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[13], 0xff, "Error in the 14th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[14], 0x00, "Error in the 15th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[15], 0xff, "Error in the 16th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[16], 0x00, "Error in the 17th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[17], 0xff, "Error in the 18th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[18], 0x00, "Error in the 19th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[19], 0xff, "Error in the 20th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[20], 0x00, "Error in the 21th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[21], 0xff, "Error in the 22th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[22], 0x00, "Error in the 23th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[23], 0xff, "Error in the 24th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[24], 0x00, "Error in the 25th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[25], 0xff, "Error in the 26th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[26], 0x00, "Error in the 27th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[27], 0xff, "Error in the 28th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[28], 0x00, "Error in the 29th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[29], 0xff, "Error in the 30th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[30], 0x00, "Error in the 31th byte of the bitmap for the fifth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (bitmap5[31], 0xff, "Error in the 32th byte of the bitmap for the fifth Per AID TID Info subfield");
+
+  /* Check 6th Per AID TID Info subfield */
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetAid11 (5), aid6, "Different AID for the sixth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetAckType (5), ackType6, "Different Ack Type for the sixth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetTidInfo (5), tid6, "Different TID for the sixth Per AID TID Info subfield");
+  NS_TEST_EXPECT_MSG_EQ (blockAckCopy.GetUnassociatedStaAddress (5), address6, "Different starting sequence number for the sixth Per AID TID Info subfield");
+}
+
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
  * \brief Test for Block Ack Policy with aggregation disabled
  *
  * This test aims to check the Block Ack policy when A-MPDU aggregation is disabled.
@@ -681,7 +1362,7 @@
   BlockAckAggregationDisabledTest (bool txop);
   virtual ~BlockAckAggregationDisabledTest ();
 
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 
 private:
@@ -755,7 +1436,7 @@
   WifiMacHeader hdr;
   p->PeekHeader (hdr);
 
-  if (m_txSinceBar == 9 || m_txTotal == 14)
+  if (m_nBar < 2 && (m_txSinceBar == 9 || m_txTotal == 14))
     {
       NS_TEST_ASSERT_MSG_EQ (hdr.IsBlockAckReq (), true, "Didn't get a BlockAckReq when expected");
     }
@@ -814,15 +1495,15 @@
   phy.SetChannel (channel.Create ());
 
   WifiHelper wifi;
-  wifi.SetStandard (WIFI_STANDARD_80211a);
-  wifi.SetAckPolicySelectorForAc (AC_BE, "ns3::ConstantWifiAckPolicySelector",
-                                  "BaThreshold", DoubleValue (0.125));
+  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+  Config::SetDefault ("ns3::WifiDefaultAckManager::BaThreshold", DoubleValue (0.125));
   wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
 
   WifiMacHelper mac;
   Ssid ssid = Ssid ("ns-3-ssid");
   mac.SetType ("ns3::StaWifiMac",
-               "QosSupported", BooleanValue (true),
+               "BE_MaxAmsduSize", UintegerValue (0),
+               "BE_MaxAmpduSize", UintegerValue (0),
                "Ssid", SsidValue (ssid),
                /* setting blockack threshold for sta's BE queue */
                "BE_BlockAckThreshold", UintegerValue (2),
@@ -832,7 +1513,8 @@
   staDevices = wifi.Install (phy, mac, wifiStaNode);
 
   mac.SetType ("ns3::ApWifiMac",
-               "QosSupported", BooleanValue (true),
+               "BE_MaxAmsduSize", UintegerValue (0),
+               "BE_MaxAmpduSize", UintegerValue (0),
                "Ssid", SsidValue (ssid),
                "BeaconGeneration", BooleanValue (true));
 
@@ -952,6 +1634,9 @@
   AddTestCase (new PacketBufferingCaseB, TestCase::QUICK);
   AddTestCase (new OriginatorBlockAckWindowTest, TestCase::QUICK);
   AddTestCase (new CtrlBAckResponseHeaderTest, TestCase::QUICK);
+  AddTestCase (new BlockAckRecipientBufferTest (0), TestCase::QUICK);
+  AddTestCase (new BlockAckRecipientBufferTest (4090), TestCase::QUICK);
+  AddTestCase (new MultiStaCtrlBAckResponseHeaderTest, TestCase::QUICK);
   AddTestCase (new BlockAckAggregationDisabledTest (false), TestCase::QUICK);
   AddTestCase (new BlockAckAggregationDisabledTest (true), TestCase::QUICK);
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/channel-access-manager-test.cc ns-3.34/src/wifi/test/channel-access-manager-test.cc
--- ns-3.33/src/wifi/test/channel-access-manager-test.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/channel-access-manager-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -21,8 +21,8 @@
 #include "ns3/test.h"
 #include "ns3/simulator.h"
 #include "ns3/channel-access-manager.h"
+#include "ns3/frame-exchange-manager.h"
 #include "ns3/qos-txop.h"
-#include "ns3/mac-low.h"
 
 using namespace ns3;
 
@@ -58,8 +58,22 @@
   /// allow ChannelAccessManagerTest class access
   friend class ChannelAccessManagerTest<TxopType>;
 
-  /// Inherited
-  void DoDispose (void);
+  /// \copydoc ns3::Txop::DoDispose
+  void DoDispose (void) override;
+  /// \copydoc ns3::Txop::NotifyChannelAccessed
+  void NotifyChannelAccessed (Time txopDuration = Seconds (0)) override;
+  /// \copydoc ns3::Txop::NotifyInternalCollision
+  void NotifyInternalCollision (void) override;
+  /// \copydoc ns3::Txop::HasFramesToTransmit
+  bool HasFramesToTransmit (void) override;
+  /// \copydoc ns3::Txop::NotifyChannelSwitching
+  void NotifyChannelSwitching (void) override;
+  /// \copydoc ns3::Txop::NotifySleep
+  void NotifySleep (void) override;
+  /// \copydoc ns3::Txop::NotifyWakeUp
+  void NotifyWakeUp (void) override;
+  /// \copydoc ns3::Txop::GenerateBackoff
+  void GenerateBackoff (void) override;
 
   typedef std::pair<uint64_t,uint64_t> ExpectedGrant; //!< the expected grant typedef
   typedef std::list<ExpectedGrant> ExpectedGrants; //!< the collection of expected grants typedef
@@ -76,72 +90,12 @@
   ExpectedGrants m_expectedGrants; //!< expected grants
 
   /**
-   * \returns true if access has been requested for this function and
-   *          has not been granted already, false otherwise.
-   */
-  bool IsAccessRequested (void) const;
-  /**
-   * Notify that access request has been received.
-   */
-  void NotifyAccessRequested (void);
-  /**
-   * Notify the Txop that access has been granted.
-   */
-  void NotifyAccessGranted (void);
-  /**
-   * Notify the Txop that internal collision has occurred.
-   */
-  void NotifyInternalCollision (void);
-  /**
-   * Generate a new backoff now.
-   */
-  void GenerateBackoff (void);
-  /**
    * Check if the Txop has frames to transmit.
    * \return true if the Txop has frames to transmit.
    */
-  bool HasFramesToTransmit (void);
-  /**
-   * When a channel switching occurs, enqueued packets are removed.
-   */
-  void NotifyChannelSwitching (void);
-  /**
-   * When sleep operation occurs, if there is a pending packet transmission,
-   * it will be reinserted to the front of the queue.
-   */
-  void NotifySleep (void);
-  /**
-   * When wake up operation occurs, channel access will be restarted.
-   */
-  void NotifyWakeUp (void);
 
   ChannelAccessManagerTest<TxopType> *m_test; //!< the test DCF/EDCA manager
   uint32_t m_i; //!< the index of the Txop
-  bool m_accessRequested; //!< true if access requested
-};
-
-/**
- * \ingroup wifi-test
- * \ingroup tests
- *
- * \brief Mac Low Stub
- */
-class MacLowStub : public MacLow
-{
-public:
-  MacLowStub ()
-  {
-  }
-  /**
-   * This function indicates whether Simulator::Now is in the CF period.
-   *
-   * \return true if Simulator::Now is in CF period,
-   *         false otherwise
-   */
-  bool IsCfPeriod (void) const
-  {
-    return false;
-  }
 };
 
 /**
@@ -185,25 +139,50 @@
   }
 
 private:
-  // Inherited from base class
-  Time GetSifs (void) const
+  Time GetSifs (void) const override
   {
     return m_sifs;
   }
 
-  Time GetSlot (void) const
+  Time GetSlot (void) const override
   {
     return m_slot;
   }
 
-  Time GetEifsNoDifs (void) const
+  Time GetEifsNoDifs (void) const override
   {
     return m_eifsNoDifs;
   }
 
-  Time m_slot;        // slot duration
-  Time m_sifs;        // SIFS duration
-  Time m_eifsNoDifs;  // EIFS duration minus a DIFS
+  Time m_slot;        //!< slot duration
+  Time m_sifs;        //!< SIFS duration
+  Time m_eifsNoDifs;  //!< EIFS duration minus a DIFS
+};
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief Frame Exchange Manager Stub
+ */
+class FrameExchangeManagerStub : public FrameExchangeManager
+{
+public:
+  FrameExchangeManagerStub ()
+  {
+  }
+  /**
+   * Request the FrameExchangeManager to start a frame exchange sequence.
+   *
+   * \param dcf the channel access function that gained channel access. It is
+   *            the DCF on non-QoS stations and an EDCA on QoS stations.
+   * \return true if a frame exchange sequence was started, false otherwise
+   */
+  bool StartTransmission (Ptr<Txop> dcf) override
+  {
+    dcf->NotifyChannelAccessed ();
+    return true;
+  }
 };
 
 /**
@@ -217,7 +196,7 @@
 {
 public:
   ChannelAccessManagerTest ();
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
   /**
    * Notify access granted function
@@ -386,7 +365,7 @@
 
   typedef std::vector<Ptr<TxopTest<TxopType>>> TxopTests; //!< the TXOP tests typedef
 
-  Ptr<MacLowStub> m_low; //!< the MAC low stubbed
+  Ptr<FrameExchangeManagerStub> m_feManager; //!< the Frame Exchange Manager stubbed
   Ptr<ChannelAccessManagerStub> m_ChannelAccessManager; //!< the channel access manager
   TxopTests m_txop; //!< the vector of Txop test instances
   uint32_t m_ackTimeoutValue; //!< the Ack timeout value
@@ -402,8 +381,7 @@
 template <typename TxopType>
 TxopTest<TxopType>::TxopTest (ChannelAccessManagerTest<TxopType> *test, uint32_t i)
   : m_test (test),
-    m_i (i),
-    m_accessRequested (false)
+    m_i (i)
 {
 }
 
@@ -412,28 +390,14 @@
 TxopTest<TxopType>::DoDispose (void)
 {
   m_test = 0;
-  Txop::DoDispose ();
-}
-
-template <typename TxopType>
-bool
-TxopTest<TxopType>::IsAccessRequested (void) const
-{
-  return m_accessRequested;
+  TxopType::DoDispose ();
 }
 
 template <typename TxopType>
 void
-TxopTest<TxopType>::NotifyAccessRequested (void)
+TxopTest<TxopType>::NotifyChannelAccessed (Time txopDuration)
 {
-  m_accessRequested = true;
-}
-
-template <typename TxopType>
-void
-TxopTest<TxopType>::NotifyAccessGranted (void)
-{
-  m_accessRequested = false;
+  Txop::m_access = Txop::NOT_REQUESTED;
   m_test->NotifyAccessGranted (m_i);
 }
 
@@ -549,7 +513,7 @@
       state->m_expectedGrants.pop_front ();
       NS_TEST_EXPECT_MSG_EQ (Simulator::Now (), MicroSeconds (expected.second), "Expected grant is now");
     }
-  state->m_accessRequested = false;
+  state->Txop::m_access = Txop::NOT_REQUESTED;
 }
 
 template <typename TxopType>
@@ -594,8 +558,8 @@
 ChannelAccessManagerTest<TxopType>::StartTest (uint64_t slotTime, uint64_t sifs, uint64_t eifsNoDifsNoSifs, uint32_t ackTimeoutValue)
 {
   m_ChannelAccessManager = CreateObject<ChannelAccessManagerStub> ();
-  m_low = CreateObject<MacLowStub> ();
-  m_ChannelAccessManager->SetupLow (m_low);
+  m_feManager = CreateObject<FrameExchangeManagerStub> ();
+  m_ChannelAccessManager->SetupFrameExchangeManager (m_feManager);
   m_ChannelAccessManager->SetSlot (MicroSeconds (slotTime));
   m_ChannelAccessManager->SetSifs (MicroSeconds (sifs));
   m_ChannelAccessManager->SetEifsNoDifs (MicroSeconds (eifsNoDifsNoSifs + sifs));
@@ -610,7 +574,6 @@
   txop->SetAifsn (aifsn);
   m_txop.push_back (txop);
   txop->SetChannelAccessManager (m_ChannelAccessManager);
-  txop->SetMacLow (m_low);
 }
 
 template <typename TxopType>
@@ -618,7 +581,6 @@
 ChannelAccessManagerTest<TxopType>::EndTest (void)
 {
   Simulator::Run ();
-  Simulator::Destroy ();
 
   for (typename TxopTests::const_iterator i = m_txop.begin (); i != m_txop.end (); i++)
     {
@@ -631,8 +593,10 @@
     }
   m_txop.clear ();
 
+  m_ChannelAccessManager->Dispose ();
   m_ChannelAccessManager = 0;
-  m_low = 0;
+  m_feManager = 0;
+  Simulator::Destroy ();
 }
 
 template <typename TxopType>
@@ -1142,7 +1106,7 @@
   StartTest (4, 6, 10);
   AddTxop (1);
   AddRxOkEvt (20, 30);
-  AddAccessRequest (52, 20, 60, 0);
+  AddAccessRequest (58, 20, 60, 0);
   EndTest ();
 
   // Check alignment at slot boundary after successful reception (backoff = 0):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/examples-to-run.py ns-3.34/src/wifi/test/examples-to-run.py
--- ns-3.33/src/wifi/test/examples-to-run.py	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/examples-to-run.py	2021-07-14 10:31:07.000000000 -0700
@@ -29,13 +29,11 @@
     ("wifi-phy-configuration --testCase=18", "True", "False"),
     ("wifi-phy-configuration --testCase=19", "True", "False"),
     ("wifi-phy-configuration --testCase=20", "True", "False"),
-    ("wifi-phy-configuration --testCase=21", "True", "False"),
     ("wifi-manager-example --wifiManager=Aarf --standard=802.11a --stepTime=0.1", "True", "True"),
     ("wifi-manager-example --wifiManager=Aarf --standard=802.11a --rtsThreshold=0 --stepTime=0.1", "True", "True"),
     ("wifi-manager-example --wifiManager=Aarf --standard=802.11a --maxSlrc=1 --stepTime=0.1", "True", "True"),
     ("wifi-manager-example --wifiManager=Aarf --standard=802.11b --serverChannelWidth=22 --clientChannelWidth=22 --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Aarf --standard=802.11g --stepTime=0.1", "True", "False"),
-    ("wifi-manager-example --wifiManager=Aarf --standard=802.11-holland --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Aarf --standard=802.11p-10MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Aarf --standard=802.11p-5MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Aarfcd --standard=802.11a --stepTime=0.1", "True", "True"),
@@ -43,7 +41,6 @@
     ("wifi-manager-example --wifiManager=Aarfcd --standard=802.11a --maxSlrc=1 --stepTime=0.1", "True", "True"),
     ("wifi-manager-example --wifiManager=Aarfcd --standard=802.11b --serverChannelWidth=22 --clientChannelWidth=22 --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Aarfcd --standard=802.11g --stepTime=0.1", "True", "False"),
-    ("wifi-manager-example --wifiManager=Aarfcd --standard=802.11-holland --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Aarfcd --standard=802.11p-10MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Aarfcd --standard=802.11p-5MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Amrr --standard=802.11a --stepTime=0.1", "True", "True"),
@@ -51,7 +48,6 @@
     ("wifi-manager-example --wifiManager=Amrr --standard=802.11a --maxSlrc=1 --stepTime=0.1", "True", "True"),
     ("wifi-manager-example --wifiManager=Amrr --standard=802.11b --serverChannelWidth=22 --clientChannelWidth=22 --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Amrr --standard=802.11g --stepTime=0.1", "True", "False"),
-    ("wifi-manager-example --wifiManager=Amrr --standard=802.11-holland --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Amrr --standard=802.11p-10MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Amrr --standard=802.11p-5MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Arf --standard=802.11a --stepTime=0.1", "True", "True"),
@@ -59,7 +55,6 @@
     ("wifi-manager-example --wifiManager=Arf --standard=802.11a --maxSlrc=1 --stepTime=0.1", "True", "True"),
     ("wifi-manager-example --wifiManager=Arf --standard=802.11b --serverChannelWidth=22 --clientChannelWidth=22 --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Arf --standard=802.11g --stepTime=0.1", "True", "False"),
-    ("wifi-manager-example --wifiManager=Arf --standard=802.11-holland --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Arf --standard=802.11p-10MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Arf --standard=802.11p-5MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Cara --standard=802.11a --stepTime=0.1", "True", "True"),
@@ -67,7 +62,6 @@
     ("wifi-manager-example --wifiManager=Cara --standard=802.11a --maxSlrc=1 --stepTime=0.1", "True", "True"),
     ("wifi-manager-example --wifiManager=Cara --standard=802.11b --serverChannelWidth=22 --clientChannelWidth=22 --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Cara --standard=802.11g --stepTime=0.1", "True", "False"),
-    ("wifi-manager-example --wifiManager=Cara --standard=802.11-holland --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Cara --standard=802.11p-10MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Cara --standard=802.11p-5MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Onoe --standard=802.11a --stepTime=0.1", "True", "True"),
@@ -75,7 +69,6 @@
     ("wifi-manager-example --wifiManager=Onoe --standard=802.11a --maxSlrc=1 --stepTime=0.1", "True", "True"),
     ("wifi-manager-example --wifiManager=Onoe --standard=802.11b --serverChannelWidth=22 --clientChannelWidth=22 --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Onoe --standard=802.11g --stepTime=0.1", "True", "False"),
-    ("wifi-manager-example --wifiManager=Onoe --standard=802.11-holland --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Onoe --standard=802.11p-10MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Onoe --standard=802.11p-5MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Rraa --standard=802.11a --stepTime=0.1", "True", "True"),
@@ -83,7 +76,6 @@
     ("wifi-manager-example --wifiManager=Rraa --standard=802.11a --maxSlrc=1 --stepTime=0.1", "True", "True"),
     ("wifi-manager-example --wifiManager=Rraa --standard=802.11b --serverChannelWidth=22 --clientChannelWidth=22 --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Rraa --standard=802.11g --stepTime=0.1", "True", "False"),
-    ("wifi-manager-example --wifiManager=Rraa --standard=802.11-holland --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Rraa --standard=802.11p-10MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Rraa --standard=802.11p-5MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Minstrel --standard=802.11a --stepTime=0.1", "True", "True"),
@@ -91,13 +83,11 @@
     ("wifi-manager-example --wifiManager=Minstrel --standard=802.11a --maxSlrc=1 --stepTime=0.1", "True", "True"),
     ("wifi-manager-example --wifiManager=Minstrel --standard=802.11b --serverChannelWidth=22 --clientChannelWidth=22 --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Minstrel --standard=802.11g --stepTime=0.1", "True", "False"),
-    ("wifi-manager-example --wifiManager=Minstrel --standard=802.11-holland --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Minstrel --standard=802.11p-10MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Minstrel --standard=802.11p-5MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11a --stepTime=0.1", "True", "True"),
     ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11b --serverChannelWidth=22 --clientChannelWidth=22 --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11g --stepTime=0.1", "True", "False"),
-    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11-holland --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11p-10MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11p-5MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11n-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
@@ -167,7 +157,6 @@
     ("wifi-manager-example --wifiManager=Ideal --standard=802.11a --stepTime=0.1", "True", "True"),
     ("wifi-manager-example --wifiManager=Ideal --standard=802.11b --serverChannelWidth=22 --clientChannelWidth=22 --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Ideal --standard=802.11g --stepTime=0.1", "True", "False"),
-    ("wifi-manager-example --wifiManager=Ideal --standard=802.11-holland --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Ideal --standard=802.11p-10MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Ideal --standard=802.11p-5MHz --stepTime=0.1", "True", "False"),
     ("wifi-manager-example --wifiManager=Ideal --standard=802.11n-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
@@ -306,15 +295,183 @@
     ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
     ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
     ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=Ideal --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-5GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-2.4GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=1 --clientNss=1 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=2 --clientNss=2 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=3 --clientNss=3 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=20 --clientChannelWidth=20 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=40 --clientChannelWidth=40 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=80 --clientChannelWidth=80 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=800 --clientShortGuardInterval=800 --serverNss=4 --clientNss=4 --stepTime=0.1", "False", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=1600 --clientShortGuardInterval=1600 --serverNss=4 --clientNss=4 --stepTime=0.1", "True", "False"),
+    ("wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1", "True", "False"),
     ("wifi-test-interference-helper --enableCapture=0 --txPowerA=5 --txPowerB=15 --delay=10 --txModeA=OfdmRate6Mbps --txModeB=OfdmRate6Mbps --checkResults=1 --expectRxASuccessfull=0 --expectRxBSuccessfull=0", "True", "True"),
     ("wifi-test-interference-helper --enableCapture=0 --txPowerA=5 --txPowerB=15  --delay=17 --standard=WIFI_PHY_STANDARD_80211ac --preamble=WIFI_PREAMBLE_VHT_SU --txModeA=VhtMcs0 --txModeB=VhtMcs0 --checkResults=1 --expectRxASuccessfull=0 --expectRxBSuccessfull=0", "True", "True"),
     ("wifi-test-interference-helper --enableCapture=0 --txPowerA=5 --txPowerB=15  --delay=20 --standard=WIFI_PHY_STANDARD_80211ac --preamble=WIFI_PREAMBLE_VHT_SU --txModeA=VhtMcs0 --txModeB=VhtMcs0 --checkResults=1 --expectRxASuccessfull=0 --expectRxBSuccessfull=0", "True", "True"),
-    ("wifi-test-interference-helper --enableCapture=0 --txPowerA=5 --txPowerB=15  --delay=30 --standard=WIFI_PHY_STANDARD_80211ac --preamble=WIFI_PREAMBLE_VHT_SU --txModeA=VhtMcs0 --txModeB=VhtMcs0 --checkResults=1 --expectRxASuccessfull=0 --expectRxBSuccessfull=0", "True", "True"),
+    ("wifi-test-interference-helper --enableCapture=0 --txPowerA=5 --txPowerB=15  --delay=27 --standard=WIFI_PHY_STANDARD_80211ac --preamble=WIFI_PREAMBLE_VHT_SU --txModeA=VhtMcs0 --txModeB=VhtMcs0 --checkResults=1 --expectRxASuccessfull=0 --expectRxBSuccessfull=0", "True", "True"),
     ("wifi-test-interference-helper --enableCapture=1 --txPowerA=5 --txPowerB=15 --delay=10 --txModeA=OfdmRate6Mbps --txModeB=OfdmRate6Mbps --checkResults=1 --expectRxASuccessfull=0 --expectRxBSuccessfull=1", "True", "False"),
-    ("wifi-bianchi --validate --phyRate=54 --nMinStas=5 --nMaxStas=10 --duration=5", "False", "False"), # TODO: run from N=5 to N=50 for 100s (TAKES_FOREVER) when issue #170 is fixed
-    ("wifi-bianchi --validate --phyRate=6 --nMinStas=5 --nMaxStas=10 --duration=15", "True", "False"), # TODO: run from N=5 to N=50 for 400s (TAKES_FOREVER) when issue #170 is fixed
-    ("wifi-bianchi --validate --phyRate=54 --nMinStas=5 --nMaxStas=10 --duration=5 --infra", "False", "False"), # TODO: run from N=5 to N=50 for 100s (TAKES_FOREVER) when issue #170 is fixed
-    ("wifi-bianchi --validate --phyRate=6 --nMinStas=5 --nMaxStas=10 --duration=20 --infra", "False", "False"), # TODO: run from N=5 to N=50 for 600s (TAKES_FOREVER) when issue #170 is fixed
+    ("wifi-bianchi --validate --phyMode=OfdmRate54Mbps --nMinStas=5 --nMaxStas=10 --duration=5", "False", "False"), # TODO: run from N=5 to N=50 for 100s (TAKES_FOREVER) when issue #170 is fixed
+    ("wifi-bianchi --validate --phyMode=OfdmRate6Mbps --nMinStas=5 --nMaxStas=10 --duration=15", "True", "False"), # TODO: run from N=5 to N=50 for 400s (TAKES_FOREVER) when issue #170 is fixed
+    ("wifi-bianchi --validate --phyMode=OfdmRate54Mbps --nMinStas=5 --nMaxStas=10 --duration=5 --infra", "False", "False"), # TODO: run from N=5 to N=50 for 100s (TAKES_FOREVER) when issue #170 is fixed
+    ("wifi-bianchi --validate --phyMode=OfdmRate6Mbps --nMinStas=5 --nMaxStas=10 --duration=20 --infra", "False", "False"), # TODO: run from N=5 to N=50 for 600s (TAKES_FOREVER) when issue #170 is fixed
 ]
 
 # A list of Python examples to run in order to ensure that they remain
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/inter-bss-test-suite.cc ns-3.34/src/wifi/test/inter-bss-test-suite.cc
--- ns-3.33/src/wifi/test/inter-bss-test-suite.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/inter-bss-test-suite.cc	2021-07-14 10:31:07.000000000 -0700
@@ -79,8 +79,9 @@
 {
 public:
   TestInterBssConstantObssPdAlgo ();
+  ~TestInterBssConstantObssPdAlgo ();
 
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 private:
   /**
@@ -98,7 +99,7 @@
    * \param d3 distance d3 (in meters)
    * \param d4 distance d4 (in meters)
    * \param d5 distance d5 (in meters)
-   * \return the node posiitions
+   * \return the node positions
    */
   Ptr<ListPositionAllocator> AllocatePositions (double d1, double d2, double d3, double d4, double d5);
 
@@ -124,18 +125,30 @@
   void ResetResults ();
 
   /**
+   * Clear the drop reasons
+   */
+  void ClearDropReasons ();
+
+  /**
    * Run one function
    */
   void RunOne ();
 
   /**
    * Check if the Phy State for a device is an expected value
-   * \param expectedState the expected PHY state
    * \param device the device to check
+   * \param expectedState the expected PHY state
    */
   void CheckPhyState (Ptr<WifiNetDevice> device, WifiPhyState expectedState);
 
   /**
+   * Check if the Phy drop reasons for a device are as expected
+   * \param device the device to check
+   * \param expectedDropReasons the expected PHY drop reasons
+   */
+  void CheckPhyDropReasons (Ptr<WifiNetDevice> device, std::vector<WifiPhyRxfailureReason> expectedDropReasons);
+
+  /**
    * Notify Phy transmit begin
    * \param context the context
    * \param p the packet
@@ -144,12 +157,20 @@
   void NotifyPhyTxBegin (std::string context, Ptr<const Packet> p, double txPowerW);
 
   /**
-   * Notify Phy receive endsn
+   * Notify Phy receive ends
    * \param context the context
    * \param p the packet
    */
   void NotifyPhyRxEnd (std::string context, Ptr<const Packet> p);
 
+  /**
+   * Notify Phy receive drops
+   * \param context the context
+   * \param p the packet
+   * \param reason the reason why it was dropped
+   */
+  void NotifyPhyRxDrop (std::string context, Ptr<const Packet> p, WifiPhyRxfailureReason reason);
+
   unsigned int m_numSta1PacketsSent; ///< number of sent packets from STA1
   unsigned int m_numSta2PacketsSent; ///< number of sent packets from STA2
   unsigned int m_numAp1PacketsSent; ///< number of sent packets from AP1
@@ -160,6 +181,11 @@
   unsigned int m_numAp1PacketsReceived; ///< number of received packets from AP1
   unsigned int m_numAp2PacketsReceived; ///< number of received packets from AP2
 
+  std::vector<WifiPhyRxfailureReason> m_dropReasonsSta1; ///< drop reasons for STA1
+  std::vector<WifiPhyRxfailureReason> m_dropReasonsSta2; ///< drop reasons for STA2
+  std::vector<WifiPhyRxfailureReason> m_dropReasonsAp1; ///< drop reasons for AP1
+  std::vector<WifiPhyRxfailureReason> m_dropReasonsAp2; ///< drop reasons for AP2
+
   unsigned int m_payloadSize1; ///< size in bytes of packet payload in BSS 1
   unsigned int m_payloadSize2; ///< size in bytes of packet payload in BSS 2
   unsigned int m_payloadSize3; ///< size in bytes of packet payload in BSS 3
@@ -200,6 +226,11 @@
 {
 }
 
+TestInterBssConstantObssPdAlgo::~TestInterBssConstantObssPdAlgo ()
+{
+  ClearDropReasons ();
+}
+
 Ptr<ListPositionAllocator>
 TestInterBssConstantObssPdAlgo::AllocatePositions (double d1, double d2, double d3, double d4, double d5)
 {
@@ -223,7 +254,18 @@
   Ptr<WifiNetDevice> sta_device2 = DynamicCast<WifiNetDevice> (m_staDevices.Get (1));
   Ptr<WifiNetDevice> sta_device3 = DynamicCast<WifiNetDevice> (m_staDevices.Get (2));
 
-  bool expectPhyReset = (m_bssColor1 != 0) && (m_bssColor2 != 0) && (m_obssPdLevelDbm >= m_obssRxPowerDbm);
+  bool expectFilter = (m_bssColor1 != 0) && (m_bssColor2 != 0);
+  bool expectPhyReset = expectFilter && (m_obssPdLevelDbm >= m_obssRxPowerDbm);
+  std::vector<WifiPhyRxfailureReason> dropReasons;
+  WifiPhyState stateDuringPayloadNeighboringBss = expectFilter ? WifiPhyState::CCA_BUSY : WifiPhyState::RX;
+  if (expectFilter)
+    {
+      dropReasons.push_back (FILTERED);
+    }
+  if (expectPhyReset)
+    {
+      dropReasons.push_back (OBSS_PD_CCA_RESET);
+    }
 
   // In order to have all ADDBA handshakes established, each AP and STA sends a packet.
 
@@ -237,6 +279,7 @@
   // We test PHY state and verify whether a CCA reset did occur.
 
   // AP2 sends a packet 0.5s later.
+  Simulator::Schedule (Seconds (2.0), &TestInterBssConstantObssPdAlgo::ClearDropReasons, this);
   Simulator::Schedule (Seconds (2.0), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device2, sta_device2, m_payloadSize2);
   Simulator::Schedule (Seconds (2.0) + MicroSeconds (5), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device2, WifiPhyState::TX);
   // All other PHYs should have stay idle until 4us (preamble detection time).
@@ -247,37 +290,68 @@
   Simulator::Schedule (Seconds (2.0) + MicroSeconds (10), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, WifiPhyState::CCA_BUSY);
   Simulator::Schedule (Seconds (2.0) + MicroSeconds (10), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device2, WifiPhyState::CCA_BUSY);
   Simulator::Schedule (Seconds (2.0) + MicroSeconds (10), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, WifiPhyState::CCA_BUSY);
-  // PHYs of AP1 and STA1 should be idle if they were reset by OBSS_PD SR, otherwise they should be receiving.
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (50), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, expectPhyReset ? WifiPhyState::IDLE : WifiPhyState::RX);
-  Simulator::Schedule (Seconds (2.0) + MicroSeconds (50), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, expectPhyReset ? WifiPhyState::IDLE : WifiPhyState::RX);
+  // PHYs of AP1 and STA1 should be idle after HE-SIG-A if they were reset by OBSS_PD SR, otherwise they should be CCA_busy until beginning of payload.
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (35), &TestInterBssConstantObssPdAlgo::CheckPhyDropReasons, this, sta_device1, dropReasons);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (35), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, expectPhyReset ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (35), &TestInterBssConstantObssPdAlgo::CheckPhyDropReasons, this, ap_device1, dropReasons);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (35), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, expectPhyReset ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY);
+  // PHYs of AP1 and STA1 should be idle if they were reset by OBSS_PD SR, otherwise they should be CCA_busy/Rx (since filtered/not filtered, resp.).
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (50), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, expectPhyReset ? WifiPhyState::IDLE : stateDuringPayloadNeighboringBss);
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (50), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, expectPhyReset ? WifiPhyState::IDLE : stateDuringPayloadNeighboringBss);
   // STA2 should be receiving
   Simulator::Schedule (Seconds (2.0) + MicroSeconds (50), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device2, WifiPhyState::RX);
 
   // We test whether two networks can transmit simultaneously, and whether transmit power restrictions are applied.
 
   // AP2 sends another packet 0.1s later.
+  Simulator::Schedule (Seconds (2.1), &TestInterBssConstantObssPdAlgo::ClearDropReasons, this);
   Simulator::Schedule (Seconds (2.1), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device2, sta_device2, m_payloadSize2);
-  // STA1 sends a packet 90us later. Even though AP2 is still transmitting, STA1 can transmit simultaneously if it's PHY was reset by OBSS_PD SR.
-  Simulator::Schedule (Seconds (2.1) + MicroSeconds (90), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, sta_device1, ap_device1, m_payloadSize1);
+  // STA1 sends a packet 42us later (i.e. right after HE-SIG-A of AP2). Even though AP2 is still transmitting, STA1 can transmit simultaneously if it's PHY was reset by OBSS_PD SR.
+  Simulator::Schedule (Seconds (2.1) + MicroSeconds (42), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, sta_device1, ap_device1, m_payloadSize1);
   if (expectPhyReset)
     {
       // In this case, we check the TX power is restricted (and set the expected value slightly before transmission should occur)
       double expectedTxPower = std::min (m_txPowerDbm, 21 - (m_obssPdLevelDbm + 82));
-      Simulator::Schedule (Seconds (2.1) + MicroSeconds (89), &TestInterBssConstantObssPdAlgo::SetExpectedTxPower, this, expectedTxPower);
+      Simulator::Schedule (Seconds (2.1) + MicroSeconds (41), &TestInterBssConstantObssPdAlgo::SetExpectedTxPower, this, expectedTxPower);
     }
   // Check simultaneous transmissions
   Simulator::Schedule (Seconds (2.1) + MicroSeconds (100), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device2, WifiPhyState::TX);
-  Simulator::Schedule (Seconds (2.1) + MicroSeconds (100), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, expectPhyReset ? WifiPhyState::TX : WifiPhyState::RX);
+  Simulator::Schedule (Seconds (2.1) + MicroSeconds (100), &TestInterBssConstantObssPdAlgo::CheckPhyDropReasons, this, sta_device1, dropReasons);
+  Simulator::Schedule (Seconds (2.1) + MicroSeconds (100), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, expectPhyReset ? WifiPhyState::TX : stateDuringPayloadNeighboringBss);
   Simulator::Schedule (Seconds (2.1) + MicroSeconds (100), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device2, WifiPhyState::RX);
-  Simulator::Schedule (Seconds (2.1) + MicroSeconds (100), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, expectPhyReset ? WifiPhyState::CCA_BUSY : WifiPhyState::RX);
+  Simulator::Schedule (Seconds (2.1) + MicroSeconds (100), &TestInterBssConstantObssPdAlgo::CheckPhyDropReasons, this, ap_device1, dropReasons);
+  Simulator::Schedule (Seconds (2.1) + MicroSeconds (100), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, stateDuringPayloadNeighboringBss);
+  Simulator::Schedule (Seconds (2.1) + MicroSeconds (142), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, expectPhyReset ? WifiPhyState::RX : stateDuringPayloadNeighboringBss);
+
+  // AP2 sends another packet 0.1s later, and STA1 wanting to send a packet during the payload of the former.
+  Simulator::Schedule (Seconds (2.2), &TestInterBssConstantObssPdAlgo::ClearDropReasons, this);
+  Simulator::Schedule (Seconds (2.2), &TestInterBssConstantObssPdAlgo::SetExpectedTxPower, this, m_txPowerDbm);
+  Simulator::Schedule (Seconds (2.2), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device2, sta_device2, m_payloadSize2);
+  // STA1 sends a packet 90us later (i.e. during payload of AP2). Even though AP2 is still transmitting, STA1 can transmit simultaneously if it's PHY was reset by OBSS_PD SR.
+  Simulator::Schedule (Seconds (2.2) + MicroSeconds (90), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, sta_device1, ap_device1, m_payloadSize1);
+  if (expectPhyReset)
+    {
+      // In this case, we check the TX power is restricted (and set the expected value slightly before transmission should occur)
+      double expectedTxPower = std::min (m_txPowerDbm, 21 - (m_obssPdLevelDbm + 82));
+      Simulator::Schedule (Seconds (2.2) + MicroSeconds (89), &TestInterBssConstantObssPdAlgo::SetExpectedTxPower, this, expectedTxPower);
+    }
+  // Check simultaneous transmissions
+  Simulator::Schedule (Seconds (2.2) + MicroSeconds (105), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device2, WifiPhyState::TX);
+  Simulator::Schedule (Seconds (2.2) + MicroSeconds (105), &TestInterBssConstantObssPdAlgo::CheckPhyDropReasons, this, sta_device1, dropReasons);
+  Simulator::Schedule (Seconds (2.2) + MicroSeconds (105), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device1, expectPhyReset ? WifiPhyState::TX : stateDuringPayloadNeighboringBss);
+  Simulator::Schedule (Seconds (2.2) + MicroSeconds (105), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, sta_device2, WifiPhyState::RX);
+  Simulator::Schedule (Seconds (2.2) + MicroSeconds (105), &TestInterBssConstantObssPdAlgo::CheckPhyDropReasons, this, ap_device1, dropReasons);
+  Simulator::Schedule (Seconds (2.2) + MicroSeconds (105), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, stateDuringPayloadNeighboringBss);
+  Simulator::Schedule (Seconds (2.2) + MicroSeconds (195), &TestInterBssConstantObssPdAlgo::CheckPhyState, this, ap_device1, expectPhyReset ? WifiPhyState::RX : stateDuringPayloadNeighboringBss);
+
 
   // Verify transmit power restrictions are not applied if access to the channel is requested after ignored OBSS transmissions.
 
-  Simulator::Schedule (Seconds (2.2), &TestInterBssConstantObssPdAlgo::SetExpectedTxPower, this, m_txPowerDbm);
+  Simulator::Schedule (Seconds (2.3), &TestInterBssConstantObssPdAlgo::SetExpectedTxPower, this, m_txPowerDbm);
   // AP2 sends another packet 0.1s later. Power restriction should not be applied.
-  Simulator::Schedule (Seconds (2.2), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device2, sta_device2, m_payloadSize2);
+  Simulator::Schedule (Seconds (2.3), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device2, sta_device2, m_payloadSize2);
   // STA1 sends a packet 0.1s later. Power restriction should not be applied.
-  Simulator::Schedule (Seconds (2.3), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, sta_device1, ap_device1, m_payloadSize1);
+  Simulator::Schedule (Seconds (2.4), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, sta_device1, ap_device1, m_payloadSize1);
 
   // Verify a scenario that involves 3 networks in order to verify corner cases for transmit power restrictions.
   // First, there is a transmission on network 2 from STA to AP, followed by a response from AP to STA.
@@ -286,18 +360,18 @@
   // Before its backoff expires, a transmission on network 3 occurs, also eventually triggering another CCA reset (depending on the scenario that is being run).
   // This test checks whether this sequence preserves transmit power restrictions if CCA resets occurred, since STA 1 has been deferring during ignored OBSS transmissions.
 
-  Simulator::Schedule (Seconds (2.4), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, sta_device2, ap_device2, m_payloadSize2 / 10);
-  Simulator::Schedule (Seconds (2.4) + MicroSeconds (15), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device2, sta_device2, m_payloadSize2 / 10);
-  Simulator::Schedule (Seconds (2.4) + MicroSeconds (270), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device1, sta_device1, m_payloadSize1 / 10);
-  Simulator::Schedule (Seconds (2.4) + MicroSeconds (300), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device3, sta_device3, m_payloadSize3 / 10);
+  Simulator::Schedule (Seconds (2.5), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, sta_device2, ap_device2, m_payloadSize2 / 10);
+  Simulator::Schedule (Seconds (2.5) + MicroSeconds (15), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device2, sta_device2, m_payloadSize2 / 10);
+  Simulator::Schedule (Seconds (2.5) + MicroSeconds (270), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device1, sta_device1, m_payloadSize1 / 10);
+  Simulator::Schedule (Seconds (2.5) + MicroSeconds (300), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device3, sta_device3, m_payloadSize3 / 10);
   if (expectPhyReset)
     {
       // In this case, we check the TX power is restricted (and set the expected value slightly before transmission should occur)
       double expectedTxPower = std::min (m_txPowerDbm, 21 - (m_obssPdLevelDbm + 82));
-      Simulator::Schedule (Seconds (2.4) + MicroSeconds (400), &TestInterBssConstantObssPdAlgo::SetExpectedTxPower, this, expectedTxPower);
+      Simulator::Schedule (Seconds (2.5) + MicroSeconds (338), &TestInterBssConstantObssPdAlgo::SetExpectedTxPower, this, expectedTxPower);
     }
 
-  Simulator::Stop (Seconds (2.5));
+  Simulator::Stop (Seconds (2.6));
 }
 
 void
@@ -311,19 +385,29 @@
   m_numSta2PacketsReceived = 0;
   m_numAp1PacketsReceived = 0;
   m_numAp2PacketsReceived = 0;
+  ClearDropReasons ();
   m_expectedTxPowerDbm = m_txPowerDbm;
 }
 
 void
+TestInterBssConstantObssPdAlgo::ClearDropReasons ()
+{
+  m_dropReasonsSta1.clear ();
+  m_dropReasonsSta2.clear ();
+  m_dropReasonsAp1.clear ();
+  m_dropReasonsAp2.clear ();
+}
+
+void
 TestInterBssConstantObssPdAlgo::CheckResults ()
 {
-  NS_TEST_ASSERT_MSG_EQ (m_numSta1PacketsSent, 3, "The number of packets sent by STA1 is not correct!");
+  NS_TEST_ASSERT_MSG_EQ (m_numSta1PacketsSent, 4, "The number of packets sent by STA1 is not correct!");
   NS_TEST_ASSERT_MSG_EQ (m_numSta2PacketsSent, 2, "The number of packets sent by STA2 is not correct!");
   NS_TEST_ASSERT_MSG_EQ (m_numAp1PacketsSent, 2, "The number of packets sent by AP1 is not correct!");
-  NS_TEST_ASSERT_MSG_EQ (m_numAp2PacketsSent, 5, "The number of packets sent by AP2 is not correct!");
+  NS_TEST_ASSERT_MSG_EQ (m_numAp2PacketsSent, 6, "The number of packets sent by AP2 is not correct!");
   NS_TEST_ASSERT_MSG_EQ (m_numSta1PacketsReceived, 2, "The number of packets received by STA1 is not correct!");
-  NS_TEST_ASSERT_MSG_EQ (m_numSta2PacketsReceived, 5, "The number of packets received by STA2 is not correct!");
-  NS_TEST_ASSERT_MSG_EQ (m_numAp1PacketsReceived, 3, "The number of packets received by AP1 is not correct!");
+  NS_TEST_ASSERT_MSG_EQ (m_numSta2PacketsReceived, 6, "The number of packets received by STA2 is not correct!");
+  NS_TEST_ASSERT_MSG_EQ (m_numAp1PacketsReceived, 4, "The number of packets received by AP1 is not correct!");
   NS_TEST_ASSERT_MSG_EQ (m_numAp2PacketsReceived, 2, "The number of packets received by AP2 is not correct!");
 }
 
@@ -378,6 +462,30 @@
 }
 
 void
+TestInterBssConstantObssPdAlgo::NotifyPhyRxDrop (std::string context, Ptr<const Packet> p,
+                                                 WifiPhyRxfailureReason reason)
+{
+  uint32_t idx = ConvertContextToNodeId (context);
+  uint32_t pktSize = p->GetSize () - 38;
+  if ((idx == 0) && ((pktSize != m_payloadSize1) && (pktSize != (m_payloadSize1 / 10))))
+    {
+      m_dropReasonsSta1.push_back (reason);
+    }
+  else if ((idx == 1) && ((pktSize != m_payloadSize2) && (pktSize != (m_payloadSize2 / 10))))
+    {
+      m_dropReasonsSta2.push_back (reason);
+    }
+  else if ((idx == 3) && ((pktSize != m_payloadSize1) && (pktSize != (m_payloadSize1 / 10))))
+    {
+      m_dropReasonsAp1.push_back (reason);
+    }
+  else if ((idx == 4) && ((pktSize != m_payloadSize2) && (pktSize != (m_payloadSize2 / 10))))
+    {
+      m_dropReasonsAp2.push_back (reason);
+    }
+}
+
+void
 TestInterBssConstantObssPdAlgo::SendOnePacket (Ptr<WifiNetDevice> tx_dev, Ptr<WifiNetDevice> rx_dev, uint32_t payloadSize)
 {
   Ptr<Packet> p = Create<Packet> (payloadSize);
@@ -403,6 +511,36 @@
 }
 
 void
+TestInterBssConstantObssPdAlgo::CheckPhyDropReasons (Ptr<WifiNetDevice> device,
+                                                     std::vector<WifiPhyRxfailureReason> expectedDropReasons)
+{
+  std::vector<WifiPhyRxfailureReason> currentDropReasons;
+  uint32_t nodeId = device->GetNode ()->GetId ();
+  switch (nodeId)
+    {
+      case 0: //STA1
+        currentDropReasons = m_dropReasonsSta1;
+        break;
+      case 1: //STA2
+        currentDropReasons = m_dropReasonsSta2;
+        break;
+      case 3: //AP1
+        currentDropReasons = m_dropReasonsAp1;
+        break;
+      case 4: //AP2
+        currentDropReasons = m_dropReasonsAp2;
+        break;
+      default: //others, no attribute
+        return;
+    }
+  NS_TEST_ASSERT_MSG_EQ (currentDropReasons.size (), expectedDropReasons.size (), "Number of drop reasons " << currentDropReasons.size () << " does not match expected one " << expectedDropReasons.size () << " at " << Simulator::Now ());
+  for (std::size_t i = 0; i < currentDropReasons.size (); ++i)
+    {
+      NS_TEST_ASSERT_MSG_EQ (currentDropReasons[i], expectedDropReasons[i], "Drop reason " << i << ": " << currentDropReasons[i] << " does not match expected reason " << expectedDropReasons[i] << " at " << Simulator::Now ());
+    }
+}
+
+void
 TestInterBssConstantObssPdAlgo::RunOne (void)
 {
   RngSeedManager::SetSeed (1);
@@ -424,12 +562,14 @@
 
   SpectrumWifiPhyHelper phy;
   phy.DisablePreambleDetectionModel ();
+  phy.SetFrameCaptureModel ("ns3::SimpleFrameCaptureModel");
   Ptr<MultiModelSpectrumChannel> channel = CreateObject<MultiModelSpectrumChannel> ();
   channel->SetPropagationDelayModel (CreateObject<ConstantSpeedPropagationDelayModel> ());
   channel->AddPropagationLossModel (lossModel);
   phy.SetChannel (channel);
   phy.Set ("TxPowerStart", DoubleValue (m_txPowerDbm));
   phy.Set ("TxPowerEnd", DoubleValue (m_txPowerDbm));
+  phy.Set ("ChannelWidth", UintegerValue (20));
 
   WifiHelper wifi;
   wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
@@ -487,6 +627,7 @@
 
   Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxBegin", MakeCallback (&TestInterBssConstantObssPdAlgo::NotifyPhyTxBegin, this));
   Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyRxEnd", MakeCallback (&TestInterBssConstantObssPdAlgo::NotifyPhyRxEnd, this));
+  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyRxDrop", MakeCallback (&TestInterBssConstantObssPdAlgo::NotifyPhyRxDrop, this));
 
   SetupSimulation ();
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/power-rate-adaptation-test.cc ns-3.34/src/wifi/test/power-rate-adaptation-test.cc
--- ns-3.33/src/wifi/test/power-rate-adaptation-test.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/power-rate-adaptation-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -26,6 +26,9 @@
 #include "ns3/constant-position-mobility-model.h"
 #include "ns3/simulator.h"
 #include "ns3/test.h"
+#include "ns3/frame-exchange-manager.h"
+#include "ns3/wifi-default-protection-manager.h"
+#include "ns3/wifi-default-ack-manager.h"
 
 using namespace ns3;
 
@@ -40,7 +43,7 @@
 public:
   PowerRateAdaptationTest ();
 
-  virtual void DoRun (void);
+  void DoRun (void) override;
 private:
   /// Test parf function
   void TestParf ();
@@ -77,6 +80,15 @@
   Ptr<AdhocWifiMac> mac = CreateObject<AdhocWifiMac> ();
   mac->SetDevice (dev);
   mac->ConfigureStandard (WIFI_STANDARD_80211a);
+  Ptr<FrameExchangeManager> fem = mac->GetFrameExchangeManager ();
+
+  Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
+  protectionManager->SetWifiMac (mac);
+  fem->SetProtectionManager (protectionManager);
+
+  Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager> ();
+  ackManager->SetWifiMac (mac);
+  fem->SetAckManager (ackManager);
 
   /*
    * Create mobility model. Is needed by the phy layer for transmission.
@@ -140,6 +152,7 @@
   packetHeader.SetType (WIFI_MAC_DATA);
   packetHeader.SetQosTid (0);
   Ptr<Packet> packet = Create<Packet> (10);
+  Ptr<WifiMacQueueItem> mpdu = Create<WifiMacQueueItem> (packet, packetHeader);
   WifiMode ackMode;
 
   /*
@@ -168,7 +181,7 @@
    */
   for (int i = 0; i < 10; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -184,7 +197,7 @@
    * As we are using recovery power, one failure make power increase.
    *
    */
-  manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
+  manager->ReportDataFailed (mpdu);
 
   txVector = manager->GetDataTxVector (packetHeader);
   mode = txVector.GetMode ();
@@ -201,10 +214,10 @@
    */
   for (int i = 0; i < 7; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
-      manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
+      manager->ReportDataFailed (mpdu);
     }
-  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+  manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
 
   txVector = manager->GetDataTxVector (packetHeader);
   mode = txVector.GetMode ();
@@ -219,7 +232,7 @@
    * As we are using recovery power, one failure make power increase. recoveryPower=false.
    */
 
-  manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
+  manager->ReportDataFailed (mpdu);
 
   txVector = manager->GetDataTxVector (packetHeader);
   mode = txVector.GetMode ();
@@ -234,8 +247,8 @@
    * After two consecutive fails the rate is decreased or the power increased.
    * As we are at maximal power, the rate should be decreased.
    */
-  manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
-  manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
+  manager->ReportDataFailed (mpdu);
+  manager->ReportDataFailed (mpdu);
 
   txVector = manager->GetDataTxVector (packetHeader);
   mode = txVector.GetMode ();
@@ -252,7 +265,7 @@
    */
   for (int i = 0; i < 10; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -268,7 +281,7 @@
    * As we are using recovery rate, one failure make rate decrease. recoveryRate=false.
    */
 
-  manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
+  manager->ReportDataFailed (mpdu);
 
   txVector = manager->GetDataTxVector (packetHeader);
   mode = txVector.GetMode ();
@@ -285,7 +298,7 @@
    */
   for (int i = 0; i < 10; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -303,7 +316,7 @@
    */
   for (int i = 0; i < 10; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -319,11 +332,11 @@
    * One successful transmissions after a power decrease make recoverPower=false.
    * So we need two consecutive failures to increase power again.
    */
-  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+  manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
 
   for (int i = 0; i < 2; i++)
     {
-      manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
+      manager->ReportDataFailed (mpdu);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -361,6 +374,7 @@
   packetHeader.SetType (WIFI_MAC_DATA);
   packetHeader.SetQosTid (0);
   Ptr<Packet> packet = Create<Packet> (10);
+  Ptr<WifiMacQueueItem> mpdu = Create<WifiMacQueueItem> (packet, packetHeader);
   WifiMode ackMode;
 
   /*
@@ -390,7 +404,7 @@
    */
   for (int i = 0; i < 3; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -406,7 +420,7 @@
    * One failure make the power to be increased again.
    * Change to state Low.
    */
-  manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
+  manager->ReportDataFailed (mpdu);
 
   txVector = manager->GetDataTxVector (packetHeader);
   mode = txVector.GetMode ();
@@ -424,7 +438,7 @@
    */
   for (int i = 0; i < 10; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -443,7 +457,7 @@
 
   for (int i = 0; i < 3; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -461,7 +475,7 @@
    */
   for (int i = 0; i < 16 * 3; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -477,7 +491,7 @@
    * After one fail the rate is decreased or the power increased.
    * As we are at minimal power, the power should be increased.
    */
-  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
+  manager->ReportDataFailed (mpdu);
 
   txVector = manager->GetDataTxVector (packetHeader);
   mode = txVector.GetMode ();
@@ -494,7 +508,7 @@
    */
   for (int i = 0; i < 16; i++)
     {
-      manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
+      manager->ReportDataFailed (mpdu);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -511,7 +525,7 @@
    * As we are at maximal power, the rate should be decreased.
    * Set critical rate to 54 Mbps.
    */
-  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
+  manager->ReportDataFailed (mpdu);
 
   txVector = manager->GetDataTxVector (packetHeader);
   mode = txVector.GetMode ();
@@ -528,7 +542,7 @@
    */
   for (int i = 0; i < 3; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -548,7 +562,7 @@
    */
   for (int i = 0; i < 9 * 3; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -560,7 +574,7 @@
 
   for (int i = 0; i < 3; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -604,6 +618,7 @@
   packetHeader.SetType (WIFI_MAC_DATA);
   packetHeader.SetQosTid (0);
   Ptr<Packet> packet = Create<Packet> (10);
+  Ptr<WifiMacQueueItem> mpdu = Create<WifiMacQueueItem> (packet, packetHeader);
   WifiMode ackMode;
 
   /*
@@ -662,7 +677,7 @@
    */
   for (int i = 0; i < 6; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -675,7 +690,7 @@
   /**
    * Test that 7 is enough.
    */
-  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+  manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
 
   txVector = manager->GetDataTxVector (packetHeader);
   mode = txVector.GetMode ();
@@ -692,7 +707,7 @@
    */
   for (int i = 0; i < 4; i++)
     {
-      manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
+      manager->ReportDataFailed (mpdu);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -702,7 +717,7 @@
   NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 9000000, "RRPAA: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
 
-  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
+  manager->ReportDataFailed (mpdu);
 
   txVector = manager->GetDataTxVector (packetHeader);
   mode = txVector.GetMode ();
@@ -719,7 +734,7 @@
 
   for (int i = 0; i < 7; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -731,7 +746,7 @@
 
   for (int i = 0; i < 10; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -743,7 +758,7 @@
 
   for (int i = 0; i < 13; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -755,7 +770,7 @@
 
   for (int i = 0; i < 19; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -767,7 +782,7 @@
 
   for (int i = 0; i < 23; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -779,7 +794,7 @@
 
   for (int i = 0; i < 33; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -791,7 +806,7 @@
 
   for (int i = 0; i < 43; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -811,7 +826,7 @@
 
   for (int i = 0; i < 49; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -821,7 +836,7 @@
   NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 54000000, "RRPAA: Incorrect vale of data rate");
   NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
 
-  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+  manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
 
   txVector = manager->GetDataTxVector (packetHeader);
   mode = txVector.GetMode ();
@@ -839,7 +854,7 @@
 
   for (int i = 0; i < 16 * 50; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -857,7 +872,7 @@
 
   for (int i = 0; i < 6; i++)
     {
-      manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
+      manager->ReportDataFailed (mpdu);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -875,7 +890,7 @@
 
   for (int i = 0; i < 16 * 6; i++)
     {
-      manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
+      manager->ReportDataFailed (mpdu);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -893,7 +908,7 @@
 
   for (int i = 0; i < 6; i++)
     {
-      manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
+      manager->ReportDataFailed (mpdu);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -909,7 +924,7 @@
 
   for (int i = 0; i < 11; i++)
     {
-      manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
+      manager->ReportDataFailed (mpdu);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -929,7 +944,7 @@
 
   for (int i = 0; i < 25; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -941,7 +956,7 @@
 
   for (int i = 0; i < 5; i++)
     {
-      manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
+      manager->ReportDataFailed (mpdu);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -953,7 +968,7 @@
 
   for (int i = 0; i < 5; i++)
     {
-      manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
+      manager->ReportDataFailed (mpdu);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -965,7 +980,7 @@
 
   for (int i = 0; i < 25; i++)
     {
-      manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+      manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
     }
 
   txVector = manager->GetDataTxVector (packetHeader);
@@ -985,12 +1000,12 @@
     {
       for (int j = 0; j < 25; j++)
         {
-          manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
+          manager->ReportDataOk (mpdu, 0, ackMode, 0, txVector);
         }
 
       for (int j = 0; j < 5; j++)
         {
-          manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
+          manager->ReportDataFailed (mpdu);
         }
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/spectrum-wifi-phy-test.cc ns-3.34/src/wifi/test/spectrum-wifi-phy-test.cc
--- ns-3.33/src/wifi/test/spectrum-wifi-phy-test.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/spectrum-wifi-phy-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -29,8 +29,9 @@
 #include "ns3/log.h"
 #include "ns3/wifi-net-device.h"
 #include "ns3/wifi-psdu.h"
-#include "ns3/wifi-ppdu.h"
+#include "ns3/ofdm-ppdu.h"
 #include "ns3/wifi-utils.h"
+#include "ns3/he-phy.h" //includes OFDM PHY
 
 using namespace ns3;
 
@@ -67,7 +68,8 @@
   virtual ~SpectrumWifiPhyBasicTest ();
 
 protected:
-  virtual void DoSetup (void);
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
   Ptr<SpectrumWifiPhy> m_phy; ///< Phy
   /**
    * Make signal function
@@ -83,31 +85,34 @@
   /**
    * Spectrum wifi receive success function
    * \param psdu the PSDU
-   * \param snr the SNR
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
    * \param txVector the transmit vector
    * \param statusPerMpdu reception status per MPDU
    */
-  void SpectrumWifiPhyRxSuccess (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+  void SpectrumWifiPhyRxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                                 WifiTxVector txVector, std::vector<bool> statusPerMpdu);
   /**
    * Spectrum wifi receive failure function
    * \param psdu the PSDU
--   */
+   */
   void SpectrumWifiPhyRxFailure (Ptr<WifiPsdu> psdu);
   uint32_t m_count; ///< count
 
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
+
+  uint64_t m_uid; //!< the UID to use for the PPDU
 };
 
 SpectrumWifiPhyBasicTest::SpectrumWifiPhyBasicTest ()
-  : TestCase ("SpectrumWifiPhy test case receives one packet"),
-    m_count (0)
+  : SpectrumWifiPhyBasicTest ("SpectrumWifiPhy test case receives one packet")
 {
 }
 
 SpectrumWifiPhyBasicTest::SpectrumWifiPhyBasicTest (std::string name)
   : TestCase (name),
-    m_count (0)
+    m_count (0),
+    m_uid (0)
 {
 }
 
@@ -115,7 +120,7 @@
 Ptr<SpectrumSignalParameters>
 SpectrumWifiPhyBasicTest::MakeSignal (double txPowerWatts)
 {
-  WifiTxVector txVector = WifiTxVector (WifiPhy::GetOfdmRate6Mbps (), 0, WIFI_PREAMBLE_LONG, 800, 1, 1, 0, 20, false);
+  WifiTxVector txVector = WifiTxVector (OfdmPhy::GetOfdmRate6Mbps (), 0, WIFI_PREAMBLE_LONG, 800, 1, 1, 0, 20, false);
 
   Ptr<Packet> pkt = Create<Packet> (1000);
   WifiMacHeader hdr;
@@ -126,7 +131,7 @@
   Ptr<WifiPsdu> psdu = Create<WifiPsdu> (pkt, hdr);
   Time txDuration = m_phy->CalculateTxDuration (psdu->GetSize (), txVector, m_phy->GetPhyBand ());
 
-  Ptr<WifiPpdu> ppdu = Create<WifiPpdu> (psdu, txVector, txDuration, WIFI_PHY_BAND_5GHZ);
+  Ptr<WifiPpdu> ppdu = Create<OfdmPpdu> (psdu, txVector, WIFI_PHY_BAND_5GHZ, m_uid++);
 
   Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, txPowerWatts, GUARD_WIDTH);
   Ptr<WifiSpectrumSignalParameters> txParams = Create<WifiSpectrumSignalParameters> ();
@@ -146,9 +151,10 @@
 }
 
 void
-SpectrumWifiPhyBasicTest::SpectrumWifiPhyRxSuccess (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu)
+SpectrumWifiPhyBasicTest::SpectrumWifiPhyRxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                                                    WifiTxVector txVector, std::vector<bool> statusPerMpdu)
 {
-  NS_LOG_FUNCTION (this << *psdu << snr << txVector);
+  NS_LOG_FUNCTION (this << *psdu << rxSignalInfo << txVector);
   m_count++;
 }
 
@@ -178,6 +184,13 @@
   m_phy->SetReceiveErrorCallback (MakeCallback (&SpectrumWifiPhyBasicTest::SpectrumWifiPhyRxFailure, this));
 }
 
+void
+SpectrumWifiPhyBasicTest::DoTeardown (void)
+{
+  m_phy->Dispose ();
+  m_phy = 0;
+}
+
 // Test that the expected number of packet receptions occur.
 void
 SpectrumWifiPhyBasicTest::DoRun (void)
@@ -219,50 +232,49 @@
   virtual ~TestPhyListener ()
   {
   }
-  virtual void NotifyRxStart (Time duration)
+  void NotifyRxStart (Time duration) override
   {
     NS_LOG_FUNCTION (this << duration);
     ++m_notifyRxStart;
   }
-  virtual void NotifyRxEndOk (void)
+  void NotifyRxEndOk (void) override
   {
     NS_LOG_FUNCTION (this);
     ++m_notifyRxEndOk;
   }
-  virtual void NotifyRxEndError (void)
+  void NotifyRxEndError (void) override
   {
     NS_LOG_FUNCTION (this);
     ++m_notifyRxEndError;
   }
-  virtual void NotifyTxStart (Time duration, double txPowerDbm)
+  void NotifyTxStart (Time duration, double txPowerDbm) override
   {
     NS_LOG_FUNCTION (this << duration << txPowerDbm);
   }
-  virtual void NotifyMaybeCcaBusyStart (Time duration)
+  void NotifyMaybeCcaBusyStart (Time duration) override
   {
     NS_LOG_FUNCTION (this);
     ++m_notifyMaybeCcaBusyStart;
   }
-  virtual void NotifySwitchingStart (Time duration)
+  void NotifySwitchingStart (Time duration) override
   {
   }
-  virtual void NotifySleep (void)
+  void NotifySleep (void) override
   {
   }
-  virtual void NotifyOff (void)
+  void NotifyOff (void) override
   {
   }
-  virtual void NotifyWakeup (void)
+  void NotifyWakeup (void) override
   {
   }
-  virtual void NotifyOn (void)
+  void NotifyOn (void) override
   {
   }
   uint32_t m_notifyRxStart; ///< notify receive start
   uint32_t m_notifyRxEndOk; ///< notify receive end OK
   uint32_t m_notifyRxEndError; ///< notify receive end error
   uint32_t m_notifyMaybeCcaBusyStart; ///< notify maybe CCA busy start
-private:
 };
 
 /**
@@ -277,8 +289,8 @@
   SpectrumWifiPhyListenerTest ();
   virtual ~SpectrumWifiPhyListenerTest ();
 private:
-  virtual void DoSetup (void);
-  virtual void DoRun (void);
+  void DoSetup (void) override;
+  void DoRun (void) override;
   TestPhyListener* m_listener; ///< listener
 };
 
@@ -307,7 +319,7 @@
   Simulator::Run ();
 
   NS_TEST_ASSERT_MSG_EQ (m_count, 1, "Didn't receive right number of packets");
-  NS_TEST_ASSERT_MSG_EQ (m_listener->m_notifyMaybeCcaBusyStart, 2, "Didn't receive NotifyMaybeCcaBusyStart (preamble deteted + L-SIG received)");
+  NS_TEST_ASSERT_MSG_EQ (m_listener->m_notifyMaybeCcaBusyStart, 2, "Didn't receive NotifyMaybeCcaBusyStart (once preamble is detected + prolonged by L-SIG reception, then switched to Rx by at the beginning of data)");
   NS_TEST_ASSERT_MSG_EQ (m_listener->m_notifyRxStart, 1, "Didn't receive NotifyRxStart");
   NS_TEST_ASSERT_MSG_EQ (m_listener->m_notifyRxEndOk, 1, "Didn't receive NotifyRxEnd");
 
@@ -334,8 +346,9 @@
   virtual ~SpectrumWifiPhyFilterTest ();
 
 private:
-  virtual void DoSetup (void);
-  virtual void DoRun (void);
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
+  void DoRun (void) override;
 
   /**
    * Run one function
@@ -349,7 +362,6 @@
 
   /**
    * Callback triggered when a packet is received by the PHYs
-   * \param context the context
    * \param p the received packet
    * \param rxPowersW the received power per channel band in watts
    */
@@ -360,6 +372,8 @@
 
   uint16_t m_txChannelWidth; ///< TX channel width (MHz)
   uint16_t m_rxChannelWidth; ///< RX channel width (MHz)
+
+  std::set<WifiSpectrumBand> m_ruBands; ///< spectrum bands associated to all the RUs
 };
 
 SpectrumWifiPhyFilterTest::SpectrumWifiPhyFilterTest ()
@@ -377,7 +391,7 @@
 void
 SpectrumWifiPhyFilterTest::SendPpdu (void)
 {
-  WifiTxVector txVector = WifiTxVector (WifiPhy::GetHeMcs0 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, m_txChannelWidth, false, false);
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs0 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, m_txChannelWidth, false, false);
   Ptr<Packet> pkt = Create<Packet> (1000);
   WifiMacHeader hdr;
   hdr.SetType (WIFI_MAC_QOSDATA);
@@ -407,34 +421,8 @@
   expectedNumBands += (m_rxChannelWidth / 40);
   expectedNumBands += (m_rxChannelWidth / 80);
   expectedNumBands += (m_rxChannelWidth / 160);
-  if (m_rxChannelWidth == 20)
-    {
-      expectedNumBands += 9; /* RU_26_TONE */
-      expectedNumBands += 4; /* RU_52_TONE */
-      expectedNumBands += 2; /* RU_106_TONE */
-      expectedNumBands += 1; /* RU_242_TONE */
-    }
-  else if (m_rxChannelWidth == 40)
-    {
-      expectedNumBands += 18; /* RU_26_TONE */
-      expectedNumBands += 8; /* RU_52_TONE */
-      expectedNumBands += 4; /* RU_106_TONE */
-      expectedNumBands += 2; /* RU_242_TONE */
-      expectedNumBands += 1; /* RU_484_TONE */
-    }
-  else if (m_rxChannelWidth >= 80)
-    {
-      expectedNumBands += 37 * (m_rxChannelWidth / 80); /* RU_26_TONE */
-      expectedNumBands += 16 * (m_rxChannelWidth / 80); /* RU_52_TONE */
-      expectedNumBands += 8 * (m_rxChannelWidth / 80); /* RU_106_TONE */
-      expectedNumBands += 4 * (m_rxChannelWidth / 80); /* RU_242_TONE */
-      expectedNumBands += 2 * (m_rxChannelWidth / 80); /* RU_484_TONE */
-      expectedNumBands += 1 * (m_rxChannelWidth / 80); /* RU_996_TONE */
-      if (m_rxChannelWidth == 160)
-        {
-          ++expectedNumBands; /* RU_2x996_TONE */
-        }
-    }
+  expectedNumBands += m_ruBands.size ();
+
   NS_TEST_ASSERT_MSG_EQ (numBands, expectedNumBands, "Total number of bands handled by the receiver is incorrect");
 
   uint16_t channelWidth = std::min (m_txChannelWidth, m_rxChannelWidth);
@@ -510,9 +498,17 @@
 }
 
 void
+SpectrumWifiPhyFilterTest::DoTeardown (void)
+{
+  m_txPhy->Dispose ();
+  m_txPhy = 0;
+  m_rxPhy->Dispose ();
+  m_rxPhy = 0;
+}
+
+void
 SpectrumWifiPhyFilterTest::RunOne (void)
 {
-  m_txPhy->SetChannelWidth (m_txChannelWidth);
   uint16_t txFrequency;
   switch (m_txChannelWidth)
     {
@@ -532,7 +528,6 @@
     }
   m_txPhy->SetFrequency (txFrequency);
 
-  m_rxPhy->SetChannelWidth (m_rxChannelWidth);
   uint16_t rxFrequency;
   switch (m_rxChannelWidth)
     {
@@ -552,6 +547,26 @@
     }
   m_rxPhy->SetFrequency (rxFrequency);
 
+  m_ruBands.clear ();
+  for (uint16_t bw = 160; bw >= 20; bw = bw / 2)
+    {
+      for (uint8_t i = 0; i < (m_rxChannelWidth / bw); ++i)
+        {
+          for (unsigned int type = 0; type < 7; type++)
+            {
+              HeRu::RuType ruType = static_cast <HeRu::RuType> (type);
+              for (std::size_t index = 1; index <= HeRu::GetNRus (bw, ruType); index++)
+                {
+                  HeRu::SubcarrierGroup group = HeRu::GetSubcarrierGroup (bw, ruType, index);
+                  HeRu::SubcarrierRange range = std::make_pair (group.front ().first, group.back ().second);
+                  WifiSpectrumBand band = m_rxPhy->ConvertHeRuSubcarriers (bw, m_rxPhy->GetGuardBandwidth (m_rxChannelWidth),
+                                                                           range, i);
+                  m_ruBands.insert (band);
+                }
+            }
+        }
+    }
+
   Simulator::Schedule (Seconds (1), &SpectrumWifiPhyFilterTest::SendPpdu, this);
   
   Simulator::Run ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/tx-duration-test.cc ns-3.34/src/wifi/test/tx-duration-test.cc
--- ns-3.33/src/wifi/test/tx-duration-test.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/tx-duration-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -26,6 +26,9 @@
 #include "ns3/he-ru.h"
 #include "ns3/wifi-psdu.h"
 #include "ns3/packet.h"
+#include "ns3/dsss-phy.h"
+#include "ns3/erp-ofdm-phy.h"
+#include "ns3/he-phy.h" //includes OFDM, HT, and VHT
 #include <numeric>
 
 using namespace ns3;
@@ -43,13 +46,13 @@
 public:
   TxDurationTest ();
   virtual ~TxDurationTest ();
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 
 private:
   /**
    * Check if the payload tx duration returned by InterferenceHelper
-   * corresponds to a known value of the pay
+   * corresponds to a known value
    *
    * @param size size of payload in octets (includes everything after the PHY header)
    * @param payloadMode the WifiMode used for the transmission
@@ -64,7 +67,7 @@
 
   /**
    * Check if the overall tx duration returned by InterferenceHelper
-   * corresponds to a known value of the pay
+   * corresponds to a known value
    *
    * @param size size of payload in octets (includes everything after the PHY header)
    * @param payloadMode the WifiMode used for the transmission
@@ -246,7 +249,7 @@
   NS_ASSERT (sizes.size () == userInfos.size () && sizes.size () > 1);
   NS_ABORT_MSG_IF (channelWidth < std::accumulate (std::begin (userInfos), std::end (userInfos), 0,
                                                    [](const uint16_t prevBw, const HeMuUserInfo &info)
-                                                   { return prevBw + HeRu::GetBandwidth (info.ru.ruType); }),
+                                                   { return prevBw + HeRu::GetBandwidth (info.ru.GetRuType ()); }),
                    "Cannot accommodate all the RUs in the provided band"); //MU-MIMO (for which allocations use the same RU) is not supported
   WifiTxVector txVector;
   txVector.SetPreambleType (WIFI_PREAMBLE_HE_MU);
@@ -328,10 +331,10 @@
 
   //IEEE Std 802.11-2007 Table 18-2 "Example of LENGTH calculations for CCK"
   retval = retval
-    && CheckPayloadDuration (1023, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (744))
-    && CheckPayloadDuration (1024, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (745))
-    && CheckPayloadDuration (1025, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (746))
-    && CheckPayloadDuration (1026, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (747));
+    && CheckPayloadDuration (1023, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (744))
+    && CheckPayloadDuration (1024, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (745))
+    && CheckPayloadDuration (1025, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (746))
+    && CheckPayloadDuration (1026, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (747));
 
   NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11b CCK duration failed");
 
@@ -340,211 +343,196 @@
   //The payload durations for modes other than 11mbb have been
   //calculated by hand according to  IEEE Std 802.11-2007 18.2.3.5
   retval = retval
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (744 + 96))
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (745 + 96))
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (746 + 96))
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (747 + 96))
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (744 + 192))
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (745 + 192))
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (746 + 192))
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (747 + 192))
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (1488 + 96))
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (1490 + 96))
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (1491 + 96))
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (1493 + 96))
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (1488 + 192))
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (1490 + 192))
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (1491 + 192))
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (1493 + 192))
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (4092 + 96))
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (4096 + 96))
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (4100 + 96))
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (4104 + 96))
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (4092 + 192))
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (4096 + 192))
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (4100 + 192))
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (4104 + 192))
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (8184 + 192))
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (8192 + 192))
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (8200 + 192))
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (8208 + 192))
-    && CheckTxDuration (1023, WifiPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (8184 + 192))
-    && CheckTxDuration (1024, WifiPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (8192 + 192))
-    && CheckTxDuration (1025, WifiPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (8200 + 192))
-    && CheckTxDuration (1026, WifiPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (8208 + 192));
+    && CheckTxDuration (1023, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (744 + 96))
+    && CheckTxDuration (1024, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (745 + 96))
+    && CheckTxDuration (1025, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (746 + 96))
+    && CheckTxDuration (1026, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (747 + 96))
+    && CheckTxDuration (1023, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (744 + 192))
+    && CheckTxDuration (1024, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (745 + 192))
+    && CheckTxDuration (1025, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (746 + 192))
+    && CheckTxDuration (1026, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (747 + 192))
+    && CheckTxDuration (1023, DsssPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (1488 + 96))
+    && CheckTxDuration (1024, DsssPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (1490 + 96))
+    && CheckTxDuration (1025, DsssPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (1491 + 96))
+    && CheckTxDuration (1026, DsssPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (1493 + 96))
+    && CheckTxDuration (1023, DsssPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (1488 + 192))
+    && CheckTxDuration (1024, DsssPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (1490 + 192))
+    && CheckTxDuration (1025, DsssPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (1491 + 192))
+    && CheckTxDuration (1026, DsssPhy::GetDsssRate5_5Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (1493 + 192))
+    && CheckTxDuration (1023, DsssPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (4092 + 96))
+    && CheckTxDuration (1024, DsssPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (4096 + 96))
+    && CheckTxDuration (1025, DsssPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (4100 + 96))
+    && CheckTxDuration (1026, DsssPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (4104 + 96))
+    && CheckTxDuration (1023, DsssPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (4092 + 192))
+    && CheckTxDuration (1024, DsssPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (4096 + 192))
+    && CheckTxDuration (1025, DsssPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (4100 + 192))
+    && CheckTxDuration (1026, DsssPhy::GetDsssRate2Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (4104 + 192))
+    && CheckTxDuration (1023, DsssPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (8184 + 192))
+    && CheckTxDuration (1024, DsssPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (8192 + 192))
+    && CheckTxDuration (1025, DsssPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (8200 + 192))
+    && CheckTxDuration (1026, DsssPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_SHORT, MicroSeconds (8208 + 192))
+    && CheckTxDuration (1023, DsssPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (8184 + 192))
+    && CheckTxDuration (1024, DsssPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (8192 + 192))
+    && CheckTxDuration (1025, DsssPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (8200 + 192))
+    && CheckTxDuration (1026, DsssPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (8208 + 192));
 
   //values from http://mailman.isi.edu/pipermail/ns-developers/2009-July/006226.html
-  retval = retval && CheckTxDuration (14, WifiPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (304));
+  retval = retval && CheckTxDuration (14, DsssPhy::GetDsssRate1Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (304));
 
   //values from http://www.oreillynet.com/pub/a/wireless/2003/08/08/wireless_throughput.html
   retval = retval
-    && CheckTxDuration (1536, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (1310))
-    && CheckTxDuration (76, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (248))
-    && CheckTxDuration (14, WifiPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (203));
+    && CheckTxDuration (1536, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (1310))
+    && CheckTxDuration (76, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (248))
+    && CheckTxDuration (14, DsssPhy::GetDsssRate11Mbps (), 22, 800, WIFI_PREAMBLE_LONG, MicroSeconds (203));
 
   NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11b duration failed");
 
   //802.11a durations
   //values from http://www.oreillynet.com/pub/a/wireless/2003/08/08/wireless_throughput.html
   retval = retval
-    && CheckTxDuration (1536, WifiPhy::GetOfdmRate54Mbps (), 20, 800, WIFI_PREAMBLE_LONG, MicroSeconds (248))
-    && CheckTxDuration (76, WifiPhy::GetOfdmRate54Mbps (), 20, 800, WIFI_PREAMBLE_LONG, MicroSeconds (32))
-    && CheckTxDuration (14, WifiPhy::GetOfdmRate54Mbps (), 20, 800, WIFI_PREAMBLE_LONG, MicroSeconds (24));
+    && CheckTxDuration (1536, OfdmPhy::GetOfdmRate54Mbps (), 20, 800, WIFI_PREAMBLE_LONG, MicroSeconds (248))
+    && CheckTxDuration (76, OfdmPhy::GetOfdmRate54Mbps (), 20, 800, WIFI_PREAMBLE_LONG, MicroSeconds (32))
+    && CheckTxDuration (14, OfdmPhy::GetOfdmRate54Mbps (), 20, 800, WIFI_PREAMBLE_LONG, MicroSeconds (24));
 
   NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11a duration failed");
 
   //802.11g durations are same as 802.11a durations but with 6 us signal extension
   retval = retval
-    && CheckTxDuration (1536, WifiPhy::GetErpOfdmRate54Mbps (), 20, 800, WIFI_PREAMBLE_LONG, MicroSeconds (254))
-    && CheckTxDuration (76, WifiPhy::GetErpOfdmRate54Mbps (), 20, 800, WIFI_PREAMBLE_LONG, MicroSeconds (38))
-    && CheckTxDuration (14, WifiPhy::GetErpOfdmRate54Mbps (), 20, 800, WIFI_PREAMBLE_LONG, MicroSeconds (30));
+    && CheckTxDuration (1536, ErpOfdmPhy::GetErpOfdmRate54Mbps (), 20, 800, WIFI_PREAMBLE_LONG, MicroSeconds (254))
+    && CheckTxDuration (76, ErpOfdmPhy::GetErpOfdmRate54Mbps (), 20, 800, WIFI_PREAMBLE_LONG, MicroSeconds (38))
+    && CheckTxDuration (14, ErpOfdmPhy::GetErpOfdmRate54Mbps (), 20, 800, WIFI_PREAMBLE_LONG, MicroSeconds (30));
 
   NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11g duration failed");
 
   //802.11n durations
   retval = retval
-    && CheckTxDuration (1536, WifiPhy::GetHtMcs7 (), 20, 800, WIFI_PREAMBLE_HT_MF, MicroSeconds (228))
-    && CheckTxDuration (76, WifiPhy::GetHtMcs7 (), 20, 800, WIFI_PREAMBLE_HT_MF, MicroSeconds (48))
-    && CheckTxDuration (14, WifiPhy::GetHtMcs7 (), 20, 800, WIFI_PREAMBLE_HT_MF, MicroSeconds (40))
-    && CheckTxDuration (1536, WifiPhy::GetHtMcs7 (), 20, 800, WIFI_PREAMBLE_HT_GF, MicroSeconds (220))
-    && CheckTxDuration (76, WifiPhy::GetHtMcs7 (), 20, 800, WIFI_PREAMBLE_HT_GF, MicroSeconds (40))
-    && CheckTxDuration (14, WifiPhy::GetHtMcs7 (), 20, 800, WIFI_PREAMBLE_HT_GF, MicroSeconds (32))
-    && CheckTxDuration (1536, WifiPhy::GetHtMcs0 (), 20, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (1742400))
-    && CheckTxDuration (76, WifiPhy::GetHtMcs0 (), 20, 400, WIFI_PREAMBLE_HT_MF, MicroSeconds (126))
-    && CheckTxDuration (14, WifiPhy::GetHtMcs0 (), 20, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (57600))
-    && CheckTxDuration (1536,WifiPhy::GetHtMcs0 (), 20, 400, WIFI_PREAMBLE_HT_GF, NanoSeconds (1734400))
-    && CheckTxDuration (76, WifiPhy::GetHtMcs0 (), 20, 400, WIFI_PREAMBLE_HT_GF, MicroSeconds (118))
-    && CheckTxDuration (14, WifiPhy::GetHtMcs0 (), 20, 400, WIFI_PREAMBLE_HT_GF, NanoSeconds (49600))
-    && CheckTxDuration (1536, WifiPhy::GetHtMcs6 (), 20, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (226800))
-    && CheckTxDuration (76, WifiPhy::GetHtMcs6 (), 20, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (46800))
-    && CheckTxDuration (14, WifiPhy::GetHtMcs6 (), 20, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (39600))
-    && CheckTxDuration (1536, WifiPhy::GetHtMcs6 (), 20, 400, WIFI_PREAMBLE_HT_GF, NanoSeconds (218800))
-    && CheckTxDuration (76, WifiPhy::GetHtMcs6 (), 20, 400, WIFI_PREAMBLE_HT_GF, NanoSeconds (38800))
-    && CheckTxDuration (14, WifiPhy::GetHtMcs6 (), 20, 400, WIFI_PREAMBLE_HT_GF, NanoSeconds (31600))
-    && CheckTxDuration (1536, WifiPhy::GetHtMcs7 (), 40, 800, WIFI_PREAMBLE_HT_MF, MicroSeconds (128))
-    && CheckTxDuration (76, WifiPhy::GetHtMcs7 (), 40, 800, WIFI_PREAMBLE_HT_MF, MicroSeconds (44))
-    && CheckTxDuration (14, WifiPhy::GetHtMcs7 (), 40, 800, WIFI_PREAMBLE_HT_MF, MicroSeconds (40))
-    && CheckTxDuration (1536, WifiPhy::GetHtMcs7 (), 40, 800, WIFI_PREAMBLE_HT_GF, MicroSeconds (120))
-    && CheckTxDuration (76, WifiPhy::GetHtMcs7 (), 40, 800, WIFI_PREAMBLE_HT_GF, MicroSeconds (36))
-    && CheckTxDuration (14, WifiPhy::GetHtMcs7 (), 40, 800, WIFI_PREAMBLE_HT_GF, MicroSeconds (32))
-    && CheckTxDuration (1536, WifiPhy::GetHtMcs7 (), 40, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (118800))
-    && CheckTxDuration (76, WifiPhy::GetHtMcs7 (), 40, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (43200))
-    && CheckTxDuration (14, WifiPhy::GetHtMcs7 (), 40, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (39600))
-    && CheckTxDuration (1536, WifiPhy::GetHtMcs7 (), 40, 400, WIFI_PREAMBLE_HT_GF, NanoSeconds (110800))
-    && CheckTxDuration (76, WifiPhy::GetHtMcs7 (), 40, 400, WIFI_PREAMBLE_HT_GF, NanoSeconds (35200))
-    && CheckTxDuration (14, WifiPhy::GetHtMcs7 (), 40, 400, WIFI_PREAMBLE_HT_GF, NanoSeconds (31600));
+    && CheckTxDuration (1536, HtPhy::GetHtMcs7 (), 20, 800, WIFI_PREAMBLE_HT_MF, MicroSeconds (228))
+    && CheckTxDuration (76, HtPhy::GetHtMcs7 (), 20, 800, WIFI_PREAMBLE_HT_MF, MicroSeconds (48))
+    && CheckTxDuration (14, HtPhy::GetHtMcs7 (), 20, 800, WIFI_PREAMBLE_HT_MF, MicroSeconds (40))
+    && CheckTxDuration (1536, HtPhy::GetHtMcs0 (), 20, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (1742400))
+    && CheckTxDuration (76, HtPhy::GetHtMcs0 (), 20, 400, WIFI_PREAMBLE_HT_MF, MicroSeconds (126))
+    && CheckTxDuration (14, HtPhy::GetHtMcs0 (), 20, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (57600))
+    && CheckTxDuration (1536, HtPhy::GetHtMcs6 (), 20, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (226800))
+    && CheckTxDuration (76, HtPhy::GetHtMcs6 (), 20, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (46800))
+    && CheckTxDuration (14, HtPhy::GetHtMcs6 (), 20, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (39600))
+    && CheckTxDuration (1536, HtPhy::GetHtMcs7 (), 40, 800, WIFI_PREAMBLE_HT_MF, MicroSeconds (128))
+    && CheckTxDuration (76, HtPhy::GetHtMcs7 (), 40, 800, WIFI_PREAMBLE_HT_MF, MicroSeconds (44))
+    && CheckTxDuration (14, HtPhy::GetHtMcs7 (), 40, 800, WIFI_PREAMBLE_HT_MF, MicroSeconds (40))
+    && CheckTxDuration (1536, HtPhy::GetHtMcs7 (), 40, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (118800))
+    && CheckTxDuration (76, HtPhy::GetHtMcs7 (), 40, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (43200))
+    && CheckTxDuration (14, HtPhy::GetHtMcs7 (), 40, 400, WIFI_PREAMBLE_HT_MF, NanoSeconds (39600));
 
   NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11n duration failed");
 
   //802.11ac durations
   retval = retval
-    && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 20, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (196))
-    && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 20, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (48))
-    && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 20, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
-    && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 20, 400, WIFI_PREAMBLE_VHT_SU, MicroSeconds (180))
-    && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 20, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (46800))
-    && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 20, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600))
-    && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 40, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (108))
-    && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 40, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
-    && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 40, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
-    && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 40, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (100800))
-    && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 40, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600))
-    && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 40, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600))
-    && CheckTxDuration (1536, WifiPhy::GetVhtMcs0 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (460))
-    && CheckTxDuration (76, WifiPhy::GetVhtMcs0 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (60))
-    && CheckTxDuration (14, WifiPhy::GetVhtMcs0 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (44))
-    && CheckTxDuration (1536, WifiPhy::GetVhtMcs0 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (417600))
-    && CheckTxDuration (76, WifiPhy::GetVhtMcs0 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (57600))
-    && CheckTxDuration (14, WifiPhy::GetVhtMcs0 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (43200))
-    && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (68))
-    && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
-    && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
-    && CheckTxDuration (1536, WifiPhy::GetVhtMcs9 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (64800))
-    && CheckTxDuration (76, WifiPhy::GetVhtMcs9 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600))
-    && CheckTxDuration (14, WifiPhy::GetVhtMcs9 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600))
-    && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 160, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (56))
-    && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 160, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
-    && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 160, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
-    && CheckTxDuration (1536, WifiPhy::GetVhtMcs8 (), 160, 400, WIFI_PREAMBLE_VHT_SU, MicroSeconds (54))
-    && CheckTxDuration (76, WifiPhy::GetVhtMcs8 (), 160, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600))
-    && CheckTxDuration (14, WifiPhy::GetVhtMcs8 (), 160, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600));
+    && CheckTxDuration (1536, VhtPhy::GetVhtMcs8 (), 20, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (196))
+    && CheckTxDuration (76, VhtPhy::GetVhtMcs8 (), 20, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (48))
+    && CheckTxDuration (14, VhtPhy::GetVhtMcs8 (), 20, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
+    && CheckTxDuration (1536, VhtPhy::GetVhtMcs8 (), 20, 400, WIFI_PREAMBLE_VHT_SU, MicroSeconds (180))
+    && CheckTxDuration (76, VhtPhy::GetVhtMcs8 (), 20, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (46800))
+    && CheckTxDuration (14, VhtPhy::GetVhtMcs8 (), 20, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600))
+    && CheckTxDuration (1536, VhtPhy::GetVhtMcs9 (), 40, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (108))
+    && CheckTxDuration (76, VhtPhy::GetVhtMcs9 (), 40, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
+    && CheckTxDuration (14, VhtPhy::GetVhtMcs9 (), 40, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
+    && CheckTxDuration (1536, VhtPhy::GetVhtMcs9 (), 40, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (100800))
+    && CheckTxDuration (76, VhtPhy::GetVhtMcs9 (), 40, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600))
+    && CheckTxDuration (14, VhtPhy::GetVhtMcs9 (), 40, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600))
+    && CheckTxDuration (1536, VhtPhy::GetVhtMcs0 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (460))
+    && CheckTxDuration (76, VhtPhy::GetVhtMcs0 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (60))
+    && CheckTxDuration (14, VhtPhy::GetVhtMcs0 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (44))
+    && CheckTxDuration (1536, VhtPhy::GetVhtMcs0 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (417600))
+    && CheckTxDuration (76, VhtPhy::GetVhtMcs0 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (57600))
+    && CheckTxDuration (14, VhtPhy::GetVhtMcs0 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (43200))
+    && CheckTxDuration (1536, VhtPhy::GetVhtMcs9 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (68))
+    && CheckTxDuration (76, VhtPhy::GetVhtMcs9 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
+    && CheckTxDuration (14, VhtPhy::GetVhtMcs9 (), 80, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
+    && CheckTxDuration (1536, VhtPhy::GetVhtMcs9 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (64800))
+    && CheckTxDuration (76, VhtPhy::GetVhtMcs9 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600))
+    && CheckTxDuration (14, VhtPhy::GetVhtMcs9 (), 80, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600))
+    && CheckTxDuration (1536, VhtPhy::GetVhtMcs8 (), 160, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (56))
+    && CheckTxDuration (76, VhtPhy::GetVhtMcs8 (), 160, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
+    && CheckTxDuration (14, VhtPhy::GetVhtMcs8 (), 160, 800, WIFI_PREAMBLE_VHT_SU, MicroSeconds (40))
+    && CheckTxDuration (1536, VhtPhy::GetVhtMcs8 (), 160, 400, WIFI_PREAMBLE_VHT_SU, MicroSeconds (54))
+    && CheckTxDuration (76, VhtPhy::GetVhtMcs8 (), 160, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600))
+    && CheckTxDuration (14, VhtPhy::GetVhtMcs8 (), 160, 400, WIFI_PREAMBLE_VHT_SU, NanoSeconds (39600));
 
   NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11ac duration failed");
 
   //802.11ax SU durations
   retval = retval
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs0 (), 20, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (1485600))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs0 (), 20, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (125600))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs0 (), 20, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (71200))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs0 (), 40, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (764800))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs0 (), 40, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (84800))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs0 (), 40, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs0 (), 80, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (397600))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs0 (), 80, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (71200))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs0 (), 80, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs0 (), 160, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (220800))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs0 (), 160, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs0 (), 160, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs0 (), 20, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (1570400))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs0 (), 20, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (130400))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs0 (), 20, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (72800))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs0 (), 40, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (807200))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs0 (), 40, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (87200))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs0 (), 40, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs0 (), 80, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (418400))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs0 (), 80, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (72800))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs0 (), 80, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs0 (), 160, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (231200))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs0 (), 160, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs0 (), 160, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs0 (), 20, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (1740))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs0 (), 20, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (140))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs0 (), 20, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (76))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs0 (), 40, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (892))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs0 (), 40, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (92))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs0 (), 40, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs0 (), 80, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (460))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs0 (), 80, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (76))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs0 (), 80, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs0 (), 160, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (252))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs0 (), 160, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs0 (), 160, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs11 (), 20, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (139200))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs11 (), 20, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs11 (), 20, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs11 (), 40, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (98400))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs11 (), 40, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs11 (), 40, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs11 (), 80, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (71200))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs11 (), 80, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs11 (), 80, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs11 (), 160, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs11 (), 160, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs11 (), 160, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs11 (), 20, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (144800))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs11 (), 20, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs11 (), 20, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs11 (), 40, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (101600))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs11 (), 40, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs11 (), 40, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs11 (), 80, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (72800))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs11 (), 80, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs11 (), 80, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs11 (), 160, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs11 (), 160, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs11 (), 160, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs11 (), 20, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (156))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs11 (), 20, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs11 (), 20, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs11 (), 40, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (108))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs11 (), 40, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs11 (), 40, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs11 (), 80, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (76))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs11 (), 80, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs11 (), 80, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
-    && CheckTxDuration (1536, WifiPhy::GetHeMcs11 (), 160, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
-    && CheckTxDuration (76, WifiPhy::GetHeMcs11 (), 160, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
-    && CheckTxDuration (14, WifiPhy::GetHeMcs11 (), 160, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60));
+    && CheckTxDuration (1536, HePhy::GetHeMcs0 (), 20, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (1485600))
+    && CheckTxDuration (76, HePhy::GetHeMcs0 (), 20, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (125600))
+    && CheckTxDuration (14, HePhy::GetHeMcs0 (), 20, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (71200))
+    && CheckTxDuration (1536, HePhy::GetHeMcs0 (), 40, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (764800))
+    && CheckTxDuration (76, HePhy::GetHeMcs0 (), 40, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (84800))
+    && CheckTxDuration (14, HePhy::GetHeMcs0 (), 40, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
+    && CheckTxDuration (1536, HePhy::GetHeMcs0 (), 80, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (397600))
+    && CheckTxDuration (76, HePhy::GetHeMcs0 (), 80, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (71200))
+    && CheckTxDuration (14, HePhy::GetHeMcs0 (), 80, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
+    && CheckTxDuration (1536, HePhy::GetHeMcs0 (), 160, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (220800))
+    && CheckTxDuration (76, HePhy::GetHeMcs0 (), 160, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
+    && CheckTxDuration (14, HePhy::GetHeMcs0 (), 160, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
+    && CheckTxDuration (1536, HePhy::GetHeMcs0 (), 20, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (1570400))
+    && CheckTxDuration (76, HePhy::GetHeMcs0 (), 20, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (130400))
+    && CheckTxDuration (14, HePhy::GetHeMcs0 (), 20, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (72800))
+    && CheckTxDuration (1536, HePhy::GetHeMcs0 (), 40, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (807200))
+    && CheckTxDuration (76, HePhy::GetHeMcs0 (), 40, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (87200))
+    && CheckTxDuration (14, HePhy::GetHeMcs0 (), 40, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
+    && CheckTxDuration (1536, HePhy::GetHeMcs0 (), 80, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (418400))
+    && CheckTxDuration (76, HePhy::GetHeMcs0 (), 80, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (72800))
+    && CheckTxDuration (14, HePhy::GetHeMcs0 (), 80, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
+    && CheckTxDuration (1536, HePhy::GetHeMcs0 (), 160, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (231200))
+    && CheckTxDuration (76, HePhy::GetHeMcs0 (), 160, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
+    && CheckTxDuration (14, HePhy::GetHeMcs0 (), 160, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
+    && CheckTxDuration (1536, HePhy::GetHeMcs0 (), 20, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (1740))
+    && CheckTxDuration (76, HePhy::GetHeMcs0 (), 20, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (140))
+    && CheckTxDuration (14, HePhy::GetHeMcs0 (), 20, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (76))
+    && CheckTxDuration (1536, HePhy::GetHeMcs0 (), 40, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (892))
+    && CheckTxDuration (76, HePhy::GetHeMcs0 (), 40, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (92))
+    && CheckTxDuration (14, HePhy::GetHeMcs0 (), 40, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
+    && CheckTxDuration (1536, HePhy::GetHeMcs0 (), 80, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (460))
+    && CheckTxDuration (76, HePhy::GetHeMcs0 (), 80, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (76))
+    && CheckTxDuration (14, HePhy::GetHeMcs0 (), 80, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
+    && CheckTxDuration (1536, HePhy::GetHeMcs0 (), 160, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (252))
+    && CheckTxDuration (76, HePhy::GetHeMcs0 (), 160, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
+    && CheckTxDuration (14, HePhy::GetHeMcs0 (), 160, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
+    && CheckTxDuration (1536, HePhy::GetHeMcs11 (), 20, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (139200))
+    && CheckTxDuration (76, HePhy::GetHeMcs11 (), 20, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
+    && CheckTxDuration (14, HePhy::GetHeMcs11 (), 20, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
+    && CheckTxDuration (1536, HePhy::GetHeMcs11 (), 40, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (98400))
+    && CheckTxDuration (76, HePhy::GetHeMcs11 (), 40, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
+    && CheckTxDuration (14, HePhy::GetHeMcs11 (), 40, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
+    && CheckTxDuration (1536, HePhy::GetHeMcs11 (), 80, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (71200))
+    && CheckTxDuration (76, HePhy::GetHeMcs11 (), 80, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
+    && CheckTxDuration (14, HePhy::GetHeMcs11 (), 80, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
+    && CheckTxDuration (1536, HePhy::GetHeMcs11 (), 160, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
+    && CheckTxDuration (76, HePhy::GetHeMcs11 (), 160, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
+    && CheckTxDuration (14, HePhy::GetHeMcs11 (), 160, 800, WIFI_PREAMBLE_HE_SU, NanoSeconds (57600))
+    && CheckTxDuration (1536, HePhy::GetHeMcs11 (), 20, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (144800))
+    && CheckTxDuration (76, HePhy::GetHeMcs11 (), 20, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
+    && CheckTxDuration (14, HePhy::GetHeMcs11 (), 20, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
+    && CheckTxDuration (1536, HePhy::GetHeMcs11 (), 40, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (101600))
+    && CheckTxDuration (76, HePhy::GetHeMcs11 (), 40, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
+    && CheckTxDuration (14, HePhy::GetHeMcs11 (), 40, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
+    && CheckTxDuration (1536, HePhy::GetHeMcs11 (), 80, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (72800))
+    && CheckTxDuration (76, HePhy::GetHeMcs11 (), 80, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
+    && CheckTxDuration (14, HePhy::GetHeMcs11 (), 80, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
+    && CheckTxDuration (1536, HePhy::GetHeMcs11 (), 160, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
+    && CheckTxDuration (76, HePhy::GetHeMcs11 (), 160, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
+    && CheckTxDuration (14, HePhy::GetHeMcs11 (), 160, 1600, WIFI_PREAMBLE_HE_SU, NanoSeconds (58400))
+    && CheckTxDuration (1536, HePhy::GetHeMcs11 (), 20, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (156))
+    && CheckTxDuration (76, HePhy::GetHeMcs11 (), 20, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
+    && CheckTxDuration (14, HePhy::GetHeMcs11 (), 20, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
+    && CheckTxDuration (1536, HePhy::GetHeMcs11 (), 40, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (108))
+    && CheckTxDuration (76, HePhy::GetHeMcs11 (), 40, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
+    && CheckTxDuration (14, HePhy::GetHeMcs11 (), 40, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
+    && CheckTxDuration (1536, HePhy::GetHeMcs11 (), 80, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (76))
+    && CheckTxDuration (76, HePhy::GetHeMcs11 (), 80, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
+    && CheckTxDuration (14, HePhy::GetHeMcs11 (), 80, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
+    && CheckTxDuration (1536, HePhy::GetHeMcs11 (), 160, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
+    && CheckTxDuration (76, HePhy::GetHeMcs11 (), 160, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60))
+    && CheckTxDuration (14, HePhy::GetHeMcs11 (), 160, 3200, WIFI_PREAMBLE_HE_SU, MicroSeconds (60));
 
   NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11ax SU duration failed");
 
@@ -552,19 +540,19 @@
   retval = retval
     && CheckHeMuTxDuration (std::list<uint32_t> {1536,
                                                  1536},
-                            std::list<HeMuUserInfo> { {{true, HeRu::RU_242_TONE, 1}, WifiPhy::GetHeMcs0 (), 1},
-                                                      {{true, HeRu::RU_242_TONE, 2}, WifiPhy::GetHeMcs0 (), 1} },
-                            40, 800, NanoSeconds (1489600)) //equivalent to HE_SU for 20 MHz with extra HE-SIG-B (i.e. 4 us)
+                            std::list<HeMuUserInfo> { {{HeRu::RU_242_TONE, 1, true}, HePhy::GetHeMcs0 (), 1},
+                                                      {{HeRu::RU_242_TONE, 2, true}, HePhy::GetHeMcs0 (), 1} },
+                            40, 800, NanoSeconds (1493600)) //equivalent to HE_SU for 20 MHz with 2 extra HE-SIG-B (i.e. 8 us)
   && CheckHeMuTxDuration (std::list<uint32_t> {1536,
                                                1536},
-                          std::list<HeMuUserInfo> { {{true, HeRu::RU_242_TONE, 1}, WifiPhy::GetHeMcs1 (), 1},
-                                                    {{true, HeRu::RU_242_TONE, 2}, WifiPhy::GetHeMcs0 (), 1} },
-                          40, 800, NanoSeconds (1489600)) //shouldn't change if first PSDU is shorter
+                          std::list<HeMuUserInfo> { {{HeRu::RU_242_TONE, 1, true}, HePhy::GetHeMcs1 (), 1},
+                                                    {{HeRu::RU_242_TONE, 2, true}, HePhy::GetHeMcs0 (), 1} },
+                          40, 800, NanoSeconds (1493600)) //shouldn't change if first PSDU is shorter
   && CheckHeMuTxDuration (std::list<uint32_t> {1536,
                                                76},
-                          std::list<HeMuUserInfo> { {{true, HeRu::RU_242_TONE, 1}, WifiPhy::GetHeMcs0 (), 1},
-                                                    {{true, HeRu::RU_242_TONE, 2}, WifiPhy::GetHeMcs0 (), 1} },
-                          40, 800, NanoSeconds (1489600));
+                          std::list<HeMuUserInfo> { {{HeRu::RU_242_TONE, 1, true}, HePhy::GetHeMcs0 (), 1},
+                                                    {{HeRu::RU_242_TONE, 2, true}, HePhy::GetHeMcs0 (), 1} },
+                          40, 800, NanoSeconds (1493600));
 
   NS_TEST_EXPECT_MSG_EQ (retval, true, "an 802.11ax MU duration failed");
 
@@ -575,6 +563,414 @@
  * \ingroup wifi-test
  * \ingroup tests
  *
+ * \brief HE-SIG-B duration test
+ */
+class HeSigBDurationTest : public TestCase
+{
+public:
+  HeSigBDurationTest ();
+  virtual ~HeSigBDurationTest ();
+  void DoRun (void) override;
+
+private:
+  /**
+   * Build a TXVECTOR for HE MU with the given bandwith and user informations.
+   *
+   * \param bw the channel width of the PPDU in MHz
+   * \param userInfos the list of HE MU specific user transmission parameters
+   *
+   * \return the configured HE MU TXVECTOR
+   */
+  static WifiTxVector BuildTxVector (uint16_t bw, std::list <HeMuUserInfo> userInfos);
+};
+
+HeSigBDurationTest::HeSigBDurationTest ()
+  : TestCase ("Check HE-SIG-B duration computation")
+{
+}
+
+HeSigBDurationTest::~HeSigBDurationTest ()
+{
+}
+
+WifiTxVector
+HeSigBDurationTest::BuildTxVector (uint16_t bw, std::list <HeMuUserInfo> userInfos)
+{
+  WifiTxVector txVector;
+  txVector.SetPreambleType (WIFI_PREAMBLE_HE_MU);
+  txVector.SetChannelWidth (bw);
+  txVector.SetGuardInterval (3200);
+  txVector.SetStbc (0);
+  txVector.SetNess (0);
+  std::list<uint16_t> staIds;
+  uint16_t staId = 1;
+  for (const auto & userInfo : userInfos)
+    {
+      txVector.SetHeMuUserInfo (staId, userInfo);
+      staIds.push_back (staId++);
+    }
+  return txVector;
+}
+
+void
+HeSigBDurationTest::DoRun (void)
+{
+  const auto & hePhy = WifiPhy::GetStaticPhyEntity(WIFI_MOD_CLASS_HE);
+
+  //20 MHz band
+  std::list<HeMuUserInfo> userInfos;
+  userInfos.push_back ({{HeRu::RU_106_TONE, 1, true}, HePhy::GetHeMcs11 (), 1});
+  userInfos.push_back ({{HeRu::RU_106_TONE, 2, true}, HePhy::GetHeMcs10 (), 4});
+  WifiTxVector txVector = BuildTxVector (20, userInfos);
+  NS_TEST_EXPECT_MSG_EQ (hePhy->GetSigMode (WIFI_PPDU_FIELD_SIG_B, txVector), VhtPhy::GetVhtMcs5 (), "HE-SIG-B should be sent at MCS 5");
+  std::pair<std::size_t, std::size_t> numUsersPerCc = txVector.GetNumRusPerHeSigBContentChannel ();
+  NS_TEST_EXPECT_MSG_EQ (numUsersPerCc.first, 2, "Both users should be on HE-SIG-B content channel 1");
+  NS_TEST_EXPECT_MSG_EQ (numUsersPerCc.second, 0, "Both users should be on HE-SIG-B content channel 2");
+  NS_TEST_EXPECT_MSG_EQ (hePhy->GetDuration (WIFI_PPDU_FIELD_SIG_B, txVector), MicroSeconds (4), "HE-SIG-B should only last one OFDM symbol");
+
+  //40 MHz band, even number of users per HE-SIG-B content channel
+  userInfos.push_back ({{HeRu::RU_52_TONE, 5, true}, HePhy::GetHeMcs4 (), 1});
+  userInfos.push_back ({{HeRu::RU_52_TONE, 6, true}, HePhy::GetHeMcs6 (), 2});
+  userInfos.push_back ({{HeRu::RU_52_TONE, 7, true}, HePhy::GetHeMcs5 (), 3});
+  userInfos.push_back ({{HeRu::RU_52_TONE, 8, true}, HePhy::GetHeMcs6 (), 2});
+  txVector = BuildTxVector (40, userInfos);
+  NS_TEST_EXPECT_MSG_EQ (hePhy->GetSigMode (WIFI_PPDU_FIELD_SIG_B, txVector), VhtPhy::GetVhtMcs4 (), "HE-SIG-B should be sent at MCS 4");
+  numUsersPerCc = txVector.GetNumRusPerHeSigBContentChannel ();
+  NS_TEST_EXPECT_MSG_EQ (numUsersPerCc.first, 2, "Two users should be on HE-SIG-B content channel 1");
+  NS_TEST_EXPECT_MSG_EQ (numUsersPerCc.second, 4, "Four users should be on HE-SIG-B content channel 2");
+  NS_TEST_EXPECT_MSG_EQ (hePhy->GetDuration (WIFI_PPDU_FIELD_SIG_B, txVector), MicroSeconds (4), "HE-SIG-B should only last one OFDM symbol");
+
+  //40 MHz band, odd number of users per HE-SIG-B content channel
+  userInfos.push_back ({{HeRu::RU_26_TONE, 13, true}, HePhy::GetHeMcs3 (), 1});
+  txVector = BuildTxVector (40, userInfos);
+  NS_TEST_EXPECT_MSG_EQ (hePhy->GetSigMode (WIFI_PPDU_FIELD_SIG_B, txVector), VhtPhy::GetVhtMcs3 (), "HE-SIG-B should be sent at MCS 3");
+  numUsersPerCc = txVector.GetNumRusPerHeSigBContentChannel ();
+  NS_TEST_EXPECT_MSG_EQ (numUsersPerCc.first, 2, "Two users should be on HE-SIG-B content channel 1");
+  NS_TEST_EXPECT_MSG_EQ (numUsersPerCc.second, 5, "Five users should be on HE-SIG-B content channel 2");
+  NS_TEST_EXPECT_MSG_EQ (hePhy->GetDuration (WIFI_PPDU_FIELD_SIG_B, txVector), MicroSeconds (8), "HE-SIG-B should last two OFDM symbols");
+
+  //80 MHz band
+  userInfos.push_back ({{HeRu::RU_242_TONE, 3, true}, HePhy::GetHeMcs1 (), 1});
+  userInfos.push_back ({{HeRu::RU_242_TONE, 4, true}, HePhy::GetHeMcs4 (), 1});
+  txVector = BuildTxVector (80, userInfos);
+  NS_TEST_EXPECT_MSG_EQ (hePhy->GetSigMode (WIFI_PPDU_FIELD_SIG_B, txVector), VhtPhy::GetVhtMcs1 (), "HE-SIG-B should be sent at MCS 1");
+  numUsersPerCc = txVector.GetNumRusPerHeSigBContentChannel ();
+  NS_TEST_EXPECT_MSG_EQ (numUsersPerCc.first, 3, "Three users should be on HE-SIG-B content channel 1");
+  NS_TEST_EXPECT_MSG_EQ (numUsersPerCc.second, 6, "Six users should be on HE-SIG-B content channel 2");
+  NS_TEST_EXPECT_MSG_EQ (hePhy->GetDuration (WIFI_PPDU_FIELD_SIG_B, txVector), MicroSeconds (16), "HE-SIG-B should last four OFDM symbols");
+
+  //160 MHz band
+  userInfos.push_back ({{HeRu::RU_996_TONE, 1, false}, HePhy::GetHeMcs1 (), 1});
+  txVector = BuildTxVector (160, userInfos);
+  NS_TEST_EXPECT_MSG_EQ (hePhy->GetSigMode (WIFI_PPDU_FIELD_SIG_B, txVector), VhtPhy::GetVhtMcs1 (), "HE-SIG-B should be sent at MCS 1");
+  numUsersPerCc = txVector.GetNumRusPerHeSigBContentChannel ();
+  NS_TEST_EXPECT_MSG_EQ (numUsersPerCc.first, 4, "Four users should be on HE-SIG-B content channel 1");
+  NS_TEST_EXPECT_MSG_EQ (numUsersPerCc.second, 7, "Seven users should be on HE-SIG-B content channel 2");
+  NS_TEST_EXPECT_MSG_EQ (hePhy->GetDuration (WIFI_PPDU_FIELD_SIG_B, txVector), MicroSeconds (20), "HE-SIG-B should last five OFDM symbols");
+}
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief PHY header sections consistency test
+ */
+class PhyHeaderSectionsTest : public TestCase
+{
+public:
+  PhyHeaderSectionsTest ();
+  virtual ~PhyHeaderSectionsTest ();
+  void DoRun (void) override;
+
+
+private:
+  /**
+   * Check if map of PHY header sections returned by a given PHY entity
+   * corresponds to a known value
+   *
+   * @param obtained the map of PHY header sections to check
+   * @param expected the expected map of PHY header sections
+   */
+  void CheckPhyHeaderSections (PhyEntity::PhyHeaderSections obtained,
+                               PhyEntity::PhyHeaderSections expected);
+};
+
+PhyHeaderSectionsTest::PhyHeaderSectionsTest ()
+  : TestCase ("PHY header sections consistency")
+{
+}
+
+PhyHeaderSectionsTest::~PhyHeaderSectionsTest ()
+{
+}
+
+void
+PhyHeaderSectionsTest::CheckPhyHeaderSections (PhyEntity::PhyHeaderSections obtained,
+                                               PhyEntity::PhyHeaderSections expected)
+{
+  NS_TEST_EXPECT_MSG_EQ (obtained.size (), expected.size (), "The expected map size (" << expected.size () << ") was not obtained (" << obtained.size () << ")");
+
+  auto itObtained = obtained.begin ();
+  auto itExpected = expected.begin ();
+  for (;itObtained != obtained.end () || itExpected != expected.end ();)
+    {
+      WifiPpduField field = itObtained->first;
+      auto window = itObtained->second.first;
+      auto mode = itObtained->second.second;
+
+      WifiPpduField fieldRef = itExpected->first;
+      auto windowRef = itExpected->second.first;
+      auto modeRef = itExpected->second.second;
+
+      NS_TEST_EXPECT_MSG_EQ (field, fieldRef, "The expected PPDU field (" << fieldRef << ") was not obtained (" << field << ")");
+      NS_TEST_EXPECT_MSG_EQ (window.first, windowRef.first, "The expected start time (" << windowRef.first << ") was not obtained (" << window.first << ")");
+      NS_TEST_EXPECT_MSG_EQ (window.second, windowRef.second, "The expected stop time (" << windowRef.second << ") was not obtained (" << window.second << ")");
+      NS_TEST_EXPECT_MSG_EQ (mode, modeRef, "The expected mode (" << modeRef << ") was not obtained (" << mode << ")");
+      ++itObtained;
+      ++itExpected;
+    }
+}
+
+void
+PhyHeaderSectionsTest::DoRun (void)
+{
+  Time ppduStart = Seconds (1.0);
+  Ptr<PhyEntity> phyEntity;
+  PhyEntity::PhyHeaderSections sections;
+  WifiTxVector txVector;
+  WifiMode nonHtMode;
+
+
+  // ==================================================================================
+  // 11b (HR/DSSS)
+  phyEntity = Create<DsssPhy> ();
+  txVector.SetMode (DsssPhy::GetDsssRate1Mbps ());
+  txVector.SetChannelWidth (22);
+
+  // -> long PPDU format
+  txVector.SetPreambleType (WIFI_PREAMBLE_LONG);
+  nonHtMode = DsssPhy::GetDsssRate1Mbps ();
+  sections = { { WIFI_PPDU_FIELD_PREAMBLE, { { ppduStart,
+                                               ppduStart + MicroSeconds (144) },
+                                             nonHtMode } },
+               { WIFI_PPDU_FIELD_NON_HT_HEADER, { { ppduStart + MicroSeconds (144),
+                                                    ppduStart + MicroSeconds (192) },
+                                                  nonHtMode } } };
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+
+  // -> long PPDU format if data rate is 1 Mbps (even if preamble is tagged short)
+  txVector.SetPreambleType (WIFI_PREAMBLE_SHORT);
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+
+  // -> short PPDU format
+  txVector.SetMode (DsssPhy::GetDsssRate11Mbps ());
+  nonHtMode = DsssPhy::GetDsssRate2Mbps ();
+  txVector.SetPreambleType (WIFI_PREAMBLE_SHORT);
+  sections = { { WIFI_PPDU_FIELD_PREAMBLE, { { ppduStart,
+                                               ppduStart + MicroSeconds (72) },
+                                             nonHtMode } },
+               { WIFI_PPDU_FIELD_NON_HT_HEADER, { { ppduStart + MicroSeconds (72),
+                                                    ppduStart + MicroSeconds (96) },
+                                                  nonHtMode } } };
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+
+
+  // ==================================================================================
+  // 11a (OFDM)
+  txVector.SetPreambleType (WIFI_PREAMBLE_LONG);
+
+  // -> one iteration per variant: default, 10 MHz, and 5 MHz
+  std::map<OfdmPhyVariant, std::size_t> variants { //number to use to deduce rate and BW info for each variant
+    { OFDM_PHY_DEFAULT, 1},
+    { OFDM_PHY_10_MHZ,  2},
+    { OFDM_PHY_5_MHZ,   4}
+  };
+  for (auto variant : variants)
+    {
+      phyEntity = Create<OfdmPhy> (variant.first);
+      std::size_t ratio = variant.second;
+      uint16_t bw = 20 / ratio; //MHz
+      txVector.SetChannelWidth (bw);
+      txVector.SetMode (OfdmPhy::GetOfdmRate (12000000 / ratio, bw));
+      nonHtMode = OfdmPhy::GetOfdmRate (6000000 / ratio, bw);
+      sections = { { WIFI_PPDU_FIELD_PREAMBLE, { { ppduStart,
+                                                   ppduStart + MicroSeconds (16 * ratio) },
+                                                 nonHtMode } },
+                   { WIFI_PPDU_FIELD_NON_HT_HEADER, { { ppduStart + MicroSeconds (16 * ratio),
+                                                        ppduStart + MicroSeconds (20 * ratio) },
+                                                      nonHtMode } } };
+      CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+    }
+
+
+  // ==================================================================================
+  // 11g (ERP-OFDM)
+  phyEntity = Create<ErpOfdmPhy> ();
+  txVector.SetChannelWidth (20);
+  txVector.SetMode (ErpOfdmPhy::GetErpOfdmRate (54000000));
+  nonHtMode = ErpOfdmPhy::GetErpOfdmRate6Mbps ();
+  sections = { { WIFI_PPDU_FIELD_PREAMBLE, { { ppduStart,
+                                               ppduStart + MicroSeconds (16) },
+                                             nonHtMode } },
+               { WIFI_PPDU_FIELD_NON_HT_HEADER, { { ppduStart + MicroSeconds (16),
+                                                    ppduStart + MicroSeconds (20) },
+                                                  nonHtMode } } };
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+
+
+  // ==================================================================================
+  // 11n (HT)
+  phyEntity = Create<HtPhy> (4);
+  txVector.SetChannelWidth (20);
+  txVector.SetMode (HtPhy::GetHtMcs6 ());
+  nonHtMode = OfdmPhy::GetOfdmRate6Mbps ();
+  WifiMode htSigMode = nonHtMode;
+
+  // -> HT-mixed format for 2 SS and no ESS
+  txVector.SetPreambleType (WIFI_PREAMBLE_HT_MF);
+  txVector.SetNss (2);
+  txVector.SetNess (0);
+  sections = { { WIFI_PPDU_FIELD_PREAMBLE, { { ppduStart,
+                                               ppduStart + MicroSeconds (16) },
+                                             nonHtMode } },
+               { WIFI_PPDU_FIELD_NON_HT_HEADER, { { ppduStart + MicroSeconds (16),
+                                                    ppduStart + MicroSeconds (20) },
+                                                  nonHtMode } },
+               { WIFI_PPDU_FIELD_HT_SIG, { { ppduStart + MicroSeconds (20),
+                                             ppduStart + MicroSeconds (28) },
+                                           htSigMode } },
+               { WIFI_PPDU_FIELD_TRAINING, { { ppduStart + MicroSeconds (28),
+                                               ppduStart + MicroSeconds (40) }, // 1 HT-STF + 2 HT-LTFs
+                                             htSigMode } } };
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+  txVector.SetChannelWidth (20); //shouldn't have any impact
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+
+  // -> HT-mixed format for 3 SS and 1 ESS
+  txVector.SetNss (3);
+  txVector.SetNess (1);
+  sections[WIFI_PPDU_FIELD_TRAINING] = { { ppduStart + MicroSeconds (28),
+                                           ppduStart + MicroSeconds (52) }, // 1 HT-STF + 5 HT-LTFs (4 data + 1 extension)
+                                         htSigMode };
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+
+
+  // ==================================================================================
+  // 11ac (VHT)
+  phyEntity = Create<VhtPhy> ();
+  txVector.SetChannelWidth (20);
+  txVector.SetNess (0);
+  txVector.SetMode (VhtPhy::GetVhtMcs7 ());
+  WifiMode sigAMode = nonHtMode;
+  WifiMode sigBMode = VhtPhy::GetVhtMcs0 ();
+
+  // -> VHT SU format for 5 SS
+  txVector.SetPreambleType (WIFI_PREAMBLE_VHT_SU);
+  txVector.SetNss (5);
+  sections = { { WIFI_PPDU_FIELD_PREAMBLE, { { ppduStart,
+                                               ppduStart + MicroSeconds (16) },
+                                             nonHtMode } },
+               { WIFI_PPDU_FIELD_NON_HT_HEADER, { { ppduStart + MicroSeconds (16),
+                                                    ppduStart + MicroSeconds (20) },
+                                                  nonHtMode } },
+               { WIFI_PPDU_FIELD_SIG_A, { { ppduStart + MicroSeconds (20),
+                                            ppduStart + MicroSeconds (28) },
+                                          sigAMode } },
+               { WIFI_PPDU_FIELD_TRAINING, { { ppduStart + MicroSeconds (28),
+                                               ppduStart + MicroSeconds (56) }, // 1 VHT-STF + 6 VHT-LTFs
+                                             sigAMode } } };
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+
+  // -> VHT SU format for 7 SS
+  txVector.SetNss (7);
+  sections[WIFI_PPDU_FIELD_TRAINING] = { { ppduStart + MicroSeconds (28),
+                                           ppduStart + MicroSeconds (64) }, // 1 VHT-STF + 8 VHT-LTFs
+                                         sigAMode };
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+
+  // -> VHT MU format for 3 SS
+  txVector.SetPreambleType (WIFI_PREAMBLE_VHT_MU);
+  txVector.SetNss (3);
+  sections[WIFI_PPDU_FIELD_TRAINING] = { { ppduStart + MicroSeconds (28),
+                                           ppduStart + MicroSeconds (48) }, // 1 VHT-STF + 4 VHT-LTFs
+                                         sigAMode };
+  sections[WIFI_PPDU_FIELD_SIG_B] = { { ppduStart + MicroSeconds (48),
+                                        ppduStart + MicroSeconds (52) },
+                                       sigBMode };
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+  txVector.SetChannelWidth (80); //shouldn't have any impact
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+
+
+  // ==================================================================================
+  // 11ax (HE)
+  phyEntity = Create<HePhy> ();
+  txVector.SetChannelWidth (20);
+  txVector.SetNss (2); //HE-LTF duration assumed to be always 8 us for the time being (see note in HePhy::GetTrainingDuration)
+  txVector.SetMode (HePhy::GetHeMcs9 ());
+  std::map<uint16_t, HeMuUserInfo> userInfoMap = { { 1, { {HeRu::RU_106_TONE, 1, true}, HePhy::GetHeMcs4 (), 2 } },
+                                                   { 2, { {HeRu::RU_106_TONE, 1, true}, HePhy::GetHeMcs9 (), 1 } } };
+  sigAMode = HePhy::GetVhtMcs0 ();
+  sigBMode = HePhy::GetVhtMcs4 (); //because of first user info map
+
+  // -> HE SU format
+  txVector.SetPreambleType (WIFI_PREAMBLE_HE_SU);
+  sections = { { WIFI_PPDU_FIELD_PREAMBLE, { { ppduStart,
+                                               ppduStart + MicroSeconds (16) },
+                                             nonHtMode } },
+               { WIFI_PPDU_FIELD_NON_HT_HEADER, { { ppduStart + MicroSeconds (16),
+                                                    ppduStart + MicroSeconds (24) }, // L-SIG + RL-SIG
+                                                  nonHtMode } },
+               { WIFI_PPDU_FIELD_SIG_A, { { ppduStart + MicroSeconds (24),
+                                            ppduStart + MicroSeconds (32) },
+                                          sigAMode } },
+               { WIFI_PPDU_FIELD_TRAINING, { { ppduStart + MicroSeconds (32),
+                                               ppduStart + MicroSeconds (52) }, // 1 HE-STF (@ 4 us) + 2 HE-LTFs (@ 8 us)
+                                             sigAMode } } };
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+
+  // -> HE ER SU format
+  txVector.SetPreambleType (WIFI_PREAMBLE_HE_ER_SU);
+  sections[WIFI_PPDU_FIELD_SIG_A] = { { ppduStart + MicroSeconds (24),
+                                        ppduStart + MicroSeconds (40) }, // 16 us HE-SIG-A
+                                      sigAMode };
+  sections[WIFI_PPDU_FIELD_TRAINING] = { { ppduStart + MicroSeconds (40),
+                                           ppduStart + MicroSeconds (60) }, // 1 HE-STF (@ 4 us) + 2 HE-LTFs (@ 8 us)
+                                         sigAMode };
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+
+  // -> HE TB format
+  txVector.SetPreambleType (WIFI_PREAMBLE_HE_TB);
+  txVector.SetHeMuUserInfo (1, userInfoMap.at (1));
+  txVector.SetHeMuUserInfo (2, userInfoMap.at (2));
+  sections[WIFI_PPDU_FIELD_SIG_A] = { { ppduStart + MicroSeconds (24),
+                                        ppduStart + MicroSeconds (32) },
+                                      sigAMode };
+  sections[WIFI_PPDU_FIELD_TRAINING] = { { ppduStart + MicroSeconds (32),
+                                           ppduStart + MicroSeconds (56) }, // 1 HE-STF (@ 8 us) + 2 HE-LTFs (@ 8 us)
+                                         sigAMode };
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+
+  // -> HE MU format
+  txVector.SetPreambleType (WIFI_PREAMBLE_HE_MU);
+  sections[WIFI_PPDU_FIELD_SIG_A] = { { ppduStart + MicroSeconds (24),
+                                        ppduStart + MicroSeconds (32) },
+                                      sigAMode };
+  sections[WIFI_PPDU_FIELD_SIG_B] = { { ppduStart + MicroSeconds (32),
+                                        ppduStart + MicroSeconds (36) }, // only one symbol
+                                       sigBMode };
+  sections[WIFI_PPDU_FIELD_TRAINING] = { { ppduStart + MicroSeconds (36),
+                                           ppduStart + MicroSeconds (56) }, // 1 HE-STF (@ 4 us) + 2 HE-LTFs (@ 8 us)
+                                         sigBMode };
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+  txVector.SetChannelWidth (160); //shouldn't have any impact
+  CheckPhyHeaderSections (phyEntity->GetPhyHeaderSections (txVector, ppduStart), sections);
+}
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
  * \brief Tx Duration Test Suite
  */
 class TxDurationTestSuite : public TestSuite
@@ -586,7 +982,9 @@
 TxDurationTestSuite::TxDurationTestSuite ()
   : TestSuite ("wifi-devices-tx-duration", UNIT)
 {
+  AddTestCase (new HeSigBDurationTest, TestCase::QUICK);
   AddTestCase (new TxDurationTest, TestCase::QUICK);
+  AddTestCase (new PhyHeaderSectionsTest, TestCase::QUICK);
 }
 
 static TxDurationTestSuite g_txDurationTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/wifi-aggregation-test.cc ns-3.34/src/wifi/test/wifi-aggregation-test.cc
--- ns-3.33/src/wifi/test/wifi-aggregation-test.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/wifi-aggregation-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -26,7 +26,7 @@
 #include "ns3/sta-wifi-mac.h"
 #include "ns3/yans-wifi-phy.h"
 #include "ns3/mac-tx-middle.h"
-#include "ns3/mac-low.h"
+#include "ns3/ht-frame-exchange-manager.h"
 #include "ns3/msdu-aggregator.h"
 #include "ns3/mpdu-aggregator.h"
 #include "ns3/wifi-net-device.h"
@@ -40,7 +40,10 @@
 #include "ns3/packet-socket-server.h"
 #include "ns3/packet-socket-client.h"
 #include "ns3/packet-socket-helper.h"
+#include "ns3/wifi-default-protection-manager.h"
+#include "ns3/wifi-default-ack-manager.h"
 #include <iterator>
+#include <algorithm>
 
 using namespace ns3;
 
@@ -56,17 +59,33 @@
   AmpduAggregationTest ();
 
 private:
-  virtual void DoRun (void);
+  /**
+   * Fired when the MAC discards an MPDU.
+   *
+   * \param reason the reason why the MPDU was discarded
+   * \param mpdu the discarded MPDU
+   */
+  void MpduDiscarded (WifiMacDropReason reason, Ptr<const WifiMacQueueItem> mpdu);
+
+  void DoRun (void) override;
   Ptr<WifiNetDevice> m_device; ///<WifiNetDevice
   Ptr<StaWifiMac> m_mac; ///< Mac
   Ptr<YansWifiPhy> m_phy; ///< Phy
   Ptr<WifiRemoteStationManager> m_manager; ///< remote station manager
   ObjectFactory m_factory; ///< factory
+  bool m_discarded; ///< whether the packet should be discarded
 };
 
 AmpduAggregationTest::AmpduAggregationTest ()
-  : TestCase ("Check the correctness of MPDU aggregation operations")
+  : TestCase ("Check the correctness of MPDU aggregation operations"),
+    m_discarded (false)
+{
+}
+
+void
+AmpduAggregationTest::MpduDiscarded (WifiMacDropReason, Ptr<const WifiMacQueueItem>)
 {
+  m_discarded = true;
 }
 
 void
@@ -102,10 +121,17 @@
    */
   m_mac = CreateObject<StaWifiMac> ();
   m_mac->SetDevice (m_device);
-  m_mac->SetWifiPhy (m_phy);
   m_mac->SetWifiRemoteStationManager (m_manager);
   m_mac->SetAddress (Mac48Address ("00:00:00:00:00:01"));
   m_mac->ConfigureStandard (WIFI_STANDARD_80211n_5GHZ);
+  Ptr<FrameExchangeManager> fem = m_mac->GetFrameExchangeManager ();
+  Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
+  protectionManager->SetWifiMac (m_mac);
+  fem->SetProtectionManager (protectionManager);
+  Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager> ();
+  ackManager->SetWifiMac (m_mac);
+  fem->SetAckManager (ackManager);
+  m_mac->SetWifiPhy (m_phy);
   m_device->SetMac (m_mac);
 
   /*
@@ -127,8 +153,6 @@
   hdr.SetAddr2 (Mac48Address ("00:00:00:00:00:01"));
   hdr.SetType (WIFI_MAC_QOSDATA);
   hdr.SetQosTid (0);
-  uint16_t sequence = m_mac->m_txMiddle->GetNextSequenceNumberFor (&hdr);
-  hdr.SetSequenceNumber (sequence);
   hdr.SetFragmentNumber (0);
   hdr.SetNoMoreFragments ();
   hdr.SetNoRetry ();
@@ -142,20 +166,43 @@
   reqHdr.SetBufferSize (64);
   reqHdr.SetTimeout (0);
   reqHdr.SetStartingSequence (0);
-  m_mac->GetBEQueue ()->m_baManager->CreateAgreement (&reqHdr, hdr.GetAddr1 ());
-  m_mac->GetBEQueue ()->m_baManager->NotifyAgreementEstablished (hdr.GetAddr1 (), 0, 0);
+  m_mac->GetBEQueue ()->GetBaManager ()->CreateAgreement (&reqHdr, hdr.GetAddr1 ());
+
+  MgtAddBaResponseHeader respHdr;
+  StatusCode code;
+  code.SetSuccess ();
+  respHdr.SetStatusCode (code);
+  respHdr.SetAmsduSupport (reqHdr.IsAmsduSupported ());
+  respHdr.SetImmediateBlockAck ();
+  respHdr.SetTid (reqHdr.GetTid ());
+  respHdr.SetBufferSize (63);
+  respHdr.SetTimeout (reqHdr.GetTimeout ());
+  m_mac->GetBEQueue ()->GetBaManager ()->UpdateAgreement (&respHdr, hdr.GetAddr1 (), 0);
 
   //-----------------------------------------------------------------------------------------------------
 
   /*
    * Test behavior when no other packets are in the queue
    */
-  WifiTxVector txVector = m_mac->GetBEQueue ()->GetLow ()->GetDataTxVector (Create<const WifiMacQueueItem> (pkt, hdr));
+  Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (fem);
+  Ptr<MpduAggregator> mpduAggregator = htFem->GetMpduAggregator ();
+
+  m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt, hdr));
+
+  Ptr<const WifiMacQueueItem> peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
+  WifiTxParameters txParams;
+  txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
+  WifiMacQueueItem::QueueIteratorPair queueIt;
+  Ptr<WifiMacQueueItem> item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (),
+                                                                  true, queueIt);
+
+  auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min (), queueIt);
 
-  auto mpduList = m_mac->GetBEQueue ()->GetLow ()->GetMpduAggregator ()->GetNextAmpdu (Create<WifiMacQueueItem> (pkt, hdr),
-                                                                                       txVector);
   NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), true, "a single packet should not result in an A-MPDU");
 
+  // the packet has not been "transmitted", release its sequence number
+  m_mac->m_txMiddle->SetSequenceNumberFor (&item->GetHeader ());
+
   //-----------------------------------------------------------------------------------------------------
 
   /*
@@ -178,17 +225,18 @@
   m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt1, hdr1));
   m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt2, hdr2));
 
-  mpduList = m_mac->GetBEQueue ()->GetLow ()->GetMpduAggregator ()->GetNextAmpdu (Create<WifiMacQueueItem> (pkt, hdr),
-                                                                                  txVector);
-  Ptr<WifiPsdu> psdu = Create<WifiPsdu> (mpduList);
+  item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true, queueIt);
+  mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min (), queueIt);
 
   NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), false, "MPDU aggregation failed");
+
+  Ptr<WifiPsdu> psdu = Create<WifiPsdu> (mpduList);
+  htFem->DequeuePsdu (psdu);
+
   NS_TEST_EXPECT_MSG_EQ (psdu->GetSize (), 4606, "A-MPDU size is not correct");
   NS_TEST_EXPECT_MSG_EQ (mpduList.size (), 3, "A-MPDU should contain 3 MPDUs");
   NS_TEST_EXPECT_MSG_EQ (m_mac->GetBEQueue ()->GetWifiMacQueue ()->GetNPackets (), 0, "queue should be empty");
 
-  Ptr <WifiMacQueueItem> dequeuedItem;
-  WifiMacHeader dequeuedHdr;
   for (uint32_t i = 0; i < psdu->GetNMpdus (); i++)
     {
       NS_TEST_EXPECT_MSG_EQ (psdu->GetHeader (i).GetSequenceNumber (), i, "wrong sequence number");
@@ -221,23 +269,39 @@
   hdr3.SetType (WIFI_MAC_QOSDATA);
   hdr3.SetQosTid (0);
 
+  m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt1, hdr1));
+  m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt2, hdr2));
   m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt3, hdr3));
 
-  mpduList = m_mac->GetBEQueue ()->GetLow ()->GetMpduAggregator ()->GetNextAmpdu (Create<WifiMacQueueItem> (pkt1, hdr1),
-                                                                                  txVector);
+  peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
+  txParams.Clear ();
+  txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
+  queueIt = {nullptr, WifiMacQueue::EMPTY};  // reset queueIt
+  item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true, queueIt);
+
+  mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min (), queueIt);
+
   NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), true, "a single packet for this destination should not result in an A-MPDU");
+  // dequeue the MPDU
+  htFem->DequeueMpdu (item);
+
+  peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
+  txParams.Clear ();
+  txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
+  queueIt = {nullptr, WifiMacQueue::EMPTY};  // reset queueIt
+  item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true, queueIt);
+
+  mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min (), queueIt);
 
-  mpduList = m_mac->GetBEQueue ()->GetLow ()->GetMpduAggregator ()->GetNextAmpdu (Create<WifiMacQueueItem> (pkt2, hdr2),
-                                                                                  txVector);
   NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), true, "no MPDU aggregation should be performed if there is no agreement");
 
   m_manager->SetMaxSsrc (0); //set to 0 in order to fake that the maximum number of retries has been reached
-  m_mac->GetBEQueue ()->m_currentHdr = hdr2;
-  m_mac->GetBEQueue ()->m_currentPacket = pkt2->Copy ();
-  m_mac->GetBEQueue ()->MissedAck ();
+  m_mac->TraceConnectWithoutContext ("DroppedMpdu", MakeCallback (&AmpduAggregationTest::MpduDiscarded, this));
+  htFem->m_dcf = m_mac->GetBEQueue ();
+  htFem->NormalAckTimeout (item, txParams.m_txVector);
 
-  NS_TEST_EXPECT_MSG_EQ (m_mac->GetBEQueue ()->m_currentPacket, 0, "packet should be discarded");
-  m_mac->GetBEQueue ()->GetWifiMacQueue ()->Remove (pkt3);
+  NS_TEST_EXPECT_MSG_EQ (m_discarded, true, "packet should be discarded");
+  m_mac->GetBEQueue ()->GetWifiMacQueue ()->Flush ();
 
   Simulator::Destroy ();
 
@@ -262,7 +326,7 @@
   TwoLevelAggregationTest ();
 
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
   Ptr<WifiNetDevice> m_device; ///<WifiNetDevice
   Ptr<StaWifiMac> m_mac; ///< Mac
   Ptr<YansWifiPhy> m_phy; ///< Phy
@@ -308,10 +372,17 @@
    */
   m_mac = CreateObject<StaWifiMac> ();
   m_mac->SetDevice (m_device);
-  m_mac->SetWifiPhy (m_phy);
   m_mac->SetWifiRemoteStationManager (m_manager);
   m_mac->SetAddress (Mac48Address ("00:00:00:00:00:01"));
   m_mac->ConfigureStandard (WIFI_STANDARD_80211n_5GHZ);
+  Ptr<FrameExchangeManager> fem = m_mac->GetFrameExchangeManager ();
+  Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
+  protectionManager->SetWifiMac (m_mac);
+  fem->SetProtectionManager (protectionManager);
+  Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager> ();
+  ackManager->SetWifiMac (m_mac);
+  fem->SetAckManager (ackManager);
+  m_mac->SetWifiPhy (m_phy);
   m_device->SetMac (m_mac);
 
   /*
@@ -328,7 +399,6 @@
    * Create dummy packets of 1500 bytes and fill mac header fields that will be used for the tests.
    */
   Ptr<const Packet> pkt = Create<Packet> (1500);
-  Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
   WifiMacHeader hdr;
   hdr.SetAddr1 (Mac48Address ("00:00:00:00:00:02"));
   hdr.SetAddr2 (Mac48Address ("00:00:00:00:00:01"));
@@ -338,59 +408,52 @@
   //-----------------------------------------------------------------------------------------------------
 
   /*
-   * Test MSDU aggregation of two packets using MsduAggregator::GetNextAmsdu.
-   * It checks whether aggregation succeeded:
-   *      - returned packet should be different from 0;
-   *      - A-MSDU frame size should be 3030 bytes (= 2 packets + headers + padding);
-   *      - one packet should be removed from the queue (the other packet is removed later in MacLow::AggregateToAmpdu) .
-   */
-  m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt, hdr));
-  m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt, hdr));
-
-  WifiTxVector txVector = m_mac->GetBEQueue ()->GetLow ()->GetDataTxVector (Create<const WifiMacQueueItem> (pkt, hdr));
+   * Test MSDU and MPDU aggregation. Three MSDUs are in the queue and the maximum A-MSDU size
+   * is such that only two MSDUs can be aggregated. Therefore, the first MPDU we get contains
+   * an A-MSDU of 2 MSDUs.
+   */
+  Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (fem);
+  Ptr<MsduAggregator> msduAggregator = htFem->GetMsduAggregator ();
+  Ptr<MpduAggregator> mpduAggregator = htFem->GetMpduAggregator ();
+
+  m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (Create<Packet> (1500), hdr));
+  m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (Create<Packet> (1500), hdr));
+  m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (Create<Packet> (1500), hdr));
+
+  Ptr<const WifiMacQueueItem> peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
+  WifiTxParameters txParams;
+  txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
+  htFem->TryAddMpdu (peeked, txParams, Time::Min ());
+  WifiMacQueueItem::QueueIteratorPair queueIt;
+  Ptr<WifiMacQueueItem> item = msduAggregator->GetNextAmsdu (peeked, txParams, Time::Min (), queueIt);
 
-  Ptr<WifiMacQueueItem> item;
-  item = m_mac->GetBEQueue ()->GetLow ()->GetMsduAggregator ()->GetNextAmsdu (hdr.GetAddr1 (), 0, txVector,
-                                                                              currentAggregatedPacket->GetSize ());
   bool result = (item != 0);
   NS_TEST_EXPECT_MSG_EQ (result, true, "aggregation failed");
-  NS_TEST_EXPECT_MSG_EQ (item->GetPacket ()->GetSize (), 3030, "wrong packet size");
-  NS_TEST_EXPECT_MSG_EQ (m_mac->GetBEQueue ()->GetWifiMacQueue ()->GetNPackets (), 0, "aggregated packets not removed from the queue");
-
-  //-----------------------------------------------------------------------------------------------------
+  NS_TEST_EXPECT_MSG_EQ (item->GetPacketSize (), 3030, "wrong packet size");
 
-  /*
-   * Aggregation is refused when the maximum size is reached.
-   * It checks whether MSDU aggregation has been rejected because the maximum MPDU size is set to 0 (returned packet should be equal to 0).
-   * This test is needed to ensure that no packets are removed from the queue in
-   * MsduAggregator::GetNextAmsdu, since aggregation will no occur in MacLow::AggregateToAmpdu.
-   */
-  m_mac->SetAttribute ("BE_MaxAmpduSize", UintegerValue (65535));
+  // dequeue the MSDUs
+  htFem->DequeueMpdu (item);
 
-  m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt, hdr));
-
-  item = m_mac->GetBEQueue ()->GetLow ()->GetMsduAggregator ()->GetNextAmsdu (hdr.GetAddr1 (), 0, txVector,
-                                                                              currentAggregatedPacket->GetSize ());
-  result = (item != 0);
-  NS_TEST_EXPECT_MSG_EQ (result, false, "maximum aggregated frame size check failed");
+  NS_TEST_EXPECT_MSG_EQ (m_mac->GetBEQueue ()->GetWifiMacQueue ()->GetNPackets (), 1,
+                         "Unexpected number of MSDUs left in the EDCA queue");
 
   //-----------------------------------------------------------------------------------------------------
 
   /*
-   * Aggregation does not occur when there is no more packets in the queue.
-   * It checks whether MSDU aggregation has been rejected because there is no packets ready in the queue (returned packet should be equal to 0).
-   * This test is needed to ensure that there is no issue when the queue is empty.
+   * A-MSDU aggregation fails when there is just one MSDU in the queue.
    */
-  m_mac->SetAttribute ("BE_MaxAmpduSize", UintegerValue (4095));
 
-  m_mac->GetBEQueue ()->GetWifiMacQueue ()->Remove (pkt);
-  m_mac->GetBEQueue ()->GetWifiMacQueue ()->Remove (pkt);
+  peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
+  txParams.Clear ();
+  txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
+  htFem->TryAddMpdu (peeked, txParams, Time::Min ());
+  item = msduAggregator->GetNextAmsdu (peeked, txParams, Time::Min (), queueIt);
 
-  item = m_mac->GetBEQueue ()->GetLow ()->GetMsduAggregator ()->GetNextAmsdu (hdr.GetAddr1 (), 0, txVector,
-                                                                              currentAggregatedPacket->GetSize ());
+  NS_TEST_EXPECT_MSG_EQ ((item == 0), true, "A-MSDU aggregation did not fail");
 
-  result = (item != 0);
-  NS_TEST_EXPECT_MSG_EQ (result, false, "aggregation failed to stop as queue is empty");
+  htFem->DequeueMpdu (*peeked->GetQueueIteratorPairs ().front ().it);
+
+  NS_TEST_EXPECT_MSG_EQ (m_mac->GetBEQueue ()->GetWifiMacQueue ()->GetNPackets (), 0, "queue should be empty");
 
   //-----------------------------------------------------------------------------------------------------
 
@@ -407,52 +470,67 @@
   reqHdr.SetBufferSize (64);
   reqHdr.SetTimeout (0);
   reqHdr.SetStartingSequence (0);
-  m_mac->GetVIQueue ()->m_baManager->CreateAgreement (&reqHdr, hdr.GetAddr1 ());
-  m_mac->GetVIQueue ()->m_baManager->NotifyAgreementEstablished (hdr.GetAddr1 (), tid, 0);
+  m_mac->GetVIQueue ()->GetBaManager ()->CreateAgreement (&reqHdr, hdr.GetAddr1 ());
+
+  MgtAddBaResponseHeader respHdr;
+  StatusCode code;
+  code.SetSuccess ();
+  respHdr.SetStatusCode (code);
+  respHdr.SetAmsduSupport (reqHdr.IsAmsduSupported ());
+  respHdr.SetImmediateBlockAck ();
+  respHdr.SetTid (reqHdr.GetTid ());
+  respHdr.SetBufferSize (63);
+  respHdr.SetTimeout (reqHdr.GetTimeout ());
+  m_mac->GetVIQueue ()->GetBaManager ()->UpdateAgreement (&respHdr, hdr.GetAddr1 (), 0);
 
   m_mac->SetAttribute ("VI_MaxAmsduSize", UintegerValue (3050));  // max 2 MSDUs per A-MSDU
   m_mac->SetAttribute ("VI_MaxAmpduSize", UintegerValue (65535));
   m_manager->SetAttribute ("DataMode", StringValue ("HtMcs2"));  // 19.5Mbps
 
-  pkt = Create<Packet> (1400);
   hdr.SetQosTid (tid);
 
   // Add 10 MSDUs to the EDCA queue
   for (uint8_t i = 0; i < 10; i++)
     {
-      m_mac->GetVIQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt, hdr));
+      m_mac->GetVIQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (Create<Packet> (1300), hdr));
     }
 
-  txVector = m_mac->GetVIQueue ()->GetLow ()->GetDataTxVector (Create<const WifiMacQueueItem> (pkt, hdr));
+  peeked = m_mac->GetVIQueue ()->PeekNextMpdu ();
+  txParams.Clear ();
+  txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
   Time txopLimit = m_mac->GetVIQueue ()->GetTxopLimit ();   // 3.008 ms
 
   // Compute the first MPDU to be aggregated in an A-MPDU. It must contain an A-MSDU
   // aggregating two MSDUs
-  Ptr<WifiMacQueueItem> mpdu = m_mac->GetVIQueue ()->GetLow ()->GetMsduAggregator ()->GetNextAmsdu (hdr.GetAddr1 (), tid,
-                                                                                                    txVector, 0, txopLimit);
-  NS_TEST_EXPECT_MSG_EQ (m_mac->GetVIQueue ()->GetWifiMacQueue ()->GetNPackets (), 8, "There must be 8 MSDUs left in EDCA queue");
+  queueIt = {nullptr, WifiMacQueue::EMPTY};  // reset queueIt
+  item = m_mac->GetVIQueue ()->GetNextMpdu (peeked, txParams, txopLimit, true, queueIt);
+
+  NS_TEST_EXPECT_MSG_EQ (std::distance (item->begin (), item->end ()), 2, "There must be 2 MSDUs in the A-MSDU");
 
-  auto mpduList = m_mac->GetVIQueue ()->GetLow ()->GetMpduAggregator ()->GetNextAmpdu (mpdu, txVector, txopLimit);
+  auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams, txopLimit, queueIt);
 
   // The maximum number of bytes that can be transmitted in a TXOP is (approximately, as we
   // do not consider that the preamble is transmitted at a different rate):
   // 19.5 Mbps * 3.008 ms = 7332 bytes
   // Given that the max A-MSDU size is set to 3050, an A-MSDU will contain two MSDUs and have
-  // a size of 2 * 1400 (MSDU size) + 2 * 14 (A-MSDU subframe header size) + 2 (one padding field) = 2830 bytes
+  // a size of 2 * 1300 (MSDU size) + 2 * 14 (A-MSDU subframe header size) + 2 (one padding field) = 2630 bytes
   // Hence, we expect that the A-MPDU will consist of:
-  // - 2 MPDUs containing each an A-MSDU. The size of each MPDU is 2830 (A-MSDU) + 30 (header+trailer) = 2860
-  // - 1 MPDU containing a single MSDU. The size of such MPDU is 1400 (MSDU) + 30 (header+trailer) = 1430
-  // The size of the A-MPDU is 4 + 2860 + 4 + 2860 + 4 + 1430 = 7162
+  // - 2 MPDUs containing each an A-MSDU. The size of each MPDU is 2630 (A-MSDU) + 30 (header+trailer) = 2660
+  // - 1 MPDU containing a single MSDU. The size of such MPDU is 1300 (MSDU) + 30 (header+trailer) = 1330
+  // The size of the A-MPDU is 4 + 2660 + 4 + 2660 + 4 + 1330 = 6662
   NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), false, "aggregation failed");
   NS_TEST_EXPECT_MSG_EQ (mpduList.size (), 3, "Unexpected number of MPDUs in the A-MPDU");
-  NS_TEST_EXPECT_MSG_EQ (mpduList.at (0)->GetSize (), 2860, "Unexpected size of the first MPDU");
-  NS_TEST_EXPECT_MSG_EQ (mpduList.at (1)->GetSize (), 2860, "Unexpected size of the second MPDU");
-  NS_TEST_EXPECT_MSG_EQ (mpduList.at (2)->GetSize (), 1430, "Unexpected size of the first MPDU");
+  NS_TEST_EXPECT_MSG_EQ (mpduList.at (0)->GetSize (), 2660, "Unexpected size of the first MPDU");
+  NS_TEST_EXPECT_MSG_EQ (mpduList.at (1)->GetSize (), 2660, "Unexpected size of the second MPDU");
+  NS_TEST_EXPECT_MSG_EQ (mpduList.at (2)->GetSize (), 1330, "Unexpected size of the first MPDU");
+
+  Ptr<WifiPsdu> psdu = Create<WifiPsdu> (mpduList);
+  htFem->DequeuePsdu (psdu);
+  
   NS_TEST_EXPECT_MSG_EQ (m_mac->GetVIQueue ()->GetWifiMacQueue ()->GetNPackets (), 5,
                          "Unexpected number of MSDUs left in the EDCA queue");
 
-  Ptr<WifiPsdu> psdu = Create<WifiPsdu> (mpduList);
-  NS_TEST_EXPECT_MSG_EQ (psdu->GetSize (), 7162, "Unexpected size of the A-MPDU");
+  NS_TEST_EXPECT_MSG_EQ (psdu->GetSize (), 6662, "Unexpected size of the A-MPDU");
 
   Simulator::Destroy ();
 
@@ -473,7 +551,7 @@
   HeAggregationTest ();
 
 private:
-  void DoRun (void);
+  void DoRun (void) override;
   /**
    * Run test for a given buffer size
    *
@@ -529,10 +607,17 @@
    */
   m_mac = CreateObject<StaWifiMac> ();
   m_mac->SetDevice (m_device);
-  m_mac->SetWifiPhy (m_phy);
   m_mac->SetWifiRemoteStationManager (m_manager);
   m_mac->SetAddress (Mac48Address ("00:00:00:00:00:01"));
   m_mac->ConfigureStandard (WIFI_STANDARD_80211ax_5GHZ);
+  Ptr<FrameExchangeManager> fem = m_mac->GetFrameExchangeManager ();
+  Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
+  protectionManager->SetWifiMac (m_mac);
+  fem->SetProtectionManager (protectionManager);
+  Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager> ();
+  ackManager->SetWifiMac (m_mac);
+  fem->SetAckManager (ackManager);
+  m_mac->SetWifiPhy (m_phy);
   m_device->SetMac (m_mac);
 
   /*
@@ -542,16 +627,14 @@
   m_manager->AddStationHeCapabilities (Mac48Address ("00:00:00:00:00:02"), heCapabilities);
 
   /*
-   * Create a dummy packet of 100 bytes and fill mac header fields.
+   * Fill mac header fields.
    */
-  Ptr<const Packet> pkt = Create<Packet> (100);
-  Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
   WifiMacHeader hdr;
   hdr.SetAddr1 (Mac48Address ("00:00:00:00:00:02"));
   hdr.SetAddr2 (Mac48Address ("00:00:00:00:00:01"));
   hdr.SetType (WIFI_MAC_QOSDATA);
   hdr.SetQosTid (0);
-  uint16_t sequence = m_mac->m_txMiddle->GetNextSequenceNumberFor (&hdr);
+  uint16_t sequence = m_mac->m_txMiddle->PeekNextSequenceNumberFor (&hdr);
   hdr.SetSequenceNumber (sequence);
   hdr.SetFragmentNumber (0);
   hdr.SetNoMoreFragments ();
@@ -566,12 +649,25 @@
   reqHdr.SetBufferSize (bufferSize);
   reqHdr.SetTimeout (0);
   reqHdr.SetStartingSequence (0);
-  m_mac->GetBEQueue ()->m_baManager->CreateAgreement (&reqHdr, hdr.GetAddr1 ());
-  m_mac->GetBEQueue ()->m_baManager->NotifyAgreementEstablished (hdr.GetAddr1 (), 0, 0);
+  m_mac->GetBEQueue ()->GetBaManager ()->CreateAgreement (&reqHdr, hdr.GetAddr1 ());
+
+  MgtAddBaResponseHeader respHdr;
+  StatusCode code;
+  code.SetSuccess ();
+  respHdr.SetStatusCode (code);
+  respHdr.SetAmsduSupport (reqHdr.IsAmsduSupported ());
+  respHdr.SetImmediateBlockAck ();
+  respHdr.SetTid (reqHdr.GetTid ());
+  respHdr.SetBufferSize (bufferSize - 1);
+  respHdr.SetTimeout (reqHdr.GetTimeout ());
+  m_mac->GetBEQueue ()->GetBaManager ()->UpdateAgreement (&respHdr, hdr.GetAddr1 (), 0);
 
   /*
    * Test behavior when 300 packets are ready for transmission but negociated buffer size is 64
    */
+  Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (fem);
+  Ptr<MpduAggregator> mpduAggregator = htFem->GetMpduAggregator ();
+
   for (uint16_t i = 0; i < 300; i++)
     {
       Ptr<const Packet> pkt = Create<Packet> (100);
@@ -585,14 +681,21 @@
       m_mac->GetBEQueue ()->GetWifiMacQueue ()->Enqueue (Create<WifiMacQueueItem> (pkt, hdr));
   }
 
-  WifiTxVector txVector = m_mac->GetBEQueue ()->GetLow ()->GetDataTxVector (Create<const WifiMacQueueItem> (pkt, hdr));
+  Ptr<const WifiMacQueueItem> peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
+  WifiTxParameters txParams;
+  txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
+  WifiMacQueueItem::QueueIteratorPair queueIt;
+  Ptr<WifiMacQueueItem> item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (),
+                                                                  true, queueIt);
+  
+  auto mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min (), queueIt);
+  Ptr<WifiPsdu> psdu = Create<WifiPsdu> (mpduList);
+  htFem->DequeuePsdu (psdu);
 
-  auto mpduList = m_mac->GetBEQueue ()->GetLow ()->GetMpduAggregator ()-> GetNextAmpdu (Create<WifiMacQueueItem> (pkt, hdr),
-                                                                                        txVector);
   NS_TEST_EXPECT_MSG_EQ (mpduList.empty (), false, "MPDU aggregation failed");
   NS_TEST_EXPECT_MSG_EQ (mpduList.size (), bufferSize, "A-MPDU should countain " << bufferSize << " MPDUs");
-  uint16_t expectedRemainingPacketsInQueue = 300 - bufferSize + 1;
-  NS_TEST_EXPECT_MSG_EQ (m_mac->GetBEQueue ()->GetWifiMacQueue ()->GetNPackets (), expectedRemainingPacketsInQueue, "queue should contain 300 - "<< bufferSize - 1 << " = "<< expectedRemainingPacketsInQueue << " packets");
+  uint16_t expectedRemainingPacketsInQueue = 300 - bufferSize;
+  NS_TEST_EXPECT_MSG_EQ (m_mac->GetBEQueue ()->GetWifiMacQueue ()->GetNPackets (), expectedRemainingPacketsInQueue, "queue should contain 300 - "<< bufferSize << " = "<< expectedRemainingPacketsInQueue << " packets");
 
   Simulator::Destroy ();
 
@@ -639,7 +742,7 @@
   PreservePacketsInAmpdus ();
   virtual ~PreservePacketsInAmpdus ();
 
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 
 private:
@@ -788,13 +891,9 @@
   server->SetStartTime (Seconds (0.0));
   server->SetStopTime (Seconds (4.0));
 
-  PointerValue ptr;
-  sta_device->GetMac ()->GetAttribute ("BE_Txop", ptr);
-  Ptr<QosTxop> qosTxop = ptr.Get<QosTxop> ();
-
   sta_device->GetMac ()->TraceConnectWithoutContext ("MacTx",
     MakeCallback (&PreservePacketsInAmpdus::NotifyMacTransmit, this));
-  qosTxop->GetLow ()->GetPhy ()->TraceConnectWithoutContext ("PhyTxPsduBegin",
+  sta_device->GetPhy ()->TraceConnectWithoutContext ("PhyTxPsduBegin",
     MakeCallback (&PreservePacketsInAmpdus::NotifyPsduForwardedDown, this));
   ap_device->GetMac ()->TraceConnectWithoutContext ("MacRx",
     MakeCallback (&PreservePacketsInAmpdus::NotifyMacForwardUp, this));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/wifi-error-rate-models-test.cc ns-3.34/src/wifi/test/wifi-error-rate-models-test.cc
--- ns-3.33/src/wifi/test/wifi-error-rate-models-test.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/wifi-error-rate-models-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -27,6 +27,7 @@
 #include "ns3/wifi-phy.h"
 #include "ns3/wifi-utils.h"
 #include "ns3/table-based-error-rate-model.h"
+#include "ns3/he-phy.h" //includes HT and VHT
 
 using namespace ns3;
 
@@ -57,7 +58,7 @@
   virtual ~WifiErrorRateModelsTestCaseDsss ();
 
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
 };
 
 WifiErrorRateModelsTestCaseDsss::WifiErrorRateModelsTestCaseDsss ()
@@ -166,7 +167,7 @@
   virtual ~WifiErrorRateModelsTestCaseNist ();
 
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
 };
 
 WifiErrorRateModelsTestCaseNist::WifiErrorRateModelsTestCaseNist ()
@@ -299,7 +300,7 @@
 {
 public:
   using InterferenceHelper::InterferenceHelper;
-  using InterferenceHelper::CalculateChunkSuccessRate;
+  using InterferenceHelper::CalculatePayloadChunkSuccessRate;
   using InterferenceHelper::CalculateSnr;
 };
 
@@ -316,7 +317,7 @@
   virtual ~WifiErrorRateModelsTestCaseMimo ();
 
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
 };
 
 WifiErrorRateModelsTestCaseMimo::WifiErrorRateModelsTestCaseMimo ()
@@ -333,7 +334,7 @@
 {
   TestInterferenceHelper interference;
   interference.SetNoiseFigure (0);
-  WifiMode mode = WifiPhy::GetHtMcs0 ();
+  WifiMode mode = HtPhy::GetHtMcs0 ();
   WifiTxVector txVector;
 
   txVector.SetMode (mode);
@@ -351,7 +352,7 @@
   double snr = interference.CalculateSnr (0.001, 0.001 / DbToRatio (initialSnr), txVector.GetChannelWidth (), txVector.GetNss ());
   NS_TEST_ASSERT_MSG_EQ_TOL (RatioToDb (snr), initialSnr, 0.1, "Attempt to set initial SNR to known value failed");
   Time duration = MilliSeconds (2);
-  double chunkSuccess = interference.CalculateChunkSuccessRate (snr, duration, mode, txVector);
+  double chunkSuccess = interference.CalculatePayloadChunkSuccessRate (snr, duration, txVector);
   NS_TEST_ASSERT_MSG_EQ_TOL (chunkSuccess, 0.905685, 0.000001, "CSR not within tolerance for SISO");
   double sisoChunkSuccess = chunkSuccess;
 
@@ -360,7 +361,7 @@
   txVector.SetNTx (2);
   snr = interference.CalculateSnr (0.001, 0.001 / DbToRatio (initialSnr), txVector.GetChannelWidth (), txVector.GetNss ());
   NS_TEST_ASSERT_MSG_EQ_TOL (RatioToDb (snr), initialSnr, 0.1, "SNR not within tolerance for 2x1:2 MIMO");
-  chunkSuccess = interference.CalculateChunkSuccessRate (snr, duration, mode, txVector);
+  chunkSuccess = interference.CalculatePayloadChunkSuccessRate (snr, duration, txVector);
   NS_TEST_ASSERT_MSG_EQ_TOL (chunkSuccess, 0.905685, 0.000001, "CSR not within tolerance for SISO");
 
   // MIMO 1x2:1: expect that SNR is increased by a factor of 3 dB (10 log 2/1) compared to SISO thanks to RX diversity
@@ -369,7 +370,7 @@
   interference.SetNumberOfReceiveAntennas (2);
   snr = interference.CalculateSnr (0.001, 0.001 / DbToRatio (initialSnr), txVector.GetChannelWidth (), txVector.GetNss ());
   NS_TEST_ASSERT_MSG_EQ_TOL (RatioToDb (snr), initialSnr + 3, 0.1, "SNR not within tolerance for 1x2:1 MIMO");
-  chunkSuccess = interference.CalculateChunkSuccessRate (snr, duration, mode, txVector);
+  chunkSuccess = interference.CalculatePayloadChunkSuccessRate (snr, duration, txVector);
   NS_TEST_ASSERT_MSG_GT (chunkSuccess, sisoChunkSuccess, "CSR not within tolerance for 1x2:1 MIMO");
 
   // MIMO 2x2:1: expect that SNR is increased by a factor of 3 dB (10 log 2/1) compared to SISO thanks to RX diversity
@@ -378,7 +379,7 @@
   interference.SetNumberOfReceiveAntennas (2);
   snr = interference.CalculateSnr (0.001, 0.001 / DbToRatio (initialSnr), txVector.GetChannelWidth (), txVector.GetNss ());
   NS_TEST_ASSERT_MSG_EQ_TOL (RatioToDb (snr), initialSnr + 3, 0.1, "SNR not equal within tolerance for 2x2:1 MIMO");
-  chunkSuccess = interference.CalculateChunkSuccessRate (snr, duration, mode, txVector);
+  chunkSuccess = interference.CalculatePayloadChunkSuccessRate (snr, duration, txVector);
   NS_TEST_ASSERT_MSG_GT (chunkSuccess, sisoChunkSuccess, "CSR not within tolerance for 2x2:1 MIMO");
 
  // MIMO 2x2:2: expect no SNR gain in AWGN channel
@@ -387,7 +388,7 @@
   interference.SetNumberOfReceiveAntennas (2);
   snr = interference.CalculateSnr (0.001, 0.001 / DbToRatio (initialSnr), txVector.GetChannelWidth (), txVector.GetNss ());
   NS_TEST_ASSERT_MSG_EQ_TOL (RatioToDb (snr), initialSnr, 0.1, "SNR not equal within tolerance for 2x2:2 MIMO");
-  chunkSuccess = interference.CalculateChunkSuccessRate (snr, duration, mode, txVector);
+  chunkSuccess = interference.CalculatePayloadChunkSuccessRate (snr, duration, txVector);
   NS_TEST_ASSERT_MSG_EQ_TOL (chunkSuccess, sisoChunkSuccess, 0.000001, "CSR not within tolerance for 2x2:2 MIMO");
 
   // MIMO 3x3:1: expect that SNR is increased by a factor of 4.8 dB (10 log 3/1) compared to SISO thanks to RX diversity
@@ -396,7 +397,7 @@
   interference.SetNumberOfReceiveAntennas (3);
   snr = interference.CalculateSnr (0.001, 0.001 / DbToRatio (initialSnr), txVector.GetChannelWidth (), txVector.GetNss ());
   NS_TEST_ASSERT_MSG_EQ_TOL (RatioToDb (snr), initialSnr + 4.8, 0.1, "SNR not within tolerance for 3x3:1 MIMO");
-  chunkSuccess = interference.CalculateChunkSuccessRate (snr, duration, mode, txVector);
+  chunkSuccess = interference.CalculatePayloadChunkSuccessRate (snr, duration, txVector);
   NS_TEST_ASSERT_MSG_GT (chunkSuccess, sisoChunkSuccess, "CSR not within tolerance for 3x3:1 MIMO");
 
   // MIMO 3x3:2: expect that SNR is increased by a factor of 1.8 dB (10 log 3/2) compared to SISO thanks to RX diversity
@@ -405,7 +406,7 @@
   interference.SetNumberOfReceiveAntennas (3);
   snr = interference.CalculateSnr (0.001, 0.001 / DbToRatio (initialSnr), txVector.GetChannelWidth (), txVector.GetNss ());
   NS_TEST_ASSERT_MSG_EQ_TOL (RatioToDb (snr), initialSnr + 1.8, 0.1, "SNR not within tolerance for 3x3:2 MIMO");
-  chunkSuccess = interference.CalculateChunkSuccessRate (snr, duration, mode, txVector);
+  chunkSuccess = interference.CalculatePayloadChunkSuccessRate (snr, duration, txVector);
   NS_TEST_ASSERT_MSG_GT (chunkSuccess, sisoChunkSuccess, "CSR not within tolerance for 3x3:2 MIMO");
 
   // MIMO 3x3:3: expect no SNR gain in AWGN channel
@@ -414,7 +415,7 @@
   interference.SetNumberOfReceiveAntennas (3);
   snr = interference.CalculateSnr (0.001, 0.001 / DbToRatio (initialSnr), txVector.GetChannelWidth (), txVector.GetNss ());
   NS_TEST_ASSERT_MSG_EQ_TOL (RatioToDb (snr), initialSnr, 0.1, "SNR not within tolerance for 3x3:3 MIMO");
-  chunkSuccess = interference.CalculateChunkSuccessRate (snr, duration, mode, txVector);
+  chunkSuccess = interference.CalculatePayloadChunkSuccessRate (snr, duration, txVector);
   NS_TEST_ASSERT_MSG_EQ_TOL (chunkSuccess, sisoChunkSuccess, 0.000001, "CSR not equal within tolerance for 3x3:3 MIMO");
 
   // MIMO 4x4:1: expect that SNR is increased by a factor of 6 dB (10 log 4/1) compared to SISO thanks to RX diversity
@@ -423,7 +424,7 @@
   interference.SetNumberOfReceiveAntennas (4);
   snr = interference.CalculateSnr (0.001, 0.001 / DbToRatio (initialSnr), txVector.GetChannelWidth (), txVector.GetNss ());
   NS_TEST_ASSERT_MSG_EQ_TOL (RatioToDb (snr), initialSnr + 6, 0.1, "SNR not within tolerance for 4x4:1 MIMO");
-  chunkSuccess = interference.CalculateChunkSuccessRate (snr, duration, mode, txVector);
+  chunkSuccess = interference.CalculatePayloadChunkSuccessRate (snr, duration, txVector);
   NS_TEST_ASSERT_MSG_GT (chunkSuccess, sisoChunkSuccess, "CSR not within tolerance for 4x4:1 MIMO");
 
   // MIMO 4x4:2: expect that SNR is increased by a factor of 3 dB (10 log 4/2) compared to SISO thanks to RX diversity
@@ -432,7 +433,7 @@
   interference.SetNumberOfReceiveAntennas (4);
   snr = interference.CalculateSnr (0.001, 0.001 / DbToRatio (initialSnr), txVector.GetChannelWidth (), txVector.GetNss ());
   NS_TEST_ASSERT_MSG_EQ_TOL (RatioToDb (snr), initialSnr + 3, 0.1, "SNR not within tolerance for 4x4:2 MIMO");
-  chunkSuccess = interference.CalculateChunkSuccessRate (snr, duration, mode, txVector);
+  chunkSuccess = interference.CalculatePayloadChunkSuccessRate (snr, duration, txVector);
   NS_TEST_ASSERT_MSG_GT (chunkSuccess, sisoChunkSuccess, "CSR not within tolerance for 4x4:2 MIMO");
 
   // MIMO 4x4:3: expect that SNR is increased by a factor of 1.2 dB (10 log 4/3) compared to SISO thanks to RX diversity
@@ -441,7 +442,7 @@
   interference.SetNumberOfReceiveAntennas (4);
   snr = interference.CalculateSnr (0.001, 0.001 / DbToRatio (initialSnr), txVector.GetChannelWidth (), txVector.GetNss ());
   NS_TEST_ASSERT_MSG_EQ_TOL (RatioToDb (snr), initialSnr + 1.2, 0.1, "SNR not within tolerance for 4x4:3 MIMO");
-  chunkSuccess = interference.CalculateChunkSuccessRate (snr, duration, mode, txVector);
+  chunkSuccess = interference.CalculatePayloadChunkSuccessRate (snr, duration, txVector);
   NS_TEST_ASSERT_MSG_GT (chunkSuccess, sisoChunkSuccess, "CSR not within tolerance for 4x4:1 MIMO");
 
   // MIMO 4x4:4: expect no SNR gain in AWGN channel
@@ -450,7 +451,7 @@
   interference.SetNumberOfReceiveAntennas (4);
   snr = interference.CalculateSnr (0.001, 0.001 / DbToRatio (initialSnr), txVector.GetChannelWidth (), txVector.GetNss ());
   NS_TEST_ASSERT_MSG_EQ_TOL (RatioToDb (snr), initialSnr, 0.1, "SNR not within tolerance for 4x4:4 MIMO");
-  chunkSuccess = interference.CalculateChunkSuccessRate (snr, duration, mode, txVector);
+  chunkSuccess = interference.CalculatePayloadChunkSuccessRate (snr, duration, txVector);
   NS_TEST_ASSERT_MSG_EQ_TOL (chunkSuccess, sisoChunkSuccess, 0.000001, "CSR not within tolerance for 4x4:4 MIMO");
 }
 
@@ -461,508 +462,983 @@
 {
 /* MCS 0 - 1458 bytes */
     {std::make_pair (0, 1458), {
-        {-4.0, 1.0},
-        {-3.5, 1.0},
-        {-3.0, 1.0},
-        {-2.5, 1.0},
-        {-2.0, 1.0},
-        {-1.5, 1.0},
-        {-1.0, 1.0},
-        {-0.5, 0.990175},
-        {0.0, 0.77713},
-        {0.5, 0.314965},
-        {1.0, 0.06643},
-        {1.5, 0.011625},
-        {2.0, 0.00155},
-        {2.5, 0.00025},
-        {3.0, 0.0},
-        {3.5, 0.0},
-        {4.0, 0.0},
-        {4.5, 0.0},
-        {5.0, 0.0},
-        {5.5, 0.0},
-        {6.0, 0.0},
-        {6.5, 0.0},
-        {7.0, 0.0},
-        {7.5, 0.0},
-        {8.0, 0.0},
-        {8.5, 0.0},
-        {9.0, 0.0},
-        {9.5, 0.0},
-        {10.0, 0.0},
-        {10.5, 0.0},
-        {11.0, 0.0},
-        {11.5, 0.0},
-        {12.0, 0.0},
-        {12.5, 0.0},
-        {13.0, 0.0},
-        {13.5, 0.0},
-        {14.0, 0.0},
-        {14.5, 0.0},
-        {15.0, 0.0},
-        {15.5, 0.0},
-        {16.0, 0.0},
-        {16.5, 0.0},
-        {17.0, 0.0},
-        {17.5, 0.0},
-        {18.0, 0.0},
-        {18.5, 0.0},
-        {19.0, 0.0},
-        {19.5, 0.0},
-        {20.0, 0.0},
-        {20.5, 0.0},
-        {21.0, 0.0},
-        {21.5, 0.0},
-        {22.0, 0.0},
-        {22.5, 0.0},
-        {23.0, 0.0},
-        {23.5, 0.0},
-        {24.0, 0.0},
-        {24.5, 0.0},
-        {25.0, 0.0},
-        {25.5, 0.0},
-        {26.0, 0.0},
-        {26.5, 0.0},
-        {27.0, 0.0},
-        {27.5, 0.0},
-        {28.0, 0.0},
-        {28.5, 0.0},
-        {29.0, 0.0},
-        {29.5, 0.0},
-        {30.0, 0.0},
-
+        {-4.00, 1.00000},
+        {-3.75, 1.00000},
+        {-3.50, 1.00000},
+        {-3.25, 1.00000},
+        {-3.00, 1.00000},
+        {-2.75, 1.00000},
+        {-2.50, 1.00000},
+        {-2.25, 1.00000},
+        {-2.00, 1.00000},
+        {-1.75, 1.00000},
+        {-1.50, 1.00000},
+        {-1.25, 1.00000},
+        {-1.00, 1.00000},
+        {-0.75, 0.99700},
+        {-0.50, 0.99400},
+        {-0.25, 0.90625},
+        {0.00, 0.81850},
+        {0.25, 0.55465},
+        {0.50, 0.29080},
+        {0.75, 0.17855},
+        {1.00, 0.06630},
+        {1.25, 0.03875},
+        {1.50, 0.01120},
+        {1.75, 0.00635},
+        {2.00, 0.00150},
+        {2.25, 0.00083},
+        {2.50, 0.00015},
+        {2.75, 0.00008},
+        {3.00, 0.00001},
+        {3.25, 0.00000},
+        {3.50, 0.00000},
+        {3.75, 0.00000},
+        {4.00, 0.00000},
+        {4.25, 0.00000},
+        {4.50, 0.00000},
+        {4.75, 0.00000},
+        {5.00, 0.00000},
+        {5.25, 0.00000},
+        {5.50, 0.00000},
+        {5.75, 0.00000},
+        {6.00, 0.00000},
+        {6.25, 0.00000},
+        {6.50, 0.00000},
+        {6.75, 0.00000},
+        {7.00, 0.00000},
+        {7.25, 0.00000},
+        {7.50, 0.00000},
+        {7.75, 0.00000},
+        {8.00, 0.00000},
+        {8.25, 0.00000},
+        {8.50, 0.00000},
+        {8.75, 0.00000},
+        {9.00, 0.00000},
+        {9.25, 0.00000},
+        {9.50, 0.00000},
+        {9.75, 0.00000},
+        {10.00, 0.00000},
+        {10.25, 0.00000},
+        {10.50, 0.00000},
+        {10.75, 0.00000},
+        {11.00, 0.00000},
+        {11.25, 0.00000},
+        {11.50, 0.00000},
+        {11.75, 0.00000},
+        {12.00, 0.00000},
+        {12.25, 0.00000},
+        {12.50, 0.00000},
+        {12.75, 0.00000},
+        {13.00, 0.00000},
+        {13.25, 0.00000},
+        {13.50, 0.00000},
+        {13.75, 0.00000},
+        {14.00, 0.00000},
+        {14.25, 0.00000},
+        {14.50, 0.00000},
+        {14.75, 0.00000},
+        {15.00, 0.00000},
+        {15.25, 0.00000},
+        {15.50, 0.00000},
+        {15.75, 0.00000},
+        {16.00, 0.00000},
+        {16.25, 0.00000},
+        {16.50, 0.00000},
+        {16.75, 0.00000},
+        {17.00, 0.00000},
+        {17.25, 0.00000},
+        {17.50, 0.00000},
+        {17.75, 0.00000},
+        {18.00, 0.00000},
+        {18.25, 0.00000},
+        {18.50, 0.00000},
+        {18.75, 0.00000},
+        {19.00, 0.00000},
+        {19.25, 0.00000},
+        {19.50, 0.00000},
+        {19.75, 0.00000},
+        {20.00, 0.00000},
+        {20.25, 0.00000},
+        {20.50, 0.00000},
+        {20.75, 0.00000},
+        {21.00, 0.00000},
+        {21.25, 0.00000},
+        {21.50, 0.00000},
+        {21.75, 0.00000},
+        {22.00, 0.00000},
+        {22.25, 0.00000},
+        {22.50, 0.00000},
+        {22.75, 0.00000},
+        {23.00, 0.00000},
+        {23.25, 0.00000},
+        {23.50, 0.00000},
+        {23.75, 0.00000},
+        {24.00, 0.00000},
+        {24.25, 0.00000},
+        {24.50, 0.00000},
+        {24.75, 0.00000},
+        {25.00, 0.00000},
+        {25.25, 0.00000},
+        {25.50, 0.00000},
+        {25.75, 0.00000},
+        {26.00, 0.00000},
+        {26.25, 0.00000},
+        {26.50, 0.00000},
+        {26.75, 0.00000},
+        {27.00, 0.00000},
+        {27.25, 0.00000},
+        {27.50, 0.00000},
+        {27.75, 0.00000},
+        {28.00, 0.00000},
+        {28.25, 0.00000},
+        {28.50, 0.00000},
+        {28.75, 0.00000},
+        {29.00, 0.00000},
+        {29.25, 0.00000},
+        {29.50, 0.00000},
+        {29.75, 0.00000},
+        {30.00, 0.00000},
     }},
 /* MCS 0 - 32 bytes */
     {std::make_pair (0, 32), {
-        {-4.0, 1.0},
-        {-3.5, 1.0},
-        {-3.0, 0.99751},
-        {-2.5, 0.96869},
-        {-2.0, 0.87939},
-        {-1.5, 0.603825},
-        {-1.0, 0.34749},
-        {-0.5, 0.12408},
-        {0.0, 0.03774},
-        {0.5, 0.009915},
-        {1.0, 0.00220},
-        {1.5, 0.00036},
-        {2.0, 0.00007},
-        {2.5, 0.0},
-        {3.0, 0.0},
-        {3.5, 0.0},
-        {4.0, 0.0},
-        {4.5, 0.0},
-        {5.0, 0.0},
-        {5.5, 0.0},
-        {6.0, 0.0},
-        {6.5, 0.0},
-        {7.0, 0.0},
-        {7.5, 0.0},
-        {8.0, 0.0},
-        {8.5, 0.0},
-        {9.0, 0.0},
-        {9.5, 0.0},
-        {10.0, 0.0},
-        {10.5, 0.0},
-        {11.0, 0.0},
-        {11.5, 0.0},
-        {12.0, 0.0},
-        {12.5, 0.0},
-        {13.0, 0.0},
-        {13.5, 0.0},
-        {14.0, 0.0},
-        {14.5, 0.0},
-        {15.0, 0.0},
-        {15.5, 0.0},
-        {16.0, 0.0},
-        {16.5, 0.0},
-        {17.0, 0.0},
-        {17.5, 0.0},
-        {18.0, 0.0},
-        {18.5, 0.0},
-        {19.0, 0.0},
-        {19.5, 0.0},
-        {20.0, 0.0},
-        {20.5, 0.0},
-        {21.0, 0.0},
-        {21.5, 0.0},
-        {22.0, 0.0},
-        {22.5, 0.0},
-        {23.0, 0.0},
-        {23.5, 0.0},
-        {24.0, 0.0},
-        {24.5, 0.0},
-        {25.0, 0.0},
-        {25.5, 0.0},
-        {26.0, 0.0},
-        {26.5, 0.0},
-        {27.0, 0.0},
-        {27.5, 0.0},
-        {28.0, 0.0},
-        {28.5, 0.0},
-        {29.0, 0.0},
-        {29.5, 0.0},
-        {30.0, 0.0},
+        {-4.00, 1.00000},
+        {-3.75, 1.00000},
+        {-3.50, 1.00000},
+        {-3.25, 0.99750},
+        {-3.00, 0.99500},
+        {-2.75, 0.96790},
+        {-2.50, 0.94080},
+        {-2.25, 0.88335},
+        {-2.00, 0.82590},
+        {-1.75, 0.70770},
+        {-1.50, 0.58950},
+        {-1.25, 0.44890},
+        {-1.00, 0.30830},
+        {-0.75, 0.21685},
+        {-0.50, 0.12540},
+        {-0.25, 0.07990},
+        {0.00, 0.03440},
+        {0.25, 0.02145},
+        {0.50, 0.00850},
+        {0.75, 0.00500},
+        {1.00, 0.00150},
+        {1.25, 0.00087},
+        {1.50, 0.00024},
+        {1.75, 0.00017},
+        {2.00, 0.00009},
+        {2.25, 0.00005},
+        {2.50, 0.00000},
+        {2.75, 0.00000},
+        {3.00, 0.00000},
+        {3.25, 0.00000},
+        {3.50, 0.00000},
+        {3.75, 0.00000},
+        {4.00, 0.00000},
+        {4.25, 0.00000},
+        {4.50, 0.00000},
+        {4.75, 0.00000},
+        {5.00, 0.00000},
+        {5.25, 0.00000},
+        {5.50, 0.00000},
+        {5.75, 0.00000},
+        {6.00, 0.00000},
+        {6.25, 0.00000},
+        {6.50, 0.00000},
+        {6.75, 0.00000},
+        {7.00, 0.00000},
+        {7.25, 0.00000},
+        {7.50, 0.00000},
+        {7.75, 0.00000},
+        {8.00, 0.00000},
+        {8.25, 0.00000},
+        {8.50, 0.00000},
+        {8.75, 0.00000},
+        {9.00, 0.00000},
+        {9.25, 0.00000},
+        {9.50, 0.00000},
+        {9.75, 0.00000},
+        {10.00, 0.00000},
+        {10.25, 0.00000},
+        {10.50, 0.00000},
+        {10.75, 0.00000},
+        {11.00, 0.00000},
+        {11.25, 0.00000},
+        {11.50, 0.00000},
+        {11.75, 0.00000},
+        {12.00, 0.00000},
+        {12.25, 0.00000},
+        {12.50, 0.00000},
+        {12.75, 0.00000},
+        {13.00, 0.00000},
+        {13.25, 0.00000},
+        {13.50, 0.00000},
+        {13.75, 0.00000},
+        {14.00, 0.00000},
+        {14.25, 0.00000},
+        {14.50, 0.00000},
+        {14.75, 0.00000},
+        {15.00, 0.00000},
+        {15.25, 0.00000},
+        {15.50, 0.00000},
+        {15.75, 0.00000},
+        {16.00, 0.00000},
+        {16.25, 0.00000},
+        {16.50, 0.00000},
+        {16.75, 0.00000},
+        {17.00, 0.00000},
+        {17.25, 0.00000},
+        {17.50, 0.00000},
+        {17.75, 0.00000},
+        {18.00, 0.00000},
+        {18.25, 0.00000},
+        {18.50, 0.00000},
+        {18.75, 0.00000},
+        {19.00, 0.00000},
+        {19.25, 0.00000},
+        {19.50, 0.00000},
+        {19.75, 0.00000},
+        {20.00, 0.00000},
+        {20.25, 0.00000},
+        {20.50, 0.00000},
+        {20.75, 0.00000},
+        {21.00, 0.00000},
+        {21.25, 0.00000},
+        {21.50, 0.00000},
+        {21.75, 0.00000},
+        {22.00, 0.00000},
+        {22.25, 0.00000},
+        {22.50, 0.00000},
+        {22.75, 0.00000},
+        {23.00, 0.00000},
+        {23.25, 0.00000},
+        {23.50, 0.00000},
+        {23.75, 0.00000},
+        {24.00, 0.00000},
+        {24.25, 0.00000},
+        {24.50, 0.00000},
+        {24.75, 0.00000},
+        {25.00, 0.00000},
+        {25.25, 0.00000},
+        {25.50, 0.00000},
+        {25.75, 0.00000},
+        {26.00, 0.00000},
+        {26.25, 0.00000},
+        {26.50, 0.00000},
+        {26.75, 0.00000},
+        {27.00, 0.00000},
+        {27.25, 0.00000},
+        {27.50, 0.00000},
+        {27.75, 0.00000},
+        {28.00, 0.00000},
+        {28.25, 0.00000},
+        {28.50, 0.00000},
+        {28.75, 0.00000},
+        {29.00, 0.00000},
+        {29.25, 0.00000},
+        {29.50, 0.00000},
+        {29.75, 0.00000},
+        {30.00, 0.00000},
     }},
 /* MCS 0 - 1000 bytes */
     {std::make_pair (0, 1000), {
-        {-4.0, 1.0},
-        {-3.5, 1.0},
-        {-3.0, 1.0},
-        {-2.5, 1.0},
-        {-2.0, 1.0},
-        {-1.5, 1.0},
-        {-1.0, 1.0},
-        {-0.5, 0.958024},
-        {0.0, 0.642853},
-        {0.5, 0.228528},
-        {1.0, 0.046052},
-        {1.5, 0.007988},
-        {2.0, 0.001063},
-        {2.5, 0.000171},
-        {3.0, 0.0},
-        {3.5, 0.0},
-        {4.0, 0.0},
-        {4.5, 0.0},
-        {5.0, 0.0},
-        {5.5, 0.0},
-        {6.0, 0.0},
-        {6.5, 0.0},
-        {7.0, 0.0},
-        {7.5, 0.0},
-        {8.0, 0.0},
-        {8.5, 0.0},
-        {9.0, 0.0},
-        {9.5, 0.0},
-        {10.0, 0.0},
-        {10.5, 0.0},
-        {11.0, 0.0},
-        {11.5, 0.0},
-        {12.0, 0.0},
-        {12.5, 0.0},
-        {13.0, 0.0},
-        {13.5, 0.0},
-        {14.0, 0.0},
-        {14.5, 0.0},
-        {15.0, 0.0},
-        {15.5, 0.0},
-        {16.0, 0.0},
-        {16.5, 0.0},
-        {17.0, 0.0},
-        {17.5, 0.0},
-        {18.0, 0.0},
-        {18.5, 0.0},
-        {19.0, 0.0},
-        {19.5, 0.0},
-        {20.0, 0.0},
-        {20.5, 0.0},
-        {21.0, 0.0},
-        {21.5, 0.0},
-        {22.0, 0.0},
-        {22.5, 0.0},
-        {23.0, 0.0},
-        {23.5, 0.0},
-        {24.0, 0.0},
-        {24.5, 0.0},
-        {25.0, 0.0},
-        {25.5, 0.0},
-        {26.0, 0.0},
-        {26.5, 0.0},
-        {27.0, 0.0},
-        {27.5, 0.0},
-        {28.0, 0.0},
-        {28.5, 0.0},
-        {29.0, 0.0},
-        {29.5, 0.0},
-        {30.0, 0.0},
+        {-4.00, 1.00000},
+        {-3.75, 1.00000},
+        {-3.50, 1.00000},
+        {-3.25, 1.00000},
+        {-3.00, 1.00000},
+        {-2.75, 1.00000},
+        {-2.50, 1.00000},
+        {-2.25, 1.00000},
+        {-2.00, 1.00000},
+        {-1.75, 1.00000},
+        {-1.50, 1.00000},
+        {-1.25, 1.00000},
+        {-1.00, 1.00000},
+        {-0.75, 0.98140},
+        {-0.50, 0.97007},
+        {-0.25, 0.80280},
+        {0.00, 0.68977},
+        {0.25, 0.42581},
+        {0.50, 0.20997},
+        {0.75, 0.12620},
+        {1.00, 0.04596},
+        {1.25, 0.02674},
+        {1.50, 0.00770},
+        {1.75, 0.00436},
+        {2.00, 0.00103},
+        {2.25, 0.00057},
+        {2.50, 0.00010},
+        {2.75, 0.00005},
+        {3.00, 0.00001},
+        {3.25, 0.00000},
+        {3.50, 0.00000},
+        {3.75, 0.00000},
+        {4.00, 0.00000},
+        {4.25, 0.00000},
+        {4.50, 0.00000},
+        {4.75, 0.00000},
+        {5.00, 0.00000},
+        {5.25, 0.00000},
+        {5.50, 0.00000},
+        {5.75, 0.00000},
+        {6.00, 0.00000},
+        {6.25, 0.00000},
+        {6.50, 0.00000},
+        {6.75, 0.00000},
+        {7.00, 0.00000},
+        {7.25, 0.00000},
+        {7.50, 0.00000},
+        {7.75, 0.00000},
+        {8.00, 0.00000},
+        {8.25, 0.00000},
+        {8.50, 0.00000},
+        {8.75, 0.00000},
+        {9.00, 0.00000},
+        {9.25, 0.00000},
+        {9.50, 0.00000},
+        {9.75, 0.00000},
+        {10.00, 0.00000},
+        {10.25, 0.00000},
+        {10.50, 0.00000},
+        {10.75, 0.00000},
+        {11.00, 0.00000},
+        {11.25, 0.00000},
+        {11.50, 0.00000},
+        {11.75, 0.00000},
+        {12.00, 0.00000},
+        {12.25, 0.00000},
+        {12.50, 0.00000},
+        {12.75, 0.00000},
+        {13.00, 0.00000},
+        {13.25, 0.00000},
+        {13.50, 0.00000},
+        {13.75, 0.00000},
+        {14.00, 0.00000},
+        {14.25, 0.00000},
+        {14.50, 0.00000},
+        {14.75, 0.00000},
+        {15.00, 0.00000},
+        {15.25, 0.00000},
+        {15.50, 0.00000},
+        {15.75, 0.00000},
+        {16.00, 0.00000},
+        {16.25, 0.00000},
+        {16.50, 0.00000},
+        {16.75, 0.00000},
+        {17.00, 0.00000},
+        {17.25, 0.00000},
+        {17.50, 0.00000},
+        {17.75, 0.00000},
+        {18.00, 0.00000},
+        {18.25, 0.00000},
+        {18.50, 0.00000},
+        {18.75, 0.00000},
+        {19.00, 0.00000},
+        {19.25, 0.00000},
+        {19.50, 0.00000},
+        {19.75, 0.00000},
+        {20.00, 0.00000},
+        {20.25, 0.00000},
+        {20.50, 0.00000},
+        {20.75, 0.00000},
+        {21.00, 0.00000},
+        {21.25, 0.00000},
+        {21.50, 0.00000},
+        {21.75, 0.00000},
+        {22.00, 0.00000},
+        {22.25, 0.00000},
+        {22.50, 0.00000},
+        {22.75, 0.00000},
+        {23.00, 0.00000},
+        {23.25, 0.00000},
+        {23.50, 0.00000},
+        {23.75, 0.00000},
+        {24.00, 0.00000},
+        {24.25, 0.00000},
+        {24.50, 0.00000},
+        {24.75, 0.00000},
+        {25.00, 0.00000},
+        {25.25, 0.00000},
+        {25.50, 0.00000},
+        {25.75, 0.00000},
+        {26.00, 0.00000},
+        {26.25, 0.00000},
+        {26.50, 0.00000},
+        {26.75, 0.00000},
+        {27.00, 0.00000},
+        {27.25, 0.00000},
+        {27.50, 0.00000},
+        {27.75, 0.00000},
+        {28.00, 0.00000},
+        {28.25, 0.00000},
+        {28.50, 0.00000},
+        {28.75, 0.00000},
+        {29.00, 0.00000},
+        {29.25, 0.00000},
+        {29.50, 0.00000},
+        {29.75, 0.00000},
+        {30.00, 0.00000},
     }},
 /* MCS 0 - 1 byte */
     {std::make_pair (0, 1), {
-        {-4.0, 1.0},
-        {-3.5, 1.0},
-        {-3.0, 0.170854},
-        {-2.5, 0.102592},
-        {-2.0, 0.063963},
-        {-1.5, 0.028520},
-        {-1.0, 0.013253},
-        {-0.5, 0.004131},
-        {0.0, 0.001201},
-        {0.5, 0.000311},
-        {1.0, 0.000069},
-        {1.5, 0.000011},
-        {2.0, 0.000002},
-        {2.5, 0.0},
-        {3.0, 0.0},
-        {3.5, 0.0},
-        {4.0, 0.0},
-        {4.5, 0.0},
-        {5.0, 0.0},
-        {5.5, 0.0},
-        {6.0, 0.0},
-        {6.5, 0.0},
-        {7.0, 0.0},
-        {7.5, 0.0},
-        {8.0, 0.0},
-        {8.5, 0.0},
-        {9.0, 0.0},
-        {9.5, 0.0},
-        {10.0, 0.0},
-        {10.5, 0.0},
-        {11.0, 0.0},
-        {11.5, 0.0},
-        {12.0, 0.0},
-        {12.5, 0.0},
-        {13.0, 0.0},
-        {13.5, 0.0},
-        {14.0, 0.0},
-        {14.5, 0.0},
-        {15.0, 0.0},
-        {15.5, 0.0},
-        {16.0, 0.0},
-        {16.5, 0.0},
-        {17.0, 0.0},
-        {17.5, 0.0},
-        {18.0, 0.0},
-        {18.5, 0.0},
-        {19.0, 0.0},
-        {19.5, 0.0},
-        {20.0, 0.0},
-        {20.5, 0.0},
-        {21.0, 0.0},
-        {21.5, 0.0},
-        {22.0, 0.0},
-        {22.5, 0.0},
-        {23.0, 0.0},
-        {23.5, 0.0},
-        {24.0, 0.0},
-        {24.5, 0.0},
-        {25.0, 0.0},
-        {25.5, 0.0},
-        {26.0, 0.0},
-        {26.5, 0.0},
-        {27.0, 0.0},
-        {27.5, 0.0},
-        {28.0, 0.0},
-        {28.5, 0.0},
-        {29.0, 0.0},
-        {29.5, 0.0},
-        {30.0, 0.0},
+        {-4.00, 1.00000},
+        {-3.75, 1.00000},
+        {-3.50, 1.00000},
+        {-3.25, 0.17075},
+        {-3.00, 0.15260},
+        {-2.75, 0.10190},
+        {-2.50, 0.08455},
+        {-2.25, 0.06494},
+        {-2.00, 0.05316},
+        {-1.75, 0.03771},
+        {-1.50, 0.02744},
+        {-1.25, 0.01845},
+        {-1.00, 0.01145},
+        {-0.75, 0.00761},
+        {-0.50, 0.00418},
+        {-0.25, 0.00260},
+        {0.00, 0.00110},
+        {0.25, 0.00068},
+        {0.50, 0.00027},
+        {0.75, 0.00016},
+        {1.00, 0.00005},
+        {1.25, 0.00003},
+        {1.50, 0.00000},
+        {1.75, 0.00000},
+        {2.00, 0.00000},
+        {2.25, 0.00000},
+        {2.50, 0.00000},
+        {2.75, 0.00000},
+        {3.00, 0.00000},
+        {3.25, 0.00000},
+        {3.50, 0.00000},
+        {3.75, 0.00000},
+        {4.00, 0.00000},
+        {4.25, 0.00000},
+        {4.50, 0.00000},
+        {4.75, 0.00000},
+        {5.00, 0.00000},
+        {5.25, 0.00000},
+        {5.50, 0.00000},
+        {5.75, 0.00000},
+        {6.00, 0.00000},
+        {6.25, 0.00000},
+        {6.50, 0.00000},
+        {6.75, 0.00000},
+        {7.00, 0.00000},
+        {7.25, 0.00000},
+        {7.50, 0.00000},
+        {7.75, 0.00000},
+        {8.00, 0.00000},
+        {8.25, 0.00000},
+        {8.50, 0.00000},
+        {8.75, 0.00000},
+        {9.00, 0.00000},
+        {9.25, 0.00000},
+        {9.50, 0.00000},
+        {9.75, 0.00000},
+        {10.00, 0.00000},
+        {10.25, 0.00000},
+        {10.50, 0.00000},
+        {10.75, 0.00000},
+        {11.00, 0.00000},
+        {11.25, 0.00000},
+        {11.50, 0.00000},
+        {11.75, 0.00000},
+        {12.00, 0.00000},
+        {12.25, 0.00000},
+        {12.50, 0.00000},
+        {12.75, 0.00000},
+        {13.00, 0.00000},
+        {13.25, 0.00000},
+        {13.50, 0.00000},
+        {13.75, 0.00000},
+        {14.00, 0.00000},
+        {14.25, 0.00000},
+        {14.50, 0.00000},
+        {14.75, 0.00000},
+        {15.00, 0.00000},
+        {15.25, 0.00000},
+        {15.50, 0.00000},
+        {15.75, 0.00000},
+        {16.00, 0.00000},
+        {16.25, 0.00000},
+        {16.50, 0.00000},
+        {16.75, 0.00000},
+        {17.00, 0.00000},
+        {17.25, 0.00000},
+        {17.50, 0.00000},
+        {17.75, 0.00000},
+        {18.00, 0.00000},
+        {18.25, 0.00000},
+        {18.50, 0.00000},
+        {18.75, 0.00000},
+        {19.00, 0.00000},
+        {19.25, 0.00000},
+        {19.50, 0.00000},
+        {19.75, 0.00000},
+        {20.00, 0.00000},
+        {20.25, 0.00000},
+        {20.50, 0.00000},
+        {20.75, 0.00000},
+        {21.00, 0.00000},
+        {21.25, 0.00000},
+        {21.50, 0.00000},
+        {21.75, 0.00000},
+        {22.00, 0.00000},
+        {22.25, 0.00000},
+        {22.50, 0.00000},
+        {22.75, 0.00000},
+        {23.00, 0.00000},
+        {23.25, 0.00000},
+        {23.50, 0.00000},
+        {23.75, 0.00000},
+        {24.00, 0.00000},
+        {24.25, 0.00000},
+        {24.50, 0.00000},
+        {24.75, 0.00000},
+        {25.00, 0.00000},
+        {25.25, 0.00000},
+        {25.50, 0.00000},
+        {25.75, 0.00000},
+        {26.00, 0.00000},
+        {26.25, 0.00000},
+        {26.50, 0.00000},
+        {26.75, 0.00000},
+        {27.00, 0.00000},
+        {27.25, 0.00000},
+        {27.50, 0.00000},
+        {27.75, 0.00000},
+        {28.00, 0.00000},
+        {28.25, 0.00000},
+        {28.50, 0.00000},
+        {28.75, 0.00000},
+        {29.00, 0.00000},
+        {29.25, 0.00000},
+        {29.50, 0.00000},
+        {29.75, 0.00000},
+        {30.00, 0.00000},
     }},
 /* MCS 0 - 2000 bytes */
     {std::make_pair (0, 2000), {
-        {-4.0, 1.0},
-        {-3.5, 1.0},
-        {-3.0, 1.0},
-        {-2.5, 1.0},
-        {-2.0, 1.0},
-        {-1.5, 1.0},
-        {-1.0, 1.0},
-        {-0.5, 0.998238},
-        {0.0, 0.872446},
-        {0.5, 0.404831},
-        {1.0, 0.089984},
-        {1.5, 0.015912},
-        {2.0, 0.002126},
-        {2.5, 0.000343},
-        {3.0, 0.0},
-        {3.5, 0.0},
-        {4.0, 0.0},
-        {4.5, 0.0},
-        {5.0, 0.0},
-        {5.5, 0.0},
-        {6.0, 0.0},
-        {6.5, 0.0},
-        {7.0, 0.0},
-        {7.5, 0.0},
-        {8.0, 0.0},
-        {8.5, 0.0},
-        {9.0, 0.0},
-        {9.5, 0.0},
-        {10.0, 0.0},
-        {10.5, 0.0},
-        {11.0, 0.0},
-        {11.5, 0.0},
-        {12.0, 0.0},
-        {12.5, 0.0},
-        {13.0, 0.0},
-        {13.5, 0.0},
-        {14.0, 0.0},
-        {14.5, 0.0},
-        {15.0, 0.0},
-        {15.5, 0.0},
-        {16.0, 0.0},
-        {16.5, 0.0},
-        {17.0, 0.0},
-        {17.5, 0.0},
-        {18.0, 0.0},
-        {18.5, 0.0},
-        {19.0, 0.0},
-        {19.5, 0.0},
-        {20.0, 0.0},
-        {20.5, 0.0},
-        {21.0, 0.0},
-        {21.5, 0.0},
-        {22.0, 0.0},
-        {22.5, 0.0},
-        {23.0, 0.0},
-        {23.5, 0.0},
-        {24.0, 0.0},
-        {24.5, 0.0},
-        {25.0, 0.0},
-        {25.5, 0.0},
-        {26.0, 0.0},
-        {26.5, 0.0},
-        {27.0, 0.0},
-        {27.5, 0.0},
-        {28.0, 0.0},
-        {28.5, 0.0},
-        {29.0, 0.0},
-        {29.5, 0.0},
-        {30.0, 0.0},
+        {-4.00, 1.00000},
+        {-3.75, 1.00000},
+        {-3.50, 1.00000},
+        {-3.25, 1.00000},
+        {-3.00, 1.00000},
+        {-2.75, 1.00000},
+        {-2.50, 1.00000},
+        {-2.25, 1.00000},
+        {-2.00, 1.00000},
+        {-1.75, 1.00000},
+        {-1.50, 1.00000},
+        {-1.25, 1.00000},
+        {-1.00, 1.00000},
+        {-0.75, 0.99965},
+        {-0.50, 0.99910},
+        {-0.25, 0.96111},
+        {0.00, 0.90376},
+        {0.25, 0.67031},
+        {0.50, 0.37584},
+        {0.75, 0.23647},
+        {1.00, 0.08981},
+        {1.25, 0.05277},
+        {1.50, 0.01533},
+        {1.75, 0.00870},
+        {2.00, 0.00206},
+        {2.25, 0.00113},
+        {2.50, 0.00021},
+        {2.75, 0.00011},
+        {3.00, 0.00001},
+        {3.25, 0.00000},
+        {3.50, 0.00000},
+        {3.75, 0.00000},
+        {4.00, 0.00000},
+        {4.25, 0.00000},
+        {4.50, 0.00000},
+        {4.75, 0.00000},
+        {5.00, 0.00000},
+        {5.25, 0.00000},
+        {5.50, 0.00000},
+        {5.75, 0.00000},
+        {6.00, 0.00000},
+        {6.25, 0.00000},
+        {6.50, 0.00000},
+        {6.75, 0.00000},
+        {7.00, 0.00000},
+        {7.25, 0.00000},
+        {7.50, 0.00000},
+        {7.75, 0.00000},
+        {8.00, 0.00000},
+        {8.25, 0.00000},
+        {8.50, 0.00000},
+        {8.75, 0.00000},
+        {9.00, 0.00000},
+        {9.25, 0.00000},
+        {9.50, 0.00000},
+        {9.75, 0.00000},
+        {10.00, 0.00000},
+        {10.25, 0.00000},
+        {10.50, 0.00000},
+        {10.75, 0.00000},
+        {11.00, 0.00000},
+        {11.25, 0.00000},
+        {11.50, 0.00000},
+        {11.75, 0.00000},
+        {12.00, 0.00000},
+        {12.25, 0.00000},
+        {12.50, 0.00000},
+        {12.75, 0.00000},
+        {13.00, 0.00000},
+        {13.25, 0.00000},
+        {13.50, 0.00000},
+        {13.75, 0.00000},
+        {14.00, 0.00000},
+        {14.25, 0.00000},
+        {14.50, 0.00000},
+        {14.75, 0.00000},
+        {15.00, 0.00000},
+        {15.25, 0.00000},
+        {15.50, 0.00000},
+        {15.75, 0.00000},
+        {16.00, 0.00000},
+        {16.25, 0.00000},
+        {16.50, 0.00000},
+        {16.75, 0.00000},
+        {17.00, 0.00000},
+        {17.25, 0.00000},
+        {17.50, 0.00000},
+        {17.75, 0.00000},
+        {18.00, 0.00000},
+        {18.25, 0.00000},
+        {18.50, 0.00000},
+        {18.75, 0.00000},
+        {19.00, 0.00000},
+        {19.25, 0.00000},
+        {19.50, 0.00000},
+        {19.75, 0.00000},
+        {20.00, 0.00000},
+        {20.25, 0.00000},
+        {20.50, 0.00000},
+        {20.75, 0.00000},
+        {21.00, 0.00000},
+        {21.25, 0.00000},
+        {21.50, 0.00000},
+        {21.75, 0.00000},
+        {22.00, 0.00000},
+        {22.25, 0.00000},
+        {22.50, 0.00000},
+        {22.75, 0.00000},
+        {23.00, 0.00000},
+        {23.25, 0.00000},
+        {23.50, 0.00000},
+        {23.75, 0.00000},
+        {24.00, 0.00000},
+        {24.25, 0.00000},
+        {24.50, 0.00000},
+        {24.75, 0.00000},
+        {25.00, 0.00000},
+        {25.25, 0.00000},
+        {25.50, 0.00000},
+        {25.75, 0.00000},
+        {26.00, 0.00000},
+        {26.25, 0.00000},
+        {26.50, 0.00000},
+        {26.75, 0.00000},
+        {27.00, 0.00000},
+        {27.25, 0.00000},
+        {27.50, 0.00000},
+        {27.75, 0.00000},
+        {28.00, 0.00000},
+        {28.25, 0.00000},
+        {28.50, 0.00000},
+        {28.75, 0.00000},
+        {29.00, 0.00000},
+        {29.25, 0.00000},
+        {29.50, 0.00000},
+        {29.75, 0.00000},
+        {30.00, 0.00000},
     }},
 /* MCS 7 - 1500 bytes */
     {std::make_pair (7, 1500), {
-        {-4.0, 1.0},
-        {-3.5, 1.0},
-        {-3.0, 1.0},
-        {-2.5, 1.0},
-        {-2.0, 1.0},
-        {-1.5, 1.0},
-        {-1.0, 1.0},
-        {-0.5, 1.0},
-        {0.0, 1.0},
-        {0.5, 1.0},
-        {1.0, 1.0},
-        {1.5, 1.0},
-        {2.0, 1.0},
-        {2.5, 1.0},
-        {3.0, 1.0},
-        {3.5, 1.0},
-        {4.0, 1.0},
-        {4.5, 1.0},
-        {5.0, 1.0},
-        {5.5, 1.0},
-        {6.0, 1.0},
-        {6.5, 1.0},
-        {7.0, 1.0},
-        {7.5, 1.0},
-        {8.0, 1.0},
-        {8.5, 1.0},
-        {9.0, 1.0},
-        {9.5, 1.0},
-        {10.0, 1.0},
-        {10.5, 1.0},
-        {11.0, 1.0},
-        {11.5, 1.0},
-        {12.0, 1.0},
-        {12.5, 1.0},
-        {13.0, 1.0},
-        {13.5, 1.0},
-        {14.0, 1.0},
-        {14.5, 1.0},
-        {15.0, 1.0},
-        {15.5, 1.0},
-        {16.0, 1.0},
-        {16.5, 1.0},
-        {17.0, 1.0},
-        {17.5, 1.0},
-        {18.0, 0.984736},
-        {18.5, 0.730776},
-        {19.0, 0.336353},
-        {19.5, 0.121723},
-        {20.0, 0.035373},
-        {20.5, 0.010292},
-        {21.0, 0.002932},
-        {21.5, 0.000669},
-        {22.0, 0.000103},
-        {22.5, 0.000026},
-        {23.0, 0.0},
-        {23.5, 0.0},
-        {24.0, 0.0},
-        {24.5, 0.0},
-        {25.0, 0.0},
-        {25.5, 0.0},
-        {26.0, 0.0},
-        {26.5, 0.0},
-        {27.0, 0.0},
-        {27.5, 0.0},
-        {28.0, 0.0},
-        {28.5, 0.0},
-        {29.0, 0.0},
-        {29.5, 0.0},
-        {30.0, 0.0},
+        {-4.00, 1.00000},
+        {-3.75, 1.00000},
+        {-3.50, 1.00000},
+        {-3.25, 1.00000},
+        {-3.00, 1.00000},
+        {-2.75, 1.00000},
+        {-2.50, 1.00000},
+        {-2.25, 1.00000},
+        {-2.00, 1.00000},
+        {-1.75, 1.00000},
+        {-1.50, 1.00000},
+        {-1.25, 1.00000},
+        {-1.00, 1.00000},
+        {-0.75, 1.00000},
+        {-0.50, 1.00000},
+        {-0.25, 1.00000},
+        {0.00, 1.00000},
+        {0.25, 1.00000},
+        {0.50, 1.00000},
+        {0.75, 1.00000},
+        {1.00, 1.00000},
+        {1.25, 1.00000},
+        {1.50, 1.00000},
+        {1.75, 1.00000},
+        {2.00, 1.00000},
+        {2.25, 1.00000},
+        {2.50, 1.00000},
+        {2.75, 1.00000},
+        {3.00, 1.00000},
+        {3.25, 1.00000},
+        {3.50, 1.00000},
+        {3.75, 1.00000},
+        {4.00, 1.00000},
+        {4.25, 1.00000},
+        {4.50, 1.00000},
+        {4.75, 1.00000},
+        {5.00, 1.00000},
+        {5.25, 1.00000},
+        {5.50, 1.00000},
+        {5.75, 1.00000},
+        {6.00, 1.00000},
+        {6.25, 1.00000},
+        {6.50, 1.00000},
+        {6.75, 1.00000},
+        {7.00, 1.00000},
+        {7.25, 1.00000},
+        {7.50, 1.00000},
+        {7.75, 1.00000},
+        {8.00, 1.00000},
+        {8.25, 1.00000},
+        {8.50, 1.00000},
+        {8.75, 1.00000},
+        {9.00, 1.00000},
+        {9.25, 1.00000},
+        {9.50, 1.00000},
+        {9.75, 1.00000},
+        {10.00, 1.00000},
+        {10.25, 1.00000},
+        {10.50, 1.00000},
+        {10.75, 1.00000},
+        {11.00, 1.00000},
+        {11.25, 1.00000},
+        {11.50, 1.00000},
+        {11.75, 1.00000},
+        {12.00, 1.00000},
+        {12.25, 1.00000},
+        {12.50, 1.00000},
+        {12.75, 1.00000},
+        {13.00, 1.00000},
+        {13.25, 1.00000},
+        {13.50, 1.00000},
+        {13.75, 1.00000},
+        {14.00, 1.00000},
+        {14.25, 1.00000},
+        {14.50, 1.00000},
+        {14.75, 1.00000},
+        {15.00, 1.00000},
+        {15.25, 1.00000},
+        {15.50, 1.00000},
+        {15.75, 1.00000},
+        {16.00, 1.00000},
+        {16.25, 1.00000},
+        {16.50, 1.00000},
+        {16.75, 1.00000},
+        {17.00, 1.00000},
+        {17.25, 1.00000},
+        {17.50, 1.00000},
+        {17.75, 0.99057},
+        {18.00, 0.98075},
+        {18.25, 0.86664},
+        {18.50, 0.74920},
+        {18.75, 0.54857},
+        {19.00, 0.34531},
+        {19.25, 0.23624},
+        {19.50, 0.12672},
+        {19.75, 0.08164},
+        {20.00, 0.03650},
+        {20.25, 0.02340},
+        {20.50, 0.01029},
+        {20.75, 0.00653},
+        {21.00, 0.00278},
+        {21.25, 0.00165},
+        {21.50, 0.00051},
+        {21.75, 0.00030},
+        {22.00, 0.00009},
+        {22.25, 0.00005},
+        {22.50, 0.00001},
+        {22.75, 0.00000},
+        {23.00, 0.00000},
+        {23.25, 0.00000},
+        {23.50, 0.00000},
+        {23.75, 0.00000},
+        {24.00, 0.00000},
+        {24.25, 0.00000},
+        {24.50, 0.00000},
+        {24.75, 0.00000},
+        {25.00, 0.00000},
+        {25.25, 0.00000},
+        {25.50, 0.00000},
+        {25.75, 0.00000},
+        {26.00, 0.00000},
+        {26.25, 0.00000},
+        {26.50, 0.00000},
+        {26.75, 0.00000},
+        {27.00, 0.00000},
+        {27.25, 0.00000},
+        {27.50, 0.00000},
+        {27.75, 0.00000},
+        {28.00, 0.00000},
+        {28.25, 0.00000},
+        {28.50, 0.00000},
+        {28.75, 0.00000},
+        {29.00, 0.00000},
+        {29.25, 0.00000},
+        {29.50, 0.00000},
+        {29.75, 0.00000},
+        {30.00, 0.00000},
     }},
 /* MCS 8 - 1500 bytes */
     {std::make_pair (8, 1500), {
-        {-4.0, 1.0},
-        {-3.5, 1.0},
-        {-3.0, 1.0},
-        {-2.5, 1.0},
-        {-2.0, 1.0},
-        {-1.5, 1.0},
-        {-1.0, 1.0},
-        {-0.5, 1.0},
-        {0.0, 1.0},
-        {0.5, 1.0},
-        {1.0, 1.0},
-        {1.5, 1.0},
-        {2.0, 1.0},
-        {2.5, 1.0},
-        {3.0, 1.0},
-        {3.5, 1.0},
-        {4.0, 1.0},
-        {4.5, 1.0},
-        {5.0, 1.0},
-        {5.5, 1.0},
-        {6.0, 1.0},
-        {6.5, 1.0},
-        {7.0, 1.0},
-        {7.5, 1.0},
-        {8.0, 1.0},
-        {8.5, 1.0},
-        {9.0, 1.0},
-        {9.5, 1.0},
-        {10.0, 1.0},
-        {10.5, 1.0},
-        {11.0, 1.0},
-        {11.5, 1.0},
-        {12.0, 1.0},
-        {12.5, 1.0},
-        {13.0, 1.0},
-        {13.5, 1.0},
-        {14.0, 1.0},
-        {14.5, 1.0},
-        {15.0, 1.0},
-        {15.5, 1.0},
-        {16.0, 1.0},
-        {16.5, 1.0},
-        {17.0, 1.0},
-        {17.5, 1.0},
-        {18.0, 1.0},
-        {18.5, 1.0},
-        {19.0, 1.0},
-        {19.5, 1.0},
-        {20.0, 1.0},
-        {20.5, 1.0},
-        {21.0, 0.993549},
-        {21.5, 0.941462},
-        {22.0, 0.689994},
-        {22.5, 0.408435},
-        {23.0, 0.198900},
-        {23.5, 0.086112},
-        {24.0, 0.035569},
-        {24.5, 0.014951},
-        {25.0, 0.005864},
-        {25.5, 0.002459},
-        {26.0, 0.001029},
-        {26.5, 0.000592},
-        {27.0, 0.000206},
-        {27.5, 0.0},
-        {28.0, 0.0},
-        {28.5, 0.0},
-        {29.0, 0.0},
-        {29.5, 0.0},
-        {30.0, 0.0},
+        {-4.00, 1.00000},
+        {-3.75, 1.00000},
+        {-3.50, 1.00000},
+        {-3.25, 1.00000},
+        {-3.00, 1.00000},
+        {-2.75, 1.00000},
+        {-2.50, 1.00000},
+        {-2.25, 1.00000},
+        {-2.00, 1.00000},
+        {-1.75, 1.00000},
+        {-1.50, 1.00000},
+        {-1.25, 1.00000},
+        {-1.00, 1.00000},
+        {-0.75, 1.00000},
+        {-0.50, 1.00000},
+        {-0.25, 1.00000},
+        {0.00, 1.00000},
+        {0.25, 1.00000},
+        {0.50, 1.00000},
+        {0.75, 1.00000},
+        {1.00, 1.00000},
+        {1.25, 1.00000},
+        {1.50, 1.00000},
+        {1.75, 1.00000},
+        {2.00, 1.00000},
+        {2.25, 1.00000},
+        {2.50, 1.00000},
+        {2.75, 1.00000},
+        {3.00, 1.00000},
+        {3.25, 1.00000},
+        {3.50, 1.00000},
+        {3.75, 1.00000},
+        {4.00, 1.00000},
+        {4.25, 1.00000},
+        {4.50, 1.00000},
+        {4.75, 1.00000},
+        {5.00, 1.00000},
+        {5.25, 1.00000},
+        {5.50, 1.00000},
+        {5.75, 1.00000},
+        {6.00, 1.00000},
+        {6.25, 1.00000},
+        {6.50, 1.00000},
+        {6.75, 1.00000},
+        {7.00, 1.00000},
+        {7.25, 1.00000},
+        {7.50, 1.00000},
+        {7.75, 1.00000},
+        {8.00, 1.00000},
+        {8.25, 1.00000},
+        {8.50, 1.00000},
+        {8.75, 1.00000},
+        {9.00, 1.00000},
+        {9.25, 1.00000},
+        {9.50, 1.00000},
+        {9.75, 1.00000},
+        {10.00, 1.00000},
+        {10.25, 1.00000},
+        {10.50, 1.00000},
+        {10.75, 1.00000},
+        {11.00, 1.00000},
+        {11.25, 1.00000},
+        {11.50, 1.00000},
+        {11.75, 1.00000},
+        {12.00, 1.00000},
+        {12.25, 1.00000},
+        {12.50, 1.00000},
+        {12.75, 1.00000},
+        {13.00, 1.00000},
+        {13.25, 1.00000},
+        {13.50, 1.00000},
+        {13.75, 1.00000},
+        {14.00, 1.00000},
+        {14.25, 1.00000},
+        {14.50, 1.00000},
+        {14.75, 1.00000},
+        {15.00, 1.00000},
+        {15.25, 1.00000},
+        {15.50, 1.00000},
+        {15.75, 1.00000},
+        {16.00, 1.00000},
+        {16.25, 1.00000},
+        {16.50, 1.00000},
+        {16.75, 1.00000},
+        {17.00, 1.00000},
+        {17.25, 1.00000},
+        {17.50, 1.00000},
+        {17.75, 1.00000},
+        {18.00, 1.00000},
+        {18.25, 1.00000},
+        {18.50, 1.00000},
+        {18.75, 1.00000},
+        {19.00, 1.00000},
+        {19.25, 1.00000},
+        {19.50, 1.00000},
+        {19.75, 1.00000},
+        {20.00, 1.00000},
+        {20.25, 1.00000},
+        {20.50, 1.00000},
+        {20.75, 1.00000},
+        {21.00, 1.00000},
+        {21.25, 0.99918},
+        {21.50, 0.99833},
+        {21.75, 0.97191},
+        {22.00, 0.94458},
+        {22.25, 0.81436},
+        {22.50, 0.68127},
+        {22.75, 0.52168},
+        {23.00, 0.36056},
+        {23.25, 0.25114},
+        {23.50, 0.14127},
+        {23.75, 0.09509},
+        {24.00, 0.04883},
+        {24.25, 0.03234},
+        {24.50, 0.01584},
+        {24.75, 0.01060},
+        {25.00, 0.00535},
+        {25.25, 0.00345},
+        {25.50, 0.00154},
+        {25.75, 0.00096},
+        {26.00, 0.00037},
+        {26.25, 0.00022},
+        {26.50, 0.00007},
+        {26.75, 0.00004},
+        {27.00, 0.00000},
+        {27.25, 0.00000},
+        {27.50, 0.00000},
+        {27.75, 0.00000},
+        {28.00, 0.00000},
+        {28.25, 0.00000},
+        {28.50, 0.00000},
+        {28.75, 0.00000},
+        {29.00, 0.00000},
+        {29.25, 0.00000},
+        {29.50, 0.00000},
+        {29.75, 0.00000},
+        {30.00, 0.00000},
     }},
 };
 
@@ -986,7 +1462,7 @@
   virtual ~TableBasedErrorRateTestCase ();
 
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
   std::string m_testName; ///< The name of the test to run
   WifiMode m_mode;        ///< The WifiMode to test
@@ -1017,13 +1493,13 @@
   txVector.SetMode (m_mode);
 
   // Spot test some values returned from TableBasedErrorRateModel
-  for (double snr = -4.0; snr <= 30.0; snr += 0.5)
+  for (double snr = -4; snr <= 30; snr += 0.25)
     {
       double expectedValue = 0;
       if (m_mode.GetMcsValue () > ERROR_TABLE_BCC_MAX_NUM_MCS)
         {
           Ptr<YansErrorRateModel> yans = CreateObject<YansErrorRateModel> ();
-          expectedValue = 1 - yans->GetChunkSuccessRate (m_mode, txVector, std::pow (10.0, snr / 10.0), m_size * 8);
+          expectedValue = 1 - yans->GetChunkSuccessRate (m_mode, txVector, std::pow (10, snr / 10), m_size * 8);
         }
       else
         {
@@ -1037,7 +1513,7 @@
                 }
               else
                 {
-                  NS_FATAL_ERROR ("SNR value not found!");
+                  NS_FATAL_ERROR ("SNR value " << snr << " dB not found!");
                 }
             }
           else
@@ -1045,9 +1521,9 @@
               NS_FATAL_ERROR ("No expected value found for the combination MCS " << +m_mode.GetMcsValue () << " and size " << m_size << " bytes");
             }
         }
-      double per = 1 - table->GetChunkSuccessRate (m_mode, txVector, std::pow (10.0, snr / 10.0), m_size * 8);
+      double per = 1 - table->GetChunkSuccessRate (m_mode, txVector, std::pow (10, snr / 10), m_size * 8);
       NS_LOG_INFO (m_testName << ": snr=" << snr << "dB per=" << per << " expectedPER=" << expectedValue);
-      NS_TEST_ASSERT_MSG_EQ_TOL (per, expectedValue, 1e-6, "Not equal within tolerance");
+      NS_TEST_ASSERT_MSG_EQ_TOL (per, expectedValue, 1e-5, "Not equal within tolerance");
     }
 }
 
@@ -1069,19 +1545,19 @@
   AddTestCase (new WifiErrorRateModelsTestCaseDsss, TestCase::QUICK);
   AddTestCase (new WifiErrorRateModelsTestCaseNist, TestCase::QUICK);
   AddTestCase (new WifiErrorRateModelsTestCaseMimo, TestCase::QUICK);
-  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedHtMcs0-1458bytes", WifiPhy::GetHtMcs0 (), 1458), TestCase::QUICK);
-  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedHtMcs0-32bytes", WifiPhy::GetHtMcs0 (), 32), TestCase::QUICK);
-  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedHtMcs0-1000bytes", WifiPhy::GetHtMcs0 (), 1000), TestCase::QUICK);
-  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedHtMcs0-1byte", WifiPhy::GetHtMcs0 (), 1), TestCase::QUICK);
-  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedHtMcs0-2000bytes", WifiPhy::GetHtMcs0 (), 2000), TestCase::QUICK);
-  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedHtMcs7-1500bytes", WifiPhy::GetHtMcs7 (), 1500), TestCase::QUICK);
-  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedVhtMcs0-1458bytes", WifiPhy::GetVhtMcs0 (), 1458), TestCase::QUICK);
-  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedVhtMcs0-32bytes", WifiPhy::GetVhtMcs0 (), 32), TestCase::QUICK);
-  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedVhtMcs0-1000bytes", WifiPhy::GetVhtMcs0 (), 1000), TestCase::QUICK);
-  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedVhtMcs0-1byte", WifiPhy::GetVhtMcs0 (), 1), TestCase::QUICK);
-  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedVhtMcs0-2000bytes", WifiPhy::GetVhtMcs0 (), 2000), TestCase::QUICK);
-  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedVhtMcs8-1500bytes", WifiPhy::GetVhtMcs8 (), 1500), TestCase::QUICK);
-  AddTestCase (new TableBasedErrorRateTestCase ("FallbackTableBasedHeMcs11-1458bytes", WifiPhy::GetHeMcs11 (), 1458), TestCase::QUICK);
+  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedHtMcs0-1458bytes", HtPhy::GetHtMcs0 (), 1458), TestCase::QUICK);
+  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedHtMcs0-32bytes", HtPhy::GetHtMcs0 (), 32), TestCase::QUICK);
+  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedHtMcs0-1000bytes", HtPhy::GetHtMcs0 (), 1000), TestCase::QUICK);
+  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedHtMcs0-1byte", HtPhy::GetHtMcs0 (), 1), TestCase::QUICK);
+  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedHtMcs0-2000bytes", HtPhy::GetHtMcs0 (), 2000), TestCase::QUICK);
+  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedHtMcs7-1500bytes", HtPhy::GetHtMcs7 (), 1500), TestCase::QUICK);
+  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedVhtMcs0-1458bytes", VhtPhy::GetVhtMcs0 (), 1458), TestCase::QUICK);
+  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedVhtMcs0-32bytes", VhtPhy::GetVhtMcs0 (), 32), TestCase::QUICK);
+  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedVhtMcs0-1000bytes", VhtPhy::GetVhtMcs0 (), 1000), TestCase::QUICK);
+  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedVhtMcs0-1byte", VhtPhy::GetVhtMcs0 (), 1), TestCase::QUICK);
+  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedVhtMcs0-2000bytes", VhtPhy::GetVhtMcs0 (), 2000), TestCase::QUICK);
+  AddTestCase (new TableBasedErrorRateTestCase ("DefaultTableBasedVhtMcs8-1500bytes", VhtPhy::GetVhtMcs8 (), 1500), TestCase::QUICK);
+  AddTestCase (new TableBasedErrorRateTestCase ("FallbackTableBasedHeMcs11-1458bytes", HePhy::GetHeMcs11 (), 1458), TestCase::QUICK);
 }
 
 static WifiErrorRateModelsTestSuite wifiErrorRateModelsTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/wifi-mac-ofdma-test.cc ns-3.34/src/wifi/test/wifi-mac-ofdma-test.cc
--- ns-3.33/src/wifi/test/wifi-mac-ofdma-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/test/wifi-mac-ofdma-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,1185 @@
+ /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/test.h"
+#include "ns3/string.h"
+#include "ns3/qos-utils.h"
+#include "ns3/packet.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/wifi-mac-header.h"
+#include "ns3/he-frame-exchange-manager.h"
+#include "ns3/wifi-acknowledgment.h"
+#include "ns3/wifi-protection.h"
+#include "ns3/he-configuration.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/spectrum-wifi-helper.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/packet-socket-server.h"
+#include "ns3/packet-socket-client.h"
+#include "ns3/packet-socket-helper.h"
+#include "ns3/config.h"
+#include "ns3/pointer.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/multi-user-scheduler.h"
+#include "ns3/he-phy.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("WifiMacOfdmaTestSuite");
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief Dummy Multi User Scheduler used to test OFDMA ack sequences
+ *
+ * This Multi User Scheduler returns SU_TX until the simulation time reaches 1.5 seconds
+ * (when all BA agreements have been established). Afterwards, it cycles through UL_MU_TX
+ * (with a BSRP Trigger Frame), UL_MU_TX (with a Basic Trigger Frame) and DL_MU_TX.
+ * This scheduler requires that 4 stations are associated with the AP.
+ * 
+ */
+class TestMultiUserScheduler : public MultiUserScheduler
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  TestMultiUserScheduler ();
+  virtual ~TestMultiUserScheduler ();
+
+private:
+  // Implementation of pure virtual methods of MultiUserScheduler class
+  TxFormat SelectTxFormat (void) override;
+  DlMuInfo ComputeDlMuInfo (void) override;
+  UlMuInfo ComputeUlMuInfo (void) override;
+
+  /**
+   * Compute the TX vector to use for MU PPDUs.
+   */
+  void ComputeWifiTxVector (void);
+
+  TxFormat m_txFormat;              //!< the format of next transmission
+  TriggerFrameType m_ulTriggerType; //!< Trigger Frame type for UL MU
+  Ptr<WifiMacQueueItem> m_trigger;  //!< Trigger Frame to send
+  Time m_tbPpduDuration;            //!< Duration of the solicited TB PPDUs
+  WifiTxVector m_txVector;          //!< the TX vector for MU PPDUs
+  WifiTxParameters m_txParams;      //!< TX parameters
+  WifiPsduMap m_psduMap;            //!< the DL MU PPDU to transmit
+};
+
+
+NS_OBJECT_ENSURE_REGISTERED (TestMultiUserScheduler);
+
+TypeId
+TestMultiUserScheduler::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::TestMultiUserScheduler")
+    .SetParent<MultiUserScheduler> ()
+    .SetGroupName ("Wifi")
+    .AddConstructor<TestMultiUserScheduler> ()
+  ;
+  return tid;
+}
+
+TestMultiUserScheduler::TestMultiUserScheduler ()
+  : m_txFormat (SU_TX),
+    m_ulTriggerType (TriggerFrameType::BSRP_TRIGGER)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+TestMultiUserScheduler::~TestMultiUserScheduler ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+MultiUserScheduler::TxFormat
+TestMultiUserScheduler::SelectTxFormat (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  // Do not use OFDMA if a BA agreement has not been established with all the stations
+  if (Simulator::Now () < Seconds (1.5))
+    {
+      NS_LOG_DEBUG ("Return SU_TX");
+      return SU_TX;
+    }
+
+  ComputeWifiTxVector ();
+
+  if (m_txFormat == SU_TX || m_txFormat == DL_MU_TX
+      || (m_txFormat == UL_MU_TX && m_ulTriggerType == TriggerFrameType::BSRP_TRIGGER))
+    {
+      // try to send a Trigger Frame
+      TriggerFrameType ulTriggerType = (m_txFormat == SU_TX || m_txFormat == DL_MU_TX
+                                        ? TriggerFrameType::BSRP_TRIGGER
+                                        : TriggerFrameType::BASIC_TRIGGER);
+
+      CtrlTriggerHeader trigger (ulTriggerType, m_txVector);
+
+      WifiTxVector txVector = m_txVector;
+      txVector.SetGuardInterval (trigger.GetGuardInterval ());
+
+      uint32_t ampduSize = (ulTriggerType == TriggerFrameType::BSRP_TRIGGER ? m_sizeOf8QosNull : 3500);
+
+      Time duration = WifiPhy::CalculateTxDuration (ampduSize, txVector,
+                                                    m_apMac->GetWifiPhy ()->GetPhyBand (),
+                                                    m_apMac->GetStaList ().begin ()->first);
+
+      uint16_t length = HePhy::ConvertHeTbPpduDurationToLSigLength (duration,
+                                                                    m_apMac->GetWifiPhy ()->GetPhyBand ());
+      trigger.SetUlLength (length);
+      m_heFem->SetTargetRssi (trigger);
+
+      Ptr<Packet> packet = Create<Packet> ();
+      packet->AddHeader (trigger);
+
+      WifiMacHeader hdr (WIFI_MAC_CTL_TRIGGER);
+      hdr.SetAddr1 (Mac48Address::GetBroadcast ());
+      hdr.SetAddr2 (m_apMac->GetAddress ());
+      hdr.SetDsNotTo ();
+      hdr.SetDsNotFrom ();
+
+      m_trigger = Create<WifiMacQueueItem> (packet, hdr);
+
+      m_txParams.Clear ();
+      // set the TXVECTOR used to send the Trigger Frame
+      m_txParams.m_txVector = m_apMac->GetWifiRemoteStationManager ()->GetRtsTxVector (hdr.GetAddr1 ());
+
+      if (!m_heFem->TryAddMpdu (m_trigger, m_txParams, m_availableTime)
+          || (m_availableTime != Time::Min ()
+              && m_txParams.m_protection->protectionTime
+                 + m_txParams.m_txDuration     // TF tx time
+                 + m_apMac->GetWifiPhy ()->GetSifs ()
+                 + duration
+                 + m_txParams.m_acknowledgment->acknowledgmentTime
+                 > m_availableTime ))
+        {
+          NS_LOG_DEBUG ("Remaining TXOP duration is not enough for BSRP TF exchange");
+          return SU_TX;
+        }
+
+      m_txFormat = UL_MU_TX;
+      m_ulTriggerType = ulTriggerType;
+      m_tbPpduDuration = duration;
+    }
+  else if (m_txFormat == UL_MU_TX)
+    {
+      // try to send a DL MU PPDU
+      m_psduMap.clear ();
+      const std::map<uint16_t, Mac48Address>& staList = m_apMac->GetStaList ();
+      NS_ABORT_MSG_IF (staList.size () != 4, "There must be 4 associated stations");
+
+      /* Initialize TX params */
+      m_txParams.Clear ();
+      m_txParams.m_txVector = m_txVector;
+
+      for (auto& sta : staList)
+        {
+          Ptr<const WifiMacQueueItem> peeked = m_apMac->GetQosTxop (AC_BE)->PeekNextMpdu (0, sta.second);
+
+          if (peeked == 0)
+            {
+              NS_LOG_DEBUG ("No frame to send");
+              return SU_TX;
+            }
+
+          WifiMacQueueItem::QueueIteratorPair queueIt;
+          Ptr<WifiMacQueueItem> mpdu = m_apMac->GetQosTxop (AC_BE)->GetNextMpdu (peeked, m_txParams,
+                                                                                 m_availableTime,
+                                                                                 m_initialFrame, queueIt);
+          if (mpdu == 0)
+            {
+              NS_LOG_DEBUG ("Not enough time to send frames to all the stations");
+              return SU_TX;
+            }
+
+          std::vector<Ptr<WifiMacQueueItem>> mpduList;
+          mpduList = m_heFem->GetMpduAggregator ()->GetNextAmpdu (mpdu, m_txParams, m_availableTime, queueIt);
+
+          if (mpduList.size () > 1)
+            {
+              m_psduMap[sta.first] = Create<WifiPsdu> (std::move (mpduList));
+            }
+          else
+            {
+              m_psduMap[sta.first] = Create<WifiPsdu> (mpdu, true);
+            }
+        }
+
+      m_txFormat = DL_MU_TX;
+    }
+  else
+    {
+      NS_ABORT_MSG ("Cannot get here.");
+    }
+
+  NS_LOG_DEBUG ("Return " << m_txFormat);
+  return m_txFormat;
+}
+
+void
+TestMultiUserScheduler::ComputeWifiTxVector (void)
+{
+  if (m_txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU)
+    {
+      // the TX vector has been already computed
+      return;
+    }
+
+  uint16_t bw = m_apMac->GetWifiPhy ()->GetChannelWidth ();
+
+  m_txVector.SetPreambleType (WIFI_PREAMBLE_HE_MU);  
+  m_txVector.SetChannelWidth (bw);
+  m_txVector.SetGuardInterval (m_apMac->GetHeConfiguration ()->GetGuardInterval ().GetNanoSeconds ());
+  m_txVector.SetTxPowerLevel (GetWifiRemoteStationManager ()->GetDefaultTxPowerLevel ());
+
+  const std::map<uint16_t, Mac48Address>& staList = m_apMac->GetStaList ();
+  NS_ABORT_MSG_IF (staList.size () != 4, "There must be 4 associated stations");
+
+  HeRu::RuType ruType;
+  switch (bw)
+    {
+      case 20:
+        ruType = HeRu::RU_52_TONE;
+        break;
+      case 40:
+        ruType = HeRu::RU_106_TONE;
+        break;
+      case 80:
+        ruType = HeRu::RU_242_TONE;
+        break;
+      case 160:
+        ruType = HeRu::RU_484_TONE;
+        break;
+      default:
+        NS_ABORT_MSG ("Unsupported channel width");
+    }
+
+  bool primary80 = true;
+  std::size_t ruIndex = 1;
+
+  for (auto& sta : staList)
+    {
+      if (bw == 160 && ruIndex == 3)
+        {
+          ruIndex = 1;
+          primary80 = false;
+        }
+      m_txVector.SetHeMuUserInfo (sta.first,
+                                  {{ruType, ruIndex++, primary80}, WifiMode ("HeMcs11"), 1});
+    }
+}
+
+MultiUserScheduler::DlMuInfo
+TestMultiUserScheduler::ComputeDlMuInfo (void)
+{
+  NS_LOG_FUNCTION (this);
+  return DlMuInfo {m_psduMap, std::move (m_txParams)};
+}
+
+MultiUserScheduler::UlMuInfo
+TestMultiUserScheduler::ComputeUlMuInfo (void)
+{
+  NS_LOG_FUNCTION (this);
+  return UlMuInfo {m_trigger, m_tbPpduDuration, std::move (m_txParams)};
+}
+
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief Test OFDMA acknowledgment sequences
+ *
+ * Run this test with:
+ *
+ * NS_LOG="WifiMacOfdmaTestSuite=info|prefix_time|prefix_node" ./waf --run "test-runner --suite=wifi-mac-ofdma"
+ *
+ * to print the list of transmitted frames only, along with the TX time and the
+ * node prefix. Replace 'info' with 'debug' if you want to print the debug messages
+ * from the test multi-user scheduler only. Replace 'info' with 'level_debug' if
+ * you want to print both the transmitted frames and the debug messages.
+ */
+class OfdmaAckSequenceTest : public TestCase
+{
+public:
+  /**
+   * Constructor
+   * \param width the PHY channel bandwidth in MHz
+   * \param dlType the DL MU ack sequence type
+   * \param maxAmpduSize the maximum A-MPDU size in bytes
+   * \param txopLimit the TXOP limit in microseconds
+   * \param nPktsPerSta number of packets to send to/receive from each station
+   */
+  OfdmaAckSequenceTest (uint16_t width, WifiAcknowledgment::Method dlType, uint32_t maxAmpduSize,
+                        uint16_t txopLimit, uint16_t nPktsPerSta);
+  virtual ~OfdmaAckSequenceTest ();
+
+  /**
+   * Function to trace packets received by the server application
+   * \param context the context
+   * \param p the packet
+   * \param addr the address
+   */
+  void L7Receive (std::string context, Ptr<const Packet> p, const Address &addr);
+  /**
+   * Callback invoked when FrameExchangeManager passes PSDUs to the PHY
+   * \param context the context
+   * \param psduMap the PSDU map
+   * \param txVector the TX vector
+   * \param txPowerW the tx power in Watts
+   */
+  void Transmit (std::string context, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
+  /**
+   * Check correctness of transmitted frames
+   * \param sifs the SIFS duration
+   * \param slotTime a slot duration
+   * \param aifsn the AIFSN
+   */
+  void CheckResults (Time sifs, Time slotTime, uint8_t aifsn);
+
+private:
+  void DoRun (void) override;
+
+  /// Information about transmitted frames
+  struct FrameInfo
+  {
+    Time startTx;                            ///< start TX time
+    Time endTx;                              ///< end TX time
+    WifiConstPsduMap psduMap;                ///< transmitted PSDU map
+    WifiTxVector txVector;                   ///< TXVECTOR
+  };
+
+  uint16_t m_nStations;                      ///< number of stations
+  NetDeviceContainer m_staDevices;           ///< stations' devices
+  uint16_t m_channelWidth;                   ///< PHY channel bandwidth in MHz
+  std::vector<FrameInfo> m_txPsdus;          ///< transmitted PSDUs
+  WifiAcknowledgment::Method m_dlMuAckType;  ///< DL MU ack sequence type
+  uint32_t m_maxAmpduSize;                   ///< maximum A-MPDU size in bytes
+  uint16_t m_txopLimit;                      ///< TXOP limit in microseconds
+  uint16_t m_nPktsPerSta;                    ///< number of packets to send to each station
+  uint16_t m_received;                       ///< number of packets received by the stations
+};
+
+OfdmaAckSequenceTest::OfdmaAckSequenceTest (uint16_t width, WifiAcknowledgment::Method dlType,
+                                            uint32_t maxAmpduSize, uint16_t txopLimit,
+                                            uint16_t nPktsPerSta)
+  : TestCase ("Check correct operation of DL OFDMA acknowledgment sequences"),
+    m_nStations (4),
+    m_channelWidth (width),
+    m_dlMuAckType (dlType),
+    m_maxAmpduSize (maxAmpduSize),
+    m_txopLimit (txopLimit),
+    m_nPktsPerSta (nPktsPerSta),
+    m_received (0)
+{
+}
+
+OfdmaAckSequenceTest::~OfdmaAckSequenceTest ()
+{
+}
+
+void
+OfdmaAckSequenceTest::L7Receive (std::string context, Ptr<const Packet> p, const Address &addr)
+{
+  if (p->GetSize () >= 1400 && Simulator::Now () > Seconds (1.5))
+    {
+      m_received++;
+    }
+}
+
+void
+OfdmaAckSequenceTest::Transmit (std::string context, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW)
+{
+  // skip beacon frames and frames transmitted before 1.5s (association
+  // request/response, ADDBA request, ...)
+  if (!psduMap.begin ()->second->GetHeader (0).IsBeacon ()
+      && Simulator::Now () > Seconds (1.5))
+    {
+      Time txDuration = WifiPhy::CalculateTxDuration (psduMap, txVector, WIFI_PHY_BAND_5GHZ);
+      m_txPsdus.push_back ({Simulator::Now (),
+                            Simulator::Now () + txDuration,
+                            psduMap, txVector});
+
+      NS_LOG_INFO ("Sending " << psduMap.begin ()->second->GetHeader (0).GetTypeString ()
+                    << " #MPDUs " << psduMap.begin ()->second->GetNMpdus ()
+                    << " txDuration " << txDuration
+                    << " duration/ID " << psduMap.begin ()->second->GetHeader (0).GetDuration ()
+                    << " #TX PSDUs = " << m_txPsdus.size ());
+    }
+
+  // Flush the MAC queues of the stations after sending an HE TB PPDU containing QoS data
+  // frames, so that stations do not attempt to access the channel and the UL MU transmission
+  // is followed by a DL MU transmission
+  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+      && psduMap.begin ()->second->GetHeader (0).HasData ())
+    {
+      Mac48Address sender = psduMap.begin ()->second->GetAddr2 ();
+
+      for (uint32_t i = 0; i < m_staDevices.GetN (); i++)
+        {
+          auto dev = DynamicCast<WifiNetDevice> (m_staDevices.Get (i));
+
+          if (dev->GetAddress () == sender)
+            {
+              DynamicCast<RegularWifiMac> (dev->GetMac ())->GetQosTxop (AC_BE)->GetWifiMacQueue ()->Flush ();
+              break;
+            }
+        }
+    }
+}
+
+void
+OfdmaAckSequenceTest::CheckResults (Time sifs, Time slotTime, uint8_t aifsn)
+{
+  CtrlTriggerHeader trigger;
+  CtrlBAckResponseHeader blockAck;
+  Time tEnd,                           // TX end for a frame
+       tStart,                         // TX start fot the next frame
+       tolerance = NanoSeconds (500),  // due to propagation delay
+       ifs = (m_txopLimit > 0 ? sifs : sifs + aifsn * slotTime),
+       navEnd;
+
+  /*
+   *                                                  |--------------NAV------------------>|
+   *                |------NAV------->|               |                 |------NAV-------->|
+   *      |---------|      |----------|     |---------|      |----------|      |-----------|
+   *      |         |      |QoS Null 1|     |         |      |QoS Data 1|      |           |
+   *      |  BSRP   |      |----------|     |  Basic  |      |----------|      | Multi-STA |
+   *      | Trigger |      |QoS Null 2|     | Trigger |      |QoS Data 2|      | Block Ack |
+   *      |  Frame  |<SIFS>|----------|<IFS>|  Frame  |<SIFS>|----------|<SIFS>|           |
+   *      |         |      |QoS Null 3|     |         |      |QoS Data 3|      |           |
+   *      |         |      |----------|     |         |      |----------|      |           |
+   *      |         |      |QoS Null 4|     |         |      |QoS Data 4|      |           |
+   * -----------------------------------------------------------------------------------------
+   * From:     AP                                AP                                 AP
+   *   To:    all               AP              all               AP               all
+   */
+
+  // the first packet sent after 1.5s is a BSRP Trigger Frame
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (m_txPsdus.size (), 5, "Expected at least 5 transmitted packet");
+  NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[0].psduMap.size () == 1
+                          && m_txPsdus[0].psduMap[SU_STA_ID]->GetHeader (0).IsTrigger ()
+                          && m_txPsdus[0].psduMap[SU_STA_ID]->GetHeader (0).GetAddr1 ().IsBroadcast ()),
+                         true, "Expected a Trigger Frame");
+  m_txPsdus[0].psduMap[SU_STA_ID]->GetPayload (0)->PeekHeader (trigger);
+  NS_TEST_EXPECT_MSG_EQ (trigger.IsBsrp (), true, "Expected a BSRP Trigger Frame");
+  NS_TEST_EXPECT_MSG_EQ (trigger.GetNUserInfoFields (), 4, "Expected one User Info field per station");
+
+  // A first STA sends 8 QoS Null frames in an HE TB PPDU a SIFS after the reception of the BSRP TF
+  NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[1].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                          && m_txPsdus[1].psduMap.size () == 1
+                          && m_txPsdus[1].psduMap.begin ()->second->GetNMpdus () == 8),
+                         true, "Expected 8 QoS Null frames in an HE TB PPDU");
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      const WifiMacHeader& hdr = m_txPsdus[1].psduMap.begin ()->second->GetHeader (i);
+      NS_TEST_EXPECT_MSG_EQ (hdr.GetType (), WIFI_MAC_QOSDATA_NULL, "Expected a QoS Null frame");
+      uint8_t tid = hdr.GetQosTid ();
+      if (tid == 0)
+        {
+          NS_TEST_EXPECT_MSG_GT (hdr.GetQosQueueSize (), 0, "Expected a non null queue size for TID " << +tid);
+        }
+      else
+        {
+          NS_TEST_EXPECT_MSG_EQ (hdr.GetQosQueueSize (), 0, "Expected a null queue size for TID " << +tid);
+        }
+    }
+  tEnd = m_txPsdus[0].endTx;
+  navEnd = tEnd + m_txPsdus[0].psduMap[SU_STA_ID]->GetDuration ();
+  tStart = m_txPsdus[1].startTx;
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "QoS Null frames in HE TB PPDU sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "QoS Null frames in HE TB PPDU sent too late");
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[1].endTx, "Duration/ID in BSRP Trigger Frame is too short");
+
+  // A second STA sends 8 QoS Null frames in an HE TB PPDU a SIFS after the reception of the BSRP TF
+  NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[2].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                          && m_txPsdus[2].psduMap.size () == 1
+                          && m_txPsdus[2].psduMap.begin ()->second->GetNMpdus () == 8),
+                         true, "Expected 8 QoS Null frames in an HE TB PPDU");
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      const WifiMacHeader& hdr = m_txPsdus[2].psduMap.begin ()->second->GetHeader (i);
+      NS_TEST_EXPECT_MSG_EQ (hdr.GetType (), WIFI_MAC_QOSDATA_NULL, "Expected a QoS Null frame");
+      uint8_t tid = hdr.GetQosTid ();
+      if (tid == 0)
+        {
+          NS_TEST_EXPECT_MSG_GT (hdr.GetQosQueueSize (), 0, "Expected a non null queue size for TID " << +tid);
+        }
+      else
+        {
+          NS_TEST_EXPECT_MSG_EQ (hdr.GetQosQueueSize (), 0, "Expected a null queue size for TID " << +tid);
+        }
+    }
+  tStart = m_txPsdus[2].startTx;
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "QoS Null frames in HE TB PPDU sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "QoS Null frames in HE TB PPDU sent too late");
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[2].endTx, "Duration/ID in BSRP Trigger Frame is too short");
+
+  // A third STA sends 8 QoS Null frames in an HE TB PPDU a SIFS after the reception of the BSRP TF
+  NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[3].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                          && m_txPsdus[3].psduMap.size () == 1
+                          && m_txPsdus[3].psduMap.begin ()->second->GetNMpdus () == 8),
+                         true, "Expected 8 QoS Null frames in an HE TB PPDU");
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      const WifiMacHeader& hdr = m_txPsdus[3].psduMap.begin ()->second->GetHeader (i);
+      NS_TEST_EXPECT_MSG_EQ (hdr.GetType (), WIFI_MAC_QOSDATA_NULL, "Expected a QoS Null frame");
+      uint8_t tid = hdr.GetQosTid ();
+      if (tid == 0)
+        {
+          NS_TEST_EXPECT_MSG_GT (hdr.GetQosQueueSize (), 0, "Expected a non null queue size for TID " << +tid);
+        }
+      else
+        {
+          NS_TEST_EXPECT_MSG_EQ (hdr.GetQosQueueSize (), 0, "Expected a null queue size for TID " << +tid);
+        }
+    }
+  tStart = m_txPsdus[3].startTx;
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "QoS Null frames in HE TB PPDU sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "QoS Null frames in HE TB PPDU sent too late");
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[3].endTx, "Duration/ID in BSRP Trigger Frame is too short");
+
+  // A fourth STA sends 8 QoS Null frames in an HE TB PPDU a SIFS after the reception of the BSRP TF
+  NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[4].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                          && m_txPsdus[4].psduMap.size () == 1
+                          && m_txPsdus[4].psduMap.begin ()->second->GetNMpdus () == 8),
+                         true, "Expected 8 QoS Null frames in an HE TB PPDU");
+  for (uint8_t i = 0; i < 8; i++)
+    {
+      const WifiMacHeader& hdr = m_txPsdus[4].psduMap.begin ()->second->GetHeader (i);
+      NS_TEST_EXPECT_MSG_EQ (hdr.GetType (), WIFI_MAC_QOSDATA_NULL, "Expected a QoS Null frame");
+      uint8_t tid = hdr.GetQosTid ();
+      if (tid == 0)
+        {
+          NS_TEST_EXPECT_MSG_GT (hdr.GetQosQueueSize (), 0, "Expected a non null queue size for TID " << +tid);
+        }
+      else
+        {
+          NS_TEST_EXPECT_MSG_EQ (hdr.GetQosQueueSize (), 0, "Expected a null queue size for TID " << +tid);
+        }
+    }
+  tStart = m_txPsdus[4].startTx;
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "QoS Null frames in HE TB PPDU sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "QoS Null frames in HE TB PPDU sent too late");
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[4].endTx, "Duration/ID in BSRP Trigger Frame is too short");
+
+  // the AP sends a Basic Trigger Frame to solicit QoS data frames
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (m_txPsdus.size (), 11, "Expected at least 11 transmitted packet");
+  NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[5].psduMap.size () == 1
+                          && m_txPsdus[5].psduMap[SU_STA_ID]->GetHeader (0).IsTrigger ()
+                          && m_txPsdus[5].psduMap[SU_STA_ID]->GetHeader (0).GetAddr1 ().IsBroadcast ()),
+                         true, "Expected a Trigger Frame");
+  m_txPsdus[5].psduMap[SU_STA_ID]->GetPayload (0)->PeekHeader (trigger);
+  NS_TEST_EXPECT_MSG_EQ (trigger.IsBasic (), true, "Expected a Basic Trigger Frame");
+  NS_TEST_EXPECT_MSG_EQ (trigger.GetNUserInfoFields (), 4, "Expected one User Info field per station");
+  tEnd = m_txPsdus[1].endTx;
+  tStart = m_txPsdus[5].startTx;
+  NS_TEST_EXPECT_MSG_LT (tEnd + ifs, tStart, "Basic Trigger Frame sent too early");
+  if (m_txopLimit > 0)
+    {
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Basic Trigger Frame sent too late");
+    }
+
+  // A first STA sends QoS data frames in an HE TB PPDU a SIFS after the reception of the Basic TF
+  NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[6].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                          && m_txPsdus[6].psduMap.size () == 1
+                          && m_txPsdus[6].psduMap.begin ()->second->GetHeader (0).IsQosData ()),
+                         true, "Expected QoS data frames in an HE TB PPDU");
+  tEnd = m_txPsdus[5].endTx;
+  tStart = m_txPsdus[6].startTx;
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "QoS data frames in HE TB PPDU sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "QoS data frames in HE TB PPDU sent too late");
+
+  // A second STA sends QoS data frames in an HE TB PPDU a SIFS after the reception of the Basic TF
+  NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[7].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                          && m_txPsdus[7].psduMap.size () == 1
+                          && m_txPsdus[7].psduMap.begin ()->second->GetHeader (0).IsQosData ()),
+                         true, "Expected QoS data frames in an HE TB PPDU");
+  tEnd = m_txPsdus[5].endTx;
+  tStart = m_txPsdus[7].startTx;
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "QoS data frames in HE TB PPDU sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "QoS data frames in HE TB PPDU sent too late");
+
+  // A third STA sends QoS data frames in an HE TB PPDU a SIFS after the reception of the Basic TF
+  NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[8].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                          && m_txPsdus[8].psduMap.size () == 1
+                          && m_txPsdus[8].psduMap.begin ()->second->GetHeader (0).IsQosData ()),
+                         true, "Expected QoS data frames in an HE TB PPDU");
+  tEnd = m_txPsdus[5].endTx;
+  tStart = m_txPsdus[8].startTx;
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "QoS data frames in HE TB PPDU sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "QoS data frames in HE TB PPDU sent too late");
+
+  // A fourth STA sends QoS data frames in an HE TB PPDU a SIFS after the reception of the Basic TF
+  NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[9].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                          && m_txPsdus[9].psduMap.size () == 1
+                          && m_txPsdus[9].psduMap.begin ()->second->GetHeader (0).IsQosData ()),
+                         true, "Expected QoS data frames in an HE TB PPDU");
+  tEnd = m_txPsdus[5].endTx;
+  tStart = m_txPsdus[9].startTx;
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "QoS data frames in HE TB PPDU sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "QoS data frames in HE TB PPDU sent too late");
+
+  // the AP sends a Multi-STA Block Ack
+  NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[10].psduMap.size () == 1
+                          && m_txPsdus[10].psduMap[SU_STA_ID]->GetHeader (0).IsBlockAck ()
+                          && m_txPsdus[10].psduMap[SU_STA_ID]->GetHeader (0).GetAddr1 ().IsBroadcast ()),
+                         true, "Expected a Block Ack");
+  m_txPsdus[10].psduMap[SU_STA_ID]->GetPayload (0)->PeekHeader (blockAck);
+  NS_TEST_EXPECT_MSG_EQ (blockAck.IsMultiSta (), true, "Expected a Multi-STA Block Ack");
+  NS_TEST_EXPECT_MSG_EQ (blockAck.GetNPerAidTidInfoSubfields (), 4,
+                         "Expected one Per AID TID Info subfield per station");
+  for (uint8_t i = 0; i < 4; i++)
+    {
+      NS_TEST_EXPECT_MSG_EQ (blockAck.GetAckType (i), true, "Expected All-ack context");
+      NS_TEST_EXPECT_MSG_EQ (+blockAck.GetTidInfo (i), 14, "Expected All-ack context");
+    }
+  tEnd = m_txPsdus[9].endTx;
+  tStart = m_txPsdus[10].startTx;
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Multi-STA Block Ack sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Multi-STA Block Ack sent too late");
+
+  navEnd = m_txPsdus[5].endTx + m_txPsdus[5].psduMap[SU_STA_ID]->GetDuration ();  // Basic TF's NAV
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[10].endTx, "Duration/ID in Basic Trigger Frame is too short");
+  navEnd = m_txPsdus[6].endTx + m_txPsdus[6].psduMap.begin ()->second->GetDuration ();  // 1st QoS Data frame's NAV
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[10].endTx, "Duration/ID in 1st QoS Data frame is too short");
+  navEnd = m_txPsdus[7].endTx + m_txPsdus[7].psduMap.begin ()->second->GetDuration ();  // 2nd QoS Data frame's NAV
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[10].endTx, "Duration/ID in 2nd QoS Data frame is too short");
+  navEnd = m_txPsdus[8].endTx + m_txPsdus[8].psduMap.begin ()->second->GetDuration ();  // 3rd QoS Data frame's NAV
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[10].endTx, "Duration/ID in 3rd QoS Data frame is too short");
+  navEnd = m_txPsdus[9].endTx + m_txPsdus[9].psduMap.begin ()->second->GetDuration ();  // 4th QoS Data frame's NAV
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[10].endTx, "Duration/ID in 4th QoS Data frame is too short");
+
+  // the AP sends a DL MU PPDU
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (m_txPsdus.size (), 12, "Expected at least 12 transmitted packet");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[11].txVector.GetPreambleType (), WIFI_PREAMBLE_HE_MU,
+                         "Expected a DL MU PPDU");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[11].psduMap.size (), 4, "Expected 4 PSDUs within the DL MU PPDU");
+  // the TX duration cannot exceed the maximum PPDU duration
+  NS_TEST_EXPECT_MSG_LT_OR_EQ (m_txPsdus[11].endTx - m_txPsdus[11].startTx,
+                               GetPpduMaxTime (m_txPsdus[11].txVector.GetPreambleType ()),
+                               "TX duration cannot exceed max PPDU duration");
+  for (auto& psdu : m_txPsdus[11].psduMap)
+    {
+      NS_TEST_EXPECT_MSG_LT_OR_EQ (psdu.second->GetSize (), m_maxAmpduSize, "Max A-MPDU size exceeded");
+    }
+  tEnd = m_txPsdus[10].endTx;
+  tStart = m_txPsdus[11].startTx;
+  NS_TEST_EXPECT_MSG_LT_OR_EQ (tEnd + ifs, tStart, "DL MU PPDU sent too early");
+
+  // The Duration/ID field is the same for all the PSDUs
+  navEnd = m_txPsdus[11].endTx;
+  for (auto& psdu : m_txPsdus[11].psduMap)
+    {
+      if (navEnd == m_txPsdus[11].endTx)
+        {
+          navEnd += psdu.second->GetDuration ();
+        }
+      else
+        {
+          NS_TEST_EXPECT_MSG_EQ (m_txPsdus[11].endTx + psdu.second->GetDuration (), navEnd,
+                                  "Duration/ID must be the same for all PSDUs");
+        }
+    }
+  NS_TEST_EXPECT_MSG_GT (navEnd, m_txPsdus[11].endTx, "Duration/ID of the DL MU PPDU cannot be zero");
+
+  if (m_dlMuAckType == WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE)
+    {
+      /*
+       *        |----------------------------------------NAV---------------------------------------------->|
+       *        |                         |--------------------------NAV---------------------------------->|
+       *        |                         |                         |-------------------NAV--------------->|
+       *        |                         |                         |                         |----NAV---->|
+       * |------|      |-----|      |-----|      |-----|      |-----|      |-----|      |-----|      |-----|
+       * |PSDU 1|      |     |      |     |      |     |      |     |      |     |      |     |      |     |
+       * |------|      |Block|      |Block|      |Block|      |Block|      |Block|      |Block|      |Block|
+       * |PSDU 2|      | Ack |      | Ack |      | Ack |      | Ack |      | Ack |      | Ack |      | Ack |
+       * |------|<SIFS>|     |<SIFS>| Req |<SIFS>|     |<SIFS>| Req |<SIFS>|     |<SIFS>| Req |<SIFS>|     |
+       * |PSDU 3|      |     |      |     |      |     |      |     |      |     |      |     |      |     |
+       * |------|      |     |      |     |      |     |      |     |      |     |      |     |      |     |
+       * |PSDU 4|      |     |      |     |      |     |      |     |      |     |      |     |      |     |
+       * ---------------------------------------------------------------------------------------------------
+       * From: AP       STA 1         AP          STA 2         AP          STA 3         AP          STA 4
+       *   To:           AP          STA 2         AP          STA 3         AP          STA 4         AP
+       */
+      NS_TEST_EXPECT_MSG_GT_OR_EQ (m_txPsdus.size (), 19, "Expected at least 19 packets");
+
+      // A first STA sends a Block Ack a SIFS after the reception of the DL MU PPDU
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[12].psduMap.size () == 1
+                              && m_txPsdus[12].psduMap[SU_STA_ID]->GetHeader (0).IsBlockAck ()),
+                             true, "Expected a Block Ack");
+      tEnd = m_txPsdus[11].endTx;
+      tStart = m_txPsdus[12].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "First Block Ack sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "First Block Ack sent too late");
+
+      // the AP transmits a Block Ack Request an IFS after the reception of the Block Ack
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[13].psduMap.size () == 1
+                              && m_txPsdus[13].psduMap[SU_STA_ID]->GetHeader (0).IsBlockAckReq ()),
+                             true, "Expected a Block Ack Request");
+      tEnd = m_txPsdus[12].endTx;
+      tStart = m_txPsdus[13].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "First Block Ack Request sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "First Block Ack Request sent too late");
+      
+      // A second STA sends a Block Ack a SIFS after the reception of the Block Ack Request
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[14].psduMap.size () == 1
+                              && m_txPsdus[14].psduMap[SU_STA_ID]->GetHeader (0).IsBlockAck ()),
+                             true, "Expected a Block Ack");
+      tEnd = m_txPsdus[13].endTx;
+      tStart = m_txPsdus[14].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Second Block Ack sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Second Block Ack sent too late");
+
+      // the AP transmits a Block Ack Request an IFS after the reception of the Block Ack
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[15].psduMap.size () == 1
+                              && m_txPsdus[15].psduMap[SU_STA_ID]->GetHeader (0).IsBlockAckReq ()),
+                             true, "Expected a Block Ack Request");
+      tEnd = m_txPsdus[14].endTx;
+      tStart = m_txPsdus[15].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Second Block Ack Request sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Second Block Ack Request sent too late");
+      
+      // A third STA sends a Block Ack a SIFS after the reception of the Block Ack Request
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[16].psduMap.size () == 1
+                              && m_txPsdus[16].psduMap[SU_STA_ID]->GetHeader (0).IsBlockAck ()),
+                             true, "Expected a Block Ack");
+      tEnd = m_txPsdus[15].endTx;
+      tStart = m_txPsdus[16].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Third Block Ack sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Third Block Ack sent too late");
+
+      // the AP transmits a Block Ack Request an IFS after the reception of the Block Ack
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[17].psduMap.size () == 1
+                              && m_txPsdus[17].psduMap[SU_STA_ID]->GetHeader (0).IsBlockAckReq ()),
+                             true, "Expected a Block Ack Request");
+      tEnd = m_txPsdus[16].endTx;
+      tStart = m_txPsdus[17].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Third Block Ack Request sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Third Block Ack Request sent too late");
+      
+      // A fourth STA sends a Block Ack a SIFS after the reception of the Block Ack Request
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[18].psduMap.size () == 1
+                              && m_txPsdus[18].psduMap[SU_STA_ID]->GetHeader (0).IsBlockAck ()),
+                             true, "Expected a Block Ack");
+      tEnd = m_txPsdus[17].endTx;
+      tStart = m_txPsdus[18].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Fourth Block Ack sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Fourth Block Ack sent too late");
+
+      if (m_txopLimit > 0)
+        {
+          // DL MU PPDU's NAV
+          NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[18].endTx, "Duration/ID in the DL MU PPDU is too short");
+          // 1st BlockAckReq's NAV
+          navEnd = m_txPsdus[13].endTx + m_txPsdus[13].psduMap[SU_STA_ID]->GetDuration ();
+          NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[18].endTx, "Duration/ID in the 1st BlockAckReq is too short");
+          // 2nd BlockAckReq's NAV
+          navEnd = m_txPsdus[15].endTx + m_txPsdus[15].psduMap[SU_STA_ID]->GetDuration ();
+          NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[18].endTx, "Duration/ID in the 2nd BlockAckReq is too short");
+          // 3rd BlockAckReq's NAV
+          navEnd = m_txPsdus[17].endTx + m_txPsdus[17].psduMap[SU_STA_ID]->GetDuration ();
+          NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[18].endTx, "Duration/ID in the 3rd BlockAckReq is too short");
+        }
+    }
+  else if (m_dlMuAckType == WifiAcknowledgment::DL_MU_TF_MU_BAR)
+    {
+      /*
+       *             |----------------NAV--------------->|
+       *             |                |--------NAV------>|
+       *      |------|      |---------|      |-----------|
+       *      |PSDU 1|      |         |      |Block Ack 1|
+       *      |------|      | MU-BAR  |      |-----------|
+       *      |PSDU 2|      | Trigger |      |Block Ack 2|
+       *      |------|<SIFS>|  Frame  |<SIFS>|-----------|
+       *      |PSDU 3|      |         |      |Block Ack 3|
+       *      |------|      |         |      |-----------|
+       *      |PSDU 4|      |         |      |Block Ack 4|
+       * --------------------------------------------------
+       * From:   AP            AP
+       *   To:                all                 AP
+       */
+      NS_TEST_EXPECT_MSG_GT_OR_EQ (m_txPsdus.size (), 17, "Expected at least 17 packets");
+
+      // the AP transmits a MU-BAR Trigger Frame an IFS after the transmission of the DL MU PPDU
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[12].psduMap.size () == 1
+                              && m_txPsdus[12].psduMap[SU_STA_ID]->GetHeader (0).IsTrigger ()),
+                             true, "Expected a MU-BAR Trigger Frame");
+      tEnd = m_txPsdus[11].endTx;
+      tStart = m_txPsdus[12].startTx;
+      NS_TEST_EXPECT_MSG_EQ (tStart, tEnd + sifs, "MU-BAR Trigger Frame sent at wrong time");
+
+      // A first STA sends a Block Ack in an HE TB PPDU a SIFS after the reception of the DL MU PPDU
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[13].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                              && m_txPsdus[13].psduMap.size () == 1
+                              && m_txPsdus[13].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
+                             true, "Expected a Block Ack");
+      tEnd = m_txPsdus[12].endTx;
+      tStart = m_txPsdus[13].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Block Ack in HE TB PPDU sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Block Ack in HE TB PPDU sent too late");
+
+      // A second STA sends a Block Ack in an HE TB PPDU a SIFS after the reception of the DL MU PPDU
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[14].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                              && m_txPsdus[14].psduMap.size () == 1
+                              && m_txPsdus[14].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
+                             true, "Expected a Block Ack");
+      tEnd = m_txPsdus[12].endTx;
+      tStart = m_txPsdus[14].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Block Ack in HE TB PPDU sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Block Ack in HE TB PPDU sent too late");
+
+      // A third STA sends a Block Ack in an HE TB PPDU a SIFS after the reception of the DL MU PPDU
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[15].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                              && m_txPsdus[15].psduMap.size () == 1
+                              && m_txPsdus[15].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
+                             true, "Expected a Block Ack");
+      tEnd = m_txPsdus[12].endTx;
+      tStart = m_txPsdus[15].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Block Ack in HE TB PPDU sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Block Ack in HE TB PPDU sent too late");
+
+      // A fourth STA sends a Block Ack in an HE TB PPDU a SIFS after the reception of the DL MU PPDU
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[16].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                              && m_txPsdus[16].psduMap.size () == 1
+                              && m_txPsdus[16].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
+                             true, "Expected a Block Ack");
+      tEnd = m_txPsdus[12].endTx;
+      tStart = m_txPsdus[16].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Block Ack in HE TB PPDU sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Block Ack in HE TB PPDU sent too late");
+
+      if (m_txopLimit > 0)
+        {
+          // DL MU PPDU's NAV
+          NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[13].endTx, "Duration/ID in the DL MU PPDU is too short");
+          NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[14].endTx, "Duration/ID in the DL MU PPDU is too short");
+          NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[15].endTx, "Duration/ID in the DL MU PPDU is too short");
+          NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[16].endTx, "Duration/ID in the DL MU PPDU is too short");
+        }
+      // MU-BAR Trigger Frame's NAV
+      navEnd = m_txPsdus[12].endTx + m_txPsdus[12].psduMap[SU_STA_ID]->GetDuration ();
+      NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[13].endTx, "Duration/ID in the MU-BAR Trigger Frame is too short");
+      NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[14].endTx, "Duration/ID in the MU-BAR Trigger Frame is too short");
+      NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[15].endTx, "Duration/ID in the MU-BAR Trigger Frame is too short");
+      NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[16].endTx, "Duration/ID in the MU-BAR Trigger Frame is too short");
+    }
+  else if (m_dlMuAckType == WifiAcknowledgment::DL_MU_AGGREGATE_TF)
+    {
+      /*
+       *                         |--------NAV------>|
+       *      |------|-----------|      |-----------|
+       *      |PSDU 1|MU-BAR TF 1|      |Block Ack 1|
+       *      |------------------|      |-----------|
+       *      |PSDU 2|MU-BAR TF 2|      |Block Ack 2|
+       *      |------------------|<SIFS>|-----------|
+       *      |PSDU 3|MU-BAR TF 3|      |Block Ack 3|
+       *      |------------------|      |-----------|
+       *      |PSDU 4|MU-BAR TF 4|      |Block Ack 4|
+       * --------------------------------------------------
+       * From:         AP
+       *   To:                               AP
+       */
+      NS_TEST_EXPECT_MSG_GT_OR_EQ (m_txPsdus.size (), 16, "Expected at least 16 packets");
+
+      // The last MPDU in each PSDU is a MU-BAR Trigger Frame
+      for (auto& psdu : m_txPsdus[11].psduMap)
+        {
+          NS_TEST_EXPECT_MSG_EQ ((*(--psdu.second->end ()))->GetHeader ().IsTrigger (), true,
+                                 "Expected an aggregated MU-BAR Trigger Frame");
+        }
+
+      // A first STA sends a Block Ack in an HE TB PPDU a SIFS after the reception of the DL MU PPDU
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[12].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                              && m_txPsdus[12].psduMap.size () == 1
+                              && m_txPsdus[12].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
+                             true, "Expected a Block Ack");
+      tEnd = m_txPsdus[11].endTx;
+      tStart = m_txPsdus[12].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Block Ack in HE TB PPDU sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Block Ack in HE TB PPDU sent too late");
+      NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[12].endTx, "Duration/ID in the DL MU PPDU is too short");
+
+      // A second STA sends a Block Ack in an HE TB PPDU a SIFS after the reception of the DL MU PPDU
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[13].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                              && m_txPsdus[13].psduMap.size () == 1
+                              && m_txPsdus[13].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
+                             true, "Expected a Block Ack");
+      tEnd = m_txPsdus[11].endTx;
+      tStart = m_txPsdus[13].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Block Ack in HE TB PPDU sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Block Ack in HE TB PPDU sent too late");
+      NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[13].endTx, "Duration/ID in the DL MU PPDU is too short");
+
+      // A third STA sends a Block Ack in an HE TB PPDU a SIFS after the reception of the DL MU PPDU
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[14].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                              && m_txPsdus[14].psduMap.size () == 1
+                              && m_txPsdus[14].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
+                             true, "Expected a Block Ack");
+      tEnd = m_txPsdus[11].endTx;
+      tStart = m_txPsdus[14].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Block Ack in HE TB PPDU sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Block Ack in HE TB PPDU sent too late");
+      NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[14].endTx, "Duration/ID in the DL MU PPDU is too short");
+
+      // A fourth STA sends a Block Ack in an HE TB PPDU a SIFS after the reception of the DL MU PPDU
+      NS_TEST_EXPECT_MSG_EQ ((m_txPsdus[15].txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+                              && m_txPsdus[15].psduMap.size () == 1
+                              && m_txPsdus[15].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
+                             true, "Expected a Block Ack");
+      tEnd = m_txPsdus[11].endTx;
+      tStart = m_txPsdus[15].startTx;
+      NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Block Ack in HE TB PPDU sent too early");
+      NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Block Ack in HE TB PPDU sent too late");
+      NS_TEST_EXPECT_MSG_GT_OR_EQ (navEnd + tolerance, m_txPsdus[15].endTx, "Duration/ID in the DL MU PPDU is too short");
+    }
+
+  NS_TEST_EXPECT_MSG_EQ (m_received, m_nPktsPerSta * m_nStations, "Not all packets have been received");
+  m_txPsdus.clear ();
+}
+
+void
+OfdmaAckSequenceTest::DoRun (void)
+{
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (2);
+  int64_t streamNumber = 100;
+
+  NodeContainer wifiApNode;
+  wifiApNode.Create (1);
+
+  NodeContainer wifiStaNodes;
+  wifiStaNodes.Create (m_nStations);
+
+  Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel> ();
+  Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel> ();
+  spectrumChannel->AddPropagationLossModel (lossModel);
+  Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
+  spectrumChannel->SetPropagationDelayModel (delayModel);
+
+  SpectrumWifiPhyHelper phy;
+  phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
+  phy.SetErrorRateModel ("ns3::NistErrorRateModel");
+  phy.SetChannel (spectrumChannel);
+  switch (m_channelWidth)
+    {
+      case 20:
+        phy.Set ("ChannelNumber", UintegerValue (36));
+        break;
+      case 40:
+        phy.Set ("ChannelNumber", UintegerValue (38));
+        break;
+      case 80:
+        phy.Set ("ChannelNumber", UintegerValue (42));
+        break;
+      case 160:
+        phy.Set ("ChannelNumber", UintegerValue (50));
+        break;
+      default:
+        NS_ABORT_MSG ("Invalid channel bandwidth (must be 20, 40, 80 or 160)");
+    }
+  phy.Set ("ChannelWidth", UintegerValue (m_channelWidth));
+
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+  wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
+
+  WifiMacHelper mac;
+  Ssid ssid = Ssid ("ns-3-ssid");
+  mac.SetType ("ns3::StaWifiMac",
+               "BE_MaxAmsduSize", UintegerValue (0),
+               "BE_MaxAmpduSize", UintegerValue (0),
+               "Ssid", SsidValue (ssid),
+               /* setting blockack threshold for sta's BE queue */
+               "BE_BlockAckThreshold", UintegerValue (2),
+               "ActiveProbing", BooleanValue (false));
+
+  m_staDevices = wifi.Install (phy, mac, wifiStaNodes);
+
+  mac.SetType ("ns3::ApWifiMac",
+               "BE_MaxAmsduSize", UintegerValue (0),
+               "BE_MaxAmpduSize", UintegerValue (0),
+               "Ssid", SsidValue (ssid),
+               "BeaconGeneration", BooleanValue (true));
+  mac.SetMultiUserScheduler ("ns3::TestMultiUserScheduler");
+  mac.SetAckManager ("ns3::WifiDefaultAckManager", "DlMuAckSequenceType", EnumValue (m_dlMuAckType));
+
+  NetDeviceContainer apDevices;
+  apDevices = wifi.Install (phy, mac, wifiApNode);
+
+  // Assign fixed streams to random variables in use
+  streamNumber += wifi.AssignStreams (apDevices, streamNumber);
+  streamNumber += wifi.AssignStreams (m_staDevices, streamNumber);
+
+  MobilityHelper mobility;
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+
+  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
+  positionAlloc->Add (Vector (1.0, 0.0, 0.0));
+  positionAlloc->Add (Vector (0.0, 1.0, 0.0));
+  positionAlloc->Add (Vector (-1.0, 0.0, 0.0));
+  positionAlloc->Add (Vector (-1.0, -1.0, 0.0));
+  mobility.SetPositionAllocator (positionAlloc);
+
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (wifiApNode);
+  mobility.Install (wifiStaNodes);
+
+  Ptr<WifiNetDevice> dev;
+
+  // Set maximum A-MPDU size
+  for (uint32_t i = 0; i < m_staDevices.GetN (); i++)
+    {
+      dev = DynamicCast<WifiNetDevice> (m_staDevices.Get (i));
+      dev->GetMac ()->SetAttribute ("BE_MaxAmpduSize", UintegerValue (m_maxAmpduSize));
+    }
+  dev = DynamicCast<WifiNetDevice> (apDevices.Get (0));
+  dev->GetMac ()->SetAttribute ("BE_MaxAmpduSize", UintegerValue (m_maxAmpduSize));
+
+  PointerValue ptr;
+  dev->GetMac ()->GetAttribute ("BE_Txop", ptr);
+  Ptr<QosTxop> apBeQosTxop = ptr.Get<QosTxop> ();
+  // set the TXOP limit on BE AC
+  apBeQosTxop->SetTxopLimit (MicroSeconds (m_txopLimit));
+
+  PacketSocketHelper packetSocket;
+  packetSocket.Install (wifiApNode);
+  packetSocket.Install (wifiStaNodes);
+
+  // DL Traffic
+  for (uint16_t i = 0; i < m_nStations; i++)
+    {
+      PacketSocketAddress socket;
+      socket.SetSingleDevice (apDevices.Get (0)->GetIfIndex ());
+      socket.SetPhysicalAddress (m_staDevices.Get (i)->GetAddress ());
+      socket.SetProtocol (1);
+
+      // the first client application generates two packets in order
+      // to trigger the establishment of a Block Ack agreement
+      Ptr<PacketSocketClient> client1 = CreateObject<PacketSocketClient> ();
+      client1->SetAttribute ("PacketSize", UintegerValue (1400));
+      client1->SetAttribute ("MaxPackets", UintegerValue (2));
+      client1->SetAttribute ("Interval", TimeValue (MicroSeconds (0)));
+      client1->SetRemote (socket);
+      wifiApNode.Get (0)->AddApplication (client1);
+      client1->SetStartTime (Seconds (1) + i * MilliSeconds (1));
+      client1->SetStopTime (Seconds (2.0));
+
+      // the second client application generates the selected number of packets,
+      // which are sent in DL MU PPDUs.
+      Ptr<PacketSocketClient> client2 = CreateObject<PacketSocketClient> ();
+      client2->SetAttribute ("PacketSize", UintegerValue (1400 + i * 100));
+      client2->SetAttribute ("MaxPackets", UintegerValue (m_nPktsPerSta));
+      client2->SetAttribute ("Interval", TimeValue (MicroSeconds (0)));
+      client2->SetRemote (socket);
+      wifiApNode.Get (0)->AddApplication (client2);
+      client2->SetStartTime (Seconds (1.5));
+      client2->SetStopTime (Seconds (2.5));
+
+      Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer> ();
+      server->SetLocal (socket);
+      wifiStaNodes.Get (i)->AddApplication (server);
+      server->SetStartTime (Seconds (0.0));
+      server->SetStopTime (Seconds (3.0));
+    }
+
+  // UL Traffic
+  for (uint16_t i = 0; i < m_nStations; i++)
+    {
+      PacketSocketAddress socket;
+      socket.SetSingleDevice (m_staDevices.Get (i)->GetIfIndex ());
+      socket.SetPhysicalAddress (apDevices.Get (0)->GetAddress ());
+      socket.SetProtocol (1);
+
+      // the first client application generates two packets in order
+      // to trigger the establishment of a Block Ack agreement
+      Ptr<PacketSocketClient> client1 = CreateObject<PacketSocketClient> ();
+      client1->SetAttribute ("PacketSize", UintegerValue (1400));
+      client1->SetAttribute ("MaxPackets", UintegerValue (2));
+      client1->SetAttribute ("Interval", TimeValue (MicroSeconds (0)));
+      client1->SetRemote (socket);
+      wifiStaNodes.Get (i)->AddApplication (client1);
+      client1->SetStartTime (Seconds (1.005) + i * MilliSeconds (1));
+      client1->SetStopTime (Seconds (2.0));
+
+      // the second client application generates the selected number of packets,
+      // which are sent in HE TB PPDUs.
+      Ptr<PacketSocketClient> client2 = CreateObject<PacketSocketClient> ();
+      client2->SetAttribute ("PacketSize", UintegerValue (1400 + i * 100));
+      client2->SetAttribute ("MaxPackets", UintegerValue (m_nPktsPerSta));
+      client2->SetAttribute ("Interval", TimeValue (MicroSeconds (0)));
+      client2->SetRemote (socket);
+      wifiStaNodes.Get (i)->AddApplication (client2);
+      client2->SetStartTime (Seconds (1.50011));  // start before sending QoS Null frames
+      client2->SetStopTime (Seconds (2.5));
+
+      Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer> ();
+      server->SetLocal (socket);
+      wifiApNode.Get (0)->AddApplication (server);
+      server->SetStartTime (Seconds (0.0));
+      server->SetStopTime (Seconds (3.0));
+    }
+
+  Config::Connect ("/NodeList/*/ApplicationList/0/$ns3::PacketSocketServer/Rx",
+                   MakeCallback (&OfdmaAckSequenceTest::L7Receive, this));
+  // Trace PSDUs passed to the PHY on all devices
+  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxPsduBegin",
+                   MakeCallback (&OfdmaAckSequenceTest::Transmit, this));
+
+  Simulator::Stop (Seconds (3));
+  Simulator::Run ();
+
+  CheckResults (dev->GetMac ()->GetWifiPhy ()->GetSifs (), dev->GetMac ()->GetWifiPhy ()->GetSlot (),
+                apBeQosTxop->GetAifsn ());
+
+  Simulator::Destroy ();
+}
+
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief wifi MAC OFDMA Test Suite
+ */
+class WifiMacOfdmaTestSuite : public TestSuite
+{
+public:
+  WifiMacOfdmaTestSuite ();
+};
+
+WifiMacOfdmaTestSuite::WifiMacOfdmaTestSuite ()
+  : TestSuite ("wifi-mac-ofdma", UNIT)
+{
+  AddTestCase (new OfdmaAckSequenceTest (20, WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE, 10000, 5440, 15), TestCase::QUICK);
+  AddTestCase (new OfdmaAckSequenceTest (20, WifiAcknowledgment::DL_MU_AGGREGATE_TF, 10000, 5440, 15), TestCase::QUICK);
+  AddTestCase (new OfdmaAckSequenceTest (20, WifiAcknowledgment::DL_MU_TF_MU_BAR, 10000, 5440, 15), TestCase::QUICK);
+  AddTestCase (new OfdmaAckSequenceTest (40, WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE, 10000, 0, 15), TestCase::QUICK);
+  AddTestCase (new OfdmaAckSequenceTest (40, WifiAcknowledgment::DL_MU_AGGREGATE_TF, 10000, 0, 15), TestCase::QUICK);
+  AddTestCase (new OfdmaAckSequenceTest (40, WifiAcknowledgment::DL_MU_TF_MU_BAR, 10000, 0, 15), TestCase::QUICK);
+}
+
+static WifiMacOfdmaTestSuite g_wifiMacOfdmaTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/wifi-mac-queue-test.cc ns-3.34/src/wifi/test/wifi-mac-queue-test.cc
--- ns-3.33/src/wifi/test/wifi-mac-queue-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/test/wifi-mac-queue-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,128 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2021 IITP RAS
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Krotov <krotov@iitp.ru>
+ */
+
+#include "ns3/test.h"
+#include "ns3/wifi-mac-queue.h"
+#include "ns3/simulator.h"
+
+using namespace ns3;
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief Test DROP_OLDEST setting.
+ *
+ * This test verifies the correctness of DROP_OLDEST policy when packets
+ * are pushed into the front of the queue. This case is not handled
+ * by the underlying ns3::Queue<WifiMacQueueItem>.
+ */
+class WifiMacQueueDropOldestTest : public TestCase
+{
+public:
+  /**
+   * \brief Constructor
+   */
+  WifiMacQueueDropOldestTest ();
+
+  void DoRun () override;
+};
+
+WifiMacQueueDropOldestTest::WifiMacQueueDropOldestTest()
+  : TestCase ("Test DROP_OLDEST setting")
+{
+}
+
+void
+WifiMacQueueDropOldestTest::DoRun ()
+{
+  auto wifiMacQueue = CreateObject<WifiMacQueue> ();
+  wifiMacQueue->SetMaxSize (QueueSize ("5p"));
+  wifiMacQueue->SetAttribute ("DropPolicy", EnumValue (WifiMacQueue::DROP_OLDEST));
+
+  // Initialize the queue with 5 packets.
+  std::vector<uint64_t> packetUids;
+  for (uint32_t i = 0; i < 5; i++)
+    {
+      WifiMacHeader header;
+      header.SetType (WIFI_MAC_QOSDATA);
+      header.SetQosTid (0);
+      auto packet = Create<Packet> ();
+      auto item = Create<WifiMacQueueItem> (packet, header);
+      wifiMacQueue->PushFront (item);
+
+      packetUids.push_back (packet->GetUid ());
+    }
+
+  // Check that all elements are inserted successfully.
+  auto it = wifiMacQueue->begin ();
+  NS_TEST_EXPECT_MSG_EQ (wifiMacQueue->GetNPackets (), 5, "Queue has unexpected number of elements");
+  for (uint32_t i = 5; i > 0; i--)
+    {
+      NS_TEST_EXPECT_MSG_EQ ((*it)->GetPacket ()->GetUid (),
+                             packetUids.at (i - 1),
+                             "Stored packet is not the expected one");
+      it++;
+    }
+
+  // Push another element in front of the queue.
+  WifiMacHeader header;
+  header.SetType (WIFI_MAC_QOSDATA);
+  header.SetQosTid (0);
+  auto packet = Create<Packet> ();
+  auto item = Create<WifiMacQueueItem> (packet, header);
+  wifiMacQueue->PushFront (item);
+
+  // Update the vector of expected packet UIDs.
+  packetUids.at (4) = packet->GetUid ();
+
+  // Check that front packet was replaced correctly.
+  it = wifiMacQueue->begin ();
+  NS_TEST_EXPECT_MSG_EQ (wifiMacQueue->GetNPackets (), 5, "Queue has unexpected number of elements");
+  for (uint32_t i = 5; i > 0; i--)
+    {
+      NS_TEST_EXPECT_MSG_EQ ((*it)->GetPacket ()->GetUid (),
+                             packetUids.at (i - 1),
+                             "Stored packet is not the expected one");
+      it++;
+    }
+
+  Simulator::Destroy ();
+}
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief Wifi MAC Queue Test Suite
+ */
+class WifiMacQueueTestSuite : public TestSuite
+{
+  public:
+    WifiMacQueueTestSuite ();
+};
+
+WifiMacQueueTestSuite::WifiMacQueueTestSuite ()
+  : TestSuite ("wifi-mac-queue", UNIT)
+{
+  AddTestCase (new WifiMacQueueDropOldestTest, TestCase::QUICK);
+}
+
+static WifiMacQueueTestSuite g_wifiMacQueueTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/wifi-phy-ofdma-test.cc ns-3.34/src/wifi/test/wifi-phy-ofdma-test.cc
--- ns-3.33/src/wifi/test/wifi-phy-ofdma-test.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/wifi-phy-ofdma-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -22,6 +22,7 @@
 #include "ns3/test.h"
 #include "ns3/node.h"
 #include "ns3/pointer.h"
+#include "ns3/string.h"
 #include "ns3/simulator.h"
 #include "ns3/rng-seed-manager.h"
 #include "ns3/constant-position-mobility-model.h"
@@ -33,18 +34,34 @@
 #include "ns3/wifi-mac-header.h"
 #include "ns3/wifi-net-device.h"
 #include "ns3/wifi-psdu.h"
-#include "ns3/wifi-ppdu.h"
+#include "ns3/he-ppdu.h"
+#include "ns3/wifi-utils.h"
+#include "ns3/ap-wifi-mac.h"
+#include "ns3/sta-wifi-mac.h"
+#include "ns3/he-configuration.h"
+#include "ns3/ctrl-headers.h"
+#include "ns3/threshold-preamble-detection-model.h"
+#include "ns3/he-phy.h"
 #include "ns3/waveform-generator.h"
 #include "ns3/non-communicating-net-device.h"
+#include "ns3/spectrum-wifi-helper.h"
+#include "ns3/mobility-helper.h"
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE ("WifiPhyOfdmaTest");
 
+static const uint8_t DEFAULT_CHANNEL_NUMBER = 36;
 static const uint32_t DEFAULT_FREQUENCY = 5180; // MHz
+static const WifiPhyBand DEFAULT_WIFI_BAND = WIFI_PHY_BAND_5GHZ;
 static const uint16_t DEFAULT_CHANNEL_WIDTH = 20; // MHz
+static const uint16_t DEFAULT_GUARD_WIDTH = DEFAULT_CHANNEL_WIDTH; // MHz (expanded to channel width to model spectrum mask)
 
-class OfdmaSpectrumWifiPhy : public SpectrumWifiPhy
+/**
+ * HE PHY slightly modified so as to return a given
+ * STA-ID in case of DL MU for OfdmaSpectrumWifiPhy.
+ */
+class OfdmaTestHePhy : public HePhy
 {
 public:
   /**
@@ -52,35 +69,231 @@
    *
    * \param staId the ID of the STA to which this PHY belongs to
    */
-  OfdmaSpectrumWifiPhy (uint16_t staId);
-  virtual ~OfdmaSpectrumWifiPhy ();
+  OfdmaTestHePhy (uint16_t staId);
+  virtual ~OfdmaTestHePhy ();
 
-private:
   /**
    * Return the STA ID that has been assigned to the station this PHY belongs to.
    * This is typically called for MU PPDUs, in order to pick the correct PSDU.
    *
+   * \param ppdu the PPDU for which the STA ID is requested
    * \return the STA ID
    */
-  uint16_t GetStaId (void) const override;
+  uint16_t GetStaId (const Ptr<const WifiPpdu> ppdu) const override;
+
+  /**
+   * Set the global PPDU UID counter.
+   *
+   * \param uid the value to which the global PPDU UID counter should be set
+   */
+  void SetGlobalPpduUid (uint64_t uid);
 
+private:
   uint16_t m_staId; ///< ID of the STA to which this PHY belongs to
-};
+}; //class OfdmaTestHePhy
 
-OfdmaSpectrumWifiPhy::OfdmaSpectrumWifiPhy (uint16_t staId)
-  : SpectrumWifiPhy (),
+OfdmaTestHePhy::OfdmaTestHePhy (uint16_t staId)
+  : HePhy (),
     m_staId (staId)
 {
 }
 
+OfdmaTestHePhy::~OfdmaTestHePhy ()
+{
+}
+
+uint16_t
+OfdmaTestHePhy::GetStaId (const Ptr<const WifiPpdu> ppdu) const
+{
+  if (ppdu->GetType () == WIFI_PPDU_TYPE_DL_MU)
+    {
+      return m_staId;
+    }
+  return HePhy::GetStaId (ppdu);
+}
+
+void
+OfdmaTestHePhy::SetGlobalPpduUid (uint64_t uid)
+{
+  m_globalPpduUid = uid;
+}
+
+/**
+ * SpectrumWifiPhy used for testing OFDMA.
+ */
+class OfdmaSpectrumWifiPhy : public SpectrumWifiPhy
+{
+public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+  /**
+   * Constructor
+   *
+   * \param staId the ID of the STA to which this PHY belongs to
+   */
+  OfdmaSpectrumWifiPhy (uint16_t staId);
+  virtual ~OfdmaSpectrumWifiPhy ();
+
+  void DoInitialize (void) override;
+  void DoDispose (void) override;
+
+  using WifiPhy::Reset;
+
+  /**
+   * TracedCallback signature for UID of transmitted PPDU.
+   *
+   * \param uid the UID of the transmitted PPDU
+   */
+  typedef void (*TxPpduUidCallback)(uint64_t uid);
+
+  /**
+   * \param ppdu the PPDU to send
+   */
+  void StartTx (Ptr<WifiPpdu> ppdu) override;
+  /**
+   * \param currentChannelWidth channel width of the current transmission (MHz)
+   * \return the width of the guard band (MHz) set to 2
+   */
+  uint16_t GetGuardBandwidth (uint16_t currentChannelWidth) const override;
+
+  /**
+   * Set the global PPDU UID counter.
+   *
+   * \param uid the value to which the global PPDU UID counter should be set
+   */
+  void SetPpduUid (uint64_t uid);
+
+  /**
+   * Since we assume trigger frame was previously received from AP, this is used to set its UID
+   *
+   * \param uid the PPDU UID of the trigger frame
+   */
+  void SetTriggerFrameUid (uint64_t uid);
+
+  /**
+   * \return the current preamble events map
+   */
+  std::map <std::pair<uint64_t, WifiPreamble>, Ptr<Event> > & GetCurrentPreambleEvents (void);
+  /**
+   * \return the current event
+   */
+  Ptr<Event> GetCurrentEvent (void);
+
+  /**
+   * Wrapper to InterferenceHelper method.
+   *
+   * \param energyW the minimum energy (W) requested
+   * \param band identify the requested band
+   *
+   * \returns the expected amount of time the observed
+   *          energy on the medium for a given band will
+   *          be higher than the requested threshold.
+   */
+  Time GetEnergyDuration (double energyW, WifiSpectrumBand band);
+
+  /**
+   * \return a const pointer to the HE PHY instance
+   */
+  Ptr<const HePhy> GetHePhy (void) const;
+
+private:
+  Ptr<OfdmaTestHePhy> m_ofdmTestHePhy; ///< Pointer to HE PHY instance used for OFDMA test
+  TracedCallback<uint64_t> m_phyTxPpduUidTrace; //!< Callback providing UID of the PPDU that is about to be transmitted
+}; //class OfdmaSpectrumWifiPhy
+
+TypeId
+OfdmaSpectrumWifiPhy::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::OfdmaSpectrumWifiPhy")
+    .SetParent<SpectrumWifiPhy> ()
+    .SetGroupName ("Wifi")
+    .AddTraceSource ("TxPpduUid",
+                     "UID of the PPDU to be transmitted",
+                     MakeTraceSourceAccessor (&OfdmaSpectrumWifiPhy::m_phyTxPpduUidTrace),
+                     "ns3::OfdmaSpectrumWifiPhy::TxPpduUidCallback")
+  ;
+  return tid;
+}
+
+OfdmaSpectrumWifiPhy::OfdmaSpectrumWifiPhy (uint16_t staId)
+  : SpectrumWifiPhy ()
+{
+  m_ofdmTestHePhy = Create<OfdmaTestHePhy> (staId);
+  m_ofdmTestHePhy->SetOwner (this);
+}
+
 OfdmaSpectrumWifiPhy::~OfdmaSpectrumWifiPhy()
 {
 }
 
+void
+OfdmaSpectrumWifiPhy::DoInitialize (void)
+{
+  //Replace HE PHY instance with test instance
+  m_phyEntities[WIFI_MOD_CLASS_HE] = m_ofdmTestHePhy;
+  SpectrumWifiPhy::DoInitialize ();
+}
+
+void
+OfdmaSpectrumWifiPhy::DoDispose (void)
+{
+  m_ofdmTestHePhy = 0;
+  SpectrumWifiPhy::DoDispose ();
+}
+
+void
+OfdmaSpectrumWifiPhy::SetPpduUid (uint64_t uid)
+{
+  m_ofdmTestHePhy->SetGlobalPpduUid (uid);
+  m_previouslyRxPpduUid = uid;
+}
+
+void
+OfdmaSpectrumWifiPhy::SetTriggerFrameUid (uint64_t uid)
+{
+  m_previouslyRxPpduUid = uid;
+}
+
+void
+OfdmaSpectrumWifiPhy::StartTx (Ptr<WifiPpdu> ppdu)
+{
+  m_phyTxPpduUidTrace (ppdu->GetUid ());
+  SpectrumWifiPhy::StartTx (ppdu);
+}
+
+std::map <std::pair<uint64_t, WifiPreamble>, Ptr<Event> > &
+OfdmaSpectrumWifiPhy::GetCurrentPreambleEvents (void)
+{
+  return m_currentPreambleEvents;
+}
+
 uint16_t
-OfdmaSpectrumWifiPhy::GetStaId (void) const
+OfdmaSpectrumWifiPhy::GetGuardBandwidth (uint16_t currentChannelWidth) const
+{
+  // return a small enough value to avoid having too much out of band transmission
+  // knowing that slopes are not configurable yet.
+  return 1;
+}
+
+Ptr<Event>
+OfdmaSpectrumWifiPhy::GetCurrentEvent (void)
+{
+  return m_currentEvent;
+}
+
+Time
+OfdmaSpectrumWifiPhy::GetEnergyDuration (double energyW, WifiSpectrumBand band)
+{
+  return m_interference.GetEnergyDuration (energyW, band);
+}
+
+Ptr<const HePhy>
+OfdmaSpectrumWifiPhy::GetHePhy (void) const
 {
-  return m_staId;
+  return DynamicCast<const HePhy> (GetPhyEntity (WIFI_MOD_CLASS_HE));
 }
 
 /**
@@ -96,33 +309,37 @@
   virtual ~TestDlOfdmaPhyTransmission ();
 
 private:
-  virtual void DoSetup (void);
-  virtual void DoRun (void);
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
+  void DoRun (void) override;
 
   /**
    * Receive success function for STA 1
    * \param psdu the PSDU
-   * \param snr the SNR
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
    * \param txVector the transmit vector
    * \param statusPerMpdu reception status per MPDU
    */
-  void RxSuccessSta1 (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+  void RxSuccessSta1 (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                      WifiTxVector txVector, std::vector<bool> statusPerMpdu);
   /**
    * Receive success function for STA 2
    * \param psdu the PSDU
-   * \param snr the SNR
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
    * \param txVector the transmit vector
    * \param statusPerMpdu reception status per MPDU
    */
-  void RxSuccessSta2 (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+  void RxSuccessSta2 (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                      WifiTxVector txVector, std::vector<bool> statusPerMpdu);
   /**
    * Receive success function for STA 3
    * \param psdu the PSDU
-   * \param snr the SNR
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
    * \param txVector the transmit vector
    * \param statusPerMpdu reception status per MPDU
    */
-  void RxSuccessSta3 (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+  void RxSuccessSta3 (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                      WifiTxVector txVector, std::vector<bool> statusPerMpdu);
 
   /**
    * Receive failure function for STA 1
@@ -260,7 +477,7 @@
 {
   NS_LOG_FUNCTION (this << rxStaId1 << rxStaId2);
   WifiConstPsduMap psdus;
-  WifiTxVector txVector = WifiTxVector (WifiPhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_MU, 800, 1, 1, 0, m_channelWidth, false, false);
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_MU, 800, 1, 1, 0, m_channelWidth, false, false);
   HeRu::RuType ruType = HeRu::RU_106_TONE;
   if (m_channelWidth == 20)
     {
@@ -283,20 +500,14 @@
       NS_ASSERT_MSG (false, "Unsupported channel width");
     }
   
-  HeRu::RuSpec ru1;
-  ru1.primary80MHz = true;
-  ru1.ruType = ruType;
-  ru1.index = 1;
+  HeRu::RuSpec ru1 (ruType, 1, true);
   txVector.SetRu (ru1, rxStaId1);
-  txVector.SetMode (WifiPhy::GetHeMcs7 (), rxStaId1);
+  txVector.SetMode (HePhy::GetHeMcs7 (), rxStaId1);
   txVector.SetNss (1, rxStaId1);
 
-  HeRu::RuSpec ru2;
-  ru2.primary80MHz = (m_channelWidth == 160) ? false : true;
-  ru2.ruType = ruType;
-  ru2.index = 2;
+  HeRu::RuSpec ru2 (ruType, (m_channelWidth == 160 ? 1 : 2), (m_channelWidth == 160 ? false : true));
   txVector.SetRu (ru2, rxStaId2);
-  txVector.SetMode (WifiPhy::GetHeMcs9 (), rxStaId2);
+  txVector.SetMode (HePhy::GetHeMcs9 (), rxStaId2);
   txVector.SetNss (1, rxStaId2);
 
   Ptr<Packet> pkt1 = Create<Packet> (1000);
@@ -337,33 +548,31 @@
 
 TestDlOfdmaPhyTransmission::~TestDlOfdmaPhyTransmission ()
 {
-  m_phyAp = 0;
-  m_phySta1 = 0;
-  m_phySta2 = 0;
-  m_phySta3 = 0;
-  m_phyInterferer = 0;
 }
 
 void
-TestDlOfdmaPhyTransmission::RxSuccessSta1 (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> /*statusPerMpdu*/)
+TestDlOfdmaPhyTransmission::RxSuccessSta1 (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                                           WifiTxVector txVector, std::vector<bool> /*statusPerMpdu*/)
 {
-  NS_LOG_FUNCTION (this << *psdu << snr << txVector);
+  NS_LOG_FUNCTION (this << *psdu << rxSignalInfo << txVector);
   m_countRxSuccessSta1++;
   m_countRxBytesSta1 += (psdu->GetSize () - 30);
 }
 
 void
-TestDlOfdmaPhyTransmission::RxSuccessSta2 (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> /*statusPerMpdu*/)
+TestDlOfdmaPhyTransmission::RxSuccessSta2 (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                                           WifiTxVector txVector, std::vector<bool> /*statusPerMpdu*/)
 {
-  NS_LOG_FUNCTION (this << *psdu << snr << txVector);
+  NS_LOG_FUNCTION (this << *psdu << rxSignalInfo << txVector);
   m_countRxSuccessSta2++;
   m_countRxBytesSta2 += (psdu->GetSize () - 30);
 }
 
 void
-TestDlOfdmaPhyTransmission::RxSuccessSta3 (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> /*statusPerMpdu*/)
+TestDlOfdmaPhyTransmission::RxSuccessSta3 (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                                           WifiTxVector txVector, std::vector<bool> /*statusPerMpdu*/)
 {
-  NS_LOG_FUNCTION (this << *psdu << snr << txVector);
+  NS_LOG_FUNCTION (this << *psdu << rxSignalInfo << txVector);
   m_countRxSuccessSta3++;
   m_countRxBytesSta3 += (psdu->GetSize () - 30);
 }
@@ -515,6 +724,21 @@
 }
 
 void
+TestDlOfdmaPhyTransmission::DoTeardown (void)
+{
+  m_phyAp->Dispose ();
+  m_phyAp = 0;
+  m_phySta1->Dispose ();
+  m_phySta1 = 0;
+  m_phySta2->Dispose ();
+  m_phySta2 = 0;
+  m_phySta3->Dispose ();
+  m_phySta3 = 0;
+  m_phyInterferer->Dispose ();
+  m_phyInterferer = 0;
+}
+
+void
 TestDlOfdmaPhyTransmission::RunOne (void)
 {
   RngSeedManager::SetSeed (1);
@@ -722,6 +946,2700 @@
   Simulator::Destroy ();
 }
 
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief UL-OFDMA PPDU UID attribution test
+ */
+class TestUlOfdmaPpduUid : public TestCase
+{
+public:
+  TestUlOfdmaPpduUid ();
+  virtual ~TestUlOfdmaPpduUid ();
+
+private:
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
+  void DoRun (void) override;
+
+  /**
+   * Transmitted PPDU information function for AP
+   * \param uid the UID of the transmitted PPDU
+   */
+  void TxPpduAp (uint64_t uid);
+  /**
+   * Transmitted PPDU information function for STA 1
+   * \param uid the UID of the transmitted PPDU
+   */
+  void TxPpduSta1 (uint64_t uid);
+  /**
+   * Transmitted PPDU information function for STA 2
+   * \param uid the UID of the transmitted PPDU
+   */
+  void TxPpduSta2 (uint64_t uid);
+  /**
+   * Reset the global PPDU UID counter in WifiPhy
+   */
+  void ResetPpduUid (void);
+
+  /**
+   * Send MU-PPDU toward both STAs.
+   */
+  void SendMuPpdu (void);
+  /**
+   * Send TB-PPDU from both STAs.
+   */
+  void SendTbPpdu (void);
+  /**
+   * Send SU-PPDU function
+   * \param txStaId the ID of the sending STA
+   */
+  void SendSuPpdu (uint16_t txStaId);
+
+  /**
+   * Check the UID of the transmitted PPDU
+   * \param staId the STA-ID of the PHY (0 for AP)
+   * \param expectedUid the expected UID
+   */
+  void CheckUid (uint16_t staId, uint64_t expectedUid);
+
+  Ptr<OfdmaSpectrumWifiPhy> m_phyAp;   ///< PHY of AP
+  Ptr<OfdmaSpectrumWifiPhy> m_phySta1; ///< PHY of STA 1
+  Ptr<OfdmaSpectrumWifiPhy> m_phySta2; ///< PHY of STA 2
+
+  uint64_t m_ppduUidAp; ///< UID of PPDU transmitted by AP
+  uint64_t m_ppduUidSta1; ///< UID of PPDU transmitted by STA1
+  uint64_t m_ppduUidSta2; ///< UID of PPDU transmitted by STA2
+};
+
+TestUlOfdmaPpduUid::TestUlOfdmaPpduUid ()
+  : TestCase ("UL-OFDMA PPDU UID attribution test"),
+    m_ppduUidAp (UINT64_MAX),
+    m_ppduUidSta1 (UINT64_MAX),
+    m_ppduUidSta2 (UINT64_MAX)
+{
+}
+
+TestUlOfdmaPpduUid::~TestUlOfdmaPpduUid ()
+{
+}
+
+void
+TestUlOfdmaPpduUid::DoSetup (void)
+{
+  Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel> ();
+  Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel> ();
+  lossModel->SetFrequency (DEFAULT_FREQUENCY);
+  spectrumChannel->AddPropagationLossModel (lossModel);
+  Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
+  spectrumChannel->SetPropagationDelayModel (delayModel);
+
+  Ptr<Node> apNode = CreateObject<Node> ();
+  Ptr<WifiNetDevice> apDev = CreateObject<WifiNetDevice> ();
+  m_phyAp = CreateObject<OfdmaSpectrumWifiPhy> (0);
+  m_phyAp->CreateWifiSpectrumPhyInterface (apDev);
+  m_phyAp->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
+  m_phyAp->SetErrorRateModel (error);
+  m_phyAp->SetFrequency (DEFAULT_FREQUENCY);
+  m_phyAp->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  m_phyAp->SetDevice (apDev);
+  m_phyAp->SetChannel (spectrumChannel);
+  m_phyAp->TraceConnectWithoutContext ("TxPpduUid", MakeCallback (&TestUlOfdmaPpduUid::TxPpduAp, this));
+  Ptr<ConstantPositionMobilityModel> apMobility = CreateObject<ConstantPositionMobilityModel> ();
+  m_phyAp->SetMobility (apMobility);
+  apDev->SetPhy (m_phyAp);
+  apNode->AggregateObject (apMobility);
+  apNode->AddDevice (apDev);
+
+  Ptr<Node> sta1Node = CreateObject<Node> ();
+  Ptr<WifiNetDevice> sta1Dev = CreateObject<WifiNetDevice> ();
+  m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy> (1);
+  m_phySta1->CreateWifiSpectrumPhyInterface (sta1Dev);
+  m_phySta1->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta1->SetErrorRateModel (error);
+  m_phySta1->SetFrequency (DEFAULT_FREQUENCY);
+  m_phySta1->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  m_phySta1->SetDevice (sta1Dev);
+  m_phySta1->SetChannel (spectrumChannel);
+  m_phySta1->TraceConnectWithoutContext ("TxPpduUid", MakeCallback (&TestUlOfdmaPpduUid::TxPpduSta1, this));
+  Ptr<ConstantPositionMobilityModel> sta1Mobility = CreateObject<ConstantPositionMobilityModel> ();
+  m_phySta1->SetMobility (sta1Mobility);
+  sta1Dev->SetPhy (m_phySta1);
+  sta1Node->AggregateObject (sta1Mobility);
+  sta1Node->AddDevice (sta1Dev);
+
+  Ptr<Node> sta2Node = CreateObject<Node> ();
+  Ptr<WifiNetDevice> sta2Dev = CreateObject<WifiNetDevice> ();
+  m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy> (2);
+  m_phySta2->CreateWifiSpectrumPhyInterface (sta2Dev);
+  m_phySta2->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta2->SetErrorRateModel (error);
+  m_phySta2->SetFrequency (DEFAULT_FREQUENCY);
+  m_phySta2->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  m_phySta2->SetDevice (sta2Dev);
+  m_phySta2->SetChannel (spectrumChannel);
+  m_phySta2->TraceConnectWithoutContext ("TxPpduUid", MakeCallback (&TestUlOfdmaPpduUid::TxPpduSta2, this));
+  Ptr<ConstantPositionMobilityModel> sta2Mobility = CreateObject<ConstantPositionMobilityModel> ();
+  m_phySta2->SetMobility (sta2Mobility);
+  sta2Dev->SetPhy (m_phySta2);
+  sta2Node->AggregateObject (sta2Mobility);
+  sta2Node->AddDevice (sta2Dev);
+}
+
+void
+TestUlOfdmaPpduUid::DoTeardown (void)
+{
+  m_phyAp->Dispose ();
+  m_phyAp = 0;
+  m_phySta1->Dispose ();
+  m_phySta1 = 0;
+  m_phySta2->Dispose ();
+  m_phySta2 = 0;
+}
+
+void
+TestUlOfdmaPpduUid::CheckUid (uint16_t staId, uint64_t expectedUid)
+{
+  uint64_t uid;
+  std::string device;
+  switch (staId)
+    {
+      case 0:
+        uid = m_ppduUidAp;
+        device = "AP";
+        break;
+      case 1:
+        uid = m_ppduUidSta1;
+        device = "STA1";
+        break;
+      case 2:
+        uid = m_ppduUidSta2;
+        device = "STA2";
+        break;
+      default:
+        NS_ABORT_MSG ("Unexpected STA-ID");
+    }
+  NS_TEST_ASSERT_MSG_EQ (uid, expectedUid, "UID " << uid << " does not match expected one " << expectedUid << " for " << device << " at " << Simulator::Now ());
+}
+
+void
+TestUlOfdmaPpduUid::TxPpduAp (uint64_t uid)
+{
+  NS_LOG_FUNCTION (this << uid);
+  m_ppduUidAp = uid;
+}
+
+void
+TestUlOfdmaPpduUid::TxPpduSta1 (uint64_t uid)
+{
+  NS_LOG_FUNCTION (this << uid);
+  m_ppduUidSta1 = uid;
+}
+
+void
+TestUlOfdmaPpduUid::TxPpduSta2 (uint64_t uid)
+{
+  NS_LOG_FUNCTION (this << uid);
+  m_ppduUidSta2 = uid;
+}
+
+void
+TestUlOfdmaPpduUid::ResetPpduUid (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_phyAp->SetPpduUid (0); //one is enough since it's a global attribute
+  return;
+}
+
+void
+TestUlOfdmaPpduUid::SendMuPpdu (void)
+{
+  WifiConstPsduMap psdus;
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_MU, 800, 1, 1, 0, DEFAULT_CHANNEL_WIDTH, false, false);
+
+  uint16_t rxStaId1 = 1;
+  HeRu::RuSpec ru1 (HeRu::RU_106_TONE, 1, false);
+  txVector.SetRu (ru1, rxStaId1);
+  txVector.SetMode (HePhy::GetHeMcs7 (), rxStaId1);
+  txVector.SetNss (1, rxStaId1);
+
+  uint16_t rxStaId2 = 2;
+  HeRu::RuSpec ru2 (HeRu::RU_106_TONE, 2, false);
+  txVector.SetRu (ru2, rxStaId2);
+  txVector.SetMode (HePhy::GetHeMcs9 (), rxStaId2);
+  txVector.SetNss (1, rxStaId2);
+
+  Ptr<Packet> pkt1 = Create<Packet> (1000);
+  WifiMacHeader hdr1;
+  hdr1.SetType (WIFI_MAC_QOSDATA);
+  hdr1.SetQosTid (0);
+  hdr1.SetAddr1 (Mac48Address ("00:00:00:00:00:01"));
+  hdr1.SetSequenceNumber (1);
+  Ptr<WifiPsdu> psdu1 = Create<WifiPsdu> (pkt1, hdr1);
+  psdus.insert (std::make_pair (rxStaId1, psdu1));
+
+  Ptr<Packet> pkt2 = Create<Packet> (1500);
+  WifiMacHeader hdr2;
+  hdr2.SetType (WIFI_MAC_QOSDATA);
+  hdr2.SetQosTid (0);
+  hdr2.SetAddr1 (Mac48Address ("00:00:00:00:00:02"));
+  hdr2.SetSequenceNumber (2);
+  Ptr<WifiPsdu> psdu2 = Create<WifiPsdu> (pkt2, hdr2);
+  psdus.insert (std::make_pair (rxStaId2, psdu2));
+
+  m_phyAp->Send (psdus, txVector);
+}
+
+void
+TestUlOfdmaPpduUid::SendTbPpdu (void)
+{
+  WifiConstPsduMap psdus1;
+  WifiConstPsduMap psdus2;
+  WifiTxVector txVector1 = WifiTxVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_TB, 800, 1, 1, 0, DEFAULT_CHANNEL_WIDTH, false, false);
+  WifiTxVector txVector2 = txVector1;
+
+  uint16_t rxStaId1 = 1;
+  HeRu::RuSpec ru1 (HeRu::RU_106_TONE, 1, false);
+  txVector1.SetRu (ru1, rxStaId1);
+  txVector1.SetMode (HePhy::GetHeMcs7 (), rxStaId1);
+  txVector1.SetNss (1, rxStaId1);
+
+  Ptr<Packet> pkt1 = Create<Packet> (1000);
+  WifiMacHeader hdr1;
+  hdr1.SetType (WIFI_MAC_QOSDATA);
+  hdr1.SetQosTid (0);
+  hdr1.SetAddr1 (Mac48Address ("00:00:00:00:00:00"));
+  hdr1.SetSequenceNumber (1);
+  Ptr<WifiPsdu> psdu1 = Create<WifiPsdu> (pkt1, hdr1);
+  psdus1.insert (std::make_pair (rxStaId1, psdu1));
+
+  uint16_t rxStaId2 = 2;
+  HeRu::RuSpec ru2 (HeRu::RU_106_TONE, 2, false);
+  txVector2.SetRu (ru2, rxStaId2);
+  txVector2.SetMode (HePhy::GetHeMcs9 (), rxStaId2);
+  txVector2.SetNss (1, rxStaId2);
+
+  Ptr<Packet> pkt2 = Create<Packet> (1500);
+  WifiMacHeader hdr2;
+  hdr2.SetType (WIFI_MAC_QOSDATA);
+  hdr2.SetQosTid (0);
+  hdr2.SetAddr1 (Mac48Address ("00:00:00:00:00:00"));
+  hdr2.SetSequenceNumber (2);
+  Ptr<WifiPsdu> psdu2 = Create<WifiPsdu> (pkt2, hdr2);
+  psdus2.insert (std::make_pair (rxStaId2, psdu2));
+
+  Time txDuration1 = m_phySta1->CalculateTxDuration (psdu1->GetSize (), txVector1,
+                                                     m_phySta1->GetPhyBand (), rxStaId1);
+  Time txDuration2 = m_phySta2->CalculateTxDuration (psdu2->GetSize (), txVector2,
+                                                     m_phySta1->GetPhyBand (), rxStaId2);
+  Time txDuration = std::max (txDuration1, txDuration2);
+
+  txVector1.SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration, m_phySta1->GetPhyBand ()));
+  txVector2.SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration, m_phySta2->GetPhyBand ()));
+
+  m_phySta1->Send (psdus1, txVector1);
+  m_phySta2->Send (psdus2, txVector2);
+}
+
+void
+TestUlOfdmaPpduUid::SendSuPpdu (uint16_t txStaId)
+{
+  WifiConstPsduMap psdus;
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, DEFAULT_CHANNEL_WIDTH, false, false);
+
+  Ptr<Packet> pkt = Create<Packet> (1000);
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_QOSDATA);
+  hdr.SetQosTid (0);
+  hdr.SetAddr1 (Mac48Address::GetBroadcast ());
+  hdr.SetSequenceNumber (1);
+  Ptr<WifiPsdu> psdu = Create<WifiPsdu> (pkt, hdr);
+  psdus.insert (std::make_pair (SU_STA_ID, psdu));
+
+  switch (txStaId)
+    {
+      case 0:
+        m_phyAp->Send (psdus, txVector);
+        break;
+      case 1:
+        m_phySta1->Send (psdus, txVector);
+        break;
+      case 2:
+        m_phySta2->Send (psdus, txVector);
+        break;
+      default:
+        NS_ABORT_MSG ("Unexpected STA-ID");
+    }
+}
+
+void
+TestUlOfdmaPpduUid::DoRun (void)
+{
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (1);
+  int64_t streamNumber = 0;
+  m_phyAp->AssignStreams (streamNumber);
+  m_phySta1->AssignStreams (streamNumber);
+  m_phySta2->AssignStreams (streamNumber);
+
+  //Reset PPDU UID so as not to be dependent on previously executed test cases,
+  //since global attribute will be changed).
+  ResetPpduUid ();
+
+  //Send HE MU PPDU with two PSDUs addressed to STA 1 and STA 2.
+  //PPDU UID should be equal to 0 (the first counter value).
+  Simulator::Schedule (Seconds (1.0), &TestUlOfdmaPpduUid::SendMuPpdu, this);
+  Simulator::Schedule (Seconds (1.0), &TestUlOfdmaPpduUid::CheckUid, this, 0, 0);
+
+  //Send HE SU PPDU from AP.
+  //PPDU UID should be incremented since this is a new PPDU.
+  Simulator::Schedule (Seconds (1.1), &TestUlOfdmaPpduUid::SendSuPpdu, this, 0);
+  Simulator::Schedule (Seconds (1.1), &TestUlOfdmaPpduUid::CheckUid, this, 0, 1);
+
+  //Send HE TB PPDU from STAs to AP.
+  //PPDU UID should NOT be incremented since HE TB PPDUs reuse the UID of the immediately
+  //preceding correctly received PPDU (which normally contains the trigger frame).
+  Simulator::Schedule (Seconds (1.15), &TestUlOfdmaPpduUid::SendTbPpdu, this);
+  Simulator::Schedule (Seconds (1.15), &TestUlOfdmaPpduUid::CheckUid, this, 1, 1);
+  Simulator::Schedule (Seconds (1.15), &TestUlOfdmaPpduUid::CheckUid, this, 2, 1);
+
+  //Send HE SU PPDU from STA1.
+  //PPDU UID should be incremented since this is a new PPDU.
+  Simulator::Schedule (Seconds (1.2), &TestUlOfdmaPpduUid::SendSuPpdu, this, 1);
+  Simulator::Schedule (Seconds (1.2), &TestUlOfdmaPpduUid::CheckUid, this, 1, 2);
+
+  Simulator::Run ();
+  Simulator::Destroy ();
+}
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief UL-OFDMA multiple RX events test
+ */
+class TestMultipleHeTbPreambles : public TestCase
+{
+public:
+  TestMultipleHeTbPreambles ();
+  virtual ~TestMultipleHeTbPreambles ();
+
+private:
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
+  void DoRun (void) override;
+
+  /**
+   * Receive HE TB PPDU function.
+   *
+   * \param uid the UID used to identify a set of HE TB PPDUs belonging to the same UL-MU transmission
+   * \param staId the STA ID
+   * \param txPowerWatts the TX power in watts
+   * \param payloadSize the size of the payload in bytes
+   */
+  void RxHeTbPpdu (uint64_t uid, uint16_t staId, double txPowerWatts, size_t payloadSize);
+
+  /**
+   * Receive OFDMA part of HE TB PPDU function.
+   * Immediately schedules DoRxHeTbPpduOfdmaPart.
+   *
+   * \param rxParamsOfdma the spectrum signal parameters to send for OFDMA part
+   */
+  void RxHeTbPpduOfdmaPart (Ptr<WifiSpectrumSignalParameters> rxParamsOfdma);
+  /**
+   * Receive OFDMA part of HE TB PPDU function.
+   * Actual reception call.
+   *
+   * \param rxParamsOfdma the spectrum signal parameters to send for OFDMA part
+   */
+  void DoRxHeTbPpduOfdmaPart (Ptr<WifiSpectrumSignalParameters> rxParamsOfdma);
+
+  /**
+   * RX dropped function
+   * \param p the packet
+   * \param reason the reason
+   */
+  void RxDropped (Ptr<const Packet> p, WifiPhyRxfailureReason reason);
+
+  /**
+   * Reset function
+   */
+  void Reset (void);
+
+  /**
+   * Check the received HE TB preambles
+   * \param nEvents the number of events created by the PHY
+   * \param uids the vector of expected UIDs
+   */
+  void CheckHeTbPreambles (size_t nEvents, std::vector <uint64_t> uids);
+
+  /**
+   * Check the number of bytes dropped
+   * \param expectedBytesDropped the expected number of bytes dropped
+   */
+  void CheckBytesDropped (size_t expectedBytesDropped);
+
+  Ptr<OfdmaSpectrumWifiPhy> m_phy; ///< Phy
+
+  uint64_t m_totalBytesDropped; ///< total number of dropped bytes
+};
+
+TestMultipleHeTbPreambles::TestMultipleHeTbPreambles ()
+  : TestCase ("UL-OFDMA multiple RX events test"),
+    m_totalBytesDropped (0)
+{
+}
+
+TestMultipleHeTbPreambles::~TestMultipleHeTbPreambles ()
+{
+}
+
+void
+TestMultipleHeTbPreambles::Reset (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_totalBytesDropped = 0;
+  //We have to reset PHY here since we do not trigger OFDMA payload RX event in this test
+  m_phy->Reset ();
+}
+
+void
+TestMultipleHeTbPreambles::RxDropped (Ptr<const Packet> p, WifiPhyRxfailureReason reason)
+{
+  NS_LOG_FUNCTION (this << p << reason);
+  m_totalBytesDropped += (p->GetSize () - 30);
+}
+
+void
+TestMultipleHeTbPreambles::CheckHeTbPreambles (size_t nEvents, std::vector <uint64_t> uids)
+{
+  auto events = m_phy->GetCurrentPreambleEvents ();
+  NS_TEST_ASSERT_MSG_EQ (events.size (), nEvents, "The number of UL MU events is not correct!");
+  for (auto const& uid : uids)
+    {
+      auto pair = std::make_pair (uid, WIFI_PREAMBLE_HE_TB);
+      auto it = events.find (pair);
+      bool found = (it != events.end ());
+      NS_TEST_ASSERT_MSG_EQ (found, true, "HE TB PPDU with UID " << uid << " has not been received!");
+    }
+}
+
+void
+TestMultipleHeTbPreambles::CheckBytesDropped (size_t expectedBytesDropped)
+{
+  NS_TEST_ASSERT_MSG_EQ (m_totalBytesDropped, expectedBytesDropped, "The number of dropped bytes is not correct!");
+}
+
+void
+TestMultipleHeTbPreambles::RxHeTbPpdu (uint64_t uid, uint16_t staId, double txPowerWatts, size_t payloadSize)
+{
+  WifiConstPsduMap psdus;
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_TB, 800, 1, 1, 0, DEFAULT_CHANNEL_WIDTH, false, false);
+
+  HeRu::RuSpec ru (HeRu::RU_106_TONE, staId, false);
+  ru.SetPhyIndex (DEFAULT_CHANNEL_WIDTH, 0);
+  txVector.SetRu (ru, staId);
+  txVector.SetMode (HePhy::GetHeMcs7 (), staId);
+  txVector.SetNss (1, staId);
+
+  Ptr<Packet> pkt = Create<Packet> (payloadSize);
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_QOSDATA);
+  hdr.SetQosTid (0);
+  hdr.SetAddr1 (Mac48Address ("00:00:00:00:00:00"));
+  hdr.SetSequenceNumber (1);
+  Ptr<WifiPsdu> psdu = Create<WifiPsdu> (pkt, hdr);
+  psdus.insert (std::make_pair (staId, psdu));
+
+  Time ppduDuration = m_phy->CalculateTxDuration (psdu->GetSize (), txVector, m_phy->GetPhyBand (), staId);
+  Ptr<HePpdu> ppdu = Create<HePpdu> (psdus, txVector, ppduDuration, WIFI_PHY_BAND_5GHZ, uid,
+                                     HePpdu::PSD_HE_TB_NON_OFDMA_PORTION);
+
+  //Send non-OFDMA part
+  Time nonOfdmaDuration = m_phy->GetHePhy ()->CalculateNonOfdmaDurationForHeTb (txVector);
+  uint32_t centerFrequency = m_phy->GetHePhy ()->GetCenterFrequencyForNonOfdmaPart (txVector, staId);
+  uint16_t ruWidth = HeRu::GetBandwidth (txVector.GetRu (staId).GetRuType ());
+  uint16_t channelWidth = ruWidth < 20 ? 20 : ruWidth;
+  Ptr<SpectrumValue> rxPsd = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (centerFrequency, channelWidth, txPowerWatts, m_phy->GetGuardBandwidth (channelWidth));
+  Ptr<WifiSpectrumSignalParameters> rxParams = Create<WifiSpectrumSignalParameters> ();
+  rxParams->psd = rxPsd;
+  rxParams->txPhy = 0;
+  rxParams->duration = nonOfdmaDuration;
+  rxParams->ppdu = ppdu;
+
+  m_phy->StartRx (rxParams);
+
+  //Schedule OFDMA part
+  Ptr<HePpdu> ppduOfdma = DynamicCast<HePpdu> (ppdu->Copy ()); //since flag will be modified
+  ppduOfdma->SetTxPsdFlag (HePpdu::PSD_HE_TB_OFDMA_PORTION);
+  WifiSpectrumBand band = m_phy->GetHePhy ()->GetRuBandForRx (txVector, staId);
+  Ptr<SpectrumValue> rxPsdOfdma = WifiSpectrumValueHelper::CreateHeMuOfdmTxPowerSpectralDensity (DEFAULT_FREQUENCY, DEFAULT_CHANNEL_WIDTH, txPowerWatts, DEFAULT_GUARD_WIDTH, band);
+  Ptr<WifiSpectrumSignalParameters> rxParamsOfdma = Create<WifiSpectrumSignalParameters> ();
+  rxParamsOfdma->psd = rxPsd;
+  rxParamsOfdma->txPhy = 0;
+  rxParamsOfdma->duration = ppduDuration - nonOfdmaDuration;
+  rxParamsOfdma->ppdu = ppduOfdma;
+  Simulator::Schedule (nonOfdmaDuration, &TestMultipleHeTbPreambles::RxHeTbPpduOfdmaPart, this, rxParamsOfdma);
+}
+
+void
+TestMultipleHeTbPreambles::RxHeTbPpduOfdmaPart (Ptr<WifiSpectrumSignalParameters> rxParamsOfdma)
+{
+  Simulator::ScheduleNow (&TestMultipleHeTbPreambles::DoRxHeTbPpduOfdmaPart, this, rxParamsOfdma);
+}
+
+void
+TestMultipleHeTbPreambles::DoRxHeTbPpduOfdmaPart (Ptr<WifiSpectrumSignalParameters> rxParamsOfdma)
+{
+  //This is needed to make sure the OFDMA part is started as the last event since HE-SIG-A should end at the exact same time as the start
+  //For normal WifiNetDevices, this the reception of the OFDMA part is scheduled after end of HE-SIG-A decoding.
+  m_phy->StartRx (rxParamsOfdma);
+}
+
+void
+TestMultipleHeTbPreambles::DoSetup (void)
+{
+  Ptr<WifiNetDevice> dev = CreateObject<WifiNetDevice> ();
+  m_phy = CreateObject<OfdmaSpectrumWifiPhy> (0);
+  m_phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
+  Ptr<ApWifiMac> mac = CreateObject<ApWifiMac> ();
+  mac->SetAttribute ("BeaconGeneration", BooleanValue (false));
+  dev->SetMac (mac);
+  m_phy->SetErrorRateModel (error);
+  m_phy->SetChannelNumber (DEFAULT_CHANNEL_NUMBER);
+  m_phy->SetFrequency (DEFAULT_FREQUENCY);
+  m_phy->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  m_phy->TraceConnectWithoutContext ("PhyRxDrop", MakeCallback (&TestMultipleHeTbPreambles::RxDropped, this));
+  m_phy->SetDevice (dev);
+  Ptr<ThresholdPreambleDetectionModel> preambleDetectionModel = CreateObject<ThresholdPreambleDetectionModel> ();
+  preambleDetectionModel->SetAttribute ("Threshold", DoubleValue (4));
+  preambleDetectionModel->SetAttribute ("MinimumRssi", DoubleValue (-82));
+  m_phy->SetPreambleDetectionModel (preambleDetectionModel);
+}
+
+void
+TestMultipleHeTbPreambles::DoTeardown (void)
+{
+  m_phy->Dispose ();
+  m_phy = 0;
+}
+
+void
+TestMultipleHeTbPreambles::DoRun (void)
+{
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (1);
+  int64_t streamNumber = 0;
+  m_phy->AssignStreams (streamNumber);
+
+  double txPowerWatts = 0.01;
+
+  {
+    //Verify a single UL MU transmission with two stations belonging to the same BSS
+    std::vector<uint64_t> uids {0};
+    Simulator::Schedule (Seconds (1), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 1, txPowerWatts, 1001);
+    Simulator::Schedule (Seconds (1) + NanoSeconds (100), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 2, txPowerWatts, 1002);
+    //Check that we received a single UL MU transmission with the corresponding UID
+    Simulator::Schedule (Seconds (1.0) + MicroSeconds (1), &TestMultipleHeTbPreambles::CheckHeTbPreambles, this, 1, uids);
+    Simulator::Schedule (Seconds (1.5), &TestMultipleHeTbPreambles::Reset, this);
+  }
+
+  {
+    //Verify the correct reception of 2 UL MU transmissions with two stations per BSS, where the second transmission
+    //arrives during the preamble detection window and with half the power of the first transmission.
+    std::vector<uint64_t> uids {1, 2};
+    Simulator::Schedule (Seconds (2), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 1, txPowerWatts, 1001);
+    Simulator::Schedule (Seconds (2) + NanoSeconds (100), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 2, txPowerWatts, 1002);
+    Simulator::Schedule (Seconds (2) + NanoSeconds (200), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[1], 1, txPowerWatts / 2, 1003);
+    Simulator::Schedule (Seconds (2) + NanoSeconds (300), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[1], 2, txPowerWatts / 2, 1004);
+    //Check that we received the correct reception of 2 UL MU transmissions with the corresponding UIDs
+    Simulator::Schedule (Seconds (2.0) + MicroSeconds (1), &TestMultipleHeTbPreambles::CheckHeTbPreambles, this, 2, uids);
+    Simulator::Schedule (Seconds (2.5), &TestMultipleHeTbPreambles::Reset, this);
+    //TODO: verify PPDUs from second UL MU transmission are dropped
+  }
+
+  {
+    //Verify the correct reception of 2 UL MU transmissions with two stations per BSS, where the second transmission
+    //arrives during the preamble detection window and with twice the power of the first transmission.
+    std::vector<uint64_t> uids {3, 4};
+    Simulator::Schedule (Seconds (3), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 1, txPowerWatts / 2, 1001);
+    Simulator::Schedule (Seconds (3) + NanoSeconds (100), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 2, txPowerWatts / 2, 1002);
+    Simulator::Schedule (Seconds (3) + NanoSeconds (200), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[1], 1, txPowerWatts, 1003);
+    Simulator::Schedule (Seconds (3) + NanoSeconds (300), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[1], 2, txPowerWatts, 1004);
+    //Check that we received the correct reception of 2 UL MU transmissions with the corresponding UIDs
+    Simulator::Schedule (Seconds (3.0) + MicroSeconds (1), &TestMultipleHeTbPreambles::CheckHeTbPreambles, this, 2, uids);
+    Simulator::Schedule (Seconds (3.5), &TestMultipleHeTbPreambles::Reset, this);
+    //TODO: verify PPDUs from first UL MU transmission are dropped
+  }
+
+  {
+    //Verify the correct reception of 2 UL MU transmissions with two stations per BSS, where the second transmission
+    //arrives during PHY header reception and with the same power as the first transmission.
+    std::vector<uint64_t> uids {5, 6};
+    Simulator::Schedule (Seconds (4), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 1, txPowerWatts, 1001);
+    Simulator::Schedule (Seconds (4) + NanoSeconds (100), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 2, txPowerWatts, 1002);
+    Simulator::Schedule (Seconds (4) + MicroSeconds (5), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[1], 1, txPowerWatts, 1003);
+    Simulator::Schedule (Seconds (4) + MicroSeconds (5) + NanoSeconds (100), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[1], 2, txPowerWatts, 1004);
+    //Check that we received the correct reception of the first UL MU transmission with the corresponding UID (second one dropped)
+    Simulator::Schedule (Seconds (4.0) + MicroSeconds (10), &TestMultipleHeTbPreambles::CheckHeTbPreambles, this, 1, std::vector<uint64_t> {uids[0]});
+    //The packets of the second UL MU transmission should have been dropped
+    Simulator::Schedule (Seconds (4.0) + MicroSeconds (10), &TestMultipleHeTbPreambles::CheckBytesDropped, this, 1003 + 1004);
+    Simulator::Schedule (Seconds (4.5), &TestMultipleHeTbPreambles::Reset, this);
+  }
+
+  {
+    //Verify the correct reception of one UL MU transmission out of 2 with two stations per BSS, where the second transmission
+    //arrives during payload reception and with the same power as the first transmission.
+    std::vector<uint64_t> uids {7, 8};
+    Simulator::Schedule (Seconds (5), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 1, txPowerWatts, 1001);
+    Simulator::Schedule (Seconds (5) + NanoSeconds (100), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 2, txPowerWatts, 1002);
+    Simulator::Schedule (Seconds (5) + MicroSeconds (50), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[1], 1, txPowerWatts, 1003);
+    Simulator::Schedule (Seconds (5) + MicroSeconds (50) + NanoSeconds (100), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[1], 2, txPowerWatts, 1004);
+    //Check that we received the correct reception of the first UL MU transmission with the corresponding UID (second one dropped)
+    Simulator::Schedule (Seconds (5.0) + MicroSeconds (100), &TestMultipleHeTbPreambles::CheckHeTbPreambles, this, 1, std::vector<uint64_t> {uids[0]});
+    //The packets of the second UL MU transmission should have been dropped
+    Simulator::Schedule (Seconds (5.0) + MicroSeconds (100), &TestMultipleHeTbPreambles::CheckBytesDropped, this, 1003 + 1004);
+    Simulator::Schedule (Seconds (5.5), &TestMultipleHeTbPreambles::Reset, this);
+  }
+
+  {
+    //Verify the correct reception of a single UL MU transmission with two stations belonging to the same BSS,
+    //and the second PPDU arrives 500ns after the first PPDU, i.e. it exceeds the delay spread of 400ns
+    std::vector<uint64_t> uids {9};
+    Simulator::Schedule (Seconds (6), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 1, txPowerWatts, 1001);
+    Simulator::Schedule (Seconds (6) + NanoSeconds (500), &TestMultipleHeTbPreambles::RxHeTbPpdu, this, uids[0], 2, txPowerWatts, 1002);
+    //Check that we received a single UL MU transmission with the corresponding UID
+    Simulator::Schedule (Seconds (6.0) + MicroSeconds (1), &TestMultipleHeTbPreambles::CheckHeTbPreambles, this, 1, uids);
+    //The first packet of 1001 bytes should be dropped because preamble is not detected after 4us (because the PPDU that arrived at 500ns is interfering):
+    //the second HE TB PPDU is acting as interference since it arrived after the maximum allowed 400ns.
+    //Obviously, that second packet of 1002 bytes is dropped as well.
+    Simulator::Schedule (Seconds (6.0) + MicroSeconds (5), &TestMultipleHeTbPreambles::CheckBytesDropped, this, 1001 + 1002);
+    Simulator::Schedule (Seconds (6.5), &TestMultipleHeTbPreambles::Reset, this);
+  }
+
+  Simulator::Run ();
+  Simulator::Destroy ();
+}
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief UL-OFDMA PHY test
+ */
+class TestUlOfdmaPhyTransmission : public TestCase
+{
+public:
+  TestUlOfdmaPhyTransmission ();
+  virtual ~TestUlOfdmaPhyTransmission ();
+
+private:
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
+  void DoRun (void) override;
+
+  /**
+   * Get TXVECTOR for HE TB PPDU.
+   * \param txStaId the ID of the TX STA
+   * \param index the RU index used for the transmission
+   * \param bssColor the BSS color of the TX STA
+   * \return the TXVECTOR for HE TB PPDU
+   */
+  WifiTxVector GetTxVectorForHeTbPpdu (uint16_t txStaId, std::size_t index, uint8_t bssColor) const;
+  /**
+   * Send HE TB PPDU function
+   * \param txStaId the ID of the TX STA
+   * \param index the RU index used for the transmission
+   * \param payloadSize the size of the payload in bytes
+   * \param uid the UID of the trigger frame that is initiating this transmission
+   * \param bssColor the BSS color of the TX STA
+   */
+  void SendHeTbPpdu (uint16_t txStaId, std::size_t index, std::size_t payloadSize, uint64_t uid, uint8_t bssColor);
+
+  /**
+   * Send HE SU PPDU function
+   * \param txStaId the ID of the TX STA
+   * \param payloadSize the size of the payload in bytes
+   * \param uid the UID of the trigger frame that is initiating this transmission
+   * \param bssColor the BSS color of the TX STA
+   */
+  void SendHeSuPpdu (uint16_t txStaId, std::size_t payloadSize, uint64_t uid, uint8_t bssColor);
+
+  /**
+   * Set the BSS color
+   * \param phy the PHY
+   * \param bssColor the BSS color
+   */
+  void SetBssColor (Ptr<WifiPhy> phy, uint8_t bssColor);
+
+  /**
+   * Set the PSD limit
+   * \param phy the PHY
+   * \param psdLimit the PSD limit in dBm/MHz
+   */
+  void SetPsdLimit (Ptr<WifiPhy> phy, double psdLimit);
+
+  /**
+   * Generate interference function
+   * \param interferencePsd the PSD of the interference to be generated
+   * \param duration the duration of the interference
+   */
+  void GenerateInterference (Ptr<SpectrumValue> interferencePsd, Time duration);
+  /**
+   * Stop interference function
+   */
+  void StopInterference (void);
+
+  /**
+   * Run one function
+   */
+  void RunOne ();
+
+  /**
+   * Check the received PSDUs from STA1
+   * \param expectedSuccess the expected number of success
+   * \param expectedFailures the expected number of failures
+   * \param expectedBytes the expected number of bytes
+   */
+  void CheckRxFromSta1 (uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes);
+
+  /**
+   * Check the received PSDUs from STA2
+   * \param expectedSuccess the expected number of success
+   * \param expectedFailures the expected number of failures
+   * \param expectedBytes the expected number of bytes
+   */
+  void CheckRxFromSta2 (uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes);
+
+  /**
+   * Check the received power for the non-OFDMA of the HE TB PPDUs over the given band
+   * \param phy the PHY
+   * \param band the WifiSpectrumBand over which the power is measured
+   * \param expectedRxPower the expected received power in W
+   */
+  void CheckNonOfdmaRxPower (Ptr<OfdmaSpectrumWifiPhy> phy, WifiSpectrumBand band, double expectedRxPower);
+  /**
+   * Check the received power for the OFDMA part of the HE TB PPDUs over the given band
+   * \param phy the PHY
+   * \param band the WifiSpectrumBand over which the power is measured
+   * \param expectedRxPower the expected received power in W
+   */
+  void CheckOfdmaRxPower (Ptr<OfdmaSpectrumWifiPhy> phy, WifiSpectrumBand band, double expectedRxPower);
+
+  /**
+   * Verify all events are cleared at end of TX or RX
+   */
+  void VerifyEventsCleared (void);
+
+  /**
+   * Check the PHY state
+   * \param phy the PHY
+   * \param expectedState the expected state of the PHY
+   */
+  void CheckPhyState (Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState);
+  /// \copydoc CheckPhyState
+  void DoCheckPhyState (Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState);
+
+  /**
+   * Reset function
+   */
+  void Reset ();
+
+  /**
+   * Receive success function
+   * \param psdu the PSDU
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+   * \param txVector the transmit vector
+   * \param statusPerMpdu reception status per MPDU
+   */
+  void RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+
+  /**
+   * Receive failure function
+   * \param psdu the PSDU
+   */
+  void RxFailure (Ptr<WifiPsdu> psdu);
+
+  /**
+   * Schedule test to perform.
+   * The interference generation should be scheduled apart.
+   *
+   * \param delay the reference delay to schedule the events
+   * \param solicited flag indicating if HE TB PPDUs were solicited by the AP
+   * \param expectedStateAtEnd the expected state of the PHY at the end of the reception
+   * \param expectedSuccessFromSta1 the expected number of success from STA 1
+   * \param expectedFailuresFromSta1 the expected number of failures from STA 1
+   * \param expectedBytesFromSta1 the expected number of bytes from STA 1
+   * \param expectedSuccessFromSta2 the expected number of success from STA 2
+   * \param expectedFailuresFromSta2 the expected number of failures from STA 2
+   * \param expectedBytesFromSta2 the expected number of bytes from STA 2
+   * \param scheduleTxSta1 flag indicating to schedule a HE TB PPDU from STA 1
+   * \param expectedStateBeforeEnd the expected state of the PHY before the end of the transmission
+   */
+  void ScheduleTest (Time delay, bool solicited, WifiPhyState expectedStateAtEnd,
+                     uint32_t expectedSuccessFromSta1, uint32_t expectedFailuresFromSta1, uint32_t expectedBytesFromSta1,
+                     uint32_t expectedSuccessFromSta2, uint32_t expectedFailuresFromSta2, uint32_t expectedBytesFromSta2,
+                     bool scheduleTxSta1 = true, WifiPhyState expectedStateBeforeEnd = WifiPhyState::RX);
+
+  /**
+   * Schedule power measurement related checks.
+   *
+   * \param delay the reference delay used to schedule the events
+   * \param rxPowerNonOfdmaRu1 the received power (in watts) on the non-OFDMA part of RU1
+   * \param rxPowerNonOfdmaRu2 the received power (in watts) on the non-OFDMA part of RU2
+   * \param rxPowerOfdmaRu1 the received power (in watts) on RU1
+   * \param rxPowerOfdmaRu2 the received power (in watts) on RU2
+   */
+  void SchedulePowerMeasurementChecks (Time delay, double rxPowerNonOfdmaRu1, double rxPowerNonOfdmaRu2,
+                                       double rxPowerOfdmaRu1, double rxPowerOfdmaRu2);
+  /**
+   * Log scenario description
+   *
+   * \param log the scenario description to add to log
+   */
+  void LogScenario (std::string log) const;
+
+  Ptr<OfdmaSpectrumWifiPhy> m_phyAp;   ///< PHY of AP
+  Ptr<OfdmaSpectrumWifiPhy> m_phySta1; ///< PHY of STA 1
+  Ptr<OfdmaSpectrumWifiPhy> m_phySta2; ///< PHY of STA 2
+  Ptr<OfdmaSpectrumWifiPhy> m_phySta3; ///< PHY of STA 3
+
+  Ptr<WaveformGenerator> m_phyInterferer; ///< PHY of interferer
+
+  uint32_t m_countRxSuccessFromSta1; ///< count RX success from STA 1
+  uint32_t m_countRxSuccessFromSta2; ///< count RX success from STA 2
+  uint32_t m_countRxFailureFromSta1; ///< count RX failure from STA 1
+  uint32_t m_countRxFailureFromSta2; ///< count RX failure from STA 2
+  uint32_t m_countRxBytesFromSta1;   ///< count RX bytes from STA 1
+  uint32_t m_countRxBytesFromSta2;   ///< count RX bytes from STA 2
+
+  uint16_t m_frequency;        ///< frequency in MHz
+  uint16_t m_channelWidth;     ///< channel width in MHz
+  Time m_expectedPpduDuration; ///< expected duration to send MU PPDU
+};
+
+TestUlOfdmaPhyTransmission::TestUlOfdmaPhyTransmission ()
+  : TestCase ("UL-OFDMA PHY test"),
+    m_countRxSuccessFromSta1 (0),
+    m_countRxSuccessFromSta2 (0),
+    m_countRxFailureFromSta1 (0),
+    m_countRxFailureFromSta2 (0),
+    m_countRxBytesFromSta1 (0),
+    m_countRxBytesFromSta2 (0),
+    m_frequency (DEFAULT_FREQUENCY),
+    m_channelWidth (DEFAULT_CHANNEL_WIDTH),
+    m_expectedPpduDuration (NanoSeconds (271200))
+{
+}
+
+void
+TestUlOfdmaPhyTransmission::SendHeSuPpdu (uint16_t txStaId, std::size_t payloadSize, uint64_t uid, uint8_t bssColor)
+{
+  NS_LOG_FUNCTION (this << txStaId << payloadSize << uid << +bssColor);
+  WifiConstPsduMap psdus;
+
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, m_channelWidth, false, false, false, bssColor);
+
+  Ptr<Packet> pkt = Create<Packet> (payloadSize);
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_QOSDATA);
+  hdr.SetQosTid (0);
+  hdr.SetAddr1 (Mac48Address ("00:00:00:00:00:00"));
+  std::ostringstream addr;
+  addr << "00:00:00:00:00:0" << txStaId;
+  hdr.SetAddr2 (Mac48Address (addr.str ().c_str ()));
+  hdr.SetSequenceNumber (1);
+  Ptr<WifiPsdu> psdu = Create<WifiPsdu> (pkt, hdr);
+  psdus.insert (std::make_pair (SU_STA_ID, psdu));
+
+  Ptr<OfdmaSpectrumWifiPhy> phy;
+  if (txStaId == 1)
+    {
+      phy = m_phySta1;
+    }
+  else if (txStaId == 2)
+    {
+      phy = m_phySta2;
+    }
+  else if (txStaId == 3)
+    {
+      phy = m_phySta3;
+    }
+  else if (txStaId == 0)
+    {
+      phy = m_phyAp;
+    }
+  phy->SetPpduUid (uid);
+  phy->Send (psdus, txVector);
+}
+
+WifiTxVector
+TestUlOfdmaPhyTransmission::GetTxVectorForHeTbPpdu (uint16_t txStaId, std::size_t index, uint8_t bssColor) const
+{
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_TB, 800, 1, 1, 0, m_channelWidth, false, false, false, bssColor);
+
+  HeRu::RuType ruType = HeRu::RU_106_TONE;
+  if (m_channelWidth == 20)
+    {
+      ruType = HeRu::RU_106_TONE;
+    }
+  else if (m_channelWidth == 40)
+    {
+      ruType = HeRu::RU_242_TONE;
+    }
+  else if (m_channelWidth == 80)
+    {
+      ruType = HeRu::RU_484_TONE;
+    }
+  else if (m_channelWidth == 160)
+    {
+      ruType = HeRu::RU_996_TONE;
+    }
+  else
+    {
+      NS_ASSERT_MSG (false, "Unsupported channel width");
+    }
+
+  bool primary80MHz = true;
+  if (m_channelWidth == 160 && index == 2)
+    {
+      primary80MHz = false;
+      index = 1;
+    }
+  HeRu::RuSpec ru (ruType, index, primary80MHz);
+  ru.SetPhyIndex (m_channelWidth, 0);
+  txVector.SetRu (ru, txStaId);
+  txVector.SetMode (HePhy::GetHeMcs7 (), txStaId);
+  txVector.SetNss (1, txStaId);
+  return txVector;
+}
+
+void
+TestUlOfdmaPhyTransmission::SendHeTbPpdu (uint16_t txStaId, std::size_t index, std::size_t payloadSize, uint64_t uid, uint8_t bssColor)
+{
+  NS_LOG_FUNCTION (this << txStaId << index << payloadSize << uid << +bssColor);
+  WifiConstPsduMap psdus;
+
+  WifiTxVector txVector = GetTxVectorForHeTbPpdu (txStaId, index, bssColor);
+  Ptr<Packet> pkt = Create<Packet> (payloadSize);
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_QOSDATA);
+  hdr.SetQosTid (0);
+  hdr.SetAddr1 (Mac48Address ("00:00:00:00:00:00"));
+  std::ostringstream addr;
+  addr << "00:00:00:00:00:0" << txStaId;
+  hdr.SetAddr2 (Mac48Address (addr.str ().c_str ()));
+  hdr.SetSequenceNumber (1);
+  Ptr<WifiPsdu> psdu = Create<WifiPsdu> (pkt, hdr);
+  psdus.insert (std::make_pair (txStaId, psdu));
+
+  Ptr<OfdmaSpectrumWifiPhy> phy;
+  if (txStaId == 1)
+    {
+      phy = m_phySta1;
+    }
+  else if (txStaId == 2)
+    {
+      phy = m_phySta2;
+    }
+  else if (txStaId == 3)
+    {
+      phy = m_phySta3;
+    }
+
+  Time txDuration = phy->CalculateTxDuration (psdu->GetSize (), txVector, phy->GetPhyBand (), txStaId);
+  txVector.SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration, phy->GetPhyBand ()));
+
+  phy->SetPpduUid (uid);
+  phy->Send (psdus, txVector);
+}
+
+void
+TestUlOfdmaPhyTransmission::GenerateInterference (Ptr<SpectrumValue> interferencePsd, Time duration)
+{
+  NS_LOG_FUNCTION (this << duration);
+  m_phyInterferer->SetTxPowerSpectralDensity (interferencePsd);
+  m_phyInterferer->SetPeriod (duration);
+  m_phyInterferer->Start ();
+  Simulator::Schedule (duration, &TestUlOfdmaPhyTransmission::StopInterference, this);
+}
+
+void
+TestUlOfdmaPhyTransmission::StopInterference (void)
+{
+  m_phyInterferer->Stop();
+}
+
+TestUlOfdmaPhyTransmission::~TestUlOfdmaPhyTransmission ()
+{
+}
+
+void
+TestUlOfdmaPhyTransmission::RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector<bool> /*statusPerMpdu*/)
+{
+  NS_LOG_FUNCTION (this << *psdu << psdu->GetAddr2 () << rxSignalInfo << txVector);
+  if (psdu->GetAddr2 () == Mac48Address ("00:00:00:00:00:01"))
+    {
+      m_countRxSuccessFromSta1++;
+      m_countRxBytesFromSta1 += (psdu->GetSize () - 30);
+    }
+  else if (psdu->GetAddr2 () == Mac48Address ("00:00:00:00:00:02"))
+    {
+      m_countRxSuccessFromSta2++;
+      m_countRxBytesFromSta2 += (psdu->GetSize () - 30);
+    }
+}
+
+void
+TestUlOfdmaPhyTransmission::RxFailure (Ptr<WifiPsdu> psdu)
+{
+  NS_LOG_FUNCTION (this << *psdu << psdu->GetAddr2 ());
+  if (psdu->GetAddr2 () == Mac48Address ("00:00:00:00:00:01"))
+    {
+      m_countRxFailureFromSta1++;
+    }
+  else if (psdu->GetAddr2 () == Mac48Address ("00:00:00:00:00:02"))
+    {
+      m_countRxFailureFromSta2++;
+    }
+}
+
+void
+TestUlOfdmaPhyTransmission::CheckRxFromSta1 (uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes)
+{
+  NS_TEST_ASSERT_MSG_EQ (m_countRxSuccessFromSta1, expectedSuccess, "The number of successfully received packets from STA 1 is not correct!");
+  NS_TEST_ASSERT_MSG_EQ (m_countRxFailureFromSta1, expectedFailures, "The number of unsuccessfully received packets from STA 1 is not correct!");
+  NS_TEST_ASSERT_MSG_EQ (m_countRxBytesFromSta1, expectedBytes, "The number of bytes received from STA 1 is not correct!");
+}
+
+void
+TestUlOfdmaPhyTransmission::CheckRxFromSta2 (uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes)
+{
+  NS_TEST_ASSERT_MSG_EQ (m_countRxSuccessFromSta2, expectedSuccess, "The number of successfully received packets from STA 2 is not correct!");
+  NS_TEST_ASSERT_MSG_EQ (m_countRxFailureFromSta2, expectedFailures, "The number of unsuccessfully received packets from STA 2 is not correct!");
+  NS_TEST_ASSERT_MSG_EQ (m_countRxBytesFromSta2, expectedBytes, "The number of bytes received from STA 2 is not correct!");
+}
+
+void
+TestUlOfdmaPhyTransmission::CheckNonOfdmaRxPower (Ptr<OfdmaSpectrumWifiPhy> phy, WifiSpectrumBand band, double expectedRxPower)
+{
+  Ptr<Event> event = phy->GetCurrentEvent ();
+  NS_ASSERT (event);
+  double rxPower = event->GetRxPowerW (band);
+  NS_LOG_FUNCTION (this << band.first << band.second << expectedRxPower << rxPower);
+  //Since there is out of band emission due to spectrum mask, the tolerance cannot be very low
+  NS_TEST_ASSERT_MSG_EQ_TOL (rxPower, expectedRxPower, 5e-3, "RX power " << rxPower << " over (" << band.first << ", " << band.second << ") does not match expected power " << expectedRxPower << " at " << Simulator::Now ());
+}
+
+void
+TestUlOfdmaPhyTransmission::CheckOfdmaRxPower (Ptr<OfdmaSpectrumWifiPhy> phy, WifiSpectrumBand band, double expectedRxPower)
+{
+  /**
+   * The current event cannot be used since it points to the preamble part of the HE TB PPDU.
+   * We will have to check if the expected power is indeed the max power returning a positive
+   * duration when calling GetEnergyDuration.
+   */
+  NS_LOG_FUNCTION (this << band.first << band.second << expectedRxPower);
+  double step = 5e-3;
+  if (expectedRxPower > 0.0)
+    {
+      NS_TEST_ASSERT_MSG_EQ (phy->GetEnergyDuration (expectedRxPower - step, band).IsStrictlyPositive (), true,
+                             "At least " << expectedRxPower << " W expected for OFDMA part over (" << band.first << ", " << band.second << ") at " << Simulator::Now ());
+      NS_TEST_ASSERT_MSG_EQ (phy->GetEnergyDuration (expectedRxPower + step, band).IsStrictlyPositive (), false,
+                             "At most " << expectedRxPower << " W expected for OFDMA part over (" << band.first << ", " << band.second << ") at " << Simulator::Now ());
+    }
+  else
+    {
+      NS_TEST_ASSERT_MSG_EQ (phy->GetEnergyDuration (expectedRxPower + step, band).IsStrictlyPositive (), false,
+                             "At most " << expectedRxPower << " W expected for OFDMA part over (" << band.first << ", " << band.second << ") at " << Simulator::Now ());
+    }
+}
+
+void
+TestUlOfdmaPhyTransmission::VerifyEventsCleared (void)
+{
+  NS_TEST_ASSERT_MSG_EQ (m_phyAp->GetCurrentEvent (), 0, "m_currentEvent for AP was not cleared");
+  NS_TEST_ASSERT_MSG_EQ (m_phySta1->GetCurrentEvent (), 0, "m_currentEvent for STA 1 was not cleared");
+  NS_TEST_ASSERT_MSG_EQ (m_phySta2->GetCurrentEvent (), 0, "m_currentEvent for STA 2 was not cleared");
+}
+
+void
+TestUlOfdmaPhyTransmission::CheckPhyState (Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState)
+{
+  //This is needed to make sure PHY state will be checked as the last event if a state change occurred at the exact same time as the check
+  Simulator::ScheduleNow (&TestUlOfdmaPhyTransmission::DoCheckPhyState, this, phy, expectedState);
+}
+
+void
+TestUlOfdmaPhyTransmission::DoCheckPhyState (Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState)
+{
+  WifiPhyState currentState;
+  PointerValue ptr;
+  phy->GetAttribute ("State", ptr);
+  Ptr <WifiPhyStateHelper> state = DynamicCast <WifiPhyStateHelper> (ptr.Get<WifiPhyStateHelper> ());
+  currentState = state->GetState ();
+  NS_LOG_FUNCTION (this << currentState);
+  NS_TEST_ASSERT_MSG_EQ (currentState, expectedState, "PHY State " << currentState << " does not match expected state " << expectedState << " at " << Simulator::Now ());
+}
+
+void
+TestUlOfdmaPhyTransmission::Reset (void)
+{
+  m_countRxSuccessFromSta1 = 0;
+  m_countRxSuccessFromSta2 = 0;
+  m_countRxFailureFromSta1 = 0;
+  m_countRxFailureFromSta2 = 0;
+  m_countRxBytesFromSta1 = 0;
+  m_countRxBytesFromSta2 = 0;
+  m_phySta1->SetPpduUid (0);
+  m_phySta1->SetTriggerFrameUid (0);
+  m_phySta2->SetTriggerFrameUid (0);
+  SetBssColor (m_phyAp, 0);
+}
+
+void
+TestUlOfdmaPhyTransmission::SetBssColor (Ptr<WifiPhy> phy, uint8_t bssColor)
+{
+  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (phy->GetDevice ());
+  Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
+  heConfiguration->SetAttribute ("BssColor", UintegerValue (bssColor));
+}
+
+void
+TestUlOfdmaPhyTransmission::SetPsdLimit (Ptr<WifiPhy> phy, double psdLimit)
+{
+  NS_LOG_FUNCTION (this << phy << psdLimit);
+  phy->SetAttribute ("PowerDensityLimit", DoubleValue (psdLimit));
+}
+
+void
+TestUlOfdmaPhyTransmission::DoSetup (void)
+{
+  Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel> ();
+  Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel> ();
+  lossModel->SetFrequency (m_frequency);
+  spectrumChannel->AddPropagationLossModel (lossModel);
+  Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
+  spectrumChannel->SetPropagationDelayModel (delayModel);
+  
+  Ptr<ThresholdPreambleDetectionModel> preambleDetectionModel = CreateObject<ThresholdPreambleDetectionModel> ();
+  preambleDetectionModel->SetAttribute ("MinimumRssi", DoubleValue (-8)); //to ensure that transmission in neighboring channel is ignored (16 dBm baseline)
+  preambleDetectionModel->SetAttribute ("Threshold", DoubleValue (-100)); //no limit on SNR
+
+  Ptr<Node> apNode = CreateObject<Node> ();
+  Ptr<WifiNetDevice> apDev = CreateObject<WifiNetDevice> ();
+  Ptr<ApWifiMac> apMac = CreateObject<ApWifiMac> ();
+  apMac->SetAttribute ("BeaconGeneration", BooleanValue (false));
+  apDev->SetMac (apMac);
+  m_phyAp = CreateObject<OfdmaSpectrumWifiPhy> (0);
+  m_phyAp->CreateWifiSpectrumPhyInterface (apDev);
+  m_phyAp->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  Ptr<HeConfiguration> heConfiguration = CreateObject<HeConfiguration> ();
+  apDev->SetHeConfiguration (heConfiguration);
+  Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
+  m_phyAp->SetErrorRateModel (error);
+  m_phyAp->SetDevice (apDev);
+  m_phyAp->SetChannel (spectrumChannel);
+  m_phyAp->SetReceiveOkCallback (MakeCallback (&TestUlOfdmaPhyTransmission::RxSuccess, this));
+  m_phyAp->SetReceiveErrorCallback (MakeCallback (&TestUlOfdmaPhyTransmission::RxFailure, this));
+  m_phyAp->SetPreambleDetectionModel (preambleDetectionModel);
+  Ptr<ConstantPositionMobilityModel> apMobility = CreateObject<ConstantPositionMobilityModel> ();
+  m_phyAp->SetMobility (apMobility);
+  apDev->SetPhy (m_phyAp);
+  apNode->AggregateObject (apMobility);
+  apNode->AddDevice (apDev);
+
+  Ptr<Node> sta1Node = CreateObject<Node> ();
+  Ptr<WifiNetDevice> sta1Dev = CreateObject<WifiNetDevice> ();
+  m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy> (1);
+  m_phySta1->CreateWifiSpectrumPhyInterface (sta1Dev);
+  m_phySta1->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta1->SetErrorRateModel (error);
+  m_phySta1->SetDevice (sta1Dev);
+  m_phySta1->SetChannel (spectrumChannel);
+  m_phySta1->SetPreambleDetectionModel (preambleDetectionModel);
+  Ptr<ConstantPositionMobilityModel> sta1Mobility = CreateObject<ConstantPositionMobilityModel> ();
+  m_phySta1->SetMobility (sta1Mobility);
+  sta1Dev->SetPhy (m_phySta1);
+  sta1Node->AggregateObject (sta1Mobility);
+  sta1Node->AddDevice (sta1Dev);
+
+  Ptr<Node> sta2Node = CreateObject<Node> ();
+  Ptr<WifiNetDevice> sta2Dev = CreateObject<WifiNetDevice> ();
+  m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy> (2);
+  m_phySta2->CreateWifiSpectrumPhyInterface (sta2Dev);
+  m_phySta2->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta2->SetErrorRateModel (error);
+  m_phySta2->SetDevice (sta2Dev);
+  m_phySta2->SetChannel (spectrumChannel);
+  m_phySta2->SetPreambleDetectionModel (preambleDetectionModel);
+  Ptr<ConstantPositionMobilityModel> sta2Mobility = CreateObject<ConstantPositionMobilityModel> ();
+  m_phySta2->SetMobility (sta2Mobility);
+  sta2Dev->SetPhy (m_phySta2);
+  sta2Node->AggregateObject (sta2Mobility);
+  sta2Node->AddDevice (sta2Dev);
+
+  Ptr<Node> sta3Node = CreateObject<Node> ();
+  Ptr<WifiNetDevice> sta3Dev = CreateObject<WifiNetDevice> ();
+  m_phySta3 = CreateObject<OfdmaSpectrumWifiPhy> (3);
+  m_phySta3->CreateWifiSpectrumPhyInterface (sta3Dev);
+  m_phySta3->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta3->SetErrorRateModel (error);
+  m_phySta3->SetDevice (sta3Dev);
+  m_phySta3->SetChannel (spectrumChannel);
+  m_phySta3->SetPreambleDetectionModel (preambleDetectionModel);
+  Ptr<ConstantPositionMobilityModel> sta3Mobility = CreateObject<ConstantPositionMobilityModel> ();
+  m_phySta3->SetMobility (sta3Mobility);
+  sta3Dev->SetPhy (m_phySta3);
+  sta3Node->AggregateObject (sta3Mobility);
+  sta3Node->AddDevice (sta3Dev);
+
+  Ptr<Node> interfererNode = CreateObject<Node> ();
+  Ptr<NonCommunicatingNetDevice> interfererDev = CreateObject<NonCommunicatingNetDevice> ();
+  m_phyInterferer = CreateObject<WaveformGenerator> ();
+  m_phyInterferer->SetDevice (interfererDev);
+  m_phyInterferer->SetChannel (spectrumChannel);
+  m_phyInterferer->SetDutyCycle (1);
+  interfererNode->AddDevice (interfererDev);
+
+  //Configure power attributes of all wifi devices
+  std::list<Ptr<WifiPhy>> phys {m_phyAp, m_phySta1, m_phySta2, m_phySta3};
+  for (auto & phy : phys)
+    {
+      phy->SetAttribute ("TxGain", DoubleValue (1.0));
+      phy->SetAttribute ("TxPowerStart", DoubleValue (16.0));
+      phy->SetAttribute ("TxPowerEnd", DoubleValue (16.0));
+      phy->SetAttribute ("PowerDensityLimit", DoubleValue (100.0)); //no impact by default
+      phy->SetAttribute ("RxGain", DoubleValue (2.0));
+    }
+}
+
+void
+TestUlOfdmaPhyTransmission::DoTeardown (void)
+{
+  m_phyAp->Dispose ();
+  m_phyAp = 0;
+  m_phySta1->Dispose ();
+  m_phySta1 = 0;
+  m_phySta2->Dispose ();
+  m_phySta2 = 0;
+  m_phySta3->Dispose ();
+  m_phySta3 = 0;
+  m_phyInterferer->Dispose ();
+  m_phyInterferer = 0;
+}
+
+void
+TestUlOfdmaPhyTransmission::LogScenario (std::string log) const
+{
+  NS_LOG_INFO (log);
+}
+
+void
+TestUlOfdmaPhyTransmission::ScheduleTest (Time delay, bool solicited, WifiPhyState expectedStateAtEnd,
+                                          uint32_t expectedSuccessFromSta1, uint32_t expectedFailuresFromSta1, uint32_t expectedBytesFromSta1,
+                                          uint32_t expectedSuccessFromSta2, uint32_t expectedFailuresFromSta2, uint32_t expectedBytesFromSta2,
+                                          bool scheduleTxSta1, WifiPhyState expectedStateBeforeEnd)
+{
+  //AP send SU packet with UID = 0 (2) to mimic transmission of solicited (unsolicited) HE TB PPDUs
+  Simulator::Schedule (delay - MilliSeconds (10), &TestUlOfdmaPhyTransmission::SendHeSuPpdu, this, 0, 50, solicited ? 0 : 2, 0);
+  //STA1 and STA2 send MU UL PPDUs addressed to AP
+  if (scheduleTxSta1)
+    {
+      Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::SendHeTbPpdu, this, 1, 1, 1000, 0, 0);
+    }
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::SendHeTbPpdu, this, 2, 2, 1001, 0, 0);
+
+  //Verify it takes m_expectedPpduDuration to transmit the PPDUs
+  Simulator::Schedule (delay + m_expectedPpduDuration - NanoSeconds (1), &TestUlOfdmaPhyTransmission::CheckPhyState, this, m_phyAp, expectedStateBeforeEnd);
+  Simulator::Schedule (delay + m_expectedPpduDuration, &TestUlOfdmaPhyTransmission::CheckPhyState, this, m_phyAp, expectedStateAtEnd);
+  //TODO: add checks on TX stop for STAs
+
+  delay += MilliSeconds (100);
+  //Check reception state from STA 1
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::CheckRxFromSta1, this,
+                       expectedSuccessFromSta1, expectedFailuresFromSta1, expectedBytesFromSta1);
+  //Check reception state from STA 2
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::CheckRxFromSta2, this,
+                       expectedSuccessFromSta2, expectedFailuresFromSta2, expectedBytesFromSta2);
+  //Verify events data have been cleared
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::VerifyEventsCleared, this);
+
+  delay += MilliSeconds (100);
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::Reset, this);
+}
+
+void
+TestUlOfdmaPhyTransmission::SchedulePowerMeasurementChecks (Time delay, double rxPowerNonOfdmaRu1, double rxPowerNonOfdmaRu2,
+                                                            double rxPowerOfdmaRu1, double rxPowerOfdmaRu2)
+{
+  Time detectionDuration = WifiPhy::GetPreambleDetectionDuration ();
+  WifiTxVector txVectorSta1 = GetTxVectorForHeTbPpdu (1, 1, 0);
+  WifiTxVector txVectorSta2 = GetTxVectorForHeTbPpdu (2, 2, 0);
+  Ptr<const HePhy> hePhy = m_phyAp->GetHePhy ();
+  Time nonOfdmaDuration = hePhy->CalculateNonOfdmaDurationForHeTb (txVectorSta2);
+  NS_ASSERT (nonOfdmaDuration == hePhy->CalculateNonOfdmaDurationForHeTb (txVectorSta1));
+
+  std::vector<double> rxPowerNonOfdma { rxPowerNonOfdmaRu1, rxPowerNonOfdmaRu2 };
+  std::vector<WifiSpectrumBand> nonOfdmaBand { hePhy->GetNonOfdmaBand (txVectorSta1, 1), hePhy->GetNonOfdmaBand (txVectorSta2, 2) };
+  std::vector<double> rxPowerOfdma { rxPowerOfdmaRu1, rxPowerOfdmaRu2 };
+  std::vector<WifiSpectrumBand> ofdmaBand { hePhy->GetRuBandForRx (txVectorSta1, 1), hePhy->GetRuBandForRx (txVectorSta2, 2) };
+
+  for (uint8_t i = 0; i < 2; ++i)
+    {
+      /**
+       * Perform checks at AP
+       */
+      //Check received power on non-OFDMA portion
+      Simulator::Schedule (delay + detectionDuration + NanoSeconds (1), //just after beginning of portion (once event is stored)
+                           &TestUlOfdmaPhyTransmission::CheckNonOfdmaRxPower, this, m_phyAp,
+                           nonOfdmaBand[i], rxPowerNonOfdma[i]);
+      Simulator::Schedule (delay + nonOfdmaDuration - NanoSeconds (1), //just before end of portion
+                           &TestUlOfdmaPhyTransmission::CheckNonOfdmaRxPower, this, m_phyAp,
+                           nonOfdmaBand[i], rxPowerNonOfdma[i]);
+      //Check received power on OFDMA portion
+      Simulator::Schedule (delay + nonOfdmaDuration + NanoSeconds (1), //just after beginning of portion
+                           &TestUlOfdmaPhyTransmission::CheckOfdmaRxPower, this, m_phyAp,
+                           ofdmaBand[i], rxPowerOfdma[i]);
+      Simulator::Schedule (delay + m_expectedPpduDuration - NanoSeconds (1), //just before end of portion
+                           &TestUlOfdmaPhyTransmission::CheckOfdmaRxPower, this, m_phyAp,
+                           ofdmaBand[i], rxPowerOfdma[i]);
+
+      /**
+       * Perform checks for non-transmitting STA (STA 3).
+       * Cannot use CheckNonOfdmaRxPower method since current event may be reset if
+       * preamble not detected (e.g. not on primary).
+       */
+      //Check received power on non-OFDMA portion
+      Simulator::Schedule (delay + detectionDuration + NanoSeconds (1), //just after beginning of portion (once event is stored)
+                           &TestUlOfdmaPhyTransmission::CheckOfdmaRxPower, this, m_phySta3,
+                           nonOfdmaBand[i], rxPowerNonOfdma[i]);
+      Simulator::Schedule (delay + nonOfdmaDuration - NanoSeconds (1), //just before end of portion
+                           &TestUlOfdmaPhyTransmission::CheckOfdmaRxPower, this, m_phySta3,
+                           nonOfdmaBand[i], rxPowerNonOfdma[i]);
+      //Check received power on OFDMA portion
+      Simulator::Schedule (delay + nonOfdmaDuration + NanoSeconds (1), //just after beginning of portion
+                           &TestUlOfdmaPhyTransmission::CheckOfdmaRxPower, this, m_phySta3,
+                           ofdmaBand[i], rxPowerOfdma[i]);
+      Simulator::Schedule (delay + m_expectedPpduDuration - NanoSeconds (1), //just before end of portion
+                           &TestUlOfdmaPhyTransmission::CheckOfdmaRxPower, this, m_phySta3,
+                           ofdmaBand[i], rxPowerOfdma[i]);
+    }
+
+  if (rxPowerOfdmaRu1 != 0.0)
+    {
+      /**
+       * Perform checks for transmitting STA (STA 2) to ensure it has correctly logged
+       * power received from other transmitting STA (STA 1).
+       * Cannot use CheckNonOfdmaRxPower method since current event not set.
+       */
+      double rxPowerNonOfdmaSta1Only = (m_channelWidth >= 40) ? rxPowerNonOfdma[0] : rxPowerNonOfdma[0] / 2; //both STAs transmit over the same 20 MHz channel
+      //Check received power on non-OFDMA portion
+      Simulator::Schedule (delay + detectionDuration + NanoSeconds (1), //just after beginning of portion (once event is stored)
+                           &TestUlOfdmaPhyTransmission::CheckOfdmaRxPower, this, m_phySta2,
+                           nonOfdmaBand[0], rxPowerNonOfdmaSta1Only);
+      Simulator::Schedule (delay + nonOfdmaDuration - NanoSeconds (1), //just before end of portion
+                           &TestUlOfdmaPhyTransmission::CheckOfdmaRxPower, this, m_phySta2,
+                           nonOfdmaBand[0], rxPowerNonOfdmaSta1Only);
+      //Check received power on OFDMA portion
+      Simulator::Schedule (delay + nonOfdmaDuration + NanoSeconds (1), //just after beginning of portion
+                           &TestUlOfdmaPhyTransmission::CheckOfdmaRxPower, this, m_phySta2,
+                           ofdmaBand[0], rxPowerOfdma[0]);
+      Simulator::Schedule (delay + m_expectedPpduDuration - NanoSeconds (1), //just before end of portion
+                           &TestUlOfdmaPhyTransmission::CheckOfdmaRxPower, this, m_phySta2,
+                           ofdmaBand[0], rxPowerOfdma[0]);
+    }
+}
+
+void
+TestUlOfdmaPhyTransmission::RunOne (void)
+{
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (1);
+  int64_t streamNumber = 0;
+  m_phyAp->AssignStreams (streamNumber);
+  m_phySta1->AssignStreams (streamNumber);
+  m_phySta2->AssignStreams (streamNumber);
+  m_phySta3->AssignStreams (streamNumber);
+
+  m_phyAp->SetFrequency (m_frequency);
+  m_phyAp->SetChannelWidth (m_channelWidth);
+
+  m_phySta1->SetFrequency (m_frequency);
+  m_phySta1->SetChannelWidth (m_channelWidth);
+
+  m_phySta2->SetFrequency (m_frequency);
+  m_phySta2->SetChannelWidth (m_channelWidth);
+
+  m_phySta3->SetFrequency (m_frequency);
+  m_phySta3->SetChannelWidth (m_channelWidth);
+
+  Time delay = Seconds (0.0);
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::Reset, this);
+  delay += Seconds (1.0);
+
+  /**
+   * In all the following tests, 2 HE TB PPDUs of the same UL MU transmission
+   * are sent on RU 1 for STA 1 and RU 2 for STA 2.
+   * The difference between solicited and unsolicited lies in that their PPDU
+   * ID correspond to the one of the immediately preceding HE SU PPDU (thus
+   * mimicing trigger frame reception).
+   */
+
+  //---------------------------------------------------------------------------
+  //Verify that both solicited HE TB PPDUs have been corrected received
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of solicited HE TB PPDUs");
+  ScheduleTest (delay, true,
+                WifiPhyState::IDLE,
+                1, 0, 1000,  //One PSDU of 1000 bytes should have been successfully received from STA 1
+                1, 0, 1001); //One PSDU of 1001 bytes should have been successfully received from STA 2
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Verify that both unsolicited HE TB PPDUs have been corrected received
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of unsolicited HE TB PPDUs");
+  ScheduleTest (delay, false,
+                WifiPhyState::IDLE,
+                1, 0, 1000,  //One PSDU of 1000 bytes should have been successfully received from STA 1
+                1, 0, 1001); //One PSDU of 1001 bytes should have been successfully received from STA 2
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Generate an interference on RU 1 and verify that only STA 1's solicited HE TB PPDU has been impacted
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of solicited HE TB PPDUs with interference on RU 1 during PSDU reception");
+  //A strong non-wifi interference is generated on RU 1 during PSDU reception
+  BandInfo bandInfo;
+  bandInfo.fc = (m_frequency - (m_channelWidth / 4)) * 1e6;
+  bandInfo.fl = bandInfo.fc - ((m_channelWidth / 4) * 1e6);
+  bandInfo.fh = bandInfo.fc + ((m_channelWidth / 4) * 1e6);
+  Bands bands;
+  bands.push_back (bandInfo);
+
+  Ptr<SpectrumModel> SpectrumInterferenceRu1 = Create<SpectrumModel> (bands);
+  Ptr<SpectrumValue> interferencePsdRu1 = Create<SpectrumValue> (SpectrumInterferenceRu1);
+  double interferencePower = 0.1; //watts
+  *interferencePsdRu1 = interferencePower / ((m_channelWidth / 2) * 20e6);
+
+  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::GenerateInterference, this, interferencePsdRu1, MilliSeconds (100));
+  ScheduleTest (delay, true,
+                WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE due to the interference
+                0, 1, 0,     //Reception of the PSDU from STA 1 should have failed (since interference occupies RU 1)
+                1, 0, 1001); //One PSDU of 1001 bytes should have been successfully received from STA 2
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Generate an interference on RU 1 and verify that only STA 1's unsolicited HE TB PPDU has been impacted
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of unsolicited HE TB PPDUs with interference on RU 1 during PSDU reception");
+  //A strong non-wifi interference is generated on RU 1 during PSDU reception
+  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::GenerateInterference, this, interferencePsdRu1, MilliSeconds (100));
+  ScheduleTest (delay, false,
+                WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE due to the interference (primary channel)
+                0, 1, 0,     //Reception of the PSDU from STA 1 should have failed (since interference occupies RU 1)
+                1, 0, 1001); //One PSDU of 1001 bytes should have been successfully received from STA 2
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Generate an interference on RU 2 and verify that only STA 2's solicited HE TB PPDU has been impacted
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of solicited HE TB PPDUs with interference on RU 2 during PSDU reception");
+  //A strong non-wifi interference is generated on RU 2 during PSDU reception
+  bandInfo.fc = (m_frequency + (m_channelWidth / 4)) * 1e6;
+  bandInfo.fl = bandInfo.fc - ((m_channelWidth / 4) * 1e6);
+  bandInfo.fh = bandInfo.fc + ((m_channelWidth / 4) * 1e6);
+  bands.clear ();
+  bands.push_back (bandInfo);
+
+  Ptr<SpectrumModel> SpectrumInterferenceRu2 = Create<SpectrumModel> (bands);
+  Ptr<SpectrumValue> interferencePsdRu2 = Create<SpectrumValue> (SpectrumInterferenceRu2);
+  *interferencePsdRu2 = interferencePower / ((m_channelWidth / 2) * 20e6);
+
+  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::GenerateInterference, this, interferencePsdRu2, MilliSeconds (100));
+  ScheduleTest (delay, true,
+                WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY since measurement channel encompasses total channel width
+                1, 0, 1000, //One PSDU of 1000 bytes should have been successfully received from STA 1
+                0, 1, 0);   //Reception of the PSDU from STA 2 should have failed (since interference occupies RU 2)
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Generate an interference on RU 2 and verify that only STA 2's unsolicited HE TB PPDU has been impacted
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of unsolicited HE TB PPDUs with interference on RU 2 during PSDU reception");
+  //A strong non-wifi interference is generated on RU 2 during PSDU reception
+  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::GenerateInterference, this, interferencePsdRu2, MilliSeconds (100));
+  ScheduleTest (delay, false,
+                (m_channelWidth >= 40) ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE if interference on primary channel
+                1, 0, 1000, //One PSDU of 1000 bytes should have been successfully received from STA 1
+                0, 1, 0);   //Reception of the PSDU from STA 2 should have failed (since interference occupies RU 2)
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Generate an interference on the full band and verify that both solicited HE TB PPDUs have been impacted
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of solicited HE TB PPDUs with interference on the full band during PSDU reception");
+  //A strong non-wifi interference is generated on the full band during PSDU reception
+  bandInfo.fc = m_frequency * 1e6;
+  bandInfo.fl = bandInfo.fc - ((m_channelWidth / 2) * 1e6);
+  bandInfo.fh = bandInfo.fc + ((m_channelWidth / 2) * 1e6);
+  bands.clear ();
+  bands.push_back (bandInfo);
+
+  Ptr<SpectrumModel> SpectrumInterferenceAll = Create<SpectrumModel> (bands);
+  Ptr<SpectrumValue> interferencePsdAll = Create<SpectrumValue> (SpectrumInterferenceAll);
+  *interferencePsdAll = interferencePower / (m_channelWidth * 20e6);
+
+  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::GenerateInterference, this, interferencePsdAll, MilliSeconds (100));
+  ScheduleTest (delay, true,
+                WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE due to the interference
+                0, 1, 0,  //Reception of the PSDU from STA 1 should have failed (since interference occupies RU 1)
+                0, 1, 0); //Reception of the PSDU from STA 2 should have failed (since interference occupies RU 2)
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Generate an interference on the full band and verify that both unsolicited HE TB PPDUs have been impacted
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of unsolicited HE TB PPDUs with interference on the full band during PSDU reception");
+  //A strong non-wifi interference is generated on the full band during PSDU reception
+  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::GenerateInterference, this, interferencePsdAll, MilliSeconds (100));
+  ScheduleTest (delay, false,
+                WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE due to the interference
+                0, 1, 0,  //Reception of the PSDU from STA 1 should have failed (since interference occupies RU 1)
+                0, 1, 0); //Reception of the PSDU from STA 2 should have failed (since interference occupies RU 2)
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Send another HE TB PPDU (of another UL MU transmission) on RU 1 and verify that both solicited HE TB PPDUs have been impacted if they are on the same
+  // 20 MHz channel. Only STA 1's solicited HE TB PPDU is impacted otherwise.
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of solicited HE TB PPDUs with another HE TB PPDU arriving on RU 1 during PSDU reception");
+  //Another HE TB PPDU arrives at AP on the same RU as STA 1 during PSDU reception
+  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::SendHeTbPpdu, this, 3, 1, 1002, 1, 0);
+  //Expected figures from STA 2
+  uint32_t succ, fail, bytes;
+  if (m_channelWidth > 20)
+    {
+      //One PSDU of 1001 bytes should have been successfully received from STA 2 (since interference from STA 3 on distinct 20 MHz channel)
+      succ = 1;
+      fail = 0;
+      bytes = 1001;
+    }
+  else
+    {
+      //Reception of the PSDU from STA 2 should have failed (since interference from STA 3 on same 20 MHz channel)
+      succ = 0;
+      fail = 1;
+      bytes = 0;
+    }
+  ScheduleTest (delay, true,
+                WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE due to the interference on measurement channel width
+                0, 1, 0,  //Reception of the PSDU from STA 1 should have failed (since interference from STA 3 on same 20 MHz channel)
+                succ, fail, bytes);
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Send another HE TB PPDU (of another UL MU transmission) on RU 1 and verify that both unsolicited HE TB PPDUs have been impacted if they are on the same
+  // 20 MHz channel. Only STA 1's unsolicited HE TB PPDU is impacted otherwise.
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of unsolicited HE TB PPDUs with another HE TB PPDU arriving on RU 1 during PSDU reception");
+  //Another HE TB PPDU arrives at AP on the same RU as STA 1 during PSDU reception
+  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::SendHeTbPpdu, this, 3, 1, 1002, 1, 0);
+  ScheduleTest (delay, false,
+                WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE due to the interference on primary channel width
+                0, 1, 0,  //Reception of the PSDU from STA 1 should have failed (since interference from STA 3 on same 20 MHz channel)
+                succ, fail, bytes); //same as solicited case
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Send another HE TB PPDU (of another UL MU transmission) on RU 2 and verify that both solicited HE TB PPDUs have been impacted if they are on the same
+  // 20 MHz channel. Only STA 2's solicited HE TB PPDU is impacted otherwise.
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of solicited HE TB PPDUs with another HE TB PPDU arriving on RU 2 during PSDU reception");
+  //Another HE TB PPDU arrives at AP on the same RU as STA 2 during PSDU reception
+  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::SendHeTbPpdu, this, 3, 2, 1002, 1, 0);
+  //Expected figures from STA 1
+  if (m_channelWidth > 20)
+    {
+      //One PSDU of 1000 bytes should have been successfully received from STA 1 (since interference from STA 3 on distinct 20 MHz channel)
+      succ = 1;
+      fail = 0;
+      bytes = 1000;
+    }
+  else
+    {
+      //Reception of the PSDU from STA 1 should have failed (since interference from STA 3 on same 20 MHz channel)
+      succ = 0;
+      fail = 1;
+      bytes = 0;
+    }
+  ScheduleTest (delay, true,
+                WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE due to the interference on measurement channel width
+                succ, fail, bytes,
+                0, 1, 0); //Reception of the PSDU from STA 2 should have failed (since interference from STA 3 on same 20 MHz channel)
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Send another HE TB PPDU (of another UL MU transmission) on RU 2 and verify that both unsolicited HE TB PPDUs have been impacted if they are on the same
+  // 20 MHz channel. Only STA 2's unsolicited HE TB PPDU is impacted otherwise.
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of unsolicited HE TB PPDUs with another HE TB PPDU arriving on RU2 during payload reception");
+  //Another HE TB PPDU arrives at AP on the same RU as STA 2 during PSDU reception
+  Simulator::Schedule (delay + MicroSeconds (50), &TestUlOfdmaPhyTransmission::SendHeTbPpdu, this, 3, 2, 1002, 1, 0);
+  ScheduleTest (delay, false,
+                (m_channelWidth >= 40) ? WifiPhyState::IDLE : WifiPhyState::CCA_BUSY, //PHY should move to CCA_BUSY instead of IDLE if interference on primary channel
+                succ, fail, bytes, //same as solicited case
+                0, 1, 0); //Reception of the PSDU from STA 2 should have failed (since interference from STA 3 on same 20 MHz channel)
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Send an HE SU PPDU during 400 ns window and verify that both solicited HE TB PPDUs have been impacted
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of solicited HE TB PPDUs with an HE SU PPDU arriving during the 400 ns window");
+  //One HE SU arrives at AP during the 400ns window
+  Simulator::Schedule (delay + NanoSeconds (300), &TestUlOfdmaPhyTransmission::SendHeSuPpdu, this, 3, 1002, 1, 0);
+  ScheduleTest (delay, true,
+                WifiPhyState::IDLE,
+                0, 1, 0,  //Reception of the PSDU from STA 1 should have failed (since interference from STA 3)
+                0, 1, 0); //Reception of the PSDU from STA 2 should have failed (since interference from STA 3)
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Send an HE SU PPDU during 400 ns window and verify that both solicited HE TB PPDUs have been impacted
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of unsolicited HE TB PPDUs with an HE SU PPDU arriving during the 400 ns window");
+  //One HE SU arrives at AP during the 400ns window
+  Simulator::Schedule (delay + NanoSeconds (300), &TestUlOfdmaPhyTransmission::SendHeSuPpdu, this, 3, 1002, 1, 0);
+  ScheduleTest (delay, false,
+                WifiPhyState::IDLE,
+                0, 1, 0,  //Reception of the PSDU from STA 1 should have failed failed (since interference from STA 3)
+                0, 1, 0); //Reception of the PSDU from STA 2 should have failed failed (since interference from STA 3)
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Only send a solicited HE TB PPDU from STA 2 on RU 2 and verify that it has been correctly received
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of solicited HE TB PPDU only on RU 2");
+  //Check that STA3 will correctly set its state to RX if in measurement channel or IDLE otherwise
+  Simulator::Schedule (delay + m_expectedPpduDuration - NanoSeconds (1), &TestUlOfdmaPhyTransmission::CheckPhyState, this, m_phySta3,
+                       (m_channelWidth >= 40) ? WifiPhyState::IDLE : WifiPhyState::RX); //PHY should move to RX instead of IDLE if HE TB PPDU on primary channel;
+  ScheduleTest (delay, true,
+                WifiPhyState::IDLE,
+                0, 0, 0,    //No transmission scheduled for STA 1
+                1, 0, 1001, //One PSDU of 1001 bytes should have been successfully received from STA 2
+                false, WifiPhyState::RX); //Measurement channel is total channel width
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Only send an unsolicited HE TB PPDU from STA 2 on RU 2 and verify that it has been correctly received if it's in the
+  // correct measurement channel
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of unsolicited HE TB PPDUs only on RU 2");
+  //Check that STA3 will correctly set its state to RX if in measurement channel or IDLE otherwise
+  Simulator::Schedule (delay + m_expectedPpduDuration - NanoSeconds (1), &TestUlOfdmaPhyTransmission::CheckPhyState, this, m_phySta3,
+                       (m_channelWidth >= 40) ? WifiPhyState::IDLE : WifiPhyState::RX); //PHY should move to RX instead of IDLE if HE TB PPDU on primary channel;
+  //Expected figures from STA 2
+  WifiPhyState state;
+  if (m_channelWidth == 20)
+    {
+      //One PSDU of 1001 bytes should have been successfully received from STA 2 (since measurement channel is primary channel)
+      succ = 1;
+      fail = 0;
+      bytes = 1001;
+      state = WifiPhyState::RX;
+    }
+  else
+    {
+      //No PSDU should have been received from STA 2 (since measurement channel is primary channel)
+      succ = 0;
+      fail = 0;
+      bytes = 0;
+      state = WifiPhyState::IDLE;
+    }
+  ScheduleTest (delay, false,
+                WifiPhyState::IDLE,
+                0, 0, 0, //No transmission scheduled for STA 1
+                succ, fail, bytes,
+                false, state);
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Measure the power of a solicited HE TB PPDU from STA 2 on RU 2
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Measure power for reception of HE TB PPDU only on RU 2");
+  double rxPower = DbmToW (19); //16+1 dBm at STAs and +2 at AP (no loss since all devices are colocated)
+  SchedulePowerMeasurementChecks (delay,
+                                  (m_channelWidth >= 40) ? 0.0 : rxPower, rxPower, //power detected on RU1 only if same 20 MHz as RU 2
+                                  0.0, rxPower);
+  ScheduleTest (delay, true,
+                WifiPhyState::IDLE,
+                0, 0, 0,    //No transmission scheduled for STA 1
+                1, 0, 1001, //One PSDU of 1001 bytes should have been successfully received from STA 2
+                false, WifiPhyState::RX); //Measurement channel is total channel width
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Measure the power of a solicited HE TB PPDU from STA 2 on RU 2 with power spectrum density limitation enforced
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Measure power for reception of HE TB PPDU only on RU 2 with PSD limitation");
+  //Configure PSD limitation at 3 dBm/MHz -> 3+13.0103=16.0103 dBm max for 20 MHz, 3+9.0309=12.0309 dBm max for 106-tone RU, no impact for 40 MHz and above
+  Simulator::Schedule (delay - NanoSeconds (1), //just before sending HE TB
+                       &TestUlOfdmaPhyTransmission::SetPsdLimit, this, m_phySta2, 3.0);
+
+  rxPower = (m_channelWidth > 40) ? DbmToW (19) : DbmToW (18.0103); //15.0103+1 dBm at STA 2 and +2 at AP for non-OFDMA transmitted only on one 20 MHz channel
+  double rxPowerOfdma = rxPower;
+  if (m_channelWidth <= 40)
+    {
+      rxPowerOfdma = (m_channelWidth == 20) ? DbmToW (14.0309) //11.0309+1 dBm at STA and +2 at AP if 106-tone RU
+                                            : DbmToW (18.0103); //15.0103+1 dBm at STA 2 and +2 at AP if 242-tone RU
+    }
+  SchedulePowerMeasurementChecks (delay,
+                                  (m_channelWidth >= 40) ? 0.0 : rxPower, rxPower, //power detected on RU1 only if same 20 MHz as RU 2
+                                  0.0, rxPowerOfdma);
+
+  //Reset PSD limitation once HE TB has been sent
+  Simulator::Schedule (delay + m_expectedPpduDuration,
+                       &TestUlOfdmaPhyTransmission::SetPsdLimit, this, m_phySta2, 100.0);
+  ScheduleTest (delay, true,
+                WifiPhyState::IDLE,
+                0, 0, 0,    //No transmission scheduled for STA 1
+                1, 0, 1001, //One PSDU of 1001 bytes should have been successfully received from STA 2
+                false, WifiPhyState::RX); //Measurement channel is total channel width
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Measure the power of 2 solicited HE TB PPDU from both STAs
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Measure power for reception of HE TB PPDU on both RUs");
+  rxPower = DbmToW (19); //16+1 dBm at STAs and +2 at AP (no loss since all devices are colocated)
+  double rxPowerNonOfdma = (m_channelWidth >= 40) ? rxPower : rxPower * 2; //both STAs transmit over the same 20 MHz channel
+  SchedulePowerMeasurementChecks (delay,
+                                  rxPowerNonOfdma, rxPowerNonOfdma,
+                                  rxPower, rxPower);
+  ScheduleTest (delay, true,
+                WifiPhyState::IDLE,
+                1, 0, 1000,  //One PSDU of 1000 bytes should have been successfully received from STA 1
+                1, 0, 1001); //One PSDU of 1001 bytes should have been successfully received from STA 2
+  delay += Seconds (1.0);
+
+  //---------------------------------------------------------------------------
+  //Verify that an HE SU PPDU from another BSS has been correctly received (no UL MU transmission ongoing)
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::LogScenario, this,
+                       "Reception of an HE SU PPDU from another BSS");
+  //One HE SU from another BSS (BSS color 2) arrives at AP (BSS color 1)
+  Simulator::Schedule (delay, &TestUlOfdmaPhyTransmission::SetBssColor, this, m_phyAp, 1);
+  Simulator::Schedule (delay + MilliSeconds (100), &TestUlOfdmaPhyTransmission::SendHeTbPpdu, this, 3, 1, 1002, 1, 2);
+
+  //Verify events data have been cleared
+  Simulator::Schedule (delay + MilliSeconds (200), &TestUlOfdmaPhyTransmission::VerifyEventsCleared, this);
+
+  Simulator::Schedule (delay + MilliSeconds (500), &TestUlOfdmaPhyTransmission::Reset, this);
+  delay += Seconds (1.0);
+
+  Simulator::Run ();
+}
+
+void
+TestUlOfdmaPhyTransmission::DoRun (void)
+{
+  m_frequency = 5180;
+  m_channelWidth = 20;
+  m_expectedPpduDuration = NanoSeconds (279200);
+  NS_LOG_DEBUG ("Run UL OFDMA PHY transmission test for " << m_channelWidth << " MHz");
+  RunOne ();
+
+  m_frequency = 5190;
+  m_channelWidth = 40;
+  m_expectedPpduDuration = NanoSeconds (156800);
+  NS_LOG_DEBUG ("Run UL OFDMA PHY transmission test for " << m_channelWidth << " MHz");
+  RunOne ();
+
+  m_frequency = 5210;
+  m_channelWidth = 80;
+  m_expectedPpduDuration = NanoSeconds (102400);
+  NS_LOG_DEBUG ("Run UL OFDMA PHY transmission test for " << m_channelWidth << " MHz");
+  RunOne ();
+
+  m_frequency = 5250;
+  m_channelWidth = 160;
+  m_expectedPpduDuration = NanoSeconds (75200);
+  NS_LOG_DEBUG ("Run UL OFDMA PHY transmission test for " << m_channelWidth << " MHz");
+  RunOne ();
+
+  Simulator::Destroy ();
+}
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief PHY padding exclusion test
+ */
+class TestPhyPaddingExclusion : public TestCase
+{
+public:
+  TestPhyPaddingExclusion ();
+  virtual ~TestPhyPaddingExclusion ();
+
+private:
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
+  void DoRun (void) override;
+
+  /**
+   * Send HE TB PPDU function
+   * \param txStaId the ID of the TX STA
+   * \param index the RU index used for the transmission
+   * \param payloadSize the size of the payload in bytes
+   * \param txDuration the duration of the PPDU
+   */
+  void SendHeTbPpdu (uint16_t txStaId, std::size_t index, std::size_t payloadSize, Time txDuration);
+
+  /**
+   * Generate interference function
+   * \param interferencePsd the PSD of the interference to be generated
+   * \param duration the duration of the interference
+   */
+  void GenerateInterference (Ptr<SpectrumValue> interferencePsd, Time duration);
+  /**
+   * Stop interference function
+   */
+  void StopInterference (void);
+
+  /**
+   * Run one function
+   */
+  void RunOne ();
+
+  /**
+   * Check the received PSDUs from STA1
+   * \param expectedSuccess the expected number of success
+   * \param expectedFailures the expected number of failures
+   * \param expectedBytes the expected number of bytes
+   */
+  void CheckRxFromSta1 (uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes);
+
+  /**
+   * Check the received PSDUs from STA2
+   * \param expectedSuccess the expected number of success
+   * \param expectedFailures the expected number of failures
+   * \param expectedBytes the expected number of bytes
+   */
+  void CheckRxFromSta2 (uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes);
+
+  /**
+   * Verify all events are cleared at end of TX or RX
+   */
+  void VerifyEventsCleared (void);
+
+  /**
+   * Check the PHY state
+   * \param phy the PHY
+   * \param expectedState the expected state of the PHY
+   */
+  void CheckPhyState (Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState);
+  /// \copydoc CheckPhyState
+  void DoCheckPhyState (Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState);
+
+  /**
+   * Reset function
+   */
+  void Reset ();
+
+  /**
+   * Receive success function
+   * \param psdu the PSDU
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+   * \param txVector the transmit vector
+   * \param statusPerMpdu reception status per MPDU
+   */
+  void RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+
+  /**
+   * Receive failure function
+   * \param psdu the PSDU
+   */
+  void RxFailure (Ptr<WifiPsdu> psdu);
+
+  Ptr<OfdmaSpectrumWifiPhy> m_phyAp;   ///< PHY of AP
+  Ptr<OfdmaSpectrumWifiPhy> m_phySta1; ///< PHY of STA 1
+  Ptr<OfdmaSpectrumWifiPhy> m_phySta2; ///< PHY of STA 2
+
+  Ptr<WaveformGenerator> m_phyInterferer; ///< PHY of interferer
+
+  uint32_t m_countRxSuccessFromSta1; ///< count RX success from STA 1
+  uint32_t m_countRxSuccessFromSta2; ///< count RX success from STA 2
+  uint32_t m_countRxFailureFromSta1; ///< count RX failure from STA 1
+  uint32_t m_countRxFailureFromSta2; ///< count RX failure from STA 2
+  uint32_t m_countRxBytesFromSta1;   ///< count RX bytes from STA 1
+  uint32_t m_countRxBytesFromSta2;   ///< count RX bytes from STA 2
+};
+
+TestPhyPaddingExclusion::TestPhyPaddingExclusion ()
+  : TestCase ("PHY padding exclusion test"),
+    m_countRxSuccessFromSta1 (0),
+    m_countRxSuccessFromSta2 (0),
+    m_countRxFailureFromSta1 (0),
+    m_countRxFailureFromSta2 (0),
+    m_countRxBytesFromSta1 (0),
+    m_countRxBytesFromSta2 (0)
+{
+}
+
+void
+TestPhyPaddingExclusion::SendHeTbPpdu (uint16_t txStaId, std::size_t index, std::size_t payloadSize, Time txDuration)
+{
+  WifiConstPsduMap psdus;
+
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_TB, 800, 1, 1, 0, DEFAULT_CHANNEL_WIDTH, false, false, 1);
+
+  HeRu::RuSpec ru (HeRu::RU_106_TONE, index, false);
+  txVector.SetRu (ru, txStaId);
+  txVector.SetMode (HePhy::GetHeMcs7 (), txStaId);
+  txVector.SetNss (1, txStaId);
+
+  Ptr<Packet> pkt = Create<Packet> (payloadSize);
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_QOSDATA);
+  hdr.SetQosTid (0);
+  hdr.SetAddr1 (Mac48Address ("00:00:00:00:00:00"));
+  std::ostringstream addr;
+  addr << "00:00:00:00:00:0" << txStaId;
+  hdr.SetAddr2 (Mac48Address (addr.str ().c_str ()));
+  hdr.SetSequenceNumber (1);
+  Ptr<WifiPsdu> psdu = Create<WifiPsdu> (pkt, hdr);
+  psdus.insert (std::make_pair (txStaId, psdu));
+
+  Ptr<OfdmaSpectrumWifiPhy> phy;
+  if (txStaId == 1)
+    {
+      phy = m_phySta1;
+    }
+  else if (txStaId == 2)
+    {
+      phy = m_phySta2;
+    }
+
+  txVector.SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration, phy->GetPhyBand ()));
+
+  phy->SetPpduUid (0);
+  phy->Send (psdus, txVector);
+}
+
+void
+TestPhyPaddingExclusion::GenerateInterference (Ptr<SpectrumValue> interferencePsd, Time duration)
+{
+  m_phyInterferer->SetTxPowerSpectralDensity (interferencePsd);
+  m_phyInterferer->SetPeriod (duration);
+  m_phyInterferer->Start ();
+  Simulator::Schedule (duration, &TestPhyPaddingExclusion::StopInterference, this);
+}
+
+void
+TestPhyPaddingExclusion::StopInterference (void)
+{
+  m_phyInterferer->Stop();
+}
+
+TestPhyPaddingExclusion::~TestPhyPaddingExclusion ()
+{
+}
+
+void
+TestPhyPaddingExclusion::RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector<bool> /*statusPerMpdu*/)
+{
+  NS_LOG_FUNCTION (this << *psdu << psdu->GetAddr2 () << rxSignalInfo << txVector);
+  if (psdu->GetAddr2 () == Mac48Address ("00:00:00:00:00:01"))
+    {
+      m_countRxSuccessFromSta1++;
+      m_countRxBytesFromSta1 += (psdu->GetSize () - 30);
+    }
+  else if (psdu->GetAddr2 () == Mac48Address ("00:00:00:00:00:02"))
+    {
+      m_countRxSuccessFromSta2++;
+      m_countRxBytesFromSta2 += (psdu->GetSize () - 30);
+    }
+}
+
+void
+TestPhyPaddingExclusion::RxFailure (Ptr<WifiPsdu> psdu)
+{
+  NS_LOG_FUNCTION (this << *psdu << psdu->GetAddr2 ());
+  if (psdu->GetAddr2 () == Mac48Address ("00:00:00:00:00:01"))
+    {
+      m_countRxFailureFromSta1++;
+    }
+  else if (psdu->GetAddr2 () == Mac48Address ("00:00:00:00:00:02"))
+    {
+      m_countRxFailureFromSta2++;
+    }
+}
+
+void
+TestPhyPaddingExclusion::CheckRxFromSta1 (uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes)
+{
+  NS_TEST_ASSERT_MSG_EQ (m_countRxSuccessFromSta1, expectedSuccess, "The number of successfully received packets from STA 1 is not correct!");
+  NS_TEST_ASSERT_MSG_EQ (m_countRxFailureFromSta1, expectedFailures, "The number of unsuccessfully received packets from STA 1 is not correct!");
+  NS_TEST_ASSERT_MSG_EQ (m_countRxBytesFromSta1, expectedBytes, "The number of bytes received from STA 1 is not correct!");
+}
+
+void
+TestPhyPaddingExclusion::CheckRxFromSta2 (uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes)
+{
+  NS_TEST_ASSERT_MSG_EQ (m_countRxSuccessFromSta2, expectedSuccess, "The number of successfully received packets from STA 2 is not correct!");
+  NS_TEST_ASSERT_MSG_EQ (m_countRxFailureFromSta2, expectedFailures, "The number of unsuccessfully received packets from STA 2 is not correct!");
+  NS_TEST_ASSERT_MSG_EQ (m_countRxBytesFromSta2, expectedBytes, "The number of bytes received from STA 2 is not correct!");
+}
+
+void
+TestPhyPaddingExclusion::VerifyEventsCleared (void)
+{
+  NS_TEST_ASSERT_MSG_EQ (m_phyAp->GetCurrentEvent (), 0, "m_currentEvent for AP was not cleared");
+  NS_TEST_ASSERT_MSG_EQ (m_phySta1->GetCurrentEvent (), 0, "m_currentEvent for STA 1 was not cleared");
+  NS_TEST_ASSERT_MSG_EQ (m_phySta2->GetCurrentEvent (), 0, "m_currentEvent for STA 2 was not cleared");
+}
+
+void
+TestPhyPaddingExclusion::CheckPhyState (Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState)
+{
+  //This is needed to make sure PHY state will be checked as the last event if a state change occurred at the exact same time as the check
+  Simulator::ScheduleNow (&TestPhyPaddingExclusion::DoCheckPhyState, this, phy, expectedState);
+}
+
+void
+TestPhyPaddingExclusion::DoCheckPhyState (Ptr<OfdmaSpectrumWifiPhy> phy, WifiPhyState expectedState)
+{
+  WifiPhyState currentState = phy->GetState ()->GetState ();
+  NS_LOG_FUNCTION (this << currentState);
+  NS_TEST_ASSERT_MSG_EQ (currentState, expectedState, "PHY State " << currentState << " does not match expected state " << expectedState << " at " << Simulator::Now ());
+}
+
+void
+TestPhyPaddingExclusion::Reset (void)
+{
+  m_countRxSuccessFromSta1 = 0;
+  m_countRxSuccessFromSta2 = 0;
+  m_countRxFailureFromSta1 = 0;
+  m_countRxFailureFromSta2 = 0;
+  m_countRxBytesFromSta1 = 0;
+  m_countRxBytesFromSta2 = 0;
+  m_phySta1->SetPpduUid (0);
+  m_phySta1->SetTriggerFrameUid (0);
+  m_phySta2->SetTriggerFrameUid (0);
+}
+
+void
+TestPhyPaddingExclusion::DoSetup (void)
+{
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (1);
+  int64_t streamNumber = 0;
+
+  Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel> ();
+  Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel> ();
+  lossModel->SetFrequency (DEFAULT_FREQUENCY * 1e6);
+  spectrumChannel->AddPropagationLossModel (lossModel);
+  Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
+  spectrumChannel->SetPropagationDelayModel (delayModel);
+
+  Ptr<Node> apNode = CreateObject<Node> ();
+  Ptr<WifiNetDevice> apDev = CreateObject<WifiNetDevice> ();
+  Ptr<ApWifiMac> apMac = CreateObject<ApWifiMac> ();
+  apMac->SetAttribute ("BeaconGeneration", BooleanValue (false));
+  apDev->SetMac (apMac);
+  m_phyAp = CreateObject<OfdmaSpectrumWifiPhy> (0);
+  m_phyAp->CreateWifiSpectrumPhyInterface (apDev);
+  m_phyAp->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  Ptr<HeConfiguration> heConfiguration = CreateObject<HeConfiguration> ();
+  apDev->SetHeConfiguration (heConfiguration);
+  Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
+  m_phyAp->SetErrorRateModel (error);
+  m_phyAp->SetDevice (apDev);
+  m_phyAp->SetChannel (spectrumChannel);
+  m_phyAp->AssignStreams (streamNumber);
+  m_phyAp->SetFrequency (DEFAULT_FREQUENCY);
+  m_phyAp->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  m_phyAp->SetReceiveOkCallback (MakeCallback (&TestPhyPaddingExclusion::RxSuccess, this));
+  m_phyAp->SetReceiveErrorCallback (MakeCallback (&TestPhyPaddingExclusion::RxFailure, this));
+  Ptr<ConstantPositionMobilityModel> apMobility = CreateObject<ConstantPositionMobilityModel> ();
+  m_phyAp->SetMobility (apMobility);
+  apDev->SetPhy (m_phyAp);
+  apNode->AggregateObject (apMobility);
+  apNode->AddDevice (apDev);
+
+  Ptr<Node> sta1Node = CreateObject<Node> ();
+  Ptr<WifiNetDevice> sta1Dev = CreateObject<WifiNetDevice> ();
+  m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy> (1);
+  m_phySta1->CreateWifiSpectrumPhyInterface (sta1Dev);
+  m_phySta1->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta1->SetErrorRateModel (error);
+  m_phySta1->SetDevice (sta1Dev);
+  m_phySta1->SetChannel (spectrumChannel);
+  m_phySta1->AssignStreams (streamNumber);
+  m_phySta1->SetFrequency (DEFAULT_FREQUENCY);
+  m_phySta1->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  Ptr<ConstantPositionMobilityModel> sta1Mobility = CreateObject<ConstantPositionMobilityModel> ();
+  m_phySta1->SetMobility (sta1Mobility);
+  sta1Dev->SetPhy (m_phySta1);
+  sta1Node->AggregateObject (sta1Mobility);
+  sta1Node->AddDevice (sta1Dev);
+
+  Ptr<Node> sta2Node = CreateObject<Node> ();
+  Ptr<WifiNetDevice> sta2Dev = CreateObject<WifiNetDevice> ();
+  m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy> (2);
+  m_phySta2->CreateWifiSpectrumPhyInterface (sta2Dev);
+  m_phySta2->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ);
+  m_phySta2->SetErrorRateModel (error);
+  m_phySta2->SetDevice (sta2Dev);
+  m_phySta2->SetChannel (spectrumChannel);
+  m_phySta2->AssignStreams (streamNumber);
+  m_phySta2->SetFrequency (DEFAULT_FREQUENCY);
+  m_phySta2->SetChannelWidth (DEFAULT_CHANNEL_WIDTH);
+  Ptr<ConstantPositionMobilityModel> sta2Mobility = CreateObject<ConstantPositionMobilityModel> ();
+  m_phySta2->SetMobility (sta2Mobility);
+  sta2Dev->SetPhy (m_phySta2);
+  sta2Node->AggregateObject (sta2Mobility);
+  sta2Node->AddDevice (sta2Dev);
+
+  Ptr<Node> interfererNode = CreateObject<Node> ();
+  Ptr<NonCommunicatingNetDevice> interfererDev = CreateObject<NonCommunicatingNetDevice> ();
+  m_phyInterferer = CreateObject<WaveformGenerator> ();
+  m_phyInterferer->SetDevice (interfererDev);
+  m_phyInterferer->SetChannel (spectrumChannel);
+  m_phyInterferer->SetDutyCycle (1);
+  interfererNode->AddDevice (interfererDev);
+}
+
+void
+TestPhyPaddingExclusion::DoTeardown (void)
+{
+  m_phyAp->Dispose ();
+  m_phyAp = 0;
+  m_phySta1->Dispose ();
+  m_phySta1 = 0;
+  m_phySta2->Dispose ();
+  m_phySta2 = 0;
+  m_phyInterferer->Dispose ();
+  m_phyInterferer = 0;
+}
+
+void
+TestPhyPaddingExclusion::DoRun (void)
+{
+  Time expectedPpduDuration = NanoSeconds (279200);
+  Time ppduWithPaddingDuration = expectedPpduDuration + 10 * NanoSeconds (12800 + 800 /* GI */); //add 10 extra OFDM symbols
+
+  Simulator::Schedule (Seconds (0.0), &TestPhyPaddingExclusion::Reset, this);
+
+  //STA1 and STA2 send MU UL PPDUs addressed to AP:
+  Simulator::Schedule (Seconds (1.0), &TestPhyPaddingExclusion::SendHeTbPpdu, this, 1, 1, 1000, ppduWithPaddingDuration);
+  Simulator::Schedule (Seconds (1.0), &TestPhyPaddingExclusion::SendHeTbPpdu, this, 2, 2, 1001, ppduWithPaddingDuration);
+
+  //Verify it takes expectedPpduDuration + padding to transmit the PPDUs
+  Simulator::Schedule (Seconds (1.0) + ppduWithPaddingDuration - NanoSeconds (1), &TestPhyPaddingExclusion::CheckPhyState, this, m_phyAp, WifiPhyState::RX);
+  Simulator::Schedule (Seconds (1.0) + ppduWithPaddingDuration, &TestPhyPaddingExclusion::CheckPhyState, this, m_phyAp, WifiPhyState::IDLE);
+
+  //One PSDU of 1000 bytes should have been successfully received from STA 1
+  Simulator::Schedule (Seconds (1.1), &TestPhyPaddingExclusion::CheckRxFromSta1, this, 1, 0, 1000);
+  //One PSDU of 1001 bytes should have been successfully received from STA 2
+  Simulator::Schedule (Seconds (1.1), &TestPhyPaddingExclusion::CheckRxFromSta2, this, 1, 0, 1001);
+  //Verify events data have been cleared
+  Simulator::Schedule (Seconds (1.1), &TestPhyPaddingExclusion::VerifyEventsCleared, this);
+
+  Simulator::Schedule (Seconds (1.5), &TestPhyPaddingExclusion::Reset, this);
+
+
+  //STA1 and STA2 send MU UL PPDUs addressed to AP:
+  Simulator::Schedule (Seconds (2.0), &TestPhyPaddingExclusion::SendHeTbPpdu, this, 1, 1, 1000, ppduWithPaddingDuration);
+  Simulator::Schedule (Seconds (2.0), &TestPhyPaddingExclusion::SendHeTbPpdu, this, 2, 2, 1001, ppduWithPaddingDuration);
+
+  //A strong non-wifi interference is generated on RU 1 during padding reception
+  BandInfo bandInfo;
+  bandInfo.fc = (DEFAULT_FREQUENCY - (DEFAULT_CHANNEL_WIDTH / 4)) * 1e6;
+  bandInfo.fl = bandInfo.fc - ((DEFAULT_CHANNEL_WIDTH / 4) * 1e6);
+  bandInfo.fh = bandInfo.fc + ((DEFAULT_CHANNEL_WIDTH / 4) * 1e6);
+  Bands bands;
+  bands.push_back (bandInfo);
+
+  Ptr<SpectrumModel> SpectrumInterferenceRu1 = Create<SpectrumModel> (bands);
+  Ptr<SpectrumValue> interferencePsdRu1 = Create<SpectrumValue> (SpectrumInterferenceRu1);
+  double interferencePower = 0.1; //watts
+  *interferencePsdRu1 = interferencePower / ((DEFAULT_CHANNEL_WIDTH / 2) * 20e6);
+
+  Simulator::Schedule (Seconds (2.0) + MicroSeconds (50) + expectedPpduDuration, &TestPhyPaddingExclusion::GenerateInterference, this, interferencePsdRu1, MilliSeconds (100));
+
+  //Verify it takes  expectedPpduDuration + padding to transmit the PPDUs (PHY should move to CCA_BUSY instead of IDLE due to the interference)
+  Simulator::Schedule (Seconds (2.0) + ppduWithPaddingDuration - NanoSeconds (1), &TestPhyPaddingExclusion::CheckPhyState, this, m_phyAp, WifiPhyState::RX);
+  Simulator::Schedule (Seconds (2.0) + ppduWithPaddingDuration, &TestPhyPaddingExclusion::CheckPhyState, this, m_phyAp, WifiPhyState::CCA_BUSY);
+
+  //One PSDU of 1000 bytes should have been successfully received from STA 1 (since interference occupies RU 1 after payload, during PHY padding)
+  Simulator::Schedule (Seconds (2.1), &TestPhyPaddingExclusion::CheckRxFromSta1, this, 1, 0, 1000);
+  //One PSDU of 1001 bytes should have been successfully received from STA 2
+  Simulator::Schedule (Seconds (2.1), &TestPhyPaddingExclusion::CheckRxFromSta2, this, 1, 0, 1001);
+  //Verify events data have been cleared
+  Simulator::Schedule (Seconds (2.1), &TestPhyPaddingExclusion::VerifyEventsCleared, this);
+
+  Simulator::Schedule (Seconds (2.5), &TestPhyPaddingExclusion::Reset, this);
+
+  Simulator::Run ();
+
+  Simulator::Destroy ();
+}
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief UL-OFDMA power control test
+ */
+class TestUlOfdmaPowerControl : public TestCase
+{
+public:
+  TestUlOfdmaPowerControl ();
+  virtual ~TestUlOfdmaPowerControl ();
+
+private:
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
+  void DoRun (void) override;
+
+  /**
+   * Send a MU BAR through the AP to the STAs listed in the provided vector.
+   *
+   * \param staIds the vector of STA-IDs of STAs to address the MU-BAR to
+   */
+  void SendMuBar (std::vector <uint16_t> staIds);
+
+  /**
+   * Send a QoS Data packet to the destination station in order
+   * to set up a block Ack session (so that the MU-BAR may have a reply).
+   *
+   * \param destination the address of the destination station
+   */
+  void SetupBa (Address destination);
+
+  /**
+   * Run one simulation with an optional BA session set up phase.
+   *
+   * \param setupBa true if BA session should be set up (i.e. upon first run),
+   *                false otherwise
+   */
+  void RunOne (bool setupBa);
+
+  /**
+   * Replace the AP's MacLow callback on its PHY's ReceiveOkCallback
+   * by the ReceiveOkCallbackAtAp method.
+   */
+  void ReplaceReceiveOkCallbackOfAp (void);
+
+  /**
+   * Receive OK callback function at AP.
+   * This method will be plugged into the AP PHY's ReceiveOkCallback once the
+   * block Ack session has been set up. This is done in the Reset function.
+   * \param psdu the PSDU
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+   * \param txVector the TXVECTOR used for the packet
+   * \param statusPerMpdu reception status per MPDU
+   */
+  void ReceiveOkCallbackAtAp (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                              WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+
+  uint8_t m_bssColor;           ///< BSS color
+
+  Ptr<WifiNetDevice> m_apDev;   ///< network device of AP
+  Ptr<WifiNetDevice> m_sta1Dev; ///< network device of STA 1
+  Ptr<WifiNetDevice> m_sta2Dev; ///< network device of STA 2
+
+  Ptr<SpectrumWifiPhy> m_phyAp; ///< PHY of AP
+
+  double m_txPowerAp;           ///< transmit power (in dBm) of AP
+  double m_txPowerStart;        ///< minimum transmission power (in dBm) for STAs
+  double m_txPowerEnd;          ///< maximum transmission power (in dBm) for STAs
+  uint8_t m_txPowerLevels;      ///< number of transmission power levels for STAs
+
+  double m_requestedRssiSta1;   ///< requested RSSI (in dBm) from STA 1 at AP for HE TB PPDUs
+  double m_requestedRssiSta2;   ///< requested RSSI (in dBm) from STA 2 at AP for HE TB PPDUs
+
+  double m_rssiSta1;            ///< expected RSSI (in dBm) from STA 1 at AP for HE TB PPDUs
+  double m_rssiSta2;            ///< expected RSSI (in dBm) from STA 2 at AP for HE TB PPDUs
+
+  double m_tol;                 ///< tolerance (in dB) between received and expected RSSIs
+};
+
+TestUlOfdmaPowerControl::TestUlOfdmaPowerControl ()
+  : TestCase ("UL-OFDMA power control test"),
+    m_bssColor (1),
+    m_txPowerAp (0),
+    m_txPowerStart (0),
+    m_txPowerEnd (0),
+    m_txPowerLevels (0),
+    m_requestedRssiSta1 (0),
+    m_requestedRssiSta2 (0),
+    m_rssiSta1 (0),
+    m_rssiSta2 (0),
+    m_tol (0.1)
+{
+}
+
+TestUlOfdmaPowerControl::~TestUlOfdmaPowerControl ()
+{
+  m_phyAp = 0;
+  m_apDev = 0;
+  m_sta1Dev = 0;
+  m_sta2Dev = 0;
+}
+
+void
+TestUlOfdmaPowerControl::SetupBa (Address destination)
+{
+  //Only one packet is sufficient to set up BA since AP and STAs are HE capable
+  Ptr<Packet> pkt = Create<Packet> (100);  // 100 dummy bytes of data
+  m_apDev->Send (pkt, destination, 0);
+}
+
+void
+TestUlOfdmaPowerControl::SendMuBar (std::vector <uint16_t> staIds)
+{
+  NS_ASSERT (!staIds.empty () && staIds.size () <= 2);
+
+  //Build MU-BAR trigger frame
+  CtrlTriggerHeader muBar;
+  muBar.SetType (MU_BAR_TRIGGER);
+  muBar.SetUlLength (HePhy::ConvertHeTbPpduDurationToLSigLength (MicroSeconds (128), WIFI_PHY_BAND_5GHZ));
+  muBar.SetMoreTF (true);
+  muBar.SetCsRequired (true);
+  muBar.SetUlBandwidth (DEFAULT_CHANNEL_WIDTH);
+  muBar.SetGiAndLtfType (1600, 2);
+  muBar.SetApTxPower (static_cast<int8_t> (m_txPowerAp));
+  muBar.SetUlSpatialReuse (60500);
+
+  HeRu::RuType ru = (staIds.size () == 1) ? HeRu::RU_242_TONE : HeRu::RU_106_TONE;
+  std::size_t index = 1;
+  int8_t ulTargetRssi = -40; //will be overwritten
+  for (auto const& staId : staIds)
+    {
+      CtrlTriggerUserInfoField& ui = muBar.AddUserInfoField ();
+      ui.SetAid12 (staId);
+      ui.SetRuAllocation ({ru, index, true});
+      ui.SetUlFecCodingType (true);
+      ui.SetUlMcs (7);
+      ui.SetUlDcm (false);
+      ui.SetSsAllocation (1, 1);
+      if (staId == 1)
+        {
+          ulTargetRssi = m_requestedRssiSta1;
+        }
+      else if (staId == 2)
+        {
+          ulTargetRssi = m_requestedRssiSta2;
+        }
+      else
+        {
+          NS_ABORT_MSG ("Unknown STA-ID (" << staId << ")");
+        }
+      ui.SetUlTargetRssi (ulTargetRssi);
+
+      CtrlBAckRequestHeader bar;
+      bar.SetType (BlockAckReqType::COMPRESSED);
+      bar.SetTidInfo (0);
+      bar.SetStartingSequence (4095);
+      ui.SetMuBarTriggerDepUserInfo (bar);
+
+      ++index;
+    }
+
+  WifiConstPsduMap psdus;
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0,
+                                        DEFAULT_CHANNEL_WIDTH, false, false, false, m_bssColor);
+
+  Ptr<Packet> bar = Create<Packet> ();
+  bar->AddHeader (muBar);
+
+  Mac48Address receiver = Mac48Address::GetBroadcast ();
+  if (staIds.size () == 1)
+    {
+      uint16_t aidSta1 = DynamicCast<StaWifiMac> (m_sta1Dev->GetMac ())->GetAssociationId ();
+      if (staIds.front () == aidSta1)
+        {
+          receiver = Mac48Address::ConvertFrom (m_sta1Dev->GetAddress ());
+        }
+      else
+        {
+          NS_ASSERT (staIds.front () == DynamicCast<StaWifiMac> (m_sta2Dev->GetMac ())->GetAssociationId ());
+          receiver = Mac48Address::ConvertFrom (m_sta2Dev->GetAddress ());
+        }
+    }
+
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_CTL_TRIGGER);
+  hdr.SetAddr1 (receiver);
+  hdr.SetAddr2 (Mac48Address::ConvertFrom (m_apDev->GetAddress ()));
+  hdr.SetAddr3 (Mac48Address::ConvertFrom (m_apDev->GetAddress ()));
+  hdr.SetDsNotTo ();
+  hdr.SetDsFrom ();
+  hdr.SetNoRetry ();
+  hdr.SetNoMoreFragments ();
+  Ptr<WifiPsdu> psdu = Create<WifiPsdu> (bar, hdr);
+
+  Time nav = m_apDev->GetPhy ()->GetSifs ();
+  uint16_t staId = staIds.front (); //either will do
+  nav += m_phyAp->CalculateTxDuration (GetBlockAckSize (BlockAckType::COMPRESSED), muBar.GetHeTbTxVector (staId), DEFAULT_WIFI_BAND, staId);
+  psdu->SetDuration (nav);
+  psdus.insert (std::make_pair (SU_STA_ID, psdu));
+
+  m_phyAp->Send (psdus, txVector);
+}
+
+void
+TestUlOfdmaPowerControl::ReceiveOkCallbackAtAp (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                                            WifiTxVector txVector, std::vector<bool> /*statusPerMpdu*/)
+{
+  NS_TEST_ASSERT_MSG_EQ (txVector.GetPreambleType (), WIFI_PREAMBLE_HE_TB, "HE TB PPDU expected");
+  double rssi = rxSignalInfo.rssi;
+  NS_ASSERT (psdu->GetNMpdus () == 1);
+  WifiMacHeader hdr = psdu->GetHeader (0);
+  NS_TEST_ASSERT_MSG_EQ (hdr.GetType (), WIFI_MAC_CTL_BACKRESP, "Block ACK expected");
+  if (hdr.GetAddr2 () == m_sta1Dev->GetAddress ())
+    {
+      NS_TEST_ASSERT_MSG_EQ_TOL (rssi, m_rssiSta1, m_tol, "The obtained RSSI from STA 1 at AP is different from the expected one (" << rssi << " vs " << m_rssiSta1 << ", with tolerance of " << m_tol << ")");
+    }
+  else if (psdu->GetAddr2 () == m_sta2Dev->GetAddress ())
+    {
+      NS_TEST_ASSERT_MSG_EQ_TOL (rssi, m_rssiSta2, m_tol, "The obtained RSSI from STA 2 at AP is different from the expected one (" << rssi << " vs " << m_rssiSta2 << ", with tolerance of " << m_tol << ")");
+    }
+  else
+    {
+      NS_ABORT_MSG ("The receiver address is unknown");
+    }
+}
+
+void
+TestUlOfdmaPowerControl::ReplaceReceiveOkCallbackOfAp (void)
+{
+  //Now that BA session has been established we can plug our method
+  m_phyAp->SetReceiveOkCallback (MakeCallback (&TestUlOfdmaPowerControl::ReceiveOkCallbackAtAp, this));
+}
+
+void
+TestUlOfdmaPowerControl::DoSetup (void)
+{
+  Ptr<Node> apNode = CreateObject<Node> ();
+  NodeContainer staNodes;
+  staNodes.Create (2);
+
+  Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel> ();
+  Ptr<MatrixPropagationLossModel> lossModel = CreateObject<MatrixPropagationLossModel> ();
+  spectrumChannel->AddPropagationLossModel (lossModel);
+  Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
+  spectrumChannel->SetPropagationDelayModel (delayModel);
+
+  SpectrumWifiPhyHelper spectrumPhy;
+  spectrumPhy.SetChannel (spectrumChannel);
+  spectrumPhy.SetErrorRateModel ("ns3::NistErrorRateModel");
+  spectrumPhy.Set ("Frequency", UintegerValue (DEFAULT_FREQUENCY));
+  spectrumPhy.Set ("ChannelWidth", UintegerValue (DEFAULT_CHANNEL_WIDTH));
+
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                "DataMode", StringValue ("HeMcs7"),
+                                "ControlMode", StringValue ("HeMcs7"));
+
+  WifiMacHelper mac;
+  mac.SetType ("ns3::StaWifiMac");
+  NetDeviceContainer staDevs = wifi.Install (spectrumPhy, mac, staNodes);
+  wifi.AssignStreams (staDevs, 0);
+  m_sta1Dev = DynamicCast<WifiNetDevice> (staDevs.Get (0));
+  NS_ASSERT (m_sta1Dev);
+  m_sta2Dev = DynamicCast<WifiNetDevice> (staDevs.Get (1));
+  NS_ASSERT (m_sta2Dev);
+
+  //Set the beacon interval long enough so that associated STAs may not consider link lost when
+  //beacon generation is disabled during the actual tests. Having such a long interval also
+  //avoids bloating logs with beacons during the set up phase.
+  mac.SetType ("ns3::ApWifiMac",
+               "BeaconGeneration", BooleanValue (true),
+               "BeaconInterval", TimeValue (MicroSeconds (1024 * 600)));
+  m_apDev = DynamicCast<WifiNetDevice> (wifi.Install (spectrumPhy, mac, apNode).Get (0));
+  NS_ASSERT (m_apDev);
+  m_apDev->GetHeConfiguration ()->SetAttribute ("BssColor", UintegerValue (m_bssColor));
+  m_phyAp = DynamicCast<SpectrumWifiPhy> (m_apDev->GetPhy ());
+  NS_ASSERT (m_phyAp);
+  //ReceiveOkCallback of AP will be set to corresponding test's method once BA sessions have been set up for both STAs
+
+  MobilityHelper mobility;
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
+  positionAlloc->Add (Vector (1.0, 0.0, 0.0)); // put close enough in order to use MCS
+  positionAlloc->Add (Vector (2.0, 0.0, 0.0)); // STA 2 is a bit further away, but still in range of MCS
+  mobility.SetPositionAllocator (positionAlloc);
+
+  mobility.Install (apNode);
+  mobility.Install (staNodes);
+
+  lossModel->SetDefaultLoss (50.0);
+  lossModel->SetLoss (apNode->GetObject<MobilityModel> (), staNodes.Get (1)->GetObject<MobilityModel> (),
+                      56.0, true); //+6 dB between AP <-> STA 2 compared to AP <-> STA 1
+}
+
+void
+TestUlOfdmaPowerControl::DoTeardown (void)
+{
+  m_phyAp->Dispose ();
+  m_phyAp = 0;
+  m_apDev->Dispose ();
+  m_apDev = 0;
+  m_sta1Dev->Dispose ();
+  m_sta1Dev = 0;
+  m_sta2Dev->Dispose ();
+  m_sta2Dev = 0;
+}
+
+void
+TestUlOfdmaPowerControl::RunOne (bool setupBa)
+{
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (1);
+  int64_t streamNumber = 0;
+
+  Ptr<WifiPhy> phySta1 = m_sta1Dev->GetPhy ();
+  Ptr<WifiPhy> phySta2 = m_sta2Dev->GetPhy ();
+
+  m_phyAp->AssignStreams (streamNumber);
+  phySta1->AssignStreams (streamNumber);
+  phySta2->AssignStreams (streamNumber);
+
+  m_phyAp->SetAttribute ("TxPowerStart", DoubleValue (m_txPowerAp));
+  m_phyAp->SetAttribute ("TxPowerEnd", DoubleValue (m_txPowerAp));
+  m_phyAp->SetAttribute ("TxPowerLevels", UintegerValue (1));
+
+  phySta1->SetAttribute ("TxPowerStart", DoubleValue (m_txPowerStart));
+  phySta1->SetAttribute ("TxPowerEnd", DoubleValue (m_txPowerEnd));
+  phySta1->SetAttribute ("TxPowerLevels", UintegerValue (m_txPowerLevels));
+
+  phySta2->SetAttribute ("TxPowerStart", DoubleValue (m_txPowerStart));
+  phySta2->SetAttribute ("TxPowerEnd", DoubleValue (m_txPowerEnd));
+  phySta2->SetAttribute ("TxPowerLevels", UintegerValue (m_txPowerLevels));
+
+  Time relativeStart = MilliSeconds (0);
+  if (setupBa)
+    {
+      //Set up BA for each station once the association phase has ended
+      //so that a BA session is established when the MU-BAR is received.
+      Simulator::Schedule (MilliSeconds (800), &TestUlOfdmaPowerControl::SetupBa, this, m_sta1Dev->GetAddress ());
+      Simulator::Schedule (MilliSeconds (850), &TestUlOfdmaPowerControl::SetupBa, this, m_sta2Dev->GetAddress ());
+      relativeStart = MilliSeconds (1000);
+    }
+  else
+    {
+      Ptr<ApWifiMac> apMac = DynamicCast<ApWifiMac> (m_apDev->GetMac ());
+      NS_ASSERT (apMac);
+      apMac->SetAttribute ("BeaconGeneration", BooleanValue (false));
+    }
+
+  Simulator::Schedule (relativeStart, &TestUlOfdmaPowerControl::ReplaceReceiveOkCallbackOfAp, this);
+
+  {
+    //Verify that the RSSI from STA 1 is consistent with what was requested
+    std::vector<uint16_t> staIds {1};
+    Simulator::Schedule (relativeStart, &TestUlOfdmaPowerControl::SendMuBar, this, staIds);
+  }
+
+  {
+    //Verify that the RSSI from STA 2 is consistent with what was requested
+    std::vector<uint16_t> staIds {2};
+    Simulator::Schedule (relativeStart + MilliSeconds (20), &TestUlOfdmaPowerControl::SendMuBar, this, staIds);
+  }
+
+  {
+    //Verify that the RSSI from STA 1 and 2 is consistent with what was requested
+    std::vector<uint16_t> staIds {1, 2};
+    Simulator::Schedule (relativeStart + MilliSeconds (40), &TestUlOfdmaPowerControl::SendMuBar, this, staIds);
+  }
+
+  Simulator::Stop (relativeStart + MilliSeconds (100));
+  Simulator::Run ();
+}
+
+void
+TestUlOfdmaPowerControl::DoRun (void)
+{
+  //Power configurations
+  m_txPowerAp = 20; //dBm, so as to have -30 and -36 dBm at STA 1 and STA 2 resp.,
+                    //since path loss = 50 dB for AP <-> STA 1 and 56 dB for AP <-> STA 2
+  m_txPowerStart = 15; //dBm
+
+  //Requested UL RSSIs: should correspond to 20 dBm transmit power at STAs
+  m_requestedRssiSta1 = -30.0;
+  m_requestedRssiSta2 = -36.0;
+
+  //Test single power level
+  {
+    //STA power configurations: 15 dBm only
+    m_txPowerEnd = 15;
+    m_txPowerLevels = 1;
+
+    //Expected UL RSSIs, considering that the provided power is 5 dB less than requested,
+    //regardless of the estimated path loss.
+    m_rssiSta1 = -35.0; // 15 dBm - 50 dB
+    m_rssiSta2 = -41.0; // 15 dBm - 56 dB
+
+    RunOne (true);
+  }
+
+  //Test 2 dBm granularity
+  {
+    //STA power configurations: [15:2:25] dBm
+    m_txPowerEnd = 25;
+    m_txPowerLevels = 6;
+
+    //Expected UL RSSIs, considering that the provided power (21 dBm) is 1 dB more than requested
+    m_rssiSta1 = -29.0; // 21 dBm - 50 dB
+    m_rssiSta2 = -35.0; // 21 dBm - 50 dB
+
+    RunOne (false);
+  }
+
+  //Test 1 dBm granularity
+  {
+    //STA power configurations: [15:1:25] dBm
+    m_txPowerEnd = 25;
+    m_txPowerLevels = 11;
+
+    //Expected UL RSSIs, considering that we can correctly tune the transmit power
+    m_rssiSta1 = -30.0; // 20 dBm - 50 dB
+    m_rssiSta2 = -36.0; // 20 dBm - 56 dB
+
+    RunOne (false);
+  }
+
+  //Ask for different power levels (3 dB difference between HE_TB_PPDUs)
+  {
+    //STA power configurations: [15:1:25] dBm
+    m_txPowerEnd = 25;
+    m_txPowerLevels = 11;
+
+    //Requested UL RSSIs
+    m_requestedRssiSta1 = -28.0; //2 dB higher than previously -> Tx power = 22 dBm at STA 1
+    m_requestedRssiSta2 = -37.0; //1 dB less than previously -> Tx power = 19 dBm at STA 2
+
+    //Expected UL RSSIs, considering that we can correctly tune the transmit power
+    m_rssiSta1 = -28.0; // 22 dBm - 50 dB
+    m_rssiSta2 = -37.0; // 19 dBm - 56 dB
+
+    RunOne (false);
+  }
+
+  Simulator::Destroy ();
+}
+
+
 /**
  * \ingroup wifi-test
  * \ingroup tests
@@ -738,6 +3656,11 @@
   : TestSuite ("wifi-phy-ofdma", UNIT)
 {
   AddTestCase (new TestDlOfdmaPhyTransmission, TestCase::QUICK);
+  AddTestCase (new TestUlOfdmaPpduUid, TestCase::QUICK);
+  AddTestCase (new TestMultipleHeTbPreambles, TestCase::QUICK);
+  AddTestCase (new TestUlOfdmaPhyTransmission, TestCase::QUICK);
+  AddTestCase (new TestPhyPaddingExclusion, TestCase::QUICK);
+  AddTestCase (new TestUlOfdmaPowerControl, TestCase::QUICK);
 }
 
 static WifiPhyOfdmaTestSuite wifiPhyOfdmaTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/wifi-phy-reception-test.cc ns-3.34/src/wifi/test/wifi-phy-reception-test.cc
--- ns-3.33/src/wifi/test/wifi-phy-reception-test.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/wifi-phy-reception-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -36,7 +36,8 @@
 #include "ns3/wifi-mac-queue-item.h"
 #include "ns3/mpdu-aggregator.h"
 #include "ns3/wifi-psdu.h"
-#include "ns3/wifi-ppdu.h"
+#include "ns3/he-ppdu.h"
+#include "ns3/he-phy.h"
 
 using namespace ns3;
 
@@ -60,7 +61,8 @@
   virtual ~TestThresholdPreambleDetectionWithoutFrameCapture ();
 
 protected:
-  virtual void DoSetup (void);
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
   Ptr<SpectrumWifiPhy> m_phy; ///< Phy
   /**
    * Send packet function
@@ -70,11 +72,12 @@
   /**
    * Spectrum wifi receive success function
    * \param psdu the PSDU
-   * \param snr the SNR
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
    * \param txVector the transmit vector
    * \param statusPerMpdu reception status per MPDU
    */
-  void RxSuccess (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+  void RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                  WifiTxVector txVector, std::vector<bool> statusPerMpdu);
   /**
    * Spectrum wifi receive failure function
    * \param psdu the PSDU
@@ -84,7 +87,7 @@
   uint32_t m_countRxFailure; ///< count RX failure
 
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
   /**
    * Schedule now to check  the PHY state
@@ -102,19 +105,22 @@
    * \param expectedFailureCount the number of unsuccessfully received packets
    */
   void CheckRxPacketCount (uint32_t expectedSuccessCount, uint32_t expectedFailureCount);
+
+  uint64_t m_uid; //!< the UID to use for the PPDU
 };
 
 TestThresholdPreambleDetectionWithoutFrameCapture::TestThresholdPreambleDetectionWithoutFrameCapture ()
   : TestCase ("Threshold preamble detection model test when no frame capture model is applied"),
     m_countRxSuccess (0),
-    m_countRxFailure (0)
+    m_countRxFailure (0),
+    m_uid (0)
 {
 }
 
 void
 TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket (double rxPowerDbm)
 {
-  WifiTxVector txVector = WifiTxVector (WifiPhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, false);
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, false);
 
   Ptr<Packet> pkt = Create<Packet> (1000);
   WifiMacHeader hdr;
@@ -125,7 +131,7 @@
   Ptr<WifiPsdu> psdu = Create<WifiPsdu> (pkt, hdr);
   Time txDuration = m_phy->CalculateTxDuration (psdu->GetSize (), txVector, m_phy->GetPhyBand ());
 
-  Ptr<WifiPpdu> ppdu = Create<WifiPpdu> (psdu, txVector, txDuration, WIFI_PHY_BAND_5GHZ);
+  Ptr<WifiPpdu> ppdu = Create<HePpdu> (psdu, txVector, txDuration, WIFI_PHY_BAND_5GHZ, m_uid++);
 
   Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, DbmToW (rxPowerDbm), GUARD_WIDTH);
 
@@ -165,9 +171,10 @@
 }
 
 void
-TestThresholdPreambleDetectionWithoutFrameCapture::RxSuccess (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu)
+TestThresholdPreambleDetectionWithoutFrameCapture::RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                                                              WifiTxVector txVector, std::vector<bool> statusPerMpdu)
 {
-  NS_LOG_FUNCTION (this << *psdu << snr << txVector);
+  NS_LOG_FUNCTION (this << *psdu << rxSignalInfo << txVector);
   m_countRxSuccess++;
 }
 
@@ -202,6 +209,13 @@
 }
 
 void
+TestThresholdPreambleDetectionWithoutFrameCapture::DoTeardown (void)
+{
+  m_phy->Dispose ();
+  m_phy = 0;
+}
+
+void
 TestThresholdPreambleDetectionWithoutFrameCapture::DoRun (void)
 {
   RngSeedManager::SetSeed (1);
@@ -289,9 +303,9 @@
 
   Simulator::Schedule (Seconds (5.0), &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket, this, rxPowerDbm);
   Simulator::Schedule (Seconds (5.0) + MicroSeconds (2.0), &TestThresholdPreambleDetectionWithoutFrameCapture::SendPacket, this, rxPowerDbm + 3);
-  // At 4us, no preamble is successfully detected, hence STA PHY STATE should move from IDLE to CCA_BUSY
-  Simulator::Schedule (Seconds (5.0) + NanoSeconds (3999), &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState, this, WifiPhyState::IDLE);
-  Simulator::Schedule (Seconds (5.0) + NanoSeconds (4000), &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState, this, WifiPhyState::CCA_BUSY);
+  // At 6us (hence 4us after the last signal is received), no preamble is successfully detected, hence STA PHY STATE should move from IDLE to CCA_BUSY
+  Simulator::Schedule (Seconds (5.0) + NanoSeconds (5999), &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState, this, WifiPhyState::IDLE);
+  Simulator::Schedule (Seconds (5.0) + NanoSeconds (6000), &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState, this, WifiPhyState::CCA_BUSY);
   // Since it takes 152.8us to transmit each packet, PHY should be back to IDLE at time 152.8 + 2 = 154.8us
   Simulator::Schedule (Seconds (5.0) + NanoSeconds (154799), &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState, this, WifiPhyState::CCA_BUSY);
   Simulator::Schedule (Seconds (5.0) + NanoSeconds (154800), &TestThresholdPreambleDetectionWithoutFrameCapture::CheckPhyState, this, WifiPhyState::IDLE);
@@ -412,7 +426,8 @@
   virtual ~TestThresholdPreambleDetectionWithFrameCapture ();
 
 protected:
-  virtual void DoSetup (void);
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
   Ptr<SpectrumWifiPhy> m_phy; ///< Phy
   /**
    * Send packet function
@@ -422,11 +437,12 @@
   /**
    * Spectrum wifi receive success function
    * \param psdu the PSDU
-   * \param snr the SNR
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
    * \param txVector the transmit vector
    * \param statusPerMpdu reception status per MPDU
    */
-  void RxSuccess (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+  void RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                  WifiTxVector txVector, std::vector<bool> statusPerMpdu);
   /**
    * Spectrum wifi receive failure function
    * \param psdu the PSDU
@@ -436,7 +452,7 @@
   uint32_t m_countRxFailure; ///< count RX failure
 
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
   /**
    * Schedule now to check  the PHY state
@@ -454,19 +470,22 @@
    * \param expectedFailureCount the number of unsuccessfully received packets
    */
   void CheckRxPacketCount (uint32_t expectedSuccessCount, uint32_t expectedFailureCount);
+
+  uint64_t m_uid; //!< the UID to use for the PPDU
 };
 
 TestThresholdPreambleDetectionWithFrameCapture::TestThresholdPreambleDetectionWithFrameCapture ()
 : TestCase ("Threshold preamble detection model test when simple frame capture model is applied"),
-m_countRxSuccess (0),
-m_countRxFailure (0)
+  m_countRxSuccess (0),
+  m_countRxFailure (0),
+  m_uid (0)
 {
 }
 
 void
 TestThresholdPreambleDetectionWithFrameCapture::SendPacket (double rxPowerDbm)
 {
-  WifiTxVector txVector = WifiTxVector (WifiPhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, false);
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, false);
   
   Ptr<Packet> pkt = Create<Packet> (1000);
   WifiMacHeader hdr;
@@ -477,7 +496,7 @@
   Ptr<WifiPsdu> psdu = Create<WifiPsdu> (pkt, hdr);
   Time txDuration = m_phy->CalculateTxDuration (psdu->GetSize (), txVector, m_phy->GetPhyBand ());
 
-  Ptr<WifiPpdu> ppdu = Create<WifiPpdu> (psdu, txVector, txDuration, WIFI_PHY_BAND_5GHZ);
+  Ptr<WifiPpdu> ppdu = Create<HePpdu> (psdu, txVector, txDuration, WIFI_PHY_BAND_5GHZ, m_uid++);
 
   Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, DbmToW (rxPowerDbm), GUARD_WIDTH);
 
@@ -517,7 +536,8 @@
 }
 
 void
-TestThresholdPreambleDetectionWithFrameCapture::RxSuccess (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu)
+TestThresholdPreambleDetectionWithFrameCapture::RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                                                           WifiTxVector txVector, std::vector<bool> statusPerMpdu)
 {
   NS_LOG_FUNCTION (this << *psdu << txVector);
   m_countRxSuccess++;
@@ -559,6 +579,13 @@
 }
 
 void
+TestThresholdPreambleDetectionWithFrameCapture::DoTeardown (void)
+{
+  m_phy->Dispose ();
+  m_phy = 0;
+}
+
+void
 TestThresholdPreambleDetectionWithFrameCapture::DoRun (void)
 {
   RngSeedManager::SetSeed (1);
@@ -904,10 +931,11 @@
   virtual ~TestSimpleFrameCaptureModel ();
 
 protected:
-  virtual void DoSetup (void);
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
 
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
   /**
    * Reset function
@@ -922,11 +950,12 @@
   /**
    * Spectrum wifi receive success function
    * \param psdu the PSDU
-   * \param snr the SNR
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
    * \param txVector the transmit vector
    * \param statusPerMpdu reception status per MPDU
    */
-  void RxSuccess (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+  void RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                  WifiTxVector txVector, std::vector<bool> statusPerMpdu);
   /**
    * RX dropped function
    * \param p the packet
@@ -957,6 +986,8 @@
   bool m_rxSuccess1500B; ///< count received packets with 1500B payload
   bool m_rxDropped1000B; ///< count dropped packets with 1000B payload
   bool m_rxDropped1500B; ///< count dropped packets with 1500B payload
+
+  uint64_t m_uid; //!< the UID to use for the PPDU
 };
 
 TestSimpleFrameCaptureModel::TestSimpleFrameCaptureModel ()
@@ -964,14 +995,15 @@
   m_rxSuccess1000B (false),
   m_rxSuccess1500B (false),
   m_rxDropped1000B (false),
-  m_rxDropped1500B (false)
+  m_rxDropped1500B (false),
+  m_uid (0)
 {
 }
 
 void
 TestSimpleFrameCaptureModel::SendPacket (double rxPowerDbm, uint32_t packetSize)
 {
-  WifiTxVector txVector = WifiTxVector (WifiPhy::GetHeMcs0 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, false);
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs0 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, false);
   
   Ptr<Packet> pkt = Create<Packet> (packetSize);
   WifiMacHeader hdr;
@@ -982,7 +1014,7 @@
   Ptr<WifiPsdu> psdu = Create<WifiPsdu> (pkt, hdr);
   Time txDuration = m_phy->CalculateTxDuration (psdu->GetSize (), txVector, m_phy->GetPhyBand ());
 
-  Ptr<WifiPpdu> ppdu = Create<WifiPpdu> (psdu, txVector, txDuration, WIFI_PHY_BAND_5GHZ);
+  Ptr<WifiPpdu> ppdu = Create<HePpdu> (psdu, txVector, txDuration, WIFI_PHY_BAND_5GHZ, m_uid++);
 
   Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, DbmToW (rxPowerDbm), GUARD_WIDTH);
 
@@ -996,9 +1028,10 @@
 }
 
 void
-TestSimpleFrameCaptureModel::RxSuccess (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu)
+TestSimpleFrameCaptureModel::RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                                        WifiTxVector txVector, std::vector<bool> statusPerMpdu)
 {
-  NS_LOG_FUNCTION (this << *psdu << snr << txVector);
+  NS_LOG_FUNCTION (this << *psdu << rxSignalInfo << txVector);
   NS_ASSERT (!psdu->IsAggregate () || psdu->IsSingle ());
   if (psdu->GetSize () == 1030)
     {
@@ -1085,6 +1118,13 @@
 }
 
 void
+TestSimpleFrameCaptureModel::DoTeardown (void)
+{
+  m_phy->Dispose ();
+  m_phy = 0;
+}
+
+void
 TestSimpleFrameCaptureModel::DoRun (void)
 {
   RngSeedManager::SetSeed (1);
@@ -1144,7 +1184,8 @@
   virtual ~TestPhyHeadersReception ();
 
 protected:
-  virtual void DoSetup (void);
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
   Ptr<SpectrumWifiPhy> m_phy; ///< Phy
   /**
    * Send packet function
@@ -1153,7 +1194,7 @@
   void SendPacket (double rxPowerDbm);
 
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
   /**
    * Schedule now to check  the PHY state
@@ -1165,17 +1206,20 @@
    * \param expectedState the expected PHY state
    */
   void DoCheckPhyState (WifiPhyState expectedState);
+
+  uint64_t m_uid; //!< the UID to use for the PPDU
 };
 
 TestPhyHeadersReception::TestPhyHeadersReception ()
-: TestCase ("PHY headers reception test")
+: TestCase ("PHY headers reception test"),
+  m_uid (0)
 {
 }
 
 void
 TestPhyHeadersReception::SendPacket (double rxPowerDbm)
 {
-  WifiTxVector txVector = WifiTxVector (WifiPhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, false);
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs7 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, false);
 
   Ptr<Packet> pkt = Create<Packet> (1000);
   WifiMacHeader hdr;
@@ -1186,7 +1230,7 @@
   Ptr<WifiPsdu> psdu = Create<WifiPsdu> (pkt, hdr);
   Time txDuration = m_phy->CalculateTxDuration (psdu->GetSize (), txVector, m_phy->GetPhyBand ());
 
-  Ptr<WifiPpdu> ppdu = Create<WifiPpdu> (psdu, txVector, txDuration, WIFI_PHY_BAND_5GHZ);
+  Ptr<WifiPpdu> ppdu = Create<HePpdu> (psdu, txVector, txDuration, WIFI_PHY_BAND_5GHZ, m_uid++);
 
   Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, DbmToW (rxPowerDbm), GUARD_WIDTH);
 
@@ -1236,6 +1280,13 @@
 }
 
 void
+TestPhyHeadersReception::DoTeardown (void)
+{
+  m_phy->Dispose ();
+  m_phy = 0;
+}
+
+void
 TestPhyHeadersReception::DoRun (void)
 {
   RngSeedManager::SetSeed (1);
@@ -1385,19 +1436,21 @@
   virtual ~TestAmpduReception ();
 
 protected:
-  virtual void DoSetup (void);
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
 
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
   /**
    * RX success function
    * \param psdu the PSDU
-   * \param snr the SNR
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
    * \param txVector the transmit vector
    * \param statusPerMpdu reception status per MPDU
    */
-  void RxSuccess (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+  void RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                  WifiTxVector txVector, std::vector<bool> statusPerMpdu);
   /**
    * RX failure function
    * \param psdu the PSDU
@@ -1479,6 +1532,8 @@
 
   uint8_t m_rxDroppedBitmapAmpdu1; ///< bitmap of dropped MPDUs in A-MPDU #1
   uint8_t m_rxDroppedBitmapAmpdu2; ///< bitmap of dropped MPDUs in A-MPDU #2
+
+  uint64_t m_uid;                  ///< UID
 };
 
 TestAmpduReception::TestAmpduReception ()
@@ -1488,7 +1543,8 @@
   m_rxFailureBitmapAmpdu1 (0),
   m_rxFailureBitmapAmpdu2 (0),
   m_rxDroppedBitmapAmpdu1 (0),
-  m_rxDroppedBitmapAmpdu2 (0)
+  m_rxDroppedBitmapAmpdu2 (0),
+  m_uid (0)
 {
 }
 
@@ -1509,9 +1565,10 @@
 }
 
 void
-TestAmpduReception::RxSuccess (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu)
+TestAmpduReception::RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                               WifiTxVector txVector, std::vector<bool> statusPerMpdu)
 {
-  NS_LOG_FUNCTION (this << *psdu << snr << txVector);
+  NS_LOG_FUNCTION (this << *psdu << rxSignalInfo << txVector);
   if (statusPerMpdu.empty ()) //wait for the whole A-MPDU
     {
       return;
@@ -1680,7 +1737,7 @@
 void
 TestAmpduReception::SendAmpduWithThreeMpdus (double rxPowerDbm, uint32_t referencePacketSize)
 {
-  WifiTxVector txVector = WifiTxVector (WifiPhy::GetHeMcs0 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, true);
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs0 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, 20, true);
 
   WifiMacHeader hdr;
   hdr.SetType (WIFI_MAC_QOSDATA);
@@ -1696,7 +1753,7 @@
   
   Time txDuration = m_phy->CalculateTxDuration (psdu->GetSize (), txVector, m_phy->GetPhyBand ());
 
-  Ptr<WifiPpdu> ppdu = Create<WifiPpdu> (psdu, txVector, txDuration, WIFI_PHY_BAND_5GHZ);
+  Ptr<WifiPpdu> ppdu = Create<HePpdu> (psdu, txVector, txDuration, WIFI_PHY_BAND_5GHZ, m_uid++);
 
   Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, DbmToW (rxPowerDbm), GUARD_WIDTH);
 
@@ -1734,6 +1791,13 @@
 }
 
 void
+TestAmpduReception::DoTeardown (void)
+{
+  m_phy->Dispose ();
+  m_phy = 0;
+}
+
+void
 TestAmpduReception::DoRun (void)
 {
   RngSeedManager::SetSeed (1);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/wifi-phy-thresholds-test.cc ns-3.34/src/wifi/test/wifi-phy-thresholds-test.cc
--- ns-3.33/src/wifi/test/wifi-phy-thresholds-test.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/wifi-phy-thresholds-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -28,7 +28,8 @@
 #include "ns3/wifi-spectrum-signal-parameters.h"
 #include "ns3/wifi-utils.h"
 #include "ns3/wifi-psdu.h"
-#include "ns3/wifi-ppdu.h"
+#include "ns3/ofdm-ppdu.h"
+#include "ns3/ofdm-phy.h"
 
 using namespace ns3;
 
@@ -80,11 +81,12 @@
   /**
    * PHY receive success callback function
    * \param psdu the PSDU
-   * \param snr the SNR
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
    * \param txVector the transmit vector
    * \param statusPerMpdu reception status per MPDU
    */
-  virtual void RxSuccess (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu);
+  virtual void RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                          WifiTxVector txVector, std::vector<bool> statusPerMpdu);
   /**
    * PHY receive failure callback function
    * \param psdu the PSDU
@@ -114,7 +116,8 @@
   uint32_t m_ccabusyStateCount; ///< count number of PHY state change to CCA_BUSY state
 
 private:
-  virtual void DoSetup (void);
+  void DoSetup (void) override;
+  void DoTeardown (void) override;
 };
 
 WifiPhyThresholdsTest::WifiPhyThresholdsTest (std::string test_name)
@@ -136,7 +139,7 @@
 Ptr<SpectrumSignalParameters>
 WifiPhyThresholdsTest::MakeWifiSignal (double txPowerWatts)
 {
-  WifiTxVector txVector = WifiTxVector (WifiPhy::GetOfdmRate6Mbps (), 0, WIFI_PREAMBLE_LONG, 800, 1, 1, 0, 20, false);
+  WifiTxVector txVector = WifiTxVector (OfdmPhy::GetOfdmRate6Mbps (), 0, WIFI_PREAMBLE_LONG, 800, 1, 1, 0, 20, false);
 
   Ptr<Packet> pkt = Create<Packet> (1000);
   WifiMacHeader hdr;
@@ -147,7 +150,7 @@
   Ptr<WifiPsdu> psdu = Create<WifiPsdu> (pkt, hdr);
   Time txDuration = m_phy->CalculateTxDuration (psdu->GetSize (), txVector, m_phy->GetPhyBand ());
 
-  Ptr<WifiPpdu> ppdu = Create<WifiPpdu> (psdu, txVector, txDuration, WIFI_PHY_BAND_5GHZ);
+  Ptr<WifiPpdu> ppdu = Create<OfdmPpdu> (psdu, txVector, WIFI_PHY_BAND_5GHZ, 0);
 
   Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, txPowerWatts, CHANNEL_WIDTH);
   Ptr<WifiSpectrumSignalParameters> txParams = Create<WifiSpectrumSignalParameters> ();
@@ -183,9 +186,10 @@
 }
 
 void
-WifiPhyThresholdsTest::RxSuccess (Ptr<WifiPsdu> psdu, double snr, WifiTxVector txVector, std::vector<bool> statusPerMpdu)
+WifiPhyThresholdsTest::RxSuccess (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                                  WifiTxVector txVector, std::vector<bool> statusPerMpdu)
 {
-  NS_LOG_FUNCTION (this << *psdu << snr << txVector);
+  NS_LOG_FUNCTION (this << *psdu << rxSignalInfo << txVector);
   m_rxSuccess++;
 }
 
@@ -237,6 +241,13 @@
   m_phy->GetState ()->TraceConnectWithoutContext ("State", MakeCallback (&WifiPhyThresholdsTest::PhyStateChanged, this));
 }
 
+void
+WifiPhyThresholdsTest::DoTeardown (void)
+{
+  m_phy->Dispose ();
+  m_phy = 0;
+}
+
 /**
  * \ingroup wifi-test
  * \ingroup tests
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/wifi-primary-channels-test.cc ns-3.34/src/wifi/test/wifi-primary-channels-test.cc
--- ns-3.33/src/wifi/test/wifi-primary-channels-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/test/wifi-primary-channels-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,1025 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/test.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/spectrum-wifi-helper.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/config.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/ap-wifi-mac.h"
+#include "ns3/sta-wifi-mac.h"
+#include "ns3/he-phy.h"
+#include "ns3/he-configuration.h"
+#include "ns3/ctrl-headers.h"
+#include <bitset>
+#include <algorithm>
+#include <sstream>
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("WifiPrimaryChannelsTest");
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief Test transmissions under different primary channel settings
+ *
+ * This test can be repeated for different widths of the operating channel. We
+ * configure as many BSSes as the number of distinct 20 MHz subchannels in the
+ * operating channel, so that each BSS is assigned a distinct primary20 channel.
+ * For each BSS, we test the transmission of SU PPDUs, DL MU PPDUs and HE TB PPDUs
+ * of all the widths (20 MHz, 40 MHz, etc.) allowed by the operating channel.
+ * Transmissions of a given type take place simultaneously in BSSes that do not
+ * operate on adjacent primary channels of the considered width (so that
+ * transmissions do not interfere with each other). It is also possible to
+ * select whether BSSes should be assigned (distinct) BSS colors or not.
+ */
+class WifiPrimaryChannelsTest : public TestCase
+{
+public:
+  /**
+   * Constructor
+   *
+   * \param channelWidth the operating channel width (in MHz)
+   * \param useDistinctBssColors whether to set distinct BSS colors to BSSes
+   */
+  WifiPrimaryChannelsTest (uint16_t channelWidth, bool useDistinctBssColors);
+  virtual ~WifiPrimaryChannelsTest ();
+
+  /**
+   * Callback invoked when PHY receives a PSDU to transmit. Used to print
+   * transmitted PSDUs for debug purposes.
+   *
+   * \param context the context
+   * \param psduMap the PSDU map
+   * \param txVector the TX vector
+   * \param txPowerW the tx power in Watts
+   */
+  void Transmit (std::string context, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
+  /**
+   * Have the AP of the given BSS transmit a SU PPDU using the given
+   * transmission channel width
+   *
+   * \param bss the given BSS
+   * \param txChannelWidth the given transmission channel width in MHz
+   */
+  void SendDlSuPpdu (uint8_t bss, uint16_t txChannelWidth);
+  /**
+   * Have the AP of the given BSS transmit a MU PPDU using the given
+   * transmission channel width and RU type
+   *
+   * \param bss the given BSS
+   * \param txChannelWidth the given transmission channel width in MHz
+   * \param ruType the given RU type
+   * \param nRus the number of RUs
+   */
+  void SendDlMuPpdu (uint8_t bss, uint16_t txChannelWidth, HeRu::RuType ruType, std::size_t nRus);
+  /**
+   * Have the AP of the given BSS transmit a Basic Trigger Frame. This method calls
+   * DoSendHeTbPpdu to actually have STAs transmit HE TB PPDUs using the given
+   * transmission channel width and RU type
+   *
+   * \param bss the given BSS
+   * \param txChannelWidth the given transmission channel width in MHz
+   * \param ruType the given RU type
+   * \param nRus the number of RUs
+   */
+  void SendHeTbPpdu (uint8_t bss, uint16_t txChannelWidth, HeRu::RuType ruType, std::size_t nRus);
+  /**
+   * Have the STAs of the given BSS transmit an HE TB PPDU using the given
+   * transmission channel width and RU type
+   *
+   * \param bss the given BSS
+   * \param txChannelWidth the given transmission channel width in MHz
+   * \param ruType the given RU type
+   * \param nRus the number of RUs
+   */
+  void DoSendHeTbPpdu (uint8_t bss, uint16_t txChannelWidth, HeRu::RuType ruType, std::size_t nRus);
+  /**
+   * Callback invoked when a station receives a DL PPDU.
+   *
+   * \param bss the BSS the receiving STA belongs to
+   * \param station the receiving station
+   * \param psdu the received PSDU
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+   * \param txVector TxVector of the received PSDU
+   * \param perMpduStatus per MPDU reception status
+   */
+  void ReceiveDl (uint8_t bss, uint8_t station, Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                  WifiTxVector txVector, std::vector<bool> perMpduStatus);
+  /**
+   * Callback invoked when an AP receives an UL PPDU.
+   *
+   * \param bss the BSS the receiving AP belongs to
+   * \param psdu the received PSDU
+   * \param rxSignalInfo the info on the received signal (\see RxSignalInfo)
+   * \param txVector TxVector of the received PSDU
+   * \param perMpduStatus per MPDU reception status
+   */
+  void ReceiveUl (uint8_t bss, Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                  WifiTxVector txVector, std::vector<bool> perMpduStatus);
+  /**
+   * Check that all stations associated with an AP.
+   */
+  void CheckAssociation (void);
+  /**
+   * Check that (i) all stations belonging to the given BSSes received the SU PPDUs
+   * transmitted over the given channel width; and (ii) all stations belonging to
+   * the other BSSes did not receive any frame if BSS Color is set (due to BSS Color
+   * filtering) or if no transmission was performed on a channel adjacent to the one
+   * they operate on, otherwise.
+   *
+   * \param txBss the set of BSSes that transmitted an SU PPDU
+   * \param txChannelWidth the given transmission channel width in MHz
+   */
+  void CheckReceivedSuPpdus (std::set<uint8_t> txBss, uint16_t txChannelWidth);
+  /**
+   * Check that (i) all stations/APs belonging to the given BSSes received the DL/UL MU PPDUs
+   * transmitted over the given channel width and RU width; and (ii) stations/APs belonging to
+   * the other BSSes did not receive any frame if BSS Color is set (due to BSS Color
+   * filtering) or if no transmission addressed to/from stations with the same AID was
+   * performed on a channel adjacent to the one they operate on, otherwise.
+   *
+   * \param txBss the set of BSSes that transmitted an SU PPDU
+   * \param txChannelWidth the given transmission channel width in MHz
+   * \param ruType the given RU type
+   * \param nRus the number of RUs
+   * \param isDlMu true for DL MU PPDU, false for HE TB PPDU
+   */
+  void CheckReceivedMuPpdus (std::set<uint8_t> txBss, uint16_t txChannelWidth, HeRu::RuType ruType,
+                             std::size_t nRus, bool isDlMu);
+  /**
+   * Check that (i) all stations belonging to the given BSSes received the transmitted
+   * Trigger Frame; and (ii) all stations belonging to the other BSSes did not receive
+   * any frame Trigger Frame (given that a Trigger Frame is transmitted on the primary20
+   * channel and all the primary20 channels are distinct).
+   *
+   * \param txBss the set of BSSes that transmitted a Trigger Frame
+   * \param txChannelWidth the given transmission channel width in MHz
+   */
+  void CheckReceivedTriggerFrames (std::set<uint8_t> txBss, uint16_t txChannelWidth);
+
+private:
+  void DoSetup (void) override;
+  void DoRun (void) override;
+
+  uint16_t m_channelWidth;                       ///< operating channel width in MHz
+  bool m_useDistinctBssColors;                   ///< true to set distinct BSS colors to BSSes
+  uint8_t m_nBss;                                ///< number of BSSes
+  uint8_t m_nStationsPerBss;                     ///< number of stations per AP
+  std::vector<NetDeviceContainer> m_staDevices;  ///< containers for stations' NetDevices
+  NetDeviceContainer m_apDevices;                ///< container for AP's NetDevice
+  std::vector<std::bitset<74>> m_received;       /**< whether the last packet transmitted to/from each of
+                                                      the (up to 74 per BSS) stations was received */
+  std::vector<std::bitset<74>> m_processed;      /**< whether the last packet transmitted to/from each of
+                                                      the (up to 74 per BSS) stations was processed */
+  Time m_time;                                   ///< the time when the current action is executed
+  Ptr<WifiPsdu> m_trigger;                       ///< Basic Trigger Frame
+  WifiTxVector m_triggerTxVector;                ///< TX vector for Basic Trigger Frame
+  Time m_triggerTxDuration;                      ///< TX duration for Basic Trigger Frame
+};
+
+WifiPrimaryChannelsTest::WifiPrimaryChannelsTest (uint16_t channelWidth, bool useDistinctBssColors)
+  : TestCase ("Check correct transmissions for various primary channel settings"),
+    m_channelWidth (channelWidth),
+    m_useDistinctBssColors (useDistinctBssColors)
+{
+}
+
+WifiPrimaryChannelsTest::~WifiPrimaryChannelsTest ()
+{
+}
+
+void
+WifiPrimaryChannelsTest::Transmit (std::string context, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW)
+{
+  for (const auto& psduPair : psduMap)
+    {
+      std::stringstream ss;
+
+      if (psduPair.first != SU_STA_ID)
+        {
+          ss << " STA-ID " << psduPair.first;
+        }
+      ss << " " << psduPair.second->GetHeader (0).GetTypeString ()
+         << " seq " << psduPair.second->GetHeader (0).GetSequenceNumber ()
+         << " from " << psduPair.second->GetAddr2 ()
+         << " to " << psduPair.second->GetAddr1 ();
+      NS_LOG_INFO (ss.str ());
+    }
+  NS_LOG_INFO (" TXVECTOR " << txVector);
+}
+
+void
+WifiPrimaryChannelsTest::ReceiveDl (uint8_t bss, uint8_t station, Ptr<WifiPsdu> psdu,
+                                    RxSignalInfo rxSignalInfo, WifiTxVector txVector,
+                                    std::vector<bool> perMpduStatus)
+{
+  if (psdu->GetNMpdus () == 1)
+    {
+      const WifiMacHeader& hdr = psdu->GetHeader (0);
+
+      if (hdr.IsQosData () || hdr.IsTrigger ())
+        {
+          NS_LOG_INFO ("RECEIVED BY BSS=" << +bss << " STA=" << +station << "  " << *psdu);
+          // the MAC received a PSDU from the PHY
+          NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (station), false, "Station [" << +bss << "]["
+                                 << +station << "] received a frame twice");
+          m_received[bss].set (station);
+          // check if we are the intended destination of the PSDU
+          auto dev = DynamicCast<WifiNetDevice> (m_staDevices[bss].Get (station));
+          if ((hdr.IsQosData () && hdr.GetAddr1 () == dev->GetMac ()->GetAddress ())
+              || (hdr.IsTrigger () && hdr.GetAddr1 () == Mac48Address::GetBroadcast ()))
+            {
+              NS_TEST_EXPECT_MSG_EQ (m_processed[bss].test (station), false, "Station [" << +bss << "]["
+                                     << +station << "] processed a frame twice");
+              m_processed[bss].set (station);
+            }
+        }
+    }
+}
+
+void
+WifiPrimaryChannelsTest::ReceiveUl (uint8_t bss, Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
+                                    WifiTxVector txVector, std::vector<bool> perMpduStatus)
+{
+  // if the BSS color is zero, this AP might receive the frame sent by another AP. Given that
+  // stations only send TB PPDUs, we discard this frame if the TX vector is UL MU.
+  if (psdu->GetNMpdus () == 1 && psdu->GetHeader (0).IsQosData () && txVector.IsUlMu ())
+    {
+      auto dev = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss));
+
+      uint16_t staId = txVector.GetHeMuUserInfoMap ().begin ()->first;
+      uint8_t station = staId - 1;
+      NS_LOG_INFO ("RECEIVED FROM BSS=" << +bss << " STA=" << +station
+                   << "  " << *psdu);
+      // the MAC received a PSDU containing a QoS data frame from the PHY
+      NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (station), false, "AP of BSS " << +bss
+                             << " received a frame from station " << +station << " twice");
+      m_received[bss].set (station);
+      // check if we are the intended destination of the PSDU
+      if (psdu->GetHeader (0).GetAddr1 () == dev->GetMac ()->GetAddress ())
+        {
+          NS_TEST_EXPECT_MSG_EQ (m_processed[bss].test (station), false, "AP of BSS " << +bss
+                                 << " received a frame from station " << +station << " twice");
+          m_processed[bss].set (station);
+        }
+    }
+}
+
+void
+WifiPrimaryChannelsTest::DoSetup (void)
+{
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (40);
+  int64_t streamNumber = 100;
+  uint16_t frequency;
+
+  // we create as many stations per BSS as the number of 26-tone RUs in a channel
+  // of the configured width
+  switch (m_channelWidth)
+    {
+      case 20:
+        m_nStationsPerBss = 9;
+        frequency = 5180;
+        break;
+      case 40:
+        m_nStationsPerBss = 18;
+        frequency = 5190;
+        break;
+      case 80:
+        m_nStationsPerBss = 37;
+        frequency = 5210;
+        break;
+      case 160:
+        m_nStationsPerBss = 74;
+        frequency = 5250;
+        break;
+      default:
+        NS_ABORT_MSG ("Channel width (" << m_channelWidth << ") not allowed");
+    }
+
+  // we create as many BSSes as the number of 20 MHz subchannels
+  m_nBss = m_channelWidth / 20;
+
+  NodeContainer wifiApNodes;
+  wifiApNodes.Create (m_nBss);
+
+  std::vector<NodeContainer> wifiStaNodes (m_nBss);
+  for (auto& container : wifiStaNodes)
+    {
+      container.Create (m_nStationsPerBss);
+    }
+
+  Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel> ();
+  Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel> ();
+  spectrumChannel->AddPropagationLossModel (lossModel);
+  Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
+  spectrumChannel->SetPropagationDelayModel (delayModel);
+
+  SpectrumWifiPhyHelper phy;
+  phy.SetChannel (spectrumChannel);
+  phy.Set ("Frequency", UintegerValue (frequency));  // same frequency for all BSSes
+
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager");
+
+  WifiMacHelper mac;
+  mac.SetType ("ns3::StaWifiMac",
+               "Ssid", SsidValue (Ssid ("non-existent-ssid")),
+               "WaitBeaconTimeout", TimeValue (MicroSeconds (102400))); // same as BeaconInterval
+
+  // Each BSS uses a distinct primary20 channel
+  for (uint8_t bss = 0; bss < m_nBss; bss++)
+    {
+      phy.Set ("Primary20MHzIndex", UintegerValue (bss));
+
+      m_staDevices.push_back (wifi.Install (phy, mac, wifiStaNodes[bss]));
+    }
+
+  for (uint8_t bss = 0; bss < m_nBss; bss++)
+    {
+      phy.Set ("Primary20MHzIndex", UintegerValue (bss));
+
+      mac.SetType ("ns3::ApWifiMac",
+                  "Ssid", SsidValue (Ssid ("wifi-ssid-" + std::to_string (bss))),
+                  "BeaconInterval", TimeValue (MicroSeconds (102400)),
+                  "EnableBeaconJitter", BooleanValue (false));
+
+      m_apDevices.Add (wifi.Install (phy, mac, wifiApNodes.Get (bss)));
+    }
+  
+  // Assign fixed streams to random variables in use
+  streamNumber = wifi.AssignStreams (m_apDevices, streamNumber);
+  for (uint8_t bss = 0; bss < m_nBss; bss++)
+    {
+      streamNumber = wifi.AssignStreams (m_staDevices[bss], streamNumber);
+    }
+
+  // set BSS color
+  if (m_useDistinctBssColors)
+    {
+      for (uint8_t bss = 0; bss < m_nBss; bss++)
+        {
+          auto dev = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss));
+          dev->GetHeConfiguration ()->SetBssColor (bss + 1);
+        }
+    }
+
+  MobilityHelper mobility;
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+
+  positionAlloc->Add (Vector (0.0, 0.0, 0.0));   // all stations are co-located
+  mobility.SetPositionAllocator (positionAlloc);
+
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (wifiApNodes);
+  for (uint8_t bss = 0; bss < m_nBss; bss++)
+    {
+      mobility.Install (wifiStaNodes[bss]);
+    }
+
+  m_received.resize (m_nBss);
+  m_processed.resize (m_nBss);
+
+  // pre-compute the Basic Trigger Frame to send
+  auto apDev = DynamicCast<WifiNetDevice> (m_apDevices.Get (0));
+
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_CTL_TRIGGER);
+  hdr.SetAddr1 (Mac48Address::GetBroadcast ());
+  // Addr2 has to be set
+  hdr.SetSequenceNumber (1);
+
+  Ptr<Packet> pkt = Create<Packet> ();
+  CtrlTriggerHeader trigger;
+  trigger.SetType (TriggerFrameType::BASIC_TRIGGER);
+  pkt->AddHeader (trigger);
+
+  m_triggerTxVector = WifiTxVector (OfdmPhy::GetOfdmRate6Mbps (), 0, WIFI_PREAMBLE_LONG, 800, 1, 1, 0,
+                                    20, false, false, false);
+  m_trigger = Create<WifiPsdu> (pkt, hdr);
+
+  m_triggerTxDuration = WifiPhy::CalculateTxDuration (m_trigger->GetSize (), m_triggerTxVector,
+                                                      apDev->GetMac ()->GetWifiPhy ()->GetPhyBand ());
+}
+
+void
+WifiPrimaryChannelsTest::DoRun (void)
+{
+  // schedule association requests at different times
+  Ptr<WifiNetDevice> dev;
+
+  for (uint16_t i = 0; i < m_nStationsPerBss; i++)
+    {
+      // association can be done in parallel over the multiple BSSes
+      for (uint8_t bss = 0; bss < m_nBss; bss++)
+        {
+          dev = DynamicCast<WifiNetDevice> (m_staDevices[bss].Get (i));
+          Simulator::Schedule (i * MicroSeconds (102400), &WifiMac::SetSsid,
+                               dev->GetMac (), Ssid ("wifi-ssid-" + std::to_string (bss)));
+        }
+    }
+
+  // just before sending the beacon preceding the last association, increase the beacon
+  // interval (to the max allowed value) so that beacons do not interfere with data frames
+  for (uint8_t bss = 0; bss < m_nBss; bss++)
+    {
+      dev = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss));
+      auto mac = DynamicCast<ApWifiMac> (dev->GetMac ());
+
+      Simulator::Schedule ((m_nStationsPerBss - 1) * MicroSeconds (102400),
+                           &ApWifiMac::SetBeaconInterval, mac, MicroSeconds (1024 * 65535));
+    }
+
+  m_time = (m_nStationsPerBss + 1) * MicroSeconds (102400);
+
+  Simulator::Schedule (m_time, &WifiPrimaryChannelsTest::CheckAssociation, this);
+
+  // we are done with association. We now intercept frames received by the
+  // PHY layer on stations and APs, which will no longer be passed to the FEM.
+  for (uint8_t bss = 0; bss < m_nBss; bss++)
+    {
+      for (uint8_t i = 0; i < m_nStationsPerBss; i++)
+        {
+          auto dev = DynamicCast<WifiNetDevice> (m_staDevices[bss].Get (i));
+          Simulator::Schedule (m_time, &WifiPhy::SetReceiveOkCallback, dev->GetPhy (),
+                               MakeCallback (&WifiPrimaryChannelsTest::ReceiveDl, this)
+                                             .TwoBind (bss, i));
+        }
+      auto dev = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss));
+      Simulator::Schedule (m_time, &WifiPhy::SetReceiveOkCallback, dev->GetPhy (),
+                           MakeCallback (&WifiPrimaryChannelsTest::ReceiveUl, this)
+                                         .Bind (bss));
+    }
+
+  /*
+   * We start generating (downlink) SU PPDUs.
+   * First, APs operating on non-adjacent primary20 channels send a frame simultaneously
+   * in their primary20. This is done in two rounds. As an example, we consider the
+   * case of an 160 MHz operating channel:
+   *
+   *   AP0         AP2         AP4         AP6
+   * |-----|     |-----|     |-----|     |-----|     |
+   *
+   *         AP1         AP3         AP5         AP7
+   * |     |-----|     |-----|     |-----|     |-----|
+   *
+   * Then, we double the transmission channel width. We will have four rounds
+   * of transmissions. We avoid using adjacent channels to avoid interfence
+   * among transmissions:
+   *
+   *      AP0                     AP4
+   * |-----------|           |-----------|           |
+   *      AP1                     AP5
+   * |-----------|           |-----------|           |
+   *                  AP2                     AP6
+   * |           |-----------|           |-----------|
+   *                  AP3                     AP7
+   * |           |-----------|           |-----------|
+   *
+   * We double the transmission channel width again. We will have eight rounds
+   * of transmissions:
+   *
+   *            AP0
+   * |-----------------------|                       |
+   *            AP1
+   * |-----------------------|                       |
+   *            AP2
+   * |-----------------------|                       |
+   *            AP3
+   * |-----------------------|                       |
+   *                                    AP4
+   * |                       |-----------------------|
+   *                                    AP5
+   * |                       |-----------------------|
+   *                                    AP6
+   * |                       |-----------------------|
+   *                                    AP7
+   * |                       |-----------------------|
+   *
+   * We double the transmission channel width again. We will have eight rounds
+   * of transmissions:
+   *
+   *                        AP0
+   * |-----------------------------------------------|
+   *                        AP1
+   * |-----------------------------------------------|
+   *                        AP2
+   * |-----------------------------------------------|
+   *                        AP3
+   * |-----------------------------------------------|
+   *                        AP4
+   * |-----------------------------------------------|
+   *                        AP5
+   * |-----------------------------------------------|
+   *                        AP6
+   * |-----------------------------------------------|
+   *                        AP7
+   * |-----------------------------------------------|
+   *
+   * The transmission channel width reached the operating channel width, we are done.
+   */
+
+  Time roundDuration = MilliSeconds (5);  // upper bound on the duration of a round
+
+  // To have simultaneous transmissions on adjacent channels, just initialize
+  // nRounds to 1 and nApsPerRound to m_channelWidth / 20. Of course, the test
+  // will fail because some stations will not receive some frames due to interfence
+  for (uint16_t txChannelWidth = 20, nRounds = 2, nApsPerRound = m_channelWidth / 20 / 2;
+       txChannelWidth <= m_channelWidth;
+       txChannelWidth *= 2, nRounds *= 2, nApsPerRound /= 2)
+    {
+      nRounds = std::min<uint16_t> (nRounds, m_nBss);
+      nApsPerRound = std::max<uint16_t> (nApsPerRound, 1);
+
+      for (uint16_t round = 0; round < nRounds; round++)
+        {
+          std::set<uint8_t> txBss;
+
+          for (uint16_t i = 0; i < nApsPerRound; i++)
+            {
+              uint16_t ap = round + i * nRounds;
+              txBss.insert (ap);
+              Simulator::Schedule (m_time, &WifiPrimaryChannelsTest::SendDlSuPpdu, this,
+                                   ap, txChannelWidth);
+            }
+          // check that the SU frames were correctly received
+          Simulator::Schedule (m_time + roundDuration, &WifiPrimaryChannelsTest::CheckReceivedSuPpdus,
+                                this, txBss, txChannelWidth);
+          m_time += roundDuration;
+        }
+    }
+
+  /*
+   * Repeat the same scheme as before with DL MU transmissions. For each transmission
+   * channel width, every round is repeated as many times as the number of ways in
+   * which we can partition the transmission channel width in equal sized RUs.
+   */
+  for (uint16_t txChannelWidth = 20, nRounds = 2, nApsPerRound = m_channelWidth / 20 / 2;
+       txChannelWidth <= m_channelWidth;
+       txChannelWidth *= 2, nRounds *= 2, nApsPerRound /= 2)
+    {
+      nRounds = std::min<uint16_t> (nRounds, m_nBss);
+      nApsPerRound = std::max<uint16_t> (nApsPerRound, 1);
+
+      for (uint16_t round = 0; round < nRounds; round++)
+        {
+          for (unsigned int type = 0; type < 7; type++)
+            {
+              HeRu::RuType ruType = static_cast <HeRu::RuType> (type);
+              std::size_t nRus = HeRu::GetNRus (txChannelWidth, ruType);
+              std::set<uint8_t> txBss;
+              if (nRus > 0)
+                {
+                  for (uint16_t i = 0; i < nApsPerRound; i++)
+                    {
+                      uint16_t ap = round + i * nRounds;
+                      txBss.insert (ap);
+                      Simulator::Schedule (m_time, &WifiPrimaryChannelsTest::SendDlMuPpdu, this,
+                                           ap, txChannelWidth, ruType, nRus);
+                    }
+                  // check that the MU frame was correctly received
+                  Simulator::Schedule (m_time + roundDuration, &WifiPrimaryChannelsTest::CheckReceivedMuPpdus,
+                                      this, txBss, txChannelWidth, ruType, nRus, /* isDlMu */ true);
+                  m_time += roundDuration;
+                }
+            }
+        }
+    }
+
+  /*
+   * Repeat the same scheme as before with DL MU transmissions. For each transmission
+   * channel width, every round is repeated as many times as the number of ways in
+   * which we can partition the transmission channel width in equal sized RUs.
+   */
+  for (uint16_t txChannelWidth = 20, nRounds = 2, nApsPerRound = m_channelWidth / 20 / 2;
+       txChannelWidth <= m_channelWidth;
+       txChannelWidth *= 2, nRounds *= 2, nApsPerRound /= 2)
+    {
+      nRounds = std::min<uint16_t> (nRounds, m_nBss);
+      nApsPerRound = std::max<uint16_t> (nApsPerRound, 1);
+
+      for (uint16_t round = 0; round < nRounds; round++)
+        {
+          for (unsigned int type = 0; type < 7; type++)
+            {
+              HeRu::RuType ruType = static_cast <HeRu::RuType> (type);
+              std::size_t nRus = HeRu::GetNRus (txChannelWidth, ruType);
+              std::set<uint8_t> txBss;
+              if (nRus > 0)
+                {
+                  for (uint16_t i = 0; i < nApsPerRound; i++)
+                    {
+                      uint16_t ap = round + i * nRounds;
+                      txBss.insert (ap);
+                      Simulator::Schedule (m_time, &WifiPrimaryChannelsTest::SendHeTbPpdu, this,
+                                           ap, txChannelWidth, ruType, nRus);
+                    }
+                  // check that Trigger Frames and TB PPDUs were correctly received
+                  Simulator::Schedule (m_time + m_triggerTxDuration + MicroSeconds (10), /* during SIFS */
+                                       &WifiPrimaryChannelsTest::CheckReceivedTriggerFrames,
+                                      this, txBss, txChannelWidth);
+                  Simulator::Schedule (m_time + roundDuration, &WifiPrimaryChannelsTest::CheckReceivedMuPpdus,
+                                      this, txBss, txChannelWidth, ruType, nRus, /* isDlMu */ false);
+                  m_time += roundDuration;
+                }
+            }
+        }
+    }
+
+  // Trace PSDUs passed to the PHY on all devices
+  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxPsduBegin",
+                   MakeCallback (&WifiPrimaryChannelsTest::Transmit, this));
+
+  Simulator::Stop (m_time);
+  Simulator::Run ();
+
+  Simulator::Destroy ();
+}
+
+void
+WifiPrimaryChannelsTest::SendDlSuPpdu (uint8_t bss, uint16_t txChannelWidth)
+{
+  NS_LOG_INFO ("*** BSS " << +bss << " transmits on primary " << txChannelWidth << " MHz channel");
+
+  auto apDev = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss));
+  auto staDev = DynamicCast<WifiNetDevice> (m_staDevices[bss].Get (0));
+
+  uint8_t bssColor = apDev->GetHeConfiguration ()->GetBssColor ();
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs8 (), 0, WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, txChannelWidth, false, false, false, bssColor);
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_QOSDATA);
+  hdr.SetQosTid (0);
+  hdr.SetAddr1 (staDev->GetMac ()->GetAddress ());
+  hdr.SetAddr2 (apDev->GetMac ()->GetAddress ());
+  hdr.SetAddr3 (apDev->GetMac ()->GetBssid ());
+  hdr.SetSequenceNumber (1);
+  Ptr<WifiPsdu> psdu = Create<WifiPsdu> (Create<Packet> (1000), hdr);
+  apDev->GetPhy ()->Send (WifiConstPsduMap ({std::make_pair (SU_STA_ID, psdu)}), txVector);
+}
+
+void
+WifiPrimaryChannelsTest::SendDlMuPpdu (uint8_t bss, uint16_t txChannelWidth, HeRu::RuType ruType, std::size_t nRus)
+{
+  NS_LOG_INFO ("*** BSS " << +bss << " transmits on primary " << txChannelWidth
+               << " MHz channel a DL MU PPDU " << "addressed to " << nRus
+               << " stations (RU type: " << ruType << ")");
+
+  auto apDev = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss));
+  uint8_t bssColor = apDev->GetHeConfiguration ()->GetBssColor ();
+
+  WifiTxVector txVector = WifiTxVector (HePhy::GetHeMcs8 (), 0, WIFI_PREAMBLE_HE_MU, 800, 1, 1, 0, txChannelWidth, false, false, false, bssColor);
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_QOSDATA);
+  hdr.SetQosTid (0);
+  hdr.SetAddr2 (apDev->GetMac ()->GetAddress ());
+  hdr.SetAddr3 (apDev->GetMac ()->GetBssid ());
+  hdr.SetSequenceNumber (1);
+
+  WifiConstPsduMap psduMap;
+
+  for (std::size_t i = 1; i <= nRus; i++)
+    {
+      std::size_t index = (txChannelWidth == 160 && i > nRus / 2 ? i - nRus / 2 : i);
+      bool primary80 = (txChannelWidth == 160 && i > nRus / 2 ? false : true);
+
+      auto staDev = DynamicCast<WifiNetDevice> (m_staDevices[bss].Get (i - 1));
+      uint16_t staId = DynamicCast<StaWifiMac> (staDev->GetMac ())->GetAssociationId ();
+      txVector.SetHeMuUserInfo (staId, {{ruType, index, primary80}, HePhy::GetHeMcs8 (), 1});
+      hdr.SetAddr1 (staDev->GetMac ()->GetAddress ());
+      psduMap[staId] = Create<const WifiPsdu> (Create<Packet> (1000), hdr);
+    }
+  apDev->GetPhy ()->Send (psduMap, txVector);
+}
+
+void
+WifiPrimaryChannelsTest::SendHeTbPpdu (uint8_t bss, uint16_t txChannelWidth, HeRu::RuType ruType, std::size_t nRus)
+{
+  NS_LOG_INFO ("*** BSS " << +bss << " transmits a Basic Trigger Frame");
+
+  auto apDev = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss));
+
+  m_trigger->GetHeader (0).SetAddr2 (apDev->GetMac ()->GetAddress ());
+
+  apDev->GetPhy ()->Send (m_trigger, m_triggerTxVector);
+
+  // schedule the transmission of HE TB PPDUs
+  Simulator::Schedule (m_triggerTxDuration + apDev->GetPhy ()->GetSifs (),
+                       &WifiPrimaryChannelsTest::DoSendHeTbPpdu, this,
+                       bss, txChannelWidth, ruType, nRus);
+}
+
+void
+WifiPrimaryChannelsTest::DoSendHeTbPpdu (uint8_t bss, uint16_t txChannelWidth, HeRu::RuType ruType, std::size_t nRus)
+{
+  auto apDev = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss));
+  uint8_t bssColor = apDev->GetHeConfiguration ()->GetBssColor ();
+
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_QOSDATA);
+  hdr.SetQosTid (0);
+  hdr.SetAddr1 (apDev->GetMac ()->GetAddress ());
+  hdr.SetAddr3 (apDev->GetMac ()->GetBssid ());
+  hdr.SetSequenceNumber (1);
+
+  Time duration = Seconds (0);
+  uint16_t length = 0;
+
+  for (std::size_t i = 1; i <= nRus; i++)
+    {
+      NS_LOG_INFO ("*** BSS " << +bss << " STA " << i - 1 << " transmits on primary "
+                   << txChannelWidth << " MHz channel an HE TB PPDU (RU type: " << ruType << ")");
+
+      std::size_t index = (txChannelWidth == 160 && i > nRus / 2 ? i - nRus / 2 : i);
+      bool primary80 = (txChannelWidth == 160 && i > nRus / 2 ? false : true);
+
+      auto staDev = DynamicCast<WifiNetDevice> (m_staDevices[bss].Get (i - 1));
+      uint16_t staId = DynamicCast<StaWifiMac> (staDev->GetMac ())->GetAssociationId ();
+
+      WifiTxVector txVector (HePhy::GetHeMcs8 (), 0, WIFI_PREAMBLE_HE_TB, 3200, 1, 1, 0, txChannelWidth, false, false, false, bssColor);
+      txVector.SetHeMuUserInfo (staId, {{ruType, index, primary80}, HePhy::GetHeMcs8 (), 1});
+
+      hdr.SetAddr2 (staDev->GetMac ()->GetAddress ());
+      Ptr<const WifiPsdu> psdu = Create<const WifiPsdu> (Create<Packet> (1000), hdr);
+
+      if (duration.IsZero ())
+        {
+          // calculate just once
+          duration = WifiPhy::CalculateTxDuration (psdu->GetSize (), txVector,
+                                                   staDev->GetMac ()->GetWifiPhy ()->GetPhyBand (), staId);
+          length = HePhy::ConvertHeTbPpduDurationToLSigLength (duration,
+                                                               staDev->GetMac ()->GetWifiPhy ()->GetPhyBand ());
+        }
+      txVector.SetLength (length);
+
+      staDev->GetPhy ()->Send (WifiConstPsduMap {{staId, psdu}}, txVector);
+    }
+}
+
+void
+WifiPrimaryChannelsTest::CheckAssociation (void)
+{
+  for (uint8_t bss = 0; bss < m_nBss; bss++)
+    {
+      auto dev = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss));
+      auto mac = DynamicCast<ApWifiMac> (dev->GetMac ());
+      NS_TEST_EXPECT_MSG_EQ (mac->GetStaList ().size (), m_nStationsPerBss,
+                             "Not all the stations completed association");
+    }
+}
+
+void
+WifiPrimaryChannelsTest::CheckReceivedSuPpdus (std::set<uint8_t> txBss, uint16_t txChannelWidth)
+{
+  for (uint8_t bss = 0; bss < m_nBss; bss++)
+    {
+      if (txBss.find (bss) != txBss.end ())
+        {
+          // Every station in the BSS of an AP that transmitted the frame hears (i.e.,
+          // passes to the MAC) the frame
+          for (uint8_t sta = 0; sta < m_nStationsPerBss; sta++)
+            {
+              NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (sta), true, "Station [" << +bss << "][" << +sta
+                                    << "] did not receive the SU frame on primary" << txChannelWidth << " channel");
+            }
+          // only the first station actually processed the frames
+          NS_TEST_EXPECT_MSG_EQ (m_processed[bss].test (0), true, "Station [" << +bss << "][0]"
+                                << " did not process the SU frame on primary" << txChannelWidth << " channel");
+          for (uint8_t sta = 1; sta < m_nStationsPerBss; sta++)
+            {
+              NS_TEST_EXPECT_MSG_EQ (m_processed[bss].test (sta), false, "Station [" << +bss << "][" << +sta
+                                    << "] processed the SU frame on primary" << txChannelWidth << " channel");
+            }
+        }
+      else
+        {
+          // There was no transmission in this BSS. If BSS Color filtering is enabled or no frame
+          // transmission overlaps with the primary20 channel of this BSS, stations in this BSS
+          // did not hear any frame.
+          if (m_useDistinctBssColors
+              || std::none_of (txBss.begin (), txBss.end (),
+                               [&](const uint8_t& txAp)
+                               {
+                                 auto txApPhy = DynamicCast<WifiNetDevice> (m_apDevices.Get (txAp))->GetPhy ();
+                                 auto thisApPhy = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss))->GetPhy ();
+                                 return txApPhy->GetOperatingChannel ().GetPrimaryChannelIndex (txChannelWidth)
+                                        == thisApPhy->GetOperatingChannel ().GetPrimaryChannelIndex (txChannelWidth);
+                               }))
+            {
+              for (uint8_t sta = 0; sta < m_nStationsPerBss; sta++)
+                {
+                  NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (sta), false, "Station [" << +bss << "][" << +sta
+                                        << "] received the SU frame on primary" << txChannelWidth << " channel");
+                }
+            }
+          else
+            {
+              // all stations heard the frame but no station processed it
+              for (uint8_t sta = 0; sta < m_nStationsPerBss; sta++)
+                {
+                  NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (sta), true, "Station [" << +bss << "][" << +sta
+                                        << "] did not receive the SU frame on primary" << txChannelWidth << " channel");
+                  NS_TEST_EXPECT_MSG_EQ (m_processed[bss].test (sta), false, "Station [" << +bss << "][" << +sta
+                                        << "] processed the SU frame on primary" << txChannelWidth << " channel");
+                }
+            }
+        }
+      // reset bitmaps
+      m_received[bss].reset ();
+      m_processed[bss].reset ();
+    }
+}
+
+void
+WifiPrimaryChannelsTest::CheckReceivedMuPpdus (std::set<uint8_t> txBss, uint16_t txChannelWidth,
+                                               HeRu::RuType ruType, std::size_t nRus, bool isDlMu)
+{
+  for (uint8_t bss = 0; bss < m_nBss; bss++)
+    {
+      if (txBss.find (bss) != txBss.end ())
+        {
+          // Due to AID filtering, only stations that are addressed by the MU PPDU do hear the frame
+          for (uint8_t sta = 0; sta < nRus; sta++)
+            {
+              NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (sta), true,
+                                     (isDlMu ? "A DL MU PPDU transmitted to" : "An HE TB PPDU transmitted by")
+                                     << " station [" << +bss << "][" << +sta << "] on primary"
+                                     << txChannelWidth << " channel, RU type " << ruType
+                                     << " was not received");
+            }
+          for (uint8_t sta = nRus; sta < m_nStationsPerBss; sta++)
+            {
+              NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (sta), false,
+                                     (isDlMu ? "A DL MU PPDU" : "An HE TB PPDU")
+                                     << " transmitted on primary" << txChannelWidth
+                                     << " channel, RU type " << ruType << " was received "
+                                     << (isDlMu ? "by" : "from") << " station [" << +bss << "]["
+                                     << +sta << "]");
+            }
+          // only the addressed stations actually processed the frames
+          for (uint8_t sta = 0; sta < nRus; sta++)
+            {
+              NS_TEST_EXPECT_MSG_EQ (m_processed[bss].test (sta), true,
+                                     (isDlMu ? "A DL MU PPDU transmitted to" : "An HE TB PPDU transmitted by")
+                                     << " station [" << +bss << "][" << +sta << "] on primary"
+                                     << txChannelWidth << " channel, RU type " << ruType
+                                     << " was not processed");
+            }
+          for (uint8_t sta = nRus; sta < m_nStationsPerBss; sta++)
+            {
+              NS_TEST_EXPECT_MSG_EQ (m_processed[bss].test (sta), false,
+                                     (isDlMu ? "A DL MU PPDU" : "An HE TB PPDU")
+                                     << " transmitted on primary" << txChannelWidth
+                                     << " channel, RU type " << ruType << " was received "
+                                     << (isDlMu ? "by" : "from") << " station [" << +bss << "]["
+                                     << +sta << "] and processed");
+            }
+        }
+      else
+        {
+          // There was no transmission in this BSS. If BSS Color filtering is enabled or no frame
+          // transmission overlaps with the primary20 channel of this BSS, stations in this BSS
+          // did not hear any frame.
+          if (m_useDistinctBssColors
+              || std::none_of (txBss.begin (), txBss.end (),
+                               [&](const uint8_t& txAp)
+                               {
+                                 auto txApPhy = DynamicCast<WifiNetDevice> (m_apDevices.Get (txAp))->GetPhy ();
+                                 auto thisApPhy = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss))->GetPhy ();
+                                 return txApPhy->GetOperatingChannel ().GetPrimaryChannelIndex (txChannelWidth)
+                                        == thisApPhy->GetOperatingChannel ().GetPrimaryChannelIndex (txChannelWidth);
+                               }))
+            {
+              for (uint8_t sta = 0; sta < m_nStationsPerBss; sta++)
+                {
+                  NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (sta), false,
+                                         (isDlMu ? "A DL MU PPDU" : "An HE TB PPDU")
+                                         << " transmitted on primary" << txChannelWidth
+                                         << " channel, RU type " << ruType << " was received "
+                                         << (isDlMu ? "by" : "from") << " station [" << +bss << "]["
+                                         << +sta << "]");
+                }
+            }
+          else
+            {
+              // stations having the same AID of the stations addressed by the MU PPDI received the frame
+              for (uint8_t sta = 0; sta < nRus; sta++)
+                {
+                  NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (sta), true,
+                                         (isDlMu ? "A DL MU PPDU transmitted to" : "An HE TB PPDU transmitted by")
+                                         << " station [" << +bss << "][" << +sta << "] on primary"
+                                         << txChannelWidth << " channel, RU type " << ruType
+                                         << " was not received");
+                }
+              for (uint8_t sta = nRus; sta < m_nStationsPerBss; sta++)
+                {
+                  NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (sta), false,
+                                         (isDlMu ? "A DL MU PPDU" : "An HE TB PPDU")
+                                         << " transmitted on primary" << txChannelWidth
+                                         << " channel, RU type " << ruType << " was received "
+                                         << (isDlMu ? "by" : "from") << " station [" << +bss << "]["
+                                         << +sta << "]");
+                }
+              // no station processed the frame
+              for (uint8_t sta = 0; sta < m_nStationsPerBss; sta++)
+                {
+                  NS_TEST_EXPECT_MSG_EQ (m_processed[bss].test (sta), false,
+                                         (isDlMu ? "A DL MU PPDU" : "An HE TB PPDU")
+                                         << " transmitted on primary" << txChannelWidth
+                                         << " channel, RU type " << ruType << " was received "
+                                         << (isDlMu ? "by" : "from") << " station [" << +bss << "]["
+                                         << +sta << "] and processed");
+                }
+            }
+        }
+      // reset bitmaps
+      m_received[bss].reset ();
+      m_processed[bss].reset ();
+    }
+}
+
+void
+WifiPrimaryChannelsTest::CheckReceivedTriggerFrames (std::set<uint8_t> txBss, uint16_t txChannelWidth)
+{
+  for (uint8_t bss = 0; bss < m_nBss; bss++)
+    {
+      if (txBss.find (bss) != txBss.end ())
+        {
+          // Every station in the BSS of an AP that transmitted the Trigger Frame hears (i.e.,
+          // passes to the MAC) and processes the frame
+          for (uint8_t sta = 0; sta < m_nStationsPerBss; sta++)
+            {
+              NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (sta), true, "Station [" << +bss << "][" << +sta
+                                    << "] did not receive the Trigger Frame soliciting a transmission on primary"
+                                    << txChannelWidth << " channel");
+              NS_TEST_EXPECT_MSG_EQ (m_processed[bss].test (sta), true, "Station [" << +bss << "][" << +sta
+                                    << "] did not process the Trigger Frame soliciting a transmission on primary"
+                                    << txChannelWidth << " channel");
+            }
+        }
+      else
+        {
+          // Given that a Trigger Frame is transmitted on the primary20 channel and all the
+          // primary20 channels are distinct, stations in other BSSes did not hear the frame
+          for (uint8_t sta = 0; sta < m_nStationsPerBss; sta++)
+            {
+              NS_TEST_EXPECT_MSG_EQ (m_received[bss].test (sta), false, "Station [" << +bss << "][" << +sta
+                                    << "] received the Trigger Frame soliciting a transmission on primary"
+                                    << txChannelWidth << " channel");
+            }
+        }
+      // reset bitmaps
+      m_received[bss].reset ();
+      m_processed[bss].reset ();
+    }
+}
+
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief wifi primary channels test suite
+ */
+class WifiPrimaryChannelsTestSuite : public TestSuite
+{
+public:
+  WifiPrimaryChannelsTestSuite ();
+};
+
+WifiPrimaryChannelsTestSuite::WifiPrimaryChannelsTestSuite ()
+  : TestSuite ("wifi-primary-channels", UNIT)
+{
+  // Test cases for 20 MHz can be added, but are not that useful (there would be a single BSS)
+  AddTestCase (new WifiPrimaryChannelsTest (40, true), TestCase::QUICK);
+  AddTestCase (new WifiPrimaryChannelsTest (40, false), TestCase::QUICK);
+  AddTestCase (new WifiPrimaryChannelsTest (80, true), TestCase::EXTENSIVE);
+  AddTestCase (new WifiPrimaryChannelsTest (80, false), TestCase::EXTENSIVE);
+  AddTestCase (new WifiPrimaryChannelsTest (160, true), TestCase::TAKES_FOREVER);
+  AddTestCase (new WifiPrimaryChannelsTest (160, false), TestCase::TAKES_FOREVER);
+}
+
+static WifiPrimaryChannelsTestSuite g_wifiPrimaryChannelsTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/wifi-test.cc ns-3.34/src/wifi/test/wifi-test.cc
--- ns-3.33/src/wifi/test/wifi-test.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/wifi-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -47,7 +47,11 @@
 #include "ns3/ht-configuration.h"
 #include "ns3/wifi-ppdu.h"
 #include "ns3/wifi-psdu.h"
+#include "ns3/vht-phy.h"
 #include "ns3/waypoint-mobility-model.h"
+#include "ns3/frame-exchange-manager.h"
+#include "ns3/wifi-default-protection-manager.h"
+#include "ns3/wifi-default-ack-manager.h"
 
 using namespace ns3;
 
@@ -94,7 +98,7 @@
 public:
   WifiTest ();
 
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 
 private:
@@ -135,9 +139,18 @@
   Ptr<Node> node = CreateObject<Node> ();
   Ptr<WifiNetDevice> dev = CreateObject<WifiNetDevice> ();
 
-  Ptr<WifiMac> mac = m_mac.Create<WifiMac> ();
+  Ptr<RegularWifiMac> mac = m_mac.Create<RegularWifiMac> ();
   mac->SetDevice (dev);
+  mac->SetAddress (Mac48Address::Allocate ());
   mac->ConfigureStandard (WIFI_STANDARD_80211a);
+  Ptr<FrameExchangeManager> fem = mac->GetFrameExchangeManager ();
+  Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
+  protectionManager->SetWifiMac (mac);
+  fem->SetProtectionManager (protectionManager);
+  Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager> ();
+  ackManager->SetWifiMac (mac);
+  fem->SetAckManager (ackManager);
+
   Ptr<ConstantPositionMobilityModel> mobility = CreateObject<ConstantPositionMobilityModel> ();
   Ptr<YansWifiPhy> phy = CreateObject<YansWifiPhy> ();
   Ptr<ErrorRateModel> error = CreateObject<YansErrorRateModel> ();
@@ -149,7 +162,6 @@
 
   mobility->SetPosition (pos);
   node->AggregateObject (mobility);
-  mac->SetAddress (Mac48Address::Allocate ());
   dev->SetMac (mac);
   dev->SetPhy (phy);
   dev->SetRemoteStationManager (manager);
@@ -221,7 +233,7 @@
   QosUtilsIsOldPacketTest () : TestCase ("QosUtilsIsOldPacket")
   {
   }
-  virtual void DoRun (void)
+  void DoRun (void) override
   {
     //startingSeq=0, seqNum=2047
     NS_TEST_EXPECT_MSG_EQ (QosUtilsIsOldPacket (0, 2047), false, "2047 is new in comparison to 0");
@@ -251,7 +263,7 @@
 public:
   InterferenceHelperSequenceTest ();
 
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 
 private:
@@ -303,9 +315,18 @@
   Ptr<Node> node = CreateObject<Node> ();
   Ptr<WifiNetDevice> dev = CreateObject<WifiNetDevice> ();
 
-  Ptr<WifiMac> mac = m_mac.Create<WifiMac> ();
+  Ptr<RegularWifiMac> mac = m_mac.Create<RegularWifiMac> ();
   mac->SetDevice (dev);
+  mac->SetAddress (Mac48Address::Allocate ());
   mac->ConfigureStandard (WIFI_STANDARD_80211a);
+  Ptr<FrameExchangeManager> fem = mac->GetFrameExchangeManager ();
+  Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
+  protectionManager->SetWifiMac (mac);
+  fem->SetProtectionManager (protectionManager);
+  Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager> ();
+  ackManager->SetWifiMac (mac);
+  fem->SetAckManager (ackManager);
+
   Ptr<ConstantPositionMobilityModel> mobility = CreateObject<ConstantPositionMobilityModel> ();
   Ptr<YansWifiPhy> phy = CreateObject<YansWifiPhy> ();
   Ptr<ErrorRateModel> error = CreateObject<YansErrorRateModel> ();
@@ -318,7 +339,6 @@
 
   mobility->SetPosition (pos);
   node->AggregateObject (mobility);
-  mac->SetAddress (Mac48Address::Allocate ());
   dev->SetMac (mac);
   dev->SetPhy (phy);
   dev->SetRemoteStationManager (manager);
@@ -425,7 +445,7 @@
 public:
   DcfImmediateAccessBroadcastTestCase ();
 
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 
 private:
@@ -497,9 +517,18 @@
 
   Ptr<Node> txNode = CreateObject<Node> ();
   Ptr<WifiNetDevice> txDev = CreateObject<WifiNetDevice> ();
-  Ptr<WifiMac> txMac = m_mac.Create<WifiMac> ();
+  Ptr<RegularWifiMac> txMac = m_mac.Create<RegularWifiMac> ();
   txMac->SetDevice (txDev);
   txMac->ConfigureStandard (WIFI_STANDARD_80211a);
+  Ptr<FrameExchangeManager> fem = txMac->GetFrameExchangeManager ();
+  Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
+  protectionManager->SetWifiMac (txMac);
+  fem->SetProtectionManager (protectionManager);
+  Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager> ();
+  ackManager->SetWifiMac (txMac);
+  fem->SetAckManager (ackManager);
+
+
   //Fix the stream assignment to the Dcf Txop objects (backoffs)
   //The below stream assignment will result in the Txop object
   //using a backoff value of zero for this test when the
@@ -570,7 +599,7 @@
   Bug730TestCase ();
   virtual ~Bug730TestCase ();
 
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 
 private:
@@ -707,7 +736,7 @@
   QosFragmentationTestCase ();
   virtual ~QosFragmentationTestCase ();
 
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 
 private:
@@ -867,7 +896,7 @@
 public:
   SetChannelFrequencyTest ();
 
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 
 private:
@@ -920,11 +949,8 @@
     // case 0:
     // Default configuration, without WifiHelper::SetStandard or WifiHelper
     phySta = CreateObject<YansWifiPhy> ();
-    // The default results in an invalid configuration of channel 0,
-    // width 20, and frequency 0 MHz
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 0, "default configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "default configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 0, "default configuration");
+    // The default results in an invalid configuration
+    NS_TEST_ASSERT_MSG_EQ (phySta->GetOperatingChannel ().IsSet (), false, "default configuration");
   }
   {
     // case 1:
@@ -1053,19 +1079,8 @@
     // case 12:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    wifi.SetStandard (WIFI_STANDARD_holland);
-    staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
-    phySta = GetYansWifiPhyPtr (staDevice);
-    // We expect channel 36, width 20, frequency 5180
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 36, "802.11 5Mhz configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5Mhz configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5180, "802.11 5Mhz configuration");
-  }
-  {
-    // case 13:
-    WifiHelper wifi;
-    wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
     wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+    phy.Set ("ChannelWidth", UintegerValue (20)); // reset value after previous case
     phy.Set ("ChannelNumber", UintegerValue (44));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
@@ -1074,7 +1089,7 @@
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5220, "802.11 5GHz configuration");
   }
   {
-    // case 14:
+    // case 13:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
     phy.Set ("ChannelNumber", UintegerValue (44));
@@ -1089,57 +1104,62 @@
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5200, "802.11 5GHz configuration");
   }
   {
-    // case 15:
+    // case 14:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
     phy.Set ("ChannelNumber", UintegerValue (44));
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
-    // Post-install reconfiguration to channel width 40 MHz
+    // Post-install reconfiguration to a 40 MHz channel
     std::ostringstream path;
-    path << "/NodeList/*/DeviceList/" << staDevice.Get(0)->GetIfIndex () << "/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelWidth";
-    Config::Set (path.str(), UintegerValue (40));
+    path << "/NodeList/*/DeviceList/" << staDevice.Get(0)->GetIfIndex () << "/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber";
+    Config::Set (path.str(), UintegerValue (46));
     // Although channel 44 is configured originally for 20 MHz, we
     // allow it to be used for 40 MHz here
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 44, "802.11 5GHz configuration");
+    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 46, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 40, "802.11 5GHz configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5220, "802.11 5GHz configuration");
+    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5230, "802.11 5GHz configuration");
   }
   {
-    // case 16:
+    // case 15:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
     wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
     phySta->SetAttribute ("ChannelNumber", UintegerValue (44));
-    // Post-install reconfiguration to channel width 40 MHz
+    // Post-install reconfiguration to a 40 MHz channel
     std::ostringstream path;
-    path << "/NodeList/*/DeviceList/" << staDevice.Get(0)->GetIfIndex () << "/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelWidth";
-    Config::Set (path.str(), UintegerValue (40));
+    path << "/NodeList/*/DeviceList/" << staDevice.Get(0)->GetIfIndex () << "/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/ChannelNumber";
+    Config::Set (path.str(), UintegerValue (46));
     // Although channel 44 is configured originally for 20 MHz, we
     // allow it to be used for 40 MHz here
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 44, "802.11 5GHz configuration");
+    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 46, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 40, "802.11 5GHz configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5220, "802.11 5GHz configuration");
+    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5230, "802.11 5GHz configuration");
   }
   {
-    // case 17:
+    // case 16:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    // Test that setting Frequency to a non-standard value will zero the
-    // channel number
+    // Test that setting Frequency to a non-standard value will throw an exception
     wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
-    phySta->SetAttribute ("Frequency", UintegerValue (5281));
-    // We expect channel number to be zero since frequency doesn't match
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 0, "802.11 5GHz configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5281, "802.11 5GHz configuration");
+    bool exceptionThrown = false;
+    try
+      {
+        phySta->SetAttribute ("Frequency", UintegerValue (5281));
+      }
+    catch (const std::runtime_error&)
+      {
+        exceptionThrown = true;
+      }
+    // We expect that an exception is thrown
+    NS_TEST_ASSERT_MSG_EQ (exceptionThrown, true, "802.11 5GHz configuration");
   }
   {
-    // case 18:
+    // case 17:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
     wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
@@ -1154,50 +1174,79 @@
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5500, "802.11 5GHz configuration");
   }
   {
-    // case 19:
+    // case 18:
+    // Set a wrong channel after initialization
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
     wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
-    // This case will error exit due to invalid channel number unless
-    // we provide the DefineChannelNumber() below
-    phySta->DefineChannelNumber (99, WIFI_PHY_BAND_5GHZ, WIFI_PHY_STANDARD_80211n, 5185, 40);
-    phySta->SetAttribute ("ChannelNumber", UintegerValue (99));
+    bool exceptionThrown = false;
+    try
+      {
+        phySta->SetOperatingChannel (99, 5185, 40);
+      }
+    catch (const std::runtime_error&)
+      {
+        exceptionThrown = true;
+      }
+    // We expect that an exception is thrown
+    NS_TEST_ASSERT_MSG_EQ (exceptionThrown, true, "802.11 5GHz configuration");
   }
   {
-    // case 20:
+    // case 19:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
     // Test how channel number behaves when frequency is non-standard
     wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
-    phySta->SetAttribute ("Frequency", UintegerValue (5181));
-    // We expect channel number to be 0 due to unknown center frequency 5181
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 0, "802.11 5GHz configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5181, "802.11 5GHz configuration");
+    bool exceptionThrown = false;
+    try
+      {
+        phySta->SetAttribute ("Frequency", UintegerValue (5181));
+      }
+    catch (const std::runtime_error&)
+      {
+        exceptionThrown = true;
+      }
+    // We expect that an exception is thrown due to unknown center frequency 5181
+    NS_TEST_ASSERT_MSG_EQ (exceptionThrown, true, "802.11 5GHz configuration");
     phySta->SetAttribute ("Frequency", UintegerValue (5180));
     // We expect channel number to be 36 due to known center frequency 5180
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 36, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5180, "802.11 5GHz configuration");
-    phySta->SetAttribute ("Frequency", UintegerValue (5179));
-    // We expect channel number to be 0 due to unknown center frequency 5179
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 0, "802.11 5GHz configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5179, "802.11 5GHz configuration");
+    exceptionThrown = false;
+    try
+      {
+        phySta->SetAttribute ("Frequency", UintegerValue (5179));
+      }
+    catch (const std::runtime_error&)
+      {
+        exceptionThrown = true;
+      }
+    // We expect that an exception is thrown due to unknown center frequency 5179
+    NS_TEST_ASSERT_MSG_EQ (exceptionThrown, true, "802.11 5GHz configuration");
     phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 36, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5180, "802.11 5GHz configuration");
   }
   {
-    // case 21:
+    // case 20:
     WifiHelper wifi;
     wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
-    // Set both channel and frequency to consistent values
+    // Set both channel and frequency to consistent values before initialization
+    phy.Set ("Frequency", UintegerValue (5200));
+    phy.Set ("ChannelNumber", UintegerValue (40));
+    wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
+    staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
+    phySta = GetYansWifiPhyPtr (staDevice);
+    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 40, "802.11 5GHz configuration");
+    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
+    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5200, "802.11 5GHz configuration");
+    // Set both channel and frequency to consistent values after initialization
     wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
     staDevice = wifi.Install (phy, macSta, wifiStaNode.Get (0));
     phySta = GetYansWifiPhyPtr (staDevice);
@@ -1219,18 +1268,36 @@
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 40, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5200, "802.11 5GHz configuration");
-    phySta->SetAttribute ("Frequency", UintegerValue (5179));
+    bool exceptionThrown = false;
+    try
+      {
+        phySta->SetAttribute ("Frequency", UintegerValue (5179));
+      }
+    catch (const std::runtime_error&)
+      {
+        exceptionThrown = true;
+      }
     phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
-    // We expect channel number to be 36
+    // We expect channel number to be 36 and an exception to be thrown
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 36, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5180, "802.11 5GHz configuration");
+    NS_TEST_ASSERT_MSG_EQ (exceptionThrown, true, "802.11 5GHz configuration");
     phySta->SetAttribute ("ChannelNumber", UintegerValue (36));
-    phySta->SetAttribute ("Frequency", UintegerValue (5179));
-    // We expect channel number to be 0
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 0, "802.11 5GHz configuration");
+    exceptionThrown = false;
+    try
+      {
+        phySta->SetAttribute ("Frequency", UintegerValue (5179));
+      }
+    catch (const std::runtime_error&)
+      {
+        exceptionThrown = true;
+      }
+    // We expect channel number to be 36 and an exception to be thrown
+    NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelNumber (), 36, "802.11 5GHz configuration");
     NS_TEST_ASSERT_MSG_EQ (phySta->GetChannelWidth (), 20, "802.11 5GHz configuration");
-    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5179, "802.11 5GHz configuration");
+    NS_TEST_ASSERT_MSG_EQ (phySta->GetFrequency (), 5180, "802.11 5GHz configuration");
+    NS_TEST_ASSERT_MSG_EQ (exceptionThrown, true, "802.11 5GHz configuration");
   }
 
   Simulator::Destroy ();
@@ -1250,7 +1317,7 @@
   Bug2222TestCase ();
   virtual ~Bug2222TestCase ();
 
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 
 private:
@@ -1261,7 +1328,7 @@
    * \param context the context
    * \param adr the MAC address
    */
-  void TxDataFailedTrace (std::string context, Mac48Address adress);
+  void TxDataFailedTrace (std::string context, Mac48Address adr);
 };
 
 Bug2222TestCase::Bug2222TestCase ()
@@ -1386,7 +1453,7 @@
 public:
   Bug2843TestCase ();
   virtual ~Bug2843TestCase ();
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 private:
   /**
@@ -1434,7 +1501,7 @@
   // Get channel bandwidth and modulation class
   Ptr<const WifiSpectrumSignalParameters> wifiTxParams = DynamicCast<WifiSpectrumSignalParameters> (txParams);
 
-  Ptr<WifiPpdu> ppdu = Copy (wifiTxParams->ppdu);
+  Ptr<WifiPpdu> ppdu = wifiTxParams->ppdu->Copy ();
   WifiTxVector txVector = ppdu->GetTxVector ();
   m_channelWidth = txVector.GetChannelWidth ();
   WifiModulationClass modulationClass = txVector.GetMode ().GetModulationClass ();
@@ -1480,7 +1547,7 @@
   SpectrumWifiPhyHelper spectrumPhy;
   Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel> ();
   Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel> ();
-  lossModel->SetFrequency (5.180e9);
+  lossModel->SetFrequency (5.190e9);
   spectrumChannel->AddPropagationLossModel (lossModel);
 
   Ptr<ConstantSpeedPropagationDelayModel> delayModel
@@ -1489,7 +1556,7 @@
 
   spectrumPhy.SetChannel (spectrumChannel);
   spectrumPhy.SetErrorRateModel ("ns3::NistErrorRateModel");
-  spectrumPhy.Set ("Frequency", UintegerValue (5180));
+  spectrumPhy.Set ("Frequency", UintegerValue (5190));
   spectrumPhy.Set ("ChannelWidth", UintegerValue (channelWidth));
   spectrumPhy.Set ("TxPowerStart", DoubleValue (10));
   spectrumPhy.Set ("TxPowerEnd", DoubleValue (10));
@@ -1562,7 +1629,7 @@
 public:
   Bug2831TestCase ();
   virtual ~Bug2831TestCase ();
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 private:
   /**
@@ -1580,10 +1647,10 @@
   Ptr<YansWifiPhy> m_apPhy; ///< AP PHY
   Ptr<YansWifiPhy> m_staPhy; ///< STA PHY
 
-  uint8_t m_reassocReqCount; ///< count number of reassociation requests
-  uint8_t m_reassocRespCount; ///< count number of reassociation responses
-  uint8_t m_countOperationalChannelWidth20; ///< count number of beacon frames announcing a 20 MHz operating channel width
-  uint8_t m_countOperationalChannelWidth40; ///< count number of beacon frames announcing a 40 MHz operating channel width
+  uint16_t m_reassocReqCount; ///< count number of reassociation requests
+  uint16_t m_reassocRespCount; ///< count number of reassociation responses
+  uint16_t m_countOperationalChannelWidth20; ///< count number of beacon frames announcing a 20 MHz operating channel width
+  uint16_t m_countOperationalChannelWidth40; ///< count number of beacon frames announcing a 40 MHz operating channel width
 };
 
 Bug2831TestCase::Bug2831TestCase ()
@@ -1656,18 +1723,34 @@
   ObjectFactory mac;
   mac.SetTypeId ("ns3::ApWifiMac");
   mac.Set ("EnableBeaconJitter", BooleanValue (false));
-  Ptr<WifiMac> apMac = mac.Create<WifiMac> ();
+  Ptr<RegularWifiMac> apMac = mac.Create<RegularWifiMac> ();
   apMac->SetDevice (apDev);
+  apMac->SetAddress (Mac48Address::Allocate ());
   apMac->ConfigureStandard (WIFI_STANDARD_80211ax_5GHZ);
+  Ptr<FrameExchangeManager> fem = apMac->GetFrameExchangeManager ();
+  Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager> ();
+  protectionManager->SetWifiMac (apMac);
+  fem->SetProtectionManager (protectionManager);
+  Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager> ();
+  ackManager->SetWifiMac (apMac);
+  fem->SetAckManager (ackManager);
 
   Ptr<Node> staNode = CreateObject<Node> ();
   Ptr<WifiNetDevice> staDev = CreateObject<WifiNetDevice> ();
   Ptr<HtConfiguration> staHtConfiguration = CreateObject<HtConfiguration> ();
   staDev->SetHtConfiguration (staHtConfiguration);
   mac.SetTypeId ("ns3::StaWifiMac");
-  Ptr<WifiMac> staMac = mac.Create<WifiMac> ();
+  Ptr<RegularWifiMac> staMac = mac.Create<RegularWifiMac> ();
   staMac->SetDevice (staDev);
+  staMac->SetAddress (Mac48Address::Allocate ());
   staMac->ConfigureStandard (WIFI_STANDARD_80211ax_5GHZ);
+  fem = staMac->GetFrameExchangeManager ();
+  protectionManager = CreateObject<WifiDefaultProtectionManager> ();
+  protectionManager->SetWifiMac (staMac);
+  fem->SetProtectionManager (protectionManager);
+  ackManager = CreateObject<WifiDefaultAckManager> ();
+  ackManager->SetWifiMac (staMac);
+  fem->SetAckManager (ackManager);
 
   Ptr<ConstantPositionMobilityModel> apMobility = CreateObject<ConstantPositionMobilityModel> ();
   apMobility->SetPosition (Vector (0.0, 0.0, 0.0));
@@ -1696,7 +1779,6 @@
   m_staPhy->SetChannelNumber (36);
   m_staPhy->SetChannelWidth (20);
 
-  apMac->SetAddress (Mac48Address::Allocate ());
   apDev->SetMac (apMac);
   apDev->SetPhy (m_apPhy);
   ObjectFactory manager;
@@ -1704,7 +1786,6 @@
   apDev->SetRemoteStationManager (manager.Create<WifiRemoteStationManager> ());
   apNode->AddDevice (apDev);
 
-  staMac->SetAddress (Mac48Address::Allocate ());
   staDev->SetMac (staMac);
   staDev->SetPhy (m_staPhy);
   staDev->SetRemoteStationManager (manager.Create<WifiRemoteStationManager> ());
@@ -1745,7 +1826,7 @@
 public:
   StaWifiMacScanningTestCase ();
   virtual ~StaWifiMacScanningTestCase ();
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 private:
   /**
@@ -1937,7 +2018,7 @@
 public:
   Bug2470TestCase ();
   virtual ~Bug2470TestCase ();
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 private:
   /**
@@ -2223,7 +2304,7 @@
 public:
   Issue40TestCase ();
   virtual ~Issue40TestCase ();
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 private:
   /**
@@ -2248,7 +2329,7 @@
   /**
    * Transmit final data failed function
    * \param context the context
-   * \param adr the MAC address
+   * \param address the MAC address
    */
   void TxFinalDataFailedCallback (std::string context, Mac48Address address);
 
@@ -2409,7 +2490,7 @@
 public:
   Issue169TestCase ();
   virtual ~Issue169TestCase ();
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 private:
   /**
@@ -2424,7 +2505,7 @@
   /**
    * Callback that indicates a PSDU is being transmitted
    * \param context the context
-   * \param psduMap the PSDU map to transmit
+   * \param psdus the PSDU map to transmit
    * \param txVector the TX vector
    * \param txPowerW the TX power (W)
    */
@@ -2526,7 +2607,7 @@
  * The scenario considers an access point and a fixed station.
  * The access point first sends a 80 MHz PPDU to the station,
  * for which Ideal rate manager should select VH-MCS 0 based
- * on the distance (no interference generatd in this test). Then,
+ * on the distance (no interference generated in this test). Then,
  * the access point sends a 20 MHz PPDU to the station,
  * which corresponds to a SNR 6 dB higher than previously, hence
  * VHT-MCS 2 should be selected. Finally, the access point sends a
@@ -2539,7 +2620,7 @@
 public:
   IdealRateManagerChannelWidthTest ();
   virtual ~IdealRateManagerChannelWidthTest ();
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 private:
   /**
@@ -2585,7 +2666,24 @@
 void
 IdealRateManagerChannelWidthTest::ChangeChannelWidth (uint16_t channelWidth)
 {
-  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (channelWidth));
+  uint16_t frequency;
+  switch (channelWidth)
+    {
+    case 20:
+    default:
+      frequency = 5180;
+      break;
+    case 40:
+      frequency = 5190;
+      break;
+    case 80:
+      frequency = 5210;
+      break;
+    case 160:
+      frequency = 5250;
+      break;
+    }
+  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/Frequency", UintegerValue (frequency));
 }
 
 void
@@ -2658,19 +2756,19 @@
   Simulator::Schedule (Seconds (0.5), &IdealRateManagerChannelWidthTest::ChangeChannelWidth, this, 80);
   Simulator::Schedule (Seconds (1.0), &IdealRateManagerChannelWidthTest::SendPacket, this, apDevice.Get (0), staDevice.Get (0)->GetAddress ());
   //Selected rate should be VHT-MCS 1
-  Simulator::Schedule (Seconds (1.1), &IdealRateManagerChannelWidthTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs1 ());
+  Simulator::Schedule (Seconds (1.1), &IdealRateManagerChannelWidthTest::CheckLastSelectedMode, this, VhtPhy::GetVhtMcs1 ());
 
   //Set channel width to 20 MHz & send packet
   Simulator::Schedule (Seconds (1.5), &IdealRateManagerChannelWidthTest::ChangeChannelWidth, this, 20);
   Simulator::Schedule (Seconds (2.0), &IdealRateManagerChannelWidthTest::SendPacket, this, apDevice.Get (0), staDevice.Get (0)->GetAddress ());
   //Selected rate should be VHT-MCS 3 since SNR should be 6 dB higher than previously
-  Simulator::Schedule (Seconds (2.1), &IdealRateManagerChannelWidthTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs3 ());
+  Simulator::Schedule (Seconds (2.1), &IdealRateManagerChannelWidthTest::CheckLastSelectedMode, this, VhtPhy::GetVhtMcs3 ());
 
   //Set channel width to 40 MHz & send packet
   Simulator::Schedule (Seconds (2.5), &IdealRateManagerChannelWidthTest::ChangeChannelWidth, this, 40);
   Simulator::Schedule (Seconds (3.0), &IdealRateManagerChannelWidthTest::SendPacket, this, apDevice.Get (0), staDevice.Get (0)->GetAddress ());
   //Selected rate should be VHT-MCS 2 since SNR should be 3 dB lower than previously
-  Simulator::Schedule (Seconds (3.1), &IdealRateManagerChannelWidthTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs2 ());
+  Simulator::Schedule (Seconds (3.1), &IdealRateManagerChannelWidthTest::CheckLastSelectedMode, this, VhtPhy::GetVhtMcs2 ());
 
   Simulator::Stop (Seconds (3.2));
   Simulator::Run ();
@@ -2692,7 +2790,7 @@
 public:
   IdealRateManagerMimoTest ();
   virtual ~IdealRateManagerMimoTest ();
-  virtual void DoRun (void);
+  void DoRun (void) override;
 
 private:
   /**
@@ -2717,7 +2815,7 @@
   /**
    * Callback that indicates a PSDU is being transmitted
    * \param context the context
-   * \param psduMap the PSDU map to transmit
+   * \param psdus the PSDU map to transmit
    * \param txVector the TX vector
    * \param txPowerW the TX power (W)
    */
@@ -2845,7 +2943,7 @@
   // Selected NSS should be 1 since both TX and RX support a single antenna
   Simulator::Schedule (Seconds (1.2), &IdealRateManagerMimoTest::CheckLastSelectedNss, this, 1);
   // Selected rate should be VHT-MCS 2 because of settings and distance between TX and RX
-  Simulator::Schedule (Seconds (1.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs2 ());
+  Simulator::Schedule (Seconds (1.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, VhtPhy::GetVhtMcs2 ());
 
 
   // TX: 1 antenna
@@ -2858,7 +2956,7 @@
   // Selected NSS should be 1 since both TX and RX support a single antenna
   Simulator::Schedule (Seconds (2.2), &IdealRateManagerMimoTest::CheckLastSelectedNss, this, 1);
   // Selected rate should be increased to VHT-MCS 3 because of RX diversity resulting in SNR improvement of about 3dB
-  Simulator::Schedule (Seconds (2.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs3 ());
+  Simulator::Schedule (Seconds (2.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, VhtPhy::GetVhtMcs3 ());
 
 
   // TX: 1 antenna
@@ -2871,7 +2969,7 @@
   // Selected NSS should be 1 since TX supports a single antenna
   Simulator::Schedule (Seconds (3.2), &IdealRateManagerMimoTest::CheckLastSelectedNss, this, 1);
   // Selected rate should be as previously
-  Simulator::Schedule (Seconds (3.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs3 ());
+  Simulator::Schedule (Seconds (3.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, VhtPhy::GetVhtMcs3 ());
 
 
   // TX: 2 antennas, but only supports 1 spatial stream
@@ -2884,7 +2982,7 @@
   // Selected NSS should be 1 since both TX and RX support a single antenna
   Simulator::Schedule (Seconds (4.2), &IdealRateManagerMimoTest::CheckLastSelectedNss, this, 1);
   // Selected rate should be VHT-MCS 2 because we do no longer have diversity in this scenario (more antennas at TX does not result in SNR improvement in AWGN channel)
-  Simulator::Schedule (Seconds (4.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs2 ());
+  Simulator::Schedule (Seconds (4.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, VhtPhy::GetVhtMcs2 ());
 
 
   // TX: 2 antennas, but only supports 1 spatial stream
@@ -2897,7 +2995,7 @@
   // Selected NSS should be 1 since both TX and RX support a single antenna
   Simulator::Schedule (Seconds (5.2), &IdealRateManagerMimoTest::CheckLastSelectedNss, this, 1);
   // Selected rate should be increased to VHT-MCS 3 because of RX diversity resulting in SNR improvement of about 3dB (more antennas at TX does not result in SNR improvement in AWGN channel)
-  Simulator::Schedule (Seconds (5.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs3 ());
+  Simulator::Schedule (Seconds (5.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, VhtPhy::GetVhtMcs3 ());
 
 
   // TX: 2 antennas, but only supports 1 spatial stream
@@ -2910,7 +3008,7 @@
   // Selected NSS should be 1 since TX supports a single antenna
   Simulator::Schedule (Seconds (6.2), &IdealRateManagerMimoTest::CheckLastSelectedNss, this, 1);
   // Selected rate should be as previously
-  Simulator::Schedule (Seconds (6.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs3 ());
+  Simulator::Schedule (Seconds (6.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, VhtPhy::GetVhtMcs3 ());
 
 
   // TX: 2 antennas, and supports 2 spatial streams
@@ -2923,7 +3021,7 @@
   // Selected NSS should be 1 since RX supports a single antenna
   Simulator::Schedule (Seconds (7.2), &IdealRateManagerMimoTest::CheckLastSelectedNss, this, 1);
   // Selected rate should be VHT-MCS 2 because we do no longer have diversity in this scenario (more antennas at TX does not result in SNR improvement in AWGN channel)
-  Simulator::Schedule (Seconds (7.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs2 ());
+  Simulator::Schedule (Seconds (7.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, VhtPhy::GetVhtMcs2 ());
 
 
   // TX: 2 antennas, and supports 2 spatial streams
@@ -2936,7 +3034,7 @@
   // Selected NSS should be 1 since RX supports a single antenna
   Simulator::Schedule (Seconds (8.2), &IdealRateManagerMimoTest::CheckLastSelectedNss, this, 1);
   // Selected rate should be increased to VHT-MCS 3 because of RX diversity resulting in SNR improvement of about 3dB (more antennas at TX does not result in SNR improvement in AWGN channel)
-  Simulator::Schedule (Seconds (8.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs3 ());
+  Simulator::Schedule (Seconds (8.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, VhtPhy::GetVhtMcs3 ());
 
 
   // TX: 2 antennas, and supports 2 spatial streams
@@ -2949,7 +3047,7 @@
   // Selected NSS should be 2 since both TX and RX support 2 antennas
   Simulator::Schedule (Seconds (9.2), &IdealRateManagerMimoTest::CheckLastSelectedNss, this, 2);
   // Selecte rate should be the same as without diversity, as it uses 2 spatial streams so there is no more benefits from diversity in AWGN channels
-  Simulator::Schedule (Seconds (9.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs2 ());
+  Simulator::Schedule (Seconds (9.2), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, VhtPhy::GetVhtMcs2 ());
 
 
   // Verify we can go back to initial situation
@@ -2957,7 +3055,7 @@
   Simulator::Schedule (Seconds (9.9), &IdealRateManagerMimoTest::SetStaMimoSettings, this, 1, 1);
   Simulator::Schedule (Seconds (10.0), &IdealRateManagerMimoTest::SendPacket, this, apDevice.Get (0), staDevice.Get (0)->GetAddress ());
   Simulator::Schedule (Seconds (10.1), &IdealRateManagerMimoTest::CheckLastSelectedNss, this, 1);
-  Simulator::Schedule (Seconds (10.1), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, WifiPhy::GetVhtMcs2 ());
+  Simulator::Schedule (Seconds (10.1), &IdealRateManagerMimoTest::CheckLastSelectedMode, this, VhtPhy::GetVhtMcs2 ());
 
   Simulator::Stop (Seconds (10.2));
   Simulator::Run ();
@@ -2987,7 +3085,7 @@
    * \returns true if data rates are the same, false otherwise
    */
   bool CheckDataRate (HeRu::RuType ruType, std::string mcs, uint8_t nss, uint16_t guardInterval, uint16_t expectedDataRate);
-  virtual void DoRun (void);
+  void DoRun (void) override;
 };
 
 HeRuMcsDataRateTestCase::HeRuMcsDataRateTestCase ()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/wifi-transmit-mask-test.cc ns-3.34/src/wifi/test/wifi-transmit-mask-test.cc
--- ns-3.33/src/wifi/test/wifi-transmit-mask-test.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/test/wifi-transmit-mask-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -74,7 +74,7 @@
   double m_tolerance;                  ///< tolerance (in dB)
 
 private:
-  virtual void DoRun (void);
+  void DoRun (void) override;
   /**
    * Interpolate PSD values for indexes between provided start and stop and append to provided
    * vector.
@@ -113,7 +113,6 @@
       freq = 2412;
     // no break on purpose
     case WIFI_PHY_STANDARD_80211a:
-    case WIFI_PHY_STANDARD_holland:
       NS_ASSERT (bw == 20);
       m_actualSpectrum = WifiSpectrumValueHelper::CreateOfdmTxPowerSpectralDensity (freq, bw, refTxPowerW, bw, -20.0, -28.0, outerBandMaximumRejection);
       break;
@@ -330,13 +329,6 @@
                                                20, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
 
-  // 11a (holland)
-  NS_LOG_FUNCTION ("Check slopes for 11a (holland)");
-  // same slopes as 11a (same PHY layer)
-  AddTestCase (new WifiOfdmMaskSlopesTestCase ("11a (holland)", WIFI_PHY_STANDARD_holland, WIFI_PHY_BAND_5GHZ,
-                                               20, maskSlopesLeft, maskSlopesRight, tol),
-               TestCase::QUICK);
-
   // 11g
   NS_LOG_FUNCTION ("Check slopes for 11g");
   // same slppes as 11g
@@ -711,4 +703,7 @@
   AddTestCase (new WifiOfdmMaskSlopesTestCase ("11ax_5GHz 160MHz", WIFI_PHY_STANDARD_80211ax, WIFI_PHY_BAND_5GHZ,
                                                160, maskSlopesLeft, maskSlopesRight, tol),
                TestCase::QUICK);
+
+  maskSlopesLeft.clear ();
+  maskSlopesRight.clear ();
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/test/wifi-txop-test.cc ns-3.34/src/wifi/test/wifi-txop-test.cc
--- ns-3.33/src/wifi/test/wifi-txop-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.34/src/wifi/test/wifi-txop-test.cc	2021-07-14 10:31:07.000000000 -0700
@@ -0,0 +1,778 @@
+ /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Stefano Avallone <stavallo@unina.it>
+ */
+
+#include "ns3/test.h"
+#include "ns3/string.h"
+#include "ns3/qos-utils.h"
+#include "ns3/packet.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/wifi-mac-header.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/spectrum-wifi-helper.h"
+#include "ns3/single-model-spectrum-channel.h"
+#include "ns3/packet-socket-server.h"
+#include "ns3/packet-socket-client.h"
+#include "ns3/packet-socket-helper.h"
+#include "ns3/config.h"
+#include "ns3/pointer.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/wifi-psdu.h"
+#include "ns3/wifi-ppdu.h"
+#include "ns3/ap-wifi-mac.h"
+
+using namespace ns3;
+
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief Test TXOP rules
+ *
+ *
+ */
+class WifiTxopTest : public TestCase
+{
+public:
+  /**
+   * Constructor
+   * \param pifsRecovery whether PIFS recovery is used after failure of a non-initial frame
+   */
+  WifiTxopTest (bool pifsRecovery);
+  virtual ~WifiTxopTest ();
+
+  /**
+   * Function to trace packets received by the server application
+   * \param context the context
+   * \param p the packet
+   * \param addr the address
+   */
+  void L7Receive (std::string context, Ptr<const Packet> p, const Address &addr);
+  /**
+   * Callback invoked when PHY receives a PSDU to transmit
+   * \param context the context
+   * \param psduMap the PSDU map
+   * \param txVector the TX vector
+   * \param txPowerW the tx power in Watts
+   */
+  void Transmit (std::string context, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
+  /**
+   * Check correctness of transmitted frames
+   */
+  void CheckResults (void);
+
+private:
+  void DoRun (void) override;
+
+  /// Information about transmitted frames
+  struct FrameInfo
+  {
+    Time txStart;                         ///< Frame start TX time
+    Time txDuration;                      ///< Frame TX duration
+    WifiMacHeader header;                 ///< Frame MAC header
+    WifiTxVector txVector;                ///< TX vector used to transmit the frame
+  };
+
+  uint16_t m_nStations;                   ///< number of stations
+  NetDeviceContainer m_staDevices;        ///< container for stations' NetDevices
+  NetDeviceContainer m_apDevices;         ///< container for AP's NetDevice
+  std::vector<FrameInfo> m_txPsdus;       ///< transmitted PSDUs
+  Time m_txopLimit;                       ///< TXOP limit
+  uint8_t m_aifsn;                        ///< AIFSN for BE
+  uint32_t m_cwMin;                       ///< CWmin for BE
+  uint16_t m_received;                    ///< number of packets received by the stations
+  bool m_pifsRecovery;                    ///< whether to use PIFS recovery
+};
+
+WifiTxopTest::WifiTxopTest (bool pifsRecovery)
+  : TestCase ("Check correct operation within TXOPs"),
+    m_nStations (3),
+    m_txopLimit (MicroSeconds (4768)),
+    m_received (0),
+    m_pifsRecovery (pifsRecovery)
+{
+}
+
+WifiTxopTest::~WifiTxopTest ()
+{
+}
+
+void
+WifiTxopTest::L7Receive (std::string context, Ptr<const Packet> p, const Address &addr)
+{
+  if (p->GetSize () >= 500)
+    {
+      m_received++;
+    }
+}
+
+void
+WifiTxopTest::Transmit (std::string context, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW)
+{
+  // Log all transmitted frames that are not beacon frames and have been transmitted
+  // after 400ms (so as to skip association requests/responses)
+  if (!psduMap.begin ()->second->GetHeader (0).IsBeacon ()
+      && Simulator::Now () > MilliSeconds (400))
+    {
+      m_txPsdus.push_back ({Simulator::Now (),
+                            WifiPhy::CalculateTxDuration (psduMap, txVector, WIFI_PHY_BAND_5GHZ),
+                            psduMap[SU_STA_ID]->GetHeader (0), txVector});
+    }
+
+  // Print all the transmitted frames if the test is executed through test-runner
+  std::cout << Simulator::Now () << " " << psduMap.begin ()->second->GetHeader (0).GetTypeString ()
+            << " seq " << psduMap.begin ()->second->GetHeader (0).GetSequenceNumber ()
+            << " to " << psduMap.begin ()->second->GetAddr1 ()
+            << " TX duration " << WifiPhy::CalculateTxDuration (psduMap, txVector, WIFI_PHY_BAND_5GHZ)
+            << " duration/ID " << psduMap.begin ()->second->GetHeader (0).GetDuration () << std::endl;
+}
+
+void
+WifiTxopTest::DoRun (void)
+{
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (40);
+  int64_t streamNumber = 100;
+
+  NodeContainer wifiApNode;
+  wifiApNode.Create (1);
+
+  NodeContainer wifiStaNodes;
+  wifiStaNodes.Create (m_nStations);
+
+  Ptr<SingleModelSpectrumChannel> spectrumChannel = CreateObject<SingleModelSpectrumChannel> ();
+  Ptr<FriisPropagationLossModel> lossModel = CreateObject<FriisPropagationLossModel> ();
+  spectrumChannel->AddPropagationLossModel (lossModel);
+  Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
+  spectrumChannel->SetPropagationDelayModel (delayModel);
+
+  SpectrumWifiPhyHelper phy;
+  phy.SetChannel (spectrumChannel);
+
+  Config::SetDefault ("ns3::QosFrameExchangeManager::PifsRecovery", BooleanValue (m_pifsRecovery));
+  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", UintegerValue (1900));
+
+  WifiHelper wifi;
+  wifi.SetStandard (WIFI_STANDARD_80211a);
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                "DataMode", StringValue ("OfdmRate12Mbps"),
+                                "ControlMode", StringValue ("OfdmRate6Mbps"));
+
+  WifiMacHelper mac;
+  mac.SetType ("ns3::StaWifiMac",
+               "QosSupported", BooleanValue (true),
+               "Ssid", SsidValue (Ssid ("non-existent-ssid")));
+
+  m_staDevices = wifi.Install (phy, mac, wifiStaNodes);
+
+  mac.SetType ("ns3::ApWifiMac",
+               "QosSupported", BooleanValue (true),
+               "Ssid", SsidValue (Ssid ("wifi-txop-ssid")),
+               "BeaconInterval", TimeValue (MicroSeconds (102400)),
+               "EnableBeaconJitter", BooleanValue (false));
+
+  m_apDevices = wifi.Install (phy, mac, wifiApNode);
+
+  // schedule association requests at different times
+  Time init = MilliSeconds (100);
+  Ptr<WifiNetDevice> dev;
+
+  for (uint16_t i = 0; i < m_nStations; i++)
+    {
+      dev = DynamicCast<WifiNetDevice> (m_staDevices.Get (i));
+      Simulator::Schedule (init + i * MicroSeconds (102400), &WifiMac::SetSsid,
+                           dev->GetMac (), Ssid ("wifi-txop-ssid"));
+    }
+
+  // Assign fixed streams to random variables in use
+  wifi.AssignStreams (m_apDevices, streamNumber);
+
+  MobilityHelper mobility;
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+
+  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
+  positionAlloc->Add (Vector (1.0, 0.0, 0.0));
+  positionAlloc->Add (Vector (0.0, 1.0, 0.0));
+  positionAlloc->Add (Vector (-1.0, 0.0, 0.0));
+  mobility.SetPositionAllocator (positionAlloc);
+
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (wifiApNode);
+  mobility.Install (wifiStaNodes);
+
+  // set the TXOP limit on BE AC
+  dev = DynamicCast<WifiNetDevice> (m_apDevices.Get (0));
+  PointerValue ptr;
+  dev->GetMac ()->GetAttribute ("BE_Txop", ptr);
+  ptr.Get<QosTxop> ()->SetTxopLimit (m_txopLimit);
+  m_aifsn = ptr.Get<QosTxop> ()->GetAifsn ();
+  m_cwMin = ptr.Get<QosTxop> ()->GetMinCw ();
+
+  PacketSocketHelper packetSocket;
+  packetSocket.Install (wifiApNode);
+  packetSocket.Install (wifiStaNodes);
+
+  // DL frames
+  for (uint16_t i = 0; i < m_nStations; i++)
+    {
+      PacketSocketAddress socket;
+      socket.SetSingleDevice (m_apDevices.Get (0)->GetIfIndex ());
+      socket.SetPhysicalAddress (m_staDevices.Get (i)->GetAddress ());
+      socket.SetProtocol (1);
+
+      // Send one QoS data frame (not protected by RTS/CTS) to each station
+      Ptr<PacketSocketClient> client1 = CreateObject<PacketSocketClient> ();
+      client1->SetAttribute ("PacketSize", UintegerValue (500));
+      client1->SetAttribute ("MaxPackets", UintegerValue (1));
+      client1->SetAttribute ("Interval", TimeValue (MicroSeconds (1)));
+      client1->SetRemote (socket);
+      wifiApNode.Get (0)->AddApplication (client1);
+      client1->SetStartTime (MilliSeconds (410));
+      client1->SetStopTime (Seconds (1.0));
+
+      // Send one QoS data frame (protected by RTS/CTS) to each station
+      Ptr<PacketSocketClient> client2 = CreateObject<PacketSocketClient> ();
+      client2->SetAttribute ("PacketSize", UintegerValue (2000));
+      client2->SetAttribute ("MaxPackets", UintegerValue (1));
+      client2->SetAttribute ("Interval", TimeValue (MicroSeconds (1)));
+      client2->SetRemote (socket);
+      wifiApNode.Get (0)->AddApplication (client2);
+      client2->SetStartTime (MilliSeconds (520));
+      client2->SetStopTime (Seconds (1.0));
+
+      Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer> ();
+      server->SetLocal (socket);
+      wifiStaNodes.Get (i)->AddApplication (server);
+      server->SetStartTime (Seconds (0.0));
+      server->SetStopTime (Seconds (1.0));
+    }
+
+  // The AP does not correctly receive the Ack sent in response to the QoS
+  // data frame sent to the first station
+  Ptr<ReceiveListErrorModel> apPem = CreateObject<ReceiveListErrorModel> ();
+  apPem->SetList ({6});
+  dev = DynamicCast<WifiNetDevice> (m_apDevices.Get (0));
+  dev->GetMac ()->GetWifiPhy ()->SetPostReceptionErrorModel (apPem);
+
+  // The second station does not correctly receive the first QoS
+  // data frame sent by the AP
+  Ptr<ReceiveListErrorModel> sta2Pem = CreateObject<ReceiveListErrorModel> ();
+  sta2Pem->SetList ({19});
+  dev = DynamicCast<WifiNetDevice> (m_staDevices.Get (1));
+  dev->GetMac ()->GetWifiPhy ()->SetPostReceptionErrorModel (sta2Pem);
+
+  // UL Traffic (the first station sends one frame to the AP)
+    {
+      PacketSocketAddress socket;
+      socket.SetSingleDevice (m_staDevices.Get (0)->GetIfIndex ());
+      socket.SetPhysicalAddress (m_apDevices.Get (0)->GetAddress ());
+      socket.SetProtocol (1);
+
+      Ptr<PacketSocketClient> client = CreateObject<PacketSocketClient> ();
+      client->SetAttribute ("PacketSize", UintegerValue (1500));
+      client->SetAttribute ("MaxPackets", UintegerValue (1));
+      client->SetAttribute ("Interval", TimeValue (MicroSeconds (0)));
+      client->SetRemote (socket);
+      wifiStaNodes.Get (0)->AddApplication (client);
+      client->SetStartTime (MilliSeconds (412));
+      client->SetStopTime (Seconds (1.0));
+
+      Ptr<PacketSocketServer> server = CreateObject<PacketSocketServer> ();
+      server->SetLocal (socket);
+      wifiApNode.Get (0)->AddApplication (server);
+      server->SetStartTime (Seconds (0.0));
+      server->SetStopTime (Seconds (1.0));
+    }
+
+  Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::PacketSocketServer/Rx",
+                   MakeCallback (&WifiTxopTest::L7Receive, this));
+  // Trace PSDUs passed to the PHY on all devices
+  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxPsduBegin",
+                   MakeCallback (&WifiTxopTest::Transmit, this));
+
+  Simulator::Stop (Seconds (1));
+  Simulator::Run ();
+
+  CheckResults ();
+
+  Simulator::Destroy ();
+}
+
+void
+WifiTxopTest::CheckResults (void)
+{
+  Time tEnd,                           // TX end for a frame
+       tStart,                         // TX start fot the next frame
+       txopStart,                      // TXOP start time
+       tolerance = NanoSeconds (50),   // due to propagation delay
+       sifs = DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetPhy ()->GetSifs (),
+       slot = DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetPhy ()->GetSlot (),
+       navEnd;
+
+  // lambda to round Duration/ID (in microseconds) up to the next higher integer
+  auto RoundDurationId = [] (Time t)
+    {
+      return MicroSeconds (ceil (static_cast<double> (t.GetNanoSeconds ()) / 1000));
+    };
+
+  /*
+   * Verify the different behavior followed when an initial/non-initial frame of a TXOP
+   * fails. Also, verify that a CF-end frame is sent if enough time remains in the TXOP.
+   * The destination of failed frames is put in square brackets below.
+   *
+   *          |---NAV-----till end TXOP--------->|
+   *          |      |----NAV--till end TXOP---->|
+   *          |      |              |---------------------------NAV---------------------------------->|
+   *          |      |              |      |--------------------------NAV---------------------------->|
+   *          |      |              |      |      |------------------------NAV----------------------->|
+   *          |      |              |      |      |                  |-------------NAV--------------->|
+   *     Start|      |         Start|      |      |                  |      |----------NAV----------->|
+   *     TXOP |      |         TXOP |      |      |   Ack            |      |      |-------NAV------->|
+   *      |   |      |          |   |      |      | Timeout          |      |      |      |---NAV---->|
+   *      |---|  |---|-backoff->|---|  |---|  |---|   |-PIFS or->|---|  |---|  |---|  |---|  |-----|
+   *      |QoS|  |Ack|          |QoS|  |Ack|  |QoS|   |-backoff->|QoS|  |Ack|  |QoS|  |Ack|  |CFend|
+   * ----------------------------------------------------------------------------------------------------
+   * From:  AP    STA1            AP    STA1    AP                 AP    STA2    AP    STA3    AP
+   *   To: STA1   [AP]           STA1    AP   [STA2]              STA2    AP    STA3    AP     all
+   */
+
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus.size (), 25, "Expected 25 transmitted frames");
+
+  // the first frame sent after 400ms is a QoS data frame sent by the AP to STA1
+  txopStart = m_txPsdus[0].txStart;
+
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[0].header.IsQosData (), true,
+                         "Expected a QoS data frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[0].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_staDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a frame sent by the AP to the first station");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[0].header.GetDuration (),
+                         RoundDurationId (m_txopLimit - m_txPsdus[0].txDuration),
+                         "Duration/ID of the first frame must cover the whole TXOP");
+
+  // a Normal Ack is sent by STA1
+  tEnd = m_txPsdus[0].txStart + m_txPsdus[0].txDuration;
+  tStart = m_txPsdus[1].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the first frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the first frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[1].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[1].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a Normal Ack sent to the AP");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[1].header.GetDuration (),
+                         RoundDurationId (m_txPsdus[0].header.GetDuration () - sifs - m_txPsdus[1].txDuration),
+                         "Duration/ID of the Ack must be derived from that of the first frame");
+
+  // the AP receives a corrupted Ack in response to the frame it sent, which is the initial
+  // frame of a TXOP. Hence, the TXOP is terminated and the AP retransmits the frame after
+  // invoking the backoff
+  txopStart = m_txPsdus[2].txStart;
+
+  tEnd = m_txPsdus[1].txStart + m_txPsdus[1].txDuration;
+  tStart = m_txPsdus[2].txStart;
+
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot,
+                               "Less than AIFS elapsed between AckTimeout and the next TXOP start");
+  NS_TEST_EXPECT_MSG_LT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot + (2 * (m_cwMin + 1) - 1) * slot,
+                               "More than AIFS+BO elapsed between AckTimeout and the next TXOP start");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[2].header.IsQosData (), true,
+                         "Expected to retransmit a QoS data frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[2].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_staDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected to retransmit a frame to the first station");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[2].header.GetDuration (),
+                         RoundDurationId (m_txopLimit - m_txPsdus[2].txDuration),
+                         "Duration/ID of the retransmitted frame must cover the whole TXOP");
+
+  // a Normal Ack is then sent by STA1
+  tEnd = m_txPsdus[2].txStart + m_txPsdus[2].txDuration;
+  tStart = m_txPsdus[3].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the first frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the first frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[3].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[3].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a Normal Ack sent to the AP");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[3].header.GetDuration (),
+                         RoundDurationId (m_txPsdus[2].header.GetDuration () - sifs - m_txPsdus[3].txDuration),
+                         "Duration/ID of the Ack must be derived from that of the previous frame");
+
+  // the AP sends a frame to STA2
+  tEnd = m_txPsdus[3].txStart + m_txPsdus[3].txDuration;
+  tStart = m_txPsdus[4].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Second frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Second frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[4].header.IsQosData (), true,
+                         "Expected a QoS data frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[4].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_staDevices.Get (1))->GetMac ()->GetAddress (),
+                         "Expected a frame sent by the AP to the second station");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[4].header.GetDuration (),
+                         RoundDurationId (m_txopLimit - (m_txPsdus[4].txStart - txopStart) - m_txPsdus[4].txDuration),
+                         "Duration/ID of the second frame does not cover the remaining TXOP");
+
+  // STA2 receives a corrupted frame and hence it does not send the Ack. When the AckTimeout
+  // expires, the AP performs PIFS recovery or invoke backoff, without terminating the TXOP,
+  // because a non-initial frame of the TXOP failed
+  tEnd = m_txPsdus[4].txStart + m_txPsdus[4].txDuration
+         + sifs + slot + WifiPhy::CalculatePhyPreambleAndHeaderDuration (m_txPsdus[4].txVector); // AckTimeout
+  tStart = m_txPsdus[5].txStart;
+
+  if (m_pifsRecovery)
+    {
+      NS_TEST_EXPECT_MSG_EQ (tEnd + sifs + slot, tStart, "Second frame must have been sent after a PIFS");
+    }
+  else
+    {
+      NS_TEST_EXPECT_MSG_GT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot,
+                                   "Less than AIFS elapsed between AckTimeout and the next transmission");
+      NS_TEST_EXPECT_MSG_LT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot + (2 * (m_cwMin + 1) - 1) * slot,
+                                   "More than AIFS+BO elapsed between AckTimeout and the next TXOP start");
+    }
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[5].header.IsQosData (), true,
+                         "Expected a QoS data frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[5].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_staDevices.Get (1))->GetMac ()->GetAddress (),
+                         "Expected a frame sent by the AP to the second station");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[5].header.GetDuration (),
+                         RoundDurationId (m_txopLimit - (m_txPsdus[5].txStart - txopStart) - m_txPsdus[5].txDuration),
+                         "Duration/ID of the second frame does not cover the remaining TXOP");
+
+  // a Normal Ack is then sent by STA2
+  tEnd = m_txPsdus[5].txStart + m_txPsdus[5].txDuration;
+  tStart = m_txPsdus[6].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the second frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the second frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[6].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[6].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a Normal Ack sent to the AP");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[6].header.GetDuration (),
+                         RoundDurationId (m_txPsdus[5].header.GetDuration () - sifs - m_txPsdus[6].txDuration),
+                         "Duration/ID of the Ack must be derived from that of the previous frame");
+
+  // the AP sends a frame to STA3
+  tEnd = m_txPsdus[6].txStart + m_txPsdus[6].txDuration;
+  tStart = m_txPsdus[7].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Third frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Third frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[7].header.IsQosData (), true,
+                         "Expected a QoS data frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[7].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_staDevices.Get (2))->GetMac ()->GetAddress (),
+                         "Expected a frame sent by the AP to the third station");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[7].header.GetDuration (),
+                         RoundDurationId (m_txopLimit - (m_txPsdus[7].txStart - txopStart) - m_txPsdus[7].txDuration),
+                         "Duration/ID of the third frame does not cover the remaining TXOP");
+
+  // a Normal Ack is then sent by STA3
+  tEnd = m_txPsdus[7].txStart + m_txPsdus[7].txDuration;
+  tStart = m_txPsdus[8].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the third frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the third frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[8].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[8].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a Normal Ack sent to the AP");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[8].header.GetDuration (),
+                         RoundDurationId (m_txPsdus[7].header.GetDuration () - sifs - m_txPsdus[8].txDuration),
+                         "Duration/ID of the Ack must be derived from that of the previous frame");
+
+  // the TXOP limit is such that enough time for sending a CF-End frame remains
+  tEnd = m_txPsdus[8].txStart + m_txPsdus[8].txDuration;
+  tStart = m_txPsdus[9].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "CF-End sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "CF-End sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[9].header.IsCfEnd (), true, "Expected a CF-End frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[9].header.GetDuration (), Seconds (0),
+                        "Duration/ID must be set to 0 for CF-End frames");
+
+  // the CF-End frame resets the NAV on STA1, which can now transmit
+  tEnd = m_txPsdus[9].txStart + m_txPsdus[9].txDuration;
+  tStart = m_txPsdus[10].txStart;
+
+  NS_TEST_EXPECT_MSG_GT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot,
+                               "Less than AIFS elapsed between two TXOPs");
+  NS_TEST_EXPECT_MSG_LT_OR_EQ (tStart - tEnd, sifs + m_aifsn * slot + m_cwMin * slot + tolerance,
+                               "More than AIFS+BO elapsed between two TXOPs");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[10].header.IsQosData (), true,
+                         "Expected a QoS data frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[10].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a frame sent by the first station to the AP");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[10].header.GetDuration (),
+                         RoundDurationId (m_txopLimit - m_txPsdus[10].txDuration),
+                         "Duration/ID of the frame sent by the first station does not cover the remaining TXOP");
+
+  // a Normal Ack is then sent by the AP
+  tEnd = m_txPsdus[10].txStart + m_txPsdus[10].txDuration;
+  tStart = m_txPsdus[11].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[11].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[11].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_staDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a Normal Ack sent to the first station");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[11].header.GetDuration (),
+                         RoundDurationId (m_txPsdus[10].header.GetDuration () - sifs - m_txPsdus[11].txDuration),
+                         "Duration/ID of the Ack must be derived from that of the previous frame");
+
+  // the TXOP limit is such that enough time for sending a CF-End frame remains
+  tEnd = m_txPsdus[11].txStart + m_txPsdus[11].txDuration;
+  tStart = m_txPsdus[12].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "CF-End sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "CF-End sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[12].header.IsCfEnd (), true, "Expected a CF-End frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[12].header.GetDuration (), Seconds (0),
+                        "Duration/ID must be set to 0 for CF-End frames");
+
+
+  /*
+   * Verify that the Duration/ID of RTS/CTS frames is set correctly, that the TXOP holder is
+   * kept and allows stations to ignore NAV properly and that the CF-End Frame is not sent if
+   * not enough time remains
+   *
+   *          |---------------------------------------------NAV---------------------------------->|
+   *          |      |-----------------------------------------NAV------------------------------->|
+   *          |      |      |-------------------------------------NAV---------------------------->|
+   *          |      |      |      |---------------------------------NAV------------------------->|
+   *          |      |      |      |      |-----------------------------NAV---------------------->|
+   *          |      |      |      |      |      |-------------------------NAV------------------->|
+   *          |      |      |      |      |      |      |---------------------NAV---------------->|
+   *          |      |      |      |      |      |      |      |-----------------NAV------------->|
+   *          |      |      |      |      |      |      |      |      |-------------NAV---------->|
+   *          |      |      |      |      |      |      |      |      |      |---------NAV------->|
+   *          |      |      |      |      |      |      |      |      |      |      |-----NAV---->|
+   *          |      |      |      |      |      |      |      |      |      |      |      |-NAV->|
+   *      |---|  |---|  |---|  |---|  |---|  |---|  |---|  |---|  |---|  |---|  |---|  |---|
+   *      |RTS|  |CTS|  |QoS|  |Ack|  |RTS|  |CTS|  |QoS|  |Ack|  |RTS|  |CTS|  |QoS|  |Ack|
+   * ----------------------------------------------------------------------------------------------------
+   * From:  AP    STA1    AP    STA1    AP    STA2    AP    STA2    AP    STA3    AP    STA3
+   *   To: STA1    AP    STA1    AP    STA2    AP    STA2    AP    STA3    AP    STA3    AP
+   */
+
+  // the first frame is an RTS frame sent by the AP to STA1
+  txopStart = m_txPsdus[13].txStart;
+
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[13].header.IsRts (), true,
+                         "Expected an RTS frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[13].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_staDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected an RTS frame sent by the AP to the first station");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[13].header.GetDuration (),
+                         RoundDurationId (m_txopLimit - m_txPsdus[13].txDuration),
+                         "Duration/ID of the first RTS frame must cover the whole TXOP");
+
+  // a CTS is sent by STA1
+  tEnd = m_txPsdus[13].txStart + m_txPsdus[13].txDuration;
+  tStart = m_txPsdus[14].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "CTS in response to the first RTS frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "CTS in response to the first RTS frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[14].header.IsCts (), true, "Expected a CTS");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[14].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a CTS frame sent to the AP");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[14].header.GetDuration (),
+                         RoundDurationId (m_txPsdus[13].header.GetDuration () - sifs - m_txPsdus[14].txDuration),
+                         "Duration/ID of the CTS frame must be derived from that of the RTS frame");
+
+  // the AP sends a frame to STA1
+  tEnd = m_txPsdus[14].txStart + m_txPsdus[14].txDuration;
+  tStart = m_txPsdus[15].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "First QoS data frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "First QoS data frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[15].header.IsQosData (), true,
+                         "Expected a QoS data frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[15].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_staDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a frame sent by the AP to the first station");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[15].header.GetDuration (),
+                         RoundDurationId (m_txopLimit - (m_txPsdus[15].txStart - txopStart) - m_txPsdus[15].txDuration),
+                         "Duration/ID of the first QoS data frame does not cover the remaining TXOP");
+
+  // a Normal Ack is then sent by STA1
+  tEnd = m_txPsdus[15].txStart + m_txPsdus[15].txDuration;
+  tStart = m_txPsdus[16].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the first QoS data frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the first QoS data frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[16].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[16].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a Normal Ack sent to the AP");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[16].header.GetDuration (),
+                         RoundDurationId (m_txPsdus[15].header.GetDuration () - sifs - m_txPsdus[16].txDuration),
+                         "Duration/ID of the Ack must be derived from that of the previous frame");
+
+  // An RTS frame is sent by the AP to STA2
+  tEnd = m_txPsdus[16].txStart + m_txPsdus[16].txDuration;
+  tStart = m_txPsdus[17].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Second RTS frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Second RTS frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[17].header.IsRts (), true,
+                         "Expected an RTS frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[17].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_staDevices.Get (1))->GetMac ()->GetAddress (),
+                         "Expected an RTS frame sent by the AP to the second station");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[17].header.GetDuration (),
+                         RoundDurationId (m_txopLimit - (m_txPsdus[17].txStart - txopStart) - m_txPsdus[17].txDuration),
+                         "Duration/ID of the second RTS frame must cover the whole TXOP");
+
+  // a CTS is sent by STA2 (which ignores the NAV)
+  tEnd = m_txPsdus[17].txStart + m_txPsdus[17].txDuration;
+  tStart = m_txPsdus[18].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "CTS in response to the second RTS frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "CTS in response to the second RTS frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[18].header.IsCts (), true, "Expected a CTS");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[18].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a CTS frame sent to the AP");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[18].header.GetDuration (),
+                         RoundDurationId (m_txPsdus[17].header.GetDuration () - sifs - m_txPsdus[18].txDuration),
+                         "Duration/ID of the CTS frame must be derived from that of the RTS frame");
+
+  // the AP sends a frame to STA2
+  tEnd = m_txPsdus[18].txStart + m_txPsdus[18].txDuration;
+  tStart = m_txPsdus[19].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Second QoS data frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Second QoS data frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[19].header.IsQosData (), true,
+                         "Expected a QoS data frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[19].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_staDevices.Get (1))->GetMac ()->GetAddress (),
+                         "Expected a frame sent by the AP to the second station");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[19].header.GetDuration (),
+                         RoundDurationId (m_txopLimit - (m_txPsdus[19].txStart - txopStart) - m_txPsdus[19].txDuration),
+                         "Duration/ID of the second QoS data frame does not cover the remaining TXOP");
+
+  // a Normal Ack is then sent by STA2
+  tEnd = m_txPsdus[19].txStart + m_txPsdus[19].txDuration;
+  tStart = m_txPsdus[20].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the second QoS data frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the second QoS data frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[20].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[20].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a Normal Ack sent to the AP");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[20].header.GetDuration (),
+                         RoundDurationId (m_txPsdus[19].header.GetDuration () - sifs - m_txPsdus[20].txDuration),
+                         "Duration/ID of the Ack must be derived from that of the previous frame");
+
+  // An RTS frame is sent by the AP to STA3
+  tEnd = m_txPsdus[20].txStart + m_txPsdus[20].txDuration;
+  tStart = m_txPsdus[21].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Third RTS frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Third RTS frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[21].header.IsRts (), true,
+                         "Expected an RTS frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[21].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_staDevices.Get (2))->GetMac ()->GetAddress (),
+                         "Expected an RTS frame sent by the AP to the third station");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[21].header.GetDuration (),
+                         RoundDurationId (m_txopLimit - (m_txPsdus[21].txStart - txopStart) - m_txPsdus[21].txDuration),
+                         "Duration/ID of the third RTS frame must cover the whole TXOP");
+
+  // a CTS is sent by STA3 (which ignores the NAV)
+  tEnd = m_txPsdus[21].txStart + m_txPsdus[21].txDuration;
+  tStart = m_txPsdus[22].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "CTS in response to the third RTS frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "CTS in response to the third RTS frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[22].header.IsCts (), true, "Expected a CTS");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[22].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a CTS frame sent to the AP");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[22].header.GetDuration (),
+                         RoundDurationId (m_txPsdus[21].header.GetDuration () - sifs - m_txPsdus[22].txDuration),
+                         "Duration/ID of the CTS frame must be derived from that of the RTS frame");
+
+  // the AP sends a frame to STA3
+  tEnd = m_txPsdus[22].txStart + m_txPsdus[22].txDuration;
+  tStart = m_txPsdus[23].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Third QoS data frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Third QoS data frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[23].header.IsQosData (), true,
+                         "Expected a QoS data frame");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[23].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_staDevices.Get (2))->GetMac ()->GetAddress (),
+                         "Expected a frame sent by the AP to the third station");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[23].header.GetDuration (),
+                         RoundDurationId (m_txopLimit - (m_txPsdus[23].txStart - txopStart) - m_txPsdus[23].txDuration),
+                         "Duration/ID of the third QoS data frame does not cover the remaining TXOP");
+
+  // a Normal Ack is then sent by STA3
+  tEnd = m_txPsdus[23].txStart + m_txPsdus[23].txDuration;
+  tStart = m_txPsdus[24].txStart;
+
+  NS_TEST_EXPECT_MSG_LT (tEnd + sifs, tStart, "Ack in response to the third QoS data frame sent too early");
+  NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance, "Ack in response to the third QoS data frame sent too late");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[24].header.IsAck (), true, "Expected a Normal Ack");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[24].header.GetAddr1 (),
+                         DynamicCast<WifiNetDevice> (m_apDevices.Get (0))->GetMac ()->GetAddress (),
+                         "Expected a Normal Ack sent to the AP");
+  NS_TEST_EXPECT_MSG_EQ (m_txPsdus[24].header.GetDuration (),
+                         RoundDurationId (m_txPsdus[23].header.GetDuration () - sifs - m_txPsdus[24].txDuration),
+                         "Duration/ID of the Ack must be derived from that of the previous frame");
+
+  // there is no time remaining for sending a CF-End frame. This is verified by checking
+  // that 25 frames are transmitted (done at the beginning of this method)
+
+  // 3 DL packets (without RTS/CTS), 1 UL packet and 3 DL packets (with RTS/CTS)
+  NS_TEST_EXPECT_MSG_EQ (m_received, 7, "Unexpected number of packets received");
+}
+
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
+ * \brief wifi TXOP Test Suite
+ */
+class WifiTxopTestSuite : public TestSuite
+{
+public:
+  WifiTxopTestSuite ();
+};
+
+WifiTxopTestSuite::WifiTxopTestSuite ()
+  : TestSuite ("wifi-txop", UNIT)
+{
+  AddTestCase (new WifiTxopTest (true), TestCase::QUICK);
+  AddTestCase (new WifiTxopTest (false), TestCase::QUICK);
+}
+
+static WifiTxopTestSuite g_wifiTxopTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wifi/wscript ns-3.34/src/wifi/wscript
--- ns-3.33/src/wifi/wscript	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wifi/wscript	2021-07-14 10:31:07.000000000 -0700
@@ -9,11 +9,12 @@
         'model/wifi-mode.cc',
         'model/ssid.cc',
         'model/wifi-phy.cc',
+        'model/wifi-phy-operating-channel.cc',
         'model/wifi-phy-state-helper.cc',
         'model/error-rate-model.cc',
         'model/yans-error-rate-model.cc',
         'model/nist-error-rate-model.cc',
-        'model/dsss-error-rate-model.cc',
+        'model/non-ht/dsss-error-rate-model.cc',
         'model/table-based-error-rate-model.cc',
         'model/interference-helper.cc',
         'model/yans-wifi-phy.cc',
@@ -21,11 +22,23 @@
         'model/spectrum-wifi-phy.cc',
         'model/wifi-spectrum-phy-interface.cc',
         'model/wifi-spectrum-signal-parameters.cc',
-        'model/wifi-phy-header.cc',
         'model/wifi-mac-header.cc',
         'model/wifi-mac-trailer.cc',
-        'model/mac-low.cc',
-        'model/mac-low-transmission-parameters.cc',
+        'model/wifi-tx-timer.cc',
+        'model/wifi-protection.cc',
+        'model/wifi-acknowledgment.cc',
+        'model/wifi-tx-parameters.cc',
+        'model/wifi-protection-manager.cc',
+        'model/wifi-default-protection-manager.cc',
+        'model/wifi-ack-manager.cc',
+        'model/wifi-default-ack-manager.cc',
+        'model/frame-exchange-manager.cc',
+        'model/qos-frame-exchange-manager.cc',
+        'model/ht/ht-frame-exchange-manager.cc',
+        'model/vht/vht-frame-exchange-manager.cc',
+        'model/he/he-frame-exchange-manager.cc',
+        'model/he/multi-user-scheduler.cc',
+        'model/he/rr-multi-user-scheduler.cc',
         'model/wifi-mac-queue.cc',
         'model/mac-tx-middle.cc',
         'model/mac-rx-middle.cc',
@@ -37,71 +50,83 @@
         'model/channel-access-manager.cc',
         'model/wifi-mac.cc',
         'model/regular-wifi-mac.cc',
-        'model/infrastructure-wifi-mac.cc',
         'model/wifi-remote-station-info.cc',
         'model/wifi-remote-station-manager.cc',
         'model/ap-wifi-mac.cc',
         'model/sta-wifi-mac.cc',
         'model/adhoc-wifi-mac.cc',
         'model/wifi-net-device.cc',
-        'model/arf-wifi-manager.cc',
-        'model/aarf-wifi-manager.cc',
-        'model/ideal-wifi-manager.cc',
-        'model/constant-rate-wifi-manager.cc',
-        'model/amrr-wifi-manager.cc',
-        'model/onoe-wifi-manager.cc',
-        'model/rraa-wifi-manager.cc',
-        'model/aarfcd-wifi-manager.cc',
-        'model/cara-wifi-manager.cc',
-        'model/minstrel-wifi-manager.cc',
-        'model/minstrel-ht-wifi-manager.cc',
+        'model/rate-control/arf-wifi-manager.cc',
+        'model/rate-control/aarf-wifi-manager.cc',
+        'model/rate-control/ideal-wifi-manager.cc',
+        'model/rate-control/constant-rate-wifi-manager.cc',
+        'model/rate-control/amrr-wifi-manager.cc',
+        'model/rate-control/onoe-wifi-manager.cc',
+        'model/rate-control/rraa-wifi-manager.cc',
+        'model/rate-control/aarfcd-wifi-manager.cc',
+        'model/rate-control/cara-wifi-manager.cc',
+        'model/rate-control/minstrel-wifi-manager.cc',
+        'model/rate-control/minstrel-ht-wifi-manager.cc',
         'model/qos-utils.cc',
         'model/qos-txop.cc',
         'model/msdu-aggregator.cc',
         'model/amsdu-subframe-header.cc',
         'model/originator-block-ack-agreement.cc',
+        'model/recipient-block-ack-agreement.cc',
         'model/ctrl-headers.cc',
         'model/qos-blocked-destinations.cc',
         'model/block-ack-agreement.cc',
         'model/block-ack-manager.cc',
-        'model/block-ack-cache.cc',
         'model/block-ack-window.cc',
+        'model/block-ack-type.cc',
         'model/snr-tag.cc',
-        'model/ht-capabilities.cc',
+        'model/he/mu-snr-tag.cc',
+        'model/ht/ht-capabilities.cc',
         'model/wifi-tx-vector.cc',
-        'model/parf-wifi-manager.cc',
-        'model/aparf-wifi-manager.cc',
-        'model/rrpaa-wifi-manager.cc',
+        'model/rate-control/parf-wifi-manager.cc',
+        'model/rate-control/aparf-wifi-manager.cc',
+        'model/rate-control/rrpaa-wifi-manager.cc',
+        'model/rate-control/thompson-sampling-wifi-manager.cc',
         'model/ampdu-subframe-header.cc',
         'model/mpdu-aggregator.cc',
         'model/ampdu-tag.cc',
         'model/wifi-radio-energy-model.cc',
         'model/wifi-tx-current-model.cc',
-        'model/vht-capabilities.cc',
-        'model/erp-information.cc',
-        'model/ht-operation.cc',
-        'model/vht-operation.cc',
-        'model/dsss-parameter-set.cc',
+        'model/vht/vht-capabilities.cc',
+        'model/non-ht/erp-information.cc',
+        'model/ht/ht-operation.cc',
+        'model/vht/vht-operation.cc',
+        'model/non-ht/dsss-parameter-set.cc',
         'model/edca-parameter-set.cc',
-        'model/he-capabilities.cc',
+        'model/he/he-capabilities.cc',
         'model/frame-capture-model.cc',
         'model/simple-frame-capture-model.cc',
         'model/preamble-detection-model.cc',
         'model/threshold-preamble-detection-model.cc',
-        'model/he-operation.cc',
-        'model/he-configuration.cc',
+        'model/he/he-operation.cc',
+        'model/he/he-configuration.cc',
         'model/extended-capabilities.cc',
-        'model/cf-parameter-set.cc',
         'model/wifi-mac-queue-item.cc',
         'model/wifi-psdu.cc',
         'model/wifi-ppdu.cc',
-        'model/ht-configuration.cc',
-        'model/vht-configuration.cc',
-        'model/obss-pd-algorithm.cc',
-        'model/constant-obss-pd-algorithm.cc',
-        'model/wifi-ack-policy-selector.cc',
-        'model/constant-wifi-ack-policy-selector.cc',
-        'model/he-ru.cc',
+        'model/non-ht/dsss-ppdu.cc',
+        'model/non-ht/ofdm-ppdu.cc',
+        'model/non-ht/erp-ofdm-ppdu.cc',
+        'model/ht/ht-ppdu.cc',
+        'model/vht/vht-ppdu.cc',
+        'model/he/he-ppdu.cc',
+        'model/ht/ht-configuration.cc',
+        'model/vht/vht-configuration.cc',
+        'model/he/obss-pd-algorithm.cc',
+        'model/he/constant-obss-pd-algorithm.cc',
+        'model/he/he-ru.cc',
+        'model/phy-entity.cc',
+        'model/non-ht/dsss-phy.cc',
+        'model/non-ht/ofdm-phy.cc',
+        'model/non-ht/erp-ofdm-phy.cc',
+        'model/ht/ht-phy.cc',
+        'model/vht/vht-phy.cc',
+        'model/he/he-phy.cc',
         'helper/wifi-radio-energy-model-helper.cc',
         'helper/athstats-helper.cc',
         'helper/wifi-helper.cc',
@@ -117,14 +142,18 @@
         'test/tx-duration-test.cc',
         'test/power-rate-adaptation-test.cc',
         'test/wifi-test.cc',
+        'test/wifi-txop-test.cc',
         'test/spectrum-wifi-phy-test.cc',
+        'test/wifi-primary-channels-test.cc',
         'test/wifi-aggregation-test.cc',
         'test/wifi-error-rate-models-test.cc',
         'test/wifi-transmit-mask-test.cc',
         'test/wifi-phy-thresholds-test.cc',
         'test/wifi-phy-reception-test.cc',
         'test/inter-bss-test-suite.cc',
-        'test/wifi-phy-ofdma-test.cc'
+        'test/wifi-mac-ofdma-test.cc',
+        'test/wifi-phy-ofdma-test.cc',
+        'test/wifi-mac-queue-test.cc',
         ]
 
     # Tests encapsulating example programs should be listed here
@@ -142,13 +171,14 @@
         'model/wifi-net-device.h',
         'model/wifi-mode.h',
         'model/ssid.h',
-        'model/wifi-preamble.h',
+        'model/wifi-phy-common.h',
         'model/wifi-phy-band.h',
         'model/wifi-standards.h',
         'model/yans-wifi-phy.h',
         'model/spectrum-wifi-phy.h',
         'model/yans-wifi-channel.h',
         'model/wifi-phy.h',
+        'model/wifi-phy-operating-channel.h',
         'model/wifi-spectrum-phy-interface.h',
         'model/wifi-spectrum-signal-parameters.h',
         'model/interference-helper.h',
@@ -157,29 +187,28 @@
         'model/ap-wifi-mac.h',
         'model/sta-wifi-mac.h',
         'model/adhoc-wifi-mac.h',
-        'model/arf-wifi-manager.h',
-        'model/aarf-wifi-manager.h',
-        'model/ideal-wifi-manager.h',
-        'model/constant-rate-wifi-manager.h',
-        'model/amrr-wifi-manager.h',
-        'model/onoe-wifi-manager.h',
-        'model/rraa-wifi-manager.h',
-        'model/aarfcd-wifi-manager.h',
-        'model/cara-wifi-manager.h',
-        'model/minstrel-wifi-manager.h',
-        'model/minstrel-ht-wifi-manager.h',
+        'model/rate-control/arf-wifi-manager.h',
+        'model/rate-control/aarf-wifi-manager.h',
+        'model/rate-control/ideal-wifi-manager.h',
+        'model/rate-control/constant-rate-wifi-manager.h',
+        'model/rate-control/amrr-wifi-manager.h',
+        'model/rate-control/onoe-wifi-manager.h',
+        'model/rate-control/rraa-wifi-manager.h',
+        'model/rate-control/aarfcd-wifi-manager.h',
+        'model/rate-control/cara-wifi-manager.h',
+        'model/rate-control/minstrel-wifi-manager.h',
+        'model/rate-control/minstrel-ht-wifi-manager.h',
+        'model/rate-control/thompson-sampling-wifi-manager.h',
         'model/wifi-mac.h',
         'model/regular-wifi-mac.h',
-        'model/infrastructure-wifi-mac.h',
         'model/supported-rates.h',
         'model/error-rate-model.h',
         'model/yans-error-rate-model.h',
         'model/nist-error-rate-model.h',
-        'model/dsss-error-rate-model.h',
+        'model/non-ht/dsss-error-rate-model.h',
         'model/table-based-error-rate-model.h',
         'model/wifi-mac-queue.h',
         'model/txop.h',
-        'model/wifi-phy-header.h',
         'model/wifi-mac-header.h',
         'model/wifi-mac-trailer.h',
         'model/wifi-phy-state-helper.h',
@@ -193,56 +222,80 @@
         'model/channel-access-manager.h',
         'model/mac-tx-middle.h', 
         'model/mac-rx-middle.h', 
-        'model/mac-low.h',
-        'model/mac-low-transmission-parameters.h',
+        'model/wifi-tx-timer.h',
+        'model/wifi-protection.h',
+        'model/wifi-acknowledgment.h',
+        'model/wifi-tx-parameters.h',
+        'model/wifi-protection-manager.h',
+        'model/wifi-default-protection-manager.h',
+        'model/wifi-ack-manager.h',
+        'model/wifi-default-ack-manager.h',
+        'model/frame-exchange-manager.h',
+        'model/qos-frame-exchange-manager.h',
+        'model/ht/ht-frame-exchange-manager.h',
+        'model/vht/vht-frame-exchange-manager.h',
+        'model/he/he-frame-exchange-manager.h',
+        'model/he/multi-user-scheduler.h',
+        'model/he/rr-multi-user-scheduler.h',
         'model/originator-block-ack-agreement.h',
+        'model/recipient-block-ack-agreement.h',
         'model/ctrl-headers.h',
         'model/block-ack-agreement.h',
         'model/block-ack-manager.h',
-        'model/block-ack-cache.h',
         'model/block-ack-window.h',
         'model/snr-tag.h',
-        'model/ht-capabilities.h',
-        'model/parf-wifi-manager.h',
-        'model/aparf-wifi-manager.h',
-        'model/rrpaa-wifi-manager.h',
+        'model/he/mu-snr-tag.h',
+        'model/ht/ht-capabilities.h',
+        'model/rate-control/parf-wifi-manager.h',
+        'model/rate-control/aparf-wifi-manager.h',
+        'model/rate-control/rrpaa-wifi-manager.h',
         'model/wifi-tx-vector.h',
         'model/ampdu-subframe-header.h',
         'model/mpdu-aggregator.h',
         'model/ampdu-tag.h',
         'model/wifi-radio-energy-model.h',
         'model/wifi-tx-current-model.h',
-        'model/vht-capabilities.h',
-        'model/erp-information.h',
-        'model/ht-operation.h',
-        'model/vht-operation.h',
-        'model/dsss-parameter-set.h',
+        'model/vht/vht-capabilities.h',
+        'model/non-ht/erp-information.h',
+        'model/ht/ht-operation.h',
+        'model/vht/vht-operation.h',
+        'model/non-ht/dsss-parameter-set.h',
         'model/edca-parameter-set.h',
-        'model/he-capabilities.h',
+        'model/he/he-capabilities.h',
         'model/frame-capture-model.h',
         'model/simple-frame-capture-model.h',
         'model/preamble-detection-model.h',
         'model/threshold-preamble-detection-model.h',
         'model/qos-blocked-destinations.h',
-        'model/he-operation.h',
-        'model/he-configuration.h',
+        'model/he/he-operation.h',
+        'model/he/he-configuration.h',
         'model/extended-capabilities.h',
-        'model/cf-parameter-set.h',
         'model/wifi-mac-queue-item.h',
         'model/wifi-psdu.h',
         'model/wifi-ppdu.h',
+        'model/non-ht/dsss-ppdu.h',
+        'model/non-ht/erp-ofdm-ppdu.h',
+        'model/non-ht/ofdm-ppdu.h',
+        'model/ht/ht-ppdu.h',
+        'model/vht/vht-ppdu.h',
+        'model/he/he-ppdu.h',
         'model/wifi-phy-state.h',
         'model/wifi-phy-listener.h',
         'model/block-ack-type.h',
         'model/wifi-mpdu-type.h',
-        'model/ht-configuration.h',
-        'model/vht-configuration.h',
-        'model/obss-pd-algorithm.h',
-        'model/constant-obss-pd-algorithm.h',
-        'model/wifi-ack-policy-selector.h',
-        'model/constant-wifi-ack-policy-selector.h',
-        'model/he-ru.h',
+        'model/ht/ht-configuration.h',
+        'model/vht/vht-configuration.h',
+        'model/he/obss-pd-algorithm.h',
+        'model/he/constant-obss-pd-algorithm.h',
+        'model/he/he-ru.h',
         'model/reference/error-rate-tables.h',
+        'model/phy-entity.h',
+        'model/non-ht/dsss-phy.h',
+        'model/non-ht/ofdm-phy.h',
+        'model/non-ht/erp-ofdm-phy.h',
+        'model/ht/ht-phy.h',
+        'model/vht/vht-phy.h',
+        'model/he/he-phy.h',
         'helper/wifi-radio-energy-model-helper.h',
         'helper/athstats-helper.h',
         'helper/wifi-helper.h',
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wimax/bindings/modulegen__gcc_ILP32.py ns-3.34/src/wimax/bindings/modulegen__gcc_ILP32.py
--- ns-3.33/src/wimax/bindings/modulegen__gcc_ILP32.py	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wimax/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
@@ -99,12 +99,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -176,7 +180,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## snr-to-block-error-rate-manager.h (module 'wimax'): ns3::SNRToBlockErrorRateManager [class]
@@ -207,6 +211,10 @@
     module.add_class('Simulator', destructor_visibility='private', import_from_module='ns.core')
     ## simulator.h (module 'core'): ns3::Simulator [enumeration]
     module.add_enum('', ['NO_CONTEXT'], outer_class=root_module['ns3::Simulator'], import_from_module='ns.core')
+    ## ul-job.h (module 'wimax'): ns3::SortProcess [struct]
+    module.add_class('SortProcess')
+    ## ul-job.h (module 'wimax'): ns3::SortProcessPtr [struct]
+    module.add_class('SortProcessPtr')
     ## tag.h (module 'network'): ns3::Tag [class]
     module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
@@ -776,8 +784,10 @@
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3IpcsClassifierRecord_methods(root_module, root_module['ns3::IpcsClassifierRecord'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -811,6 +821,8 @@
     register_Ns3ServiceFlowRecord_methods(root_module, root_module['ns3::ServiceFlowRecord'])
     register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     register_Ns3Simulator_methods(root_module, root_module['ns3::Simulator'])
+    register_Ns3SortProcess_methods(root_module, root_module['ns3::SortProcess'])
+    register_Ns3SortProcessPtr_methods(root_module, root_module['ns3::SortProcessPtr'])
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
     register_Ns3Time_methods(root_module, root_module['ns3::Time'])
@@ -2231,6 +2243,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2444,6 +2468,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2519,6 +2548,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2539,6 +2580,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -3738,26 +3784,26 @@
     cls.add_method('GetSigma2', 
                    'double', 
                    [])
-    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetBitErrorRate(double arg0) [member function]
+    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetBitErrorRate(double bitErrorRate) [member function]
     cls.add_method('SetBitErrorRate', 
                    'void', 
-                   [param('double', 'arg0')])
-    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetBlockErrorRate(double arg0) [member function]
+                   [param('double', 'bitErrorRate')])
+    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetBlockErrorRate(double blockErrorRate) [member function]
     cls.add_method('SetBlockErrorRate', 
                    'void', 
-                   [param('double', 'arg0')])
-    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetI1(double arg0) [member function]
+                   [param('double', 'blockErrorRate')])
+    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetI1(double i1) [member function]
     cls.add_method('SetI1', 
                    'void', 
-                   [param('double', 'arg0')])
-    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetI2(double arg0) [member function]
+                   [param('double', 'i1')])
+    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetI2(double i2) [member function]
     cls.add_method('SetI2', 
                    'void', 
-                   [param('double', 'arg0')])
-    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetSNRValue(double arg0) [member function]
+                   [param('double', 'i2')])
+    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetSNRValue(double snrValue) [member function]
     cls.add_method('SetSNRValue', 
                    'void', 
-                   [param('double', 'arg0')])
+                   [param('double', 'snrValue')])
     return
 
 def register_Ns3SSRecord_methods(root_module, cls):
@@ -4602,6 +4648,30 @@
                    is_static=True)
     return
 
+def register_Ns3SortProcess_methods(root_module, cls):
+    ## ul-job.h (module 'wimax'): ns3::SortProcess::SortProcess() [constructor]
+    cls.add_constructor([])
+    ## ul-job.h (module 'wimax'): ns3::SortProcess::SortProcess(ns3::SortProcess const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SortProcess const &', 'arg0')])
+    ## ul-job.h (module 'wimax'): bool ns3::SortProcess::operator()(ns3::PriorityUlJob & left, ns3::PriorityUlJob & right) const [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('ns3::PriorityUlJob &', 'left'), param('ns3::PriorityUlJob &', 'right')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3SortProcessPtr_methods(root_module, cls):
+    ## ul-job.h (module 'wimax'): ns3::SortProcessPtr::SortProcessPtr() [constructor]
+    cls.add_constructor([])
+    ## ul-job.h (module 'wimax'): ns3::SortProcessPtr::SortProcessPtr(ns3::SortProcessPtr const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SortProcessPtr const &', 'arg0')])
+    ## ul-job.h (module 'wimax'): bool ns3::SortProcessPtr::operator()(ns3::Ptr<ns3::PriorityUlJob> & left, ns3::Ptr<ns3::PriorityUlJob> & right) const [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::PriorityUlJob > &', 'left'), param('ns3::Ptr< ns3::PriorityUlJob > &', 'right')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Tag_methods(root_module, cls):
     ## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
     cls.add_constructor([])
@@ -7960,10 +8030,10 @@
                    'uint32_t', 
                    [], 
                    is_virtual=True)
-    ## bs-uplink-scheduler-simple.h (module 'wimax'): void ns3::UplinkSchedulerSimple::GetChannelDescriptorsToUpdate(bool & arg0, bool & arg1, bool & arg2, bool & arg3) [member function]
+    ## bs-uplink-scheduler-simple.h (module 'wimax'): void ns3::UplinkSchedulerSimple::GetChannelDescriptorsToUpdate(bool & updateDcd, bool & updateUcd, bool & sendDcd, bool & sendUcd) [member function]
     cls.add_method('GetChannelDescriptorsToUpdate', 
                    'void', 
-                   [param('bool &', 'arg0'), param('bool &', 'arg1'), param('bool &', 'arg2'), param('bool &', 'arg3')], 
+                   [param('bool &', 'updateDcd'), param('bool &', 'updateUcd'), param('bool &', 'sendDcd'), param('bool &', 'sendUcd')], 
                    is_virtual=True)
     ## bs-uplink-scheduler-simple.h (module 'wimax'): static ns3::TypeId ns3::UplinkSchedulerSimple::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -12303,10 +12373,10 @@
                    'ns3::Ptr< ns3::BsServiceFlowManager >', 
                    [], 
                    is_const=True)
-    ## bs-net-device.h (module 'wimax'): void ns3::BaseStationNetDevice::SetServiceFlowManager(ns3::Ptr<ns3::BsServiceFlowManager> arg0) [member function]
+    ## bs-net-device.h (module 'wimax'): void ns3::BaseStationNetDevice::SetServiceFlowManager(ns3::Ptr<ns3::BsServiceFlowManager> sfm) [member function]
     cls.add_method('SetServiceFlowManager', 
                    'void', 
-                   [param('ns3::Ptr< ns3::BsServiceFlowManager >', 'arg0')])
+                   [param('ns3::Ptr< ns3::BsServiceFlowManager >', 'sfm')])
     ## bs-net-device.h (module 'wimax'): void ns3::BaseStationNetDevice::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wimax/bindings/modulegen__gcc_LP64.py ns-3.34/src/wimax/bindings/modulegen__gcc_LP64.py
--- ns-3.33/src/wimax/bindings/modulegen__gcc_LP64.py	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wimax/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
@@ -99,12 +99,16 @@
     module.add_class('Ipv4Address', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
     root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash [class]
+    module.add_class('Ipv4AddressHash', import_from_module='ns.network')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
     module.add_class('Ipv4Mask', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     module.add_class('Ipv6Address', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
     root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash [class]
+    module.add_class('Ipv6AddressHash', import_from_module='ns.network')
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
     module.add_class('Ipv6Prefix', import_from_module='ns.network')
     ## log.h (module 'core'): ns3::LogComponent [class]
@@ -176,7 +180,7 @@
     ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
     module.add_class('PcapHelper', import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelper::DataLinkType [enumeration]
-    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    module.add_enum('DataLinkType', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_LINUX_SLL', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO', 'DLT_IEEE802_15_4', 'DLT_NETLINK', 'DLT_LORATAP'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
     ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
     module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
     ## snr-to-block-error-rate-manager.h (module 'wimax'): ns3::SNRToBlockErrorRateManager [class]
@@ -207,6 +211,10 @@
     module.add_class('Simulator', destructor_visibility='private', import_from_module='ns.core')
     ## simulator.h (module 'core'): ns3::Simulator [enumeration]
     module.add_enum('', ['NO_CONTEXT'], outer_class=root_module['ns3::Simulator'], import_from_module='ns.core')
+    ## ul-job.h (module 'wimax'): ns3::SortProcess [struct]
+    module.add_class('SortProcess')
+    ## ul-job.h (module 'wimax'): ns3::SortProcessPtr [struct]
+    module.add_class('SortProcessPtr')
     ## tag.h (module 'network'): ns3::Tag [class]
     module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
@@ -776,8 +784,10 @@
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
     register_Ns3IpcsClassifierRecord_methods(root_module, root_module['ns3::IpcsClassifierRecord'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4AddressHash_methods(root_module, root_module['ns3::Ipv4AddressHash'])
     register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
     register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6AddressHash_methods(root_module, root_module['ns3::Ipv6AddressHash'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
@@ -811,6 +821,8 @@
     register_Ns3ServiceFlowRecord_methods(root_module, root_module['ns3::ServiceFlowRecord'])
     register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     register_Ns3Simulator_methods(root_module, root_module['ns3::Simulator'])
+    register_Ns3SortProcess_methods(root_module, root_module['ns3::SortProcess'])
+    register_Ns3SortProcessPtr_methods(root_module, root_module['ns3::SortProcessPtr'])
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
     register_Ns3Time_methods(root_module, root_module['ns3::Time'])
@@ -2231,6 +2243,18 @@
                    [param('char const *', 'address')])
     return
 
+def register_Ns3Ipv4AddressHash_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressHash::Ipv4AddressHash(ns3::Ipv4AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressHash const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): size_t ns3::Ipv4AddressHash::operator()(ns3::Ipv4Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv4Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv4Mask_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2444,6 +2468,11 @@
                    'ns3::Ipv6Address', 
                    [param('ns3::Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
                    is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Address addr, ns3::Ipv6Prefix prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address', 'addr'), param('ns3::Ipv6Prefix', 'prefix')], 
+                   is_static=True)
     ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
     cls.add_method('MakeAutoconfiguredAddress', 
                    'ns3::Ipv6Address', 
@@ -2519,6 +2548,18 @@
                    [param('uint8_t *', 'address')])
     return
 
+def register_Ns3Ipv6AddressHash_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressHash::Ipv6AddressHash(ns3::Ipv6AddressHash const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressHash const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): size_t ns3::Ipv6AddressHash::operator()(ns3::Ipv6Address const & x) const [member operator]
+    cls.add_method('operator()', 
+                   'size_t', 
+                   [param('ns3::Ipv6Address const &', 'x')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Ipv6Prefix_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('==')
@@ -2539,6 +2580,11 @@
     cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
     ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
     cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Prefix::ConvertToIpv6Address() const [member function]
+    cls.add_method('ConvertToIpv6Address', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
     cls.add_method('GetBytes', 
                    'void', 
@@ -3738,26 +3784,26 @@
     cls.add_method('GetSigma2', 
                    'double', 
                    [])
-    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetBitErrorRate(double arg0) [member function]
+    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetBitErrorRate(double bitErrorRate) [member function]
     cls.add_method('SetBitErrorRate', 
                    'void', 
-                   [param('double', 'arg0')])
-    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetBlockErrorRate(double arg0) [member function]
+                   [param('double', 'bitErrorRate')])
+    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetBlockErrorRate(double blockErrorRate) [member function]
     cls.add_method('SetBlockErrorRate', 
                    'void', 
-                   [param('double', 'arg0')])
-    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetI1(double arg0) [member function]
+                   [param('double', 'blockErrorRate')])
+    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetI1(double i1) [member function]
     cls.add_method('SetI1', 
                    'void', 
-                   [param('double', 'arg0')])
-    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetI2(double arg0) [member function]
+                   [param('double', 'i1')])
+    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetI2(double i2) [member function]
     cls.add_method('SetI2', 
                    'void', 
-                   [param('double', 'arg0')])
-    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetSNRValue(double arg0) [member function]
+                   [param('double', 'i2')])
+    ## snr-to-block-error-rate-record.h (module 'wimax'): void ns3::SNRToBlockErrorRateRecord::SetSNRValue(double snrValue) [member function]
     cls.add_method('SetSNRValue', 
                    'void', 
-                   [param('double', 'arg0')])
+                   [param('double', 'snrValue')])
     return
 
 def register_Ns3SSRecord_methods(root_module, cls):
@@ -4602,6 +4648,30 @@
                    is_static=True)
     return
 
+def register_Ns3SortProcess_methods(root_module, cls):
+    ## ul-job.h (module 'wimax'): ns3::SortProcess::SortProcess() [constructor]
+    cls.add_constructor([])
+    ## ul-job.h (module 'wimax'): ns3::SortProcess::SortProcess(ns3::SortProcess const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SortProcess const &', 'arg0')])
+    ## ul-job.h (module 'wimax'): bool ns3::SortProcess::operator()(ns3::PriorityUlJob & left, ns3::PriorityUlJob & right) const [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('ns3::PriorityUlJob &', 'left'), param('ns3::PriorityUlJob &', 'right')], 
+                   custom_name='__call__', is_const=True)
+    return
+
+def register_Ns3SortProcessPtr_methods(root_module, cls):
+    ## ul-job.h (module 'wimax'): ns3::SortProcessPtr::SortProcessPtr() [constructor]
+    cls.add_constructor([])
+    ## ul-job.h (module 'wimax'): ns3::SortProcessPtr::SortProcessPtr(ns3::SortProcessPtr const & arg0) [constructor]
+    cls.add_constructor([param('ns3::SortProcessPtr const &', 'arg0')])
+    ## ul-job.h (module 'wimax'): bool ns3::SortProcessPtr::operator()(ns3::Ptr<ns3::PriorityUlJob> & left, ns3::Ptr<ns3::PriorityUlJob> & right) const [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::PriorityUlJob > &', 'left'), param('ns3::Ptr< ns3::PriorityUlJob > &', 'right')], 
+                   custom_name='__call__', is_const=True)
+    return
+
 def register_Ns3Tag_methods(root_module, cls):
     ## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
     cls.add_constructor([])
@@ -7960,10 +8030,10 @@
                    'uint32_t', 
                    [], 
                    is_virtual=True)
-    ## bs-uplink-scheduler-simple.h (module 'wimax'): void ns3::UplinkSchedulerSimple::GetChannelDescriptorsToUpdate(bool & arg0, bool & arg1, bool & arg2, bool & arg3) [member function]
+    ## bs-uplink-scheduler-simple.h (module 'wimax'): void ns3::UplinkSchedulerSimple::GetChannelDescriptorsToUpdate(bool & updateDcd, bool & updateUcd, bool & sendDcd, bool & sendUcd) [member function]
     cls.add_method('GetChannelDescriptorsToUpdate', 
                    'void', 
-                   [param('bool &', 'arg0'), param('bool &', 'arg1'), param('bool &', 'arg2'), param('bool &', 'arg3')], 
+                   [param('bool &', 'updateDcd'), param('bool &', 'updateUcd'), param('bool &', 'sendDcd'), param('bool &', 'sendUcd')], 
                    is_virtual=True)
     ## bs-uplink-scheduler-simple.h (module 'wimax'): static ns3::TypeId ns3::UplinkSchedulerSimple::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -12303,10 +12373,10 @@
                    'ns3::Ptr< ns3::BsServiceFlowManager >', 
                    [], 
                    is_const=True)
-    ## bs-net-device.h (module 'wimax'): void ns3::BaseStationNetDevice::SetServiceFlowManager(ns3::Ptr<ns3::BsServiceFlowManager> arg0) [member function]
+    ## bs-net-device.h (module 'wimax'): void ns3::BaseStationNetDevice::SetServiceFlowManager(ns3::Ptr<ns3::BsServiceFlowManager> sfm) [member function]
     cls.add_method('SetServiceFlowManager', 
                    'void', 
-                   [param('ns3::Ptr< ns3::BsServiceFlowManager >', 'arg0')])
+                   [param('ns3::Ptr< ns3::BsServiceFlowManager >', 'sfm')])
     ## bs-net-device.h (module 'wimax'): void ns3::BaseStationNetDevice::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wimax/examples/wimax-multicast.cc ns-3.34/src/wimax/examples/wimax-multicast.cc
--- ns-3.33/src/wimax/examples/wimax-multicast.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wimax/examples/wimax-multicast.cc	2021-07-14 10:31:07.000000000 -0700
@@ -61,20 +61,18 @@
 #include "ns3/global-route-manager.h"
 #include "ns3/internet-module.h"
 #include "ns3/vector.h"
+#include <vector>
 
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE ("WimaxMulticastSimulation");
 
-#define MAXSS 1000
-#define MAXDIST 10 // km
-
 int main (int argc, char *argv[])
 {
   bool verbose = false;
 
   NodeContainer ssNodes;
-  Ptr<SubscriberStationNetDevice> ss[MAXSS];
+  std::vector<Ptr<SubscriberStationNetDevice> > ss;
   NetDeviceContainer ssDevs;
   Ipv4InterfaceContainer SSinterfaces;
 
@@ -83,8 +81,6 @@
   NetDeviceContainer bsDevs, bsDevsOne;
   Ipv4InterfaceContainer BSinterfaces;
 
-  UdpServerHelper udpServer[MAXSS];
-  ApplicationContainer serverApps[MAXSS];
   UdpTraceClientHelper udpClient;
   ApplicationContainer clientApps;
 
@@ -93,8 +89,8 @@
   NodeContainer ASNGW_Node;
 
   Ptr<ConstantPositionMobilityModel> BSPosition;
-  Ptr<RandomWaypointMobilityModel> SSPosition[MAXSS];
-  Ptr<RandomRectanglePositionAllocator> SSPosAllocator[MAXSS];
+  std::vector<Ptr<RandomWaypointMobilityModel> > SSPosition;
+  std::vector<Ptr<RandomRectanglePositionAllocator> > SSPosAllocator;
 
   // default values
   int nbSS = 10, duration = 7, schedType = 0;
@@ -125,6 +121,10 @@
       scheduler = WimaxHelper::SCHED_TYPE_SIMPLE;
     }
 
+  ss.resize (nbSS);
+  SSPosition.resize (nbSS);
+  SSPosAllocator.resize (nbSS);
+
   ssNodes.Create (nbSS);
   bsNodes.Create (1);
 
@@ -267,13 +267,11 @@
 
   uint16_t multicast_port = 100;
 
-  for (int i = 0; i < nbSS; i++)
-    {
-      udpServer[i] = UdpServerHelper (multicast_port);
-      serverApps[i] = udpServer[i].Install (ssNodes.Get (i));
-      serverApps[i].Start (Seconds (6));
-      serverApps[i].Stop (Seconds (duration));
-    }
+  UdpServerHelper udpServerHelper = UdpServerHelper (multicast_port);
+  ApplicationContainer serverApps;
+  serverApps = udpServerHelper.Install (ssNodes);
+  serverApps.Start (Seconds (6));
+  serverApps.Stop (Seconds (duration));
 
   udpClient = UdpTraceClientHelper (multicastGroup, multicast_port, "");
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wimax/model/bs-net-device.h ns-3.34/src/wimax/model/bs-net-device.h
--- ns-3.33/src/wimax/model/bs-net-device.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wimax/model/bs-net-device.h	2021-07-14 10:31:07.000000000 -0700
@@ -282,8 +282,9 @@
   Ptr<BsServiceFlowManager> GetServiceFlowManager (void) const;
   /**
    * \brief Set service flow manager
+   * \param sfm the service flow manager
    */
-  void SetServiceFlowManager (Ptr<BsServiceFlowManager> );
+  void SetServiceFlowManager (Ptr<BsServiceFlowManager> sfm);
 private:
   virtual void DoDispose (void);
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wimax/model/bs-uplink-scheduler-simple.h ns-3.34/src/wimax/model/bs-uplink-scheduler-simple.h
--- ns-3.33/src/wimax/model/bs-uplink-scheduler-simple.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wimax/model/bs-uplink-scheduler-simple.h	2021-07-14 10:31:07.000000000 -0700
@@ -60,8 +60,14 @@
   /**
    * \brief Determines if channel descriptors sent in the current frame are
    * required to be updated
+   *
+   * \param updateDcd currently unused (assume true)
+   * \param updateUcd currently unused (assume true)
+   * \param [out] sendDcd DCD must be updated
+   * \param [out] sendUcd UCD must be updated
+   *
    */
-  void GetChannelDescriptorsToUpdate (bool&, bool&, bool&, bool&);
+  void GetChannelDescriptorsToUpdate (bool& updateDcd, bool& updateUcd, bool& sendDcd, bool& sendUcd);
   uint32_t CalculateAllocationStartTime (void);
   void AddUplinkAllocation (OfdmUlMapIe &ulMapIe,
                             const uint32_t &allocationSize,
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wimax/model/snr-to-block-error-rate-record.cc ns-3.34/src/wimax/model/snr-to-block-error-rate-record.cc
--- ns-3.33/src/wimax/model/snr-to-block-error-rate-record.cc	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wimax/model/snr-to-block-error-rate-record.cc	2021-07-14 10:31:07.000000000 -0700
@@ -103,14 +103,14 @@
   m_blockErrorRate = blockErrorRate;
 }
 void
-SNRToBlockErrorRateRecord::SetI1 (double I1)
+SNRToBlockErrorRateRecord::SetI1 (double i1)
 {
-  m_i1 = I1;
+  m_i1 = i1;
 }
 void
-SNRToBlockErrorRateRecord::SetI2 (double I2)
+SNRToBlockErrorRateRecord::SetI2 (double i2)
 {
-  m_i2 = I2;
+  m_i2 = i2;
 }
 
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wimax/model/snr-to-block-error-rate-record.h ns-3.34/src/wimax/model/snr-to-block-error-rate-record.h
--- ns-3.33/src/wimax/model/snr-to-block-error-rate-record.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wimax/model/snr-to-block-error-rate-record.h	2021-07-14 10:31:07.000000000 -0700
@@ -80,24 +80,29 @@
 
   /**
    * \brief set the snr value
+   * \param snrValue the SNR value
    */
-  void SetSNRValue (double);
+  void SetSNRValue (double snrValue);
   /**
    * \brief set the BER value
+   * \param bitErrorRate the bit error rate value
    */
-  void SetBitErrorRate (double);
+  void SetBitErrorRate (double bitErrorRate);
   /**
    * \brief set the BlcER value
+   * \param blockErrorRate the block error rate value
    */
-  void SetBlockErrorRate (double);
+  void SetBlockErrorRate (double blockErrorRate);
   /**
    * \brief set the lower boundary of the confidence interval
+   * \param i1 the lower boundary of the confidence interval
    */
-  void SetI1 (double);
+  void SetI1 (double i1);
   /**
    * \brief set the upper boundary of the confidence interval
+   * \param i2 the upper boundary of the confidence interval
    */
-  void SetI2 (double);
+  void SetI2 (double i2);
 
 private:
   double m_snrValue; ///< SNR value
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wimax/model/ss-service-flow-manager.h ns-3.34/src/wimax/model/ss-service-flow-manager.h
--- ns-3.33/src/wimax/model/ss-service-flow-manager.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wimax/model/ss-service-flow-manager.h	2021-07-14 10:31:07.000000000 -0700
@@ -50,13 +50,11 @@
     CONFIRMATION_CODE_REJECT
   };
   /**
-   * \brief creates a service flow manager and attaches it to a device
-   * \param  device the device to which the service flow manager will be attached
-   */
-  /**
    * Constructor
    *
-   * \param device subscriber station device
+   * Creates a service flow manager and attaches it to a device
+   *
+   * \param device the device to which the service flow manager will be attached
    */
   SsServiceFlowManager (Ptr<SubscriberStationNetDevice> device);
   ~SsServiceFlowManager (void);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wimax/model/ul-job.h ns-3.34/src/wimax/model/ul-job.h
--- ns-3.33/src/wimax/model/ul-job.h	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wimax/model/ul-job.h	2021-07-14 10:31:07.000000000 -0700
@@ -202,7 +202,7 @@
 };
 
 /// SortProcess structure 
-struct SortProcess : public std::binary_function<PriorityUlJob*, PriorityUlJob*, bool>
+struct SortProcess
 {
   /**
    * \brief comparison operator
@@ -237,7 +237,7 @@
 };
 
 /// SortProcessPtr structure
-struct SortProcessPtr: public std::binary_function< Ptr<PriorityUlJob>, Ptr<PriorityUlJob>, bool>
+struct SortProcessPtr
 {
   /**
    * \brief comparison operator
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/src/wscript ns-3.34/src/wscript
--- ns-3.33/src/wscript	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/src/wscript	2021-07-14 10:31:07.000000000 -0700
@@ -40,12 +40,11 @@
                          " --run and --shell; moreover, only works in some"
                          " specific platforms, such as Linux and Solaris)"),
                    action="store_true", dest='enable_rpath', default=False)
-    
+
     opt.add_option('--enable-modules',
                    help=("Build only these modules (and dependencies)"),
                    dest='enable_modules')
 
-    opt.load('boost', tooldir=['waf-tools'])
 
     for module in all_modules:
         opt.recurse(module, mandatory=False)
@@ -110,7 +109,7 @@
     module.is_static = static
     module.vnum = wutils.VNUM
     # Add the proper path to the module's name.
-    # Set the libraries this module depends on.  
+    # Set the libraries this module depends on.
     module.module_deps = list(dependencies)
 
     module.install_path = "${LIBDIR}"
@@ -129,7 +128,7 @@
     
     module.pcfilegen = bld(features='ns3pcfile')
     module.pcfilegen.module = module.name
-    
+
     return module
 
 @TaskGen.feature("ns3testlib")
@@ -157,7 +156,7 @@
     # Add this module and test library to the list.
     bld.env.append_value('NS3_MODULES_WITH_TEST_LIBRARIES', [(library.module_name, library.name)])
 
-    # Set the include path from the build directory to modules. 
+    # Set the include path from the build directory to modules.
     relative_path_from_build_to_here = bld.path.path_from(bld.bldnode)
     include_flag = '-I' + relative_path_from_build_to_here
     library.env.append_value('CXXFLAGS', include_flag)
@@ -235,7 +234,7 @@
             '${PYTHON}']
     #if debug:
     #    argv.extend(["-m", "pdb"])
-    
+
     argv.extend(['${SRC[0]}', module_abs_src_path, apidefs, extension_name, '${TGT[0]}'])
 
     argv.extend(['2>', '${TGT[2]}']) # 2> ns3modulegen.log
@@ -278,6 +277,7 @@
             pymod.env.append_value('LINKFLAGS', '-Wl,-Bdynamic,--no-whole-archive')
     defines = list(pymod.env['DEFINES'])
     defines.extend(['NS_DEPRECATED=', 'NS3_DEPRECATED_H'])
+    defines.extend(['NS_DEPRECATED_3_34=', 'NS3_DEPRECATED_H'])
     defines.extend(['NS_DEPRECATED_3_32=', 'NS3_DEPRECATED_H'])
     defines.extend(['NS_DEPRECATED_3_31=', 'NS3_DEPRECATED_H'])
     defines.extend(['NS_DEPRECATED_3_30=', 'NS3_DEPRECATED_H'])
@@ -292,12 +292,6 @@
     pymod.includes = Context.out_dir + ' ' + Context.out_dir + '/src/core/bindings'
     pymod.install_path = '${PYTHONARCHDIR}/ns'
 
-    # Workaround to a WAF bug, remove this when ns-3 upgrades to WAF > 1.6.10
-    # https://www.nsnam.org/bugzilla/show_bug.cgi?id=1335
-    # http://code.google.com/p/waf/issues/detail?id=1098
-    if Utils.unversioned_sys_platform() == 'darwin':
-        pymod.mac_bundle = True
-
     return pymod
 
 
@@ -306,7 +300,7 @@
     bld.create_ns3_module_test_library = types.MethodType(create_ns3_module_test_library, bld)
     bld.create_obj = types.MethodType(create_obj, bld)
     bld.ns3_python_bindings = types.MethodType(ns3_python_bindings, bld)
-    
+
     # Remove these modules from the list of all modules.
     for not_built in bld.env['MODULES_NOT_BUILT']:
 
@@ -378,14 +372,13 @@
         return self._listify(self.env['CXXFLAGS_%s' % dep])
 
     def _defines(self, dep):
-        return [self.env['DEFINES_ST'] % define for define in self.env['DEFINES_%s' % dep]] 
+        return [self.env['DEFINES_ST'] % define for define in self.env['DEFINES_%s' % dep]]
 
     def _includes(self, dep):
         includes = self.env['INCLUDES_%s' % dep]
         return [self.env['CPPPATH_ST'] % include for include in Utils.to_list(includes)]
 
     def _generate_pcfile(self, name, use, env, outfilename, module):
-        outfile = open(outfilename, 'wt')
         prefix = env.PREFIX
         includedir = Utils.subst_vars('${INCLUDEDIR}/%s%s' % (wutils.APPNAME, wutils.VERSION), env)
         libdir = env.LIBDIR
@@ -406,7 +399,9 @@
             if dep.startswith('ns3-'):
                 dep_name = dep[4:]
                 requires.append("libns%s-%s%s" % (wutils.VERSION, dep_name, env.BUILD_SUFFIX))
-        print("""\
+
+        with open(outfilename, 'wt') as outfile:
+            print("""\
 prefix=%s
 libdir=%s
 includedir=%s
@@ -419,11 +414,10 @@
 Requires: %s\
 """ % (prefix, libdir, includedir,
        name, name, wutils.VERSION, ' '.join(libs), ' '.join(cflags), ' '.join(requires)), file=outfile)
-        outfile.close()
 
     def run(self):
         output_filename = self.outputs[0].abspath()
-        self._generate_pcfile(self.module.name, 
+        self._generate_pcfile(self.module.name,
                               self.module.to_list(self.module.use),
                               self.env, output_filename, self.module)
 
@@ -666,10 +660,10 @@
         assert len(self.outputs) == 1
         out_file_name = self.outputs[0].get_bld().abspath()#self.env)
         header_files = [os.path.basename(node.abspath()) for node in self.inputs]
-        outfile = open(out_file_name, "w")
         header_files.sort()
 
-        print("""
+        with open(out_file_name, "w") as outfile:
+            print("""
 #ifdef NS3_MODULE_COMPILATION
 # error "Do not include ns3 module aggregator headers from other modules; these are meant only for end user scripts."
 #endif
@@ -682,14 +676,13 @@
     #     for dep in self.module_deps:
     #         print >> outfile, "#include \"%s-module.h\"" % dep
 
-        print(file=outfile)
-        print("// Module headers:", file=outfile)
-        for header in header_files:
-            print("#include \"%s\"" % (header,), file=outfile)
+            print(file=outfile)
+            print("// Module headers:", file=outfile)
+            for header in header_files:
+                print("#include \"%s\"" % (header,), file=outfile)
 
-        print("#endif", file=outfile)
+            print("#endif", file=outfile)
 
-        outfile.close()
         return 0
 
     def sig_explicit_deps(self):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/test.py ns-3.34/test.py
--- ns-3.33/test.py	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/test.py	2021-07-14 10:31:07.000000000 -0700
@@ -290,23 +290,23 @@
 def translate_to_text(results_file, text_file):
     text_file += '.txt'
     print('Writing results to text file \"%s\"...' % text_file, end='')
-    f = open(text_file, 'w')
     import xml.etree.ElementTree as ET
     et = ET.parse(results_file)
-    for test in et.findall('Test'):
-        node_to_text(test, f)
 
-    for example in et.findall('Example'):
-        result = example.find('Result').text
-        name = example.find('Name').text
-        if not example.find('Time') is None:
-            time_real = example.find('Time').get('real')
-        else:
-            time_real = ''
-        output = "%s: Example \"%s\" (%s)\n" % (result, name, time_real)
-        f.write(output)
+    with open(text_file, 'w') as f:
+        for test in et.findall('Test'):
+            node_to_text(test, f)
+
+        for example in et.findall('Example'):
+            result = example.find('Result').text
+            name = example.find('Name').text
+            if not example.find('Time') is None:
+                time_real = example.find('Time').get('real')
+            else:
+                time_real = ''
+            output = "%s: Example \"%s\" (%s)\n" % (result, name, time_real)
+            f.write(output)
 
-    f.close()
     print('done.')
 
 #
@@ -318,262 +318,263 @@
 def translate_to_html(results_file, html_file):
     html_file += '.html'
     print('Writing results to html file %s...' % html_file, end='')
-    f = open(html_file, 'w')
-    f.write("<html>\n")
-    f.write("<body>\n")
-    f.write("<center><h1>ns-3 Test Results</h1></center>\n")
 
-    #
-    # Read and parse the whole results file.
-    #
-    import xml.etree.ElementTree as ET
-    et = ET.parse(results_file)
+    with open(html_file, 'w') as f:
+        f.write("<html>\n")
+        f.write("<body>\n")
+        f.write("<center><h1>ns-3 Test Results</h1></center>\n")
 
-    #
-    # Iterate through the test suites
-    #
-    f.write("<h2>Test Suites</h2>\n")
-    for suite in et.findall('Test'):
         #
-        # For each test suite, get its name, result and execution time info
+        # Read and parse the whole results file.
         #
-        (result, name, reason, time) = read_test(suite)
+        import xml.etree.ElementTree as ET
+        et = ET.parse(results_file)
 
         #
-        # Print a level three header with the result, name and time.  If the
-        # test suite passed, the header is printed in green. If the suite was
-        # skipped, print it in orange, otherwise assume something bad happened
-        # and print in red.
+        # Iterate through the test suites
         #
-        if result == "PASS":
-            f.write("<h3 style=\"color:green\">%s: %s (%s)</h3>\n" % (result, name, time))
-        elif result == "SKIP":
-            f.write("<h3 style=\"color:#ff6600\">%s: %s (%s) (%s)</h3>\n" % (result, name, time, reason))
-        else:
-            f.write("<h3 style=\"color:red\">%s: %s (%s)</h3>\n" % (result, name, time))
-
-        #
-        # The test case information goes in a table.
-        #
-        f.write("<table border=\"1\">\n")
-
-        #
-        # The first column of the table has the heading Result
-        #
-        f.write("<th> Result </th>\n")
+        f.write("<h2>Test Suites</h2>\n")
+        for suite in et.findall('Test'):
+            #
+            # For each test suite, get its name, result and execution time info
+            #
+            (result, name, reason, time) = read_test(suite)
 
-        #
-        # If the suite crashed or is skipped, there is no further information, so just
-        # declare a new table row with the result (CRASH or SKIP) in it.  Looks like:
-        #
-        #   +--------+
-        #   | Result |
-        #   +--------+
-        #   | CRASH  |
-        #   +--------+
-        #
-        # Then go on to the next test suite.  Valgrind and skipped errors look the same.
-        #
-        if result in ["CRASH", "SKIP", "VALGR"]:
-            f.write("<tr>\n")
-            if result == "SKIP":
-                f.write("<td style=\"color:#ff6600\">%s</td>\n" % result)
+            #
+            # Print a level three header with the result, name and time.  If the
+            # test suite passed, the header is printed in green. If the suite was
+            # skipped, print it in orange, otherwise assume something bad happened
+            # and print in red.
+            #
+            if result == "PASS":
+                f.write("<h3 style=\"color:green\">%s: %s (%s)</h3>\n" % (result, name, time))
+            elif result == "SKIP":
+                f.write("<h3 style=\"color:#ff6600\">%s: %s (%s) (%s)</h3>\n" % (result, name, time, reason))
             else:
-                f.write("<td style=\"color:red\">%s</td>\n" % result)
-            f.write("</tr>\n")
-            f.write("</table>\n")
-            continue
+                f.write("<h3 style=\"color:red\">%s: %s (%s)</h3>\n" % (result, name, time))
 
-        #
-        # If the suite didn't crash, we expect more information, so fill out
-        # the table heading row.  Like,
-        #
-        #   +--------+----------------+------+
-        #   | Result | Test Case Name | Time |
-        #   +--------+----------------+------+
-        #
-        f.write("<th>Test Case Name</th>\n")
-        f.write("<th> Time </th>\n")
+            #
+            # The test case information goes in a table.
+            #
+            f.write("<table border=\"1\">\n")
 
-        #
-        # If the test case failed, we need to print out some failure details
-        # so extend the heading row again.  Like,
-        #
-        #   +--------+----------------+------+-----------------+
-        #   | Result | Test Case Name | Time | Failure Details |
-        #   +--------+----------------+------+-----------------+
-        #
-        if result == "FAIL":
-            f.write("<th>Failure Details</th>\n")
+            #
+            # The first column of the table has the heading Result
+            #
+            f.write("<th> Result </th>\n")
 
-        #
-        # Now iterate through all of the test cases.
-        #
-        for case in suite.findall('Test'):
+            #
+            # If the suite crashed or is skipped, there is no further information, so just
+            # declare a new table row with the result (CRASH or SKIP) in it.  Looks like:
+            #
+            #   +--------+
+            #   | Result |
+            #   +--------+
+            #   | CRASH  |
+            #   +--------+
+            #
+            # Then go on to the next test suite.  Valgrind and skipped errors look the same.
+            #
+            if result in ["CRASH", "SKIP", "VALGR"]:
+                f.write("<tr>\n")
+                if result == "SKIP":
+                    f.write("<td style=\"color:#ff6600\">%s</td>\n" % result)
+                else:
+                    f.write("<td style=\"color:red\">%s</td>\n" % result)
+                f.write("</tr>\n")
+                f.write("</table>\n")
+                continue
 
             #
-            # Get the name, result and timing information from xml to use in
-            # printing table below.
+            # If the suite didn't crash, we expect more information, so fill out
+            # the table heading row.  Like,
+            #
+            #   +--------+----------------+------+
+            #   | Result | Test Case Name | Time |
+            #   +--------+----------------+------+
             #
-            (result, name, reason, time) = read_test(case)
+            f.write("<th>Test Case Name</th>\n")
+            f.write("<th> Time </th>\n")
 
             #
-            # If the test case failed, we iterate through possibly multiple
-            # failure details
+            # If the test case failed, we need to print out some failure details
+            # so extend the heading row again.  Like,
+            #
+            #   +--------+----------------+------+-----------------+
+            #   | Result | Test Case Name | Time | Failure Details |
+            #   +--------+----------------+------+-----------------+
             #
             if result == "FAIL":
+                f.write("<th>Failure Details</th>\n")
+
+            #
+            # Now iterate through all of the test cases.
+            #
+            for case in suite.findall('Test'):
+
                 #
-                # There can be multiple failures for each test case.  The first
-                # row always gets the result, name and timing information along
-                # with the failure details.  Remaining failures don't duplicate
-                # this information but just get blanks for readability.  Like,
-                #
-                #   +--------+----------------+------+-----------------+
-                #   | Result | Test Case Name | Time | Failure Details |
-                #   +--------+----------------+------+-----------------+
-                #   |  FAIL  | The name       | time | It's busted     |
-                #   +--------+----------------+------+-----------------+
-                #   |        |                |      | Really broken   |
-                #   +--------+----------------+------+-----------------+
-                #   |        |                |      | Busted bad      |
-                #   +--------+----------------+------+-----------------+
+                # Get the name, result and timing information from xml to use in
+                # printing table below.
                 #
+                (result, name, reason, time) = read_test(case)
 
-                first_row = True
-                for details in case.findall('FailureDetails'):
-
+                #
+                # If the test case failed, we iterate through possibly multiple
+                # failure details
+                #
+                if result == "FAIL":
                     #
-                    # Start a new row in the table for each possible Failure Detail
+                    # There can be multiple failures for each test case.  The first
+                    # row always gets the result, name and timing information along
+                    # with the failure details.  Remaining failures don't duplicate
+                    # this information but just get blanks for readability.  Like,
+                    #
+                    #   +--------+----------------+------+-----------------+
+                    #   | Result | Test Case Name | Time | Failure Details |
+                    #   +--------+----------------+------+-----------------+
+                    #   |  FAIL  | The name       | time | It's busted     |
+                    #   +--------+----------------+------+-----------------+
+                    #   |        |                |      | Really broken   |
+                    #   +--------+----------------+------+-----------------+
+                    #   |        |                |      | Busted bad      |
+                    #   +--------+----------------+------+-----------------+
                     #
-                    f.write("<tr>\n")
 
-                    if first_row:
-                        first_row = False
-                        f.write("<td style=\"color:red\">%s</td>\n" % result)
-                        f.write("<td>%s</td>\n" % name)
-                        f.write("<td>%s</td>\n" % time)
-                    else:
-                        f.write("<td></td>\n")
-                        f.write("<td></td>\n")
-                        f.write("<td></td>\n")
-
-                    f.write("<td>")
-                    f.write("<b>Message: </b>%s, " % details.find('Message').text)
-                    f.write("<b>Condition: </b>%s, " % details.find('Condition').text)
-                    f.write("<b>Actual: </b>%s, " % details.find('Actual').text)
-                    f.write("<b>Limit: </b>%s, " % details.find('Limit').text)
-                    f.write("<b>File: </b>%s, " % details.find('File').text)
-                    f.write("<b>Line: </b>%s" % details.find('Line').text)
-                    f.write("</td>\n")
+                    first_row = True
+                    for details in case.findall('FailureDetails'):
 
+                        #
+                        # Start a new row in the table for each possible Failure Detail
+                        #
+                        f.write("<tr>\n")
+
+                        if first_row:
+                            first_row = False
+                            f.write("<td style=\"color:red\">%s</td>\n" % result)
+                            f.write("<td>%s</td>\n" % name)
+                            f.write("<td>%s</td>\n" % time)
+                        else:
+                            f.write("<td></td>\n")
+                            f.write("<td></td>\n")
+                            f.write("<td></td>\n")
+
+                        f.write("<td>")
+                        f.write("<b>Message: </b>%s, " % details.find('Message').text)
+                        f.write("<b>Condition: </b>%s, " % details.find('Condition').text)
+                        f.write("<b>Actual: </b>%s, " % details.find('Actual').text)
+                        f.write("<b>Limit: </b>%s, " % details.find('Limit').text)
+                        f.write("<b>File: </b>%s, " % details.find('File').text)
+                        f.write("<b>Line: </b>%s" % details.find('Line').text)
+                        f.write("</td>\n")
+
+                        #
+                        # End the table row
+                        #
+                        f.write("</td>\n")
+                else:
                     #
-                    # End the table row
+                    # If this particular test case passed, then we just print the PASS
+                    # result in green, followed by the test case name and its execution
+                    # time information.  These go off in <td> ... </td> table data.
+                    # The details table entry is left blank.
                     #
-                    f.write("</td>\n")
-            else:
-                #
-                # If this particular test case passed, then we just print the PASS
-                # result in green, followed by the test case name and its execution
-                # time information.  These go off in <td> ... </td> table data.
-                # The details table entry is left blank.
-                #
-                #   +--------+----------------+------+---------+
-                #   | Result | Test Case Name | Time | Details |
-                #   +--------+----------------+------+---------+
-                #   |  PASS  | The name       | time |         |
-                #   +--------+----------------+------+---------+
-                #
-                f.write("<tr>\n")
-                f.write("<td style=\"color:green\">%s</td>\n" % result)
-                f.write("<td>%s</td>\n" % name)
-                f.write("<td>%s</td>\n" % time)
-                f.write("<td>%s</td>\n" % reason)
-                f.write("</tr>\n")
-        #
-        # All of the rows are written, so we need to end the table.
-        #
-        f.write("</table>\n")
-
-    #
-    # That's it for all of the test suites.  Now we have to do something about
-    # our examples.
-    #
-    f.write("<h2>Examples</h2>\n")
-
-    #
-    # Example status is rendered in a table just like the suites.
-    #
-    f.write("<table border=\"1\">\n")
-
-    #
-    # The table headings look like,
-    #
-    #   +--------+--------------+--------------+---------+
-    #   | Result | Example Name | Elapsed Time | Details |
-    #   +--------+--------------+--------------+---------+
-    #
-    f.write("<th> Result </th>\n")
-    f.write("<th>Example Name</th>\n")
-    f.write("<th>Elapsed Time</th>\n")
-    f.write("<th>Details</th>\n")
-
-    #
-    # Now iterate through all of the examples
-    #
-    for example in et.findall("Example"):
+                    #   +--------+----------------+------+---------+
+                    #   | Result | Test Case Name | Time | Details |
+                    #   +--------+----------------+------+---------+
+                    #   |  PASS  | The name       | time |         |
+                    #   +--------+----------------+------+---------+
+                    #
+                    f.write("<tr>\n")
+                    f.write("<td style=\"color:green\">%s</td>\n" % result)
+                    f.write("<td>%s</td>\n" % name)
+                    f.write("<td>%s</td>\n" % time)
+                    f.write("<td>%s</td>\n" % reason)
+                    f.write("</tr>\n")
+            #
+            # All of the rows are written, so we need to end the table.
+            #
+            f.write("</table>\n")
 
         #
-        # Start a new row for each example
+        # That's it for all of the test suites.  Now we have to do something about
+        # our examples.
         #
-        f.write("<tr>\n")
+        f.write("<h2>Examples</h2>\n")
 
         #
-        # Get the result and name of the example in question
+        # Example status is rendered in a table just like the suites.
         #
-        (result, name, reason, time) = read_test(example)
+        f.write("<table border=\"1\">\n")
 
         #
-        # If the example either failed or crashed, print its result status
-        # in red; otherwise green.  This goes in a <td> ... </td> table data
+        # The table headings look like,
         #
-        if result == "PASS":
-            f.write("<td style=\"color:green\">%s</td>\n" % result)
-        elif result == "SKIP":
-            f.write("<td style=\"color:#ff6600\">%s</fd>\n" % result)
-        else:
-            f.write("<td style=\"color:red\">%s</td>\n" % result)
-
+        #   +--------+--------------+--------------+---------+
+        #   | Result | Example Name | Elapsed Time | Details |
+        #   +--------+--------------+--------------+---------+
         #
-        # Write the example name as a new tag data.
-        #
-        f.write("<td>%s</td>\n" % name)
+        f.write("<th> Result </th>\n")
+        f.write("<th>Example Name</th>\n")
+        f.write("<th>Elapsed Time</th>\n")
+        f.write("<th>Details</th>\n")
 
         #
-        # Write the elapsed time as a new tag data.
+        # Now iterate through all of the examples
         #
-        f.write("<td>%s</td>\n" % time)
+        for example in et.findall("Example"):
+
+            #
+            # Start a new row for each example
+            #
+            f.write("<tr>\n")
+
+            #
+            # Get the result and name of the example in question
+            #
+            (result, name, reason, time) = read_test(example)
+
+            #
+            # If the example either failed or crashed, print its result status
+            # in red; otherwise green.  This goes in a <td> ... </td> table data
+            #
+            if result == "PASS":
+                f.write("<td style=\"color:green\">%s</td>\n" % result)
+            elif result == "SKIP":
+                f.write("<td style=\"color:#ff6600\">%s</fd>\n" % result)
+            else:
+                f.write("<td style=\"color:red\">%s</td>\n" % result)
+
+            #
+            # Write the example name as a new tag data.
+            #
+            f.write("<td>%s</td>\n" % name)
+
+            #
+            # Write the elapsed time as a new tag data.
+            #
+            f.write("<td>%s</td>\n" % time)
+
+            #
+            # Write the reason, if it exist
+            #
+            f.write("<td>%s</td>\n" % reason)
+
+            #
+            # That's it for the current example, so terminate the row.
+            #
+            f.write("</tr>\n")
 
         #
-        # Write the reason, if it exist
+        # That's it for the table of examples, so terminate the table.
         #
-        f.write("<td>%s</td>\n" % reason)
+        f.write("</table>\n")
 
         #
-        # That's it for the current example, so terminate the row.
+        # And that's it for the report, so finish up.
         #
-        f.write("</tr>\n")
+        f.write("</body>\n")
+        f.write("</html>\n")
 
-    #
-    # That's it for the table of examples, so terminate the table.
-    #
-    f.write("</table>\n")
-
-    #
-    # And that's it for the report, so finish up.
-    #
-    f.write("</body>\n")
-    f.write("</html>\n")
-    f.close()
     print('done.')
 
 #
@@ -625,14 +626,19 @@
         if line.startswith("out_dir ="):
             key, val = line.split('=')
             out_dir = eval(val.strip())
+
+    f.close()
+
     global NS3_BASEDIR
     NS3_BASEDIR = top_dir
     global NS3_BUILDDIR
     NS3_BUILDDIR = out_dir
-    for line in open("%s/c4che/_cache.py" % out_dir).readlines():
-        for item in interesting_config_items:
-            if line.startswith(item):
-                exec(line, globals())
+
+    with open("%s/c4che/_cache.py" % out_dir) as f:
+        for line in f.readlines():
+            for item in interesting_config_items:
+                if line.startswith(item):
+                    exec(line, globals())
 
     if options.verbose:
         for item in interesting_config_items:
@@ -1293,10 +1299,9 @@
     # do this since the tests will just append individual results to this file.
     #
     xml_results_file = os.path.join(testpy_output_dir, "results.xml")
-    f = open(xml_results_file, 'w')
-    f.write('<?xml version="1.0"?>\n')
-    f.write('<Results>\n')
-    f.close()
+    with open(xml_results_file, 'w') as f:
+        f.write('<?xml version="1.0"?>\n')
+        f.write('<Results>\n')
 
     #
     # We need to figure out what test suites to execute.  We are either given one
@@ -1767,25 +1772,24 @@
             # XXX We could add some timing information to the examples, i.e. run
             # them through time and print the results here.
             #
-            f = open(xml_results_file, 'a')
-            f.write('<Example>\n')
-            example_name = "  <Name>%s</Name>\n" % job.display_name
-            f.write(example_name)
-
-            if status == "PASS":
-                f.write('  <Result>PASS</Result>\n')
-            elif status == "FAIL":
-                f.write('  <Result>FAIL</Result>\n')
-            elif status == "VALGR":
-                f.write('  <Result>VALGR</Result>\n')
-            elif status == "SKIP":
-                f.write('  <Result>SKIP</Result>\n')
-            else:
-                f.write('  <Result>CRASH</Result>\n')
+            with open(xml_results_file, 'a') as f:
+                f.write('<Example>\n')
+                example_name = "  <Name>%s</Name>\n" % job.display_name
+                f.write(example_name)
+
+                if status == "PASS":
+                    f.write('  <Result>PASS</Result>\n')
+                elif status == "FAIL":
+                    f.write('  <Result>FAIL</Result>\n')
+                elif status == "VALGR":
+                    f.write('  <Result>VALGR</Result>\n')
+                elif status == "SKIP":
+                    f.write('  <Result>SKIP</Result>\n')
+                else:
+                    f.write('  <Result>CRASH</Result>\n')
 
-            f.write('  <Time real="%.3f"/>\n' % job.elapsed_time)
-            f.write('</Example>\n')
-            f.close()
+                f.write('  <Time real="%.3f"/>\n' % job.elapsed_time)
+                f.write('</Example>\n')
 
         else:
             #
@@ -1833,27 +1837,22 @@
             # followed by a VALGR failing test suite of the same name.
             #
             if job.is_skip:
-                f = open(xml_results_file, 'a')
-                f.write("<Test>\n")
-                f.write("  <Name>%s</Name>\n" % job.display_name)
-                f.write('  <Result>SKIP</Result>\n')
-                f.write("  <Reason>%s</Reason>\n" % job.skip_reason)
-                f.write("</Test>\n")
-                f.close()
-            else:
-                if job.returncode == 0 or job.returncode == 1 or job.returncode == 2:
-                    f_to = open(xml_results_file, 'a')
-                    f_from = open(job.tmp_file_name)
-                    f_to.write(f_from.read())
-                    f_to.close()
-                    f_from.close()
-                else:
-                    f = open(xml_results_file, 'a')
+                with open(xml_results_file, 'a') as f:
                     f.write("<Test>\n")
                     f.write("  <Name>%s</Name>\n" % job.display_name)
-                    f.write('  <Result>CRASH</Result>\n')
+                    f.write('  <Result>SKIP</Result>\n')
+                    f.write("  <Reason>%s</Reason>\n" % job.skip_reason)
                     f.write("</Test>\n")
-                    f.close()
+            else:
+                if job.returncode == 0 or job.returncode == 1 or job.returncode == 2:
+                    with open(xml_results_file, 'a') as f_to, open(job.tmp_file_name) as f_from:
+                        f_to.write(f_from.read())
+                else:
+                    with open(xml_results_file, 'a') as f:
+                        f.write("<Test>\n")
+                        f.write("  <Name>%s</Name>\n" % job.display_name)
+                        f.write('  <Result>CRASH</Result>\n')
+                        f.write("</Test>\n")
 
     #
     # We have all of the tests run and the results written out.  One final
@@ -1869,9 +1868,8 @@
     # individual pieces.  So, we need to finish off and close out the XML
     # document
     #
-    f = open(xml_results_file, 'a')
-    f.write('</Results>\n')
-    f.close()
+    with open(xml_results_file, 'a') as f:
+        f.write('</Results>\n')
 
     #
     # Print a quick summary of events
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/utils/check-style.py ns-3.34/utils/check-style.py
--- ns-3.33/utils/check-style.py	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/utils/check-style.py	2021-07-14 10:31:07.000000000 -0700
@@ -24,12 +24,9 @@
 
 def copy_file(filename):
     [tmp,pathname] = tempfile.mkstemp()
-    src = open(filename, 'r')
-    dst = open(pathname, 'w')
-    for line in src:
-        dst.write(line)
-    dst.close()
-    src.close()
+    with open(filename, 'r') as src, open(pathname, 'w') as dst:
+        for line in src:
+            dst.write(line)
     return pathname
 
 # generate a temporary configuration file
@@ -136,13 +133,12 @@
 enable_processing_cmt=  " *NS_CHECK_STYLE_ON*"
 """
     [tmp,pathname] = tempfile.mkstemp()
-    dst = open(pathname, 'w')
-    dst.write(level0)
-    if level >= 1:
-        dst.write(level1)
-    if level >= 2:
-        dst.write(level2)
-    dst.close()
+    with open(pathname, 'w') as dst:
+        dst.write(level0)
+        if level >= 1:
+            dst.write(level1)
+        if level >= 2:
+            dst.write(level2)
     return pathname
 
 ## PatchChunkLine class
@@ -184,7 +180,7 @@
         self.__type = self.DST
         self.__line = line
     def set_both(self,line):
-        """! Set both 
+        """! Set both
         @param self The current class
         @param line
         @return none
@@ -220,7 +216,7 @@
         """! Write to file
         @param self The current class
         @param f file
-        @return exception if invalid type 
+        @return exception if invalid type
         """
         if self.__type == self.SRC:
             f.write('-%s\n' % self.__line)
@@ -230,7 +226,7 @@
             f.write(' %s\n' % self.__line)
         else:
             raise Exception('invalid patch')
-    
+
 ## PatchChunk class
 class PatchChunk:
     ## @var __lines
@@ -457,31 +453,25 @@
     except OSError:
         raise Exception ('uncrustify not installed')
     # generate a diff file
-    src = open(source, 'r')
-    dst = open(output, 'r')
-    diff = difflib.unified_diff(src.readlines(), dst.readlines(), 
-                                fromfile=source, tofile=output)
-    src.close()
-    dst.close()
+    with open(source, 'r') as src, open(output, 'r') as dst:
+        diff = difflib.unified_diff(src.readlines(), dst.readlines(),
+                                    fromfile=source, tofile=output)
     if debug:
         initial_diff = tempfile.mkstemp()[1]
         sys.stderr.write('initial diff file=' + initial_diff + '\n')
-        tmp = open(initial_diff, 'w')
-        tmp.writelines(diff)
-        tmp.close()
+        with open(initial_diff, 'w') as tmp:
+            tmp.writelines(diff)
     final_diff = tempfile.mkstemp()[1]
     if level < 3:
-        patchset = remove_trailing_whitespace_changes(diff);
-        dst = open(final_diff, 'w')
+        patchset = remove_trailing_whitespace_changes(diff)
         if len(patchset) != 0:
-            patchset[0].write(dst)
-        dst.close()
+            with open(final_diff, 'w') as dst:
+                patchset[0].write(dst)
     else:
-        dst = open(final_diff, 'w')
-        dst.writelines(diff)
-        dst.close()
-            
-            
+        with open(final_diff, 'w') as dst:
+            dst.writelines(diff)
+
+
     # apply diff file
     if debug:
         sys.stderr.write('final diff file=' + final_diff + '\n')
@@ -496,7 +486,7 @@
         sys.stderr.write(out)
         sys.stderr.write(err)
     return output
- 
+
 
 
 def indent_files(files, diff=False, debug=False, level=0, inplace=False):
@@ -523,10 +513,11 @@
                 print('  ' + src)
         else:
             for src,dst in failed:
-                s = open(src, 'r').readlines()
-                d = open(dst, 'r').readlines()
-                for line in difflib.unified_diff(s, d, fromfile=src, tofile=dst):
-                    sys.stdout.write(line)
+                with open(src, 'r') as f_src, open(dst, 'r') as f_dst:
+                    s = f_src.readlines()
+                    d = f_dst.readlines()
+                    for line in difflib.unified_diff(s, d, fromfile=src, tofile=dst):
+                        sys.stdout.write(line)
         return False
     return True
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/utils/grid.py ns-3.34/utils/grid.py
--- ns-3.33/utils/grid.py	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/utils/grid.py	2021-07-14 10:31:07.000000000 -0700
@@ -515,14 +515,14 @@
         """
         self.__padding = 10
     def set_padding(self, padding):
-        """! Set padding 
+        """! Set padding
         @param self this object
         @param padding padding
         @return none
         """
         self.__padding = padding
     def set_legends(self, legends, colors):
-        """! Set padding 
+        """! Set padding
         @param self this object
         @param legends legends
         @param colors colors
@@ -531,7 +531,7 @@
         self.__legends = legends
         self.__colors = colors
     def layout(self, width):
-        """! Set padding 
+        """! Set padding
         @param self this object
         @param width width
         @return none
@@ -558,13 +558,13 @@
         self.__height = total_height
 
     def get_height(self):
-        """! Set padding 
+        """! Set padding
         @param self this object
         @return height
         """
         return self.__height
     def draw(self, ctx):
-        """! Set padding 
+        """! Set padding
         @param self this object
         @param ctx ctx
         @return none
@@ -589,8 +589,8 @@
             ctx.set_source_rgb(0, 0, 0)
             ctx.set_line_width(2)
             ctx.stroke_preserve()
-            ctx.set_source_rgb(self.__colors[i].r, 
-                               self.__colors[i].g, 
+            ctx.set_source_rgb(self.__colors[i].r,
+                               self.__colors[i].g,
                                self.__colors[i].b)
             ctx.fill()
             ctx.move_to(x + self.__padding*2, total_height + t_height)
@@ -625,20 +625,20 @@
     ## @var grey_background
     #  grey background
     def __init__(self):
-        """! Initializer 
+        """! Initializer
         @param self this object
         @return none
         """
         self.padding = 10
         return
     def get_height(self):
-        """! Get Height 
+        """! Get Height
         @param self this object
         @return height
         """
         return self.height
     def set_timelines(self, timelines, colors):
-        """! Set Timelines 
+        """! Set Timelines
         @param self this object
         @param timelines timelines
         @param colors colors
@@ -647,7 +647,7 @@
         self.timelines = timelines
         self.colors = colors
     def set_render_range(self, start, end):
-        """! Set Render Range 
+        """! Set Render Range
         @param self this object
         @param start start
         @param end end
@@ -656,13 +656,13 @@
         self.start = start
         self.end = end
     def get_data_x_start(self):
-        """! Get Data X Start 
+        """! Get Data X Start
         @param self: this object
         @return X start
         """
         return self.padding / 2 + self.left_width + self.padding + self.right_width + self.padding / 2
     def layout(self, width):
-        """! Get Data X Start 
+        """! Get Data X Start
         @param self this object
         @param width width
         @return none
@@ -709,7 +709,7 @@
         self.width = width
         self.height = height + self.padding
     def draw_line(self, ctx, x, y, width, height):
-        """! Draw Line 
+        """! Draw Line
         @param self this object
         @param ctx ctx
         @param x x
@@ -726,7 +726,7 @@
         ctx.set_source_rgb(0, 0, 0)
         ctx.stroke()
     def draw_events(self, ctx, events, x, y, width, height):
-        """! Draw Event 
+        """! Draw Event
         @param self this object
         @param ctx ctx
         @param events events
@@ -737,7 +737,7 @@
         @return none
         """
         if (self.grey_background % 2) == 0:
-            ctx.rectangle(x, y - self.padding / 2, 
+            ctx.rectangle(x, y - self.padding / 2,
                           width, height + self.padding)
             ctx.set_source_rgb(0.9, 0.9, 0.9)
             ctx.fill()
@@ -755,7 +755,7 @@
                 last_x_drawn = real_x
         self.grey_background += 1
     def draw_ranges(self, ctx, ranges, x, y, width, height):
-        """! Draw Ranges 
+        """! Draw Ranges
         @param self this object
         @param ctx ctx
         @param ranges ranges
@@ -766,7 +766,7 @@
         @return none
         """
         if (self.grey_background % 2) == 0:
-            ctx.rectangle(x, y - self.padding / 2, 
+            ctx.rectangle(x, y - self.padding / 2,
                           width, height + self.padding)
             ctx.set_source_rgb(0.9, 0.9, 0.9)
             ctx.fill()
@@ -816,7 +816,7 @@
                 ctx.show_text(events_int.name)
                 self.draw_events(ctx, events_int, data_x_start, cur_y, data_width, self.max_text_height + 5)
                 cur_y += self.max_text_height + 5 + self.padding
-                self.draw_line(ctx, right_x_start - self.padding / 2, cur_y - self.padding / 2, 
+                self.draw_line(ctx, right_x_start - self.padding / 2, cur_y - self.padding / 2,
                                self.right_width + self.padding, 0)
 
             for events_str in timeline.get_events_str():
@@ -825,7 +825,7 @@
                 ctx.show_text(events_str.name)
                 self.draw_events(ctx, events_str, data_x_start, cur_y, data_width, self.max_text_height + 5)
                 cur_y += self.max_text_height + 5 + self.padding
-                self.draw_line(ctx, right_x_start - self.padding / 2, cur_y - self.padding / 2, 
+                self.draw_line(ctx, right_x_start - self.padding / 2, cur_y - self.padding / 2,
                                self.right_width + self.padding, 0)
             for ranges in timeline.get_ranges():
                 (y_bearing, t_width, t_height) = ctx.text_extents(ranges.name)[1:4]
@@ -833,14 +833,14 @@
                 ctx.show_text(ranges.name)
                 self.draw_ranges(ctx, ranges, data_x_start, cur_y, data_width, 10)
                 cur_y += self.max_text_height + self.padding
-                self.draw_line(ctx, right_x_start - self.padding / 2, cur_y - self.padding / 2, 
+                self.draw_line(ctx, right_x_start - self.padding / 2, cur_y - self.padding / 2,
                                self.right_width + self.padding, 0)
-            self.draw_line(ctx, 0, cur_y - self.padding / 2, 
+            self.draw_line(ctx, 0, cur_y - self.padding / 2,
                            self.width, 0)
         bot_y = cur_y - self.padding / 2
-        self.draw_line(ctx, left_x_end + self.padding / 2, 0, 
+        self.draw_line(ctx, left_x_end + self.padding / 2, 0,
                        0, bot_y)
-        self.draw_line(ctx, right_x_end + self.padding / 2, 0, 
+        self.draw_line(ctx, right_x_end + self.padding / 2, 0,
                        0, bot_y)
         return
 
@@ -861,14 +861,14 @@
     ## @var max_text_height
     #  maximum text height
     def __init__(self):
-        """! Initializer 
+        """! Initializer
         @param self this object
         @return none
         """
         self.__top = 0
         return
     def set_bounds(self, lo, hi):
-        """! Set Bounds 
+        """! Set Bounds
         @param self this object
         @param lo lo
         @param hi hi
@@ -877,7 +877,7 @@
         self.__lo = lo
         self.__hi = hi
     def get_position(self, x):
-        """! Get Position 
+        """! Get Position
         @param self this object
         @param x x
         @return real x
@@ -885,19 +885,19 @@
         real_x = (x - self.__lo ) * self.__width / (self.__hi - self.__lo)
         return real_x
     def set_top(self):
-        """! Set Top 
+        """! Set Top
         @param self this object
         @return none
         """
         self.__top = 1
     def set_bot(self):
-        """! Set Bottom 
+        """! Set Bottom
         @param self this object
         @return none
         """
         self.__top = 0
     def layout(self, width):
-        """! Layout 
+        """! Layout
         @param self this object
         @param width width
         @return none
@@ -929,13 +929,13 @@
         self.__height = height
 
     def get_height(self):
-        """! Get Height 
+        """! Get Height
         @param self: this object
         @return height
         """
         return self.__height
     def draw(self, ctx):
-        """! Draw 
+        """! Draw
         @param self this object
         @param ctx ctx
         @return none
@@ -987,7 +987,7 @@
     ## @var __mid_scale
     #  mid scale
     ## @var __bot_scale
-    #  bottom scale 
+    #  bottom scale
     ## @var __width
     #  width
     ## @var __height
@@ -1003,7 +1003,7 @@
     ## @var __top_legend
     #  top legend
     def __init__(self, start, end):
-        """! Initializer 
+        """! Initializer
         @param self this object
         @param start start
         @param end end
@@ -1019,20 +1019,20 @@
         self.__width = 1
         self.__height = 1
     def get_width(self):
-        """! Get Width 
+        """! Get Width
         @param self: this object
         @return width
         """
         return self.__width
     def get_height(self):
-        """! Get Height 
+        """! Get Height
         @param self this object
         @return height
         """
         return self.__height
     # return x, y, width, height
     def get_data_rectangle(self):
-        """! Get Data Rectangle 
+        """! Get Data Rectangle
         @param self this object
         @return rectangle
         """
@@ -1040,7 +1040,7 @@
         x_start = self.__data.get_data_x_start()
         return(x_start, y_start, self.__width - x_start, self.__data.get_height())
     def scale_data(self, x):
-        """! Get Data Rectangle 
+        """! Get Data Rectangle
         @param self this object
         @param x x
         @return scaled x
@@ -1050,7 +1050,7 @@
         return x_scaled
     # return x, y, width, height
     def get_selection_rectangle(self):
-        """! Get Selection Rectangle 
+        """! Get Selection Rectangle
         @param self this object
         @return rectangle
         """
@@ -1060,7 +1060,7 @@
         x_end = self.__bot_scale.get_position(self.__r_end)
         return(x_start, y_start, x_end - x_start, y_height)
     def scale_selection(self, x):
-        """! Scale Selection 
+        """! Scale Selection
         @param self this object
         @param x the X
         @return scaled X
@@ -1068,7 +1068,7 @@
         x_scaled = x / self.__width * (self.__end - self.__start)
         return x_scaled
     def set_range(self, start, end):
-        """! Set Range 
+        """! Set Range
         @param self this object
         @param start start
         @param end end
@@ -1084,27 +1084,27 @@
         self.__mid_scale.set_bounds(start, end)
         self.layout(self.__width, self.__height)
     def get_range(self):
-        """! Get Range 
+        """! Get Range
         @param self this object
         @return range
         """
         return(self.__r_start, self.__r_end)
     def set_data(self, data):
-        """! Set Date 
+        """! Set Date
         @param self this object
         @param data data
         @return none
         """
         self.__data = data
     def set_top_legend(self, top_legend):
-        """! Set Top Legend 
+        """! Set Top Legend
         @param self this object
         @param top_legend The legend
         @return none
         """
         self.__top_legend = top_legend
     def layout(self, width, height):
-        """! Set Layout 
+        """! Set Layout
         @param self this object
         @param width width
         @param height height
@@ -1119,7 +1119,7 @@
         self.__bot_scale.layout(width)
         return
     def __x_pixel(self, x, width):
-        """! X Pixel 
+        """! X Pixel
         @param self this object
         @param x x
         @param width width
@@ -1129,7 +1129,7 @@
         return new_x
 
     def draw(self, ctx):
-        """! Draw 
+        """! Draw
         @param self this object
         @param ctx ctx
         @return none
@@ -1157,14 +1157,14 @@
 
         # data
         ctx.save()
-        ctx.translate(0, 
+        ctx.translate(0,
                        top_legend_height)
         self.__data.draw(ctx)
         ctx.restore()
 
         # scale below data
         ctx.save()
-        ctx.translate(self.__data.get_data_x_start(), 
+        ctx.translate(self.__data.get_data_x_start(),
                        top_legend_height + self.__data.get_height() + self.__mid_scale.get_height())
         self.__mid_scale.draw(ctx)
         ctx.restore()
@@ -1219,12 +1219,12 @@
         unused_start = self.__bot_scale.get_position(self.__r_start)
         unused_end = self.__bot_scale.get_position(self.__r_end)
         unused_height = self.__bot_scale.get_height() + 20
-        ctx.rectangle(0, height_used, 
-                       unused_start, 
+        ctx.rectangle(0, height_used,
+                       unused_start,
                        unused_height)
-        ctx.rectangle(unused_end, 
-                       height_used, 
-                       self.__width - unused_end, 
+        ctx.rectangle(unused_end,
+                       height_used,
+                       self.__width - unused_end,
                        unused_height)
         ctx.set_source_rgb(0.9, 0.9, 0.9)
         ctx.fill()
@@ -1296,7 +1296,7 @@
     ## @var __height
     #  height
     ## @var __buffer_surface
-    #  buffer surface 
+    #  buffer surface
     def __init__(self, data):
         """! Initializer
         @param self this object
@@ -1342,8 +1342,8 @@
         @param filename file name
         @return none
         """
-        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 
-                                     self.__data.get_width(), 
+        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,
+                                     self.__data.get_width(),
                                      self.__data.get_height())
         ctx = cairo.Context(self.__buffer_surface)
         self.__data.draw(ctx)
@@ -1490,14 +1490,14 @@
         @return false
         """
         if self.__force_full_redraw:
-            self.__buffer_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 
-                                                       self.__data.get_width(), 
+            self.__buffer_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,
+                                                       self.__data.get_width(),
                                                        self.__data.get_height())
             ctx = cairo.Context(self.__buffer_surface)
             self.__data.draw(ctx)
             self.__force_full_redraw = False
         ctx = widget.window.cairo_create()
-        ctx.rectangle(event.area.x, event.area.y, 
+        ctx.rectangle(event.area.x, event.area.y,
                       event.area.width, event.area.height)
         ctx.clip()
         ctx.set_source_surface(self.__buffer_surface)
@@ -1594,7 +1594,7 @@
         @param widget widget
         @return none
         """
-        dialog = gtk.FileChooserDialog("Output Png", self.__window, 
+        dialog = gtk.FileChooserDialog("Output Png", self.__window,
                                        gtk.FILE_CHOOSER_ACTION_SAVE, ("Save", 1))
         self.__dialog = dialog
         dialog.set_default_response(1)
@@ -1619,52 +1619,53 @@
 def read_data(filename):
     timelines = Timelines()
     colors = Colors()
-    fh = open(filename)
     m1 = re.compile('range ([^ ]+) ([^ ]+) ([^ ]+) ([0-9]+) ([0-9]+)')
     m2 = re.compile('event-str ([^ ]+) ([^ ]+) ([^ ]+) ([0-9]+)')
     m3 = re.compile('event-int ([^ ]+) ([^ ]+) ([0-9]+) ([0-9]+)')
     m4 = re.compile('color ([^ ]+) #([a-fA-F0-9]{2,2})([a-fA-F0-9]{2,2})([a-fA-F0-9]{2,2})')
-    for line in fh.readlines():
-        m = m1.match(line)
-        if m:
-            line_name = m.group(1)
-            timeline = timelines.get(m.group(1))
-            rang = timeline.get_range(m.group(2))
-            data_range = DataRange()
-            data_range.value = m.group(3)
-            data_range.start = int(m.group(4))
-            data_range.end = int(m.group(5))
-            rang.add_range(data_range)
-            continue
-        m = m2.match(line)
-        if m:
-            line_name = m.group(1)
-            timeline = timelines.get(m.group(1))
-            ev = timeline.get_event_str(m.group(2))
-            event = EventString()
-            event.value = m.group(3)
-            event.at = int(m.group(4))
-            ev.add_event(event)
-            continue
-        m = m3.match(line)
-        if m:
-            line_name = m.group(1)
-            timeline = timelines.get(m.group(1))
-            ev = timeline.get_event_int(m.group(2))
-            event = EventInt()
-            event.value = int(m.group(3))
-            event.at = int(m.group(4))
-            ev.add_event(event)
-            continue
-
-        m = m4.match(line)
-        if m:
-            r = int(m.group(2), 16)
-            g = int(m.group(3), 16)
-            b = int(m.group(4), 16)
-            color = Color(r / 255, g / 255, b / 255)
-            colors.add(m.group(1), color)
-            continue
+
+    with open(filename) as fh:
+        for line in fh.readlines():
+            m = m1.match(line)
+            if m:
+                line_name = m.group(1)
+                timeline = timelines.get(m.group(1))
+                rang = timeline.get_range(m.group(2))
+                data_range = DataRange()
+                data_range.value = m.group(3)
+                data_range.start = int(m.group(4))
+                data_range.end = int(m.group(5))
+                rang.add_range(data_range)
+                continue
+            m = m2.match(line)
+            if m:
+                line_name = m.group(1)
+                timeline = timelines.get(m.group(1))
+                ev = timeline.get_event_str(m.group(2))
+                event = EventString()
+                event.value = m.group(3)
+                event.at = int(m.group(4))
+                ev.add_event(event)
+                continue
+            m = m3.match(line)
+            if m:
+                line_name = m.group(1)
+                timeline = timelines.get(m.group(1))
+                ev = timeline.get_event_int(m.group(2))
+                event = EventInt()
+                event.value = int(m.group(3))
+                event.at = int(m.group(4))
+                ev.add_event(event)
+                continue
+
+            m = m4.match(line)
+            if m:
+                r = int(m.group(2), 16)
+                g = int(m.group(3), 16)
+                b = int(m.group(4), 16)
+                color = Color(r / 255, g / 255, b / 255)
+                colors.add(m.group(1), color)
+                continue
     timelines.sort()
     return (colors, timelines)
 
@@ -1679,7 +1680,7 @@
     range_colors = []
     for range_value in range_values:
         range_colors.append(colors.lookup(range_value))
-    top_legend.set_legends(range_values, 
+    top_legend.set_legends(range_values,
                            range_colors)
     graphic.set_top_legend(top_legend)
     data = TimelinesRenderer()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/utils/python-unit-tests.py ns-3.34/utils/python-unit-tests.py
--- ns-3.33/utils/python-unit-tests.py	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/utils/python-unit-tests.py	2021-07-14 10:31:07.000000000 -0700
@@ -1,3 +1,21 @@
+# Copyright (C) 2008-2011 INESC Porto
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+# Author: Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
+
 import unittest
 from ns.core import Simulator, Seconds, Config, int64x64_t
 import ns.core
@@ -111,11 +129,11 @@
         @param self this object
         @return none
         """
-        self.assert_(Seconds(123) == Seconds(123))
-        self.assert_(Seconds(123) >= Seconds(123))
-        self.assert_(Seconds(123) <= Seconds(123))
-        self.assert_(Seconds(124) > Seconds(123))
-        self.assert_(Seconds(123) < Seconds(124))
+        self.assertTrue(Seconds(123) == Seconds(123))
+        self.assertTrue(Seconds(123) >= Seconds(123))
+        self.assertTrue(Seconds(123) <= Seconds(123))
+        self.assertTrue(Seconds(124) > Seconds(123))
+        self.assertTrue(Seconds(123) < Seconds(124))
 
     def testTimeNumericOperations(self):
         """! Test numeric operations
@@ -162,7 +180,7 @@
         source.SendTo(ns.network.Packet(19), 0, ns.network.InetSocketAddress(ns.network.Ipv4Address("127.0.0.1"), 80))
 
         Simulator.Run()
-        self.assert_(self._received_packet is not None)
+        self.assertTrue(self._received_packet is not None)
         self.assertEqual(self._received_packet.GetSize(), 19)
 
 
@@ -171,17 +189,14 @@
         @param self this object
         @return none
         """
-        ##
-        ## Yes, I know, the GetAttribute interface for Python is
-        ## horrible, we should fix this soon, I hope.
-        ##
-        queue = ns.network.DropTailQueue()
-
-        queue.SetAttribute("MaxPackets", ns.core.UintegerValue(123456))
-
-        limit = ns.core.UintegerValue()
-        queue.GetAttribute("MaxPackets", limit)
-        self.assertEqual(limit.Get(), 123456)
+        # Templated class DropTailQueue<Packet> in C++
+        queue = ns.network.DropTailQueue__Ns3Packet()
+        queueSizeValue = ns.network.QueueSizeValue (ns.network.QueueSize ("500p"))
+        queue.SetAttribute("MaxSize", queueSizeValue)
+
+        limit = ns.network.QueueSizeValue()
+        queue.GetAttribute("MaxSize", limit)
+        self.assertEqual(limit.Get(), ns.network.QueueSize ("500p"))
 
         ## -- object pointer values
         mobility = ns.mobility.RandomWaypointMobilityModel()
@@ -194,7 +209,7 @@
 
         ptr = ns.core.PointerValue()
         mobility.GetAttribute("PositionAllocator", ptr)
-        self.assert_(ptr.GetObject() is not None)
+        self.assertTrue(ptr.GetObject() is not None)
 
     def testIdentity(self):
         """! Test identify
@@ -208,7 +223,7 @@
         c1 = csma.GetChannel()
         c2 = csma.GetChannel()
 
-        self.assert_(c1 is c2)
+        self.assertTrue(c1 is c2)
 
     def testTypeId(self):
         """! Test type ID
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/utils/tests/gitlab-ci-doc.yml ns-3.34/utils/tests/gitlab-ci-doc.yml
--- ns-3.33/utils/tests/gitlab-ci-doc.yml	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/utils/tests/gitlab-ci-doc.yml	2021-07-14 10:31:07.000000000 -0700
@@ -4,24 +4,61 @@
 .doc:
   stage: documentation
   before_script:
-    - apt-get update
-    - DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata
-    - apt-get install -y doxygen graphviz make imagemagick dia texlive texlive-font-utils python3-sphinx latexmk texlive texlive-science texlive-formats-extra texlive-base python3-jinja2 python3-pygments texlive-fonts-extra
-    - sed -i "s/EPS,PDF,//g" /etc/ImageMagick-6/policy.xml
-    - sed -i "s/none/read\ |\ write/g" /etc/ImageMagick-6/policy.xml
-  image: ubuntu
-  artifacts:
-    paths:
-      - public
-  only:
-    - master
+    - pacman -Syu --noconfirm
+    - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost --noconfirm
+    - pacman -Sy git doxygen graphviz imagemagick dia texlive-core texlive-bin texlive-latexextra python-sphinx --noconfirm
+    # no policy is a good policy.
+    - mv /etc/ImageMagick-7/policy.xml /etc/ImageMagick-7/policy.xml.bak
+#    - sed -i "s/EPS,PDF,//g" /etc/ImageMagick-7/policy.xml
+#    - sed -i "s/none/read\ |\ write/g" /etc/ImageMagick-7/policy.xml
+  image: archlinux
+  timeout: 2h
+#  artifacts:
+#    paths:
+#      - public
 
 doxygen:
   extends: .doc
   script:
+    - mkdir -p $CCACHE_BASEDIR_VALUE
+    - export CCACHE_BASEDIR=${PWD}
+    - export CCACHE_DIR=${PWD}/$CCACHE_BASEDIR_VALUE
+    - CXX="ccache $COMPILER" ./waf configure --enable-examples --enable-tests --enable-asserts -d release
+    - ./waf
 #    - mkdir -p public/doxygen
-    - doxygen doc/doxygen.conf
+    - git remote add ns-3-origin https://gitlab.com/nsnam/ns-3-dev.git || true
+    - git fetch ns-3-origin
+#    - doc/doxygen.warnings.report.sh -f "$(git diff --name-only ns-3-origin/master --diff-filter=d | tr '\n' ' ' | sed 's/ $//g;s/ /\\\|/g')"
+    - export CHANGED_FILES=$(git diff --name-only ns-3-origin/master --diff-filter=d | tr '\n' ' ' | sed 's/ $//g;s/ /\\\|/g')
+    - doc/doxygen.warnings.report.sh -f "$CHANGED_FILES"
+#    - doc/doxygen.warnings.report.sh -f "$CHANGED_FILES" || EXIT_CODE=$?
+#    - if [ -z $EXIT_CODE ]; then export EXIT_CODE=0; fi;
+#    - if [ $EXIT_CODE -ne 0 ]; then if [ -z $CHANGED_FILES ]; then exit 0; fi; fi;
+#    - exit $EXIT_CODE
+
+#    - doxygen doc/doxygen.conf
 #    - mv doc/html/ public/doxygen
+  cache:
+    # Use separate key for each (debug/optimized/release) jobs because
+    # they run in parallel and will otherwise overwrite each other
+    # cache when they upload the cache archive at the end of the job,
+    # resulting in only the cache for the last finished configuration
+    # being stored.
+    #
+    # Do not distinguish between branches though to avoid
+    # recompilation of all the files when a new branch is created.
+    key: "ccache-$CI_JOB_NAME"
+    paths:
+      - $CCACHE_BASEDIR_VALUE/
+  variables:
+    CCACHE_BASEDIR_VALUE: ns-3-ccache-storage
+    COMPILER: g++
+  artifacts:
+    paths:
+      - doc/doxygen.warnings.log
+#  tags:
+#    - nsnam
+#    - linux
 
 manual:
   extends: .doc
@@ -32,6 +69,8 @@
     - make latexpdf
 #    - mv build/html ../../public/manual
 #    - mv build/latex/ns-3-manual.pdf ../../public/
+  only:
+    - master
 
 tutorial:
   extends: .doc
@@ -42,6 +81,8 @@
     - make latexpdf
 #    - mv build/html ../../public/manual
 #    - mv build/latex/ns-3-tutorial.pdf ../../public/
+  only:
+    - master
 
 models:
   extends: .doc
@@ -52,3 +93,5 @@
     - make latexpdf
 #    - mv build/html ../../public/models
 #    - mv build/latex/ns-3-model-library.pdf ../../public
+  only:
+    - master
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/utils/tests/gitlab-ci-fedora.yml ns-3.34/utils/tests/gitlab-ci-fedora.yml
--- ns-3.33/utils/tests/gitlab-ci-fedora.yml	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/utils/tests/gitlab-ci-fedora.yml	2021-07-14 10:31:07.000000000 -0700
@@ -74,3 +74,22 @@
   image: fedora:33
   variables:
     MODE: optimized
+
+# Fedora 34
+weekly-build-fedora-34-debug:
+  extends: .weekly-build-fedora
+  image: fedora:34
+  variables:
+    MODE: debug
+
+weekly-build-fedora-34-release:
+  extends: .weekly-build-fedora
+  image: fedora:34
+  variables:
+    MODE: release
+
+weekly-build-fedora-34-optimized:
+  extends: .weekly-build-fedora
+  image: fedora:34
+  variables:
+    MODE: optimized
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/utils/tests/gitlab-ci-gcc.yml ns-3.34/utils/tests/gitlab-ci-gcc.yml
--- ns-3.33/utils/tests/gitlab-ci-gcc.yml	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/utils/tests/gitlab-ci-gcc.yml	2021-07-14 10:31:07.000000000 -0700
@@ -16,47 +16,47 @@
   before_script:
     - apt-get --quiet update --yes
     - update-alternatives --install /usr/bin/gfortran gfortran /usr/local/bin/gfortran 999
-    - apt-get --quiet install gcc g++ python python3 python-dev qt5-default openmpi-bin openmpi-common openmpi-doc libopenmpi-dev ccache flex bison libfl-dev sqlite sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-dev libboost-all-dev gsl-bin libgsl0-dev --yes
+    - apt-get --quiet install gcc g++ python python3 python-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools openmpi-bin openmpi-common openmpi-doc libopenmpi-dev ccache flex bison libfl-dev sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-dev libboost-all-dev gsl-bin libgsl0-dev --yes
   variables:
     COMPILER: g++
 
-# GCC 5
-weekly-build-gcc-5-debug:
-  extends: .weekly-build-gcc
-  image: gcc:5
-  variables:
-    MODE: debug
-
-weekly-build-gcc-5-release:
-  extends: .weekly-build-gcc
-  image: gcc:5
-  variables:
-    MODE: release
-
-weekly-build-gcc-5-optimized:
-  extends: .weekly-build-gcc
-  image: gcc:5
-  variables:
-    MODE: optimized
-
-# GCC 6
-weekly-build-gcc-6-debug:
-  extends: .weekly-build-gcc
-  image: gcc:6
-  variables:
-    MODE: debug
-
-weekly-build-gcc-6-release:
-  extends: .weekly-build-gcc
-  image: gcc:6
-  variables:
-    MODE: release
-
-weekly-build-gcc-6-optimized:
-  extends: .weekly-build-gcc
-  image: gcc:6
-  variables:
-    MODE: optimized
+# # GCC 5
+# weekly-build-gcc-5-debug:
+#   extends: .weekly-build-gcc
+#   image: gcc:5
+#   variables:
+#     MODE: debug
+# 
+# weekly-build-gcc-5-release:
+#   extends: .weekly-build-gcc
+#   image: gcc:5
+#   variables:
+#     MODE: release
+# 
+# weekly-build-gcc-5-optimized:
+#   extends: .weekly-build-gcc
+#   image: gcc:5
+#   variables:
+#     MODE: optimized
+# 
+# # GCC 6
+# weekly-build-gcc-6-debug:
+#   extends: .weekly-build-gcc
+#   image: gcc:6
+#   variables:
+#     MODE: debug
+# 
+# weekly-build-gcc-6-release:
+#   extends: .weekly-build-gcc
+#   image: gcc:6
+#   variables:
+#     MODE: release
+# 
+# weekly-build-gcc-6-optimized:
+#   extends: .weekly-build-gcc
+#   image: gcc:6
+#   variables:
+#     MODE: optimized
 
 # GCC 7
 weekly-build-gcc-7-debug:
@@ -133,4 +133,22 @@
   image: gcc:10
   variables:
     MODE: optimized
-    
\ No newline at end of file
+
+# GCC 11
+weekly-build-gcc-11-debug:
+  extends: .weekly-build-gcc
+  image: gcc:11
+  variables:
+    MODE: debug
+
+weekly-build-gcc-11-release:
+  extends: .weekly-build-gcc
+  image: gcc:11
+  variables:
+    MODE: release
+
+weekly-build-gcc-11-optimized:
+  extends: .weekly-build-gcc
+  image: gcc:11
+  variables:
+    MODE: optimized
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/utils/tests/gitlab-ci-pybindgen.yml ns-3.34/utils/tests/gitlab-ci-pybindgen.yml
--- ns-3.33/utils/tests/gitlab-ci-pybindgen.yml	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/utils/tests/gitlab-ci-pybindgen.yml	2021-07-14 10:31:07.000000000 -0700
@@ -1,6 +1,6 @@
 pybindgen:
   stage: build
-  image: archlinux/base
+  image: archlinux
   only:
     variables:
       - $PYBINDGEN == "True"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/utils/tests/gitlab-ci-test.yml ns-3.34/utils/tests/gitlab-ci-test.yml
--- ns-3.33/utils/tests/gitlab-ci-test.yml	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/utils/tests/gitlab-ci-test.yml	2021-07-14 10:31:07.000000000 -0700
@@ -12,8 +12,10 @@
     - export CCACHE_BASEDIR=${PWD}
     - export CCACHE_DIR=${PWD}/$CCACHE_BASEDIR_VALUE
     - CXX="ccache $COMPILER" ./waf configure --enable-examples --enable-tests --disable-gtk --disable-python -d $MODE
-    - ./test.py $VALGRIND_FLAG $FULLNESS
+    - ./waf
+    - ./test.py --nowaf $VALGRIND_FLAG $FULLNESS
   cache:
+    key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
     paths:
       - $CCACHE_BASEDIR_VALUE/
   variables:
@@ -24,13 +26,16 @@
 # Run the test.py script with files compiled in debug mode
 daily-test-debug:
   extends: .base-test
-  image: archlinux/base
+  image: archlinux
   variables:
     COMPILER: g++
     MODE: debug
   only:
     variables:
       - $RELEASE == "daily"
+  tags:
+    - nsnam
+    - linux
   before_script:
     - pacman -Syu --noconfirm
     - pacman -Sy base-devel python ccache gsl libgcrypt gtk3 boost valgrind --noconfirm
@@ -38,7 +43,7 @@
 # Run the test.py script with files compiled in release mode
 daily-test-release:
   extends: .base-test
-  image: archlinux/base
+  image: archlinux
   variables:
     COMPILER: g++
     MODE: release
@@ -52,7 +57,7 @@
 # Run the test.py script with files compiled in optimized mode
 daily-test-optimized:
   extends: .base-test
-  image: archlinux/base
+  image: archlinux
   variables:
     COMPILER: g++
     MODE: optimized
@@ -67,7 +72,7 @@
 # Run the test.py script with files compiled in optimized mode + valgrind (daily)
 daily-test-optimized-valgrind:
   extends: .base-test
-  image: archlinux/base
+  image: archlinux
   variables:
     COMPILER: g++
     MODE: optimized
@@ -85,7 +90,7 @@
 # Run the test.py script with files compiled in debug mode
 weekly-test-debug-valgrind:
   extends: .base-test
-  image: archlinux/base
+  image: archlinux
   variables:
     COMPILER: g++
     MODE: debug
@@ -103,7 +108,7 @@
 # Run the test.py script with files compiled in release mode
 weekly-test-release-valgrind:
   extends: .base-test
-  image: archlinux/base
+  image: archlinux
   variables:
     COMPILER: g++
     MODE: release
@@ -121,7 +126,7 @@
 # Run the test.py script with files compiled in optimized mode
 weekly-test-optimized-valgrind:
   extends: .base-test
-  image: archlinux/base
+  image: archlinux
   variables:
     COMPILER: g++
     MODE: optimized
@@ -139,7 +144,7 @@
 # Do a check for the TAKES_FOREVER jobs, only in optimized mode
 weekly-test-takes-forever-optimized:
   extends: .base-test
-  image: archlinux/base
+  image: archlinux
   variables:
     COMPILER: g++
     MODE: optimized
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/utils/tests/gitlab-ci-ubuntu.yml ns-3.34/utils/tests/gitlab-ci-ubuntu.yml
--- ns-3.33/utils/tests/gitlab-ci-ubuntu.yml	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/utils/tests/gitlab-ci-ubuntu.yml	2021-07-14 10:31:07.000000000 -0700
@@ -16,31 +16,32 @@
   before_script:
     - apt-get --quiet update --yes
     - DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata
-    - apt-get --quiet install gcc g++ python python3 python-dev qt5-default openmpi-bin openmpi-common openmpi-doc libopenmpi-dev gsl-bin libgsl-dev ccache flex bison libfl-dev sqlite sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-dev libboost-all-dev $LIBGSL --yes
+#    - apt-get --quiet install gcc g++ python python3 python-dev qt5-default openmpi-bin openmpi-common openmpi-doc libopenmpi-dev gsl-bin libgsl-dev ccache flex bison libfl-dev sqlite sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-dev libboost-all-dev $LIBGSL --yes
+    - apt-get --quiet install gcc g++ python python3 python-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools openmpi-bin openmpi-common openmpi-doc libopenmpi-dev gsl-bin libgsl-dev ccache flex bison libfl-dev sqlite3 libsqlite3-dev libxml2 libxml2-dev libgtk-3-dev libboost-all-dev $LIBGSL --yes
   variables:
     COMPILER: g++
 
-# Ubuntu 16.04 (Until April 2021)
-weekly-build-ubuntu-16.04-debug:
-  extends: .weekly-build-ubuntu
-  image: ubuntu:16.04
-  variables:
-    MODE: debug
-    LIBGSL: libgsl2
-
-weekly-build-ubuntu-16.04-release:
-  extends: .weekly-build-ubuntu
-  image: ubuntu:16.04
-  variables:
-    MODE: release
-    LIBGSL: libgsl2
-
-weekly-build-ubuntu-16.04-optimized:
-  extends: .weekly-build-ubuntu
-  image: ubuntu:16.04
-  variables:
-    MODE: optimized
-    LIBGSL: libgsl2
+# # Ubuntu 16.04 (Until April 2021)
+# weekly-build-ubuntu-16.04-debug:
+#   extends: .weekly-build-ubuntu
+#   image: ubuntu:16.04
+#   variables:
+#     MODE: debug
+#     LIBGSL: libgsl2
+# 
+# weekly-build-ubuntu-16.04-release:
+#   extends: .weekly-build-ubuntu
+#   image: ubuntu:16.04
+#   variables:
+#     MODE: release
+#     LIBGSL: libgsl2
+# 
+# weekly-build-ubuntu-16.04-optimized:
+#   extends: .weekly-build-ubuntu
+#   image: ubuntu:16.04
+#   variables:
+#     MODE: optimized
+#     LIBGSL: libgsl2
 
 # Ubuntu 18.04 (Until April 2023)
 weekly-build-ubuntu-18.04-debug:
@@ -86,6 +87,28 @@
     MODE: optimized
     LIBGSL: libgsl23
 
+# Ubuntu 21.04 (Until January 2022)
+weekly-build-ubuntu-21.04-debug:
+  extends: .weekly-build-ubuntu
+  image: ubuntu:21.04
+  variables:
+    MODE: debug
+    LIBGSL: libgsl25
+
+weekly-build-ubuntu-21.04-release:
+  extends: .weekly-build-ubuntu
+  image: ubuntu:21.04
+  variables:
+    MODE: release
+    LIBGSL: libgsl25
+
+weekly-build-ubuntu-21.04-optimized:
+  extends: .weekly-build-ubuntu
+  image: ubuntu:21.04
+  variables:
+    MODE: optimized
+    LIBGSL: libgsl25
+
 # Ubuntu Rolling
 weekly-build-ubuntu-rolling-debug:
   extends: .weekly-build-ubuntu
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/utils/tests/gitlab-ci.yml ns-3.34/utils/tests/gitlab-ci.yml
--- ns-3.33/utils/tests/gitlab-ci.yml	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/utils/tests/gitlab-ci.yml	2021-07-14 10:31:07.000000000 -0700
@@ -37,13 +37,22 @@
     - mkdir -p $CCACHE_BASEDIR_VALUE
     - export CCACHE_BASEDIR=${PWD}
     - export CCACHE_DIR=${PWD}/$CCACHE_BASEDIR_VALUE
-    - CXX="ccache $COMPILER" ./waf configure --enable-examples --enable-tests -d $MODE
+    - CXX="ccache $COMPILER" ./waf configure --enable-examples --enable-tests --enable-asserts -d $MODE
     - ./waf
-    - ./test.py
+    - if [ "$MODE" != "debug" ]; then ./test.py --nowaf; fi
   cache:
+    # Use separate key for each (debug/optimized/release) jobs because
+    # they run in parallel and will otherwise overwrite each other
+    # cache when they upload the cache archive at the end of the job,
+    # resulting in only the cache for the last finished configuration
+    # being stored.
+    #
+    # Do not distinguish between branches though to avoid
+    # recompilation of all the files when a new branch is created.
+    key: "ccache-$CI_JOB_NAME"
     paths:
       - $CCACHE_BASEDIR_VALUE/
-  timeout: 9h
+  timeout: 12h
   variables:
     CCACHE_BASEDIR_VALUE: ns-3-ccache-storage
 
@@ -55,7 +64,7 @@
       - $PYBINDGEN == "True"
       - $RELEASE == "weekly"
       - $RELEASE == "daily"
-  image: archlinux/base
+  image: archlinux
   variables:
     COMPILER: g++
     MODE: debug
@@ -70,7 +79,7 @@
       - $PYBINDGEN == "True"
       - $RELEASE == "weekly"
       - $RELEASE == "daily"
-  image: archlinux/base
+  image: archlinux
   variables:
     COMPILER: g++
     MODE: release
@@ -85,7 +94,7 @@
       - $PYBINDGEN == "True"
       - $RELEASE == "weekly"
       - $RELEASE == "daily"
-  image: archlinux/base
+  image: archlinux
   variables:
     COMPILER: g++
     MODE: optimized
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/utils.py ns-3.34/utils.py
--- ns-3.33/utils.py	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/utils.py	2021-07-14 10:31:07.000000000 -0700
@@ -20,32 +20,29 @@
 
     # Read in the file if it exists.
     if os.path.exists(file_path):
-        file_in = open(file_path, "r")
+        with open(file_path, "r") as file_in:
 
-        # Look for the list.
-        list_string = ""
-        parsing_multiline_list = False
-        for line in file_in:
-
-            # Remove any comments.
-            if '#' in line:
-                (line, comment) = line.split('#', 1)
-
-            # Parse the line.
-            if list_name in line or parsing_multiline_list:
-                list_string += line
-
-                # Handle multiline lists.
-                if ']' not in list_string:
-                    parsing_multiline_list = True
-                else:
-                    # Evaluate the list once its end is reached.
-                    # Make the split function only split it once.
-                    list = eval(list_string.split('=', 1)[1].strip())
-                    break
-
-        # Close the file
-        file_in.close()
+            # Look for the list.
+            list_string = ""
+            parsing_multiline_list = False
+            for line in file_in:
+
+                # Remove any comments.
+                if '#' in line:
+                    (line, comment) = line.split('#', 1)
+
+                # Parse the line.
+                if list_name in line or parsing_multiline_list:
+                    list_string += line
+
+                    # Handle multiline lists.
+                    if ']' not in list_string:
+                        parsing_multiline_list = True
+                    else:
+                        # Evaluate the list once its end is reached.
+                        # Make the split function only split it once.
+                        list = eval(list_string.split('=', 1)[1].strip())
+                        break
 
     return list
 
@@ -61,26 +58,23 @@
 
     # Read in the file if it exists.
     if os.path.exists(file_path):
-        file_in = open(file_path, "r")
+        with open(file_path, "r") as file_in:
 
-        # Look for the boolean variable.
-        bool_found = False
-        for line in file_in:
-
-            # Remove any comments.
-            if '#' in line:
-                (line, comment) = line.split('#', 1)
-
-            # Parse the line.
-            if bool_name in line:
-                # Evaluate the variable's line once it is found.  Make
-                # the split function only split it once.
-                bool = eval(line.split('=', 1)[1].strip())
-                bool_found = True
-                break
-
-        # Close the file
-        file_in.close()
+            # Look for the boolean variable.
+            bool_found = False
+            for line in file_in:
+
+                # Remove any comments.
+                if '#' in line:
+                    (line, comment) = line.split('#', 1)
+
+                # Parse the line.
+                if bool_name in line:
+                    # Evaluate the variable's line once it is found.  Make
+                    # the split function only split it once.
+                    bool = eval(line.split('=', 1)[1].strip())
+                    bool_found = True
+                    break
 
     if bool_found:
         return bool
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/VERSION ns-3.34/VERSION
--- ns-3.33/VERSION	2021-01-09 17:18:01.000000000 -0800
+++ ns-3.34/VERSION	2021-07-14 10:32:18.000000000 -0700
@@ -1 +1 @@
-3.33
+3.34
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/waf-tools/boost.py ns-3.34/waf-tools/boost.py
--- ns-3.33/waf-tools/boost.py	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/waf-tools/boost.py	2021-07-14 10:31:07.000000000 -0700
@@ -54,8 +54,7 @@
 from waflib.Configure import conf
 from waflib.TaskGen import feature, after_method
 
-BOOST_LIBS = ['/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu',
-			  '/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib']
+BOOST_LIBS = ['/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu', '/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib']
 BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include']
 BOOST_VERSION_FILE = 'boost/version.hpp'
 BOOST_VERSION_CODE = '''
@@ -212,9 +211,9 @@
 	if not path:
 		if libs:
 			self.end_msg('libs not found in %s' % libs)
-			self.fatal('The configuration failed')
 		else:
 			self.end_msg('libs not found, please provide a --boost-libs argument (see help)')
+		if kw.get('required', True):
 			self.fatal('The configuration failed')
 
 	self.to_log('Found the boost path in %r with the libraries:' % path)
@@ -284,8 +283,10 @@
 					libs.append(format_lib_name(file.name))
 					break
 			else:
-				self.end_msg('lib %s not found in %s' % (lib, path.abspath()))
-				self.fatal('The configuration failed')
+				self.to_log('Failed looking for boost lib %s' % lib)
+				if kw.get('required', True):
+					self.end_msg('lib %s not found in %s' % (lib, path.abspath()))
+					self.fatal('The configuration failed')
 		return libs
 
 	return  path.abspath(), match_libs(kw.get('lib', None), False), match_libs(kw.get('stlib', None), True)
@@ -304,7 +305,8 @@
 
 	params = {
 		'lib': k and k[0] or kw.get('lib', None),
-		'stlib': kw.get('stlib', None)
+		'stlib': kw.get('stlib', None),
+		'required': kw.get('required', True)
 	}
 	for key, value in self.options.__dict__.items():
 		if not key.startswith('boost_'):
@@ -317,7 +319,7 @@
 	self.start_msg('Checking boost includes')
 	self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params)
 	self.env.BOOST_VERSION = self.boost_get_version(inc)
-	self.end_msg(self.env.BOOST_VERSION)
+	self.end_msg(self.env.BOOST_VERSION + ' ' + inc)
 	if Logs.verbose:
 		Logs.pprint('CYAN', '	path : %s' % self.env['INCLUDES_%s' % var])
 
@@ -331,7 +333,7 @@
 	self.env['STLIBPATH_%s' % var] = [path]
 	self.env['LIB_%s' % var] = libs
 	self.env['STLIB_%s' % var] = stlibs
-	self.end_msg('ok')
+	self.end_msg('ok' + ' ' + path)
 	if Logs.verbose:
 		Logs.pprint('CYAN', '	path : %s' % path)
 		Logs.pprint('CYAN', '	shared libs : %s' % libs)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/waf-tools/cflags.py ns-3.34/waf-tools/cflags.py
--- ns-3.33/waf-tools/cflags.py	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/waf-tools/cflags.py	2021-07-14 10:31:07.000000000 -0700
@@ -160,7 +160,7 @@
 		       help=('print out current build profile'),
 		       default=False, dest='check_profile', action="store_true")
 	opt.add_option('--disable-werror',
-		       help=('disable -Werror flag (warnings treated as errors'),
+		       help=('disable -Werror flag (warnings treated as errors, e.g., deprecated functions)'),
 		       default=False, dest='disable_werror', action="store_true")
 def configure(conf):
 	cc = conf.env['COMPILER_CC'] or None
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.33/wscript ns-3.34/wscript
--- ns-3.33/wscript	2021-01-09 10:19:23.000000000 -0800
+++ ns-3.34/wscript	2021-07-14 10:31:07.000000000 -0700
@@ -64,7 +64,8 @@
 Configure.autoconfig = 0
 
 # the following two variables are used by the target "waf dist"
-VERSION = open("VERSION", "rt").read().strip()
+with open("VERSION", "rt") as f:
+    VERSION = f.read().strip()
 APPNAME = 'ns'
 
 wutils.VERSION = VERSION
@@ -118,7 +119,7 @@
           print(name.ljust(25), end=' ')
 
 # return types of some APIs differ in Python 2/3 (type string vs class bytes)
-# This method will decode('utf-8') a byte object in Python 3, 
+# This method will decode('utf-8') a byte object in Python 3,
 # and do nothing in Python 2
 def maybe_decode(input):
     if sys.version_info < (3,):
@@ -137,12 +138,13 @@
     opt.load('compiler_cxx')
     opt.load('cflags')
     opt.load('gnu_dirs')
+    opt.load('boost', tooldir=['waf-tools'])
 
     opt.add_option('--check-config',
                    help=('Print the current configuration.'),
                    action="store_true", default=False,
                    dest="check_config")
-    
+
     opt.add_option('--cwd',
                    help=('Set the working directory for a program.'),
                    action="store", type="string", default=None,
@@ -258,7 +260,7 @@
                    dest='enable_desmetrics')
     opt.add_option('--cxx-standard',
                    help=('Compile NS-3 with the given C++ standard'),
-                   type='string', default='-std=c++11', dest='cxx_standard')
+                   type='string', dest='cxx_standard')
     opt.add_option('--enable-asserts',
                    help=('Enable the asserts regardless of the compile mode'),
                    action="store_true", default=False,
@@ -345,15 +347,15 @@
         profile = get_build_profile(env)
     else:
         profile = get_build_profile()
-        
+
     print("---- Summary of optional NS-3 features:")
     print("%-30s: %s%s%s" % ("Build profile", Logs.colors('GREEN'),
                              profile, Logs.colors('NORMAL')))
     bld = wutils.bld
     print("%-30s: %s%s%s" % ("Build directory", Logs.colors('GREEN'),
                              Options.options.out, Logs.colors('NORMAL')))
-    
-    
+
+
     for (name, caption, was_enabled, reason_not_enabled) in sorted(env['NS3_OPTIONAL_FEATURES'], key=lambda s : s[1]):
         if was_enabled:
             status = 'enabled'
@@ -363,7 +365,210 @@
             color = 'RED'
         print("%-30s: %s%s%s" % (caption, Logs.colors(color), status, Logs.colors('NORMAL')))
 
+#  Checking for boost headers and libraries
+#
+#  There are four cases:
+#    A.  Only need headers, and they are required
+#    B.  Also need compiled libraries, and they are required
+#    C.  Only use headers, but they are not required
+#    D.  Use compiled libraries, but they are not required
+#
+#  A.  If you only need includes there are just two steps:
+#
+#    A1.  Add this in your module wscript configure function:
+#
+#        if not conf.require_boost_incs('my-module', 'my module caption'):
+#            return
+#
+#    A2.  Do step FINAL below.
+#
+#  B.  If you also need some compiled boost libraries there are 
+#      three steps (instead of the above):
+#
+#    B1.  Declare the libraries you need by adding to your module wscript:
+#
+#        REQUIRED_BOOST_LIBS = ['lib1', 'lib2'...]
+#
+#        def required_boost_libs(conf):
+#            conf.env['REQUIRED_BOOST_LIBS'] += REQUIRED_BOOST_LIBS
+#
+#    B2.  Check that the libs are present in your module wscript configure function:
+#      
+#        if conf.missing_boost_libs('my-module', 'my module caption', REQUIRED_BOOST_LIBS):
+#            return
+#
+#    B3.  Do step FINAL below.
+#
+#  Finally,
+#
+#    FINAL.  Add boost to your module wscript build function:
+#
+#        # Assuming you have
+#        #  module = bld.create_ns3_module('my-module')
+#        module.use.append('BOOST')
+#
+#  If your use of boost is optional it's even simpler.
+#
+#  C.  For optional headers only, the two steps above are modified a little:
+#
+#    C1.  Add this to your module wscript configure function:
+#
+#        conf.require_boost_incs('my-module', 'my module caption', required=False)
+#        # Continue with config, adjusting for missing boost
+#
+#    C2.  Modify step FINAL as follows
+#
+#        if bld.env['INCLUDES_BOOST']:
+#            module.use.append('BOOST')
+#
+#  D.  For compiled boost libraries
+#
+#    D1.  Do B1 above to declare the libraries you would like to use
+#
+#    D2.  If you need to take action at configure time, 
+#         add to your module wscript configure function:
+#
+#        missing_boost_libs = conf.missing_boost_libs('my-module', 'my module caption', REQUIRED_BOOST_LIBS, required=False)
+#        # Continue with config, adjusting for missing boost libs
+#
+#         At this point you can inspect missing_boost_libs to see 
+#         what libs were found and do the right thing.  
+#         See below for preprocessor symbols which will be available 
+#         in your source files.
+#
+#    D3.  If any of your libraries are present add to your 
+#         module wscript build function:
+#
+#        missing_boost_libs = bld.missing_boost_libs('lib-opt', REQUIRED_BOOST_LIBS)
+#        # Continue with build, adjusting for missing boost libs
+#  
+#         At this point you can inspect missing_boost_libs to see 
+#         what libs were found and do the right thing.  
+#
+#  In all cases you can test for boost in your code with
+#
+#      #ifdef HAVE_BOOST
+#
+#  Each boost compiled library will be indicated with a 'HAVE_BOOST_<lib>' 
+#  preprocessor symbol, which you can test.  For example, for the boost 
+#  Signals2 library:
+#
+#      #ifdef HAVE_BOOST_SIGNALS2
+#
+
+def require_boost_incs(conf, module, caption, required=True):
+
+    conf.to_log('boost: %s wants incs, required: %s' % (module, required))
+    if conf.env['INCLUDES_BOOST']:
+        conf.to_log('boost: %s: have boost' % module)
+        return True
+    elif not required:
+        conf.to_log('boost: %s: no boost, but not required' % module)
+        return False
+    else:
+        conf.to_log('boost: %s: no boost, but required' % module)
+        conf.report_optional_feature(module, caption, False,
+                                     "boost headers required but not found")
+
+        # Add this module to the list of modules that won't be built
+        # if they are enabled.
+        conf.env['MODULES_NOT_BUILT'].append(module)
+        return False
+
+#  Report any required boost libs which are missing
+#  Return values of truthy are bad; falsey is good:
+#    If all are present return False (non missing)
+#    If boost not present, or no libs return True
+#    If some libs present, return the list of missing libs
+def conf_missing_boost_libs(conf, module, caption, libs, required= True):
+    conf.to_log('boost: %s wants %s, required: %s' % (module, libs, required))
+
+    if not conf.require_boost_incs(module, caption, required):
+        # No headers found, so the libs aren't there either
+        return libs
+
+    missing_boost_libs = [lib for lib in libs if lib not in conf.boost_libs]
+
+    if required and missing_boost_libs:
+        if not conf.env['LIB_BOOST']:
+            conf.to_log('boost: %s requires libs, but none found' % module)
+            conf.report_optional_feature(module, caption, False,
+                                         "No boost libraries were found")
+        else:
+            conf.to_log('boost: %s requires libs, but missing %s' % (module, missing_boost_libs))
+            conf.report_optional_feature(module, caption, False,
+                                         "Required boost libraries not found, missing: %s" % missing_boost_libs)
+
+        # Add this module to the list of modules that won't be built
+        # if they are enabled.
+        conf.env['MODULES_NOT_BUILT'].append(module)
+        return missing_boost_libs
+
+    # Required libraries were found, or are not required
+    return missing_boost_libs
+
+def get_boost_libs(libs):
+    names = set()
+    for lib in libs:
+        if lib.startswith("boost_"):
+            lib = lib[6:]
+        if lib.endswith("-mt"):
+            lib = lib[:-3]
+        names.add(lib)
+    return names
+
+def configure_boost(conf):
+    conf.to_log('boost: loading conf')
+    conf.load('boost')
+
+    # Find Boost libraries by modules
+    conf.to_log('boost: scanning for required libs')
+    conf.env['REQUIRED_BOOST_LIBS'] = []
+    for modules_dir in ['src', 'contrib']:
+        conf.recurse (modules_dir, name="get_required_boost_libs", mandatory=False)
+    # Check for any required boost libraries
+    if conf.env['REQUIRED_BOOST_LIBS'] is not []:
+        conf.env['REQUIRED_BOOST_LIBS'] = list(set(conf.env['REQUIRED_BOOST_LIBS']))
+        conf.to_log("boost: libs required: %s" % conf.env['REQUIRED_BOOST_LIBS'])
+        conf.check_boost(lib=' '.join (conf.env['REQUIRED_BOOST_LIBS']), mandatory=False, required=False)
+        if not conf.env['LIB_BOOST']:
+            conf.env['LIB_BOOST'] = []
+    else:
+        # Check with no libs, so we find the includes
+        conf.check_boost(mandatory=False, required=False)
+
+    conf.to_log('boost: checking if we should define HAVE_BOOST')
+    if conf.env['INCLUDES_BOOST']:
+        conf.to_log('boost: defining HAVE_BOOST')
+        conf.env.append_value ('CPPFLAGS', '-DHAVE_BOOST')
+
+    # Some boost libraries may have been found.  
+    # Add preprocessor symbols for them
+    conf.to_log('boost: checking which libs are present')
+    if conf.env['LIB_BOOST']:
+        conf.boost_libs = get_boost_libs(conf.env['LIB_BOOST'])
+        for lib in conf.boost_libs:
+            msg='boost: lib present: ' + lib
+            if lib in conf.env['REQUIRED_BOOST_LIBS']:
+                have = '-DHAVE_BOOST_' + lib.upper()
+                conf.to_log('%s, requested, adding %s' % (msg, have))
+                conf.env.append_value('CPPFLAGS', have)
+            else:
+                conf.to_log('%s, not required, ignoring' % msg)
+
+    boost_libs_missing = [lib for lib in conf.env['REQUIRED_BOOST_LIBS'] if lib not in conf.boost_libs]
+    for lib in boost_libs_missing:
+        conf.to_log('boost: lib missing: %s' % lib)
+
+def bld_missing_boost_libs (bld, module, libs):
+    missing_boost_libs = [lib for lib in libs if lib not in bld.boost_libs]
+    return missing_boost_libs
+
 def configure(conf):
+    # Waf does not work correctly if the absolute path contains whitespaces
+    if (re.search(r"\s", os.getcwd ())):
+        conf.fatal('Waf does not support whitespace in the path to current working directory: %s' % os.getcwd())
+
     conf.load('relocation', tooldir=['waf-tools'])
 
     # attach some extra methods
@@ -371,6 +576,9 @@
     conf.check_compilation_flag = types.MethodType(_check_compilation_flag, conf)
     conf.report_optional_feature = types.MethodType(report_optional_feature, conf)
     conf.check_optional_feature = types.MethodType(check_optional_feature, conf)
+    conf.require_boost_incs = types.MethodType(require_boost_incs, conf)
+    conf.missing_boost_libs = types.MethodType(conf_missing_boost_libs, conf)
+    conf.boost_libs = set()
     conf.env['NS3_OPTIONAL_FEATURES'] = []
 
     conf.load('compiler_c')
@@ -415,7 +623,7 @@
         env['BUILD_SUFFIX'] = ''
     else:
         env['BUILD_SUFFIX'] = '-'+Options.options.build_profile
-    
+
     env['APPNAME'] = wutils.APPNAME
     env['VERSION'] = wutils.VERSION
 
@@ -425,11 +633,11 @@
                        ('.'.join(conf.env['CC_VERSION']), '.'.join(map(str, gcc_min_version))))
 
     if conf.env['CXX_NAME'] in ['gcc', 'icc']:
-        if Options.options.build_profile == 'release': 
-            env.append_value('CXXFLAGS', '-fomit-frame-pointer') 
-        if Options.options.build_profile == 'optimized': 
+        if Options.options.build_profile == 'release':
+            env.append_value('CXXFLAGS', '-fomit-frame-pointer')
+        if Options.options.build_profile == 'optimized':
             if conf.check_compilation_flag('-march=native'):
-                env.append_value('CXXFLAGS', '-march=native') 
+                env.append_value('CXXFLAGS', '-march=native')
             env.append_value('CXXFLAGS', '-fstrict-overflow')
             if conf.env['CXX_NAME'] in ['gcc']:
                 env.append_value('CXXFLAGS', '-Wstrict-overflow=2')
@@ -457,13 +665,19 @@
         if Utils.unversioned_sys_platform() == 'darwin':
             if tuple(map(int, conf.env['CC_VERSION'])) >= darwin_clang_version_warn_unused_local_typedefs:
                 env.append_value('CXXFLAGS', '-Wno-unused-local-typedefs')
+
             if tuple(map(int, conf.env['CC_VERSION'])) >= darwin_clang_version_warn_potentially_evaluated:
+
                 env.append_value('CXXFLAGS', '-Wno-potentially-evaluated-expression')
+
         else:
             if tuple(map(int, conf.env['CC_VERSION'])) >= clang_version_warn_unused_local_typedefs:
+
                 env.append_value('CXXFLAGS', '-Wno-unused-local-typedefs')
+
             if tuple(map(int, conf.env['CC_VERSION'])) >= clang_version_warn_potentially_evaluated:
                 env.append_value('CXXFLAGS', '-Wno-potentially-evaluated-expression')
+
     env['ENABLE_STATIC_NS3'] = False
     if Options.options.enable_static:
         if Utils.unversioned_sys_platform() == 'darwin':
@@ -481,25 +695,54 @@
                 conf.report_optional_feature("static", "Static build", False,
                                              "Link flag -Wl,--whole-archive,-Bstatic does not work")
 
-    # Enables C++-11 support by default, unless user specified another option
-    # Warn the user if the CXX Standard flag provided was not recognized  
-    if conf.check_compilation_flag(Options.options.cxx_standard):
-        env.append_value('CXXFLAGS', Options.options.cxx_standard)
-    else:
-        Logs.warn("CXX Standard flag " + Options.options.cxx_standard + " was not recognized, using compiler's default")
+    # Checks if environment variable specifies the C++ language standard and/or
+    # if the user has specified the standard via the -cxx-standard argument
+    # to 'waf configure'.  The following precedence and behavior is implemented:
+    # 1) if user does not specify anything, Waf will use the default standard
+    #    configured for ns-3, which is configured below
+    # 2) if user specifies the '-cxx-standard' option, it will be used instead
+    #    of the default.
+    #    Example:  ./waf configure --cxx-standard=-std=c++14
+    # 3) if user specifies the C++ standard via the CXXFLAGS environment
+    #    variable, it will be used instead of the default.
+    #    Example: CXXFLAGS="-std=c++14" ./waf configure
+    # 4) if user specifies both the CXXFLAGS environment variable and the
+    #    -cxx-standard argument, the latter will take precedence and a warning
+    #    will be emitted in the configure output if there were conflicting
+    #    standards between the two.
+    #    Example: CXXFLAGS="-std=c++14" ./waf configure --cxx-standard=-std=c++17
+    #    (in the above scenario, Waf will use c++17 but warn about it)
+    # Note: If the C++ standard is not recognized, configuration will error exit
+    cxx_standard = ""
+    cxx_standard_env = ""
+    for flag in env['CXXFLAGS']:
+        if flag[:5] == "-std=":
+            cxx_standard_env = flag
+
+    if not cxx_standard_env and Options.options.cxx_standard:
+        cxx_standard = Options.options.cxx_standard
+        env.append_value('CXXFLAGS', cxx_standard)
+    elif cxx_standard_env and not Options.options.cxx_standard:
+        cxx_standard = cxx_standard_env
+        # No need to change CXXFLAGS
+    elif cxx_standard_env and Options.options.cxx_standard and cxx_standard_env != Options.options.cxx_standard:
+        Logs.warn("user-specified --cxx-standard (" + 
+            Options.options.cxx_standard + ") does not match the value in CXXFLAGS (" + cxx_standard_env + "); Waf will use the --cxx-standard value")
+        cxx_standard = Options.options.cxx_standard
+        env['CXXFLAGS'].remove(cxx_standard_env)
+        env.append_value('CXXFLAGS', cxx_standard)
+    elif cxx_standard_env and Options.options.cxx_standard and cxx_standard_env == Options.options.cxx_standard:
+        cxx_standard = Options.options.cxx_standard
+        # No need to change CXXFLAGS
+    elif not cxx_standard and not Options.options.cxx_standard:
+        cxx_standard = "-std=c++11"
+        env.append_value('CXXFLAGS', cxx_standard)
 
-    # Find Boost libraries by modules
-    conf.env['REQUIRED_BOOST_LIBS'] = []
-    for modules_dir in ['src', 'contrib']:
-        conf.recurse (modules_dir, name="get_required_boost_libs", mandatory=False)
+    if not conf.check_compilation_flag(cxx_standard):
+        raise Errors.ConfigurationError("Exiting because C++ standard value " + cxx_standard + " is not recognized")
 
-    if conf.env['REQUIRED_BOOST_LIBS'] is not []:
-        conf.load('boost')
-        conf.check_boost(lib=' '.join (conf.env['REQUIRED_BOOST_LIBS']), mandatory=False)
-        if not conf.env['LIB_BOOST']:
-            conf.check_boost(lib=' '.join (conf.env['REQUIRED_BOOST_LIBS']), libpath="/usr/lib64", mandatory=False)
-            if not conf.env['LIB_BOOST']:
-                conf.env['LIB_BOOST'] = []
+    # Handle boost
+    configure_boost(conf)
 
     # Set this so that the lists won't be printed at the end of this
     # configure command.
@@ -514,21 +757,21 @@
 
     # Set the list of enabled modules.
     if Options.options.enable_modules:
-        # Use the modules explicitly enabled. 
+        # Use the modules explicitly enabled.
         _enabled_mods = []
         _enabled_contrib_mods = []
-        for mod in Options.options.enable_modules.split(','): 
-            if mod in conf.env['NS3_MODULES'] and mod.startswith('ns3-'): 
+        for mod in Options.options.enable_modules.split(','):
+            if mod in conf.env['NS3_MODULES'] and mod.startswith('ns3-'):
                 _enabled_mods.append(mod)
-            elif 'ns3-' + mod in conf.env['NS3_MODULES']: 
+            elif 'ns3-' + mod in conf.env['NS3_MODULES']:
                 _enabled_mods.append('ns3-' + mod)
-            elif mod in conf.env['NS3_CONTRIBUTED_MODULES'] and mod.startswith('ns3-'): 
+            elif mod in conf.env['NS3_CONTRIBUTED_MODULES'] and mod.startswith('ns3-'):
                 _enabled_contrib_mods.append(mod)
-            elif 'ns3-' + mod in conf.env['NS3_CONTRIBUTED_MODULES']: 
+            elif 'ns3-' + mod in conf.env['NS3_CONTRIBUTED_MODULES']:
                 _enabled_contrib_mods.append('ns3-' + mod)
         conf.env['NS3_ENABLED_MODULES'] = _enabled_mods
         conf.env['NS3_ENABLED_CONTRIBUTED_MODULES'] = _enabled_contrib_mods
-        
+
     else:
         # Use the enabled modules list from the ns3 configuration file.
         if modules_enabled[0] == 'all_modules':
@@ -539,14 +782,14 @@
             # Enable the modules from the list.
             _enabled_mods = []
             _enabled_contrib_mods = []
-            for mod in modules_enabled: 
-                if mod in conf.env['NS3_MODULES'] and mod.startswith('ns3-'): 
+            for mod in modules_enabled:
+                if mod in conf.env['NS3_MODULES'] and mod.startswith('ns3-'):
                     _enabled_mods.append(mod)
-                elif 'ns3-' + mod in conf.env['NS3_MODULES']: 
+                elif 'ns3-' + mod in conf.env['NS3_MODULES']:
                     _enabled_mods.append('ns3-' + mod)
-                elif mod in conf.env['NS3_CONTRIBUTED_MODULES'] and mod.startswith('ns3-'): 
+                elif mod in conf.env['NS3_CONTRIBUTED_MODULES'] and mod.startswith('ns3-'):
                     _enabled_contrib_mods.append(mod)
-                elif 'ns3-' + mod in conf.env['NS3_CONTRIBUTED_MODULES']: 
+                elif 'ns3-' + mod in conf.env['NS3_CONTRIBUTED_MODULES']:
                     _enabled_contrib_mods.append('ns3-' + mod)
             conf.env['NS3_ENABLED_MODULES'] = _enabled_mods
             conf.env['NS3_ENABLED_CONTRIBUTED_MODULES'] = _enabled_contrib_mods
@@ -588,11 +831,11 @@
 
     # Decide if tests will be built or not.
     if Options.options.enable_tests:
-        # Tests were explicitly enabled. 
+        # Tests were explicitly enabled.
         env['ENABLE_TESTS'] = True
         why_not_tests = "option --enable-tests selected"
     elif Options.options.disable_tests:
-        # Tests were explicitly disabled. 
+        # Tests were explicitly disabled.
         env['ENABLE_TESTS'] = False
         why_not_tests = "option --disable-tests selected"
     else:
@@ -609,11 +852,11 @@
 
     # Decide if examples will be built or not.
     if Options.options.enable_examples:
-        # Examples were explicitly enabled. 
+        # Examples were explicitly enabled.
         env['ENABLE_EXAMPLES'] = True
         why_not_examples = "option --enable-examples selected"
     elif Options.options.disable_examples:
-        # Examples were explicitly disabled. 
+        # Examples were explicitly disabled.
         env['ENABLE_EXAMPLES'] = False
         why_not_examples = "option --disable-examples selected"
     else:
@@ -626,7 +869,7 @@
         else:
             why_not_examples = "defaults to disabled"
 
-    conf.report_optional_feature("ENABLE_EXAMPLES", "Examples", env['ENABLE_EXAMPLES'], 
+    conf.report_optional_feature("ENABLE_EXAMPLES", "Examples", env['ENABLE_EXAMPLES'],
                                  why_not_examples)
     try:
         for dir in os.listdir('examples'):
@@ -703,7 +946,7 @@
             conf.env.append_value(confvar, value)
 
     print_config(env)
-    
+
 
 class SuidBuild_task(Task.Task):
     """task that makes a binary Suid
@@ -775,7 +1018,7 @@
     else:
         if program.env.DEST_BINFMT == 'elf':
             # All ELF platforms are impacted but only the gcc compiler has a flag to fix it.
-            if 'gcc' in (program.env.CXX_NAME, program.env.CC_NAME): 
+            if 'gcc' in (program.env.CXX_NAME, program.env.CC_NAME):
                 program.env.append_value ('SHLIB_MARKER', '-Wl,--no-as-needed')
 
     return program
@@ -878,7 +1121,7 @@
         if Options.options.check_profile:
             profile = get_build_profile()
             print("Build profile: %s" % profile)
-        
+
     if Options.options.check_profile or Options.options.check_config:
         raise SystemExit(0)
         return
@@ -909,11 +1152,18 @@
     bld.__class__.all_task_gen = property(_get_all_task_gen)
     bld.exclude_taskgen = types.MethodType(_exclude_taskgen, bld)
     bld.find_ns3_module = types.MethodType(_find_ns3_module, bld)
+    bld.missing_boost_libs = types.MethodType(bld_missing_boost_libs, bld)
 
     # Clean documentation build directories; other cleaning happens later
     if bld.cmd == 'clean':
         _cleandocs()
 
+    # Cache available boost lib names
+    bld.boost_libs = set()
+    if bld.env['LIB_BOOST']:
+        bld.boost_libs = get_boost_libs(bld.env['LIB_BOOST'])
+
+
     # process subfolders from here
     bld.recurse('src')
     bld.recurse('contrib')
@@ -939,10 +1189,10 @@
                     if not dep.startswith('ns3-'):
                         continue
                     if dep not in modules and dep not in contribModules:
-                        if dep in env['NS3_MODULES']: 
+                        if dep in env['NS3_MODULES']:
                             modules.append(dep)
                             changed = True
-                        elif dep in env['NS3_CONTRIBUTED_MODULES']: 
+                        elif dep in env['NS3_CONTRIBUTED_MODULES']:
                             contribModules.append(dep)
                             changed = True
                         else:
@@ -989,7 +1239,7 @@
                 # Add this program to the list if all of its
                 # dependencies will be built.
                 if program_built:
-                    object_name = "%s%s-%s%s" % (wutils.APPNAME, wutils.VERSION, 
+                    object_name = "%s%s-%s%s" % (wutils.APPNAME, wutils.VERSION,
                                                   obj.name, bld.env.BUILD_SUFFIX)
 
                     # Get the relative path to the program from the
@@ -1013,13 +1263,13 @@
             # disable the ns3header_taskgen
             if 'ns3header' in getattr(obj, "features", []):
                 if ("ns3-%s" % obj.module) not in modules and ("ns3-%s" % obj.module) not in contribModules:
-                    obj.mode = 'remove' # tell it to remove headers instead of installing 
+                    obj.mode = 'remove' # tell it to remove headers instead of installing
 
             # disable the ns3privateheader_taskgen
             if 'ns3privateheader' in getattr(obj, "features", []):
                 if ("ns3-%s" % obj.module) not in modules and ("ns3-%s" % obj.module) not in contribModules:
 
-                    obj.mode = 'remove' # tell it to remove headers instead of installing 
+                    obj.mode = 'remove' # tell it to remove headers instead of installing
 
             # disable pcfile taskgens for disabled modules
             if 'ns3pcfile' in getattr(obj, "features", []):
@@ -1084,7 +1334,7 @@
                 gen.post()
 
     if Options.options.run or Options.options.pyrun:
-        bld.env['PRINT_BUILT_MODULES_AT_END'] = False 
+        bld.env['PRINT_BUILT_MODULES_AT_END'] = False
 
     if Options.options.doxygen_no_build:
         _doxygen(bld, skip_pid=True)
@@ -1157,16 +1407,15 @@
 
     # Write the build status file.
     build_status_file = os.path.join(bld.out_dir, 'build-status.py')
-    out = open(build_status_file, 'w')
-    out.write('#! /usr/bin/env python3\n')
-    out.write('\n')
-    out.write('# Programs that are runnable.\n')
-    out.write('ns3_runnable_programs = ' + str(env['NS3_RUNNABLE_PROGRAMS']) + '\n')
-    out.write('\n')
-    out.write('# Scripts that are runnable.\n')
-    out.write('ns3_runnable_scripts = ' + str(env['NS3_RUNNABLE_SCRIPTS']) + '\n')
-    out.write('\n')
-    out.close()
+    with open(build_status_file, 'w') as out:
+        out.write('#! /usr/bin/env python3\n')
+        out.write('\n')
+        out.write('# Programs that are runnable.\n')
+        out.write('ns3_runnable_programs = ' + str(env['NS3_RUNNABLE_PROGRAMS']) + '\n')
+        out.write('\n')
+        out.write('# Scripts that are runnable.\n')
+        out.write('ns3_runnable_scripts = ' + str(env['NS3_RUNNABLE_SCRIPTS']) + '\n')
+        out.write('\n')
 
     if Options.options.lcov_report:
         lcov_report(bld)
@@ -1203,7 +1452,7 @@
         bld.options = Options.options # provided for convenience
         bld.cmd = "build"
         bld.execute()
-        
+
         wutils.bld = bld
         wutils.run_python_program("test.py -n -c core", bld.env)
 
@@ -1231,7 +1480,7 @@
 class Ns3ShellContext(Context.Context):
     """run a shell with an environment suitably modified to run locally built programs"""
     cmd = 'shell'
-    
+
     def execute(self):
         # first we execute the build
         bld = Context.create_context("build")
@@ -1242,7 +1491,7 @@
         # Set this so that the lists won't be printed when the user
         # exits the shell.
         bld.env['PRINT_BUILT_MODULES_AT_END'] = False
-        
+
         if sys.platform == 'win32':
             shell = os.environ.get("COMSPEC", "cmd.exe")
         else:
@@ -1261,7 +1510,7 @@
     proc_env = wutils.get_proc_env()
     try:
         program_obj = wutils.find_program('print-introspected-doxygen', env)
-    except ValueError: 
+    except ValueError:
         Logs.warn("print-introspected-doxygen does not exist")
         raise SystemExit(1)
         return
@@ -1277,16 +1526,14 @@
     Logs.info("Running print-introspected-doxygen")
 
     # Create a header file with the introspected information.
-    doxygen_out = open(os.path.join('doc', 'introspected-doxygen.h'), 'w')
-    if subprocess.Popen([prog], stdout=doxygen_out, env=proc_env).wait():
-        raise SystemExit(1)
-    doxygen_out.close()
+    with open(os.path.join('doc', 'introspected-doxygen.h'), 'w') as doxygen_out:
+        if subprocess.Popen([prog], stdout=doxygen_out, env=proc_env).wait():
+            raise SystemExit(1)
 
     # Create a text file with the introspected information.
-    text_out = open(os.path.join('doc', 'ns3-object.txt'), 'w')
-    if subprocess.Popen([prog, '--output-text'], stdout=text_out, env=proc_env).wait():
-        raise SystemExit(1)
-    text_out.close()
+    with open(os.path.join('doc', 'ns3-object.txt'), 'w') as text_out:
+        if subprocess.Popen([prog, '--output-text'], stdout=text_out, env=proc_env).wait():
+            raise SystemExit(1)
 
     # Gather the CommandLine doxy
     # test.py appears not to create or keep the output directory
@@ -1297,7 +1544,7 @@
     proc_env['NS_COMMANDLINE_INTROSPECTION'] = '..'
     subprocess.run(["./test.py", "--nowaf", "--constrain=example"],
                    env=proc_env, stdout=subprocess.DEVNULL)
-    
+
     doxygen_out = os.path.join('doc', 'introspected-command-line.h')
     try:
         os.remove(doxygen_out)
@@ -1313,13 +1560,12 @@
 */\n
 """
         out_file.write(lines)
-    out_file.close()
 
     with open(doxygen_out,'a') as outfile:
         for in_file in glob.glob('testpy-output/*.command-line'):
             with open(in_file,'r') as infile:
                 outfile.write(infile.read())
-                
+
 def _doxygen(bld, skip_pid=False):
     env = wutils.bld.env
     proc_env = wutils.get_proc_env()
@@ -1342,9 +1588,8 @@
     # Get the doxygen config
     doxyfile = os.path.join('doc', 'doxygen.conf')
     Logs.info("docset: reading " + doxyfile)
-    doxygen_config = open(doxyfile, 'r')
-    doxygen_config_contents = doxygen_config.read()
-    doxygen_config.close()
+    with open(doxyfile, 'r') as doxygen_config:
+        doxygen_config_contents = doxygen_config.read()
 
     # Create the output directory
     docset_path = os.path.join('doc', 'docset')
@@ -1354,19 +1599,18 @@
         os.mkdir(docset_path)
 
     doxyfile = os.path.join('doc', 'doxygen.docset.conf')
-    doxygen_config = open(doxyfile, 'w')
-    Logs.info("docset: writing doxygen conf " + doxyfile)
-    doxygen_config.write(doxygen_config_contents)
-    doxygen_config.write(
-        """
-        HAVE_DOT = NO
-        GENERATE_DOCSET = YES
-        DISABLE_INDEX = YES
-        SEARCHENGINE = NO
-        GENERATE_TREEVIEW = NO
-        OUTPUT_DIRECTORY=""" + docset_path + "\n"
-        )
-    doxygen_config.close()
+    with open(doxyfile, 'w') as doxygen_config:
+        Logs.info("docset: writing doxygen conf " + doxyfile)
+        doxygen_config.write(doxygen_config_contents)
+        doxygen_config.write(
+            """
+            HAVE_DOT = NO
+            GENERATE_DOCSET = YES
+            DISABLE_INDEX = YES
+            SEARCHENGINE = NO
+            GENERATE_TREEVIEW = NO
+            OUTPUT_DIRECTORY=""" + docset_path + "\n"
+            )
 
     # Run Doxygen manually, so as to avoid build
     Logs.info("docset: running doxygen")
@@ -1396,7 +1640,7 @@
     shutil.move(docset_out, os.path.join('doc', 'ns-3.docset'))
 
     print("Docset built successfully.")
-    
+
 
 def _getVersion():
     """update the ns3_version.js file, when building documentation"""
@@ -1419,7 +1663,7 @@
 
 class Ns3SphinxContext(Context.Context):
     """build the Sphinx documentation: manual, tutorial, models"""
-    
+
     cmd = 'sphinx'
 
     def sphinx_build(self, path):
@@ -1435,18 +1679,18 @@
         _getVersion()
         for sphinxdir in ["manual", "models", "tutorial"] :
             self.sphinx_build(os.path.join("doc", sphinxdir))
-     
+
 
 class Ns3DocContext(Context.Context):
     """build all the documentation: doxygen, manual, tutorial, models"""
-    
+
     cmd = 'docs'
 
     def execute(self):
         steps = ['doxygen', 'sphinx']
         Options.commands = steps + Options.commands
-        
-    
+
+
 def lcov_report(bld):
     env = bld.env
 
